|
Visual LISP
. y: V, E V) s7 G2 i) \Visual LISP 编辑器中不能正确处理双字节字符。把光标放置在双字节字符后,按 Enter # C0 U2 i3 }. a' D
键转到下一行时,会丢失一些字符。当前不应在 Visual LISP 编辑器中编辑双字节字符。
+ \& d: d0 y5 t( z+ j在 Visual LISP IDE 中,\r 转义字符不能得到回车符。而是紧跟在最后一个打印文字后面显示文字。解决方法是用 . K) z9 f8 N' ^, a* E1 n; U
(CHR 13) 代替 \r。
0 E3 n3 Y( |3 \/ ]. EVisual LISP 允许用户在编译应用程序时将 DVB 文件打包到单个 VLX 文件中,但目前无法访问这些文件。解决方法是:象 . y; P2 N9 {/ T% F
AutoCAD 早期版本那样,AutoLISP 应用程序所需的任何 DVB 文件必须作为单独文件包括进来。0 n8 `5 J6 H) I1 G8 l+ g' m5 `
如果 LOAD 加载单独名称空间 VLX 时出现错误,某些函数可能在检测到错误之前已输出到当前文档名称空间。必须确保修复此错误、重新编译并重载 7 J2 l# o6 S. n( n0 c
VLX 才能确保所有函数的正确版本输出到当前文档。 / k0 p2 j* D8 ^
在 SDI 模式下运行并且将 LISPINIT 系统变量设置为 1 时,acad.lsp 文件只加载到启动文档中,而不加载到所有在 9 `& ~; q8 @$ h
AutoCAD 任务中打开的后续图形中。为确保将 acad.lsp 加载到所有新文档中,请将 ACADLSPASDOC
8 H" o* F! Q. b! I% h系统变量设置为 1。
' u6 T+ b5 i# R. b8 w当 MENULOAD 命令在 MDI 中加载局部菜单时,该菜单的 MNL 文件对每个打开的文档加载一次,同时所有的用户交互操作都出现在当前文档中。为避免在用 % t) T$ Z2 G' t* V& E5 ~9 A7 j3 u
AutoCAD 打开多个图形时出现多余的打印信息或用户提示,建议在 MNL LISP 代码中不要包含任何用户交互操作。请使用
0 |& n) A2 g; _! Q8 i9 n) A. t( \/ qMNL 代码为后面选择的菜单项加载所需的 LISP 文件。用 acad.lsp 或 acaddoc.lsp 5 S# P2 H! T9 k8 Y
文件执行打开图形时要处理的 LISP ) r( F; T/ V+ R. Z( U. e: `/ e
代码。 ) d4 ?% `2 Z- Y R+ K1 c% Y
如果用单个正斜杠作为分隔符,使用 vla-unloadDVB 将文件名参数传递到 ActiveX 6 Y' w% Z! g. X% g0 z6 Z& K# F5 g
UnloadDVB 的方法将失败。调用 vla-loadDVB、vla-RunMacro 和 vla-unloadDVB " {9 n1 x+ G" h$ X/ }
时,建议用双反斜杠作为分隔符来指定文件名参数。
& b" E4 ^# q5 O$ i试图用 S::STARTUP 函数显示命令行提示时,该提示显示在等待输入到 LISP 例程中的命令行上面。
0 V; F ^, p! C) K5 Q8 Y当前解决此问题的方法是编写提示用户输入的 VBA 对话框的代码,并从 S::STARTUP 函数调用该对话框。例如,将下面的
2 B, z1 k! T% V1 O5 ]; |AutoLISP 代码放在 acaddoc.lsp 文件中,将导致在任何时候打开 AutoCAD
8 X& V3 e3 n8 q" Z2 R7 W图形都运行 VBA 对话框宏:& E* }3 ]3 n! [
;; AcadDoc.Lsp2 x$ J5 B# \7 _1 ]8 P3 o, M' M; h
(defun S::STARTUP ()
* l; [9 N; k# p, _# j9 r(vl-load-com)7 `" x( B9 a$ r: z4 ]5 T4 ]0 M
(setq acadApp (vlax-get-acad-object))* s# U; p3 I8 E7 i/ M/ }3 H
(setq advbFil "PromptUser.dvb")8 Q( [: p" g1 ~0 C% {
(setq avbaMacro "RunDialog")
7 ^& U0 e: d0 V* s$ D$ Z# i# N;; 此代码假定 .dvb 文件在 AutoCAD 搜索路径中
1 q# C5 h5 C' l7 V1 b# j( L2 Z(vl-vbaload advbFil)
; q5 e+ E! K! [(vl-vbarun avbaMacro)
* {. y0 P; Z6 f4 `# x)1 |% ^* y! C/ v
此代码中引用的 PromptUser.dvb 文件可从 AutoCAD
9 V# S# U+ z4 O- \2000 网站下载:" {2 R0 h0 L5 N2 i7 H
http://www.autodesk.com/autocad2000-utilities。在“下载”选项卡上,在“产品”下选择“AutoCAD”,在“版本”下选择“AutoCAD
8 L, i7 w& l& H8 B5 K2 r2000”,在“类别”下选择“实用程序”。输入关键词 vba macro,然后单击“转至”。在“使用 VBA 8 v/ ]! }) |$ H
宏在 S::STARTUP 过程中处理用户提示”中单击超文本。下载 prmtuser.zip 文件。
, V: f) n( V7 |1 K# L# H$ n5 h4 O O! o' w: V+ w4 p
用来防止文档被标记为“已更新”的新函数
, Z$ T: L& I; T两个新函数 acad-push-dbmod 和 acad-pop-dbmod ' F3 Z2 O) @: q* _: O. H$ ]3 V& w6 q# r
可用于挂起和恢复 AutoCAD 用于跟踪图形更改的 $DBMOD 记录机制。这些函数使应用程序将更改文档作为其初始化过程的一部分,无需设置
- `) @/ X; X0 B: Z! X' e: P' o$DBMOD 标志,也不触发不需要的保存图形查询。
" ~$ k- o: ^8 E! k: ?9 _2 D' R% T$ k(acad-push-dbmod) 将文档的 $DBMOD 系统变量的当前值推入内部堆栈。该函数始终返回
e, O q( R, B) `& B( sT。
0 Z( y* v. u2 Z2 d4 a(acad-pop-dbmod) 将 $DBMOD 的值恢复为文档的内部堆栈上最近入栈的值。对于成功的出栈,该函数返回
, l/ I8 R& J, hT;如果堆栈为空,则返回 nil。
0 {' [# t0 S, F# d, O2 S$ Oacad-push-dbmod 和 acad-pop-dbmod 函数在
Y! ~- K. }* `; [( Kacadapp.arx 中实现,acadapp.arx 默认情况下在 AutoCAD 启动时加载,但是可以禁用(如有必要)。; E0 X: m0 U/ u3 q0 _
要使用新函数,请在执行程序操作(该操作不影响“$DBMOD”值)之前,调用使 $DBMOD 值入栈,然后在执行完此操作后将该值出栈。下面是一个简单的
6 S/ e: U2 r2 J' a% VLISP 样例:/ p; c+ n7 F7 K( ~$ [- _# ?) j' w
(acad-push-dbmod)
/ g9 r2 @ E& ~: t- q(setq new_line '((0 ."LINE") (100 ."AcDbEntity")
4 z) _- K: q$ L( L) Q(8 . "0")/ V/ d0 a7 b* _8 R' x0 Y( k
(100 . "AcDbLine") (10 1.0 2.0 0.0) (11 2.0
5 G( n. R3 u x" D6 q1.0 0.0)& K& j2 Y) E& c! Y7 k
(210 0.0 0.0 1.0)))
. d) X- |1 H: i9 A(entmake new_line) ; 设置 $DBMOD 1 标志! G9 ~6 t$ p4 m4 [
(command "_color" "2") ; 设置 $DBMOD
4 h( U- g' h% ~. I. o$ o4 标志
7 j, ~9 I; E+ h2 l& o(command "_-vports" "_SI") ; 设置
! }. t% }2 O& W/ ]0 e$DBMOD 8 标志
( ?- w, t- Y4 Q$ B(command "_vpoint" "0,0,1") ; 设置
! y3 @. f$ W3 |! [8 U# Q$DBMMOD 16 标志
* H1 @7 R' p! y7 q' m+ v- z(acad-pop-dbmod) ; $DBMOD 将再次具有调用" z! m* Z6 w4 G+ ]
; acad-push-dbmod 之前的值( y l4 m+ s3 [+ `( ~
AutoLISP& A7 q# F. Z" V) n s9 G4 X4 }
在包含在此 ObjectARX SDK 版本中的 AutoCAD 版本中,如果
- X) G( ^) p3 m6 FAutoLISP 开发人员通过 *error* 机制来替换自己的错误处理程序,并且在该错误处理程序中发出 $ W% J3 y# ~- @; k" e X( i: v
(command ...) 调用,则可能出现问题。AutoCAD 没有正确地清除 AutoLISP (command $ L+ }! t( Z" U+ d; h
...) 所使用的 acedCommand() 函数的状态。解决此问题有一个简单的办法:在发出有用的 (command + I( a; k" M5 O# P* l* d1 ~% V! X
...) 调用之前发出一个空的 (command) 调用。以下是可能发生此现象的情况样例:5 i- L* X- p, p9 d9 H
(defun c:bug ()& P2 l* H+ J# a5 j4 {* ]9 J
(setq *error* bUG_err)6 r& Y, \( y2 ]' z. R
(nentsel "\nPress escape to show the defect...")! M% q" ^* j4 F9 ~" t4 N
)) P% |# @0 k! @, e
(defun bug_err (s)
! ?" ?: Z7 ~" s(command "._undo" "_end") ( c, n4 \2 P, o/ H
)
: ?5 }0 I( X$ Q; k6 p5 N) B" ~解决办法在下面的错误处理程序中示例:( h* U8 u1 Z4 D2 M
(defun bug_err (s) (command) ; 清除 (command . O$ Y0 c' w2 H) L# h: v% f5 @. t; x
...) 状态
2 Y9 R! Q& W: Y$ a5 q(command "._undo" "_end")
" i/ N7 J6 T$ D) D/ e& D)8 d* j! b7 ] U- T! b, \, N
Active X
: q; l9 ^& ^, T. H. @/ Y+ m如果要加载 acad.dvb 文件,则不能打开具有嵌入工程的文档(智能文档)。嵌入工程包含有
( N7 B2 g" P1 b7 y+ t. EAcadStartup()宏,可以访问 Application 对象的特性和方法。要在这种情况下安全地加载智能文档,先要加载 4 g5 [4 j2 D# P4 t1 b
acadvba.arx(可使用 APPLOAD 命令直接加载,也可以执行任何 VBA 命令间接加载)。一旦成功加载
/ _0 M6 z' s1 i: L, I, Macadvba.arx,智能文档即可安全地打开。
. k0 {1 I5 a. E/ n$ _2 [' ?Microsoft Office* ]3 x1 x# J T* U
如果服务器安装的是非英文版的 Microsoft Office,则安装带有
h% N) a. z7 i5 e3 K7 k: w6 Y( vVBA 选项的 AutoCAD 时,将不安装 VBA选项。
4 R3 ?, m0 ~8 L3 i开发人员帮助
- M" r" S$ k' GActiveX and VBA Developer's Guide 不再位于
& v3 ?' |7 ?3 @6 ?" d" J5 g, eVBA IDE 的帮助菜单中。要联机查看该手册,请在 AutoCAD 窗口中单击以激活它。在“帮助”菜单的“内容”选项卡上选择“ActiveX % r* l8 M" r, p; U2 D$ ^1 s
和 VBA”,然后选择“ActiveX and VBA Developer's Guide”。( y# ^. p0 i, i* R( {$ O: S
控制“多文档设计环境”对话框的显示$ N% F3 M0 S3 m
“多文档设计环境”对话框允许更改 AutoLISP 环境初始化的默认功能。此对话框在下列情况下显示:: z) R) l; X& M- \ v; F
AcadLspAsDocDlg 注册键的“Do Not Show”值设置为 0 / r. Z; s7 b! f- v
没有运行脚本、AutoLISP 或 ActiveX 应用程序
; A, C/ Q, E! ^0 n! w* EACADLSPASDOC 系统变量设置为 0 $ E( w+ `' h p
acad.lsp 文件已在 AutoCAD 搜索路径中
1 y$ g2 I3 `+ q( r5 {4 i6 Sacaddoc.lsp 文件不在 AutoCAD 搜索路径中 ( d; G; M/ W& @- f# V; s; F/ w
SDI 系统变量设置为 0
! o/ P+ c0 ]) q. J1 Y0 B如果所有这些条件都为真,则在每个任务中首次打开第二个文档时,将显示“多文档设计环境”对话框。 |
|