Teigha BIMのビジュアルスタイル

Teigha Drawingsと同様に、Teigha BIMもビュー内の要素をレンダリングするためのビジュアルスタイルを持っています。ただし、Teigha Drawingsではビジュアルスタイルはデータベース内の個別の要素ですが、Teigha BIMではビジュアルスタイルはビューの一部です。

OdBmDBViewにはgetViewDisplayMgr()メソッドがあり、これはView Display Manager (OdBmViewDisplayMgr)へのポインタを返します。このマネージャーを使用すると、ビュー内の要素のレンダリングモード、要素の透明度、エッジの可視性、およびエッジ、シルエット、要素の影に対するジッター効果を設定できます。

図1は、アクティブなビューのビジュアルスタイルを設定するために使用されるOdaBimAppに実装されたGUIインターフェースを示しています。

image1

図1 OdaBimAppの例におけるグラフィック表示オプションダイアログ。

ビュー内の要素にビジュアルスタイルを適用する

以下のコードは、図1のダイアログのOKボタンのイベントハンドラです。レンダリングスタイルのプロパティを設定する方法を示しています。

void ViewDisplayStyleDialog::OnBnClickedOk()
{
  m_pDBView->upgradeOpenMode();
  const OdBmViewDisplayMgrPtr& pVDM = m_pDBView->getViewDisplayMgr();
  OdBmViewDisplayModelPtr pModel = pVDM->getModel();
  pModel->setTransparency(m_nTransparencyEditValue);
  pModel->setEdges(m_bShowEdges);

  switch (m_nDisplayStyle)
  {
  case ViewDisplayStyleDialog::kWireframe:
    pModel->setDisplayStyle(OdBm::ViewDisplayStyle::Wireframe);
    break;
  case ViewDisplayStyleDialog::kHiddenLine:
    pModel->setDisplayStyle(OdBm::ViewDisplayStyle::HiddenLine);
    break;
  case ViewDisplayStyleDialog::kShaded:
    if (m_bShowEdges)
      pModel->setDisplayStyle(OdBm::ViewDisplayStyle::ShadedWithEdges);
    else
      pModel->setDisplayStyle(OdBm::ViewDisplayStyle::Shaded);
    break;
  case ViewDisplayStyleDialog::kConsistentColors:
    pModel->setDisplayStyle(OdBm::ViewDisplayStyle::ConsistentColors);
    break;
  case ViewDisplayStyleDialog::kRealistic:
    if (m_bShowEdges)
      pModel->setDisplayStyle(OdBm::ViewDisplayStyle::RealisticWithEdges);
    else
      pModel->setDisplayStyle(OdBm::ViewDisplayStyle::Realistic);
    break;
  default:
    break;
  }
  OdBmViewDisplaySketchyLinesPtr pSketchyLines = pVDM->getSketchyLines();
  if (!pSketchyLines.isNull()) {
    pSketchyLines->setEnableSketchyLines(m_bSketchyLines);
    pSketchyLines->setJitter(m_nJitterSliderValue);
    pSketchyLines->setExtension(m_nExtensionSliderValue);
  }
  OdBmViewDisplayShadowsPtr pShadows = pVDM->getShadows();
  if (!pShadows.isNull()) {
    pShadows->setCastShadows(m_bCatShadows);
    pShadows->setAmbientShadows(m_bAmbientShadows);
  }
  m_pDBView->downgradeOpenMode();

  CString str1;
  int len = m_SilhouettesStyles.GetLBTextLen(m_SilhouettesStyles.GetCurSel());
  m_SilhouettesStyles.GetLBText(m_SilhouettesStyles.GetCurSel(), str1.GetBuffer(len));
  std::map<OdString, OdBmObjectId>::const_iterator it = 
    m_SilhouetteLines.find(str1.GetBuffer());
  if (it != m_SilhouetteLines.end())
    pModel->setSilhouetteEdgesGStyleId(it->second);
  else
    pModel->setSilhouetteEdgesGStyleId(OdBmObjectId());

  CDialog::OnOK();
  m_nModalResult = IDOK;
}

これにより、レンダリングスタイルとエフェクトパラメータは変更されますが、要素のレンダリングには変更が適用されません。このためには、アクティブなDbViewをアクティブなGsViewのビジュアルスタイルオブジェクトとして設定する必要があります。

現在のビューのビジュアルスタイルをオフにするには、GsViewに空のobjectIdを設定する必要があります。

void OdaBimExViewer::OnViewGraphicDisplayOptions() {
  OdBmDBViewPtr pDBView = getActiveDbView();
  ViewDisplayStyleDialog viewDisplayStyleDialog(pDBView);
  OdGsView* pView = getActiveView();
  viewDisplayStyleDialog.DoModal();
  int modalResult = viewDisplayStyleDialog.GetModalResult();
  if (modalResult == IDOK)
    pView->setVisualStyle(pDBView->objectId());
  else if (modalResult == IDCANCEL)
    pView->setVisualStyle(OdBmObjectId());
  PostMessage(WM_PAINT);
}

レンダリングデバイスのサポート

すべてのレンダリングデバイスがビジュアルスタイルをサポートしているわけではありません。

Teighaは、WinGLESS2デバイスに対してビジュアルスタイルとレンダリングエフェクトのサポートを提供します。ビジュアルスタイルを有効にするには、デバイスの「UseVisualStyles」プロパティを設定します。

OdString devicePath = theApp.settings().getGsDevicePath();
if (devicePath.isEmpty()) return;

setDevicePath(devicePath);

OdGsModulePtr pGs = ::odrxDynamicLinker()->loadModule(devicePath, false);
OdGsDevicePtr pDevice = pGs->createDevice();

OdRxDictionaryPtr pProperties = pDevice->properties();
if (!pProperties.isNull()) 
{
    ...
    if (pProperties->has(OD_T("UseVisualStyles"))) // Check if property is supported
         pProperties->putAt(OD_T("UseVisualStyles"), OdRxVariantValue(true));
}
...

ビジュアルスタイルを設定する別の例:

{
  OdGsView* pView = pDevice->viewAt(0);
  OdBmDBDrawingInfoPtr pDBDrawingInfo = pDb->getAppInfo(OdBm::ManagerType::DBDrawingInfo);
  OdBmDBDrawingPtr pCurrDrawing = pDBDrawingInfo->getActiveDBDrawingId().safeOpenObject();
  OdBmObjectIdArray viewports;
  pCurrDrawing->getViewports(viewports);
  OdBmViewportPtr pViewport = viewports[0].safeOpenObject();

  OdBmDBViewPtr pDbView = pViewport->getDbViewId().safeOpenObject();
  pDBView->upgradeOpenMode();
  pDBView->setDisplayStyle(OdBm::ViewDisplayStyle::ShadedWithEdges);
  pDBView->setTransparency(70);
  pDBView->setShowEdges(true);
  pDBView->setEnableSketchyLines(true);
  pDBView->setJitter(10);
  pDBView->setExtension(10);  
  pView->setVisualStyle(pDBView->objectId());
}

レンダリング例

以下の図は、異なるビジュアルスタイルを示しています。

image2

図2. ジッター効果のあるワイヤーフレームモード。

image3

図3. ジッター効果と40%の透明度を有効にしたシェーディングモード。

シェーディングモードではテクスチャが適用されないことに注意してください。

image4

図4. エッジなし、40%の透明度を持つリアルなモード。

今すぐ始める

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

無料で試す