Beispiel #1
0
        /// <summary>
        /// 绘制某位置的选中状态(使用一个矩形);
        /// </summary>
        /// <param name="point"></param>
        public static void DrawSelectedPointState(Vector2D point, ICanvas canvas, ICanvasScreenConvertable canvasProxy)
        {
            if (point == null)
            {
                throw new ArgumentNullException(nameof(point));
            }

            if (canvas == null)
            {
                throw new ArgumentNullException(nameof(canvas));
            }

            if (canvasProxy == null)
            {
                throw new ArgumentNullException(nameof(canvasProxy));
            }


            //得到以某点为中心的视图矩形;
            var rect = NativeGeometryExtensions.GetNativeSuroundingScreenRect(
                canvasProxy.ToScreen(point),
                TolerantedScreenLength,
                TolerantedScreenLength
                );

            canvas.NativeDrawRectangle(
                rect,
                HighLightRectColorBrush,
                HighLightLinePen
                );
        }
Beispiel #2
0
        /// <summary>
        /// 为未完成的线段绘制角度信息,该角度将X正半轴作为起始边;
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="canvasProxy"></param>
        /// <param name="editingLine"></param>
        public static void DrawEditingLineArcString(ICanvas canvas, ICanvasScreenConvertable canvasProxy, Line2D editingLine)
        {
            if (canvas == null)
            {
                throw new ArgumentNullException(nameof(canvas));
            }

            if (canvasProxy == null)
            {
                throw new ArgumentNullException(nameof(canvasProxy));
            }

            if (editingLine == null)
            {
                throw new ArgumentNullException(nameof(editingLine));
            }

            var start = editingLine.Start;
            var end   = editingLine.End;

            ///得到弧的两条边的向量(以<see cref="editingLine.Start"/>为起点),这两条边的长度相等;
            var lineVector      = end - start;
            var xAxisLineVector = Vector2D.BasisX * lineVector.Modulus();

            //确定角度;
            var radAngle = Vector2D.BasisX.AngleTo(lineVector);
            var degAngle = (int)(Extension.RadToDeg(radAngle));
            //确定需要绘制角度的位置;
            var stringPosition = (lineVector + xAxisLineVector).Normalize() * lineVector.Modulus() + start;

            canvas.DrawText(degAngle.ToString(), 12, LineEditingTipBrush, stringPosition);
        }
Beispiel #3
0
        /// <summary>
        /// 绘制选择状态;
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="canvasProxy"></param>
        private void DrawSelectedState(ICanvas canvas, ICanvasScreenConvertable canvasProxy)
        {
            if (!IsSelected)
            {
                return;
            }

            if (Rectangle2D == null)
            {
                return;
            }

            //绘制四边的中点;
            var lines = Rectangle2D.GetLines();

            var rectLength = TolerantedScreenLength;

            foreach (var line in lines)
            {
                var point = line.MiddlePoint;
                var rect  = NativeGeometryExtensions.GetNativeSuroundingScreenRect(canvasProxy.ToScreen(point), rectLength, rectLength);
                canvas.NativeDrawRectangle(rect, HighLightEllipseColorBrush, HighLightLinePen);
            }

            //绘制中心;
            var centerPointX = Rectangle2D.GetVertexes().Average(p => p.X);
            var centerPointY = Rectangle2D.GetVertexes().Average(p => p.Y);

            var centerScreenPoint = canvasProxy.ToScreen(new Vector2D(centerPointX, centerPointY));
            var centerRect        = NativeGeometryExtensions.GetNativeSuroundingScreenRect(centerScreenPoint, rectLength, rectLength);

            canvas.NativeDrawRectangle(centerRect, HighLightEllipseColorBrush, HighLightLinePen);
        }
Beispiel #4
0
        /// <summary>
        /// 交点绘制;
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="canvasProxy"></param>
        public override void Draw(ICanvas canvas, ICanvasScreenConvertable canvasProxy)
        {
            if (canvas == null)
            {
                throw new ArgumentNullException(nameof(canvas));
            }

            if (canvasProxy == null)
            {
                throw new ArgumentNullException(nameof(canvasProxy));
            }

            //画叉;
            var screenPosition = canvasProxy.ToScreen(Position);
            var rectLength     = HighLightRectLength;
            //从左上到右下;
            var line1 = new Line2D(
                new Vector2D(screenPosition.X - rectLength, screenPosition.Y - rectLength),
                new Vector2D(screenPosition.X + rectLength, screenPosition.Y + rectLength)
                );
            //从左下到右上;
            var line2 = new Line2D(
                new Vector2D(screenPosition.X - rectLength, screenPosition.Y + rectLength),
                new Vector2D(screenPosition.X + rectLength, screenPosition.Y - rectLength)
                );

            canvas.NativeDrawLine(IntersectPen, line1);
            canvas.NativeDrawLine(IntersectPen, line2);
        }
Beispiel #5
0
 /// <summary>
 /// 绘制未完成的编辑的线段及其提示;
 /// </summary>
 /// <param name="canvas"></param>
 /// <param name="canvasProxy"></param>
 /// <param name="editingLine"></param>
 public static void DrawEditingLine(ICanvas canvas, ICanvasScreenConvertable canvasProxy, Line2D editingLine)
 {
     //绘制未完成线段;
     canvas.DrawLine(LinePen, editingLine);
     DrawEditingLineOutLines(canvas, canvasProxy, editingLine);
     DrawEditingLineLengthString(canvas, canvasProxy, editingLine);
     DrawEditingLineArc(canvas, canvasProxy, editingLine);
     DrawEditingLineArcString(canvas, canvasProxy, editingLine);
 }
Beispiel #6
0
        public override void Draw(ICanvas canvas, ICanvasScreenConvertable canvasProxy)
        {
            base.Draw(canvas, canvasProxy);


            canvas.DrawEllipse(null, new Pen {
                Brush = Brushes.Purple, Thickness = 2
            }, Vector2D.Zero, 2, 4);
            canvas.DrawText("This is a custom drawObject", 12, Brushes.White, new Vector2D(-1, 0));
        }
Beispiel #7
0
        public override bool PointInObject(Vector2D point, ICanvasScreenConvertable canvasProxy)
        {
            if (point == null)
            {
                throw new ArgumentNullException(nameof(point));
            }

            if (canvasProxy == null)
            {
                throw new ArgumentNullException(nameof(canvasProxy));
            }

            if (Rectangle2D == null)
            {
                return(false);
            }

            var screenPoint = canvasProxy.ToScreen(point);

            //判断与中心的关系;
            var centerScreenPoint = canvasProxy.ToScreen(Rectangle2D.Center);
            var screenRect        = Tida.Canvas.Infrastructure.Utils.NativeGeometryExtensions.GetNativeSuroundingScreenRect(
                centerScreenPoint,
                TolerantedScreenLength,
                TolerantedScreenLength
                );

            if (screenRect.Contains(screenPoint))
            {
                return(true);
            }

            //判断与四边的关系;
            var lines            = Rectangle2D.GetLines();
            var screenStartPoint = new Vector2D();
            var screenEndPoint   = new Vector2D();

            foreach (var line in lines)
            {
                canvasProxy.ToScreen(line.Start, screenStartPoint);
                canvasProxy.ToScreen(line.End, screenEndPoint);
                var screenLine2D = new Line2D(
                    screenStartPoint, screenEndPoint
                    );
                if (screenLine2D.Distance(screenPoint) < TolerantedScreenLength)
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #8
0
        /// <summary>
        /// 为未完成的线段绘制角度弧形,该弧将X正半轴作为起始边;
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="canvasProxy"></param>
        /// <param name="editingLine"></param>
        public static void DrawEditingLineArc(ICanvas canvas, ICanvasScreenConvertable canvasProxy, Line2D editingLine)
        {
            var start = editingLine.Start;
            var end   = editingLine.End;

            var angle = (end - start).AngleFrom(Vector2D.BasisX);

            //弧度化为角度;
            var degAngle = Extension.RadToDeg(angle);

            canvas.DrawArc(LineEditingTipPen, start, editingLine.Length, 0, angle, true);

            canvas.DrawLine(LineEditingTipPen, new Line2D(start, new Vector2D(start.X + editingLine.Length, start.Y)));
            //canvas.DrawArc(Constants.LineEditingTipPen, new Vector2D(0, 0), 31, 0, 3.14);

            //canvas.DrawText(angle.ToString(), 18, new Media.SolidColorBrush { Color = Media.Color.FromRgb(0xFFFFFF) }, new Vector2D(0, 0));
        }
        private LengthNumContainerForMouseTrackable(
            THaveMousePositionTracker haveMousePositionTracker,
            NumberBoxInteractionHandler lengthInteractionHandler,
            ICanvasScreenConvertable canvasProxy
            ) :
            base(
                new NumberBoxInteractionHandler[] {
            lengthInteractionHandler
        }
                )
        {
            HaveMousePositionTracker = haveMousePositionTracker ?? throw new ArgumentNullException(nameof(haveMousePositionTracker));
            CanvasProxy = canvasProxy ?? throw new ArgumentNullException(nameof(canvasProxy));

            _lengthInteractionHandler = lengthInteractionHandler ?? throw new ArgumentNullException(nameof(lengthInteractionHandler));

            Initialize();
        }