[返回博客](/cn/blog) # 关于使用外部参照的注意事项

Vladimir Kalinin 三月 02, 2017 [\#xrefs](/cn/blog/tag/xrefs) [\#getting started](/cn/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 文件的引用。外部参照常用于将大文件拆分为小文件；小文件由一个“宿主”文件引用，并且小文件可以由不同的工程师独立且同时处理。外部参照的其他用途是创建块库或底图。

在宿主数据库中，外部参照表示为一个块，其名称与所引用文件的名称（不带 .dwg 文件扩展名）相对应。外部参照块不包含来自外部参照数据库的实体；相反，它在 OdDbBlockTableRecord::newIterator 中返回一个指向外部参照模型空间的迭代器。

### 加载

外部参照管理功能捆绑在两个命名空间中：OdDbXRefMan 和 OdDbXRefManExt。最重要的函数是 OdDbXRefMan::load(OdDbBlockTableRecord\*)。它加载附加到给定块的外部参照。加载过程相当复杂。首先，保存的外部参照路径（OdDbBlockTableRecord::pathname()）连同提示 FindFileHint::kXRefDrawing 传递给 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 维护的依赖项之一。

### 其他功能

OdDbXRefMan::detach 从宿主中擦除外部参照的所有痕迹。

OdDbXRefMan::bind 将外部参照合并到宿主中，克隆所有缺失的数据（模型空间内容），并通过将符号从通常的 **“xref|name”** 更改为 **“xref$n$name”** 来修改符号。它将外部参照块转换为普通块，并释放外部参照数据库。绑定有点像 OdDbXRefMan::detach() 之后跟着 OdDbDatabase::insert()。绑定是不可逆的；您将无法分离已绑定的图形，因为它不再“附加”。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
