找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2291|回复: 17

[求助] 请教下查询多个三维实体面积和。(已自己解决)

[复制链接]
发表于 2015-1-17 16:49:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 rsent 于 2015-1-19 22:33 编辑

谢谢大家的帮助。。代码自己花了1天才写好。

三维实体的面积 组成的面积 。。不是三维实体的面积,而是组成后的图形的总面积。。

1.jpg 2.jpg 3.jpg

代码写的比较杂。。希望高手帮忙精简下。
  1. ;求面积
  2. (defun c:aa (/ ss i bp up  x1 x2 y1 y2 xx1 xx2 yy1 yy2  ix1 mx1 iy1 my1 iy2 my2  diaogao xiagao area)
  3. (setq ss (ssget '((0 . "3dsolid"))))
  4. (setq  i 0  xx1 0 xx2 0 yy1 0 yy2 0  ix1 0 mx1 0 iy1 0 my1 0 iy2 0 my2 0)
  5. (repeat (sslength ss)
  6. (vla-getboundingbox(vlax-ename->vla-object (ssname ss i))'bp'up)
  7. (setq x1 (nth 0 (safearray-value bp)) y1 (nth 2 (safearray-value bp)))
  8. (setq x2 (nth 0 (safearray-value up)) y2 (nth 2 (safearray-value up)))
  9. (if (= xx1 0) (setq xx1 x2)) (if (= xx2 0) (setq xx2 x1))
  10. (if (= yy1 0) (setq yy1 y2))(if (= yy2 0) (setq yy2 y1))
  11. (setq xx1 (min x1 xx1))
  12. (setq xx2 (max x2 xx2))
  13. (setq yy1 (min y1 yy1))
  14. (setq yy2 (max y2 yy2))
  15. (setq i (1+ i))
  16. )
  17. (setq i 0)
  18. (repeat (sslength ss)
  19. (vla-getboundingbox(vlax-ename->vla-object (ssname ss i))'bp'up)
  20. (setq x1 (nth 0 (safearray-value bp)) y1 (nth 2 (safearray-value bp)))
  21. (setq x2 (nth 0 (safearray-value up)) y2 (nth 2 (safearray-value up)))
  22. (if (= ix1 0) (setq ix1 xx2)) (if (= mx1 0) (setq mx1 xx1))
  23. (if (= iy1 0) (setq iy1 yy2)) (if (= iy2 0) (setq iy2 yy2))
  24. (if (= my1 0) (setq my1 yy2)) (if (= my2 0) (setq my2 yy2))
  25. (if (= y1 yy1) (setq ix1 (min (min x1 x2) ix1)));y为y1时,x的最小点
  26. (if (= y1 yy1) (setq mx1 (max (max x1 x2) mx1)));y为y1时,x的最大点
  27. (if (= x1 xx1) (setq iy1 (min (min y1 y2) iy1)));x为x1时,y的最小点
  28. (if (= x2 xx1) (setq my1 (max (max y1 y2) my1)));x为x1时,y的最大点
  29. (if (= x2 xx2) (setq iy2 (min y1 iy2)));x为x2时,y的最小点
  30. (if (= x2 xx2) (setq my2 (max y2 my2)));x为x2时,y的最大点
  31. (setq i (1+ i))
  32. )
  33. ;shang1:=(- xx2 xx1) xia1:=(- mx1 ix1)  zonggao1:=(- yy2 yy1) qi1:=(- shang1 xia1)
  34. (if (> (- xx2 xx1) (- mx1 ix1)) (setq diaogao (min (- my1 iy1) (- my2 iy2) )) (setq diaogao 0) )
  35. (if (> (- xx2 xx1) (- mx1 ix1)) (setq xiagao (- (- yy2 yy1) diaogao)) (setq xiagao 0)  )
  36. (setq area  (rtos (/(- (*  (- xx2 xx1) (- yy2 yy1)) (*  (- (- xx2 xx1) (- mx1 ix1)) xiagao)) 1000000) 2 2))
  37. (princ area)(princ "平方")
  38. (princ)
  39. )

三维实体平方计算.dwg..zip

51.86 KB, 下载次数: 10, 下载积分: D豆 -1 , 活跃度 1

三维图

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 264个

财富等级: 日进斗金

发表于 2015-1-17 17:33:31 来自手机 | 显示全部楼层
本帖最后由 iLisp 于 2015-1-17 17:50 编辑

你用什么版本?lisp写起来困难
重叠部分计算两次?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-17 19:29:19 | 显示全部楼层
本帖最后由 csharp 于 2015-1-18 21:20 编辑

For 2013+  用 netload 加载

SolidArea.rar

4.46 KB, 下载次数: 21, 下载积分: D豆 -1 , 活跃度 1

点评

很不错,能不能出个查询体积 和 单一选择的面的面积?  详情 回复 发表于 2015-1-18 20:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-18 16:44:40 | 显示全部楼层
csharp 发表于 2015-1-17 19:29
For 2013+  用 netload 加载
  1. ;求面积
  2. (defun c:aa (/ ss i bp up )
  3. (setq ss (ssget '((0 . "3dsolid"))))
  4. (setq i 0 xx1 0 xx2 0 yy1 0 yy2 0)
  5. (repeat (sslength ss)
  6. (vla-getboundingbox(vlax-ename->vla-object (ssname ss i))'bp'up)
  7. (setq x1 (nth 0 (safearray-value bp)) y1 (nth 2 (safearray-value bp)))
  8. (setq x2 (nth 0 (safearray-value up)) y2 (nth 2 (safearray-value up)))
  9. (if (= xx1 0) (setq xx1 x1)) (if (= xx2 0) (setq xx2 x2))(if (= yy1 0) (setq yy1 y1))(if (= yy2 0) (setq yy2 y2))
  10. (setq xx1 (min x1 xx1)) (setq xx2 (max x2 xx2)) (setq yy1 (min y1 yy1)) (setq yy2 (max y2 yy2))
  11. (setq i (1+ i))
  12. )
  13. (princ xx1)(princ xx2)(princ yy1)(princ yy2)
  14. (princ)
  15. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-18 16:45:46 | 显示全部楼层
代码只写的出一部分。。。现在只能求 1长方形的。。2个长方形的不会。。请老师,大侠们指点下。。感激不尽。。!!!

点评

V/Alisp的 BoundingBox 是和坐标轴平行的,求出对角点后用 长 x 宽 是一个面面积,分别求了六个面的和就是 体 的面积,net 是直接建立 Brep 在这个里面遍历六个 Face ,每个 Face 有 Area 属性的  详情 回复 发表于 2015-1-18 17:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-18 17:07:15 | 显示全部楼层
本帖最后由 csharp 于 2015-1-18 17:44 编辑
rsent 发表于 2015-1-18 16:45
代码只写的出一部分。。。现在只能求 1长方形的。。2个长方形的不会。。请老师,大侠们指点下。。感激不尽 ...

V/Alisp的 BoundingBox 是和坐标轴平行的,求出对角点后用 长 x 宽 是一个面面积,分别求了六个面的和就是 体 的面积,net 是直接建立 Brep 在这个里面遍历六个 Face ,每个 Face 有 Area 属性的
  1. ;;求面积
  2. (defun c:aa (/ ss sl area e obj bp up vec a1 a2 a3)
  3.   (if (setq ss (ssget '((0 . "3dsolid"))))
  4.     (progn
  5.       (setq sl         (sslength ss)
  6.             area 0.0
  7.       )
  8.       (while (> sl 0)
  9.         (setq e          (ssname ss (setq sl (1- sl)))
  10.               obj (vlax-ename->vla-object e)
  11.         )
  12.         (vla-getboundingbox obj 'bp 'up)
  13.         (setq bp   (safearray-value bp)
  14.               up   (safearray-value up)
  15.               vec  (mapcar '- up bp)
  16.               a1   (* (car vec) (cadr vec))
  17.               a2   (* (car vec) (caddr vec))
  18.               a3   (* (cadr vec) (caddr vec))
  19.               area (+ area (* 2 (+ a1 a2 a3)))
  20.         )
  21.       )
  22.       (princ "\nTotle Area = ")
  23.       (princ area)
  24.     )
  25.   )
  26.   (princ)
  27. )

.Net

  1.        [CommandMethod("SolidArea")]
  2.         public void MyCommand()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             Transaction tr = db.TransactionManager.StartTransaction();
  8.             using (tr)
  9.             {
  10.                 try
  11.                 {
  12.                     var filter = new SelectionFilter(new TypedValue[]
  13.                     {
  14.                         new TypedValue(0, "*SOLID")
  15.                     });
  16.                     var pso = new PromptSelectionOptions();
  17.                     pso.MessageForAdding = "\nSelect Solid";
  18.                     var psr = ed.GetSelection(filter);
  19.                     if (psr.Status == PromptStatus .OK )
  20.                     {
  21.                         var ids = psr.Value.GetObjectIds();
  22.                         double area = 0.0;
  23.                         for (int i = 0; i < ids.Length ; i++)
  24.                         {
  25.                             var obj = (Entity) ids[i].GetObject(OpenMode.ForRead);
  26.                             var brep = new Brep(obj);
  27.                             var flc = brep.Faces;
  28.                             area += flc.Sum(face => face.GetArea());
  29.                         }
  30.                         ed.WriteMessage("\nTotle Area = {0}" , String.Format("{0:0.00}", area % 100000));
  31.                     }
  32.                 }
  33.                 catch (Autodesk.AutoCAD .Runtime .Exception ex)
  34.                 {
  35.                     ed.WriteMessage(ex.ToString());
  36.                 }
  37.             }
  38.         }

点评

大师。。刚刚那个和求体积差不多了。。我刚刚把一楼整理了下。。请您看看,看能得出 框架的平方吗?  详情 回复 发表于 2015-1-18 19:18
您好,非常感谢您。我现在去试下效果。。  详情 回复 发表于 2015-1-18 18:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-18 18:18:39 | 显示全部楼层
csharp 发表于 2015-1-18 17:07
V/Alisp的 BoundingBox 是和坐标轴平行的,求出对角点后用 长 x 宽 是一个面面积,分别求了六个面的和就 ...

{:soso_e179:}您好,非常感谢您。我现在去试下效果。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-18 19:18:50 | 显示全部楼层
csharp 发表于 2015-1-18 17:07
V/Alisp的 BoundingBox 是和坐标轴平行的,求出对角点后用 长 x 宽 是一个面面积,分别求了六个面的和就 ...

大师。。刚刚那个和求体积差不多了。。我刚刚把一楼整理了下。。请您看看,看能得出 框架的平方吗?

点评

你这个问题和原来是两码事,按单独的 长方体 Union 后逐个使用 GetBoundongBox,取 矢量差 的 x * y  详情 回复 发表于 2015-1-18 19:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-18 19:32:52 | 显示全部楼层
rsent 发表于 2015-1-18 19:18
大师。。刚刚那个和求体积差不多了。。我刚刚把一楼整理了下。。请您看看,看能得出 框架的平方吗?

你这个问题和原来是两码事,按单独的 长方体 Union 后逐个使用 GetBoundongBox,取 矢量差 的 x * y

点评

代码我写在一楼了。。可以帮我看看吗。。没想出 怎么求 7字型的面积。  详情 回复 发表于 2015-1-18 19:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-18 19:53:35 | 显示全部楼层
csharp 发表于 2015-1-18 19:32
你这个问题和原来是两码事,按单独的 长方体 Union 后逐个使用 GetBoundongBox,取 矢量差 的 x * y

代码我写在一楼了。。可以帮我看看吗。。没想出 怎么求 7字型的面积。{:soso_e179:}

点评

只能分两次求和  详情 回复 发表于 2015-1-18 19:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-18 19:58:42 | 显示全部楼层
rsent 发表于 2015-1-18 19:53
代码我写在一楼了。。可以帮我看看吗。。没想出 怎么求 7字型的面积。

只能分两次求和
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-18 20:53:34 | 显示全部楼层
本帖最后由 csharp 于 2015-1-18 21:20 编辑

给你配个 Lisp 函数,可以获取 Solid 选择集的顶点列表,在 Lisp 中对这些点处理后可以求出 T 型面积的,再论坛搜索可以找到这个程序

命令: (solid_vectices (ssget))
选择对象: 指定对角点: 找到 4 个
选择对象:
((3471.11 2198.48 79.9419) (3471.11 2152.02 79.9419) (2668.52 2152.02 79.9419) (2668.52 2198.48 79.9419) (2668.52 2198.48 0.0) (3471.11 2198.48 0.0) (3471.11 2152.02 0.0) (2668.52 2152.02 0.0) (2668.52 2198.48 79.9419) (2668.52 1315.84 0.0) (2668.52 1315.84 79.9419) (2540.57 1315.84 0.0) (2540.57 1315.84 79.9419) (2668.52 2198.48 0.0) (2540.57 2198.48 0.0) (2540.57 2198.48 79.9419) (3471.11 1315.84 79.9419) (3471.11 996.46 79.9419) (2540.57 996.46 79.9419) (2540.57 1315.84 79.9419) (2540.57 1315.84 0.0) (3471.11 1315.84 0.0) (3471.11 996.46 0.0) (2540.57 996.46 0.0) (4011.98 2198.48 79.9419) (4011.98 682.89 79.9419) (3471.11 682.89 79.9419) (3471.11 2198.48 79.9419) (3471.11 2198.48 0.0) (4011.98 2198.48 0.0) (4011.98 682.89 0.0) (3471.11 682.89 0.0))

点评

搜索不到“solid_vectices”,包括在全网中。大师,麻烦贴出来吧  详情 回复 发表于 2015-1-18 22:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3199个

财富等级: 富可敌国

发表于 2015-1-18 20:57:10 | 显示全部楼层
csharp 发表于 2015-1-17 19:29
For 2013+  用 netload 加载

很不错,能不能出个查询体积 和 单一选择的面的面积?

点评

修正下前面程序,Solid3d 本来就有 Area 属性的,不需要转 Brep 2012 下这个命令可以查询面积和体积的 命令: MEASUREGEOM 输入选项 [距离(D)/半径(R)/角度(A)/面积(AR)/体积(V)] : v 指定第一个角点或 [对  详情 回复 发表于 2015-1-18 21:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-1-18 21:24:55 | 显示全部楼层
lucas3 发表于 2015-1-18 20:57
很不错,能不能出个查询体积 和 单一选择的面的面积?

修正下前面程序,Solid3d 本来就有 Area 属性的,不需要转 Brep

2012 下这个命令可以查询面积和体积的

命令:  MEASUREGEOM
输入选项 [距离(D)/半径(R)/角度(A)/面积(AR)/体积(V)] <距离>: v
指定第一个角点或 [对象(O)/增加体积(A)/减去体积(S)/退出(X)] <对象(O)>:
选择对象:
体积 = 15438676.6784
输入选项 [距离(D)/半径(R)/角度(A)/面积(AR)/体积(V)/退出(X)] <体积>:  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5600个

财富等级: 富甲天下

发表于 2015-1-18 22:09:26 | 显示全部楼层
csharp 发表于 2015-1-18 20:53
给你配个 Lisp 函数,可以获取 Solid 选择集的顶点列表,在 Lisp 中对这些点处理后可以求出 T 型面积的,再 ...

搜索不到“solid_vectices”,包括在全网中。大师,麻烦贴出来吧

点评

3 楼附件中  详情 回复 发表于 2015-1-19 07:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 16:25 , Processed in 0.494510 second(s), 73 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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