各位老师好,我写了一个函数用来给创建的level分配材质:
但是实际运行发现并没有分配材质成功。经过调试发现获取到的materialid的elementid为一个很大的数字:
这是否表示获取材质失败?请问要如何解决?
创建Level或改变Level的属性后需要重写LevelTable。请在你代码最后调用一下myCache.Write();试一下。
你好,付老师,还是不行。
不知道是不是因为我选择这个材质的代码不对?
var materialId = new MaterialId("Concrete");
请提供一下您当前的代码,我看看您是怎么写的。
extern "C" DLLEXPORT void AttachMaterialToLevel(char *levelName, char *materialName) { //EditLevelHandle editLvlHandle(ISessionMgr::GetActiveDgnFile()->GetLevelCacheR().GetLevelByName(L"myLvl")); WCharCP levelName2 = char2wchar(levelName); WCharCP materialName2 = char2wchar(materialName); EditLevelHandle editLvlHandle(ISessionMgr::GetActiveDgnFile()->GetLevelCacheR().GetLevelByName(levelName2)); MaterialId mateId(materialName2); MaterialSearchStatus localSearchStatus; MaterialList materialList2; MaterialManager::GetManagerR().FindMaterialByNameFromAnySource(&localSearchStatus, materialList2, materialName2, *ACTIVEMODEL, true); for (MaterialList::iterator iter = materialList2.begin(); iter != materialList2.end(); ++iter) { MaterialId mateId1(**iter); LevelDefinitionMaterial lvlDefMate(mateId1.GetElementId(), ISessionMgr::GetActiveDgnFile()); editLvlHandle.SetByLevelMaterial(lvlDefMate); } }
能否远程看一下您的机器?
可以的
对于从lib库中加载的材质需要先复制到当前文件中,才能设置成功,参考如下代码:
LevelHandle lvlHandle= ISessionMgr::GetActiveDgnFile()->GetLevelCacheR().GetLevelByName(L"myLvl", true); EditLevelHandle editLvlHandle(lvlHandle); MaterialSearchStatus localSearchStatus; MaterialList materials; MaterialManager::GetManagerR().FindMaterialByNameFromAnySource(&localSearchStatus, materials, L"BC2 Exterior", *ACTIVEMODEL, true); for (MaterialList::iterator iter = materials.begin(); iter != materials.end(); ++iter) { MaterialCP material = *iter; MaterialId mateId1(*material); MaterialPtr newMaterial = Material::Create(*material, *ACTIVEMODEL); PaletteInfoPtr paletteInfo = PaletteInfo::Create(material->GetPalette().GetName().c_str(), ACTIVEMODEL->GetDgnFileP()->GetDocument().GetMoniker(), material->GetPalette().GetSource(), PaletteInfo::PALETTETYPE_Dgn); newMaterial->GetPaletteR().Copy(*paletteInfo); if (SUCCESS != MaterialManager::GetManagerR().SaveMaterial(&mateId1, *newMaterial, ACTIVEMODEL->GetDgnFileP())) { return; } LevelDefinitionMaterial lvlDefMate(mateId1.GetElementId(), material->GetModelRefR().GetDgnFileP()); editLvlHandle.SetByLevelMaterial(lvlDefMate); LevelCacheErrorCode errorCode= ISessionMgr::GetActiveDgnFile()->GetLevelCacheR().Write(); }
Answer Verified By: fanghua wei
郭老师好,测试了下上述代码,运行没有问题,非常感谢~