==================================================発行部数845======
     AutoCADカスタマイズ入門講座              No.11 1999/06/27
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。
前回のメールに幾つか間違いがありましたので訂正させていただきます。ま
ず、dbox関数の説明内でads_command()関数を説明していますが、その中で
ads_command()関数の引数の説明が間違っていました。説明では、
(command "3dface" p11 p12 p13 p14 p11 "")
となっていますが、正確には
(command "3dface" p11 p12 p13 p14 "")
となります。なお、一番最後に載せた「完全なプログラムのリスト」では正
しく
(command "3dface" p11 p12 p13 p14 "")
となっています。
 また、この「完全なプログラムのリスト」にはdbox()関数を2つ含めてし
まいました。このままでもプログラムの動作上は問題ありません(同じ名前
の関数を2つ定義すると、前に定義した関数は無視されます。たぶん ^^;))
。
 今回のような小さなプログラムでは問題ありませんが、大きなプログラム
では(特に複数の人で作った場合には)同じ名前の関数を作ってしまう事が考
えられます。このような場合には思った通りにプログラムが動かないばかり
か、原因を探す事は困難だと思いますので気を付けなければなりません。今
回は私も勉強になりました(多くのプログラム言語ではこのよな事をすると
通常エラーとなる事が多いです)。

--------------------------------------------------------------------
 1.AutoCADデータベースへのアクセス
--------------------------------------------------------------------
 今回は今までと少し趣を変えて、AutoCADデータベースへのアクセス方法
について考えてみたいと思います。皆さんも図形を描いた後で、線の線種や
色などを変更する事があると思います。これらはAutoCADのコマンドを使用
すれば難無く実現できる訳ですが、これらと同様な機能のプログラムを作る
事によって、データベースへのアクセス方法を勉強してみたいと思います。
また、この様なデータベースへのアクセス方法を学ぶ事によりAutoCADへの
理解を深める事が出来ます。

--------------------------------------------------------------------
 2.データを取り出す1
--------------------------------------------------------------------
 各種データをどの様にAutoCADがPCのメモリ上やディスク上へ保存してい
るかは解りません。ただし、AutoLISPを使う事により人にが理解しやすい形
で(AutoLISPのリスト形式として)各種データを簡単に取り出す事が出来ます
。それでは実際にデータを取り出してみましょう。ただしここで注意が一つ
ります。以前お知らせしたようにこの講座のプログラム検証で使っている
AutoCADのバージョンはR12Jです。R12J以降のAutoCADを使用している方は次
の例題を比べていただけると分かると思いますが、データが異なる(増えて
いる)事が分かると思います。これはバージョンが上がるにつれ機能が追加
されているためですが、AutoLISPを使用して取り出したデータ構造には基本
的に変わりが無いので問題は無いはずです。もし問題があった場合には連絡
を頂ければ幸いです。

 では、実際にデータを取り出してみましょう。
AutoCAD上へLineコマンドで直線を一本引いて下さい。
次にコマンドラインから次のAutoLisp式を入力して下さい。
(entget (car (entsel)))
コマンドラインへ次のような指示が出ますので先ほど書いたLineを選択して
ください。
図形を指示:

私の環境(R12J)では次の様になりました。

((-1.<Entity name:60000022>)(0."LINE")(8."0")(10 3.41562 1.6375 0.0)
(11 6.91882 5.7375 0.0)(210 0.0 0.0 1.0))

次に同じLineをlistコマンドで見てみましょう。私の場合は以下の様になり
ました。

コマンド:line
図形を指示:

 線分  画層:0
     空間:モデル空間
     どこから 点,X= 3.4156 Y= 1.6375 Z= 0.0000
      どこへ 点,X= 6.9188 Y= 5.7375 Z= 0.0000
     長さ = 5.3928, X-Y平面の角度 = 49
     デルタX = 3.5032, デルタY = 4.1000, デルタZ = 0.0000
 さて、上下2つの情報を良く見比べてみてください。同じ数値が所々にあ
る事が分かります。既にお分かりになったと思いますが、AutoLISPで取り出
したリストには直線の始点、終点、画層(レイヤー)名、線種等が含まれてい
ます。

ところで、(entget (car (entsel)))という式は何を行っているのでしょう
か?。それぞれ一つずつ見てみましょう。

--------------------------------------------------------------------
 3.データを取り出す2
--------------------------------------------------------------------
 まずはじめは(entsel)関数です。この関数の書式は(entsel [プロンプト]
)です。[プロンプト]は省略可能です。この関数はエンティティ(作図された
図形)からエンティティ名(その図形につけられたユニークな名前)を取得す
る事が出来ます。ではいつも通りコマンドラインから試してみましょう。
AutoCAD上へ適当な図形を作図して下さい(もちろん先ほどの直線でもかまい
ません)。次にコマンドラインから(entsel)関数を実行し、図形を選択して
ください。
私の場合は以下のようになりました。

コマンド:(entsel)
図形を指示:(<Entity name:60000044>(4.4916 5.8875 0.0))

(entsel)関数は上記の様に、エンティティ名とエンティティを選択した時に
ピックした座標をリストで返してくれます。エンティティ名は既に話したよ
うに各エンティティ(図形)に与えられたユニークな名前ですので、皆さんが
試した時には<Entity name:XXXXXXXX>のXXXXXXXXの部分が上記の例と異なっ
ていても心配ありません。また、この名前は現在の図面上でしか有効であり
ません。どういう事かというと、今開いている図面を保存し、再度開いた時
同じエンティティ名である保証はないという事です。何となく解って頂ける
でしょうか?。

 次は(car)関数です。この関数はリストの最初の値を返す関数です。次に
簡単な例を示します。コマンドラインから試してみてください

コマンド:(setq a '(x y z))
コマンド:(setq b (list (list 1 2 3 4)(list 10 20 30)))
コマンド:!a
(x y z)
コマンド:!b
((1 2 3 4)(10 20 30))
コマンド:(car a)
x
コマンド:(car b)
(1 2 3 4)

つまり、(car (entsel))は(entsel)関数の返すリストからエンティティ名だ
けを取り出しています。再度コマンドラインから(car (entsel))を実行し、
任意のエンティティを選択してみてください。エンティティ名だけが取り出
せる事が解って頂けると思います。

 そして最後は(entget)関数です。この関数は今回もっとも重要な関数でこ
の関数へエンティティ名を引数として渡す事でエンティティの定義データを
取得する事が出来ます。(entget)関数の書式は次のようになります。
(entget エンティティ名 [アプリケーション名])
[アプリケーション名]は省略可能です(このオプションの意味については今
回は触れません)。

(entget (car (entsel)))がどの様にして図形の定義データを取得している
かを理解して頂けたでしょうか?。3つの関数をうまく組み合わせる事によ
り簡単にデータを取得できる事が解って頂けたと思います。

--------------------------------------------------------------------
 4.まとめ
--------------------------------------------------------------------
 今回はデータベースへアクセスし図形の定義データを取得する方法を説明
してみました。いかがでしたでしょうか。今回は直線だけしか調べてみませ
んでしたが、円や円弧、ポリラインなどそれぞれの図形で(entget)関数が返
すリストは異なりますので、ぜひ他の図形も同様に調べてみれ下さい。また
、(entget)関数が返すリストがAutoCADのデータ保存形式の1つであるDXFに
似ている事に気づかれた方もおられると思います。このへんの事についても
次回以降説明していきたいと思います。次回は取り出したデータを修正し
、色や線種などの変更の仕方を説明したいと思います。お楽しみに!!。

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

戻る