你好
有时,当我从其他人那里获得绘图时,我需要将所有实体映射到适当的层,例如,尺寸放在不同的层上,你想让它们放在一个层上吗?。
隔离很好,但它无法解决上述问题,因为它基于层。因此,我编写了一个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 target layer doesnt exist, 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 "[Restore/Update/New]"))
- (cond
- ((eq case "Restore") (alert case))
- ((eq case "Update") (alert case))
- ((eq case "New") (alert case))
- (T case)
- )
-
- )
|