/// <summary> /// Updates the setups to save into the document. /// </summary> public void UpdateSavedConfigurations(IFCExportConfigurationsMap initialConfigs) { // delete the old schema and the DataStorage. if (m_OldSchema == null) { m_OldSchema = Schema.Lookup(s_OldSchemaId); } if (m_OldSchema != null) { IList <DataStorage> oldSavedConfigurations = GetSavedConfigurations(m_OldSchema); if (oldSavedConfigurations.Count > 0) { Transaction deleteTransaction = new Transaction(IFCCommandOverrideApplication.TheDocument, Properties.Resources.DeleteOldSetups); try { deleteTransaction.Start(Properties.Resources.DeleteOldConfiguration); List <ElementId> dataStorageToDelete = new List <ElementId>(); foreach (DataStorage dataStorage in oldSavedConfigurations) { dataStorageToDelete.Add(dataStorage.Id); } IFCCommandOverrideApplication.TheDocument.Delete(dataStorageToDelete); deleteTransaction.Commit(); } catch (System.Exception) { if (deleteTransaction.HasStarted()) { deleteTransaction.RollBack(); } } } } // delete the old schema and the DataStorage. if (m_mapSchema == null) { m_mapSchema = Schema.Lookup(s_mapSchemaId); } if (m_mapSchema != null) { IList <DataStorage> oldSavedConfigurations = GetSavedConfigurations(m_mapSchema); if (oldSavedConfigurations.Count > 0) { Transaction deleteTransaction = new Transaction(IFCCommandOverrideApplication.TheDocument, Properties.Resources.DeleteOldSetups); try { deleteTransaction.Start(Properties.Resources.DeleteOldConfiguration); List <ElementId> dataStorageToDelete = new List <ElementId>(); foreach (DataStorage dataStorage in oldSavedConfigurations) { dataStorageToDelete.Add(dataStorage.Id); } IFCCommandOverrideApplication.TheDocument.Delete(dataStorageToDelete); deleteTransaction.Commit(); } catch (System.Exception) { if (deleteTransaction.HasStarted()) { deleteTransaction.RollBack(); } } } } // update the configurations to new map schema. if (m_jsonSchema == null) { m_jsonSchema = Schema.Lookup(s_jsonSchemaId); } // Are there any setups to save or resave? List <IFCExportConfiguration> setupsToSave = new List <IFCExportConfiguration>(); foreach (IFCExportConfiguration configuration in m_configurations.Values) { // Store in-session settings in the cached in-session configuration if (configuration.IsInSession) { IFCExportConfiguration.SetInSession(configuration); continue; } // Only add to setupsToSave if it is a new or changed configuration if (initialConfigs.HasName(configuration.Name)) { if (!ConfigurationComparer.ConfigurationsAreEqual(initialConfigs[configuration.Name], configuration)) { setupsToSave.Add(configuration); } else if (!configuration.IsBuiltIn) { setupsToSave.Add(configuration); } } else { setupsToSave.Add(configuration); } } // If there are no setups to save, and if the schema is not present (which means there are no // previously existing setups which might have been deleted) we can skip the rest of this method. if (setupsToSave.Count <= 0 && m_jsonSchema == null) { return; } if (m_jsonSchema == null) { SchemaBuilder builder = new SchemaBuilder(s_jsonSchemaId); builder.SetSchemaName("IFCExportConfigurationMap"); builder.AddSimpleField(s_configMapField, typeof(String)); m_jsonSchema = builder.Finish(); } // It won't start any transaction if there is no change to the configurations if (setupsToSave.Count > 0) { // Overwrite all saved configs with the new list Transaction transaction = new Transaction(IFCCommandOverrideApplication.TheDocument, Properties.Resources.UpdateExportSetups); try { transaction.Start(Properties.Resources.SaveConfigurationChanges); IList <DataStorage> savedConfigurations = GetSavedConfigurations(m_jsonSchema); int savedConfigurationCount = savedConfigurations.Count <DataStorage>(); int savedConfigurationIndex = 0; foreach (IFCExportConfiguration configuration in setupsToSave) { DataStorage configStorage; if (savedConfigurationIndex >= savedConfigurationCount) { configStorage = DataStorage.Create(IFCCommandOverrideApplication.TheDocument); } else { configStorage = savedConfigurations[savedConfigurationIndex]; savedConfigurationIndex++; } Entity mapEntity = new Entity(m_jsonSchema); string configData = configuration.SerializeConfigToJson(); mapEntity.Set <string>(s_configMapField, configData); configStorage.SetEntity(mapEntity); } List <ElementId> elementsToDelete = new List <ElementId>(); for (; savedConfigurationIndex < savedConfigurationCount; savedConfigurationIndex++) { DataStorage configStorage = savedConfigurations[savedConfigurationIndex]; elementsToDelete.Add(configStorage.Id); } if (elementsToDelete.Count > 0) { IFCCommandOverrideApplication.TheDocument.Delete(elementsToDelete); } transaction.Commit(); } catch (System.Exception) { if (transaction.HasStarted()) { transaction.RollBack(); } } } }
/// <summary> /// Updates the setups to save into the document. /// </summary> public void UpdateSavedConfigurations() { // delete the old schema and the DataStorage. if (m_schema == null) { m_schema = Schema.Lookup(s_schemaId); } if (m_schema != null) { IList <DataStorage> oldSavedConfigurations = GetSavedConfigurations(m_schema); if (oldSavedConfigurations.Count > 0) { Transaction deleteTransaction = new Transaction(IFCCommandOverrideApplication.TheDocument, Properties.Resources.DeleteOldSetups); try { deleteTransaction.Start(); List <ElementId> dataStorageToDelete = new List <ElementId>(); foreach (DataStorage dataStorage in oldSavedConfigurations) { dataStorageToDelete.Add(dataStorage.Id); } IFCCommandOverrideApplication.TheDocument.Delete(dataStorageToDelete); deleteTransaction.Commit(); } catch (System.Exception) { if (deleteTransaction.HasStarted()) { deleteTransaction.RollBack(); } } } } // update the configurations to new map schema. if (m_mapSchema == null) { m_mapSchema = Schema.Lookup(s_mapSchemaId); } // Are there any setups to save or resave? List <IFCExportConfiguration> setupsToSave = new List <IFCExportConfiguration>(); foreach (IFCExportConfiguration configuration in m_configurations.Values) { if (configuration.IsBuiltIn) { continue; } // Store in-session settings in the cached in-session configuration if (configuration.IsInSession) { IFCExportConfiguration.SetInSession(configuration); continue; } setupsToSave.Add(configuration); } // If there are no setups to save, and if the schema is not present (which means there are no // previously existing setups which might have been deleted) we can skip the rest of this method. if (setupsToSave.Count <= 0 && m_mapSchema == null) { return; } if (m_mapSchema == null) { SchemaBuilder builder = new SchemaBuilder(s_mapSchemaId); builder.SetSchemaName("IFCExportConfigurationMap"); builder.AddMapField(s_configMapField, typeof(String), typeof(String)); m_mapSchema = builder.Finish(); } // Overwrite all saved configs with the new list Transaction transaction = new Transaction(IFCCommandOverrideApplication.TheDocument, Properties.Resources.UpdateExportSetups); try { transaction.Start(); IList <DataStorage> savedConfigurations = GetSavedConfigurations(m_mapSchema); int savedConfigurationCount = savedConfigurations.Count <DataStorage>(); int savedConfigurationIndex = 0; foreach (IFCExportConfiguration configuration in setupsToSave) { DataStorage configStorage; if (savedConfigurationIndex >= savedConfigurationCount) { configStorage = DataStorage.Create(IFCCommandOverrideApplication.TheDocument); } else { configStorage = savedConfigurations[savedConfigurationIndex]; savedConfigurationIndex++; } Entity mapEntity = new Entity(m_mapSchema); IDictionary <string, string> mapData = new Dictionary <string, string>(); mapData.Add(s_setupName, configuration.Name); mapData.Add(s_setupVersion, configuration.IFCVersion.ToString()); mapData.Add(s_setupFileFormat, configuration.IFCFileType.ToString()); mapData.Add(s_setupSpaceBoundaries, configuration.SpaceBoundaries.ToString()); mapData.Add(s_setupQTO, configuration.ExportBaseQuantities.ToString()); mapData.Add(s_setupCurrentView, configuration.VisibleElementsOfCurrentView.ToString()); mapData.Add(s_splitWallsAndColumns, configuration.SplitWallsAndColumns.ToString()); mapData.Add(s_setupExport2D, configuration.Export2DElements.ToString()); mapData.Add(s_setupExportRevitProps, configuration.ExportInternalRevitPropertySets.ToString()); mapData.Add(s_setupExportIFCCommonProperty, configuration.ExportIFCCommonPropertySets.ToString()); mapData.Add(s_setupUse2DForRoomVolume, configuration.Use2DRoomBoundaryForVolume.ToString()); mapData.Add(s_setupUseFamilyAndTypeName, configuration.UseFamilyAndTypeNameForReference.ToString()); mapData.Add(s_setupExportPartsAsBuildingElements, configuration.ExportPartsAsBuildingElements.ToString()); mapData.Add(s_useActiveViewGeometry, configuration.UseActiveViewGeometry.ToString()); mapData.Add(s_setupExportSpecificSchedules, configuration.ExportSpecificSchedules.ToString()); mapData.Add(s_setupExportBoundingBox, configuration.ExportBoundingBox.ToString()); mapData.Add(s_setupExportSolidModelRep, configuration.ExportSolidModelRep.ToString()); mapData.Add(s_setupExportSchedulesAsPsets, configuration.ExportSchedulesAsPsets.ToString()); mapData.Add(s_setupExportUserDefinedPsets, configuration.ExportUserDefinedPsets.ToString()); mapData.Add(s_setupExportUserDefinedPsetsFileName, configuration.ExportUserDefinedPsetsFileName); mapData.Add(s_setupExportUserDefinedParameterMapping, configuration.ExportUserDefinedParameterMapping.ToString()); mapData.Add(s_setupExportUserDefinedParameterMappingFileName, configuration.ExportUserDefinedParameterMappingFileName); mapData.Add(s_setupExportLinkedFiles, configuration.ExportLinkedFiles.ToString()); mapData.Add(s_setupIncludeSiteElevation, configuration.IncludeSiteElevation.ToString()); mapData.Add(s_setupStoreIFCGUID, configuration.StoreIFCGUID.ToString()); mapData.Add(s_setupActivePhase, configuration.ActivePhaseId.ToString()); mapData.Add(s_setupExportRoomsInView, configuration.ExportRoomsInView.ToString()); mapData.Add(s_useOnlyTriangulation, configuration.UseOnlyTriangulation.ToString()); mapData.Add(s_excludeFilter, configuration.ExcludeFilter.ToString()); mapData.Add(s_setupSitePlacement, configuration.SitePlacement.ToString()); mapData.Add(s_useTypeNameOnlyForIfcType, configuration.UseTypeNameOnlyForIfcType.ToString()); mapData.Add(s_useVisibleRevitNameAsEntityName, configuration.UseVisibleRevitNameAsEntityName.ToString()); // For COBie v2.4 mapData.Add(s_cobieCompanyInfo, configuration.COBieCompanyInfo); mapData.Add(s_cobieProjectInfo, configuration.COBieProjectInfo); mapData.Add(s_includeSteelElements, configuration.IncludeSteelElements.ToString()); mapEntity.Set <IDictionary <string, String> >(s_configMapField, mapData); configStorage.SetEntity(mapEntity); } List <ElementId> elementsToDelete = new List <ElementId>(); for (; savedConfigurationIndex < savedConfigurationCount; savedConfigurationIndex++) { DataStorage configStorage = savedConfigurations[savedConfigurationIndex]; elementsToDelete.Add(configStorage.Id); } if (elementsToDelete.Count > 0) { IFCCommandOverrideApplication.TheDocument.Delete(elementsToDelete); } transaction.Commit(); } catch (System.Exception) { if (transaction.HasStarted()) { transaction.RollBack(); } } }
/// <summary> /// Updates the setups to save into the document. /// </summary> /// <param name="document">The document storing the saved configuration.</param> public void UpdateSavedConfigurations(Document document) { if (m_schema == null) { m_schema = Schema.Lookup(s_schemaId); } // Are there any setups to save or resave? List <IFCExportConfiguration> setupsToSave = new List <IFCExportConfiguration>(); foreach (IFCExportConfiguration configuration in m_configurations.Values) { if (configuration.IsBuiltIn) { continue; } // Store in-session settings in the cached in-session configuration if (configuration.IsInSession) { IFCExportConfiguration.SetInSession(configuration); continue; } setupsToSave.Add(configuration); } // If there are no setups to save, and if the schema is not present (which means there are no // previously existing setups which might have been deleted) we can skip the rest of this method. if (setupsToSave.Count <= 0 && m_schema == null) { return; } if (m_schema == null) { SchemaBuilder builder = new SchemaBuilder(s_schemaId); builder.SetSchemaName("IFCExportConfiguration"); builder.AddSimpleField(s_setupName, typeof(String)); builder.AddSimpleField(s_setupDescription, typeof(String)); builder.AddSimpleField(s_setupVersion, typeof(int)); builder.AddSimpleField(s_setupFileFormat, typeof(int)); builder.AddSimpleField(s_setupSpaceBoundaries, typeof(int)); builder.AddSimpleField(s_setupQTO, typeof(bool)); builder.AddSimpleField(s_splitWallsAndColumns, typeof(bool)); builder.AddSimpleField(s_setupCurrentView, typeof(bool)); builder.AddSimpleField(s_setupExport2D, typeof(bool)); builder.AddSimpleField(s_setupExportRevitProps, typeof(bool)); builder.AddSimpleField(s_setupUse2DForRoomVolume, typeof(bool)); builder.AddSimpleField(s_setupUseFamilyAndTypeName, typeof(bool)); builder.AddSimpleField(s_setupExportPartsAsBuildingElements, typeof(bool)); m_schema = builder.Finish(); } // Overwrite all saved configs with the new list Transaction transaction = new Transaction(document, "Update IFC export setups"); transaction.Start(); IList <DataStorage> savedConfigurations = GetSavedConfigurations(document); int savedConfigurationCount = savedConfigurations.Count <DataStorage>(); int savedConfigurationIndex = 0; foreach (IFCExportConfiguration configuration in setupsToSave) { DataStorage configStorage; if (savedConfigurationIndex >= savedConfigurationCount) { configStorage = DataStorage.Create(document); } else { configStorage = savedConfigurations[savedConfigurationIndex]; savedConfigurationIndex++; } Entity entity = new Entity(m_schema); entity.Set(s_setupName, configuration.Name); entity.Set(s_setupDescription, configuration.Description); entity.Set(s_setupVersion, (int)configuration.IFCVersion); entity.Set(s_setupFileFormat, (int)configuration.IFCFileType); entity.Set(s_setupSpaceBoundaries, configuration.SpaceBoundaries); entity.Set(s_setupQTO, configuration.ExportBaseQuantities); entity.Set(s_setupCurrentView, configuration.VisibleElementsOfCurrentView); entity.Set(s_splitWallsAndColumns, configuration.SplitWallsAndColumns); entity.Set(s_setupExport2D, configuration.Export2DElements); entity.Set(s_setupExportRevitProps, configuration.ExportInternalRevitPropertySets); entity.Set(s_setupUse2DForRoomVolume, configuration.Use2DRoomBoundaryForVolume); entity.Set(s_setupUseFamilyAndTypeName, configuration.UseFamilyAndTypeNameForReference); entity.Set(s_setupExportPartsAsBuildingElements, configuration.ExportPartsAsBuildingElements); configStorage.SetEntity(entity); } List <ElementId> elementsToDelete = new List <ElementId>(); for (; savedConfigurationIndex < savedConfigurationCount; savedConfigurationIndex++) { DataStorage configStorage = savedConfigurations[savedConfigurationIndex]; elementsToDelete.Add(configStorage.Id); } if (elementsToDelete.Count > 0) { document.Delete(elementsToDelete); } transaction.Commit(); }