zjh2785 发表于 2017-10-22 18:04:14

[源码] 获取指定视口中冻结的图层列表

本帖最后由 zjh2785 于 2017-10-22 18:06 编辑

函数单独的用法:(LA:GetFreezeLayerForView(vlax-ename->vla-object (car(entsel))))
返回值: "layer1,layer2",如果没有冻结的图层返回 ""
返回值可直接用于CAD自带的命令恢复图层状态,
具体用法:


(defun C:TT (/ ssent laList i)
(if (= (getvar "tilemode") 1)
    (setvar "tilemode" 0)
)
(if (/= (getvar "cvport") 1)
    (command "_PSPACE")
)
(if (setq ssent (ssget '((0 . "VIEWPORT"))))
    (progn
      (setq i 0)
      (repeat (sslength ssent)
      (if (/=      ""
                (setq laList (LA:GetFreezeLayerForView
                               (vlax-ename->vla-object (ssname ssent i))
                           )
                )
            )
          (command "_.vplayer" "T" laList "S" (ssname ssent i) "" "")
      )
      (setq i (1+ i))
      )
    )
)
(princ)
)



(defun LA:GetFreezeLayerForView(VpObj / xt xd lyrlst a b)
(vla-getxdata VpObj "ACAD" 'xt 'xd)
(mapcar 'set
    '(xt xd)
    (list (safearray-value xt) (safearray-value xd))
)
(setq lyrlst "")
(mapcar '(lambda (a b)
       (if (= a 1003)
         (setq lyrlst (strcat lyrlst (strcase (variant-value b))","))
       )
   )
    xt
    xd
)
lyrlst
)


小毛草 发表于 2024-5-10 10:34:59

;;;按功能在指定视口中冻结特定图层
(defun C:DDT (/ DjKeyN DjKey VP)
(princ "\n*** 选择视口前,请保持视口中有效图层开启 ***")
(if (= (getvar "tilemode") 0)
    (progn
      (initget 7 "1 2 3 4")
      (setq Key (getkword "\n需要设置的视口功能: 1-平面布置图 / 2-地面铺装平面图 / 3-天花布置平面图 / 4-立面图"))
      (cond
      ((= Key "1") (setq DjKey "*0-TF-*,*0-DM-*,*FC-Hatch*")) ;_平面布置图
      ((= Key "2") (setq DjKey "*0-TF-*,*0-PM-固定家具*,*DOOR-NAME*,*PUB_TEXT*,*DOOR*,*LVTRY*,*DOOR-NAME*,*PUB_HATCH*,*PUB_SYMB*,*AREA*,*PUB_SYMB*,*WINDOW_GROUND*,*DOTE*")) ;_地面铺装平面图
      ((= Key "3") (setq DjKey "*0-DM-*,*0-PM-固定家具*,*DOOR-NAME*,*PUB_TEXT*,*stair*,*DOOR*,*LVTRY*,*DOOR-NAME*,*PUB_HATCH*,*PUB_SYMB*,*AREA*,*WINDOW_GROUND*,*DOTE*,*FC-Hatch*")) ;_天花布置平面图
      ((= Key "4") (setq DjKey "*填充*,*HATCH*,*ELEV*,*IDEN*,*LEAD*,*SYMB*")) ;_立面图
      )
      (if (setq VP (entsel "\n选择要冻结图层的视口:"))
(FreezLayInVPCmd (car VP) DjKey)
      )
    )
    (princ "\n该命令仅允许在布局空间有效运行!")
)
(princ)
)
;;;支持通配符
(defun FreezLayInVPCmd (Ven Lst / ENT)
(if (and (= (getvar "tilemode") 0) (= (getvar "cvport") 1)) ;_判断鼠标是否在布局空间
    (progn
      (setq ENT (cdr (assoc 69 (entget Ven))))
      (command "_.MSPACE") ;_切换到模型空间
      (setvar "cvport" ENT)
      (command "_.vplayer" "F" LST "" "") ;_在模型空间中操作,冻结
      (command "_PSPACE") ;_切换到布局空间
    )
    (princ "\n*** 该命令仅允许在布局空间有效运行,请将鼠标切换到布局空间 ***")
)
)

magicheno 发表于 2023-8-25 00:17:35

flowerson 发表于 2019-10-9 14:42
用LWPOLYLINE来做视口的怎么办?

我也遇到这个问题了,好多是LWPOLYLINE做的视口,没法解决呢

curugi 发表于 2018-1-30 21:40:22

貌似只能解冻哦

curugi 发表于 2018-2-1 02:04:36

只能解冻哦

flowerson 发表于 2019-10-9 14:42:54

用LWPOLYLINE来做视口的怎么办?

ketxu 发表于 2019-10-31 22:43:39

Thanks for sharing ^^

nochao 发表于 2020-3-1 07:29:30

不错,这是个指定视口中解冻全部图层的程序。

原地踏步 发表于 2020-5-12 13:54:46

非常不错!赞一个!

cafa 发表于 2020-7-1 16:52:18

学习学习

davide888 发表于 2020-7-9 10:05:33

感谢分享

xiaocainiao 发表于 2022-12-15 11:05:37

请问大神、怎么获取到视口内所有未冻结图层的集合啊
页: [1] 2
查看完整版本: [源码] 获取指定视口中冻结的图层列表