2016年8月17日水曜日

スピログラフ

スピログラフ


昔、歯車がついた定規がありました。
その定規で、下の紙が破れるまでグルグル回した記憶があります。

これをAutolispで作成。意外と簡単な命令なんですね。
ノーマルな命令しか使っていないので、自由に改造、
例えば色を付けるとか、挑戦してみて下さい。

------------この下から---------
(defun c:sg (/ CH KA P0 P2 P3 P4 P5 PP R1 R2 R3 R4 R5 ST TB)
 ;spirograph スピログラフ by nsmaster 2016/08/17
 (setq p0 (getpoint "\n[スピログラフ] 作図点:"))
 (setq r1 (getreal  "\n[スピログラフ] 大半径:"))
 (setq r2 (getreal  "\n[スピログラフ] 小半径:"))
 (setq r3 (getreal  "\n[スピログラフ] 変芯量:"))
 ;////諸計算////
 (setq pp 1.0 st (* pi (/ pp 180.0)));作図精度(deg,rad)
 (setq r4 (- r1 r2));大半径-小半径の差
 (setq tb (/ r1 r2));大半径/小半径の比率
 ;////情報表示/////
 (command ".undo" "be")
 (entmake (list '(0 . "POINT")(append '(10) p0)))
 (setq r5  (+ (- r1 r2) r3));最大半径の計算
 (setq p5 (polar p0 (* pi 1.25) (* r5 (sqrt 2.0))));左下の角点
 (entmake (list '(0 . "TEXT")(append '(10) p5)(append '(11) p5)
   (cons 1 (strcat "R1:" (rtos r1 2 3) " R2:" (rtos r2 2 3) " R3:" (rtos r3 2 3)))
   (cons 71 0)(cons 72 0)(cons 73 1)(cons 41 0.8)(cons 40 (/ r1 50.0))
   );入力値作図
  )
 ;////作図計算////
 (setq ka 0.0);作図開始角度(rad)
 (setq p2 (polar (polar p0 ka r4) (* ka tb) r3) p4 p2);最初の位置計算
 (setq ch 0)
 (while (= ch 0)
  (setq ka (+ ka st));角度増値
  (setq p3 (polar (polar p0 ka r4) (* ka tb) r3));座標計算
  (entmake (list '(0 . "LINE") (append '(10) p2)(append '(11) p3)));作図
  (if (< (distance p4 p3) 0.0001)(setq ch 1)(setq p2 p3));最初の位置になったか?
  )
 (command ".undo" "e")
 (princ)
 )
------------この上までをコピーして、sg.lsp の名前で保存

ツール→Autolisp→アプリケーションのロード→
先ほどの sg.lsp を読み込み
コマンドラインで sg リターン


線の容量は半端なく増えますが、仕事の息抜きにどうぞ。