Группы пользователей Autodesk

Обработка нелинейных последовательностей реакторов


Окончательная компоновка

 

Окончательная компоновка 
 

Обработка нелинейных последовательностей реакторов



Последняя важная деталь связана с необычной последовательностью "команда/реактор" при редактировании полилинии в AutoCAD с помощью специальных команд работы с ручками. Команды работы с ручками доступны из контекстного меню после выбора ручки на объекте с последующим щелчком правой кнопкой мыши. Последовательность реакторов при этом не является линейной, как в случае команд ПЕРЕНЕСТИ или СТЕРЕТЬ. Фактически, пользователь, не завершив одну команду, переключается на другую. Для разъяснения этой ситуации можно загрузить код из занятия 6, отслеживающий последовательность реакторных событий. Можно также просто просмотреть следующие сообщения, выводимые в окне консоли VLISP:

;; To start, select the polyline and some of the circles by using a

;; crossing selection box. The items in the selection set--

;; the chosen circles and the polyline--are now shown with grips on.

;; To initiate the sequence, click on one of the polyline grips:

(GP:COMMAND-WILL-START #<VLR-Command-reactor> (GRIP_STRETCH))

;; Now change the command to a move by right-clicking and choosing

;; MOVE from the pop-up menu. Notice that the command-ended

;; reactor fires in order to close out the GRIP_STRETCH command

;; without having fired an object reactor event:

(GP:COMMAND-ENDED #<VLR-Command-reactor> (GRIP_STRETCH))

(GP:COMMAND-WILL-START #<VLR-Command-reactor> (GRIP_MOVE))

;; Now drag the outline (and the selected circles) to a new location.

(GP:OUTLINE-CHANGED #<VLA-OBJECT IAcadLWPolyline 028f3188>

#<VLR-Object-reactor> nil)

(GP:COMMAND-ENDED #<VLR-Command-reactor> (GRIP_MOVE))

Как видно из показанного примера, нельзя быть уверенным, что функции отклика для объектных реакторов вызываются во всех случаях.

Данная последовательность имеет некоторые отличия от обычной. Даже во время последнего отклика на окончание команды круги, являющиеся выбранными, не удаляются.
Эти круги все еще открыты программой AutoCAD. Попытка удалить их с помощью функции отклика на окончание команды может привести к сбою в AutoCAD. Для того чтобы избежать этого, можно воспользоваться другой глобальной переменной, хранящей список указателей на объекты-плитки до тех пор, пока последние не будут удалены.

Для обработки нелинейной реакторной последовательности



  • Добавьте в файл gpreact.lsp следующую функцию:


  • (defun gp:erase-tiles (reactor / reactorData tiles tile)

    (if (setq reactorData (vlr-data reactor))

    (progn

    ;; Tiles in the path are stored as data in the reactor.

    (setq tiles (cdr (assoc 100 reactorData)))

    ;; Erase all the existing tiles in the path.

    (foreach tile tiles

    (if (and (null (member tile *Safe-to-Delete*))

    (not (vlax-erased-p tile))

    )

    (progn

    (vla-put-visible tile 0)

    (setq *Safe-to-Delete* (cons tile *Safe-to-Delete*))

    )

    )

    )

    (vlr-data-set reactor nil)

    )

    )

    )

    Эта функция будет использоваться на первом этапе удаления плиток. Обратите внимание, что что плитки в действительности не стираются: они становятся невидимыми и добавляются в глобальную переменную *Safe-to-Delete*.

  • Добавьте в файл gpreact.lsp следующую функцию:


  • (defun Gp:Safe-Delete (activeCommand)

    (if (not (equal

    (strcase (substr activeCommand 1 5))

    "GRIP_"

    )

    )

    (progn

    (if *Safe-to-Delete*

    (foreach Item *Safe-to-Delete*

    (if (not (vlax-erased-p Item))

    (vla-erase item)

    )

    )

    )

    (setq *Safe-to-Delete* nil)

    )

    )

    )

    Функция может быть вызвана, если неактивны команды перемещения или растягивания объектов с помощью ручек.

     


    Содержание раздела