乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 6|回复: 6

[编程交流] 了解';如果

[复制链接]
Reu

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 07:00:10 | 显示全部楼层 |阅读模式
  1. (defun gp:getPointInput        (/ StartPt EndPt HalfWidth)
  2.   (if (setq StartPt (getpoint "\nStart point of path: "))
  3.   (if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
  4.   (if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))
  5. T
  6. )
  7. )
  8. )
  9. )

 
我认为if函数的语法是:
 
(if(测试表达式)
(表达式)(可选表达式)
 
)
 
在上述代码中使用“if”的目的是什么?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:18:54 | 显示全部楼层
如果压痕更好,意图可能更清楚:
 
  1. (defun gp:getPointInput ( / StartPt EndPt HalfWidth )
  2.    (if (setq StartPt (getpoint "\nStart point of path: "))
  3.        (if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
  4.            (if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))
  5.                T
  6.            )
  7.        )
  8.    )
  9. )

 
这里,第一个和第二个if语句的“then”表达式分别是第二个和第三个if语句;尽管如此,由于最终if语句的“then”表达式只是返回布尔真值,而不使用收集的点和距离值,因此代码是毫无意义的。
回复

使用道具 举报

Reu

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 07:26:27 | 显示全部楼层
 
  1. ;;; Function gp:getPointInput will get path location and size
  2. (defun gp:getPointInput        (/ StartPt EndPt HalfWidth)
  3. (if (setq StartPt (getpoint "\nStart point of path: "))
  4.    (if        (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
  5.      (if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))
  6. (list StartPt EndPt HalfWidth)
  7.      )
  8.    )
  9. )
  10. )

 
这样更好?我最近发现了AutoLISP教程(代码就是从这里来的)。我问过上面所示的“如果”,因为我以前见过它这样做,并想知道为什么。当我寻找类似以下内容时,它没有意义:
 
(如果(本声明属实)
(这样做)
(否则请执行此操作)
 
因此,从本质上讲,第一个“if”的“test expression”是“(getpoint”\n路径的起始点:“)”,如果“test expression”返回非零值,则要计算的“expression”是“(setq StartPt)”,“else”表达式是用户执行的任何返回零值的操作(例如按“Enter”)。
 
我说得对吗?
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:37:50 | 显示全部楼层
Lee Mac刚刚格式化了您的代码摘录,以帮助您理解逻辑顺序。我会尝试添加评论,也许这会对您有更多帮助:
  1. (defun gp:getPointInput ( / StartPt EndPt HalfWidth)
  2. (if (setq StartPt (getpoint "\nStart point of path: "))           ;1
  3. (if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))       ;2
  4.   (if (setq HalfWidth (getdist EndPt "\nhalf-width of path: "))   ;3
  5.    (list StartPt EndPt HalfWidth)                                 ;4
  6.   )
  7. )
  8. )
  9. )

[列表=1]
  • 测试用户是否选择了一个点或输入了一组坐标;如果成功,请转至下一个测试。
  • 测试用户是否选择了另一个点或输入了一组坐标;如果成功,请转至下一个测试。
  • 测试用户是否拾取了点(AutoCAD返回第二个点和当前拾取之间的测量距离)或输入了距离(数值)。
  • 如果上述三个输入均有效(所有测试均通过),则例程返回一个列表,其中第一点和第二点分别为数值。
    [/列表]
     
    这种格式对你更有意义吗?
    1. (defun gp:getPointInput ( / StartPt EndPt HalfWidth)
    2. (if (and (setq StartPt (getpoint "\nStart point of path: "))
    3.          (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
    4.          (setq HalfWidth (getdist EndPt "\nhalf-width of path: ")))
    5. (list StartPt EndPt HalfWidth)
    6. )
    7. )
  • 回复

    使用道具 举报

    35

    主题

    2471

    帖子

    2447

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    174
    发表于 2022-7-6 07:40:50 | 显示全部楼层
    我还注释了您的代码分析:
    因此,第一个“if”的“test expression”本质上是“(getpoint”\n路径的起始点:”)“[true],如果“test expression”返回非nil值,则要计算的“expression”是“(setq StartPt)”,新的输入测试和“else”表达式可以是用户执行的任何返回nil值的操作(例如按“回车”)。不存在于这段代码中;如果输入无效或被取消,它什么也不做(更准确地说,例程将返回nil)。
    回复

    使用道具 举报

    Reu

    6

    主题

    19

    帖子

    13

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-6 07:59:56 | 显示全部楼层
     
    是的,谢谢。
     
    因此,当您执行多个“if”语句时,它与具有多个“and”测试表达式的单个“if”语句是一样的。
    回复

    使用道具 举报

    35

    主题

    2471

    帖子

    2447

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    174
    发表于 2022-7-6 08:04:31 | 显示全部楼层
    存在差异;使用嵌套IF将能够为每个无效输入定义一个特定的操作,同时将测试与和操作相结合将是常见的。请在VLISP控制台中测试以下两段代码:
     
    1. (if (setq var1st (getint "\nFirst number: "))
    2. (if (setq var2nd (getint "\nSecond number: "))
    3. (alert "All inputs valid!")
    4. (alert "No 2nd input!")
    5. )
    6. (alert "No 1st input!")
    7. )

     
    1. (if (and (setq var1st (getint "\nFirst number: "))
    2.         (setq var2nd (getint "\nSecond number: ")))
    3. (alert "All inputs valid!")
    4. (alert "No inputs!")
    5. )
    回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

    QQ|关于我们|小黑屋|乐筑天下 繁体中文

    GMT+8, 2025-3-10 11:15 , Processed in 0.504268 second(s), 77 queries .

    © 2020-2025 乐筑天下

    联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表