第7章 建立应用程序-CAD二次开发.ppt

返回 相似 举报
第7章 建立应用程序-CAD二次开发.ppt_第1页
第1页 / 共44页
第7章 建立应用程序-CAD二次开发.ppt_第2页
第2页 / 共44页
第7章 建立应用程序-CAD二次开发.ppt_第3页
第3页 / 共44页
第7章 建立应用程序-CAD二次开发.ppt_第4页
第4页 / 共44页
第7章 建立应用程序-CAD二次开发.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述:
第7章建立应用程序,AotuCAD既可以将直接加载的AutoLISP源代码解释执行,也可以通过编译器先将AutoLISP源代码编译为可执行程序,然后加载执行。前者的优点是可随时测试或修改源代码,可以利用所有的调试程序的工具。后者的优点是提高了执行速度、对源代码保密。如果确认已加载过的AutoLISP源代码运行正常,则应将该源代码编译为可执行的机器代码文件。该文件的扩展名为“.fas“,是只有机器才能认识的目标文件。这样,不仅提高了程序的加载和运行速度,也起到了保护源代码的作用。VisualLISP还可生成更复杂的扩展名为“.vlx“的可执行文件。该文件是包括已编译的AutoLISP代码和dcl、vba等资源文件,是一个打包的应用程序。VisualLISP可以用vlisp-compile函数编译单个的AutoLISP文件,也可以用“生成应用程序向导“,将多个AutoLISP文件编译成单个的“.fas“和“.vlx“文件。,7.1通过VisualLISP_compile函数编译单个文件该函数的调用格式为vlisp-compilemode“filename“[out-filename]其中mode为编译的模式、filename为源文件的名字、out-filename为编译后输出的“.fas“类型的执行文件的名字。1.选择编译模式mode参数指定编译模式,它可以是以下三种编译模式之一(1)st标准编译模式标准编译模式可以生成最小的执行文件,它适合于只包括单个文件的程序。(2)lsm优化并间接链接(3)lsa优化并直接链接优化选项可使生成的的编译文件效率更高,它适合于较大而且复杂的程序。优化的基本功能如下,①对已编译函数直接引用,而不是引用函数名。该功能可提高代码的运行速度并防止在运行时对函数的重定义。②去掉函数名使得已编译代码更安全、减少程序的长度和缩短程序的加载时间。③去掉所有局部变量名并对其直接链接引用,同样使得已编译代码更安全、并减小程序的大小和加载程序所用的时间。2.确定要编译的LSP源文件如果源文件在AutoCAD支持的搜索路径下,可以不包括路径名。选择AutoCAD菜单ToolsOptions,然后打开Files选项卡并选取SupportFileSearchPath,可设置文件搜索路径。例如,已设置文件搜索路径为“d\user“,就可以用表达式(vlisp-compilest“sample.lsp“编译驱动器D的“\user1“目录下的文件“sample.lsp“。如果“d\user“不是文件搜索路径,那么,在指定源文件时必须包括完整的路径名,如vlisp-compilest“d\\user\\example.lsp“或vlisp-compilest“d/user/example.lsp“,VisualLISP默认源文件的扩展名为“.lsp“。3.确定编译器生成的输出文件名如果未指定输出文件名,编译器生成的文件和源文件同名同路径,扩展名为“.fas“。例如,vlisp-compilest“d/user/example.lsp“编译生成的文件在“d/user/“路径下,文件名为“example.fas“。如果指定了输出文件名但没有指定输出文件的路径,VisualLISP将把输出文件放在AutoCAD的安装目录下。例如,假定安装目录为“d\autocad2006\“,用表达式vlisp-compilest“sample.lsp““sample.fas“编译生成的sample.fas,在“d\autocad2006\“路径下。通常,应该指定输出文件的完整路径,可以省略输出文件的扩展名。例如vlisp-compilest“d/user1/example1““d/user2/example2“这样可以保证将输出文件放到指定的目录下。,4.举例假定AutoLISP源文件的名字是example1.lsp,存放在驱动器d的user1目录下,文件的内容是定义绘制螺钉的命令,命令的名字是screw。编译后的执行文件名字是example2存放在驱动器d的user2目录下。(1)在AutoCAD的Command或控制台_提示下,调用vlisp-compile函数vlisp-compilest“d/user1/example1““d/user2/example2“以标准模式编译驱动器d的user1目录下的LSP文件“example1.lsp“,在驱动器d的user2目录下得到可执行文件“example2.fas“。(2)了解编译输出(BuildOutput)窗口如果源程序没有错误,将在图7-1所示为编译输出窗口显示编译过程各阶段的有关信息。首先是源代码的语法和词汇检查,然后进行编译,并显示源文件中所定义的函数名或AutoCAD命令名,最后报告所生成的执行文件的名字和路径。,如果编译器检查到错误,将在编译输出窗口显示出错信息并停止编译。如果编译器遇到重定义现有的AutoLISP函数或为受保护的符号赋值,将会发出警告消息。当编译器显示警告和出错信息时,双击该类信息,将自动切换到文本编辑窗口,并亮显含有该类出错信息的源程序代码。,图7-1编译输出窗口,5.加载和运行已编译程序无论是“.fas“文件,还是可以包含多个已编译程序的“.vlx“打包文件,都可以在VisualLISP控制台窗口、AutoCAD命令提示处加载这些已编译的AutoLISP程序,也可以在AutoCAD菜单上选取ToolsLoadApplication、ToolsAutoLISPLoad或VisualLISP菜单上选取FileLoadFile加载这些已编译的AutoLISP程序。(1)在VisualLISP控制台窗口加载已编译的LSP程序load“d/user2/example.fas“如果不指定文件扩展名,load函数首先查找并加载扩展名为“.vlx“的文件;如果没有找到“.vlx“文件,load函数将查找并加载“.fas“文件;如果没有找到“.fas“文件,load函数将查找并加载“.lsp文件“。,也可以选择VisualLISP菜单“File““LoadFile“,通过随后弹出的“Loadlispfile“对话框来选择要加载的文件。(2)在VisualLISP控制台提示下,输入用括号括起的函数名,即可运行该函数。运行用LISP定义的AutoCAD命令,不能省略命令名前面的“C“而且必须用括号括起。在AutoCAD窗口调用函数时,输入的函数名和参数用括号括起,调用LISP定义的AutoCAD命令时,直接键入自定义的AutoCAD命令名。(3)加载AutoLISP扩展函数VisualLISP对AutoLISP语言进行了扩展,这些扩展函数的名称以vla-、vlax-和vlr-开头。启动AutoCAD时它们不会被自动加载。在使用这些函数之前,必须调用vl-load-com函数加载这些AutoLISP扩展函数。其格式如下vl-load-com,7.2用应用程序生成器创建应用程序应用程序生成器以向导的方式将AutoLISP源代码、已编译的AutoLISP程序、对话框定义文件等资源文件生成独立的可执行文件,该文件的扩展名为“.vlx“,称为VLX文件。应用程序生成器在创建VLX文件的同时,还生成了展名为“.fas“的已编译的AutoLISP文件,扩展名为“.prv“的程序生成文件。后者包括VisualLISP创建应用程序所需的所有指令。用应用程序生成器创建应用程序之前,应该对源程序进行完整的调试或试运行,以免在生成过程中出现的编译错误导致其不能完成创建工作。假定gear.lsp是以对话框为输入界面的绘制齿轮的LISP源程序,gear.dcl是定义输入齿轮参数的对话框文件,它们存放在驱动器d的user1目录下,创建的应用程序名字为“chilun“,存放在驱动器D的user2目录下。用应用程序生成器创建可执行的程序步骤如下,1调用应用程序生成向导从VisualLISP菜单上选择FileMakeAplicationNewAplicationWizard,启动向导。VisualLISP将显示图7-2所示向导模式对话框。,图7-2向导模式对话框,2确定向导模式应用程序生成向导有Simple(简单)和Expert(专家)两种模式。在简单模式下,只需指出LISP源文件、LISP编译文件或VisualLISP工程文件和要创建的文件名;在专家模式下,可以设置许多其他的选项。如果是单一LISP程序,应该选Simple模式,本例因为还要包含有对话框文件,因此选择Expert模式。单击Next按钮。将弹出图7-3所示应用程序路径对话框。,图7-3应用程序路径对话框,3确定待建程序的位置和名称在图7-3所示应用程序路径对话框的ApplicationLocation编辑框填写应用程序所处的位置(目录)。可以通过Browse(浏览)按钮在目录树上指定应用程序所处的位置,也可以在文本框中输入完整的路径名。例如d/user2。在ApplicationName编辑框填写要创建的应用程序名。例如chilun,这样将在d/user2/目录下创建应用程序文件chilun.vlx和程序生成文件chilun.prv。,图7-4应用选项对话框,在简单模式和专家模式下都会出现图7-3所示应用程序路径对话框。单击Next按钮。弹出图7-4所示应用选项对话框。本例不打开SeparateNamespace切换开关,单击Next按钮将弹出图7-5所示的包含LISP文件对话框。,(5)确定LISP文件的类型LISP文件可以是AutoLISP源代码文件、编译AutoLISP文件FAS或VisualLISP工程文件三种类型。通过图7-5所示的包含LISP文件对话框的下拉菜单确定LISP文件类型。,图7-5包含LISP文件对话框,例如选择了Lispsourcefiles类型,并且单击Add按钮,将弹出图7-6所示添加lisp源文件对话框。,(6)添加lisp源文件可以使用标准的Windows文件选取方法来选取多个文件。在图7-6所示对话框上选取gear.lsp文件之后,单击打开按钮可以将该文件添加到应用程序中,见图7-7所示包含Lisp文件的对话框。如果想继续添加其他类型的文件,先从下拉列表处选择文件类型后再单击Add按钮。,图7-6添加lisp源文件对话框,如果指定的是AutoLISP源文件,VisualLISP在打包成VLX文件前先编译成FAS类型的文件;如果指定的是FAS类型的文件,则直接将其打包;如果指定的是PRJ类型的工程文件,则工程文件中的所有文件将根据其具体类型先编译再打包或直接打包成VLX文件。,,如果要从应用程序中删除文件,只需选取这些文件后单击Remove按钮即可,也可以在选取一个或多个文件后,单击鼠标右键并从快捷菜单中选择Remove项。,图7-7包含Lisp文件的对话框,应用程序文件的加载顺序和它们在“LISPFilestoInclude“对话框中列出的顺序相同。如果在加载时调用某函数,则必须在调用该函数前定义它。在这种情况下,应该把定义该函数的文件放在调用该函数的文件之前。选取待调整的文件名,然后点取下列按钮即可。①Top移到列表顶端。②Up移到上一文件之前。③Down移到下一文件之后。④Bottom移到列表底端。也可以先选取待调整的文件名,然后单击鼠标右键,从随后弹出的快捷菜单上选取相应选项。如果是工程文件,因其内的源文件顺序已在工程文件内定义,只能通过修改工程文件以改变源文件的顺序。,由于将应用程序生成向导确定为专家模式,因此,单击Next按钮,将弹出图7-8所示的包含资源文件对话框。,图7-8包含资源文件对话框,(7)添加资源文件通过添加资源文件对话框。可以用添加源文件的类似操作添加(移去)对话框控制DCL文件、DVB文件、文本文件等资源文件。如果添加的是LISP工程文件,在该工程文件中的所有文件都将被编译并包含到VLX文件。,图7-9添加DCL文件对话框,点取图7-8所示对话框的下拉列表,选取DCLfiles,点取Add按钮,将弹出图7-9所示的添加DCL文件对话框。选取gear.dcl文件,点取打开按钮,该DCL文件将被加入到应用程序中,见图7-10。,图7-10包含资源文件对话框,单击Next按钮,将弹出图7-11所示的确定编译选项对话框。,(8)确定编译选项仅在专家模式下才出现图7-11所示确定编译选项如果选择了Standard,此为标准模式,将生成最小的输出文件,它适合于只包括单个文件的程序;如果选择了OptimizeandLink,此为优化和链接模式,可使生成的的编译文件效率更高,它适合于较大和较复杂的程序。,图7-11确定编译选项对话框,本例选择两种模式均可,确定编译选项后,单击Next按钮将弹出图7-12所示的查看选项/编译应用程序对话框。,(9)创建应用程序这是应用程序生成向导的最后一步,单击Back按钮,返回到上一步,查看上一步的选择;单击Finish按钮,创建应用程序结束。,图7-12查看选项/编译应用程序对话框,运行应用程序生成向导结束。在d\user2路径下,生成了chilun.prv、chilun.vlx和gear.fas文件。其中chilun.prv是包括VisualLISP创建应用程序所需的程序生成文件,gear.vlx是打包的可执行文件,gear.fas是编译gear.lsp时生成的目标文件。加载gear.vlx或gear.fas,在“Command“提示下键入GEAR即可调用该应用程序绘制齿轮。如果只有AutoLISP文件(源文件或目标文件),在创建应用程序时,第2步应选择Simple(简单)作为向导的模式,这样可以省略第(4)、(7)和(8)步。,7.3利用工程管理器管理和维护LISP文件AutoLISP应用程序通常都是由多个独立的LISP文件组成的。随着应用程序中文件数量的增加,对这些文件的管理和维护就变得很困难。在这种情况下,应该使用VisualLISP提供的最有效的工具工程管理器。7.3.1工程管理器的功能工程管理器通过命名的工程对工程所包含的LISP文件进行管理和维护。一个工程在本质上就是一个LISP源文件表和一套如何编译这些文件的规则。工程管理器具有以下的功能。●检查应用程序中哪些LISP源文件尚未被编译或者在上一次编译后又被修改过,并自动编译这样的一些文件。●通过一个命名的工程的列表,可以很简单地查找并打开相关的文件。●可以在一个工程的所有的文件中查找指定的源程序代码。●可以通过直接链接多个源文件中的相同描述来优化编译结果。,下面通过一个实例介绍利用工程管理器管理和维护多个LISP文件的有关操作。【例7-1】定义以递规方式绘制旋转正六边形的命令。正六边形的旋转中心pc、最大边长lmax、最小边长lmin和旋转角alf是交互输入的参数。正六边形在旋转过程中,除了最外层的正六边形之外,每一个正六边形的顶点都在前一个正六边形的边上,当正六边形的边长缩短到近似最小边长lmin时,绘制结束,见图7-13(a)。从图7-13(b)可以看出每个正六边形与旋转后的下一个正六边形的边长之间具有以下的关系,(a)(b)图7-13以递归方式绘的制旋转正六边形,为了演示多文件的操作,将该程序分别存放于两个文件。文件file1.lsp存放该程序的主函数部分。主函数定义了名字为r-hexagon的AutoCAD命令。文件file2.lsp定义了名字为hexagon的函数。函数hexagon被主函数调用。它们都存放在d盘的user1目录下。,文件file1.lsp的源代码如下defuncr-hexagon/pclmaxlminalfsetvar“echo“0;关闭普通命令提示信息setvar“blipmode“0;关闭光标痕迹setvar“osmode“0;关闭对象捕捉状态setqpcgetpoint“\n输入正六边形的旋转中心“setqlmaxgetdistpc“\n输入正六边形的最大边长“setqlmingetdistpc“\n输入正六边形的最小边长“setqalfgetanglepc“\n输入正六边形的旋转角“hexagonpclmaxlmin0.0;调用递归方式绘制旋转正六边形的函数princ;静默退出,,文件file2.lsp的源代码如下defunhexagonpcllminphi;变元phi是正六边形的初始角度command“pline“polarpcphilpolarpcphi/pi3.0lpolarpcphi/pi1.5lpolarpcphipilpolarpcphi/pi0.75lpolarpcphi/pi0.6l“c“ifllminprognsetql/lcosalf*sinalf0.5773503;下一个正六边形的边长setqphiphialf;下一个正六边形的旋转角度hexagonpcllminphi;绘制下一个正六边形,7.3.2创建一个工程1.创建一个工程文件选择菜单ProjectNewproject,将弹出图7-14所示的新工程对话框,此对话框用于确定新工程的路径和文件名。例如输入工程的名字为rh,存放在d盘的user2目录下。,图7-14新工程对话框,2.向工程添加LISP源文件单击图7-14新工程对话框的保存按钮,将弹出图7-15所示的工程特性对话框。该对话框有工程文件和编译选项两个选项卡。工程文件选项卡用于向工程添加LISP源文件。,图7-15工程特性对话框,图7-15所示为工程文件选项卡。通过按钮指定LISP源文件的路径,路径下方的列表显示了该路径下所有的LISP文件名。选取该列表的一个或多个文件,单击按钮,被选的文件就会转移到右边的列表内。右边的列表显示了该工程当前包含的所有LISP文件名。如果选取右边列表的一个文件,单击按钮,被选的文件就会从当前的工程中移回原处。按钮Top、Up、Down和Bottom用于排列LISP文件在列表框中的顺序,该顺序即为加载这些文件的顺序。例如,在图7-15所示为工程文件选项卡上单击按钮,指定LISP源文件的路径为d盘的user1。路径下方的列表内显示了user1路径下的LISP文件名。选取该列表的文件file1和file2之后,单击按钮,文件file1和file2将移至右边的列表作为rh工程的成员。单击确定按钮,将弹出图7-16所示的工程窗口,名字为rh的工程创建完毕,同时在d盘的user2目录下得到了名字为rh.prj的工程文件。,7.3.3工程窗口工程窗口的标题显示了该工程的名字,列表框内显示了该工程包含的所有的LISP源文件的名字,双击列表框内的任意一个文件名(无论文件是否打开)即可激活包含该文件的文本编辑窗口。,图7-16工程窗口,工程窗口的工具栏上有5个按钮,它们分别具有以下的功能。弹出图7-15所示的工程特性对话框,通过该对话框修改该工程的特性。,加载工程中所有经过编译的.fas文件。如果某些LISP文件尚未被编译,则显示如图7-17所示的是否编译这些文件的询问信息。单击按钮“是“,则首先编译这些文件,然后将其加载,单击按钮“否“,则直接加载这些LISP源文件和已经存在的.fas文件。假定文件file1.lsp和file2.lsp尚未被编译,单击此按钮,在图7-17所示的询问框中单击按钮“是“,则首先编译这两个文件,然后加载刚生成的file1.fas和file2.fas。这时在AutoCAD的“Command“提示下,键入r-hexagon命令即可绘制旋转正六边形。,加载工程中所有的LISP源文件。编译工程中所有的在上一次编译后被修改过的文件,生成新的.fas文件。重新编译工程中所有的LISP,无论这些文件是否已经被编译过。以上操作也可以通过工程的快捷菜单的相应选项完成。将鼠标移至工程窗口的列表框内,单击鼠标右键,将弹出图7-18所示的快捷菜单,其中各菜单项的功能见下一页。,图7-18工程窗口的快捷菜单,Edit编辑选中的文件AddFile打开工程特性对话框,向工程中添加文件Removefile从工程中删除选中的文件Load加载所选文件的.fas文件,如果所选文件尚未被编译,则加载其LISP源文件Loadsource加载所选文件的LISP源文件Checksyntax对所选的文件进行语法检查Touch“处理“所选的文件。经过“处理“的文件即使是新编译过的,单击图标时也要再次重新编译。Arrangefiles根据该菜单项的下一级菜单提供的规则对工程中的成员排序MultipleSelection单击该菜单项可以切换否具有多选功能的状态。若设置为多选,菜单项前加标记““[Un]Selectall没有一个文件被选取时,选取所有文件。已经选取了一些文件时,放弃选取的那些文件Closeproject关闭当前的工程Saveproctas将当前的工程另存为其他名字,7.3.4在工程中查找源程序代码单击查找按钮,弹出图7-19所示的查找对话框。打开Project互锁按钮,通过Project下拉列表选取一个工程,在FindWhat列表输入或选择要查找的源程序代码,单击Find按钮,在图7-20所示的查找输出窗口报告了在指定工程的所有文件中查找的结果。,图7-19查找对话框,例如,通过Project下拉列表选取工程rh,在FindWhat列表输入hexagon,单击Find按钮,在图7-20所示的查找输出窗口中显示了在文件file2.lsp和file1.lsp中含有源代码hexagon的4个表达式。双击其中任意一个表达式,就会激活该表达式所在的文件,并且亮显所查找的源代码,例如hexagon处于被选状态。,图7-20查找输出窗口,7.3.5通过工程创建应用程序上一节介绍了用应用程序生成器创建应用程序的全过程。在第5步确定LISP文件的类型时,除了选择LISP源文件和编译过的LISP文件之外,还可以选择VisualLISP工程文件。通过指定的工程文件名,该工程所包含的所有文件都被添加到应用程序中。例如,通过图7-21所示的包含LISP文件对话框的下拉列表选择VisualLISPproject,单击Add按钮,通过随后弹出的AddVisualLISPprojectfiles对话框选择d盘的user2目录下的rh.prj工程文件,见图7-21。最后单击Next按钮,进行下一步操作。此时d盘的user1目录下的文件file1.lsp和file2.lsp被添加到当前的应用程序。,图7-21选择了VisualLISPproject选项的包含LISP文件的对话框,7.3.6优化应用程序通过VisualLISP编译选项的优化功能可以得到运行效率更高的编译代码。单击图7-15所示的工程特性对话框的编译选项标签,即可显示图7-22所示的编译选项卡。该选项卡包含以下的一些工程编译选项。,图7-22编译选项卡,1.CompilationMode栏该栏的功能是确定设置编译模式,它有以下两个选项。lStandar(标准)选择标准模式时,编译器将保留函数和全局变量的符号名,因为这些符号可能被其他程序引用。在引用某一符号时,编译器将在符号表中查找这个符号。该模式比较适合于单个文件的程序。lOptimize(优化)选择优化模式时,编译器将认为工程中的所有文件将最终生成一个完整的应用程序。因此编译器将不考虑符号名,而是直接引用存放符号值的内存区域地址。优化模式可以生成体积更小,运行效率更高的应用程序,它比较适用于含有事件反应器或对话框功能的程序。,2.Mergefilemode栏该栏的功能是确定合并文件的模式,它有以下两个选项。lOnemoduleforeachfile为每一个LISP文件创建一个独立的.fas文件。lSinglemoduleforall将工程中全部成员文件编译为一个.fas文件。3.Linkmode栏该栏的功能是确定链接的模式,它有以下3个选项。lDoNotLink(不链接)编译器将保存函数的符号,程序在引用函数时,是通过符号找到函数的内存地址。lLink(链接)编译后的程序在引用函数时,不是通过函数名,而是直接访问函数的内存地址,这样可以提高程序的运行效率。lInternal(内部)编译器在编译结果中不保留函数名,而是把所有对函数的引用表达式直接链接到函数的内存地址。内部链接能够明显提高程序运行的效率,可以保护程序不会受到函数重定义的影响,而且程序中的函数对于用户变得不可见,这样就提高了程序的安全性。但是内部链接并不删除作为AutoCAD命令的符号。如果需要在程序运行中重新定义函数,就不应选择内部模式。,4.Messagemode栏此栏的功能是确定信息显示的模式,它有以下3个选项。Fatalerrors显示致命的错误,即导致编译失败的错误信息。Errorsandwarnings显示错误和警告信息。Fullreports显示所有的出错信息。5.Localizevariables(定位变量)切换开关如果在编译模式栏选择了Optimize(优化),该切换开关才处于可用状态,若该开关为打开状态,则编译器将从编译过的文件中删除局部变量的名字。,6.Safeoptimize(安全优化)切换开关如果在编译模式栏选择了Optimize(优化),该切换开关才处于可用状态,若该开关为打开状态,则编译器将不使用那些已知的可能导致某些错误的优化。7.Fasdirectory(.fas目录)编辑框指定编译输出结果文件(.fas)的目录,默认的路径为工程文件所在的目录。8.Tmpdirectory(临时文件目录)编辑框指定与工程相关的临时文件的存放目录,默认的路径为工程文件所在的目录。9.EditGlobalDeclarations(编辑全局声明)按钮创建和编辑工程的全局变量声明文件扩展名为.gld,该项功能只是为了和VisualLISP以前的版本兼容。,
展开阅读全文

资源标签

最新标签

长按识别或保存二维码,关注学链未来公众号

copyright@ 2019-2020“矿业文库”网

矿业文库合伙人QQ群 30735420