public static Panel SimilarPanel(this Geometry.Spatial.Face3D face3D, Dictionary <Panel, Geometry.Spatial.Face3D> panelsDictionary, double distanceTolerance = Core.Tolerance.MacroDistance, double coplanarTolerance = Core.Tolerance.MacroDistance) { if (face3D == null || panelsDictionary == null) { return(null); } Geometry.Spatial.Plane plane = face3D.GetPlane(); double area = face3D.GetArea(); Geometry.Planar.IClosed2D closed2D_1 = Geometry.Spatial.Query.Convert(plane, face3D.GetExternalEdge3D()); Geometry.Planar.Point2D point2D_Internal = closed2D_1.GetInternalPoint2D(); double areaDifferece_Min = double.MaxValue; Panel result = null; foreach (KeyValuePair <Panel, Geometry.Spatial.Face3D> keyValuePair in panelsDictionary) { if (keyValuePair.Value == null) { continue; } double areaDifference = System.Math.Abs(keyValuePair.Value.GetArea() - area); if (areaDifferece_Min < areaDifference) { continue; } Geometry.Spatial.Face3D face3D_Temp = keyValuePair.Value; Geometry.Spatial.Plane plane_Temp = face3D_Temp.GetPlane(); if (!plane.Coplanar(plane_Temp, coplanarTolerance)) { continue; } Geometry.Spatial.Point3D point3D_Origin = plane_Temp.Origin; Geometry.Spatial.Point3D point3D_Project = Geometry.Spatial.Query.Project(plane, point3D_Origin); if (point3D_Origin.Distance(point3D_Project) > distanceTolerance) { continue; } Geometry.Planar.IClosed2D closed2D_2 = Geometry.Spatial.Query.Convert(plane, face3D_Temp.GetExternalEdge3D()); if (closed2D_2.Inside(point2D_Internal)) { result = keyValuePair.Key; areaDifferece_Min = areaDifference; } } return(result); }
public static Space ToSAM(this Room room, IEnumerable <InternalCondition> internalConditions = null) { if (room == null) { return(null); } Geometry.Spatial.Point3D location = null; double area = double.NaN; double volume = double.NaN; Geometry.Spatial.Shell shell = Geometry.LadybugTools.Query.Shell(room); if (shell != null) { location = shell.InternalPoint3D(); area = Geometry.Spatial.Query.Area(shell, 0.1); volume = Geometry.Spatial.Query.Volume(shell); } Space result = new Space(room.DisplayName, location); if (!double.IsNaN(area)) { result.SetValue(SpaceParameter.Area, area); } if (!double.IsNaN(volume)) { result.SetValue(SpaceParameter.Volume, volume); } result.SetValue(SpaceParameter.LevelName, room.Story); string programType = room.Properties?.Energy?.ProgramType; if (!string.IsNullOrWhiteSpace(programType)) { InternalCondition internalCondition = null; if (internalConditions != null) { foreach (InternalCondition internalCondition_Temp in internalConditions) { if (internalCondition_Temp.Name == programType) { internalCondition = internalCondition_Temp; break; } } } if (internalCondition == null) { internalCondition = new InternalCondition(programType); } if (internalCondition != null && !double.IsNaN(volume)) { if (internalCondition.TryGetValue(InternalConditionParameter.FlowPerExteriorArea, out double flowPerExteriorArea)) { internalCondition = new InternalCondition(System.Guid.NewGuid(), internalCondition); double exteriorArea = Geometry.LadybugTools.Query.ExteriorArea(room); double flow = flowPerExteriorArea * exteriorArea; internalCondition.SetValue(Analytical.InternalConditionParameter.InfiltrationAirChangesPerHour, flow / volume * 3600); } } if (!double.IsNaN(area) && internalCondition.TryGetValue(InternalConditionParameter.TotalMetabolicRatePerPerson, out double totalMetabolicRate) && internalCondition.TryGetValue(Analytical.InternalConditionParameter.AreaPerPerson, out double areaPerPerson)) { double people = area / areaPerPerson; double occupancyLatentGainPerPerson = 0; double occupancySensibleGainPerPerson = 0; if (internalCondition.TryGetValue(InternalConditionParameter.LatentFraction, out double latentFraction)) { occupancyLatentGainPerPerson = totalMetabolicRate * latentFraction; occupancySensibleGainPerPerson = totalMetabolicRate * (1 - latentFraction); } else { //2021-XI-16 if latent is missin or autocalcutlate zero will be used in Tas! custom specific settings occupancySensibleGainPerPerson = totalMetabolicRate; } internalCondition.SetValue(Analytical.InternalConditionParameter.OccupancyLatentGainPerPerson, occupancyLatentGainPerPerson); internalCondition.SetValue(Analytical.InternalConditionParameter.OccupancySensibleGainPerPerson, occupancySensibleGainPerPerson); } result.InternalCondition = internalCondition; } return(result); }
public static bool TryGetSpaceAdjacency(this IEnumerable <Panel> panels, IEnumerable <Space> spaces, double tolerance, out List <Geometry.Spatial.ISAMGeometry3D> geometryList, out List <List <string> > names) { Geometry.Spatial.BoundingBox3D boundingBox3D = null; List <Face> faceList = new List <Face>(); foreach (Panel panel in panels) { if (panel == null) { continue; } Face face = Convert.ToTopologic(panel); if (face == null) { continue; } if (boundingBox3D == null) { boundingBox3D = panel.GetBoundingBox(); } else { Geometry.Spatial.BoundingBox3D boundingBox3D_Temp = panel.GetBoundingBox(); if (boundingBox3D_Temp != null) { boundingBox3D = new Geometry.Spatial.BoundingBox3D(new Geometry.Spatial.BoundingBox3D[] { boundingBox3D, boundingBox3D_Temp }); } } faceList.Add(face); } List <Topology> topologyList = new List <Topology>(); foreach (Space space in spaces) { if (space == null) { continue; } Dictionary <string, object> dictionary = new Dictionary <string, object>(); dictionary["Name"] = space.Name; Geometry.Spatial.Point3D point3D = space.Location; if (point3D.Z - boundingBox3D.Max.Z >= 0) { point3D = (Geometry.Spatial.Point3D)point3D.GetMoved(new Geometry.Spatial.Vector3D(0, 0, (boundingBox3D.Max.Z - boundingBox3D.Min.Z) / 2)); } if (point3D.Z - boundingBox3D.Min.Z <= 0) { point3D = (Geometry.Spatial.Point3D)point3D.GetMoved(new Geometry.Spatial.Vector3D(0, 0, (boundingBox3D.Max.Z - boundingBox3D.Min.Z) / 2)); } Vertex vertex = Geometry.Topologic.Convert.ToTopologic(point3D); vertex = (Vertex)vertex.SetDictionary(dictionary); topologyList.Add(vertex); } return(TryGetSpaceAdjacency(faceList, topologyList, tolerance, out geometryList, out names)); }
/// <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 SolveInstance(IGH_DataAccess dataAccess) { bool run = false; if (!dataAccess.GetData(2, ref run) || !run) { return; } bool merge = true; if (!dataAccess.GetData(1, ref merge)) { return; } GH_ObjectWrapper objectWrapper = null; if (!dataAccess.GetData(0, ref objectWrapper) || objectWrapper.Value == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } dynamic obj = objectWrapper.Value; ElementId aId = obj.Id as ElementId; string message = null; Document document = obj.Document as Document; Autodesk.Revit.DB.Mechanical.Space space = document.GetElement(aId) as Autodesk.Revit.DB.Mechanical.Space; if (space == null) { message = "Invalid Element"; AddRuntimeMessage(GH_RuntimeMessageLevel.Error, message); return; } if (space.Location == null) { message = string.Format("Cannot generate Panels. Space {0} [ElementId: {1}] not enclosed", space.Name, space.Id.IntegerValue); AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, message); return; } if (space.Volume < Core.Tolerance.MacroDistance) { message = string.Format("Space cannot be converted because it has no volume. Space {0} [ElementId: {1}] not enclosed", space.Name, space.Id.IntegerValue); AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, message); return; } ConvertSettings convertSettings = new ConvertSettings(true, true, true); List <Panel> panels = Analytical.Revit.Create.Panels(space, convertSettings); if (panels == null || panels.Count == 0) { message = "Panels ould not be generated"; AddRuntimeMessage(GH_RuntimeMessageLevel.Error, message); return; } panels.RemoveAll(x => x == null); List <Panel> panels_Temp = new List <Panel>(); foreach (Panel panel in panels) { PanelGroup panelGroup = Analytical.Query.PanelGroup(panel.PanelType); if (panelGroup != PanelGroup.Floor && panelGroup != PanelGroup.Roof) { continue; } ElementId elementId = panel.ElementId(); if (elementId == null || elementId == ElementId.InvalidElementId) { panels_Temp.Add(panel); continue; } HostObject hostObject = document.GetElement(elementId) as HostObject; if (hostObject == null) { panels_Temp.Add(panel); continue; } Geometry.Spatial.Plane plane = panel.PlanarBoundary3D.Plane; List <Geometry.Spatial.Face3D> face3Ds = Geometry.Revit.Query.Profiles(hostObject); if (face3Ds == null || face3Ds.Count == 0) { panels_Temp.Add(panel); continue; } Geometry.Spatial.Plane plane_Face3D = face3Ds.Find(x => plane.Coplanar(x.GetPlane()))?.GetPlane(); if (plane_Face3D == null) { panels_Temp.Add(panel); continue; } Geometry.Spatial.Point3D point3D_Projected = plane_Face3D.Project(plane.Origin); panel.Move(new Geometry.Spatial.Vector3D(plane.Origin, point3D_Projected)); panels_Temp.Add(panel); } List <Panel> redundantPanels = new List <Panel>(); if (merge) { panels_Temp = Analytical.Query.MergeCoplanarPanels(panels_Temp, Core.Tolerance.MacroDistance, ref redundantPanels, true, Core.Tolerance.MacroDistance); } dataAccess.SetDataList(0, panels_Temp.FindAll(x => Analytical.Query.PanelGroup(x.PanelType) == PanelGroup.Floor)); dataAccess.SetDataList(1, panels_Temp.FindAll(x => Analytical.Query.PanelGroup(x.PanelType) == PanelGroup.Roof)); dataAccess.SetDataList(2, redundantPanels); }
public static AnalyticalModel ToSAM(this Model model) { if (model == null) { return(null); } MaterialLibrary materialLibrary = null; ProfileLibrary profileLibrary = null; List <Construction> constructions = null; List <ApertureConstruction> apertureConstructions = null; List <InternalCondition> internalConditions = null; ModelEnergyProperties modelEnergyProperties = model.Properties?.Energy; if (modelEnergyProperties != null) { materialLibrary = modelEnergyProperties.ToSAM_MaterialLibrary(); constructions = modelEnergyProperties.ToSAM_Constructions(); apertureConstructions = modelEnergyProperties.ToSAM_ApertureConstructions(); internalConditions = modelEnergyProperties.ToSAM_InternalConditions(); profileLibrary = modelEnergyProperties.ToSAM_ProfileLibrary(); } if (materialLibrary == null) { materialLibrary = new MaterialLibrary(string.Empty); } if (constructions == null) { constructions = new List <Construction>(); } if (apertureConstructions == null) { apertureConstructions = new List <ApertureConstruction>(); } List <Tuple <Panel, Geometry.Spatial.BoundingBox3D> > tuples = new List <Tuple <Panel, Geometry.Spatial.BoundingBox3D> >(); AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); List <Room> rooms = model.Rooms; if (rooms != null) { foreach (Room room in rooms) { room.IndoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); room.OutdoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); List <Face> faces = room.Faces; if (faces == null) { continue; } List <Panel> panels = new List <Panel>(); foreach (Face face in faces) { Panel panel = face.ToSAM(constructions, apertureConstructions); if (panel == null) { continue; } Geometry.Spatial.Point3D point3D = panel.GetFace3D().GetInternalPoint3D(); if (point3D == null) { continue; } Panel panel_Existing = tuples.FindAll(x => x.Item2.Inside(point3D, true))?.Find(x => x.Item1.GetFace3D().On(point3D))?.Item1; if (panel_Existing != null) { panel = panel_Existing; } else { tuples.Add(new Tuple <Panel, Geometry.Spatial.BoundingBox3D>(panel, panel.GetFace3D().GetBoundingBox())); face.IndoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); face.OutdoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); Construction construction = panel.Construction; if (construction != null) { if (constructions.Find(x => x.Name.Equals(construction.Name)) == null) { constructions.Add(construction); } materialLibrary.AddDefaultMaterials(construction); } List <Aperture> apertures = panel.Apertures; if (apertures != null) { foreach (Aperture aperture in apertures) { ApertureConstruction apertureConstruction = aperture.ApertureConstruction; if (apertureConstruction != null) { if (apertureConstructions.Find(x => x.Name.Equals(apertureConstruction.Name)) == null) { apertureConstructions.Add(apertureConstruction); } materialLibrary.AddDefaultMaterials(apertureConstruction); } } } List <HoneybeeSchema.Aperture> apertures_HoneybeeSchema = face.Apertures; if (apertures_HoneybeeSchema != null) { foreach (HoneybeeSchema.Aperture aperture_HoneybeeSchema in apertures_HoneybeeSchema) { aperture_HoneybeeSchema.IndoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); aperture_HoneybeeSchema.OutdoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); } } List <HoneybeeSchema.Door> doors_HoneybeeSchema = face.Doors; if (doors_HoneybeeSchema != null) { foreach (HoneybeeSchema.Door door_HoneybeeSchema in doors_HoneybeeSchema) { door_HoneybeeSchema.IndoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); door_HoneybeeSchema.OutdoorShades?.ConvertAll(x => x.ToSAM(constructions))?.ForEach(x => adjacencyCluster.AddObject(x)); } } } panels.Add(panel); } Space space = room.ToSAM(internalConditions); adjacencyCluster.AddObject(space); if (panels != null) { foreach (Panel panel in panels) { adjacencyCluster.AddObject(panel); adjacencyCluster.AddRelation(space, panel); } } } } List <Shade> shades = model.OrphanedShades; if (shades != null && shades.Count != 0) { foreach (Shade shade in shades) { Panel panel = shade?.ToSAM(constructions); if (panel != null) { Construction construction = panel.Construction; if (construction != null) { if (constructions.Find(x => x.Name.Equals(construction.Name)) == null) { constructions.Add(construction); } materialLibrary.AddDefaultMaterials(construction); } List <Aperture> apertures = panel.Apertures; if (apertures != null) { foreach (Aperture aperture in apertures) { ApertureConstruction apertureConstruction = aperture.ApertureConstruction; if (apertureConstruction != null) { if (apertureConstructions.Find(x => x.Name.Equals(apertureConstruction.Name)) == null) { apertureConstructions.Add(apertureConstruction); } materialLibrary.AddDefaultMaterials(apertureConstruction); } } } adjacencyCluster.AddObject(panel); } } } AnalyticalModel result = new AnalyticalModel(model.DisplayName, null, null, null, adjacencyCluster, materialLibrary, profileLibrary); return(result); }
public static HostObject HostObject(this Aperture aperture, Document document) { HostObject result = null; PanelGroup panelGroup = Analytical.Query.PanelGroup(Analytical.Query.PanelType(aperture.Plane.Normal)); switch (panelGroup) { case PanelGroup.Wall: IEnumerable <Autodesk.Revit.DB.Wall> walls = Geometry.Revit.Query.Elements <Autodesk.Revit.DB.Wall>(document, aperture.GetBoundingBox()); if (walls != null && walls.Count() != 0) { Geometry.Spatial.Point3D point3D = Geometry.Spatial.Query.InternalPoint3D(aperture.GetFace3D()); double distance = double.MaxValue; Autodesk.Revit.DB.Wall wall = null; foreach (Autodesk.Revit.DB.Wall wall_Temp in walls) { List <Panel> panels = Convert.ToSAM(wall_Temp, new Core.Revit.ConvertSettings(true, false, false)); if (panels != null) { foreach (Panel panel in panels) { double distance_Temp = panel.GetFace3D().Distance(point3D); if (distance_Temp < distance) { distance = distance_Temp; wall = wall_Temp; } } } } result = wall; } break; case PanelGroup.Floor: IEnumerable <Element> elements_Floor = Geometry.Revit.Query.Elements(document, aperture.GetBoundingBox(), Autodesk.Revit.DB.BuiltInCategory.OST_Floors); if (elements_Floor != null && elements_Floor.Count() != 0) { result = elements_Floor.First() as HostObject; } break; case PanelGroup.Roof: IEnumerable <Element> elements_Roof = Geometry.Revit.Query.Elements(document, aperture.GetBoundingBox(), Autodesk.Revit.DB.BuiltInCategory.OST_Roofs); if (elements_Roof != null && elements_Roof.Count() != 0) { result = elements_Roof.First() as HostObject; } break; } if (result == null) { switch (panelGroup) { case PanelGroup.Roof: IEnumerable <Element> elements_Floor = Geometry.Revit.Query.Elements(document, aperture.GetBoundingBox(), Autodesk.Revit.DB.BuiltInCategory.OST_Floors); if (elements_Floor != null && elements_Floor.Count() != 0) { result = elements_Floor.First() as HostObject; } break; case PanelGroup.Floor: IEnumerable <Element> elements_Roof = Geometry.Revit.Query.Elements(document, aperture.GetBoundingBox(), Autodesk.Revit.DB.BuiltInCategory.OST_Roofs); if (elements_Roof != null && elements_Roof.Count() != 0) { result = elements_Roof.First() as HostObject; } break; } } return(result); }
public static List <Panel> SimilarPanels(this Geometry.Spatial.Face3D face3D, Dictionary <Panel, Geometry.Spatial.Face3D> panelsDictionary, double distanceTolerance = Tolerance.MacroDistance, double coplanarTolerance = Tolerance.MacroDistance) { if (face3D == null || panelsDictionary == null) { return(null); } Geometry.Spatial.Plane plane = face3D.GetPlane(); Geometry.Planar.IClosed2D closed2D_1 = Geometry.Spatial.Query.Convert(plane, face3D.GetExternalEdge3D()); Geometry.Planar.Point2D point2D_Internal = closed2D_1.GetInternalPoint2D(); double area = face3D.GetArea(); List <Tuple <Panel, double> > tuples = new List <Tuple <Panel, double> >(); foreach (KeyValuePair <Panel, Geometry.Spatial.Face3D> keyValuePair in panelsDictionary) { if (keyValuePair.Value == null) { continue; } Geometry.Spatial.Face3D face3D_Temp = keyValuePair.Value; Geometry.Spatial.Plane plane_Temp = face3D_Temp.GetPlane(); if (!plane.Coplanar(plane_Temp, coplanarTolerance)) { continue; } Geometry.Spatial.Point3D point3D_Origin = plane_Temp.Origin; Geometry.Spatial.Point3D point3D_Project = Geometry.Spatial.Query.Project(plane, point3D_Origin); if (point3D_Origin.Distance(point3D_Project) > distanceTolerance) { continue; } Geometry.Planar.IClosed2D closed2D_2 = Geometry.Spatial.Query.Convert(plane, face3D_Temp.GetExternalEdge3D()); if (closed2D_2.Inside(point2D_Internal)) { tuples.Add(new Tuple <Panel, double>(keyValuePair.Key, Math.Abs(keyValuePair.Value.GetArea() - area))); } } if (tuples == null || tuples.Count == 0) { return(null); } if (tuples.Count == 1) { return new List <Panel>() { tuples.First().Item1 } } ; tuples.Sort((x, y) => x.Item2.CompareTo(y.Item2)); double areatolerance = distanceTolerance * 10; List <Panel> result = tuples.FindAll(x => x.Item2 < areatolerance).ConvertAll(x => x.Item1); if (result != null && result.Count > 0) { return(result); } return(new List <Panel>() { tuples.First().Item1 }); } }