明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4012|回复: 12

[已解答] 求闭合区域所有顶点

[复制链接]
发表于 2013-5-26 12:38:55 | 显示全部楼层 |阅读模式
本帖最后由 Gu_xl 于 2013-5-26 18:44 编辑

由于工作需要,经常计算各种工程量。简化的说就是,选择两个图层上的多线段,要计算两个多线段形成的闭合区域面积。我看了好多的帖子,整理了一个思路,请高人指点:
    如图:
1、选择图册实体,获得多线段所有顶点,生成列表
2、根据选择的多线段获得交点,添加到列表
3、根据 交点1和交点2。现在需要遍历  线段1  和线段2。  用线段1的顶点至起点的距离L1与  交点到线段顶点的距离L  比较,如果  L1≥L,则保留至点列表,如果 L1<L,则剔除。反之,如果交点距离端点近,则判断公式反用即可。
4、根据新的点列表,计算闭合区域面积。

本帖子中包含更多资源

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

x
发表于 2020-2-21 22:20:42 | 显示全部楼层
厉害!10年前就编出这么优秀的程序,晚辈望尘莫及!
发表于 2013-5-26 18:15:08 | 显示全部楼层
http://bbs.mjtd.com/thread-80267-1-1.html
这里有你需要的,做好多段线之后。就得到面积了!
发表于 2013-5-27 05:13:46 | 显示全部楼层
多段线自交形成的面积算不算?
发表于 2013-5-27 09:28:16 | 显示全部楼层
先假设多段线不自交
  1. (defun intersectPts (vlaobj1 vlaobj2 / ptsVar ptsArray value point)
  2.   (setq        ptsVar         (vla-intersectwith vlaobj1 vlaobj2 acExtendNone)
  3.         ptsArray (vlax-variant-value ptsVar)
  4.         ptsList         (vl-catch-all-apply 'vlax-safeArray->list (list ptsArray))
  5.         value    nil
  6.   )
  7.   (if (vl-catch-all-error-p ptsList)
  8.     (setq ptsList nil)
  9.   )
  10.   (while ptsList
  11.     (setq point          (list (car ptsList) (cadr ptsList) (caddr ptsList))
  12.           value          (append value (list point))
  13.           ptsList (cdddr ptsList)
  14.     )
  15.   )
  16.   value
  17. )
  18. (defun c:tt (/ PLEname0 PLEname1 PntLst PrmLst0 PrmLst1 PntLst0 PntLst1 ClosedArea SumArea)
  19.   (and
  20.     (setq PLEname0 (car (entsel)))
  21.     (setq PLEname1 (car (entsel)))
  22.     (> (length (setq PntLst (intersectPts (vlax-ename->vla-object PLEname0) (vlax-ename->vla-object PLEname1)))) 1)
  23.     (progn
  24.       (setq PrmLst0 (mapcar (function (lambda (x) (vlax-curve-getparamatpoint PLEname0 x))) PntLst)
  25.             PrmLst0 (mapcar (function (lambda (x) (* x 0.5))) (mapcar '+ PrmLst0 (cdr PrmLst0)))
  26.             PrmLst1 (mapcar (function (lambda (x) (vlax-curve-getparamatpoint PLEname1 x))) PntLst)
  27.             PrmLst1 (mapcar (function (lambda (x) (* x 0.5))) (mapcar '+ PrmLst1 (cdr PrmLst1)))
  28.             PntLst0 (mapcar (function (lambda (x) (vlax-curve-getpointatparam PLEname0 x))) PrmLst0)
  29.             PntLst1 (mapcar (function (lambda (x) (vlax-curve-getpointatparam PLEname1 x))) PrmLst1)
  30.             PntLst  (mapcar (function (lambda (x y) (mapcar '* (mapcar '+ x y) '(0.5 0.5 0.5)))) PntLst0 PntLst1)
  31.             SumArea 0.0
  32.       )
  33.       (foreach Item PntLst
  34.         (setq ClosedArea (bpoly Item)
  35.               SumArea         (+ SumArea (vlax-curve-getarea ClosedArea))
  36.         )
  37.         (entdel ClosedArea)
  38.       )
  39.       (princ SumArea)
  40.     )
  41.   )
  42.   (princ)
  43. )

评分

参与人数 1明经币 +3 收起 理由
Gu_xl + 3 热心帮忙!!

查看全部评分

 楼主| 发表于 2013-5-27 11:17:29 | 显示全部楼层
nzl1116 发表于 2013-5-27 05:13
多段线自交形成的面积算不算?

非常感谢你,解决了问题。
有时候别人绘制的图中有直线,有多线段。请问能处理一下吗。

点评

直线圆弧都可以的  发表于 2013-5-27 11:43
发表于 2013-6-6 21:29:13 | 显示全部楼层
yxh1202 发表于 2013-5-27 11:17
非常感谢你,解决了问题。
有时候别人绘制的图中有直线,有多线段。请问能处理一下吗。

处理一下------什么意思,是不是合并?
 楼主| 发表于 2013-6-9 16:22:24 | 显示全部楼层
香田里浪人 发表于 2013-6-6 21:29
处理一下------什么意思,是不是合并?

就是说,有直线和多线段混合的情况,也可以实现目的。请帮忙
发表于 2013-6-9 19:31:36 | 显示全部楼层
yxh1202 发表于 2013-6-9 16:22
就是说,有直线和多线段混合的情况,也可以实现目的。请帮忙

合并多线段就可以。
发表于 2013-6-9 21:31:23 | 显示全部楼层
用BOUNDARY命令生成边界即可得到面积!
 楼主| 发表于 2013-9-10 15:20:13 | 显示全部楼层
nzl1116 发表于 2013-5-27 09:28
先假设多段线不自交

谢谢你的帮忙,这个代码只适合2个图元对吧。能不能实现多个图元选择后求的面积呢,请不吝赐教
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-10 15:30 , Processed in 0.217038 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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