把外部引用的图层改为灰色,无法改回来
本帖最后由 happysheep 于 2014-3-1 10:33 编辑简单的说,我的问题就是:包含外部引用的图形,把包括外部引用在内的所有层变成灰色,并记录原来的颜色,再读取记录全部变回来。
怎么做呢??
——————————————————————————————————
以下程序,功能是:
sl命令:选择一个对象,设为当前层,除本对象所在图层外,其他图层锁定并变为灰色,在词典中记录变色的图层原来的颜色……所有图层,包括外部引用的图层都会变色。
ull命令:所有图层解除锁定,并按照词典中的颜色把各层的颜色变回来……外部引用的图层变不回来,但是普通层能变回来。
我要怎么改,才能让ull命令全部解除锁定的时候,外部引用的图层颜色也能变回来呢?
求教~~;;;生成图层列表
(vl-load-com)
(defun laytab ()
(setq first T)
(setq layertab '())
(while (setq lay1 (tblnext "layer" first))
(if(= first T)
(setq first nil)
)
(if(/= lay1 nil)
(progn (setq lay2 (cdr (assoc 2 lay1)))
(setq layertab (cons lay2 layertab))
)
)
)
)
(defun locks (e / laytab n m n lay_ent lay_c layname)
(setq n (length layertab))
(setq m 0)
(setq h (cdr (assoc 8 (entget e))))
(vla-put-ActiveLayer
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-item (vla-get-layers doc) h)
)
(while (/= m n)
(if (/= h (setq layname (nth m layertab)))
(progn (setq lay_ent (entget (tblobjname "layer" layname)))
(setq lay_c (cdr (assoc 62 lay_ent)))
(VLAX-LDATA-PUT "date" layname lay_c)
(setq lay_ent (subst '(62 . 252) (assoc 62 lay_ent) lay_ent)
lay_ent (subst '(70 . 4) '(70 . 0) lay_ent)
)
(entmod lay_ent)
);依次对各层锁定、改色
)
(setq m (1+ m))
)
)
;;;全部解锁
(defun unall (/ laytab n m n lay_ent lay_c layname)
(setq n (length layertab))
(setq m 0)
(while (/= m n)
(setq layname (nth m layertab))
(setq lay_ent (entget (tblobjname "layer" layname)))
(if (= (cdr (assoc 62 lay_ent)) 252);如果该层颜色是252则改色
(progn (if (setq lay_c (VLAX-LDATA-get "date" layname))
(setq lay_ent (subst (cons 62 lay_c) (assoc 62 lay_ent) lay_ent))
)
(setq lay_ent (subst '(70 . 0) '(70 . 4) lay_ent));所有层都解锁
(VLAX-LDATA-delete "date" layname)
(entmod lay_ent)
)
)
(setq m (1+ m))
)
)
;;;全部解锁
(defun c:ull ()
(laytab)
(setvar "cmdecho" 0)
(command "_.undo" "be")
(unall)
(command "_.undo" "e")
(setvar "cmdecho" 1)
)
;;;单选解锁反锁
(defun c:sl ()
(setvar "cmdecho" 0)
(command "_.undo" "be")
(if (setq e (car (entsel "\n选择需要编辑的图层上的物体:")))
(progn
(laytab) (unall) (locks e)
)
)
(command "_.undo" "e")
(setvar "cmdecho" 1)
) 自己顶吧,求教~ happysheep 发表于 2014-3-1 10:34 static/image/common/back.gif
自己顶吧,求教~
;;;生成图层列表
(vl-load-com)
(defun laytab ()
(setq first T)
(setq layertab '())
(while (setq lay1 (tblnext "layer" first))
(if(= first T)
(setq first nil)
)
(if(/= lay1 nil)
(progn (setq lay2 (cdr (assoc 2 lay1)))
(setq layertab (cons lay2 layertab))
)
)
)
)
(defun locks (e / laytab n m n lay_ent lay_c layname)
(setq n (length layertab))
(setq m 0)
(setq h (cdr (assoc 8 (entget e))))
(vla-put-ActiveLayer
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-item (vla-get-layers doc) h)
)
(while (/= m n)
(if (/= h (setq layname (nth m layertab)))
(progn (setq lay_ent (entget (tblobjname "layer" layname)))
(setq lay_c (cdr (assoc 62 lay_ent)))
(setq layhad(cdr(assoc 5 lay_ent)))
(VLAX-LDATA-PUT "date" layhad lay_c)
(setq lay_ent (subst '(62 . 252) (assoc 62 lay_ent) lay_ent)
lay_ent (subst '(70 . 4) '(70 . 0) lay_ent)
)
(entmod lay_ent)
);依次对各层锁定、改色
)
(setq m (1+ m))
)
;(princ (VLAX-LDATA-list "date" ))测试存储结果
)
;;;全部解锁
(defun unall (/ laytab n m n lay_ent lay_c layname)
(setq n (length layertab))
(setq m 0)
(while (/= m n)
(setq layname (nth m layertab))
(setq lay_ent (entget (tblobjname "layer" layname))
lay_hand (cdr(assoc 5 lay_ent)))
(if (= (cdr (assoc 62 lay_ent)) 252);如果该层颜色是252则改色
(progn (if (setq lay_c (VLAX-LDATA-get "date" lay_hand))
(setq lay_ent (subst (cons 62 lay_c) (assoc 62 lay_ent) lay_ent))
)
(setq lay_ent (subst '(70 . 0) '(70 . 4) lay_ent));所有层都解锁
(VLAX-LDATA-delete "date" lay_hand)
(entmod lay_ent)
)
)
(setq m (1+ m))
)
)
;;;全部解锁
(defun c:ull ()
(laytab)
(setvar "cmdecho" 0)
(command "_.undo" "be")
(unall)
(command "_.undo" "e")
(setvar "cmdecho" 1)
)
;;;单选解锁反锁
(defun c:sl ()
(setvar "cmdecho" 0)
(command "_.undo" "be")
(if (setq e (car (entsel "\n选择需要编辑的图层上的物体:")))
(progn
(laytab) (unall) (locks e)
)
)
(command "_.undo" "e")
(setvar "cmdecho" 1)
)
edata 发表于 2014-3-1 11:48 static/image/common/back.gif
感谢edata!
原来用图元名,而不是图层名字,就可以变灰色了,学习了。
这里,我还有个问题,如下代码和上面那些是同一系统的,功能是选择一个对象,然后锁定并变灰该对象所在的图层,但是如果选择的是个外部引用,其内部的图层就不能被操作,原因是根据选择集无法得到外部引用内部图层的图元名,怎么解决这个问题呢?(defun lockl (e / layname lay_ent lay_c)
(setq layname (cdr (assoc 8 (entget e))))
(setq lay_ent (entget (tblobjname "layer" layname)))
(setq lay_hand (cdr(assoc 5 lay_ent)))
(if (= (cdr (assoc 70 lay_ent)) 0)
(progn (setq lay_c (cdr (assoc 62 lay_ent)))
(VLAX-LDATA-PUT "date" lay_hand lay_c)
(setq lay_ent (subst '(62 . 252) (assoc 62 lay_ent) lay_ent)
lay_ent (subst '(70 . 4) '(70 . 0) lay_ent);锁住图层
)
(entmod lay_ent);在图纸上更新数据库内的图元
)
)
)
(defun c:ll ()
(setvar "cmdecho" 0)
(command "_.undo" "be")
(prompt "\n选择需锁定层上的图元:")
(if (setq e_ss (ssget))
(progn (setq n (sslength e_ss))
(setq m 0)
(while (/= m n)
(setq e (ssname e_ss m))
(lockl e)
(setq m (1+ m))
)
)
)
(command "_.undo" "e")
(setvar "cmdecho" 1)
) 自己顶一下.......... 最好把那单选解锁反锁改为框选,这样效率要高些
页:
[1]