明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1644|回复: 14

[提问] 如何entmod一个块定义

[复制链接]
发表于 2023-8-9 23:11:03 | 显示全部楼层 |阅读模式
比如我再图中定义了图块,块名为"a"  ,现在插入的一个图块中某个图元的颜色,如何entmod块a,达到更新整个图中包括块中块中的图块a,的效果。看了帮助,说  “如果用 entmod 函数修改了块定义中的图元,该修改会影响图形中该块的所有实例。“    tblobjname 返回的图元名可以用于 entget 和 entmod 操作。
发表于 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)
)

 楼主| 发表于 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  (car  nentlst))   3)
如果开始点选的是图块a中的一条线, 现在图块a是图块b的一个子图元,也就是说块a是块b的块中块。请问如何更新图块B中的图块a。
如果遍历图块,找到包含有块a的所有图块再更新,或则全图重生成,速度有时候很慢。 我就想高明白block重定义一下图块后,全图所有的图块都会更新,速度非常块,不知道是怎么做的
发表于 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的函数,进行嵌套快的处理。  论坛搜索块中块,代码一大堆可以抄,实在不行就花钱定制
 楼主| 发表于 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))              ...

啥都没改 看不出效果
 楼主| 发表于 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有什么用?
 楼主| 发表于 2023-8-10 20:22:32 | 显示全部楼层
我之前已经把其中一个插入的图块中的文字内容改过了,(entnext ent)也看到这个文字内容已经更新了。但是entmode没有用,不会全图的块都改
 楼主| 发表于 2023-8-10 20:23:45 | 显示全部楼层
其实就是想达到用nentsel改了某个块内的图元性质,全图一起改,包括块中块。 就像用block命令重定义图块之后,全图的图块都会更新,也不用regen
发表于 2023-8-11 08:49:25 | 显示全部楼层
你这说话 前言不搭后语,用不用vla-regen,跟你画图有啥关系。论坛一堆能够抄袭代码用于块内操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 03:00 , Processed in 0.187066 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表