/// <summary> /// Gets IFCElementComposition types having "COMPLEX","ELEMENT","PARTIAL" values for levels /// </summary> /// <param name="element">The element </param> public static IFCElementComposition GetElementCompositionTypeOverride(Element element) { string nameOverride = "IfcElementCompositionType"; // If the IfcElementCompositionType is not set by the user, // it sets the value to .ELEMENT by default string overrideValue = NamingUtil.GetOverrideStringValue(element, nameOverride, "Element"); IFCElementComposition ifcElementCompositionType; if (Enum.TryParse <IFCElementComposition>(overrideValue, true, out ifcElementCompositionType)) { return(ifcElementCompositionType); } return(IFCElementComposition.Element); }
public void SingleMaterialOverride(ElementId materialId, double materialWidth) { Material material = m_Element.Document.GetElement(materialId) as Material; string layerName = "Layer"; if (material != null) { layerName = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Name", material.Name); } Tuple <ElementId, string, double> matInfo = new Tuple <ElementId, string, double>(materialId, layerName, materialWidth); MaterialIds.Add(matInfo); IFCAnyHandle singleMaterialOverrideHnd = IFCInstanceExporter.CreateMaterial(m_ExporterIFC.GetFile(), layerName, null, null); ExporterCacheManager.MaterialHandleCache.Register(MaterialIds[0].Item1, singleMaterialOverrideHnd); MaterialLayerSetHandle = singleMaterialOverrideHnd; }
private void GetFabricSheetParams(FabricSheet sheet) { if (sheet == null) { return; } MeshLength = sheet.CutOverallLength; MeshWidth = sheet.CutOverallWidth; if (sheet == null) { return; } Document doc = sheet.Document; Element fabricSheetTypeElem = doc?.GetElement(sheet.GetTypeId()); FabricSheetType fabricSheetType = fabricSheetTypeElem as FabricSheetType; SteelGrade = NamingUtil.GetOverrideStringValue(sheet, "SteelGrade", null); Element majorFabricWireTypeElem = doc?.GetElement(fabricSheetType?.MajorDirectionWireType); FabricWireType majorFabricWireType = (majorFabricWireTypeElem == null) ? null : (majorFabricWireTypeElem as FabricWireType); if (majorFabricWireType != null) { LongitudinalBarNominalDiameter = UnitUtil.ScaleLength(majorFabricWireType.WireDiameter); double localRadius = LongitudinalBarNominalDiameter / 2.0; LongitudinalBarCrossSectionArea = localRadius * localRadius * Math.PI; } Element minorFabricWireTypeElem = doc?.GetElement(fabricSheetType?.MinorDirectionWireType); FabricWireType minorFabricWireType = (minorFabricWireTypeElem == null) ? null : (minorFabricWireTypeElem as FabricWireType); if (minorFabricWireType != null) { TransverseBarNominalDiameter = UnitUtil.ScaleLength(minorFabricWireType.WireDiameter); double localRadius = TransverseBarNominalDiameter / 2.0; TransverseBarCrossSectionArea = localRadius * localRadius * Math.PI; } LongitudinalBarSpacing = UnitUtil.ScaleLength(fabricSheetType.MajorSpacing); TransverseBarSpacing = UnitUtil.ScaleLength(fabricSheetType.MinorSpacing); }
/// <summary> /// Collect information about material layer. /// For IFC4RV Architectural exchange, it will generate IfcMatrialConstituentSet along with the relevant IfcShapeAspect and the width in the quantityset /// For IFC4RV Structural exchange, it will generate multiple components as IfcBuildingElementPart for each layer /// For others IfcMaterialLayer will be created /// </summary> private void CollectMaterialLayerSet() { ElementId typeElemId = m_Element.GetTypeId(); MaterialIds = new List <Tuple <ElementId, string, double> >(); IFCAnyHandle materialLayerSet = ExporterCacheManager.MaterialSetCache.FindLayerSet(typeElemId); // Roofs with no components are only allowed one material. We will arbitrarily choose the thickest material. PrimaryMaterialHandle = ExporterCacheManager.MaterialSetCache.FindPrimaryMaterialHnd(typeElemId); if (IFCAnyHandleUtil.IsNullOrHasNoValue(materialLayerSet)) { List <double> widths = new List <double>(); List <MaterialFunctionAssignment> functions = new List <MaterialFunctionAssignment>(); HostObjAttributes hostObjAttr = m_Element.Document.GetElement(typeElemId) as HostObjAttributes; if (hostObjAttr == null) { // It does not have the HostObjAttribute (where we will get the compound structure for material layer set. // We will define a single material instead and create the material layer set of this single material if there is enough information (At least Material id and thickness) FamilyInstance familyInstance = m_Element as FamilyInstance; if (familyInstance == null) { return; } FamilySymbol familySymbol = familyInstance.Symbol; ICollection <ElementId> famMatIds = familySymbol.GetMaterialIds(false); if (famMatIds.Count == 0) { // For some reason Plate type may not return any Material id ElementId baseMatId = CategoryUtil.GetBaseMaterialIdForElement(m_Element); Material material = m_Element.Document.GetElement(baseMatId) as Material; if (material == null) { return; } string layerName = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Name", material.Name); double matWidth = 0.0; Parameter thicknessPar = familySymbol.get_Parameter(BuiltInParameter.CURTAIN_WALL_SYSPANEL_THICKNESS); if (thicknessPar != null) { matWidth = thicknessPar.AsDouble(); } widths.Add(matWidth); if (baseMatId != ElementId.InvalidElementId) { MaterialIds.Add(new Tuple <ElementId, string, double>(baseMatId, layerName, matWidth)); } // How to get the thickness? For CurtainWall Panel (PanelType), there is a builtin parameter CURTAINWALL_SYSPANEL_THICKNESS functions.Add(MaterialFunctionAssignment.None); } else { foreach (ElementId matid in famMatIds) { // How to get the thickness? For CurtainWall Panel (PanelType), there is a builtin parameter CURTAINWALL_SYSPANEL_THICKNESS Parameter thicknessPar = familySymbol.get_Parameter(BuiltInParameter.CURTAIN_WALL_SYSPANEL_THICKNESS); double matWidth = 0.0; if (thicknessPar == null) { matWidth = ParameterUtil.GetSpecialThicknessParameter(familySymbol); } else { matWidth = thicknessPar.AsDouble(); } if (MathUtil.IsAlmostZero(matWidth)) { continue; } widths.Add(matWidth); ElementId baseMatId = CategoryUtil.GetBaseMaterialIdForElement(m_Element); if (matid != ElementId.InvalidElementId) { Material material = m_Element.Document.GetElement(matid) as Material; if (material != null) { string layerName = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Name", material.Name); MaterialIds.Add(new Tuple <ElementId, string, double>(matid, layerName, matWidth)); } } else { MaterialIds.Add(new Tuple <ElementId, string, double>(baseMatId, null, matWidth)); } functions.Add(MaterialFunctionAssignment.None); } } } else { ElementId baseMatId = CategoryUtil.GetBaseMaterialIdForElement(m_Element); CompoundStructure cs = hostObjAttr.GetCompoundStructure(); if (cs != null) { double scaledOffset = 0.0, scaledWallWidth = 0.0, wallHeight = 0.0; Wall wall = m_Element as Wall; if (wall != null) { scaledWallWidth = UnitUtil.ScaleLength(wall.Width); scaledOffset = -scaledWallWidth / 2.0; BoundingBoxXYZ boundingBox = wall.get_BoundingBox(null); if (boundingBox != null) { wallHeight = boundingBox.Max.Z - boundingBox.Min.Z; } } //TODO: Vertically compound structures are not yet supported by export. if (!cs.IsVerticallyHomogeneous() && !MathUtil.IsAlmostZero(wallHeight)) { cs = cs.GetSimpleCompoundStructure(wallHeight, wallHeight / 2.0); } for (int ii = 0; ii < cs.LayerCount; ++ii) { double matWidth = cs.GetLayerWidth(ii); //if (MathUtil.IsAlmostZero(matWidth)) // continue; ElementId matId = cs.GetMaterialId(ii); if (matId != ElementId.InvalidElementId) { Material material = m_Element.Document.GetElement(matId) as Material; if (material != null) { string layerName = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Name", material.Name); MaterialIds.Add(new Tuple <ElementId, string, double>(matId, layerName, matWidth)); } } else { MaterialIds.Add(new Tuple <ElementId, string, double>(baseMatId, null, matWidth)); } widths.Add(matWidth); // save layer function into ProductWrapper, // it's used while exporting "Function" of Pset_CoveringCommon functions.Add(cs.GetLayerFunction(ii)); } } if (MaterialIds.Count == 0) { double matWidth = cs != null?cs.GetWidth() : 0.0; widths.Add(matWidth); if (baseMatId != ElementId.InvalidElementId) { Material material = m_Element.Document.GetElement(baseMatId) as Material; if (material != null) { string layerName = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Name", material.Name); MaterialIds.Add(new Tuple <ElementId, string, double>(baseMatId, layerName, matWidth)); } } functions.Add(MaterialFunctionAssignment.None); } } if (m_ProductWrapper != null) { m_ProductWrapper.ClearFinishMaterials(); } // We can't create IfcMaterialLayers without creating an IfcMaterialLayerSet. So we will simply collate here. IList <IFCAnyHandle> materialHnds = new List <IFCAnyHandle>(); IList <int> widthIndices = new List <int>(); double thickestLayer = 0.0; for (int ii = 0; ii < MaterialIds.Count; ++ii) { // Require positive width for IFC2x3 and before, and non-negative width for IFC4. if (widths[ii] < -MathUtil.Eps()) { continue; } bool almostZeroWidth = MathUtil.IsAlmostZero(widths[ii]); if (!ExporterCacheManager.ExportOptionsCache.ExportAs4 && almostZeroWidth) { continue; } if (almostZeroWidth) { widths[ii] = 0.0; } IFCAnyHandle materialHnd = CategoryUtil.GetOrCreateMaterialHandle(m_ExporterIFC, MaterialIds[ii].Item1); if (PrimaryMaterialHandle == null || (widths[ii] > thickestLayer)) { PrimaryMaterialHandle = materialHnd; thickestLayer = widths[ii]; } widthIndices.Add(ii); materialHnds.Add(materialHnd); if ((m_ProductWrapper != null) && (functions[ii] == MaterialFunctionAssignment.Finish1 || functions[ii] == MaterialFunctionAssignment.Finish2)) { m_ProductWrapper.AddFinishMaterial(materialHnd); } } int numLayersToCreate = widthIndices.Count; if (numLayersToCreate == 0) { MaterialLayerSetHandle = materialLayerSet; return; } // If it is a single material, check single material override (only IfcMaterial without IfcMaterialLayerSet with only 1 member) if (numLayersToCreate == 1 && ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { string paramValue; ParameterUtil.GetStringValueFromElementOrSymbol(m_Element, "IfcSingleMaterialOverride", out paramValue); if (!string.IsNullOrEmpty(paramValue)) { IFCAnyHandle singleMaterialOverrideHnd = IFCInstanceExporter.CreateMaterial(m_ExporterIFC.GetFile(), paramValue, null, null); ExporterCacheManager.MaterialHandleCache.Register(MaterialIds[0].Item1, singleMaterialOverrideHnd); MaterialLayerSetHandle = singleMaterialOverrideHnd; return; } } IFCFile file = m_ExporterIFC.GetFile(); Document document = ExporterCacheManager.Document; IList <IFCAnyHandle> layers = new List <IFCAnyHandle>(numLayersToCreate); IList <Tuple <string, IFCAnyHandle> > layerWidthQuantities = new List <Tuple <string, IFCAnyHandle> >(); HashSet <string> layerNameUsed = new HashSet <string>(); double totalWidth = 0.0; for (int ii = 0; ii < numLayersToCreate; ii++) { int widthIndex = widthIndices[ii]; double scaledWidth = UnitUtil.ScaleLength(widths[widthIndex]); string layerName = "Layer"; string description = null; string category = null; int? priority = null; IFCLogical?isVentilated = null; int isVentilatedValue; Material material = document.GetElement(MaterialIds[ii].Item1) as Material; if (material != null) { if (ParameterUtil.GetIntValueFromElement(material, "IfcMaterialLayer.IsVentilated", out isVentilatedValue) != null) { if (isVentilatedValue == 0) { isVentilated = IFCLogical.False; } else if (isVentilatedValue == 1) { isVentilated = IFCLogical.True; } } if (ExporterCacheManager.ExportOptionsCache.ExportAs4) { layerName = MaterialIds[ii].Item2; if (string.IsNullOrEmpty(layerName)) { layerName = "Layer"; } // Ensure layer name is unique layerName = NamingUtil.GetUniqueNameWithinSet(layerName, ref layerNameUsed); description = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Description", IFCAnyHandleUtil.GetStringAttribute(materialHnds[ii], "Description")); category = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Category", IFCAnyHandleUtil.GetStringAttribute(materialHnds[ii], "Category")); int priorityValue; if (ParameterUtil.GetIntValueFromElement(material, "IfcMaterialLayer.Priority", out priorityValue) != null) { priority = priorityValue; } } } if (ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { // Skip component that has zero width (the will be no geometry associated to it if (MathUtil.IsAlmostZero(scaledWidth)) { continue; } IFCAnyHandle materialConstituent = IFCInstanceExporter.CreateMaterialConstituent(file, materialHnds[ii], name: layerName, description: description, category: category); layers.Add(materialConstituent); IFCAnyHandle layerQtyHnd = IFCInstanceExporter.CreateQuantityLength(file, "Width", description, null, scaledWidth); totalWidth += scaledWidth; layerWidthQuantities.Add(new Tuple <string, IFCAnyHandle>(layerName, layerQtyHnd)); } else { IFCAnyHandle materialLayer = IFCInstanceExporter.CreateMaterialLayer(file, materialHnds[ii], scaledWidth, isVentilated, name: layerName, description: description, category: category, priority: priority); layers.Add(materialLayer); } } if (layers.Count > 0) { Element type = document.GetElement(typeElemId); string layerSetName = NamingUtil.GetOverrideStringValue(type, "IfcMaterialLayerSet.Name", m_ExporterIFC.GetFamilyName()); string layerSetDesc = NamingUtil.GetOverrideStringValue(type, "IfcMaterialLayerSet.Description", null); if (ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { HashSet <IFCAnyHandle> constituents = new HashSet <IFCAnyHandle>(layers); MaterialLayerSetHandle = IFCInstanceExporter.CreateMaterialConstituentSet(file, constituents, name: layerSetName, description: layerSetDesc); foreach (Tuple <string, IFCAnyHandle> layerWidthQty in layerWidthQuantities) { LayerQuantityWidthHnd.Add(IFCInstanceExporter.CreatePhysicalComplexQuantity(file, layerWidthQty.Item1, null, new HashSet <IFCAnyHandle>() { layerWidthQty.Item2 }, "Layer", null, null)); } // Finally create the total width as a quantity LayerQuantityWidthHnd.Add(IFCInstanceExporter.CreateQuantityLength(file, "Width", null, null, totalWidth)); } else { MaterialLayerSetHandle = IFCInstanceExporter.CreateMaterialLayerSet(file, layers, layerSetName, layerSetDesc); } ExporterCacheManager.MaterialSetCache.RegisterLayerSet(typeElemId, MaterialLayerSetHandle, this); } if (!IFCAnyHandleUtil.IsNullOrHasNoValue(PrimaryMaterialHandle)) { ExporterCacheManager.MaterialSetCache.RegisterPrimaryMaterialHnd(typeElemId, PrimaryMaterialHandle); } } else { MaterialLayerSetHandle = materialLayerSet; MaterialLayerSetInfo mlsInfo = ExporterCacheManager.MaterialSetCache.FindMaterialLayerSetInfo(typeElemId); if (mlsInfo != null) { MaterialIds = mlsInfo.MaterialIds; PrimaryMaterialHandle = mlsInfo.PrimaryMaterialHandle; LayerQuantityWidthHnd = mlsInfo.LayerQuantityWidthHnd; } } return; }
/// <summary> /// Gets material handle from material id or creates one if there is none. /// </summary> /// <param name="exporterIFC">The ExporterIFC object.</param> /// <param name="materialId">The material id.</param> /// <returns>The handle.</returns> public static IFCAnyHandle GetOrCreateMaterialHandle(ExporterIFC exporterIFC, ElementId materialId) { Document document = ExporterCacheManager.Document; IFCAnyHandle materialNameHandle = ExporterCacheManager.MaterialHandleCache.Find(materialId); if (IFCAnyHandleUtil.IsNullOrHasNoValue(materialNameHandle)) { string materialName = " <Unnamed>"; string description = null; string category = null; if (materialId != ElementId.InvalidElementId) { Material material = document.GetElement(materialId) as Material; if (material != null) { materialName = NamingUtil.GetNameOverride(material, material.Name); } if (ExporterCacheManager.ExportOptionsCache.ExportAs4) { category = NamingUtil.GetOverrideStringValue(material, "IfcCategory", NamingUtil.GetOverrideStringValue(material, "Category", material.MaterialCategory)); description = NamingUtil.GetOverrideStringValue(material, "IfcDescription", null); } } materialNameHandle = IFCInstanceExporter.CreateMaterial(exporterIFC.GetFile(), materialName, description: description, category: category); ExporterCacheManager.MaterialHandleCache.Register(materialId, materialNameHandle); // associate Material with SurfaceStyle if necessary. IFCFile file = exporterIFC.GetFile(); if (materialId != ElementId.InvalidElementId && !ExporterCacheManager.ExportOptionsCache.ExportAs2x2 && materialNameHandle.HasValue) { HashSet <IFCAnyHandle> matRepHandles = IFCAnyHandleUtil.GetHasRepresentation(materialNameHandle); if (matRepHandles.Count == 0) { Material matElem = document.GetElement(materialId) as Material; // TODO_DOUBLE_PATTERN - deal with background pattern ElementId fillPatternId = (matElem != null) ? matElem.CutPatternId : ElementId.InvalidElementId; Autodesk.Revit.DB.Color color = (matElem != null) ? GetSafeColor(matElem.CutPatternColor) : new Color(0, 0, 0); double planScale = 100.0; HashSet <IFCAnyHandle> styles = new HashSet <IFCAnyHandle>(); bool hasFill = false; IFCAnyHandle styledRepItem = null; IFCAnyHandle matStyleHnd = CategoryUtil.GetOrCreateMaterialStyle(document, exporterIFC, materialId); if (!IFCAnyHandleUtil.IsNullOrHasNoValue(matStyleHnd) && !ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { styles.Add(matStyleHnd); bool supportCutStyles = !ExporterCacheManager.ExportOptionsCache.ExportAsCoordinationView2; if (fillPatternId != ElementId.InvalidElementId && supportCutStyles) { IFCAnyHandle cutStyleHnd = exporterIFC.GetOrCreateFillPattern(fillPatternId, color, planScale); if (cutStyleHnd.HasValue) { styles.Add(cutStyleHnd); hasFill = true; } } IFCAnyHandle presStyleHnd = IFCInstanceExporter.CreatePresentationStyleAssignment(file, styles); HashSet <IFCAnyHandle> presStyleSet = new HashSet <IFCAnyHandle>(); presStyleSet.Add(presStyleHnd); IFCAnyHandle styledItemHnd = IFCInstanceExporter.CreateStyledItem(file, styledRepItem, presStyleSet, null); IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle(""); string repId = "Style"; string repType = (hasFill) ? "Material and Cut Pattern" : "Material"; HashSet <IFCAnyHandle> repItems = new HashSet <IFCAnyHandle>(); repItems.Add(styledItemHnd); IFCAnyHandle styleRepHnd = IFCInstanceExporter.CreateStyledRepresentation(file, contextOfItems, repId, repType, repItems); List <IFCAnyHandle> repList = new List <IFCAnyHandle>(); repList.Add(styleRepHnd); IFCAnyHandle matDefRepHnd = IFCInstanceExporter.CreateMaterialDefinitionRepresentation(file, null, null, repList, materialNameHandle); } } } } return(materialNameHandle); }
private void GenerateIFCObjectsIfNeeded() { if (m_needToGenerateIFCObjects) { m_needToGenerateIFCObjects = false; } else { return; } IFCAnyHandle materialLayerSet = null; if (m_ProductWrapper != null && !m_ProductWrapper.ToNative().IsValidObject) { m_ProductWrapper = null; } m_ProductWrapper?.ClearFinishMaterials(); // We can't create IfcMaterialLayers without creating an IfcMaterialLayerSet. So we will simply collate here. IList <IFCAnyHandle> materialHnds = new List <IFCAnyHandle>(); IList <int> widthIndices = new List <int>(); double thickestLayer = 0.0; for (int ii = 0; ii < MaterialIds.Count; ++ii) { // Require positive width for IFC2x3 and before, and non-negative width for IFC4. if (MaterialIds[ii].m_matWidth < -MathUtil.Eps()) { continue; } bool almostZeroWidth = MathUtil.IsAlmostZero(MaterialIds[ii].m_matWidth); if (!ExporterCacheManager.ExportOptionsCache.ExportAs4 && almostZeroWidth) { continue; } if (almostZeroWidth) { MaterialIds[ii].m_matWidth = 0.0; } IFCAnyHandle materialHnd = CategoryUtil.GetOrCreateMaterialHandle(m_ExporterIFC, MaterialIds[ii].m_baseMatId); if (m_PrimaryMaterialHandle == null || (MaterialIds[ii].m_matWidth > thickestLayer)) { m_PrimaryMaterialHandle = materialHnd; thickestLayer = MaterialIds[ii].m_matWidth; } widthIndices.Add(ii); materialHnds.Add(materialHnd); if ((m_ProductWrapper != null) && (MaterialIds[ii].m_function == MaterialFunctionAssignment.Finish1 || MaterialIds[ii].m_function == MaterialFunctionAssignment.Finish2)) { m_ProductWrapper.AddFinishMaterial(materialHnd); } } int numLayersToCreate = widthIndices.Count; if (numLayersToCreate == 0) { m_MaterialLayerSetHandle = materialLayerSet; return; } // If it is a single material, check single material override (only IfcMaterial without IfcMaterialLayerSet with only 1 member) if (numLayersToCreate == 1 && ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { m_MaterialLayerSetHandle = ExporterUtil.GetSingleMaterial(m_ExporterIFC, m_Element, MaterialIds[0].m_baseMatId) ?? materialHnds[0]; return; } IFCFile file = m_ExporterIFC.GetFile(); Document document = ExporterCacheManager.Document; IList <IFCAnyHandle> layers = new List <IFCAnyHandle>(numLayersToCreate); IList <Tuple <string, IFCAnyHandle> > layerWidthQuantities = new List <Tuple <string, IFCAnyHandle> >(); HashSet <string> layerNameUsed = new HashSet <string>(); double totalWidth = 0.0; for (int ii = 0; ii < numLayersToCreate; ii++) { int widthIndex = widthIndices[ii]; double scaledWidth = UnitUtil.ScaleLength(MaterialIds[widthIndex].m_matWidth); string layerName = "Layer"; string description = null; string category = null; int? priority = null; IFCLogical?isVentilated = null; int isVentilatedValue; Material material = document.GetElement(MaterialIds[ii].m_baseMatId) as Material; if (material != null) { if (ParameterUtil.GetIntValueFromElement(material, "IfcMaterialLayer.IsVentilated", out isVentilatedValue) != null) { if (isVentilatedValue == 0) { isVentilated = IFCLogical.False; } else if (isVentilatedValue == 1) { isVentilated = IFCLogical.True; } } if (ExporterCacheManager.ExportOptionsCache.ExportAs4) { layerName = MaterialIds[ii].m_layerName; if (string.IsNullOrEmpty(layerName)) { layerName = "Layer"; } // Ensure layer name is unique layerName = NamingUtil.GetUniqueNameWithinSet(layerName, ref layerNameUsed); description = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Description", IFCAnyHandleUtil.GetStringAttribute(materialHnds[ii], "Description")); category = NamingUtil.GetOverrideStringValue(material, "IfcMaterialLayer.Category", IFCAnyHandleUtil.GetStringAttribute(materialHnds[ii], "Category")); int priorityValue; if (ParameterUtil.GetIntValueFromElement(material, "IfcMaterialLayer.Priority", out priorityValue) != null) { priority = priorityValue; } } } if (ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { // Skip component that has zero width (the will be no geometry associated to it if (MathUtil.IsAlmostZero(scaledWidth)) { continue; } IFCAnyHandle materialConstituent = IFCInstanceExporter.CreateMaterialConstituent(file, materialHnds[ii], name: layerName, description: description, category: category); layers.Add(materialConstituent); IFCAnyHandle layerQtyHnd = IFCInstanceExporter.CreateQuantityLength(file, "Width", description, null, scaledWidth); totalWidth += scaledWidth; layerWidthQuantities.Add(new Tuple <string, IFCAnyHandle>(layerName, layerQtyHnd)); } else { IFCAnyHandle materialLayer = IFCInstanceExporter.CreateMaterialLayer(file, materialHnds[ii], scaledWidth, isVentilated, name: layerName, description: description, category: category, priority: priority); layers.Add(materialLayer); } } ElementId typeElemId = m_Element.GetTypeId(); if (layers.Count > 0) { Element type = document.GetElement(typeElemId); string layerSetName = NamingUtil.GetOverrideStringValue(type, "IfcMaterialLayerSet.Name", m_ExporterIFC.GetFamilyName()); string layerSetDesc = NamingUtil.GetOverrideStringValue(type, "IfcMaterialLayerSet.Description", null); if (ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView) { HashSet <IFCAnyHandle> constituents = new HashSet <IFCAnyHandle>(layers); m_MaterialLayerSetHandle = IFCInstanceExporter.CreateMaterialConstituentSet(file, constituents, name: layerSetName, description: layerSetDesc); foreach (Tuple <string, IFCAnyHandle> layerWidthQty in layerWidthQuantities) { m_LayerQuantityWidthHnd.Add(IFCInstanceExporter.CreatePhysicalComplexQuantity(file, layerWidthQty.Item1, null, new HashSet <IFCAnyHandle>() { layerWidthQty.Item2 }, "Layer", null, null)); } // Finally create the total width as a quantity m_LayerQuantityWidthHnd.Add(IFCInstanceExporter.CreateQuantityLength(file, "Width", null, null, totalWidth)); } else { m_MaterialLayerSetHandle = IFCInstanceExporter.CreateMaterialLayerSet(file, layers, layerSetName, layerSetDesc); } ExporterCacheManager.MaterialSetCache.RegisterLayerSet(typeElemId, m_MaterialLayerSetHandle, this); } if (!IFCAnyHandleUtil.IsNullOrHasNoValue(m_PrimaryMaterialHandle)) { ExporterCacheManager.MaterialSetCache.RegisterPrimaryMaterialHnd(typeElemId, m_PrimaryMaterialHandle); } }