OSMODE 系统变量的默认设置在 AutoCAD 2000 中已改变,可能会影响采用旧默认设置的应用程序。在 AutoCAD R14 中,OSMODE 的默认值为 0,意味着对象捕捉是关闭的。在 AutoCAD 2000 和更高版本中,OSMODE 的默认设置为 4133,意味着对象捕捉点是打开的。如果这对应用程序有影响,请更改代码以保存当前的 OSMODE 设置,并根据需要设置 OSMODE,然后在退出之前恢复原来的 OSMODE 值。建议将此编程实践经验用于所有处理图形对象的 AutoCAD 应用程序。 长度超过 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 就发出信息“Wait. Program is busy...”。 (defun test() (setq count 0) (princ "\nWait.Program is busy...") (while (< count 100000) (setq count (1+ count))) (princ "\nCounted: ") (princ count) (princ) ) 在 AutoCAD 2000 和更高版本中,不显示“Program is busy”的信息,直到在 while 循环后面遇到下一个 \n(已开始等待)。为确保立即显示信息,请在打印函数调用的结尾添加 \n 或 \r。例如: (princ "\nWait. Program is busy...\n") 表若以整数开头,在被传递到外部函数时可能被错误地解释为 DXF 代码 在将以整数值开头的表传递给外部定义的函数时,AutoLISP 可能错误的将整数解释为 DXF 组码。例如,在 AutoCAD R14 中可以调用在 acrender.arx 中定义的 c:light 函数,但是在 AutoCAD 2000 和更高版本中,此调用则会发生错误: (c:light "nd" "plan" 1.0 '(10 10 10) '(6 8 0)) 错误信息显示为: Render API error:Expecting a 3d point, but got an unknown type: ???. 解决办法是指定实数而不是整数。例如,以下调用可以正确运行: |