protected override void TrySolveInstance(IGH_DataAccess DA)
        {
            // grab input
            DB.Wall wallInstance = default;
            if (!DA.GetData("Curtain Wall", ref wallInstance))
            {
                return;
            }

            // only process curtain walls
            if (wallInstance.WallType.Kind == DB.WallKind.Curtain)
            {
                DA.SetData("Curtain Grid", new Types.DataObject <DB.CurtainGrid>(wallInstance.CurtainGrid, srcDocument: wallInstance.Document));

                // determine if curtain wall is embeded in another wall
                // find all the wall elements that are intersecting the bbox of this wall
                var bbox    = wallInstance.get_BoundingBox(null);
                var outline = new DB.Outline(bbox.Min, bbox.Max);
                var bbf     = new DB.BoundingBoxIntersectsFilter(outline);
                var walls   = new DB.FilteredElementCollector(wallInstance.Document).WherePasses(bbf).OfClass(typeof(DB.Wall)).ToElements();
                // ask for embedded wall inserts from these instances
                foreach (DB.Wall wall in walls)
                {
                    var embeddedWalls = wall.FindInserts(addRectOpenings: false, includeShadows: false, includeEmbeddedWalls: true, includeSharedEmbeddedInserts: false);
                    if (embeddedWalls.Contains(wallInstance.Id))
                    {
                        DA.SetData("Host Wall", Types.Element.FromElement(wall));
                        break;
                    }
                }
            }
        }
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            var points = new List <Rhino.Geometry.Point3d>();

            if (!DA.GetDataList("Points", points))
            {
                return;
            }

            var tolerance = 0.0;

            if (!DA.GetData("Tolerance", ref tolerance))
            {
                return;
            }

            var boundingBox = true;

            if (!DA.GetData("BoundingBox", ref boundingBox))
            {
                return;
            }

            var strict = true;

            if (!DA.GetData("Strict", ref strict))
            {
                return;
            }

            var inverted = false;

            if (!DA.GetData("Inverted", ref inverted))
            {
                return;
            }

            var scaleFactor = 1.0 / Revit.ModelUnits;

            var targets = new List <Rhino.Geometry.Box>();

            Autodesk.Revit.DB.ElementFilter filter = null;

            if (boundingBox)
            {
                var pointsBBox = new Rhino.Geometry.BoundingBox(points);
                {
                    var box = new Rhino.Geometry.Box(pointsBBox);
                    box.Inflate(tolerance);
                    targets.Add(box);
                }

                pointsBBox = pointsBBox.ChangeUnits(scaleFactor);
                var outline = new Autodesk.Revit.DB.Outline(pointsBBox.Min.ToHost(), pointsBBox.Max.ToHost());

                if (strict)
                {
                    filter = new Autodesk.Revit.DB.BoundingBoxIsInsideFilter(outline, tolerance * scaleFactor, inverted);
                }
                else
                {
                    filter = new Autodesk.Revit.DB.BoundingBoxIntersectsFilter(outline, tolerance * scaleFactor, inverted);
                }
            }
            else
            {
                var filters = points.Select <Rhino.Geometry.Point3d, Autodesk.Revit.DB.ElementFilter>
                                  (x =>
                {
                    var pointsBBox = new Rhino.Geometry.BoundingBox(x, x);
                    {
                        var box = new Rhino.Geometry.Box(pointsBBox);
                        box.Inflate(tolerance);
                        targets.Add(box);
                    }

                    x = x.ChangeUnits(scaleFactor);

                    if (strict)
                    {
                        var outline = new Autodesk.Revit.DB.Outline(x.ToHost(), x.ToHost());
                        return(new Autodesk.Revit.DB.BoundingBoxIsInsideFilter(outline, tolerance * scaleFactor, inverted));
                    }
                    else
                    {
                        return(new Autodesk.Revit.DB.BoundingBoxContainsPointFilter(x.ToHost(), tolerance * scaleFactor, inverted));
                    }
                });

                var filterList = filters.ToArray();
                filter = filterList.Length == 1 ?
                         filterList[0] :
                         new Autodesk.Revit.DB.LogicalOrFilter(filterList);
            }

            DA.SetData("Filter", filter);
            DA.SetDataList("Target", targets);
        }
        protected override void TrySolveInstance(IGH_DataAccess DA)
        {
            DB.Element element = null;
            if (!DA.GetData("Element", ref element) || element is null)
            {
                return;
            }

            // Special cases
            if (element is DB.FamilyInstance familyInstace)
            {
                DA.SetData("Host", Types.HostObject.FromElement(familyInstace.Host));
                return;
            }
            else if (element is DB.Opening opening)
            {
                DA.SetData("Host", Types.HostObject.FromElement(opening.Host));
                return;
            }
            else if (element.get_Parameter(DB.BuiltInParameter.HOST_ID_PARAM) is DB.Parameter hostId)
            {
                DA.SetData("Host", Types.HostObject.FromElementId(element.Document, hostId.AsElementId()));
                return;
            }

            // Search geometrically
            if (element.get_BoundingBox(null) is DB.BoundingBoxXYZ bbox)
            {
                using (var collector = new DB.FilteredElementCollector(element.Document))
                {
                    var elementCollector = collector.OfClass(typeof(DB.HostObject));

                    if (element.Category.Parent is DB.Category hostCategory)
                    {
                        elementCollector = elementCollector.OfCategoryId(hostCategory.Id);
                    }

                    var bboxFilter = new DB.BoundingBoxIntersectsFilter(new DB.Outline(bbox.Min, bbox.Max));
                    elementCollector = elementCollector.WherePasses(bboxFilter);

                    var classFilter = default(DB.ElementFilter);
                    if (element is DB.FamilyInstance instance)
                    {
                        classFilter = new DB.FamilyInstanceFilter(element.Document, instance.GetTypeId());
                    }
                    else if (element is DB.Area)
                    {
                        classFilter = new DB.AreaFilter();
                    }
                    else if (element is DB.AreaTag)
                    {
                        classFilter = new DB.AreaTagFilter();
                    }
                    else if (element is DB.Architecture.Room)
                    {
                        classFilter = new DB.Architecture.RoomFilter();
                    }
                    else if (element is DB.Architecture.RoomTag)
                    {
                        classFilter = new DB.Architecture.RoomTagFilter();
                    }
                    else if (element is DB.Mechanical.Space)
                    {
                        classFilter = new DB.Mechanical.SpaceFilter();
                    }
                    else if (element is DB.Mechanical.SpaceTag)
                    {
                        classFilter = new DB.Mechanical.SpaceTagFilter();
                    }
                    else
                    {
                        if (element is DB.CurveElement)
                        {
                            classFilter = new DB.ElementClassFilter(typeof(DB.CurveElement));
                        }
                        else
                        {
                            classFilter = new DB.ElementClassFilter(element.GetType());
                        }
                    }

                    foreach (var host in elementCollector.Cast <DB.HostObject>())
                    {
                        if (host.Id == element.Id)
                        {
                            continue;
                        }

                        if (host.FindInserts(false, true, true, false).Contains(element.Id))
                        {
                            DA.SetData("Host", Types.HostObject.FromElement(host));
                            break;
                        }
                        // Necessary to found Panel walls in a Curtain Wall
                        else if (host.GetDependentElements(classFilter).Contains(element.Id))
                        {
                            DA.SetData("Host", Types.HostObject.FromElement(host));
                            break;
                        }
                    }
                }
            }
        }
Example #4
0
        public static List <Model.Entity.Pile> GetIntersectEttPiles(this Model.Entity.Element ettElem)
        {
            var setting               = ModelData.Instance.Setting;
            var settingCate           = setting.Category.Id;
            var verOrHorFraming       = setting.VerOrHor;
            var distanceFromPile2Path = setting.DistanceFromPile2Path;
            List <Model.Entity.Pile> intersectEttPiles = new List <Model.Entity.Pile>();
            //var foundationCate = new Autodesk.Revit.DB.ElementCategoryFilter(BuiltInCategory.OST_StructuralFoundation);
            var cateFilter        = new Autodesk.Revit.DB.ElementCategoryFilter(settingCate);
            var revitElem         = ettElem.RevitElement;
            var bbRevitElem       = revitElem.get_BoundingBox(null);
            var ol                = new Autodesk.Revit.DB.Outline(bbRevitElem.Min, bbRevitElem.Max);
            var bbIntersectFilter = new Autodesk.Revit.DB.BoundingBoxIntersectsFilter(ol);
            var intersectPiles    = new FilteredElementCollector(revitData.Document).WherePasses(cateFilter)
                                    .WherePasses(bbIntersectFilter).ToList();
            var   curvePath    = (revitElem.Location as LocationCurve).Curve;
            XYZ   itemPoint    = null;
            Curve curveFraming = null;

            //revitData.Selection.SetElementIds(intersectPiles.Select(x => x.Id).ToList()); // Test Intersected Pile
            foreach (var item in intersectPiles)
            {
                if (settingCate.IntegerValue == (int)BuiltInCategory.OST_StructuralFoundation)
                {
                    itemPoint = (item.Location as LocationPoint).Point;
                }
                else if (settingCate.IntegerValue == (int)BuiltInCategory.OST_StructuralFraming)
                {
                    curveFraming = (item.Location as LocationCurve).Curve;
                    itemPoint    = (curveFraming.GetEndPoint(0) + curveFraming.GetEndPoint(1)) / 2;
                }
                var    intersectionResult = curvePath.Project(itemPoint);
                var    projection2curve   = intersectionResult.XYZPoint;
                double distance2P         = itemPoint.Distance2P(projection2curve);

                if (distance2P < distanceFromPile2Path.milimeter2Feet())
                {
                    switch (verOrHorFraming)
                    {
                    case Model.Entity.VerOrHor.HorizontalX:
                    {
                        if ((curveFraming as Line).Direction.IsXOrY())
                        {
                            intersectEttPiles.Add(new Model.Entity.Pile {
                                    RevitElement = item
                                });
                        }
                        break;
                    }

                    case Model.Entity.VerOrHor.VerticalY:
                    {
                        if (!(curveFraming as Line).Direction.IsXOrY())
                        {
                            intersectEttPiles.Add(new Model.Entity.Pile {
                                    RevitElement = item
                                });
                        }
                        break;
                    }

                    default:
                    {
                        intersectEttPiles.Add(new Model.Entity.Pile {
                                RevitElement = item
                            });

                        break;
                    }
                    }
                    //intersectEttPiles.Add(new Model.Entity.Pile { RevitElement = item });
                    //revitData.Document.Create.NewDetailCurve(revitData.ActiveView, Line.CreateBound(projection2curve, itemPoint));
                }
            }
            //ettElem.IntersectEttPiles.ForEach(x => x.HostEttElement = ettElem);
            return(intersectEttPiles);
        }