Ejemplo n.º 1
0
        void FindCenters()
        {
            //находим центры
            for (int i = 0; i < objects.Count; i++)
            {
                Point3d cen = UT.GetCenter(objects[i], Dim_line, dim_line_point, out hascenter);

                if (hascenter)
                {
                    centers.Add(cen);
                }
            }
        }
Ejemplo n.º 2
0
        void FindDirection()
        {
            //автоопределение направления (горизонтально/вертикально)
            if (Auto_direction)
            {
                double minx = double.PositiveInfinity;
                double maxx = double.NegativeInfinity;

                double miny = double.PositiveInfinity;
                double maxy = double.NegativeInfinity;
                //надо найти центры по дефолтному направлению и вычислить границы
                for (int i = 0; i < objects.Count; i++)
                {
                    Point3d cen = UT.GetCenter(objects[i], DimDirection, dim_line_point, out hascenter);

                    if (hascenter)
                    {
                        if (cen.X < minx)
                        {
                            minx = cen.X;
                        }
                        if (cen.X > maxx)
                        {
                            maxx = cen.X;
                        }

                        if (cen.Y < miny)
                        {
                            miny = cen.Y;
                        }
                        if (cen.Y > maxy)
                        {
                            maxy = cen.Y;
                        }
                    }
                }
                Point3d dd = dim_line_point;                //простое название

                if ((dd.X < minx || dd.X > maxx) && (dd.Y < maxy) && (dd.Y > miny))
                {
                    DimDirection = new Line(Point3d.Origin, new Point3d(0, 1000, 0));
                }
                else
                {
                    DimDirection = new Line(Point3d.Origin, new Point3d(1000, 0, 0));
                }
            }
            Auto_direction = true;            //обнуляем чтоб на следующий раз можно было авто
        }
Ejemplo n.º 3
0
        public override void Execute()
        {
            base.Execute();

            var sset = Input.Objects("Выберите объекты для нанесения выносок или ",
                                     new string[]
            {
                "Angle", "Уклон",
                "oFFset", "cМЕщение",
                "Text", "ТТекст"
            },
                                     new SelectionTextInputEventHandler(KeywordInput));

            if (Input.StatusBad)
            {
                return;
            }

            string[] Keywords = null;

            if (sset.Count == 1)
            {
                Keywords = new string[]
                {
                    "LEft", "ЛЕво",
                    "RIght", "ПРаво",
                    "INside", "внуТРи",
                    "OUtside", "сНАружи"
                };
            }

            leader_point = Input.Point("\nУкажите точку, через которую пройдет выносная линия", Keywords);

            if (Input.StatusKeyword)
            {
                SideInput(Input.StringResult);

                leader_point = Input.Point("\nУкажите точку, через которую пройдет выносная линия");
            }
            if (Input.StatusBad)
            {
                return;
            }

            //достаем объекты
            using (Utilities.TransactionHelper th = new Utilities.TransactionHelper())
            {
                objects = th.ReadObjects(sset);

                Line dir = new Line(Point3d.Origin, new Point3d(1000, 0, 0));                 //для работы функции нахождения центра
                bool hascenter;
                for (int i = 0; i < objects.Count; i++)
                {
                    Point3d cen = UT.GetCenter(objects[i], dir, Point3d.Origin, out hascenter);

                    if (hascenter)
                    {
                        centers.Add(cen);
                    }
                }
                if (centers.Count > 1)                //если больше 1 объекта
                {
                    dir = new Line(centers[0], centers[centers.Count - 1]);

                    //сортируем
                    PointSorter ps = new PointSorter();
                    ps.direction = dir;

                    //сортируем по направлению
                    centers.Sort(ps);
                }
                //создаем объекты
                if (centers.Count > 1)
                {
                    GroupLeader(centers[0], centers[centers.Count - 1], leader_point);
                }
                else if (centers.Count == 1)
                {
                    GroupLeader(centers[0], leader_point, group_leader_side);
                }
                else
                {
                    return;                 //если объектов 0 то нам здесь нечего делать
                }
                cline = s_cline;
            }
            Make();


            Line p1p2      = new Line(p1, p2);
            bool subleader = false;

            if (p1p2.Angle > Math.PI * 1 / 4 && p1p2.Angle < Math.PI * 3 / 4 || p1p2.Angle > Math.PI * 5 / 4 && p1p2.Angle < Math.PI * 7 / 4)
            {
                subleader = true;
            }
            else
            {
                geometry.Add(mt);
            }
            using (TransactionHelper th = new TransactionHelper())
            {
                th.WriteObjects(geometry);
            }
            //нужно 2 разных транзакции чтобы видеть результат работы предыдущей части
            if (subleader)
            {
                using (TransactionHelper th = new TransactionHelper())
                {
                    PrepareSubLeader();
                    th.WriteObject(geometry.Last());
                }
            }
        }