BricsCADのカスタマイズ手法としてはとってもレアなTX(Teigha eXtension)の作り方がやっとわかったので、以下で詳細を記す。記事的には、以下の続きとなる。
まずはObjectARXを学んでみた
ARXをBRXに移植する
開発環境はVisualStudio 2019(C++)で、BricsCAD V23を動かす前提。
SDKとしてTxSdk_Bcad_V23_1_05.zipが必要なので、Bricsysで開発者登録してダウンロードしておく。
1.Visual Studioで新規プロジェクト作成
MFCダイナミックライブラリで、MFC拡張DLLとすればよい。VS2019ではデフォルトがx86なので、x64に切り替えておく。
2.cppに処理を書き込む
まずは、何も考えずに以下のように書いておけばよい。
// TxTest.cpp : DLL の初期化ルーチンを定義します。 // #include "pch.h" #include "framework.h" //#ifdef _DEBUG //#define new DEBUG_NEW //#endif #include "OdaCommon.h" #include "RxDynamicModule.h" #include "DbCommandContext.h" #include "Ed/EdCommandStack.h" #include "DbBlockTableRecord.h" #include "DbText.h" void cmdInsertTableToDatabase(OdEdCommandContext* pCmdCtx) { OdDbCommandContextPtr pDbCmdCtx(pCmdCtx); OdDbUserIO* pIO = pDbCmdCtx->dbUserIO(); OdDbDatabase* pDb = pDbCmdCtx->database(); OdDbBlockTableRecordPtr pModel(pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite)); OdDbTextPtr pText = OdDbText::createObject(); pText->setDatabaseDefaults(pDb); pText->setPosition(OdGePoint3d(100, 100, 0)); pText->setTextString(_T("Hello World!!")); pModel->appendOdDbEntity(pText); } //To register a command class class CDrxTestModule : public OdRxModule { public: void initApp() { odedRegCmds()->addCommand("TXSAMPLE", "InsertText", "InsertText", OdEdCommand::kTransparent, (OdEdCommandFunction*)cmdInsertTableToDatabase, this); } void uninitApp() { odedRegCmds()->removeGroup("TXSAMPLE"); } }; ODRX_DEFINE_DYNAMIC_MODULE(CDrxTestModule);
この中の処理こそが重要であり、これが理解できないと何もできんのだが、ARXプログラマーだったら解説なしでもわかるっしょ。
3.プロジェクトのプロパティをいじる
『詳細プロパティ⇒ターゲットファイルの拡張子』
.dll ⇒ .tx
『C/C++⇒全般⇒追加のインクルードディレクトリ』
..\..\BricsCAD\TxSdk_Bcad_V23_1_05\Include ※SDKの位置を相対参照
『C/C++⇒プリプロセッサ⇒プリプロセッサの定義』
_TOOLKIT_IN_DLL_
『C/C++⇒詳細設定⇒指定の警告を無効にする』
4819
『リンカー⇒全般⇒追加のライブラリディレクトリ』
..\..\BricsCAD\TxSdk_Bcad_V23_1_05\vc142x64 ※SDKの位置を相対参照
『リンカー⇒入力⇒追加の依存ファイル』
TD_Alloc.lib
TD_Db.lib
TD_Ge.lib
TD_Root.lib
TD_DbRoot.lib
TD_DbCore.lib
TD_DbEntities.lib
※初期状態ではこんなにいらいないかもしれんが、リンクエラーが出ないレベルでいろいろ組み込んだ
4.ビルドする
ビルド結果は、\x64\Debugの中にTxTest.txのような名前で出来上がる。
5.BricsCADで動作させる
APPLOADしてコマンドInsertTextを実行すると、はいこの通り。
このへんの情報は、日本語サイトには全く見つからなかった。Bricsysの英語問合せした結果と、以下の英語サイトから情報収集したのと、おいらのTeighaプログラミング実績を結集させて、やっとこさできたという代物。
How to migrate code from ARX to C++ Tx with ARES Commander’s API – Method # 1
APPLOADさえすれば任意のコマンドが動くようになって、そのコマンドはカレントデータベース(つまりdwgそのもの)操作できるようになったんで、あとはそのデータベースに対して、jwwから読み込んだ情報を書き込めばいいということ。すでにTeighaレベルでのjww⇒dwgコンバータのコーディングが8割型できているんで、ほぼそのまま移植すればよい。TeighaをBRXに移植しようとしたらけっこうな作業量になるところ、TeighaをTXにするだけだからインターフェース部分だけ直せばよい。TXを体得できたので、いよいよ本格的な開発に入れるぞよ。