与 Teigha Drawings 类似,Teigha BIM 也具有用于在视图中渲染元素的视觉样式。然而,在 Teigha Drawings 中,视觉样式是数据库中的独立元素,而在 Teigha BIM 中,视觉样式是视图的一部分。
OdBmDBView 具有 getViewDisplayMgr() 方法,该方法返回一个指向视图显示管理器 (OdBmViewDisplayMgr) 的指针。此管理器允许您设置视图中元素的渲染模式、元素的透明度、边缘可见性以及边缘、轮廓和元素的阴影的抖动效果。
图 1 显示了在 OdaBimApp 中实现的 GUI 界面,用于为活动视图设置视觉样式。
图 1 OdaBimApp 示例中的图形显示选项对话框。
将视觉样式应用于视图中的元素
下面的代码是图 1 中对话框的“确定”按钮的事件处理程序。它演示了如何设置渲染样式属性。
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 的视觉样式对象。
应将空 objectId 设置为 GsView 以关闭当前视图的视觉样式。
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% 透明度的真实模式。