ocoipw 发表于 2024-12-27 22:38:10

求实体的体积和重量


试试我编的程序。

;;求实体重量,作者:何勇
(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

ocoipw 发表于 2025-1-22 02:10:06

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)

)

tanxindong 发表于 2025-1-18 14:59:41

楼主大才,能否升级为型材重量计算代码。
我的思路是:
1.选取已经画好的型材剖面图形,(封闭线框,或圆,多边形,也可以是面域)
2.程序根据输入的图形计算出线密度
3.选取已经画好的线段(可以是line pl,arc等)
4.程序计算出重量,
5.写计算结果到图中指定位置(用当前字体图层什么的)
6.TEXT

tanxindong 发表于 2025-1-22 11:06:10

本帖最后由 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]
查看完整版本: 求实体的体积和重量