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を体得できたので、いよいよ本格的な開発に入れるぞよ。