Teigha Drawingsと同様に、Teigha BIMもビュー内の要素をレンダリングするためのビジュアルスタイルを持っています。ただし、Teigha Drawingsではビジュアルスタイルはデータベース内の個別の要素ですが、Teigha BIMではビジュアルスタイルはビューの一部です。
OdBmDBViewにはgetViewDisplayMgr()メソッドがあり、これはView Display Manager (OdBmViewDisplayMgr)へのポインタを返します。このマネージャーを使用すると、ビュー内の要素のレンダリングモード、要素の透明度、エッジの可視性、およびエッジ、シルエット、要素の影に対するジッター効果を設定できます。
図1は、アクティブなビューのビジュアルスタイルを設定するために使用されるOdaBimAppに実装されたGUIインターフェースを示しています。
図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());
}
レンダリング例
以下の図は、異なるビジュアルスタイルを示しています。
図2. ジッター効果のあるワイヤーフレームモード。
図3. ジッター効果と40%の透明度を有効にしたシェーディングモード。
シェーディングモードではテクスチャが適用されないことに注意してください。
図4. エッジなし、40%の透明度を持つリアルなモード。