トップCADで螺旋

AutoCADでコイルバネを描く方法の質問を受けた。当然3Dで...
そう云うコマンドは無いようです。そもそも螺旋ってどう描くのだろう?
とりあえず、1巻分の螺旋を描いてみよう。近似形だけど...
  1. 線分(line)で、螺旋の中心から半径方向に線分を引く。
  2. 配列複写(array)で、線分を円形状に360度複写。複写回数を増やせばより滑らかに。
  3. 移動(move)で、円形複写した線分を一本ずつ等間隔にZ軸方向に移動。移動距離は全体の高さ÷複写回数×移動した線の数かな。
  4. 3Dポリライン(3dpoly)で、線分の端点を繋ぐ。
描けましたが、非常に面倒です。AutoLISPで自動化しないと使えません。
以下にソースリストを記述しますので、ご参考にどうぞ。
(defun c:rasen ()
    (command "undo" "be"))
    (setq m (getvar "osmode"))
    (setq o (getpoint "中心:"))
    (command "line" o (getdist o "\n半径:") "")
    (setq h (getdist o "\n高さ:"))
    (setq p (getint "\n分数:"))
    (setq s (entlast))
    (setvar "osmode" 0)
    (command "array" s "" "p" o p 360 "y")
    (setq o s)
    (setq c 1)
    (while (< c p)
        (setq o (entnext o))
        (command "move" o "" "0,0,0" (list 0 0 (* (/ h p) c)))
        (setq c (1+ c))
    )
    (command "copy" s "" "0,0,0" (list 0 0 h))
    (command "3dpoly" (cdr (assoc 11 (entget s))))
    (setq o s)
    (setq c 0)
    (while (< c p)
        (setq o (entnext o))
        (command (cdr (assoc 11 (entget o))))
        (setq c (1+ c))
    )
    (command "")
    (command "erase")
    (setq c 1)
    (while (< c p)
        (setq s (entnext s))
        (command s)
        (setq c (1+ c))
    )
    (command "")
    (setvar "osmode" m)
    (command "undo" "e"))
    (princ)
)

たもちゃ箱トップ