/// <summary> /// Launch the IFC Entity tree browser /// </summary> /// <param name="data"></param> /// <returns>status</returns> public bool ShowDialog(IFCExternalServiceUIData data) { HashSet <string> assignedEntities = new HashSet <string>(); HashSet <string> assignedPredef = new HashSet <string>(); string preSelectEnt = null; string preSelectPDef = null; foreach (ElementId elemId in data.GetRevitElementIds()) { Element elem = data.Document.GetElement(elemId); if (elem == null) { continue; } // Collect existing assignments to the "IFC Export Element* As" and "IFC Export Predefined Type*" BuiltInParameter paramName = (elem is ElementType) ? BuiltInParameter.IFC_EXPORT_ELEMENT_TYPE_AS : BuiltInParameter.IFC_EXPORT_ELEMENT_AS; string assignedEnt = elem?.get_Parameter(paramName)?.AsString(); if (string.IsNullOrEmpty(assignedEnt)) { assignedEntities.Add("<null>"); } else { assignedEntities.Add(assignedEnt); } BuiltInParameter pdefParName = (elem is ElementType) ? BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE_TYPE : BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE; string pdefSel = elem?.get_Parameter(pdefParName)?.AsString(); if (string.IsNullOrEmpty(pdefSel)) { assignedPredef.Add("<null>"); } else { assignedPredef.Add(pdefSel); } } // Set the entity and predefined type if they are all the same and not null. This is to be used to preselect them in the UI if (assignedEntities.Count == 1 && !assignedEntities.First().Equals("<null>")) { preSelectEnt = assignedEntities.First(); } if (assignedPredef.Count == 1 && !assignedPredef.First().Equals("<null>")) { preSelectPDef = assignedPredef.First(); } using (Transaction tr = new Transaction(data.Document)) { try { tr.Start("IFC Entity Selection"); } catch {} bool showTypeNodeOnly = data.ParamId.IntegerValue == (int)BuiltInParameter.IFC_EXPORT_ELEMENT_TYPE_AS || data.ParamId.IntegerValue == (int)BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE_TYPE; EntityTree theTree = new EntityTree(showTypeNodeOnly, preSelectEntity: preSelectEnt, preSelectPdef: preSelectPDef); bool?ret = theTree.ShowDialog(); if (ret.HasValue && ret.Value == true) { string selEntity = theTree.GetSelectedEntity(); string selPDef = theTree.GetSelectedPredefinedType(); data.IsReset = theTree.isReset; foreach (ElementId elemId in data.GetRevitElementIds()) { Element elem = data.Document.GetElement(elemId); if (elem == null) { continue; } if (data.ParamId.IntegerValue == (int)BuiltInParameter.IFC_EXPORT_ELEMENT_TYPE_AS || data.ParamId.IntegerValue == (int)BuiltInParameter.IFC_EXPORT_ELEMENT_AS) { BuiltInParameter paramName = (elem is ElementType) ? BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE_TYPE : BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE; elem?.get_Parameter(paramName)?.Set(selPDef); data.SelectedIFCItem = selEntity; } else if (data.ParamId.IntegerValue == (int)BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE_TYPE || data.ParamId.IntegerValue == (int)BuiltInParameter.IFC_EXPORT_PREDEFINEDTYPE) { BuiltInParameter paramName = (elem is ElementType) ? BuiltInParameter.IFC_EXPORT_ELEMENT_TYPE_AS : BuiltInParameter.IFC_EXPORT_ELEMENT_AS; elem?.get_Parameter(paramName)?.Set(selEntity); data.SelectedIFCItem = selPDef; } } if (tr.HasStarted()) { tr.Commit(); } return(true); } } return(false); }