tzframpton 发表于 2022-7-6 11:20:13

关于两者结合的建议

我并不声称自己懂LISP,但我肯定能自己动手编写代码并制作出简单的例程眨眼:
 
无论如何,我今天在绘制多比例图形时创建了两个非常有用的Lisp。我想知道是否可以将两者结合起来,这样可以冻结和解冻我想要操纵的层,有点像“切换”。我假设这将使我深入(if)语句、表达式或论点。。。。我永远记不起操作符是哪一个,如果它是操作符的话。这是我制作的两个独立的测试LISP文件,基本上是一个命令行层脚本。。。。
 
(DEFUN C:4IN (/ )
(command "._layer" "_t" "*-048" "_t" "*-4.5" "_f" "*-096" "_f" "*-09" "")
(princ)
)
(DEFUN C:8IN (/ )
(command "._layer" "_f" "*-048" "_f" "*-4.5" "_t" "*-096" "_t" "*-09" "")
(princ)
)
 
因此,我要向大家提出的问题是:(1)为我指明正确的方向,或者使用一些示例代码,指导我将它们结合起来;(2)向我展示如何在不使用这种过时的命令行样式脚本方法的情况下控制层实体。仅仅是几个简单的要求就够了,从技术上讲,我已经具备了我所需要的,而且效果很好,但我有兴趣将我的技能扩展到超级新手,从超级新手扩展到超级新手。提前谢谢。

David Bethel 发表于 2022-7-6 11:24:17

可能是这样的:
 

(defun c:mylay (/ input tl fl)

(initget 1 "4 8")
(setq input (getkword "\n4 or 8:   "))
(cond ((= input "4")
         (setq tl (list "*048" "*-4.5")   ;THAW LIST
               fl (list "*096" "*-09")));FREEZE LIST
       ((= input "8")
         (setq fl (list "*048" "*-4.5")   ;FREEZE LIST
               tl (list "*096" "*-09")))) ;THAW LIST

(command "_.LAYER")
(foreach l tl
   (command "_.Thaw" l))
(foreach l fl
   (command "_Freeze" l))
(command "")
(princ))

 
 
您可以操作冻结和解冻列表,如果需要,还可以添加更多。
-大卫

Lee Mac 发表于 2022-7-6 11:27:43

如果您想避免命令行调用,下面是另一种方法:
 

(defun c:laytog ( / GetLayers Freeze Thaw l1 l2 )
;; Lee Mac~22.04.10

(defun GetLayers ( wc / def n lst )
   (while (setq def (tblnext "LAYER" (not def)))
   (if (wcmatch (setq n (cdr (assoc 2 def))) wc)
       (setq lst (cons (tblobjname "LAYER" n) lst))))
   lst)


(defun Freeze ( layer / dx70 el )
   (setq dx70 (cdr (assoc 70 (setq el (entget layer)))))
   (entmod
   (subst
       (cons 70 (boole 7 1 dx70)) (assoc 70 el) el)))


(defun Thaw ( layer / dx70 el )
   (setq dx70 (cdr (assoc 70 (setq el (entget layer)))))
   (entmod
   (subst
       (cons 70 (boole 4 1 dx70)) (assoc 70 el) el)))


(setq l1 (GetLayers "*-4.5") l2 (GetLayers "*-09"))

(cond ((setq *flag* (not *flag*))
      
          (mapcar (function Freeze) l1)
          (mapcar (function Thaw)   l2))

       ((mapcar (function Freeze) l2)
          (mapcar (function Thaw)   l1)))

(princ))

Lee Mac 发表于 2022-7-6 11:31:21

另一个,如果你想变得花哨的话
 

(defun c:laytog ( / GetLayers FTLayer l1 l2 )
;; Lee Mac~22.04.10

(defun GetLayers ( wc / def n lst )
   (while (setq def (tblnext "LAYER" (not def)))
   (if (wcmatch (setq n (cdr (assoc 2 def))) wc)
       (setq lst (cons (tblobjname "LAYER" n) lst))))
   lst)


(defun FTLayer ( layer freeze / dx70 el )
   (setq dx70 (cdr (assoc 70 (setq el (entget layer)))))
   (entmod
   (subst
       (cons 70 (boole (+ 4 (* freeze 3)) 1 dx70)) (assoc 70 el) el)))

(setq l1 (GetLayers "*-4.5") l2 (GetLayers "*-09"))

(mapcar
   (function
   (lambda ( layers flag )
       (mapcar
         (function
         (lambda ( layer )
             (FTLayer layer flag)
         )
         )
         layers
       )
   )
   )
   (list l1 l2) (if (setq *flag* (not *flag*)) '(1 0) '(0 1))
)

(princ))

rkmcswain 发表于 2022-7-6 11:36:45

请不要燃烧。。。这并不是要诋毁David或Lee的代码。。。。。但是将原始代码严格组合为“切换”。。这个怎么样?
 
这个例子确实假设有一个名为“a-048”的层,你可以改变它——或者如果你不想做任何假设,你必须迭代层集合,检查每个*-048”层,然后确定它们的冻结/解冻状态是否对所有层都不一样。。。
 
此外,您可能希望先将第0层设置为当前层,这样就不会试图冻结当前层。
 


(defun c:laytog ()
(if (eq 1 (logand 1 (cdr (assoc 70 (tblsearch "layer" "A-048")))))
   (command "._layer" "_t" "*-048" "_t" "*-4.5" "_f" "*-096" "_f" "*-09" "")
   (command "._layer" "_f" "*-048" "_f" "*-4.5" "_t" "*-096" "_t" "*-09" "")
)
)

alanjt 发表于 2022-7-6 11:38:26

仅供参考。当使用-layer时,您不必分离字符串。
 
如。
(command "._layer" "_t" "*-048" "_t" "*-4.5" "_f" "*-096" "_f" "*-09" "")
 
可以执行为:
(command "_.layer" _t" "*-048,*-4.5" "_f" "*-096,*-09" "")
 
并不是说你的代码或大卫或李的代码有什么问题。

alanjt 发表于 2022-7-6 11:42:29

火焰!!
 
非常好的一点。
 
(if (wcmatch (getvar 'clayer) "*-096,*-09")
(command "_.layer" "_t" "0" "_s" "0" ""))

rkmcswain 发表于 2022-7-6 11:45:55

谢谢,我知道它就要来了。。。。

alanjt 发表于 2022-7-6 11:51:25

嘿,我只是在修改坦纳的作品。

Lee Mac 发表于 2022-7-6 11:53:44

 
我只是提供了一个替代方案
页: [1] 2
查看完整版本: 关于两者结合的建议