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
Have you tried calling instance->WriteChanages()?
Answer Verified By: Liam Wilks
That did the trick Daryl. Thankyou very much!