天天问 发表于 2022-4-10 23:29:25

用lisp创建多重引线样式——希望有朋友可以一起交流【已解决】

本帖最后由 天天问 于 2022-4-18 20:14 编辑

把300组码对应的字符串设为空,就可以正常使用了。
解决后的成果见我的另一个帖子http://bbs.mjtd.com/thread-185240-1-1.html


===============以下是原帖:===============
工作习惯问题,个人喜欢在标注的时候使用多重引线。
接触Lisp以后,一直想用lisp创建多重引线样式,这样在任何一个文档里可以随时一键新建想要的多重引线样式。


论坛里泡了很久,查找搜索了很多帖子,倒是有几个帖子里有源码,但是未达到预期效果。源码本身的可读性不高,修改起来比较难。而CAD帮助文件里关于多重引线样式的DXF介绍也非常简略,甚至有些组码与实际不符。郁闷!


经过一段时间研究,现在基本解决了用Lisp新建多重引线样式的问题,但还是有个地方需要完善:
在新建的样式下使用mleader命令创建多重引线时,在输入文字内容前需要先确定是否覆盖默认文字。
而系统默认自带的多重引线样式不会有这个问题,都是直接允许输入文字内容。


希望有经验的朋友可以一起交流,也希望大神们走过路过,进来指导一下。

qq1254582201 发表于 2022-4-15 09:45:45

(defun mkmleader (ename1 p2 / pts)
(if (not *lead)                        ;如果不存在创建mleader对象
    (progn (setq pts (list (trans p1 1 0) (trans p2 1 0))
               pts (gc:3dPointListToVariant pts)
           )
           (setq *lead
                  (vla-AddMLeader
                  (vla-get-modelspace
                      (vla-get-activedocument (vlax-get-acad-object))
                  )                        ;获得模型空间对象
                  pts
                  0
                  )
           )
           (setq old_vmleader (vlax-ename->vla-object ename1))
           (setq a (vla-get-Layer old_vmleader))
           (setq e (vla-get-TextLineSpacingDistance old_vmleader))
           (setq g (vla-get-StyleName old_vmleader))
           (setq er (vla-get-TextHeight old_vmleader))
                                        ;(setq h(vla-get-TextStyleName old_vmleader))
           (setq o (vla-get-TrueColor old_vmleader))
                                        ;给目标保持一致属性
           (progn
             (vla-put-textstring *lead label)
             (vla-put-Layer *lead a)
;;;
             (vla-put-TextJustify *lead acAttachmentPointBottomCenter)
             (vla-put-TextLineSpacingStyle
             *lead
             acLineSpacingStyleExactly
             )                                ;行距为精确
             (vla-put-TextHeight *lead er)
                                        ;(vla-put-TextStyleName *lead h)
             (vla-put-TextLineSpacingDistance *lead e) ;文字行距e为整数
             (vla-put-StyleName *lead g)
             (vla-put-TrueColor *lead o)
           )
           (vla-rotate
             *lead
             (vlax-3d-point (trans p2 1 0))
             (angle (trans '(0 0 0) 1 0) (trans '(1 0 0) 1 0))
           )
    )                                        ;对象存在的情况下更新它
    (progn (setq pts (list (trans p1 1 0) (trans p2 1 0))
               pts (gc:3dPointListToVariant pts)
           )
           (vla-SetLeaderLineVertices *lead 0 pts) ;重定义顶点
           (vla-SetDogLegDirection
             *lead
             0
             (vlax-3D-point
             (trans (list (if        (> (car p2) (car p1))
                              1
                              -1
                          )
                          0
                          0
                      )
                      1
                      0
                      T
             )
             )
           )

天天问 发表于 2022-4-15 11:00:58

qq1254582201 发表于 2022-4-15 09:45
(defun mkmleader (ename1 p2 / pts)
(if (not *lead)                        ;如果不存在创建mleader对象
    (progn (setq ...

这段代码也不能用啊,括号好像都不够。加完括号以后,又提示参数太少
页: [1]
查看完整版本: 用lisp创建多重引线样式——希望有朋友可以一起交流【已解决】