如何更新
我们使用了大量的块,并创建了一些块,这些块是用于特定应用的一组块。问题是,我似乎无法更新仅包含在我刚刚插入的块中的嵌套块的属性。我在网上找到的唯一代码更新了图形中的所有嵌套块,而不是特定块。
这里有一个片段
(setq rm_name (getstring "\nEnter Module Name: "))
(setq insertpt (getpoint "\nSelect Insertion Point For Wiring Block: "))
(setq wiringblk (vla-insertBlock (vla-get-ModelSpace doc) (vlax-3d-point insertpt) "WIRING-CONTROL-GROUP-ROOF-VENT" 1 1 1 0))
(vlax-for o (vla-item (vla-get-Blocks doc) "WIRING-CONTROL-GROUP-ROOF-VENT") ;parent block
(if
(and(eq (vla-get-objectname o) "AcDbBlockReference")
(eq (vlax-get-property o 'Effectivename) "WIRING-MODULE-2CGROL")) ;child block
(progn
(setq olist (vlax-safearray->list
(vlax-variant-value (vla-getAttributes o)))) ;list of attributes in child block
(while (> (vl-list-length olist) 0)
(setq otag (vla-get-tagstring (car olist)))
(setq otxt (vla-get-textstring (car olist)))
(if (and (eq otag "MODULENAME")
(eq otxt "RM-01-01"));and
(vla-put-textString (car olist) rm_name) ;update textstring
);if
(setq olist (cdr olist)) ;counter
(princ "\n")
);while
);progn
);if
);vlax-for o
我被困在如何确保我只更新我插入的块。我可以看到变量“wiringblk”是块引用,但我似乎不能将其限制为仅更新该块。
感谢所有能帮忙的人,
接线盒 如果父块包含属性化插入,则父块的所有插入将具有相同的嵌套块属性。我认为您必须重新定义块表定义,以更改嵌套块值,而这反过来将更新块插入的所有实例。
Block Table Information....
Select objects: L
1 found
INSERT - TEMP1
INSERT -TESTB Lay-0 Scl-1.00,1.00,1.00
ATTRIB 8.0 62.ByLayer6.ByLayer
SEQEND 8.0 62.ByLayer6.ByLayer
INSERT -TESTC Lay-0 Scl-1.00,1.00,1.00
ATTRIB 8.0 62.ByLayer6.ByLayer
SEQEND 8.0 62.ByLayer6.ByLayer
INSERT -TESTC Lay-0 Scl-1.00,1.00,1.00
ATTRIB 8.0 62.ByLayer6.ByLayer
SEQEND 8.0 62.ByLayer6.ByLayer
块TEMP1包含3个嵌套插入。如果更改其中一个嵌套插入属性的值,则所有TEMP1插入都将更新。
-大卫 所以我可能会更幸运地分解块并在文字后更新嵌套块?
有没有办法判断这些块是原始父块的一部分,并用它来构建选择集? 我认为最好使用更新的属性创建另一个块定义。 如果插入块始终位于当前图形之外,则可以在插入期间使用增量计数器
命令:INSERT temp2=temp1
命令:INSERT temp3=temp1
然后在插入后立即重新定义每个块表
如果块仅在当前图形中定义,则不能使用此方法。
至于爆炸,我会尝试以下方法:
(setq le(entlast));;;记录最后一个实体
(命令“_.INSERT”“*TEMP1”'(0 0)1 0)
(setq fe(entnext le));;;le之后的第一个实体
如果插入是图形中的第一个图元,则此操作将失败
前导*将自动分解插入
整个过程可能有点复杂,但会给你更多的灵活性
-大卫 您可以使用类似的方法创建块的重复定义,然后更改其中的属性:
;; AddDuplicateDefinition
;; Adds a Duplicate Block Definition
;; Args: Name of existing block to duplicate
;; Returns: VLA Block Object (Definition)
(defun AddDuplicateDefinition ( blockname / blocks block doc ObjLst dupe )
;; © Lee Mac~04.06.10
(vl-load-com)
(if
(setq block
(Itemp
(setq blocks
(vla-get-Blocks
(setq doc
(vla-get-ActiveDocument
(vlax-get-acad-object)
)
)
)
)
blockname
)
)
(progn
(vlax-for obj block (setq ObjLst (cons obj ObjLst)))
(vla-CopyObjects doc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbObject
(cons 0 (1- (length ObjLst)))
)
ObjLst
)
)
(setq dupe
(vla-Add blocks
(vla-get-origin block)
(
(lambda ( # / s )
(while
(Itemp blocks
(setq s
(strcat blockname
(itoa (setq # (1+ #)))
)
)
)
)
s
)
0
)
)
)
)
)
)
dupe
)
(defun Itemp ( coll item )
(if
(not
(vl-catch-all-error-p
(setq item
(vl-catch-all-apply
(function vla-item) (list coll item)
)
)
)
)
item
)
) 几分钟后我会试一试。感谢您的快速回复。 当然,你在vlisp方面很有天赋,它工作得很好,但不幸的是,老板不喜欢为了命名的目的,在每个图形中都有同一块的多个实例。担心这可能会影响一些外部参考或数据提取,我们将在未来的道路上工作。
同时,我又回来分解块并更新单个引用。 谢谢,伙计,我很高兴你能让它工作
页:
[1]