예제 #1
0
        private CVAngle Init(CMAngle model, Transform parent,
                             CVLineSegment segment1, CVLineSegment segment2)
        {
            CVPoint point = segment1.GetCommonPoint(segment2);
            // функция вычисления направлений линий, образующих угол
            Func <CVLineSegment, Vector3> getDir
                = segment => segment.RealDirection.normalized * (point == segment.FirstPoint ? 1 : -1);
            // создание обозначения угла
            const float radius = 0.2f;

            Vector3[] positions = null;
            if (model.IsRightAngle)
            {
                positions = CalcRightAngleContour(radius, getDir(segment1), getDir(segment2));
            }
            else
            {
                positions = CalcAngleContour(radius, getDir(segment1), getDir(segment2));
            }
            CreateLineRenderer(transform, positions);

            // привязка обозначения угла к месту угла
            transform.parent        = parent;
            transform.localPosition = point.RealPosition;
            transform.localRotation = Quaternion.identity;
            transform.localScale    = Vector3.one;

            Model = model;

            return(this);
        }
예제 #2
0
        // отложенная обработка события выбора отрезка
        private IEnumerator LineView_Selected_Coroutine(CVLine view, CVLineSegment segment)
        {
            switch (CurState)
            {
            case State.SetAngle:
                if (activeSegments.Count != 0 && segment.GetCommonPoint(activeSegments.Top) == null)
                {
                    activeSegments.Clear();
                }
                activeSegments.ToXor(segment);
                break;

            case State.BuildLine:
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (curAction != null && curAction.IsDone)
                {
                    curAction.Undo();
                    yield return(null);
                }
                RaycastHit raycastHit = new RaycastHit();
                if (activePoints.Top != null && Physics.Raycast(ray, out raycastHit))
                {
                    CVLineSegment correctSegment = raycastHit.transform.gameObject.GetComponent <CVLineSegment>();
                    curAction = new CBuildLineAction(this, activePoints.Top, correctSegment, raycastHit.point);
                    curAction.Do();
                }
                break;

            case State.DivideLine:
                activeSegments.ToXor(segment);
                break;

            case State.Static:
                break;
            }
            yield return(null);
        }