|
Visual LISP
$ L7 \( C) j. i- n0 {Visual LISP 编辑器中不能正确处理双字节字符。把光标放置在双字节字符后,按 Enter
0 u2 A* A8 ], v键转到下一行时,会丢失一些字符。当前不应在 Visual LISP 编辑器中编辑双字节字符。
$ k$ J6 B! e9 |在 Visual LISP IDE 中,\r 转义字符不能得到回车符。而是紧跟在最后一个打印文字后面显示文字。解决方法是用
/ k1 M l) r, r* s, }(CHR 13) 代替 \r。
$ m4 S$ Z( A6 b5 lVisual LISP 允许用户在编译应用程序时将 DVB 文件打包到单个 VLX 文件中,但目前无法访问这些文件。解决方法是:象
! l1 ?, P% \3 G( q2 jAutoCAD 早期版本那样,AutoLISP 应用程序所需的任何 DVB 文件必须作为单独文件包括进来。
: e7 n3 ]/ ?$ m, Y4 G. V如果 LOAD 加载单独名称空间 VLX 时出现错误,某些函数可能在检测到错误之前已输出到当前文档名称空间。必须确保修复此错误、重新编译并重载
4 X3 X: z% f' y) D2 e2 n3 zVLX 才能确保所有函数的正确版本输出到当前文档。
( c8 s, I( s, G4 [: t, ]在 SDI 模式下运行并且将 LISPINIT 系统变量设置为 1 时,acad.lsp 文件只加载到启动文档中,而不加载到所有在
, \0 K* w4 \/ P' e& [" \( \AutoCAD 任务中打开的后续图形中。为确保将 acad.lsp 加载到所有新文档中,请将 ACADLSPASDOC
2 I" _' t# k4 g9 w, u系统变量设置为 1。, w% H# s' c3 a; H
当 MENULOAD 命令在 MDI 中加载局部菜单时,该菜单的 MNL 文件对每个打开的文档加载一次,同时所有的用户交互操作都出现在当前文档中。为避免在用 6 @" `+ u/ |4 U" D
AutoCAD 打开多个图形时出现多余的打印信息或用户提示,建议在 MNL LISP 代码中不要包含任何用户交互操作。请使用 0 N3 Z5 P1 W! ^3 x
MNL 代码为后面选择的菜单项加载所需的 LISP 文件。用 acad.lsp 或 acaddoc.lsp
5 f; J" S0 R( j' A4 g1 e! i文件执行打开图形时要处理的 LISP
& e6 g: \5 L# N- Z! Y7 U代码。 4 R6 q) j$ r& e# ^/ n& j8 a
如果用单个正斜杠作为分隔符,使用 vla-unloadDVB 将文件名参数传递到 ActiveX 9 G) ~1 d! W- N" o7 w- E, S+ T
UnloadDVB 的方法将失败。调用 vla-loadDVB、vla-RunMacro 和 vla-unloadDVB
6 Q) D9 v! m( U9 z8 K1 Y时,建议用双反斜杠作为分隔符来指定文件名参数。
* |) p6 E) h/ t: x8 G试图用 S::STARTUP 函数显示命令行提示时,该提示显示在等待输入到 LISP 例程中的命令行上面。
4 M) e6 A3 ~7 J' a/ g% h' T, V当前解决此问题的方法是编写提示用户输入的 VBA 对话框的代码,并从 S::STARTUP 函数调用该对话框。例如,将下面的
9 u& [( U/ |1 AAutoLISP 代码放在 acaddoc.lsp 文件中,将导致在任何时候打开 AutoCAD ( U" g0 n$ \# S% d5 ^1 T
图形都运行 VBA 对话框宏:
0 V# _/ s- ~7 b& o9 h;; AcadDoc.Lsp
4 _ w9 M1 c9 V8 Q, Y4 n(defun S::STARTUP ()/ M+ J0 O" h% S) {7 v- P
(vl-load-com) J7 e% A; Y# [# T* y1 \
(setq acadApp (vlax-get-acad-object))2 B+ ?4 w' i9 s9 m( T
(setq advbFil "PromptUser.dvb")- _1 R) p( |. i* |* `% w
(setq avbaMacro "RunDialog")4 E; K0 b. R% F' D, u4 j9 E
;; 此代码假定 .dvb 文件在 AutoCAD 搜索路径中
; W# y1 f- m. X& \" Q* y, q) v1 s(vl-vbaload advbFil)
( U7 R- A& ~6 v( j6 M8 \(vl-vbarun avbaMacro)" P6 z& d8 ^- t
)4 W* E1 [5 m& Y; M( i: f, t$ T8 n
此代码中引用的 PromptUser.dvb 文件可从 AutoCAD + C1 B3 X0 O3 Q, ]& ~
2000 网站下载:
( ]) a, S: s$ [- xhttp://www.autodesk.com/autocad2000-utilities。在“下载”选项卡上,在“产品”下选择“AutoCAD”,在“版本”下选择“AutoCAD ' D9 c" g& c- F( Q; T5 T
2000”,在“类别”下选择“实用程序”。输入关键词 vba macro,然后单击“转至”。在“使用 VBA
: j, V7 ]5 p! K/ c0 k宏在 S::STARTUP 过程中处理用户提示”中单击超文本。下载 prmtuser.zip 文件。
* g0 N- s: h) b% J
# U; [' o9 o; O3 q用来防止文档被标记为“已更新”的新函数# y. u8 z' t0 K! h! G, k
两个新函数 acad-push-dbmod 和 acad-pop-dbmod
: n6 b& c& Z6 D' T9 D4 s" E, A; a可用于挂起和恢复 AutoCAD 用于跟踪图形更改的 $DBMOD 记录机制。这些函数使应用程序将更改文档作为其初始化过程的一部分,无需设置 ( W" V* } R8 P: }, B+ i/ T ^7 s
$DBMOD 标志,也不触发不需要的保存图形查询。
4 H+ @0 g; C7 n1 Y" @ A1 u& j(acad-push-dbmod) 将文档的 $DBMOD 系统变量的当前值推入内部堆栈。该函数始终返回 & C& i& X% o7 B2 B
T。5 S9 Z( o( _5 r; j; f+ |% t
(acad-pop-dbmod) 将 $DBMOD 的值恢复为文档的内部堆栈上最近入栈的值。对于成功的出栈,该函数返回
0 v* P# E0 A' H( {9 j$ aT;如果堆栈为空,则返回 nil。2 k2 a& o$ m2 ~3 j6 ]6 s* p
acad-push-dbmod 和 acad-pop-dbmod 函数在
0 a, p( k) L7 J& xacadapp.arx 中实现,acadapp.arx 默认情况下在 AutoCAD 启动时加载,但是可以禁用(如有必要)。/ C/ L+ a, I1 h/ i, V, G# v# G
要使用新函数,请在执行程序操作(该操作不影响“$DBMOD”值)之前,调用使 $DBMOD 值入栈,然后在执行完此操作后将该值出栈。下面是一个简单的 3 @0 r1 J$ [# R: ~! N
LISP 样例:: ^: H- N! C- y& c0 A! V0 \6 _
(acad-push-dbmod)
4 i8 D; n$ [* K, c, N% ](setq new_line '((0 ."LINE") (100 ."AcDbEntity")
( k& k9 e- O$ H(8 . "0")
- G, }! K. X) o+ w(100 . "AcDbLine") (10 1.0 2.0 0.0) (11 2.0
, Q9 _: C& z' b" Z6 K4 a- O' Q1.0 0.0)
+ X8 N! a2 N- f J(210 0.0 0.0 1.0)))
- ]; |( x2 C; o5 ~; M(entmake new_line) ; 设置 $DBMOD 1 标志- t( f% t, j: }# D+ c9 x) d" ~4 T
(command "_color" "2") ; 设置 $DBMOD 0 a) V' _4 d0 o( Z/ E
4 标志
! B9 F5 P- T( y7 L(command "_-vports" "_SI") ; 设置
6 a) B$ ~1 o1 F5 ?$DBMOD 8 标志
* e/ R* c/ J w: T" O8 t( X(command "_vpoint" "0,0,1") ; 设置 % l6 x+ H0 U9 r: W; Q: \1 k! E
$DBMMOD 16 标志
& ?/ E! D0 _9 \+ j! D: w(acad-pop-dbmod) ; $DBMOD 将再次具有调用4 j- c" v. M1 p8 K4 x" U
; acad-push-dbmod 之前的值
! {# e8 Q0 O7 z7 B; C+ q( v" ]# f. E! yAutoLISP
5 M# |& N' F/ Y* J: ] d0 }$ }在包含在此 ObjectARX SDK 版本中的 AutoCAD 版本中,如果 , Q; K3 i( r0 p7 X5 \- G4 S4 |
AutoLISP 开发人员通过 *error* 机制来替换自己的错误处理程序,并且在该错误处理程序中发出 $ A" A1 n. b2 |* `, s
(command ...) 调用,则可能出现问题。AutoCAD 没有正确地清除 AutoLISP (command
8 D1 W& S9 @' | w. m& q. d( A...) 所使用的 acedCommand() 函数的状态。解决此问题有一个简单的办法:在发出有用的 (command 7 [6 o) U$ h9 b( e+ o* Z$ K- s: f
...) 调用之前发出一个空的 (command) 调用。以下是可能发生此现象的情况样例:0 i, b7 s$ i4 I& S
(defun c:bug ()
. ~6 w5 W* |7 l* j, M8 N' p3 b2 Y6 i(setq *error* bUG_err), C. O, r( E/ v X8 V
(nentsel "\nPress escape to show the defect...")
\& h/ _' C4 c: Q1 G0 Q K8 ~)2 m* Y9 e* [% a6 X
(defun bug_err (s)$ T; r1 F' `& F2 r+ d8 U
(command "._undo" "_end")
- y2 i4 i. B7 H9 y$ ~. c- B)
' O: o Y& ^% K8 A+ R$ _解决办法在下面的错误处理程序中示例:# E! n. q" B0 S0 W
(defun bug_err (s) (command) ; 清除 (command # Y/ w. E# @% u5 Z7 D& K1 y$ }! Y
...) 状态
: G$ {0 f: f+ E2 z4 j(command "._undo" "_end") ! q+ @1 y1 O" ?( p/ r" ~
)
3 A d- e* z, ~' i3 d8 O5 aActive X
/ Y( N# j, l: F& m8 f% M如果要加载 acad.dvb 文件,则不能打开具有嵌入工程的文档(智能文档)。嵌入工程包含有
2 e8 T0 _' c/ F7 P7 eAcadStartup()宏,可以访问 Application 对象的特性和方法。要在这种情况下安全地加载智能文档,先要加载 " i+ }* G3 i. X5 i) E
acadvba.arx(可使用 APPLOAD 命令直接加载,也可以执行任何 VBA 命令间接加载)。一旦成功加载 0 E* n/ |, E: [1 `" p' y
acadvba.arx,智能文档即可安全地打开。
Q+ y5 H2 U" H' fMicrosoft Office+ e3 v) N/ _% _0 v9 m( P! M% C& _0 J
如果服务器安装的是非英文版的 Microsoft Office,则安装带有
- L: _& h! i7 [/ F; SVBA 选项的 AutoCAD 时,将不安装 VBA选项。/ {& d; e3 L' x: {: u; q
开发人员帮助
1 J" \# e: X5 l+ _1 MActiveX and VBA Developer's Guide 不再位于 & o3 n, m. B; U& `
VBA IDE 的帮助菜单中。要联机查看该手册,请在 AutoCAD 窗口中单击以激活它。在“帮助”菜单的“内容”选项卡上选择“ActiveX
3 G1 u7 S) g6 `6 I和 VBA”,然后选择“ActiveX and VBA Developer's Guide”。5 D4 j8 Z- R/ O
控制“多文档设计环境”对话框的显示
9 k0 s. V$ [6 h( x“多文档设计环境”对话框允许更改 AutoLISP 环境初始化的默认功能。此对话框在下列情况下显示:: T1 B2 `( _* b
AcadLspAsDocDlg 注册键的“Do Not Show”值设置为 0
! q7 x3 u6 J* ~0 P没有运行脚本、AutoLISP 或 ActiveX 应用程序
0 v2 `1 W7 D* W! q1 r; ~8 DACADLSPASDOC 系统变量设置为 0 / n. a7 p* @. j2 ^# _
acad.lsp 文件已在 AutoCAD 搜索路径中 , }+ h- F" U; a7 Q( C. [# |
acaddoc.lsp 文件不在 AutoCAD 搜索路径中
) X/ f: n. i1 u" T( V! x* s/ HSDI 系统变量设置为 0
! U6 y7 D! B6 J4 e @如果所有这些条件都为真,则在每个任务中首次打开第二个文档时,将显示“多文档设计环境”对话框。 |
|