==================================================発行部数691======
     AutoCADカスタマイズ入門講座              No.1 1999/04/03
===================================================================
 AutoCADカスタマイズ入門講座第一号をお送りします。
さて、AutoCADの新いバージョンであるAutoCAD2000の発売が正式にオートデ
スクからアナウンスされました。オートデスクのWebサイトを見るとかなり
の改善がなされているようです。早く使ってみたいですネ...といっても
私はカスタマイズ環境の方に興味があるのですが(~_~;)。皆さんは、どのよ
うに感じられましたか。ところで、AutoCAD2000には正式にVisualLISPが搭
載されました(米オートデスクのWebサイトからはR14用のVisualLISPが有償
でダウンロードできました)。VisualLISPはAutoLISPとほぼ100%上位互換(既
存のAutoLISPのプログラムがほぼ変更せずに動くということです)を持つ、
より高機能なAutoCADカスタマイズ言語です。今後、ユーザレベルのカスタ
マイズはVisualLISPの使用が一般的になると思われますが、たとえそうなっ
たとしてもAutoLISPの知識が無駄になることはありませんので安心して受講
してください。VisualLISPについてはまた詳しく書きたいと思います。

--------------------------------------------------------------------
 1.はじまりはじまり
--------------------------------------------------------------------
 今回は初回なので、細かいことは抜きにしてとりあえずプログラムを書い
てみましょう。今は内容が分からなくても全く問題ありません。AutoLISPの
プログラムの感じをつかんでいただければOKです。以下に今回のサンプルを
示します。サンプルの内容は点の座標及び点からの距離、角度を入力し変換
後の点の座標を求めるというものです。今回の例題にはダイアログボックス
があるため、sample1.lspの他にsample1.dclが必要です。

;--------- ここから sample1.lsp ------------------------------------
;---------------------------------
; sample1.lsp
;---------------------------------
(defun C:sample1()
  ; 初期設定
  (setq pai 3.141592) ; πの設定
  (setq ret 100) ; ダイアログ終了コードの初期化
  (setq dist 0.0)
  (setq ang 0.0)
  (setq sp (list 0.0 0.0))

  ; ダイアログボックスのロード
  (setq dcl_id (load_dialog "sample1.dcl"))

  ; ダイアログボックス処理ループ
  (while (< 2 ret)
    (if (= (new_dialog "dlgbox" dcl_id) nil)
      (progn
        (alert "ダイアログボックスを開けません\n")
        (exit)
      )
    )

    ; タイルへの値の設定
    (set_tile "spx" (rtos (car sp)))
    (set_tile "spy" (rtos (last sp)))
    (set_tile "dist" (rtos dist))
    (set_tile "angle" (rtos ang))

    ; コールバック関数の定義
  (action_tile "trans" "(trans)") ; 変換ボタンを押下

    (setq ret (start_dialog))
  ) ; ダイアログボックス処理ループ終了

  ; ダイアログボックスのアンロード
  (unload_dialog dcl_id)
  (princ)
)

; 座標変換
(defun trans()
 (setq sp (list (atof (get_tile "spx")) (atof (get_tile "spy"))))
  (setq dist (atof (get_tile "dist")))
  (setq ang (atof (get_tile "angle")))
  (setq ep (polar sp (* (/ ang 180.0) PI) dist))
  (set_tile "epx" (rtos (car ep)))
  (set_tile "epy" (rtos (last ep)))
)
;-------- ここまで sample1.lsp --------------------------------------

//-------- ここから sample1.dcl -------------------------------------
// ---------------------------------------------------------------
// sample1.dcl
// ---------------------------------------------------------------
dlgbox : dialog {
  label = "Sample1";

  : row {
    : column {
      : edit_box {
        label = "SP(X):";
        key = spx;
      }
      : edit_box {
        label = "SP(Y):";
        key = spy;
      }
      : edit_box {
        label = "距離:";
        key = dist;
      }
      : edit_box {
        label = "角度:";
        key = angle;
      }
    }
    : column {
       spacer;
       : button {
         label = " 変換 ";
         key = "trans";
       }
    }
    : column {
      fixed_height=true;
      : edit_box {
        label = "EP(X):";
        key = epx;
        is_enabled = false;
      }
      : edit_box {
        label = "EP(Y):";
        key = epy;
        is_enabled = false;
      }
      : spacer {
        height = 3;
      }
    }
  }
  ok_only;
}
//------------ ここまで sample1.dcl ----------------------------------

上に示したプログラムをそれぞれ、sample1.lsp、sample1.dclという名前で
適当なフォルダに保存してください。プログラムをこのメールから、テキス
トエディタへコピーしてもかまいませんが、出来れば自分で1文字、1文字テ
キストエディタへプログラムを打つことをお勧めします。

--------------------------------------------------------------------
 2.ちょっと詳しく見てみよう
--------------------------------------------------------------------
 sample1.lspを見てください。これがAutoLISPのプログラムの一例です。
AutoLISPのプログラムのファイル名は通常*.lspとします。
 どうですか?。"("、")"、が非常に多いことに気づかれたと思います。少し
複雑に見えますが、基本的には"("から")"の間がひとつの(プログラム的な)
意味を成していると考えて問題ありません。AutoLISPでは、これら"("")"で
括られた文を連ねる事によりプログラムを構成します。また、所々に";"が
あるのがわかると思いますが、これは注釈(コメント)文を書くために用いま
す。ある行で";"を書くと、その行ではそれ以降の文が注釈として解釈され
ます(つまり、何を書いてもプログラムには影響を与えません)。
また、各行が段々(?)になっているのがわかると思います。これは、字下げ
とかインデントとかと呼ばれています。(ワープロでの意味と同じです)、
インデントをつけなくても、プログラムの動作がおかしくなる事はありませ
んがわかりやすいプログラムを組む上で非常に重要です。
 次に、sample1.dclを見てください。これはAutoLISPでダイアログボックス
を使用するときに必要になるダイアログ定義ファイルです。通常ファイル名
は*.dclとします。このファイル内にダイアログの外見などの定義を行いま
す。今は、AutoLISPでダイアログボックスを使用するにはこんなファイルも
必要なんだ...と頭の隅に留めて頂ければ結構です。

--------------------------------------------------------------------
 3.実行してみよう
--------------------------------------------------------------------
 早速実行してみましょう。まずAutoCADの設定を行います。
AutoCADの環境変数の設定を行います。環境変数の中にサポート・ディレクト
リという設定項目があるのですが、その設定項目の変数に先ほどプログラム
を保存したフォルダのパスを追加します。例えば、C:\alispというフォルダ
にプログラムを保存し、変更前の環境変数の末尾が...\sampleとなっていれ
ば...\sample;C:\alispとします。なお、環境変数の設定方法はAutoCADの
各バージョンにより異なるので、詳しくはそれぞれのマニュアルをご覧下さ
い。
 次にAutoCADのコマンドプロンプトから、
(load "sample1")
と入力し、リターンキーを入力します。
次にAutoCADのコマンドプロンプトから、
sample1
と入力し、リターンキーを入力します。

ダイアログボックスが表示されましたか?。
表示されたら、各入力項目に値を入力し変換キーを押してください。
EP(X)、EP(Y)に変換後の座標が表示されるはずです。
確認したらOKキーを押してダイアログボックスを終了してください。

今度は、AutoCADのコマンドプロンプトから、
!spと入力しリターンキーを入力してください。
先ほど入力した変換前の点の座標が
(SP(X) EP(X))として表示されているはずです。
次に!epと入力してリターンキーを入力してください。今度は、変換後の値
が表示されているはずです。

lineコマンドの応答で次のようにすれば始点がsp、終点がepの直線が作図
されます。
コマンド:line
どこから:!sp
どこへ:!ep
どこへ:リターンキーのみ


ダイアログイメージ *バージョンにより多少外見は異なります

--------------------------------------------------------------------
 4.次回は
--------------------------------------------------------------------
 今回は、AutoLISPの雰囲気をつかんでもらうため簡単な例を見てもらいま
した。全然何がなんだかわからない方もいると思いますが、先ほどのべた
ように全く心配は要りません。次回からは詳しくAutoLISPの文法を見ていき
ます。ご意見、ご感想などございましたら下記のメールアドレスへお願いし
ます。また、メールでプログラムを送付するとインデントがずれると思われ
ますので、ダイアログの実行イメージと共に下記のURLのバックナンバーで
ご確認ください。

====================================================================
■登録/解除の方法
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
「AutoCADカスタマイズ入門講座」は、上記URLよりいつでも
登録/解除可能です。
====================================================================
●「AutoCADカスタマイズ入門講座」No.1
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
              http://www.mag2.com/
              マガジンID:0000011579
====================================================================

戻る