明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2543|回复: 14

[源码] 面积统计

[复制链接]
发表于 2024-2-23 10:25:25 | 显示全部楼层 |阅读模式
本帖最后由 langjs 于 2024-2-29 14:21 编辑

;;; ===============================================
;;;《面积统计》选择已选则为取消该选择,结果复制到剪切板
;;; 作者:langjs
;;; ===============================================

(defun c:mjtj (/ ar area centroid e1 e2 en html i lst lst1 lst2 lwd n name num obj pe perimeter principalmoments1 pt result s s1 snap
                 ss str )
  (defun #err (s / i n s1)               ; 出错处理子函数
    (foreach n lst2 (setq s (last n))(foreach n s (entdel n)))
    (setvar "lwdisplay" lwd)  (setvar "osmode" snap)
    ((if command-s  command-s vl-cmdf ) ".undo" "e" )
    (setq *error* $orr))
  (defun ssnext (en / ss)
    (setq ss (ssadd))
    (while (setq en (entnext en))
      (if (not (member (cdr (assoc 0 (entget en))) (list "ATTRIB" "VERTEX" "SEQEND")))
        (setq ss (ssadd en ss)))) ss)               ; 四舍五入子函数
  (defun sswr (num n)
    (if (>= num 0.0)(/ (fix (+ (* num (expt 10.0 n)) 0.5)) (expt 10.0 n))(/ (fix (- (* num (expt 10.0 n)) 0.5)) (expt 10.0 n))))
  (vl-load-com)
  (setq $orr *error* *error* #err snap (getvar "osmode") lwd (getvar "LWDISPLAY") perimeter 0.0 area 0.0 lst2 '() )
  (setvar "cmdecho" 0) (setvar "osmode" 0)
  (vl-cmdf ".UNDO" "BE")
  (princ "\n 《面积统计》,如选择已选,则为取消该选择。结果复制到剪切表。")
  (while (setq pt (getpoint))
    (setq lst '() en (entlast))
    (vl-cmdf "-boundary" "A" "I" "Y" "" pt "") (setq ss (ssnext en))
    (vl-cmdf ".region" ss "") (setq ss (ssnext en))
    (repeat (setq i (sslength ss))
      (setq name (ssname ss (setq i (1- i))))
      (if (= (cdr (assoc 0 (entget name))) "REGION")
        (setq obj (vlax-ename->vla-object name) ar (sswr (vla-get-area obj) 4) pe (sswr (vla-get-perimeter obj) 4)
              principalmoments1 (sswr (car (vlax-safearray->list (vlax-variant-value (vla-get-principalmoments obj)))) 2)
              centroid (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj)))
              centroid (list (sswr (car centroid) 2) (sswr (cadr centroid) 2))
              lst (cons (list ar pe centroid principalmoments1) lst))))
    (setq lst (vl-sort lst (function (lambda (e1 e2)  (> (car e1) (car e2)))))
          ar (car (car lst)) pe (cadr (car lst)) lst (cdr lst))
    (foreach n lst  (setq ar (- ar (car n)) pe (+ pe (cadr n))))
    (if (setq n (assoc (list ar pe centroid principalmoments1) lst2))
      (progn
        (setq perimeter (- perimeter pe) area (- area ar) lst2 (vl-remove n lst2) s (last n) ss (ssnext en))
        (repeat (setq i (sslength ss)) (entdel (ssname ss (setq i (1- i)))))
        (foreach n s (entdel n)))
      (progn
        (setq perimeter (+ perimeter pe)  area (+ area ar) lst1 '())
        (vl-cmdf "explode" ss) (setq ss (ssnext en))
        (repeat (setq i (sslength ss))
          (setq name (ssname ss (setq i (1- i))) lst1 (cons name lst1) obj (vlax-ename->vla-object name))
          (vla-put-color obj 60)  (vla-put-lineweight obj aclnwt050))
        (setq lst2 (cons (list (list ar pe centroid principalmoments1) lst1) lst2))))
    (princ (strcat "\n  区域面积 = " (rtos area) " mm2 ,  周长 = " (rtos perimeter) " mm"))
    (setq str (rtos area) html (vlax-create-object "htmlfile")
          result (vlax-invoke (vlax-get (vlax-get html 'parentwindow) 'clipboarddata) 'setdata "Text" str))
    (vlax-release-object html) (setvar "LWDISPLAY" 1))
  (foreach n lst2  (setq s (last n))
    (foreach n s (entdel n) ))
  (setvar "LWDISPLAY" lwd)
  (setvar "osmode" snap)
  (vl-cmdf ".UNDO" "E")
  (setq *error* $orr)
  (princ)
)

评分

参与人数 4明经币 +4 收起 理由
林立 + 1 赞一个!
hubeiwdlue + 1 很给力!
USER2128 + 1 很给力!
zhoupeng220 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2024-5-20 11:04:02 | 显示全部楼层
林立 发表于 2024-5-20 10:32
大佬,单位改成米和平方,会好用

;(princ (strcat "\n  区域面积 = " (rtos area) " mm2 ,  周长 = " (rtos perimeter) " mm"))
(princ (strcat "\n  区域面积 = " (rtos (/ area 1000000)) " m2 ,  周长 = " (rtos (/ perimeter 1000)) " m"))
回复 支持 1 反对 0

使用道具 举报

发表于 2024-5-20 11:28:14 | 显示全部楼层
huxu823 发表于 2024-5-20 11:04
;(princ (strcat "\n  区域面积 = " (rtos area) " mm2 ,  周长 = " (rtos perimeter) " mm"))
(princ  ...

-----谢谢!!-----
发表于 2024-2-23 11:03:44 | 显示全部楼层
谢谢大师分享,要是在能支持椭圆就更全面了
发表于 2024-2-23 11:04:12 | 显示全部楼层
谢谢分享不错
发表于 2024-2-23 11:35:43 | 显示全部楼层
收藏了,感谢分享
发表于 2024-2-23 12:59:55 | 显示全部楼层
感谢分享,收藏了!!!!!!!!!!!!!!!!!!!!
发表于 2024-2-23 13:42:51 | 显示全部楼层
谢谢大师分享!
发表于 2024-2-23 14:36:13 | 显示全部楼层
感谢大佬分享
发表于 2024-2-26 11:30:27 | 显示全部楼层
动态识别面积区域,累积总面积计数,收藏!
发表于 2024-3-2 09:31:45 | 显示全部楼层
谢谢大佬分享。
发表于 2024-4-7 15:58:57 | 显示全部楼层
不知道为何,总是卡死,那个长度统计就没有这种问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 05:00 , Processed in 0.191201 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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