BricsCAD V23のTX APIで HelloWorld [寄稿]
プログラムでの開発で各種の言語を使いはじめる際に「Hello world」と表示してみることで最低限の流れを把握する。というお約束がありますが、「CAD日記」様より 『BricsCAD の TX API で作図領域に「Hello World」と文字列を作成して実行する流れの解説』を寄稿いただきましたので紹介させていただきます。
以下、寄稿内容です。掲載にあたり若干文体等を整形・追記をしています。
BricsCAD の TX で始める Hello world
BricsCADのカスタマイズ手法としてはとってもレアな TX(Teigha eXtension)の作り方がやっとわかったので、以下で詳細を記す。
開発の準備(V23の場合)
TX開発に必要なもの
以下のものが必要なので、あらかじめインストールして使用できる状態にしておきます。
BricsCAD V23 (体験版でもOKです。)
開発環境:VisualStudio 2019(C++)
プラットフォーム ツールセット = v142BricsCAD の TXSDK(TxSdk_Bcad_V23_1_05.zip)
TxSdk の入手は Bricsysの開発者登録が必要です。登録後にSDKのダウンロードサイトが案内されます。また、TXSDKは細かなバージョン毎に提供されます。
プロジェクトの作成
以下の手順で進めます。
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);bleRecordPtr pModel(pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite));
この中の処理こそが重要で、これが理解できないと何もできんのだが、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で動作させる
「TxTest.tx」をBricsCAD の APPLOAD コマンドでロードして、InsertText を実行すると、はいこの通り。
APPLOAD で読み込めば任意のコマンドが動くようになって、そのコマンドはカレントデータベース(つまりdwgそのもの)を操作できるようになります。
寄稿者: CAD日記 さん
以上が、プロジェクトの作成からロード、実行の流れとなります。
CAD日記さんからは、
という事も触れられていますので、中の人的には先が楽しみです。
BrcsCAD アプリのC++での開発はBRXとTXどちらがいいか?
通常 BricsCAD 用のアプリケーションを C/C++ での開発は、新規で作成する場合やARXからの移植を考える場合は、BRX API での開発が主流です。
BricsCAD の TX API は Open Design Aliance(以下、ODA) が提供する Teigha ライブラリでの開発と同様なものですが、BricsCAD に最適化された形になっています、
そのため ODA の Teigha ライブラリ用にコンパイルされたものをそのままBricsCAD で使うことはできず、BricsCAD の TX SDK でコンパイルして利用する必要があります。
CAD日記さんのように Teigha での開発経験があってコード資産がある場合は、BricsCAD の TX用に若干の書き換えで活用できる点がメリットとなります。Teigha でのソフトウェアを開発している場合、ある意味一番面倒なDWGデータベースを正確かつハイ・パフォーマンスな形でグラフィカルに再現する部分をマルチスレッド対応な BricsCAD に任せてしまうという活用が可能です。
実際 CAD エンジンやOEM的な形で BricsCAD が使われている事例もありますので、もしそのような使い方を検討したいというメーカーさんがいらっしゃいましたら Bricsys へご相談ください。
TX API で開発する場合の注意点はデベロッパーリファレンスをお読みください。
BricsCAD の他 API での Hello world も募集しています。
もし情報を共有したいという方がいらっしゃいましたら寄稿していただけますと幸いです。
では。