Teigha Visualizeでマークアップ (赤線) を使用する方法

Teigha Visualizeは、ファイルのレビューと編集に役立つ機能、特にマークアップ (赤線) の作成と保存をサポートしています。以下に、マークアップを含む図面の例をいくつか示します:

image1 image2 image3

Teigha Visualize Viewerのサンプルで、ご自身で試すことができます。メインウィンドウのマークアップツールバーを使用して、さまざまな種類のマークアップを作成します:

  • 矩形マークアップ — 矩形マークアップを描画します;
  • 円マークアップ — 円マークアップを描画します;
  • ハンドルマークアップ — フリーハンドルのマークアップを描画します
  • 雲マークアップ — 雲マークアップを描画します;
  • テキストマークアップ — テキストマークアップを描画します。
image4

次に、マークアップビューを保存およびロードするための2つのツールを使用します:

  • ビューを保存 — 描画したマークアップを含む現在のビューを保存します;
  • ビューをロード — マークアップを含むビューをロードします。

描画したマークアップを保存するには:

  1. 保存をクリックします; image5

     

  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. ロードをクリックします; image6

     

  2. ロードするビューを選択し、「ロード」をクリックします。(選択したマークアップビューを削除するには、「削除」をクリックすることもできます。)

仕組みは次のとおりです:

「ロード」ボタンが押されると、まず選択された名前のエンティティからバイナリデータが読み取られ、次にそのデータが現在のビューに適用され、最後にエンティティの可視性がオンになります。

実装の詳細

マークアップの実装構造の図を以下に示します:

image7

データベースには異なるモデルが保存されており、そのうちの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」が作成されます。ここでは、すべての名前が適切な名前のマクロで宣言されます。次回のマークアップ作成はこのエンティティに書き込まれます。このエンティティは、ほとんどすべてのアクション(パン、オービット、ズームなど)で破棄されます。また、モデルには保存された他のエンティティが含まれていますが、マークアップは保存されず、一時エンティティでの作業が続行されます。次の図は、マークアップエンティティの構造を示しています。

image8

どのマークアップエンティティも、わずか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);
  }
}

今すぐ始める

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

無料で試す