Sponsored links

【AutoLISP 自作関数】頻出パターンは自作関数にしてもっと便利に

Sponsored links
応用
Sponsored links

図形を選択して図形名を変数Objに入れる。など、よく使うプログラムは、自作関数にすると、同じコードを何度も書かなく済みます。

Sponsored links

関数を作る

(setq ….) (getpoint …… ) などなど、それぞれの機能、働きがあって、AutoCADに指示を出せるのが関数でしたね。

この関数も、コマンドと同じように作ることができます。実は、これまで作ってきたコマンドも、コマンド関数という関数です。

方法は簡単で、コマンド関数の時と同じように、関数defun を使います。
(defun の後の c: はコマンド関数という意味なので、今回はc: は入れません。

( 関数名 () …….. ) となります。

例) 選択した図形の図形名を得る関数

AutoLISP プログラム

クリックミス対策付きの選択した図形の図形名が戻り値の関数を作りましたので、これを使って解説します。

(defun Jaga00GetObj ( / Obj)
  (setq Obj nil)
  (while (null Obj)
    (setq Obj (car (entsel)))
  );while
Obj
)

関数名はJaga00GetObjとしました。

関数名は機能がわかりやすいものがいいと思います。このサイトでは、図形名は変数Objにいれてきたので、GetObjにしました。

そして、その前の Jaga00 について、これは個人の好みですが、私は自作関数には自分の関数だとわかる記号(この場合はJaga)と、カテゴリ別にしたり整頓しやすいように数字を入れて、スプレッドシートで一覧にして、同じ名前の関数を作らないよう管理しています。

過去に作った関数や誰かが作った関数と、名前同じだと上書きされてしまうので、同じ名前の関数が存在しないように工夫が必要です。

Jagaimo
Jagaimo

既存のAutoLISP関数でも、同じ名前の物を作ると、警告メッセージすら出ることなく上書きされてしまうので、自作関数を作るときには被らないように名前に気を付けましょう。

AutoLISPの説明

(defun Jaga00GetObj ( / Obj)

今までコマンドを作ってきたときと同じように、AutoLISP関数defun を使います。

違うのは、コマンド関数を意味する c: が無いだけです。
コマンド作成時と同じように、自作関数名の後ろの空カッコではローカル変数の宣言ができます。

 (setq Obj nil)
  (while (null Obj)
  (setq Obj (car (entsel)))
 );whil
e

の部分で、ユーザー選択した図形の図形名を変数Objに入れています。
この内容を知りたいかたはコチラの記事を

変数の値を戻り値に

Obj
)

と最後は変数名で終わっています。

コマンド関数を作るとき、最後に(princ) を入れていました。
AutoLISPは最後の値を戻り値として表示するので、何も戻さない機能がある(princ)を入れた方がキレイだという理由でした。

この関数では戻り値を戻して欲しいので最後に(princ) を付けません。

プログラムの終わりは while 終了なので、戻り値がnil になってしまいます。しかし、この関数の戻り値にしたいのは、変数Objに入っている図形名です。

そこで、変数名をそのまま最後に入れると、変数の中の情報が、この自作関数の戻り値になります。
今回は、Objに入った情報を戻り値にしたいので、最後にObj と変数名を入れて、defun を ) で閉じて関数の定義を終わります。

これで、選択した図形の図形名が戻り値になる関数が出来上がりました。

自作関数を使ってコマンドを作ってみよう

では、このJaga00GetObjを使って、コマンドを作ってみましょう。
図形選択をして、その図形を赤くするというコマンドです。

(defun c:test ( / Obj)

  (setq Obj nil)
  (while (null Obj)
    (setq Obj (car (entsel)))
  );while

	(command-s "._change" Obj "" "p" "c" "1" "") 
	
(princ))

この、図形選択の部分で、先ほど作ったJaga00GetObjを使うとこんなに短くなります。

(defun c:test ( / Obj)
   (setq Obj (Jaga00GetObj))
    (command-s "._change" Obj "" "p" "c" "1" "") 	
(princ))
Jagaimo
Jagaimo

関数Jaga00GetObj を使うから、読み込んでから試してね。

さて、Jaga00GetObj 選択した図形名が戻り値の関数でしたね。
これをを使えば、

(setq Obj (Jaga00GetObj))

この一行で変数Objに図形名が入ります。しかも空振り対策付きです。
このように、よく使うルーティーンは自作関数にすると、コマンド作成がどんどん楽になります。

まとめ

  • 関数 defun は関数を定義する機能がある。
  • c: を付けるとコマンド関数で、付けないと関数を定義する。
  • AutoLISPは最後の値が戻り値になる。
  • 変数名を入れると変数の中の情報が戻り値になる。
  • 作った関数は、既存関数と同じように、( )で囲んで使う。
  • 作った関数は、コマンド実行時より前に読み込んでおかないと使えない。

関連記事

一部分だけの情報を変更した類似自作関数を作るには、引数付き関数が便利です。
それについてはコチラの記事を。

記事中に出てきた、コマンド関数最後の(princ)って何のこと?と言う方はこ知らの記事を。

コマンド関数を定義することの復習をしたくなった方はコチラの記事を。

共通の部分を自作関数にして複数のコマンドで使っているサンプルです。

Comments