/***************************************************/ public static BH.oM.Geometry.SettingOut.Grid GridFromRevit(this MultiSegmentGrid revitGrid, RevitSettings settings = null, Dictionary <string, List <IBHoMObject> > refObjects = null) { settings = settings.DefaultIfNull(); oM.Geometry.SettingOut.Grid grid = refObjects.GetValue <oM.Geometry.SettingOut.Grid>(revitGrid.Id); if (grid != null) { return(grid); } List <Grid> gridSegments = revitGrid.GetGridIds().Select(x => revitGrid.Document.GetElement(x) as Grid).ToList(); if (gridSegments.Count == 0) { return(null); } else if (gridSegments.Count == 1) { return(gridSegments[0].GridFromRevit(settings, refObjects)); } else { List <BH.oM.Geometry.PolyCurve> joinedGridCurves = BH.Engine.Geometry.Compute.IJoin(gridSegments.Select(x => x.Curve.IFromRevit()).ToList()); if (joinedGridCurves.Count != 1) { BH.Engine.Reflection.Compute.RecordError(String.Format("Revit grid consists of disjoint segments. Element id: {0}", revitGrid.Id)); return(null); } grid = BH.Engine.Geometry.SettingOut.Create.Grid(joinedGridCurves[0]); grid.Name = revitGrid.Name; } //Set identifiers, parameters & custom data grid.SetIdentifiers(revitGrid); grid.CopyParameters(revitGrid, settings.ParameterSettings); grid.SetProperties(revitGrid, settings.ParameterSettings); refObjects.AddOrReplace(revitGrid.Id, grid); return(grid); }
/***************************************************/ /**** Public Methods ****/ /***************************************************/ public static BH.oM.Geometry.SettingOut.Grid GridFromRevit(this Grid revitGrid, RevitSettings settings = null, Dictionary <string, List <IBHoMObject> > refObjects = null) { settings = settings.DefaultIfNull(); oM.Geometry.SettingOut.Grid grid = refObjects.GetValue <oM.Geometry.SettingOut.Grid>(revitGrid.Id); if (grid != null) { return(grid); } grid = BH.Engine.Geometry.SettingOut.Create.Grid(revitGrid.Curve.IFromRevit()); grid.Name = revitGrid.Name; //Set identifiers, parameters & custom data grid.SetIdentifiers(revitGrid); grid.CopyParameters(revitGrid, settings.ParameterSettings); grid.SetProperties(revitGrid, settings.ParameterSettings); refObjects.AddOrReplace(revitGrid.Id, grid); return(grid); }
/***************************************************/ /**** Public methods ****/ /***************************************************/ public static Element ToRevit(this oM.Geometry.SettingOut.Grid grid, Document document, RevitSettings settings = null, Dictionary <Guid, List <int> > refObjects = null) { return(grid.ToRevitGrid(document, settings, refObjects)); }
/***************************************************/ /**** Public methods ****/ /***************************************************/ public static Element ToRevitGrid(this oM.Geometry.SettingOut.Grid grid, Document document, RevitSettings settings = null, Dictionary <Guid, List <int> > refObjects = null) { Element revitGrid = refObjects.GetValue <Grid>(document, grid.BHoM_Guid); if (revitGrid != null) { return(revitGrid); } settings = settings.DefaultIfNull(); if (BH.Engine.Geometry.Query.IIsClosed(grid.Curve)) { BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only open curve-based grids. BHoM_Guid: " + grid.BHoM_Guid); return(null); } List <BH.oM.Geometry.ICurve> gridCurves = BH.Engine.Geometry.Query.ISubParts(grid.Curve).ToList(); if (gridCurves.Count == 0) { return(null); } else if (gridCurves.Count == 1) { Curve curve = grid.Curve.IToRevit(); if (curve is Line) { revitGrid = Grid.Create(document, (Line)curve); } else if (curve is Arc) { revitGrid = Grid.Create(document, (Arc)curve); } else { BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only line- and arc-based grids. BHoM_Guid: " + grid.BHoM_Guid); return(null); } } else { CurveLoop loop = new CurveLoop(); foreach (BH.oM.Geometry.ICurve curve in gridCurves) { Curve revitCurve = curve.IToRevit(); if (revitCurve is Line || revitCurve is Arc) { loop.Append(revitCurve); } else { BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only line- and arc-based grids. BHoM_Guid: " + grid.BHoM_Guid); return(null); } } Plane plane; try { plane = loop.GetPlane(); } catch { BH.Engine.Reflection.Compute.RecordError("Grid curves need to be coplanar. BHoM_Guid: " + grid.BHoM_Guid); return(null); } SketchPlane sketchPlane = SketchPlane.Create(document, plane); ElementId gridTypeId = document.GetDefaultElementTypeId(ElementTypeGroup.GridType); ElementId gridId = MultiSegmentGrid.Create(document, gridTypeId, loop, sketchPlane.Id); revitGrid = document.GetElement(gridId); } revitGrid.CheckIfNullPush(grid); if (revitGrid == null) { return(null); } try { revitGrid.Name = grid.Name; } catch { BH.Engine.Reflection.Compute.RecordWarning(String.Format("Grid name '{0}' was not unique, name '{1}' has been assigned instead. BHoM_Guid: {2}", grid.Name, revitGrid.Name, grid.BHoM_Guid)); } // Copy parameters from BHoM object to Revit element revitGrid.CopyParameters(grid, settings); refObjects.AddOrReplace(grid, revitGrid); return(revitGrid); }