属性编辑旋转/移动Glo
我之前在“How do I…?”上发布了这篇文章有人建议我在这里查一下。。。ACAD 2000或2002
插入具有一个常量属性和一个可变属性的块。块会根据需要旋转,但内部和外部的文本会随块旋转。。。我需要将两者旋转到零,然后重新定位可更改/外部文本(因此它不在块顶部,等等)。
我搜索了Cadalyst和这里,但没有找到任何没有购买另一个程序。有没有一个Lisp例程,有没有其他方法?
CarlB回复:“这可以用lisp例程来处理。要么插入块并在插入时重新定位属性,要么用它来“修复”已经插入的块以旋转属性。如果你将其发布到lisp/customization论坛并附上块的图形,你可能会找到一些接受者。”
我会按照CarlB的建议尝试连接该块。。。
谢谢
FE。图纸 试试这个:
(defun c:attrot (/ adoc selset)
(vl-load-com)
(vla-startundomark
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
) ;_ end of vla-startundomark
(if (setq selset (ssget "_:L" '((0 . "INSERT") (66 . 1))))
(foreach blk (mapcar 'vlax-ename->vla-object
(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
) ;_ end of mapcar
(vl-catch-all-apply
'(lambda ()
(foreach att (vlax-safearray->list
(vlax-variant-value (vla-getattributes blk))
) ;_ end of vlax-safearray->list
(vl-catch-all-apply
'(lambda ()
(vla-put-rotation att 0.)
) ;_ end of lambda
) ;_ end of vl-catch-all-apply
) ;_ end of foreach
) ;_ end of lambda
) ;_ end of vl-catch-all-apply
) ;_ end of foreach
) ;_ end of if
(vla-endundomark adoc)
(princ)
) ;_ end of defun
(princ "\nType ATTROT in command line to start lisp") 谢谢kpblc!
它主要起作用。。。属性都为零,但我仍然需要返回并重新定位外部属性以将其“移开”。。。这无疑减少了时间的固定量,非常感谢你! 嗨,beaverstate,
我的例程是“plain”lisp,但与kpblc的例程大致相同。它*应该*旋转到0,并将“outside”属性移动到块插入的上方。
(princ "\nStart with AROT")
(defun c:arot ()
(command "_UNDO" "_BE")
(princ "\nSelect blocks to rotate attributes: ")
(setq Count 0)
(setq Bset (ssget '((0 . "INSERT")(66 . 1))))
(setq Bnum (sslength Bset))
(repeat Bnum
(setq Ename (ssname Bset Count)
Att1 (entnext Ename)
Att2 (entnext Att1)
A1dat (entget Att1)
A2dat (entget Att2)
IP_Bk (cdr (assoc 10 (entget Ename)))
IP_Att1 (cdr (assoc 11 A1dat))
AttOff (distance IP_Bk IP_Att1)
AttPt (mapcar '+ IP_Bk (list 0.0 AttOff 0.0))
N_Att1 (subst '(50 . 0.0) (assoc 50 A1dat) A1dat)
N_Att1 (subst (cons 11 AttPt) (assoc 11 N_Att1) N_Att1)
N_Att2 (subst '(50 . 0.0) (assoc 50 A2dat) A2dat))
(entmod N_Att1)
(entmod N_Att2)
(entupd Ename)
(setq Count (1+ Count))
)
(command "_UNDO" "_END")
(princ)
) 谢谢CarlB,
为了更好地解释,我附上了另一个dwg作为我正在使用的示例。如您所见,简单地将外部文本移到块上方可能不允许读取文本,因为它可能会以其他层的方式读取。。。。
我希望有一种方法可以真正“选择”块附近的位置,使属性移动,因为它的位置每次都可能不同。
也许只可能旋转到零,然后我将手动尝试编辑属性的位置。
谢谢你抽出时间来做这件事。。。这也是我喜欢这个论坛的原因之一——每个人都愿意帮助同事!
ATTROTATE0.dwg
-不要这样做,只需单击属性以显示夹点,单击夹点,然后拖动它。可以修改例程,以便在旋转到0后定位块的属性,但之后重新定位的速度几乎相同。 Orgrown,
这是我们用于某些块的宏(在本例中是地板垃圾,FW.dwg)。
它获取ltscale并调整块的大小以适应。然后暂停以供用户定位,并将旋转设置为零。
该块有一个属性,我们将其强制为“FW”。然后,它逐步执行一个序列,该序列包含attedit命令(前缀为“-”),运行一些默认值,并使用“L”选择最后一个属性。再加上几个默认值,该属性将自身附加到游标,并允许最终重新定位。
-插入FW S$M=$(/,$(getvar,ltscale),10)\0 FW-attedit;;;;La 0 P;\;
当你点击地板垃圾按钮时,地板垃圾在光标上以正确的大小显示,你定位它,然后属性FW出现在光标上,等待你放置它。
合并第一个属性时,使用类似的序列自动以零度显示,然后将上述序列用于第二个属性,这不会有太多问题。 也许更好的方法是用抓地力替换属性?(我认为)似乎更舒服。但运行attsync命令(或battman)可能会按属性擦除所有更改-小心! 卡尔、沃扎、kpblc:棒极了,伙计们!谢谢你的建议。这将节省我很多时间。我真的很感激。
可以修改此lisp以输入旋转角度吗?现在它只旋转到角度0。我有一大堆需要旋转到特定角度的属性。
页:
[1]
2