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

Вернуться   Форум 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.
Просмотров: 1972505
 
Непрочитано 14.12.2016, 20:00
#3181
Кулик Алексей aka kpblc
Moderator

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


А чем не нравится нечто типа (getenv "userdomain")?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.12.2016, 21:02
#3182
Inferi


 
Регистрация: 14.05.2015
Сообщений: 33


Спасибо, в моем случае это решает вопрос.
Inferi вне форума  
 
Непрочитано 17.12.2016, 08:37
#3183
Alexll


 
Регистрация: 02.02.2015
Сообщений: 22


Здравствуйте. Пытаюсь распечатать лист через команду PLOT
Код:
[Выделить все]
 (command "_-PLOT" "Да" "Модель" "DWG To PDF.pc3" p "Миллиметры" "Альбомная" "Нет" "Рамка" )
Дальше надо ввести координаты, а этого я осилить не смог. Координаты сохранены в переменных x1,y1,x2,y2. Пробовал подставлять и просто переменные, и округлять, и через запятую, и через точку с запятой, и объединять в точечную пару. Максимум что получалось, это в качестве первой точки берет x1(а нужно x1,y1).
Даже пробовал преобразовать в строку, что бы получилось х1,y1, но ему тип переменной не понравился.
Кто подскажет как правильно ввести координаты точек?

Последний раз редактировалось Alexll, 17.12.2016 в 08:42.
Alexll вне форума  
 
Непрочитано 17.12.2016, 09:13
#3184
VVA

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


Цитата:
Сообщение от Alexll Посмотреть сообщение
Кто подскажет как правильно ввести координаты точек?
http://aco.ifmo.ru/~nadinet/html/lectures/lect_7.html и в этой теме почитай с поста #127
Цитата:
Сообщение от Alexll Посмотреть сообщение
и объединять в точечную пару.
Можно поинтересоваться как?
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 17.12.2016 в 19:56.
VVA вне форума  
 
Непрочитано 17.12.2016, 10:31
#3185
Alexll


 
Регистрация: 02.02.2015
Сообщений: 22


Спасибо, разобрался. Координаты нужно в список объединить функцией list.

Цитата:
Можно поинтересоваться как?
Объединял функцией cons

Код:

Последний раз редактировалось Alexll, 17.12.2016 в 11:31.
Alexll вне форума  
 
Непрочитано 27.12.2016, 20:47
#3186
skkkk


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


Кто-нибудь знает, почему в AutoCAD 2011 функции, загруженные пользователем из LISP-файла определяются системой как SUBR, хотя в документации четко обозначено, что должны бы быть USUBR?
Простейший пример (прошу проверить возвращаемое значение, у кого есть возможность):
Код:
[Выделить все]
(defun C:TEST () (type C:TEST))(C:TEST)
Дело в том, что мне нужно получить список именно загруженных пользователем LISP-функций, выполняю
Код:
[Выделить все]
 
(setq global-var-LISTofSYM (atoms-family 0))
(setq LISTofFUNC
  (vl-remove-if-not
    '(lambda (x) (= (type (eval x)) 'USUBR))
     global-var-LISTofSYM
  )
)
- и в свете вышенаписанного мне возвращается nil, что в общем-то ожидаемо. Может, есть какая-то переменная, которая разделяет и объединяет SUBR и USUBR? Или есть еще какой-то вариант получить искомый список?
skkkk вне форума  
 
Непрочитано 30.12.2016, 09:07
#3187
VVA

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


Вот лог командной строки Автокада

Цитата:
Команда: (defun C:TEST () (type C:TEST))(C:TEST)
SUBR

Команда:
Команда: (defun TEST () (type TEST))(TEST)
SUBR
Вот тот же лог из окна консоли VLISP
Цитата:
_$ (defun C:TEST () (type C:TEST))(C:TEST)
C:TEST
USUBR
_$ (defun TEST () (type TEST))(TEST)
TEST
USUBR
_$
Вот что я нашел в хелпе

Цитата:
The USUBR data type represents functions that can be debugged with the Visual LISP debugging tools (for example, you can set breakpoints and view the values of program variables).
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 07.01.2017, 06:34
#3188
Red Nova

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


Доброго и с праздниками! Есть кто трезвый?
Имею динамический блок, у него есть полярный параметр.
Ищу возможность вставить блок командой с указанием двух точек, но при этом хочу чтобы после указания первой точки блок "висел на курсоре"
По аналогии с прорисовкой обычной линии, после указания первой точки линия следует за курсором.
По сути нужно после вставки блока взяться за грисп нашего полярного параметра и указать вторую точку.
Могу написать похожий код но без "висения на курсоре".
Подскажите плиз возможно ли это реализовать лиспом?
Подопытный прикреплен.
Вложения
Тип файла: dwg
DWG 2013
test.dwg (42.9 Кб, 20 просмотров)
__________________
Блог

Последний раз редактировалось Red Nova, 07.01.2017 в 07:01.
Red Nova вне форума  
 
Непрочитано 07.01.2017, 14:32
#3189
skkkk


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


Всех студентов и преподавателей с праздниками!
Привет, Red Nova! Неужто вы там уже работаете во всю?
Насчет трезвых очень не уверен, но на безтрезвье и я трезвый
Цитата:
Сообщение от Red Nova Посмотреть сообщение
Ищу возможность вставить блок командой с указанием двух точек, но при этом хочу чтобы после указания первой точки блок "висел на курсоре"
Давно еще искал возможность подобной интерактивной вставки, в том числе, мультивыноски. В итоге практически вся задача сводилась к тому, чтобы просто программно "схватить за ручку". Такой возможности в лиспе я не нашел. И в общем случае подобное на лиспе нереализуемо, разве что при помощи отрисовки временных примитивов функцией grvecs. Но это тот еще "маршрут"...
Думаю, тебе надо копать в сторону чего-то посерьезней, например, технологии JIG, через .NET.
Но в частном случае с твоим "подопытным" все не так плохо: выставляешь программно PLINEWID в нужное значение, а затем инициируешь отрисовку полилинии, программно задав первую точку и интерактивно запросив вторую, берешь длину созданной полилинии и назначаешь ее блоку, разумеется, в конце полилинию удаляешь. Если важен цвет такой отрисовки, то он хранится в настройках во второй вкладке под кнопкой "Цвета". В свое время пытался изменять его программно лиспом (здесь) - у меня не получилось.

VVA, да, я нашел то же самое, но в решении моего вопроса это совсем не помогло. Видимо, единственным вариантом остается исключать все автолисп-, vla-, acet- и т.д. функции, и выдавать все, что осталось. Не сказать, что задача неподъемная, но думал, что можно это решить правильней.
skkkk вне форума  
 
Непрочитано 07.01.2017, 18:34
#3190
Кулик Алексей aka kpblc
Moderator

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


Получить точку ввода через grread в принципе не проблема, но возникнут вопросы при обработке привязок. Насколько я помню, на theswamp.org было решение от Евгения Елпанова.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.01.2017, 22:38
#3191
skkkk


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


Получить точку ввода - да, но как "взять" за ручку программно (нажать на нее)? Или о чем ты, Алексей?
skkkk вне форума  
 
Автор темы   Непрочитано 08.01.2017, 01:13
#3192
Red Nova

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


Спасибо за советы

skkkk
Цитата:
Неужто вы там уже работаете во всю?
У нас праздники между их Рождеством и вторым числом. Это конечно не то же что может позволить себе "Россия - щедрая душа", но и на том рады.
Цитата:
а затем инициируешь отрисовку полилинии
Если честно у самого была мысль имитировать полилинией если зайду в тупик, но блок в моем примере это самый упрощенный пример из тех что я намеревался так прорисовывать. В основном более сложные блоки и их под полилинию не замаскировать. Хотя и это лучше чем ничего, уж лучше видеть направление прорисовки чем просто кликать два раза, гляди и позабудешь где сделал первый клик

Кулик Алексей aka kpblc
По моему я нашел тему Елпанова что ты описывал, вот она
https://www.theswamp.org/index.php?topic=12813.0
Просмотрел бегло, но пока не нашел как grread может ухватить за "grip" динамического блока.

Добавил.
Скорее всего бред, но пришла такая мысль. Возможно ли программно как бы кликнуть в указанную координату? Тогда можно было бы вставить дин. блок а затем задать клик туда где у него "грип". ???
__________________
Блог

Последний раз редактировалось Red Nova, 08.01.2017 в 01:39.
Red Nova вне форума  
 
Непрочитано 08.01.2017, 13:55
#3193
skkkk


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Скорее всего бред, но пришла такая мысль. Возможно ли программно как бы кликнуть в указанную координату? Тогда можно было бы вставить дин. блок а затем задать клик туда где у него "грип". ???
Об этом я и говорил:
Цитата:
Сообщение от skkkk Посмотреть сообщение
В итоге практически вся задача сводилась к тому, чтобы просто программно "схватить за ручку". Такой возможности в лиспе я не нашел.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Получить точку ввода - да, но как "взять" за ручку программно (нажать на нее)?
Это было бы проще всего. Может, надо еще покопать в сторону запуска стороннего приложения (как вариант - exe-файл или скрипт для AutoHotKey), которое запустится из лиспа в нужный момент и нажмет левую кнопку мыши? Но тут придется мудрить с тем, чтобы переводить точку из системы координат модели (или листа) в систему координат экрана. И тут все будет отличаться от монитора к монитору, зависеть от разрешения и Бог весть от чего еще. Помню, видел такую программу от Do$'а, но что-то так я и не смог понять всех закономерностей и допилить под это - тогда знаний явно не хватало.
Тут опять же предварительно возникнет вопрос: как программно перенести курсор в нужную точку? Лиспом мне это тоже в свое время не удалось (и тут на форуме обсуждалось). Знаю только, что можно зумировать (или панорамировать?) экран под текущее положение курсора, вычислив его с помощью функции grread. Но это все уже начинает выглядеть, как танцы на костылях, но без бубна, потому что руки уже заняты.
skkkk вне форума  
 
Непрочитано 08.01.2017, 22:15
#3194
Кулик Алексей aka kpblc
Moderator

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


Когда-то на autolisp.ru я пытался рассмотреть вариант "динамического" изменения примитивов. Почему не применить подобный подход здесь же - не понимаю...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.01.2017, 03:21
#3195
Red Nova

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Когда-то на autolisp.ru я пытался рассмотреть вариант "динамического" изменения примитивов. Почему не применить подобный подход здесь же - не понимаю...
Маэстро, если есть свободная минутка, покажи плиз как это сделать с моим блоком.



Код:
[Выделить все]
 (defun C:BPM_ApplyIT ( / *error* blk dwg obj pt1 pt2 val var oldLayer oldcolor
		   blkselection vlablkselection
		   CSblkobj CSblkvar CSblksa CSblkXY
		   CSrot CSlength CSWidth CSExtension1 CSflip ucschanged YMoveVal)

  (defun *error* ( msg )
    (if ucschanged (command-s "_.ucs" "_prev"))
    (mapcar 'setvar var val)
    (setvar "clayer" oldLayer)
    (setvar "cecolor" oldcolor)
    (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
                 (princ (strcat "\nError: " msg))
      )
    (princ)
    )

  (vl-load-com)

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) ;_ end of vla-startundomark

  (setq blk  "BMP Plan IT"
        var '(cmdecho attreq)
        val  (mapcar 'getvar var)
	oldLayer (getvar "clayer")
	oldcolor (getvar "cecolor") 
    )
  
  (mapcar 'setvar var '(0 0))
  
  (command "clayer" "BMP-Plan Profile")
  (command "cecolor" "20")

  (setq blkselection (ssget '((0 . "INSERT")(66 . 1))))
  (setq vlablkselection (LM:ss->vla blkselection))
  (setq vlablkselection (vl-remove-if-not (function (lambda (n) (wcmatch (LM:getvisibilitystate n) "Cut*"))) vlablkselection))
  (setq blkselection (Conv_ObjectList_To_Pickset vlablkselection))
  (setq vlablkselection (LM:ss->vla blkselection))

  (foreach n vlablkselection
    (progn
  
  
  (setq CSrot (vlax-get-property n 'Rotation))
  ;(setq CSPositionX (rtos (car CSInsertionpoint)))

  (setq CSblkvar (vla-get-insertionpoint n)
	CSblksa (vlax-variant-value CSblkvar)
	CSblkXY (vlax-safearray->list CSblksa)
	)
    
  (setq CSlength (LM:getdynpropvalue n "Length"))
  (setq CSWidth (LM:getdynpropvalue n "Cut Width"))
  (setq CSExtension1 (LM:getdynpropvalue n "Extension 1"))
  (setq CSflip (LM:getdynpropvalue n "Slab Flip"))
  (if
    (= CSflip 0)
    (setq YMoveVal CSWidth)
    (setq YMoveVal (* -1 CSWidth))
    )

  ;(command "_.-insert" blk "10,10" 1 0 0)
  (command "_.-insert" blk CSblkXY 1.000001 0 0)
  
  (setq obj (entlast))
  (setq obj (vlax-ename->vla-object obj))
  (= "AcDbBlockReference" (vla-get-objectname obj))
  (= :vlax-true (vla-get-isdynamicblock obj))

  (LM:setdynpropvalue obj "Length" CSlength)
  (LM:setdynpropvalue obj "Angle1" CSrot)
  (LM:SetVisibilityState obj "Short Tag")
  (if
    (= CSflip 0)
    (LM:toggleflipstate obj)
    )

  (ucsobj n); set new UCS
  (setq ucschanged T) ; marker for *error* to reset UCS if routine doesn't get to it
  (command "_.move" "_l" "" "_non" '(0. 0. 0.) "_non" (cons (* -1 CSExtension1) (cons YMoveVal '(0. ))))
  (command "ucs" "P" ""); return previous UCS
  (setq ucschanged nil)

  ));foreach
  
  (vla-endundomark adoc) ;;; undomark bottom mark
  (*error* nil) (princ)
)
__________________
Блог

Последний раз редактировалось Red Nova, 09.01.2017 в 03:37.
Red Nova вне форума  
 
Непрочитано 09.01.2017, 16:38
#3196
kurstep


 
Регистрация: 27.01.2012
Сообщений: 240


Подскажите пожалуйста как программно сделать так чтоб при выборе графического объекта автокада выделялся сразу и зависимый объект (эти два объекта нужно заранее также программно сделать зависимыми ) (команда группа не подходит так как хочется сохранить ручки редактирования объектов)

Последний раз редактировалось kurstep, 09.01.2017 в 16:44.
kurstep вне форума  
 
Непрочитано 09.01.2017, 16:48
#3197
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Цитата:
Сообщение от kurstep Посмотреть сообщение
Подскажите пожалуйста как программно сделать так чтоб при выборе графического объекта автокада выделялся сразу и зависимый объект (объект этот нужно заранее также программно сделать зависимым назначить зависимым) (команда группа не подходит)
подвеситься на событие изменения выбора. А если будет выделено несколько объектов, а зависимые от них объекты находятся в разных частях чертежа - куда будет "дергаться" ВЭ?) Или отмасштабирует так, что ничего не будет видно толком?
Сергей812 вне форума  
 
Непрочитано 09.01.2017, 16:52
#3198
kurstep


 
Регистрация: 27.01.2012
Сообщений: 240


А как осуществить это подвешивание, можете скинуть ссылку на пример?, Остальные проблемы как-нибудь урегулирую)
kurstep вне форума  
 
Непрочитано 09.01.2017, 16:58
1 | #3199
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


я на лиспе фактически не пишу, поэтому могу скинуть только пример на Net.

----- добавлено через ~17 мин. -----
Полещук любезно сообщает в своей книге, что это событие SelectionChanged . Ищите в реакторах либо документа, либо редактора скорее всего.
Сергей812 вне форума  
 
Непрочитано 11.01.2017, 08:50
1 | #3200
VVA

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


Цитата:
Сообщение от kurstep Посмотреть сообщение
А как осуществить это подвешивание, можете скинуть ссылку на пример?, Остальные проблемы как-нибудь урегулирую)
http://forum.dwg.ru/showthread.php?p=805477#post805477

Тема в FАQ Реакторы - что это такое?

----- добавлено через ~2 мин. -----
Пример
http://lee-mac.com/dtcurve.html

__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 12.01.2017 в 12:11.
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