明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2855|回复: 9

[源码] 文字与引线对齐

[复制链接]
发表于 2014-11-29 23:45 | 显示全部楼层 |阅读模式
1明经币
看过 llsheng_73 写的文字移动到圆心的程序,原文在http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108268

我想是不是可以改成文字移动到引线(LEADER)末端,请高手出手!

最佳答案

查看完整内容

(defun c:ttu (/ s1 s2 sstoes a b GetLeaderLastPoint h w) ;|如果有两个文字距一个引线距离一样远,会移动最后写入的那个文字 from http://bbs.mjtd.com/thread-112275-1-1.html 2014-11-30 update by Sring65|; (VL-LOAD-COM) (defun GetLeaderNearTextPoint (x a / pt ptl ang) (setq txt (entget x)) (setq a (REVERSE(entget a))) (while (/= 10 (caar a)) (setq a (cdr a)) ) ...
发表于 2014-11-29 23:45 | 显示全部楼层
(defun c:ttu (/ s1 s2 sstoes a b GetLeaderLastPoint h w)
             ;|如果有两个文字距一个引线距离一样远,会移动最后写入的那个文字
from        http://bbs.mjtd.com/thread-112275-1-1.html
        2014-11-30 update by Sring65|;

  (VL-LOAD-COM)
  (defun GetLeaderNearTextPoint        (x a / pt ptl ang)
    (setq txt (entget x))
    (setq a (REVERSE(entget a)))
    (while (/= 10 (caar a))
      (setq a (cdr a))
    )
    (setq p (cdar a))
    (if        (EQUAL '(11 0 0 0)
               (assoc 11 txt)
        )
      (setq q (assoc 10 txt))
      (setq q (assoc 11 txt))
    )
    (setq dis (distance (cdr q) p))
    (setq ang (angle p (cdadr a)))
    (setq ptl (last (textbox txt)))
    (setq n72 (cdr (assoc 72 txt)))
    (setq n73 (cdr (assoc 73 txt)))

    (if        (or (<= ang (/ pi 2)) (> ang (* pi 1.5)))
      (progn (cond ((= n72 2)
                    (setq w 0)
                   )
                   ((= n72 1)
                    (setq w -0.5)
                   )
                   (t (setq w -1))
             )
             (cond ((= n73 2)
                    (setq h 0)
                   )
                   ((= n73 3)
                    (setq h -0.5)
                   )
                   (t (setq h 0.5))
             )
      )
      (progn (cond ((= n73 2)
                    (setq h 0)
                   )
                   ((= n73 3)
                    (setq h 0.5)
                   )
                   (t (setq h -0.5))
             )
             (cond ((= n72 2)
                    (setq w -1)
                   )
                   ((= n72 1)
                    (setq w -0.5)
                   )
                   (t (setq w 0))
             )
      )
    )
    (setq p (POLAR p ang (* (car ptl) w)))
    (setq p (POLAR p (- ang (/ pi 2)) (* (cadr ptl) h)))
    (list dis q x p)
  )
  (defun SstoEs        (ss / a en lst)
    (if        ss
      (progn (setq a -1)
             (while (setq en (ssname ss (setq a (1+ a))))
               (setq lst (cons en lst))
             )
      )
    )
    lst
  )
  (prompt "请选择引线和要移的文字")
  (setq        s1 (SstoEs (ssget '((0 . "LEADER,TEXT"))))
        s2 '()
  )
  (foreach a s1
    (if        (= (vla-get-objectname (vlax-ename->vla-object a))
           "AcDbText"
        )
      (setq s1 (vl-remove a s1)
            s2 (cons a s2)
      )
    )
  )
  (foreach a s1
    (if        s2
      (entmod
        (setq b         (car (vl-sort
                        (mapcar
                          '(lambda (x)
                             (GetLeaderNearTextPoint x a)
                           )
                          s2
                        )
                        '(lambda (x y) (< (car x) (car y)))
                      )
                 )
              s2 (vl-remove (caddr b) s2)
              b         (subst        (cons (caadr b) (last b))
                        (cadr b)
                        (entget (caddr b))
                 )
        )
      )
    )
  )
  (princ)
)


本帖子中包含更多资源

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

x

点评

就是我要的哈哈,无限感激  发表于 2014-11-30 17:21
回复

使用道具 举报

 楼主| 发表于 2014-11-29 23:48 | 显示全部楼层
源码如下:


  1. (defun c:ttu(/ s1 s2 sstoes a b);|如果有两个文字距一个引线距离一样远,会移动最后写入的那个文字|;

  2.   (defun SstoEs(ss / a en lst)

  3.     (if ss(progn(setq a -1)

  4.         (while(setq en(ssname ss(setq a(1+ a))))(setq lst(cons en lst)))))

  5.     lst)

  6.   (prompt "请选择引线和要移的文字")

  7.   (setq s1(SstoEs(ssget'((0 . "LEADER,TEXT"))))s2'())

  8.   (foreach a s1

  9.     (if (=(vla-get-objectname(vlax-ename->vla-object a))"AcDbText")

  10.       (setq s1(vl-remove a s1)s2(cons a s2))))

  11.   (foreach a s1

  12.     (if s2(entmod(setq p(cdr(assoc 10(entget a)))

  13.          b(car(vl-sort(mapcar'(lambda(x)(setq b(entget x)q(if(equal'(11 0 0 0)(assoc 11 b))(assoc 10 b)(assoc 11 b)))

  14.                    (list(distance(cdr q)p)q x))s2)'(lambda(x y)(<(car x)(car y)))))

  15.          s2(vl-remove(caddr b)s2)

  16.          b(subst(cons(caadr b)p)(cadr b)(entget(caddr b)))))))

  17.   (princ)

  18.   )



文字是与引线的起点对齐,求高手修改成文字与引线末端对齐
回复

使用道具 举报

发表于 2014-11-30 14:47 | 显示全部楼层
(defun c:ttu (/ s1 s2 sstoes a b GetLeaderLastPoint h w)
             ;|如果有两个文字距一个引线距离一样远,会移动最后写入的那个文字
from        http://bbs.mjtd.com/thread-112275-1-1.html
        2014-11-30 update by Sring65|;

  (VL-LOAD-COM)
  (defun GetLeaderNearTextPoint        (x a / pt ptl ang)
    (setq txt (entget x))
    (setq a (entget a))
    (while (/= 10 (caar a))
      (setq a (cdr a))
    )
    (setq p (cdar a))
    (if        (EQUAL '(11 0 0 0)
               (assoc 11 txt)
        )
      (setq q (assoc 10 txt))
      (setq q (assoc 11 txt))
    )
    (setq dis (distance (cdr q) p))
    (setq ang (angle p (cdadr a)))
    (setq ptl (last (textbox txt)))
    (setq n72 (cdr (assoc 72 txt)))
    (setq n73 (cdr (assoc 73 txt)))

    (if        (or (<= ang (/ pi 2)) (> ang (* pi 1.5)))
      (progn (cond ((= n72 2)
                    (setq w 1)
                   )
                   ((= n72 1)
                    (setq w 0.5)
                   )
                   (t (setq w 0))
             )
             (cond ((= n73 2)
                    (setq h 0)
                   )
                   ((= n73 3)
                    (setq h -0.5)
                   )
                   (t (setq h 0.5))
             )
      )
      (progn (cond ((= n73 2)
                    (setq h 0)
                   )
                   ((= n73 3)
                    (setq h 0.5)
                   )
                   (t (setq h -0.5))
             )
             (cond ((= n72 2)
                    (setq w 0)
                   )
                   ((= n72 1)
                    (setq w 0.5)
                   )
                   (t (setq w 1))
             )
      )
    )
    (setq p (POLAR (cdadr a) ang (* (car ptl) w)))
    (setq p (POLAR p (- ang (/ pi 2)) (* (cadr ptl) h)))
    (list dis q x p)
  )
  (defun SstoEs        (ss / a en lst)
    (if        ss
      (progn (setq a -1)
             (while (setq en (ssname ss (setq a (1+ a))))
               (setq lst (cons en lst))
             )
      )
    )
    lst
  )
  (prompt "请选择引线和要移的文字")
  (setq        s1 (SstoEs (ssget '((0 . "LEADER,TEXT"))))
        s2 '()
  )
  (foreach a s1
    (if        (= (vla-get-objectname (vlax-ename->vla-object a))
           "AcDbText"
        )
      (setq s1 (vl-remove a s1)
            s2 (cons a s2)
      )
    )
  )
  (foreach a s1
    (if        s2
      (entmod
        (setq b         (car (vl-sort
                        (mapcar
                          '(lambda (x)
                             (GetLeaderNearTextPoint x a)
                           )
                          s2
                        )
                        '(lambda (x y) (< (car x) (car y)))
                      )
                 )
              s2 (vl-remove (caddr b) s2)
              b         (subst        (cons (caadr b) (last b))
                        (cadr b)
                        (entget (caddr b))
                 )
        )
      )
    )
  )
  (princ)
)


回复

使用道具 举报

 楼主| 发表于 2014-11-30 15:07 | 显示全部楼层
Sring65 发表于 2014-11-30 14:47
(defun c:ttu (/ s1 s2 sstoes a b GetLeaderLastPoint h w)
             ;|如果有两个文字距一个引线距离一样远 ...

测试不成功,引线一般都是2个、3个或者更多顶点。现在文字移动的位置不是终点
回复

使用道具 举报

 楼主| 发表于 2014-11-30 17:19 | 显示全部楼层
Sring65 发表于 2014-11-29 23:45
(defun c:ttu (/ s1 s2 sstoes a b GetLeaderLastPoint h w)
             ;|如果有两个文字距一个引线距离一样远 ...

比较不错了,是我要的。非常感谢!

唯一有一些不足的是  文字的对齐方式如果用JUSTIFYTEXT中的 ML 和MR 调整一下就更完美了
回复

使用道具 举报

发表于 2014-12-7 19:26 | 显示全部楼层
迹扬 发表于 2014-11-30 17:19
比较不错了,是我要的。非常感谢!

唯一有一些不足的是  文字的对齐方式如果用JUSTIFYTEXT中的 ML 和M ...

可以先调整好了再运行吧?
回复

使用道具 举报

发表于 2015-5-23 19:42 | 显示全部楼层
Sring65 发表于 2014-12-7 19:26
可以先调整好了再运行吧?

先试试,嘿嘿。。
回复

使用道具 举报

发表于 2018-10-28 15:52 | 显示全部楼层
为什么线不能选择,只能选择文本?
回复

使用道具 举报

发表于 2020-9-26 23:56 | 显示全部楼层
可以帮忙吧MTEXT 改为MTEXT吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 06:44 , Processed in 0.260313 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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