按目标类型隔离
你好有时,当我从其他人那里获得绘图时,我需要将所有实体映射到适当的层,例如,尺寸放在不同的层上,你想让它们放在一个层上吗?。
隔离很好,但它无法解决上述问题,因为它基于层。因此,我编写了一个lisp(我的第一个工作程序)来根据目标类型隔离实体,这意味着如果选择尺寸线,无论它们放在哪个层上,它们都是隔离的。
在下一步中,用户可以选择:
更新:重新启动
新:将所有孤立实体放置在新层上的选项
恢复:隔离并终止功能
我很高兴你能提出改进代码的建议
谢谢
S
(setq TEMPTARGETLAYERNAME "SG_TEMP")
(defun C:Test (/ ent sset i e cl)
(setq ent (entget (car (entsel "Select target entity\n"))))
(setq sset (ssget "_X" (list (assoc 0 ent)))) ;_select all entities with target type
(if (not (tblsearch "LAYER" TEMPTARGETLAYERNAME)) ;_if targetlayer doesntexist, create it
(entmake (list '(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(70 . 0)
(cons 2 TEMPTARGETLAYERNAME)
(cons 62 2)
)
)
) ;_if
(setvar "clayer" TEMPTARGETLAYERNAME)
(setq i 0)
(while (< i (sslength sset))
(setq e (entget (ssname sset i)))
(entmod (subst (cons 8 TEMPTARGETLAYERNAME) (assoc 8 e) e)) ;_replace the sset entites layer to target
(setq i (1+ i))
)
(while (setq la (tblnext "LAYER" (null la))) ;_set all layers (except target) to froozen
(if (not (equal (assoc 2 la) (cons 2 TEMPTARGETLAYERNAME)))
(progn
(setq ob (tblobjname "LAYER" (cdr (assoc 2 la))))
(setq ladef (entget ob))
(if (assoc 70 ladef)
(entmod (subst (cons 70 1) (assoc 70 ladef) ladef))
(entmod (append la '((70 . 1))))
)
)
)
)
(initget 7 "Restore Update New")
(setq case (getkword ""))
(cond
((eq case "Restore") (alert case))
((eq case "Update") (alert case))
((eq case "New") (alert case))
(T case)
)
)
(if (setq ent (car (entsel "\n Select target entity")))
(setq sset (ssget "_X" (list (assoc 0 (entget ent)))))
)
(not (equal (cdr (assoc 2 la)) TEMPTARGETLAYERNAME))
(entmod
(subst (cons 70 (1+ (cdr (assoc 70 (setq ladef (entget ob))))))
(assoc 70 ladef)
ladef
)
)
你会怎么单挑?我正在考虑设置撤消标记。。。 我知道你没有注意到我之前所做的事情! 我的手机在移动。我想回家试试你的segues红色代码 如何关闭iPhone中的自动完成功能?
将我上一篇文章中的1+替换为1-。
了解函数vla startUndomark和vla endundomark
这个很有趣,你从70.1跳到70.2,我不明白为什么?
谢谢
谢伊
如果一个层被锁定,dxf 70将等于1,那么如果要冻结它,则应将dxf值添加到该dxf值中,以保持该层的锁定状态,并将其冻结。 哇,做这件事很聪明
页:
[1]
2