In the past, like AutoCAD versions < 2000, I relied on the fact that layers frozen in a viewport were embedded in the viewport's extended data, in dxf group 1003 ...
(
(-1 . <Entity name: 7ef55eb8>)
(0 . "VIEWPORT")
...
(-3
(
"ACAD"
(1000 . "MVIEW")
(1002 . "{")
...
(1002 . "{")
(1003 . "LAY1") ;; layers
(1003 . "LAY2") ;; frozen
(1003 . "LAY3") ;; in
(1003 . "LAY4") ;; this
(1003 . "LAY5") ;; viewport
(1002 . "}")
...
(1002 . "}")
)
)
)
Since 2000, the frozen layers also appear as enames in dxf group 331 ...
(
(-1 . <Entity name: 7ef55eb8>)
(0 . "VIEWPORT")
...
(331 . <Entity name: 7ef55ec8>) <--+
(331 . <Entity name: 7ef55ed8>) |
(331 . <Entity name: 7ef55ee8>) |
(331 . <Entity name: 7ef55ef8>) |
(331 . <Entity name: 7ef55f08>) <--+--+
| |
... | |
| |
(-3 | |
( | |
"ACAD" | |
(1000 . "MVIEW") | |
(1002 . "{") | |
| |
... | |
| |
(1002 . "{") | |
(1003 . "LAY1") <------------+ |
(1003 . "LAY2") |
(1003 . "LAY3") |
(1003 . "LAY4") |
(1003 . "LAY5") <---------------+
(1002 . "}")
...
(1002 . "}")
)
)
)
As a result, one can yank out the frozen layer names by examining the 331 groups ...
(defun GetLayersFrozenInViewport ( viewportEname )
( (lambda ( data / pair data2 result )
(while (setq pair (assoc 331 data))
(if
(member
'(0 . "LAYER")
(setq data2
(entget
(setq ename
(cdr pair)
)
)
)
)
(setq result
(cons
(cdr (assoc 2 data2))
result
)
)
)
(setq data
(cdr
(member pair data)
)
)
)
result
)
(entget viewportEname)
)
)
Can anyone see a flaw in this technique (as opposed to the examination of the 1003 group codes)?
Know a better way? Please share.