private void button_Go_Click(object sender, RoutedEventArgs e) { #if DEBUG string tempFolder = System.IO.Path.GetTempPath(); logF = new StreamWriter(Path.Combine(tempFolder, "GeneratePsetDefWin.log")); #endif textBox_OutputMsg.Clear(); string parFileNameOut = Path.Combine(Path.GetDirectoryName(SharedParFileName), Path.GetFileNameWithoutExtension(SharedParFileName) + "_out.txt"); stSharedPar = File.CreateText(parFileNameOut); ProcessPsetDefinition.processExistingParFile(SharedParFileName, false, ref stSharedPar); if (File.Exists(SharedParFileNameType)) { string typeParFileNameOut = Path.Combine(Path.GetDirectoryName(SharedParFileNameType), Path.GetFileNameWithoutExtension(SharedParFileNameType) + "_out.txt"); stSharedParType = File.CreateText(typeParFileNameOut); ProcessPsetDefinition.processExistingParFile(SharedParFileNameType, true, ref stSharedParType); } else { stSharedParType = File.CreateText(SharedParFileNameType); } ProcessPsetDefinition procPsetDef = new ProcessPsetDefinition(logF); if (string.IsNullOrEmpty(textBox_PSDSourceDir.Text) || string.IsNullOrEmpty(textBox_OutputFile.Text)) { return; } var psdFolders = new DirectoryInfo(textBox_PSDSourceDir.Text).GetDirectories("psd", SearchOption.AllDirectories); string dirName = Path.GetDirectoryName(textBox_OutputFile.Text); string penumFileName = Path.GetFileNameWithoutExtension(textBox_OutputFile.Text); if (File.Exists(textBox_OutputFile.Text)) { File.Delete(textBox_OutputFile.Text); } StreamWriter outF = new StreamWriter(textBox_OutputFile.Text); outF.WriteLine("/********************************************************************************************************************************"); outF.WriteLine("** NOTE: This code is generated from IFC psd files automatically by RevitIFCTools. **"); outF.WriteLine("** DO NOT change it manually as it will be overwritten the next time this file is re-generated!! **"); outF.WriteLine("********************************************************************************************************************************/"); outF.WriteLine(); outF.WriteLine("using System;"); outF.WriteLine("using System.Collections.Generic;"); outF.WriteLine("using System.Linq;"); outF.WriteLine("using System.Text;"); outF.WriteLine("using System.Threading.Tasks;"); outF.WriteLine("using Autodesk.Revit;"); outF.WriteLine("using Autodesk.Revit.DB;"); outF.WriteLine("using Autodesk.Revit.DB.IFC;"); outF.WriteLine("using Autodesk.Revit.ApplicationServices;"); outF.WriteLine("using Revit.IFC.Export.Exporter.PropertySet;"); outF.WriteLine("using Revit.IFC.Export.Exporter.PropertySet.Calculators;"); outF.WriteLine("using Revit.IFC.Export.Utility;"); outF.WriteLine("using Revit.IFC.Export.Toolkit;"); outF.WriteLine("using Revit.IFC.Common.Enums;"); outF.WriteLine(""); outF.WriteLine("namespace Revit.IFC.Export.Exporter"); outF.WriteLine("{"); outF.WriteLine("\tpartial class ExporterInitializer"); outF.WriteLine("\t{"); // Collect all Pset definition for psd folders foreach (DirectoryInfo psd in psdFolders) { string schemaFolder = psd.FullName.Remove(0, textBox_PSDSourceDir.Text.Length + 1).Split('\\')[0]; #if DEBUG logF.WriteLine("\n*** Processing " + schemaFolder); #endif foreach (DirectoryInfo subDir in psd.GetDirectories()) { procPsetDef.ProcessSchemaPsetDef(schemaFolder, subDir); } procPsetDef.ProcessSchemaPsetDef(schemaFolder, psd); } // For testing purpose: Dump all the propertyset definition in a text file if (checkBox_Dump.IsChecked.HasValue && checkBox_Dump.IsChecked.Value) { string pSetDump = ""; foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > psetDefEntry in procPsetDef.allPDefDict) { pSetDump += "**** Property Set Name: " + psetDefEntry.Key; foreach (VersionSpecificPropertyDef vPdef in psetDefEntry.Value) { pSetDump += "\n ===> IfcVersion: " + vPdef.IfcVersion; pSetDump += "\n" + vPdef.PropertySetDef.ToString() + "\n"; } pSetDump += "\n\n"; } string dumpDir = Path.GetDirectoryName(textBox_OutputFile.Text); string dumpFile = Path.GetFileNameWithoutExtension(textBox_OutputFile.Text) + ".txt"; string dumpFilePath = Path.Combine(dumpDir, dumpFile); if (File.Exists(dumpFilePath)) { File.Delete(dumpFilePath); } StreamWriter tx = new StreamWriter(dumpFilePath); tx.Write(pSetDump); tx.Close(); } // Method to initialize all the propertysets outF.WriteLine("\t\tpublic static void InitCommonPropertySets(IList<IList<PropertySetDescription>> propertySets)"); outF.WriteLine("\t\t{"); outF.WriteLine("\t\t\tIList<PropertySetDescription> commonPropertySets = new List<PropertySetDescription>();"); foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > psetDefEntry in procPsetDef.allPDefDict) { outF.WriteLine("\t\t\tInit" + psetDefEntry.Key + "(commonPropertySets);"); } outF.WriteLine("\n\t\t\tpropertySets.Add(commonPropertySets);"); outF.WriteLine("\t\t}"); outF.WriteLine(""); // For generated codes and shared parameters foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > psetDefEntry in procPsetDef.allPDefDict) { string psetName = psetDefEntry.Key; outF.WriteLine("\t\tprivate static void Init" + psetName + "(IList<PropertySetDescription> commonPropertySets)"); outF.WriteLine("\t\t{"); string varName = psetDefEntry.Key.Replace("Pset_", "propertySet"); outF.WriteLine("\t\t\tPropertySetDescription {0} = new PropertySetDescription();", varName); string psetEnumStr = psetName.Replace("PSet_", "PSet"); try { Revit.IFC.Export.Toolkit.IFCCommonPSets psetEnum = (Revit.IFC.Export.Toolkit.IFCCommonPSets)Enum.Parse(typeof(Revit.IFC.Export.Toolkit.IFCCommonPSets), psetEnumStr); outF.WriteLine("\t\t\t{0}.SubElementIndex = (int)IFCCommonPSets.{1};", varName, psetName.Replace("PSet_", "PSet")); } catch (ArgumentException) { #if DEBUG logF.WriteLine("\t%Info: " + psetEnumStr + " is not defined in Revit.IFC.Export.Toolkit.IFCCommonPSets."); #endif } outF.WriteLine("\t\t\t{0}.Name = \"{1}\";", varName, psetName); outF.WriteLine("\t\t\tPropertySetEntry ifcPSE = null;"); outF.WriteLine("\t\t\tType calcType = null;"); foreach (VersionSpecificPropertyDef vspecPDef in psetDefEntry.Value) { PsetDefinition pDef = vspecPDef.PropertySetDef; if (vspecPDef.IfcVersion.Equals("IFC2X2", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs2x2 && certifiedEntityAndPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.ApplicableType)) { outF.WriteLine("\t\t\t\t{0}.ObjectType = \"{1}\";", varName, vspecPDef.PropertySetDef.ApplicableType); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.PredefinedType)) { outF.WriteLine("\t\t\t\t{0}.PredefinedType = \"{1}\";", varName, vspecPDef.PropertySetDef.PredefinedType); } } else if (vspecPDef.IfcVersion.Equals("IFC2X3TC1", StringComparison.CurrentCultureIgnoreCase) || vspecPDef.IfcVersion.Equals("IFC2X3_TC1", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs2x3 && certifiedEntityAndPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.ApplicableType)) { outF.WriteLine("\t\t\t\t{0}.ObjectType = \"{1}\";", varName, vspecPDef.PropertySetDef.ApplicableType); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.PredefinedType)) { outF.WriteLine("\t\t\t\t{0}.PredefinedType = \"{1}\";", varName, vspecPDef.PropertySetDef.PredefinedType); } } //else if (vspecPDef.IfcVersion.Equals("IFC4_ADD1")) //{ else if (vspecPDef.SchemaFileVersion.Equals("IFC4_ADD1", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs4_ADD1 && certifiedEntityAndPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.ApplicableType)) { outF.WriteLine("\t\t\t\t{0}.ObjectType = \"{1}\";", varName, vspecPDef.PropertySetDef.ApplicableType); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.PredefinedType)) { outF.WriteLine("\t\t\t\t{0}.PredefinedType = \"{1}\";", varName, vspecPDef.PropertySetDef.PredefinedType); } } else if (vspecPDef.SchemaFileVersion.Equals("IFC4_ADD2", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs4_ADD2 && certifiedEntityAndPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.ApplicableType)) { outF.WriteLine("\t\t\t\t{0}.ObjectType = \"{1}\";", varName, vspecPDef.PropertySetDef.ApplicableType); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.PredefinedType)) { outF.WriteLine("\t\t\t\t{0}.PredefinedType = \"{1}\";", varName, vspecPDef.PropertySetDef.PredefinedType); } } else if (vspecPDef.SchemaFileVersion.Equals("IFC4", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs4 && certifiedEntityAndPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.ApplicableType)) { outF.WriteLine("\t\t\t\t{0}.ObjectType = \"{1}\";", varName, vspecPDef.PropertySetDef.ApplicableType); } if (!string.IsNullOrEmpty(vspecPDef.PropertySetDef.PredefinedType)) { outF.WriteLine("\t\t\t\t{0}.PredefinedType = \"{1}\";", varName, vspecPDef.PropertySetDef.PredefinedType); } } else { #if DEBUG logF.WriteLine("%Error - Unrecognized schema version : " + vspecPDef.SchemaFileVersion); #endif } //} // Process each property foreach (PsetProperty prop in pDef.properties) { // Handle only one level deep of complex property !!!! if (prop.PropertyType is ComplexProperty) { ComplexProperty complexProp = prop.PropertyType as ComplexProperty; // For complex property the properties will be flattened by using <Pset>.<Property>.<SubProperty> foreach (PsetProperty propCx in complexProp.Properties) { string prefixName = pDef.Name + "." + prop.Name; procPsetDef.processSimpleProperty(outF, propCx, prefixName, pDef.IfcVersion, vspecPDef.SchemaFileVersion, varName, vspecPDef, penumFileName); } } else { procPsetDef.processSimpleProperty(outF, prop, pDef.Name, pDef.IfcVersion, vspecPDef.SchemaFileVersion, varName, vspecPDef, penumFileName); } } outF.WriteLine("\t\t\t}"); } outF.WriteLine("\t\t\tif (ifcPSE != null)"); outF.WriteLine("\t\t\t{"); //outF.WriteLine("\t\t\t\t{0}.Name = \"{1}\";", varName, psetName); outF.WriteLine("\t\t\t\tcommonPropertySets.Add({0});", varName); outF.WriteLine("\t\t\t}"); outF.WriteLine("\t\t}"); outF.WriteLine("\n"); } outF.WriteLine("\t}"); outF.WriteLine("}"); outF.Close(); procPsetDef.endWriteEnumFile(); // Now write shared parameter definitions from the Dict to destination file stSharedPar.WriteLine("# This is a Revit shared parameter file."); stSharedPar.WriteLine("# Do not edit manually."); stSharedPar.WriteLine("*META VERSION MINVERSION"); stSharedPar.WriteLine("META 2 1"); stSharedPar.WriteLine("*GROUP ID NAME"); stSharedPar.WriteLine("GROUP 2 IFC Properties"); stSharedPar.WriteLine("*PARAM GUID NAME DATATYPE DATACATEGORY GROUP VISIBLE DESCRIPTION USERMODIFIABLE"); stSharedPar.WriteLine("#"); foreach (KeyValuePair <string, SharedParameterDef> parDef in ProcessPsetDefinition.SharedParamFileDict) { SharedParameterDef newPar = parDef.Value; string vis = newPar.Visibility ? "1" : "0"; string usrMod = newPar.UserModifiable ? "1" : "0"; string parEntry = newPar.Param + "\t" + newPar.ParamGuid.ToString() + "\t" + newPar.Name + "\t" + newPar.ParamType + "\t" + newPar.DataCategory + "\t" + newPar.GroupId.ToString() + "\t" + vis + "\t" + newPar.Description + "\t" + usrMod; stSharedPar.WriteLine(parEntry); } stSharedParType.WriteLine("# This is a Revit shared parameter file."); stSharedParType.WriteLine("# Do not edit manually."); stSharedParType.WriteLine("*META VERSION MINVERSION"); stSharedParType.WriteLine("META 2 1"); stSharedParType.WriteLine("*GROUP ID NAME"); stSharedParType.WriteLine("GROUP 2 IFC Properties"); stSharedParType.WriteLine("*PARAM GUID NAME DATATYPE DATACATEGORY GROUP VISIBLE DESCRIPTION USERMODIFIABLE"); stSharedParType.WriteLine("#"); foreach (KeyValuePair <string, SharedParameterDef> parDef in ProcessPsetDefinition.SharedParamFileTypeDict) { SharedParameterDef newPar = parDef.Value; string parName4Type; if (newPar.Name.EndsWith("[Type]")) { parName4Type = newPar.Name; } else { parName4Type = newPar.Name + "[Type]"; } string vis = newPar.Visibility ? "1" : "0"; string usrMod = newPar.UserModifiable ? "1" : "0"; string parEntry = newPar.Param + "\t" + newPar.ParamGuid.ToString() + "\t" + parName4Type + "\t" + newPar.ParamType + "\t" + newPar.DataCategory + "\t" + newPar.GroupId.ToString() + "\t" + vis + "\t" + newPar.Description + "\t" + usrMod; stSharedParType.WriteLine(parEntry); } stSharedPar.Close(); stSharedParType.Close(); #if DEBUG logF.Close(); #endif }
private void button_Go_Click(object sender, RoutedEventArgs e) { textBox_OutputMsg.Clear(); allPDefDict = new SortedDictionary <string, IList <VersionSpecificPropertyDef> >(); if (string.IsNullOrEmpty(textBox_PSDSourceDir.Text) || string.IsNullOrEmpty(textBox_OutputFile.Text)) { return; } var psdFolders = new DirectoryInfo(textBox_PSDSourceDir.Text).GetDirectories("psd", SearchOption.AllDirectories); //DirectoryInfo sourceDirInfo = new DirectoryInfo(textBox_PSDSourceDir.Text); // The output file is to generate codes to define property set and the propsety entries for Revit Exporter // We will also generate shared parameter files for a newer approach to deal with IFC propserty sets by using custom parameters // under category of "IFC Parameters" group in form of: // <Pset_name>.<property_name> // string dirName = Path.GetDirectoryName(textBox_OutputFile.Text); string penumFileName = Path.GetFileNameWithoutExtension(textBox_OutputFile.Text); if (File.Exists(textBox_OutputFile.Text)) { File.Delete(textBox_OutputFile.Text); } StreamWriter outF = new StreamWriter(textBox_OutputFile.Text); outF.WriteLine("/********************************************************************************************************************************"); outF.WriteLine("** NOTE: This code is generated from IFC psd files automatically by RevitIFCTools. **"); outF.WriteLine("** DO NOT change it manually as it will be overwritten the next time this file is re-generated!! **"); outF.WriteLine("********************************************************************************************************************************/"); outF.WriteLine(); outF.WriteLine("using System;"); outF.WriteLine("using System.Collections.Generic;"); outF.WriteLine("using System.Linq;"); outF.WriteLine("using System.Text;"); outF.WriteLine("using System.Threading.Tasks;"); outF.WriteLine("using Autodesk.Revit;"); outF.WriteLine("using Autodesk.Revit.DB;"); outF.WriteLine("using Autodesk.Revit.DB.IFC;"); outF.WriteLine("using Autodesk.Revit.ApplicationServices;"); outF.WriteLine("using Revit.IFC.Export.Exporter.PropertySet;"); outF.WriteLine("using Revit.IFC.Export.Exporter.PropertySet.Calculators;"); outF.WriteLine("using Revit.IFC.Export.Utility;"); outF.WriteLine("using Revit.IFC.Export.Toolkit;"); outF.WriteLine("using Revit.IFC.Common.Enums;"); outF.WriteLine(""); outF.WriteLine("namespace Revit.IFC.Export.Exporter"); outF.WriteLine("{"); outF.WriteLine("\tpartial class ExporterInitializer"); outF.WriteLine("\t{"); // Collect all Pset definition for psd folders foreach (DirectoryInfo psd in psdFolders) { DirectoryInfo schemaFolderPath = Directory.GetParent(psd.FullName); string schemaFolder = schemaFolderPath.Name; #if DEBUG logF.WriteLine("\n*** Processing " + schemaFolder); #endif foreach (DirectoryInfo subDir in psd.GetDirectories()) { foreach (FileInfo file in subDir.GetFiles("Pset_*.xml")) { #if DEBUG logF.WriteLine("\n=== Processing " + file.Name); #endif textBox_OutputMsg.AppendText("Processing " + file.Name + "\n"); textBox_OutputMsg.ScrollToEnd(); PsetDefinition psetD = ProcessPsetDef(schemaFolder, file); AddPsetDefToDict(schemaFolder, psetD); } } foreach (FileInfo file in psd.GetFiles("Pset_*.xml")) { #if DEBUG logF.WriteLine("\n=== Processing " + file.Name); #endif textBox_OutputMsg.AppendText("Processing " + file.Name + "\n"); textBox_OutputMsg.ScrollToEnd(); PsetDefinition psetD = ProcessPsetDef(schemaFolder, file); AddPsetDefToDict(schemaFolder, psetD); } } // For testing purpose: Dump all the propertyset definition in a text file if (checkBox_Dump.IsChecked.HasValue && checkBox_Dump.IsChecked.Value) { string pSetDump = ""; foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > psetDefEntry in allPDefDict) { pSetDump += "**** Property Set Name: " + psetDefEntry.Key; foreach (VersionSpecificPropertyDef vPdef in psetDefEntry.Value) { pSetDump += "\n ===> IfcVersion: " + vPdef.IfcVersion; pSetDump += "\n" + vPdef.PropertySetDef.ToString() + "\n"; } pSetDump += "\n\n"; } string dumpDir = Path.GetDirectoryName(textBox_OutputFile.Text); string dumpFile = Path.GetFileNameWithoutExtension(textBox_OutputFile.Text) + ".txt"; string dumpFilePath = Path.Combine(dumpDir, dumpFile); if (File.Exists(dumpFilePath)) { File.Delete(dumpFilePath); } StreamWriter tx = new StreamWriter(dumpFilePath); tx.Write(pSetDump); tx.Close(); } // Method to initialize all the prosertysets outF.WriteLine("\t\tpublic static void InitCommonPropertySets(IList<IList<PropertySetDescription>> propertySets)"); outF.WriteLine("\t\t{"); outF.WriteLine("\t\t\tIList<PropertySetDescription> commonPropertySets = new List<PropertySetDescription>();"); foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > psetDefEntry in allPDefDict) { outF.WriteLine("\t\t\tInit" + psetDefEntry.Key + "(commonPropertySets);"); } outF.WriteLine("\n\t\t\tpropertySets.Add(commonPropertySets);"); outF.WriteLine("\t\t}"); outF.WriteLine(""); // For generated codes and shared parameters foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > psetDefEntry in allPDefDict) { string psetName = psetDefEntry.Key; outF.WriteLine("\t\tprivate static void Init" + psetName + "(IList<PropertySetDescription> commonPropertySets)"); outF.WriteLine("\t\t{"); string varName = psetDefEntry.Key.Replace("Pset_", "propertySet"); outF.WriteLine("\t\t\tPropertySetDescription {0} = new PropertySetDescription();", varName); outF.WriteLine("\t\t\t{0}.Name = \"{1}\";", varName, psetName); string psetEnumStr = psetName.Replace("PSet_", "PSet"); try { Revit.IFC.Export.Toolkit.IFCCommonPSets psetEnum = (Revit.IFC.Export.Toolkit.IFCCommonPSets)Enum.Parse(typeof(Revit.IFC.Export.Toolkit.IFCCommonPSets), psetEnumStr); outF.WriteLine("\t\t\t{0}.SubElementIndex = (int)IFCCommonPSets.{1};", varName, psetName.Replace("PSet_", "PSet")); } catch (ArgumentException) { #if DEBUG logF.WriteLine("\t%Info: " + psetEnumStr + " is not defined in Revit.IFC.Export.Toolkit.IFCCommonPSets."); #endif } outF.WriteLine("\t\t\tPropertySetEntry ifcPSE = null;"); outF.WriteLine("\t\t\tType calcType = null;"); foreach (VersionSpecificPropertyDef vspecPDef in psetDefEntry.Value) { PsetDefinition pDef = vspecPDef.PropertySetDef; if (vspecPDef.IfcVersion.Equals("IFC2X2", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs2x2 && certifiedPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } } else if (vspecPDef.IfcVersion.Equals("IFC2X3TC1", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs2x3 && certifiedPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } } //else if (vspecPDef.IfcVersion.Equals("IFC4_ADD1")) //{ else if (vspecPDef.SchemaFileVersion.Equals("IFC4_ADD1", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs4_ADD1 && certifiedPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } } else if (vspecPDef.SchemaFileVersion.Equals("IFC4_ADD2", StringComparison.CurrentCultureIgnoreCase)) { outF.WriteLine("\t\t\tif (ExporterCacheManager.ExportOptionsCache.ExportAs4_ADD2 && certifiedPsetList.AllowPsetToBeCreated(ExporterCacheManager.ExportOptionsCache.FileVersion.ToString().ToUpper(), \"" + psetName + "\"))"); outF.WriteLine("\t\t\t{"); foreach (string applEnt in vspecPDef.PropertySetDef.ApplicableClasses) { string applEnt2 = applEnt; if (string.IsNullOrEmpty(applEnt)) { applEnt2 = "IfcBuildingElementProxy"; // Default if somehow the data is empty } outF.WriteLine("\t\t\t\t{0}.EntityTypes.Add(IFCEntityType.{1});", varName, applEnt2); } } //} // Process each property foreach (PsetProperty prop in pDef.properties) { // Handle only one level deep of complex property !!!! if (prop.PropertyType is ComplexProperty) { ComplexProperty complexProp = prop.PropertyType as ComplexProperty; // For complex property the properties will be flattened by using <Pset>.<Property>.<SubProperty> foreach (PsetProperty propCx in complexProp.Properties) { string prefixName = pDef.Name + "." + prop.Name; processSimpleProperty(outF, propCx, prefixName, pDef.IfcVersion, vspecPDef.SchemaFileVersion, varName); } } else { processSimpleProperty(outF, prop, pDef.Name, pDef.IfcVersion, vspecPDef.SchemaFileVersion, varName); } } outF.WriteLine("\t\t\t}"); } outF.WriteLine("\t\t\tif (ifcPSE != null)"); outF.WriteLine("\t\t\t{"); //outF.WriteLine("\t\t\t\t{0}.Name = \"{1}\";", varName, psetName); outF.WriteLine("\t\t\t\tcommonPropertySets.Add({0});", varName); outF.WriteLine("\t\t\t}"); outF.WriteLine("\t\t}"); outF.WriteLine("\n"); } outF.WriteLine("\t}"); outF.WriteLine("}"); outF.Close(); endWriteEnumFile(); #if DEBUG logF.Close(); #endif }