public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { var uidoc = commandData.Application.ActiveUIDocument; var doc = uidoc.Document; var connForm = new ConnectElmFrm(uidoc); if (connForm.ShowDialog() != DialogResult.OK) { return(Result.Cancelled); } doc.AutoTransaction(() => { var combins = new CombinableElementArray(); var elms = connForm.Elms; elms.OfType <CombinableElement>().ToList().ForEach(f => combins.Append(f)); if (doc.IsFamilyDocument && combins.Size >= 2) { doc.CombineElements(combins); } else if (!doc.IsFamilyDocument && elms.Count >= 2) { elms.ForEach(f1 => elms.ForEach(f2 => { ExceptionUtil.AutoTry(() => { if (f1 == f2) { return; } if (!doc.CrossSpaceBox(f1, f2)) { return; } JoinGeometryUtils.JoinGeometry(doc, f1, f2); }); })); } }); return(Result.Succeeded); }
/// <summary> /// To connect elements on adjacent floor. /// </summary> /// <param name="doc"></param> /// <param name="wallGroups"></param> /// <returns></returns> private static int JoinElmByAdjacentFloor <T>(Document doc, IReadOnlyList <IGrouping <double, T> > wallGroups) where T : Element { var result = 0; for (var i = 0; i < wallGroups.Count - 1; i++) { foreach (var walli in wallGroups[i]) { if (!(walli.Location is LocationCurve c1)) { continue; } foreach (var wallj in wallGroups[i + 1]) { if (!(wallj.Location is LocationCurve c2)) { continue; } if (!doc.RejectSpaceBox(walli, wallj)) { continue; } if ((c1.Curve as Line).GetSpacePosition(c2.Curve as Line, out _) != GeometryPosition.Parallel) { continue; } ExceptionUtil.AutoTry(() => { JoinGeometryUtils.JoinGeometry(doc, walli, wallj); result++; }); } } } return(result); }
/// <summary> /// To connect elements on same floor. /// </summary> /// <param name="doc"></param> /// <param name="wallGroups"></param> /// <returns></returns> private static int JoinElmBySameFloor <T>(Document doc, List <IGrouping <ElementId, T> > wallGroups) where T : Element { var result = 0; foreach (var group in wallGroups) { foreach (var walli in group) { if (!(walli.Location is LocationCurve c1)) { continue; } foreach (var wallj in group) { if (!(wallj.Location is LocationCurve c2)) { continue; } if (!doc.RejectSpaceBox(walli, wallj)) { continue; } if ((c1.Curve as Line).GetSpacePosition(c2.Curve as Line, out _) != GeometryPosition.Parallel) { continue; } ExceptionUtil.AutoTry(() => { JoinGeometryUtils.JoinGeometry(doc, walli, wallj); result++; }); } } } return(result); }