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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > При повторной загрузке реактора создается его копия?

При повторной загрузке реактора создается его копия?

Ответ
Поиск в этой теме
Непрочитано 16.11.2006, 10:33 #1
При повторной загрузке реактора создается его копия?
mmmx
 
Москва
Регистрация: 06.07.2006
Сообщений: 42

Разбираюсь с реакторами.
Из редактора Visual Lisp кнопкой "загрузить активное окно редактора" загружаю свой реактор:

Код:
[Выделить все]
(vl-load-com)
(vlr-command-reactor "before change" '((:vlr-commandwillstart . beforechange)))
(defun beforechange(calling-reactor commandInfo)
  (print "test")
)
Реактор реагирует на модификацию любого объекта, выводя в командную строку слово "test".

Вот что происходит в автокаде при наступлении этого события (текстовое окно Автокада):

Команда:
"test"
"test"

** РАСТЯГИВАНИЕ **
Точка растягивания или [Базовая точка/Копировать/ОТменить/выХод]:


Так вот, если я загружу еще раз реактор, то надписей "test" станет три! И так далее.
Я не пойму: в памяти автокада образуются копии реактора, которые независимо друг от друга реагируют на событие? Как с этим бороться? Или я что-то делаю неправильно, не выгружаю его перед повторной загрузкой?...
И еще вопрос: почему при первой загрузке две надписи "test"? Реактор срабатывает два раза или это просто эхо команды?

Подскажите пожалуйста, заранее благодарен!
Михаил
Просмотров: 3544
 
Непрочитано 16.11.2006, 10:51
#2
Кулик Алексей aka kpblc
Moderator

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


Ага. Для фикса бага попробуй наподобие:
Код:
[Выделить все]
(if *vlr-cmd*
  (progn
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if

(if (not *vlr-cmd*)
  (setq *vlr-cmd* (vlr-command-reactor
                    nil
                    '(
                      (:vlr-commandwillstart . cmd-start)
                      (:vlr-commandended . cmd-end)
                      (:vlr-commandcancelled . cmd-cancel)
                      (:vlr-commandfailed . cmd-fail)
                      )
                    ) ;_ end of VLR-Command-Reactor
        ) ;_ end of setq
  ) ;_ end of if
Естестенно, подставив свои значения переменных и функций
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.11.2006, 11:32
#3
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Спасибо, помогает!

Все-таки, это единственный и правильный способ борьбы?

И еще мне все еще непонятно, почему (уже с применением этой "чистилки") после первичной загрузки реактора - два сообщения "тест" (то есть два прохода по реактору), а после повторной загрузки - одно?!

Команда:
"test"
"test"

** РАСТЯГИВАНИЕ **
Точка растягивания или [Базовая точка/Копировать/ОТменить/выХод]:

---здесь я повторно загружаю реактор---

Команда:
"test"

** РАСТЯГИВАНИЕ **
Точка растягивания или [Базовая точка/Копировать/ОТменить/выХод]:
[/code]
mmmx вне форума  
 
Непрочитано 16.11.2006, 13:20
#4
Кулик Алексей aka kpblc
Moderator

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


А в первый раз грузится-то один раз или два? Поставь этот код в файл с реакторами - по идее должно сразу очиститься и поставиться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.11.2006, 14:49
#5
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Цитата:
Поставь этот код в файл с реакторами -
Так я его и ставлю, о нем и говорю: первый раз он работает дважды, а после второй загрузки - уже один раз!
mmmx вне форума  
 
Непрочитано 16.11.2006, 15:06
#6
Кулик Алексей aka kpblc
Moderator

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


В абсолютно пустой файл и кад вставил следующий код:
Код:
[Выделить все]
(if *vlr-cmd*
  (progn
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if

(if (not *vlr-cmd*)
  (setq *vlr-cmd* (vlr-command-reactor
                    nil
                    '(
                      (:vlr-commandwillstart . beforechange)
                      )
                    ) ;_ end of vlr-command-reactor
        ) ;_ end of setq
  ) ;_ end of if

(defun beforechange (calling-reactor commandinfo)
  (print "test")
  ) ;_ end of defun
Лог работы:
Цитата:
Код:
[Выделить все]
Command: l LINE
"test" Specify first point:
Specify next point or [Undo]:
Specify next point or [Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Command: pl PLINE
"test"
Specify start point:
Current line-width is 0.0000
Specify next point or [Arc/Halfwidth/Length/Undo/Width]:
Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:
Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:
Command: e ERASE
"test"
Select objects: Specify opposite corner: 1 found

Select objects:

Command:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.11.2006, 16:27
#7
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Хм...
Ладно, все равно - спасибо большое за помощь!
mmmx вне форума  
 
Непрочитано 16.11.2006, 17:50
#8
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Код:
[Выделить все]
(vl-load-com)
(if (not bch)
  (setq	bch (vlr-command-reactor
	      "before change"
	      '((:vlr-commandwillstart . beforechange))
	    )
  )
)
(if (not (vlr-added-p bch))
  (vlr-add bch)
)
(defun beforechange (calling-reactor commandInfo)
  (print "test")
)
Эдуард вне форума  
 
Автор темы   Непрочитано 16.11.2006, 21:52
#9
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Спасибо, Эдуард, kpblc, ваш код работает...
Забыл упомянуть про одну вещь: ошибка была на автокаде2006. Сейчас дома, проверяю на 2002-м - работает, как положено!
Вот только что с 2006-м акадом делать?..
mmmx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > При повторной загрузке реактора создается его копия?