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

周站长 2022年1月11日12:53:57图文教程评论54613186字阅读10分37秒阅读模式
育设学堂CAD课程

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

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

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

动图演示:

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

  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数据对象的函数,一个实现读取数据对象数据内容的函数。

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

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

  1. Lisp程序

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

(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,得到如下结果。

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

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)
  )

 动图演示:

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

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

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

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

(完)

  • CAD自学网公众号
  • 微信扫一扫关注我,每天分享各种免费设计干货小技巧。
  • weinxin
  • 育设学堂服务号
  • 微信扫一扫关注我,各种设计实战全套视频教程在线学。
  • weinxin
育设学堂建筑学院
周站长
  • 本文由 发表于 2022年1月11日12:53:57
  • 转载请务必保留本文链接:https://www.cadzxw.com/47529.html
育设学堂CAD课程
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定