怎么用lisp实现读取cad中数字并完成

中科医院以品质领跑行业 http://hy.stock.cnfol.com/yuancailiao/20210107/28634911.shtml

数字计算是cad画图中不可避免的一项,有时候是不是也想有个插件来解决下你的计算问题。以下针对cad中的纯数字对象计算例子,给出一个lisp思路。看完也许你也可以编辑出,针对自己问题的,lisp计算小插件。

例1:电气专业中的单相负荷计算电流

仍旧以往的例子,先阐述下思路。首先看个动图感受下。

动图演示:

浏览器地址栏输入

ruanjian.top

获取该软件的各个版本

该软件全版本获取,傻瓜式安装,不用看教程

思路阐述

思路仍是3w三步骤“what-how-how”:要解决什么问题—问题怎么解决(大脑思路)—怎么用lisp实现(转换成lisp语句)。

a.问题

计算单相负荷的电流(需要系数法),能够读取cad图中的相关数据,自动计算出电流。

b.怎么解决

通过公式计算,I=kP/Ucos?,其中I是电流(A),k是需要系数,p是功率(W),U是电压(V),cos?是功率因数。

公式中需要从cad图中读取的数据有k、p、cos?,那么首先lisp能够实现通过鼠标读取cad图中的数据,然后lisp会将这些数据传递到计算公式中实现计算,最后将计算结果返回到命令行。

c.怎么用lisp实现

怎么实现通过鼠标读取cad图中的数据(获取数据):数据对象在lisp中叫做图元,数据对象内容中的数据值属于图元内容,图元包含数据对象的一切内容(如图层、颜色等等)都是以属性列表存储。因此,需要解决的语句是一个实现鼠标读取cad数据对象的函数,一个实现读取数据对象数据内容的函数。

怎么将得到的数据传递到计算公式中完成计算(完成计算):需要有一个函数将读取的数据,传递给写好的计算公式的函数,即通过变量赋值函数,完成传递。

将计算结果返回到命令行(输出结果):需要一个能够输出内容的函数完成。

Lisp程序

(defunc:dxjs()

;定义单相计算电流的函数名称,即cad的命令快捷键

(setqp1(entsel))

;通过鼠标读取cad图中的数据对象.entsel是鼠标选取cad对象的函数。

;此语句意思:通过鼠标选取功率数据p,并将对象赋值给变量p1.

(setqp1(carp1))

;cad中的对象是lisp中的图元.car是读取对象的图元名,为之后读取图元属性列表中存储的数据做准备。

;此语句意思:将功率的图元名赋值给变量p1.

(setqp1_data(entgetp1))

;数据内容是存储在图元属性列表中的.entget是读取功率图元的属性列表(如果不好理解,你可以理解为cad中的特性).

;此语句意思:读取功率图元的属性列表,并赋值给变量p1_data.

(setqp1_data(assoc1p1_data))

;从图元属性列表中提取出功率的数据值.assoc是获取属性列表里的具体哪一项内容(比如图层、颜色)。

;1是数据内容中在属性列表里的代码(可以理解成找数据,开存数据的那个抽屉,这个抽屉上的编号是1)

;此语句意思:提取到功率图元的内容的属性表(即把抽屉拉开了,东西还没取出来)。

(setqp1_value(atof(cdrp1_data)))

;将字符串转换成实数。此语句意思:从数据表里获取数据内容,并将这个数据转换为实数值(从抽屉里取出数据了,但是数据是个串串,你得变成数字)

(princ"单相设备功率:")(princp1_value);在命令行输出功率值

(setqk1(entsel))

;同样方式,获取需要系数的数据值。

(setqk1(cark1))

(setqk1_data(entgetk1))

(setqk1_data(assoc1k1_data))

(setqk1_value(atof(cdrk1_data)))

(princ"需要系数:")(princk1_value)

(setqfi1(entsel))

;同样方式,获取功率因数的数据值。

(setqfi1(carfi1))

(setqfi1_data(entgetfi1))

(setqfi1_value(assoc1fi1_data))

(setqfi1_value(atof(cdrfi1_value)))

(princ"功率因数:")(princfi1_value)

(setqi(/(*k1_valuep1_value)fi1_value))

;将读取到的功率、需要系数、功率因数传递给计算公式,计算电流,并把结果赋值给变量i

(princ"\n单相计算电流(A)是:");输出文字

(princi);输出计算电流值i

(prin1)

)

复制保存到记事本,记事本扩展名,改为.lsp。加载应用程序,cad命令行输入快捷键dxjs,得到如下结果。

例2:三个数据求和

思路上边已经阐述的很清楚了。只要顺着看下来,基本都能入门lisp计算小插件的最简单的制作了。

以简单的三个数据求和为例,示例一下。

a.问题:cad图中三个数据求和。

b.怎么解决:求和不用说公式了吧,就是加法。

c.Lisp怎么实现:首先鼠标读取cad图中的数据,然后传递数据给计算,最后输出结果。

鼠标读取cad图中的数据:鼠标读取函数entsel,图元名获取car(让后台找图中数据在哪个房间),图元属性列表获取entget(房间有一墙的抽屉柜),数据内容列表获取assoc(打开放数据的抽屉),列表中提取数据cdr加转换数据为实数atof(打开抽屉,取出数据内容,呦,是个串串,使个魔法,转换成可以计算的实数),输出鼠标选取的数据princ(后台告诉你,看,是这个东西吧)。

传递数据给计算:使用加法,进行计算(你拿起数据,咔咔按了计算器)。

输出结果:输出计算结果princ(计算器告诉你结果)。

Lisp程序:

(defunc:js();定义函数名称,即cad的命令快捷键(setqs1(entsel));选数据(setqs1(cars1))(setqs1_data(entgets1))(setqs1_data(assoc1s1_data))(setqs1_value(atof(cdrs1_data)))(princ"第一数据:")(princs1_value)(setqs2(entsel))(setqs2(cars2))(setqs2_data(entgets2))(setqs2_data(assoc1s2_data))(setqs2_value(atof(cdrs2_data)))(princ"第二个数据:")(princs2_value)(setqs3(entsel))(setqs3(cars3))(setqs3_data(entgets3))(setqs3_value(assoc1s3_data))(setqs3_value(atof(cdrs3_value)))(princ"第三个数据:")(princs3_value)(setqsum(+s1_values2_values3_value));计算(princ"\n求和:");输出文字(princi);输出结果(prin1))

动图演示:

Cad应用领域很广泛,专业不同,所需要进行的计算不同。与其依靠大数据搞定各种插件,不如靠自己双手创造一片天。所谓临渊羡鱼,不如退而结网。以我们以知识相交的大数据好友的情谊,授你以鱼,不如授你以渝。

因为第一次举了电气中的例子,所以,顺着例子走,便于更容易理解、入门lisp。老生再谈“尽信书不如无书”,文章是文章,思考一定要有。如有lisp大佬路过,某因非科班出身,学到老活到老,如存表达等欠妥之处,望指正。

注:图元属性列表是个很重要的东西,是实现lisp与cad交互的必备掌握。怎么找你想要的内容具体在哪个抽屉,是有专门的查询档案的。叫做属性列表的群码表,这个可以大数据go一下。如果你只用到对象内容,记住在1号那个抽屉就行。

(完)




转载请注明:http://www.aierlanlan.com/grrz/8728.html