Teigha Visualizeは、ファイルのレビューと編集に役立つ機能、特にマークアップ (赤線) の作成と保存をサポートしています。以下に、マークアップを含む図面の例をいくつか示します:
Teigha Visualize Viewerのサンプルで、ご自身で試すことができます。メインウィンドウのマークアップツールバーを使用して、さまざまな種類のマークアップを作成します:
- 矩形マークアップ — 矩形マークアップを描画します;
- 円マークアップ — 円マークアップを描画します;
- ハンドルマークアップ — フリーハンドルのマークアップを描画します
- 雲マークアップ — 雲マークアップを描画します;
- テキストマークアップ — テキストマークアップを描画します。
次に、マークアップビューを保存およびロードするための2つのツールを使用します:
- ビューを保存 — 描画したマークアップを含む現在のビューを保存します;
- ビューをロード — マークアップを含むビューをロードします。
描画したマークアップを保存するには:
- 保存をクリックします;
- 保存するマークアップビューの名前を入力します。
仕組みは次のとおりです:
保存されたマークアップは、ビューのパラメータ (位置、ターゲット、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);
マークアップを含む保存されたビューをロードするには:
- ロードをクリックします;
- ロードするビューを選択し、「ロード」をクリックします。(選択したマークアップビューを削除するには、「削除」をクリックすることもできます。)
仕組みは次のとおりです:
「ロード」ボタンが押されると、まず選択された名前のエンティティからバイナリデータが読み取られ、次にそのデータが現在のビューに適用され、最後にエンティティの可視性がオンになります。
実装の詳細
マークアップの実装構造の図を以下に示します:
データベースには異なるモデルが保存されており、そのうちの1つがマークアップエンティティを保存します。このモデルの名前は「$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」が作成されます。ここでは、すべての名前が適切な名前のマクロで宣言されます。次回のマークアップ作成はこのエンティティに書き込まれます。このエンティティは、ほとんどすべてのアクション(パン、オービット、ズームなど)で破棄されます。また、モデルには保存された他のエンティティが含まれていますが、マークアップは保存されず、一時エンティティでの作業が続行されます。次の図は、マークアップエンティティの構造を示しています。
どのマークアップエンティティも、わずか5つのサブエンティティを持っています。各サブエンティティは、特殊なタイプのマークアップ用のフォルダーです。
- 長方形マークアップ — サブエンティティ「Rectangles」;
- 円マークアップ — サブエンティティ「Circles」;
- フリーハンドルマークアップ — サブエンティティ「Free handles」;
- クラウドマークアップ — サブエンティティ「Clouds」;
- テキストマークアップ — サブエンティティ「Texts」。
各マークアップのコンストラクタは一時エンティティを検索し、見つからない場合は、マークアップタイプ用のフォルダーに従って新しい一時エンティティを作成します。
// 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);
マークアップフォルダーには、適切なジオメトリデータを持つサブエンティティが含まれています。ジオメトリデータを持つサブエンティティは、オブジェクト作成フラグがtrueの場合に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);
}
}