求实体的体积和重量
试试我编的程序。
;;求实体重量,作者:何勇
(defun c:zhonglianghe(/ bz obj lenobj sumwt sumvm i en em vlaem vm wt pt txt1)
(vl-load-com)
(setq bz
(getreal
"\n 输入实体(材料)比重:[灰铸铁:7.0,铸钢:7.8,钢材:7.85,不锈钢:7.98 紫钢:8.9,铝:2.75,聚氯乙烯:1.35~1.4,聚四氟乙烯:2.1~2.3,聚丙烯:0.9~0.91,ABS树脂:1.02~1.08,花岗岩:2.6~3,混凝土:1.8~2.45,]<7.85>"
)
)
(if (= bz nil)
(setq bz 7.85)
)
(setq obj (ssget '((0 . "3DSOLID"))));;只选择实体
(setq lenobj (sslength obj));;求选择集中的实体个数
(setq sumvm 0);;给体积和赋初值
(setq sumwt 0);;给体重量和赋初值
(setq i 0);;从0开始循环
(while (< i lenobj)
(setq en (ssname obj i));;求第i个实体的名称
(setq em (cdr (car (entget (ssname obj i)))));;从属性列表中获取对象名称
(setq vlaem (vlax-ename->vla-object em));;转换lisp对象为vla对象
(setq vm (vla-get-volume vlaem));;直接取得对象体积mm3
(setq vm1 (/ vm 1000000.0));;转换成立方分米dm3
(setq vm2 (/ vm1 1000.0));;转换成立方米m3
(setq wt (* bz vm1));;求重量kg
(setq sumvm (+ sumvm vm2));;体积累加
(setq sumwt (+ sumwt wt));;重量累加
(setq i (+ i 1));;计数器加1
)
(setq txt1 (strcat "体积=" (rtos sumvm 2 16) "m3," "重量=" (rtos sumwt 2 16) "kg"))
(setvar "cecolor" "1")
(setq pt (getpoint"\n文本起点:"))
(command "text" pt "" "" txt1)
(setvar "cecolor" "bylayer")
(prompt "\n计算结果如下:")
(princ txt1)
(princ "\n")
(prin1)
);;end zhonglianghe
tanxindong 发表于 2025-1-18 14:59
楼主大才,能否升级为型材重量计算代码。
我的思路是:
1.选取已经画好的型材剖面图形,(封闭线框,或圆 ...
;;以下是根据我理解的你的思路而编制的程序。不知对否?
(defun c:calwt()
(setq area1 (car (entsel"\n选择一封闭图形:")))
(setq bz
(getreal
"\n 输入实体(材料)比重:[灰铸铁:7.0,铸钢:7.8,钢材:7.85,不锈钢:7.98 紫钢:8.9,铝:2.75,聚氯乙烯:1.35~1.4,聚四氟乙烯:2.1~2.3,聚丙烯:0.9~0.91,ABS树脂:1.02~1.08,花岗岩:2.6~3,混凝土:1.8~2.45,]<7.85>"
)
)
(if (= bz nil)
(setq bz 7.85)
)
(command "area" "o" area1)
(setq Lc (getvar "perimeter"))
(setq As (/ (getvar "area") 100.0));;将面积转换成平厘米(cm2)
(setq wt (* As 100 bz));;此处100表示为100cm,即1米。wt为单位长度重量(克)。
(setq wt (/ wt 1000.0));;转换为kg.
;;; (princ "\n")
;;; (princ (strcat "\n单位长度重量为:" (rtos wt 2 4) "kg."))
(sumoflinewt)
)
(defun sumoflinewt(/ CURVE lengthline SS N sumline)
(vl-load-com)
(setq sumline 0)
(setq SS (ssget '((0 . "CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE,ARC"))))
(setq N 0)
(repeat (sslength SS)
(setq CURVE (vlax-ename->vla-object (ssname SS N)))
(setq lengthline (vlax-curve-getdistatparam
CURVE
(vlax-curve-getendparam CURVE)
)
)
(setq sumline (+ sumline lengthline))
(setq N (1+ N))
)
(setq sumline (/ sumline 1000))
;;;(setq sumlinekm (/ sumline 1000))
(princ (strcat "\n共选择了"
(itoa (sslength SS))
"条线段。\n总长度为:"
(rtos sumline 2 6)
"米;\n"
;;; (rtos sumlinekm 2 6)
;;; "公里。"
)
)
(prin1)
;;;(setq tiji (* (atof dbjgmj_jg) sumline));;平方厘米
;;;(princ tiji)
(setq zliang (* wt sumline));;kg.
(setq txt (strcat "\n单重为:" (rtos wt 2 4) "kg/m. " "总重为:" (rtos zliang 2 4) "kg."))
(setq pt (getpoint"\n给定文本起点:"))
(command "text" pt "" "" txt)
(princ txt)
(prin1)
) 楼主大才,能否升级为型材重量计算代码。
我的思路是:
1.选取已经画好的型材剖面图形,(封闭线框,或圆,多边形,也可以是面域)
2.程序根据输入的图形计算出线密度
3.选取已经画好的线段(可以是line pl,arc等)
4.程序计算出重量,
5.写计算结果到图中指定位置(用当前字体图层什么的)
6.TEXT 本帖最后由 tanxindong 于 2025-1-22 11:07 编辑
ocoipw 发表于 2025-1-22 02:10
;;以下是根据我理解的你的思路而编制的程序。不知对否?
(defun c:calwt()
(setq area1 (car (entsel"\ ...
复杂型材
工程上用的型材比如钢管(圆形及多边形钢管)或含有减轻孔的异形型材。能否升级为型材重量计算代码。
我的思路是:
1.输入的材料密度 ,默认7.85
2.选取已经画好的型材剖面图形,它是用2到多个封闭图元组成的截面
a.操作时第一次选取主体封闭图元(最外围的曲线),并计算面积值a
b.选内围的封闭图元(可以点选、框选,这是需要扣减的面积),并计算总面积值b
c.用 值a-值b = 值c
(当然也可以一次一框选所有截面图形,让程序自已找出最大的面积值c,
然后将去除最大面积值的各个面积值进行相加得到值b,再用值a-值b 得到 值c)
3.程序根据 值c,材料密度, 计算出图形的线密度
4.选取已经画好图中1根或多根采用这个型材规格的线段(可以是line pl,arc等)
5.程序计算出下面大图选中的这根线对应的剖面型材重量,
6.写计算结果“线密度,总长度,型材重量”到图中指定位置(用当前字体图层什么的)
7.TEXT
*******************************************************
开孔异形板材重量
工程上用的含有减轻孔的板材。能否升级为板材重量计算代码。
已经切割下好料的钢板上面会有不确定定数量的开孔(开孔有方形圆形,椭圆形多种可以是line pl,arc,ellipse等)
我的思路是:
1.输入的材料密度 ,默认7.85
2.选取已经画好的板材剖面图形,它是用2到多个封闭图元组成
a.操作时第一次选取主体封闭图元(最外围的曲线),并计算面积值a
b.选内围的封闭图元(可以点选、框选,这是需要扣减的面积),并计算总面积值b
c.用 值a-值b = 值c
(当然也可以一次一框选所有封闭曲线图元,让程序自已找出最大的面积值c,
然后将去除最大面积值的各个面积值进行相加得到值b,再用值a-值b 得到 值c)
3.输入板材的厚度,
4.程序根据 密度 ,值c ,厚度 计算出板材重量
5.写计算结果“密度,厚度,板材重量”到图中指定位置(用当前字体图层什么的)
6.TEXT
祝楼主新年快乐,身体健康,万事如意,阖家幸福,2025行大运,实现一个小目标,挣它1个亿:loveliness::D-
页:
[1]