明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3040|回复: 11

[源码] 文字齐线修改版

[复制链接]
发表于 2014-12-24 20:59:42 | 显示全部楼层 |阅读模式
本帖最后由 vectra 于 2014-12-24 21:16 编辑

支持单行及多行文字,直线及多段线,仅修改文字角度,对位置不做处理。

修改自 wzg356 http://bbs.mjtd.com/thread-112540-1-1.html

借用他人代码,不参加悬赏,故另开一贴
做标注程序时很有用的代码,发在这里做个备份。

  1. (defun c:tt (/ picksegendpt en1 en2 enl1 enl2 p1 p1p2 p2 p3)
  2.   (defun picksegendpt (obj p / n)
  3.     (setq p (vlax-curve-getclosestpointto obj (trans p 1 0))
  4.     n (fix (vlax-curve-getparamatpoint obj p))
  5.     )
  6.     (list (vlax-curve-getpointatparam obj n)
  7.     (vlax-curve-getpointatparam obj (1+ n))
  8.     )
  9.   )

  10.   (while
  11.     (not
  12.       (and
  13.   (setq en1 (entsel "\n选择单行或多行文字:"))
  14.   (wcmatch (cdr (assoc 0 (setq enl1 (entget (car en1)))))
  15.      "*TEXT"
  16.   )
  17.       )
  18.     )
  19.   )
  20.   (while
  21.     (not
  22.       (wcmatch
  23.   (cdr
  24.     (assoc 0
  25.      (setq
  26.        enl2  (entget
  27.         (car (setq en2 (entsel "\n选择要对齐的直线:")))
  28.       )
  29.      )
  30.     )
  31.   )
  32.   "*LINE"
  33.       )
  34.     )
  35.   )

  36.   (setq p3 (cadr en2))

  37.   (if (= (cdr (assoc 0 enl2)) "LINE")
  38.     (setq p1 (cdr (assoc 10 enl2))
  39.     p2 (cdr (assoc 11 enl2))
  40.     )
  41.     (setq p1p2 (picksegendpt (car en2) p3)
  42.     p1   (car p1p2)
  43.     p2   (cadr p1p2)
  44.     )
  45.   )

  46.   (if (<= (distance p3 p1) (distance p3 p2))
  47.     (setq enl1 (subst (cons 50 (angle p1 p2)) (assoc 50 enl1) enl1))
  48.     (setq enl1 (subst (cons 50 (angle p2 p1)) (assoc 50 enl1) enl1))
  49.   )
  50.   (entmod enl1)
  51.   (princ)
  52. )

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 圣诞快乐!

查看全部评分

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

本帖被以下淘专辑推荐:

发表于 2014-12-26 10:06:39 | 显示全部楼层
xiaobaixiaobu 发表于 2014-12-25 10:02
要是能做到这样就好了!!


  1. ;;  通用grread定义
  2. (defun ZML-GRREAD (LST / TEST TMP MODE VAL TMP2)
  3.     (setq TEST t)
  4.     (while TEST
  5.   (setq TMP  (grread 2)
  6.         MODE (car TMP)
  7.         VAL  (cadr TMP)
  8.   )
  9.   (cond ((= MODE 2)
  10.          (if (and  (setq TMP2 (assoc MODE LST))
  11.       (setq TMP2 (cdr TMP2))
  12.       (setq TMP2 (assoc VAL TMP2))
  13.        )
  14.        (eval (cons 'progn (cdr TMP2)))
  15.        ()
  16.          )
  17.         )
  18.         ((setq TMP2 (assoc MODE LST))
  19.          (eval (cons 'progn (cdr TMP2)))
  20.         )
  21.         (t (princ TMP))
  22.   )
  23.     )
  24. )
  25. ;;;========================================================
  26. ;;;文字随线(角度随线的)
  27. (vl-load-com)
  28. (defun C:ts (/ tt-01 tt-02 LST)
  29.     ;;===============
  30.     ;;功能:计算计算距给定点位最近的线上点 和 线上点的前进方位角
  31.     ;;参数:EN_LINE -----线的图元名称
  32.     ;;           PT -----给定点位
  33.     ;;返回:距点最近的线上点 和 线上点的方位角
  34.     (defun TT-01 (EN_LINE PT / OBJ PT1 LST ANG)
  35.   ;;将图元名转换为 VLA对象
  36.   (setq OBJ (vlax-ename->vla-object EN_LINE))
  37.   ;;距pt最近的曲线上的点pt1
  38.   (setq PT1 (vlax-curve-getclosestpointto OBJ PT))
  39.   ;;pt1点的切线方向矢量
  40.   (setq LST (vlax-curve-getfirstderiv
  41.           OBJ
  42.           (vlax-curve-getparamatpoint
  43.         OBJ
  44.         PT1
  45.           )
  46.       )
  47.   )
  48.   ;;计算切线方位角
  49.   (setq ANG (atan (/ (cadr LST) (car LST))))
  50.   ;;返回
  51.   (list PT1 ANG)
  52.     )
  53.     ;;===============
  54.     ;;功能:设置文字对象位置及角度
  55.     (defun TT-02 (EN_TEXT PT ANG / ENT)
  56.   (setq ENT (entget EN_TEXT))
  57.   (setq ENT (subst (cons 10 PT) (assoc 10 ENT) ENT)
  58.         ENT (subst (cons 11 PT) (assoc 11 ENT) ENT)
  59.         ENT (subst (cons 50 ANG) (assoc 50 ENT) ENT)
  60.   )
  61.   (entmod ENT)

  62.     )
  63.     ;;===============
  64.     (if  (and
  65.       ;;
  66.       (setq SS (entsel "\n点取线: "))
  67.       (setq EN_LINE (car SS))
  68.       (setq ENT_LINE (entget EN_LINE))
  69.       (wcmatch (cdr (assoc 0 ENT_LINE))
  70.          "LINE,ARC,LWPOLYLINE,SPLINE"
  71.       )
  72.       ;;
  73.       (setq SS (entsel "\n点取文字: "))
  74.       (setq EN_TEXT (car SS))
  75.       (setq ENT_TEXT (entget EN_TEXT))
  76.       (wcmatch (cdr (assoc 0 ENT_TEXT)) "TEXT,MTEXT")

  77.   )
  78.   (progn
  79.       (setq LST
  80.          (list '(5
  81.            ;;
  82.            (setq
  83.             TMP
  84.             (TT-01 EN_LINE VAL)
  85.             PT1
  86.             (car TMP)
  87.             ANG
  88.             (cadr TMP)
  89.            )
  90.            ;;
  91.            (TT-02 EN_TEXT VAL ANG)
  92.              (vlax-get-property (vlax-ename->vla-object EN_text) 'InsertionPoint )
  93.            ;;
  94.            (redraw)
  95.            (grdraw VAL PT1 1)
  96.           )
  97.          ;;左击
  98.          '
  99.           (3
  100.            (redraw)
  101.            (setq TEST NIL)
  102.           )
  103.          '(25
  104.            (redraw)
  105.            (setq TEST NIL)
  106.           )
  107.          '(11
  108.            (redraw)
  109.            (setq TEST NIL)
  110.           )
  111.          )
  112.       )
  113.       (ZML-GRREAD LST)
  114.   )
  115.     )
  116.     (princ)
  117. )


看看这组代码是不是阁下想要的结果。

本帖子中包含更多资源

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

x

点评

经测试,2010版不能旋转角度啊  发表于 2017-12-31 08:11
回复 支持 1 反对 0

使用道具 举报

发表于 2014-12-25 08:20:02 | 显示全部楼层
只对直线有效么?
发表于 2014-12-25 08:28:33 | 显示全部楼层
代码简洁易懂,十分感谢楼主
发表于 2014-12-25 09:55:27 | 显示全部楼层
十分感谢楼主分享,多段线也能用~~
发表于 2014-12-25 10:02:28 | 显示全部楼层
要是能做到这样就好了!!

本帖子中包含更多资源

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

x
发表于 2017-11-16 15:27:34 | 显示全部楼层
不错,支持一下。
发表于 2018-1-16 12:45:15 | 显示全部楼层
这个很不错,感谢分享
发表于 2021-11-28 21:16:53 | 显示全部楼层
newbuser 发表于 2014-12-26 10:06
看看这组代码是不是阁下想要的结果。

目前我用过最好的文字齐线插件,谢谢,非常感谢,收藏。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:31 , Processed in 0.259075 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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