示例#1
0
        private void AlignTag(UIDocument UIDoc, AlignType alignType, TransactionGroup txg)
        {
            Document document = UIDoc.Document();
            ICollection <ElementId> elementIds = UIDoc.Selection().GetElementIds();
            bool flag = false;

            using (Transaction tx = new Transaction(document))
            {
                txg.Start("Align Tag");
                if (elementIds.Count == 0)
                {
                    flag = true;
                    IList <Reference> selectedReferences = UIDoc.get_Selection().PickObjects((ObjectType)1, "Pick elements to be aligned");
                    elementIds = Tools.RevitReferencesToElementIds(document, selectedReferences);
                    UIDoc.get_Selection().SetElementIds(elementIds);
                }
                List <AnnotationElement> source = this.RetriveAnnotationElementsFromSelection(UIDoc, tx);
                txg.RollBack();
                txg.Start("Align Tag");
                tx.Start("Align Tags");
                if (source.Count > 1)
                {
                    document.get_ActiveView().get_UpDirection();
                    switch (alignType)
                    {
                    case AlignType.Left:
                        AnnotationElement annotationElement1 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpLeft.X())).FirstOrDefault <AnnotationElement>();
                        using (List <AnnotationElement> .Enumerator enumerator = source.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(annotationElement1.UpLeft.X(), current.UpLeft.Y(), 0.0);
                                current.MoveTo(point, AlignType.Left);
                            }
                            break;
                        }

                    case AlignType.Right:
                        AnnotationElement annotationElement2 = source.OrderByDescending <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpRight.get_X())).FirstOrDefault <AnnotationElement>();
                        using (List <AnnotationElement> .Enumerator enumerator = source.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(annotationElement2.UpRight.get_X(), current.UpRight.get_Y(), 0.0);
                                current.MoveTo(point, AlignType.Right);
                            }
                            break;
                        }

                    case AlignType.Up:
                        AnnotationElement annotationElement3 = source.OrderByDescending <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpRight.get_Y())).FirstOrDefault <AnnotationElement>();
                        using (List <AnnotationElement> .Enumerator enumerator = source.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(current.UpRight.get_X(), annotationElement3.UpRight.get_Y(), 0.0);
                                current.MoveTo(point, AlignType.Up);
                            }
                            break;
                        }

                    case AlignType.Down:
                        AnnotationElement annotationElement4 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.DownRight.get_Y())).FirstOrDefault <AnnotationElement>();
                        using (List <AnnotationElement> .Enumerator enumerator = source.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(current.DownRight.get_X(), annotationElement4.DownRight.get_Y(), 0.0);
                                current.MoveTo(point, AlignType.Down);
                            }
                            break;
                        }

                    case AlignType.Center:
                        List <AnnotationElement> list1 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpRight.get_X())).ToList <AnnotationElement>();
                        double num1 = (list1.LastOrDefault <AnnotationElement>().Center.get_X() + list1.FirstOrDefault <AnnotationElement>().Center.get_X()) / 2.0;
                        using (List <AnnotationElement> .Enumerator enumerator = list1.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(num1, current.Center.get_Y(), 0.0);
                                current.MoveTo(point, AlignType.Center);
                            }
                            break;
                        }

                    case AlignType.Middle:
                        List <AnnotationElement> list2 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpRight.get_Y())).ToList <AnnotationElement>();
                        double num2 = (list2.LastOrDefault <AnnotationElement>().Center.get_Y() + list2.FirstOrDefault <AnnotationElement>().Center.get_Y()) / 2.0;
                        using (List <AnnotationElement> .Enumerator enumerator = list2.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(current.Center.get_X(), num2, 0.0);
                                current.MoveTo(point, AlignType.Middle);
                            }
                            break;
                        }

                    case AlignType.Vertically:
                        List <AnnotationElement> list3 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpRight.get_Y())).ToList <AnnotationElement>();
                        AnnotationElement        annotationElement5 = list3.LastOrDefault <AnnotationElement>();
                        AnnotationElement        annotationElement6 = list3.FirstOrDefault <AnnotationElement>();
                        double num3 = (annotationElement5.Center.get_Y() - annotationElement6.Center.get_Y()) / (double)(source.Count - 1);
                        int    num4 = 0;
                        using (List <AnnotationElement> .Enumerator enumerator = list3.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(current.Center.get_X(), annotationElement6.Center.get_Y() + (double)num4 * num3, 0.0);
                                current.MoveTo(point, AlignType.Vertically);
                                ++num4;
                            }
                            break;
                        }

                    case AlignType.Horizontally:
                        List <AnnotationElement> list4 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.UpRight.get_X())).ToList <AnnotationElement>();
                        AnnotationElement        annotationElement7 = list4.LastOrDefault <AnnotationElement>();
                        AnnotationElement        annotationElement8 = list4.FirstOrDefault <AnnotationElement>();
                        double num5 = (annotationElement7.Center.get_X() - annotationElement8.Center.get_X()) / (double)(source.Count - 1);
                        int    num6 = 0;
                        using (List <AnnotationElement> .Enumerator enumerator = list4.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(annotationElement8.Center.get_X() + (double)num6 * num5, current.Center.get_Y(), 0.0);
                                current.MoveTo(point, AlignType.Horizontally);
                                ++num6;
                            }
                            break;
                        }

                    case AlignType.UntangleVertically:
                        List <AnnotationElement> list5 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(y => y.GetLeaderEnd().get_Y())).ToList <AnnotationElement>();
                        AnnotationElement        annotationElement9 = list5.FirstOrDefault <AnnotationElement>();
                        double num7 = 0.0;
                        using (List <AnnotationElement> .Enumerator enumerator = list5.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(current.UpLeft.get_X(), annotationElement9.UpLeft.Y() + num7, 0.0);
                                current.MoveTo(point, AlignType.UntangleVertically);
                                num7 += current.UpLeft.get_Y() - current.DownLeft.get_Y();
                            }
                            break;
                        }

                    case AlignType.UntangleHorizontally:
                        List <AnnotationElement> list6 = source.OrderBy <AnnotationElement, double>((Func <AnnotationElement, double>)(x => x.GetLeaderEnd().get_X())).ToList <AnnotationElement>();
                        AnnotationElement        annotationElement10 = list6.FirstOrDefault <AnnotationElement>();
                        double num8 = 0.0;
                        using (List <AnnotationElement> .Enumerator enumerator = list6.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                AnnotationElement current = enumerator.Current;
                                XYZ point = new XYZ(annotationElement10.UpLeft.get_X() + num8, current.UpLeft.Y(), 0.0);
                                current.MoveTo(point, AlignType.UntangleHorizontally);
                                num8 += current.UpRight.get_X() - current.UpLeft.get_X();
                            }
                            break;
                        }
                    }
                }
                tx.Commit();
                txg.Assimilate();
            }
            if (flag)
            {
                List <ElementId> elementIdList = new List <ElementId>();
                elementIdList.Add(ElementId.get_InvalidElementId());
                elementIds = (ICollection <ElementId>)elementIdList;
            }
            UIDoc.get_Selection().SetElementIds(elementIds);
        }