明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 751|回复: 4

[源码] 求实体的体积和重量

  [复制链接]
发表于 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

评分

参与人数 4明经币 +4 收起 理由
USER2128 + 1 赞一个!
edrise + 1 发源码还给注释,赞!
bssurvey + 1 赞一个!
VBALISPER + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 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)

)

点评

非常完美,楼主大才  发表于 2025-1-22 09:15
回复 支持 1 反对 0

使用道具 举报

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 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个亿

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-23 04:46 , Processed in 1.146582 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表