==================================================発行部数855======
     AutoCADカスタマイズ入門講座              No.12 1999/07/03
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。

 前回はAutoCADのデータベースへアクセスし、エンティティ情報を取り出
す事を試みてみました。今回は取り出したデータを加工してみます。また、
データを取り出したり加工したり出来るようになると非常に多くの事を行う
事が可能となります。プログラムをしていても楽しい部分です。

--------------------------------------------------------------------
 1.前回の復習
--------------------------------------------------------------------
 まず、前回と同じようにAutoCAD上に直線を引いて下さい。次に以下の式
で変数elistに直線(Line)のデータを格納し内容を確認して下さい。式の内
容については前回の講座を確認して下さい。

コマンド:(setq elist (entget (car (entsel))))
コマンド:!elist

((-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))

 上記のデータは前回の講座でも触れた通り、皆さんがおこなった結果とは
多少異なると思いますが、基本的な部分については同様ですので気にする必
要はありません。

 さて、ここでもう少し上記データの構成について見ていきましょう。
(entget)関数で得られるデータは上記データのように連想リストとなってい
ます。連想リストとはリストのリストです。連想リスト内のリストはドット
ペアと呼ばれる特別なリスト形式が含まれており、

(0."LIN")

の様に、ドットペアには要素の間に必ずドット即ち"."が入ります。上記リ
ストの例では0がグループコードと呼ばれるもので、そのリストが何のデー
タを示しているかを表します。例えば、

-1 - エンティティ名
1 - エンティティタイプ
10 - Lineエンティティでは始点、円、円弧などでは中心点
11 - Lineエンティティでは終点
8 - 画層(レイヤー)
210 - 押し出し方向の座標

などです。また、グループコード11等の様にエンティティタイプによって意
味が異なるものがあるので注意が必要です。各グループコードの詳細につい
てはAutoCAD付属のマニュアルなどを参照してください。

--------------------------------------------------------------------
23.始点、終点を変更する
--------------------------------------------------------------------
 次に先ほどの直線の始点の座標を変更してみましょう。まず、次の例をコ
マンドラインから試してください。その後内容を検討してみます。

コマンド:(setq new '(10 0.0 0.0 0.0))
コマンド:(setq old (assoc 10 elist))
コマンド:(setq elist2 (subst new old elist))
コマンド:(entmod elist2)

 上記の操作を試して頂くと直線の始点の座標が(x, y)=(0, 0)となるはずで
す。操作後の始点の座標が本当に変更されているかlistコマンドで確認して
ください。

 それでは内容を検討してみます。
まず最初の式 (setq new '(10 0.0 0.0 0.0)) です。
この式では、変更後の始点の座標リストを作成しています。始点の座標を変
更する事からグループコードにはLineエンティティの始点座標を示す10を指
定指定しています。

 次の式、(setq old (assoc 10 elist)) では、先ほど得た直線の連想リ
ストから現在の直線の始点座標を取得しています。(assoc)関数は連想リス
トの中から指定した要素をキーに持つリストを返します。上の例では、連想
リストelistから10をキーに持つリスト、即ち(10 3.41562 1.6375 0.0)を得
ています。(assoc)関数の書式は(assoc item list)でitemにキー、listに連
想リストを指定します。またlist内にitemが無い場合にはnilを返します。

 次に (setq elist2 (subst new old elist)) ですが、この式では
(subst)関数を用いる事により、連想リストelist内のoldをnewに置き換え、
置き換えた後のリストをelist2へ保存しています。(subst)関数の書式は、
(subst new old list)でlist内のoldと等しい項目をnewで置き換え、置き換
えた後の新しいリストを返します。ここでは直線の連想リストの既存の始点
座標を新しい座標に置き換えています。

 最後に (entmode elist2) です。(entmod)関数の書式は(entmod list)
で、list内のグループコード-1で指定されてたエンティティの図形情報など
のデータベース情報を更新します。ここで注意しなければいけない事は、
(setq elist2 (subst new old elist))でリスト内の座標を変更しただけで
は図形は変更されず、変更後のリストを(entmod)関数に渡す事で図形が実際
に変更されるという事です。

 これらから分かるように、図形の属性などを変更するには
(entget)関数で図形情報を取得
(subst)関数で図形情報を変更
(entmod)関数で図形情報を更新
という手順を踏みます。

 それでは、もう一度上記の例を動作を確認しながら試してみてください。
ただし、先ほどの直線の始点は既に(0 0 0)になっているので新しい直線を
引いた後に試してください。

コマンド:(setq elist (entget (car (entsel))))
コマンド:!elist
コマンド:(setq new '(10 0.0 0.0 0.0))
コマンド:!new
コマンド:(setq old (assoc 10 elist))
コマンド:!old
コマンド:(setq elist2 (subst new old elist))
コマンド:!elist
コマンド:(entmod elist2)

特に、elist内のold項目がelist2ではnew項目に置き換わっている事を確認
してください。

--------------------------------------------------------------------
 4.まとめ
--------------------------------------------------------------------
 今回は、AutoCADのデータベースから取り出した図形情報の変更をおこな
ってみましたがいかがでしたでしょうか?。思ったより簡単だと思いません
か。基本的に図形の編集は今回の手順でおこなう事が可能ですので、皆さん
もAutoCAD標準の編集コマンドにも負けない位のコマンドを作ってみてはい
かがでしょうか。次回も、もう少し今回のトピックスについて続けていきま
す。お楽しみに。

●バックナンバーは下記の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.12
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
              http://www.mag2.com/
              マガジンID:0000011579
====================================================================
戻る