[返回博客](/cn/blog) # Teigha BIM 中的视觉样式

Evgeniy Tikhonov 九月 05, 2017 [\#rvt](/cn/blog/tag/rvt) [\#rfa](/cn/blog/tag/rfa) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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

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

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

![image1](/files/inline-images/image001_11.png)图 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](/files/inline-images/image002_5.png)图 2. 带抖动效果的线框模式。

![image3](/files/inline-images/image004_5.png)图 3. 启用抖动效果和 40% 透明度的着色模式。

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

![image4](/files/inline-images/image006_3.png)图 4. 无边缘和 40% 透明度的真实模式。

## 今天就开始行动

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

[免费试用](https://www.opendesign.com/cn/free-trial)
