コード例 #1
0
        private void button_Go_Click(object sender, RoutedEventArgs e)
        {
            if (listBox_schemaList.SelectedItems.Count == 0)
            {
                return;
            }

            DirectoryInfo dInfo = new DirectoryInfo(textBox_folderLocation.Text);

            if (dInfo == null)
            {
                return;
            }

            if (aggregateEntities == null)
            {
                aggregateEntities = new SortedSet <string>();
            }
            aggregateEntities.Clear();

            if (!Directory.Exists(textBox_outputFolder.Text))
            {
                textBox_outputFolder.Text = "";
                return;
            }

            logF = new StreamWriter(System.IO.Path.Combine(outputFolder, "entityList.log"));

            IList <IFCEntityAndPsetList> fxEntityNPsetList = new List <IFCEntityAndPsetList>();

            string jsonFile = outputFolder + @"\IFCEntityAndPsetDefs.json";

            if (File.Exists(jsonFile))
            {
                File.Delete(jsonFile);
            }
            FileStream fs = File.Create(jsonFile);
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List <IFCEntityAndPsetList>));

            foreach (string fileName in listBox_schemaList.SelectedItems)
            {
                FileInfo f = dInfo.GetFiles(fileName).First();
                processSchema(f);

                ProcessPsetDefinition procPdef = new ProcessPsetDefinition(logF);

                string schemaName = f.Name.Replace(".xsd", "");
                IDictionary <string, IfcSchemaEntityNode> entDict = IfcSchemaEntityTree.GetEntityDictFor(f.Name);
                IFCEntityAndPsetList schemaEntities = new IFCEntityAndPsetList();
                schemaEntities.Version     = schemaName;
                schemaEntities.EntityList  = new HashSet <IFCEntityInfo>();
                schemaEntities.PsetDefList = new HashSet <IFCPropertySetDef>();

                Dictionary <ItemsInPsetQtoDefs, string> keywordsToProcess = PsetOrQto.PsetOrQtoDefItems[PsetOrQtoSetEnum.PROPERTYSET];
                DirectoryInfo[] psdFolders      = new DirectoryInfo(System.IO.Path.Combine(textBox_folderLocation.Text, schemaName)).GetDirectories("psd", SearchOption.AllDirectories);
                DirectoryInfo[] underpsdFolders = psdFolders[0].GetDirectories();
                if (underpsdFolders.Count() > 0)
                {
                    foreach (DirectoryInfo subDir in psdFolders[0].GetDirectories())
                    {
                        procPdef.ProcessSchemaPsetDef(schemaName, subDir, keywordsToProcess);
                    }
                }
                else
                {
                    procPdef.ProcessSchemaPsetDef(schemaName, psdFolders[0], keywordsToProcess);
                }

                keywordsToProcess = PsetOrQto.PsetOrQtoDefItems[PsetOrQtoSetEnum.QTOSET];
                DirectoryInfo[] qtoFolders = new DirectoryInfo(System.IO.Path.Combine(textBox_folderLocation.Text, schemaName)).GetDirectories("qto", SearchOption.AllDirectories);
                if (qtoFolders.Count() > 0)
                {
                    DirectoryInfo[] underqtoFolders = qtoFolders[0].GetDirectories();
                    if (underqtoFolders.Count() > 0)
                    {
                        foreach (DirectoryInfo subDir in qtoFolders[0].GetDirectories())
                        {
                            procPdef.ProcessSchemaPsetDef(schemaName, subDir, keywordsToProcess);
                        }
                    }
                    else
                    {
                        procPdef.ProcessSchemaPsetDef(schemaName, qtoFolders[0], keywordsToProcess);
                    }
                }

                procPdef.ProcessPredefinedPsets(schemaName);

                //Collect information on applicable Psets for Entity
                IDictionary <string, HashSet <string> > entPsetDict = new Dictionary <string, HashSet <string> >();
                foreach (KeyValuePair <string, IList <VersionSpecificPropertyDef> > pdefEntry in procPdef.allPDefDict)
                {
                    foreach (VersionSpecificPropertyDef vPdef in pdefEntry.Value)
                    {
                        //if (vPdef.IfcVersion.Equals(schemaName, StringComparison.InvariantCultureIgnoreCase))
                        {
                            IFCPropertySetDef psetDef = new IFCPropertySetDef();
                            psetDef.PsetName = vPdef.PropertySetDef.Name;
                            IList <string> props = new List <string>();
                            foreach (PropertySet.PsetProperty property in vPdef.PropertySetDef.properties)
                            {
                                props.Add(property.Name);
                            }
                            psetDef.Properties = props;
                            schemaEntities.PsetDefList.Add(psetDef);

                            // TODO: to check the appl classes either a type or not and check whether the pair (type or without) exists in entDict, if there is add
                            foreach (string applEntity in vPdef.PropertySetDef.ApplicableClasses)
                            {
                                if (entPsetDict.ContainsKey(applEntity))
                                {
                                    entPsetDict[applEntity].Add(vPdef.PropertySetDef.Name);
                                }
                                else
                                {
                                    entPsetDict.Add(applEntity, new HashSet <string>()
                                    {
                                        vPdef.PropertySetDef.Name
                                    });
                                }

                                // The Pset will be valid for both the Instance and the Type. Check for that here and add if found
                                string entOrTypePair;
                                if (applEntity.Length > 4 && applEntity.EndsWith("Type"))
                                {
                                    entOrTypePair = applEntity.Substring(0, applEntity.Length - 4);
                                }
                                else
                                {
                                    entOrTypePair = applEntity + "Type";
                                }

                                if (aggregateEntities.Contains(entOrTypePair))
                                {
                                    if (entPsetDict.ContainsKey(entOrTypePair))
                                    {
                                        entPsetDict[entOrTypePair].Add(vPdef.PropertySetDef.Name);
                                    }
                                    else
                                    {
                                        entPsetDict.Add(entOrTypePair, new HashSet <string>()
                                        {
                                            vPdef.PropertySetDef.Name
                                        });
                                    }
                                }
                            }
                        }
                    }
                }

                // For every entity of the schema, collect the list of PredefinedType (obtained from the xsd), and collect all applicable
                //  Pset Definitions collected above
                foreach (KeyValuePair <string, IfcSchemaEntityNode> ent in entDict)
                {
                    IFCEntityInfo entInfo = new IFCEntityInfo();

                    // The abstract entity type is not going to be listed here as they can never be created
                    if (ent.Value.isAbstract)
                    {
                        continue;
                    }

                    // Collect only the IfcProducts or IfcGroup
                    if (!ent.Value.IsSubTypeOf("IfcProduct") && !ent.Value.IsSubTypeOf("IfcGroup", strict:false) && !ent.Value.IsSubTypeOf("IfcTypeProduct"))
                    {
                        continue;
                    }

                    entInfo.Entity = ent.Key;
                    if (!string.IsNullOrEmpty(ent.Value.PredefinedType))
                    {
                        if (IfcSchemaEntityTree.PredefinedTypeEnumDict.ContainsKey(ent.Value.PredefinedType))
                        {
                            entInfo.PredefinedType = IfcSchemaEntityTree.PredefinedTypeEnumDict[ent.Value.PredefinedType];
                        }
                    }

                    // Get Pset list that is applicable to this entity type
                    if (entPsetDict.ContainsKey(entInfo.Entity))
                    {
                        entInfo.PropertySets = entPsetDict[entInfo.Entity].ToList();
                    }
                    // Collect Pset that is applicable to the supertype of this entity
                    IList <IfcSchemaEntityNode> supertypeList = IfcSchemaEntityTree.FindAllSuperTypes(entInfo.Entity,
                                                                                                      "IfcProduct", "IfcTypeProduct", "IfcGroup");
                    if (supertypeList != null && supertypeList.Count > 0)
                    {
                        foreach (IfcSchemaEntityNode superType in supertypeList)
                        {
                            if (entPsetDict.ContainsKey(superType.Name))
                            {
                                if (entInfo.PropertySets == null)
                                {
                                    entInfo.PropertySets = new List <string>();
                                }

                                foreach (string pset in entPsetDict[superType.Name])
                                {
                                    entInfo.PropertySets.Add(pset);
                                }
                            }
                        }
                    }

                    schemaEntities.EntityList.Add(entInfo);
                }
                fxEntityNPsetList.Add(schemaEntities);
            }
            ser.WriteObject(fs, fxEntityNPsetList);
            fs.Close();

            if (aggregateEntities.Count > 0)
            {
                string entityList;
                entityList = "using System;"
                             + "\r\nusing System.Collections.Generic;"
                             + "\r\nusing System.Linq;"
                             + "\r\nusing System.Text;"
                             + "\r\n"
                             + "\r\nnamespace Revit.IFC.Common.Enums"
                             + "\r\n{"
                             + "\r\n   /// <summary>"
                             + "\r\n   /// IFC entity types. Combining IFC2x3 and IFC4 (Add2) entities."
                             + "\r\n   /// List of Entities for IFC2x is found in IFC2xEntityType.cs"
                             + "\r\n   /// List of Entities for IFC4 is found in IFC4EntityType.cs"
                             + "\r\n   /// </summary>"
                             + "\r\n   public enum IFCEntityType"
                             + "\r\n   {";

                foreach (string ent in aggregateEntities)
                {
                    entityList += "\r\n      /// <summary>"
                                  + "\r\n      /// IFC Entity " + ent + " enumeration"
                                  + "\r\n      /// </summary>"
                                  + "\r\n      " + ent + ",\n";
                }
                entityList += "\r\n      Unknown,"
                              + "\r\n      DontExport"
                              + "\r\n   }"
                              + "\r\n}";
                System.IO.File.WriteAllText(outputFolder + @"\IFCEntityType.cs", entityList);
            }

            foreach (IFCEntityAndPsetList fxEntityNPset in fxEntityNPsetList)
            {
                string entityList;
                entityList = "using System;"
                             + "\r\nusing System.Collections.Generic;"
                             + "\r\nusing System.Linq;"
                             + "\r\nusing System.Text;"
                             + "\r\n"
                             + "\r\nnamespace Revit.IFC.Common.Enums." + fxEntityNPset.Version
                             + "\r\n{"
                             + "\r\n   /// <summary>"
                             + "\r\n   /// List of Entities for " + fxEntityNPset.Version
                             + "\r\n   /// </summary>"
                             + "\r\n   public enum EntityType"
                             + "\r\n   {";

                foreach (IFCEntityInfo entInfo in fxEntityNPset.EntityList)
                {
                    entityList += "\r\n      /// <summary>"
                                  + "\r\n      /// IFC Entity " + entInfo.Entity + " enumeration"
                                  + "\r\n      /// </summary>"
                                  + "\r\n      " + entInfo.Entity + ",\r\n";
                }
                entityList += "\r\n      Unknown,"
                              + "\r\n      DontExport"
                              + "\r\n   }"
                              + "\r\n}";
                System.IO.File.WriteAllText(outputFolder + @"\" + fxEntityNPset.Version + "EntityType.cs", entityList);
            }

            // Only allows test when only one schema is selected
            if (listBox_schemaList.SelectedItems.Count == 1)
            {
                button_subtypeTest.IsEnabled    = true;
                button_supertypeTest.IsEnabled  = true;
                button_ExportInfoPair.IsEnabled = true;
            }
            else
            {
                button_subtypeTest.IsEnabled    = false;
                button_supertypeTest.IsEnabled  = false;
                button_ExportInfoPair.IsEnabled = false;
            }

            if (logF != null)
            {
                logF.Close();
            }
        }
コード例 #2
0
        private void button_Go_Click(object sender, RoutedEventArgs e)
        {
            string tempFolder = System.IO.Path.GetTempPath();

            logF = new StreamWriter(Path.Combine(tempFolder, "GeneratePsetDefWin.log"));
            textBox_OutputMsg.Clear();

            string parFileNameOut = Path.Combine(Path.GetDirectoryName(SharedParFileName), Path.GetFileNameWithoutExtension(SharedParFileName) + "_out.txt");

            stSharedPar = File.CreateText(parFileNameOut);
            IDictionary <string, SharedParameterDef> existingParDict = ProcessPsetDefinition.processExistingParFile(SharedParFileName);

            IDictionary <string, SharedParameterDef> existingTypeParDict = new Dictionary <string, SharedParameterDef>();

            if (File.Exists(SharedParFileNameType))
            {
                string typeParFileNameOut = Path.Combine(Path.GetDirectoryName(SharedParFileNameType), Path.GetFileNameWithoutExtension(SharedParFileNameType) + "_out.txt");
                stSharedParType     = File.CreateText(typeParFileNameOut);
                existingTypeParDict = ProcessPsetDefinition.processExistingParFile(SharedParFileNameType);
            }
            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);
            var qtoFolders = new DirectoryInfo(textBox_PSDSourceDir.Text).GetDirectories("qto", SearchOption.AllDirectories);

            string dirName       = Path.GetDirectoryName(textBox_OutputFile.Text);
            string outFileName   = Path.GetFileNameWithoutExtension(textBox_OutputFile.Text);
            string penumFileName = Path.Combine(dirName, outFileName);

            // Collect all Pset definition for psd folders
            Dictionary <ItemsInPsetQtoDefs, string> keywordsToProcess = PsetOrQto.PsetOrQtoDefItems[PsetOrQtoSetEnum.PROPERTYSET];
            HashSet <string> IfcSchemaProcessed = new HashSet <string>();

            foreach (DirectoryInfo psd in psdFolders)
            {
                string schemaFolder = psd.FullName.Remove(0, textBox_PSDSourceDir.Text.Length + 1).Split('\\')[0];

                logF.WriteLine("\r\n*** Processing " + schemaFolder);
                foreach (DirectoryInfo subDir in psd.GetDirectories())
                {
                    procPsetDef.ProcessSchemaPsetDef(schemaFolder, subDir, keywordsToProcess);
                }
                procPsetDef.ProcessSchemaPsetDef(schemaFolder, psd, keywordsToProcess);
                IfcSchemaProcessed.Add(schemaFolder);
            }

            // Collect all QtoSet definition for qto folders
            keywordsToProcess = PsetOrQto.PsetOrQtoDefItems[PsetOrQtoSetEnum.QTOSET];
            foreach (DirectoryInfo qto in qtoFolders)
            {
                string schemaFolder = qto.FullName.Remove(0, textBox_PSDSourceDir.Text.Length + 1).Split('\\')[0];

                logF.WriteLine("\r\n*** Processing " + schemaFolder);
                foreach (DirectoryInfo subDir in qto.GetDirectories())
                {
                    procPsetDef.ProcessSchemaPsetDef(schemaFolder, subDir, keywordsToProcess);
                }
                procPsetDef.ProcessSchemaPsetDef(schemaFolder, qto, keywordsToProcess);
            }

            // Process predefined properties
            foreach (string schemaName in IfcSchemaProcessed)
            {
                logF.WriteLine("\r\n*** Processing " + schemaName);
                procPsetDef.ProcessPredefinedPsets(schemaName);
            }

            // 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 += "\r\n  ===> IfcVersion: " + vPdef.IfcVersion;
                        pSetDump += "\r\n" + vPdef.PropertySetDef.ToString() + "\r\n";
                    }
                    pSetDump += "\r\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();
            }

            IDictionary <string, int> groupParamDict = new Dictionary <string, int>();

            string[] outFNameParts = outFileName.Split('_');

            // Do it for the predefined propserty sets
            string fNameToProcess = Path.Combine(dirName, outFNameParts[0] + "_PredefPset.cs");

            if (File.Exists(fNameToProcess))
            {
                File.Delete(fNameToProcess);
            }
            StreamWriter outF = new StreamWriter(fNameToProcess);
            // Group ID 1 and 2 are reserved
            int offset = 3;

            offset = WriteGeneratedCode(outF, procPsetDef, penumFileName, "Ifc", groupParamDict, offset);

            // Do it for the predefined propserty sets
            fNameToProcess = Path.Combine(dirName, outFNameParts[0] + "_PsetDef.cs");
            if (File.Exists(fNameToProcess))
            {
                File.Delete(fNameToProcess);
            }
            outF   = new StreamWriter(fNameToProcess);
            offset = WriteGeneratedCode(outF, procPsetDef, penumFileName, "Pset", groupParamDict, offset);

            // Do it for the predefined propserty sets
            fNameToProcess = Path.Combine(dirName, outFNameParts[0] + "_QsetDef.cs");
            if (File.Exists(fNameToProcess))
            {
                File.Delete(fNameToProcess);
            }
            outF   = new StreamWriter(fNameToProcess);
            offset = WriteGeneratedCode(outF, procPsetDef, penumFileName, "Qto", groupParamDict, offset);

            // Close the Enum files
            procPsetDef.endWriteEnumFile();
            WriteRevitSharedParam(stSharedPar, existingParDict, groupParamDict, false, out IList <string> deferredParList);
            AppendDeferredParamList(stSharedPar, deferredParList);
            stSharedPar.Close();

            WriteRevitSharedParam(stSharedParType, existingTypeParDict, groupParamDict, true, out IList <string> deferredParTypeList);
            AppendDeferredParamList(stSharedParType, deferredParTypeList);
            stSharedParType.Close();
            logF.Close();
        }