明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3968|回复: 17

[提问] 求助,如何能够让关闭的图层打开,让打开的图层关闭

[复制链接]
发表于 2014-3-21 23:22:31 | 显示全部楼层 |阅读模式
问下,如何能够让关闭的图层打开,让打开的图层关闭,网上找了下,觉得这句可以实现,但是因为不懂编程,不知道完整的应该怎么写(vlax-put obj "layeron" (* -1 (1+ (vlax-get obj "layeron"))))
发表于 2014-3-22 03:06:24 | 显示全部楼层
就按你说的去做,打开添加到一个list然后关闭,反之关闭的打开
发表于 2014-3-22 08:10:03 | 显示全部楼层
遍历图层,如图层打开就关闭,反之就打开。
 楼主| 发表于 2014-3-22 12:09:59 | 显示全部楼层
关键是我不会编程额。。。。大侠们,帮小弟写写完整吧
发表于 2014-3-23 22:12:39 | 显示全部楼层
这个建筑提得有创意,见意版主给加5个经验值
发表于 2014-3-23 23:15:18 | 显示全部楼层
  1. ;;说明:图层控制及相关
  2. ;;程式所有权归设计者:郭维
  3. ;;日期:2014年03月09日
  4. ;; 命 令     功 能
  5. ;;  nn      将所选图元图层至为当前层
  6. ;;    ad            只显示所选图元且仅只有一个,其余冻结
  7. ;;    fa            将当前文档所有冻结图层打开
  8. ;;    qw            选择不要冻结的图元,可多选
  9. ;;    mm            将所选图元,移动到指定图元图层
  10. ;;    cf            将所选图元,复制到指定图元图层


  11. ;;**********************************************************************
  12. (vl-load-com)
  13. (Defun *Collection* ()
  14.   (setq        *AcadObject* (vlax-get-acad-object)
  15.         *DwgObject*  (vla-get-activedocument *AcadObject*)
  16.         *ModelSpace* (vla-get-modelspace *DwgObject*)
  17.         *Layers*     (vla-get-layers *DwgObject*)
  18.         *Blocks*     (vla-get-blocks *DwgObject*)
  19.         *LineTypes*  (vla-get-linetypes *DwgObject*)
  20.   )
  21. )
  22. (if(not(tblsearch "ltype" "CENTER"));;中心线加载
  23.   (progn
  24.     (*Collection*)
  25.     (vlax-invoke-method *LineTypes* 'Load  "CENTER" "acadiso.lin")
  26.     )
  27.   )
  28. (if(not(tblsearch "ltype" "DASHED"));;虚线加载
  29.   (progn
  30.     (*Collection*)
  31.     (vlax-invoke-method *LineTypes* 'Load  "DASHED" "acadiso.lin")
  32.     )
  33.   )
  34. ;;将所选图元图层至为当前层**********************************************
  35. (defun c:nn (/ EntityName VlaName CurrentlyLayer Layer *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*)
  36.   (*Collection*)
  37.   (if (setq EntityName (Car (Entsel "\n请选择要置为当前层的图元:")))
  38.     (progn
  39.       (setq VlaName           (vlax-ename->vla-object EntityName)
  40.             CurrentlyLayer (vla-get-Layer VlaName)
  41.       )
  42.       (Vlax-For        Layer *Layers*
  43.         (IF (= (Vla-Get-Name Layer) CurrentlyLayer)
  44.           (vla-put-ActiveLayer *DwgObject* Layer)
  45.         )
  46.       )
  47.     )
  48.   )
  49.   (prin1)
  50. )
  51. ;;只显示所选图元且仅只有一个,其余冻结*************************************
  52. (Defun c:ad (/ EntityName VlaName CurrentlyLayer Layer *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*)
  53.   (*Collection*)
  54.   (if (setq EntityName (Car (Entsel "\n选择不冻结的图元<仅一个>:")))
  55.     (progn
  56.       (setq VlaName           (vlax-ename->vla-object EntityName)
  57.             CurrentlyLayer (vla-get-Layer VlaName)
  58.       )
  59.       (VLAX-FOR        Layer *Layers*
  60.         (if (= (vla-get-name Layer) CurrentlyLayer)
  61.           (vla-put-ActiveLayer *DwgObject* Layer)
  62.         )
  63.       )
  64.       (VLAX-FOR        Layer *Layers*
  65.         (if (/= (vla-get-name Layer) CurrentlyLayer)
  66.           (vla-put-Freeze Layer -1)
  67.         )
  68.       )
  69.     )
  70.   )
  71.   (prin1)
  72. )
  73. ;;将当前文档所有冻结图层打开**********************************************
  74. (Defun c:fa (/ Layer *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*)
  75.   (*Collection*)
  76.   (VLAX-FOR Layer *Layers*
  77.     (if        (/= (vla-get-Freeze Layer) :vlax-false)
  78.       (progn
  79.         (vla-put-Freeze Layer 0)
  80.         (vla-put-LayerOn Layer -1)
  81.         (vla-put-lock Layer 0)
  82.       )
  83.     )
  84.   )
  85.   (vlax-invoke-method *DwgObject* 'regen acactiveviewport)
  86.   (prin1)
  87. )
  88. ;;选择不要冻结的图元,可多选*********************************************
  89. (Defun c:qw(/  *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject*
  90.               selectcollection VlaObjectList index LayerNameList Layer VlaObject)
  91.   (*Collection*)
  92.   (if (setq selectcollection (ssget))
  93.     (progn
  94.       (setq index 0 VlaObjectList nil LayerNameList nil)
  95.       (repeat (sslength selectcollection)
  96.         (setq VlaObjectList
  97.                (append VlaObjectList
  98.                        (list(vlax-ename->vla-object (ssname selectcollection index))))
  99.               )
  100.         (setq index (1+ index))
  101.       )
  102.       (foreach VlaObject  VlaObjectList
  103.         (setq LayerNameList(append LayerNameList(list (vla-get-layer VlaObject))))
  104.         )
  105.       (VLAX-FOR        Layer  *Layers*
  106.         (if
  107.           (not (= (vla-get-name layer)(vla-get-name (vla-get-activelayer *DwgObject*))))
  108.            (if (= (vla-get-name layer) (nth 0 LayerNameList))
  109.              (vla-put-activelayer *DwgObject* Layer))
  110.           )
  111.         )
  112.       (VLAX-FOR        Layer  *Layers*
  113.         (if (not (vl-position(vla-get-name Layer)LayerNameList))
  114.           (vla-put-freeze Layer -1)
  115.           )                  ;endif
  116.         )
  117.       )        ;end progn
  118.     );endif
  119.   (prin1)
  120. )
  121. ;;将所选图元,移动到指定图元图层
  122. (Defun c:mm(/  *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*
  123.             EntityCollection TargetObject index VlaObjectList TargetVlaObject
  124.             TargetLayerName VlaObject)
  125.   (*Collection*)
  126.   (if(setq EntityCollection(ssget))
  127.      (if(setq TargetObject(car(entsel "\n 选择目标图层的图元:")));Target 目标
  128.         (progn
  129.           (setq index 0 VlaObjectList nil)
  130.           (repeat (sslength EntityCollection)
  131.             (setq VlaObjectList(append VlaObjectList(list(vlax-ename->vla-object(ssname EntityCollection index)))))
  132.             (setq index(1+ index))
  133.           )
  134.           (setq TargetVlaObject(vlax-ename->vla-object TargetObject))
  135.           (setq TargetLayerName(vla-get-layer TargetVlaObject))
  136.           (foreach VlaObject VlaObjectList
  137.             (vla-put-layer VlaObject TargetLayerName)
  138.           )
  139.         )
  140.       )
  141.     )
  142.   (prin1)
  143. )
  144. ;;将所选图元,复制到指定图元图层
  145. (Defun c:cf(/ EntityCollection TargetObject index VlaObjectList TargetVlaObject TargetLayerName VlaObject)
  146.   (if(setq EntityCollection(ssget))
  147.     (if(setq TargetObject(car(entsel "\n指定复制图元的目标图层:")))
  148.       (progn
  149.           (setq index 0 VlaObjectList nil)
  150.           (repeat (sslength EntityCollection)
  151.             (setq VlaObjectList(append VlaObjectList(list(vlax-ename->vla-object(ssname EntityCollection index)))))
  152.             (setq index(1+ index))
  153.           )
  154.           (setq TargetVlaObject(vlax-ename->vla-object TargetObject))
  155.           (setq TargetLayerName(vla-get-layer TargetVlaObject))
  156.         (foreach VlaObject VlaObjectList
  157.           (vla-put-layer (vlax-invoke-method VlaObject 'Copy) TargetLayerName)
  158.           )
  159.         )
  160.       )
  161.     )
  162.   (prin1)
  163. )
发表于 2014-3-23 23:17:47 | 显示全部楼层
  1. ;;说明:图层控制及相关
  2. ;;程式所有权归设计者:郭维
  3. ;;日期:2014年03月09日
  4. ;; 命 令     功 能
  5. ;;  nn      将所选图元图层至为当前层
  6. ;;    ad            只显示所选图元且仅只有一个,其余冻结
  7. ;;    fa            将当前文档所有冻结图层打开
  8. ;;    qw            选择不要冻结的图元,可多选
  9. ;;    mm            将所选图元,移动到指定图元图层
  10. ;;    cf            将所选图元,复制到指定图元图层


  11. ;;**********************************************************************
  12. (vl-load-com)
  13. (Defun *Collection* ()
  14.   (setq  *AcadObject* (vlax-get-acad-object)
  15.   *DwgObject*  (vla-get-activedocument *AcadObject*)
  16.   *ModelSpace* (vla-get-modelspace *DwgObject*)
  17.   *Layers*     (vla-get-layers *DwgObject*)
  18.   *Blocks*     (vla-get-blocks *DwgObject*)
  19.   *LineTypes*  (vla-get-linetypes *DwgObject*)
  20.   )
  21. )
  22. (if(not(tblsearch "ltype" "CENTER"));;中心线加载
  23.   (progn
  24.     (*Collection*)
  25.     (vlax-invoke-method *LineTypes* 'Load  "CENTER" "acadiso.lin")
  26.     )
  27.   )
  28. (if(not(tblsearch "ltype" "DASHED"));;虚线加载
  29.   (progn
  30.     (*Collection*)
  31.     (vlax-invoke-method *LineTypes* 'Load  "DASHED" "acadiso.lin")
  32.     )
  33.   )
  34. ;;将所选图元图层至为当前层**********************************************
  35. (defun c:nn (/ EntityName VlaName CurrentlyLayer Layer *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*)
  36.   (*Collection*)
  37.   (if (setq EntityName (Car (Entsel "\n请选择要置为当前层的图元:")))
  38.     (progn
  39.       (setq VlaName     (vlax-ename->vla-object EntityName)
  40.       CurrentlyLayer (vla-get-Layer VlaName)
  41.       )
  42.       (Vlax-For  Layer *Layers*
  43.   (IF (= (Vla-Get-Name Layer) CurrentlyLayer)
  44.     (vla-put-ActiveLayer *DwgObject* Layer)
  45.   )
  46.       )
  47.     )
  48.   )
  49.   (prin1)
  50. )
  51. ;;只显示所选图元且仅只有一个,其余冻结*************************************
  52. (Defun c:ad (/ EntityName VlaName CurrentlyLayer Layer *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*)
  53.   (*Collection*)
  54.   (if (setq EntityName (Car (Entsel "\n选择不冻结的图元<仅一个>:")))
  55.     (progn
  56.       (setq VlaName     (vlax-ename->vla-object EntityName)
  57.       CurrentlyLayer (vla-get-Layer VlaName)
  58.       )
  59.       (VLAX-FOR  Layer *Layers*
  60.   (if (= (vla-get-name Layer) CurrentlyLayer)
  61.     (vla-put-ActiveLayer *DwgObject* Layer)
  62.   )
  63.       )
  64.       (VLAX-FOR  Layer *Layers*
  65.   (if (/= (vla-get-name Layer) CurrentlyLayer)
  66.     (vla-put-Freeze Layer -1)
  67.   )
  68.       )
  69.     )
  70.   )
  71.   (prin1)
  72. )
  73. ;;将当前文档所有冻结图层打开**********************************************
  74. (Defun c:fa (/ Layer *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*)
  75.   (*Collection*)
  76.   (VLAX-FOR Layer *Layers*
  77.     (if  (/= (vla-get-Freeze Layer) :vlax-false)
  78.       (progn
  79.   (vla-put-Freeze Layer 0)
  80.   (vla-put-LayerOn Layer -1)
  81.   (vla-put-lock Layer 0)
  82.       )
  83.     )
  84.   )
  85.   (vlax-invoke-method *DwgObject* 'regen acactiveviewport)
  86.   (prin1)
  87. )
  88. ;;选择不要冻结的图元,可多选*********************************************
  89. (Defun c:qw(/  *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject*
  90.         selectcollection VlaObjectList index LayerNameList Layer VlaObject)
  91.   (*Collection*)
  92.   (if (setq selectcollection (ssget))
  93.     (progn
  94.       (setq index 0 VlaObjectList nil LayerNameList nil)
  95.       (repeat (sslength selectcollection)
  96.   (setq VlaObjectList
  97.          (append VlaObjectList
  98.            (list(vlax-ename->vla-object (ssname selectcollection index))))
  99.         )
  100.   (setq index (1+ index))
  101.       )
  102.       (foreach VlaObject  VlaObjectList
  103.   (setq LayerNameList(append LayerNameList(list (vla-get-layer VlaObject))))
  104.   )
  105.       (VLAX-FOR  Layer  *Layers*
  106.   (if
  107.     (not (= (vla-get-name layer)(vla-get-name (vla-get-activelayer *DwgObject*))))
  108.      (if (= (vla-get-name layer) (nth 0 LayerNameList))
  109.        (vla-put-activelayer *DwgObject* Layer))
  110.     )
  111.   )
  112.       (VLAX-FOR  Layer  *Layers*
  113.   (if (not (vl-position(vla-get-name Layer)LayerNameList))
  114.     (vla-put-freeze Layer -1)
  115.     )      ;endif
  116.   )
  117.       )  ;end progn
  118.     );endif
  119.   (prin1)
  120. )
  121. ;;将所选图元,移动到指定图元图层
  122. (Defun c:mm(/  *Layers* *DwgObject* *Blocks* *ModelSpace* *AcadObject* *LineTypes*
  123.       EntityCollection TargetObject index VlaObjectList TargetVlaObject
  124.       TargetLayerName VlaObject)
  125.   (*Collection*)
  126.   (if(setq EntityCollection(ssget))
  127.      (if(setq TargetObject(car(entsel "\n 选择目标图层的图元:")));Target 目标
  128.         (progn
  129.           (setq index 0 VlaObjectList nil)
  130.           (repeat (sslength EntityCollection)
  131.             (setq VlaObjectList(append VlaObjectList(list(vlax-ename->vla-object(ssname EntityCollection index)))))
  132.             (setq index(1+ index))
  133.           )
  134.           (setq TargetVlaObject(vlax-ename->vla-object TargetObject))
  135.           (setq TargetLayerName(vla-get-layer TargetVlaObject))
  136.           (foreach VlaObject VlaObjectList
  137.             (vla-put-layer VlaObject TargetLayerName)
  138.           )
  139.         )
  140.       )
  141.     )
  142.   (prin1)
  143. )
  144. ;;将所选图元,复制到指定图元图层
  145. (Defun c:cf(/ EntityCollection TargetObject index VlaObjectList TargetVlaObject TargetLayerName VlaObject)
  146.   (if(setq EntityCollection(ssget))
  147.     (if(setq TargetObject(car(entsel "\n指定复制图元的目标图层:")))
  148.       (progn
  149.     (setq index 0 VlaObjectList nil)
  150.           (repeat (sslength EntityCollection)
  151.             (setq VlaObjectList(append VlaObjectList(list(vlax-ename->vla-object(ssname EntityCollection index)))))
  152.             (setq index(1+ index))
  153.           )
  154.     (setq TargetVlaObject(vlax-ename->vla-object TargetObject))
  155.           (setq TargetLayerName(vla-get-layer TargetVlaObject))
  156.   (foreach VlaObject VlaObjectList
  157.     (vla-put-layer (vlax-invoke-method VlaObject 'Copy) TargetLayerName)
  158.     )
  159.   )
  160.       )
  161.     )
  162.   (prin1)
  163. )
发表于 2014-3-24 08:08:40 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2014-4-8 09:41 编辑

游客,本帖隐藏的内容需要发帖数高于 4 才可浏览,你当前发帖数只有 0

点评

图层可能同时被锁定和冻结,或者只是被冻结而非被锁定,这样(if (= (cdr(assoc 70 lnm)) 0) 4 0)就可能乱套  发表于 2014-4-8 22:22
为什么进入死循环了?  发表于 2014-3-24 09:32
发表于 2014-3-24 10:00:28 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-4-8 22:23 编辑

图层开关切换
  1. (setq la(tblnext "LAYER" T))
  2. (while la(setq la(entget(tblobjname"LAYER"(cdr(assoc 2 la)))))
  3.   (entmod(subst(cons 62(- 0(cdr(assoc 62 la))))(assoc 62 la)la))
  4.   (setq la(tblnext "LAYER" nil)))


锁定图层解锁,未锁图层加锁
  1. (setq la(tblnext"layer" t))
  2. (while la(setq la(entget(tblobjname"layer"(cdr(assoc 2 la)))))
  3.    (entmod(subst(cons 70(+(cdr(assoc 70 la))4))(assoc 70 la)la))
  4.    (setq la(tblnext"layer"nil)))


图层冻结、解冻
  1. (setq la(tblnext"layer" t))
  2. (while la(setq la(entget(tblobjname"layer"(cdr(assoc 2 la))))dxf70(cdr(assoc 70 la)))
  3.   (entmod(subst(cons 70(+(if(=(rem dxf70 2)1)-1 1)dxf70))(assoc 70 la)la))
  4.    (setq la(tblnext"layer"nil)))

发表于 2014-3-24 10:07:52 | 显示全部楼层
挺咸蛋的需求哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-25 02:56 , Processed in 0.162552 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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