Hi All,
I am attempting to write a simple utility to set the template override for a Terrain model element.I've figured out how to access the EC attributes that set these properties but seem to be missing something.
If I apply a template override by hand through the properties dialog everything works as expected.
However, if I try and do it programattically it does not seem to apply the template ID. The Override Symbology flag is set successfully, however the template ID remains at -1.My code is shown below:
bool ECGetter::SetOverride() { // Set scope to selected element FindInstancesScopePtr scope = FindInstancesScope::CreateScope(m_elem, FindInstancesScopeOption(DgnECHostType::Element)); // Search through all classes on selected element ECQueryPtr query = ECQuery::CreateQuery(ECQUERY_PROCESS_SearchAllClasses); // Create EC instance iterator DgnECInstanceIterable iterable = Bentley::DgnPlatform::DgnECManager::GetManager().FindInstances(*scope, *query); WString classText; // Iterate through EC Class Instances for (DgnECInstanceIterable::const_iterator it = iterable.begin(); it != iterable.end(); ++it) { DgnECInstancePtr instance = *it; ECN::ECClassCR instanceClass = instance->GetClass(); // Check if we have a "CifDTMElement" ie OpenRoads Terrain if (instanceClass.GetName() == L"CifDTMElement") { // Switch on override symboloy instance->SetValue(L"OverrideSymbology", ECValue(true)); // Name of template I wish to apply WCharCP temp_path = L"Terrain Feature\\Existing\\E-Contours HATCH"; ElementId tID; // See if we can retrieve an id for this template if (ETSTATUS_Success != ElementTemplateUtils::GetTemplateIDFromPath(&tID, temp_path, ACTIVEMODEL->GetDgnFileP())) { // If no template id, see what dgnlib this template exists in DgnFileR TemplateDgnLibRef = *MstnElementTemplateMgr::GetDgnlibContainingTemplate(temp_path); // Get an ElementTemplateNodePtr for the template we want ElementTemplateNodePtr pTempl = ElementTemplateUtils::FindTemplateNodeByPath(temp_path, TemplateDgnLibRef); DgnFileR activeDGNRef = *ACTIVEMODEL->GetDgnFileP(); // Copy the template from the dgnlib to the active file pTempl = MstnElementTemplateMgr::CopyTemplateToFile(*pTempl, activeDGNRef); // Commit template to active file (I think?) pTempl->ClearCachedInstances(); pTempl->Write(); pTempl->ReloadXAttributeData(); // Retrieve the template ID of the newly copied template ElementTemplateUtils::GetTemplateIDFromPath(&tID, temp_path, ACTIVEMODEL->GetDgnFileP()); instance->SetValue(L"WantMajorContours", ECValue(true)); instance->SetValue(L"WantMinorContours", ECValue(true)); } // Set the "OSTemplate" attribute to the template ID instance->SetValue(L"OSTemplate", ECValue(static_cast<long long>(tID))); } } return true; }
There is not a lot of documentation around about this, so I thought Id throw this out into the forum to see if anyone has any experience.
Any ideas why the above code may not be working?
Thanks
Liam