happysheep 发表于 2014-2-28 16:39:28

把外部引用的图层改为灰色,无法改回来

本帖最后由 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:20

自己顶吧,求教~

edata 发表于 2014-3-1 11:48:31

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)
)


happysheep 发表于 2014-3-2 10:26:58

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)
)

happysheep 发表于 2014-3-4 12:46:21

自己顶一下..........

lz123456 发表于 2014-3-5 09:30:00

最好把那单选解锁反锁改为框选,这样效率要高些
页: [1]
查看完整版本: 把外部引用的图层改为灰色,无法改回来