public static Space ToSpeckle(this Autodesk.Revit.DB.Mechanical.Space mySpace) { var speckleSpace = new SpeckleElementsClasses.Space(); //Name & number speckleSpace.spaceName = mySpace.get_Parameter(Autodesk.Revit.DB.BuiltInParameter.ROOM_NAME).AsString(); speckleSpace.spaceNumber = mySpace.get_Parameter(Autodesk.Revit.DB.BuiltInParameter.ROOM_NUMBER).AsString(); //Location var locPt = ((Autodesk.Revit.DB.LocationPoint)mySpace.Location).Point; speckleSpace.spaceLocation = new SpecklePoint(locPt.X / Scale, locPt.Y / Scale, locPt.Z / Scale); //speckleSpace.levelElementId = mySpace.LevelId.IntegerValue.ToString(); //speckleSpace.phaseElementId = mySpace.GetParameters("Phase Id").FirstOrDefault().AsElementId().ToString(); //3d geometry (speckleSpace.Faces, speckleSpace.Vertices) = GetFaceVertexArrayFromElement(mySpace); //2d boundary curve var seg = mySpace.GetBoundarySegments(new Autodesk.Revit.DB.SpatialElementBoundaryOptions()); var myPolyCurve = new SpecklePolycurve() { Segments = new List <SpeckleCore.SpeckleObject>() }; foreach (BoundarySegment segment in seg[0]) { var crv = segment.GetCurve(); var converted = SpeckleCore.Converter.Serialise(crv); myPolyCurve.Segments.Add(converted as SpeckleObject); } speckleSpace.baseCurve = myPolyCurve; //parameters speckleSpace.parameters = GetElementParams(mySpace); //try get type parameters if (mySpace.IsValidType(mySpace.GetTypeId())) { speckleSpace.typeParameters = GetElementTypeParams(mySpace); } //global parameters speckleSpace.ApplicationId = mySpace.UniqueId; speckleSpace.elementId = mySpace.Id.ToString(); speckleSpace.GenerateHash(); return(speckleSpace); }
public static Autodesk.Revit.DB.Mechanical.Space ToRevit(this Space space, Document document, ConvertSettings convertSettings) { if (space == null) { return(null); } Autodesk.Revit.DB.Mechanical.Space result = convertSettings?.GetObject <Autodesk.Revit.DB.Mechanical.Space>(space.Guid); if (result != null) { return(result); } if (!convertSettings.RemoveExisting) { result = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space); } if (result == null) { double lowElevation = Query.LowElevation(space); if (double.IsNaN(lowElevation)) { return(null); } Level level = Geometry.Revit.Query.LowLevel(document, lowElevation); if (level == null) { return(null); } result = document.Create.NewSpace(level, new UV(UnitUtils.ConvertToInternalUnits(space.Location.X, DisplayUnitType.DUT_METERS), UnitUtils.ConvertToInternalUnits(space.Location.Y, DisplayUnitType.DUT_METERS))); } if (result == null) { return(null); } result.get_Parameter(BuiltInParameter.ROOM_NAME).Set(space.Name); if (convertSettings.ConvertParameters) { Core.Revit.Modify.SetValues(result, space); Core.Revit.Modify.SetValues(result, space, ActiveSetting.Setting); Core.Revit.Modify.SetJson(result, space.ToJObject()?.ToString()); } convertSettings?.Add(space.Guid, result); return(result); }
protected override void TrySolveInstance(IGH_DataAccess dataAccess) { int index = -1; bool run = false; index = Params.IndexOfInputParam("_run"); if (index == -1 || !dataAccess.GetData(index, ref run) || !run) { return; } Element element = null; index = Params.IndexOfInputParam("_element"); if (index == -1 || !dataAccess.GetData(index, ref element)) { return; } Transform transform; if (element == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } StartTransaction(element.Document); bool successful = false; if (element is Autodesk.Revit.DB.Wall) { List <Level> levels = new FilteredElementCollector(element.Document).OfClass(typeof(Level)).Cast <Level>().ToList(); if (levels != null && levels.Count != 0) { BoundingBoxXYZ boundingBoxXYZ = element.get_BoundingBox(null); if (boundingBoxXYZ != null) { Level level = levels.Find(x => x.Elevation.AlmostEqual(boundingBoxXYZ.Max.Z, Tolerance.MacroDistance)); if (level != null) { Autodesk.Revit.DB.Wall wall = (Autodesk.Revit.DB.Wall)element; Parameter parameter = wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE); if (parameter != null) { successful = parameter.Set(level.Id); } } } } } else if (element is Autodesk.Revit.DB.Mechanical.Space) { List <Level> levels = new FilteredElementCollector(element.Document).OfClass(typeof(Level)).Cast <Level>().ToList(); if (levels != null && levels.Count != 0) { Autodesk.Revit.DB.Mechanical.Space space = (Autodesk.Revit.DB.Mechanical.Space)element; double elevation = space.UnboundedHeight + levels.Find(x => x.Id == space.LevelId).Elevation; Level level = levels.Find(x => x.Elevation.AlmostEqual(elevation, Tolerance.MacroDistance)); if (level != null) { Parameter parameter = space.get_Parameter(BuiltInParameter.ROOM_UPPER_LEVEL); if (parameter != null) { if (parameter.AsElementId() != level.Id) { successful = parameter.Set(level.Id); parameter = space.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET); if (parameter != null) { parameter.Set(0.0); } } } } } } index = Params.IndexOfOutputParam("element"); if (index != -1) { dataAccess.SetData(index, element); } index = Params.IndexOfOutputParam("successful"); if (index != -1) { dataAccess.SetData(index, successful); } }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="dataAccess"> /// The DA object is used to retrieve from inputs and store in outputs. /// </param> protected override void TrySolveInstance(IGH_DataAccess dataAccess) { int index = -1; int index_Successful = -1; index_Successful = Params.IndexOfOutputParam("successful"); if (index_Successful != -1) { dataAccess.SetData(index_Successful, false); } bool run = false; index = Params.IndexOfInputParam("_run"); if (index == -1 || !dataAccess.GetData(index, ref run) || !run) { return; } Document document = RhinoInside.Revit.Revit.ActiveDBDocument; RevitLinkInstance revitLinkInstance = null; index = Params.IndexOfInputParam("_revitLinkInstance"); if (index == -1 || !dataAccess.GetData(index, ref revitLinkInstance) || revitLinkInstance == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } List <Level> levels = new FilteredElementCollector(document).OfClass(typeof(Level)).Cast <Level>().ToList(); if (levels == null || levels.Count == 0) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } StartTransaction(document); TextMap textMap = null; index = Params.IndexOfInputParam("_textMap_"); if (index != -1) { dataAccess.GetData(index, ref textMap); } bool rename = false; index = Params.IndexOfInputParam("_rename"); if (index == -1 || !dataAccess.GetData(index, ref rename)) { rename = false; } Transform transform = revitLinkInstance.GetTotalTransform(); Document document_Linked = revitLinkInstance.GetLinkDocument(); List <Autodesk.Revit.DB.Mechanical.Space> result = new List <Autodesk.Revit.DB.Mechanical.Space>(); List <Autodesk.Revit.DB.Architecture.Room> rooms = new FilteredElementCollector(document_Linked).OfCategory(BuiltInCategory.OST_Rooms).Cast <Autodesk.Revit.DB.Architecture.Room>().ToList(); if (rooms != null && rooms.Count > 0) { foreach (Autodesk.Revit.DB.Architecture.Room room in rooms) { LocationPoint locationPoint = room?.Location as LocationPoint; if (locationPoint == null) { continue; } XYZ xyz = transform?.OfPoint(locationPoint.Point); if (xyz == null) { continue; } double min = double.MaxValue; Level level = null; foreach (Level level_Temp in levels) { double min_Temp = Math.Abs(level_Temp.Elevation - xyz.Z); if (min_Temp < min) { min = min_Temp; level = level_Temp; } } if (level == null) { continue; } Autodesk.Revit.DB.Mechanical.Space space = document.Create.NewSpace(level, new UV(xyz.X, xyz.Y)); if (space == null) { continue; } if (textMap != null) { Core.Revit.Modify.CopyValues(room, space, textMap); } if (rename) { string name = room.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString(); if (!string.IsNullOrEmpty(name)) { space.get_Parameter(BuiltInParameter.ROOM_NAME).Set(name); } string number = room.get_Parameter(BuiltInParameter.ROOM_NUMBER)?.AsString(); if (!string.IsNullOrEmpty(number)) { space.get_Parameter(BuiltInParameter.ROOM_NUMBER).Set(number); } } result.Add(space); } } index = Params.IndexOfOutputParam("spaces"); if (index != -1) { dataAccess.SetDataList(0, result); } if (index_Successful != -1) { dataAccess.SetData(index_Successful, result != null && result.Count > 0); } }
protected override void TrySolveInstance(IGH_DataAccess dataAccess) { int index = -1; bool run = false; index = Params.IndexOfInputParam("_run"); if (index == -1 || !dataAccess.GetData(index, ref run) || !run) { return; } Autodesk.Revit.DB.Mechanical.Space space = null; index = Params.IndexOfInputParam("_space"); if (index == -1 || !dataAccess.GetData(index, ref space) || space == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } bool successful = false; List <Autodesk.Revit.DB.Mechanical.Space> spaces = new FilteredElementCollector(space.Document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList(); spaces?.RemoveAll(x => x.Id == space.Id || x.Level.Elevation <= space.Level.Elevation); Level level = null; StartTransaction(space.Document); if (spaces != null || spaces.Count != 0) { List <Geometry.Planar.Face2D> face2Ds = Geometry.Revit.Query.BoundaryFace2Ds(space); if (face2Ds != null && face2Ds.Count > 0) { List <Level> levels_Temp = new List <Level>(); foreach (Autodesk.Revit.DB.Mechanical.Space space_Temp in spaces) { List <Geometry.Planar.Face2D> face2Ds_Temp = Geometry.Revit.Query.BoundaryFace2Ds(space_Temp); if (face2Ds_Temp == null || face2Ds_Temp.Count == 0) { continue; } Level level_Temp = null; foreach (Geometry.Planar.Face2D face2D in face2Ds) { foreach (Geometry.Planar.Face2D face2D_Temp in face2Ds_Temp) { List <Geometry.Planar.Face2D> face2s_Intersection = Geometry.Planar.Query.Intersection(face2D, face2D_Temp); if (face2s_Intersection == null || face2s_Intersection.Count == 0) { continue; } face2s_Intersection.RemoveAll(x => x == null || x.GetArea() < Tolerance.MacroDistance); if (face2Ds.Count > 0) { level_Temp = space_Temp.Level; break; } } if (level_Temp != null) { break; } } if (level_Temp != null && levels_Temp.Find(x => x.Id == level_Temp.Id) == null) { levels_Temp.Add(level_Temp); } } if (levels_Temp != null && levels_Temp.Count != 0) { levels_Temp.Sort((x, y) => x.Elevation.CompareTo(y.Elevation)); level = levels_Temp[0]; } } } if (level == null) { BoundingBoxXYZ boundingBoxXYZ = space.get_BoundingBox(null); if (boundingBoxXYZ != null) { List <Level> levels = new FilteredElementCollector(space.Document).OfClass(typeof(Level)).Cast <Level>().ToList(); double elevation = boundingBoxXYZ.Max.Z; if (levels.Find(x => Math.Abs(x.Elevation - elevation) < Tolerance.Distance) != null) { dataAccess.SetData(0, space); dataAccess.SetData(1, false); return; } } level = Core.Revit.Query.HighLevel(space.Level); } if (level != null) { Parameter parameter = space.get_Parameter(BuiltInParameter.ROOM_UPPER_LEVEL); if (parameter != null) { if (parameter.AsElementId() != level.Id) { successful = parameter.Set(level.Id); parameter = space.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET); if (parameter != null) { parameter.Set(0.0); } } } } index = Params.IndexOfOutputParam("space"); if (index != -1) { dataAccess.SetData(index, space); } index = Params.IndexOfOutputParam("successful"); if (index != -1) { dataAccess.SetData(index, successful); } }
public static Autodesk.Revit.DB.Mechanical.Space ToRevit(this Space space, Document document, ConvertSettings convertSettings) { if (space == null) { return(null); } Autodesk.Revit.DB.Mechanical.Space result = convertSettings?.GetObject <Autodesk.Revit.DB.Mechanical.Space>(space.Guid); if (result != null) { return(result); } if (!convertSettings.RemoveExisting) { result = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space); } if (result == null) { double lowElevation = Query.LowElevation(space); if (double.IsNaN(lowElevation)) { return(null); } Level level = Geometry.Revit.Query.LowLevel(document, lowElevation); if (level == null) { return(null); } #if Revit2017 || Revit2018 || Revit2019 || Revit2020 result = document.Create.NewSpace(level, new UV(UnitUtils.ConvertToInternalUnits(space.Location.X, DisplayUnitType.DUT_METERS), UnitUtils.ConvertToInternalUnits(space.Location.Y, DisplayUnitType.DUT_METERS))); #else result = document.Create.NewSpace(level, new UV(UnitUtils.ConvertToInternalUnits(space.Location.X, UnitTypeId.Meters), UnitUtils.ConvertToInternalUnits(space.Location.Y, UnitTypeId.Meters))); #endif } if (result == null) { return(null); } //result.get_Parameter(BuiltInParameter.ROOM_NAME).Set(string.Empty); //result.get_Parameter(BuiltInParameter.ROOM_NUMBER).Set(space.Name); result.get_Parameter(BuiltInParameter.ROOM_NAME).Set(space.Name); if (convertSettings.ConvertParameters) { Dictionary <string, object> parameters = convertSettings.GetParameters(); InternalCondition internalCondition = space.InternalCondition; if (internalCondition != null) { Core.Revit.Modify.SetValues(result, internalCondition); Core.Revit.Modify.SetValues(result, internalCondition, ActiveSetting.Setting, parameters); } Core.Revit.Modify.SetValues(result, space); Core.Revit.Modify.SetValues(result, space, ActiveSetting.Setting, parameters); Core.Revit.Modify.SetJson(result, space.ToJObject()?.ToString()); } convertSettings?.Add(space.Guid, result); return(result); }
public static List <Element> ToRevit(this AdjacencyCluster adjacencyCluster, Document document, ConvertSettings convertSettings) { if (adjacencyCluster == null || document == null) { return(null); } List <Element> result = convertSettings?.GetObjects <Element>(adjacencyCluster.Guid); if (result != null) { return(result); } Dictionary <Space, Shell> dictionary_Shell = adjacencyCluster.ShellDictionary(); if (dictionary_Shell == null) { return(null); } //List<Level> levels = new FilteredElementCollector(document).OfClass(typeof(Level)).Cast<Level>().ToList(); //if (levels == null || levels.Count == 0) // return null; Dictionary <ElementId, Element> dictionary_Element = new Dictionary <ElementId, Element>(); HashSet <System.Guid> guids = new HashSet <System.Guid>(); foreach (KeyValuePair <Space, Shell> keyValuePair in dictionary_Shell) { Space space = keyValuePair.Key; List <Panel> panels_Space = adjacencyCluster.GetPanels(space); if (panels_Space != null && panels_Space.Count != 0) { foreach (Panel panel in panels_Space) { if (guids.Contains(panel.Guid)) { continue; } guids.Add(panel.Guid); HostObject hostObject = panel.ToRevit(document, convertSettings); if (hostObject == null) { continue; } dictionary_Element[hostObject.Id] = hostObject; } } Autodesk.Revit.DB.Mechanical.Space space_Revit = space.ToRevit(document, convertSettings); if (space_Revit == null) { continue; } dictionary_Element[space_Revit.Id] = space_Revit; BoundingBox3D boundingBox3D = keyValuePair.Value.GetBoundingBox(); if (boundingBox3D == null) { continue; } Parameter parameter; parameter = space_Revit.get_Parameter(BuiltInParameter.ROOM_UPPER_LEVEL); Level level = document.ClosestLevel(boundingBox3D.Max.Z); if (level == null) { continue; } parameter.Set(level.Id); if (level.Id != space_Revit.LevelId && level.Elevation > (document.GetElement(space_Revit.LevelId) as Level).Elevation) { parameter = space_Revit.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET); parameter.Set(0); } } List <Panel> panels = adjacencyCluster.GetShadingPanels(); if (panels != null && panels.Count != 0) { foreach (Panel panel in panels) { HostObject hostObject = panel.ToRevit(document, convertSettings); if (hostObject == null) { continue; } dictionary_Element[hostObject.Id] = hostObject; } } List <Zone> zones = adjacencyCluster.GetObjects <Zone>(); if (zones != null) { foreach (Zone zone in zones) { List <Autodesk.Revit.DB.Mechanical.Space> spaces = ToRevit(adjacencyCluster, zone, document, convertSettings); spaces?.ForEach(x => dictionary_Element[x.Id] = x); } } List <ZoneSimulationResult> zoneSimulationResults = adjacencyCluster.GetObjects <ZoneSimulationResult>(); if (zoneSimulationResults != null) { foreach (ZoneSimulationResult zoneSimulationResult in zoneSimulationResults) { List <Autodesk.Revit.DB.Mechanical.Space> spaces = ToRevit(adjacencyCluster, zoneSimulationResult, document, convertSettings); spaces?.ForEach(x => dictionary_Element[x.Id] = x); } } List <SpaceSimulationResult> spaceSimulationResults = adjacencyCluster.GetObjects <SpaceSimulationResult>(); if (zoneSimulationResults != null) { foreach (SpaceSimulationResult spaceSimulationResult in spaceSimulationResults) { List <Autodesk.Revit.DB.Mechanical.Space> spaces = ToRevit(adjacencyCluster, spaceSimulationResult, document, convertSettings); spaces?.ForEach(x => dictionary_Element[x.Id] = x); } } List <AdjacencyClusterSimulationResult> adjacencyClusterSimulationResults = adjacencyCluster.GetObjects <AdjacencyClusterSimulationResult>(); if (adjacencyClusterSimulationResults != null) { foreach (AdjacencyClusterSimulationResult adjacencyClusterSimulationResult in adjacencyClusterSimulationResults) { ProjectInfo projectInfo = ToRevit(adjacencyClusterSimulationResult, document, convertSettings); if (projectInfo != null) { dictionary_Element[projectInfo.Id] = projectInfo; } } } result = dictionary_Element.Values.ToList(); convertSettings?.Add(adjacencyCluster.Guid, result); return(result); }