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

スプライン

AutoCADのスプラインについて新発見があった。 ながいことスプラインはポリラインに分解できないものだと思ってた。 AutoCADで分解しようとすると、「SPLINEを分解できません」 って出るし、 …

no image

UnicodeとAutoCAD

AutoCAD 2007のDXFとDWGでは、文字がUnicodeコード化されてるんだって。 試しに、2007で「あいうえお」って文字を書いて、2007のDXFで保存して テキストエディタで見たら、め …

no image

TeighaのPDFサポート

AutoCADがPDFアンダーレイ(PDFUNDERLAY)を配置できるように なったのは、AutoCAD2010からだった。 CAD図面の下書きとして、ラスターイメージ(JPEGやTIFF)を配置す …

no image

AutoCAD2007

ついに発表されました、AutoCAD2007。 ほんと毎年毎年、よくバージョンアップしますね。 まだ2006の前半だってぇーのに、2007という数字を使うあたりは、例年通りです。 私の記憶では、200 …

no image

AutoCADのペン設定

AutoCADのペン設定を引き継ぎたいらしい。 ずっと昔にトライして記録に残していたことを思い出した。 ctbとstb 上記のことだけでは情報不足なので、以下サイトの情報も参考にしよう。 出力時にいつ …