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); } }
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); } }