選択スタイルとハイライトをカスタマイズする

グラフィックアプリケーションの多様性により、単一のデフォルト選択スタイルがすべてのアプリケーションタイプに適合するとは限りません。たとえば、機械編集アプリケーションの選択要件は、電気編集アプリケーションとは異なる場合があります。Visualizeを使用すると、デフォルトのパターン(クラシック)スタイルを使用したり、個々のアプリケーションのニーズに合わせて選択スタイルをカスタマイズしたりできます。たとえば、選択の表示をより目立たせたり、目立たなくしたり、配色を変更したり、好みのハイライトの詳細を有効にしたり、シーンジオメトリの上にハイライトをレンダリングしたりできます。

default and customized selection styles


さらに、グラフィックシーン内の個別のオブジェクトに異なる選択スタイルを同時に適用できます。複数の選択スタイルは、複数のハイライトレベルをサポートするのに役立ちます。たとえば、次の図に示すように、オブジェクトのセットを選択し、オブジェクトの編集可能な部分をハイライト表示する場合などです。

highlighted objects

 

選択スタイルプロパティには、ハイライト効果をカスタマイズするための50,000を超える設定の組み合わせがあります。ハイライトカスタマイズ機能は、すべての種類のODAデータベースに適用され、入力ファイル形式には依存しません。この機能は、Open GLES2およびMetalベクター化モジュールのみでサポートされています。

ハイライトカスタマイズ方法

デフォルトでは、.dwgデータベースの場合、SELECTIONEFFECTシステム変数を使用して、クラシック(パターン)選択スタイルと拡張(カラーマスク)選択スタイルを切り替えることができます。SELECTIONEFFECTCOLORシステム変数を使用して、拡張選択スタイルの色を変更できます。

アプリケーションの選択スタイルを完全に制御するには、OdGiContext::selectionStyleメソッドをオーバーライドします(これは、あらゆる種類のデータベースで同様の方法で行うことができます)。

OdUInt32 CDwgViewer::selectionStyle(OdUInt32 nStyle, OdGiSelectionStyle &selStyle) const
{
  if (nStyle > 2)
    OdGiDefaultContext::selectionStyle(0, selStyle);
  else if (nStyle > 0) // 250 115 48 | 115 250 48
  { OdCmEntityColor entColor((nStyle == 1) ? 250 : 115, (nStyle == 1) ? 115 : 250, 48);
    selStyle.setForColorMasking();
    for (OdUInt16 nBranch = 0; nBranch < 4; nBranch++)
    {
      OdGiSelectionStyle::StyleEntry &styleBranch = selStyle.styleFor(GETBIT(nBranch, 1), GETBIT(nBranch, 2));
      if (styleBranch.edgeStyle().isColorMaskingEnabled())
        styleBranch.edgeStyle().colorMask().setColor(entColor);
      if (styleBranch.faceStyle().isColorMaskingEnabled())
        styleBranch.faceStyle().colorMask().setColor(entColor);
    }
  }
  else
    OdGiContextForDbDatabase::selectionStyle(0, selStyle);
  return 4;
}

この例では、.dwgデータベースコンテキストに対してOdGiContextForDbDatabase::selectionStyleメソッドがオーバーライドされ、4つの異なる選択スタイルが使用されています。

  • 選択スタイル0 — OdGiContextForDbDatabaseによって選択される選択スタイル(SELECTIONEFFECTシステム変数の設定に応じて、拡張またはクラシック)。
  • 選択スタイル1 — 拡張選択スタイルに似たカラーマスキング選択スタイルですが、色は赤です。
  • 選択スタイル2 — 拡張選択スタイルに似たカラーマスキング選択スタイルですが、色は緑です。
  • 選択スタイル3 — OdGiDefaultContext::selectionStyleの実装によって提供されるクラシック選択スタイル。

選択スタイルの構造

選択スタイルの構造を次の図に示します。

 

selection style structure

 

内部的には、ハイライトスタイルは4つのスタイルエントリで表されます。2次元および3次元のビジュアルスタイルに対して異なるスタイルを指定できます。ハイライトは2つのパスで行うことができます。最初のハイライトパスはシーングラフィックのレンダリングと共に行われ、2番目のパスではレンダラーが他のグラフィックシーンオブジェクトの上にハイライト効果を描画します。

シーンジオメトリの上にハイライト効果を描画するには、2つのモードがあります。

  • 描画順序を使用して上部に描画されます。これは2次元ビジュアルスタイルに適用されます。
  • 深度バッファを使用してシーンオブジェクトの上に描画されます。これは3次元ビジュアルスタイルにより適しています。

深度バッファの上にハイライトを表示するには、OdGiSelectionStyle::setOnTopOfDepthメソッドを使用します。

draw order and depth buffer


スタイルエントリの構造:

style entry structure

各スタイルエントリは、個別の面スタイルとエッジスタイルの設定で表されます。

面スタイル

面スタイルの以下のプロパティを制御できます。

  • ジオメトリの表示設定 &mdash ジオメトリの表示設定を有効または無効にするには、OdGiSelectionStyle::ElementStyle::setVisible メソッドを使用します。
  • パターン効果 &mdash ハイライトパターンを有効または無効にするには、OdGiSelectionStyle::ElementStyle::enablePattern メソッドを使用します。
  • カラーマスキング &mdash カラーマスキング効果を有効または無効にするには、OdGiSelectionStyle::ElementStyle::enableColorMasking メソッドを使用します。カラーマスクの色と透明度レベルは、OdGiSelectionStyle::ColorMask クラスメソッドによって変更できます。現在のスタイルの OdGiSelectionStyle::ColorMask クラスは、OdGiSelectionStyle::ElementStyle::colorMask メソッドによって返されます。
Face pattern effect	Face color mask effect

パターン効果とカラーマスク効果は同時に有効にできます。

エッジスタイル

エッジスタイルの以下のプロパティを制御できます。

  • ジオメトリの表示設定 &mdash ジオメトリの表示設定を有効または無効にするには、OdGiSelectionStyle::ElementStyle::setVisible メソッドを使用します。
  • パターン効果 &mdash ハイライトパターンを有効または無効にするには、OdGiSelectionStyle::ElementStyle::enablePattern メソッドを使用します。
  • カラーマスキング &mdash カラーマスキング効果を有効または無効にするには、OdGiSelectionStyle::ElementStyle::enableColorMasking メソッドを使用します。カラーマスクの色と透明度レベルは、OdGiSelectionStyle::ColorMask クラスメソッドによって変更できます。現在のスタイルの OdGiSelectionStyle::ColorMask クラスは、OdGiSelectionStyle::ElementStyle::colorMask メソッドによって返されます。
pattern and mask effect

 

 

パターン効果とカラーマスク効果は同時に有効にできます。

  • エッジモード &mdash 既存のエッジの描画、アイソラインレンダリングの強制、シルエットレンダリングの強制の3つのエッジモードがあります。これらのモードは、OdGiSelectionStyle::EdgeStyle::setMode メソッドを使用して変更できます。
Force isoline edges mode	Force contour edges mode
  • 線幅拡張 &mdash このプロパティはピクセル単位で指定され、OdGiSelectionStyle::EdgeStyle::setLineWeightExtension メソッドを使用して設定できます。デフォルトでは、レンダラーは拡張線の幅にアンチエイリアシング効果を適用し、エッジの角に滑らかなグラデーションを作成します(この効果は「グロー」効果とも呼ばれます)。スムージングのレベルは、AntiAliasHltLevelExt プロパティで制御できます(詳細については、「ODA Vectorization Devices Properties」を参照してください)。これを 0.0 に設定すると、アンチエイリアシング効果が無効になります。

複数の選択スタイルを使用する例

OdGsBaseModelReactor を使用すると、あらゆる種類のデータベースに複数の選択スタイルを使用できます。次の例は、.dwg データベースに複数の選択スタイルを使用する方法を示しています。

まず、OdGsBaseModelReactor から継承した新しいクラスを実装し、OdGsBaseModelReactor::onHighlight メソッドをオーバーライドします。

struct MultipleSelectionStyles : public OdGsBaseModelReactor
{
  OdUInt32 m_nSelStyle;
  MultipleSelectionStyles() : m_nSelStyle(0) { }
  virtual bool onHighlight(OdGsModel * /*pModel*/, const OdGiPathNode & /*path*/, bool /*bDoIt*/, OdUInt32 &nStyle, const OdGsView * /*pView*/)
  { nStyle = m_nSelStyle; return true; }
  virtual bool onHighlight(OdGsModel * /*pModel*/, const OdGiPathNode & /*path*/, const OdGsMarker * /*pMarkers*/, OdUInt32 /*nMarkers*/, bool /*bDoIt*/, OdUInt32 &nStyle, const OdGsView * /*pView*/)
  { nStyle = m_nSelStyle; return true; }
} mSelStyles;

簡略化のため、リアクターと選択スタイルコンテキストのオーバーライド(このトピックの「ハイライトのカスタマイズ方法」セクションから)を1つのクラスにまとめます。

struct Ctx : public OdStaticRxObject<OdGiContextForDbDatabase>, public OdGsBaseModelReactor
{
  OdUInt32 m_nSelStyle;
  Ctx() : m_nSelStyle(0) { }
  virtual OdUInt32 selectionStyle(OdUInt32 nStyle, OdGiSelectionStyle &selStyle) const
  {
    if (nStyle > 2)
      OdGiDefaultContext::selectionStyle(0, selStyle);
    else if (nStyle > 0) // 250 115 48 | 115 250 48
    { OdCmEntityColor entColor((nStyle == 1) ? 250 : 115, (nStyle == 1) ? 115 : 250, 48);
      selStyle.setForColorMasking();
      for (OdUInt16 nBranch = 0; nBranch < 4; nBranch++)
      {
        OdGiSelectionStyle::StyleEntry &styleBranch = selStyle.styleFor(GETBIT(nBranch, 1), GETBIT(nBranch, 2));
        if (styleBranch.edgeStyle().isColorMaskingEnabled())
          styleBranch.edgeStyle().colorMask().setColor(entColor);
        if (styleBranch.faceStyle().isColorMaskingEnabled())
          styleBranch.faceStyle().colorMask().setColor(entColor);
      }
    }
    else
      OdGiContextForDbDatabase::selectionStyle(0, selStyle);
    return 4;
  }
  virtual bool onHighlight(OdGsModel * /*pModel*/, const OdGiPathNode & /*path*/, bool /*bDoIt*/, OdUInt32 &nStyle, const OdGsView * /*pView*/)
  { nStyle = m_nSelStyle; return true; }
  virtual bool onHighlight(OdGsModel * /*pModel*/, const OdGiPathNode & /*path*/, const OdGsMarker * /*pMarkers*/, OdUInt32 /*nMarkers*/, bool /*bDoIt*/, OdUInt32 &nStyle, const OdGsView * /*pView*/)
  { nStyle = m_nSelStyle; return true; }
} _ctx;

リアクターの実装をデータベースグラフィックキャッシュモデルに接続します。

OdGsLayoutHelper::cast(pGsDevuce)->gsModel()->addModelReactor(&_ctx);

次に、グラフィックシーン内で何かをハイライト表示する必要があるときに、リアクターの実装内で選択スタイル番号を変更するだけです。

{ _ctx.m_nSelStyle = 2; // Change selection style.
  // Select entities inside graphics scene and highlight selected.
  OdDbSelectionSetPtr pSSet = OdDbSelectionSet::select(pDb->activeViewportId(), 2, pSelPoints);
  OdDbSelectionSetIteratorPtr pIt = pSSet->newIterator();
  while (!pIt->done())
  {
    OdDbEntityPtr pEnt = pIt->objectId().safeOpenObject();
    pEnt->highlight(true);
    pIt->next();
  }
}

エンティティのハイライト操作ごとに、リアクターの OdGsBaseModelReactor::onHighlight メソッドのオーバーライドが呼び出され、デフォルトの選択スタイルがカスタム選択スタイル値に置き換えられます。

異なる選択スタイルでハイライト表示した結果:

different selection styles

 

今すぐ始める

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

無料で試す