明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2525|回复: 5

[已解答] 把外部引用的图层改为灰色,无法改回来

[复制链接]
发表于 2014-2-28 16:39 | 显示全部楼层 |阅读模式
本帖最后由 happysheep 于 2014-3-1 10:33 编辑

简单的说,我的问题就是:包含外部引用的图形,把包括外部引用在内的所有层变成灰色,并记录原来的颜色,再读取记录全部变回来。

怎么做呢??


——————————————————————————————————
以下程序,功能是:

sl命令:选择一个对象,设为当前层,除本对象所在图层外,其他图层锁定并变为灰色,在词典中记录变色的图层原来的颜色……所有图层,包括外部引用的图层都会变色。
ull命令:所有图层解除锁定,并按照词典中的颜色把各层的颜色变回来……外部引用的图层变不回来,但是普通层能变回来。

我要怎么改,才能让ull命令全部解除锁定的时候,外部引用的图层颜色也能变回来呢?

求教~~
  1. ;;;生成图层列表
  2. (vl-load-com)
  3. (defun laytab ()
  4.   (setq first T)
  5.   (setq layertab '())
  6.   (while (setq lay1 (tblnext "layer" first))
  7.     (if  (= first T)
  8.       (setq first nil)
  9.     )
  10.     (if  (/= lay1 nil)
  11.       (progn (setq lay2 (cdr (assoc 2 lay1)))
  12.        (setq layertab (cons lay2 layertab))
  13.       )
  14.     )
  15.   )
  16. )

  17. (defun locks (e / laytab n m n lay_ent lay_c layname)
  18.   (setq n (length layertab))
  19.   (setq m 0)
  20.   (setq h (cdr (assoc 8 (entget e))))
  21.   
  22.   (vla-put-ActiveLayer
  23.     (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  24.     (vla-item (vla-get-layers doc) h)
  25.   )
  26.   
  27.   (while (/= m n)
  28.     (if (/= h (setq layname (nth m layertab)))
  29.       (progn (setq lay_ent (entget (tblobjname "layer" layname)))
  30.        (setq lay_c (cdr (assoc 62 lay_ent)))
  31.        (VLAX-LDATA-PUT "date" layname lay_c)
  32.        (setq lay_ent (subst '(62 . 252) (assoc 62 lay_ent) lay_ent)
  33.        lay_ent (subst '(70 . 4) '(70 . 0) lay_ent)
  34.        )
  35.        (entmod lay_ent)
  36.       );依次对各层锁定、改色
  37.     )
  38.     (setq m (1+ m))
  39.   )
  40. )



  41. ;;;全部解锁
  42. (defun unall (/ laytab n m n lay_ent lay_c layname)
  43.   (setq n (length layertab))
  44.   (setq m 0)
  45.   (while (/= m n)
  46.     (setq layname (nth m layertab))
  47.     (setq lay_ent (entget (tblobjname "layer" layname)))
  48.      (if (= (cdr (assoc 62 lay_ent)) 252);如果该层颜色是252则改色
  49.       (progn (if (setq lay_c (VLAX-LDATA-get "date" layname))
  50.               (setq lay_ent (subst (cons 62 lay_c) (assoc 62 lay_ent) lay_ent))
  51.        )
  52.        (setq lay_ent (subst '(70 . 0) '(70 . 4) lay_ent));所有层都解锁
  53.        (VLAX-LDATA-delete "date" layname)
  54.        (entmod lay_ent)
  55.       )
  56.     )
  57.     (setq m (1+ m))
  58.   )
  59. )


  60. ;;;全部解锁
  61. (defun c:ull ()
  62.   (laytab)
  63.   (setvar "cmdecho" 0)
  64.   (command "_.undo" "be")
  65.   (unall)
  66.   (command "_.undo" "e")
  67.   (setvar "cmdecho" 1)
  68. )

  69. ;;;单选解锁反锁
  70. (defun c:sl ()
  71.   (setvar "cmdecho" 0)
  72.   (command "_.undo" "be")
  73.   (if (setq e (car (entsel "\n选择需要编辑的图层上的物体:")))
  74.     (progn
  75.       (laytab) (unall) (locks e)
  76.     )
  77.   )
  78.   (command "_.undo" "e")
  79.   (setvar "cmdecho" 1)
  80. )
 楼主| 发表于 2014-3-1 10:34 | 显示全部楼层
自己顶吧,求教~
发表于 2014-3-1 11:48 | 显示全部楼层
happysheep 发表于 2014-3-1 10:34
自己顶吧,求教~

  1. ;;;生成图层列表
  2. (vl-load-com)
  3. (defun laytab ()
  4.   (setq first T)
  5.   (setq layertab '())
  6.   (while (setq lay1 (tblnext "layer" first))
  7.     (if  (= first T)
  8.       (setq first nil)
  9.     )
  10.     (if  (/= lay1 nil)
  11.       (progn (setq lay2 (cdr (assoc 2 lay1)))
  12.        (setq layertab (cons lay2 layertab))
  13.       )
  14.     )
  15.   )
  16. )

  17. (defun locks (e / laytab n m n lay_ent lay_c layname)
  18.   (setq n (length layertab))
  19.   (setq m 0)
  20.   (setq h (cdr (assoc 8 (entget e))))
  21.   
  22.   (vla-put-ActiveLayer
  23.     (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  24.     (vla-item (vla-get-layers doc) h)
  25.   )
  26.   
  27.   (while (/= m n)
  28.     (if (/= h (setq layname (nth m layertab)))
  29.       (progn (setq lay_ent (entget (tblobjname "layer" layname)))       
  30.        (setq lay_c (cdr (assoc 62 lay_ent)))
  31.         (setq layhad(cdr(assoc 5 lay_ent)))
  32.        (VLAX-LDATA-PUT "date" layhad lay_c)
  33.        (setq lay_ent (subst '(62 . 252) (assoc 62 lay_ent) lay_ent)
  34.        lay_ent (subst '(70 . 4) '(70 . 0) lay_ent)
  35.        )
  36.        (entmod lay_ent)
  37.       );依次对各层锁定、改色
  38.     )
  39.     (setq m (1+ m))
  40.   )
  41.   ;(princ (VLAX-LDATA-list "date" ))测试存储结果
  42. )



  43. ;;;全部解锁
  44. (defun unall (/ laytab n m n lay_ent lay_c layname)
  45.   (setq n (length layertab))
  46.   (setq m 0)  
  47.   (while (/= m n)
  48.     (setq layname (nth m layertab))
  49.     (setq lay_ent (entget (tblobjname "layer" layname))
  50.           lay_hand (cdr(assoc 5 lay_ent)))
  51.      (if (= (cdr (assoc 62 lay_ent)) 252);如果该层颜色是252则改色
  52.       (progn (if (setq lay_c (VLAX-LDATA-get "date" lay_hand))                                  
  53.               (setq lay_ent (subst (cons 62 lay_c) (assoc 62 lay_ent) lay_ent))             
  54.        )
  55.        (setq lay_ent (subst '(70 . 0) '(70 . 4) lay_ent));所有层都解锁
  56.        (VLAX-LDATA-delete "date" lay_hand)
  57.        (entmod lay_ent)
  58.       )
  59.     )
  60.     (setq m (1+ m))
  61.   )
  62. )


  63. ;;;全部解锁
  64. (defun c:ull ()
  65.   (laytab)
  66.   (setvar "cmdecho" 0)
  67.   (command "_.undo" "be")
  68.   (unall)
  69.   (command "_.undo" "e")
  70.   (setvar "cmdecho" 1)
  71. )

  72. ;;;单选解锁反锁
  73. (defun c:sl ()
  74.   (setvar "cmdecho" 0)
  75.   (command "_.undo" "be")
  76.   (if (setq e (car (entsel "\n选择需要编辑的图层上的物体:")))
  77.     (progn
  78.       (laytab) (unall) (locks e)
  79.     )
  80.   )
  81.   (command "_.undo" "e")
  82.   (setvar "cmdecho" 1)
  83. )


 楼主| 发表于 2014-3-2 10:26 | 显示全部楼层
edata 发表于 2014-3-1 11:48

感谢edata!
原来用图元名,而不是图层名字,就可以变灰色了,学习了。

这里,我还有个问题,如下代码和上面那些是同一系统的,功能是选择一个对象,然后锁定并变灰该对象所在的图层,但是如果选择的是个外部引用,其内部的图层就不能被操作,原因是根据选择集无法得到外部引用内部图层的图元名,怎么解决这个问题呢?
  1. (defun lockl (e / layname lay_ent lay_c)
  2.   (setq layname (cdr (assoc 8 (entget e))))
  3.   (setq lay_ent (entget (tblobjname "layer" layname)))
  4.   (setq lay_hand (cdr(assoc 5 lay_ent)))
  5.   (if (= (cdr (assoc 70 lay_ent)) 0)
  6.     (progn (setq lay_c (cdr (assoc 62 lay_ent)))
  7.            (VLAX-LDATA-PUT "date" lay_hand lay_c)
  8.            (setq lay_ent (subst '(62 . 252) (assoc 62 lay_ent) lay_ent)
  9.                  lay_ent (subst '(70 . 4) '(70 . 0) lay_ent);锁住图层
  10.            )
  11.            (entmod lay_ent);在图纸上更新数据库内的图元
  12.     )
  13.   )
  14. )

  15. (defun c:ll ()
  16.   (setvar "cmdecho" 0)
  17.   (command "_.undo" "be")
  18.   (prompt "\n选择需锁定层上的图元:")
  19.   (if (setq e_ss (ssget))
  20.     (progn (setq n (sslength e_ss))
  21.            (setq m 0)
  22.            (while (/= m n)
  23.              (setq e (ssname e_ss m))
  24.              (lockl e)
  25.              (setq m (1+ m))
  26.            )
  27.     )
  28.   )
  29.   (command "_.undo" "e")
  30.   (setvar "cmdecho" 1)
  31. )
 楼主| 发表于 2014-3-4 12:46 | 显示全部楼层
自己顶一下..........
发表于 2014-3-5 09:30 | 显示全部楼层
最好把那单选解锁反锁改为框选,这样效率要高些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 03:52 , Processed in 0.275031 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表