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

Вернуться   Форум 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.
Просмотров: 1973725
 
Автор темы   Непрочитано 05.08.2008, 17:18
#341
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Получается мы записываем в список tab имена всех элементов списка selset. А что возвращает функция (_dwgru-conv-pickset-to-list selset)? Полученный список tab?
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 05.08.2008, 17:25
#342
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


То есть смысл (_dwgru-conv-pickset-to-list selset) в данном коде это преобразование набора в список имен элементов в него входящих?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 05.08.2008, 20:06
#343
ShaggyDoc

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
То есть смысл (_dwgru-conv-pickset-to-list selset) в данном коде это преобразование набора в список имен элементов в него входящих?
Прекрасно. Правильно разобрался. Вообще-то функции требуется документировать в комментариях - назначение, аргументы, результаты, особенности. Но с документированием у программистов всегда напряженка

А разобраться по исходнику бывает очень трудно, особенно если текст лихо оптимизирован в "лисповском" стиле.

Иногда даже приходится, в сложных случаях, "деоптимизировать" текст.

Поначалу можно писать и "по-бейсиковски", то есть присваивать через setq значения переменным, а потом уже что-то делать.
Типа

Код:
[Выделить все]
 
(setq a 2) (setq b 2)(setq с (* a b))
Потом перейти к

Код:
[Выделить все]
 
(setq a 2
 b 2
 с (* a b)
)
И, наконец, просто и элегантно
Код:
Но лучше учиться делать элегантно сразу. В какой-то момент конструкции, наподобие первого варианта будут глаз резать. Это будет означать - "лисп понял".
ShaggyDoc вне форума  
 
Непрочитано 05.08.2008, 21:24
#344
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


У меня есть предложение ко всем, но в основном модераторам такого плана:
Разделить уроки на "академисеские часы" или даже на мастер-классы, а не валить все в одну кучу.
Этот топик (удалив все лишнее) можно например назвать
"Урок 1. Создание и модификация примитивов с помощью команд Автокада"

Задание Алексея вынести в "Урок 2. Модификация и создание примитивов с помощью enget, entmake и т.д." ну и т.д.
Потом урок 3 и т.д.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.08.2008, 21:51
#345
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


VVA, Я буду только за. Мне бы уроков по больше и по понятнее
Но в этом случае правильно будет создать новый подраздел в разделе программирование, и назвать его типа "Уроки программирования" и там уже создать отдельные топики уроков по разной тематике.

P.S. В свое время обнаружив этот сайт я был удивлен отсутствием на нем разделов с уроками, на сайтах по 3dmax таких уроков пруд пруди.
__________________
Блог

Последний раз редактировалось Red Nova, 05.08.2008 в 22:00.
Red Nova вне форума  
 
Непрочитано 06.08.2008, 15:28
#346
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,508


Подскажите, как в программе выразить Select object? Например когда используешь Copy
Рyslan вне форума  
 
Непрочитано 06.08.2008, 15:37
#347
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,853


(ssget)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.08.2008, 15:42
#348
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,508


А в таком выражении ssget будет работать ?(command "Copy" "" "" "0,0" 18 "")
Рyslan вне форума  
 
Автор темы   Непрочитано 06.08.2008, 15:52
#349
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Пока модераторы думают над мыслю VVA я продолжу разборку кода с поста #314 от kpblc. Приведу его снова
Код:
[Выделить все]
 (defun test (/ selset res x y)
  (if (setq selset (ssget '((0 . "INSERT") (2 . "Колонна"))))
    (foreach item (_dwgru-conv-pickset-to-list selset)
      (if (member (setq size (strcat (rtos (cdr (assoc 41 (entget item))) 2 4)
                                     "x"
                                     (rtos (cdr (assoc 42 (entget item))) 2 4)
                                     ) ;_ end of strcat
                        ) ;_ end of setq
                  (mapcar 'car res)
                  ) ;_ end of member
        (setq res (subst (cons size (1+ (cdr (assoc size res))))
                         (assoc size res)
                         res
                         ) ;_ end of subst
              ) ;_ end of setq
        (setq res (cons (cons size 1) res))
        ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of if
  ) ;_ end of defun
С (_dwgru-conv-pickset-to-list selset) понятно. Набор selset преобразуется в список имен примитивов и возвращает его. Идем дальше.
Как понять (entget item)
Item в числе локальных переменных функции test нет, но есть среди локальных переменных функции _dwgru-conv-pickset-to-list. Насколько я знаю локальная переменная живет на срок действия ее функции. То есть на момент ее упоминания она уже не локальная переменная.
Из хелпа
Цитата:
(entget <ename>)
Примитив, который называется <ename> восстанавливается из базы данных и возвращается как список, содержащий эти определяемые данные. Результирующий список кодируется, как структурированный список LISP, элементы которого могут быть легко восстановлены функцией ASSOC.
Как понять “<ename> восстанавливается из базы данных и возвращается как список”? Может смысл в том, что <ename> ищется среди бывших локальных переменных и восстанавливается? И как item может восстановится списком? В (_dwgru-conv-pickset-to-list selset) переменная item отвечает только за номер примитива.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 06.08.2008, 16:04
#350
Дима_

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


ename это имя примитива возращаемого функциями entlast, entsel, ssname.
Если не понятно то нарисуй круг и введи (entget (entlast)).

P.S. Гуру, не издевайтесь, скорей объясняйте DXF.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 06.08.2008 в 16:09.
Дима_ вне форума  
 
Автор темы   Непрочитано 06.08.2008, 16:08
#351
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Дима_, Не не пойму. Ты на конкретном примере объясни, на посте #346, что делает (entget item)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 06.08.2008, 16:13
#352
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,853


Нет, и проблема не в (ssget)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.08.2008, 16:22
#353
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Item в числе локальных переменных функции test нет, но есть среди локальных переменных функции _dwgru-conv-pickset-to-list. Насколько я знаю локальная переменная живет на срок действия ее функции. То есть на момент ее упоминания она уже не локальная переменная.
ИМХО значение Item становится nil сразу после окончания работы foreach. И в локальных переменных Item объявлять не надо, как и не надо нигде объявлять x в '(lambda (x) ...)

Добавлено:
Вот, накатал простенький лиспик для демонстрации вышенаписанного:
Код:
[Выделить все]
(defun test (/ k)
  (Setq k '(1 2 3))
  (princ "item внутри foreach")
  (terpri)
  (foreach item	k
    (princ item)
    (terpri)
  )
  (princ "item после выполнения foreach")
  (terpri)
  item
)
Makswell вне форума  
 
Автор темы   Непрочитано 06.08.2008, 16:27
#354
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


На вопрос ты все же не ответил. Надо понять что (entget item) означает в данном коде.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 06.08.2008, 16:27
#355
Дима_

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


команда (foreach item... )создает временную переменнту item, которая действует ТОЛЬКО внутри цикла foreach и принимает последовательно (циклично) все значения списка вернувшего (_dwgru-conv-pickset-to-list selset), далее в этом-же цикле есть команда (entget item) - возращает свойства примитива в виде списка состоящего из DXF кодов (ты уже использовал их в (ssget '((0 . "INSERT") (2 . "Колонна"))))), а команда (cdr(assoc xx возращает первое значение из списка с кодом хх - расшифровка кодов в DXF Reference
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.08.2008, 16:33
#356
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,508


Короче, мне нужно скопировать объект на заданное расстояние, когда я заключаю в кавычки ALL программа копирует но не правильно. Какой стандартный прием в программировании для выделения объекта? Обычно же мышкой выделяем, а тут как?
Рyslan вне форума  
 
Непрочитано 06.08.2008, 16:37
#357
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,853


Код:
[Выделить все]
(command "_.copy" (ssget) "" pause pause)
Как-то так..
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.08.2008, 16:38
#358
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,508


(command "Copy" "ALL" "" "0,0" "18,0" "") я тут неправильно координаты поставил извиняйте, разобрался
Рyslan вне форума  
 
Автор темы   Непрочитано 06.08.2008, 17:45
#359
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Спасибо. Эту часть понял
Код:
[Выделить все]
(setq size (strcat (rtos (cdr (assoc 41 (entget item))) 2 4)
                                     "x"
                                     (rtos (cdr (assoc 42 (entget item))) 2 4)
                                     ) ;_ end of strcat
                        ) ;_ end of setq
Получаем для конкретного элемента списка такую строчку ("Значение Х" "x" "Значение Y"), а вот дальше опять тормоз. Вот тут
Код:
[Выделить все]
(member (..........)
                  (mapcar 'car res)
                  ) ;_ end of member
Из хелпа
Цитата:
(member <выражение> <список>)
Эта функция просматривает <список> - встречается ли <выражение> и возвращает часть <списка>, начинающуюся с первого найденного <выражения>. Если в <списке> нет <выражения>, MEMBER возвращает nil.

Например:

(member 'c '(a b c d e)) возвращает (C D E)

(member 'q '(a b c d e)) возвращает nil
То есть <выражение> это у нас ("Значение Х" "x" "Значение Y"), а <список> это (mapcar 'car res). Переменная res еще не назначенна. Как понять (mapcar 'car res) не знаю. Вроде как следуя хелпу получается, что mapcar должен взять только первый элемент у каждого элемента списка res. Но что за список res?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 06.08.2008, 20:05
#360
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Получаем для конкретного элемента списка такую строчку ("Значение Х" "x" "Значение Y")
Не так. У тебя список, а не строчка. Получаем такую строчку:
Масштаб_блока_XxМасштаб_блока_Y (например "400x300") Она же и является ключом поиска в списке res для ф-ций member и assoc.
В res ввиде ассоциативного списка будем подсчитывать размеры колонн
Добустим у нас 2 колонны размером 300x400 и 1 400x400. ТОгда окончательное значение res='(("300x400" . 2)("400x400" . 1))
(mapcar 'car res)= выполняет ф-цию car ко всем элементам res. Т.е. (car '("300x400" . 2)) и (car '("400x400" . 1)). В итоге получается список из 1-х элементов res (ключей)
res='(("300x400" . 2)("400x400" . 1))
(mapcar 'car res) = '("300x400" "400x400")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум 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