예제 #1
0
        public static Space ToSpeckle(this Autodesk.Revit.DB.Mechanical.Space mySpace)
        {
            var speckleSpace = new SpeckleElementsClasses.Space();

            //Name & number
            speckleSpace.spaceName   = mySpace.get_Parameter(Autodesk.Revit.DB.BuiltInParameter.ROOM_NAME).AsString();
            speckleSpace.spaceNumber = mySpace.get_Parameter(Autodesk.Revit.DB.BuiltInParameter.ROOM_NUMBER).AsString();

            //Location
            var locPt = ((Autodesk.Revit.DB.LocationPoint)mySpace.Location).Point;

            speckleSpace.spaceLocation = new SpecklePoint(locPt.X / Scale, locPt.Y / Scale, locPt.Z / Scale);
            //speckleSpace.levelElementId = mySpace.LevelId.IntegerValue.ToString();
            //speckleSpace.phaseElementId = mySpace.GetParameters("Phase Id").FirstOrDefault().AsElementId().ToString();

            //3d geometry
            (speckleSpace.Faces, speckleSpace.Vertices) = GetFaceVertexArrayFromElement(mySpace);

            //2d boundary curve
            var seg         = mySpace.GetBoundarySegments(new Autodesk.Revit.DB.SpatialElementBoundaryOptions());
            var myPolyCurve = new SpecklePolycurve()
            {
                Segments = new List <SpeckleCore.SpeckleObject>()
            };

            foreach (BoundarySegment segment in seg[0])
            {
                var crv       = segment.GetCurve();
                var converted = SpeckleCore.Converter.Serialise(crv);
                myPolyCurve.Segments.Add(converted as SpeckleObject);
            }
            speckleSpace.baseCurve = myPolyCurve;

            //parameters
            speckleSpace.parameters = GetElementParams(mySpace);

            //try get type parameters
            if (mySpace.IsValidType(mySpace.GetTypeId()))
            {
                speckleSpace.typeParameters = GetElementTypeParams(mySpace);
            }

            //global parameters
            speckleSpace.ApplicationId = mySpace.UniqueId;
            speckleSpace.elementId     = mySpace.Id.ToString();
            speckleSpace.GenerateHash();

            return(speckleSpace);
        }
예제 #2
0
        public static Autodesk.Revit.DB.Mechanical.Space ToRevit(this Space space, Document document, ConvertSettings convertSettings)
        {
            if (space == null)
            {
                return(null);
            }

            Autodesk.Revit.DB.Mechanical.Space result = convertSettings?.GetObject <Autodesk.Revit.DB.Mechanical.Space>(space.Guid);
            if (result != null)
            {
                return(result);
            }

            if (!convertSettings.RemoveExisting)
            {
                result = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space);
            }

            if (result == null)
            {
                double lowElevation = Query.LowElevation(space);
                if (double.IsNaN(lowElevation))
                {
                    return(null);
                }

                Level level = Geometry.Revit.Query.LowLevel(document, lowElevation);
                if (level == null)
                {
                    return(null);
                }

                result = document.Create.NewSpace(level, new UV(UnitUtils.ConvertToInternalUnits(space.Location.X, DisplayUnitType.DUT_METERS), UnitUtils.ConvertToInternalUnits(space.Location.Y, DisplayUnitType.DUT_METERS)));
            }

            if (result == null)
            {
                return(null);
            }

            result.get_Parameter(BuiltInParameter.ROOM_NAME).Set(space.Name);

            if (convertSettings.ConvertParameters)
            {
                Core.Revit.Modify.SetValues(result, space);
                Core.Revit.Modify.SetValues(result, space, ActiveSetting.Setting);

                Core.Revit.Modify.SetJson(result, space.ToJObject()?.ToString());
            }

            convertSettings?.Add(space.Guid, result);

            return(result);
        }
예제 #3
0
        protected override void TrySolveInstance(IGH_DataAccess dataAccess)
        {
            int index = -1;

            bool run = false;

            index = Params.IndexOfInputParam("_run");
            if (index == -1 || !dataAccess.GetData(index, ref run) || !run)
            {
                return;
            }

            Element element = null;

            index = Params.IndexOfInputParam("_element");
            if (index == -1 || !dataAccess.GetData(index, ref element))
            {
                return;
            }

            Transform transform;

            if (element == null)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data");
                return;
            }

            StartTransaction(element.Document);

            bool successful = false;

            if (element is Autodesk.Revit.DB.Wall)
            {
                List <Level> levels = new FilteredElementCollector(element.Document).OfClass(typeof(Level)).Cast <Level>().ToList();
                if (levels != null && levels.Count != 0)
                {
                    BoundingBoxXYZ boundingBoxXYZ = element.get_BoundingBox(null);
                    if (boundingBoxXYZ != null)
                    {
                        Level level = levels.Find(x => x.Elevation.AlmostEqual(boundingBoxXYZ.Max.Z, Tolerance.MacroDistance));
                        if (level != null)
                        {
                            Autodesk.Revit.DB.Wall wall = (Autodesk.Revit.DB.Wall)element;
                            Parameter parameter         = wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE);
                            if (parameter != null)
                            {
                                successful = parameter.Set(level.Id);
                            }
                        }
                    }
                }
            }
            else if (element is Autodesk.Revit.DB.Mechanical.Space)
            {
                List <Level> levels = new FilteredElementCollector(element.Document).OfClass(typeof(Level)).Cast <Level>().ToList();
                if (levels != null && levels.Count != 0)
                {
                    Autodesk.Revit.DB.Mechanical.Space space = (Autodesk.Revit.DB.Mechanical.Space)element;

                    double elevation = space.UnboundedHeight + levels.Find(x => x.Id == space.LevelId).Elevation;

                    Level level = levels.Find(x => x.Elevation.AlmostEqual(elevation, Tolerance.MacroDistance));
                    if (level != null)
                    {
                        Parameter parameter = space.get_Parameter(BuiltInParameter.ROOM_UPPER_LEVEL);
                        if (parameter != null)
                        {
                            if (parameter.AsElementId() != level.Id)
                            {
                                successful = parameter.Set(level.Id);
                                parameter  = space.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET);
                                if (parameter != null)
                                {
                                    parameter.Set(0.0);
                                }
                            }
                        }
                    }
                }
            }
            index = Params.IndexOfOutputParam("element");
            if (index != -1)
            {
                dataAccess.SetData(index, element);
            }

            index = Params.IndexOfOutputParam("successful");
            if (index != -1)
            {
                dataAccess.SetData(index, successful);
            }
        }
예제 #4
0
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="dataAccess">
        /// The DA object is used to retrieve from inputs and store in outputs.
        /// </param>
        protected override void TrySolveInstance(IGH_DataAccess dataAccess)
        {
            int index            = -1;
            int index_Successful = -1;

            index_Successful = Params.IndexOfOutputParam("successful");
            if (index_Successful != -1)
            {
                dataAccess.SetData(index_Successful, false);
            }

            bool run = false;

            index = Params.IndexOfInputParam("_run");
            if (index == -1 || !dataAccess.GetData(index, ref run) || !run)
            {
                return;
            }

            Document document = RhinoInside.Revit.Revit.ActiveDBDocument;

            RevitLinkInstance revitLinkInstance = null;

            index = Params.IndexOfInputParam("_revitLinkInstance");
            if (index == -1 || !dataAccess.GetData(index, ref revitLinkInstance) || revitLinkInstance == null)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data");
                return;
            }

            List <Level> levels = new FilteredElementCollector(document).OfClass(typeof(Level)).Cast <Level>().ToList();

            if (levels == null || levels.Count == 0)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data");
                return;
            }

            StartTransaction(document);

            TextMap textMap = null;

            index = Params.IndexOfInputParam("_textMap_");
            if (index != -1)
            {
                dataAccess.GetData(index, ref textMap);
            }

            bool rename = false;

            index = Params.IndexOfInputParam("_rename");
            if (index == -1 || !dataAccess.GetData(index, ref rename))
            {
                rename = false;
            }

            Transform transform       = revitLinkInstance.GetTotalTransform();
            Document  document_Linked = revitLinkInstance.GetLinkDocument();

            List <Autodesk.Revit.DB.Mechanical.Space> result = new List <Autodesk.Revit.DB.Mechanical.Space>();

            List <Autodesk.Revit.DB.Architecture.Room> rooms = new FilteredElementCollector(document_Linked).OfCategory(BuiltInCategory.OST_Rooms).Cast <Autodesk.Revit.DB.Architecture.Room>().ToList();

            if (rooms != null && rooms.Count > 0)
            {
                foreach (Autodesk.Revit.DB.Architecture.Room room in rooms)
                {
                    LocationPoint locationPoint = room?.Location as LocationPoint;
                    if (locationPoint == null)
                    {
                        continue;
                    }

                    XYZ xyz = transform?.OfPoint(locationPoint.Point);
                    if (xyz == null)
                    {
                        continue;
                    }

                    double min   = double.MaxValue;
                    Level  level = null;
                    foreach (Level level_Temp in levels)
                    {
                        double min_Temp = Math.Abs(level_Temp.Elevation - xyz.Z);
                        if (min_Temp < min)
                        {
                            min   = min_Temp;
                            level = level_Temp;
                        }
                    }

                    if (level == null)
                    {
                        continue;
                    }

                    Autodesk.Revit.DB.Mechanical.Space space = document.Create.NewSpace(level, new UV(xyz.X, xyz.Y));
                    if (space == null)
                    {
                        continue;
                    }

                    if (textMap != null)
                    {
                        Core.Revit.Modify.CopyValues(room, space, textMap);
                    }

                    if (rename)
                    {
                        string name = room.get_Parameter(BuiltInParameter.ROOM_NAME)?.AsString();
                        if (!string.IsNullOrEmpty(name))
                        {
                            space.get_Parameter(BuiltInParameter.ROOM_NAME).Set(name);
                        }

                        string number = room.get_Parameter(BuiltInParameter.ROOM_NUMBER)?.AsString();
                        if (!string.IsNullOrEmpty(number))
                        {
                            space.get_Parameter(BuiltInParameter.ROOM_NUMBER).Set(number);
                        }
                    }

                    result.Add(space);
                }
            }

            index = Params.IndexOfOutputParam("spaces");
            if (index != -1)
            {
                dataAccess.SetDataList(0, result);
            }

            if (index_Successful != -1)
            {
                dataAccess.SetData(index_Successful, result != null && result.Count > 0);
            }
        }
예제 #5
0
        protected override void TrySolveInstance(IGH_DataAccess dataAccess)
        {
            int index = -1;

            bool run = false;

            index = Params.IndexOfInputParam("_run");
            if (index == -1 || !dataAccess.GetData(index, ref run) || !run)
            {
                return;
            }

            Autodesk.Revit.DB.Mechanical.Space space = null;
            index = Params.IndexOfInputParam("_space");
            if (index == -1 || !dataAccess.GetData(index, ref space) || space == null)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data");
                return;
            }

            bool successful = false;

            List <Autodesk.Revit.DB.Mechanical.Space> spaces = new FilteredElementCollector(space.Document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList();

            spaces?.RemoveAll(x => x.Id == space.Id || x.Level.Elevation <= space.Level.Elevation);

            Level level = null;

            StartTransaction(space.Document);

            if (spaces != null || spaces.Count != 0)
            {
                List <Geometry.Planar.Face2D> face2Ds = Geometry.Revit.Query.BoundaryFace2Ds(space);
                if (face2Ds != null && face2Ds.Count > 0)
                {
                    List <Level> levels_Temp = new List <Level>();
                    foreach (Autodesk.Revit.DB.Mechanical.Space space_Temp in spaces)
                    {
                        List <Geometry.Planar.Face2D> face2Ds_Temp = Geometry.Revit.Query.BoundaryFace2Ds(space_Temp);
                        if (face2Ds_Temp == null || face2Ds_Temp.Count == 0)
                        {
                            continue;
                        }

                        Level level_Temp = null;
                        foreach (Geometry.Planar.Face2D face2D in face2Ds)
                        {
                            foreach (Geometry.Planar.Face2D face2D_Temp in face2Ds_Temp)
                            {
                                List <Geometry.Planar.Face2D> face2s_Intersection = Geometry.Planar.Query.Intersection(face2D, face2D_Temp);
                                if (face2s_Intersection == null || face2s_Intersection.Count == 0)
                                {
                                    continue;
                                }

                                face2s_Intersection.RemoveAll(x => x == null || x.GetArea() < Tolerance.MacroDistance);
                                if (face2Ds.Count > 0)
                                {
                                    level_Temp = space_Temp.Level;
                                    break;
                                }
                            }

                            if (level_Temp != null)
                            {
                                break;
                            }
                        }

                        if (level_Temp != null && levels_Temp.Find(x => x.Id == level_Temp.Id) == null)
                        {
                            levels_Temp.Add(level_Temp);
                        }
                    }

                    if (levels_Temp != null && levels_Temp.Count != 0)
                    {
                        levels_Temp.Sort((x, y) => x.Elevation.CompareTo(y.Elevation));
                        level = levels_Temp[0];
                    }
                }
            }

            if (level == null)
            {
                BoundingBoxXYZ boundingBoxXYZ = space.get_BoundingBox(null);
                if (boundingBoxXYZ != null)
                {
                    List <Level> levels    = new FilteredElementCollector(space.Document).OfClass(typeof(Level)).Cast <Level>().ToList();
                    double       elevation = boundingBoxXYZ.Max.Z;
                    if (levels.Find(x => Math.Abs(x.Elevation - elevation) < Tolerance.Distance) != null)
                    {
                        dataAccess.SetData(0, space);
                        dataAccess.SetData(1, false);
                        return;
                    }
                }

                level = Core.Revit.Query.HighLevel(space.Level);
            }


            if (level != null)
            {
                Parameter parameter = space.get_Parameter(BuiltInParameter.ROOM_UPPER_LEVEL);
                if (parameter != null)
                {
                    if (parameter.AsElementId() != level.Id)
                    {
                        successful = parameter.Set(level.Id);
                        parameter  = space.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET);
                        if (parameter != null)
                        {
                            parameter.Set(0.0);
                        }
                    }
                }
            }

            index = Params.IndexOfOutputParam("space");
            if (index != -1)
            {
                dataAccess.SetData(index, space);
            }

            index = Params.IndexOfOutputParam("successful");
            if (index != -1)
            {
                dataAccess.SetData(index, successful);
            }
        }
예제 #6
0
파일: Space.cs 프로젝트: HoareLea/SAM_Revit
        public static Autodesk.Revit.DB.Mechanical.Space ToRevit(this Space space, Document document, ConvertSettings convertSettings)
        {
            if (space == null)
            {
                return(null);
            }

            Autodesk.Revit.DB.Mechanical.Space result = convertSettings?.GetObject <Autodesk.Revit.DB.Mechanical.Space>(space.Guid);
            if (result != null)
            {
                return(result);
            }

            if (!convertSettings.RemoveExisting)
            {
                result = Core.Revit.Query.Element <Autodesk.Revit.DB.Mechanical.Space>(document, space);
            }

            if (result == null)
            {
                double lowElevation = Query.LowElevation(space);
                if (double.IsNaN(lowElevation))
                {
                    return(null);
                }

                Level level = Geometry.Revit.Query.LowLevel(document, lowElevation);
                if (level == null)
                {
                    return(null);
                }

#if Revit2017 || Revit2018 || Revit2019 || Revit2020
                result = document.Create.NewSpace(level, new UV(UnitUtils.ConvertToInternalUnits(space.Location.X, DisplayUnitType.DUT_METERS), UnitUtils.ConvertToInternalUnits(space.Location.Y, DisplayUnitType.DUT_METERS)));
#else
                result = document.Create.NewSpace(level, new UV(UnitUtils.ConvertToInternalUnits(space.Location.X, UnitTypeId.Meters), UnitUtils.ConvertToInternalUnits(space.Location.Y, UnitTypeId.Meters)));
#endif
            }

            if (result == null)
            {
                return(null);
            }

            //result.get_Parameter(BuiltInParameter.ROOM_NAME).Set(string.Empty);
            //result.get_Parameter(BuiltInParameter.ROOM_NUMBER).Set(space.Name);

            result.get_Parameter(BuiltInParameter.ROOM_NAME).Set(space.Name);

            if (convertSettings.ConvertParameters)
            {
                Dictionary <string, object> parameters = convertSettings.GetParameters();

                InternalCondition internalCondition = space.InternalCondition;
                if (internalCondition != null)
                {
                    Core.Revit.Modify.SetValues(result, internalCondition);
                    Core.Revit.Modify.SetValues(result, internalCondition, ActiveSetting.Setting, parameters);
                }

                Core.Revit.Modify.SetValues(result, space);
                Core.Revit.Modify.SetValues(result, space, ActiveSetting.Setting, parameters);

                Core.Revit.Modify.SetJson(result, space.ToJObject()?.ToString());
            }

            convertSettings?.Add(space.Guid, result);

            return(result);
        }
예제 #7
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);
        }