在命令中使用While循环

问题描述 投票:1回答:1

一个简单的循环程序可以用作:

(setq y 0)
(while (< q 12) (setq q (1+ q)) 
(print "Hello")
)

但是如何在Autocad命令中使用这样的循环?

我相信下面的代码可以使用循环简化,但如何在运行命令中使用它们。

(defun PX (_angle)
  (list (* BaseRadius
       (+ (cos (+ 1.570796 _angle)) (* _angle (cos _angle)))
    )
    (* BaseRadius
       (+ (sin (+ 1.570796 _angle)) (* _angle (sin _angle)))
    )
  )
)

(defun c:cir ()
  (setq BaseRadius 8)
  (command "_pline"
       "qua"
       (PX 0)
       (PX 0.1)
       (PX 0.2)
       (PX 0.3)
       (PX 0.4)
       (PX 0.5)
       (PX 0.6)
       (PX 0.7)
       (PX 0.8)
       (PX 0.9)
       (PX 1)
       (PX 1.1)
       (PX 1.2)
       (PX 1.3)
       (PX 1.4)
       (PX 1.5)
       ""
  )
autocad autolisp
1个回答
3
投票

有几种方法可以实现这一目标。

使用repeat

最简单的方法可能是使用repeat循环,它将预定次数的一组表达式求值,每次迭代时你的角度变量递增:

(defun c:cir ( / ang rad )
    (setq ang 0.0
          rad 8.0
    )
    (command "_.pline")
    (repeat 16
        (command "_non"
            (list
                (* rad (+ (cos (+ (/ pi 2.0) ang)) (* ang (cos ang))))
                (* rad (+ (sin (+ (/ pi 2.0) ang)) (* ang (sin ang))))
            )
        )
        (setq ang (+ ang 0.1))
    )
    (command "")
    (princ)
)

Notes:

有关上述代码的一些注意事项:

  • 局部变量(即只需要在此函数范围内定义的变量)在参数列表中的正斜杠(defun)之后被声明为/表达式的一部分。这可确保函数定义的变量不会干扰Document名称空间中定义的同名全局变量。有关此主题的更多信息,您可以参考我的教程here
  • 最好始终使用下划线(_)和句点(.)命令前缀(例如在"_.pline"中),因为下划线确保始终使用英语版本的命令,无论AutoCAD的语言版本如何评估该功能;句点确保使用命令的原始定义,忽略任何可能的重新定义。
  • 在任何点输入之前提供的"_non"(或"_none")对象捕捉修改器可确保在向命令提供点时忽略任何活动的对象捕捉模式。另一种方法是暂时存储OSMODE系统变量的值并将其设置为0(从而禁用所有对象捕捉模式),同时提供点输入,或临时将OSNAPCOORD系统变量设置为1,但这些解决方案中的任何一个都需要使用如果任何失败,重置系统变量的错误处理程序。
  • 表达式(cos (+ (/ pi 2.0) ang))(sin (+ (/ pi 2.0) ang))可以分别用(sin (- ang))(cos ang)替换。但我不想偏离原始代码太远,以便您可以更好地理解我所做的更改。

使用while

或者,如果您希望迭代多次由超过给定限制的变量值确定,则while循环可能是更合适的选项:

(defun c:cir2 ( / ang rad )
    (setq ang 0.0
          rad 8.0
    )
    (command "_.pline")
    (while (< ang 1.6)
        (command "_non"
            (list
                (* rad (+ (sin (- ang)) (* ang (cos ang))))
                (* rad (+ (cos    ang)  (* ang (sin ang))))
            )
        )
        (setq ang (+ ang 0.1))
    )
    (command "")
    (princ)
)
© www.soinside.com 2019 - 2024. All rights reserved.