« 2009年6月 | トップページ | 2011年4月 »

2009年7月17日 (金)

AutoCAD LT カスタマイズ [2](図面ファイルを開く)

AutoCADがすでに起動しているとして外部プログラムから図面ファイルを開くには次の様なデータをWM_COPYDATAメッセージで送信することになります。

(1) filedia
(2) SPACE(0x20)またはENTER(0x0d)
(3) 0
(4) SPACE(0x20)またはENTER(0x0d)
(5) open
(6) SPACE(0x20)またはENTER(0x0d)
(7) 図面ファイルのファイルパス
(8) ENTER(0x0d)
(9) filedia
(10) SPACE(0x20)またはENTER(0x0d)
(11) 1
(12) SPACE(0x20)またはENTER(0x0d)

これらのデータをすべてCOPYDATASTRUCT構造体にセットして一気に送信すると、"open"コマンドがファイルパスの入力待ち状態になる前にファイルパスが送信されてしまってうまく行きませんでした。

試した結果、(6)-(7)間と(8)-(9)間で区切って3段階で送信するとうまく行くようです

しかもそれらの区切りには"待ち"を入れた方が良さそうです。
さしあたって手っ取り早くSleep()を入れて対処できましたが、コマンドラインに次のプロンプトが表示されるのを待つようにできれば確実かもしれません。参考文献「使える!AutoCAD&LT カスタマイズブック」(中森隆道/井澤文秀共著 ソフトバンククリエイティブ)のP255の例がヒントになるかもしれない。

外部ファイルが関係するコマンド(attextやwblock)を実行するときには同様な問題が発生するかもしれません。

AutoCAD LT カスタマイズ [1](AutoCAD LTへのコマンド送信)

今、ある仕事で"AutoCAD LT"のカスタマイズをしています。
AutoCAD LTはレギュラー版AutoCADやIntelliCADとは違ってLISPやC言語プログラムインターフェース(AutoCADのADS, IntelliCADのSDS)が使えないので独特のプログラミングをしなければなりません。

入手した文献「使える!AutoCAD&LT カスタマイズブック」(中森隆道/井澤文秀共著 ソフトバンククリエイティブ)を参考に仕事を進めている。

仕事で対象としている環境は
AutoCAD LT 2004
Access 2000
Visual Basic 6
です。


[1] SendKeysが確実にAutoCADへコマンドを送信しない。

まずテストプログラムをExcelで作成してみました。上記文献ではVBAからAutoCADへコマンドを送信する方法として

AppActivate "AutoCAD"
SendKeys "コマンド文字列...."

という方法が使われています。
ところがこの方法でテストプログラムを作成してExcelのボタンイベントから実行してみると、どうも動作が確実でないのです。AutoCADはアクティブになったけど、その後のコマンドがAutoCADへ送信されないでどこかへ(?)行ってしまった、という現象が高頻度で発生します。

AppActivateでアクティブウインドウが切り替わるよりも先にSendKeysが実行されてしまうのだろうか?
AppActivateとSendKeysの間にWin32APIのSleep()を入れることではだめだった。

結局、この現象の原因とか対処方法を深く調べることはしないで、Win32APIのよる方法(WM_COPYDATAメッセージによる)を進めることにした(上記文献では第7章と第8章で述べられている)。この方法の方がコマンドの送信先ウインドウを明示的に指定できるので確実な動作が期待できるかもしれない。

具体的にはAutoCADへコマンドを送信する関数をC言語で作成し、VB/VBAからも呼べるDLLにまとめました。開発環境としてVisual C++ Ver 6 を使用。

« 2009年6月 | トップページ | 2011年4月 »