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

Вернуться   Форум 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.
Просмотров: 1965848
 
Непрочитано 01.08.2008, 22:05
#301
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Общее для всех методов:
Сначала блок _insert'ом вставляем в укромное место, а затем из этого укромного места что-то с ним делаем

По возрастанию предпочтения и сложности
1.вставить блок в точку 0,0 и вызвать copy, затем блок в точке 0,0 удалить (предварительно запомнив)
2.Вставить блок в 0,0. Copyclip, удалить блок и в цикле pasteclip.
3. В цикле
Вставить блок в 0,0.
И использовать _CHANGE режим точка изменения
(Пояснение Команда _CHANGE (режим точка изменения. Т.е.
_change
выбрать блок
на запрос "очка изменения или [Свойства]" нажать enter и посмотреть на запросы дальше
)
Общее для всех вариантов условие выхода из цикла:
не изменилась LASTPOINT (пользователь не указал точку, а нажал ввод)

*** Добавлено
Здесь можно посмотреть пример
http://dwg.ru/f/showpost.php?p=91119&postcount=41
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 01.08.2008 в 22:24.
VVA вне форума  
 
Автор темы   Непрочитано 03.08.2008, 02:05
#302
Red Nova

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


VVA,
Хотел пойти по третьему пути. Понял что нужно использовать while, а внутрь его всунуть if, но как получить nil в результате ввода enter ?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 03.08.2008, 12:08
#303
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Red Nova Посмотреть сообщение
VVA,
Хотел пойти по третьему пути. Понял что нужно использовать while, а внутрь его всунуть if, но как получить nil в результате ввода enter ?
Если использовать Change, то команда просто завершится. Нужно анализировать изменилать ли после _change LASTPOINT. Если да, то пользователь ткнул точку и цикл нужно продолжать, если нет - нажал ENTER и цикл нужно прекратить
Посмотри как это сделано во 2-м лиспе по ссылке с поста #301
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.08.2008, 13:57
#304
Red Nova

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


VVA, Попытался понять твой лисп #301. По возможности изучил новые функции оттуда. Не совсем все понял, но вроде как надумал один вариант на основе твоего.
Принцип такой.
Создаю цикл при помощи while. В нем вставляется колонна (в 0.0), затем применяется change, запоминаются точка 0.0 и вставленный последним блок. Затем lastpoint присваивается новой переменной, и мы начинаем вставлять блок в разные точки. функцией If проверяем равенство двух переменных отвечающих за последнюю и первую точку вставки, как только нажимаем энтер, то блок вставляется в начальную точку, и две переменные уравниваются. Как только ловится это условие, то последний блок удаляется, цикл прекращается. Написать это так чтобы заработало само собой не получилось. Да и задумка наверное не верная. Вот код.
Код:
[Выделить все]
 (while get_nil 
      (progn (princ "\Укажите ТОЧКУ (ENTER-Хватит):")
             (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY "0,0" "")
             (setq pt0 (getvar "lastpoint"))
             (setq blk entlast)
             (command "_change" blk "" "" pause pause)
      )
 )

 (setq pt1 (getvar "lastpoint"))

 (if (equal pt0 pt1 0.000001)
     (progn (entdel blk)
            (setq get_nil nil))
 )
А твою задумку до конца не понял
Почему в цикле while только princ?
Зачем тебе в If вторая часть?
Цитата:
(setq pt (getvar "LASTPOINT") tt t)
зачем тут после [](setq pt (getvar "LASTPOINT") ] идет [tt t)]?
Почему не сравнить последнюю точку "LASTPOINT" с точкой 0,0? Зачем при этом две переменные, ведь можно и одной. Типа повторяем цикл, как только переменная с "LASTPOINT" попадает в 0,0, то цикл завершен.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 03.08.2008, 17:52
#305
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Задумка верная. Только
  1. entlast нужно писать так (entlast)
  2. Цикл while завершать в конце.
  3. При таком подходе если пользователь нажмет ввод, то вынужден будет еще ответить на угол поворота
Вот модифицированный вариант с коментариями
Код:
[Выделить все]
(setq get_nil t) ;_Устанавливаем флаг
(while get_nil   ;_ Проверяем состояние флага
  (princ "\Укажите ТОЧКУ (ENTER-Хватит):")
  (command "_-insert" "Колонна"	"_x" dimensionX	"_y" dimensionY	"0,0" "") ;_ end of command
  (setq pt0 (getvar "lastpoint"))
  (setq blk (entlast))
  (command "_change" blk "" "" pause) ;_В команде Change ждем указания точки
  (setq pt1 (getvar "lastpoint")) ;_Запоминаем
                                  ;_Команда CHANGE активна!!! Запрашивает угол поворота

  (if (equal pt0 pt1 0.000001) ;_Сравниваем точки
    (progn ;_Точка не изменилась - нажат Enter
      (command "") ;_Завершаем команду Change нажатием Enter
      (entdel blk) ;_Удаляем блок
      (setq get_nil nil) ;_Сбрасываем флаг
    ) ;_ end of progn
    (progn ;_Иначе. Точка изменилась
      (command pause) ;_Завершаем команду Change. Ждем от пользователя указания угла поворота
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of while
А так
Цитата:
Правильным курсом идете, товарищи! (c) Диктор ЦТ во время демонстрации 1-го мая
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.08.2008, 20:40
#306
Red Nova

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


VVA, Пока не заработало.
Код:
[Выделить все]
(defun C:колонна (/ dimensionX dimensionY oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "osmode" oldOSM)) 
 (if OldLAY (setvar "clayer" OldLAY)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))

 (if (not (tblsearch "block" "Колонна"))
   (progn
     (command "_-layer" "_set" "0" "")
     (command "_rectang" "-0.5,-0.5" "0.5,0.5")
     (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Колонна" "0,0" "_last" "")
   )
 )

 (command "_-layer" "_make" "Колонна" "")

 (setq get_nil t) ;_Устанавливаем флаг
(while get_nil
  (princ "\Укажите ТОЧКУ (ENTER-Хватит):")
  (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY "0,0" "")
  (setq pt0 (getvar "lastpoint"))
  (setq blk (entlast))
  (command "_change" blk "" "" pause)
  (setq pt1 (getvar "lastpoint"))
 (if (equal pt0 pt1 0.000001)
    (progn
      (command "") ;_Завершаем команду Change нажатием Enter
      (entdel blk)
      (setq get_nil nil) ;_Сбрасываем флаг
     ) ;_ end of progn
    (progn
      (command pause) ;_Завершаем команду Change. Ждем от пользователя указания угла поворота
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of while


 (setvar "clayer" OldLAY)

 (command "_circle" (getvar "lastpoint") (/ dimensionX 2) "")

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.08.2008, 01:08
#307
Кулик Алексей aka kpblc
Moderator

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


Вот интересно, если код пишется для AutoCAD'a, то почему не использовать vl-cmdf и его особенности?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.08.2008, 09:42
#308
Red Nova

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


Кулик Алексей aka kpblc,
Дай подсказку к своему заданию по поводу подсчета блоков пожалста.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.08.2008, 10:22
#309
Кулик Алексей aka kpblc
Moderator

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


Получаешь набор блоков (с фильтрацией по имени), проход по каждому элементу. Забрать "габариты"; если "габариты" уже есть в списке результатов, то для этого элемента увеличить счетчик.
Понадобятся функции ssget, ssname, assoc, member, subst, cons.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.08.2008, 10:29
#310
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
VVA, Пока не заработало
Что ты имел ввиду? Код из #306 работает. Только
Код:
[Выделить все]
(command "_circle" (getvar "lastpoint") (/ dimensionX 2) "")
Надо поставить после
Код:
[Выделить все]
(command pause) ;_Завершаем команду Change. Ждем от пользователя указания угла поворота
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 04.08.2008, 10:39
#311
Red Nova

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


VVA,
Поправил, теперь работает.
Код:
[Выделить все]
(defun C:колонна (/ dimensionX dimensionY oldOSM OldLAY get_nil pt0 pt1 )

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "osmode" oldOSM)) 
 (if OldLAY (setvar "clayer" OldLAY)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))

 (if (not (tblsearch "block" "Колонна"))
   (progn
     (command "_-layer" "_set" "0" "")
     (command "_rectang" "-0.5,-0.5" "0.5,0.5")
     (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Колонна" "0,0" "_last" "")
   )
 )

 (command "_-layer" "_make" "Колонна" "")

 (setq get_nil t) ;_Устанавливаем флаг
(while get_nil
  (princ "\Укажите ТОЧКУ (ENTER-Хватит):")
  (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY "0,0" "")
  (setq pt0 (getvar "lastpoint"))
  (setq blk (entlast))
  (command "_change" blk "" "" pause)
  (setq pt1 (getvar "lastpoint"))
 (if (equal pt0 pt1 0.000001)
    (progn
      (command "") ;_Завершаем команду Change нажатием Enter
      (entdel blk)
      (setq get_nil nil) ;_Сбрасываем флаг
     ) ;_ end of progn
    (progn
      (command pause) ;_Завершаем команду Change. Ждем от пользователя указания угла поворота
      (command "_circle" (getvar "lastpoint") (/ dimensionX 2) "")
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of while


 (setvar "clayer" OldLAY)


 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 04.08.2008, 13:05
#312
Red Nova

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


Кулик Алексей aka kpblc,
Вроде можно выбрать все блоки “колонна” вот так
Код:
[Выделить все]
(setq ss1 (ssget "_X" '((0 . "BLOCK") (2 . "Колонна"))))
Тогда дальше надо пройти по списку пока он не кончится и извлечь данные scale X и scale Y.
Выбрать очередной элемент можно так (загнав в цикл)
Код:
[Выделить все]
 (setq number 0)
 (ssname ss1 (+ number 0))
 (setq number (+ number 1))
Но нам вернется имя объекта, как это имя преобразовать в структурированный список со свойствами я не знаю. Если предположить что уже имеем структурированный список, то забрать определенное свойство и преобразовать их в список можно так.
Код:
[Выделить все]
(setq ss2 list (
             (assoc 'scale_x (некий структурированный список текущего блока))
             (assoc 'scale_y (некий структурированный список текущего блока))
         );end of list
);end of setq
Потом уже можно думать про счетчик.
Зачем нужны member, subst, cons пока не понял
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.08.2008, 13:30
#313
Дима_

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


Смотри команды entget, assoc и dxf reference.
p.s. Когда до VB дойдешь, я тоже присоеденюсь - в качестве чайника.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.08.2008, 15:32
#314
Кулик Алексей aka kpblc
Moderator

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


Примерно так (код не гонял и не проверял совсем):
Код:
[Выделить все]
(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
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.08.2008, 16:43
#315
Red Nova

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


Кулик Алексей aka kpblc,
Их хелпа
Цитата:
(foreach <имя> <список> <выражение>...)
Эта функция, проходя по <списку>, присваивает каждому элементу <имя> и вычисляет каждое <выражение> для каждого элемента в списке. Может быть задано любое число <выражений>. FOREACH выдает результат последнего, вычисленного <выражения>
я так понял, что у тебя
item = <имя>,
(_dwgru-conv-pickset-to-list selset) = <список>
(if (member ...............)) = <выражение>

Что такое (_dwgru-conv-pickset-to-list selset)? Если это функция разработанная на этом сайте, то почему ее нет в коде?
Про остальное пока молчу. Непонятного много пока.

VVA Жду еще задания
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.08.2008, 16:49
#316
Кулик Алексей aka kpblc
Moderator

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


В подписи см. библиотека DwgRuLispLib.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.08.2008, 16:59
#317
Red Nova

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


kpblc,
Нашел по поиску только в этом топике, на #21. В библиотеке нету.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.08.2008, 22:02
#318
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/f/showpost.php?p=188342&postcount=21
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.08.2008, 10:17
#319
Red Nova

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


Кулик Алексей aka kpblc, ]
Пытаюсь понять структуру функции (_dwgru-conv-pickset-to-list selset). Начал с самой внутренней строчки. Там такое
Код:
Как это понять. Ведь в лиспе другая форма записи. Разве минус не должен быть спереди?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 05.08.2008, 10:30
#320
Кулик Алексей aka kpblc
Moderator

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


Запусти в VLIDE следующие строки:
Код:
[Выделить все]
(setq count 100)
(1+ count)
(1- count)
И посмотри результат
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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