==================================================発行部数758======
AutoCADカスタマイズ入門講座 No.4 1999/04/24
===================================================================
AutoCADカスタマイズ入門講座第4号をお送りします。

--------------------------------------------------------------------
1.図形を描こう
--------------------------------------------------------------------
 前回まで、関数や変数などAutoLISPを使うために最低限必要な事柄につい
て学んできました。これらの事は本当に重要なのですが、学んでいて楽しい
事柄ではありません。”もう、あきちゃったよ”って方がいるかもしれない
ですし、”こんな事覚えて図形描く事に関係あるの?”と思われている方も
いるかもしれませんネ。そういう訳で今回は、基本的な図形の作図方法とプ
ログラムへの応答の仕方について説明します。

--------------------------------------------------------------------
2.2つの作図方法
--------------------------------------------------------------------
 AutoCAD上に直線や円弧などの図形を作図するには基本的に2つの方法があ
ります(これは3次元の図形でも同様です)。1つはcommand()関数を使う方法
で、もう1つはentmake()関数を使う方法です。以下に2つの関数の違いにつ
いて説明します。

 (1)command関数
  この関数を使用する事でAutoLISPプログラム内からAutoCADのコマンド
  を実行する事が可能になります。すなわち、普段図形を作図する為に使
  用しているLINEコマンドやARCコマンドなどを使用する事が出来ます。
  また、既に気づかれていると思いますが、この関数を使用する事により
  作図コマンド以外にも殆どのAutoCADのコマンドをAutoLISP内から実行
  する事が出来ます。

 (2)entmake()関数
  この関数はcommand関数とは異なり、図形作図専門の関数です。entmake
  関数で図形を作図させるにはこの関数に図形定義データを渡す必要があ
  ります。図形定義データとはDXFデータのエンティティセクションに記
  述されているデータとほぼ同一フォーマットのものです(DXFデータに詳
  しくないとちんぷんかんぷんだと思いますが、追々説明しますのでご心
  配なく!!)。entmake()関数のcommand関数に対して有利な点は実行速
  度が速いという点です。また、図形を作図する時に図形の属性(色、作
  図するレイヤー等)を指定する事ができます。command関数の方は現在有
  効な色やレイヤーにしか作図する事しか出来ません。

--------------------------------------------------------------------
3.簡単な例題
--------------------------------------------------------------------
 2つの関数を用いた簡単な例題を以下に示します。内容は指定した始点、
終点で直線を作図するというものです。

(command "line" '(0 0) '(10 10) "")
注) '(0 0)は(list 0 0)と同じ意味です。
""はコマンドラインでリターンキーを押した事と同じ意味になります。

 entmake()関数を用いて書き直すと以下の様になります。また、以下の例
では、レイヤー"test"に線の色を赤として描画しています。

(entmake '( (0 . "LINE") (8 . "test") (10 0 0) (11 0 10) (62 . 1)))
注)(62 . 1)等は(62空白.空白1)として入力してください。(62.1)と入力す
るとAutoLISPは62.1という実数として解釈し、エラーになってしまいます。

上記の例題をAutoCADのコマンドラインから入力し、リターンキーを押して
ください(もちろんエディタで入力し*.lspファイルを作成してからロードし
てもらってもかまいません)。直線が作図されたでしょうか?。既に述べた
ようにentmake関数は上の例題のようにオブジェクト(直線、円弧など図面内
に作図される図形をこれから総称してオブジェクトと呼ぶ事にします)の属性
(オブジェクトが持つ特性と考えてください。例えば、線種、線色等です)を
図形作成時に指定する事が可能です。なにも指定しない場合はcommand関数
と同様な結果となります。これらの事から図形を作図する場合にはentmake(
)関数を使用する事をお勧めします。ただし、command関数も事前にコマンド
ラインで試行錯誤やテスト出来る事など捨て難い点があるのも確かですので
、最初のうちはcommand関数を使用し、少し慣れてきたらentmake関数にチャ
レンジすると良いと思います。command()関数もentmake()もさらっとしか説
明しませんでしたが、今後例題などで詳しく説明していきます。

--------------------------------------------------------------------
4.プログラムへの応答
--------------------------------------------------------------------
 ある日、あなたの会社の上司はあなたとあなたの同僚に以下の指示を行い
ました。
・1つの図面にA[mm]xB[mm]の長方形を10個作図する。
・1個作図する毎にA,Bの初期値に1mmづつ足していく。つまり1枚の図面へ
 [A, B] [A+1, B+1] [A+2, B+2] ... [A+9, B+9]の10個の長方形を作図する
・A,Bの初期値の組み合わせは以下の100通りとする。つまり100枚の図面を
描く。
 [100, 500] [101, 501] [102, 502] ..... [200, 600]
・各長方形の間隔は短辺の1/10とする。

あなたとあなたの同僚は、とりあえず50枚ずつを担当する事に決めました。
今日は金曜、しかももう午後3時を過ぎています。6時からは彼(彼女)とのデ
ートの約束があります。もう時間がありません...。あなたならどうしま
す?。キャンセルの電話をしますか?。ドタキャンよりはマシかもしれませ
んが、AutoLISPを勉強しているあなたなら、もう少しがんばってみる価値は
あります。 もう既に同僚は図面を書き始めています。でも、焦らない、焦
らない。もう一度上司からの指示をよく確認しましょう。

(defun C:MyRectang()

'幅、高さ、開始点を設定する
 (setq wid 100.0)
(setq hig 500.0)
 (setq ini 0.0)

'カウンタを初期化する
(setq i 0)

'10回長方形を作図
(while (< i 10)
'始点、終点を設定する
(setq p1 (list ini 0.0))
(setq p2 (list ini hig))
(setq p3 (list (+ ini wid) hig))
(setq p4 (list (+ ini wid) 0.0))

(command "line" p1 p2 p3 p4 p1 "")

(setq ini (+ (+ (/ wid 10.0) wid) ini)) '開始点を移動する
(setq wid (+ wid 1.0)) '幅を1増やす
(setq hig (+ hig 1.0)) '高さを1増やす
(setq i (+ i 1)) 'カウンタを1増やす
)
(princ)
)
注)while文はまだ説明していませんでしたm(__)m。簡単に言うと
(while 条件
.....
)
のような形になり、条件が真(今回の例ではiが10以下)の間、while文の中の
式を繰り返し実行します。詳しくは次回以降に説明します。

あなたの同僚が既に10枚の図面を書き終えたところで、上記のプログラムが
完成しました。myrect.lspという名前で保存しましょう。プログラムのロー
ド、実行の方法は覚えてますね?。保存したディレクトリにAutoCADの検索
パスがとおっている事を確認して、実行してみましょう!!。
思った通りに機能しましたか?。listコマンドやdistコマンドなどで指示ど
おりに作図出来ているか確認してみましょう。OKならば後は書きまくるだけ
です。

 数枚書き終えたところで、あなたはある事に気づきました。初期値である
A、Bを変更するにはmyrect.lspを毎回エディタで開いて、初期値であるwid、
higの値を変更しなければなりません。これはとても面倒です。そこで次の
ようにプログラムを変更しました。これなら、AutoCADの普通のコマンドの
様にコマンドラインから初期値を設定する事が出来ます。

(defun C:MyRectang()

'幅、高さ、開始点を設定する
(setq wid (getreal "Aを入力:"))
(setq hig (getreal "Bを入力:"))
 (setq ini 0.0)

'カウンタを初期化する
(setq i 0)

'10回長方形を作図
(while (< i 10)
'始点、終点を設定する
(setq p1 (list ini 0.0))
(setq p2 (list ini hig))
(setq p3 (list (+ ini wid) hig))
(setq p4 (list (+ ini wid) 0.0))

(command "line" p1 p2 p3 p4 p1 "")

(setq ini (+ (+ (/ wid 10.0) wid) ini)) '開始点を移動する
(setq wid (+ wid 1.0)) '幅を1増やす
(setq hig (+ hig 1.0)) '高さを1増やす
(setq i (+ i 1)) 'カウンタを1増やす
)
(princ)
)

--------------------------------------------------------------------
5.ユーザ入力関数
--------------------------------------------------------------------
 上の例の様にAutoLISPではユーザから入力をインタラクティブに受け入れ
る事が出来ます。例では実数の入力をしていますがその他に以下の様なユー
ザ入力関数が用意されています。

(entsel) :ユーザにオブジェクト(直線、円弧等)を選択させる。
(getint) :ユーザに整数を入力させる
(getpoint):ユーザに点(座標)を入力させる
(getreal) :ユーザに実数を入力させる。
この他にもいろいろありますが、一般に良く使うのは上記のようなものでし
ょう。詳しくは次回以降に説明します。

--------------------------------------------------------------------
6.まとめ
--------------------------------------------------------------------
 今回私たちは以下の事について学習しました。
 ・基本的な図形の作図方法
 ・ユーザ入力の方法

 さて、先ほどの話の続きです。あなたは5:30には全ての仕事を終える事が
出来ました。これから急いで帰れば、待ち合わせ場所には時間通りに着けそ
うです。同僚はまだ半分しか終わっていません。どうしてそんなに早く終わ
ったのか不思議そうです。あなたは、プログラムの事を同僚に教え、さっそ
うと会社を後にしました。かっカッコイィーー。

次回はwhile文やif文等の制御文を説明したいと思います。

====================================================================
●バックナンバーは下記のURLで参照する事が出来ます。
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
また、『まぐまぐ』さんでもバックナンバーを見る事が出来るようになりま
した(パチパチ!!)。詳しくは『まぐまぐ』さんのWebをご覧ください。URLは
http://www.mag2.com/   
です。
====================================================================
■登録/解除の方法
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
「AutoCADカスタマイズ入門講座」は、上記URLよりいつでも
登録/解除可能です。
====================================================================
●広告の問い合わせ
広告のお問い合わせは以下のメールアドレスへお願いします。
wankichi@mba.nifty.ne.jp
ただし、CAD関連に限ります。
====================================================================
■「AutoCADカスタマイズ入門講座」No.4
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
http://www.mag2.com/
マガジンID:0000011579
====================================================================
戻る