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;
}
}