明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2557|回复: 1

AutoCAD 2004开发人员兼容性问题

[复制链接]
发表于 2003-10-14 22:45:00 | 显示全部楼层 |阅读模式
符号保护

当 Visual LISP 运行时,保护的符号(例如 T)被真正保护;试图修改这些符号将导致出现错误信息。关于如何保护符号的信息,请参见 AutoLISP Developer's Guide 中“Using the AutoLISP Language”中的“AutoLISP Basics”。

整数溢出可以转换为实数

AutoLISP 的早期版本处理整数溢出(大于 2147483647 的正数,小于 -2147483648 的负数)的方法是返回负数或生成随机数。在 AutoCAD 2000 或更高版本中,AutoLISP 处理整数溢出的方式有所不同。如果输入的数大于允许的最大整数,则 AutoLISP 将此整数转换为实数。但是,如果对两个有效的整数执行数学运算,并且结果大于允许的最大整数,则结果数字无效。关于 AutoLISP 如何处理整数溢出的信息,请参见 AutoLISP Developer's Guide  中的“AutoLISP Data Types”。

符号表名称中保留大小写

在 AutoCAD R14 和早期版本中,符号表名称条目在创建时被自动转换为大写。在 AutoCAD 2000 或更高版本中,AutoLISP 保留符号表名称的大小写。在现有的应用程序中,如果使用区分大小写的符号表名称字符串比较,可能会导致冲突。所以可能需要修改应用程序,使字符串不区分大小写。

如果将函数作为参数传递给 ObjectARX defun'd 函数,将返回错误

AutoLISP 始终不允许将函数作为参数传递给 ObjectARX defun'd 函数,但以前此操作并不返回错误信息。在 AutoCAD 2000 或更高版本中,如果将函数作为参数传递给 ObjectARX defun'd 函数,AutoLISP 将显示以下错误信息:

*** 错误: 不适合 resbuf:#<SUBR xxx xxx

在特殊格式的运算符位置不允许使用表达式

某些 AutoLISP 函数被认为是“特殊格式”,因为它们计算参数的方式与大多数 AutoLISP 函数调用不同。通常函数会计算其所有参数。而特殊格式(例如 IF、AND、COND 和 SETQ)不计算所有参数,或只在特定条件下才计算某些参数。在 AutoLISP 的早期版本中,将计算结果为特殊格式的表达式放在运算符位置是合法的。但在 AutoCAD 2000 或更高版本中,并不支持这种做法。例如,比较在 AutoCAD R14 中以下函数调用的结果:

命令(if t if) nil (princ 1) (princ 2))

22

在 AutoCAD 2000 或更高版本中使用相同的函数调用:

命令(if t if) nil (princ 1) (princ 2))

12; 错误: 无法应用特殊格式:IF

运算符位置的计算顺序不同

AutoLISP 的早期版本先计算表达式中的运算符位置,然后从左到右计算参数。在 AutoCAD 2000 或更高版本中,AutoLISP 先从左到右计算参数,然后再计算运算符。

不允许 LAMBDA 主体为空

在 AutoCAD 2000 或更高版本中,主体为空的 lambda 语句将导致语法错误。这种结构在 AutoCAD R14 中可以使用。这种 lambda
主体可能出现在 LAMBDA、DEFUN、DEFUN-Q 和列表函数表达式中。例如,以下语句将导致错误:

(lambda (a))

(setq func '(a))   (func)

以下表达式是有效的:

(lambda (a) nil)

(setq func '((a) nil)) (func)

同时在多种访问模式下打开某个文件的处理

已经更正对同时在不同的访问模式下打开的单个文件的处理。在 AutoLISP 的早期版本中,打开单个文件并同时执行读、写和附加到文件操作将产生可重复但不标准的结果。在一个文件上的操作会影响其他文件上的下一个操作。在 AutoCAD 2000 或更高版本中,下一个读、写或附加操作的位置被定位在每个打开的文件上,并且在程序员的控制之下。例如,以下函数在 R14 与 AutoCAD 2000 或更高版本中具有不同的执行结果:

(defun file-handle ()
(setq        write-ptr  (open "test.txt" "w")
        append-ptr (open "test.txt" "a")
        read-ptr   (open "test.txt" "r"))
;;使用写模式写入五行
(repeat 5 (write-line "write-mode lines" write-ptr))
;;使用附加模式写入五行
(repeat 5 (write-line "append-mode lines" append-ptr))
;;从文件开头开始读取文件内容
(while (print (read-line read-ptr)))
(close write-ptr)
(close append-ptr)
(close read-ptr)

(princ) )

在 AutoCAD R14 中,函数执行结果为一个十行的文本文件(五行包含字符串“write-mode lines”,五行包含“append-mode lines”)。在 AutoCAD 2000 或更高版本中,得到的文件只包含五行“append-mode lines”,因为用于附加模式的文件指针未被写操作重置。

结果溢出的 EXPT 返回不同的值

在 AutoCAD R14 中,EXPT 表达式计算出的值如果超过 AutoLISP 双精度浮点范围将返回 0。在 AutoCAD 2000 或更高版本中,同一表达式将返回“1.#INF”。

在 LISPINIT=1 的 SDI 中,在后续的图形中不加载 ACAD.LSP 文件

在以前的版本中,只要加载文档就会加载 acad.lsp。在当前版本中,acad.lsp 只随第一个文档加载,除非 SDI 系统变量设置为 1,并且 LISPINIT 系统变量设置为 1。acaddoc.lsp 文件随每个文档自动加载。

长度超过 4K 字符的打印序列显示乱码

打印包含超过 4K 字符的列表时,在缓冲区大小固定的情况下将导致循环溢出,联机查看时,输出显示乱码。解决办法是修订 LISP 应用程序的代码,使一次打印输出的信息不超过 4K。也就是说,将打印输出分成多个 print 语句。

ENTMAKE 中的标注箭头信息的转换

在 AutoCAD R14 中,标注箭头由名称控制,dimblk、dimblk1 和 dimblk2 的名称分别用组码 5、6 和 7 表示。在 AutoCAD 2000 或更高版本中,箭头由 objectID 控制。dimblk、dimblk1 和 dimblk2 的 objectID 用组码 342、343 和 344 表示。出于兼容性考虑,
AutoCAD 2000 或更高版本可以识别 5、6、7 组码,但是如果图形中没有用 5、6、7 代码命名的箭头块,则忽略该设置。例如,如果 R14 代码使用 entmake 来创建包含箭头“DOT”的标注,若图形中已存在名为“_Dot”的块,则继续使用“DOT”。如果在发出 entmake 时不存在 _Dot 块,entmake 仍然有效,但是箭头设置无效,标注将使用默认的“_CloseFilled”箭头创建。解决方法是:修改程序,使之在 entmake 中指定箭头之前始终强制显示内置箭头。例如,使用 DIMBLK 系统变量将该箭头设置为当前箭头。这将强制创建块。

得到返回结果之前不显示打印信息

在 AutoCAD R14 中,每个 AutoLISP 打印函数(例如 print、princ)都自动回显到 AutoCAD 命令行并立即可见。在 AutoCAD 2000
或更高版本中,显示驱动程序将缓存打印信息,直至得到返回结果(/n 或 /r),从而在函数完成之前可能不显示信息。例如,在 R14
中,以下代码一遇到 princ 就发出信息“请稍侯,程序正忙...”。

(defun test()
  (setq count 0)
  (princ "\n请稍侯,程序正忙...")
  (while (< count 100000)
    (setq count (1+ count)))
  (princ "\nCounted: ")
  (princ count)
  (princ)

)

在 AutoCAD 2000 或更高版本中,不显示“程序正忙”信息,直至在 while 循环后面遇到下一个 \n(已开始等待)。为确保立即显示信息,请在打印函数调用的末尾添加 \n 或 \r。例如:

(princ "\n请稍侯,程序正忙...\n")

位于列表开始处的整数在被传递到外部函数时可能会被错误地解释为 DXF 代码

在将以整数值开始的列表传递给外部定义的函数时,AutoLISP 可能错误地将整数解释为 DXF 组码。例如,在 AutoCAD R14 中可以调用在 acrender.arx 中定义的 c:light 函数,但在 AutoCAD 2000 或更高版本中,此调用会发生错误:

(c:light "nd" "plan" 1.0 '(10 10 10) '(6 8 0))

显示错误信息:

渲染 API 错误: 需要三维点,但得到未知类型: ???.

解决办法是指定实数而不是整数。例如,下面的调用可以正确运行:

(c:light "nd" "plan" 1.0 '(10.0 10.0 10.0) '(6.0 8.0 0.0))

修改填充比例不会触发填充图案的重新计算

在 AutoCAD 2000 或更高版本中,修改填充对象的比例因子不会强制填充对象重新计算填充图形。要强制进行另一次计算,请使用 entmod 更改填充图案两次:第一次进行更改,第二次将其恢复。

缩短了 GET_TILE 函数处理的最大字符串长度

用 get_tile 从 DCL 文件获得的字符串的上限在 AutoCAD R14 中为 2084 个字符,在 AutoCAD 2000 或更高版本中减少为 254 个字符。

现在,必须显式加载 ActiveX、反应器和 Visual LISP 扩展函数

默认情况下,启动 AutoCAD 时,不加载 AutoLISP、ActiveX、反应器和 Visual LISP 扩展 (vlax-*) 函数。这种变化明显缩短了 AutoCAD
的启动时间,但是这意味着必须显式加载这些函数,以便在 AutoLISP 应用程序中使用它们。可以使用 (vl-load-com) 来加载 ActiveX
、反应器和 Visual LISP 扩展函数。
注意:在发出vl-load-com 之前,不能从 Visual LISP 获得 AutoLISP ActiveX 函数的帮助。如果运行 vl-load-com 之前发出 ActiveX 函数的帮助请求,Visual LISP 将在 VLISP 控制台窗口中显示“错误:无函数定义:get-ACAD-itl 错误”。

现在,VLR-REACTORS 函数返回元素为列表的列表

现在,使用 VLR-REACTORS 函数可以指定列出多个反应器类型;这将返回一个元素为列表的列表,每个反应器类型为一个列表。

VL-VBALOAD 返回 Nil,而不是文件名

在 AutoCAD R14 中,VL-VBALOAD 函数成功完成时将返回加载的 DVB 文件的名称。在 AutoCAD 2000 或更高版本中,成功执行的 VL-VBALOAD 将返回 nil。

不能访问 LDATA

VLAX-LDATA-PUT 和 VLAX-LDATA-GET 函数作用于图形中特定于应用程序的 LISP 数据。AutoCAD 2000 或更高版本不能读取或识别由 ObjectARX 应用程序(由 Visual LISP for AutoCAD Release 14 创建的)创建的 LDATA。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2003-10-15 08:26:00 | 显示全部楼层
很多問題的發生和怎樣解決, 初步是要經歷了很長的時間去發現去想法辦克服. 等試多了也能更深解LISP程序的開發規則和好的技巧. 樓主可以把大家在每寫一個LISP程序常常碰到的問題反映出來的品行是對大家有很好的幫助性. 大家都想可以寫出很棒的程序工具在很好地得到應用.據我了解如果是自己一個人在搞是比較繁瑣啊 !!!



--------------------------------------------------------------------
我愛CAD, 共同交流, 共同進步.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-2 14:23 , Processed in 0.173257 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表