资源描述:
第6章调试程序,6.1概述语法正确的程序并不能保证正常运行,在运行时可能会产生错误的结果或者发生崩溃现象,这就需要调试。调试程序的步骤是①控制程序在指定的位置暂停;②查看、分析有关变量的值;③修改程序的源代码;④继续或重新运行程序;⑤如果程序不能正常运行,继续调试程序,直至程序正常运行。为了便于调试程序,VisualLISP提供了一些调试程序的工具,帮助用户迅速查找并改正程序中的错误。VisualLISP提供了监视窗口、检验窗口、符号服务对话框、中断和继续执行程序的模式、命令跟踪、跟踪堆栈、跟踪窗口等调试程序的工具。,通过图6-1示View下拉菜单和View工具栏可以调用监视窗口、检验窗口等调试工具。,检验窗口跟踪堆栈出错跟踪符号服务监视窗口自动匹配窗口断点窗口编译输出窗口VisualLISP控制台浏览图形数据库选择工具栏,图6-1View下拉菜单,打开监视窗口匹配符号服务堆栈跟踪功能打开检测窗口激活控制台窗口确定活动窗口切换到AutoCAD图形窗口,通过图6-2所示Debug下拉菜单和Debug工具栏的选项可以设置程序暂停的模式和继续程序运行的方式。,只执行一步表达式求值。执行到下一个断点,如无断点,则执行一个完整的表达式求值。执行到下一个断点,如无断点,则执行一个最外层的表达式求值。继续执行程序结束当前程序。返回到控制台的上一层中断顶层读算写循环。结束所有当前活动的断点循环并返回到控制台的顶层读算写循环。添加监视回到最近一次监视窗口的环境设置/删除断点清除所有的断点回到源程序上的最近一次的断点跟踪命令立即暂停出错断开自动运行终止求值,图6-2Debug下拉菜单,调试指示器按钮显示上一个断点添加监视设置或取消断点切换重置为顶层退出当前层继续执行跳出表达式下一个表达式下一层嵌套表达式,Debug工具栏,6.2监视窗口监视窗口用于监视变量、函数在程序运行过程中的结果。选择菜单DebugWatchLastuation。将弹出图6-3所示的监视窗口。,图6-3监视窗口,1.监视窗口的工具栏监视窗口的工具栏有四个图像按钮,从左至右依次是添加监视将新的变量加入到监视窗口。清除变量清除监视窗口内的所有的变量。排序将监视窗口内的变量名按字母顺序排序。复制到跟踪/日志将监视窗口的内容复制到跟踪窗口。如果打开了日志选项,监视窗口中的这些内容也将被复制到跟踪日志文件。,2.监视窗口的快捷菜单选择监视列表中的某一项并单击鼠标右键,可显示图6-4所示监视窗口的快捷菜单。,调用检验功能,查看所选值。将所选变量的值复制到系统变量*obj*中。将所选变量值加上一个单引号前缀,打印到控制台窗口。对所选变量调用符号服务对话框。调用自动匹配选项对话框,用所选变量名作自动匹配参数。从监视窗口中删除所选变量。,图6-4监视窗口的快捷菜单,3.将变量加入到监视窗口有三种途径可以将新的变量加入到监视窗口。,(1)点取工具栏上的添加监视按钮,在随后弹出的图6-5所示的添加监视窗口内填入变量名,然后单击OK按钮。,图6-5添加监视窗口,(2)亮显要添加的变量名,然后点取工具栏上的添加监视按钮,随后弹出的图6-6所示的已填写了该变量名的添加监视窗口,然后单击OK按钮。(3)将光标移至将要添加的变量名,单击鼠标右键,在随后弹出的快捷菜单上选取AddWatch菜单项,将弹出已填写了该变量名的添加监视窗口,然后单击OK按钮。,4.监视变量的值监视列表的每一行的格式是“变量名变量值“,例如A1。如果程序尚未运行,变量的值是空的;随着程序的运行,在监视窗口可以看到变量的值也在不断变化。5.利用断点和监视窗口调试程序假定在编辑器窗口已键入了图6-6所示的源程序。该程序的功能是根据用户输入的两个对角点绘制矩形。首先检查该程序是否存在语法错误。选择菜单ToolsTextinEditor或单击按钮,在BuildOutput(输出)窗口显示“;Checkdone.“。说明该程序没有语法错误。选择菜单ToolsLoadTextinEditor或单击按钮,VisualLISP自动将控制切换到AutoCAD界面。当出现“输入矩形的一个角点“的提示时,输入0,0点,该点是p1点的坐标;当出现“输入矩形的对角点“的提示时,输入100,100点,该点是p2点的坐标。程序运行结束,只得到了矩形的两条边,显然,这不是预期的运行结果。,下面演示如何利用监视窗口调试程序。调试程序的步骤如下(1)确定要监视的变量。选择菜单DebugAddWatch或单击工具栏上的添加监视按钮,在随后弹出的添加监视窗口内填入变量名p1,然后单击OK按钮。用同样的操作监视变量P2、P3、P4。,图6-6监视P1、P2、P3、P4点的值,(2)从图6-7所示监视窗口可以看到P1[0.00.00.0]、p2[100.00.0]、p3[100.0100.00.0]、P4[nil100.0]。说明P4点的X坐标是无定义的,而X坐标是carpl的返回值,检查carpl,car是正确的,亮显pl,单击添加监视按钮,监视窗口内出现PLnil,PL本不是该程序的变量,是p1的误写。(3)修改源程序代码,将pl改写为p1;重新加载、运行该程序;直到该程序可以正常运行,调试结束。,6.3在不设置断点的情况下分步调试程序分步调试就是将一个完整的程序分为若干步,逐步调试。每步可以是最内层的一个表达式,也可以是一个复杂的表达式,还可以是多个表达式。可以通过设置断点将程序分为若干段,也可以不用断点而是通过步长将程序分为若干步。结合下例程序介绍几种调试程序的方法。【例6-1】定义绘制矩形的命令,矩形的一个角点、宽、高和旋转角为交互输入的参数。程序的源代码如下defuncrectr/whalfp1p2p3p4setqp1getpoint“输入矩形的一个角点“wgetdistp1“输入矩形的宽“hgetdistp1“输入矩形的高“alfgetanglep1“输入矩形的旋转角“,setqp2polarp1alfwsetqp3polarp2alf*0.5pihsetqp4polarp3alfpiwcommand“pline“p1p2p3p4“c“princ1.从第一个表达式开始,逐步调试程序(1)选择菜单FileOpenFile或单击按钮,将[例6-1]所示源代码录入文本编辑窗口。选择菜单DebugAddWatch或单击按钮,监视变量w、h、alf、p1、p2、p3、p4。选择菜单ToolsLoadTextinEditor或单击按钮,加载该程序。(2)通过菜单DebugStopOnce,使之处于打开的状态。(3)单击按钮,切换到AutoCAD窗口,在AutoCAD的Command提示下,键入rect3命令。,控制自动切换到VisualLISP文本编辑窗口,监视窗口内的变量值均为nil。此时光标停在defun之前,整个程序被加亮显示。选取下拉菜单Debug的StepInto项、F8功能键或单击按钮,光标停在setqp1之前,与之匹配的右括号之间被加亮显示。单击按钮,光标停在getpoint“输入矩形的一个角点“之前,并亮显该表达式。注意,指示按钮内的“I“在“()“之前。单击按钮,程序切换到AutoCAD窗口,出现“输入矩形的一个角点“的提示,输入100,80,程序切换到VisualLISP的文本编辑窗口。光标停在getpoint“输入矩形的一个角点“之后,仍然亮显该表达式。注意,指示按钮内的“I“在“()“之后。,单击按钮,光标停在getdistp1“输入矩形的宽“之前,并亮显该表达式。注意,指示按钮内的“I“回到“()“之前。监视窗口内的变量p1[100.080.00.0]。重复类似的操作,在AutoCAD窗口输入矩形的宽度为200、高度为150,旋转角为30。在操作过程中指示按钮随时显示着光标相对于表达式的位置,监视窗口显示着这些变量的当前值(注意,alf的单位为弧度)。也说明单击按钮只执行了一步表达式求值。当光标停在setqp3polarp2alf*0.5pih之前时,单击按钮,整个程序被加亮显示,光标停在整个程序的结尾,再单击以上任一按钮,程序运行结束。切换到AutoCAD窗口,显示着刚才绘制的矩形。,假定程序的第5行误写为getanglp1“输入矩形的旋转角“,仍旧用上述的方法调试该程序,当执行到“输入矩形的旋转角“时,将出现提示“;errornofunctiondefinitionGETANGL(没有GETANGL这个函数定义)“。点取查找按钮,在随后弹出的“FIND“对话框的FindWhat编辑框输入查找内容为“GETANGL“,单击“Find“按钮,找到getangl并改正为getangle。重新调试程序,直至程序正常运行。,2.自动分步调试程序(1)自动分步调试程序的步骤将例6-1源代码的文件装入文本编辑窗口。监视变量w、h、alf、p1、p2、p3、p4。加载该程序。选择菜单DebugAnimate。在AutoCAD的“Command“提示下,键入“rect3“命令。VisualLISP自动切换到文本编辑窗口。随着光标的位置、指示按钮内“I“和“()“的变化,自动地执行每一个表达式的求值,监视窗口内的变量值也相应地改变。如果遇到了错误的函数调用,程序停止运行,并报告“;errornofunctiondefinition“信息。找到并改正错误的函数。继续调试程序,直至程序正常运行。,(2)设置每步延迟的时间选择菜单ToolsEnvironmantOptionsGeneralOptions弹出图6-7所示GeneralOptions对话框。单击该对话框的Diagnostic(诊断)卡,在Animationdelay编辑框输入每步延迟的时间(以毫秒为单位),单击确定按钮即可。,图6-7诊断选项卡,6.4断点循环表达式是AutoLISP程序的基本单元,LISP的工作实际上是不断地对表达式进行读入、求值和输出操作,在LISP术语中,被称为读算写循环。如果不用调试工具而是正常地运行AutoLISP程序时,程序将处于顶层的读算写循环。如果在VisualLISP控制台窗口内对表达式求值时,也是处于顶层的读算写循环。如果程序在运行时被中断或挂起,VisualLISP将控制转交给控制台,就进入了断点循环(Breakloop)。断点循环是一个单独的读算写循环,它嵌套在原有的读算写循环内。断点循环也可以被中断,这时将开始一个嵌套于该断点循环内的读算写循环。断点循环相对于顶层循环嵌套的层数称为该中断的层数。,进入断点循环时,VisualLISP将在控制台提示_前加一个数字来指出所处循环的层数。例如,当首次进入程序的断点循环时,提示为_1_。如果处于断点循环状态,就不能将控制切换到AutoCAD窗口。从断点循环退出,将恢复上一层循环。如果在该断点循环中修改了某变量的值,程序继续运行时将使用变量修改后的值。断点循环分为可继续断点循环和不可继续断点循环。,1.可继续的断点循环可继续的断点循环是指可以在程序中断处,继续向下执行剩余的表达式。用以下方法进入可继续断点循环(1)打开StopOnce模式,碰到带调试信息的表达式时。(2)遇到带DebugonEntry(进入时调试)标志的函数时。(3)遇到程序中设置的断点时。(4)单击暂停按钮进入断点循环时。(5)在前一个断点循环状态下,执行StepInto、StepOver或StepOut时。如果程序在某函数中被中断,可以访问被该函数声明的局部变量,甚至可以在控制台提示下用setq函数修改它们的值。,2.不可继续的断点循环当程序出现错误导致崩溃时,如果设置了BreakOnError选项,将激活一个不可继续的断点循环。此时可以访问出错环境中的所有变量,但不能继续执行程序或执行任何单步调试程序的命令。如果工具栏上的单步调试的按钮、、或继续运行的按钮处于可用状态,说明此时进入了可继续的断点循环。处于不可继续的断点循环时,选取Debug菜单的ResettoTopLevel项或单击按钮,退出断点循环并跳转至控制台顶层循环;选取Debug菜单的QuitCurrent项或单击按钮,退出断点循环并返回到上一层循环。,6.5利用断点调试程序运行的程序遇到断点时,将产生一个中断。当程序中断时,可查看、分析变量的值,修改程序的源代码。利用断点可提高调试程序的效率。1.有关断点的操作(1)在程序中设置/删除断点只能在VisualLISP的文本编辑器窗口内设置断点。断点应位于表达式的左、右括号上。设置断点的步骤如下①将光标移到需要程序暂停的位置。例如,需要在某表达式之前暂停,则应将光标移至与表达式的左括号相邻的位置。,②选择菜单Debug→ToggleBreakpoint、单击按钮或按F9键。如果该位置没有断点,就加入一个断点,否则,删除该断点。单击鼠标右键在快捷菜单中选择ToggleBreakpoint项也可以设置或删除断点。如果光标不与括号相邻,VisualLISP暂时将光标移到后面最近的右括号处,并通过对话框询问用户是否在该处设置断点。③选择菜单Debug→ClearAllBreakpoints项,删除已设置的所有断点。,(2)改变断点的颜色VisualLISP用高亮矩形显示每一个断点,默认情况下,活动的断点是红色的。选择菜单Tools→WindowAttributes→ConfigureCurrent,通过随后弹出的WindowAttributes对话框内的WINDOW-TEXT下拉列表的BPT-ACTIVE项可改变断点的颜色。(3)临时禁用断点断点可以被临时禁用和恢复使用。禁用断点的步骤如下①将光标置于断点处并单击鼠标右键。②从显示的快捷菜单上选择Breakpointsservice项,将弹出图6-8所示断点服务对话框。,图6-8断点服务对话框,③在断点服务对话框中单击Disable按钮可临时禁用该断点;若该断点已被禁用,图6-9所示断点服务对话框将出现Enable按钮,单击该按钮,所选断点将改变为可用状态。默认情况下,被禁用的断点显示为蓝色。用设置断点颜色的方法也可以改变被禁用断点的颜色。(4)浏览和编辑程序中的断点选择菜单View→BreakpointsWindow将看到图6-9所示的断点对话框。,图6-9断点对话框,该断点窗口列出了所有编辑器窗口的断点。其中有程序6-1.lsp的3个断点、6-2.lsp的2个断点。每项包含断点的源文件名以及断点在源文件中的位置,位置是以0开始的西文字符数量,前面的““号表示该断点是活动的,“-“号表示该断点是被禁用的。单击该对话框的Deleteall按钮可以删除所有的断点;亮显一项,单击Show按钮可显示该断点所在的源文件及其在源文件中的位置;单击Delete按钮可删除该断点;单击Edit按钮可打开图6-9所示的断点服务对话框,利用该对话框可以改变断点可用或禁用的状态。(5)断点的生命周期可以在加载程序之前或之后设置断点。如果在加载程序之后设置断点,该断点只有在重新加载程序之后才有效。,2.在断点处继续运行程序运行的程序遇到断点时,将产生一个中断,即断点循环。单击分布调试按钮、和可继续运行程序。如果在复杂的表达式之内还有一些断点,单击按钮和,首先在断点处暂停。此外还有以下控制程序继续运行的工具栏按钮、快捷键或Debug菜单的菜单项。Continue或CtrlF8继续执行程序直至遇到下一个断点(如果有)或程序结束。QuitCurrent或CtrlQ结束当前程序,返回到控制台的上一层断点循环。ResettoTopLevel或CtrlR结束当前程序,结束所有的断点循环。,3.利用断点调试程序实例【例6-2】定义绘制图6-10所示图形的命令,p0、d、b、t1、alf是交互输入的参数。,图6-10轴的键槽部位截面,程序源代码如下defunctuxing/p0alfdbt1rlb1sitp1p2p3p4p5setqp0getpoint“\nEnterP0“setqdgetdistp0“\nEnterd“,,setqbgetdistp0“\nEnterb“setqtlgetdistp0“\nEntert1“;tl应改为t1setqalfgetanglep0“\nEnteralf“;断点1的位置setqr*0.5dbl*0.5bsetqlsqrt-*rr*b1b1setqsittanb1l;tan应改为atansetqp1polarp0alfsitrsetqp2polarp0pialfrsetqp3polarp0-alfsitrsetqp4polarp3pialf-rlt1setqp5polarp1alfpi-rlt1command“pline“p1“a““s“p2p3“l“p4p5“c“,选择菜单FileOpenFile将例6-2所示源代码的文件装入文本编辑窗口。选择菜单DebugAddWatch或单击按钮,监视变量p0、d、b、t1、alf、r、l、b1、sit、p1、p2、p3、p4、p5。加载该程序,单击按钮,在AutoCAD的Command提示下键入TUXING命令,程序停止运行,出现提示“;errorbadargumenttypenumberpnil(错误的参数类型,出现了无定义的参数)“。将光标移至程序的第6行末尾,选择菜单DebugToggleBreakpoint、按功能键F9或单击按钮,在该处设置一个断点。,单击按钮,加载当前文本编辑窗口内的源程序。单击按钮,在Command提示下键入TUXING命令,依次输入p0、d、b、t1、alf的值之后,回到文本编辑窗口。光标停留在断点1的位置,说明已执行了5个get表达式。浏览监视窗口,p0、d、b、alf已有具体的数值,而T1nil,说明表达式(setqtlgetdistp0“\nEntert1“)有错误,仔细检查,发现误将t1写为tl。改正之后,单击按钮,单击按钮,在Command提示下键入TUXING命令,依次输入p0等的数据,当程序停留在断点1的位置时,浏览监视窗口t1已有定义了。,单击继续按钮,程序停止运行,出现提示“;errornofunctiondefinitionTAN(错误,没有定义函数TAN)“,正确的函数应该是兰色的,找到黑色的函数名“tan“,改正为“atan“。将光标移至断点1处单击按钮,删除断点1。单击按钮,在Command提示下键入TUXING命令,依次输入p0等的数据,程序正常结束,并得到图6-10所示图形。,图6-10,在此例中,在断点1暂停时,调试按钮从到都处于可用状态,因为此时处于可继续的断点循环。如果运行该程序前,选择菜单DebugBreakOnError,执行到“tan“函数时,因出现了无定义的函数而程序崩溃,但在该处产生了一个不可继续的断点循环。此时只有调试按钮和是可用的。用户只能选择退到上一层断点循环还是退到顶层断点循环。如果在Command提示下,键入TUXING命令,在要求用户输入数据时,按下“Esc“键,程序停止运行,此时也产生了一个不可继续的断点循环。,6.6跟踪程序运行跟踪程序运行的工具有命令跟踪、出错跟踪和跟踪堆栈。1.命令跟踪如果打开命令跟踪模式,VisualLISP将在窗口跟踪有关AutoCAD命令的执行情况,以便监控程序是否在执行AutoCAD命令时出现了问题。例如,选择菜单DebugTraceCommand,在Command提示下,键入TUXING命令(假定程序能够正常运行),将在图6-11所示“Trace“窗口显示有关AutoCAD命令的执行情况的信息。,图6-11显示有关AutoCAD命令的执行情况的跟踪窗口,,2.出错跟踪出错跟踪是用“ErrorTrace“窗口录跟踪程序运行的结果。在跟踪窗口按鼠标右键,将弹出跟踪窗口的快捷菜单,见图6-13。下面以例6-3为例,介绍利用“ErrorTrace“窗口调试程序的方法。【例6-3】定义求解一元二次方程的函数一元二次方程的表达式为如果a0,它不是一个二次方程;如果,方程有实数解,否则无解。方程的求根公式为,程序内容如下defunrootsabc/t1t2x1x2;t1、t2、x1、x2是局部变量if/a0progn,,,setqt1-*bb*4ac;ift10.0prognsetqt2sqrtt1;setqx1/-bt2*2a;此处有错setqx2/--bt2*2a;此处有错printlistx1x2print“\n根是复数.“print“\n不是一个二次方程.“princ;静默退出),选择菜单FileOpenFile将例6-3所示源代码的文件装入文本编辑窗口。单击工具栏按钮。在VisualLISPConsole控制台窗口的_提示下键入ROOTS1–56。显示了出错原因是“错误的参数类型“,见图6-12。,图6-12显示出运行错误的控制台窗口,选择菜单ViewErrorTrace或CtrlShiftR。将出现图6-13所示的出错跟踪窗口。,图6-13出错跟踪窗口及其快捷菜单,出错跟踪窗口的第1行为“ERRORBREAK“,表示因出错产生了一个中断。第2行为“[2][nil1.0]“,记录了中断的原因是1.0与一个无定义的参数求和。亮显第2行,按鼠标右键,弹出图6-14所示的快捷菜单。选取快捷菜单的“Callpointsource“,与该错相关的表达式-bt2被加亮显示。单击添加监视按钮,监视-b的值,在监视窗口看到-b的值为nil。原因是-b不是b的相反数,而是另一个尚未定义的变量。应改正为-t2b。同样的过程可发现下一行的--bt2有相同性质的错误,应改为-0bt2。运行改正后的程序,结果为3.02.0。,3.跟踪堆栈跟踪堆栈保存着调用函数的历史记录。利用堆栈后进先出的特点,记录一系列的嵌套表达式的出口。当程序运行中断,如遇到断点,通过跟踪堆栈可以了解程序的运行状态。如果程序运行出现错误,导致程序崩溃,通过跟踪堆栈可以分析程序崩溃的原因。首先通过以下实例了解跟踪堆栈。将例6-4所示程序代码复制到VisualLISP文本编辑器窗口,在程序的第6行的右括号处设置断点。【例6-4】了解跟踪堆栈的结构程序说明stack-tracing是一个递归调用的,indexval是序号的初始值,maxval是序号的最大值。当indexval小于maxval时,打印indexval的值。st5是调用stack-tracing的主函数。,defunstack-tracingindexvalmaxvalprinc“\n递归函数实参“princindexvalif该函数的地址。第6行[6]stack-tracing15indexval等于1,maxval等于5调用该函数。第5行[5]stack-tracing25indexval等于2,maxval等于5调用该函数。第4行[4]stack-tracing35indexval等于3,maxval等于5调用该函数。第3行[3]stack-tracing45indexval等于4,maxval等于5调用该函数。第2行[2]stack-tracing55indexval等于5,maxval等于5调用该函数。第1行BREAK-POINT遇到用户设置的断点暂停,6.7修改变量和函数的特性1.符号服务对话框的功能符号可以是变量或函数名。通过符号服务对话框可以查看或修改变量的当前值,可以设置变量或函数的一些特性。2.符号服务对话框的组成,图6-17符号服务对话框,图6-17所示为符号服务对话框,它由工具栏、符号名、符号值和符号标志四部分组成。(1)工具栏工具栏提供了对符号操作的工具。它包括以下四个图像按钮将当前符号加入到监视窗口。检验该符号的值。如果该符号是用户定义的函数名,则打开包含该函数定义的文本编辑器窗口,并亮显该函数的定义。如果该符号是一个内部函数名,则显示VisualLISP帮助文件中的相关信息。(2)Name编辑框显示被操作的符号名。(3)Value编辑框显示符号值或它最初的子串。,(4)Flags组该组有以下四个切换开关,其特性如下Trace切换开关对设置为Trace标志的函数,在Trace窗口显示对其跟踪的信息。该标志只对作为函数名的符号有效。ProtectAssign切换开关该标志的符号受到保护。程序运行时如果对受到保护的符号赋值,将产生询问信息。受到保护的符号在文本编辑窗口呈蓝色显示。在默认情况下,所有AutoLISP内置函数的函数名都受到保护。例如,符号pi、setq就是受到保护的符号。DebugonEntry切换开关如果设置了该标志,不管是否加载了该函数的调试信息,在每次调用该函数时都会产生中断。该标志只对用户定义的函数起作用。ExporttoAutoCAD切换开关如果设置了该标志,那么与该符号相关联的函数会被定义为外部函数,这样的函数可以被ObjectARX应用程序调用。,3.打开符号服务对话框有两种打开符号服务对话框的途径(1)在程序源代码或控制台窗口中亮显所需符号名,然后选择菜单View→SymbolService,或单击Debug工具栏上的按钮。(2)先选择上述菜单或图像按钮,在随后弹出的图6-18所示的符号服务对话框内输入符号名或在下拉列表中选取符号名,若光标附近有符号名,则该符号名作为新符号名的缺省输入。单击OK按钮即可打开图6-17所示的符号服务对话框。,图6-18输入符号名之前的符号服务对话框,4.修改变量的值假定某程序有以下两行代码setqa1;此处设置一个断点princa当程序遇到断点暂停时,亮显变量a,单击按钮,在随后弹出的符号服务对话框的“Value“编辑框里显示了变量a的当前值为1。将该值修改为2,点取OK按钮。单击按钮,将在控制台将打印出变量a的结果为2。说明完成了对变量a的修改。如果是可继续的断点循环,利用符号服务对话框的这一功能,可以直接改变变量的值继续运行程序。,5.设置符号的特性假定有以下表达式setqa(bc);可以是任一含有变量b的表达式亮显变量b,单击按钮,将随后弹出的服务对话框的“Flags“组的“ProtectAssign“切换开关设置为开,单击OK按钮。变量b呈兰色显示,说明它已成为受保护符号。在随后的表达式中,如果直接或间接改变b的值,将出现图6-19所示的提示。用“是“相应,程序在此处暂停;用“否“相应,符号b可以被改变。,图6-19询问是否为受保护符号赋值的对话框,解除符号保护状态的操作与此类似,只是将ProtectAssign切换开关设置为关闭状态。,6.设置函数在被调用时处于暂停的状态将例6-4所示程序代码复制到VisualLISP文本编辑器窗口,删除程序中的断点,亮显函数名stack-tracing,点取按钮,将随后弹出的服务对话框的“Flags“组的“DebugonEntry“切换开关切换开关设置为开,点取OK按钮。然后运行该程序。当程序运行遇到对stack-tracing函数的调用时,不管事前是否在函数内设置了断点,当程序运行到该函数时,自动处于暂停的状态。此时可利用各种调试程序的工具查看、检验或分析变量的结果。,6.8检验窗口1.检验窗口的功能检验窗口的功能是浏览或检验查数字、字符串、变量、表、AutoCAD的图形元素、AutoCAD的选择集等AutoLISP和AutoCAD对象。使用检验窗口还可以浏览复杂对象的数据结构和浏览ActiveX对象。2.检验窗口的结构,标题栏对象行元素表,图6-20检验窗口的结构,验窗口的样式见图6-20。窗口的内容与被操作对象的种类相关。所有的检验窗口都有一个标题栏、对象行和元素表(该表可能为空)。,,,,(1)标题栏对话框的标题,同时显示所了解对象的类型。(2)对象行对象名或对象值。(3)元素表组成该对象的成员。对象种类不同,元素表的大小和内容就有所不同。元素表的每一项(行)都分为名称和内容两部分。名称用括号括起,方括号“[]“说明可以通过与该项关联的快捷菜单的“修改“选项修改该项;而花括号“{}“说明用户不能修改该项。对象栏和元素表都有与自己的关联快捷菜单。3.打开检验窗口的步骤①选中某AutoLISP对象名(例如某变量)②从VisualLISP选择菜单View→Inspect,或单击Debug工具栏按钮。也可以通过快捷菜单选择Inspect项,或者选择SymbolService等窗口工具栏的按钮。③如果在调用检验窗口之前没有选中对象,VisualLISP将显示图6-21所示对话框,提示用户输入要检验的对象。,图6-21输入检验对象的对话框,VisualLISP保存用户最近输入检验窗口的15个记录。可以通过下拉列表选择以前指定的检验对象。4.各种对象的检验窗口检验窗口元素表的内容是由检验对象的类型确定的。,①INT(整数)对象栏是整数本身,元素表的内容是用二进制、八进制、十进制、十六进制和字符形式显示的数值。字符格式是指和该数相应的ASCII字符,对大于256的整数取其与256的余数。,②REAL(实数)对象栏是实数本身,它没有元素表。③STRING(字符串)对象栏是字符串本身,它的元素表是该字符串的单字符序列。双击某单字符可了解该字符的数字表示形式。④LIST规则表规则表的检验窗口见图6-22。元素表内是该表的元素序列。⑤LIST不规则表不规则表,也成为点对(dottedpairs)。元素表内是该表的car和cdr操作的结果。例如,由cons8“A“创建的表,其检验窗口如图6-23所示。,图6-22规则表图6-23不规则表,⑥FILE(文件)文件的检验窗口见图6-24。元素表内是该文件的名字和打开该文件时的属性。name指出了文件名,mode指出该文件是打开供读、写、附加,还是已被关闭,id是内部的文件标识,position显示了读或写文件的当前位置,eof指出是否在文件的结束处,如果文件是以写模式打开时不出现该项。⑦SUBR(函数)SUBR又分为SUBR和USUBR函数。SUBR是内部或已编译的函数,元素表内是该函数的名字。内部函数的检验窗口见图6-25。,图6-24文件的检验窗口,图6-25内部函数的检验窗口,USUBR指明是用户定义的函数。元素表显示了函数名、函数参数表和该函数中定义的局部变量列表。用户定义函数的检验窗口见图6-26。,图6-26用户定义函数的检验窗口,6.9访问AutoCAD对象上一节介绍了一些数据类型的检验窗口,本节介绍通用检验窗口浏览AutoCAD图形数据库,有关AutoCAD对象的检验窗口。1.浏览图形数据库中的图元选择菜单View→BrowseDrawingDatabase→BrowseAllEntities,将打开图6-27(a)所示的AutoCAD图形元素检验窗口。在该检验窗口的元素表可看到有直线、圆、圆弧、文本、多义线和椭圆等各种图元。,ab图6-27AutoCAD图形元素检验窗口,双击图元名,或选中图元后单击鼠标右键并选择“Inspect“,可打开该图元的检验窗口。图6-27(b)是双击第二个图元后打开的图元检验窗口。该窗口的标题栏指明了图元类型是ACADCIRCLE,对象栏显示了该圆的图元名,元素表列出了该圆句柄、所在的图层、厚度方向、圆心和半径的数据。图元窗口对象行快捷菜单除了Print、Copy、Log、and和Update外,还增加了以下菜单项lModify如果可用,将打开标准的针对所浏览图元的AutoCADDDMODIFY对话框。lInspectRawData弹出该图元的检验窗口,元素表的内容与entget函数返回的图元表基本相同,见图6-28。lInspectNextEnt打开下一个图元的检验窗口。lInquireExtendedData显示当前用regapp注册的应用程序表。,图6-28图元名检验窗口,说明可以控制图图元在检验窗口显示的内容,步骤如下①选择菜单Tools→EnvironmentOptions→GeneralOptions,弹出图13-22所示GeneralOptions对话框。②单击Diagnostic选项卡,如果设置该选项卡InspectDrawingObjects切换开关为关,只显示图元名,否则,还要显示该图元的图层、厚度方向及更为详细的几何信息,如图6-28。,2.浏览图形数据库中的符号表选择菜单中View→BrowseDrawingDatabase→BrowseTables,弹出图6-29(a)所示的检验窗口,通过该窗口可以浏览图形的视区、线型、图层、字样、视图、尺寸样式、用户坐标系、应用程序各种符号表。,abc图6-29符号表检验窗口,符号表检验窗口的每个元素是同一种类型符号表的集合,如图层表、线型表。双击某元素,例如,将弹出图6-29(b)所示的有关图层表的检验窗口。图层表检验窗口的每个元素是一个图层名,双击某元素,例如,将弹出图6-29(c)所示的有关这个图层的检验窗口。通过该窗口可以看到该图层的名字是“0“,颜色为白色,打开同时解冻的状态等信息。3.浏览图形数据库中的块选择菜单View→BrowseDrawingDatabase→BrowseBlocks,将打开图6-30a所示的有关AutoCAD图块的检验窗口。双击某块名,如b3或选中该块后单击鼠标右键并选择Inspect,可打开图6-30(b)所示的有关这个图块的检验窗口。元素表显示了该块的名字、插入基点和该块是否带属性等信息。双击Parts,将弹出图6-30(c)所示的有关该块成员的检验窗口。,通过块成员检验窗口可以看到该块是由一个椭圆、一个圆弧、一个圆和两条直线组成的。如果双击LINE或CIRCLE,可进一步了解每个成员的详细信息。,abc图6-30图块检验窗口,4.浏览选取的图形对象选择菜单View→BrowseDrawingDatabase→BrowseSelection,VisualLISP将切换到AutoCAD的图形窗口,出现“Selectobjects“的提示,待选取一些图形对象后,返回到VisualLISP窗口,并打开图6-31所示的有关所选图形对象的检验窗口。,图6-31选择集检验窗口,双击元素表的某图元或选中该图元后单击鼠标右键并选择Inspect,将可打有关这个图元的检验窗口。,
展开阅读全文