AUTOCAD二次开发

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函数典型种类 **
    • a)获取输入,包括值、点、已有图元对象,使用getxxx族函数、entsel函数,均有返回值;
    • b)根据图元对象获取相关属性,此时可由entget函数通过图元名得到;
    • c)运算,包括代数运算(包括数值以及各类数据处理)和几何运算(CGAD),代数运算同一般的程序处理,几何运算经常使用polar(用极坐标系求点)、inters(求交点);
    • d)绘图及图形编辑,此类指引用ACAD图形界面中的命令,使用command函数进行,但这类函数不少都没返回值,也就是说不能通过这个函数获得刚绘制的图元对象,如果想得到这个对象用于后续处理,应在执行上述函数后立即执行entlast函数得到这个新生成的图元对象;
    • e)输出,使用prinxx族函数;
    • f)文件操作,打开(open)、读取(readxx族函数)、写入(writexx族函数)、关闭(close);
    • g)全局变量修改,使用setvar 函数修改环境变量,典型应用为 (setvar "cmdecho" 0)关闭响应输出,并在程序运行完成后使用 (setvar "cmdecho" 1)再打开响应输出;
    • h)dcl对话框相关操作见“DCL控件”页;

应用技术

输出所有图元的元素类型

(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.27513950172
44.9999752720685
20478.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,可以读取一个字符串中的第一项,但这个函数判断项与项之间不仅为空格,还有点,但没有逗号;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AutoCAD二次开发是指在AutoCAD软件的基础上,通过编写自己的程序代码,实现对AutoCAD的功能扩展和自定义。引用中提到了一本《AutoCAD二次开发实用教程》,这本书可以作为入门的参考资料。在进行AutoCAD二次开发时,我们需要了解CAD二次开发所应用的语言和开发环境。 在进行AutoCAD二次开发时,需要使用一些命名空间来方便调用其中的集成函数。引用中列举了一些常用的命名空间,例如Autodesk.AutoCAD.DatabaseServices用于定义和操作AutoCAD中的图形对象,Autodesk.AutoCAD.ApplicationServices用于定义和注册新的AutoCAD命令,Autodesk.AutoCAD.Geometry用于执行2D和3D的几何操作等。命名空间中的类提供了很多功能和方法,可以满足不同的开发需求。 在进行AutoCAD二次开发时,我们需要为我们的代码添加CommandMethod属性,以便在AutoCAD中调用我们自定义的命令。引用中给出了一个示例代码,展示了如何在类代码开头加入CommandMethod属性,并定义一个名为HW的命令。 AutoCAD二次开发的应用非常广泛,在建筑与设计行业中尤为常见。引用中提到,基本的CAD操作往往无法满足实际需求,会产生大量的重复性操作,而二次开发可以解决这个问题,实现对AutoCAD功能的扩展和自定义。 总结起来,AutoCAD二次开发是通过编写程序代码实现对AutoCAD的功能扩展和自定义。我们可以使用命名空间中提供的类和方法来操作AutoCAD中的图形对象和执行各种几何操作。通过添加CommandMethod属性,我们可以在AutoCAD中调用我们自定义的命令。AutoCAD二次开发在建筑与设计行业中有着广泛的应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [AutoCAD二次开发_从入门到放弃](https://blog.csdn.net/qdzhouyl/article/details/82351968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [.NET AutoCAD二次开发之路(一、基础篇)](https://blog.csdn.net/weixin_33781606/article/details/93565703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值