属性对齐自动
大家好,在我的图形文件中,有许多属性需要按照标准对齐。(属性位于块参照中)。
手动操作需要很多时间。
所有属性都位于多段线的中间。我想通过lisp自动对齐。
因此,当运行命令时,ATT1应移动并对齐到多边形的起点,
ATT2应移动并对齐到多边形线的端点(请参见随附的.dwg文件)
样品图纸
请帮助我处理lisp。
提前谢谢。 也许你贴错了图纸?没有带属性的块参照,而是有属性定义,并且没有一个与多段线的端点对齐。此外,案例1和案例3似乎完全相同,但预期结果不同?
编辑:您可能还希望查看案例1多段线从右上角到左下角的情况。 嗨,罗伊,
是的,我上传了错误的图纸。
请看这个更新的。
样品图纸
实际上,我需要根据图纸中可用的空间对齐三个不同的箱子。
谢谢 可以在起始点附近拾取样条线、直线、圆弧、样条等,使att1到达终点。然后打开ATT。绘制结果。选择的原因是,如果只使用起点、终点,则可能会在错误的一端绘制ATT。从右到左画的线。
需要一些简单的defuns,我相信有人会发布,我需要找到defuns组,现在必须做真正的工作。开始http://www.cadtutor.net/forum/showthread.php?104805-使用翻转选项测量 嗨,比格尔,
抱歉耽搁了。
实际上我不明白你说的话,而且我不是Lisp程序的专家。你能帮我一下吗。
谢谢 对不起,最近很忙,没有空余时间,我看看今晚是否有空,其他人可以加入。
第2部分现在有了一个重头戏,像块属性处于奇数角度这样的两个问题无助于自动化。
请问att1和att2值来自哪里?我忽略了拾取ex块,而是在创建时将其插入正确的位置。测线、柱脚和圆弧。 这里有一些东西要看,它需要相当多的工作,但我纠正了块角度,使其正常工作,并删除了额外编码的需要,它需要发挥文字位置和可读性检查。我仍然认为没有必要先插入块,而不是在末尾添加。
(defun stend ( / d1 d2 temp)
(setq stpt (vlax-curve-getstartPoint Obj)
endpt(vlax-curve-getEndPoint Obj)
d1 (distance stpt pt)
d2 (distance endpt pt)
)
(if (> d1 d2)
(progn
(setq temp stpt)
(setq stpt endpt)
(setq endpt temp)
)
)
)
(defun ispline ( /co-ordsxy I xy co-ords numb len ang1 ang2)
(stend)
(setq co-ords (vlax-safearray->list (vlax-variant-value (vlax-get-property
obj "Coordinates" ) ) )
)
(setq len (length co-ords))
(setq numb (/ len 2))
(setq I 0)
(repeat numb
(setq xy (list (nth i co-ords)(nth (+ I 1) co-ords) ))
(setq co-ordsxy (cons xy co-ordsxy))
(setq I (+ I 2))
)
(alert"check direction here")
(setq ang1 (angle (nth 1 co-ordsxy)(nth 0 co-ordsxy)))
(if (= numb 2)
(setq ang2ang1)
(setqang2 (angle (nth (- numb 1) co-ordsxy)(nth(- numb 2) co-ordsxy)))
)
(command"-insert" "att1" endpt 1 "" ang1 (rtos (car stpt) 2 2 ))
(command"-insert" "att2" stpt 1 "" ang2 (rtos (cadr stpt) 2 2 ))
)
(defun isline ( /ang)
(stend)
(setq ang (angle stpt endpt))
(command"-insert" "att1" stpt 1 "" ang (rtos (car stpt) 2 2 ))
(command"-insert" "att2" endpt 1 "" ang (rtos (car stpt) 2 2 ))
)
(defun isarc ( / )
(alert "Non supported item at this time")(exit)
)
(defun iscirc ( / )
(alert "Non supported item at this time")(exit)
)
;;;; starts here
(defunendptlabel1 ( /ent)
(setq ent (entsel "pick object near end for start"))
(SETQ ANGBASEE (GETVAR "ANGBASE"))
(SETQ ANGDIRR (GETVAR "ANGDIR"))
(SETQ AUNITSS (GETVAR "AUNITS"))
(SETVAR "ANGBASE" 0.0)
(SETVAR "ANGDIR" 0)
(SETVAR "AUNITS" 3)
(setq pt (cadr ent))
(setq obj (vlax-ename->vla-object (car ent)))
(setq objname (vla-get-objectname obj))
(setvar 'attdia 0)
(cond
((= objname "AcDbPolyline")(ispline))
((= objname "AcDbLine")(isline))
((= objname "acDbArc")(isarc))
((= objname "AcDbCircle" )(iscircle))
)
(SETVAR "ANGBASE" angbasee)
(SETVAR "ANGDIR" angdirr)
(SETVAR "AUNITS" aunitss)
(princ)
)
(defunc:aaa ()
(endptlabel1)
)
(defun c:bbb ()
(endptlabel2)
)
你好,比格尔,
非常感谢您的代码。
我已经试过了上面你发的代码。嗯,这是可行的,但它更新了两端的长度。
但我必须将属性从选定位置移到两端。(块属性已放置在我的DWG中),因此首先我必须选择属性,然后选择线。之后,选定的属性以与直线相同的旋转角度移动到直线的两端。
再次感谢。 我知道文本需要一些对齐工作。
但我的大问题是,为什么你要插入块,然后把它们连接到线柱上,等等,我会直接把块添加到对象上,这就是我在代码中试图展示的。这似乎是一个三步过程,而不是一步。
可以在开始处添加pick两个块,读取其属性值,并创建新的添加到代码中 实际上,我正在开发一个GIS应用程序,其中块属性将自动放置在多段线的中心顶部。之后,我们需要将该块属性移动到两端。手动对齐需要一些时间。这就是为什么我在这里问,是否可以通过lisp完成。这对我很有帮助。
谢谢
页:
[1]
2