AutoLISP入門 関数紹介

【初心者向け】関数を作ろう!ユーザー関数を定義するAutoLISP関数「defun」

やりたいことができる関数がないから、自分で関数を作りたい。でも、関数の作り方が分からずお困りではないでしょうか。そもそも関数ってなに?と思う方も多いはず。

私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。

AutoLISPについての詳細はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説

当記事ではユーザー関数を定義するAutoLISP関数「defun」について解説します。やりたい処理ができる関数の作り方が分かるため、AutoLISPで実現できることが増えます。

ユーザー関数を活用してAutoCADを自動化・効率化したい方は最後までお読みください。

ユーザー関数とはユーザーが定義したオリジナルの関数のこと。

defunでユーザー関数を定義するときは関数名、引数、ローカル変数、内部で実行する式を記述してください。関数名の先頭に「c:」を付けるとコマンドとして扱えます。

関数とは自動販売機のようなもの

function_h2_image1

関数はジュースなどの自動販売機(以下、自販機)に似ています。理由は自販機と関数の動作がそっくりだから。

自販機はお金を入れてボタンを押すと、内部の機械が動いて商品が出てきます。関数も同様に、数値や文字列などの値を与えると、内部で処理が行われて結果が出力されます。

関数と自販機の対応を、以下の表にまとめたので参考にしてください。

項目関数自販機
入れるもの(与えるもの)数値や文字列などの値お金
出てくるもの処理の結果商品(+おつり)

特に関数へ与える値は「引数」、処理の結果は「返り値」と呼ぶので覚えておきましょう。自販機に入れるお金によって買える商品が変わるように、関数へ与える引数によって返り値も変わります。

関数を使いこなすためには、入れるものと出てくるものを理解しておくことが重要です。

defunはユーザー関数とコマンドを作成できる

function_h2_image2

defunとはユーザー関数を定義するAutoLISP関数です。「定義する」とは関数を作成することと思ってください。

ユーザー関数

ユーザーが標準関数を組み合わせて定義したオリジナルの関数のこと。標準関数とはsetqやlistなど、AutoLISPにあらかじめ用意されている関数を指します。

defunの中にさまざまな処理を記述することで、1つの標準関数だけでは実現できない処理を、1つの関数で実行できます。

例えば、円を作図した後に色を変えたり、作成した画層に線分を配置したり。処理をまとめることでプログラムの見た目もシンプルになります。

さらに、defunは関数だけでなくオリジナルのAutoCADコマンドを作成することも。defunはAutoLISPを使いこなすために欠かせない関数の1つです。

はこ
はこ

ちなみに、defunは「defin function」の略です。

defunの書き方と使用例3選

function_h2_image3

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"に切り替わる
  2. 画層の色設定を1(赤色)に変更する
  3. 中心(0,0)に直径10の円を作図する

今回のプログラムを実行するためには、プログラムをロードしておく必要があります。ロードの方法についてはこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方

コマンドラインに「(test1)」と入力すると関数が実行され、下図の円と画層が作成されます。

function_image1-1
function_image1-2
はこ
はこ

画層の色設定を赤色にしたため、作図された円は赤色になっています。

引数とローカル変数を定義しない場合でも、関数名の後ろには必ず「(/)」を記述してください。「(/)」の記述がないとエラーになります。

ちなみに、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つです。

  1. 引数として変数strを受け取る
  2. 現在層の画層名を取得して、変数laynameへ格納する
  3. 変数srtと変数laynameが等しいか判定する
  4. 判定した結果の文字列を返す

前述した使用例と同様に、プログラムを実行するためにはプログラムをロードする必要があります。ロードの手順はこちらの記事を参考にしてください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方

現在層が"0"のときに、"0"を与えた場合の実行結果は次のとおり。

function_image1-3

現在層の画層名と異なる文字列を与えた場合は、以下のように表示されます。

function_image1-4

引数によって返り値を変えたい場面は非常に多いです。使用例をカスタマイズしながら基本を身に付けてください。まずは、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つ。

  1. 変数cntに1を格納
  2. 既定の色設定を変数cntと同じ値にする
  3. 中心(0,0)に変数cntの10倍の直径で円を作図する
  4. 変数cntを1を加算する
  5. ②~④を3回繰り返す
  6. 既定の色設定を「ByLayer」に戻す

プログラムがロードされていれば、コマンドラインに「test3」と入力するだけで実行できます。プログラムのロードについてはこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方

コマンドを実行すると、図面上には赤色、黄色、緑色の3色の円が作図されます。

function_image1-5

関数名の先頭に「c:」をつけると、ユーザー関数をコマンドとして扱うことができます。コマンドラインから実行するときに、関数名の両側にかっこを付ける必要がありません。

プログラムが実行しやすくなることは大きなメリットです。

はこ
はこ

Cドライブの「c:」とは関係ありません。

defunを使いこなしてAutoCADを自動化しよう

function_h2_image3

今回ご紹介したAutoLISP関数「defun」の内容を以下にまとめます。

  • defunは標準関数を組み合わせてオリジナルの関数(ユーザー関数)を定義できる
  • ユーザー関数の中だけで使用できる変数をローカル変数と呼ぶ
  • ローカル変数以外の変数はグローバル変数と呼び、他の関数から参照できる
  • 関数名の先頭に「c:」を付けるとコマンドとして扱える

ユーザー関数を上手に活用して、AutoCADの自動化・効率化に役立ててください。

AutoLISPを書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。

>>「AutoCAD自動化攻略読本」のメリット5選【AutoLISPが誰でも分かる教科書】

-AutoLISP入門, 関数紹介

AutoLISPのおすすめ書籍はコチラ
AutoLISPのおすすめ書籍はコチラ