コード例 #1
0
        void SortCenters()
        {
            PointSorter ps = new PointSorter();

            ps.direction = DimDirection;
            //сортируем по направлению
            centers.Sort(ps);
            centers_projected.Sort(ps);
        }
コード例 #2
0
    private void UpdateMesh(PointSorter sortedPoints)
    {
        Vector3 v0 = sortedPoints.FirstPoint.WorldPos;
        Vector3 v1 = sortedPoints.SecondPoint.WorldPos;
        Vector3 v2 = sortedPoints.ThirdPoint.WorldPos;

        TrianglePlane         = new Plane(v0, v1, v2);
        triangleMesh.vertices = new Vector3[] { v0, v1, v2 };
        triangleMesh.normals  = new Vector3[] { TrianglePlane.normal, TrianglePlane.normal, TrianglePlane.normal };
        triangleMesh.RecalculateBounds();
    }
コード例 #3
0
    public void DoUpdate(bool showTriangle)
    {
        FoundTriangle = false;
        Vector2 cursorPosition = GetCursorPixelPosition();

        Datum[] data = GetData(cursorPosition).ToArray();
        if (data.Length >= 3)
        {
            PointSorter sortedPoints = new PointSorter(data);
            if (sortedPoints.TriangleFound)
            {
                FoundTriangle = true;
                PointA        = sortedPoints.FirstPoint.WorldPos;
                PointB        = sortedPoints.SecondPoint.WorldPos;
                PointC        = sortedPoints.ThirdPoint.WorldPos;
                UpdateMesh(sortedPoints);
            }
        }

        meshFilter.gameObject.SetActive(showTriangle);
    }
コード例 #4
0
ファイル: MultiLeader.cs プロジェクト: koropet/PKUserTools
        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());
                }
            }
        }