明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4921|回复: 24

[源码] 长度与面积测量并标注

  [复制链接]
发表于 2021-5-28 10:10:06 | 显示全部楼层 |阅读模式
本帖最后由 nyistjz 于 2021-6-4 08:17 编辑

自己根据论坛里朋友提供的学习资料,修改的长度与面积测量,如附件,喜欢对大家有所帮忙。

;;长度面积统计: T
;;计量结算标注: TT
;;长度统计:  TG
;;面积统计:  GT



修改版本,在十楼!

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2021-6-4 08:16:49 | 显示全部楼层

;修改了一下,增加了标注的相应图层及文字样式



;;============================
;;长度面积统计: T
;;计量结算标注: TT
;;长度统计:  TG
;;面积统计:  GT

;;=============================
;长度面积统计,选择测算数据不能局部函数,无法擦除
(defun caleachone();测量当前元素长度与面积
        (setq dis (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)))
        (setq area (vl-catch-all-apply 'vlax-curve-getArea (list obj)))
)
(defun Total-count(/ ename i n obj);长度面积统计
  (vl-load-com)
        (setvar "cmdecho" 0)
  (setq
                n (sslength ss)
                i 0
                totalarea 0
                totlength 0
        )
  (repeat n
    (setq ename (ssname ss i))
    (setq obj (vlax-ename->vla-object ename))
    (caleachone)
                (setq totlength (+ dis totlength))
                (setq totalarea (+ area totalarea))
    (setq i (1+ i))
                (if (or (= L 1)(= S 1))
                        (princ (strcat "\n第" (itoa i) "个图元"))
                )
                (if (= L 1)
                        (princ (strcat ", 长度=" (rtos dis 2 3)  "mm"))
                )
                (if (= S 1)
                        (if (/= area 0.0)
                                (princ (strcat ", 面积=" (rtos area 2 3) "mm2"))
                                (princ (strcat ", 无面积属性!"))
                        )
                )
  )
  (princ "\n****默认绘图比例1:1,以mm为单位****")
        (princ (strcat "\n>>>>>共统计了" (itoa n) "个"))
        (setq totlength (strcat ",累计长度=" (rtos (/ totlength 1e3) 2 3) "m"))
        (setq totalarea (strcat ",累计面积=" (rtos (/ totalarea 1e6) 2 3) "m2"))
        (setvar "cmdecho" 1)
  (princ)
)
(defun c:T(/ l s ss);长度面积统计
        (princ "-->长度与面积统计")
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE,ARC,LINE"))))
        (setq L 0 S 0)
        (Total-count)
        (princ(strcat totlength totalarea))
        (princ)
)
(defun c:tg(/ l s ss);长度统计
        (princ "-->长度统计")
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE,ARC,LINE"))))
        (setq L 1 S 0)
        (Total-count)
        (princ totlength)
        (princ)
)
(defun c:gt(/ l s ss);面积统计
        (princ "-->面积统计")
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE"))))
        (setq L 0 S 1)
        (Total-count)
        (princ totalarea)
        (princ)
)

;周长与面积图形标注
(defun c:tt (/ calname caltextlabel ename htext_max htext_mini i n obj olay oldstyle pt pt2 ss thestring)
        (defun caltextlabel(thestring Htext Value / *doc* textobj)
                (setq *doc* (vla-get-ActiveDocument (vlax-get-acad-object)))
                (setq textobj (vla-addtext
                                                                                (vla-get-Modelspace *doc*)
                                                                                thestring
                                                                                (vlax-3d-point pt)
                                                                                Htext
                                                                        )
                )
                (vla-put-Alignment textobj Value)
                (vla-put-TextAlignmentPoint textobj pt2)
        )
        (vl-load-com)
        (setvar "cmdecho" 0)
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE,ARC,LINE"))))
        (setq
                n (sslength ss)
                i 0
        )
        ;算量辅助标注名
        (setq calname "LB_算量辅助标注")
        ;创建沿线文字专用样式
        (setq olay (getvar "clayer"))
        (if (= (tblobjname "layer" calname) nil)
    (vl-cmdf "Layer" "new" calname "color" "63" calname "" )
  )
        (setvar "clayer" calname)
        ;创建沿线文字专用样式
        (setq oldstyle (getvar "TEXTSTYLE"));当前文字样式
  (if (= (tblobjname "STYLE" calname) nil)
    (vl-cmdf "style" calname "tssdeng.shx,hztxt.shx" "0.0" "0.7" "" "" "" "")
                (setvar "TEXTSTYLE" calname)
  )
        ;设置标注字体高度
        (setq
                Htext_max 120
                Htext_mini 75
        )
        ;开始计算并标注
        (if ss
                (progn
                        (repeat n
                                (setq ename (ssname ss i))
                                (setq obj (vlax-ename->vla-object ename))
                                (vla-GetBoundingBox obj 'minpt 'maxpt)
                                (setq pt (mapcar '(lambda (x) (/ x 2.0))
                                                                         (mapcar '+
                                                                                 (vlax-safearray->list minpt)
                                                                                 (vlax-safearray->list maxpt)
                                                                         )
                                                                 )
                                )
                                (setq pt2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))
                                (vlax-safearray-fill pt2 pt)
                                (caleachone)
                                (cond
                                        ((> (/ area 1000000) 0.3)
                                                (setq thestring (strcat "S=" (rtos (/ area 1000000) 2 2) "m2"))
                                                (caltextlabel thestring Htext_max acAlignmentBottomCenter)
                                                (setq thestring (strcat "L=" (rtos (/ dis 1e3) 2 2) "m"))
                                                (caltextlabel thestring Htext_max acAlignmentTopCenter)
                                        )
                                        ((> (/ area 1000000) 0)
                                                (setq thestring (strcat "S=" (rtos (/ area 1000000) 2 2) "m2"))
                                                (caltextlabel thestring Htext_mini acAlignmentBottomCenter)
                                                (setq thestring (strcat "L=" (rtos (/ dis 1e3) 2 2) "m"))
                                                (caltextlabel thestring Htext_mini acAlignmentTopCenter)
                                        )
                                        ((= (/ area 1000000) 0)
                                                (setq thestring (strcat "L=" (rtos (/ dis 1e3) 2 2) "m"))
                                                (caltextlabel thestring Htext_max acAlignmentMiddleCenter)
                                        )
                                        (t nil)
                                )
                                (setq i (1+ i))
                        )
                )
        )
        (setvar "clayer" olay)
        (setvar "TEXTSTYLE" oldstyle)
        (setvar "cmdecho" 1)
        (princ "\n****默认绘图比例1:1,以mm为单位,实际如果不同,则标注结果错误!!!****")
        (princ)
)


(princ)

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-5-28 15:42:15 | 显示全部楼层
664571221 发表于 2021-5-28 15:15
兄弟 线的长度可不可以标注一下呀

;;============================
;;长度面积统计: T
;;计量结算标注: TT
;;长度统计:  TG
;;面积统计:  GT
;;连续测距:  DT
;;文字求和:  TS
;;=============================
;长度面积统计,选择测算数据不能局部函数,无法擦除
(defun caleachone();测量当前元素长度与面积
        (setq dis (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)))
        (setq area (vl-catch-all-apply 'vlax-curve-getArea (list obj)))
)
(defun Total-count(/ ename i n obj);长度面积统计
  (vl-load-com)
  (setq
                n (sslength ss)
                i 0
                totalarea 0
                totlength 0
        )
  (repeat n
    (setq ename (ssname ss i))
    (setq obj (vlax-ename->vla-object ename))
    (caleachone)
                (setq totlength (+ dis totlength))
                (setq totalarea (+ area totalarea))
    (setq i (1+ i))
  )
  (princ "\n****默认绘图比例1:1,以mm为单位****")
        (princ (strcat "\n>>>>>共统计了" (itoa n) "个"))
        (setq totlength (strcat ",累计长度=" (rtos (/ totlength 1e3) 2 3) "m"))
        (setq totalarea (strcat ",累计面积=" (rtos (/ totalarea 1e6) 2 3) "m2"))
  (princ)
)
(defun c:T(/ ss);长度面积统计
        (princ "-->长度与面积统计")
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE,ARC,LINE"))))
        (Total-count)
        (princ(strcat totlength totalarea))
        (princ)
)
(defun c:tg(/ ss);长度统计
        (princ "-->长度统计")
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE,ARC,LINE"))))
        (Total-count)
        (princ totlength)
        (princ)
)
(defun c:gt(/ ss);面积统计
        (princ "-->面积统计")
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE"))))
        (Total-count)
        (princ totalarea)
        (princ)
)

;周长与面积图形标注
(defun c:tt (/ caltextlabel ename i n obj pt pt2 ss thestring)
        (defun caltextlabel(thestring Htext Value / textobj)
                (setq textobj (vla-addtext
                                                                                (vla-get-Modelspace (vla-get-activeDocument (vlax-get-acad-object)))
                                                                                thestring
                                                                                (vlax-3d-point pt)
                                                                                Htext
                                                                        )
                )
                (vla-put-Alignment textobj Value)
                (vla-put-TextAlignmentPoint textobj pt2)
        )
        (vl-load-com)
        (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE,ARC,LINE"))))
        (setq
                n (sslength ss)
                i 0
        )
        (if ss
                (progn
                        (repeat n
                                (setq ename (ssname ss i))
                                (setq obj (vlax-ename->vla-object ename))
                                (vla-GetBoundingBox obj 'minpt 'maxpt)
                                (setq pt (mapcar '(lambda (x) (/ x 2.0))
                                                                         (mapcar '+
                                                                                 (vlax-safearray->list minpt)
                                                                                 (vlax-safearray->list maxpt)
                                                                         )
                                                                 )
                                )
                                (setq pt2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))
                                (vlax-safearray-fill pt2 pt)
                                (caleachone)
                                (cond
                                        ((> (/ area 1000000) 0.3)
                                                (setq thestring (strcat "S=" (rtos (/ area 1000000) 2 2) "m2"))
                                                (caltextlabel thestring 200 acAlignmentBottomCenter)
                                                (setq thestring (strcat "L=" (rtos (/ dis 1e3) 2 2) "m"))
                                                (caltextlabel thestring 200 acAlignmentTopCenter)
                                        )
                                        ((> (/ area 1000000) 0)
                                                (setq thestring (strcat "S=" (rtos (/ area 1000000) 2 2) "m2"))
                                                (caltextlabel thestring 75 acAlignmentBottomCenter)
                                                (setq thestring (strcat "L=" (rtos (/ dis 1e3) 2 2) "m"))
                                                (caltextlabel thestring 75 acAlignmentTopCenter)
                                        )
                                        ((= (/ area 1000000) 0)
                                                (setq thestring (strcat "L=" (rtos (/ dis 1e3) 2 2) "m"))
                                                (caltextlabel thestring 120 acAlignmentBottomCenter)
                                        )
                                        (t nil)
                                )
                                (setq i (1+ i))
                        )
                )
        )
        (princ "\n****默认绘图比例1:1,以mm为单位,实际如果不同,则标注结果错误!!!****")
        (princ)
)
发表于 2021-5-28 15:15:46 | 显示全部楼层
兄弟 线的长度可不可以标注一下呀
发表于 2021-5-29 10:23:12 | 显示全部楼层
挺好使的,感谢分享
发表于 2021-5-29 10:25:14 | 显示全部楼层
nyistjz 发表于 2021-5-28 15:42
;;============================
;;长度面积统计: T
;;计量结算标注: TT

;;连续测距:  DT
;;文字求和:  TS
请教下楼主DT和TS怎么修改启动命令和天正的(电梯)和(表格样式)冲突了
发表于 2021-5-29 13:15:39 | 显示全部楼层
挺好使的,感谢分享
 楼主| 发表于 2021-5-30 21:54:20 | 显示全部楼层
lxl217114 发表于 2021-5-29 10:25
;;连续测距:  DT
;;文字求和:  TS
请教下楼主DT和TS怎么修改启动命令和天正的(电梯)和(表格样式)冲 ...

你有没有试试操作一下?
发表于 2021-5-31 10:17:58 | 显示全部楼层
nyistjz 发表于 2021-5-30 21:54
你有没有试试操作一下?

其他的4个命令都找的到修改命令的行,这两个没有找到
发表于 2021-6-4 08:00:26 | 显示全部楼层
挺好使的,感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 00:48 , Processed in 0.190160 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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