public FoundationWrapperFilter() : base() { Name = "Foundation"; ShortDescription = "Foundation"; _fitler = new FoundationFilter(); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { var uidoc = commandData.Application.ActiveUIDocument; var doc = uidoc.Document; //Get document file Link //var link = new FilteredElementCollector(doc).OfType<RevitLinkInstance>().FirstOrDefault(l => l.Name == "test.rvt"); //var linkdoc = link.GetLinkDocument(); var vm = new DiggingHoleViewModel(); var window = new DiggingHole(vm); window.ShowDialog(); if (window.DialogResult == true) { var topoffset = UnitUtils.ConvertToInternalUnits(double.Parse(vm.TopOffset), DisplayUnitType.DUT_MILLIMETERS); var botoffset = UnitUtils.ConvertToInternalUnits(double.Parse(vm.BotOffset), DisplayUnitType.DUT_MILLIMETERS); var filter = new FoundationFilter(); var foundations = uidoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element, filter) .Select(r => doc.GetElement(r.ElementId)) .ToList(); var results = new List <Element>(); foreach (var foundation in foundations) { //var otp = new Options(); //otp.DetailLevel = ViewDetailLevel.Fine; //var geoElement = foundation.get_Geometry(otp); //var instance = geoElement.Cast<GeometryObject>().OfType<GeometryInstance>().Select(i => i.GetInstanceGeometry()).ToList(); //var solids = geoElement.Cast<GeometryObject>().Concat(instance).OfType<Solid>().Where(s => s.Volume > 0 && s.Faces.Size > 0).ToList(); var solids = foundation.GetSolids(); var solid = solids.OrderByDescending(s => s.Volume).FirstOrDefault(); var botFace = solid.Faces.Cast <Face>().OfType <PlanarFace>().FirstOrDefault(f => Math.Round(f.FaceNormal.Z, 2) == -1); var topFace = solid.Faces.Cast <Face>().OfType <PlanarFace>().FirstOrDefault(f => Math.Round(f.FaceNormal.Z, 2) == 1); var offsettopFace = CurveLoop.CreateViaOffset(topFace.GetEdgesAsCurveLoops().FirstOrDefault(), topoffset, topFace.FaceNormal); var offsetbotFace = CurveLoop.CreateViaOffset(botFace.GetEdgesAsCurveLoops().FirstOrDefault(), botoffset, botFace.FaceNormal); offsetbotFace.Transform(Transform.CreateTranslation(new XYZ(0, 0, UnitUtils.ConvertToInternalUnits(-100, DisplayUnitType.DUT_MILLIMETERS)))); var fdoc = commandData.Application.Application.NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2020\Family Templates\English\Metric Generic Model.rft"); using (Transaction tran = new Transaction(fdoc, "new Blend")) { tran.Start(); var plan = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, botFace.Origin); var sketchPlane = SketchPlane.Create(fdoc, plan); var top = ConvertLoopToArray(offsettopFace); var baseface = ConvertLoopToArray(offsetbotFace); var blend = fdoc.FamilyCreate.NewBlend(true, top, baseface, sketchPlane); blend.LookupParameter("Second End").Set(Math.Abs(blend.LookupParameter("Second End").AsDouble())); //CreateBlend(fdoc, null); tran.Commit(); } fdoc.SaveAs($"{Path.GetTempPath()}{foundation.Id.ToString()}-{Guid.NewGuid().ToString()}.rfa"); Family family = fdoc.LoadFamily(doc); fdoc.Close(); using (Transaction tran = new Transaction(doc, "new void")) { tran.Start(); //offsetFace.ToList().ForEach(f => doc.Create.NewModelCurve(f, SketchPlane.Create(doc, Plane.CreateByThreePoints(f.GetEndPoint(0), f.GetEndPoint(1), new XYZ(0, 0, 1))))); //botFace.GetEdgesAsCurveLoops().FirstOrDefault().ToList().ForEach(f => doc.Create.NewModelCurve(f, SketchPlane.Create(doc, Plane.CreateByThreePoints(f.GetEndPoint(0), f.GetEndPoint(1), new XYZ(0, 0, 1))))); var symbol = doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; symbol.Activate(); var ele = doc.Create.NewFamilyInstance(XYZ.Zero, symbol, Autodesk.Revit.DB.Structure.StructuralType.Footing); results.Add(ele); tran.Commit(); } } foreach (var ele in results) { var boundingBox = ele.get_BoundingBox(null); var solids = ele.GetSolids(); var outline = new Outline(boundingBox.Min, boundingBox.Max); var bbfilter = new BoundingBoxIntersectsFilter(outline); var collectors = new FilteredElementCollector(doc, results.Select(e => e.Id).ToList()) .WhereElementIsNotElementType() .WherePasses(bbfilter) .ToElements(); var solid = ele.GetSolids().FirstOrDefault(); var firstZ = solid.Faces.Cast <Face>().OfType <PlanarFace>().FirstOrDefault(f => Math.Round(f.FaceNormal.Z, 2) == -1).Origin.Z; foreach (var item in collectors) { var secondSolid = item.GetSolids().FirstOrDefault(); var secondZ = secondSolid.Faces.Cast <Face>().OfType <PlanarFace>().FirstOrDefault(f => Math.Round(f.FaceNormal.Z, 2) == -1).Origin.Z; if (Math.Round(firstZ, 2) == Math.Round(secondZ, 2)) { solid = BooleanOperationsUtils.ExecuteBooleanOperation(solid, item.GetSolids().FirstOrDefault(), BooleanOperationsType.Union); } } var botFace = solid.Faces.Cast <Face>().OfType <PlanarFace>().FirstOrDefault(f => Math.Round(f.FaceNormal.Z, 2) == -1); var topFace = solid.Faces.Cast <Face>().OfType <PlanarFace>().FirstOrDefault(f => Math.Round(f.FaceNormal.Z, 2) == 1); var offsettopFace = CurveLoop.CreateViaOffset(topFace.GetEdgesAsCurveLoops().FirstOrDefault(), 0, topFace.FaceNormal); var offsetbotFace = CurveLoop.CreateViaOffset(topFace.GetEdgesAsCurveLoops().FirstOrDefault(), -topoffset + botoffset, topFace.FaceNormal); offsetbotFace.Transform(Transform.CreateTranslation(new XYZ(0, 0, -topFace.Origin.Z + botFace.Origin.Z))); var fdoc = commandData.Application.Application.NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2020\Family Templates\English\Metric Generic Model.rft"); using (Transaction tran = new Transaction(fdoc, "new Blend")) { tran.Start(); var plan = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, botFace.Origin); var sketchPlane = SketchPlane.Create(fdoc, plan); var top = ConvertLoopToArray(offsettopFace); var baseface = ConvertLoopToArray(offsetbotFace); var blend = fdoc.FamilyCreate.NewBlend(true, top, baseface, sketchPlane); blend.LookupParameter("Second End").Set(Math.Abs(blend.LookupParameter("Second End").AsDouble())); //CreateBlend(fdoc, null); tran.Commit(); } fdoc.SaveAs($"{Path.GetTempPath()}{ele.Id.ToString()}-{Guid.NewGuid().ToString()}.rfa"); Family family = fdoc.LoadFamily(doc); fdoc.Close(); using (Transaction tran = new Transaction(doc, "new void")) { tran.Start(); //offsetFace.ToList().ForEach(f => doc.Create.NewModelCurve(f, SketchPlane.Create(doc, Plane.CreateByThreePoints(f.GetEndPoint(0), f.GetEndPoint(1), new XYZ(0, 0, 1))))); //botFace.GetEdgesAsCurveLoops().FirstOrDefault().ToList().ForEach(f => doc.Create.NewModelCurve(f, SketchPlane.Create(doc, Plane.CreateByThreePoints(f.GetEndPoint(0), f.GetEndPoint(1), new XYZ(0, 0, 1))))); var symbol = doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; symbol.Activate(); doc.Create.NewFamilyInstance(XYZ.Zero, symbol, Autodesk.Revit.DB.Structure.StructuralType.Footing); tran.Commit(); } } } return(Result.Succeeded); }