/// <summary> /// Find the handle from the cache using only the Material Id. /// </summary> /// <param name="materialId"></param> /// <returns></returns> public IFCAnyHandle Find(ElementId materialId) { // If only a Material ElementId is provided, default the constituent name to be the same as the material name Material material = ExporterCacheManager.Document.GetElement(materialId) as Material; string catName = (material != null) ? NamingUtil.GetMaterialName(material) : "<Unnamed>"; // Default name to the Material name if not null or <Unnamed> MaterialConstituentInfo constInfo = new MaterialConstituentInfo(catName, materialId); return(Find(constInfo)); }
/// <summary> /// Register Material Constituent Handle with only Material Id. This is the original behavior /// </summary> /// <param name="materialId">the material elementId</param> /// <param name="handle">the handle</param> public void Register(ElementId materialId, IFCAnyHandle handle) { // If only a Material ElementId is provided, default the constituent name to be the same as the material name Material material = ExporterCacheManager.Document.GetElement(materialId) as Material; string catName = (material != null) ? NamingUtil.GetMaterialName(material) : "<Unnamed>"; // Default name to the Material name if not null or <Unnamed> MaterialConstituentInfo constInfo = new MaterialConstituentInfo(catName, materialId); if (m_MaterialConstDictionary.ContainsKey(constInfo)) { return; } m_MaterialConstDictionary[constInfo] = handle; }
/// <summary> /// Get or Create (if not yet exists) a handle for IfcMaterialConstituent. It points to an IfcMaterial /// </summary> /// <param name="exporterIFC"></param> /// <param name="materialId"></param> /// <returns>The Handle to IfcMaterialConstituent</returns> public static IFCAnyHandle GetOrCreateMaterialConstituent(ExporterIFC exporterIFC, ElementId materialId) { IFCAnyHandle materialConstituentHandle = ExporterCacheManager.MaterialConstituentCache.Find(materialId); if (IFCAnyHandleUtil.IsNullOrHasNoValue(materialConstituentHandle)) { Document document = ExporterCacheManager.Document; IFCAnyHandle materialHnd = GetOrCreateMaterialHandle(exporterIFC, materialId); //Material constituent name will be defaulted to the same as the material name Material material = document.GetElement(materialId) as Material; string constituentName = (material != null) ? NamingUtil.GetMaterialName(material) : "<Unnamed>"; MaterialConstituentInfo constInfo = new MaterialConstituentInfo(constituentName, materialId); materialConstituentHandle = GetOrCreateMaterialConstituent(exporterIFC, constInfo); } return(materialConstituentHandle); }
public static IFCAnyHandle GetOrCreateMaterialStyle(Document document, IFCFile file, ElementId materialId) { IFCAnyHandle styleHnd = ExporterCacheManager.MaterialIdToStyleHandleCache.Find(materialId); if (IFCAnyHandleUtil.IsNullOrHasNoValue(styleHnd)) { Material material = document.GetElement(materialId) as Material; if (material == null) { return(null); } string matName = NamingUtil.GetMaterialName(material); Color color = GetSafeColor(material.Color); double blueVal = color.Blue / 255.0; double greenVal = color.Green / 255.0; double redVal = color.Red / 255.0; IFCAnyHandle colorHnd = IFCInstanceExporter.CreateColourRgb(file, null, redVal, greenVal, blueVal); double transparency = ((double)material.Transparency) / 100.0; IFCData smoothness = IFCDataUtil.CreateAsNormalisedRatioMeasure(((double)material.Smoothness) / 100.0); IFCData specularExp = IFCDataUtil.CreateAsSpecularExponent(material.Shininess); IFCReflectanceMethod method = IFCReflectanceMethod.NotDefined; IFCAnyHandle renderingHnd = IFCInstanceExporter.CreateSurfaceStyleRendering(file, colorHnd, transparency, null, null, null, null, smoothness, specularExp, method); ISet <IFCAnyHandle> surfStyles = new HashSet <IFCAnyHandle>(); surfStyles.Add(renderingHnd); IFCSurfaceSide surfSide = IFCSurfaceSide.Both; styleHnd = IFCInstanceExporter.CreateSurfaceStyle(file, matName, surfSide, surfStyles); ExporterCacheManager.MaterialIdToStyleHandleCache.Register(materialId, styleHnd); } return(styleHnd); }
/// <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.GetMaterialName(material); if (ExporterCacheManager.ExportOptionsCache.ExportAs4) { category = NamingUtil.GetMaterialCategoryName(material); description = NamingUtil.GetOverrideStringValue(material, "IfcDescription", null); } } } IFCFile file = exporterIFC.GetFile(); materialNameHandle = IFCInstanceExporter.CreateMaterial(file, materialName, description: description, category: category); ExporterCacheManager.MaterialHandleCache.Register(materialId, materialNameHandle); // associate Material with SurfaceStyle if necessary. 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.CutForegroundPatternId : ElementId.InvalidElementId; Color color = (matElem != null) ? GetSafeColor(matElem.CutForegroundPatternColor) : new Color(0, 0, 0); double planScale = 100.0; HashSet <IFCAnyHandle> styles = new HashSet <IFCAnyHandle>(); bool hasFill = false; IFCAnyHandle styledRepItem = null; IFCAnyHandle matStyleHnd = GetOrCreateMaterialStyle(document, file, 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 styledItemHnd; if (ExporterCacheManager.ExportOptionsCache.ExportAsOlderThanIFC4) { IFCAnyHandle presStyleHnd = IFCInstanceExporter.CreatePresentationStyleAssignment(file, styles); HashSet <IFCAnyHandle> presStyleSet = new HashSet <IFCAnyHandle>(); presStyleSet.Add(presStyleHnd); styledItemHnd = IFCInstanceExporter.CreateStyledItem(file, styledRepItem, presStyleSet, null); } else { styledItemHnd = IFCInstanceExporter.CreateStyledItem(file, styledRepItem, styles, 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); }