数値をちょっとだけ変えてコマンド内で何回か使いたいけれど、他のコマンドでは使いそうにない一連の流れは、コマンド関数内でもdefunを使って定義できます。
(/ ローカル関数名)で、ローカル関数として宣言できます。
予備知識
自作関数について
一時的に使う関数を関数内で定義
よく使うプログラムの流れは、自作関数にすると、コマンド作りが楽になります。
しかし、このコマンド関数内では何回も使うけれど、他のコマンド関数では使わないようなというようなものはコマンド関数内で定義してローカル関数にすることができます。
例として、以下のような作図をするコマンドを作ります。
「角度がついた線分を引いて端っこに円を描く。」
このコマンド内では何度もこの流れを使いますが、他のコマンドでは使うことが無さそうですよね。
自作関数にすると他の関数名と同じにならないような名前も決めなくてはいけなくて面倒です。
そんなときは、コマンド関数内で作成して、ローカル関数にしておけば、適当な仮の名前でも他に影響も与えないしコマンド内で終結します。
AutoLISP プログラミング例
一点を指定すると上の図を作図するコマンド例です。コマンド名はTESTです。
オブジェクトスナップが影響するのでオフにして試してください。
(defun c:TEST ( / Example BasePt)
(defun Example (Pt1 Ang X Y / Pt2)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
(setq BasePt (getpoint))
(Example BasePt 0 50 10)
(Example BasePt 30 30 5)
(Example BasePt 60 40 2.5)
(Example BasePt 90 60 20)
(princ))
AutoLISP の説明
(defun c:TEST ( / Example BasePt)
コマンド定義内で定義する角度を付けた線分と円を描く部分はExampleという名前にします。
このコマンド内でしか使わないので、(/ Example)でローカル関数宣言しています。
(defun Example (Pt1 Ang X Y / Pt2)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
この部分で自作関数Exampleを定義しています。
引数としてPt1、Ang、X、Yを渡すと、
「点Pt1から角度Angに向かって長さXの線を引いて半径Yの円を描く」
という内容です。
(setq BasePt (getpoint))
変数BasePtにユーザー入力で点座標を入れます。
(Example BasePt 0 50 10)
(Example BasePt 30 30 5)
(Example BasePt 60 40 2.5)
(Example BasePt 90 60 20)
先ほど定義した関数Exampleに必要な引数を渡して作図します。
(Example BasePt 0 50 10) は
「点 BasePt から角度0°に向かって長さ50の線を引いて半径10の円を描く」
別の値でも同じように描かれて以下のような図が作成されます。
まとめ
- 関数内でしか使わない関数を作成できる。
- ローカル変数と同じように、(/ 関数名) でローカル関数になる。
関連記事
今回使った作図コマンドの別の書き方です。
mapcarを使うと、引数の値をリストにし、リストの要素の回数だけ繰り返すことができます。
さらにlambdaを使うと、mapcarで使用する引用関数に1回だけ使える仮の自作関数を定義できます。自作関数名を考える手間が省けます。
よくある一連の流れを自作関数にする。ことについて。
コマンド関数内で一時的な自作関数を使った作図コマンドのサンプルです。
Comments