明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2958|回复: 13

[提问] 请大神优化批量修改集中标注行距的程序

[复制链接]
发表于 2016-2-1 13:25 | 显示全部楼层 |阅读模式
本帖最后由 tumu2008323 于 2016-2-1 13:27 编辑

我改写了一个批量修改行距的插件,由于刚开始学,写的比较粗糙,比较啰嗦,目前还有几个bug,文字超出引线时,不能修改引线长度,还有一

项三种不能修改行距,请大神帮忙优化
  1. ;;;  ====================================
  2. ;;;  天若有情007 tumu2008323@163.com
  3. ;;;  其中,引用了Lee Mac的修改行距以及最小包围圈为子程序
  4. ;;;  
  5. ;;;  ===============================
  6. ;;;  改集中标注行距,行距默认为1.2
  7. ;;;  命令:ghj
  8. ;;;  by 天若有情007 2016/02/01 V1.0
  9. ;;;           
  10. ;;;

  11. (defun c:ghj(/ ss ssl i j en enl enl_data en_data ptj dd ss_hj pt10 pt11 en_brh pthj1 pthj3 ptbrh1 ptbrh3)
  12.   (ycz_StoreSysVar)
  13.   (ycz_ChangeSysVar)
  14.   (command "undo" "be")
  15.   (setq jzbz_layer "S-BEAMCD-X-ANNO,S-BEAMCD-Y-ANNO");集中标注图层
  16.   ;(setq LAYER_NEW "S-COMM-ELV")
  17.   (prompt "\n<<批量选择集中标注:>>")  
  18.   (setq ss (ssget (list (cons 0 "TEXT") (cons 8 jzbz_layer))));集中标注
  19.   (prompt "\n<<批量选择引线:>>")
  20.   (setq ssl (ssget (list (cons 0 "LINE") (cons 8 jzbz_layer)));引线
  21.         i 0
  22.         ss_hj (ssadd)  
  23.   )
  24.   (if ssl
  25.     (repeat (sslength ssl)
  26.       (setq enl (ssname ssl i)
  27.             j 0
  28.             enl_data (entget enl)
  29.             pt10 (cdr (assoc 10 enl_data))
  30.             pt11 (cdr (assoc 11 enl_data))
  31.       )                    
  32.       
  33.       ;(setq ss2 ss)
  34.       (repeat (sslength ss);文字循环查找
  35.         (setq en (ssname ss j)
  36.               en_data (entget en)
  37.         )              
  38.         (ycz_dist);求文字到引线的距离
  39.         (if ptj;如果交点存在
  40.           (progn
  41.             (if (< dd 200)
  42.               (progn
  43.                 (setq ss_hj (ssadd en ss_hj)
  44.                       ss (ssdel en ss);如果已经循环过,则从ss中删除,但是好像有问题
  45.                       j (1- j)
  46.                 )
  47.               )
  48.             )
  49.           )
  50.                   
  51.         )
  52.         (setq j (1+ j))
  53.         
  54.       )
  55.       (if ss_hj
  56.         (Lee_hj)
  57.       )
  58.       (if ss_hj
  59.         (progn
  60.           (LEE_BRH)
  61.           (setq en_brh (entlast))
  62.           ;(ycz_rect en_brh)
  63.           (setq pthj1 (vlax-curve-getclosestpointto en_brh pt10)
  64.                 pthj3 (vlax-curve-getclosestpointto en_brh pt11)
  65.                 ptbrh1 (vlax-curve-getclosestpointto enl pthj1)
  66.                 ptbrh3 (vlax-curve-getclosestpointto enl pthj3)
  67.                 dd1 (distance pt10 pthj1)
  68.                 dd3 (distance pt11 pthj3)            
  69.           )
  70.           (entdel en_brh)
  71.           (if(< dd1 dd3)
  72.             (progn                          
  73.               (setq enl_data (subst (cons 10 ptbrh1) (assoc 10 enl_data) enl_data))
  74.               (entmod enl_data)            
  75.                            
  76.             )
  77.             (progn
  78.               (setq enl_data (subst (cons 11 ptbrh3) (assoc 11 enl_data) enl_data))
  79.               (entmod enl_data)  
  80.             )
  81.           )
  82.          
  83.          
  84.         )
  85.         
  86.       )
  87.       
  88.       
  89.       (setq i (1+ i))
  90.       (setq ss_hj (ssadd))
  91.     )
  92.   )
  93.   (command "undo" "e")
  94.   (ycz_RestoreSysVar)  
  95.   (prin1)
  96. )

  97. (defun ycz_StoreSysVar()
  98.   (setq vcmde (getvar "cmdecho"))  ;普通命令的提示
  99.   (setq vblip (getvar "blipmode")) ;光标痕迹
  100.   (setq vclay (getvar "CLAYER"))   ;图层
  101.   (setq vosmo (getvar "osmode"))   ;捕捉模式
  102.   (setq vplwd (getvar "plinewid")) ;pl宽度
  103.   (setq Vlupr (getvar "luprec"))   ;长度精度
  104.   (setq vlayer (getvar "clayer"))  ;图层
  105.   (prin1)
  106. )
  107. (defun ycz_ChangeSysVar()
  108.   (setvar "cmdecho" 0);关闭命令响应
  109.   (setvar "osmode" 0);关闭捕捉
  110.   (command "ortho" 0);关闭正交
  111.   (prin1)
  112. )
  113. ;还原系统变量
  114. (defun ycz_RestoreSysVar()
  115.   (setvar "cmdecho" vcmde)
  116.   (setvar "blipmode" vblip)
  117.   (setvar "CLAYER" vclay)
  118.   (setvar "osmode" vosmo)
  119.   (setvar "plinewid" vplwd)
  120.   (setvar "luprec" Vlupr)
  121.   (command "ortho" 1)
  122.   (setvar "clayer" vlayer)
  123.   (prin1)
  124. )

  125. ;求文字到直线距离
  126. (defun ycz_dist ()
  127.   (command "ucs" "e" en)
  128.   (setq  box (textbox en_data)
  129.     p1  (car box)
  130.     p1 (trans p1 1 0)   
  131.   )
  132.   (command "ucs" "")
  133.   (setq ptj (vlax-curve-getclosestpointto enl p1))
  134.   (setq dd (distance p1 ptj))
  135.   (prin1)
  136. )

  137. ;Lee的改行距程序
  138. (defun Lee_hj ( / *error* bpt enx inc ins lst sel spf vec )

  139.     (setq spf 1.2) ;; 行距因子

  140.     (defun *error* ( msg )
  141.         (LM:endundo (LM:acdoc))
  142.         (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  143.             (princ (strcat "\nError: " msg))
  144.         )
  145.         (princ)
  146.     )
  147.     (setq inc (sslength ss_hj)
  148.                   enx (entget (ssname ss_hj (1- inc)))
  149.                   spf (polar '(0.0 0.0) (+ (cdr (assoc 50 enx)) (/ pi 2.0)) (* (cdr (assoc 40 enx)) spf))
  150.                   vec (trans spf (trans '(0.0 0.0 1.0) 1 0 t) 0)
  151.      )
  152.             (repeat inc
  153.                 (setq lst (cons (entget (ssname ss_hj (setq inc (1- inc)))) lst)
  154.                       ins (cons (caddr (trans (aligntext:gettextinsertion (car lst)) (cdr (assoc -1 (car lst))) vec)) ins)
  155.                 )
  156.             )
  157.             (setq lst (mapcar '(lambda ( n ) (nth n lst)) (vl-sort-i ins '>))
  158.                   bpt (aligntext:gettextinsertion (car lst))
  159.             )
  160.             (LM:startundo (LM:acdoc))
  161.             (foreach itm (cdr lst)
  162.                 (aligntext:puttextinsertion (setq bpt (mapcar '- bpt spf)) itm)
  163.             )
  164.             (LM:endundo (LM:acdoc))

  165.   

  166.     (princ)
  167. )

  168. (defun aligntext:getdxfkey ( enx )
  169.     (if
  170.         (and
  171.             (zerop (cdr (assoc 72 enx)))
  172.             (zerop (cdr (assoc 73 enx)))
  173.         )
  174.         10 11
  175.     )
  176. )

  177. (defun aligntext:gettextinsertion ( enx )
  178.     (cdr (assoc (aligntext:getdxfkey enx) enx))
  179. )

  180. (defun aligntext:puttextinsertion ( ins enx )
  181.     (   (lambda ( key )
  182.             (if (entmod (subst (cons key ins) (assoc key enx) enx))
  183.                 (entupd (cdr (assoc -1 enx)))
  184.             )
  185.         )
  186.         (aligntext:getdxfkey enx)
  187.     )
  188. )

  189. (defun LM:startundo ( doc )
  190.     (LM:endundo doc)
  191.     (vla-startundomark doc)
  192. )

  193. (defun LM:endundo ( doc )
  194.     (while (= 8 (logand 8 (getvar 'undoctl)))
  195.         (vla-endundomark doc)
  196.     )
  197. )

  198. ;; Active Document  -  Lee Mac
  199. ;; Returns the VLA Active Document Object

  200. (defun LM:acdoc nil
  201.     (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
  202.     (LM:acdoc)
  203. )

  204. (vl-load-com) (princ)

  205. ;;------------------------------------------------------------;;
  206. ;;                         End of File                        ;;
  207. ;;------------------------------------------------------------;;


  208. ;;;Lee的最小包容盒
  209. (defun LM:MinBoundingBox ( ss pr / an ba bb bm cn cv i l mb )
  210.   (if ss
  211.     (progn
  212.       (setq bb
  213.         (LM:ListBoundingBox
  214.           (repeat (setq i (sslength ss))
  215.             (setq l (cons (vla-copy (vlax-ename->vla-object (ssname ss (setq i (1- i))))) l))
  216.           )
  217.         )
  218.       )
  219.       (setq pr (* pr pi)
  220.             cn (apply 'mapcar (cons (function (lambda ( a b ) (/ (+ a b) 2.0))) bb))
  221.             cv (vlax-3D-point cn)
  222.             bm (* (- (caadr bb) (caar bb)) (- (cadadr bb) (cadar bb)))
  223.             mb (cons 0.0 bb)
  224.             an 0
  225.       )
  226.       (while (< (setq an (+ an pr)) pi)
  227.         (foreach x l (vla-rotate x cv pr))
  228.         (setq bb (LM:ListBoundingBox l)
  229.               ba (* (- (caadr bb) (caar bb)) (- (cadadr bb) (cadar bb)))
  230.         )
  231.         (if (< ba bm) (setq bm ba mb (cons an bb)))
  232.       )
  233.       (foreach x l (vla-delete x))
  234.       (LM:RotatePointsByMatrix
  235.         (mapcar
  236.           (function
  237.             (lambda ( a )
  238.               (mapcar (function (lambda ( b ) ((eval b) (cdr mb)))) a)
  239.             )
  240.           )
  241.          '((caar cadar) (caadr cadar) (caadr cadadr) (caar cadadr))
  242.         )
  243.         cn (- (car mb))
  244.       )
  245.     )
  246.   )
  247. )

  248. (defun LM:ListBoundingBox ( lst / l1 l2 ll ur )
  249.   (foreach obj lst
  250.     (vla-getboundingbox obj 'll 'ur)
  251.     (setq l1 (cons (vlax-safearray->list ll) l1)
  252.           l2 (cons (vlax-safearray->list ur) l2)
  253.     )
  254.   )
  255.   (mapcar
  256.     (function (lambda ( a b ) (apply 'mapcar (cons a b))))
  257.    '(min max) (list l1 l2)
  258.   )
  259. )

  260. (defun LM:RotatePointsByMatrix ( l p a / m )
  261.   (setq m
  262.     (list
  263.       (list (cos a) (sin (- a)) 0.0)
  264.       (list (sin a) (cos a)     0.0)
  265.       (list   0.0     0.0       1.0)
  266.     )
  267.   )
  268.   (setq p (mapcar '- p (mxv m p)))
  269.   (mapcar (function (lambda ( x ) (mapcar '+ (mxv m x) p))) l)
  270. )

  271. ;; Matrix x Vector - Vladimir Nesterovsky
  272. ;; Args: m - nxn matrix, v - vector in R^n

  273. (defun mxv ( m v )
  274.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  275. )

  276. (defun LEE_BRH( / s )
  277.   ;(princ "\n绘制最小包容盒:")
  278.   (if (setq s ss_hj)
  279.     (entmakex
  280.       (append
  281.         (list
  282.           (cons 0 "LWPOLYLINE")
  283.           (cons 100 "AcDbEntity")
  284.           (cons 100 "AcDbPolyline")
  285.           (cons 90 4)
  286.           (cons 70 1)
  287.         )
  288.         (mapcar '(lambda ( p ) (cons 10 p)) (LM:MinBoundingBox s 0.01))
  289.       )
  290.     )
  291.   )
  292.   (prin1)
  293. )

  294. (prompt "\n作者:天若有情007")
  295. (prompt "\n<c:ghj>批量修改梁集中标注行距\n其中,引用了Lee Mac的修改行距以及最小包围圈为子程序")
  296. (prin1)
该贴已经同步到 tumu2008323的微博

本帖子中包含更多资源

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

x
发表于 2018-10-1 14:55 | 显示全部楼层
能多一个要求吗  每行文字下面加条线
发表于 2018-10-3 11:25 | 显示全部楼层
你好集中标注要在什么图层上
发表于 2020-4-7 09:32 | 显示全部楼层
不知效果如何
发表于 2016-2-1 15:00 | 显示全部楼层
MSTEEL工具箱 或 萝卜的拉移随心已经写得很好了。
 楼主| 发表于 2016-2-1 16:24 | 显示全部楼层
brbright 发表于 2016-2-1 15:00
MSTEEL工具箱 或 萝卜的拉移随心已经写得很好了。

位移随心的确是很好,但是位移随心不能批量修改啊,只能一个一个集中标注去拖,如果是那种大地库,就会要人命了啊
发表于 2016-2-1 17:03 | 显示全部楼层
本帖最后由 kozmosovia 于 2016-2-2 11:40 编辑

根据引线长度及其角度为条件过滤选择文本并相应排序,然后直接将文本按顺序转换成多重文本,调整对齐方式、行间距及与引线关系。
最后根据需要分解多重文本(个人建议不要分解)

PS:
个人感觉最好的方案应该是带多重属性(标注文字)的动态块(拉伸引线)或者直接使用MLEADER
发表于 2016-2-2 11:18 | 显示全部楼层
大师能写一个
批量修改标注文字和箭头大小的吗
发表于 2016-2-2 11:57 | 显示全部楼层
本帖最后由 kozmosovia 于 2016-2-2 12:16 编辑

没有测试的图纸,都是以0层为过滤条件

  1. (Defun C:abc (/        _TEXT2MTEXT _GETPER _GETMTEXTBOX _PROCESSLINE SS I)
  2.   (Defun _Text2MText (obj / LL MT P0 P1 STR UR)
  3.     (setq obj (entget obj)
  4.           str (cdr (assoc 1 obj))
  5.     )
  6.     (entmake (list (cons 0 "MTEXT")
  7.                    (cons 8 (cdr (assoc 8 obj)))
  8.                    (cons 100 "AcDbEntity")
  9.                    (cons 100 "AcDbMText")
  10.                    (cons 10 (cdr (assoc 10 obj)))
  11.                    (cons 40 (cdr (assoc 40 obj)))
  12.                    (cons 41 0)
  13.                    (cons 71 1)
  14.                    (cons 72 5)
  15.                    (cons 1 str)
  16.                    (cons 7 (cdr (assoc 7 obj)))
  17.                    (list 11 1.0 0.0 0.0)
  18.                    (cons 50 (cdr (assoc 50 obj)))
  19.              )
  20.     )
  21.     (setq obj (vlax-ename->vla-object (cdr (assoc -1 obj)))
  22.           mt  (vlax-ename->vla-object (entlast))
  23.     )
  24.     (vla-getboundingbox obj 'll 'ur)
  25.     (setq ll (vlax-safearray->list ll)
  26.           ur (vlax-safearray->list ur)
  27.           p1 (vlax-3d-point (list (car ll) (cadr ur)))
  28.     )
  29.     (vla-getboundingbox mt 'll 'ur)
  30.     (setq ll (vlax-safearray->list ll)
  31.           ur (vlax-safearray->list ur)
  32.           p0 (vlax-3d-point (list (car ll) (cadr ur)))
  33.     )
  34.     (vla-move mt p0 p1)
  35.     mt
  36.   )
  37.   (Defun _GetPer (pt pt1 pt2 / norm PerPt)
  38.     (cond ((equal pt1 pt2) nil)
  39.           ((or (equal pt pt1) (equal pt pt2)) pt)
  40.           (t
  41.            (setq norm  (mapcar '- pt2 pt1)
  42.                  pt1   (trans pt1 0 norm)
  43.                  pt    (trans pt 0 norm)
  44.                  PerPt (trans (list (car pt1) (cadr pt1) (caddr pt)) norm 0)
  45.            )
  46.           )
  47.     )
  48.   )
  49.   (Defun _GetMTextBox (obj off / MXV B ENX H J L M N O P R W)
  50.     (Defun mxv (m v)
  51.       (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
  52.     )
  53.     (setq enx (entget obj))
  54.     (if        (null off)
  55.       (setq off 0.0)
  56.     )
  57.     (if
  58.       (setq l
  59.              (cond
  60.                ((= "TEXT" (cdr (assoc 0 enx)))
  61.                 (setq b        (cdr (assoc 10 enx))
  62.                       r        (cdr (assoc 50 enx))
  63.                       l        (textbox enx)
  64.                 )
  65.                 (list
  66.                   (list (- (caar l) off) (- (cadar l) off))
  67.                   (list (+ (caadr l) off) (- (cadar l) off))
  68.                   (list (+ (caadr l) off) (+ (cadadr l) off))
  69.                   (list (- (caar l) off) (+ (cadadr l) off))
  70.                 )
  71.                )
  72.                ((= "MTEXT" (cdr (assoc 0 enx)))
  73.                 (setq n        (cdr (assoc 210 enx))
  74.                       b        (trans (cdr (assoc 10 enx)) 0 n)
  75.                       r        (angle '(0.0 0.0 0.0) (trans (cdr (assoc 11 enx)) 0 n))
  76.                       w        (cdr (assoc 42 enx))
  77.                       h        (cdr (assoc 43 enx))
  78.                       j        (cdr (assoc 71 enx))
  79.                       o        (list
  80.                           (cond
  81.                             ((member j '(2 5 8)) (/ w -2.0))
  82.                             ((member j '(3 6 9)) (- w))
  83.                             (0.0)
  84.                           )
  85.                           (cond
  86.                             ((member j '(1 2 3)) (- h))
  87.                             ((member j '(4 5 6)) (/ h -2.0))
  88.                             (0.0)
  89.                           )
  90.                         )
  91.                 )
  92.                 (list
  93.                   (list (- (car o) off) (- (cadr o) off))
  94.                   (list (+ (car o) w off) (- (cadr o) off))
  95.                   (list (+ (car o) w off) (+ (cadr o) h off))
  96.                   (list (- (car o) off) (+ (cadr o) h off))
  97.                 )
  98.                )
  99.              )
  100.       )
  101.        ((lambda        (m)
  102.           (mapcar '(lambda (p) (mapcar '+ (mxv m p) b)) l)
  103.         )
  104.          (list
  105.            (list (cos r) (sin (- r)) 0.0)
  106.            (list (sin r) (cos r) 0.0)
  107.            '(0.0 0.0 1.0)
  108.          )
  109.        )
  110.     )
  111.   )
  112.   (Defun _ProcessLine (obj   /           A10         A11   ANG   B10   B11         BOX
  113.                        DDD   DIS   I         INS   LEFT  MT           O10         O11
  114.                        OB    PER   RIGHT SSET  STR
  115.                       )
  116.     (setq o10 (cdr (assoc 10 (entget obj)))
  117.           o11 (cdr (assoc 11 (entget obj)))
  118.           dis (* (distance o10 o11) 0.2)
  119.           ang (+ (* 0.5 pi) (angle o10 o11))
  120.           a10 (polar o10 ang dis)
  121.           a11 (polar o11 ang dis)
  122.           b10 (polar o10 ang (* dis -1.0))
  123.           b11 (polar o11 ang (* dis -1.0))
  124.     )
  125.     (if        (setq i           -1
  126.               sset (ssget "_cp"
  127.                           (list a10 a11 b11 b10)
  128.                           (list (cons 0 "text") (cons 8 "0"))
  129.                    )
  130.         )
  131.       (progn
  132.         (repeat        (sslength sset)
  133.           (setq        obj (ssname sset (setq i (1+ i)))
  134.                 box (_GetMTextBox obj 0.0)
  135.           )
  136.           (if (null (inters (car box) (last box) o10 o11 nil))
  137.             (progn
  138.               (setq per        (_GetPer (car box) o10 o11)
  139.                     ddd        (list (distance per o10) obj)
  140.               )
  141.               (if (equal (angle per (car box))
  142.                          (angle (car box) (cadr box))
  143.                          0.01
  144.                   )
  145.                 (setq right (cons ddd right))
  146.                 (setq left (cons ddd left))
  147.               )
  148.             )
  149.           )
  150.         )
  151.         (foreach abc (list left right)
  152.           (if abc
  153.             (progn
  154.               (setq abc        (vl-sort abc
  155.                                  '(lambda (p1 p2) (< (car p1) (car p2)))
  156.                         )
  157.                     abc        (mapcar 'last abc)
  158.                     box        (_GetMTextBox (car abc) 0.0) str nil
  159.               )
  160.               (if (equal (angle o10 o11)
  161.                          (angle (car box) (last box))
  162.                          0.01
  163.                   )
  164.                 (setq abc (reverse abc))
  165.               )
  166.               (foreach ob abc
  167.                 (if (null str)
  168.                   (setq str (cdr (assoc 1 (entget ob))))
  169.                   (setq
  170.                     str        (strcat str "\\P" (cdr (assoc 1 (entget ob))))
  171.                   )
  172.                 )
  173.               )
  174.               (setq ob        (_Text2MText (car abc))
  175.                     box        (_GetMTextBox (vlax-vla-object->ename ob) 0.0)
  176.                     ins        (last box)
  177.                     per        (_GetPer ins o10 o11)
  178.                     ins        (polar
  179.                           per
  180.                           (angle per ins)
  181.                           (cdr
  182.                             (assoc 40 (entget (vlax-vla-object->ename ob)))
  183.                           )
  184.                         )
  185.               )
  186.               (vla-put-textstring ob str)
  187.               (if
  188.                 (not
  189.                   (equal
  190.                     (angle per ins)
  191.                     (cdr (assoc 50 (entget (vlax-vla-object->ename ob)))
  192.                     )
  193.                     0.01
  194.                   )
  195.                 )
  196.                  (vla-put-AttachmentPoint ob acAttachmentPointTopRight)
  197.               )
  198.               (vla-put-insertionpoint ob (vlax-3d-point ins))
  199.               (mapcar 'entdel abc)
  200.             )
  201.           )
  202.         )
  203.       )
  204.     )
  205.   )
  206.   (if (setq i  -1
  207.             ss (ssget (list (cons 0 "line") (cons 8 "0")))
  208.       )
  209.     (repeat (sslength ss)
  210.       (_ProcessLine (ssname ss (setq i (1+ i))))
  211.     )
  212.   )
  213. )
 楼主| 发表于 2016-2-2 12:33 | 显示全部楼层
kozmosovia 发表于 2016-2-2 11:57
没有测试的图纸,都是以0层为过滤条件

多谢大神出手,程序很棒,但是有两个问题还没有找到原因,一个是原来的钢筋符号变成了%%153,而不显示钢筋符号,第二个是不能调整引线长度,希望大神方便可以修改一下

本帖子中包含更多资源

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

x
发表于 2016-2-2 13:31 | 显示全部楼层
本帖最后由 kozmosovia 于 2016-2-2 17:00 编辑

特殊钢筋符号这些MTEXT处理起来可能只能使用TTF替换,但是这样与他人的兼容可能会出现问题,因此估计只能再把MTEXT分解成TEXT。


引线头部削平了

  1. (Defun C:abc2 (/             _TEXT2MTEXT   _GETPER         _GETMTEXTBOX
  2.                _PROCESSLINE  _CHANGEALIGN  _GETMID         SS
  3.                I
  4.               )
  5.   (Defun _Text2MText (obj / LL MT P0 P1 STR UR)
  6.     (setq obj (entget obj)
  7.           str (cdr (assoc 1 obj))
  8.     )
  9.     (entmake (list (cons 0 "MTEXT")
  10.                    (cons 8 (cdr (assoc 8 obj)))
  11.                    (cons 100 "AcDbEntity")
  12.                    (cons 100 "AcDbMText")
  13.                    (cons 10 (cdr (assoc 10 obj)))
  14.                    (cons 40 (cdr (assoc 40 obj)))
  15.                    (cons 41 0)
  16.                    (cons 71 1)
  17.                    (cons 72 5)
  18.                    (cons 1 str)
  19.                    (cons 7 (cdr (assoc 7 obj)))
  20.                    (list 11 1.0 0.0 0.0)
  21.                    (cons 50 (cdr (assoc 50 obj)))
  22.              )
  23.     )
  24.     (setq obj (cdr (assoc -1 obj))
  25.           p1 (_GetMTextBox obj)
  26.           p1 (vlax-3d-point (_GetMid (car p1)(caddr p1)))
  27.           mt  (entlast)
  28.           p0 (_GetMTextBox mt)
  29.           p0 (vlax-3d-point (_GetMid (car p0)(caddr p0)))
  30.           mt (vlax-ename->vla-object mt)
  31.     )
  32.     (vla-move mt p0 p1)
  33.     mt
  34.   )
  35.   (Defun _GetPer (pt pt1 pt2 / norm PerPt)
  36.     (cond ((equal pt1 pt2) nil)
  37.           ((or (equal pt pt1) (equal pt pt2)) pt)
  38.           (t
  39.            (setq norm  (mapcar '- pt2 pt1)
  40.                  pt1   (trans pt1 0 norm)
  41.                  pt    (trans pt 0 norm)
  42.                  PerPt (trans (list (car pt1) (cadr pt1) (caddr pt)) norm 0)
  43.            )
  44.           )
  45.     )
  46.   )
  47.   (Defun _GetMTextBox (obj off / MXV B ENX H J L M N O P R W)
  48.     (Defun mxv (m v)
  49.       (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
  50.     )
  51.     (setq enx (entget obj))
  52.     (if        (null off)
  53.       (setq off 0.0)
  54.     )
  55.     (if
  56.       (setq l
  57.              (cond
  58.                ((= "TEXT" (cdr (assoc 0 enx)))
  59.                 (setq b        (cdr (assoc 10 enx))
  60.                       r        (cdr (assoc 50 enx))
  61.                       l        (textbox enx)
  62.                 )
  63.                 (list
  64.                   (list (- (caar l) off) (- (cadar l) off))
  65.                   (list (+ (caadr l) off) (- (cadar l) off))
  66.                   (list (+ (caadr l) off) (+ (cadadr l) off))
  67.                   (list (- (caar l) off) (+ (cadadr l) off))
  68.                 )
  69.                )
  70.                ((= "MTEXT" (cdr (assoc 0 enx)))
  71.                 (setq n        (cdr (assoc 210 enx))
  72.                       b        (trans (cdr (assoc 10 enx)) 0 n)
  73.                       r        (angle '(0.0 0.0 0.0) (trans (cdr (assoc 11 enx)) 0 n))
  74.                       w        (cdr (assoc 42 enx))
  75.                       h        (cdr (assoc 43 enx))
  76.                       j        (cdr (assoc 71 enx))
  77.                       o        (list
  78.                           (cond
  79.                             ((member j '(2 5 8)) (/ w -2.0))
  80.                             ((member j '(3 6 9)) (- w))
  81.                             (0.0)
  82.                           )
  83.                           (cond
  84.                             ((member j '(1 2 3)) (- h))
  85.                             ((member j '(4 5 6)) (/ h -2.0))
  86.                             (0.0)
  87.                           )
  88.                         )
  89.                 )
  90.                 (list
  91.                   (list (- (car o) off) (- (cadr o) off))
  92.                   (list (+ (car o) w off) (- (cadr o) off))
  93.                   (list (+ (car o) w off) (+ (cadr o) h off))
  94.                   (list (- (car o) off) (+ (cadr o) h off))
  95.                 )
  96.                )
  97.              )
  98.       )
  99.        ((lambda        (m)
  100.           (mapcar '(lambda (p) (mapcar '+ (mxv m p) b)) l)
  101.         )
  102.          (list
  103.            (list (cos r) (sin (- r)) 0.0)
  104.            (list (sin r) (cos r) 0.0)
  105.            '(0.0 0.0 1.0)
  106.          )
  107.        )
  108.     )
  109.   )
  110.   (Defun _ProcessLine (obj   /           A10         A11   ALI   ANG   B10         B11
  111.                        BOX   DDD   DIS         EPT   I     INS   LEFT         LIN
  112.                        O10   O11   OB         PER   RIGHT SPT   SS         SSET
  113.                        STR   THH
  114.                       )
  115.     (setq o10 (cdr (assoc 10 (entget obj)))
  116.           o11 (cdr (assoc 11 (entget obj)))
  117.           dis (* (distance o10 o11) 0.2)
  118.           ang (+ (* 0.5 pi) (angle o10 o11))
  119.           a10 (polar o10 ang dis)
  120.           a11 (polar o11 ang dis)
  121.           b10 (polar o10 ang (* dis -1.0))
  122.           b11 (polar o11 ang (* dis -1.0))
  123.           lin (vlax-ename->vla-object obj)
  124.     )
  125.     (if        (setq i           -1
  126.               sset (ssget "_cp"
  127.                           (list a10 a11 b11 b10)
  128.                           (list (cons 0 "text") (cons 8 "0"))
  129.                    )
  130.         )
  131.       (progn
  132.         (repeat        (sslength sset)
  133.           (setq        obj (ssname sset (setq i (1+ i)))
  134.                 box (_GetMTextBox obj 0.0)
  135.           )
  136.           (if (null (inters (car box) (last box) o10 o11 nil))
  137.             (progn
  138.               (setq per        (_GetPer (car box) o10 o11)
  139.                     ddd        (list (distance per o10) obj)
  140.               )
  141.               (if (equal (angle per (car box))
  142.                          (angle (car box) (cadr box))
  143.                          0.01
  144.                   )
  145.                 (setq right (cons ddd right))
  146.                 (setq left (cons ddd left))
  147.               )
  148.             )
  149.           )
  150.         )
  151.         (foreach abc (list left right)
  152.           (if abc
  153.             (progn
  154.               (setq abc        (vl-sort abc
  155.                                  '(lambda (p1 p2) (< (car p1) (car p2)))
  156.                         )
  157.                     abc        (mapcar 'last abc)
  158.                     box        (_GetMTextBox (car abc) 0.0)
  159.                     str        nil
  160.               )
  161.               (if (equal (angle o10 o11)
  162.                          (angle (car box) (last box))
  163.                          0.01
  164.                   )
  165.                 (setq abc (reverse abc))
  166.               )
  167.               (foreach ob abc
  168.                 (if (null str)
  169.                   (setq str (cdr (assoc 5 (entget ob))))
  170.                   (setq
  171.                     str        (strcat str "\\P" (cdr (assoc 5 (entget ob))))
  172.                   )
  173.                 )
  174.               )
  175.               (setq ob        (_Text2MText (car abc))
  176.                     box        (vla-put-textstring ob str)
  177.                     box        (_GetMTextBox (vlax-vla-object->ename ob) 0.0)
  178.                     ins        (last box)
  179.                     spt        (_GetPer (last box) o10 o11)
  180.                     thh        (cdr
  181.                           (assoc 40 (entget (vlax-vla-object->ename ob)))
  182.                         )
  183.                     ins        (polar spt (angle spt (last box)) (* 0.5 thh))
  184.               )
  185.               (if
  186.                 (not
  187.                   (equal
  188.                     (angle spt ins)
  189.                     (cdr (assoc 50 (entget (vlax-vla-object->ename ob)))
  190.                     )
  191.                     0.01
  192.                   )
  193.                 )
  194.                  (setq ali acAttachmentPointTopRight)
  195.                  (setq ali acAttachmentPointTopLeft)
  196.               )
  197.               (vla-put-AttachmentPoint ob ali)
  198.               (vla-put-insertionpoint ob (vlax-3d-point ins))
  199.               (setq box        (_GetMTextBox (vlax-vla-object->ename ob) 0.0)
  200.                     spt        (_GetPer (last box) o10 o11)
  201.                     ept        (_GetPer (car box) o10 o11)
  202.                     mid        (_GetMid spt ept)
  203.                     ept        (polar ept (angle mid ept) (* 0.2 thh))
  204.                     spt        (polar spt (angle mid spt) (* 0.2 thh))
  205.               )
  206.               (if (> (distance o10 mid) (distance o11 mid))
  207.                 (setq mid o10)
  208.                 (setq mid o11)
  209.               )
  210.               (if (equal (distance spt mid)
  211.                          (+ (distance ept mid)
  212.                             (distance spt ept)
  213.                          )
  214.                          0.01
  215.                   )
  216.                 (setq ept mid)
  217.                 (setq spt mid)
  218.               )
  219.               (vla-put-startpoint lin (vlax-3d-point spt))
  220.               (vla-put-endpoint lin (vlax-3d-point ept))

  221.               (command "_.Explode" (vlax-vla-object->ename ob))
  222.               (setq i  -1
  223.                     ss (ssget "_p")
  224.               )
  225.               (repeat (sslength ss)
  226.                 (if (setq ob  (vlax-ename->vla-object
  227.                                 (ssname ss (setq i (1+ i)))
  228.                               )
  229.                           ob  (_ChangeAlign ob ali)
  230.                           abc (handent (vla-get-textstring ob))
  231.                     )
  232.                   (setq        abc (vlax-ename->vla-object abc)
  233.                         ob  (vla-put-textstring ob (vla-get-textstring abc))
  234.                         abc (vla-erase abc)
  235.                   )
  236.                 )
  237.               )
  238.             )
  239.           )
  240.         )
  241.       )
  242.     )
  243.   )
  244.   (Defun _GetMid (p1 p2)
  245.     (polar p1 (angle p1 p2) (* 0.5 (distance p1 p2)))
  246.   )
  247.   (Defun _ChangeAlign (vlo ali / BOX BOY)
  248.     (if        (= ali acAttachmentPointTopRight)
  249.       (progn
  250.         (setq box (_GetMTextBox (vlax-vla-object->ename vlo) 0.0)
  251.               box (_GetMid (car box) (caddr box))
  252.         )
  253.         (vla-put-alignment vlo acAlignmentRight)
  254.         (setq boy (_GetMTextBox (vlax-vla-object->ename vlo) 0.0)
  255.               boy (_GetMid (car boy) (caddr boy))
  256.         )
  257.         (vla-move vlo (vlax-3d-point boy) (vlax-3d-point box))
  258.       )
  259.     )
  260.     vlo
  261.   )
  262.   (if (setq i  -1
  263.             ss (ssget (list (cons 0 "line") (cons 8 "0")))
  264.       )
  265.     (repeat (sslength ss)
  266.       (_ProcessLine (ssname ss (setq i (1+ i))))
  267.     )
  268.   )
  269. )

发表于 2016-2-4 21:14 | 显示全部楼层
kozmosovia 发表于 2016-2-2 13:31
特殊钢筋符号这些MTEXT处理起来可能只能使用TTF替换,但是这样与他人的兼容可能会出现问题,因此估计只能再 ...

发表于 2016-2-6 00:08 | 显示全部楼层
结构佬必须顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 20:36 , Processed in 0.378531 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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