Hippe013 发表于 2022-7-5 18:51:25

cond语句的语法不正确。您可以将条件语句视为类似于if语句,但有一堆代码可以运行的槽。如果这是真的,做这个,或者如果这是真的,做这个,如果那些是真的,做这个,等等。
 
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。
 
这有帮助吗?

broncos15 发表于 2022-7-5 18:55:18

Hippe013,是的,这很有帮助。我正在格式化我的条件语句的介绍部分,就像我对if语句的格式化一样,谢谢!我现在可以加载它,所以调试起来会更容易。再次感谢您的帮助。

Hippe013 发表于 2022-7-5 18:56:35

Broncos15,
 
我可以看出你是那种想学习的人,大部分工作都是你自己做的。你是我喜欢帮助的人的典型代表。我不想在这里为人们写请求代码。我想教和指导人们学习LISP和VLISP。
 
不客气!
 
当做
 
hippe013

broncos15 发表于 2022-7-5 18:59:58

Hippe013,谢谢你,我真的很感激!我对学习和提高lisp非常感兴趣,非常感谢您的帮助。我还有一个关于代码的快速问题。为什么我稍后在设置中调用变量*offsetdistans*和*offsethightans*时,将其设置为0.5会产生错误的函数错误0.5?这似乎没有意义,因为我只是将它们设置为一个值,然后在设置中使用getreal函数。

Hippe013 发表于 2022-7-5 19:03:43

*offsetdistans*不是一个子例程,它是一个具有实值的符号。
 
更改:
 
(getreal "\nOffset Distance" "" (*offsetdistans*) ":")
 
收件人:

(getreal (strcat "\nOffset Distance: "(rtos *offsetdistans* 2 2) ":"))
 
strcat将把一串字符串组合在一起。
 
rtos将实数转换为字符串。
 
()中包含的第一个符号需要是函数、子例程、运算符或隐含列表,即“(1 2 3 4 5)
请注意隐含列表之前的引号。

broncos15 发表于 2022-7-5 19:06:46

Hippe013,谢谢。如果我理解的话,rtos的2 2将其转换为带2位小数的小数,对吗?此外,在合并代码后,为什么会得到“错误:错误参数类型:numberp:”\n偏移距离:0.50:?

Hippe013 发表于 2022-7-5 19:09:08

重新发布最新的代码。我将对其进行快速调试。我喜欢在vlide中为我的代码制作动画。它一步一步地运行代码,通常会在导致错误的地方停止。

broncos15 发表于 2022-7-5 19:11:24

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)
)

Hippe013 发表于 2022-7-5 19:14:54

有几件事出错了。
 
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语句。只是让代码更容易阅读。
 
给我一秒钟,我来打一个例子。

Hippe013 发表于 2022-7-5 19:19:10

10
 
 
这是一个我喜欢如何使用条件语句的示例。使用子程序-它使其更易于阅读,并且不会在代码中丢失。
页: 1 [2]
查看完整版本: Lisp不工作