|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
AutoLISP: Работа с реакторами
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 12696
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Ты сам-то понял, чего хотел?
Реакторы сами по себе достаточно опасная штука. Вдобавок в каждом конкретном случае (имею в виду прежде всего вертикальные решения) надо проверять корректность работы этого реактора. Я уже не говорю о "навесках" типа СПДС / MechaniCS etc,- там свои тараканы могут встречаться. Постоянные реакторы навесить можно, и ты прав в том плане, что Цитата:
А вот что "проблема их загрузить" - извини, это тебе просто лень заниматься. Прописывается код с реакторами в автозагрузку и работай как хочешь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
В автозагрузку все не пропишешь, и надо ли оно? Вот есть у меня файл с прикрученным реактором, так что, из-за него во все рисунки загружать нужные только ему лиспы?
![]() И если нет в рисунке таких функций - просто пишет - нет такой функции. Что тут огребать? На нет и суда нет. Потом, я уже просек, что надо после срабатывания реактора, ставить в очередь выполнение нужных тебе функций и сразу из него сваливать. То есть функции начнут выполняться только после завершения обработки события и окончании работы реактора. Код сейчас подгоню. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Извини, но то, что ты говоришь - фигня чистой воды. Тебе никто не может помешать запускать свои функции как в момент срабатывания реактора, так и в момент выхода из него.
А то, что "функция отсутствует" - это до поры до времени. Когда файл рухнет или аудит твои объекты порушит - вот тогда ты поймешь, о чем я говорил. Я такое словил на 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,404
|
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,404
|
Вызов ком.строки из-под реактора даже через SendCommand лично у меня несколько раз убивал acad. Я (надеюсь) не дурнее паровоза и вызывал SendCommand из функции окончания реактора. Поэтому я и сказал насчет устойчивости.
Теперь навесь на любой объект свой реактор изменения объекта и выполни (в конце, естественно) любую команду, затрагивающую этот объект.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
По поводу бесконечного цикла.
Есть много способов его устроить, но разве нам это надо? Я написал, а ты не прочитал, что Цитата:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Замечательно! Представь себе ситуацию:
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,404
|
Supermax, даже если забыть про #16, ты постоянно создаешь "левый" объект. Ты, похоже, еще не "ловил" ошибку переполнения количества объектов...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Отвечаю сразу обоим.
Есть файл, в нем есть блок, на блок навешен реактор, реактор не в блоке, а в рисунке, поскольку он может следить за несколькими объектами. Копирование блока из файла в файл к копированию реактора не приводит! Его надо заново устанавливать. Установка реактора пост #6 Код:
Временный объект, на то и временный, что он создается->устанавливается->...->снимается->удаляется. Это не блок и переполнения библиотеки не будет. Мой реактор всегда содержит только один элемент, и только при срабатывании в нем появляется второй ВРЕМЕННО! Если надо сделать реактор, следящий сразу за группой объектов, то там не надо делать временных объектов. Kpblc, в лиспе каждая строчка подписана! |
||||
![]() |
|
||||
Есть один подводный камень. Не знаю как на других Автокадах, а у меня на 2007 он присутствует.
Если взять мой блок с прикрученным реактором и не растягивать его ручками, а залезть в пропертиес и там установить значение длинны линии цифрами, то блок начинает себя вести очень хитро. Ручка всегда возвращается на установленную длинну, а вот линия все удлинняется, и удлинняется (если ручку в сторону удлиннения перемещать), или укорачивается (если ручку перемещать внутрь). Явный баг Автокада, но если он у всех, его можно использовать. ![]() |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
передача данных из 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 |