在 Teigha BIM 中使用资产辅助类创建纹理材质

Teigha BIM 支持十四种默认材质:陶瓷、混凝土、通用、玻璃、硬木、砌体混凝土砌块、金属、金属漆、镜面、塑料乙烯基、实心玻璃、石材、墙面漆和水。每种材质都有一个渲染资产,其中包含材质渲染属性,例如颜色、完成样式、凹凸等。也可以为材质定义纹理。

几乎所有默认材质都支持纹理——纹理不仅适用于金属、镜面和水材质。纹理可以用作元素的“皮肤”,也可以使用位图文件为材质定义修饰效果。要访问或设置材质的纹理,应使用相应的属性。例如,可以在“stone_color”属性中为石材设置纹理,但石材材质也有“stone_pattern_map”,它定义了材质的修饰样式。

Teigha BIM 提供了 OdBmAppearanceAssetHelper 类来创建内置材质并访问材质属性。可以在辅助类构造函数中为材质设置默认纹理。其他纹理可以通过材质属性访问。要获取、设置或修改材质纹理的数据,可以使用辅助类 OdBmUnifiedBitmapSchemaHelper。

创建带有纹理的新通用材质的示例:

OdBmMaterialElemPtr pMaterialElem = OdBmMaterialElem::createObject();
OdBmMaterialTrackingPtr pMaterialTrackingMgr = pDb->getAppInfo(OdBm::ManagerType::MaterialTracking);
OdBmObjectId matObjId = pMaterialTrackingMgr->addMaterial(L"Textured_Material", pMaterialElem);
pMaterialElem->setDatabaseDefaults(pDb);

OdBmAppearanceAssetElemPtr pAppAsset = OdBmAppearanceAssetElem::createObject();
OdBmAppearanceAssetHelper appAssetHelper = OdBmAppearanceAssetHelper(pDb, pMaterialElem->getName(), pAppAsset, OdBm::PredefinedAppearanceAsset::kGeneric, L"texture.png");
OdBmMaterialPtr pMaterial = pMaterialElem->getMaterial();
appAssetHelper.applyToMaterial(pMaterial);

// set properties of material texture
OdBmAssetPtr textureAsset;
OdTf::ErrorStatus es = appAssetHelper.getTextureAsset(textureAsset);
OdBmUnifiedBitmapSchemaHelper textureHelper(textureAsset);

textureHelper.setLinkTextureTransforms(true);
textureHelper.setOffsetLock(true);
textureHelper.setRealWorldOffset(OdGePoint2d(50., 50.), OdBm::kDUT_DECIMAL_INCHES);
textureHelper.setRealWorldScale(OdGePoint2d(50., 50.), OdBm::kDUT_DECIMAL_INCHES);
textureHelper.setScaleLock(false);
textureHelper.setUVRepeat(true, true);
textureHelper.setWAngle(OdaPI4);
textureHelper.setBlur(1.5);
textureHelper.setFiltering(1);
textureHelper.setInvert(false);

访问数据库中现有材质纹理的示例。

OdBmDatabasePtr pDbDst = app->readFile(L"myMaterial_tmp.rvt", true);
OdBmMaterialElemPtr pMaterialElem = pDbDst->getObjectId(0xFEEE).safeOpenObject();

OdBmAppearanceAssetElemPtr pAppearanceAssetElem = pMaterialElem->getMaterial()->getAppearanceAssetId().safeOpenObject();
OdBmAppearanceAssetHelper appAssetHelper = OdBmAppearanceAssetHelper(pAppearanceAssetElem);
// set properties of default (in diffuse channel) material texture
OdBmAssetPtr textureAsset;
OdTf::ErrorStatus es = appAssetHelper.getTextureAsset(textureAsset);
OdBmUnifiedBitmapSchemaHelper textureHelper(textureAsset);

访问数据库中现有材质纹理的示例。使用了一些附加功能。

static OdString getSchemaName(const OdBmAsset* pAsset) 
{
  OdString schemaName;
  if (pAsset->getAPropertyString(ASSET_PROP_UIDEFINITION, schemaName) == OdTf::eOk) 
  {
    schemaName.replace(L"\\", L"/");
    OdInt32 nSlashPos = schemaName.reverseFind(L"/")+1;
    schemaName = schemaName.mid(nSlashPos, schemaName.find(L"UI.xml")-nSlashPos);
  }
  else 
    schemaName = pAsset->getName().left(pAsset->getName().find(L"Schema"));

  return schemaName;
}

主代码:

OdBmDatabasePtr pDbDst = app->readFile(L"Stone.rfa", true);
OdBmMaterialElemPtr pMaterialElem = pDbDst->getObjectId(0xFEEE).safeOpenObject();
OdBmAssetPtr pAsset = pMaterialElem ->getMaterial()->getAsset();
OdBmAPropertyPtr pProperty;
if (pAsset->getAProperty(L”stone_pattern_map”, pProperty) && !pProperty.isNull()) 
{
  OdBmObjectPtrArray connAssets;
  pProperty->getAConnected(connAssets);
  for(OdBmObjectPtrArray::const_iterator it = connAssets.begin(); it != connAssets.end(); it++) 
  {
    OdBmAssetPtr pBitmapAsset = *it;
    OdString schemaName = ::getSchemaName(pBitmapAsset);
    if (schemaName.iCompare(L"UnifiedBitmap") != 0)
      continue;

    OdBmUnifiedBitmapSchemaHelper helper(pBitmapAsset);
    // work with texture mapping
    break;    
  }
}

今天就开始行动

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

免费试用