960322 发表于 2023-8-9 23:11:03

如何entmod一个块定义

比如我再图中定义了图块,块名为"a",现在插入的一个图块中某个图元的颜色,如何entmod块a,达到更新整个图中包括块中块中的图块a,的效果。看了帮助,说“如果用 entmod 函数修改了块定义中的图元,该修改会影响图形中该块的所有实例。“    tblobjname 返回的图元名可以用于 entget 和 entmod 操作。

liuhe 发表于 2023-8-10 08:32:05

本帖最后由 liuhe 于 2023-8-10 09:26 编辑

警告! 可以用 entmod 函数修改块定义中的图元,但这样做可能会生成引用自身的块,导致 AutoCAD 系统崩溃。


给你一个参考,修改块中直线的图层,必须要刷新显示

(DEFUN C:TT ()
(SETQ NAME (CDR (ASSOC 2 (ENTGET (CAR (ENTSEL))))))
(setq ent (tblobjname "Block" NAME))
(while (setq ent (entnext ent))
    (IF        (= "LINE" (CDR (ASSOC 0 (ENTGET ENT))))
      (entmod (SUBST (CONS 8 "2") (ASSOC 8 (entget ent)) (entget ent)))
      
    )
)
(setq thisdrawing
       (vla-get-activedocument
               (vlax-get-acad-object)))

(vla-Regen thisdrawing acAllViewports)
(princ)
)

960322 发表于 2023-8-11 14:15:32

liuhe 发表于 2023-8-11 08:49
你这说话 前言不搭后语,用不用vla-regen,跟你画图有啥关系。论坛一堆能够抄袭代码用于块内操作

不好意思,说得不清楚。 就是这样:
(setq en (entsel));;;此处点选图块
(setq nentlst (nentselp(cadr en)   ))
(vla-put-color(vlax-ename->vla-object(carnentlst))   3)
如果开始点选的是图块a中的一条线, 现在图块a是图块b的一个子图元,也就是说块a是块b的块中块。请问如何更新图块B中的图块a。
如果遍历图块,找到包含有块a的所有图块再更新,或则全图重生成,速度有时候很慢。 我就想高明白block重定义一下图块后,全图所有的图块都会更新,速度非常块,不知道是怎么做的

liuhe 发表于 2023-8-11 14:23:51

960322 发表于 2023-8-11 14:15
不好意思,说得不清楚。 就是这样:
(setq en (entsel));;;此处点选图块
(setq nentlst (nentselp(ca ...

你更新了图块a,图块b中的a自然会变动。关键是你对图块a的更新成功了吗?块中块的更新只是判断图元是不是块,如果是块,就进行递归,比如修改块中块的颜色。我不建议你用lisp entmod更新块,而是用vlisp的函数,进行嵌套快的处理。论坛搜索块中块,代码一大堆可以抄,实在不行就花钱定制

960322 发表于 2023-8-9 23:23:42

我这样试了下,好像不行
(setq ent (tblobjname "Block" "a"))
(while (setq ent (entnext ent))             
(entmod(entget ent))
)

飞雪神光 发表于 2023-8-9 23:40:04

960322 发表于 2023-8-9 23:23
我这样试了下,好像不行
(setq ent (tblobjname "Block" "a"))
(while (setq ent (entnext ent))              ...

啥都没改 看不出效果

960322 发表于 2023-8-10 00:21:50

就是不行啊,所以我来问呢

自贡黄明儒 发表于 2023-8-10 09:11:42

960322 发表于 2023-8-9 23:23
我这样试了下,好像不行
(setq ent (tblobjname "Block" "a"))
(while (setq ent (entnext ent))              ...

你这不是没有改吗?entmod有什么用?

960322 发表于 2023-8-10 20:22:32

我之前已经把其中一个插入的图块中的文字内容改过了,(entnext ent)也看到这个文字内容已经更新了。但是entmode没有用,不会全图的块都改

960322 发表于 2023-8-10 20:23:45

其实就是想达到用nentsel改了某个块内的图元性质,全图一起改,包括块中块。 就像用block命令重定义图块之后,全图的图块都会更新,也不用regen

liuhe 发表于 2023-8-11 08:49:25

你这说话 前言不搭后语,用不用vla-regen,跟你画图有啥关系。论坛一堆能够抄袭代码用于块内操作
页: [1] 2
查看完整版本: 如何entmod一个块定义