这里是子程序。
(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)
) 说得好,艾伦,我犯了条件错误。。。 好了,各位。
此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的入口,现在我看到它是如何实现的,也同样有效。谢谢,卡布。
不过,这似乎有点复杂。
我对丰富的选择满面春风,但有更喜欢的方法吗?
史蒂夫
. 与COND方法的不同之处在于,当COND到达返回T的测试表达式时,它计算该表达式之后的所有语句,并在那里结束。
而对于IF语句,则依次计算每个IF语句。
因此,如果文字层处于启用状态,而查找层处于启用状态:
在第二个版本中,将显示LispRoutine1,但不会显示LispRoutine2。
在IF版本中,将对两者进行评估。
希望这有点道理。。。 据我所知,在COND版本中,当计算第一个TRUE时,条件检查将退出,但在IF版本中,无论前面任何检查的结果如何,都会计算每一行。
因此,IF版本完成了任务,但牺牲了效率。
康德赢了。
谢谢
史蒂夫
.
但正如我上面所说的,如果两个层都打开了呢? 在IF版本中,两个子例程都运行。
在COND版本中,只有第一个子例程运行。
那么我使用哪种方法,可能取决于我在那种情况下想要发生什么。
确切地说,我的印象是,如果满足条件,您希望例程运行。在第二个版本中,某些条件甚至可能没有经过测试。 我发现,由于自动处理图形的方式,只有一种状态可以为真,而其他状态将为假。
因此,要么文字层打开,要么查找层打开,要么两者都关闭。
这使得COND版本毕竟是更好的选择。
好的,只要你理解差异,就不会有问题
页:
1
[2]