/// <summary> /// Exports the IFC element quantities. /// </summary> /// <param name="exporterIFC">The IFC exporter object.</param> /// <param name="element ">The element whose quantities are exported.</param> /// <param name="productWrapper">The ProductWrapper object.</param> private static void ExportElementQuantities(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper) { if (productWrapper.IsEmpty()) return; IFCFile file = exporterIFC.GetFile(); using (IFCTransaction transaction = new IFCTransaction(file)) { Document doc = element.Document; ElementType elemType = doc.GetElement(element.GetTypeId()) as ElementType; IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle(); ICollection<IFCAnyHandle> productSet = productWrapper.GetAllObjects(); IList<IList<QuantityDescription>> quantitiesToCreate = ExporterCacheManager.ParameterCache.Quantities; foreach (IList<QuantityDescription> currStandard in quantitiesToCreate) { foreach (QuantityDescription currDesc in currStandard) { foreach (IFCAnyHandle prodHnd in productSet) { if (currDesc.IsAppropriateType(prodHnd)) { IFCExtrusionCreationData ifcParams = productWrapper.FindExtrusionCreationParameters(prodHnd); HashSet<IFCAnyHandle> quantities = currDesc.ProcessEntries(file, exporterIFC, ifcParams, element, elemType); if (quantities.Count > 0) { string paramSetName = currDesc.Name; string methodName = currDesc.MethodOfMeasurement; IFCAnyHandle propertySet = IFCInstanceExporter.CreateElementQuantity(file, GUIDUtil.CreateGUID(), ownerHistory, paramSetName, methodName, null, quantities); IFCAnyHandle prodHndToUse = prodHnd; DescriptionCalculator ifcRDC = currDesc.DescriptionCalculator; if (ifcRDC != null) { IFCAnyHandle overrideHnd = ifcRDC.RedirectDescription(exporterIFC, element); if (!IFCAnyHandleUtil.IsNullOrHasNoValue(overrideHnd)) prodHndToUse = overrideHnd; } HashSet<IFCAnyHandle> relatedObjects = new HashSet<IFCAnyHandle>(); relatedObjects.Add(prodHndToUse); IFCInstanceExporter.CreateRelDefinesByProperties(file, GUIDUtil.CreateGUID(), ownerHistory, null, null, relatedObjects, propertySet); } } } } } transaction.Commit(); } }
private static void ExportElementClassifications(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper) { if (productWrapper.IsEmpty()) return; IFCFile file = exporterIFC.GetFile(); using (IFCTransaction transaction = new IFCTransaction(file)) { ICollection<IFCAnyHandle> productSet = productWrapper.GetAllObjects(); foreach (IFCAnyHandle prodHnd in productSet) { // No need to check the subtype since Classification can be assigned to IfcRoot // if (IFCAnyHandleUtil.IsSubTypeOf(prodHnd, IFCEntityType.IfcElement)) ClassificationUtil.CreateClassification(exporterIFC, file, element, prodHnd); } transaction.Commit(); } }
/// <summary> /// Exports the element properties. /// </summary> /// <param name="exporterIFC">The IFC exporter object.</param> /// <param name="element">The element whose properties are exported.</param> /// <param name="productWrapper">The ProductWrapper object.</param> private static void ExportElementProperties(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper) { if (productWrapper.IsEmpty()) return; IFCFile file = exporterIFC.GetFile(); using (IFCTransaction transaction = new IFCTransaction(file)) { Document doc = element.Document; ElementType elemType = doc.GetElement(element.GetTypeId()) as ElementType; IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle(); ICollection<IFCAnyHandle> productSet = productWrapper.GetAllObjects(); IList<IList<PropertySetDescription>> psetsToCreate = ExporterCacheManager.ParameterCache.PropertySets; // In some cases, like multi-story stairs and ramps, we may have the same Pset used for multiple levels. // If ifcParams is null, re-use the property set. ISet<string> locallyUsedGUIDs = new HashSet<string>(); IDictionary<Tuple<Element, Element, string>, IFCAnyHandle> createdPropertySets = new Dictionary<Tuple<Element, Element, string>, IFCAnyHandle>(); IDictionary<IFCAnyHandle, HashSet<IFCAnyHandle>> relDefinesByPropertiesMap = new Dictionary<IFCAnyHandle, HashSet<IFCAnyHandle>>(); foreach (IFCAnyHandle prodHnd in productSet) { IList<PropertySetDescription> currPsetsToCreate = GetCurrPSetsToCreate(prodHnd, psetsToCreate); if (currPsetsToCreate.Count == 0) continue; ElementId overrideElementId = ExporterCacheManager.HandleToElementCache.Find(prodHnd); Element elementToUse = (overrideElementId == ElementId.InvalidElementId) ? element : doc.GetElement(overrideElementId); ElementType elemTypeToUse = (overrideElementId == ElementId.InvalidElementId) ? elemType : doc.GetElement(elementToUse.GetTypeId()) as ElementType; if (elemTypeToUse == null) elemTypeToUse = elemType; IFCExtrusionCreationData ifcParams = productWrapper.FindExtrusionCreationParameters(prodHnd); foreach (PropertySetDescription currDesc in currPsetsToCreate) { // Last conditional check: if the property set comes from a ViewSchedule, check if the element is in the schedule. if (currDesc.ViewScheduleId != ElementId.InvalidElementId) if (!ExporterCacheManager.ViewScheduleElementCache[currDesc.ViewScheduleId].Contains(elementToUse.Id)) continue; Tuple<Element, Element, string> propertySetKey = new Tuple<Element, Element, string>(elementToUse, elemTypeToUse, currDesc.Name); IFCAnyHandle propertySet = null; if ((ifcParams != null) || (!createdPropertySets.TryGetValue(propertySetKey, out propertySet))) { HashSet<IFCAnyHandle> props = currDesc.ProcessEntries(file, exporterIFC, ifcParams, elementToUse, elemTypeToUse); if (props.Count > 0) { int subElementIndex = CheckElementTypeValidityForSubIndex(currDesc, prodHnd, element); string guid = GUIDUtil.CreateSubElementGUID(elementToUse, subElementIndex); if (locallyUsedGUIDs.Contains(guid)) guid = GUIDUtil.CreateGUID(); else locallyUsedGUIDs.Add(guid); string paramSetName = currDesc.Name; propertySet = IFCInstanceExporter.CreatePropertySet(file, guid, ownerHistory, paramSetName, null, props); if (ifcParams == null) createdPropertySets[propertySetKey] = propertySet; } } if (propertySet != null) { IFCAnyHandle prodHndToUse = prodHnd; DescriptionCalculator ifcRDC = currDesc.DescriptionCalculator; if (ifcRDC != null) { IFCAnyHandle overrideHnd = ifcRDC.RedirectDescription(exporterIFC, elementToUse); if (!IFCAnyHandleUtil.IsNullOrHasNoValue(overrideHnd)) prodHndToUse = overrideHnd; } HashSet<IFCAnyHandle> relatedObjects = null; if (!relDefinesByPropertiesMap.TryGetValue(propertySet, out relatedObjects)) { relatedObjects = new HashSet<IFCAnyHandle>(); relDefinesByPropertiesMap[propertySet] = relatedObjects; } relatedObjects.Add(prodHndToUse); } } } foreach (KeyValuePair<IFCAnyHandle, HashSet<IFCAnyHandle>> relDefinesByProperties in relDefinesByPropertiesMap) { IFCInstanceExporter.CreateRelDefinesByProperties(file, GUIDUtil.CreateGUID(), ownerHistory, null, null, relDefinesByProperties.Value, relDefinesByProperties.Key); } transaction.Commit(); } if (ExporterCacheManager.ExportOptionsCache.ExportAs2x2) ExportPsetDraughtingFor2x2(exporterIFC, element, productWrapper); }