cond语法为
(cond
((test expression)(do this))
((test expression)(do this))
((test expression)(do this))
( T (do this))
);end cond
如果第一个表达式为true,则第一个“do this”在run中,代码从cond语句继续。
如果第一个测试表达式为零,则移动到第二个测试表达式。如果该值也是nil,则它将继续移动,直到(在我的示例中)最终测试表达式设置为true,因此如果所有其他表达式都为nil,则最后一个表达式将运行,因为它设置为true。
这有帮助吗? Hippe013,是的,这很有帮助。我正在格式化我的条件语句的介绍部分,就像我对if语句的格式化一样,谢谢!我现在可以加载它,所以调试起来会更容易。再次感谢您的帮助。 Broncos15,
我可以看出你是那种想学习的人,大部分工作都是你自己做的。你是我喜欢帮助的人的典型代表。我不想在这里为人们写请求代码。我想教和指导人们学习LISP和VLISP。
不客气!
当做
hippe013 Hippe013,谢谢你,我真的很感激!我对学习和提高lisp非常感兴趣,非常感谢您的帮助。我还有一个关于代码的快速问题。为什么我稍后在设置中调用变量*offsetdistans*和*offsethightans*时,将其设置为0.5会产生错误的函数错误0.5?这似乎没有意义,因为我只是将它们设置为一个值,然后在设置中使用getreal函数。 *offsetdistans*不是一个子例程,它是一个具有实值的符号。
更改:
(getreal "\nOffset Distance" "" (*offsetdistans*) ":")
收件人:
(getreal (strcat "\nOffset Distance: "(rtos *offsetdistans* 2 2) ":"))
strcat将把一串字符串组合在一起。
rtos将实数转换为字符串。
()中包含的第一个符号需要是函数、子例程、运算符或隐含列表,即“(1 2 3 4 5)
请注意隐含列表之前的引号。 Hippe013,谢谢。如果我理解的话,rtos的2 2将其转换为带2位小数的小数,对吗?此外,在合并代码后,为什么会得到“错误:错误参数类型:numberp:”\n偏移距离:0.50:? 重新发布最新的代码。我将对其进行快速调试。我喜欢在vlide中为我的代码制作动画。它一步一步地运行代码,通常会在导致错误的地方停止。 Hippe013,再次感谢你的帮助。我真的很感激。
(defun CheckorGetSurface ()
(while
(not
(and
(setq SurfaceDefaultAdd
(car
(entsel
"\rSelect the Main Surace you to be the default: "
)
)
)
(= "AECC_TIN_SURFACE"
(cdr (assoc 0 (entget SurfaceDefaultAdd)))
)
)
)
)
)
(defun c:makeparkingcurb (/ ent ent1 *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
(princ)
)
(if (not SurfaceDefaultAdd)
(CheckorGetSurface)
)
(if (not *offsetdistans*)
(setq *offsetdistans* 0.5)
)
(if (not *offsetheightans*)
(setq *offsetheightans* 0.5)
)
(setq whilestop t)
(while whilestop
(initget 1 "Settings eXit")
(setq ent
(entsel
"\n Select the feature line you want to offset : "
)
)
(cond
((= ent "Settings")
((setq *offsetdistans*
(cond
(getreal (strcat "\nOffset Distance: "(rtos *offsetdistans* 2 2) ":"))
(rtos *offsetheightans* 2 2)
)
)
(setq *offsetheightans*
(cond
(getreal (strcat "\nOffset Elevation Difference: "(rtos *offsetheightans* 2 2) ":"))
(rtos *offsetheightans* 2 2)
)
))
)
((= ent "eXit")
(setq whilestop nil)
)
((setq entlist (entget ent))
(cond
(= "AECC_FEATURE_LINE" (cdr (assoc 0 entlist)))
(command "._OffsetFeature" *offsetdistans* ent)
(princ "\nSpecify side to offset: ")
(command pause *offsetheightans* "")
(setq ent1 (entlast))
(command "._AddSurfaceBreaklines" SurfaceDefaultAdd ent1 "")
)
(princ "\nNot a feature line")
)
)
)
(princ)
) 有几件事出错了。
1.你的条件声明仍然不正常。
2.(setq entlist(entget ent))不起作用,因为ent的值不是实体名称。这是entsel返回的选择。
尝试更改为
(setq sel (entsel "\n Select the feature line you want to offset : ")
因为此时您不是在处理实体,而是在处理entsel返回的选择。即((2415.64 7423.17 0.0))
这辆sel的车返回一个昵称。这就是为什么我强调使用符号名来表示它所代表的数据类型。
我还再次建议使用子程序来处理cond语句。只是让代码更容易阅读。
给我一秒钟,我来打一个例子。 10
这是一个我喜欢如何使用条件语句的示例。使用子程序-它使其更易于阅读,并且不会在代码中丢失。
页:
1
[2]