许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  AutoCAD二次开发全面指南

AutoCAD二次开发全面指南

阅读数 2
点赞 0
article_banner

lisp语法

  • 对于有参数选项的CAD命令,使用command函数时一般是加了双引号的参数选项字符串,然后是对应该选项的值,下次再使用该命令时会以上次设的参数选项为准,如下所示为绘制倒圆应分两步;
(command "fillet" "r" r3)(command "fillet" line5 line1)
  • LISP定义的函数名后括号中参数可有可无,不是必需,也就是说不是必须把程序中出现的变量都写进去;
  • LISP的函数体使用小括号括起,如下所示。
(defun bulb()  (setvar "cmdecho" 0)  (dcl_show)  (setvar "cmdecho" 1))
  • ** #LISP#中函数中可以引用自定义函数,与库函数使用方法相同,也可以带参数; **
  • ** 同一LISP文件中可以写多个LISP函数,它们之间可以相互引用; **
  • ** 函数名前加C:限定符将可使该函数在命令栏中使用,但如果同时将这个命令定义在工具条或菜单上,那么必须先在命令栏运行一遍该命令后,才可在工具条或菜单上正常使用该命令; **
  • ** LSP函数数据:在同一个LSP文件中定义的各个函数,其中的所有变量均为全局变量(在整个本次AUTOCAD程序运行期间均可见),在任一函数中使用了该变量,则其值在其它函数中也可见(除非在函数的头括号中使用/声明其为局部变量),所以在LSP函数定义过程中较少使用函数形参传值,很多时候就没有传值问题(这就限制了编写较大的程序)。使用子函数时也不会考虑返回值问题; **
  • ** 异常处理**

        异常处理需要重新定义其error函数,该函数的整个定义体直接放入需要进行该异常处理的函数体中,如下所示,这个错误处理将会在出错时关闭文件f1并输出ok.该异常处理将会捕获所有其所在的函数所发出的任何异常。
(defun *error* (msg);不可修改(即*error*和msg都是LISP预留值,使用时不可修改)    (close f1)    (print "OK") )

对话框(DCL)

  • ** 加载对话框时,#CAD#只搜索其设定的路径,如果lsp文件所在的路径没有被设定的搜索路径,即使用加载了lsp,也不能加载同一文件夹下的#DCL#,此时必须使用DCL完整路径,如下所示:**
<span class="ne-text">(new_dialog "box" (load_dialog "E:/ACAD_WORK/t412.dcl"))</span>
  • ** 加载对话框时应注意使用的名称必须与DCL定义文件 中的一致,否则将找不到,如下所示的"box"**
<span class="ne-text">(new_dialog "box" (load_dialog "E:/ACAD_WORK/t412.dcl"))</span>
  • ** 对话框编写示例(文件后缀为DCL) **
bulb:dialog{	label="球扁钢";	:row	{		:image		{			key = "ima";			width = 20;			aspect_ratio = 0.618;		} 		:boxed_column		{			label = "参数";			:edit_box {label = "h"; key = "h";}			:edit_box {label = "tw"; key = "tw";}			:edit_box {label = "bf"; key = "bf";}			:edit_box {label = "r1"; key = "r1";}			:edit_box {label = "r2"; key = "r2";}			:edit_box {label = "r3"; key = "r3";}			:edit_box {label = "r4"; key = "r4";}		}	}	:concatenation	{		:text_part {label = "说明";}		:text_part {label = " ";}	}	:concatenation	{		:text_part {label = "请完整输入各个参数后按命令提示选择一个球扁钢左下角点";}	}	ok_cancel;}
  • 每个DCL必须要有ok_cancel、ok_only、cancel_button、ok_cancel_help、ok_cancel_help_info这几个中的一个用于标准退出并捕获消息;
  • lisp调用DCL对话框示例
  (defun dcl_show()        (setq dcl_id (load_dialog "E:/ACAD_WORK/LISP_WORK/BULB/bulb.dcl"));加载DCL文件,要使用完整路径,相对路径找不到        (new_dialog "bulb" dcl_id);使用DCL文件生成一个对话框对象        (show_image "ima" "E:/ACAD_WORK/LISP_WORK/BULB/bulb_test.sld");进行对话框的初始化以及事件注册(action_tile函数)工作        (action_tile "accept" "(ok_dia) (done_dialog 1)")        (setq dd (start_dialog));开始对话框消息循环并捕获消息(一般是点击OK,此时start_dialog函数返回1)        (if (= dd 1) (draw_bulb));根据捕获的消息进行事件处理  )
  • LISP从对话框取值示例
(defun ok_dia()    (setq h (atof (get_tile "h")));get_tile函数用于取控件的value属性,对于edit_box就是其中填写的值    (setq tw (atof (get_tile "tw"))))
  • 在DCL对话框上显示图片
(defun show_image(key sld)    (setq x (dimx_tile key));取image控件框的尺寸    (setq y (dimy_tile key))    (start_image key);开始处理image控件    (fill_image 0 0 x y 3);填充背景    (slide_image 0 0 x y sld);填充图片    (end_image))
  • 对于图片控件image,其图片来源需要通过引用该DCL文件的lsp文件进行,且必须使用sld幻灯图片文件(该类文件只能通过ACAD的命令mslide生成);

菜单

  • 自定义菜单通过MNU菜单文件进行。MNU菜单文件可以自己编写,对于08及以后的版本没有acad.MNU文件(该文件是ACAD的主菜单文件,即使是早期版本,也不建议直接修改该文件)。MNU文件的内容格式如下所示。在编写完上述MNU文件后,在ACAD中使用命令“menuload”后将弹出对话框如下所示,选择编写的MNU文件后菜单将自动加载并显示在菜单栏最后一项。
***MENUGROUP=MYLISP ;菜单组名称,在界面上无显示,上述的等号右边可任意修改;***POP1  ;***POP1的意思为第一组弹出菜单,POP后的数字可以是1-9[LISP]  ;菜单条中一下拉菜单名称,方括号内可任意修改[BULB] ^C^P (load "E:/ACAD_WORK/LISP_WORK/BULB/bulb.LSP") (bulb) ;LISP菜单中的一个菜单项名称,其后为ACAD宏命令,^C意为取消当前操作,^P意为执行后续函数,后续的为LISP函数,用于加载指定的LSP文件并执行其中的函数;;最后必须有一个空行


工具条

  • 自定义工具条可以通过在工具条区域的空白区点击右键菜单“自定义”后弹出的“自定义用户界面”对话框实现,如下所示。可以在左下新建一个命令,右上选择一个bmp文件作为图标,并在右下修改命令的名称以及宏指定(同上述菜单的宏)。完成上述操作后,在左上树视图上的适当位置新建一个工具条,并可将左下的命令拖入该工具条下。此时在工具区域的空白区域的右键菜单ACAD中就有了这个工具条,选中即可出现。

        ​


库函数

  • 使用command创建一个line的时候,完成后函数并不会返回这个line对象,而是返回空值,其它类似命令一样,此时可以使用entlast函数获得这个line对象用做后续处理;
  • entmake 可以用于创建一个图元对象,如一条线等,使用command同样可以,但前者可以一次性得指定其图层颜色等相关属性,后者不可;
  • 生成面域时命令如下:<span class="ne-text">(command "region" (entlast) "")</span>,其后一定加一对中间无任何的双引号,用作确认选择的内容;
  • 批量输出面域的质量特性使用命令<span class="ne-text">(command "massprop" (handent "23C") "" "N")</span>,最后第一个无内容的双引号对是结束选择,第二个“N”是不写入文件,通过这种方式可以将指定面域质量特性反馈至命令历史栏,如果在该命令前加用于区分各面域的输出print命令,后期即可通过分析该命令历史文件得到各面域质量特性;使用下述命令可以将一个面域的质量特性写入文件,其中reg为面域的句柄字符串,reg_ent为面域的图元对象;
  • **LSP函数典型种类 **
       

应用技术

输出所有图元的元素类型

(defun list_all()  (setq ent_cnt (sslength (ssget "X")));统计模型中图元的数量,(ssget "X")是选中所有图元  (setq ent_next (entnext));获取第一个图元数量,无参的(entnext)是获取第一个图元  (print (cdr (assoc 0 (entget ent_next))));提取第一个图元的类型,注意这种表应使用cdr得到第二个元素,不可使用cadr,另有参(entnext)是得到参数图元的下一下图元  (repeat (- ent_cnt 1);重复获取下一下图元,重复次数为总图元数-1    (progn        (setq ent_next (entnext ent_next))        (print (cdr (assoc 0 (entget ent_next))))    )  ))

沟通对象与外部数据

  1. 使用外部数据通过command函数建立一个图元;
  2. 使用使用(assoc 5 (entget (entlast)))得到该图元的句柄(群码5对应的是图元句柄,注意图元名在每次打开同一个文件时同一个图元的名称不同,但是句柄是相同的),并记录该句柄;在外部记录该句柄字符串名称与外部数据的对应关系;
  3. 需要使用时,使用(handent 句柄名字符串)可重新得到该图元对象名,使用(entget (handent 句柄名字符串))相应可得到该图元对象的数据;

文件读取

  • #读取#如下#文件#的代码如下:
21058.0642100161,7554.2751395017244.999975272068520478.5900868589,7002.37866909203
(defun read_one()  (setq file1 (open "E:/VS_WORK/DecBdf/TEST/cad1.txt" "r"))  (setq line (read-line file1));读第一行,第一角点  (command "rectangle" line);指定矩形第一角点  (setq line (read-line file1));读第二行,旋转角度  (command "r" line);设置旋转角度  (setq line (read-line file1));读第三行,另一角点  (command line);设置第另一角点  (close file1))

读取时应注意:

  • a)对于一个在CAD执行过程中一个命令需要多个参数(以正常操作时一个回车或一个空格为空隔),则按顺序这几个参数可以在一个command函数中完成,也可以任意分段在多个command函数中完成,如果上个command没有完成,下个command会继续,而不会是一个新的命令,而且command的第一个参数也不一定非要是一个绘图命令,可以是任意的东西,描述一个点的字符串等;
  • b)command的可按受的参数可以是任意多个字符串,也就是说,由文件中读取的代表一个点的一个字符串不需要转成点表,直接将字符串送入command即可;
  • c)但需要注意,在文本文件中一行如果放置了两个参数,也就是说中间有空格,必须将其拆开,不然这个空格也会被视为一个字符而不是一个参数分隔;如下所示为文件中的一行,直接读取后不可直接使用command命令。
rectangle 21058.0642100161,7554.27513950172 r 44.9999752720685 20478.5900868589,7002.37866909203

如果换成以下这样也不行

"rectangle" "21058.0642100161,7554.27513950172" "r" "44.9999752720685" "20478.5900868589,7002.37866909203"
  • d)LISP的字符串处理有一个函数read,可以读取一个字符串中的第一项,但这个函数判断项与项之间不仅为空格,还有点,但没有逗号;
    免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空