[返回博客](/cn/blog) # BimRv SDK：材质和外观资产（第 1 部分，共 2 部分）

Evgeniy Tikhonov 七月 04, 2019 [\#rvt](/cn/blog/tag/rvt) [\#rfa](/cn/blog/tag/rfa)

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

#### 使用辅助类处理外观资产

.rvt/.rfa 文件中的材质包含用于在不同视图中渲染实体的属性。定义材质的属性被组织成资产。

- 外观属性 — 控制材质在真实视图和光线追踪视图中的显示方式。
- 图形属性 — 控制材质在其他视图中的显示方式。
- 物理属性 — 用于结构分析。
- 热属性 — 用于能量分析。

一个材质最多可以有四种资产，每种类型一个，但不能有多个相同类型的资产。通常，资产是控制对象某些特征或行为的属性组。资产可以相互连接。

每个属性都是 OdBmAProperty 类型的后代，可以通过 OdBmAsset 类的 getAProperty 方法访问：

```
template <class T> 
bool getAProperty(const OdString &parameter, OdSmartPtr<T> &value)

```

为了简化对资产中属性的访问，BimRv SDK 提供了以下辅助类：

- OdBmAppearanceAssetHelper
- OdBmStructuralAssetHelper
- OdBmThermalAssetHelper

AppearanceAssetHelper 类提供了多种方法来访问材质数据：

- 访问资产的名称：  
     OdResult getName(OdString&amp;) const;  
     void setName(const OdString&amp;);
- 将外观资产中定义的属性应用于材质对象：  
     void applyToMaterial(OdBmMaterialPtr&amp;);
- 返回定义材质外观的连接资产数组：  
     OdResult getAppearanceAssets(OdBmObjectPtrArray&amp; pAssets) const;
- 根据资产名称返回资产类型：  
     OdBm::PredefinedAppearanceAsset::Enum getSchemaType() const;

还有静态方法：

- 使用指定预定义资产的属性填充资产：  
     static OdResult fillAppearanceAssetWith(OdBmAssetPtr&amp;,  
     OdBm::PredefinedAppearanceAsset::Enum,  
     const OdString&amp; texture = OdString::kEmpty);
- 仅当资产定义材质外观的位图时才返回连接的资产。  
     static OdResult getTextureAsset(const OdBmAssetPtr&amp;,  
     OdBmAssetPtr&amp;, const OdString&amp; propertyName = OdString::kEmpty);
- 根据资产名称返回资产类型：  
     static OdBm::PredefinedAppearanceAsset::Enum  
     getSchemaType(const OdBmAssetPtr&amp;);

通用材质在渲染视图（真实和光线追踪）中的外观可以是以下类型之一：图像、棋盘格、渐变、大理石、噪点、斑点、瓷砖、波浪或木材。

目前已实现用于处理图像和噪点资源的辅助程序。

要处理图像资源，请使用 OdBmUnifiedBitmapSchemaHelper；要处理噪点资源，请使用 OdBmNoiseSchemaHelper。以下示例展示了如何使用辅助程序：

```
OdBmDatabasePtr pDb = app->readFile("modern_villa_floor.rvt");
  OdBmMaterialElemPtr pMatElem = 
pDb->getObjectId(OdDbHandle(400770)).safeOpenObject();
  OdBmMaterialPtr pMaterial = pMatElem->getMaterial();
  OdBmObjectPtrArray pAssets;
  OdBmAppearanceAssetHelper 
helper(pMaterial->getAppearanceAssetId().safeOpenObject());
  helper.getAppearanceAssets(pAssets);
  OdBmAssetPtr pAsset = pAssets[0];
  OdBm::PredefinedAppearanceAsset::Enum type =    OdBmAppearanceAssetHelper::getSchemaType(pAsset);
       // type == OdBm::PredefinedAppearanceAsset::Noise;
  OdBmNoiseSchemaHelper nhelper(pAsset);
  OdBmAssetPtr noise1;
  nhelper.getAppearanceAsset1(noise1);
  OdBmUnifiedBitmapSchemaHelper bhelper(noise1);
  OdString filename;
  bhelper.getTextureFileName(filename);
 
```

本系列文章的下一部分将展示辅助类方法以及创建新材质的详细信息。

## 今天就开始行动

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

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