CAB 发表于 2022-7-6 14:59:48

一点也不适合。
这里是子程序。
(defun c:TEST ()
;;;Returns T if On. nill if OFF or not found
(defun islayeron (lname / entlst)
   (and (= (type lname) 'str)
      (setq entlst (tblsearch "layer" lname))
      (null (minusp (cdr (assoc 62 entlst))))
   )
)                           ; end defun
(if (islayeron "TEXT")      ;If TEXT layer is on,
   (c:LISProutine1)          ; run routine 1
)                           ;endif 1
(if (islayeron "FIND")      ;If FIND layer is on,
   (c:LISProutine2)          ; run routine 2
)                           ;endif 2
;;If both layers are off
(if (and (not (islayeron "TEXT")) ;If TEXT layer is off *AND*
          (not (islayeron "FIND")) ;if FIND layer is off,
   )                     
   (c:LISProutine3)          ; run routine 3
)                           ;endif 3
(PRINC)
)

Lee Mac 发表于 2022-7-6 15:01:02

说得好,艾伦,我犯了条件错误。。。

StevJ 发表于 2022-7-6 15:05:14

好了,各位。
此IF版本之间的差异:
 

(defun c:TEST ()

(if (> (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
      (c:LISProutine1)
)
(if (> (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0)
      (c:LISProutine2)
)
(if (and (< (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
      (< (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0))
      (c:LISProutine3)
)
(PRINC)
)

 
这个COND版本:
 

(defun c:TEST ()
(COND ((> (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
   (c:LISProutine1)
   )

   ((> (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0)
   (c:LISProutine2)
   )

   ((and (< (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
         (< (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0))
   (c:LISProutine3)
   )
)
(PRINC)
)

 
对我来说似乎没有那么重要,而且它们都工作得一样好。
 
然而,IF版本似乎更像是一种“暴力”方法,
COND版本更干净,看起来不像是黑客作业,而不是IF版本。
 
CAB的入口,现在我看到它是如何实现的,也同样有效。谢谢,卡布。
不过,这似乎有点复杂。
 
我对丰富的选择满面春风,但有更喜欢的方法吗?
 
史蒂夫
.

Lee Mac 发表于 2022-7-6 15:08:51

与COND方法的不同之处在于,当COND到达返回T的测试表达式时,它计算该表达式之后的所有语句,并在那里结束。
 
而对于IF语句,则依次计算每个IF语句。
 
因此,如果文字层处于启用状态,而查找层处于启用状态:
 
在第二个版本中,将显示LispRoutine1,但不会显示LispRoutine2。
 
在IF版本中,将对两者进行评估。
 
希望这有点道理。。。

StevJ 发表于 2022-7-6 15:09:51

据我所知,在COND版本中,当计算第一个TRUE时,条件检查将退出,但在IF版本中,无论前面任何检查的结果如何,都会计算每一行。
 
因此,IF版本完成了任务,但牺牲了效率。
康德赢了。
 
谢谢
史蒂夫
.

Lee Mac 发表于 2022-7-6 15:14:38

 
但正如我上面所说的,如果两个层都打开了呢?

StevJ 发表于 2022-7-6 15:18:37

在IF版本中,两个子例程都运行。
 
在COND版本中,只有第一个子例程运行。
 
那么我使用哪种方法,可能取决于我在那种情况下想要发生什么。

Lee Mac 发表于 2022-7-6 15:19:41

 
确切地说,我的印象是,如果满足条件,您希望例程运行。在第二个版本中,某些条件甚至可能没有经过测试。

StevJ 发表于 2022-7-6 15:22:42

我发现,由于自动处理图形的方式,只有一种状态可以为真,而其他状态将为假。
因此,要么文字层打开,要么查找层打开,要么两者都关闭。
 
这使得COND版本毕竟是更好的选择。

Lee Mac 发表于 2022-7-6 15:26:21

 
好的,只要你理解差异,就不会有问题
页: 1 [2]
查看完整版本: 层帮助,请