Teigha Visualize 支持有助于审阅和编辑文件的功能,特别是创建和保存标记(批注)。以下是一些包含标记的图纸示例:
在 Teigha Visualize Viewer 示例中,您可以亲自尝试。使用主窗口中的“标记”工具栏创建不同类型的标记:
- 矩形标记 — 绘制矩形标记;
- 圆形标记 — 绘制圆形标记;
- 手柄标记 — 绘制自由手柄标记;
- 云线标记 — 绘制云线标记;
- 文本标记 — 绘制文本标记。
然后使用这两个工具保存和加载标记视图:
- 保存视图 — 保存当前带有您绘制的标记的视图;
- 加载视图 — 加载包含标记的视图。
要保存您绘制的标记:
- 单击“保存”;
- 输入保存的标记视图的名称。
其工作原理如下:
保存的标记使用包含视图参数的结构:位置、目标、upVector、fieldWidth、fieldHeight、投影类型和渲染模式。当按下“保存”按钮时,这些参数从视图中接收。之后,该结构将二进制数据写入具有输入名称的新实体。
// create and append the binary data to the entity
OdTvByteUserData *data = new OdTvByteUserData(params, sizeof(struct SaveViewParams), OdTvByteUserData::kOwn, true);
pEn->appendUserData(data, m_appTvId);
要加载包含标记的已保存视图:
- 单击“加载”;
- 选择要加载的视图,然后单击“加载”。 (您也可以单击“删除”以移除选定的标记视图。)
其工作原理如下:
当按下“加载”按钮时,首先从具有选定名称的实体中读取二进制数据,然后将数据应用于当前视图,最后为该实体打开可见性。
实施细节
以下是标记实现结构的图表:
在数据库中,存储了不同的模型,其中一个模型存储标记实体。此模型的名称为“$ODA_TVVIEWER_MARKUPS”。该模型仅在绘制标记时创建。在对象树中,此模型位于“服务模型”中。请务必检查此模型是否存在。
if (m_TvMarkupsModelId.isNull())
{
m_TvMarkupsModelId = m_TvDatabaseId.openObject(OdTv::kForWrite)
->createModel(OD_TV_MARKUP_MODEL, OdTvModel::kDirect);
m_TvMarkupsModelId.openObject()->setNeedSaveInFile(true);
}
当标记创建开始时,创建一个临时实体“$MarkupTempEntity”,其中所有名称都在具有适当名称的宏中声明;下一个标记创建将写入此实体。此实体在几乎任何操作(平移、轨道、缩放等)中都会被销毁。此外,模型还包含其他已保存的实体,而标记未保存,并且工作继续使用临时实体。下图显示了标记实体的结构。
任何标记实体都只有五个子实体。每个子实体都是特殊类型标记的文件夹:
- 矩形标记 — 子实体“矩形”;
- 圆形标记 — 子实体“圆形”;
- 自由手柄标记 — 子实体“自由手柄”;
- 云标记 — 子实体“云”;
- 文本标记 — 子实体“文本”。
每个标记的构造函数都会搜索一个临时实体,如果未找到,则根据标记类型的文件夹创建一个新的临时实体。
// create main entity if not exist
OdTvModelPtr modelPtr = m_tvDraggersModelId.openObject(OdTv::kForWrite);
m_entityId = findEntityByName(modelPtr->getEntitiesIterator(), OD_TV_MARKUP_TEMP_ENTITY, false);
if (m_entityId.isNull())
{
m_entityId = modelPtr->appendEntity(OD_TV_MARKUP_TEMP_ENTITY);
m_entityId.openObject(OdTv::kForWrite)->setColor(OdTvColorDef(255, 0, 0));
}
// crate rectangles subEntity if not exist
m_rectFoldEntityId = findSubEntityByName(m_entityId.openObject()->getGeometryDataIterator(), OD_TV_MARKUP_RECTANGLES);
if (m_rectFoldEntityId.isNull())
m_rectFoldEntityId = m_entityId.openObject(OdTv::kForWrite)->appendSubEntity(OD_TV_MARKUP_RECTANGLES);
标记文件夹包含具有相应几何数据的子实体。当创建对象标志为真时,使用 updateFrame() 方法创建具有几何数据的子实体。
//update or create entity
if (bCreate)
{
m_rectEntityId = m_rectFoldEntityId.openAsSubEntity(OdTv::kForWrite)->appendSubEntity();
{
OdTvEntityPtr entityNewPtr = m_rectEntityId.openAsSubEntity(OdTv::kForWrite);
//create frame
m_frameId = entityNewPtr->appendPolygon(m_pts);
}
}