ORgrown 发表于 2022-7-6 14:29:43

属性编辑旋转/移动Glo

我之前在“How do I…?”上发布了这篇文章有人建议我在这里查一下。。。
 
ACAD 2000或2002
 
插入具有一个常量属性和一个可变属性的块。块会根据需要旋转,但内部和外部的文本会随块旋转。。。我需要将两者旋转到零,然后重新定位可更改/外部文本(因此它不在块顶部,等等)。
 
我搜索了Cadalyst和这里,但没有找到任何没有购买另一个程序。有没有一个Lisp例程,有没有其他方法?
 
CarlB回复:“这可以用lisp例程来处理。要么插入块并在插入时重新定位属性,要么用它来“修复”已经插入的块以旋转属性。如果你将其发布到lisp/customization论坛并附上块的图形,你可能会找到一些接受者。”
 
我会按照CarlB的建议尝试连接该块。。。
谢谢
FE。图纸

kpblc 发表于 2022-7-6 14:35:27

试试这个:
(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")

ORgrown 发表于 2022-7-6 14:36:12

谢谢kpblc!
它主要起作用。。。属性都为零,但我仍然需要返回并重新定位外部属性以将其“移开”。。。这无疑减少了时间的固定量,非常感谢你!

CarlB 发表于 2022-7-6 14:42:14

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

ORgrown 发表于 2022-7-6 14:43:57

谢谢CarlB,
为了更好地解释,我附上了另一个dwg作为我正在使用的示例。如您所见,简单地将外部文本移到块上方可能不允许读取文本,因为它可能会以其他层的方式读取。。。。
我希望有一种方法可以真正“选择”块附近的位置,使属性移动,因为它的位置每次都可能不同。
也许只可能旋转到零,然后我将手动尝试编辑属性的位置。
谢谢你抽出时间来做这件事。。。这也是我喜欢这个论坛的原因之一——每个人都愿意帮助同事!
ATTROTATE0.dwg

CarlB 发表于 2022-7-6 14:48:46

 
-不要这样做,只需单击属性以显示夹点,单击夹点,然后拖动它。可以修改例程,以便在旋转到0后定位块的属性,但之后重新定位的速度几乎相同。

Wozza 发表于 2022-7-6 14:50:12

Orgrown,
 
这是我们用于某些块的宏(在本例中是地板垃圾,FW.dwg)。
 
它获取ltscale并调整块的大小以适应。然后暂停以供用户定位,并将旋转设置为零。
 
该块有一个属性,我们将其强制为“FW”。然后,它逐步执行一个序列,该序列包含attedit命令(前缀为“-”),运行一些默认值,并使用“L”选择最后一个属性。再加上几个默认值,该属性将自身附加到游标,并允许最终重新定位。
 
-插入FW S$M=$(/,$(getvar,ltscale),10)\0 FW-attedit;;;;La 0 P;\;
 
当你点击地板垃圾按钮时,地板垃圾在光标上以正确的大小显示,你定位它,然后属性FW出现在光标上,等待你放置它。
 
合并第一个属性时,使用类似的序列自动以零度显示,然后将上述序列用于第二个属性,这不会有太多问题。

kpblc 发表于 2022-7-6 14:53:27

也许更好的方法是用抓地力替换属性?(我认为)似乎更舒服。但运行attsync命令(或battman)可能会按属性擦除所有更改-小心!

ORgrown 发表于 2022-7-6 14:57:19

卡尔、沃扎、kpblc:棒极了,伙计们!谢谢你的建议。这将节省我很多时间。我真的很感激。

JeepMaster 发表于 2022-7-6 14:59:10

 
可以修改此lisp以输入旋转角度吗?现在它只旋转到角度0。我有一大堆需要旋转到特定角度的属性。
页: [1] 2
查看完整版本: 属性编辑旋转/移动Glo