|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
AutoLISP: Работа с реакторами
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 12699
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Ты сам-то понял, чего хотел?
Реакторы сами по себе достаточно опасная штука. Вдобавок в каждом конкретном случае (имею в виду прежде всего вертикальные решения) надо проверять корректность работы этого реактора. Я уже не говорю о "навесках" типа СПДС / MechaniCS etc,- там свои тараканы могут встречаться. Постоянные реакторы навесить можно, и ты прав в том плане, что Цитата:
А вот что "проблема их загрузить" - извини, это тебе просто лень заниматься. Прописывается код с реакторами в автозагрузку и работай как хочешь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
В автозагрузку все не пропишешь, и надо ли оно? Вот есть у меня файл с прикрученным реактором, так что, из-за него во все рисунки загружать нужные только ему лиспы?
![]() И если нет в рисунке таких функций - просто пишет - нет такой функции. Что тут огребать? На нет и суда нет. Потом, я уже просек, что надо после срабатывания реактора, ставить в очередь выполнение нужных тебе функций и сразу из него сваливать. То есть функции начнут выполняться только после завершения обработки события и окончании работы реактора. Код сейчас подгоню. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Извини, но то, что ты говоришь - фигня чистой воды. Тебе никто не может помешать запускать свои функции как в момент срабатывания реактора, так и в момент выхода из него.
А то, что "функция отсутствует" - это до поры до времени. Когда файл рухнет или аудит твои объекты порушит - вот тогда ты поймешь, о чем я говорил. Я такое словил на 2005 ADT, с тех пор либо гарантированная загрузка реакторов, либо без постоянных. Второе предпочтительнее.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Не фигня! Стр. 788 раздел 9.8
1. 3-е ограничение. Цитирую: Цитата:
Цитата:
Цитата:
Так вот, мне надо нарушить все эти три правила. Мне надо, при переключении в динамическом блоке значения свойства "Настройка блока" со значения "Блок настроен" на значение "Настроить", чтобы сработал реактор, проверил значение свойства и если оно переключено - запустил программу перестройки блока. Проверить можно напрямую из функции действия, а вот все остальное - только дождавшись окончания работы реактора. И КАК я уже знаю. Сейчас будет код. погоди. |
||||
![]() |
|
||||
Создаем реактор объекта:
Код:
Код:
Вариант 1 (нельзя так делать!) Код:
Второй вариант: (так тоже нельзя делать!) Код:
Третий вариант: (Правильный) Код:
Последний раз редактировалось Supermax, 30.11.2008 в 14:59. |
||||
![]() |
|
||||
Таким макаром работают все функции, в состав которых входит и command, и entget, и DCL панели и прочее. Можно этот же объект удалять из списка объектов на обработку реактором и наоборот, добавлять. Я уж молчу, что его можно вообще весь переделать и он останется привязан к реактору (разумеется его сначала удаляют из списка, переделывают, и опять добавляют к списку).
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
1. Устойчивость такого реактора находится под очень большим вопросом.
2. Попытка навесить такое на CustomObject (объект СПДС / MechaniCS / ADT) при условии подгруженного ObjectEnabler'a или соответствующего arx может развалить AutoCAD 3. То же, что и 2, но без подгруженного OE или arx может завалить acad.exe при открытии файла с условием подгрузки сначала arx, а потом соответствующего реактора. Иногда срабатывает и при обратном порядке загрузки.* 4. Если через SendCommand в реакторе, привязанном к объекту, ты (случайно или нет - дело десятое) пошлешь команду на изменение этого же объекта (удаление тоже, по-моему, считается изменением), у тебя пойдет бесконечный цикл. Вдобавок рано или поздно получишь либо переполнение стека, либо ошибку 0x000005 (ну или сколько там нулей). Выход, как правило, только один - перезапуск acad.exe. --- Резюме: не иди в лоб, ищи обходные пути. --- Добавлено: * порядок загрузки лично мне отрегулировать не удавалось ни разу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Ай, ай, ай!
![]() Вышел я уже из реактора! ВЫШЕЛ! Пока был в функции действия, понавтыкал в очередь запуск других функций, но не выполнял их, пока не выйду, а когда вышел, они сами запустились. Я же указал прямо, на тот факт, что выполняется все, вплоть до самого конца функции действия, а то, что послано через vla-SendCommand, выполнится только когда реакция закончится. Это все равно, что просто запустить функцию не трогая объекты. Весь реактор из двух строчек, и нет в нем никаких действий по отношению к объекту, который вызвал эту реакцию реактора. Но, вот когда обработка события завершена и реактор опять переходит в спящий режим, начинают срабатывать лиспы, которые не могли пробиться к ком. строке, из-за работы реактора. Ну что может натворить функция, чье имя торчит в очереди? типа "(lisp_Onobj) ". |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Вызов ком.строки из-под реактора даже через SendCommand лично у меня несколько раз убивал acad. Я (надеюсь) не дурнее паровоза и вызывал SendCommand из функции окончания реактора. Поэтому я и сказал насчет устойчивости.
Теперь навесь на любой объект свой реактор изменения объекта и выполни (в конце, естественно) любую команду, затрагивающую этот объект.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
По поводу бесконечного цикла.
Есть много способов его устроить, но разве нам это надо? Я написал, а ты не прочитал, что Цитата:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Замечательно! Представь себе ситуацию:
1. Объект с хендлом "1234" 2. На его изменение "повешен" реактор с SendCommand 3. После изменения объекта срабатывает реактор, затрагивающий этот объект. Каковы будут твои действия для решения проблемы п.3? Ведь потом надо обратно реактор повесить...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Вся фишка заключается в том, что нельзя из реактора удалять все указатели на объекты, иначе он умрет. Вот поэтому и надо создавать временный элемент, чтобы он дал возможность выбросить из реактора элемент, требующий редакции.
![]() |
||||
![]() |
|
||||
Регистрация: 17.10.2008
Саратов
Сообщений: 426
|
Supermax, ни фига не понятно.
А в какой момент, и где прописано, прицепка реактора к блоку? Скопировал блок в другой файл, загрузил лисп, и не работает реактор. А в оригинале, первый раз еще можно двигануть стрелку у блока, но при этом длина устанавливается принудительно в 500, а далее вообще не сместа. Так где же цепляла реактора к блоку сидит? Или тут глупые вопросы ни-ни. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Supermax, даже если забыть про #16, ты постоянно создаешь "левый" объект. Ты, похоже, еще не "ловил" ошибку переполнения количества объектов...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Отвечаю сразу обоим.
Есть файл, в нем есть блок, на блок навешен реактор, реактор не в блоке, а в рисунке, поскольку он может следить за несколькими объектами. Копирование блока из файла в файл к копированию реактора не приводит! Его надо заново устанавливать. Установка реактора пост #6 Код:
Временный объект, на то и временный, что он создается->устанавливается->...->снимается->удаляется. Это не блок и переполнения библиотеки не будет. Мой реактор всегда содержит только один элемент, и только при срабатывании в нем появляется второй ВРЕМЕННО! Если надо сделать реактор, следящий сразу за группой объектов, то там не надо делать временных объектов. Kpblc, в лиспе каждая строчка подписана! |
||||
![]() |
|
||||
Есть один подводный камень. Не знаю как на других Автокадах, а у меня на 2007 он присутствует.
Если взять мой блок с прикрученным реактором и не растягивать его ручками, а залезть в пропертиес и там установить значение длинны линии цифрами, то блок начинает себя вести очень хитро. Ручка всегда возвращается на установленную длинну, а вот линия все удлинняется, и удлинняется (если ручку в сторону удлиннения перемещать), или укорачивается (если ручку перемещать внутрь). Явный баг Автокада, но если он у всех, его можно использовать. ![]() |
||||
![]() |
|
||||
Пока копаю вглубь. Ниточку уже схватил, распутываю.
Нарушение идет только в конкретном вхождении блока, реактор на вхождение вешается, а на остальные вхождения не распостраняется баг. Только при изменении динамических свойств из панели пропертиес, другие свойства блока (не динамические) типа поворот, слой и пр. к багу не приводят. Баг возникает, даже если другие динамические свойства пошевелить. Заметил, что изменение динамических свойств с панели не реагирует реактор. Если из ком. строки запускать Код:
Копаю, короче, ждите. |
||||
![]() |
|
||||
Очень, скажу странно не удаляются. В списке владельцев реактора объект исчезает, а реактор по прежнему продолжает реагировать на этот объект. И вот что еще интересно. Если добавлять в процессе выполнения функции modline объект, то реактор реагировать начинает и на него, а вот если его тоже в процессе удалять, то и реагировать на него перестает. Правда это точка, а не динамический блок. У меня сейчас нонсенс на экране. Реактор, у которого списов владельцев - nil показывает, а все равно продолжает реагировать на изменения свойств динамического блока.
|
||||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
По поводу изменения объекта объектным реактором (пусть даже после завершения) я бы побоялся использовать.
А вот сама методика реактор + Vlasendcommand - это плюсадин, у меня так dblclk реактор работеат. Такчто ИМХО любые реакторы кроме объектных - вроде безопасно. По поводу программирования в вертикальных решениях и уж тем более c СПДС ![]() |
|||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
И еще Supermax у меня задача с динблоками похожая счас стоит только я ее запихал в долгий ящик, а по ночам думаеца ее решать не через объектный реактор а через sysvar реактор, потипу как сделано в макросах типа как на кнопке copy:
Код:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Supermax, Реактор в функции modline можно временно деактивировать, а потом активировать снова.
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Что такое панель Properties? Правильно - это немодальное окно ActiveХ элемента. Я давно заметил, что когда оно открыто, то очень трудно вращать сложные объекты, а когда закрыто - легко. Понятное дело, туда идет постоянная подгрузка текущих значений выделенных элементов и если их много и они стремительно меняют свои значения,скажем при перемещении, то процесс заметно тормозится.
Где-то в глубине автокада есть словари с реакторами. Я встречал как-то, но где - не помню. Скорее всего, этот ActiveX элемент не все словари регенерирует. Глюк именно на динамических свойствах. Я другой пример сделал. Полилинию в координаты 0,0,0 перемещаю насильно, если ее от туда сдвинули - все как часы, в том числе и при изменении координаты из меню пропертиес. Только динамические свойства глючат. Либо надо найти механизм их коррекции, либо отказаться от услуг этой панели. Реакторы тут не причем! Все корректно работает, это только динамизм мешает удалять из реактора указатель на объект. О! Еще один опыт в голову пришел. |
||||
![]() |
|
||||
VVA, если у меня только линия не становится на место, а ручка становится, то у тебя уже и ручка не становится. Это я имею в виду глюк с изменением длинны через меню пропертиес. А так -
![]() Ща мужики, мы эту заразу выловим! |
||||
![]() |
|
||||
VVA, у тебя ситуация такая - ты деактивируешь, он при проверке функцией vlr-added-p пишет, что отключен, а реактор все равно продолжает реагировать на изменение объекта (по всем параметрам, даже по изменению угла поворота блока).
Последний раз редактировалось Supermax, 29.11.2008 в 23:12. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Один из вариантов: командой _propertiesclose
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
ВСЕ!
Проблема решена! Код:
На Сером форуме подсказали про другой процесс. Отредактировал, как VVA подсказал - тоже работает!!! Последний раз редактировалось Supermax, 30.11.2008 в 14:49. |
||||
![]() |
|
||||
Опишу механизм нарушения работы реактора.
ActiveX элемент "Свойства" (не знаю как он реально называется) предназначен для а) - демонстрации свойств объектов и б) - для изменения этих свойств, если они то позволяют. Цепочка действий идет такая - Собираются данные об объекте (или группе объектов); - Передаются в окно ActiveX компонента - Если пользователь изменил значение в окне - это значение анализируется на предмет совместимости и если да - передается в объект - Опять собираются данные с объекта (или группы объектов) Где-то в этой цепочке ActiveX компоненту нужна командная строка и что получается: - Передаются в окно ActiveX компонента - Если пользователь изменил значение в окне - это значение анализируется на предмет совместимости и если да - передается в объект - срабатывает реактор и посылает в командную строку (в очередь) данные - Начинается работа по изменению свойства блока - А работа ActiveX компонент "Свойства" пытается в это время получить данные с объекта. Где-то в общих чертах так. Ну, так нам спешить некуда, подождем и после отправим нашу функцию в командную строку. |
||||
![]() |
|
||||
Programming, automation, CADs, GISs. "Теплоком" Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306
|
Спасибо, Supermax, тебе за эту тему. Очень помог мне решить вот эту проблему: http://forum.dwg.ru/showthread.php?p=604338#post604338
__________________
На LISPе можно мыслить! Последний раз редактировалось Ax3, 03.08.2010 в 09:30. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
передача данных из AutoLisp в Excel | Victorovich | LISP | 2 | 03.12.2011 22:28 |
Параметрическая библиотека в autoLISP | joisegatoi | LISP | 8 | 18.06.2007 18:39 |
Autolisp и Visual Basic Книга | Piton | LISP | 6 | 27.02.2006 09:54 |