明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4182|回复: 15

[讨论] 高效ENTMOD的方法(不需要SUBST但对某些图元无效)

  [复制链接]
发表于 2013-11-24 12:19 | 显示全部楼层 |阅读模式
本帖最后由 llsheng_73 于 2013-11-24 13:22 编辑

      一般情况下我们修改图元都是先(setq a (entget ename))取得它的完整数据,再用SUBST去更换对应的组码值,比如(setq a(subst (cons 1 "")(assoc 1 a)a)这样来修改一个text图元的文字内容,总之基本就是先对完整的组码值的某一项或者某几项进行修改,最后再(entmod a)
那天看了http://bbs.mjtd.com/forum.php?mo ... &fromuid=202795这个帖子后继续试验之下结果很多平时意想不到的结果,changyiran 在帖子中用(entmod(vl-remove-if'(lambda(x)(and(/=(car x)10)(/=(car x)-1)))(entget(car(entsel)))))去掉除-1组和10组之外的所有数据后进行ENTMOD,居然也能起作用,当然对多线段等会出现怪事,具体可以去原贴看看
基于该贴楼主的想法,我首先进行了更大胆的尝试,就是只要-1组,别的全部不要(entmod(list(assoc -1(entget(car(entsel))))))这样的结果它居然是也不会出错。并且按ENTMOD的帮助说明,它返回了非nil结果((-1 . <图元名: 7ef61fb0>))说明entmod起了作用,多线段也没有在0,0,0这个位置增加两个顶点。
      但是这样达不到我们对图元进行修改的目的,于是又想,可不可能在((-1 . <图元名: 7ef61fb0>))后边添加一些东西对图元进行修改?
      经过测试,除了多线段、spline、椭圆、MTEXT等一些图元外,比如圆、直线、文字等图元居然真能起到作用。。。。
      比如(entmod(list(assoc -1(entget(car(entsel"选择文字"))))(cons 1 "test")(cons 8 "图层1")(cons 50 45)(cons 62 1)(cons 370 5)))可以对文字的内容、图层、旋转角、颜色、线宽一次性进行修改。(当然也可以对字高、字体等进行修改,只需要加上它们,相应的不需要改什么可以去掉其对应项)
      这样一来我们对于一些图元的修改就会非常简单而不是必须用SUBST(用SUBST时一般要修改多少项就得subst多少次)而直接把需要的结果给在-1组码后边对图元进行修改(entmod(list(assoc -1(entget(car(entsel"直线"))))(cons 10 (getpoint"将起点改变到"))))。可以说比用VLA-PUT更简单,心动了么?但是心动也没用,这样的办法不是对所有图元有效,对前边提到不起作用的图元(肯定还有更多不支持的)它是无效的,甚至不能这样改多线段的颜色或者图层(entmod(list(assoc -1(entget(car(entsel"选择多线段"))))(cons 62 1)(cons 8 "图层1")))它也能返回但实际上颜色和图层都得不到更改,如果试图通过(entmod(list(assoc -1(entget(car(entsel"选择多线段"))))(cons 70 1)))去改变它的闭合性,对不起,它不会闭合不说,还会在原点处多出两个点来。。。
      总之,个人觉得有必要仔细测试下这种方法的适用图元和不适用图元,因为这样更改图元确实比以往更方便,但它不适用的图元也很多(并不只是对图层等tbl元素无效)因此需要大量的测试。
      希望大家用这种办法接着测试各种图元并把不能起作用的和能起作用的图元类分出来并把测试结果跟到后边,这样一个测试几个会很快把它们分出来,以避免大家重复劳动        
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-12-8 12:07 | 显示全部楼层
感谢各位大佬分享~
 楼主| 发表于 2013-11-24 12:37 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-11-24 14:09 编辑

接楼顶,对图元取-1组,0组,100组后,又有很多可以进行修改了,比如
(setq a(entget(car(entsel))))
(entmod(list(assoc -1 a)(assoc 0 a)(assoc 100 a)(cons 62 1)(cons 8 "图层1")))会对所有图元起效,但是MTEXT它的内容被清空,别的数据除了颜色和图层并指定进行了修改外没变;多线段当然还是很气人
(setq b(entget(car(entsel))))
(entmod(list(assoc -1 b)(assoc 0 b)(assoc 100 b)'(100 . "AcDbPolyline")(assoc 90 b)(cons 62 1)(cons 8 "图层2")))
这样一来多线段会被去掉所有顶点但它还存在,如果把 90组去掉,所有顶点都会存在,但会增加'(0 0 0)这个顶点两次

对填充无效....


.....继续研究之.....也期待你一起研究
发表于 2013-11-25 07:57 | 显示全部楼层
之前我也从明经看到过这样的例子,然后回去研究,也是楼主说的方法,只用entmod,没用subst,等应用到mtext时,就不起作用了,后来,自己加上subst后,对mtext才起了作用。
“经过测试,除了多线段、spline、椭圆、MTEXT等一些图元外,比如圆、直线、文字等图元居然真能起到作用。。。。”
谢楼主总结。
发表于 2013-11-25 07:59 | 显示全部楼层
哦,补充一下,就是如果把Mtexty打散一下,然后这个命令还是可以起作用的。
发表于 2013-11-26 09:01 | 显示全部楼层
很有意思啊,我也试试
发表于 2014-7-30 11:15 | 显示全部楼层
正是我所需要的,谢谢3哥了...
发表于 2014-11-16 11:58 | 显示全部楼层
这样的速度会不会快一些呢
发表于 2014-12-2 16:18 | 显示全部楼层
嗯,蛮好的,谢谢,好用
发表于 2015-9-2 19:15 来自手机 | 显示全部楼层
真是精益求精
发表于 2015-9-3 15:21 来自手机 | 显示全部楼层
这其实就是entmake,然后生成的图元名与原来的一样,个人理解。( ω )羞羞哒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 08:06 , Processed in 0.522246 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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