LTCustomizerよくある質問
ここではLTCustomizerを使用時に必要な各種ノウハウを紹介いたします。
(一般的なAutoCAD LTのカスタマイズについての事も述べます。)
ブロックの情報取得について
ユーザからブロック情報の取得で質問されて、若干の問題があったので以下にあげておきます。
ブロック情報取得はget_table_data()を使用します。テーブル名は"BLOCK_RECORD"です。(BLOCKではありません)。
BLOCK_RECORDにはAutoCAD LTのレイアウト情報も一緒に入っていますのでそれを区別します。
具体的なプログラムを以下に示します。
これはLTCustomizerのセットアップ後に登録されるサンプルプログラム(testltc.vbp)のLayerInfoボタンのコードに以下のコードを既にあるコードの後に貼り付けます。
num = 2 + LTCustomize1.read_DXF_table("BLOCK_RECORD", False)
MsgBox (num)
For i = 1 To num
'340番はレイアウト(DWGウィンドウの下にあるタブ)オブジェクトのハードポインタ。これが0だとブロックを意味する。
str = LTCustomize1.get_table_data("BLOCK_RECORD", i, 340)
If str <> "0" Then
str = "(LAYOUTを意味する) " & Chr(13)
Else
str = "(BLOCKを意味する) " & Chr(13)
End If
str = str + LTCustomize1.get_table_data("BLOCK_RECORD", i, 2)
str = "BLOCK_RECORD name is " & str & Chr(13)
MsgBox (str)
Next i
AutoCAD2002対応について
LTCustomizerをAutoCAD2002上で使用する場合はAutoCAD2000i,AutoCAD2000と全く同じように設定すれば動作可能です。したがって、これら3つのバージョンはLTCustomizer上では全く同じものとみなします。
プログラム上では init("15")
LTCustomizer.cfg上では:(LTCustomizer使用アプリケーションが起動するときにAutoCADも一緒に起動させたい場合。ただしAutoCADが既に起動している場合は起動させません。)
;start of LTCustomizer.cfg
RUN=AutoCAD\R15.0,acad.exe
;end of LTCustomizer.cfg
AutoCAD LT2002,AutoCAD 2002のエンティティのアップデート
LTCustomizerは、select()関数でエンティティを取り込み、各種エンティティ取得・更新関数を経てupdate_select_data()関数で変更したエンティティデータをCADに繁栄することができます。しかしAutoCAD 2002,AutoCAD LT2002(もしかしたら前バージョンも)でこれらのことを実行した場合、うまくいかなくなる場合を発見しましたので以下に挙げておきます。
1.図面テンプレートを使用した場合、select(" _ALL")で取得したエンティティは事実上アップデートはできません。ゼロからスタートで新規図面を開いた場合は問題ありません。図面テンプレートはすべて試していないのでわからないのですが、最低でも最初に起動した際のデフォルトの図面テンプレートはだめです。
2.shademodeコマンドで2D以外のモード上ではエンティティのアップデートはできません。AutoCAD 2002はshadeコマンドなどでも常時シェーディングがかかってしまう(つまりshademodeが2D以外に設定される)のでshademodeコマンドで2Dに戻してからエンティティのアップデート(具体的にはupdate_select_data()関数を実行すること)を行う必要があります。しかし、これはAutoCAD 2002のみで確認したのですがshademodeが2D以外の設定時にアップデートしたとしても後で2Dに戻せば反映されているのが確かめられました。とはいってもシェーディングが常時ONで編集というのはソリッドやサーフェイスのみの編集にかぎりますから、現実的ではありません。線などが消えてしまうことになります(常時隠線処理は違うようですが)。したがって、shademodeはLTCustomizerからのコマンド発行時は常に2Dに戻しておいたほうが無難でしょう。
AutoCAD LTのコマンドを使用した選択エンティティの更新ついて
LTCustomizerはselect()関数で選択したエンティティの情報を取り込んでその情報を更新することができますが、やろうとすることがAutoCAD/LTにあるコマンドで実現できる機能であるなら、わざわざselect()関数を使用する必要はありません。実際にユーザがキーをたたいて実現できるものであるなら、command()やcommand2()関数を使用してエンティティの更新をしたほうがスマートです。AutoCAD LT自体はそのままでもコマンドの組み合わせでいろいろなエンティティの更新ができます。エンティティの編集を行うコマンドは、AutoCAD LTのselectコマンドのオプションが使用できます。詳しくはAutoCAD LTのヘルプを参照してください。
LTCustomizerを使用したアプリケーションの配布について
LTCustomizerの正規ユーザは、LTCustomizerを使用したアプリケーションを自由に配布、販売できます。配布する際は、作者からもらったパスコードファイルを同梱する必要があります。そうしないと試用版になるからです。パスコードファイルを置く場所はアプリケーション(実行ファイル)と同じフォルダにするのが無難です。Windowsのシステムフォルダにはコピーしないようにしてください。なぜなら、他のユーザがパスコードファイルを上書きする可能性があるからです。加えてLTCustomizerをActiveXコントロールとして使用する場合、インストーラは必ずレジストリにLTCustomizerを登録しなくてはなりません。多分市販のインストーラ開発キットを使う場合はそのことを意識しなくても構わないのですが、自作の場合は注意してください。VisualC++を持っているユーザはregsvr32.exe(ActiveXコントロールなどのCOMオブジェクトをレジストリに登録・削除するツール。Windowsに同梱してある。再配布可能)のソースコードがありますので、これをもとにActiveXコントロールを登録するコードを作成してください。
通常DLLの場合Windowsのシステムフォルダにコピーする事になりますが、LTCustomizerを通常のC言語のDLLとして使用する場合はアプリケーションと同じフォルダにした方が安全です。なぜなら、別のバージョンのLTCustomizerがインストールされ、使えない関数が出てくる可能性があるからです。
ちなみにLTCustomizerの仕様は最初のいくつかのバージョンを除いて、下位互換性を保証しています。新しい機能は基本的に新規に関数を設けます。
LTCustomizerのユーザ定義コマンドをAutoCAD/LTメニューファイルに追加する方法
LTCustomizerのユーザ定義コマンドをAutoCAD/LTメニューファイルに追加するには最後に、\(ユーザ入力)文字を追加する必要があります。そうしないと、LTCustomizerがそのコマンドを認識する前にリターンが実行され、AutoCAD/LTがそのようなコマンドはないと言って終了してしまいます。
以下は正常に動作させるためのメニューファイルの1文の例です。
ID_cmd1 [コマンド1]^C^C#user_defined_command#\
なお、\マークを使用すると、AutoCAD/LTのCPU使用率が100%になるバージョンがあるので、コマンドを認識したらすぐにcancel()を実行したほうがいいでしょう。
また、現在選択中のオブジェクトを選択して取り込む場合は,最初にselectコマンドを実行して選択リストの中に入れてからユーザ定義コマンドを実行させます。
ID_cmd1 [コマンド1]select #user_defined_command#\
ユーザ定義コマンドを認識したら、select("P ")で選択したオブジェクトを取り込みます。
selectコマンドのLオプションについて
select Lで一番最後に描画したオブジェクトを選択できますが、それが現在表示されている範囲内に存在しない場合は必ず選択は失敗します。したがって、この動作を確実にするにはそのオブジェクトのある範囲内に一時的にズームをする必要があります。
例(スクリプトファイル内を想定しています。’//’以降はコメントです)
point @ // 一番最後に打ったポイントに点を打ちます
layer F * // カレントレイヤ以外はフリーズします。(ズームしたときの画面のちらつきを最小限に抑えるため)
zoom a //全図面表示します
select L
zoom p // 直前の視点に戻します
layer T * // 全レイヤをフリーズ解除します。
select()の第2引数の動作について
select()の第2引数はオブジェクトを選択する直前に実行するレイヤコマンド(-layer)の文字列を指定しますが、この文字列はF(フリーズ)以外のコマンドはオブジェクトを選択実行後もう1回実行されますので注意してください。
AutoCAD 2000、AutoCAD LT2000以降の常時シェーディングモードについて
AutoCAD 2000以降から3Dオービットコマンドなどを実行すると、UCSアイコンが赤青緑のアイコン(左参照)に変わり常時シェーディングがかかった状態で編集が可能になりました。またAutoCAD LT2000もAutoCAD 2000の機能のお下がりとして常時隠線処理のみサポートされました。しかし、この状態のときにLTCusotmizerからDXF経由(write_DXFentities()関連の関数群)でAutoCAD/LTにデータを引き渡しても正常に動作しません。
(他にも問題があるかもしれませんが試していません)
この場合はこのモードを元に戻す必要があります。
AutoCAD/LTのコマンドラインから
shademode 2(リターン)
で元のUCSアイコンに戻ります。
ちなみにAutoCAD 2000iとAutoCAD LT2000iの常時隠線処理機能(shademode h)はバグがあるようです。
この機能を有効にするとポリメッシュが消えてしまうものがあるからです。
正確には、ポリゴンメッシュは問題ないのですが、ポリラインメッシュは表示している輪郭部分さえも消してしまいます。ポリゴンメッシュはAutoCADでのサーフェイス作成に使用されていて、それで作成された図面なら問題ないのですが、他のソフトで作成されたもの(LTCustomizerも含む)だと問題が出るはずです。ポリゴンメッシュ、ポリラインメッシュの相違はAutoCADのDXFファイルのヘルプ(POLYLINE部分)を参照してください。
ちなみに1999年に発売されたAutoCAD LT2000ではどちらとも問題ないので明らかにバグでしょう。
LTCustomizerは、はじめからサーフェイスは見えないようにしているので結果的に問題ないのですが、もしこの問題がなければ仕様変更して輪郭部分を出すようにしていたでしょう。
なぜAutoCAD/LTのコマンドが最初にアンダーバーがつくのか?
私も正確な理由は分かりませんが、例えば_saveならsaveでも問題ないので、ついアンダーバーのない方を使ってしまいますが、外国語版の一部にアンダーバーがないとまともに動作しないものがあったので、その言語バージョンのために設けられたのかもしれません。もちろんLTCustomizerが内部で発行するAutoCAD/LTのコマンドはアンダーバーを最初に付けています。しかしながら、日本語版を使う限りはAutoCAD/LTのユーザはアンダーバーがなかろうが問題ないと思います。(が、保証はしません...)
ツールバーのカスタマイズ方法。
ツールバーのカスタマイズは基本的にAutoCAD/LTの機能で可能なのですが、独自の機能を多くツールバーに登録すると、ビットマップファイルの数が多くなり管理が面倒になります。ここでは複数のビットマップファイルを1つのDLLにまとめて使用する方法を示しておきます。
VisualC++を使用することを仮定して、DLLファイルを作る新規プロジェクトを設定します。
C言語のファイルをプロジェクトの1つとして追加して、そのC言語のファイルにDllMain()関数を追加します。(以下の文をそのままコピーして使用すればOK)
#include<windows.h>
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
return TRUE;
}
ビットマップリソースをプロジェクトに追加します。各ビットマップのプロパティのIDはダブルクォーテーションマークで区切って例えば、"USER_COMMAND1"という風にします。
これでプロジェクトをビルドすればOKです。
次はAutoCAD/LTのメニューファイルを新たに作ります。
以下はその一例:
/////////////////////////////////////////////////////////////////////////
//メニューグループ名とDLLファイル名のベース部分は同一名にする。
//つまり以下の例だとUSER_MENU1.DLLにする。
***MENUGROUP=USER_MENU1
***TOOLBARS
//ここは適当(aclt.mnuなどを参照)
**USER_MENU11
//ここは適当(aclt.mnuなどを参照)
**TB_USER_MENU
ID_CMD1_TB_SYS [_Toolbar("ツールバータイトル名", _Bottom, _Show, 0, 0, 1)]
//以下の文で、VC++のビットマップリソースに割り当てた""を抜いたIDを指定する
ID_command11 [_Button("ツールチップ文字列", USER_COMMAND1, USER_COMMAND1)]^C^Copen
***HELPSTRINGS
//ステータスバーに表示する文字列
ID_command11 [コマンド1
を実行します。]
//////////////////////////////////////////////////////////////////////////////
上の例をUSER_MENU1.mnsかUSER_MENU1.mnuという名前ででセーブします。
最後にmenuloadコマンドでこのメニューファイルをロードします。
LTCustomizerのスクリプト実行関数でmenuload関数を実行すれば
menuload USER_MENU1.mns
でコマンドが完了します。
(環境変数FILEDIAを0にすればmenuloadコマンドはダイアログが表示されなくなります。)
メニュー解除はmenuunloadコマンドを使用します。
なお、作成されたビットマップリソースをまとめたDLLはAutoCAD/LTが検索するパスに置いておく必要があります。
独自のリソースDLLでまとめた任意のツールバーを呼び出す方法
メニューファイルに書かれているツールバーのデフォルトの表示位置などをプログラムで変えたい場合もあるかと思います。(例えば指定のツールバーが表示した設定にしているも関わらず画面上では全く見えないのでそれを直すためとか)上記の例の場合、コマンドライン上でまず
-TOOLBAR (リターン)
を押して、その後ツールバー名を聞いてきますが、その時メニューグループ名(リソースDLL名のベース部分)とピリオドを最初に追加しないと表示されません(これを指定しないとaclt.mnuに記述されいるツールバーを指定することになってしまう)。例えば、
USER_MENU1.ツールバー名 (リターン)
と入力します。