_$ (setq lname "Layer4")
"Layer4"
_$ (setq lobj (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lname))
#<VLA-OBJECT IAcadLayer 00000098f7c52778>
_$ (vlax-dump-object lobj)
; IAcadLayer: A logical grouping of data, similar to transparent acetate overlays on a drawing
; Property values:
; Application (RO) = #<VLA-OBJECT IAcadApplication 00007ff792299110>
; Description = ""
; Document (RO) = #<VLA-OBJECT IAcadDocument 00000098eb3bd978>
; Freeze = -1
; Handle (RO) = "238"
; HasExtensionDictionary (RO) = 0
; LayerOn = 0
; Linetype = "Continuous"
; Lineweight = -3
; Lock = -1
; Material = "Global"
; Name = "Layer4"
; ObjectID (RO) = 42
; ObjectName (RO) = "AcDbLayerTableRecord"
; OwnerID (RO) = 43
; PlotStyleName = "Normal"
; Plottable = -1
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000098ebdd8870>
; Used (RO) = -1
; ViewportDefault = 0
T
_$ (setq lent (tblobjname "LAYER" lname))
<Entity name: 7ff79120b280>
_$ (setq ldata (entget lent))
((-1 . <Entity name: 7ff79120b280>) (0 . "LAYER") (330 . <Entity name: 7ff791203820>) (5 . "238") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Layer4") (70 . 5) (62 . -104) (6 . "Continuous") (290 . 1) (370 . -3) (390 . <Entity name: 7ff7912038f0>) (347 . <Entity name: 7ff791203cc0>) (348 . <Entity name: 0>))
_$ (setq flg (cdr (assoc 70 ldata)))
5
_$ (if (= (vla-get-lock lobj) :vlax-true) (vla-put-lock lobj :vlax-false))
nil
_$ (vlax-dump-object lobj)
; IAcadLayer: A logical grouping of data, similar to transparent acetate overlays on a drawing
; Property values:
; Application (RO) = #<VLA-OBJECT IAcadApplication 00007ff792299110>
; Description = ""
; Document (RO) = #<VLA-OBJECT IAcadDocument 00000098eb3bd978>
; Freeze = -1
; Handle (RO) = "238"
; HasExtensionDictionary (RO) = 0
; LayerOn = 0
; Linetype = "Continuous"
; Lineweight = -3
; Lock = 0
; Material = "Global"
; Name = "Layer4"
; ObjectID (RO) = 42
; ObjectName (RO) = "AcDbLayerTableRecord"
; OwnerID (RO) = 43
; PlotStyleName = "Normal"
; Plottable = -1
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000098ebdd8ab0>
; Used (RO) = -1
; ViewportDefault = 0
T
_$ (setq flg (cdr (assoc 70 ldata)))
5
_$
But the question is how perform this subst alternative, just like (vla-get/put-Lock) without affecting layer's frozen status? (in the above, I change the lock status, but the flag stays at 5 value).(setq lname "Layer4")
(setq lobj (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lname))
(if (= (vla-get-lock lobj) :vlax-true) (vla-put-lock lobj :vlax-false))
How to continue this to achieve the result in the ^^above^^ code:(setq lname "Layer4")
(setq lent (tblobjname "LAYER" lname))
(setq ldata (entget lent))
(setq flg (cdr (assoc 70 ldata)))
; ... whats next ? / check if locked, if so - then unlock and vice-versa
(defun islayerlocked (layerName / layer elst dxf70)
(and
(setq layer (tblobjname "layer" layerName))
(setq elst (entget layer))
(setq dxf70 (assoc 70 elst))
(= 4 (logand 4 (cdr dxf70)))
)
)
(while (setq ld (tblnext "LAYER" (not ld)))
(setq dxf70 (cdr (assoc 70 ld)))
(setq dxf2 (cdr (assoc 2 ld)))
(if (= 4 (logand 4 dxf70)) ; here I check if its locked
(setq LstLocked (cons dxf2 lst))
)
(if (= 1 (logand 1 dxf70)) ; here I check if its frozen
(setq LstFrozen (cons dxf2 lst))
)
)
; Unlock and thaw all layers:
(mapcar 'unlocklayer LstLocked)
(mapcar 'thawlayer LstFrozen)
; Do things in the code
; Restore original lock and frozen state:
(mapcar 'locklayer LstLocked)
(mapcar 'freezelayer LstFrozen)
; The subfunctions:
(defun locklayer (layerName / layer elst dxf70)
(if (setq layer (tblobjname "layer" layerName))
(progn
(setq elst (entget layer))
(setq dxf70 (assoc 70 elst))
(entmod (subst (cons 70 (logior (cdr dxf70) 4)) dxf70 elst))
)
)
)
(defun unlocklayer (layerName / layer elst dxf70)
(if (setq layer (tblobjname "layer" layerName))
(progn
(setq elst (entget layer))
(setq dxf70 (assoc 70 elst))
(entmod (subst (cons 70 (logand (cdr dxf70) (~ 4))) dxf70 elst))
)
)
)
(defun freezelayer (layerName / layer elst dxf70)
(if (setq layer (tblobjname "layer" layerName))
(progn
(setq elst (entget layer))
(setq dxf70 (assoc 70 elst))
(entmod (subst (cons 70 (logior (cdr dxf70) 1)) dxf70 elst))
)
)
)
(defun thawlayer (layerName / layer elst dxf70)
(if (setq layer (tblobjname "layer" layerName))
(progn
(setq elst (entget layer))
(setq dxf70 (assoc 70 elst))
(entmod (subst (cons 70 (logand (cdr dxf70) (~ 1))) dxf70 elst))
)
)
)
I try to "collect" the original status/state of every layer, then unlock and thaw all of them, then reset their status/state.; another way to omit locked or frozen layers, without using ":L" ssget mode:
; Here we iterate thru the layer definitions (the other way is to iterate thru enames of the SS and check their layer's lock/freeze status - but it may be slower)
(defun C:test ( / ld FrozenOrLockedLayers SSX ftLst )
(while (setq ld (tblnext "LAYER" (not ld)))
(if (or (= 4 (logand 4 (cdr (assoc 70 ld)))) (= 1 (logand 1 (cdr (assoc 70 ld)))) )
(setq FrozenOrLockedLayers (cons (cdr (assoc 2 ld)) FrozenOrLockedLayers))
)
)
(if
(setq SSX
(ssget "_X"
(setq ftLst
(list
(cons -4 "<AND")
(if FrozenOrLockedLayers
(progn
(cons -4 "<NOT")
(cons -4 "<OR")
(mapcar '(lambda (x) (cons 8 x) ) (acad_strlsort FrozenOrLockedLayers))
(cons -4 "OR>")
(cons -4 "NOT>")
)
(cons 8 "*")
)
(if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model"))
(cons -4 "AND>")
)
)
)
)
(sssetfirst nil SSX)
)
(princ)
);| defun |; (vl-load-com) (princ)
Why the above code won't work? I've tried several ways and it still fails while using the ssget logical operators.
; another way to omit locked or frozen layers, without using ":L" ssget mode:
; Here we iterate thru the layer definitions (the other way is to iterate thru enames of the SS and check their layer's lock/freeze status - but it may be slower)
(defun C:test ( / ld ThawedOrUnLockedLayersString ThawedOrUnLockedLayers SSX ftLst )
(while (setq ld (tblnext "LAYER" (not ld)))
(if (not (or (= 4 (logand 4 (cdr (assoc 70 ld)))) (= 1 (logand 1 (cdr (assoc 70 ld))))))
(setq ThawedOrUnLockedLayers (cons (cdr (assoc 2 ld)) ThawedOrUnLockedLayers))
)
)
(if ThawedOrUnLockedLayers
(progn
(setq ThawedOrUnLockedLayersString "")
(foreach x (reverse (acad_strlsort ThawedOrUnLockedLayers))
(setq ThawedOrUnLockedLayersString (strcat ThawedOrUnLockedLayersString x ","))
)
(setq ThawedOrUnLockedLayersString (vl-string-right-trim "," ThawedOrUnLockedLayersString))
)
)
(if
(and
ThawedOrUnLockedLayers
(setq SSX
(ssget "_X"
(setq ftLst
(list
(cons -4 "<AND")
(cons 8 ThawedOrUnLockedLayersString)
(if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model"))
(cons -4 "AND>")
)
)
)
)
)
(sssetfirst nil SSX)
)
(princ)
);| defun |;
(if (cadr (sssetfirst nil (ssget "_A" ... )))
(sssetfirst nil (ssget "_:L"))
nil
)
Of course I would make sure that at least one layer is unlocked and thawed and has an entity that's possible to select before applying such routine that uses this shortcut snippet...
; another way to omit locked or frozen layers, without using ":L" ssget mode:
; Here we iterate thru the layer definitions (the other way is to iterate thru enames of the SS and check their layer's lock/freeze status - but it may be slower)
(defun C:test ( / ld FrozenOrLockedLayers UnFrozenUnLockedLayerExist ftLst)
(while (setq ld (tblnext "LAYER" (not ld)))
(if (or (= 4 (logand 4 (cdr (assoc 70 ld)))) (= 1 (logand 1 (cdr (assoc 70 ld)))) )
(setq FrozenOrLockedLayers (cons (cdr (assoc 2 ld)) FrozenOrLockedLayers))
(setq UnFrozenUnLockedLayerExist 'T)
)
)
(if UnFrozenUnLockedLayerExist
(if
(setq SSX
(ssget "_X"
(setq ftLst
(if FrozenOrLockedLayers
(append
(list (cons -4 "<AND"))
(mapcar '(lambda (x) (cons 8 (strcat "~" x))) FrozenOrLockedLayers)
(list (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))
(list (cons -4 "AND>"))
)
(append
(list (cons 8 "*"))
(list (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))
)
)
)
)
)
(sssetfirst nil SSX)
)
)
(princ)
);| defun |; (vl-load-com) (princ)
I've tested this code and seems to work properly (you might remember these alternatives we were thinking, for ":L-I" ":L-X" where Roy was involved).; Omit LAYER1, LAYER2 and LAYER3, they are locked/frozen
(ssget "_X" ; #1
(list
(-4 . "<NOT")
(-4 . "<OR")
(8 . "LAYER1")
(8 . "LAYER2")
(8 . "LAYER3")
(-4 . "OR>")
(-4 . "NOT>")
)
)
(ssget "_X" ; #2
(list
(-4 . "<NOT")
(-4 . "<OR")
(8 . "LAYER1,LAYER2,LAYER3")
(-4 . "OR>")
(-4 . "NOT>")
)
)
Before Marko hinted me with the solution of the "~" prefix.