- 积分
- 59494
- 明经币
- 个
- 注册时间
- 2005-11-29
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2014-3-30 00:10:53
|
显示全部楼层
本帖最后由 llsheng_73 于 2014-3-30 00:15 编辑
你这里有几个问题,第一ss1里边可能存在多个图元在同一图层,会导致某些图层上的图元会进行反复修改
第二先进入循环再判断这是不合适的,如果在(setq SS1 (ssget ":L") I 0)的时候直接右键,它下一句(SETQ s (SSNAME SS1 I))就会出错,后边的判断不会起作用,反之,这个判断它也不必要了
另外,由于用了":L"方式进行选择,锁定图层是不会被选中的,所以对于图层的处理是没有心要的
要实现你多选进行按图层修改的目的,应该先得到那个选择集所涉及到的图层列表,再一个个图层进行处理
比如
(defun c:tt1( / a i la lys m s ss1)
(setq SS1 (ssget ) lys nil I 0)
(if ss1(repeat(sslength ss1)
(setq la(cdr(assoc 8(entget(ssname ss1 i))))
lys(if(member la lys)lys(cons la lys))
i(1+ i))))
(foreach x lys
(entmod(subst'(70 . 0)(assoc 70(setq la(entget(Tblobjname"layer" x))))la))
(setq s(ssget"X"(list(cons 8 x)))m 0)
(repeat(sslength s)
(entmod(setq a(entget(ssname s m))m(1+ m)a(append(vl-remove(assoc 6 a)a)'((6 . "Continuous")))))
)
(entmod la)
)
(princ)
)
另外,对于组码值是字串的情况,它可以不组成表而用字串把它们接起来,比如(ssget"X"'((8 . "A*,图层1,GCD,DH")))这是可以的,但是由于你一次多选很多图元,一是它们可能处于不同的图层,二是这些图层可能有的被锁定而导致这些图层不可编辑,对锁定图层的图元进行ENTMOD会夫效,所以还是需要得到图层表,以便对它们进行解锁,当然,最后还得恢复它们,这就需要保存图层数据
比如
(defun c:tt2( / a i la lys m s ss1)
(setq SS1 (ssget ) lys nil la""I 0)
(if ss1(repeat(sslength ss1)
(setq la(cdr(assoc 8(entget(ssname ss1 i))))
lys(if(member la lys)lys(cons la lys))
i(1+ i))))
(foreach x lys
(setq la(strcat la","x)a(entget(Tblobjname"layer" x))
lys(subst a x lys))
(entmod(subst'(70 . 0)(assoc 70 a)a)))
(setq s(ssget"X"(list(cons 8 la)))m 0)
(repeat(sslength s)
(entmod(setq a(entget(ssname s m))m(1+ m)a(append(vl-remove(assoc 6 a)a)'((6 . "Continuous")))))
)
(mapcar'entmod lys)
(princ)
)
建议用TT2的方式,只需要把循环修改图元那部分换成VLA的方法来实现的话,应该也会很高效的,毕竟图层再多也是有限的,而图元可能会有很多,如果没有高效的VLA方法的话,可能也只有用COMMAND调用CAD命令来修改才会快些了 |
|