lisp pline 加点_在cad中如何创建lisp程序?以及大神们所说的lisp解决重复性劳动问题是怎么回事?...

余同 答主已经详细的回答了如何开始。我就直接实战为例吧,以Alisp为开发语言,扩展CAD的功能。

推荐两个网站,明经通道 和 晓东CAD ,这里聚集了很多喜欢CAD二次开发的人,是拥有最全大神和源码的两个中文网站。

首先,你需要知道lisp支持的函数,这些函数构成了代码的骨干并为我们实现想要的功能。以下资源来自MJTD

但是不要急着去背诵函数,用的时候查阅就可以了,学这门语言最好的方法就是看别人的代码注释,自己操作

我们先从简单的开始,工作中常见的绘图操作有修建延伸命令,假如我们想要达到下图中的结果,让系统自动判断是修剪还是延伸至所选的边界线,批量完成操作

1、首先定义功能函数,我们常用

(defun 函数名 (全局变量 / 局部变量)

(...);英文单引号用来做注释,所在行后面的内容不编译,用来提醒自己或者告诉他人代码含义

);通常LISP的代码由不断嵌套的成对() 组成,这就引来下面的笑话:

话说有个某特工九死一生偷到了美国火箭发射程序的源代码的最后几页,可惜全是))))))))))))))))),好吧我承认这个笑话一点不好笑,下面进入正题

函数名 全局变量 局部变量

(defun trim_or_extend (borderline ss_lst / i ent pt10 pt11 obj1 obj2 interpt old_edgemode)

2、然后写入功能

(setq old_edgemode (getvar 'edgemode))

;setq是最常用的变量赋值函数 (setq 变量名 值)

(setvar "edgemode" 1)

;(setvar / getvar '系统变量) 获得CAD内置的变量用来控制操作的模式

(setq i 0)

(repeat (length ss_lst)

;repeat while foreach 等都是循环语句的用法,篇幅限制,略下不表

(setq ent (nth i ss_lst) ;表达式 系统自带函数

dd (xl-3p ent) ;表达式 自定义函数

;下面讲讲自定义函数,就像万花筒的变化多端案都来自基本图案,代码的功能就基于各种轮子,

除非必要,请不要自己造轮子,轮子哥除外^_^

(defun xl-3p (e / ps pe pm)

(setq ps (vlax-curve-getstartparam e)

pe (vlax-curve-getendparam e)

pm (/ (- pe ps) 2))

(mapcar 'vlax-curve-getpointatparam (list e e e) (list ps pm pe))

)

;通用函数的作用在于程序的通用性和标准化,只要注意函数的就行,黑箱操作;

这样的函数可以放在程序的绝大部分位置。

dxf (entget ent)

pt10 (car dd)

pt11 (last dd)

)

(setq obj1 (vlax-ename->vla-object borderline)

;看见vl-xx,vla-xx,vlax-xx就记得去查Visual lisp函数,此处按下不表

obj2 (vlax-ename->vla-object ent)

)

(setq interpt (vlax-invoke obj1 'intersectwith obj2 0))

(setq pt1 (vlax-curve-getClosestPointTo obj1 pt10 t)

pt2 (vlax-curve-getClosestPointTo obj1 pt11 t)

)

(if(/= interpt nil)

(if (< (distance pt10 interpt) (distance pt11 interpt))

(command "._trim" borderline "" (list ent pt10) "")

(command "._trim" borderline "" (list ent pt11) "")

;command是模拟系统自带的命令的手动操作过程,不懂的话就用trim去试

)

(if (< (distance pt10 pt1) (distance pt11 pt2))

(command "._extend" borderline "" (list ent pt10) "")

(command "._extend" borderline "" (list ent pt11) "")

)

)

(setq i (1+ i))

)

(setvar "edgemode" old_edgemode);改动的系统变量记得还原

)

3、最后定义调用命令

(defun c:tt (trim_or_extend borderline ss_lst));C:后面的tt就是你调用这个函数的命令,

相当于你在cad中输入trim

怎么样,是不是特别简单,快上手试试吧!

这类程序的编写、调试、编译等都可以在Autocad中自带的编辑器中进行,启动命令 Vlide。

随着你接触二次开发的时间越长,就积累了越多的代码,自然而然就想把这些优秀的功能组合起来,这时候就到了制作属于自己的工具箱的时候了。市面上典型的几类菜单有如下几种:

1、浮动面板型(如:燕秀、贱人)

这类菜单优点是:简单易学、通过lisp可以实现;缺点也很明显:若功能多则占用的屏幕大使用容易眼花缭乱,只能使用时唤出不能常驻。

2、工具栏型(如:Msteel、常青藤)

3、抽屉式侧边栏型(如:Tbtools)

4、下拉菜单栏型(如:易桥)

填坑中。。。。

最后,打个小广告,欢迎使用交流 小草集工具箱

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值