我仍然不知道我是否理解你的目标,或者至少不知道为什么VBA是必要的(对不起)。
如果您希望能够切换ViewportOn属性,只需这样做,就不需要这个复杂的应用层,删除层补充,听起来它只是作为一种机制添加的,在不必要的时候做出反应(想想事件驱动的代码)。。。如果我错了,每个视口都需要单独的图层,请纠正我。
如果我是正确的,您只需要切换ViewportOn属性,而不需要调用MVIEW命令,指定开/关,然后考虑以下简单的LISP示例:
- (defun c:Test1 ()
- (command "._mview" "off")
- (princ)
- )
- (defun c:Test2 ()
- (command "._mview" "on")
- (princ)
- )
- (defun c:Test3 (/ *error* acDoc)
- (defun *error* (msg)
- (if acDoc
- (vla-endundomark acDoc)
- )
- (cond ((not msg)) ; Normal exit
- ((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
- ((princ msg)) ; Fatal error, display it
- )
- (princ)
- )
- (if (= 0 (getvar 'tilemode))
- (if (ssget "_:L" '((0 . "VIEWPORT")))
- (progn
- (vla-startundomark
- (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
- )
- (vlax-for x (vla-get-activeselectionset acDoc)
- (vla-put-viewporton x (~ (vlax-get x 'viewporton)))
- )
- )
- )
- (*error* "\n** Command not allowed in Model Tab **")
- )
- (*error* nil)
- )
Test1和Test2提示用户输入“开/关”规范,然后调用MVIEW命令,该命令允许用户选择布局中的任何视口。
Test3使用ActiveX而不是命令调用有效地执行与Test1相同的操作,并将测试2组合在一起(如果启用了ViewportOn,则禁用等等)。
HTH公司 |