如何获取多重引线的文字的外框大小,或右下角坐标,或行数
多重引线(mld)对齐http://bbs.mjtd.com/forum.php?mod=viewthread&tid=168655&fromuid=7309019
多重引线的对齐问题通过大师前辈的指点基本上解决了,还是想把间距排列也写进去,统一成一个命令。
构想一:(文本高度+间距),问题是,如何获取文字的外框大小或右下角坐标
构想二:(((文字的大小)*行数)+间距),问题是,如何获取文字的行数
再请大师指点迷津,先谢谢!
dingtiedt 发表于 2015-7-29 14:11 static/image/common/back.gif
无意中在G版提供的lee-mac的页面看到了 “string to list”,正符合其中的一个构想,先取得多重引线的多行文 ...
LeeMac的函数可以做到
;; MLeader Textbox-Lee Mac
(defun LM:mleadertextbox ( ent / bpt enx hgt jus lst mat org prp rot wid )
(if (= acmtextcontent (cdr (assoc 172 (reverse (setq enx (entget ent))))))
(progn
(setq prp (list (cons 40 (cdr (assoc 41 enx)))
(cons 07 (cdr (assoc 02 (entget (cdr (assoc 340 enx))))))
)
lst (vl-remove-if 'null
(mapcar
'(lambda ( str / box )
(if (setq box (textbox (cons (cons 1 str) prp)))
(mapcar '- (cadr box) (car box))
)
)
(LM:str->lst (cdr (assoc 304 enx)) "\\P")
)
)
bpt (trans (cdr (assoc 12 enx)) 0 (cdr (assoc 11 enx)))
rot (cdr (assoc 042 enx))
jus (cdr (assoc 171 enx))
wid (apply 'max (mapcar 'car lst))
hgt (+ (apply '+ (mapcar 'cadr lst)) (* 0.68 (cdr (assoc 45 enx)) (1- (length lst))))
org (list (cond ((member jus '(2 5 8)) (/ wid -2.0)) ((member jus '(3 6 9)) (- wid)) (0.0))
(cond ((member jus '(1 2 3)) (- hgt)) ((member jus '(4 5 6)) (/ hgt -2.0)) (0.0))
)
mat (list
(list (cos rot) (sin (- rot)) 0.0)
(list (sin rot) (cos rot) 0.0)
'(0.0 0.0 1.0)
)
)
(mapcar '(lambda ( p ) (mapcar '+ (mxv mat p) bpt))
(list org
(mapcar '+ org (list wid 0))
(mapcar '+ org (list wid hgt))
(mapcar '+ org (list 0 hgt))
)
)
)
)
)
;; String to List-Lee Mac
(defun LM:str->lst ( str del / pos )
(if (setq pos (vl-string-search del str))
(cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del))
(list str)
)
)
(defun mxv ( m v )
(mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
)
_$ (setq e (ssget "_+.:E:S" '((0 . "MULTILEADER"))))
(setq e (ssname e 0))
(LM:mleadertextbox e)
<Selection set: 383>
<Entity name: 7ee384f8>
((1920.97 605.151 0.0) (1947.5 605.151 0.0) (1947.5 609.285 0.0) (1920.97 609.285 0.0)) 无意中在G版提供的lee-mac的页面看到了 “string to list”,正符合其中的一个构想,先取得多重引线的多行文字的字符串,再按 "\\" 为界分段取字符串,最后用length求得数目,就是“行数”;; String to List-Lee Mac
;; Separates a string using a given delimiter
;; str - String to process
;; del - Delimiter by which to separate the string
;; Returns: List of strings
(defun LM:str->lst ( str del / len lst pos )
(setq len (1+ (strlen del)))
(while (setq pos (vl-string-search del str))
(setq lst (cons (substr str 1 pos) lst)
str (substr str (+ pos len))
)
)
(reverse (cons str lst))
)
测试有用
能不能直接求文字的box呢? cable2004 发表于 2015-7-29 14:20 static/image/common/back.gif
能不能直接求文字的box呢?
textbox好象只对单行文字有效,mtext的dxf里有“43多行文字图元的垂直高度”,多重引线的多行文字的却找不到。
请问你有具体的方法吗?
水平文字可以(vla-GetBoundingBox (vlax-ename->vla-object obj) 'Minp 'Maxp) cable2004 发表于 2015-7-29 14:57 static/image/common/back.gif
水平文字可以(vla-GetBoundingBox (vlax-ename->vla-object obj) 'Minp 'Maxp)
谢谢你的回复。用这个测试了一下,得到的坐标是整个多重引线的左下角点和右上角,是不是用这个方法也能得到多重引线中的文字的坐标? lucas_3333 发表于 2015-7-31 10:50 static/image/common/back.gif
LeeMac的函数可以做到
太好了,谢谢你解囊相助! 你好,这个LM函数的代码是怎么用到CAD里边的?直接加载然后输入什么命令?
页:
[1]