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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

jwwとdwgの線種対比

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

まずはObjectARXを学んでみるの巻

Bricsys BRXをイチから作る手順がないので、まずはAutodeskさんのObjectARXを作ってみようというアプローチ。ARXはC++で書くということもあって、AutoCADをカスタマイズす …

no image

TrueView

先月、DWG TrueViewの新バージョン2008が出たようだ。 早速インストールしてみた。 AutoCAD OEMアプリケーションなので、見た目はAutoCADそっくり。 AutoCADから、図面 …

no image

TeighaのPDFサポートその後

TeighaのPDFサポートのその後の話です。 Teigha(旧OpenDWG)のベースの契約だけではPDFを扱うことが できないため、追加契約が必要となる。 デモ版での基本的動作の確認がとれため、追 …

no image

Autodesk Solution Day 2008

もう1ヶ月以上が経過しているネタだが、いつか書こうと 思い続けて今に至る。 行ったときに書いたメモをわざわざ会社から持ち帰ってきたので、 区切りをつけるためにも、書いておくことにした。 Autodes …