你好
这是一项有趣的任务。。。我的尝试是:
- (while (setq LayEnx (tblnext "LAYER" (null LayEnx)))
- (if (= 1 (logand 1 (cdr (assoc 70 LayEnx)))) ; layer is frozen
- (setq LstFrozenLayers (cons LayEnx LstFrozenLayers))
- (setq LstThawedLayers (cons LayEnx LstThawedLayers))
- )
- )
- (setq match "*|C-CATV*")
- (mapcar 'entupd
- (mapcar
- (function
- (lambda (x)
- (if (wcmatch (cdr (assoc 2 x)) match)
- (cond ; I don't know how to subst the layer's elist with (logand)
- ((member x LstFrozenLayers)
- (subst (assoc 70 x) (cons 70 0) x)
- )
- ((member x LstThawedLayers)
- (subst (assoc 70 x) (cons 70 1) x)
- )
- )
- )
- )
- )
- (list LstFrozenLayers LstThawedLayers)
- )
- )
上述片段将是任务的理想情况(仅使用Vanilla LISP)。。尽管只有一个问题:
我不知道如何将层的elist与(logand)函数组合起来。
如果您不理解代码中发生了什么,让我解释一下:
1.它通过图层表进行迭代,并将图层分为两组(列表):冻结和解冻
2.然后使用lambda,我们检查每个层的匹配名称,以及它所属的组/列表(冻结或解冻)。。通过替换x层的elist,我们可以切换其冻结/解冻状态。
下面是我的替代建议(使用VLAX):
- (while (setq ld (tblnext "LAYER" (null ld)))
- (setq LayersEnxs (cons ld LayersEnxs))
- )
- (setq match "*|C-CATV*")
- (mapcar
- (function
- (lambda (x / o )
- (if (wcmatch (cdr (assoc 2 x)) match)
- (progn ; I use VLA, because I don't know how to subst a layer's elist with (logand)
- (vlax-put (setq o (vlax-ename->vla-object (tblobjname "LAYER" (cdr (assoc 2 x))))) 'Freeze :vlax-false)
- (vla-update o)
- )
- )
- )
- )
- (vl-remove-if-not (function (lambda (x) (= 1 (logand 1 (cdr (assoc 70 x)))))) LayersEnxs); frozen layers's elists
- )
- (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)
它用这个名字解冻冷冻层(但这种VLA方法应该比香草冰淇淋慢)。
HTH公司
顺便说一句,我喜欢在回答的同时问问题
编辑:这是另一个。。。
- (setq match "*|C-CATV*")
- (vlax-map-collection (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
- (function
- (lambda (x)
- (if
- (and
- (wcmatch (vla-get-name x) match)
- (eq (vla-get-Freeze x) :vlax-true)
- )
- (vla-update (vlax-put x 'Freeze :vlax-false))
- )
- )
- )
- )
我想你明白了。。。但我真的认为,如果不迭代所有层,就无法实现它。 |