Как определить направление взгляда для пространста модели с помощью AutoLISP/VisualLISP
Как определить направление взгляда для пространста модели с помощью AutoLISP/VisualLISP
Иногда спрашивают, каким образом можно поределить направление взгляда для определенного видового экрана пространства модели. Я обнаружил, что сделать это только средствами LISP'a сложно. Под словом "сложно" подразумевается тот факт, что найти решение без переключения систтемной переменной TILEMODE не удалось. Может быть, кому-то оно и известно - тогда добро пожаловать в обсуждение.
Проблема заключается в том, что по соображениям производительности, таблица с данными о направлении взгляда обновляется только при переключении системной переменной TILEMODE. Естественно, в ObjectARX и .NET имеются инструменты, обеспечивающие полный контроль над этими данными (используется acedVports2VportTableRecords), но в LISP это не релизовано. Конечно, если на .NET разрабатывается соответствующая LISP-функция, картина изменится.
Тем не менне, в качестве примера можно рассмотреть такой LISP-код:
- (defun c:vptest (/ directionvariant objacad objdoc objvports safarray x y z)
- (vl-load-com) ; always make sure the COM system is loaded
- ; This is done to synchronize the viewports with the Viewport Table records
- ; In ObjectARX this is done with acedVports2VportTableRecords()
- (setvar "tilemode" 0)
- (setvar "tilemode" 1)
- ;;Get the Viewports collection
- (setq objacad (vlax-get-acad-object)
- objdoc (vla-get-activedocument objacad)
- objvports (vla-get-viewports objdoc)
- ) ; use a for loop and loop through the viewports
- (vlax-for objvport objvports
- ;;(vlax-dump-object objVport) ; Print out objects properties
- ; get the direction of the viewport
- (setq directionvariant (vla-get-direction objvport))
- (setq safarray (vlax-variant-value directionvariant)) ; Get the x,y,z values of the direction
- ; this can be used to determine the view
- (setq x (vlax-safearray-get-element safarray 0))
- (print (strcat "X=" (rtos x)))
- (setq y (vlax-safearray-get-element safarray 1))
- (print (strcat "Y=" (rtos y)))
- (setq z (vlax-safearray-get-element safarray 2))
- (print (strcat "Z=" (rtos z))) ; this is a simple example of setting the active viewport
- ; if x equals zero then make this viewport the active viewport
- ; this test would need to be enhanced to test the y and z values
- ; y should equal zero and x should be 1 (that is WCS)
- (if (= x 0.0)
- (vla-put-activeviewport objdoc objvport)
- ) ;_ end of if
- ) ;_ end of vlax-for
- (princ)
- ) ;_ end of defun
Источник: статья на adndevblog, автор Fenton Webb
Перевод: Алексей Кулик
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 21.07.2016