示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }