/// <summary> /// Exports spatial elements, including rooms, areas and spaces. 2nd level space boundaries. /// </summary> /// <param name="ifcExporter">The Exporter object.</param> /// <param name="exporterIFC"> The ExporterIFC object.</param> /// <param name="document">The Revit document.</param> /// <returns>The set of exported spaces. This is used to try to export using the standard routine for spaces that failed.</returns> public static ISet<ElementId> ExportSpatialElement2ndLevel(Revit.IFC.Export.Exporter.Exporter ifcExporter, ExporterIFC exporterIFC, Document document) { ISet<ElementId> exportedSpaceIds = new HashSet<ElementId>(); using (SubTransaction st = new SubTransaction(document)) { st.Start(); EnergyAnalysisDetailModel model = null; try { View filterView = ExporterCacheManager.ExportOptionsCache.FilterViewForExport; IFCFile file = exporterIFC.GetFile(); using (IFCTransaction transaction = new IFCTransaction(file)) { EnergyAnalysisDetailModelOptions options = new EnergyAnalysisDetailModelOptions(); options.Tier = EnergyAnalysisDetailModelTier.SecondLevelBoundaries; //2nd level space boundaries options.SimplifyCurtainSystems = true; try { model = EnergyAnalysisDetailModel.Create(document, options); } catch (System.Exception) { return exportedSpaceIds; } IList<EnergyAnalysisSpace> spaces = model.GetAnalyticalSpaces(); foreach (EnergyAnalysisSpace space in spaces) { SpatialElement spatialElement = document.GetElement(space.CADObjectUniqueId) as SpatialElement; if (spatialElement == null) continue; //current view only if (!ElementFilteringUtil.IsElementVisible(spatialElement)) continue; if (!ElementFilteringUtil.ShouldElementBeExported(exporterIFC, spatialElement, false)) continue; if (ElementFilteringUtil.IsRoomInInvalidPhase(spatialElement)) continue; Options geomOptions = GeometryUtil.GetIFCExportGeometryOptions(); View ownerView = spatialElement.Document.GetElement(spatialElement.OwnerViewId) as View; if (ownerView != null) geomOptions.View = ownerView; GeometryElement geomElem = spatialElement.get_Geometry(geomOptions); try { exporterIFC.PushExportState(spatialElement, geomElem); using (ProductWrapper productWrapper = ProductWrapper.Create(exporterIFC, true)) { using (PlacementSetter setter = PlacementSetter.Create(exporterIFC, spatialElement)) { // We won't use the SpatialElementGeometryResults, as these are 1st level boundaries, not 2nd level. SpatialElementGeometryResults results = null; if (!CreateIFCSpace(exporterIFC, spatialElement, productWrapper, setter, out results)) continue; exportedSpaceIds.Add(spatialElement.Id); XYZ offset = GetSpaceBoundaryOffset(setter); //get boundary information from surfaces IList<EnergyAnalysisSurface> surfaces = space.GetAnalyticalSurfaces(); foreach (EnergyAnalysisSurface surface in surfaces) { Element boundingElement = GetBoundaryElement(document, surface.CADLinkUniqueId, surface.CADObjectUniqueId); IList<EnergyAnalysisOpening> openings = surface.GetAnalyticalOpenings(); IFCAnyHandle connectionGeometry = CreateConnectionSurfaceGeometry(exporterIFC, surface, openings, offset); CreateIFCSpaceBoundary(file, exporterIFC, spatialElement, boundingElement, setter.LevelId, connectionGeometry); // try to add doors and windows for host objects if appropriate. if (boundingElement is HostObject) { foreach (EnergyAnalysisOpening opening in openings) { Element openingBoundingElem = GetBoundaryElement(document, opening.CADLinkUniqueId, opening.CADObjectUniqueId); IFCAnyHandle openingConnectionGeom = CreateConnectionSurfaceGeometry(exporterIFC, opening, offset); CreateIFCSpaceBoundary(file, exporterIFC, spatialElement, openingBoundingElem, setter.LevelId, openingConnectionGeom); } } } CreateZoneInfos(exporterIFC, file, spatialElement, productWrapper); CreateSpaceOccupantInfo(exporterIFC, file, spatialElement, productWrapper); ExporterUtil.ExportRelatedProperties(exporterIFC, spatialElement, productWrapper); } } } catch (Exception ex) { ifcExporter.HandleUnexpectedException(ex, exporterIFC, spatialElement); } finally { exporterIFC.PopExportState(); } } transaction.Commit(); } } finally { if (model != null) EnergyAnalysisDetailModel.Destroy(model); } st.RollBack(); return exportedSpaceIds; } }
/// <summary> /// Implements the export of element. /// </summary> /// <param name="exporterIFC">The IFC exporter object.</param> /// <param name="element">The element to export.</param> /// <param name="productWrapper">The ProductWrapper object.</param> public virtual void ExportElementImpl(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper) { Options options; View ownerView = element.Document.GetElement(element.OwnerViewId) as View; if (ownerView == null) { options = GeometryUtil.GetIFCExportGeometryOptions(); } else { options = new Options(); options.View = ownerView; } GeometryElement geomElem = element.get_Geometry(options); // Default: we don't preserve the element parameter cache after export. bool shouldPreserveParameterCache = false; try { exporterIFC.PushExportState(element, geomElem); Autodesk.Revit.DB.Document doc = element.Document; using (SubTransaction st = new SubTransaction(doc)) { st.Start(); // A long list of supported elements. Please keep in alphabetical order. if (element is AreaReinforcement || element is PathReinforcement || element is Rebar) { RebarExporter.Export(exporterIFC, element, productWrapper); } else if (element is AreaScheme) { AreaSchemeExporter.ExportAreaScheme(exporterIFC, element as AreaScheme, productWrapper); } else if (element is AssemblyInstance) { AssemblyInstance assemblyInstance = element as AssemblyInstance; AssemblyInstanceExporter.ExportAssemblyInstanceElement(exporterIFC, assemblyInstance, productWrapper); } else if (element is BeamSystem) { if (ExporterCacheManager.BeamSystemCache.Contains(element.Id)) AssemblyInstanceExporter.ExportBeamSystem(exporterIFC, element as BeamSystem, productWrapper); else { ExporterCacheManager.BeamSystemCache.Add(element.Id); shouldPreserveParameterCache = true; } } else if (element is Ceiling) { Ceiling ceiling = element as Ceiling; CeilingExporter.ExportCeilingElement(exporterIFC, ceiling, geomElem, productWrapper); } else if (element is CeilingAndFloor || element is Floor) { // This covers both Floors and Building Pads. CeilingAndFloor hostObject = element as CeilingAndFloor; FloorExporter.ExportCeilingAndFloorElement(exporterIFC, hostObject, geomElem, productWrapper); } else if (element is ContFooting) { ContFooting footing = element as ContFooting; FootingExporter.ExportFootingElement(exporterIFC, footing, geomElem, productWrapper); } else if (element is CurveElement) { CurveElement curveElem = element as CurveElement; CurveElementExporter.ExportCurveElement(exporterIFC, curveElem, geomElem, productWrapper); } else if (element is CurtainSystem) { CurtainSystem curtainSystem = element as CurtainSystem; CurtainSystemExporter.ExportCurtainSystem(exporterIFC, curtainSystem, productWrapper); } else if (CurtainSystemExporter.IsLegacyCurtainElement(element)) { CurtainSystemExporter.ExportLegacyCurtainElement(exporterIFC, element, productWrapper); } else if (element is DuctInsulation) { DuctInsulation ductInsulation = element as DuctInsulation; DuctInsulationExporter.ExportDuctInsulation(exporterIFC, ductInsulation, geomElem, productWrapper); } else if (element is DuctLining) { DuctLining ductLining = element as DuctLining; DuctLiningExporter.ExportDuctLining(exporterIFC, ductLining, geomElem, productWrapper); } else if (element is ElectricalSystem) { ExporterCacheManager.SystemsCache.AddElectricalSystem(element.Id); } else if (element is FabricArea) { // We are exporting the fabric area as a group only. FabricSheetExporter.ExportFabricArea(exporterIFC, element, productWrapper); } else if (element is FabricSheet) { FabricSheet fabricSheet = element as FabricSheet; FabricSheetExporter.ExportFabricSheet(exporterIFC, fabricSheet, geomElem, productWrapper); } else if (element is FaceWall) { WallExporter.ExportWall(exporterIFC, element, null, geomElem, productWrapper); } else if (element is FamilyInstance) { FamilyInstance familyInstanceElem = element as FamilyInstance; FamilyInstanceExporter.ExportFamilyInstanceElement(exporterIFC, familyInstanceElem, geomElem, productWrapper); } else if (element is FilledRegion) { FilledRegion filledRegion = element as FilledRegion; FilledRegionExporter.Export(exporterIFC, filledRegion, geomElem, productWrapper); } else if (element is Grid) { ExporterCacheManager.GridCache.Add(element); } else if (element is Group) { Group group = element as Group; GroupExporter.ExportGroupElement(exporterIFC, group, productWrapper); } else if (element is HostedSweep) { HostedSweep hostedSweep = element as HostedSweep; HostedSweepExporter.Export(exporterIFC, hostedSweep, geomElem, productWrapper); } else if (element is Part) { Part part = element as Part; if (ExporterCacheManager.ExportOptionsCache.ExportPartsAsBuildingElements) PartExporter.ExportPartAsBuildingElement(exporterIFC, part, geomElem, productWrapper); else PartExporter.ExportStandalonePart(exporterIFC, part, geomElem, productWrapper); } else if (element is PipeInsulation) { PipeInsulation pipeInsulation = element as PipeInsulation; PipeInsulationExporter.ExportPipeInsulation(exporterIFC, pipeInsulation, geomElem, productWrapper); } else if (element is Railing) { if (ExporterCacheManager.RailingCache.Contains(element.Id)) RailingExporter.ExportRailingElement(exporterIFC, element as Railing, productWrapper); else { ExporterCacheManager.RailingCache.Add(element.Id); RailingExporter.AddSubElementsToCache(element as Railing); shouldPreserveParameterCache = true; } } else if (RampExporter.IsRamp(element)) { RampExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (element is RoofBase) { RoofBase roofElement = element as RoofBase; RoofExporter.Export(exporterIFC, roofElement, geomElem, productWrapper); } else if (element is SpatialElement) { SpatialElement spatialElem = element as SpatialElement; SpatialElementExporter.ExportSpatialElement(exporterIFC, spatialElem, productWrapper); } else if (IsStairs(element)) { StairsExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (element is TextNote) { TextNote textNote = element as TextNote; TextNoteExporter.Export(exporterIFC, textNote, productWrapper); } else if (element is TopographySurface) { TopographySurface topSurface = element as TopographySurface; SiteExporter.ExportTopographySurface(exporterIFC, topSurface, geomElem, productWrapper); } else if (element is Truss) { if (ExporterCacheManager.TrussCache.Contains(element.Id)) AssemblyInstanceExporter.ExportTrussElement(exporterIFC, element as Truss, productWrapper); else { ExporterCacheManager.TrussCache.Add(element.Id); shouldPreserveParameterCache = true; } } else if (element is Wall) { Wall wallElem = element as Wall; WallExporter.Export(exporterIFC, wallElem, geomElem, productWrapper); } else if (element is WallSweep) { WallSweep wallSweep = element as WallSweep; WallSweepExporter.Export(exporterIFC, wallSweep, geomElem, productWrapper); } else if (element is Zone) { if (ExporterCacheManager.ZoneCache.Contains(element.Id)) ZoneExporter.ExportZone(exporterIFC, element as Zone, productWrapper); else { ExporterCacheManager.ZoneCache.Add(element.Id); shouldPreserveParameterCache = true; } } else { string ifcEnumType; IFCExportType exportType = ExporterUtil.GetExportType(exporterIFC, element, out ifcEnumType); bool exported = false; if (IsMEPType(exporterIFC, element, exportType)) exported = GenericMEPExporter.Export(exporterIFC, element, geomElem, exportType, ifcEnumType, productWrapper); else if (ExportAsProxy(element, exportType)) exported = ProxyElementExporter.Export(exporterIFC, element, geomElem, productWrapper); // For ducts and pipes, we will add a IfcRelCoversBldgElements during the end of export. if (exported && (element is Duct || element is Pipe)) ExporterCacheManager.MEPCache.CoveredElementsCache.Add(element.Id); } if (element.AssemblyInstanceId != ElementId.InvalidElementId) ExporterCacheManager.AssemblyInstanceCache.RegisterElements(element.AssemblyInstanceId, productWrapper); if (element.GroupId != ElementId.InvalidElementId) ExporterCacheManager.GroupCache.RegisterElements(element.GroupId, productWrapper); st.RollBack(); } } finally { exporterIFC.PopExportState(); ExporterStateManager.PreserveElementParameterCache(element, shouldPreserveParameterCache); } }
/// <summary> /// Exports spatial elements, including rooms, areas and spaces. 2nd level space boundaries. /// </summary> /// <param name="ifcExporter"> /// The Exporter object. /// </param> /// <param name="exporterIFC"> /// The ExporterIFC object. /// </param> /// <param name="document"> /// The Revit document. /// </param> /// <param name="filterView"> /// The view not exported. /// </param> /// <param name="spaceExported"> /// The output boolean value indicates if exported successfully. /// </param> public static void ExportSpatialElement2ndLevel(BIM.IFC.Exporter.Exporter ifcExporter, ExporterIFC exporterIFC, Document document, View filterView, ref bool spaceExported) { using (SubTransaction st = new SubTransaction(document)) { st.Start(); EnergyAnalysisDetailModel model = null; try { IFCFile file = exporterIFC.GetFile(); using (IFCTransaction transaction = new IFCTransaction(file)) { EnergyAnalysisDetailModelOptions options = new EnergyAnalysisDetailModelOptions(); options.Tier = EnergyAnalysisDetailModelTier.SecondLevelBoundaries; //2nd level space boundaries options.SimplifyCurtainSystems = true; try { model = EnergyAnalysisDetailModel.Create(document, options); } catch (System.Exception) { spaceExported = false; return; } IList<EnergyAnalysisSpace> spaces = model.GetAnalyticalSpaces(); spaceExported = true; foreach (EnergyAnalysisSpace space in spaces) { SpatialElement spatialElement = document.GetElement(space.SpatialElementId) as SpatialElement; if (spatialElement == null) continue; //quick reject bool isArea = spatialElement is Area; if (isArea) { if (!IsAreaGrossInterior(exporterIFC, spatialElement)) continue; } //current view only if (filterView != null && !ElementFilteringUtil.IsElementVisible(filterView, spatialElement)) continue; // if (!ElementFilteringUtil.ShouldCategoryBeExported(exporterIFC, spatialElement)) continue; Options geomOptions = GeometryUtil.GetIFCExportGeometryOptions(); View ownerView = spatialElement.Document.GetElement(spatialElement.OwnerViewId) as View; if (ownerView != null) geomOptions.View = ownerView; GeometryElement geomElem = spatialElement.get_Geometry(geomOptions); try { exporterIFC.PushExportState(spatialElement, geomElem); using (ProductWrapper productWrapper = ProductWrapper.Create(exporterIFC, true)) { ElementId levelId = spatialElement.Level != null ? spatialElement.Level.Id : ElementId.InvalidElementId; using (IFCPlacementSetter setter = IFCPlacementSetter.Create(exporterIFC, spatialElement, null, null, levelId)) { if (!CreateIFCSpace(exporterIFC, spatialElement, productWrapper, setter)) continue; XYZ offset = GetSapceBoundaryOffset(setter); //get boundary information from surfaces IList<EnergyAnalysisSurface> surfaces = space.GetAnalyticalSurfaces(); foreach (EnergyAnalysisSurface surface in surfaces) { Element boundingElement = GetBoundaryElement(document, surface.OriginatingElementId); IList<EnergyAnalysisOpening> openings = surface.GetAnalyticalOpenings(); IFCAnyHandle connectionGeometry = CreateConnectionSurfaceGeometry(file, surface, openings, offset); CreateIFCSpaceBoundary(file, exporterIFC, spatialElement, boundingElement, setter.LevelId, connectionGeometry); // try to add doors and windows for host objects if appropriate. if (boundingElement is HostObject) { foreach (EnergyAnalysisOpening opening in openings) { Element openingBoundingElem = GetBoundaryElement(document, opening.OriginatingElementId); IFCAnyHandle openingConnectionGeom = CreateConnectionSurfaceGeometry(file, opening, offset); CreateIFCSpaceBoundary(file, exporterIFC, spatialElement, openingBoundingElem, setter.LevelId, openingConnectionGeom); } } } PropertyUtil.CreateInternalRevitPropertySets(exporterIFC, spatialElement, productWrapper); CreateZoneInfos(exporterIFC, file, spatialElement, productWrapper); CreateSpaceOccupantInfo(exporterIFC, file, spatialElement, productWrapper); ifcExporter.ExportElementProperties(exporterIFC, spatialElement, productWrapper); ifcExporter.ExportElementQuantities(exporterIFC, spatialElement, productWrapper); } } } catch (Exception ex) { ifcExporter.HandleUnexpectedException(ex, exporterIFC, spatialElement); } finally { exporterIFC.PopExportState(); } } transaction.Commit(); } } finally { if (model != null) EnergyAnalysisDetailModel.Destroy(model); } st.RollBack(); } }
/// <summary> /// Export spatial elements, including rooms, areas and spaces. 2nd level space boundaries. /// </summary> /// <param name="ifcExporter"> /// The Exporter object. /// </param> /// <param name="exporterIFC"> /// The ExporterIFC object. /// </param> /// <param name="document"> /// The Revit document. /// </param> /// <param name="filterView"> /// The view not exported. /// </param> /// <param name="spaceExported"> /// The output boolean value indicates if exported successfully. /// </param> public static void ExportSpatialElement2ndLevel(BIM.IFC.Exporter.Exporter ifcExporter, ExporterIFC exporterIFC, Document document, View filterView) { using (SubTransaction st = new SubTransaction(document)) { st.Start(); bool createEnergyAnalysisDetailModelFailed = false; EnergyAnalysisDetailModel model = null; try { IFCFile file = exporterIFC.GetFile(); using (IFCTransaction tr = new IFCTransaction(file)) { EnergyAnalysisDetailModelOptions options = new EnergyAnalysisDetailModelOptions(); options.Tier = EnergyAnalysisDetailModelTier.SecondLevelBoundaries; //2nd level space boundaries options.SimplifyCurtainSystems = true; try { model = EnergyAnalysisDetailModel.Create(document, options); } catch (Exception) { createEnergyAnalysisDetailModelFailed = true; throw; } IList<EnergyAnalysisSpace> spaces = model.GetAnalyticalSpaces(); foreach (EnergyAnalysisSpace space in spaces) { SpatialElement spatialElement = document.get_Element(space.SpatialElementId) as SpatialElement; if (spatialElement == null) continue; //quick reject bool isArea = spatialElement is Area; if (isArea) { if (!IsAreaGrossInterior(exporterIFC, spatialElement)) continue; } //current view only if (filterView != null && !ElementFilteringUtil.IsElementVisible(filterView, spatialElement)) continue; // if (!ElementFilteringUtil.ShouldCategoryBeExported(exporterIFC, spatialElement)) continue; Options geomOptions = new Options(); View ownerView = spatialElement.Document.get_Element(spatialElement.OwnerViewId) as View; if (ownerView != null) geomOptions.View = ownerView; GeometryElement geomElem = spatialElement.get_Geometry(geomOptions); try { exporterIFC.PushExportState(spatialElement, geomElem); using (IFCProductWrapper productWrapper = IFCProductWrapper.Create(exporterIFC, true)) { ElementId levelId = spatialElement.Level != null ? spatialElement.Level.Id : ElementId.InvalidElementId; using (IFCPlacementSetter setter = IFCPlacementSetter.Create(exporterIFC, spatialElement, null, null, levelId)) { try { CreateIFCSpace(exporterIFC, spatialElement, productWrapper, setter); } catch (System.Exception) { continue; } //get boundary information from surfaces IList<EnergyAnalysisSurface> surfaces = space.GetAnalyticalSurfaces(); foreach (EnergyAnalysisSurface surface in surfaces) { Element boundingElement = GetBoundaryElement(document, surface.OriginatingElementId); if (boundingElement == null) continue; IList<EnergyAnalysisOpening> openings = surface.GetAnalyticalOpenings(); IFCAnyHandle connectionGeometry = CreateConnectionSurfaceGeometry(file, surface, openings); CreateIFCSpaceBoundary(file, exporterIFC, spatialElement, boundingElement, connectionGeometry); // try to add doors and windows for host objects if appropriate. if (boundingElement is HostObject) { foreach (EnergyAnalysisOpening opening in openings) { Element openingBoundingElem = GetBoundaryElement(document, opening.OriginatingElementId); IFCAnyHandle openingConnectionGeom = CreateConnectionSurfaceGeometry(file, opening); CreateIFCSpaceBoundary(file, exporterIFC, spatialElement, openingBoundingElem, openingConnectionGeom); } } } ExporterIFCUtils.CreateSpatialElementPropertySet(exporterIFC, spatialElement, productWrapper); ifcExporter.ExportElementProperties(exporterIFC, spatialElement, productWrapper); ifcExporter.ExportElementQuantities(exporterIFC, spatialElement, productWrapper); } } } finally { exporterIFC.PopExportState(); } } tr.Commit(); } } catch (System.Exception ex) { document.Application.WriteJournalComment("IFC error: " + ex.ToString(), true); } finally { if (model != null) EnergyAnalysisDetailModel.Destroy(model); } //if failed, just export the space element if (createEnergyAnalysisDetailModelFailed) { IFCFile file = exporterIFC.GetFile(); using (IFCTransaction tr = new IFCTransaction(file)) { ElementFilter spatialElementFilter = ElementFilteringUtil.GetSpatialElementFilter(document, exporterIFC); FilteredElementCollector collector = (filterView == null) ? new FilteredElementCollector(document) : new FilteredElementCollector(document, filterView.Id); collector.WherePasses(spatialElementFilter); foreach (Element elem in collector) { SpatialElement spatialElement = elem as SpatialElement; if (spatialElement == null) continue; //current view only if (filterView != null && !ElementFilteringUtil.IsElementVisible(filterView, spatialElement)) continue; // if (!ElementFilteringUtil.ShouldCategoryBeExported(exporterIFC, spatialElement)) continue; Options geomOptions = new Options(); View ownerView = spatialElement.Document.get_Element(spatialElement.OwnerViewId) as View; if (ownerView != null) geomOptions.View = ownerView; GeometryElement geomElem = spatialElement.get_Geometry(geomOptions); try { exporterIFC.PushExportState(spatialElement, geomElem); using (IFCProductWrapper productWrapper = IFCProductWrapper.Create(exporterIFC, true)) { ElementId levelId = spatialElement.Level != null ? spatialElement.Level.Id : ElementId.InvalidElementId; using (IFCPlacementSetter setter = IFCPlacementSetter.Create(exporterIFC, spatialElement, null, null, levelId)) { try { CreateIFCSpace(exporterIFC, spatialElement, productWrapper, setter); } catch (System.Exception) { continue; } if (!(spatialElement is Area)) ExporterIFCUtils.CreateSpatialElementPropertySet(exporterIFC, spatialElement, productWrapper); ifcExporter.ExportElementProperties(exporterIFC, spatialElement, productWrapper); ifcExporter.ExportElementQuantities(exporterIFC, spatialElement, productWrapper); } } } finally { exporterIFC.PopExportState(); } } tr.Commit(); } } st.RollBack(); } }
/// <summary> /// Implements the export of element. /// </summary> /// <param name="exporterIFC">The IFC exporter object.</param> /// <param name="element">The element to export.</param> /// <param name="filterView">The view to export, if it exists.</param> /// <param name="productWrapper">The ProductWrapper object.</param> public virtual void ExportElementImpl(ExporterIFC exporterIFC, Element element, Autodesk.Revit.DB.View filterView, ProductWrapper productWrapper) { Options options; View ownerView = element.Document.GetElement(element.OwnerViewId) as View; if (ownerView == null) { options = GeometryUtil.GetIFCExportGeometryOptions(); } else { options = new Options(); options.View = ownerView; } GeometryElement geomElem = element.get_Geometry(options); try { exporterIFC.PushExportState(element, geomElem); using (SubTransaction st = new SubTransaction(element.Document)) { st.Start(); if (element is AssemblyInstance) { AssemblyInstance assemblyInstance = element as AssemblyInstance; AssemblyInstanceExporter.ExportAssemblyInstanceElement(exporterIFC, assemblyInstance, productWrapper); } else if (element is Ceiling) { Ceiling ceiling = element as Ceiling; CeilingExporter.ExportCeilingElement(exporterIFC, ceiling, geomElem, productWrapper); } else if (element is CeilingAndFloor || element is Floor) { // This covers both Floors and Building Pads. HostObject hostObject = element as HostObject; FloorExporter.Export(exporterIFC, hostObject, geomElem, productWrapper); } else if (element is ContFooting) { ContFooting footing = element as ContFooting; FootingExporter.ExportFootingElement(exporterIFC, footing, geomElem, productWrapper); } else if (element is CurveElement) { CurveElement curveElem = element as CurveElement; CurveElementExporter.ExportCurveElement(exporterIFC, curveElem, geomElem, productWrapper); } else if (element is DuctInsulation) { DuctInsulation ductInsulation = element as DuctInsulation; DuctInsulationExporter.ExportDuctInsulation(exporterIFC, ductInsulation, geomElem, productWrapper); } else if (element is DuctLining) { DuctLining ductLining = element as DuctLining; DuctLiningExporter.ExportDuctLining(exporterIFC, ductLining, geomElem, productWrapper); } else if (element is FamilyInstance) { FamilyInstance familyInstanceElem = element as FamilyInstance; FamilyInstanceExporter.ExportFamilyInstanceElement(exporterIFC, familyInstanceElem, geomElem, productWrapper); } else if (element is FilledRegion) { FilledRegion filledRegion = element as FilledRegion; FilledRegionExporter.Export(exporterIFC, filledRegion, geomElem, productWrapper); } else if (element is Grid) { ExporterCacheManager.GridCache.Add(element); } else if (element is HostedSweep) { HostedSweep hostedSweep = element as HostedSweep; HostedSweepExporter.Export(exporterIFC, hostedSweep, geomElem, productWrapper); } else if (element is Part) { Part part = element as Part; if (ExporterCacheManager.ExportOptionsCache.ExportPartsAsBuildingElements) PartExporter.ExportPartAsBuildingElement(exporterIFC, part, geomElem, productWrapper); else PartExporter.ExportStandalonePart(exporterIFC, part, geomElem, productWrapper); } else if (element is Railing) { if (ExporterCacheManager.RailingCache.Contains(element.Id)) RailingExporter.ExportRailingElement(exporterIFC, element as Railing, productWrapper); else { ExporterCacheManager.RailingCache.Add(element.Id); RailingExporter.AddSubElementsToCache(element as Railing); } } else if (RampExporter.IsRamp(element)) { RampExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (element is Rebar || element is AreaReinforcement || element is PathReinforcement) { RebarExporter.Export(exporterIFC, element, filterView, productWrapper); } else if (element is SpatialElement) { SpatialElement spatialElem = element as SpatialElement; SpatialElementExporter.ExportSpatialElement(exporterIFC, spatialElem, productWrapper); } else if (IsStairs(element)) { StairsExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (element is TextNote) { TextNote textNote = element as TextNote; TextNoteExporter.Export(exporterIFC, textNote, productWrapper); } else if (element is TopographySurface) { TopographySurface topSurface = element as TopographySurface; SiteExporter.ExportTopographySurface(exporterIFC, topSurface, geomElem, productWrapper); } else if (element is Wall) { Wall wallElem = element as Wall; WallExporter.Export(exporterIFC, wallElem, geomElem, productWrapper); } else if (element is FaceWall) { WallExporter.ExportWall(exporterIFC, element, geomElem, productWrapper); } else if (element is WallSweep) { WallSweep wallSweep = element as WallSweep; WallSweepExporter.Export(exporterIFC, wallSweep, geomElem, productWrapper); } else if (element is RoofBase) { RoofBase roofElement = element as RoofBase; RoofExporter.Export(exporterIFC, roofElement, geomElem, productWrapper); } else if (element is CurtainSystem) { CurtainSystem curtainSystem = element as CurtainSystem; CurtainSystemExporter.ExportCurtainSystem(exporterIFC, curtainSystem, productWrapper); } else if (CurtainSystemExporter.IsLegacyCurtainElement(element)) { CurtainSystemExporter.ExportLegacyCurtainElement(exporterIFC, element, productWrapper); PropertyUtil.CreateInternalRevitPropertySets(exporterIFC, element, productWrapper); } else { string ifcEnumType; IFCExportType exportType = ExporterUtil.GetExportType(exporterIFC, element, out ifcEnumType); if (IsMEPType(exporterIFC, element, exportType)) { GenericMEPExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (ExportAsProxy(element, exportType)) { ProxyElementExporter.Export(exporterIFC, element, geomElem, productWrapper); } } if (element.AssemblyInstanceId != ElementId.InvalidElementId) ExporterCacheManager.AssemblyInstanceCache.RegisterElements(element.AssemblyInstanceId, productWrapper); st.RollBack(); } } finally { exporterIFC.PopExportState(); } }
/// <summary> /// Implements the export of element. /// </summary> /// <param name="exporterIFC">The IFC exporter object.</param> /// <param name="element ">The element to export.</param> /// <param name="productWrapper">The IFCProductWrapper object.</param> private void ExportElementImpl(ExporterIFC exporterIFC, Element element, IFCProductWrapper productWrapper) { Options options = new Options(); View ownerView = element.Document.get_Element(element.OwnerViewId) as View; if (ownerView != null) options.View = ownerView; GeometryElement geomElem = element.get_Geometry(options); try { exporterIFC.PushExportState(element, geomElem); using (SubTransaction st = new SubTransaction(element.Document)) { st.Start(); if (element is CurveElement) { CurveElement curveElem = element as CurveElement; CurveElementExporter.ExportCurveElement(exporterIFC, curveElem, geomElem, productWrapper, m_CurveAnnotationCache); } else if (element is FamilyInstance) { FamilyInstance familyInstanceElem = element as FamilyInstance; FamilyInstanceExporter.ExportFamilyInstanceElement(exporterIFC, familyInstanceElem, geomElem, productWrapper); } else if (element is Floor) { Floor floorElem = element as Floor; FloorExporter.ExportFloor(exporterIFC, floorElem, geomElem, productWrapper); } else if (element is SpatialElement) { SpatialElement spatialElem = element as SpatialElement; SpatialElementExporter.ExportSpatialElement(exporterIFC, spatialElem, productWrapper); } else if (element is TextNote) { TextNote textNote = element as TextNote; TextNoteExporter.Export(exporterIFC, textNote, productWrapper, m_PresentationStyleCache); } else if (element is Wall) { Wall wallElem = element as Wall; WallExporter.Export(exporterIFC, wallElem, geomElem, productWrapper); } else if (IsMEPType(exporterIFC, element)) { GenericMEPExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (element is FilledRegion) { // FilledRegion is still handled by internal Revit code, but the get_Geometry call makes sure // that the Owner view is clean before we get the region's GeometryElement. ExporterIFCUtils.ExportElementInternal(exporterIFC, element, productWrapper); } st.RollBack(); } } finally { exporterIFC.PopExportState(); } }
/// <summary> /// Implements the export of element. /// </summary> /// <param name="exporterIFC">The IFC exporter object.</param> /// <param name="element">The element to export.</param> /// <param name="productWrapper">The ProductWrapper object.</param> public virtual void ExportElementImpl(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper) { Options options; View ownerView = null; ownerView = element.Document.GetElement(element.OwnerViewId) as View; if (ExporterCacheManager.ExportOptionsCache.UseActiveViewGeometry) { ownerView = ExporterCacheManager.ExportOptionsCache.ActiveView; } else { ownerView = element.Document.GetElement(element.OwnerViewId) as View; } if (ownerView == null) { options = GeometryUtil.GetIFCExportGeometryOptions(); } else { options = new Options(); options.View = ownerView; } GeometryElement geomElem = element.get_Geometry(options); // Default: we don't preserve the element parameter cache after export. bool shouldPreserveParameterCache = false; try { exporterIFC.PushExportState(element, geomElem); Autodesk.Revit.DB.Document doc = element.Document; using (SubTransaction st = new SubTransaction(doc)) { st.Start(); // A long list of supported elements. Please keep in alphabetical order by the first item in the list.. if (element is AreaScheme) { AreaSchemeExporter.ExportAreaScheme(exporterIFC, element as AreaScheme, productWrapper); } else if (element is AssemblyInstance) { AssemblyInstance assemblyInstance = element as AssemblyInstance; AssemblyInstanceExporter.ExportAssemblyInstanceElement(exporterIFC, assemblyInstance, productWrapper); } else if (element is BeamSystem) { if (ExporterCacheManager.BeamSystemCache.Contains(element.Id)) AssemblyInstanceExporter.ExportBeamSystem(exporterIFC, element as BeamSystem, productWrapper); else { ExporterCacheManager.BeamSystemCache.Add(element.Id); shouldPreserveParameterCache = true; } } else if (element is Ceiling) { Ceiling ceiling = element as Ceiling; CeilingExporter.ExportCeilingElement(exporterIFC, ceiling, geomElem, productWrapper); } else if (element is CeilingAndFloor || element is Floor) { // This covers both Floors and Building Pads. CeilingAndFloor hostObject = element as CeilingAndFloor; FloorExporter.ExportCeilingAndFloorElement(exporterIFC, hostObject, geomElem, productWrapper); } else if (element is ContFooting) { ContFooting footing = element as ContFooting; FootingExporter.ExportFootingElement(exporterIFC, footing, geomElem, productWrapper); } else if (element is CurveElement) { CurveElement curveElem = element as CurveElement; CurveElementExporter.ExportCurveElement(exporterIFC, curveElem, geomElem, productWrapper); } else if (element is CurtainSystem) { CurtainSystem curtainSystem = element as CurtainSystem; CurtainSystemExporter.ExportCurtainSystem(exporterIFC, curtainSystem, productWrapper); } else if (CurtainSystemExporter.IsLegacyCurtainElement(element)) { CurtainSystemExporter.ExportLegacyCurtainElement(exporterIFC, element, productWrapper); } else if (element is DuctInsulation) { DuctInsulation ductInsulation = element as DuctInsulation; DuctInsulationExporter.ExportDuctInsulation(exporterIFC, ductInsulation, geomElem, productWrapper); } else if (element is DuctLining) { DuctLining ductLining = element as DuctLining; DuctLiningExporter.ExportDuctLining(exporterIFC, ductLining, geomElem, productWrapper); } else if (element is ElectricalSystem) { ExporterCacheManager.SystemsCache.AddElectricalSystem(element.Id); } else if (element is FabricArea) { // We are exporting the fabric area as a group only. FabricSheetExporter.ExportFabricArea(exporterIFC, element, productWrapper); } else if (element is FabricSheet) { FabricSheet fabricSheet = element as FabricSheet; FabricSheetExporter.ExportFabricSheet(exporterIFC, fabricSheet, geomElem, productWrapper); } else if (element is FaceWall) { WallExporter.ExportWall(exporterIFC, element, null, geomElem, productWrapper); } else if (element is FamilyInstance) { FamilyInstance familyInstanceElem = element as FamilyInstance; FamilyInstanceExporter.ExportFamilyInstanceElement(exporterIFC, familyInstanceElem, geomElem, productWrapper); } else if (element is FilledRegion) { FilledRegion filledRegion = element as FilledRegion; FilledRegionExporter.Export(exporterIFC, filledRegion, geomElem, productWrapper); } else if (element is Grid) { ExporterCacheManager.GridCache.Add(element); } else if (element is Group) { Group group = element as Group; GroupExporter.ExportGroupElement(exporterIFC, group, productWrapper); } else if (element is HostedSweep) { HostedSweep hostedSweep = element as HostedSweep; HostedSweepExporter.Export(exporterIFC, hostedSweep, geomElem, productWrapper); } else if (element is Part) { Part part = element as Part; if (ExporterCacheManager.ExportOptionsCache.ExportPartsAsBuildingElements) PartExporter.ExportPartAsBuildingElement(exporterIFC, part, geomElem, productWrapper); else PartExporter.ExportStandalonePart(exporterIFC, part, geomElem, productWrapper); } else if (element is PipeInsulation) { PipeInsulation pipeInsulation = element as PipeInsulation; PipeInsulationExporter.ExportPipeInsulation(exporterIFC, pipeInsulation, geomElem, productWrapper); } else if (element is Railing) { if (ExporterCacheManager.RailingCache.Contains(element.Id)) RailingExporter.ExportRailingElement(exporterIFC, element as Railing, productWrapper); else { ExporterCacheManager.RailingCache.Add(element.Id); RailingExporter.AddSubElementsToCache(element as Railing); shouldPreserveParameterCache = true; } } else if (RampExporter.IsRamp(element)) { RampExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (IsRebarType(element)) { RebarExporter.Export(exporterIFC, element, productWrapper); } else if (element is RoofBase) { RoofBase roofElement = element as RoofBase; RoofExporter.Export(exporterIFC, roofElement, geomElem, productWrapper); } else if (element is SpatialElement) { SpatialElement spatialElem = element as SpatialElement; SpatialElementExporter.ExportSpatialElement(exporterIFC, spatialElem, productWrapper); } else if (IsStairs(element)) { StairsExporter.Export(exporterIFC, element, geomElem, productWrapper); } else if (element is TextNote) { TextNote textNote = element as TextNote; TextNoteExporter.Export(exporterIFC, textNote, productWrapper); } else if (element is TopographySurface) { TopographySurface topSurface = element as TopographySurface; SiteExporter.ExportTopographySurface(exporterIFC, topSurface, geomElem, productWrapper); } else if (element is Truss) { if (ExporterCacheManager.TrussCache.Contains(element.Id)) AssemblyInstanceExporter.ExportTrussElement(exporterIFC, element as Truss, productWrapper); else { ExporterCacheManager.TrussCache.Add(element.Id); shouldPreserveParameterCache = true; } } else if (element is Wall) { Wall wallElem = element as Wall; WallExporter.Export(exporterIFC, wallElem, geomElem, productWrapper); } else if (element is WallSweep) { WallSweep wallSweep = element as WallSweep; WallSweepExporter.Export(exporterIFC, wallSweep, geomElem, productWrapper); } else if (element is Zone) { if (ExporterCacheManager.ZoneCache.Contains(element.Id)) ZoneExporter.ExportZone(exporterIFC, element as Zone, productWrapper); else { ExporterCacheManager.ZoneCache.Add(element.Id); shouldPreserveParameterCache = true; } } else { string ifcEnumType; IFCExportType exportType = ExporterUtil.GetExportType(exporterIFC, element, out ifcEnumType); // The intention with the code below is to make this the "generic" element exporter, which would export any Revit element as any IFC instance. // We would then in addition have specialized functions that would convert specific Revit elements to specific IFC instances where extra information // could be gathered from the element. bool exported = false; if (IsMEPType(exporterIFC, element, exportType)) exported = GenericMEPExporter.Export(exporterIFC, element, geomElem, exportType, ifcEnumType, productWrapper); else if (ExportAsProxy(element, exportType)) exported = ProxyElementExporter.Export(exporterIFC, element, geomElem, productWrapper); else if ((element is HostObject) || (element is DirectShape)) { // This is intended to work for any element. However, there are some hidden elements that we likely want to ignore. // As such, this is currently limited to the two types of elements that we know we want to export that aren't covered above. // Note the general comment that we would like to revamp this whole routine to be cleaner and simpler. // Note 2: Known lists of DirectShapes that aren't exported: // 1. IfcSpace (roundtripped IFC spaces). // 2. Railings exported = FamilyInstanceExporter.ExportGenericBuildingElement(exporterIFC, element, geomElem, exportType, ifcEnumType, productWrapper); } // For ducts and pipes, we will add a IfcRelCoversBldgElements during the end of export. if (exported && (element is Duct || element is Pipe)) ExporterCacheManager.MEPCache.CoveredElementsCache.Add(element.Id); } if (element.AssemblyInstanceId != ElementId.InvalidElementId) ExporterCacheManager.AssemblyInstanceCache.RegisterElements(element.AssemblyInstanceId, productWrapper); if (element.GroupId != ElementId.InvalidElementId) ExporterCacheManager.GroupCache.RegisterElements(element.GroupId, productWrapper); st.RollBack(); } } finally { exporterIFC.PopExportState(); ExporterStateManager.PreserveElementParameterCache(element, shouldPreserveParameterCache); } }