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; } } } } }
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); }