やりたいことができる関数がないから、自分で関数を作りたい。でも、関数の作り方が分からずお困りではないでしょうか。そもそも関数ってなに?と思う方も多いはず。
私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。
AutoLISPについての詳細はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
当記事ではユーザー関数を定義するAutoLISP関数「defun」について解説します。やりたい処理ができる関数の作り方が分かるため、AutoLISPで実現できることが増えます。
ユーザー関数を活用してAutoCADを自動化・効率化したい方は最後までお読みください。
ユーザー関数とはユーザーが定義したオリジナルの関数のこと。
defunでユーザー関数を定義するときは関数名、引数、ローカル変数、内部で実行する式を記述してください。関数名の先頭に「c:」を付けるとコマンドとして扱えます。
関数とは自動販売機のようなもの
関数はジュースなどの自動販売機(以下、自販機)に似ています。理由は自販機と関数の動作がそっくりだから。
自販機はお金を入れてボタンを押すと、内部の機械が動いて商品が出てきます。関数も同様に、数値や文字列などの値を与えると、内部で処理が行われて結果が出力されます。
関数と自販機の対応を、以下の表にまとめたので参考にしてください。
項目 | 関数 | 自販機 |
入れるもの(与えるもの) | 数値や文字列などの値 | お金 |
出てくるもの | 処理の結果 | 商品(+おつり) |
特に関数へ与える値は「引数」、処理の結果は「返り値」と呼ぶので覚えておきましょう。自販機に入れるお金によって買える商品が変わるように、関数へ与える引数によって返り値も変わります。
関数を使いこなすためには、入れるものと出てくるものを理解しておくことが重要です。
defunはユーザー関数とコマンドを作成できる
defunとはユーザー関数を定義するAutoLISP関数です。「定義する」とは関数を作成することと思ってください。
ユーザー関数
ユーザーが標準関数を組み合わせて定義したオリジナルの関数のこと。標準関数とはsetqやlistなど、AutoLISPにあらかじめ用意されている関数を指します。
defunの中にさまざまな処理を記述することで、1つの標準関数だけでは実現できない処理を、1つの関数で実行できます。
例えば、円を作図した後に色を変えたり、作成した画層に線分を配置したり。処理をまとめることでプログラムの見た目もシンプルになります。
さらに、defunは関数だけでなくオリジナルのAutoCADコマンドを作成することも。defunはAutoLISPを使いこなすために欠かせない関数の1つです。
ちなみに、defunは「defin function」の略です。
defunの書き方と使用例3選
defunはあらゆるAutoLISPのプログラムで使用される非常に重要な関数です。defunの書き方と使用例を解説するので、しっかり使い方をマスターしてください。
defun の構文 / 引数 / 返り値
defunの構文は次のとおりです。引数と返り値については下の表をご覧ください。
構文
(defun 関数名 (引数・・・ / ローカル変数・・・)
式・・・
)
引数
引数 | 内容 |
関数名 | 定義するユーザー関数の名前。 標準関数と同じ名前は使用できない。 |
引数 | ユーザー関数が外部から受け取る値。 関数の内部ではローカル変数として扱う。 複数記述できて、省略も可能。 |
ローカル変数 | ユーザー関数の中だけで使用できる変数。 複数記述できて、省略も可能。 |
式 | ユーザー関数が実行する式(処理) 複数記述できて、省略も可能。 |
返り値
返り値 | 内容 |
最後に評価した式の結果 | ユーザー関数の中で最後に評価した式の結果を返す |
ローカル変数とグローバル変数
AutoLISPの関数ではローカル変数とグローバル変数が使用できます。
- ローカル変数
- ユーザー関数の中で定義される変数。定義したユーザー関数の中でのみ値を保持できる。他の関数からは値を参照できない。
- グローバル変数
- ローカル変数以外の定義していない変数。直接値を書き換えるか、図面を閉じないかぎり値を保持し続ける。値はどの関数からも参照できる。
注意していただきたいのは、ローカル変数の定義もれです。
定義していない変数はグローバル変数として扱われます。他の関数で同名のグローバル変数を使用していた場合、動作に影響することも。慣れないうちはグローバル変数を使用しないことをおすすめします。
やりたい処理によって、ローカル変数とグローバル変数を使い分けることが重要です。
defunの使用例3選
defunの使用例を3つご紹介します。AutoLISPのプログラム作成に役立ててください。
使用例① 新規で作成した画層に円を作図する関数
新規で作成した画層に円を作図するユーザー関数をご紹介します。
(defun test1 (/)
(command "-layer" "M" "レイヤ1" "C" 1 "レイヤ1" "")
(command "circle" (list 0 0) "D" 10)
)
commandはAutoCADコマンドを実行できるAutoLISPの標準関数です。commandの詳細はこちらの記事で解説しているので参考にしてください。
>>【作図を自動化】コマンドを実行するAutoLISP関数「command」を解説
上記のプログラムは以下のような動作をします。
- ”レイヤ1”という画層を新規で作成。現在層が"レイヤ1"に切り替わる
- 画層の色設定を1(赤色)に変更する
- 中心(0,0)に直径10の円を作図する
今回のプログラムを実行するためには、プログラムをロードしておく必要があります。ロードの方法についてはこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
コマンドラインに「(test1)」と入力すると関数が実行され、下図の円と画層が作成されます。
画層の色設定を赤色にしたため、作図された円は赤色になっています。
引数とローカル変数を定義しない場合でも、関数名の後ろには必ず「(/)」を記述してください。「(/)」の記述がないとエラーになります。
ちなみに、commandの返り値は必ずnilになるので、今回のユーザー関数の返り値はnilです。
使用例② 引数の文字列が現在層の画層名と一致するか判定する関数
次のプログラムは、引数の文字列が現在層の画層名と一致するか判定するユーザー関数です。
(defun test2 (str / layname)
(setq layname (getvar "clayer"))
(if (= str layname)
(eval "現在層の画層名と一致しています。")
(eval "現在層の画層名と一致していません。")
)
)
evalとは式を強制的に評価するAutoLISP関数のこと。今回の場合、evalの後ろに記述している文字列がevalの評価結果となります。
getvarはシステム変数の値を取得するAutoLISP関数です。getvarとシステム変数についてはこちらの記事をご覧ください。
>>AutoCADの環境設定をお手軽にカスタマイズ!便利なシステム変数4選
上記のプログラムが行っている動作は次の4つです。
- 引数として変数strを受け取る
- 現在層の画層名を取得して、変数laynameへ格納する
- 変数srtと変数laynameが等しいか判定する
- 判定した結果の文字列を返す
前述した使用例と同様に、プログラムを実行するためにはプログラムをロードする必要があります。ロードの手順はこちらの記事を参考にしてください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
現在層が"0"のときに、"0"を与えた場合の実行結果は次のとおり。
現在層の画層名と異なる文字列を与えた場合は、以下のように表示されます。
引数によって返り値を変えたい場面は非常に多いです。使用例をカスタマイズしながら基本を身に付けてください。まずは、ifの部分をcondに変えて、返り値の種類を増やしてみることをおすすめします。
condとは複数の条件分岐を設定できる関数です。condの詳細はこちらの記事をご覧ください。
>>【if】動作の流れを操る者!AutoLISPの条件分岐を解説
使用例③ 3色の同心円を作図するコマンド
3色の同心円を作図するユーザー関数を、コマンドにした例をご紹介します。
(defun c:test3 (/ cnt)
(setq cnt 1)
(repeat 3
(command "-color" cnt)
(command "circle" (list 0 0) "D" (* cnt 10))
(setq cnt (1+ cnt))
)
(command "-color" "ByLayer")
)
commandで実行している「-color」は、ダイアログを表示せずに既定の色設定を変更するAutoCADコマンドです。ちなみに、ダイアログを非表示にできるAutoCADコマンドはこちらの記事でご紹介しています。
>>【作図を自動化】コマンドを実行するAutoLISP関数「command」を解説
上記のプログラムが行う動作は次の5つ。
- 変数cntに1を格納
- 既定の色設定を変数cntと同じ値にする
- 中心(0,0)に変数cntの10倍の直径で円を作図する
- 変数cntを1を加算する
- ②~④を3回繰り返す
- 既定の色設定を「ByLayer」に戻す
プログラムがロードされていれば、コマンドラインに「test3」と入力するだけで実行できます。プログラムのロードについてはこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
コマンドを実行すると、図面上には赤色、黄色、緑色の3色の円が作図されます。
関数名の先頭に「c:」をつけると、ユーザー関数をコマンドとして扱うことができます。コマンドラインから実行するときに、関数名の両側にかっこを付ける必要がありません。
プログラムが実行しやすくなることは大きなメリットです。
Cドライブの「c:」とは関係ありません。
defunを使いこなしてAutoCADを自動化しよう
今回ご紹介したAutoLISP関数「defun」の内容を以下にまとめます。
- defunは標準関数を組み合わせてオリジナルの関数(ユーザー関数)を定義できる
- ユーザー関数の中だけで使用できる変数をローカル変数と呼ぶ
- ローカル変数以外の変数はグローバル変数と呼び、他の関数から参照できる
- 関数名の先頭に「c:」を付けるとコマンドとして扱える
ユーザー関数を上手に活用して、AutoCADの自動化・効率化に役立ててください。
AutoLISPの基礎を書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。