ADN Open CIS
Сообщество программистов Autodesk в СНГ

21/07/2016

Как определить направление взгляда для пространста модели с помощью AutoLISP/VisualLISP

Как определить направление взгляда для пространста модели с помощью AutoLISP/VisualLISP

Иногда спрашивают, каким образом можно поределить направление взгляда для определенного видового экрана пространства модели. Я обнаружил, что сделать это только средствами LISP'a сложно. Под словом "сложно" подразумевается тот факт, что найти решение без переключения систтемной переменной TILEMODE не удалось. Может быть, кому-то оно и известно - тогда добро пожаловать в обсуждение.

Проблема заключается в том, что по соображениям производительности, таблица с данными о направлении взгляда обновляется только при переключении системной переменной TILEMODE. Естественно, в ObjectARX и .NET имеются инструменты, обеспечивающие полный контроль над этими данными (используется acedVports2VportTableRecords), но в LISP это не релизовано. Конечно, если на .NET разрабатывается соответствующая LISP-функция, картина изменится.

Тем не менне, в качестве примера можно рассмотреть такой LISP-код:

Код - Auto/Visual LISP: [Выделить]
  1. (defun c:vptest (/ directionvariant objacad objdoc objvports safarray x y z)
  2.   (vl-load-com) ; always make sure the COM system is loaded
  3.           ; This is done to synchronize the viewports with the Viewport Table records
  4.           ; In ObjectARX this is done with acedVports2VportTableRecords()
  5.   (setvar "tilemode" 0)
  6.   (setvar "tilemode" 1)
  7.   ;;Get the Viewports collection
  8.   (setq objacad   (vlax-get-acad-object)
  9.         objdoc    (vla-get-activedocument objacad)
  10.         objvports (vla-get-viewports objdoc)
  11.         ) ; use a for loop and loop through the viewports
  12.   (vlax-for objvport objvports
  13.     ;;(vlax-dump-object objVport)   ; Print out objects properties
  14.           ; get the direction of the viewport
  15.     (setq directionvariant (vla-get-direction objvport))
  16.     (setq safarray (vlax-variant-value directionvariant)) ; Get the x,y,z values of the direction
  17.           ; this can be used to determine the view
  18.     (setq x (vlax-safearray-get-element safarray 0))
  19.     (print (strcat "X=" (rtos x)))
  20.     (setq y (vlax-safearray-get-element safarray 1))
  21.     (print (strcat "Y=" (rtos y)))
  22.     (setq z (vlax-safearray-get-element safarray 2))
  23.     (print (strcat "Z=" (rtos z))) ; this is a simple example of setting the active viewport
  24.           ; if x equals zero then make this viewport the active viewport
  25.           ; this test would need to be enhanced to test the y and z values
  26.           ; y should equal zero and x should be 1 (that is WCS)
  27.     (if (= x 0.0)
  28.       (vla-put-activeviewport objdoc objvport)
  29.       ) ;_ end of if
  30.     ) ;_ end of vlax-for
  31.   (princ)
  32.   ) ;_ end of defun

Источник: статья на adndevblog, автор Fenton Webb

Перевод: Алексей Кулик

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 21.07.2016