dingtiedt 发表于 2015-7-29 11:02:47

如何获取多重引线的文字的外框大小,或右下角坐标,或行数

多重引线(mld)对齐
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=168655&fromuid=7309019

多重引线的对齐问题通过大师前辈的指点基本上解决了,还是想把间距排列也写进去,统一成一个命令。
构想一:(文本高度+间距),问题是,如何获取文字的外框大小或右下角坐标
构想二:(((文字的大小)*行数)+间距),问题是,如何获取文字的行数

再请大师指点迷津,先谢谢!



lucas_3333 发表于 2015-7-31 10:50:46

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))

dingtiedt 发表于 2015-7-29 14:11:05

无意中在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))
)
测试有用

cable2004 发表于 2015-7-29 14:20:30

能不能直接求文字的box呢?

dingtiedt 发表于 2015-7-29 14:27:37

cable2004 发表于 2015-7-29 14:20 static/image/common/back.gif
能不能直接求文字的box呢?

textbox好象只对单行文字有效,mtext的dxf里有“43多行文字图元的垂直高度”,多重引线的多行文字的却找不到。
请问你有具体的方法吗?

cable2004 发表于 2015-7-29 14:57:08

水平文字可以(vla-GetBoundingBox (vlax-ename->vla-object obj) 'Minp 'Maxp)

dingtiedt 发表于 2015-7-30 12:43:26

cable2004 发表于 2015-7-29 14:57 static/image/common/back.gif
水平文字可以(vla-GetBoundingBox (vlax-ename->vla-object obj) 'Minp 'Maxp)

谢谢你的回复。用这个测试了一下,得到的坐标是整个多重引线的左下角点和右上角,是不是用这个方法也能得到多重引线中的文字的坐标?

dingtiedt 发表于 2015-7-31 14:37:17

lucas_3333 发表于 2015-7-31 10:50 static/image/common/back.gif
LeeMac的函数可以做到




太好了,谢谢你解囊相助!

137407536 发表于 2019-4-11 18:09:56

你好,这个LM函数的代码是怎么用到CAD里边的?直接加载然后输入什么命令?
页: [1]
查看完整版本: 如何获取多重引线的文字的外框大小,或右下角坐标,或行数