在命令中使用While循环

时间:2019-03-10 05:45:31

标签: autocad autolisp

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

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

1 个答案:

答案 0 :(得分: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)
)

注意:

关于上述代码的几点注意事项:

  • 局部变量(即仅需要在此函数范围内定义的变量)在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)
)