[ブログに戻る](/ja/blog) # 外部参照の使用に関する注意

Vladimir Kalinin 3月 02, 2017 [\#xrefs](/ja/blog/tag/xrefs) [\#getting started](/ja/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

### はじめに

Xref（eXternal REFerenceの略）は、その名の通り、外部の.dwgファイルへの参照です。外部参照は、大きなファイルを小さなファイルに分割するためによく使用されます。小さなファイルは1つの「ホスト」ファイルによって参照され、小さなファイルは異なるエンジニアによって独立して同時に処理できます。外部参照の他の用途としては、ブロックライブラリやアンダーレイの作成があります。

ホストデータベースでは、外部参照は参照されるファイル名（.dwgファイル拡張子なし）に対応する名前を持つブロックとして表現されます。外部参照ブロックには、外部参照データベースからのエンティティは含まれていません。代わりに、OdDbBlockTableRecord::newIteratorで外部参照モデル空間へのイテレータを返します。

### ロード

外部参照管理機能は、OdDbXRefManとOdDbXRefManExtの2つの名前空間にバンドルされています。最も重要な関数はOdDbXRefMan::load(OdDbBlockTableRecord\*)です。これは、指定されたブロックにアタッチされた外部参照をロードします。ロードプロセスはかなり複雑です。まず、保存された外部参照パス（OdDbBlockTableRecord::pathname()）が、ヒントFindFileHint::kXRefDrawing findFile()とともにOdDbHostAppServices::findFile()に渡され、解決されたパスを返す必要があります。このパスはOdDbHostAppServices::readFile()に渡されます。ファイルが見つからなかった場合、ブロックのxrefStatus()はkXrfUnresolvedに設定されます。ファイルが見つかった場合、外部参照シンボルテーブルは次のようにホストデータベースにマージされます。

- ブロック、線種、寸法スタイルなどの一部のシンボルは、参照としてそのままホストテーブルにコピーされ、外部参照テーブルを所有者として保持します。画層や文字スタイルなどの他のシンボルは、ホストにクローンされます。シンボル名には、外部参照ブロック名が前置されます（区切り文字として「|」を使用）。クローンされたシンボルは、OdDbXRefManExt::getSymbolTableRecordXrefBlockId() を介して取得できる外部参照ブロックへの参照を保持します。
- 注釈尺度はクローンされ、名前に「\_XREF」が付加されます。
- 画層状態はクローンされ、外部参照ブロック名と「\_\_」が前置されます。
- マテリアルと印刷スタイルは、ホストに同じ名前のオブジェクトがない場合にクローンされます。

クローン作成時に作成されたIDマッピングは外部参照データベースに保存され、クローンされたオブジェクトは「リダイレクトされた」ステータスを取得します。これにより、クローンされたオブジェクト（例：画層）のオブジェクトIDを開くと、ホストデータベースから対応する画層が返されます。元のオブジェクトを取得するには、OdDbObjectId::convertToRedirectedId() または OdDbObjectId::getNonForwardedHandle() を使用します。このリダイレクトの理由は、外部参照ブロックをホストデータベース内でよりネイティブに見せるためです（リストスクリプトの場合も同様）。このようにして、外部参照ブロックからエンティティの画層を要求すると、ホストデータベースから画層が取得され、これは通常期待される動作です。

外部参照データベースは、OdDbDatabase::xrefBlockId() を介してアクセスできるホスト外部参照ブロックへの参照も保持します。

外部参照データベースを一時的に元の状態に復元するには（例：REFEDITのようなシナリオで）、OdDbDatabase::restoreOriginalXrefSymbols() 関数を使用します。OdDbDatabase::restoreForwardingXrefSymbols() はその逆を行います。

他のファイルを参照するデータベース（ネストされた外部参照）を参照する場合、「オーバーレイ」外部参照ステータスである OdDbXRefMan::setOverlaid を使用して、これらのネストされたファイルをスキップするオプションがあります。

OdDbXrefGraph::findCycles() 関数は、ロード中にネストされた外部参照の循環参照を検出するために使用されます。OdDbXrefGraph::getFrom を使用して、ネストされた外部参照グラフ構造を検査します。

### 挿入

新しい外部参照ブロックを作成するには、OdDbXRefManExt::addNewXRefDefBlock() を使用します。その後、OdDbXRefMan::load() を介して明示的にロードするか、ブロック挿入がレンダリングされるときに自動的にロードされます。(はい、通常のブロックと同様に、挿入も必要になります。)

### 保存

保存後、外部参照ファイルへのパスは、外部参照ブロック内の OdDbBlockBegin オブジェクトに保存されます。「VISRETAIN」データベース変数が true の場合、画層およびその他のクローンされたシンボルはホストデータベースと共に保存されます。クローンせずにコピーされたブロックやシンボルは、もちろんホストと共に保存されることはありません。

外部参照は、OdFileDependencyManager によって維持される依存関係の1つです。

### その他の機能

OdDbXRefMan::detach は、ホストから外部参照のすべての痕跡を消去します。

OdDbXRefMan::bind は、外部参照をホストにマージし、不足しているすべてのデータ (モデル空間の内容) をクローンし、通常の **“xref|name”** から **“xref$n$name”** にマングルすることでシンボルを変更します。これにより、外部参照ブロックが通常のブロックに変換され、外部参照データベースが解放されます。Bind は、OdDbXRefMan::detach() の後に OdDbDatabase::insert() を実行するのと多少似ています。Bind は元に戻せません。バインドされた図面は「アタッチ」されていないため、デタッチすることはできません。

## 今すぐ始める

**ODAソフトウェアを60日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
