見出し画像

BricsCAD® V23 の『BRX』でHello World![寄稿]

 プログラムでの開発で各種の言語を使いはじめる際に「Hello world」と表示してみることで最低限の流れを把握する。というお約束がありますが、「CAD日記」様より 『BricsCAD の TX API で作図領域に「Hello World」と文字列を作成して実行する流れの解説』に引き続き、BRX API での「Hello World! 」もご寄稿いただきましたので紹介させていただきます。

以下、寄稿内容です。掲載にあたり若干文体等を整形・追記をしています。


ARXをBRXに移植するんじゃなくて、イチからBRXを作りたいよねという要求に応えて、そのやり口を以下で解説してみようじゃないか!
BricsCAD V23のTX APIで HelloWorld というのが、ややマニアックすぎだので、少し一般性が高いと思われるBRX(AutoCADで言うところのARX)で同様のことをやる手順を解説。


BRX開発に必要なもの

  • BricsCAD V23 Pro 以上(体験版でもOKです。)

  • 開発環境:VisualStudio 2019(C++)

  • BricsCAD の BRX SDK(BRXSDK_Bcad_V23_1_05.ZIP)
    BRX SDKのファイルはアップデート毎に提供されることがあります。

BRX SDK の入手は Bricsysの開発者登録が必要です。登録後にSDKのダウンロードサイトが案内されます。

補足:中の人
BRX SDK のファイル内容イメージ

1.Visual Studio で新規プロジェクト作成

MFCダイナミックライブラリで、MFC拡張DLLとすればよい。VS2019ではデフォルトがx86なので、x64に切り替えておく。
※以下すべて、x64のDebugを例に説明していく。Releaseについても同様に行えばうまくいくはず。

2.プロジェクトのプロパティを設定する

  • 『詳細プロパティ⇒ターゲットファイルの拡張子』
    .dll ⇒ .brx

  • 『デバッグ⇒コマンド』
    C:\Program Files\Bricsys\BricsCAD V23 ja_JP\bricscad.exe
    ※インストールしたBricsCADのexeを指定

  • 『C/C++⇒プリプロセッサ⇒プリプロセッサの定義』
    _ACRXAPP
    BRX_APP
    __BRXTARGET=23

  • 『C/C++⇒全般⇒追加のインクルードディレクトリ』
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\inc
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\inc-x64
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\hlrapi\inc
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\amodeler\inc
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\brep\inc
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\Atil\Inc

  • 『リンカー⇒全般⇒追加のライブラリディレクトリ』
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\lib64
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\hlrapi\lib64
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\amodeler\lib64
    D:\MyProject\BricsCAD\BRXSDK_Bcad_V23_1_05\utils\atil\lib64

※上記ディレクトリ指定はSDKを絶対パスで指定している。各自の環境のパスに合わせつつ相対参照すればもっと短くなる。

3.必要なソースファイルをダウンロード

必要なファイル(AddFile.zip)をダウンロードして解凍。以下4つのファイルが得られるので1で作ったプロジェクトのフォルダ内にコピー。

  • acrxEntryPoint.cpp

  • DocData.cpp

  • DocData.h

  • pch.h   ※ これだけはすでに存在しているけど、上書きで問題なし。

4.ソースファイルをプロジェクトに追加

VS のソリューションエクスプローラで、「ソースファイル」に追加⇒既存の項目として、acrxEntryPoint.cpp と DocData.cpp を追加する。ヘッダーファイルにも同様に、DocData.h を追加。結果はこんな感じになる。

ファイルを追加した状態

5.ビルドする

ビルド結果は、\x64\Debug の中に BrxNew.brx のような名前で出来上がる。

6.BricsCADで動作させる

APPLOAD してコマンド mycommandlocal を実行すると、はいこの通り。

キモになるのは acrxEntryPoint.cpp の中の関数 ADSKMyGroupMyCommand なので、以下に転記する。

static void ADSKMyGroupMyCommand () {
        // Put your command code here
        //acutPrintf(_T("\nHello World !!"));
 
        acDocManager->lockDocument(acDocManager->curDocument(), AcAp::kWrite);
        AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
        AcDbBlockTable* pTbl;
        pDb->getBlockTable(pTbl, AcDb::kForRead);
        AcDbBlockTableRecord* pRec;
        pTbl->getAt(_T("*MODEL_SPACE"), pRec, AcDb::kForWrite);
        pTbl->close();
 
        AcDbText* pEnt = new AcDbText();
        pEnt->setTextString(_T("Hello World !!"));
        pEnt->setHeight(30.0);
        pEnt->setPosition(AcGePoint3d(200,100,0));
        pRec->appendAcDbEntity(pEnt);
        pRec->close();
        pEnt->close();
 
        acDocManager->unlockDocument(acDocManager->curDocument());
    }

関数 acdbHostApplicationServices で、変数「AcDbDatabase* pDb」を取得している。この pDb が DWG そのものであり、そこからモデル空間のクラスを取得しておく。
文字は AcDbText だから、文字列として Hello World !! と入れて、他に最低限の情報として高さと配置座標を指定。モデル空間に文字を追加して完了。
前後に lock とか unlock をしているのも重要っちゃ重要か。

拡張子propsとは、プロジェクトの設定で読み込む情報をXML形式で定義しておくものなので、何をどこに追加しているのかを読み解いて、上記の2で解説した次第。
Autodesk® さんの ARX用のWizard って便利なものだよなと思ってたけど、何をやっているのかがブラックボックスになっているからどうかな?と思い始めた。
上に書いたような最低限のソースコード+プロジェクトのプロパティ設定を明示してあげたほうが、プログラマにとっては理解度が増すかもね。

寄稿者: CAD日記 さん


以上が、寄稿していただいた BRX を使用したHello World の例となります。

BricsCAD の BRX APIの特徴

BRX は "BricsCAD Runtime eXtension "の略です。C/C++言語での開発となるので、プログラマーの方が開発するというイメージが強い API になるかと思います。

BricsCAD 用のアプリケーションを開発する場合、BricsCAD の Lite やShape で利用できないという制限はありますが、特に高いパフォーマンスを求める際は C/C++ の BRX での開発が適しています。
また、BRX API は、一部の機能およびと性能を除き、サポートされるすべての製品アーキテクチャと OS で利用可能です。(後述のLinux/Mac での BRX API を参照)。

さらに、BRX は、AutoCAD® の ObjectARX とソースコードの互換性を持っています。同じソースコード・ファイルを使用して、各CADプラットフォームをターゲットとした個別のバイナリ・モジュールを構築することができます。

  • AutoCAD上で実行するために ObjectARX とコンパイル・リンクします。

  • 同じソースコードをBRXでコンパイル・リンクし、BricsCAD上で動作させることができます。

同じバイナリモジュールを複数のプラットフォームでロードすることはできませんのでご注意ください。ObjectARX でコンパイルされたモジュールはBricsCAD ではロードできず、BRXでコンパイルされたモジュールはAutoCADではロードできません。

なお、BricsCAD 独自の機能に対するAPIも整備されています。

品質チェック

Bricsysは、BRX関数の動作を継続的に監視し、テストするための広範な自動テストスイートを備えています。すべての関数は、正常な動作とエラーの戻り値をチェックします。このような事で互換性の確保にも注力しています。

Linux/MacでのBRX API

BRX SDKは、同じソースコードから複数のCADプラットフォーム用にビルドできるように設計されています。オペレーティング・システムについても同様です。いくつかの制限はありますが、BRXの開発戦略は、Windowsベースのプラグインコードが Linux や Mac などの他のオペレーティングシステムでもビルドして実行できるようにすることです。

以下は、Linux や Mac の BRX API の使用に特化した内容です。

  • BRX SDKは、基本的なWindowsプラットフォーム・エミュレーション層を提供し、以下を含むLinuxおよびMac上のWindows API関数の大規模なセットをサポートします。

    • ネイティブ(Ansi + Unicode)MSVCランタイムおよびWindows APIエミュレーション

    • 非 GUI の MFC クラス (CArray、CList、CString など)

    • COMベースのデータ型とデータクラス、および関連するユーティリティ関数(Variant、SafeArray、BSTR、CComBSTRなど)。

  • Windows 以外のオペレーティングシステムで現在利用できない機能には、以下のものがあります。

    • MFCベースのユーザーインターフェイス拡張機能(AcUi、AdUi)

    • C++から呼び出し可能なCOMインターフェース

    • CWnd のような MFC GUI クラスを使用する、いくつかの文書化されていないグローバルな関数は使用できません。

BRX のサンプルプログラム

BricsCAD をインストールしたフォルダの中に APIというフォルダがあります。その中のBRXフォルダに、BRXフォルダにBRXのサンプルプログラムがありますので、雰囲気を確認するために眺めてみても良いでしょう。

BricsCAD V23 の API フォルダ

BricsCAD の各 API での Hello world!

情報を共有したいという方がいらっしゃいましたら寄稿していただけますと幸いです。

では。
#CAD  #ARX #BRX #CADカスタマイズ #DWG #API #BricsCAD

BricsCAD の体験版は無料ですべての機能を試せます。 BricsCAD は 2D設計と3D設計を一つのプラットフォーム上で行える学習コスト・運用コスト共に優しい CAD です。 記事が役に立ったら「❤スキ」のクリックもお願いします!