AutoLISP Visual LISP教程《第六章》

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重新调试程序,直至程序正常运行。
2. 自动分步调试程序
(1)自动分步调试程序的步骤
将例6-1源代码的文件装入文本编辑窗口。监视变量w、h、 alf、p1、p2、p3、p4。加载该程序。选择菜单DebugAnimate。
在AutoCAD的"Command:"提示下,键入"rect3"命令。Visua lLISP自动切换到文本编辑窗口。随着光标的位置、指示按钮 内"I"和"()"的变化,自动地执行每一个表达式的求值,监视 窗口内的变量值也相应地改变。如果遇到了错误的函数调用, 程序停止运行,并报告"; error: no function definition: "信息。找到并改正错误的函数。继续调试程序,直至程序正 常运行。
回到源程序上的最近一次的断点 跟踪命令 立即暂停 出错断开 自动运行 终止求值
图6-2 Debug下拉菜单
下下跳继退重设添显调
一一出续出置置加示试
层个表执当为或监上指
嵌表达行前顶取视一示
套达式
层层消
个器
表式

断按


点钮



Debug工具栏
6.2 监视窗口
监视窗口用于监视变量、函数在程序运行过程中的结果。选择菜单 DebugWatch Last Evaluation。将弹出图6-3所示的监视窗口。
为了便于调试程序,Visual LISP提供了一些调试程序的工具,帮助用户 迅速查找并改正程序中的错误。
VisualLISP提供了监视窗口、检验窗口、符号服务对话框、中断和继续 执行程序的模式、命令跟踪、跟踪堆栈、跟踪窗口等调试程序的工具。
通过图6-1示View下拉菜单和View工具栏可以调用监视窗口、检验窗口等 调试工具。
钮。
(3)将光标移至将要添加的变量名,单击鼠标右键,在随后弹出的快捷 菜单上选取Add Watch菜单项,将弹出已填写了该变量名的添加监视窗口, 然后单击OK按钮。
4. 监视变量的值
监视列表的每一行的格式是"变量名=变量值",例如:A = 1。如果程序 尚未运行,变量的值是空的;随着程序的运行,在监视窗口可以看到变量的 值也在不断变化。
单击按钮 ,光标停在(getdist p1 "输入矩形的宽:") 之前,并亮显该表达式。注意,指示按钮内的"I"回到"()"之 前。监视窗口内的变量p1=[100.0 80.0 0.0]。重复类似的操 作,在AutoCAD窗口输入矩形的宽度为200、高度为150,旋转角 为30。在操作过程中指示按钮随时显示着光标相对于表达式的 位置,监视窗口显示着这些变量的当前值(注意,alf的单位为 弧度)。也说明单击按钮 只执行了一步表达式求值。
显然,这不是预期的运行结果。
图6-6监视P1、P2、P3、P4点的值
下面演示如何利用监视窗口调试程序。调试程序的步骤如下:
(1)确定要监视的变量。选择菜单DebugAdd Watch或单击工具栏上的
添加监视按钮
,在随后弹出的添加监视窗口内填入变量名p1,然后
单击OK按钮。用同样的操作监视变量P2、P3、P4。
如果程序在运行时被中断或挂起,VisualLISP将控制转交给 控制台,就进入了断点循环(Break loop)。断点循环是一个 单独的读算写循环,它嵌套在原有的读算写循环内。断点循环也 可以被中断,这时将开始一个嵌套于该断点循环内的读算写循环。 断点循环相对于顶层循环嵌套的层数称为该中断的层数。
进入断点循环时,VisualLISP将在控制台提示_$ 前加一个数字来指出所处循环的层数。例如,当首次进 入程序的断点循环时,提示为_1_$。如果处于断点循环 状态,就不能将控制切换到AutoCAD窗口。
当光标停在(setq p3(polar p2 (+ alf (* 0.5 pi)) h))之 前时,单击按钮 ,整个程序被加亮显示,光标停在整个程 序的结尾,再单击以上任一按钮,程序运行结束。
切换到AutoCAD窗口,显示着刚才绘制的矩形。
假定程序的第5行误写为 (getangl p1 "输入矩形的旋转 角: "),仍旧用上述的方法调试该程序,当执行到"输入矩形的 旋转角: "时,将出现提示"; error: no function definition: GETANGL(没有GETANGL这个函数定义)" 。点取查找按钮 , 在随后弹出的" FIND "对话框的FindWhat编辑框输入查找内容 为 " GETANGL" , 单 击 " Find" 按 钮 , 找 到 getangl 并 改 正 为 getangle。
h (getdist p1 "输入矩形的高: ")
p1
alf (getangle p1 "输入矩形的旋转角: ")
h p3
p2 alf
)
(setq p2(polar p1 alf w))
(setq p3(polar p2 (+ alf (* 0.5 pi)) h))
(setq p4(polar p3 (+ alf pi) w))
2. 监视窗口的快捷菜单
选择监视列表中的某一项并单击鼠标右键,可显示图6-4所示监视窗口 的快捷菜单。
调用检验功能,查看所选值。 将所选变量的值复制到系统变量 *obj* 中。 将所选变量值加上一个单引号前缀',打印到控制台窗口。 对所选变量调用符号服务对话框。 调用自动匹配选项对话框,用所选变量名作自动匹配参数。 从监视窗口中删除所选变量。
只执行一步表达式求值。 执行到下一个断点,如无断点,则执行一个完整的表达式求值。 执行到下一个断点,如无断点,则执行一个最外层的表达式求值。 继续执行程序 结束当前程序。返回到控制台的上一层中断顶层读算写循环。 结束所有当前活动的断点循环并返回到控制台的顶层读算写循环。
添加监视 回到最近一次监视窗口的环境 设置/删除断点 清除所有的断点
检验窗口
跟踪堆栈 出错跟踪 符号服务 监视窗口 自动匹配窗口 断点窗口 编译输出窗口
AutoCAD
切确激打堆符匹打
换定活开栈号配开
到活控检跟服

动制测踪务

窗台窗功

口窗口能


图 形 窗 口
VisualLISP控制台
浏览图形数据库
选择工具栏
图6-1 View下拉菜单
通过图6-2所示Debug下拉菜单和Debug工具栏的选项可以设置程序暂停 的模式和继续程序运行的方式。
(2)设置每步延迟的时间
选 择 菜 单 ToolsEnvironmant OptionsGeneral Options 弹出图6-7所示General Options对话框。单 击该对话框的 Diagnostic(诊断)卡,在Animation delay编辑框输入每步延迟的时间(以毫秒为单位), 单击确定按钮即可。
图6-4监视窗口的快捷菜单
3. 将变量加入到监视窗口
有三种途径可以将新的变量加入到监视窗口。
(1) 点取工具栏上的添加监视按钮
,在随后弹出的图6-5所示的添加
监视窗口内填入变量名,然后单击OK按钮。
图6-5添加监视窗口 (2)亮显要添加的变量名,然后点取工具栏上的添加监视按钮
,随
后弹出的图6-6所示的已填写了该变量名的添加监视窗口,然后单击OK按
5. 利用断点和监视窗口调试程序
假定在编辑器窗口已键入了图6-6所示的源程序。该程序的功能是根据用 户输入的两个对角点绘制矩形。
首先检查该程序是否存在语法错误。选择菜单ToolsText in Editor或 单击按钮,在Build Output(输出)窗口显示"; Check done."。说明该程 序没有语法错误。
单击按钮 ,程序切换到AutoCAD窗口,出现"输入矩形 的 一 个 角 点 : " 的 提 示 , 输 入 (100,80) , 程 序 切 换 到 VisualLISP的文本编辑窗口。光标停在(getpoint "输入矩形的 一个角点:")之后,仍然亮显该表达式。注意,指示按钮内的" I "在" () "之后。
第6章 调试程序
6.1 概述
语法正确的程序并不能保证正常运行,在运行时可能会产生错误的结果 或者发生崩溃现象,这就需要调试。 调试程序的步骤是:
① 控制程序在指定的位置暂停; ② 查看、分析有关变量的值; ③ 修改程序的源代码; ④ 继续或重新运行程序; ⑤ 如果程序不能正常运行,继续调试程序,直至程序正常运行。
(command "pline" p1 p2 p3 p4 "c")
p4
(princ)
)
p1
1. 从第一个表达式开始,逐步调试程序
h p3
p2 alf
(1)选择菜单FileOpen File或单击按钮 ,将[例6-1]所示源代码录 入文本编辑窗口。选择菜单DebugAdd Watch或单击按钮 ,监视变量w、 h、alf、p1、p2、p3、p4。选择菜单ToolsLoad Text in Editor或单击 按钮 ,加载该程序。
从断点循环退出,将恢复上一层循环。如果在该断 点循环中修改了某变量的值,程序继续运行时将使用变 量修改后的值。
断点循环分为可继续断点循环和不可继续断点循环。
1. 可继续的断点循环 可继续的断点循环是指可以在程序中断处,继续向下执行
图6-3 监视窗口
1. 监视窗口的工具栏
监视窗口的工具栏有四个图像按钮,从左至右依次是: 添加监视:将新的变量加入到监视窗口。 清除变量:清除监视窗口内的所有的变量。 排序:将监视窗口内的变量名按字母顺序排序。 复制到跟踪/日志:将监视窗口的内容复制到跟踪窗口。
如果打开了日志选项,监视窗口中的这些内容也将被复制到跟踪日志文件。
(2)从图6-7所示监视窗口可以看到:P1 = [0.0 0.0 0.0]、 p2 = [100.0 0.0]、p3 = [100.0 100.0 0.0]、P4 = [nil 100.0]。说明P4点的X坐标是无定义的,而X坐标是(car pl) 的返回值,检查(car pl),car是正确的,亮显pl,单击添加 监视按钮 ,监视窗口内出现PL = nil,PL本不是该程序的 变量,是p1的误写。
结合下例程序介绍几种调试程序的方法。
【例6-1】 定义绘制矩形的命令,矩形的一个角点、宽、高和旋转角为交 互输入的参数。
程序的源代码如下:
(defun c:rectr(/ w h alf p1 p2 p3 p4)
(setq p1(getpoint "输入矩形的一个角点:") p4
w (getdist p1 "输入矩形的宽:")
(3)修改源程序代码,将pl改写为p1;重新加载、运行该程 序;直到该程序可以正常运行,调试结束。
6.3 在不设置断点的情况下分步调试程序
分步调试就是将一个完整的程序分为若干步,逐步调试。每步可以是 最内层的一个表达式,也可以是一个复杂的表达式,还可以是多个表达式。 可以通过设置断点将程序分为若干段,也可以不用断点而是通过步长将程 序分为若干步。
(2)通过菜单DebugStop Once,使之处于打开的状态。
(3)单击按钮 ,切换到AutoCAD窗口,在AutoCAD的Command:提示下, 键入rect3命令。
控制自动切换到VisualLISP文本编辑窗口,监视窗口内的 变量值均为nil。此时光标停在(defun之前,整个程序被加亮显 示。选取下拉菜单 Debug 的Step Into 项、F8功能键或单击按 钮 ,光标停在(setq p1之前,与之匹配的右括号之间被加亮 显示。单击按钮 ,光标停在(getpoint "输入矩形的一个角 点:")之前,并亮显该表达式。注意,指示按钮内的"I"在"() "之前。
图6-7诊断选项卡
6.4 断点循环
表达式是AutoLISP程序的基本单元,LISP的工作实际上是不 断地对表达式进行读入、求值和输出操作,在LISP术语中,被 称源自文库读算写循环。
如果不用调试工具而是正常地运行AutoLISP程序时,程序将 处于顶层的读算写循环。如果在VisualLISP控制台窗口内对表 达式求值时,也是处于顶层的读算写循环。
选择菜单ToolsLoad Text in Editor或单击按钮
,VisualLISP自
动将控制切换到AutoCAD界面。当出现"输入矩形的一个角点:"的提示时,输
入(0,0)点,该点是p1点的坐标;当出现"输入矩形的对角点:"的提示时,输
入(100,100)点,该点是p2点的坐标。程序运行结束,只得到了矩形的两条边,
相关文档
最新文档