当前位置:首页>常见问题> CAD中使用lisp读取图纸中的数字并计算

CAD中使用lisp读取图纸中的数字并计算

在CAD绘图中,数字计算是不可或缺的任务。偶尔你是否需要一个插件来解决复杂的计算难题?以下以纯数字对象在CAD中进行计算为例,提供了一种LISP思路。阅读完毕后,你甚至可以编辑出适用于自己问题的LISP计算小工具。

一、电气专业中的单相负荷计算电流

操作示范

比如,我们要进行电气专业中的单相负荷计算电流子,我们可以先看下面的我们操作教程,如下所示:

CAD中使用lisp读取图纸中的数字并计算

理顺操作思路

操作思路仍然是3W三步骤“what-how-how”:首先明确问题,然后我们用思考去考虑解决方,最后将其转化为Lisp语句以实现。

a.示范问题

计算单相负荷的电流需要采用系数法,可通过读取cad图中相关数据并自动计算得出电流。

b.思考解决方法

根据公式计算,电流I可表示为I=kP/Ucosɸ,其中I代表电流(单位:安培),k为系数,P表示功率(单位:瓦特),U表示电压(220伏特),而cosɸ则是功率因数。

在这个公式中,我们需要从CAD图纸中提取k、p和cosɸ等数据。因此,Lisp可以通过鼠标读取CAD图纸中的数据,并将其传递到计算公式中进行计算。最后,它会将计算结果返回给命令行界面。

c.思考lisp如何操作

如何实现通过鼠标读取CAD图中的数据(获取数据):

  • 在LISP中,数据对象被称为图元,而图元内容中的数据值属于图元内容。图元包含了所有与数据对象相关的内容(例如图层、颜色等),这些内容都以属性列表的形式存储。因此,我们需要解决两个问题:一个是实现通过鼠标读取CAD数据对象的函数,另一个是实现读取数据对象内容的函数。
  • 如何将获取到的数据传递给计算公式并完成计算:我们需要编写一个函数来将读取到的数据传递给已经编写好的计算公式函数,并通过变量赋值来完成传递。
  • 如何将计算结果返回到命令行界面上进行输出:我们需要编写一个能够输出结果内容的函数来完成这一任务。

编辑Lisp程序

CAD中使用lisp读取图纸中的数字并计算

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】,你会得到如下结果:

CAD中使用lisp读取图纸中的数字并计算

二、3个数据求和

接下来我们以比较简单的三个数据求和为例,给大家讲述下操作方法:

a.问题:cad图中三个数据A,B,C求和。

b.如何解决:就是A+B+C

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与cad交互至关重要。如果你想找到你需要的内容在哪个抽屉里面,有一个专门的查询档案可以帮助你。这个查询档案被称为属性列表群码表,你可以通过大数据进行搜索。但是如果你只需要使用对象内容,记住它们通常存放在第一个柜子里。

恭喜你!你已经学会了CAD中使用lisp读取图纸中的数字并计算,有其他问题可以在下方留言哦~

版权声明
1、本网站名称:CAD家园
2、本站永久网址:https://www.CADJY.com
3、若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。
4、本网站的文章部分内容来源于网络,仅供大家学习与参考,如有侵权,请联系wanry@foxmail.com进行删除处理。
5、本站文章、素材、资源软件来自网络,本站资源仅供学习和交流使用,版权归原作者所有,请在下载后24小时之内自觉删除。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索