本帖最后由 ★飞飛★ 于 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)
- (setq selobjs1 (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坐标为最小,则此文本与此引线配对……如此循环下去,直到所有的文本与最近的引线配对完成后退出。
|