コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Panels.cs プロジェクト: HoareLea/SAM_Revit
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: IPartitions.cs プロジェクト: HoareLea/SAM_Revit
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
    }
コード例 #8
0
ファイル: Panels.cs プロジェクト: HoareLea/SAM_Revit
        /// <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;
        }
コード例 #9
0
ファイル: Panels.cs プロジェクト: HoareLea/SAM_Revit
        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);
        }
コード例 #10
0
ファイル: Panels.cs プロジェクト: HoareLea/SAM_Revit
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
ファイル: Apertures.cs プロジェクト: HoareLea/SAM_Revit
        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);
        }
コード例 #13
0
        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);
        }