Sponsored links

【AutoLISP 自作関数】引数付き自作関数

Sponsored links
AutoLISP
Sponsored links

頻出パターンを便利にする関数。引数を付けると、さらに関数にできるパターンが拡がります。

Sponsored links

予備知識

(defun xxxx (引数/ローカル関数)

関数/コマンド関数 を定義する defun その次の来る( ) ですが、/ 変数 でローカル変数を宣言します。

関数を作るときには、ローカル変数だけでなく、引数を定義することもできます。

例)図形の色を変える自作関数

自作関数を使わないバージョン

例として、ここに、図形の色を赤色(1)に変更するコマンドがあります。

 (defun c:C1 ( / Obj)
  (while T
   (setq Obj nil)
   (while (null Obj)
    (setq Obj (car (entsel)))
   );while
    
  (command-s "._change" Obj "" "p" "c" 1 "") 
    
  );while
(princ))

これの他の色バージョンを作ろうと思うと、

(command-s “._change” Obj “” “p” “c” 1 “”)

色番号だけを変えて、それ以外は全く同じ物を何個も作らなければいけません。

色番号しか違わないのに、いくつも同じ物が並ぶと長くなりますね。

そして、使っていて、やっぱりグループ選択にしよう。など変更が出た時、全て変更しなければいけません。

そこで、便利なのが関数を作ることです。

変更する部分だけを変数に

この場合、コマンドによって違う値を入れたい場所、つまり色の部分を変数にします。ここではColという変数を入れました。

(command-s “._change” Obj “” “p” “c” Col “”)

そして、その変数を、1行目の、( ) の中に入れます。

(defun Jaga01ChCol ( Col / Obj)

 / の前は引数、/の後ろはとローカル変数です。
そして、これは関数として使うので、コマンド名 c:C1 を、関数名Jaga01ChColに変更しました。

Jagaimo
Jagaimo

ローカル変数が無い場合は、/ は要りません。(引数)
引数が無くてローカル変数だけの場合は / が必要です。( / ローカル変数)

(setq Col ….. が無くて、変数Colには値が入っていないようですが、
(Col / Obj) ここで指定した変数は、値を外から持ってくる前提でプログラムを作って行けます。

ですので、同じプログラム内に(setq Col ….. 無くても、
 (command-s “._change” Obj “” “p” “c” Col “”)
と変数を代入することができます。

AutoLISP プログラム

 (defun Jaga01ChCol (Col / Obj)
  (while T
   (setq Obj nil)
   (while (null Obj)
    (setq Obj (car (entsel)))
   );while
    
  (command-s "._change" Obj "" "p" "c" Col "") 
    
  );while
(princ))

これで、
引数として色番号を渡すと、図形の入りを変える機能がある関数。
ができました。

Jagaimo
Jagaimo

この関数を使ったコマンドを使うには、コマンド実行前にこの関数も読み込んでおく必要があるよ。

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

先ほど作ったJaga01ChColに色番号を引数として書くとこうなります。
(Jaga01ChCol 1)

ですので、これをコマンドにして、コマンド名を C1 とすると、

(defun c:C1 () 
    (Jaga01ChCol 1)
  (princ))

これなら、類似コマンドを簡単に作ることができますね。

短いので1行にまとめてしまっても見やすいと思います。
これで、コマンドを6個、6色分作るとこうなります。

(defun c:C1 () (Jaga01ChCol 1) (princ))
(defun c:C2 () (Jaga01ChCol 2) (princ))
(defun c:C3 () (Jaga01ChCol 3) (princ))
(defun c:C4 () (Jaga01ChCol 4) (princ))
(defun c:C5 () (Jaga01ChCol 5) (princ))
(defun c:C6 () (Jaga01ChCol 6) (princ))

最初のコマンドをコピペして色番号だけを変更していくことを思うと、ずいぶんシンプルになりました。

まとめ

  • defun を使って関数を定義するとき次に続く()には、引数が入る。
  • / の前が引数。その後ろがローカル変数。 (引数 / ローカル変数)
  • 引数として入れた変数名は、外部から値がくる変数として使える。
  • 値を変更したい部分だけを引数にして自作関数にすると、類似コマンドをいくつも作るときにとても便利。
  • 変更ある場合も、関数だけ変えればいいのでラク。

関連記事

自作関数の活用例

Comments