明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2230|回复: 18

[测绘] 文本标注封闭多段线的边长和面积

[复制链接]
发表于 2023-2-15 17:26 | 显示全部楼层 |阅读模式
首先感谢前辈们的函数。这个是用前辈的函数东拼西凑起来的功能。

还需要完善,角度相同的两段边长可以合并标注,两节点重合的多余节点删除,异形的图形面积不在圈内等等。
小白一个,凑个贴子数
  1. (vl-load-com)
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;函数部分
  3. (setq *ACAD*  (vlax-get-acad-object)
  4.       *DOC*   (vla-get-ActiveDocument *ACAD*)
  5.       *DOCS*  (vla-get-Documents *ACAD*)
  6.       *MS*    (vla-get-modelSpace *DOC*))
  7. (defun C:bbc( / osmbak all pianyiliang zigao i ent obj1 lst n m p1 p2 an ds zxd bpt js)
  8. (setvar "dimzin" 0)
  9. (setq osmbak(getvar "osmode"))
  10. (setvar "osmode" 0 )
  11. (setq all (ssget '((0 . "LWPOLYLINE,POLYLINE"))));;获取多线段图元
  12. (setq pianyiliang 0.30);;设置偏移量
  13. (setq zigao 0.5);;;设置字高
  14. (LayerExist "bc");;;创建bc图层
  15. (setq i 0)
  16. (repeat (sslength all)
  17.   (setq ent (ssname all i));;取得图元名
  18.    (setq obj1 (vlax-ename->vla-object ent));;;多线段的对象属性
  19.                   (entmake
  20.                   (list '(0 . "TEXT")
  21.                   (cons 1 (rtos (vla-get-area obj1) 2 2));;;(vla-get-area obj)提取到面积属性
  22.                   (cons 10 (GetCentroid ent));;;(GetCentroid ent)质心点坐标,未采用几何中心
  23.                   (cons 40 (* zigao 1.3))
  24.                   (cons 11 (GetCentroid ent))
  25.                   (cons 72 1)
  26.                   (cons 73 2)
  27.                   (cons 7 "宋体")
  28.                   (cons 8 "bc")
  29.                   ;(cons 50 an)   
  30.                   ))
  31.          (setq lst (mqb:getpt ent));;取得坐标点表
  32.    (setq n 0)
  33.    (setq m(length lst))
  34.     (repeat m
  35. ;;;;(nth(rem(+ i(setq m(length lst)))m)lst)取列表第i个元素,主要用在首尾衔接
  36.        (setq p1 (nth(rem(+ n m)m)lst))
  37.        (setq n(+ 1 n))
  38.        (setq p2 (nth(rem(+ n m)m)lst))
  39.        (setq an (angle p1 p2))
  40.        (setq ds (distance p1 p2))
  41.        (setq zxd (polar p1 an (* ds 0.5)))
  42.        (if (and (> an 1.62316)(< an 4.76475))
  43.            (setq an(+ an pi))
  44.        )
  45.       (setq bpt(polar zxd (+ an 1.5708) pianyiliang))      
  46.        (if (PtInPts lst bpt)
  47.          (entmake
  48.                   (list '(0 . "TEXT")
  49.                   (cons 1 (rtos ds 2 2))
  50.                   (cons 10 bpt)
  51.                   (cons 40 zigao)
  52.                   (cons 11 bpt)
  53.                   (cons 72 1)
  54.                   (cons 73 2)
  55.                   (cons 7 "宋体")
  56.                   (cons 8 "bc")
  57.                   (cons 50 an)   
  58.                  ))
  59.          (progn
  60.           (setq bpt(polar zxd (- an 1.5708) pianyiliang))
  61.             (entmake
  62.                   (list '(0 . "TEXT")
  63.                   (cons 1 (rtos ds 2 2))
  64.                   (cons 10 bpt)
  65.                   (cons 40 zigao)
  66.                   (cons 11 bpt)
  67.                   (cons 72 1)
  68.                   (cons 73 2)
  69.                   (cons 7 "宋体")
  70.                   (cons 8 "bc")
  71.                   (cons 50 an)   
  72.                  ))
  73.          ))
  74.       (setq js (append js (list an ds)))
  75.     )
  76.   (setq i(+ 1 i))
  77. )
  78. ;(setq js nil)
  79. ;( * 0.5 pi)
  80. ;(angtof "273")
  81. ;(angtos 2.3)
  82. (setvar "osmode" osmbak)
  83. )

  84. ;;146 [功能] 质心
  85. ;;示例 (GetCentroid (car(entsel)))
  86. (defun GetCentroid (poly / AXERR CEN PL REG VA)
  87.    (setq pl  (vlax-ename->vla-object poly);;(setq pl (*En2Obj* poly)
  88.         va (vlax-make-safearray vlax-vbObject '(0 . 0))
  89.   )
  90.   (vlax-safearray-put-element va 0 pl)
  91.   (setq axErr (VL-CATCH-ALL-APPLY 'vla-addregion (list *MS* va)))
  92.   (if (VL-CATCH-ALL-ERROR-P axErr)
  93.     nil
  94.     (progn
  95.       (setq reg (car (vlax-safearray->list (vlax-variant-value axErr)))
  96.             cen (vla-get-centroid reg)
  97.       )
  98.       (vla-delete reg)
  99.       (vlax-safearray->list (vlax-variant-value cen))
  100.     )
  101.   )
  102. )  

  103. ;;获取坐标函数  图元名
  104. (defun mqb:getpt(getptss / ptlst)
  105. (setq ptlst (vl-remove-if 'not (mapcar '(lambda (x) (if (= (car x) 10) (cdr x))) (entget getptss))))
  106. )
  107. ;; 判断图层是否存在(不存在则创建);;(LayerExist "dim")
  108. (defun LayerExist (LayerName)
  109.   (if (tblobjname "LAYER" LayerName) ;(tblsearch "LAYER" "3")也可判断图层3是否存在
  110.     nil
  111.     (entmake (list
  112.         '(0 . "LAYER")
  113.         '(100 . "AcDbSymbolTableRecord")
  114.         '(100 . "AcDbLayerTableRecord")
  115.      ;'(6 . "CONTINUOUS") ;线型
  116.      ;'(62 . 3)   ;颜色
  117.         '(70 . 0)  ;图层状态
  118.         (cons 2 LayerName) ;图层名
  119.       )
  120.     )
  121.   )
  122. )
  123. ;;以文字中心位置输出函数
  124. (defun mqb:EntmakeText (PT STR Textheigh);以文字中心位置输出函数
  125.   (entmake
  126.     (list '(0 . "TEXT")
  127.    (cons 1 str)
  128.    (cons 10 pt)
  129.    (cons 40 Textheigh)
  130.    (cons 11 pt)
  131.    (cons 72 1)
  132.    (cons 73 2)
  133.    (cons 7 "宋体")   
  134.     )
  135.   )
  136. )
  137. ;;[功能] pt是否在点集包围范围内
  138. (defun PtInPts (pts pt / P1 P2)
  139.   (setq
  140.     pts (MAPCAR
  141.    '(LAMBDA (p1 p2) (REM (- (ANGLE pt p1) (ANGLE pt p2)) PI))
  142.    (CONS (LAST pts) pts)
  143.    pts
  144. )
  145.   )
  146.   (equal (ABS (APPLY '+ pts)) PI 1e-8)
  147. )
  148. ;生成文字样式
  149. (defun mqb:create-st (/ textstyles textstyle)
  150.   (setq textstyles (vla-get-textstyles *DOC*))
  151.   ;(setq textstyle1 (vla-add textstyles "方正中等线_GBK"))
  152.   ;(setq textstyle2 (vla-add textstyles "方正细等线简体"))
  153.   ;(setq textstyle3 (vla-add textstyles "方正中等线简体"))
  154.   (setq textstyle4 (vla-add textstyles "宋体"))
  155.   ;(vla-setfont textstyle1 "方正中等线_GBK" :vlax-false :vlax-false 1 0)
  156.   ;(vla-setfont textstyle2 "方正细等线简体" :vlax-false :vlax-false 1 0)
  157.   ;(vla-setfont textstyle3 "方正中等线简体" :vlax-false :vlax-false 1 0)
  158.   (vla-setfont textstyle4 "宋体" :vlax-false :vlax-false 1 0)
  159.   (setvar "cmdecho" 0)
  160.   (vl-cmdf "_.style" "" "" "" "1.0" "" "" "" "")
  161.   (princ)
  162.   )
  163. (mqb:create-st)


  164. (DEFUN C:6(/ osmbak txth p1 p2 p3 d1 a1 a2 p4 p5) ;单线标注
  165. (command "layer" "m" "0" "")
  166.                     (setq osmbak(getvar "osmode"))
  167.                     (setvar "osmode" 1 )
  168.                     ;(setq txth (getreal "输入注记字高:"))
  169.                     (setq p1 ( getpoint "\n      点一下起点: "))
  170.                     (setq p2 ( getpoint p1 "\n       点一下终止点: "))
  171.                     (setvar "osmode" 0)
  172.                     (setq p3 ( getpoint p2 "\n     点取标注点:"))
  173.                     (setq d1 ( distance p1 p2 ))
  174. (setq txth(+ 0.25 (* d1 0.003)))
  175.                     (setq a1 ( angle p2 p1 ))
  176.                     (setq a2 ( angle p2 p3 ))
  177.                     (setq p4 ( polar p1 (- a1 pi ) (/ d1 2 )))
  178.                     (if ( <= a2 a1 )
  179.                         ( setq p5 ( polar p4 ( - a1 (/ pi 2)) (+ 0.05 (* txth 0.5))))
  180.                            )
  181.                     (if ( >= a2 a1 )
  182.                         ( setq p5 ( polar p4 ( + a1 (/ pi 2)) (+ 0.05 (* txth 0.5))))
  183.                              )
  184.   (LayerExist "bc")
  185. (entmake
  186.     (list '(0 . "TEXT")
  187.    (cons 1 (rtos d1 2 2))
  188.    (cons 10 p5)
  189.    (cons 40 txth)
  190.    (cons 11 p5)
  191.    (cons 72 1)
  192.    (cons 73 2)
  193.    (cons 7 "宋体")
  194.    (cons 8 "bc")
  195.    (cons 50 (- a1 pi))   
  196.     ))
  197.                     (setvar "osmode" osmbak)
  198.                     (princ)
  199.                     )

评分

参与人数 2明经币 +2 金钱 +50 收起 理由
bssurvey + 1 + 50 赞一个!
tigcat + 1 很给力!

查看全部评分

 楼主| 发表于 2023-2-16 11:32 | 显示全部楼层
kfh 发表于 2023-2-15 22:09
字体高度怎么设置?

我自己用的小工具,不需要改字高所以没有加设置的功能,你不经常改字高的话可以把
(setq pianyiliang 0.30);;设置偏移量
(setq zigao 0.5);;;设置字高,这两行代码删掉
不经常改字高的话就写
(if (= shezhizg nil) (setq zigao 0.5)(setq zigao shezhizg))
(setq pianyiliang (* zigao 0.6))
想改字高时就在命令行里输入(setq shezhizg *字高的数字值*)
改的特别频繁的话你就改成
(setq zigao (getreal "请输入字高:"))
(setq pianyiliang (* zigao 0.6))
这样每次标注前会提示输入字高
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-2-17 09:32 | 显示全部楼层
BHL-DONG 发表于 2023-2-17 09:25
不知道为啥,我是按ctrl+a复制的,加载进去就显示语法错误,不过楼主你发的就没有问题

复制代码时我也遇到过,最常见的有两点
1、复制选择时,代码最末尾的括号给漏掉了。
2、粘贴到编辑器里时有时是中文输入状态,括号那些符号是中文的符号,代码就报错。
 楼主| 发表于 2023-2-15 17:30 | 显示全部楼层
效果图看不到

本帖子中包含更多资源

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

x
发表于 2023-2-15 19:11 | 显示全部楼层
感谢大佬分享~
发表于 2023-2-15 22:09 | 显示全部楼层
字体高度怎么设置?
发表于 2023-2-16 09:41 | 显示全部楼层
加载进cad显示语法错误
 楼主| 发表于 2023-2-16 11:38 | 显示全部楼层
BHL-DONG 发表于 2023-2-16 09:41
加载进cad显示语法错误

也许是你没有复制完整吧

本帖子中包含更多资源

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

x
发表于 2023-2-16 12:46 | 显示全部楼层
感谢大佬分享~
发表于 2023-2-17 09:25 | 显示全部楼层
ht1480 发表于 2023-2-16 11:38
也许是你没有复制完整吧

不知道为啥,我是按ctrl+a复制的,加载进去就显示语法错误,不过楼主你发的就没有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 14:55 , Processed in 3.134940 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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