Teigha BIM 中的视觉样式

与 Teigha Drawings 类似,Teigha BIM 也具有用于在视图中渲染元素的视觉样式。然而,在 Teigha Drawings 中,视觉样式是数据库中的独立元素,而在 Teigha BIM 中,视觉样式是视图的一部分。

OdBmDBView 具有 getViewDisplayMgr() 方法,该方法返回一个指向视图显示管理器 (OdBmViewDisplayMgr) 的指针。此管理器允许您设置视图中元素的渲染模式、元素的透明度、边缘可见性以及边缘、轮廓和元素的阴影的抖动效果。

图 1 显示了在 OdaBimApp 中实现的 GUI 界面,用于为活动视图设置视觉样式。

image1

图 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());
}

渲染示例

下图显示了不同的视觉样式。

image2

图 2. 带抖动效果的线框模式。

image3

图 3. 启用抖动效果和 40% 透明度的着色模式。

请注意,在着色模式下不识别纹理。

image4

图 4. 无边缘和 40% 透明度的真实模式。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用