明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1362|回复: 6

【基本操作】图层操作--选实体解冻部分图层

[复制链接]
发表于 2020-5-10 19:02:11 | 显示全部楼层 |阅读模式
(setq
        *ACAD*  (vlax-get-acad-object)
        *DOC*   (vla-get-ActiveDocument *ACAD*)
        *LAYS*  (vla-get-Layers *DOC*)
)
;选择集与对象名表互转
(defun ss-enlst        (ss / enlst)
        (cond
                ((= (type ss) 'PICKSET)
                        (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
                )
                ((= (type ss) 'LIST)
                        (setq enlst (ssadd))
                        (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
                )
        )
)
;;71.9 [功能] 返回冻结图层列表
(defun MJ:ListLayers-Frozen (/ each out)
  (vlax-for each *LAYS*
    (if        (= (vlax-get-property each "Freeze") :vlax-true)
      (setq out (cons (vla-get-name each) out))
    )
  )
  out
)
;;71.3 [功能] 图层列表 冻结
(defun MJ:LayerFreeze (LayList)
  (vlax-for each *LAYS*
    (if        (member (strcase (vla-get-name each)) LayList)
      (if (vlax-write-enabled-p each)
                                (vla-put-Freeze each :vlax-True)
      )
    )
    (vlax-release-object each)
  )
)
;;71.4 [功能] 图层列表 解冻
(defun MJ:LayerThaw (LayList)
  (vlax-for each *LAYS*
    (if        (member (strcase (vla-get-name each)) LayList)
      (if (vlax-write-enabled-p each)
                                (vla-put-Freeze each :vlax-False)
      )
    )
    (vlax-release-object each)
  )
)
(defun C:jd(/ LayerFreeze_lst layer_lst ss x)
        (princ "\n图层操作--解冻选定\n")
        (setvar "cmdecho" 0)
        (command ".undo" "be");;;建立undo组开始
        (setq LayerFreeze_lst(MJ:ListLayers-Frozen))
        (command "-layer" "TH" "*" "")
        (if (setq ss (ssget))
                (progn
                        (setq ss(ss-enlst ss))
                        (setq layer_lst
                                (mapcar '(lambda(x)(cdr (assoc 8 (entget x)))) ss)
                        )
                        (foreach x layer_lst
                                (setq LayerFreeze_lst(vl-remove x LayerFreeze_lst))
                        )
                )
        )
        (MJ:LayerFreeze LayerFreeze_lst)
        (command ".undo" "e");;;建立undo组完成
        (setvar "cmdecho" 1)
)
发表于 2020-5-12 10:32:16 | 显示全部楼层
对块和参照内图层不能用,希望能改进,使用场景将极大扩展。
 楼主| 发表于 2020-5-12 17:39:52 | 显示全部楼层
cghdy 发表于 2020-5-12 10:32
对块和参照内图层不能用,希望能改进,使用场景将极大扩展。

自己改下,把ssget模式换成nentsel模式
发表于 2020-5-12 20:39:22 | 显示全部楼层
1028695446 发表于 2020-5-12 17:39
自己改下,把ssget模式换成nentsel模式

nentsel牺牲有点大,只能点选了
发表于 2020-5-12 22:04:10 | 显示全部楼层
(DEFUN HY-GET-DXF (CODE ENAME) (CDR (ASSOC CODE (ENTGET ENAME))))
(defun C:jd()
        (princ "\n图层操作--解冻选定\n")
        (setvar "cmdecho" 0)
        (command ".undo" "be");;;建立undo组开始
        (setq LayerFreeze_lst(MJistLayers-Frozen))
        (command "-layer" "TH" "*" "")       
        (setq layer_lst nil)
        (while (setq nenam (car(nentsel )))
                (setq layer_lst (list (HY-GET-DXF 8 nenam) layer_lst))       
    (foreach x layer_lst
                        (setq LayerFreeze_lst(vl-remove x LayerFreeze_lst))
                )               
        )       
        (MJayerFreeze LayerFreeze_lst)
        (command ".undo" "e");;;建立undo组完成
        (setvar "cmdecho" 1)
)
;;;修改可以针对块及参照使用。
;;;顺带提一下nentsel使用起来一无法像ssget一样框选,二反馈不直观,无法判断是否点中图元。望高手改进。
发表于 2020-5-13 09:31:41 | 显示全部楼层
cghdy 发表于 2020-5-12 22:04
(DEFUN HY-GET-DXF (CODE ENAME) (CDR (ASSOC CODE (ENTGET ENAME))))
(defun C:jd()
        (princ "\n图层操 ...

原函数MJayerFreeze针对外部参照无效,举例(MJayerFreeze '("参照所在独立图层"))返回值0,但是没有冻结该图层。
发表于 2020-6-1 08:50:23 | 显示全部楼层
冻结的图层看不到,锁定的图层才能看到! 如果图上都看不到冻结的图层,请问 如何选择需要解冻的图层啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:35 , Processed in 0.158837 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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