明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 711|回复: 2

[源码] 获取XY平面内任意个顶点构成的封闭多边形面积

[复制链接]
发表于 2024-6-21 11:16:07 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2024-6-21 11:31 编辑

CAD官方自带了(vla-get-Area obj) (command AREA)来获取面积,
但vla-get-Area需现有个对象才行,
command呢,需要考虑捕捉的问题
  1. 出自明经 AutoLISP 编程②群 @必强 大佬
  2. (and
  3.   (setq en (entsel))
  4.   (vl-cmdf "area" "o"(car en ) ""  "" "" )
  5.   (alert (rtos(getvar 'area)))
  6. )

上述代码也需要对象
如果想要获取如下如所示的部分面积,按照上述两种方法,
要么需要对象,要么需要考虑捕捉的问题


所以,写了按照顶点表获取面积的函数,如下:

  1. ;;说明:获取封闭多边形面积
  2.   ;;参数:ptlst:按参数排序点的表
  3.   ;;返回:多边形的面积
  4.   (defun polygonarea(ptlst / area pt1 pt2 pts)
  5.     (if(> (length ptlst) 2)
  6.       (progn
  7.         (setq pt1 (car ptlst) pts pt1 ptlst (cdr ptlst) area 0)
  8.         (while (setq pt2 (car ptlst))
  9.           (setq area (+ area (- (* (car pt1) (cadr pt2)) (* (cadr pt1) (car pt2)))))
  10.           (setq pt1 pt2 ptlst (cdr ptlst))
  11.         )
  12.         (setq area (* 0.5 (+ area (- (* (car pt1) (cadr pts)) (* (cadr pt1) (car pts))))))
  13.         (abs area)
  14.       )
  15.       0
  16.     )
  17.   )

  1. (defun c:GetPolygonArea(/ ent polygonarea)
  2.   (if (setq ent (car (entsel)))
  3.     (princ
  4.       (rtos
  5.         (polygonarea
  6.           (mapcar
  7.             'cdr
  8.             (vl-remove-if-not '(lambda(x) (= 10 (car x)))
  9.               (entget ent)
  10.             )
  11.           )
  12.         ) 2 2
  13.       )
  14.     )
  15.   )
  16.   (prin1)
  17. )




本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-6-21 14:45:46 | 显示全部楼层
注意,有z值的,或不闭合的可能数据不符
发表于 2024-6-23 14:17:09 | 显示全部楼层
用纯数学方法写得函数,就是让人敬佩。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:45 , Processed in 0.151771 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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