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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

関連記事

no image

DWGdirect 2.3.1

2008DWGに対応していると思われるDWGdirect 2.3.1がリリースされた。 2008対応ということでは、2.3.0で既に対応していたらしいのだが、 けっこうバグが出ていて、待ちの状態だった …

no image

AutoCAD2011

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

no image

AutoCAD 2019の開発コードは何だったか?

日本では数少ないAutoCADオタクのみなさん、こんにちは。AutoCAD 2019の開発コードが何だったのかを日本で初めて明らかにすることができたでしょう。去年がOmegaということでアルファベット …

no image

黒丸矢印

AutoCAD寸法の黒丸矢印が特殊だということを以前書いた。 円をポリラインで AutoCADで書いたDXFを、Jw_cadで開くとこんなことが起きるわけだ。 これを、半円ドーナツ化現象と呼ぶ。 (正 …

AutoCAD学生版について知りたければココを読め

AutoCAD学生版は無料で3年間使える。Autodeskのアカウントを作ってログインすればダウンロードできる。アカウントを作る際、教育版を使える立場であることを証明するために、学校名などを入力する。 …