了解';如果
(defun gp:getPointInput (/ StartPt EndPt HalfWidth)(if (setq StartPt (getpoint "\nStart point of path: "))
(if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
(if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))
T
)
)
)
)
我认为if函数的语法是:
(if(测试表达式)
(表达式)(可选表达式)
)
在上述代码中使用“if”的目的是什么? 如果压痕更好,意图可能更清楚:
(defun gp:getPointInput ( / StartPt EndPt HalfWidth )
(if (setq StartPt (getpoint "\nStart point of path: "))
(if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
(if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))
T
)
)
)
)
这里,第一个和第二个if语句的“then”表达式分别是第二个和第三个if语句;尽管如此,由于最终if语句的“then”表达式只是返回布尔真值,而不使用收集的点和距离值,因此代码是毫无意义的。
;;; Function gp:getPointInput will get path location and size
(defun gp:getPointInput (/ StartPt EndPt HalfWidth)
(if (setq StartPt (getpoint "\nStart point of path: "))
(if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
(if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))
(list StartPt EndPt HalfWidth)
)
)
)
)
这样更好?我最近发现了AutoLISP教程(代码就是从这里来的)。我问过上面所示的“如果”,因为我以前见过它这样做,并想知道为什么。当我寻找类似以下内容时,它没有意义:
(如果(本声明属实)
(这样做)
(否则请执行此操作)
因此,从本质上讲,第一个“if”的“test expression”是“(getpoint”\n路径的起始点:“)”,如果“test expression”返回非零值,则要计算的“expression”是“(setq StartPt)”,“else”表达式是用户执行的任何返回零值的操作(例如按“Enter”)。
我说得对吗? Lee Mac刚刚格式化了您的代码摘录,以帮助您理解逻辑顺序。我会尝试添加评论,也许这会对您有更多帮助:
(defun gp:getPointInput ( / StartPt EndPt HalfWidth)
(if (setq StartPt (getpoint "\nStart point of path: ")) ;1
(if (setq EndPt (getpoint StartPt "\nEndpoint of path: ")) ;2
(if (setq HalfWidth (getdist EndPt "\nhalf-width of path: ")) ;3
(list StartPt EndPt HalfWidth) ;4
)
)
)
)
[列表=1]
[*]测试用户是否选择了一个点或输入了一组坐标;如果成功,请转至下一个测试。
[*]测试用户是否选择了另一个点或输入了一组坐标;如果成功,请转至下一个测试。
[*]测试用户是否拾取了点(AutoCAD返回第二个点和当前拾取之间的测量距离)或输入了距离(数值)。
[*]如果上述三个输入均有效(所有测试均通过),则例程返回一个列表,其中第一点和第二点分别为数值。
[/列表]
这种格式对你更有意义吗?
(defun gp:getPointInput ( / StartPt EndPt HalfWidth)
(if (and (setq StartPt (getpoint "\nStart point of path: "))
(setq EndPt (getpoint StartPt "\nEndpoint of path: "))
(setq HalfWidth (getdist EndPt "\nhalf-width of path: ")))
(list StartPt EndPt HalfWidth)
)
) 我还注释了您的代码分析:
因此,第一个“if”的“test expression”本质上是“(getpoint”\n路径的起始点:”)“,如果“test expression”返回非nil值,则要计算的“expression”是“(setq StartPt)”,新的输入测试和“else”表达式可以是用户执行的任何返回nil值的操作(例如按“回车”)。不存在于这段代码中;如果输入无效或被取消,它什么也不做(更准确地说,例程将返回nil)。
是的,谢谢。
因此,当您执行多个“if”语句时,它与具有多个“and”测试表达式的单个“if”语句是一样的。 存在差异;使用嵌套IF将能够为每个无效输入定义一个特定的操作,同时将测试与和操作相结合将是常见的。请在VLISP控制台中测试以下两段代码:
(if (setq var1st (getint "\nFirst number: "))
(if (setq var2nd (getint "\nSecond number: "))
(alert "All inputs valid!")
(alert "No 2nd input!")
)
(alert "No 1st input!")
)
(if (and (setq var1st (getint "\nFirst number: "))
(setq var2nd (getint "\nSecond number: ")))
(alert "All inputs valid!")
(alert "No inputs!")
)
页:
[1]