CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

AutoCAD DWG

TeighaとObjectARXの相違点

投稿日:

ObjectARXはAutoCADのカスタマイズ環境のうちの最も高度なことができるもので、Teighaは別名ODAとも呼ばれるDWG互換CADの基盤となる環境。TX(Teigha eXtention)は、BricsCADのBRX(ARX互換)とはちょっとちがった使い勝手のもので、きっとほぼTeighaと同じなんだと想像しているところ。本命がTXなのに対して、その前段階でARXとTeighaの違いを調べたので以下に記す。なお、両者のプログラミング言語はC++ということで一致している。

1. クラスなどの命名方法
【Teigha】クラス名などのprefixとして「Od」が使われる。例:OdDbObject
【ARX】クラス名などのprefixとして”Ac”が使われる。例:AcDbObject

2. スマートポインタ
【Teigha】スマートポインタに参照カウントが使用されているため、通常のポインタの代わりにスマートポインタを使用すれば、メモリ管理を自動で行ってくれる。
【ARX】スマートポインタに参照カウントが使われていないため、使用目的に応じてスマートポインタと通常のポインタを使い分けなければならない。(生成するところではスマートポインタ、参照するところでは通常のポインタ)また、AcDbObjectの子クラスにしかスマートポインタが用意されていないため、それ以外のオブジェクト(AcDbDatabaseなど)については、std::auto_ptrなどを使用して、自分でメモリを管理する必要がある。

3. 例外
【Teigha】例外に対応しているため、インターフェースがシンプルになっている。
例:OdDbLayerTable* pLtからnameという名前のレイヤのIDを取得。
OdDbObjectId id = pLt->getAt(name);
【ARX】例外に対応しておらず、関数の戻り値でエラーを返している。そのため、何らかの値を返す関数を呼ぶ場合、戻り値を受け取る変数をあらかじめ定義して関数の引数として渡す必要がある。
例:AcDbLayerTable* pLtからnameという名前のレイヤのIDを取得
AcDbObjectId id;
if( Acad::eOk != pLt->getAt( name, id ) )
// エラー処理

4. ObjectIdからObjectの取得方法
【Teigha】ObjectIdのメソッドsafeOpenObject()を呼び出して取得する。
例:OdDbObjectPtr obj = objId.safeOpenObject();
【ARX】ObjectIDをスマートポインタのコンストラクタに渡すことで取得する。エラーが発生したかどうかは、スマートポインタのメソッドopenStatus()で取得する。
例:AcDbObjectPointer obj( objId );
if( Acad::eOk != obj.openStatus() )
// エラー処理

5. 文字列
【Teigha】文字列のやりとりはすべてOdStringというクラスで行う。
【ARX】文字列を表すAcStringというクラスはあるが、すべてのAPIでこのクラスを使用できるわけではない。APIによっては、文字配列へのポインタ(ACHAR*)しか受け付けないものもある。

6. サービスオブジェクト
【Teigha】ExSystemServices,ExHostAppServicesクラスのオブジェクトを初期化して使用する。OdDbDatabaseオブジェクトなどは、サービスクラスのメソッドを使用して作成する。
【ARX】グローバル関数acdbHostApplicationServices()で取得できる。AcDbDatabaseオブジェクトは、コンストラクタで直接作成できる。

7. カレントのデータベース
【Teigha】カレントのデータベースという概念はない。すべての操作が、データベースまたはその要素のメソッドを使用して行える。例:カレントのレイアウトを設定したい場合、OdDbDatabaseのメソッドsetCurrentLayout()を使用して切り替える。
【ARX】acdbHostApplicationServices()->setWorkingDatabase()でカレントのデータベースを切り替える。一部の処理については、カレントのデータベースにしか適用できない。例:カレントのレイアウトを設定したい場合、カレントのデータベースを切り替えたうえで、acdbHostApplicationServices()->layoutManager()のsetCurrentLayout()メソッドを使用して切り替える。

8. ファイルの読み込み
【Teigha】OdDbDatabaseのreadFile()メソッドを使用する。
【ARX】DXFの場合はOdDbDatabaseのdxfIn()メソッド、DWGの場合はreadDwgFile()メソッドを使用する。

9. ファイルの保存
【Teigha】OdDbDatabaseのwriteFile()メソッドに形式を指定して保存する。
【ARX】それぞれの形式に対応したグローバル関数(acdbDxfOutAs2004()など)を呼び出して保存する。ただし、最新版に関しては、AcDbDatabaseのdxfOut()メソッド、saveAs()メソッドを使用する。

-AutoCAD, DWG

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

DWGのサムネイル

DWGdirectの話。 DWG内のサムネイルを何とかして残しておく方法はないか。 この命題に一応の決着がついたので記しておく。 DWGdirectライブラリを使った自作アプリで、 任意のDWGを開い …

no image

AutoCAD 2017

Nautilusだったようだ。去年、一生懸命AutoCADのコードネームを予想してみたりしていたが、今年のバージョンであるAutoCAD 2017のコードネーム(開発コード)を調べたのは、リリースして …

no image

AutoCAD2011

今年もこの季節がやってきた。 3/19、AutoCAD2011リリース。 ADN会員の特権を生かして、AutoCAD2011製品版をインストールしてみた。 いろいろと機能強化が行われているようだが、3 …

no image

XCLIPのネスト

某変換ツールのデータ調査で、遭遇してしまった。 XCLIPのネスト。 担当者からの事前情報で、XCLIPが多用されているということは あらかじめ把握していた。 かなり、嫌な予感はしていた。 XCLIP …

no image

DWGビューア

ペーパーモデル化ツールにDWGビューアが添付されていることは、 あまり知られていない。 インストールしたフォルダ内のView.exeを叩けば、起動できる。 例)C:¥Program Files¥PMt …