数字计算是cad画图中不可避免的一项,有时候是不是也想有个插件来解决下你的计算问题。以下针对cad中的纯数字对象计算例子,给出一个lisp思路。看完也许你也可以编辑出,针对自己问题的,lisp计算小插件。
例1:电气专业中的单相负荷计算电流
仍旧以往的例子,先阐述下思路。首先看个动图感受下。
动图演示:
- 思路阐述
思路仍是3w三步骤“what-how-how”:要解决什么问题—问题怎么解决(大脑思路)—怎么用lisp实现(转换成lisp语句)。
a.问题
计算单相负荷的电流(需要系数法),能够读取cad图中的相关数据,自动计算出电流。
b.怎么解决
通过公式计算,I=kP/Ucosɸ,其中I是电流(A),k是需要系数,p是功率(W),U是电压220(V),cosɸ是功率因数。
公式中需要从cad图中读取的数据有k、p、cosɸ,那么首先lisp能够实现通过鼠标读取cad图中的数据,然后lisp会将这些数据传递到计算公式中实现计算,最后将计算结果返回到命令行。
c.怎么用lisp实现
怎么实现通过鼠标读取cad图中的数据(获取数据):数据对象在lisp中叫做图元,数据对象内容中的数据值属于图元内容,图元包含数据对象的一切内容(如图层、颜色等等)都是以属性列表存储。因此,需要解决的语句是一个实现鼠标读取cad数据对象的函数,一个实现读取数据对象数据内容的函数。
怎么将得到的数据传递到计算公式中完成计算(完成计算):需要有一个函数将读取的数据,传递给写好的计算公式的函数,即通过变量赋值函数,完成传递。
将计算结果返回到命令行(输出结果):需要一个能够输出内容的函数完成。
- Lisp程序
(defun c:dxjs()
;定义单相计算电流的函数名称,即cad的命令快捷键
(setq p1 (entsel))
;通过鼠标读取cad图中的数据对象.entsel是鼠标选取cad对象的函数。
;此语句意思:通过鼠标选取功率数据p,并将对象赋值给变量p1.
(setq p1 (car p1))
;cad中的对象是lisp中的图元.car是读取对象的图元名,为之后读取图元属性列表中存储的数据做准备。
;此语句意思:将功率的图元名赋值给变量p1.
(setq p1_data (entget p1))
;数据内容是存储在图元属性列表中的.entget是读取功率图元的属性列表(如果不好理解,你可以理解为cad中的特性).
;此语句意思:读取功率图元的属性列表,并赋值给变量p1_data.
(setq p1_data (assoc 1 p1_data ))
;从图元属性列表中提取出功率的数据值.assoc是获取属性列表里的具体哪一项内容(比如图层、颜色)。
;1是数据内容中在属性列表里的代码(可以理解成找数据,开存数据的那个抽屉,这个抽屉上的编号是1)
;此语句意思:提取到功率图元的内容的属性表(即把抽屉拉开了,东西还没取出来)。
(setq p1_value (atof (cdr p1_data)))
;将字符串转换成实数。此语句意思:从数据表里获取数据内容,并将这个数据转换为实数值(从抽屉里取出数据了,但是数据是个串串,你得变成数字)
(princ "单相设备功率:")(princ p1_value );在命令行输出功率值
(setq k1 (entsel))
;同样方式,获取需要系数的数据值。
(setq k1 (car k1))
(setq k1_data (entget k1))
(setq k1_data (assoc 1 k1_data ))
(setq k1_value (atof (cdr k1_data)))
(princ "需要系数:")(princ k1_value)
(setq fi1 (entsel))
;同样方式,获取功率因数的数据值。
(setq fi1 (car fi1))
(setq fi1_data (entget fi1))
(setq fi1_value (assoc 1 fi1_data ))
(setq fi1_value (atof (cdr fi1_value)))
(princ "功率因数:")(princ fi1_value)
(setq i (/ (* k1_value p1_value 1000) 220 fi1_value))
;将读取到的功率、需要系数、功率因数传递给计算公式,计算电流,并把结果赋值给变量i
(princ "\n单相计算电流(A)是:");输出文字
(princ i);输出计算电流值i
(prin1)
)
复制保存到记事本,记事本扩展名,改为.lsp。加载应用程序,cad命令行输入快捷键dxjs,得到如下结果。
例2:三个数据求和
思路上边已经阐述的很清楚了。只要顺着看下来,基本都能入门lisp计算小插件的最简单的制作了。
以简单的三个数据求和为例,示例一下。
a.问题:cad图中三个数据求和。
b.怎么解决:求和不用说公式了吧,就是加法。
c.Lisp怎么实现:首先鼠标读取cad图中的数据,然后传递数据给计算,最后输出结果。
鼠标读取cad图中的数据:鼠标读取函数entsel,图元名获取car(让后台找图中数据在哪个房间),图元属性列表获取entget(房间有一墙的抽屉柜),数据内容列表获取assoc(打开放数据的抽屉),列表中提取数据cdr加转换数据为实数atof(打开抽屉,取出数据内容,呦,是个串串,使个魔法,转换成可以计算的实数),输出鼠标选取的数据princ(后台告诉你,看,是这个东西吧)。
传递数据给计算:使用加法,进行计算(你拿起数据,咔咔按了计算器)。
输出结果:输出计算结果princ(计算器告诉你结果)。
Lisp程序:
(defun c:js()
;定义函数名称,即cad的命令快捷键
(setq s1 (entsel))
;选数据
(setq s1 (car s1))
(setq s1_data (entget s1))
(setq s1_data (assoc 1 s1_data ))
(setq s1_value (atof (cdr s1_data)))
(princ "第一数据:")(princ s1_value )
(setq s2 (entsel))
(setq s2 (car s2))
(setq s2_data (entget s2))
(setq s2_data (assoc 1 s2_data ))
(setq s2_value (atof (cdr s2_data)))
(princ "第二个数据:")(princ s2_value)
(setq s3 (entsel))
(setq s3 (car s3))
(setq s3_data (entget s3))
(setq s3_value (assoc 1 s3_data ))
(setq s3_value (atof (cdr s3_value)))
(princ "第三个数据:")(princ s3_value)
(setq sum (+ s1_value s2_value s3_value) )
;计算
(princ "\n求和:");输出文字
(princ i);输出结果
(prin1)
)
动图演示:
Cad应用领域很广泛,专业不同,所需要进行的计算不同。与其依靠大数据搞定各种插件,不如靠自己双手创造一片天。所谓临渊羡鱼,不如退而结网。以我们以知识相交的大数据好友的情谊,授你以鱼,不如授你以渝。
因为第一次举了电气中的例子,所以,顺着例子走,便于更容易理解、入门lisp。老生再谈“尽信书不如无书”,文章是文章,思考一定要有。如有lisp大佬路过,某因非科班出身,学到老活到老,如存表达等欠妥之处,望指正。
注:图元属性列表是个很重要的东西,是实现lisp与cad交互的必备掌握。怎么找你想要的内容具体在哪个抽屉,是有专门的查询档案的。叫做属性列表的群码表,这个可以大数据go一下。如果你只用到对象内容,记住在1号那个抽屉就行。
(完)


评论