サイトアイコン CAD日記

Teigha eXtension(略してTX)がデキター!

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

モバイルバージョンを終了