Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,980

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1973864
 
Непрочитано 04.10.2012, 16:17
#1901
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Alexg-12 Посмотреть сообщение
Зачем тут Lambda?
Хороший вопрос
Вот классический вариант выглядит проще гораздо
Код:
[Выделить все]
 (vl-catch-all-apply
  (function vla-item)
  (list
    (vla-get-layers
      (vla-get-activedocument (vlax-get-acad-object))
    )
    "0"
  )
)
gomer вне форума  
 
Непрочитано 04.10.2012, 16:42
#1902
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


To Gomer вышеприведенный пример будет будет работать только с "чистыми" функциями (которые - не буду скрывать мне импонируют гораздо больше), но в кодах Алексея (не в коем случае не в обиду) всегда во главе стоит "шаблонность" используемого кода, то есть как у Вас - безусловно "красивей", по крайней мере с моей точки зрения, но КРЫС'овский вариант, более "безпроблемный", особенно если "совать" его в любую императивную конструкцию - я, например, их всячески избегаю - за что меня переодически здесь ругают, а Крыс их "не боится".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.10.2012, 17:02
#1903
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


Очень сложная для новичка тема - функция обработки ошибок. Как она работает в данном примере? Мало хороших разобранных примеров по этой теме в интернете да и у Полещука.
Почему тут в 16 строке стоит "Layer". Условие (not) уже закончилось, а выполняемое действие еще не началось. Или я что-то не понял....
Alexg-12 вне форума  
 
Непрочитано 04.10.2012, 17:15
#1904
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


апще, это не лучший пример, обо не стоит забывать
Код:
[Выделить все]
 (tblsearch "LAYER" layer)
gomer вне форума  
 
Непрочитано 04.10.2012, 17:15
#1905
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


"действие" и "значение" в лиспе есть одинаковые понятия if это тоже функция (как и все в лиспе) - которая тоже возращает значение - то есть if может (и в большинстве случаев "правильного" использования) не задает что делать, а возращает нужный результат.
То есть в "классическом" программировании:
Код:
[Выделить все]
 (if (= a b) (princ "Равно") (princ "Не равно"))
в функциональном:
Код:
[Выделить все]
 (princ (if (= a b) "Равно" "Не равно"))
результат будет одинаков - подходы разные.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.10.2012, 17:19
#1906
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


ой, страничка закончилась, ну я закончу мысль свою, громоздкая vl-catch-all-apply тут только потому, что vla-Item выдает ошибку с прерыванием при отсутствии искомого слоя
gomer вне форума  
 
Непрочитано 04.10.2012, 17:53
#1907
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


Цитата:
Сообщение от Alexg-12 Посмотреть сообщение
Есть код ЛИСП, написанный Кулик Алексей aka kpblc. Создания вспомогательных линий в отдельном слое. Помогите разобраться, как работает.
Вся эта тема начиналась с этого вопроса
Цитата:
Возможно в теме и есть подобные примеры, но 100 стр форума - это очень много.
Если бы у меня перед глазами были эти 100 стр., когда я начинал, я бы м.б. научился программировать на Лиспе.
Ни какой Полещук (извините, Ник.Ник., за эти слова - не хотел обидеть ) такого не напишет.
Его книги прекрасные справочники и учебники, а в этой теме разобрали как надо работать с ЛИСП и дали кучу практических решений.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 04.10.2012, 18:26
#1908
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Alan Посмотреть сообщение
Если бы у меня перед глазами были эти 100 стр., когда я начинал, я бы м.б. научился программировать на Лиспе.
ну это вряд ли
gomer вне форума  
 
Непрочитано 04.10.2012, 19:58
#1909
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


В основном люди занимаются LISP'ом, что бы адаптировать AUTOCAD под вполне конкретную определенную задачу. Ну или несколько таких задач. Базовые принципы программирования - это не сложно. (Мне в частности помогла книга Дэн Эбботта). Но капни чуть-чуть глубже и все! Невозможно самому ни в чем разобраться. И чисто физически нет времени перечитывать всю тему, ибо и так куча времени ушла на книги Полещука (имхо тяжело для понимания он пишет), да и люди все рабочие и семейные. Так что проще и легче спросить конкретно про то, что тебе надо. Опытным людям, я считаю, не составит труда повторно ответить на какие-то вопросы ну или отослать по нужному адресу. Да и тему я полистал - бегло, конечно, но здесь мало относящегося к моему вопросу. (виноват - мог и не заметить)
вернемся к коду:
Все таки я не понял, зачем "layer" в 16 строке.
А то, что происходит после 18 строки, я ваапще только название функцих знакомых встречаю.... Ваппще ничего не понятно.
Код:
[Выделить все]
 
01    (vl-load-com)
02    
03    (defun c:dwg-xline (/ adoc sysvar layer)
04      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
05      (setq layer  "ИмяСлоя"
06            layer  (if (not (vl-catch-all-error-p
07                              (vl-catch-all-apply
08                                (function
09                                  (lambda ()
10                                    (vla-item (vla-get-layers adoc) layer)
11                                    ) ;_ end of lambda
12                                  ) ;_ end of function
13                                ) ;_ end of vl-catch-all-apply
14                              ) ;_ end of vl-catch-all-error-p
15                            ) ;_ end of not
16                     layer
17                     (vla-get-name (vla-add (vla-get-layers adoc) layer))
18                     ) ;_ end of if
19            sysvar (mapcar
20                     (function
21                       (lambda (x / tmp)
22                         (if (setq tmp (getvar (car x)))
23                           (progn
24                             (setvar (car x) (cdr x))
25                             (cons (car x) tmp)
26                             ) ;_ end of progn
27                           ) ;_ end of if
28                         ) ;_ end of lambda
29                       ) ;_ end of function
30                     (list (cons "clayer" layer))
31                     ) ;_ end of mapcar
32            ) ;_ end of setq
33      (vl-catch-all-apply
34        (function
35          (lambda ()
36            (command "_.xline")
37            (while (/= (getvar "cmdactive") 0) (command pause))
38            ) ;_ end of LAMBDA
39          ) ;_ end of function
40        ) ;_ end of VL-CATCH-ALL-APPLY
41      (foreach item sysvar
42        (setvar (car item) (cdr item))
43        ) ;_ end of foreach
44      (vla-endundomark adoc)
45      (princ)
46      ) ;_ end of defun
Alexg-12 вне форума  
 
Непрочитано 04.10.2012, 20:28
#1910
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Alexg-12 Посмотреть сообщение
Все таки я не понял, зачем "layer" в 16 строке.
(setq layer (if layer layer layer)) так понятно?
(setq layer layer) или так

Цитата:
Сообщение от Alexg-12 Посмотреть сообщение
А то, что происходит после 18 строки, я ваапще только название функцих знакомых встречаю.... Ваппще ничего не понятно.
(setvar 'clayer layer) все понятно
gomer вне форума  
 
Непрочитано 05.10.2012, 10:39
#1911
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


Цитата:
Сообщение от gomer Посмотреть сообщение
Хороший вопрос
Вот классический вариант выглядит проще гораздо
Код:
[Выделить все]
1 (vl-catch-all-apply
2 (function vla-item)
3 (list
4 (vla-get-layers
5 (vla-get-activedocument (vlax-get-acad-object))
6 )
7 "0"
8 )
9 )
[/lisp][/code]

Зачем нужна такая сложная конструкция для получения элемента? Зачем для получения элемента использовать "vl-catch-all-apply". Что значит строка (function vla-item) и зачем она нужна? Зачем тут "list"?
Alexg-12 вне форума  
 
Непрочитано 05.10.2012, 10:56
#1912
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


По строкам:
1. исполнить игнорируя ошибки
2. функцию получения элемента
3. примененную к
4. коллекции слоев
5. активного документа, автокада
7. с именем "0"
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.10.2012, 11:00
#1913
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


Спасибо!!
Появляется вопрос. А function зачем здесь? (function - связывает и оптимизирует функцию. Полещук.) Так что vla-item без нее работать не будет?
"vl-catch-all-apply" Нужна только для игнорирования ошибки?
А вот это темный лес: (зачем тут foreach, зачем тут mapcar)
Код:
[Выделить все]
 
19        sysvar (mapcar20                 (function
21                   (lambda (x / tmp)
22                     (if (setq tmp (getvar (car x)))
23                       (progn
24                         (setvar (car x) (cdr x))
25                         (cons (car x) tmp)
26                         ) ;_ end of progn
27                       ) ;_ end of if
28                     ) ;_ end of lambda
29                   ) ;_ end of function
30                 (list (cons "clayer" layer))
31                 ) ;_ end of mapcar
32        ) ;_ end of setq
33  (vl-catch-all-apply
34    (function
35      (lambda ()
36        (command "_.xline")
37        (while (/= (getvar "cmdactive") 0) (command pause))
38        ) ;_ end of LAMBDA
39      ) ;_ end of function
40    ) ;_ end of VL-CATCH-ALL-APPLY
41  (foreach item sysvar
42    (setvar (car item) (cdr item))
43    ) ;_ end of foreach
44  (vla-endundomark adoc)
45  (princ)
46  ) ;_ end of defun

Последний раз редактировалось Alexg-12, 05.10.2012 в 13:32.
Alexg-12 вне форума  
 
Непрочитано 05.10.2012, 13:47
#1914
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
"vl-catch-all-apply" Нужна только для игнорирования ошибки?
Для предотвращения разрушения (прерывания) программы в случае ошибки. Это самая замечательная функция, появившаяся в VisualLisp.
Действует наподобие конструкции
Код:
[Выделить все]
try
... попробовать выполнить какие-то действия
except
.... выполнить в случае ошибки
end
в других языках программирования. Т.е. это ловушка ошибок.

Применять vl-catch-all-apply надо в связке с vl-catch-all-error-p и vl-catch-all-error-message.

Чтобы не мучиться каждый раз, надо сделать библиотечную функцию наподобие:

Код:
[Выделить все]
 (defun ru-error-catch
       (protected_expression on_error_expression / catch_error_result)
  (setq catch_error_result (vl-catch-all-apply protected_expression))
  (if (and (vl-catch-all-error-p catch_error_result) on_error_expression)
    (apply on_error_expression (list (vl-catch-all-error-message catch_error_result)))
    catch_error_result
  )
)
Теперь, не зная даже как это работает, можно применять в виде:

Код:
[Выделить все]
 (ru-error-catch
    (function (lambda ()
                ;;; защищаемое выражение  
                (
                
                )
                ;;; То что вернет - будет результатом
              )
    ) 
    (function
      (lambda (err_msg)
        ;; если надо - выводим сообщение. err_msg подставит Автокад
        (princ (strcat "\nОШИБКА такой-то функции: " err_msg))
        ;; возвращаем NIL при ошибке
        nil
      )
    )
  )

Пример применения. Допустим, нужно удалить ПСК. Но нельзя удалить текущую ПСК и нельзя удалить несуществующую.
Можно, конечно, предварительно проверять эти условия, а можно и применить ловушку ошибок

Код:
[Выделить все]
 (defun ru-3d-ucs-delete (ucs_obj)
  (ru-error-catch
    (function (lambda ()
                ;; Это действие, в котором может возникнуть ошибка	 
                (vla-delete ucs_obj)
              )
    )
    (function (lambda (x)
	            ;; А здесь действие в случае ошибки
                ;; (princ "\nОШИБКА: Нельзя удалить действующую ПСК")
                nil
              ) 
    ) 
  ) 
  (princ)
) 
Это очень простой случай, где можно проверить все условия. А бывает, что ошибка может возникнуть из-за множества причин, в том числе из-за действий пользователя. Например, нажатия ESC когда не надо, но без "вылета" программы, который в этом случае произойдет без ловушки ошибок.
ShaggyDoc вне форума  
 
Непрочитано 05.10.2012, 15:16
#1915
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


вот мой вариант, надеюсь разберетесь

Код:
[Выделить все]
 (defun c:dwg-xline (/ *error* adoc layer clyr)
  (defun *error* (msg)
    (setvar 'clayer clyr)
    (vla-endundomark adoc)
    (princ)
  )
  (vl-load-com)
  (vla-startundomark
    (setq
      layer "ИмяСлоя"
      clyr  (getvar 'clayer)
      adoc  (vla-get-activedocument
	      (vlax-get-acad-object)
	    )
    )
  )

  (if (null (tblsearch "LAYER" layer))
    (vla-put-Color (vla-add (vla-get-layers adoc) layer) acRed)
  )

  (setvar 'clayer clayer) ; ой, недоглядел

  (command "_.xline")
  (while (/= 0 (getvar "cmdactive")) (command pause))

  (*error* nil)

)

Последний раз редактировалось gomer, 05.10.2012 в 15:59.
gomer вне форума  
 
Непрочитано 05.10.2012, 15:41
#1916
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


Да.
Понятнее на много.
Спасибо.
Alexg-12 вне форума  
 
Непрочитано 05.10.2012, 16:00
#1917
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Немного недоглядел, изменил код #1911
gomer вне форума  
 
Непрочитано 05.10.2012, 16:14
#1918
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


Цитата:
Сообщение от gomer Посмотреть сообщение
(*error* nil)
а как эта строка отрабатывается? Т.е. понятно, что она отрабатывает функцию defun *error* (msg), но это странный вызов какой-то....
Alexg-12 вне форума  
 
Непрочитано 05.10.2012, 16:17
#1919
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Alexg-12 Посмотреть сообщение
это странный вызов какой-то....
чем же он странный?
gomer вне форума  
 
Непрочитано 13.10.2012, 20:18
#1920
Кот Пушок

Механик-конструктор
 
Регистрация: 13.10.2012
Everett, WA, USA
Сообщений: 25


Помигите.
Делаю первые шаги в лиспе.
Имеется треугольник, из полилинии, который я пытаюсь размножить вокруг точки "0,0"

Записал вот таким вот образом:

(command "_pline" "0,3.0902" "1.3876,5.7295" "1.3876,5.7295" "-1.3876,5.7295" "-1.3876,5.7295" "0,3.0902" "")
(command "_array" "last" "p" "0,0" "5" "360" "_y" "")

А оно не работает.
Как нужно записать?
Кот Пушок вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46