Whorse 发表于 2022-7-6 11:03:07

如何更新

我们使用了大量的块,并创建了一些块,这些块是用于特定应用的一组块。问题是,我似乎无法更新仅包含在我刚刚插入的块中的嵌套块的属性。
 
我在网上找到的唯一代码更新了图形中的所有嵌套块,而不是特定块。
 
这里有一个片段
 

(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”是块引用,但我似乎不能将其限制为仅更新该块。
 
感谢所有能帮忙的人,
 
接线盒

David Bethel 发表于 2022-7-6 11:16:10

如果父块包含属性化插入,则父块的所有插入将具有相同的嵌套块属性。我认为您必须重新定义块表定义,以更改嵌套块值,而这反过来将更新块插入的所有实例。
 
 

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插入都将更新。
 
-大卫

Whorse 发表于 2022-7-6 11:24:30

所以我可能会更幸运地分解块并在文字后更新嵌套块?
 
有没有办法判断这些块是原始父块的一部分,并用它来构建选择集?

Lee Mac 发表于 2022-7-6 11:27:42

我认为最好使用更新的属性创建另一个块定义。

David Bethel 发表于 2022-7-6 11:37:43

如果插入块始终位于当前图形之外,则可以在插入期间使用增量计数器
 
命令:INSERT temp2=temp1
 
命令:INSERT temp3=temp1
 
然后在插入后立即重新定义每个块表
 
如果块仅在当前图形中定义,则不能使用此方法。
 
 
 
至于爆炸,我会尝试以下方法:
 
(setq le(entlast));;;记录最后一个实体
(命令“_.INSERT”“*TEMP1”'(0 0)1 0)
(setq fe(entnext le));;;le之后的第一个实体
 
 
如果插入是图形中的第一个图元,则此操作将失败
 
前导*将自动分解插入
 
整个过程可能有点复杂,但会给你更多的灵活性
 
 
-大卫

Lee Mac 发表于 2022-7-6 11:42:04

您可以使用类似的方法创建块的重复定义,然后更改其中的属性:
 

;; 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
)
)

Whorse 发表于 2022-7-6 11:49:22

几分钟后我会试一试。感谢您的快速回复。

Whorse 发表于 2022-7-6 11:58:02

当然,你在vlisp方面很有天赋,它工作得很好,但不幸的是,老板不喜欢为了命名的目的,在每个图形中都有同一块的多个实例。担心这可能会影响一些外部参考或数据提取,我们将在未来的道路上工作。
 
同时,我又回来分解块并更新单个引用。

Lee Mac 发表于 2022-7-6 12:08:07

谢谢,伙计,我很高兴你能让它工作
页: [1]
查看完整版本: 如何更新