/// <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();
        }