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

DWGdirect 2.5.2

2008/3/19、DWGdirect 2.5.2がリリース。 リリースノート(英語) 新しいクラスや関数には目新しいものはない。 一方、90項目のバグフィックスが行われている。 これだけのバグが内在 …

no image

Revit と ビューポート

3次元建築CAD Autodesk Revit。 AutoCAD Regular版とのセット販売。 AutoCADの価格に20万ほど上乗せすると Revitが手に入るということ。 Autodeskさん …

ポリラインのふくらみ(改)

2007年に書いた記事「ポリラインのふくらみ」は、おいらにとって今でも大変興味深いテーマであり、もう少し掘り下げて書いてみたくなった。 ふくらみをB、円弧の中心角をAとすると、以下の計算式が成り立つと …

no image

Teigha3.8

AutoCAD 2013が出てから半年ちょっとが経過。 3年ごとのデータ変更の年だったわけだが、まだ2013形式のDWGは 世にそれほど出回っていない。 なぜなら、2013形式データを読み書きできるの …

jwwとdwgの線種対比

jwwとdwgの色番号対比の続編で、次は線種。点線とか一点鎖線とかのことで、線種は色と違って番号という考え方がdwgにはない。名前で管理されており、画層(レイヤ)やブロックでも同じことが言える。番号と …