Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 235
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2047988
 
Непрочитано 31.07.2024, 10:44
#4681
Сергей812


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


Цитата:
Сообщение от Сет Посмотреть сообщение
Эта ссылка не на азы.
азы - это основы языка, как создать первый плагин под акад и т.п. А потом начинается чтение справки, форумов и пробы, пробы, пробы (благо сделать резервную копию кода программы не проблема). Копируете чужой код, пробуете.. Работает - начинаете разбирать каждую строчку и комментировать этот код. В голове начинает это все укладываться постепенно. Либо забыть про всё это
Цитата:
Сообщение от Сет Посмотреть сообщение
Хочу программно отрисовывать будущий вид создаваемых элементов, как это реализовано в оригинальных функциях автокад. Например ту же самую мультивыноску. Стандартная мультивыноска меня не устраивает. Рисую ее через vla-AddMLeader, далее меняю разные свойства. Нужно чтобы она была визуализирована, пока я перемещаю курсор по экрану.
и продолжать делать в рамках возможностей лиспа.
-----

ну и еще одна ссылка - более подробного учебника за эти года, пожалуй, не видел. Пока еще доступно)

Последний раз редактировалось Сергей812, 31.07.2024 в 14:54.
Сергей812 вне форума  
 
Непрочитано 31.07.2024, 15:44
#4682
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Русскоязычных ресурсов с более подробным разжевыванием азов не нашел в свое время.
adn-cis.org
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.07.2024, 15:47
#4683
Сергей812


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


Цитата:
Сообщение от Сет Посмотреть сообщение
Я под азами в данном случае имел ввиду этап организации взаимодействия программы со средой Автокад. То есть реализация, для начала, банальной вещи. Например такой, как вывод в командную строку автокада сообщения "Hello, World!". Этот этап описан в справке по ObjectArx. Я думал Jig - это нечто другое, но нет, это часть ObjectArx, значит азы там смотреть и нужно. Там, правда, все довольно лаконично. Русскоязычных ресурсов с более подробным разжевыванием азов не нашел в свое время.
есть открытое API, через которое можно взаимодействовать с акадом: lisp, vba, ObjectARX, .Net. Можно, конечно, писать и на нескольких видах API одновременно, но обычно выбирают все-таки один какой-то вид API - который обеспечивает нужный функционал. Лисп ваши потребности уже не обеспечивает.
Сергей812 вне форума  
 
Непрочитано 31.07.2024, 16:44
#4684
Сет


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


Повесил объектный реактор на динамический блок с атрибутами. В функции-обработчике события :vlr-subObjModified планировал менять некоторые динамические параметры. Однако получаю вот такую ошибку:
Цитата:
Ошибка Automation. Объект был открыт для уведомления
Как выяснилось - эта ошибка возникает даже если в обработчике просто попытаться получить имя блока (vla-get-Name), вызвавшего срабатывание реактора. Получается в обработчике реактора запрещено читать и изменять свойства подобных объектов?
Сет на форуме  
 
Непрочитано 31.07.2024, 16:54
#4685
Кулик Алексей aka kpblc
Moderator

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


А какой именно реактор был повешен? Хотя бы тип реактора.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.07.2024, 17:09
#4686
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А какой именно реактор был повешен? Хотя бы тип реактора.
vlr-object-reactor
Сет на форуме  
 
Непрочитано 01.08.2024, 10:51
#4687
Кулик Алексей aka kpblc
Moderator

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


Для С++/ObjectARX выделил отдельную тему: https://forum.dwg.ru/showthread.php?t=171769
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.08.2024, 09:57
#4688
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от Сет Посмотреть сообщение
Можно ли использовать grread с объектной привязкой и ее отслеживанием?
можно, но, например, через правый клик, если прямо вот нужно точное позиционирование.
Нажмите на изображение для увеличения
Название: MTL_ML.gif
Просмотров: 15
Размер:	2.11 Мб
ID:	264061
__________________
K Lisp
koMon вне форума  
 
Непрочитано 02.08.2024, 15:05
#4689
Сет


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


Странное поведение блока с параметром видимости (круг и овал). Сделал блок, у которого два состояния видимости. На блок повесил объектный реактор, который делает много всякого и среди прочего - читает состояние видимости:
Код:
[Выделить все]
 (setq shape (vlax-variant-value (vla-get-value param)))
Здесь param - это ссылка на vla-объект динамический параметр, полученный через vla-getdynamicblockproperties. Реактор работает как надо, за исключением следующего визуального дефекта (см. вложение).
1. Состояние, когда блок вставлен в чертеж, все с ним пока как надо.
2. Переключена видимость с круга на овал. Здесь уже проблемка - должны были появиться ручки линейного параметра, которые видны на картинке 3. Отмечу, что в этот момент уже сработал объектный реактор.
3. Нажимаю ESC и просто выделяю блок - теперь он снова выглядит как надо.
4. Переключаю видимость на круг - и снова визуальный дефект в виде ручек линейного параметра, которые должны были отключиться, так как относятся к состоянию видимости "овал". Здесь тоже срабатывает реактор.

При этом достаточно просто выделить блок заново - все лишние ручки исчезают, а нужные появляются.
А к чему я упомянул чтение параметра видимости, так это к тому, что если я в лисп к нему не обращаюсь, то ручки динамических параметров сразу отображаются как надо, не нужно дополнительно обновлять выделение блока.

Что это за глюк такой и как можно его побороть?
Напрашивается вариант с программным выделением блока, но какое-то некрасивое решение.
Может можно как-то обновить отрисовку этого блока в конце кода функции-обработчике реактора? Update, redraw - не работают.

----- добавлено через ~30 мин. -----
Вот на что еще обратил внимание - после срабатывания реактора (п.2 и п.4) - сбрасывается выделение блока. В обычном блоке без реакторов при переключении видимости выделение не сбрасывается.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 7
Размер:	25.5 Кб
ID:	264070  
Сет на форуме  
 
Непрочитано 02.08.2024, 15:57
#4690
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
Может можно как-то обновить отрисовку этого блока в конце кода функции-обработчике реактора? Update, redraw - не работают.
(entdel ...) этого блока 2 раза тоже не помогает?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 02.08.2024, 16:20
#4691
Сет


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
(entdel ...) этого блока 2 раза тоже не помогает?
В этом случае сбрасывается выделение.

А как выделить vla объект? Что-то у меня не получается.
Код:
[Выделить все]
 (setq ss (vla-Add (vla-get-SelectionSets active_document) "MySelSet"))
	    (setq ssobj (vlax-make-safearray vlax-vbObject (cons 0 0)))
	    (vlax-safearray-put-element ssobjs 0 blc)
	    (vla-AddItems ss ssobjs)
	    (vla-Delete ss)
Здесь blc - ссылка на vla объект.

----- добавлено через ~8 мин. -----
Опечатка в переменных - ssobj и ssobjs. Добавил еще
Код:
[Выделить все]
 (vla-Highlight ss :vlax-true)
Узел выделяется, но вот "нелегальные ручки" остаются на месте

----- добавлено через ~15 мин. -----
Работает вот такая конструкция - после переключения видимости блок остается выделенным и все ручки соответствуют состоянию видимости, но решение какое-то кривое и некрасивое.
Код:
[Выделить все]
 (setq ent (vlax-vla-object->ename blc))
	    (entdel ent)
	    (entdel ent)
	    (setq ss (ssadd))
	    (ssadd ent ss)
	    (sssetfirst nil ss)
	    (setq ss nil)
Сет на форуме  
 
Непрочитано 02.08.2024, 18:16
#4692
Кулик Алексей aka kpblc
Moderator

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


У меня крепнет подозрение, что все можно сделать значительно менее геморно - но для этого надо задачу знать, ради решения которой вся эта катавасия вообще стартанула.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.08.2024, 18:25
#4693
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У меня крепнет подозрение, что все можно сделать значительно менее геморно - но для этого надо задачу знать, ради решения которой вся эта катавасия вообще стартанула.
Блок - узел. Представляет из себя круг и выноску (видно по скринам выше) с двумя доступными пользователю динамическими параметрами - изменение положения полки и изменение радиуса круга.
Базовые требования:
1. Адаптация длины полки выноски к содержимому при вставке блока и редактировании.
2. Контроль положения текста относительно полки выноски (как для текста выше полки, так и для текста ниже полки).
3. Адаптация выносной линии, чтобы она всегда была по радиусу при смещении полки выноски.
4. При смещении полки выноски за ручку - отзеркаливание полки с текстом при условии, если точка полки пересекает вертикальную ось, проходящую через центр круга.
5. Работающие объектная привязка и ее отслеживание при добавлении блока узла и его изменении.
6. Вариации узла, где вместо круга - овал (вертикальный и горизонтальный).
Сет на форуме  
 
Непрочитано 02.08.2024, 19:15
#4694
Кулик Алексей aka kpblc
Moderator

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


Похоже на позиционную выноску от СПДС. Если б не овал, можно было бы простой мультивыноской обойтись. Offtop: В свое время тоже бредил подобной идеей, но от реализации в конце концов отказался.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.08.2024, 19:33
#4695
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если б не овал, можно было бы простой мультивыноской обойтись.
В мультивыноске есть проблема по позиционированию текста относительно полки. Сложно настроить точные зазоры от верхнего и нижнего текста до нее. А еще сделать чтобы полка была чуть длиннее текста (я сделал через пробелы вначале и в конце текста - неудобный костыль). У меня простая выноска есть на Мультивыноске, я ей пользуюсь, но вот некоторые недостатки мультивыноски не нравятся.

А свой узел я реализовал через реакторы (ну, надо только еще горизонтальный овал доделать, но там все понятно - просто надо сесть и сделать). Он хорошо работает, мне просто не нравится реализация в частности вот этого момента с "нелегальными" ручками параметров, которые видны, хотя не должны быть видны. И наоборот - не видны тогда, когда должны быть видны. Хотелось бы более красивого решения, думаю у меня из-за недостатка знаний это сделано плохо. Странно, что чтение параметра видимости приводит к этой проблеме.

----- добавлено через ~60 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
Странно, что чтение параметра видимости приводит к этой проблеме.
Кажется разобрался в чем была проблема. Виновато вовсе не чтение параметра видимости, а функция vla-Update для блока после программной настройки динамических параметров. Вроде как пишут, что эта функция нужна, чтобы настроенные параметры вступили в действие и результат отобразился на экране. Но может быть это было нужно в ранних версиях Автокада (у меня Автокад 2022). Сейчас просто убрал эту функцию - и блок стал адекватно работать. И все параметры отображаются так, как я их программно настроил, и ручки у параметров правильные, и блок остается выделенным (в отличие от того, как было на скриншотах 2 и 4 выше, где у блока слетало выделение).
Сет на форуме  
 
Непрочитано 05.08.2024, 15:04
#4696
Сет


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


Выявил интересную особенность по реакторам. Поправьте знающие, если я ошибаюсь.

Если повесить на примитив объектный реактор vlr-object-reactor, который отслеживает событие копирования :vlr-copied, то в функцию-обработчик передается в списке параметров имя объекта, созданного операцией копирования. Первая интересность состоит в том, что в самой функции-обработчике с этим объектом ничего сделать нельзя, потому что он еще не существует, ему всего лишь присвоено будущее имя. Чтобы работать с этой копией - нужна глобальная переменная, в которую я помещаю имя объекта и командный реактор vlr-command-reactor, который отслеживает событие окончания выполнения команды :vlr-commandEnded. В функции-обработчике этого события скопированный объект уже существует и с ним можно делать что угодно.

Такой подход вполне работает с командой COPY. Однако объект скопировать можно еще и командой COPYCLIP и вставить командой PASTECLIP. И тут вторая интересность - после выполнения команды PASTECLIP объект, созданный копированием и от которого у нас есть только имя - все еще не существует. Соответственно в обработчике команды PASTECLIP ничего с объектом сделать нельзя. Судя по всему нужно делать еще один реактор типа vlr-acdb-reactor и там отслеживать событие добавления примитива :vlr-objectAppended и уже там делать то что надо с объектом, вставленным через буфер обмена.

Попутно возник вопрос. Как проверить есть ли в базе примитивов чертежа объект с указанным именем? Это надо для проверки перед выполнением каких либо действий над объектом, когда после срабатывания реактора копирования есть только имя объекта, но нет понимания объект уже существует или еще нет.
Сет на форуме  
 
Непрочитано 05.08.2024, 15:23
#4697
Кулик Алексей aka kpblc
Moderator

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


Ты под именем понимаешь handle? Если да, то handent для неправильного хендла вернет nil
Для операций копирования я бы, скорее всего, использовал командные реакторы - они как-то мне ближе.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.08.2024, 16:03
#4698
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты под именем понимаешь handle?
Я имею ввиду вот это имя: <Имя объекта: 2d0b9892db0>. Оно в таком виде передано в качестве параметра в функцию-обработчик объектного реактора копирования.
Сет на форуме  
 
Непрочитано 05.08.2024, 16:06
#4699
Кулик Алексей aka kpblc
Moderator

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


Ну пробуй получить от него entget. nil - объекта еще нет
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.08.2024, 16:07
#4700
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Для операций копирования я бы, скорее всего, использовал командные реакторы - они как-то мне ближе.
А как обойтись без объектных реакторов, если в функции-обработчике нужно знать конкретный объект, в котором произошло событие? Вот например копирование. Отловили мы командным реактором событие копирования, но как определить какие именно объекты были скопированы? Может как-то и можно, но я не придумал простого способа. А в объектном реакторе удобно, что известно какой объект стал источником события.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну пробуй получить от него entget. nil - объекта еще нет
Да, можно так проверять существует объект или нет.
Сет на форуме  
Ответ
Вернуться   Форум 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