public static List <Element> ToRevit(this AnalyticalModel analyticalModel, Document document, ConvertSettings convertSettings) { if (analyticalModel == null || document == null) { return(null); } List <Element> result = convertSettings?.GetObjects <Element>(analyticalModel.Guid); if (result != null) { return(result); } result = ToRevit(analyticalModel.AdjacencyCluster, document, convertSettings); if (convertSettings.ConvertParameters) { ProjectInfo projectInfo = document.ProjectInformation; if (projectInfo != null) { if (result.Find(x => x.Id == projectInfo.Id) == null) { result.Add(projectInfo); } Core.Revit.Modify.SetValues(projectInfo, analyticalModel); Core.Revit.Modify.SetValues(projectInfo, analyticalModel, ActiveSetting.Setting, convertSettings.GetParameters()); } } convertSettings?.Add(analyticalModel.Guid, result); return(result); }
public static List <Panel> ToSAM_Panels(this FamilyInstance familyInstance, ConvertSettings convertSettings) { if (familyInstance == null) { return(null); } List <Panel> result = convertSettings?.GetObjects <Panel>(familyInstance.Id); if (result != null) { return(result); } RevitInstance3D revitInstance3D = Geometry.Revit.Convert.ToSAM(familyInstance, convertSettings) as RevitInstance3D; if (revitInstance3D == null) { return(null); } result = ToSAM_Panels(revitInstance3D); if (result != null) { convertSettings?.Add(familyInstance.Id, result); } return(result); }
public static List <Autodesk.Revit.DB.Mechanical.Space> ToRevit(this AdjacencyCluster adjacencyCluster, Zone zone, Document document, ConvertSettings convertSettings) { if (adjacencyCluster == null || zone == null) { return(null); } List <Autodesk.Revit.DB.Mechanical.Space> result = convertSettings?.GetObjects <Autodesk.Revit.DB.Mechanical.Space>(zone.Guid); if (result != null) { return(result); } Zone zone_Temp = adjacencyCluster.GetObject <Zone>(zone.Guid); if (zone_Temp == null) { zone_Temp = zone; } if (convertSettings.ConvertParameters) { List <Space> spaces = adjacencyCluster.GetSpaces(zone_Temp); if (spaces != null) { List <Autodesk.Revit.DB.Mechanical.Space> spaces_Revit = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList(); foreach (Space space in spaces) { Autodesk.Revit.DB.Mechanical.Space space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space); if (space_Revit == null) { string name = space.Name; if (name != null) { space_Revit = spaces_Revit?.Find(x => x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString() == name); } } if (space_Revit == null) { continue; } Core.Revit.Modify.SetValues(space_Revit, zone_Temp); Core.Revit.Modify.SetValues(space_Revit, zone_Temp, ActiveSetting.Setting); } } } convertSettings?.Add(zone.Guid, result); return(result); }
public static List <IPartition> ToSAM_Partitions(this HostObject hostObject, ConvertSettings convertSettings) { if (hostObject == null) { return(null); } List <IPartition> result = convertSettings?.GetObjects <IPartition>(hostObject.Id); if (result != null) { return(result); } ElementId elementId_Type = hostObject.GetTypeId(); if (elementId_Type == null || elementId_Type == ElementId.InvalidElementId) { return(null); } HostPartitionType hostPartitionType = ((HostObjAttributes)hostObject.Document.GetElement(elementId_Type)).ToSAM_HostPartitionType(convertSettings); if (hostPartitionType == null) { return(null); } List <Face3D> face3Ds = hostObject.Profiles(); if (face3Ds == null || face3Ds.Count == 0) { return(null); } LogicalOrFilter logicalOrFilter = new LogicalOrFilter(new List <ElementFilter>() { new ElementCategoryFilter(BuiltInCategory.OST_Windows), new ElementCategoryFilter(BuiltInCategory.OST_Doors) }); #if Revit2017 IEnumerable <ElementId> elementIds = null; #else IEnumerable <ElementId> elementIds = hostObject.GetDependentElements(logicalOrFilter); #endif if (hostObject is Autodesk.Revit.DB.Wall || hostObject is CurtainSystem) { List <Autodesk.Revit.DB.Panel> panels = Core.Revit.Query.Panels(hostObject as dynamic); if (panels != null && panels.Count > 0) { List <ElementId> elementIds_Temp = panels.ConvertAll(x => x.Id); if (elementIds != null && elementIds.Count() > 0) { elementIds_Temp.AddRange(elementIds); } elementIds = elementIds_Temp; } } result = new List <IPartition>(); foreach (Face3D face3D in face3Ds) { if (face3D == null) { continue; } IHostPartition hostPartition = Analytical.Create.HostPartition(face3D, hostPartitionType); hostPartition.UpdateParameterSets(hostObject); if (elementIds != null && elementIds.Count() > 0) { foreach (ElementId elementId in elementIds) { Element element = hostObject.Document.GetElement(elementId); if (element == null) { continue; } if (!(element is FamilyInstance)) { continue; } IOpening opening = ToSAM_Opening((FamilyInstance)element, convertSettings); if (opening != null) { opening = Analytical.Query.Project(hostPartition, opening); hostPartition.AddOpening(opening); } } } result.Add(hostPartition); } convertSettings?.Add(hostObject.Id, result); return(result); }
public static List <Autodesk.Revit.DB.Mechanical.Space> ToRevit(this AdjacencyCluster adjacencyCluster, ZoneSimulationResult zoneSimulationResult, Document document, ConvertSettings convertSettings) { if (adjacencyCluster == null || zoneSimulationResult == null) { return(null); } List <Autodesk.Revit.DB.Mechanical.Space> result = convertSettings?.GetObjects <Autodesk.Revit.DB.Mechanical.Space>(zoneSimulationResult.Guid); if (result != null) { return(result); } ZoneSimulationResult zoneSimulationResult_Temp = adjacencyCluster.GetObject <ZoneSimulationResult>(zoneSimulationResult.Guid); if (zoneSimulationResult_Temp == null) { zoneSimulationResult_Temp = zoneSimulationResult; } List <Zone> zones = adjacencyCluster.GetRelatedObjects <Zone>(zoneSimulationResult_Temp); if (zones != null && zones.Count != 0) { if (convertSettings.ConvertParameters) { foreach (Zone zone in zones) { List <Space> spaces = adjacencyCluster.GetSpaces(zone); if (spaces != null) { ZoneType zoneType = zone.ZoneType(); if (zoneType == ZoneType.Undefined) { continue; } List <Autodesk.Revit.DB.Mechanical.Space> spaces_Revit = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList(); foreach (Space space_SAM in spaces) { Autodesk.Revit.DB.Mechanical.Space space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, zoneSimulationResult_Temp); if (space_Revit == null) { space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space_SAM); } if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString() == space_SAM.Name); } if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => space_SAM.Name.EndsWith(x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString()) && space_SAM.Name.StartsWith(x.get_Parameter(BuiltInParameter.ROOM_NUMBER)?.AsString())); } if (space_Revit == null) { continue; } Core.Revit.Modify.SetValues(space_Revit, zoneSimulationResult); Core.Revit.Modify.SetValues(space_Revit, zoneSimulationResult, ActiveSetting.Setting); Modify.SetValues(space_Revit, zoneSimulationResult, ActiveSetting.Setting, zoneType, convertSettings?.GetParameters()); } } } } } convertSettings?.Add(zoneSimulationResult.Guid, result); return(result); }
public static List <Autodesk.Revit.DB.Mechanical.Space> ToRevit(this AdjacencyCluster adjacencyCluster, Zone zone, Document document, ConvertSettings convertSettings) { if (adjacencyCluster == null || zone == null) { return(null); } List <Autodesk.Revit.DB.Mechanical.Space> result = convertSettings?.GetObjects <Autodesk.Revit.DB.Mechanical.Space>(zone.Guid); if (result != null) { return(result); } Zone zone_Temp = adjacencyCluster.GetObject <Zone>(zone.Guid); if (zone_Temp == null) { zone_Temp = zone; } if (convertSettings.ConvertParameters) { string zoneParameterName = Query.ZoneParameterName(zone); ZoneType zoneType = zone.ZoneType(); List <Space> spaces = adjacencyCluster.GetSpaces(zone_Temp); if (spaces != null) { List <Autodesk.Revit.DB.Mechanical.Space> spaces_Revit = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList(); foreach (Space space_SAM in spaces) { Autodesk.Revit.DB.Mechanical.Space space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, zone); if (space_Revit == null) { space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space_SAM); } if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString() == space_SAM.Name); } if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => space_SAM.Name.EndsWith(x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString()) && space_SAM.Name.StartsWith(x.get_Parameter(BuiltInParameter.ROOM_NUMBER)?.AsString())); } if (space_Revit == null) { continue; } if (!string.IsNullOrWhiteSpace(zoneParameterName)) { IEnumerable <Parameter> parameters = space_Revit.GetParameters(zoneParameterName); if (parameters != null) { foreach (Parameter parameter in parameters) { if (parameter == null || parameter.IsReadOnly || parameter.StorageType != StorageType.String) { continue; } parameter.Set(zone.Name); } } } Core.Revit.Modify.SetValues(space_Revit, zone_Temp); Core.Revit.Modify.SetValues(space_Revit, zone_Temp, ActiveSetting.Setting); if (zoneType != ZoneType.Undefined) { Modify.SetValues(space_Revit, zone_Temp, ActiveSetting.Setting, zoneType, convertSettings?.GetParameters()); } } } } convertSettings?.Add(zone.Guid, result); return(result); }
public static List <Autodesk.Revit.DB.Mechanical.Space> ToRevit(this AdjacencyCluster adjacencyCluster, SpaceSimulationResult spaceSimulationResult, Document document, ConvertSettings convertSettings) { if (spaceSimulationResult == null) { return(null); } List <Autodesk.Revit.DB.Mechanical.Space> result = convertSettings?.GetObjects <Autodesk.Revit.DB.Mechanical.Space>(spaceSimulationResult.Guid); if (result != null) { return(result); } List <Autodesk.Revit.DB.Mechanical.Space> spaces_Revit = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList(); if (adjacencyCluster != null) { List <Space> spaces_SAM = adjacencyCluster.GetRelatedObjects <Space>(spaceSimulationResult); if (spaces_SAM != null) { foreach (Space space_SAM in spaces_SAM) { Autodesk.Revit.DB.Mechanical.Space space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, spaceSimulationResult); if (space_Revit == null) { space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space_SAM); } if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString() == space_SAM.Name); } if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => space_SAM.Name.EndsWith(x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString()) && space_SAM.Name.StartsWith(x.get_Parameter(BuiltInParameter.ROOM_NUMBER)?.AsString())); } if (space_Revit == null) { continue; } if (result == null) { result = new List <Autodesk.Revit.DB.Mechanical.Space>(); } result.Add(space_Revit); } } } if (result == null) { Autodesk.Revit.DB.Mechanical.Space space_Revit = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, spaceSimulationResult); if (space_Revit == null) { space_Revit = spaces_Revit?.Find(x => x.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString() == spaceSimulationResult.Name); } if (space_Revit != null) { result = new List <Autodesk.Revit.DB.Mechanical.Space>() { space_Revit } } ; } if (result == null) { return(result); } if (convertSettings.ConvertParameters) { foreach (Autodesk.Revit.DB.Mechanical.Space space in result) { Core.Revit.Modify.SetValues(space, spaceSimulationResult); Core.Revit.Modify.SetValues(space, spaceSimulationResult, ActiveSetting.Setting); Modify.SetValues(space, spaceSimulationResult, ActiveSetting.Setting, spaceSimulationResult.LoadType(), convertSettings?.GetParameters()); } } convertSettings?.Add(spaceSimulationResult.Guid, result); return(result); } }
/// <summary> /// Conversion of WallSweep to panels. WARNING! Method does not handle more complex WallSweep /// </summary> /// <param name="wallSweep">Revit WallSweep</param> /// <param name="convertSettings">SAM Revit ConvertSettings</param> /// <returns>SAM Analytical Panels (Panels projected on host (Wall) plane)</returns> public static List <Panel> ToSAM_Panels(this WallSweep wallSweep, ConvertSettings convertSettings) { if (wallSweep == null) { return(null); } List <Panel> result = convertSettings?.GetObjects <Panel>(wallSweep.Id); if (result != null) { return(result); } RevitInstance3D revitInstance3D = Geometry.Revit.Convert.ToSAM(wallSweep, convertSettings); if (revitInstance3D == null) { return(null); } result = ToSAM_Panels(revitInstance3D); if (result != null) { convertSettings?.Add(wallSweep.Id, result); } return(result); //if (wallSweep == null || !wallSweep.IsValidObject) // return null; //List<Panel> result = convertSettings?.GetObjects<Panel>(wallSweep.Id); //if (result != null) // return result; //IEnumerable<ElementId> elementIds = wallSweep.GetHostIds(); //if (elementIds == null || elementIds.Count() == 0) //{ // return null; //} //Document document = wallSweep.Document; //if(document == null) //{ // return null; //} //HostObject hostObject = null; //foreach(ElementId elementId in elementIds) //{ // hostObject = document.GetElement(elementId) as HostObject; // if(hostObject != null) // { // break; // } //} //List<Face3D> face3Ds = hostObject?.Profiles(); //if(face3Ds == null || face3Ds.Count == 0) //{ // return null; //} //Geometry.Spatial.Plane plane = face3Ds[0]?.GetPlane(); //if(plane == null) //{ // return null; //} //List<Face3D> face3Ds_WallSweep = Geometry.Revit.Convert.ToSAM_Geometries<Face3D>(wallSweep); //if(face3Ds_WallSweep == null || face3Ds_WallSweep.Count == 0) //{ // return null; //} //List<Face2D> face2Ds = new List<Face2D>(); //foreach(Face3D face3D_WallSweep in face3Ds_WallSweep) //{ // Geometry.Spatial.Plane plane_WallSweep = face3D_WallSweep?.GetPlane(); // if (plane_WallSweep == null || plane.Perpendicular(plane_WallSweep)) // { // continue; // } // Face3D face3D = plane.Project(face3D_WallSweep); // if(face3D == null || !face3D.IsValid()) // { // continue; // } // Face2D face2D = plane.Convert(face3D); // if(face2D == null || !face2D.IsValid()) // { // continue; // } // face2Ds.Add(face2D); //} //face2Ds = face2Ds.Union(); //if(face2Ds == null || face2Ds.Count == 0) //{ // return null; //} //Construction construction = ToSAM_Construction((ElementType)document.GetElement(wallSweep.GetTypeId()), convertSettings); //result = new List<Panel>(); //foreach(Face2D face2D in face2Ds) //{ // Face3D face3D = plane.Convert(face2D); // if(face3D == null || !face3D.IsValid()) // { // continue; // } // Panel panel = Analytical.Create.Panel(construction, PanelType.Wall, face3D); // if(panel == null) // { // continue; // } // result.Add(panel); //} //convertSettings?.Add(wallSweep.Id, result); //return result; }
public static List <Panel> ToSAM_Panels(this ModelCurve modelCurve, ConvertSettings convertSettings) { if (modelCurve == null) { return(null); } List <Panel> result = convertSettings?.GetObjects <Panel>(modelCurve.Id); if (result != null) { return(result); } List <Segment3D> segment3Ds = Geometry.Revit.Convert.ToSAM_Segment3Ds(modelCurve.GeometryCurve); if (segment3Ds == null || segment3Ds.Count == 0) { return(null); } PanelType panelType = PanelType.WallInternal; if (modelCurve.Category.Id.IntegerValue == (int)BuiltInCategory.OST_MEPSpaceSeparationLines || modelCurve.Category.Id.IntegerValue == (int)BuiltInCategory.OST_RoomSeparationLines) { panelType = PanelType.Air; } Construction construction = null; if (ActiveSetting.Setting.TryGetValue(AnalyticalSettingParameter.DefaultConstructionLibrary, out ConstructionLibrary constructionLibrary)) { construction = constructionLibrary.GetConstructions(panelType).FirstOrDefault(); } Document document = modelCurve.Document; result = new List <Panel>(); foreach (Segment3D segment3D in segment3Ds) { //double elevation_Min = System.Math.Max(segment3D[0].Z, segment3D[1].Z); double elevation_Min = (document.GetElement(modelCurve.LevelId) as Level).Elevation; //Level level_Max = Core.Revit.Query.HighLevel(document, UnitUtils.ConvertToInternalUnits(elevation_Min, DisplayUnitType.DUT_METERS)); Level level_Max = Core.Revit.Query.HighLevel(document, elevation_Min); if (level_Max == null) { continue; } #if Revit2017 || Revit2018 || Revit2019 || Revit2020 double height = UnitUtils.ConvertFromInternalUnits(level_Max.Elevation - elevation_Min, DisplayUnitType.DUT_METERS); #else double height = UnitUtils.ConvertFromInternalUnits(level_Max.Elevation - elevation_Min, UnitTypeId.Meters); #endif if (height == 0) { continue; } Vector3D vector3D = new Vector3D(0, 0, height); Face3D face3D = new Face3D(new Polygon3D(new Point3D[] { segment3D[0], segment3D[1], segment3D[1].GetMoved(vector3D) as Point3D, segment3D[0].GetMoved(vector3D) as Point3D })); Panel panel = Analytical.Create.Panel(construction, panelType, face3D); panel.UpdateParameterSets(modelCurve, ActiveSetting.Setting.GetValue <Core.TypeMap>(Core.Revit.ActiveSetting.Name.ParameterMap), null, new string[] { "Length" }, true); panel.SetValue(RevitPanelParameter.Length, segment3D.GetLength()); result.Add(panel); } convertSettings?.Add(modelCurve.Id, result); return(result); }
public static List <Panel> ToSAM(this HostObject hostObject, ConvertSettings convertSettings) { if (hostObject == null || !hostObject.IsValidObject) { return(null); } if (hostObject is WallSweep) { return(((WallSweep)hostObject).ToSAM_Panels(convertSettings)); } List <Panel> result = convertSettings?.GetObjects <Panel>(hostObject.Id); if (result != null) { return(result); } ElementId elementId_Type = hostObject.GetTypeId(); if (elementId_Type == null || elementId_Type == ElementId.InvalidElementId) { return(null); } Document document = hostObject.Document; if (document == null) { return(null); } result = new List <Panel>(); PanelType panelType = Query.PanelType(hostObject); Construction construction = ((HostObjAttributes)document.GetElement(elementId_Type)).ToSAM(convertSettings); if (construction == null) { construction = Analytical.Query.DefaultConstruction(panelType); //Default Construction } PanelType panelType_Temp = Query.PanelType(construction); if (panelType_Temp != PanelType.Undefined) { panelType = panelType_Temp; } List <Face3D> face3Ds = hostObject.Profiles(); if (face3Ds == null || face3Ds.Count == 0) { return(null); } LogicalOrFilter logicalOrFilter = new LogicalOrFilter(new List <ElementFilter>() { new ElementCategoryFilter(BuiltInCategory.OST_Windows), new ElementCategoryFilter(BuiltInCategory.OST_Doors) }); #if Revit2017 IEnumerable <ElementId> elementIds = null; #else IEnumerable <ElementId> elementIds = hostObject.GetDependentElements(logicalOrFilter); #endif if (hostObject is Autodesk.Revit.DB.Wall || hostObject is CurtainSystem) { List <Autodesk.Revit.DB.Panel> panels = Core.Revit.Query.Panels(hostObject as dynamic); if (panels != null && panels.Count > 0) { List <ElementId> elementIds_Temp = panels.ConvertAll(x => x.Id); if (elementIds != null && elementIds.Count() > 0) { elementIds_Temp.AddRange(elementIds); } elementIds = elementIds_Temp; } } List <Aperture> apertures = new List <Aperture>(); if (elementIds != null && elementIds.Count() > 0) { foreach (ElementId elementId in elementIds) { FamilyInstance familyInstance = document.GetElement(elementId) as FamilyInstance; if (familyInstance == null) { continue; } List <Aperture> apertures_Temp = ToSAM_Apertures(familyInstance, convertSettings); if (apertures_Temp == null) { continue; } apertures.AddRange(apertures_Temp); } } foreach (Face3D face3D in face3Ds) { if (face3D == null) { continue; } //Panel panel = Analytical.Create.Panel(construction, panelType, face3D.Reduce(0.2)); Double check why Reduce have been used turn off on 27.10.2021 when mesh roof in sam teplate gave gap Panel panel = Analytical.Create.Panel(construction, panelType, face3D); panel.UpdateParameterSets(hostObject, ActiveSetting.Setting.GetValue <Core.TypeMap>(Core.Revit.ActiveSetting.Name.ParameterMap)); foreach (Aperture aperture in apertures) { panel.AddAperture(aperture); } result.Add(panel); } convertSettings?.Add(hostObject.Id, result); //Handling WallSweeps //if(hostObject is Wall) //{ // elementIds = hostObject.GetDependentElements(new ElementCategoryFilter(BuiltInCategory.OST_Cornices)); // if (elementIds != null && elementIds.Count() != 0) // { // //Fix it // foreach (ElementId elementId in elementIds) // { // WallSweep wallSweep = document.GetElement(elementId) as WallSweep; // if (wallSweep == null) // { // continue; // } // List<Panel> panels_WallSweep = wallSweep.ToSAM_Panels(convertSettings); // if (panels_WallSweep == null || panels_WallSweep.Count == 0) // { // continue; // } // result.AddRange(panels_WallSweep); // } // } //} return(result); }
public static List <Panel> ToSAM(this HostObject hostObject, ConvertSettings convertSettings) { if (hostObject == null || !hostObject.IsValidObject) { return(null); } List <Panel> result = convertSettings?.GetObjects <Panel>(hostObject.Id); if (result != null) { return(result); } ElementId elementId_Type = hostObject.GetTypeId(); if (elementId_Type == null || elementId_Type == ElementId.InvalidElementId) { return(null); } result = new List <Panel>(); PanelType panelType = Query.PanelType(hostObject); Construction construction = ((HostObjAttributes)hostObject.Document.GetElement(elementId_Type)).ToSAM(convertSettings); if (construction == null) { construction = Analytical.Query.DefaultConstruction(panelType); //Default Construction } PanelType panelType_Temp = Query.PanelType(construction); if (panelType_Temp != PanelType.Undefined) { panelType = panelType_Temp; } List <Geometry.Spatial.Face3D> face3Ds = hostObject.Profiles(); if (face3Ds == null || face3Ds.Count == 0) { return(null); } LogicalOrFilter logicalOrFilter = new LogicalOrFilter(new List <ElementFilter>() { new ElementCategoryFilter(BuiltInCategory.OST_Windows), new ElementCategoryFilter(BuiltInCategory.OST_Doors) }); IEnumerable <ElementId> elementIds = hostObject.GetDependentElements(logicalOrFilter); if (hostObject is Wall) { List <Autodesk.Revit.DB.Panel> panels = Create.Panels((Wall)hostObject, convertSettings); if (panels != null && panels.Count > 0) { List <ElementId> elementIds_Temp = panels.ConvertAll(x => x.Id); if (elementIds != null && elementIds.Count() > 0) { elementIds_Temp.AddRange(elementIds); } elementIds = elementIds_Temp; } } foreach (Geometry.Spatial.Face3D face3D in face3Ds) { if (face3D == null) { continue; } Panel panel = new Panel(construction, panelType, face3D); panel.UpdateParameterSets(hostObject, ActiveSetting.Setting.GetValue <Core.TypeMap>(Core.Revit.ActiveSetting.Name.ParameterMap)); if (elementIds != null && elementIds.Count() > 0) { foreach (ElementId elementId in elementIds) { Element element = hostObject.Document.GetElement(elementId); if (element == null) { continue; } if (!(element is FamilyInstance)) { continue; } Aperture aperture = ToSAM_Aperture((FamilyInstance)element, convertSettings); panel.AddAperture(aperture); } } result.Add(panel); } convertSettings?.Add(hostObject.Id, result); return(result); }
public static List <Aperture> ToSAM_Apertures(this FamilyInstance familyInstance, ConvertSettings convertSettings) { if (familyInstance == null) { return(null); } List <Aperture> result = convertSettings?.GetObjects <Aperture>(familyInstance.Id); if (result != null) { return(result); } if (Core.Revit.Query.Simplified(familyInstance)) { result = Core.Revit.Query.IJSAMObjects <Aperture>(familyInstance); if (result != null) { convertSettings?.Add(familyInstance.Id, result); return(result); } } Point3D point3D_Location = Geometry.Revit.Query.LocationPoint3D(familyInstance); if (point3D_Location == null) { List <Solid> solids = Core.Revit.Query.Solids(familyInstance, new Options()); solids?.RemoveAll(x => x.Volume == 0); if (solids == null || solids.Count == 0) { return(null); } if (solids.Count > 1) { solids.Sort((x, y) => y.Volume.CompareTo(x.Volume)); } point3D_Location = solids[0].ComputeCentroid()?.ToSAM(); } if (point3D_Location == null) { return(null); } List <Face3D> face3Ds = null; PanelType panelType_Host = PanelType.Undefined; BuiltInCategory builtInCategory_Host = BuiltInCategory.INVALID; HostObject hostObject = null; if (familyInstance.Host != null) { hostObject = familyInstance.Host as HostObject; if (hostObject != null) { builtInCategory_Host = (BuiltInCategory)hostObject.Category.Id.IntegerValue; } } //Method 1 of extracting Geometry if (face3Ds == null || face3Ds.Count == 0) { Vector3D axisX = null; Vector3D normal = null; Vector3D axisY = null; if (builtInCategory_Host == BuiltInCategory.OST_Roofs) { axisX = familyInstance.HandOrientation.ToSAM_Vector3D(false); axisY = familyInstance.FacingOrientation.ToSAM_Vector3D(false); normal = Geometry.Spatial.Query.AxisY(axisY, axisX); } else { axisX = familyInstance.HandOrientation.ToSAM_Vector3D(false); normal = familyInstance.FacingOrientation.ToSAM_Vector3D(false); axisY = Geometry.Spatial.Query.AxisY(normal, axisX); } Geometry.Spatial.Plane plane = Geometry.Spatial.Create.Plane(point3D_Location, axisX, axisY); if (!plane.Normal.SameHalf(normal)) { plane.FlipZ(false); } List <Shell> shells = Geometry.Revit.Convert.ToSAM_Geometries <Shell>(familyInstance); if (shells == null || shells.Count == 0) { return(null); } List <Point2D> point2Ds = new List <Point2D>(); foreach (Shell shell in shells) { List <Face3D> face3Ds_Shell = shell?.Face3Ds; if (face3Ds_Shell == null || face3Ds_Shell.Count == 0) { continue; } foreach (Face3D face3D_Temp in face3Ds_Shell) { ISegmentable3D segmentable3D = face3D_Temp.GetExternalEdge3D() as ISegmentable3D; if (segmentable3D == null) { continue; } segmentable3D?.GetPoints()?.ForEach(x => point2Ds.Add(plane.Convert(x))); } } Face3D face3D = new Face3D(plane, Geometry.Planar.Create.Rectangle2D(point2Ds)); if (face3D != null && face3D.IsValid() && face3D.GetArea() > Core.Tolerance.MacroDistance) { face3Ds = new List <Face3D>() { face3D }; } } //Method 2 of extracting Geometry if (hostObject != null) { builtInCategory_Host = (BuiltInCategory)hostObject.Category.Id.IntegerValue; Geometry.Spatial.Plane plane_Host = null; if (hostObject is CurtainSystem && familyInstance is Autodesk.Revit.DB.Panel) { Autodesk.Revit.DB.Panel panel = (Autodesk.Revit.DB.Panel)familyInstance; ElementId uGridLineElementId = null; ElementId vGridLineElementId = null; panel.GetRefGridLines(ref uGridLineElementId, ref vGridLineElementId); CurtainSystem curtainSystem = (CurtainSystem)hostObject; List <Polygon3D> polygon3Ds = curtainSystem.CurtainCell(uGridLineElementId, vGridLineElementId)?.Polygon3Ds(); if (polygon3Ds != null && polygon3Ds.Count != 0) { polygon3Ds.Sort((x, y) => y.GetArea().CompareTo(x.GetArea())); plane_Host = polygon3Ds[0].GetPlane(); } } else { List <Face3D> face3Ds_Temp = hostObject.Profiles(); if (face3Ds_Temp != null && face3Ds_Temp.Count != 0) { plane_Host = face3Ds_Temp.Closest(point3D_Location)?.GetPlane(); } } if (plane_Host != null) { face3Ds = face3Ds?.ConvertAll(x => plane_Host.Project(x)); point3D_Location = plane_Host.Project(point3D_Location); } HostObjAttributes hostObjAttributes = familyInstance.Document.GetElement(hostObject.GetTypeId()) as HostObjAttributes; if (hostObjAttributes != null) { panelType_Host = hostObjAttributes.PanelType(); } if (panelType_Host == PanelType.Undefined) { panelType_Host = hostObject.PanelType(); } List <Face3D> face3Ds_Profiles = hostObject.Profiles(familyInstance.Id); face3Ds_Profiles?.RemoveAll(x => x == null || !x.IsValid()); if (face3Ds_Profiles != null && face3Ds_Profiles.Count > 0) { if (face3Ds == null || (face3Ds != null && face3Ds_Profiles.ConvertAll(x => x.GetArea()).Sum() <= face3Ds.ConvertAll(x => x.GetArea()).Sum())) { face3Ds = face3Ds_Profiles; } } } ApertureConstruction apertureConstruction = ToSAM_ApertureConstruction(familyInstance, convertSettings); if (apertureConstruction == null && panelType_Host != PanelType.Undefined) { apertureConstruction = Analytical.Query.DefaultApertureConstruction(panelType_Host, familyInstance.ApertureType()); //Default Aperture Construction } if (face3Ds == null || face3Ds.Count == 0) { return(result); } //TODO: Working on SAM Families (requested by Michal) string parameterName_Height = Core.Revit.Query.Name(ActiveSetting.Setting, typeof(Aperture), typeof(FamilyInstance), "GetHeight"); string parameterName_Width = Core.Revit.Query.Name(ActiveSetting.Setting, typeof(Aperture), typeof(FamilyInstance), "GetWidth"); if (!string.IsNullOrWhiteSpace(parameterName_Height) && !string.IsNullOrWhiteSpace(parameterName_Width)) { Parameter parameter_Height = familyInstance.LookupParameter(parameterName_Height); Parameter parameter_Width = familyInstance.LookupParameter(parameterName_Width); if (parameter_Height != null && parameter_Width != null && parameter_Height.HasValue && parameter_Width.HasValue && parameter_Height.StorageType == StorageType.Double && parameter_Width.StorageType == StorageType.Double) { #if Revit2017 || Revit2018 || Revit2019 || Revit2020 double height = UnitUtils.ConvertFromInternalUnits(parameter_Height.AsDouble(), DisplayUnitType.DUT_METERS); double width = UnitUtils.ConvertFromInternalUnits(parameter_Width.AsDouble(), DisplayUnitType.DUT_METERS); #else double height = UnitUtils.ConvertFromInternalUnits(parameter_Height.AsDouble(), UnitTypeId.Meters); double width = UnitUtils.ConvertFromInternalUnits(parameter_Width.AsDouble(), UnitTypeId.Meters); #endif } } result = new List <Aperture>(); foreach (Face3D face3D_Temp in face3Ds) { Aperture aperture = Analytical.Create.Aperture(apertureConstruction, face3D_Temp); if (aperture == null) { continue; } aperture.UpdateParameterSets(familyInstance, ActiveSetting.Setting.GetValue <Core.TypeMap>(Core.Revit.ActiveSetting.Name.ParameterMap)); result.Add(aperture); } convertSettings?.Add(familyInstance.Id, 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); }