★飞飛★ 发表于 2012-8-21 10:44:29

调整文字到引线上方并自动对齐

本帖最后由 ★飞飛★ 于 2012-8-21 10:48 编辑


;;--------------------------------------------------------------------
;; 程序功能:调整文字到引线上方并自动对齐
;; 程序命令:ty
;; 程序编写:★飞飛★2012.8.12
;; 注意事项:此程序使用前,请将左向引线标注的文字左对正,右向右对正。
;;--------------------------------------------------------------------
(defun c:ty (/ selobjs ENT1 PT1 ss11 zss2 ENT2
             PT2 ss12 PT3 zg PT20 PT21 ss2 )
(setq *error* nil)
(setvar "cmdecho" 0)
(princ "\n调整文字到引线位置,请选择文字和引线:")
(while (and
(setq selobjs (ssget '((0 . "LEADER,*TEXT"))))
(setq k 0)
(setqselobjs1 (ssadd)
selobjs2 (ssadd)
)
(repeat (sslength selobjs)
    (setq en0(ssname selobjs k)
    ent0 (entget en0)
    typ(cdr (assoc 0 ent0))
    )
    (if(= typ "LEADER")
      (setq selobjs1 (ssadd en0 selobjs1))
      (setq selobjs2 (ssadd en0 selobjs2))
    )
    (setq k (1+ k))
) ;repeat
) ;and
(setvar 'osmode 0)
    (setq ENT1 (entget (ssname selobjs1 0) )
    PT1 (assoc 10 (reverse ENT1) )
    PT11 (cdr PT1)
          ss11 (cadr PT11)
    )

    (setq zss2 (ssname selobjs2 0 )
          ENT2 (entget (ssname selobjs2 0) )
          PT2(assoc 10 ENT2 )
          ss12 (cadr (cdr PT2 ))
    PT3 (assoc 40 ENT2 )
          zg (cdr PT3 )
    )

   (setq PT20 (cdr (assoc 11 ENT2 )) )
   (if (and (= 0 (car PT20)) (= 0 (cadr PT20)) )
       (setq PT21 (cdr PT2 ) )
       (setq PT21 PT20 )
   )

   (setq ss2 (polar PT11 (/ pi 2) (* zg 0.2) ))
   (if (and (= (car PT21) (car ss2)) (= (cadr PT21) (cadr ss2)) )
       (princ "所选对象已调整完成。")
       (command "move" zss2 "" PT21 ss2 )
   )
(setvar 'osmode 6907)
) ;while
(setvar "cmdecho" 1)
(princ)
)注:此程序能自动调整文字到引线上方并对齐,不足之处为只能两两选择(即一个文本对应一个引线同时选择),不能实现框选多重的文字和引线的最近捕捉搭配,这是个复杂的问题,自己很努力的去编写过但没能完成,望明经的高手们赐教!
提供思路:框选多重的文字和引线对象后,第一层循环为分别找出所有引线端点坐标,第二层循环为分别计算所有文本端点坐标,并用第1个文本的端点去一一匹配引线端点坐标,如文本端点Y坐标距某引线端点Y坐标为最小,则此文本与此引线配对;接着用第2个文本的端点去一一匹配引线端点坐标,如文本端点Y坐标距某引线端点Y坐标为最小,则此文本与此引线配对……如此循环下去,直到所有的文本与最近的引线配对完成后退出。

sx147 发表于 2012-8-26 12:52:34

xyp1964 发表于 2012-8-26 08:47 static/image/common/back.gif


这个看着很牛

xyp1964 发表于 2012-8-26 08:47:27

無恒的地盘 发表于 2012-8-22 12:50:18

(defun c:dqw ()
(prompt "\n选择文字或属性块:")
(setq ent (entsel "\n 选择:"))
(setq ent1 (cdr (assoc 10 (entget (car ent)))))
(prompt "\n选择引线:")
(setq ent2 (vla-get-Coordinates (vlax-ename->vla-object (car (entsel)))))
(setq ent2 (vlax-safearray->list (vlax-variant-value ent2)))
(setq ent3 (repeat (- (length ent2) 3) (setq ent2 (cdr ent2))))
(command ".copy" ent "" ent1 ent3)
)

我也是写了一个,不过也是只能两个对齐。

★飞飛★ 发表于 2012-8-21 10:56:09

本帖最后由 ★飞飛★ 于 2012-8-21 11:14 编辑

文字调整前:                                          文字调整后:

fanqinwei 发表于 2012-8-22 07:36:08

楼主,得考虑一下几行文字与一条线对齐时,如何使用。

★飞飛★ 发表于 2012-8-22 18:17:52

fanqinwei 发表于 2012-8-22 07:36 static/image/common/back.gif
楼主,得考虑一下几行文字与一条线对齐时,如何使用。

通常引线标注的时候都是一行文字上引线上方或一行文字在上方一行文字在下方这两种情况的,如遇几行文字的情况就最好用另外一程序了。

vvcd 发表于 2012-8-26 01:27:15

呵呵,顶一个,谢谢了

★飞飛★ 发表于 2012-8-27 13:57:43

xyp1964 发表于 2012-8-26 08:47 static/image/common/back.gif


这个有点眼晕,可否上传一下原码,大家共同研究研究学习学习啊。

xyp1964 发表于 2012-8-27 14:05:25

★飞飛★ 发表于 2012-8-27 13:57 static/image/common/back.gif
这个有点眼晕,可否上传一下原码,大家共同研究研究学习学习啊。

;; 伪源码需要e派工具箱(XCAD)的支持,程序仅针对特殊的图层文字进行处理。





页: [1] 2 3
查看完整版本: 调整文字到引线上方并自动对齐