Esempio n. 1
0
        public void DrawAxisText(ModelViewSurface surface, SKCanvas canvas)
        {
            SKPaint axisPaint = new SKPaint()
            {
                Style       = SKPaintStyle.StrokeAndFill,
                Color       = Color.LightGray.ToSKColor(),
                IsAntialias = true,
                BlendMode   = SKBlendMode.Lighten,
                StrokeWidth = 1,
                TextAlign   = SKTextAlign.Center,
                TextSize    = surface.ViewHeight / 75
            };

            for (float x = gridStartXbig; x < surface.ViewWidth * surface.ScaleFactor; x += ScaledStep * 10)
            {
                SKPoint pt = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = x, Y = surface.Origin.Y
                },
                                                              surface.ScaleFactor, surface.Origin, surface.ViewHeight);
                pt.Y -= axisPaint.TextSize * 2;
                canvas.DrawText(x.ToString("F1"), pt, axisPaint);
            }

            axisPaint.TextAlign = SKTextAlign.Left;
            for (float y = gridStartYbig + ScaledStep * 10; y < surface.ViewHeight * surface.ScaleFactor; y += ScaledStep * 10)
            {
                SKPoint pt = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = surface.Origin.X,
                    Y = y
                }, surface.ScaleFactor, surface.Origin, surface.ViewHeight);
                pt.X += axisPaint.TextSize;
                pt.Y += axisPaint.TextSize / 2;
                canvas.DrawText(y.ToString("F1"), pt, axisPaint);
            }
        }
Esempio n. 2
0
        public void DrawGrid(ModelViewSurface surface, SKCanvas canvas)
        {
            if (UpdateNeeded)
            {
                gridBMP    = new SKBitmap((int)Math.Round(surface.ViewWidth), (int)Math.Round(surface.ViewHeight));
                gridBuffer = new SKCanvas(gridBMP);
                float x = surface.Origin.X;
                float y = surface.Origin.Y;
                // Найдём ближайшее кратное
                // Количество крупных и мелких делений сетки всегда примерно определённое.
                // Берём ширину окна просмотра и делим её на сто частей
                float stepx = surface.ViewWidth / 100;
                // Определим, скольки линейным единицам модели равен этот шаг
                // И округлим его
                ScaledStep = (float)Math.Round(stepx / surface.ScaleFactor, 1);
                // Теперь найдём кратное ScaledStep число, ближайшее к surface.Origin
                gridStartX = (float)Math.Floor(x / ScaledStep) * ScaledStep;
                gridStartY = (float)Math.Floor(y / ScaledStep) * ScaledStep;
                if (gridStartX < x)
                {
                    gridStartX += ScaledStep;
                }
                if (gridStartY < y)
                {
                    gridStartY += ScaledStep;
                }
                gridStartXbig = (float)Math.Floor(x / (ScaledStep * 10)) * ScaledStep * 10;
                gridStartYbig = (float)Math.Floor(y / (ScaledStep * 10)) * ScaledStep * 10;
                if (gridStartX < x)
                {
                    gridStartX += ScaledStep;
                }
                if (gridStartY < y)
                {
                    gridStartY += ScaledStep;
                }
                if (gridStartXbig < x)
                {
                    gridStartXbig += ScaledStep * 10;
                }
                if (gridStartYbig < y)
                {
                    gridStartYbig += ScaledStep * 10;
                }
                // Теперь рисуем. Для крупных и мелких делений - своя структура SKPaint
                SKPaint PaintSmall = new SKPaint
                {
                    Style       = SKPaintStyle.Stroke,
                    Color       = Color.FromRgb(20, 20, 20).ToSKColor(),
                    IsAntialias = true,
                    StrokeWidth = 1
                };

                SKPaint PaintBig = new SKPaint
                {
                    Style       = SKPaintStyle.Stroke,
                    Color       = PaintSmall.Color,
                    IsAntialias = true,
                    StrokeWidth = 3
                };

                SKPoint smallStart = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = gridStartX, Y = gridStartY
                },
                                                                      surface.ScaleFactor, surface.Origin, surface.ViewHeight);
                SKPoint bigStart = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = gridStartXbig, Y = gridStartYbig
                },
                                                                    surface.ScaleFactor, surface.Origin, surface.ViewHeight);

                for (x = smallStart.X; x < surface.ViewWidth; x += ScaledStep * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(x, 0, x, surface.ViewHeight, PaintSmall);
                }

                for (x = bigStart.X; x < surface.ViewWidth; x += ScaledStep * 10 * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(x, 0, x, surface.ViewHeight, PaintBig);
                }

                for (y = smallStart.Y; y > 0; y -= ScaledStep * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(0, y, surface.ViewWidth, y, PaintSmall);
                }

                for (y = bigStart.Y; y > 0; y -= ScaledStep * 10 * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(0, y, surface.ViewWidth, y, PaintBig);
                }

                DrawCoordinationSystem(surface, gridBuffer);
                DrawAxisText(surface, gridBuffer);

                UpdateNeeded = false;
            }
            canvas.DrawBitmap(gridBMP, 0, 0);
        }
        public void Touch(SKTouchEventArgs e)
        {
            if (e.ActionType == SKTouchAction.WheelChanged)
            {
                WheelZoom(e.WheelDelta);
                return;
            }

            if (e.MouseButton == SKMouseButton.Right)
            {
                CancelAction();
                return;
            }
            try
            {
                IssoPoint2D pt1 = IssoConvert.SkPointToIssoPoint2D(e.Location, ScaleFactor, ModelViewFragment, ViewHeight);
                // TODO: Обработать активность привязок
                pt1 = Grid.Snap(pt1);
                modelVM.SnapPoint = modelVM.SnapToNodes(pt1);
                if (modelVM.SnapPoint.X != float.MinValue)
                {
                    pt1.X = modelVM.SnapPoint.X;
                }
                if (modelVM.SnapPoint.Y != float.MinValue)
                {
                    pt1.Y = modelVM.SnapPoint.Y;
                }
                // TODO: Окончание создания компонентов при "касательном" вводе
                // НАЖАТИЕ
                if (e.ActionType == SKTouchAction.Pressed)
                {
                    switch (EditorAction)
                    {
                    case EditorActions.None: StartPt = pt1; SelectComponent(pt1); break;

                    case EditorActions.SelectFrame: SelectByFrame(pt1, SelectionStarted); break;

                    case EditorActions.NewLinearFirstPoint: CreateNewLinear(pt1); break;

                    case EditorActions.NewLinearLastPoint: FinishNewLinear(pt1, e.MouseButton); break;

                    case EditorActions.EditNode: CreateOrEditNode(pt1); break;

                    case EditorActions.NewDimensionFirstNode: DimensionFirstNode(pt1); break;

                    case EditorActions.NewDimensionVFirstNode: DimensionFirstNode(pt1); break;

                    case EditorActions.NewDimensionLastNode: DimensionLastNode(pt1); break;

                    case EditorActions.NewDimensionLinePlace: DimensionLinePlace(pt1); break;

                    case EditorActions.NewForce: CreateForce(pt1); break;

                    case EditorActions.NewDstLoad: CreateDistLoad(pt1); break;

                    case EditorActions.MirrorElements: MirrorElements(pt1, true); break;

                    case EditorActions.CopyElements: CopyElements(pt1, CopyBasePointDefined); break;
                    }
                }
                // ДВИЖЕНИЕ
                if (e.ActionType == SKTouchAction.Moved)
                {
                    EndPt      = pt1;
                    MovingView = e.InContact && (IssoDist.PointDst(StartPt, EndPt) > (5 / ScaleFactor));
                    switch (EditorAction)
                    {
                    case EditorActions.NewLinearLastPoint: ChangeLastPoint(pt1); break;

                    case EditorActions.NewDimensionLastNode: ChangeDimPlace(pt1); break;

                    case EditorActions.NewDimensionLinePlace: ChangeDimPlace(pt1); break;

                    case EditorActions.SelectFrame: if (SelectionStarted)
                        {
                            SelectByFrame(pt1, false);
                        }
                        break;

                    case EditorActions.MirrorElements: MirrorElements(pt1, false); break;

                    case EditorActions.None: if (MovingView)
                        {
                            MoveOrigin();
                        }
                        break;

                    case EditorActions.CopyElements: CopyTargetPoint = pt1; break;
                    }
                    return;
                }
            }
            finally
            {
                // ОТОБРАЖАЕМ ПРОЦЕСС РЕДАКТИРОВАНИЯ
                if (EditorAction != EditorActions.None)
                {
                    RModelView.InvalidateSurface();
                }
                OnVisualStates?.Invoke(EditorAction);
            }
        }