Ejemplo n.º 1
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;

            if (!dataAccess.GetData(1, ref run) || !run)
            {
                return;
            }

            Document document = RhinoInside.Revit.Revit.ActiveDBDocument;

            IAnalyticalObject analyticalObject = null;

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

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

            Core.SAMObject sAMObject = analyticalObject as Core.SAMObject;
            if (sAMObject == null)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data");
                return;
            }

            List <Tuple <ElementId, Core.SAMObject> > tuples = new List <Tuple <ElementId, Core.SAMObject> >();

            if (sAMObject is Space)
            {
                Space space = (Space)sAMObject;

                ElementId elementId = space.ElementId();
                if (elementId == null || elementId == ElementId.InvalidElementId)
                {
                    List <Autodesk.Revit.DB.Mechanical.Space> spaces_Revit = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList();
                    if (spaces_Revit != null)
                    {
                        Autodesk.Revit.DB.Mechanical.Space space_Revit = spaces_Revit.Find(x => x.Name != null && x.Name.Equals(space.Name));
                        if (space_Revit == null)
                        {
                            foreach (Autodesk.Revit.DB.Mechanical.Space space_Revit_Temp in spaces_Revit)
                            {
                                Parameter parameter = space_Revit_Temp?.get_Parameter(BuiltInParameter.ROOM_NAME);
                                if (parameter == null || !parameter.HasValue)
                                {
                                    continue;
                                }

                                string name = parameter.AsString();
                                if (string.IsNullOrEmpty(name))
                                {
                                    continue;
                                }

                                if (name.Equals(space.Name))
                                {
                                    space_Revit = space_Revit_Temp;
                                    break;
                                }
                            }
                        }

                        if (space_Revit != null)
                        {
                            elementId = space_Revit.Id;
                        }
                    }
                }

                tuples.Add(new Tuple <ElementId, Core.SAMObject> (elementId, space));
                if (elementId != null && elementId != ElementId.InvalidElementId)
                {
                    tuples.Add(new Tuple <ElementId, Core.SAMObject>(elementId, space.InternalCondition));
                }
            }
            else if (sAMObject is AnalyticalModel)
            {
                AnalyticalModel analyticalModel = (AnalyticalModel)sAMObject;
                List <Space>    spaces          = analyticalModel.GetSpaces();
                if (spaces != null)
                {
                    foreach (Space space in spaces)
                    {
                        ElementId elementId = space.ElementId();
                        if (elementId == null || elementId == ElementId.InvalidElementId)
                        {
                            List <Autodesk.Revit.DB.Mechanical.Space> spaces_Revit = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_MEPSpaces).Cast <Autodesk.Revit.DB.Mechanical.Space>().ToList();
                            if (spaces_Revit != null)
                            {
                                Autodesk.Revit.DB.Mechanical.Space space_Revit = spaces_Revit.Find(x => x.Name != null && x.Name.Equals(space.Name));
                                if (space_Revit == null)
                                {
                                    foreach (Autodesk.Revit.DB.Mechanical.Space space_Revit_Temp in spaces_Revit)
                                    {
                                        Parameter parameter = space_Revit_Temp?.get_Parameter(BuiltInParameter.ROOM_NAME);
                                        if (parameter == null || !parameter.HasValue)
                                        {
                                            continue;
                                        }

                                        string name = parameter.AsString();
                                        if (string.IsNullOrEmpty(name))
                                        {
                                            continue;
                                        }

                                        if (name.Equals(space.Name))
                                        {
                                            space_Revit = space_Revit_Temp;
                                            break;
                                        }
                                    }
                                }

                                if (space_Revit != null)
                                {
                                    elementId = space_Revit.Id;
                                    spaces_Revit_UpdateNumbers.Add(space_Revit);
                                }
                            }
                        }

                        tuples.Add(new Tuple <ElementId, Core.SAMObject>(elementId, space));
                        if (elementId != null && elementId != ElementId.InvalidElementId)
                        {
                            tuples.Add(new Tuple <ElementId, Core.SAMObject>(elementId, space.InternalCondition));
                        }
                    }
                }
            }
            else
            {
                ElementId elementId = ((Core.SAMObject)analyticalObject).ElementId();
                if (elementId != null && elementId != ElementId.InvalidElementId)
                {
                    tuples.Add(new Tuple <ElementId, Core.SAMObject>(elementId, sAMObject));
                }
            }

            if (tuples == null || tuples.Count == 0)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Cound not find matching Revit Element");
                return;
            }

            StartTransaction(document);

            List <Element> elements = new List <Element>();

            foreach (Tuple <ElementId, Core.SAMObject> tuple in tuples)
            {
                if (tuple.Item2 == null)
                {
                    continue;
                }

                if (tuple.Item1 == null || tuple.Item1 == ElementId.InvalidElementId)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, string.Format("Cound not find matching Revit Element for SAM Object [Guid: {0}]", tuple.Item2.Guid));
                }

                Element element = document.GetElement(tuple.Item1);
                if (element == null)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, string.Format("Cound not find matching Revit Element for SAM Object [Guid: {0}]", tuple.Item2.Guid));
                }

                Core.Revit.Modify.SetValues(element, tuple.Item2);
                Core.Revit.Modify.SetValues(element, tuple.Item2, ActiveSetting.Setting);
                Core.Revit.Modify.SetValues(element, tuple.Item2, Analytical.Revit.ActiveSetting.Setting);
                elements.Add(element);
            }

            if (spaces_Revit_UpdateNumbers != null && spaces_Revit_UpdateNumbers.Count != 0)
            {
                Analytical.Revit.Modify.UpdateNumbers(spaces_Revit_UpdateNumbers);
            }

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

            if (index_Successful != -1)
            {
                dataAccess.SetData(index_Successful, true);
            }
        }