/// <summary>
        /// Checks if element should be exported using a variety of different checks.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="element">The element.</param>
        /// <param name="allowSeparateOpeningExport">True if IfcOpeningElement is allowed to be exported.</param>
        /// <returns>True if the element should be exported, false otherwise.</returns>
        /// <remarks>There are some inefficiencies here, as we call GetExportInfoFromParameters
        /// in other contexts.  We should attempt to get the value only once.</remarks>
        public static bool ShouldElementBeExported(ExporterIFC exporterIFC, Element element, bool allowSeparateOpeningExport)
        {
            // Allow the ExporterStateManager to say that an element should be exported regardless of settings.
            if (ExporterStateManager.CanExportElementOverride())
            {
                return(true);
            }

            // First, check if the element is set explicitly to be exported or not exported.  This
            // overrides category settings.
            Element          elementType        = element.Document.GetElement(element.GetTypeId());
            IFCExportElement?exportElementState = GetExportElementState(element, elementType);

            if (exportElementState.HasValue)
            {
                return(exportElementState.Value == IFCExportElement.Yes);
            }

            // Check to see if the category should be exported if parameters aren't set.
            // Note that in previous versions, the category override the parameter settings.  This is
            // no longer true.
            if (!ShouldCategoryBeExported(exporterIFC, element, allowSeparateOpeningExport))
            {
                return(false);
            }

            // Check whether the intended Entity type is inside the export exclusion set
            IFCExportInfoPair exportInfo = ExporterUtil.GetIFCExportElementParameterInfo(element, IFCEntityType.IfcRoot);

            return(!ExporterCacheManager.ExportOptionsCache.IsElementInExcludeList(exportInfo.ExportInstance));
        }