DWFプログラミング(その1)




 ここに1枚のHTMLページがある。このページ。DWFファイルが張りつけてある。ソースコードはこれだけ。
<HTML> <BODY> <object id="mydwf" classid="clsid:b2be75f3-9197-11cf-abf4-08000996e931" width=400 height=300> <param name="filename" value="tower.dwf"> </object> </BODY> </HTML>

 このHTMLページはdocumentオブジェクトであり、そのオブジェクトにもうひとつオブジェクトが定義してある。objectタグで名前を"mydwf"と決めた。classidの数字で指定されたactiveXオブジェクトである。この番号よりDWFviewerWHIP3.1がコントロールすることになる。今は"tower.dwf"を表示するよう指示した。





 HTMLはFORMとそのELEMENTというオブジェクトが作れる。便利な部品だ。CGIでいつも使われるボタンを五つ配置してみる。

 例えば、UPのボタンのソースコードは
<input type=button onclick="panup ()" value=up>

 クリックというイベントでさせたいことがある。その内容をjabaScriptで 書いておく。内容はこのようなもの。
<HEAD> <script = "javascript"> function panup () { var left = mydwf.getcurrentviewleft () var right = mydwf.getcurrentviewright () var bottom = mydwf.getcurrentviewbottom () + 10000 var top = mydwf.getcurrentviewtop () + 10000 mydwf.drawview (left, right, bottom, top) } </script> </HEAD>

 メソッドgetcurrentviewbottom ()で窓の下の座標を読み取り10000加えで送り出す。すると図形が動くという仕掛け。

 どうしてこのページに陣取った僕がコントロールできるかといえば、activeXコントロールのWHIPが通信機能で情報を送受信してるからだ。IEも当然出来る。これがactiveXオートメーション機能。MicrosoftWin98以後の基本機能。


 わざわざjabaScriptで操作する必要もない。WHIPには自動 モードカスタマイズ モードの 2 種類のがあり自動 モードの右クリックメニューで大半の操作ができる。図面を眺めるにはこのモードで十分だ。

 だが、この軽快なペクター画像を眺め、何かしたくなる人もいるだろう。そう、僕も二つほどしたいことがある。電子地図と電子漫画を作りたい。


 内部的なオブジェクト,メソッド,プロパティを外部から操作する。これがオートメーションプログラム。まずWHIP内部のオブジェクト,メソッド,プロパティ体系をしっかり把握することが第一。その基本がデータ構造を知りこと。上の画像のデータをじっくり眺めてみることから始まる。



 WHIPオブジェクト自身のプロパティは,ファイルヘッダーに対応するものだろう。 レファレンスと対比しながら眺めると理解が早い。
 プロパティをどんなメソッドで操作できるのか。イベント トでどんな状態をコントロールできるのか。やりたい事とプログラムの限界を付き合わせる。イメージが膨らむ結構楽しい時だ。

 WHIPオブジェクトはDWF全体なのだが、その子供オブジェクトが具体的なアクセス対象になる。
オブジェクト プロパティ メソッド
namedview name
四角形の視点に関連付けられた名前。
left
四角形の視点の左座標。
top
上座標。
right
右座標。
bottom
下座標。
show
指定された視点に移動。
layer visible
この画層のジオメトリの可視性を取得または設定。
name
画層の名前を取得。
 
text name
テキスト文字列を取得。
left
テキストの四角形境界ボックスの左座標を取得。
top
上座標を取得。
right
右座標を取得。
bottom
下座標を取得。
show
現在の視点をこのテキスト文字列の四角形の境界ボックスに設定。
link name
このリンクに関連付けられた url 文字列を取得。
left
リンクの四角形境界ボックスの左座標を取得。
top
上座標を取得。
right
右座標を取得。
bottom
下座標を取得。
 

 データを調べて分かっていたのだが、DWFにはブロック属性は反映されない。上のオブジェクトに操作は限定される。これはデータ仕様なのだからどうしようもない。ここで、DWFを掃き出す前のDWGの作り方が見えてくる。このことは重要である。

 膨大な数のlayerを扱うことになるが、一つ一つのlayerには識別子がいる。名前がその識別子になるが、配列変数の要素番号も扱えるはずだ。オブジェクト指向言語では、コレクションという。上のオブジェクトはすべてコレクションになっている。
コレクションのcountとitemで一つ一つのオブジェクトを操作する。
<HEAD> for (i=0;i<mydwf.layers.count;i++) { msg=msg+mydwf.layers.item(i).visible+"\n\r"; } </HEAD>

layerコレクションはlayersときっちり複数形なのが律儀といえる。C系のコードはこんな感じで書く。FORTRNやBasicからいきなりはじめると戸惑うが、慣れれば快適である。

layerのプロパティとしてcolorがありそうなのだが、定義されていない。 データ構造からすると、ない理由もなんとなくわかるのだが。

infoのボタンにWHIPオブジェクトのプロパティ表示プログラムをリンクしてみた。クリックすると確認できる。


2003.12.31
by Kon