明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1805|回复: 18

[源码] CAD 多段线文字标注插件

[复制链接]
发表于 2024-1-29 10:13:45 | 显示全部楼层 |阅读模式
  1. (defun c:tt (/ ss ent lis)
  2.   ;多段线每段线中心标注本段线长

  3. (setq ss (ssget ":P:E" '((0 . "LWPOLYLINE"))))

  4. (setq ent (ssname ss 0))

  5. (mapcar '(lambda (x)
  6.      (entmake (list '(0 . "TEXT") '(72 . 1) '(73 . 2)
  7.         (cons 1 (car x))
  8.         (cons 10 (cadr x))
  9.         (cons 11 (cadr x))
  10.         (cons 40 2.5)
  11.         (cons 50 (last x)))))

  12. (mapcar '(lambda (x)
  13.      (list (rtos (distance (car x)
  14.          (cadr x)) 2 2) (mapcar '* '(0.5 0.5)
  15.               (mapcar '+ (car x)
  16.                 (cadr x)))
  17.      (- (rem (+ (angle (car x)
  18.            (cadr x))
  19.           (* 0.25 pi)) pi)
  20.         (* 0.25 pi))))

  21. (mapcar 'list (setq lis (mapcar 'cdr (vl-remove-if-not '(lambda (x)
  22.                 (= 10 (car x)))
  23.                (entget ent)))) (append (cdr lis)
  24.                      (list (car lis))))))

  25. (princ)

  26. )


发表于 2024-1-29 11:06:30 | 显示全部楼层
水平有限 就改成这样了
  1. (defun c:tt (/ ss ent lis)
  2.   ;多段线每段线中心标注本段线长
  3.         (setq ss (ssget ":P:E" '((0 . "LWPOLYLINE"))))
  4.         (setq ent (ssname ss 0))
  5.         (mapcar
  6.                 '(lambda (x)
  7.                          (setq pt (cadr x))
  8.                          (setq an (last x))(print an)
  9.                          (setq an (if (>= (* pi 1.5) an (* pi 0.5)) (- an pi) an))
  10.                          (setq pt (polar pt (+ an (* pi 0.5)) 2.5))
  11.                          (entmake
  12.                                  (list '(0 . "TEXT") '(72 . 1) '(73 . 2)
  13.                                          (cons 1 (car x))
  14.                                          (cons 10 pt)
  15.                                          (cons 11 pt)
  16.                                          (cons 40 2.5)
  17.                                          (cons 50 an)
  18.                                  )
  19.                          )
  20.                  )
  21.                 (mapcar
  22.                         '(lambda (x)
  23.                                  (list
  24.                                          (rtos (distance (car x) (cadr x)) 2 2)
  25.                                          (mapcar '* '(0.5 0.5) (mapcar '+ (car x) (cadr x)))
  26.                                          (- (rem (+ (angle (car x) (cadr x)) (* 0.25 pi)) pi) (* 0.25 pi))
  27.                                  )
  28.                          )
  29.                         (if (vlax-curve-isClosed ent)
  30.                                 (mapcar 'list
  31.                                         (setq lis (mapcar 'cdr (vl-remove-if-not '(lambda (x)(= 10 (car x)))(entget ent))))
  32.                                         (append (cdr lis) (list (car lis)))
  33.                                 )
  34.                                 (reverse
  35.                                         (cdr
  36.                                                 (reverse
  37.                                                         (mapcar 'list
  38.                                                                 (setq lis (mapcar 'cdr (vl-remove-if-not '(lambda (x)(= 10 (car x)))(entget ent))))
  39.                                                                 (append (cdr lis) (list (car lis)))
  40.                                                         )
  41.                                                 )
  42.                                         )
  43.                                 )
  44.                         )
  45.                 )
  46.         )
  47.         (princ)
  48. )
 楼主| 发表于 2024-1-31 08:38:06 | 显示全部楼层
本帖最后由 359321852 于 2024-1-31 08:41 编辑
飞雪神光 发表于 2024-1-29 11:06
水平有限 就改成这样了

谢谢你的帮助,
在你的基础上也做了一些修改,增加了获取文字高度,和设置
  1. (defun c:tt (/ ss ent lis)
  2. ;多段线每段线中心标注本段线长
  3.     (setq ss (ssget ":P:E" '((0 . "LWPOLYLINE"))))
  4.     (setq h1 (getvar "TEXTSIZE"));获取文本高度
  5.     (setq h (getreal (strcat "\n请键入文字高度<" (rtos h1 2 2) ">:")))
  6.   (if (null h)
  7.     (setq h h1)
  8.   )
  9.   (setvar"textsize" h);设置文本高度
  10.     (setq ent (ssname ss 0))
  11.     (mapcar
  12.         '(lambda (x)
  13.            (setq pt (cadr x))
  14.            (setq an (last x))(print an)
  15.            (setq an (if (>= (* pi 1.5) an (* pi 0.5)) (- an pi) an))
  16.            (setq pt (polar pt (+ an (* pi 0.5)) h));偏离一个文字的高度距离
  17.            (entmake
  18.                (list '(0 . "TEXT") '(72 . 1) '(73 . 2)
  19.                    (cons 1 (car x))
  20.                    (cons 10 pt)
  21.                    (cons 11 pt)
  22.                    (cons 40 h)
  23.                    (cons 50 an)
  24.                )
  25.            )
  26.        )
  27.         (mapcar
  28.             '(lambda (x)
  29.                (list
  30.                    (rtos (distance (car x) (cadr x)) 2 2)
  31.                    (mapcar '* '(0.5 0.5) (mapcar '+ (car x) (cadr x)))
  32.                    (- (rem (+ (angle (car x) (cadr x)) (* 0.25 pi)) pi) (* 0.25 pi))
  33.                )
  34.            )
  35.             (if (vlax-curve-isClosed ent)
  36.                 (mapcar 'list
  37.                     (setq lis (mapcar 'cdr (vl-remove-if-not '(lambda (x)(= 10 (car x)))(entget ent))))
  38.                     (append (cdr lis) (list (car lis)))
  39.                 )
  40.                 (reverse
  41.                     (cdr
  42.                         (reverse
  43.                             (mapcar 'list
  44.                                 (setq lis (mapcar 'cdr (vl-remove-if-not '(lambda (x)(= 10 (car x)))(entget ent))))
  45.                                 (append (cdr lis) (list (car lis)))
  46.                             )
  47.                         )
  48.                     )
  49.                 )
  50.             )
  51.         )
  52.     )
  53.     (princ)
  54. )

本帖子中包含更多资源

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

x

点评

弧线段结果是错的!  发表于 2024-2-1 13:57
发表于 2024-1-29 12:48:33 | 显示全部楼层
  1. (defun c:tt (/ ss ent lis)
  2.   (setq ss (ssget ":P:E" '((0 . "LWPOLYLINE"))))
  3.   (setq ent (ssname ss 0) th 25)
  4.   (mapcar
  5.     '(lambda (y)
  6.        (entmakeX
  7.          (list '(0 . "TEXT")
  8.                (cons 1 (car y))
  9.                (cons 10
  10.                      (polar (cadr y) (+ (last y) (* 0.5 pi)) (* th 0.5))
  11.                )
  12.                (cons 40 th)
  13.                (cons 50 (last y))
  14.          )
  15.        )
  16.      )
  17.     (MAPCAR
  18.       (FUNCTION
  19.         (LAMBDA        (X)
  20.           (SETQ        P1 (CDR (ASSOC 10 (ENTGET X)))
  21.                 P2 (CDR (ASSOC 11 (ENTGET X)))
  22.                 PP (ENTDEL X)
  23.           )
  24.           (LIST
  25.             (vl-princ-to-string (DISTANCE P1 P2))
  26.             (MAPCAR (FUNCTION (LAMBDA (E1 E2) (* 0.5 (+ E1 E2))))
  27.                     P1
  28.                     P2
  29.             )
  30.             (- (rem (+ (angle p1 p2)
  31.                        (* 0.25 pi)
  32.                     )
  33.                     pi
  34.                )
  35.                (* 0.25 pi)
  36.             )
  37.           )
  38.         )
  39.       )
  40.       (MAPCAR 'vlax-vla-object->ename
  41.               (vlax-safearray->list
  42.                 (vlax-variant-value
  43.                   (vla-Explode (vlax-ename->vla-object ENT))
  44.                 )
  45.               )
  46.       )
  47.     )
  48.   )
  49.   (princ)

  50. )
 楼主| 发表于 2024-1-29 10:23:04 | 显示全部楼层

插件有缺陷,会多出一个收尾端点的长度标注,请高手帮忙修改一下,
最好能让文字向上偏离文字的高度。

本帖子中包含更多资源

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

x
发表于 2024-1-29 11:21:16 | 显示全部楼层
这个首尾相接的函数写的真好 又涨知识了
发表于 2024-1-29 13:44:02 | 显示全部楼层
本帖最后由 xyp1964 于 2024-1-30 22:52 编辑

;;需要考虑带弧线段以及闭合的情况


  1. (defun c:tt ()
  2.   (xyp-Start)
  3.   (setq i -1)
  4.   (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  5.     (while (setq s1 (ssname ss (setq i (1+ i))))
  6.       (xyp-SubLengDimTxt s1 t 1 2)
  7.     )
  8.   )
  9.   (xyp-End)
  10. )


本帖子中包含更多资源

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

x
发表于 2024-1-29 13:56:28 | 显示全部楼层
xyp1964 发表于 2024-1-29 13:44
;;需要考虑带弧线段的情况

您的这个带弧的共享下谢谢
发表于 2024-1-29 16:28:43 | 显示全部楼层
xyp1964 发表于 2024-1-29 13:44
;;需要考虑带弧线段的情况

分享一下谢谢
发表于 2024-1-30 08:58:57 | 显示全部楼层
wangsr 发表于 2024-1-29 13:56
您的这个带弧的共享下谢谢

院长的风格,伪代码,知道吧
发表于 2024-1-30 12:25:10 | 显示全部楼层



源码:
https://gitee.com/atlisp/packages/blob/main/at-curve/at-curve.lsp
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 22:33 , Processed in 0.200146 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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