/// <summary> /// Initialize new instance of <see cref="EllipseSelection"/> class. /// </summary> /// <param name="layer">The selection shapes layer.</param> /// <param name="shape">The selected shape.</param> /// <param name="style">The selection shapes style.</param> /// <param name="point">The selection point shape.</param> public EllipseSelection(XLayer layer, XEllipse shape, ShapeStyle style, BaseShape point) { _layer = layer; _ellipse = shape; _style = style; _point = point; }
/// <inheritdoc/> public override void LeftDown(double x, double y) { base.LeftDown(x, y); var editor = _serviceProvider.GetService<ProjectEditor>(); double sx = editor.Project.Options.SnapToGrid ? ProjectEditor.Snap(x, editor.Project.Options.SnapX) : x; double sy = editor.Project.Options.SnapToGrid ? ProjectEditor.Snap(y, editor.Project.Options.SnapY) : y; switch (_currentState) { case ToolState.None: { var style = editor.Project.CurrentStyleLibrary.Selected; _ellipse = XEllipse.Create( sx, sy, editor.Project.Options.CloneStyle ? style.Clone() : style, editor.Project.Options.PointShape, editor.Project.Options.DefaultIsStroked, editor.Project.Options.DefaultIsFilled); var result = editor.TryToGetConnectionPoint(sx, sy); if (result != null) { _ellipse.TopLeft = result; } editor.Project.CurrentContainer.WorkingLayer.Shapes = editor.Project.CurrentContainer.WorkingLayer.Shapes.Add(_ellipse); editor.Project.CurrentContainer.WorkingLayer.Invalidate(); ToStateOne(); Move(_ellipse); _currentState = ToolState.One; editor.CancelAvailable = true; } break; case ToolState.One: { if (_ellipse != null) { _ellipse.BottomRight.X = sx; _ellipse.BottomRight.Y = sy; var result = editor.TryToGetConnectionPoint(sx, sy); if (result != null) { _ellipse.BottomRight = result; } editor.Project.CurrentContainer.WorkingLayer.Shapes = editor.Project.CurrentContainer.WorkingLayer.Shapes.Remove(_ellipse); Remove(); base.Finalize(_ellipse); editor.Project.AddShape(editor.Project.CurrentContainer.CurrentLayer, _ellipse); _currentState = ToolState.None; editor.CancelAvailable = false; } } break; } }
/// <summary> /// Transfer selection state to <see cref="ToolState.One"/>. /// </summary> public void ToStateOne() { _ellipse = XEllipse.Create(0, 0, _style, null); _p1HelperPoint = XPoint.Create(0, 0, _point); _p2HelperPoint = XPoint.Create(0, 0, _point); _centerHelperPoint = XPoint.Create(0, 0, _point); _layer.Shapes = _layer.Shapes.Add(_ellipse); _layer.Shapes = _layer.Shapes.Add(_p1HelperPoint); _layer.Shapes = _layer.Shapes.Add(_p2HelperPoint); _layer.Shapes = _layer.Shapes.Add(_centerHelperPoint); }
/// <summary> /// /// </summary> /// <param name="ellipse"></param> /// <param name="rect"></param> /// <param name="selected"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <returns></returns> public static bool HitTestEllipse(XEllipse ellipse, Rect2 rect, ISet<BaseShape> selected, double dx, double dy) { if (ShapeBounds.GetEllipseBounds(ellipse, dx, dy).IntersectsWith(rect)) { if (selected != null) { selected.Add(ellipse); return false; } else { return true; } } return false; }
/// <summary> /// Transfer selection state to <see cref="ToolState.Three"/>. /// </summary> public void ToStateThree() { if (_ellipse != null) { _layer.Shapes = _layer.Shapes.Remove(_ellipse); _ellipse = null; } _endLine = XLine.Create(0, 0, _style, null); _endHelperPoint = XPoint.Create(0, 0, _point); _layer.Shapes = _layer.Shapes.Add(_endLine); _layer.Shapes = _layer.Shapes.Add(_endHelperPoint); }
/// <summary> /// Remove selection. /// </summary> public void Remove() { if (_ellipse != null) { _layer.Shapes = _layer.Shapes.Remove(_ellipse); _ellipse = null; } if (_startLine != null) { _layer.Shapes = _layer.Shapes.Remove(_startLine); _startLine = null; } if (_endLine != null) { _layer.Shapes = _layer.Shapes.Remove(_endLine); _endLine = null; } if (_p1HelperPoint != null) { _layer.Shapes = _layer.Shapes.Remove(_p1HelperPoint); _p1HelperPoint = null; } if (_p2HelperPoint != null) { _layer.Shapes = _layer.Shapes.Remove(_p2HelperPoint); _p2HelperPoint = null; } if (_centerHelperPoint != null) { _layer.Shapes = _layer.Shapes.Remove(_centerHelperPoint); _centerHelperPoint = null; } if (_startHelperPoint != null) { _layer.Shapes = _layer.Shapes.Remove(_startHelperPoint); _startHelperPoint = null; } if (_endHelperPoint != null) { _layer.Shapes = _layer.Shapes.Remove(_endHelperPoint); _endHelperPoint = null; } _layer.Invalidate(); }
/// <inheritdoc/> public override void Draw(object dc, XEllipse ellipse, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var _dc = dc as DrawingContext; var style = ellipse.Style; if (style == null) return; double thickness = style.Thickness / _state.ZoomX; double half = thickness / 2.0; Tuple<Brush, Pen> styleCached = _styleCache.Get(style); Brush fill; Pen stroke; if (styleCached != null) { fill = styleCached.Item1; stroke = styleCached.Item2; } else { fill = CreateBrush(style.Fill); stroke = CreatePen(style, thickness); _styleCache.Set(style, Tuple.Create(fill, stroke)); } var rect = CreateRect(ellipse.TopLeft, ellipse.BottomRight, dx, dy); double rx = rect.Width / 2.0; double ry = rect.Height / 2.0; var center = new Point(rect.X + rx, rect.Y + ry); DrawEllipseInternal(_dc, half, fill, stroke, ellipse.IsStroked, ellipse.IsFilled, ref center, rx, ry); }
public void Inherits_From_XText() { var target = new XEllipse(); Assert.True(target is XText); }
/// <inheritdoc/> public override void Draw(object dc, XEllipse ellipse, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var canvas = dc as SKCanvas; using (SKPaint brush = ToSKPaintBrush(ellipse.Style.Fill)) using (SKPaint pen = ToSKPaintPen(ellipse.Style, _scaleToPage, _sourceDpi, _targetDpi)) { var rect = CreateRect(ellipse.TopLeft, ellipse.BottomRight, dx, dy, _scaleToPage); DrawEllipseInternal(canvas, brush, pen, ellipse.IsStroked, ellipse.IsFilled, ref rect); } }
/// <inheritdoc/> public override void Draw(object dc, XEllipse ellipse, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { // TODO: Implement Draw ellipse. }
/// <summary> /// /// </summary> /// <param name="ellipse"></param> /// <param name="v"></param> /// <param name="threshold"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <returns></returns> public static BaseShape HitTestEllipse(XEllipse ellipse, Vector2 v, double threshold, double dx, double dy) { if (ShapeBounds.GetPointBounds(ellipse.TopLeft, threshold, dx, dy).Contains(v)) { return ellipse.TopLeft; } if (ShapeBounds.GetPointBounds(ellipse.BottomRight, threshold, dx, dy).Contains(v)) { return ellipse.BottomRight; } if (ShapeBounds.GetEllipseBounds(ellipse, dx, dy).Contains(v)) { return ellipse; } return null; }
/// <inheritdoc/> public override void Draw(object dc, XEllipse ellipse, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var _dc = dc as AM.DrawingContext; AM.IBrush brush = ToBrush(ellipse.Style.Fill); AM.Pen pen = ToPen(ellipse.Style, _scaleToPage); var rect = CreateRect(ellipse.TopLeft, ellipse.BottomRight, dx, dy); DrawEllipseInternal( _dc, brush, pen, ellipse.IsStroked, ellipse.IsFilled, ref rect); }
/// <summary> /// Draws a <see cref="XEllipse"/> shape using drawing context. /// </summary> /// <param name="dc">The native drawing context.</param> /// <param name="ellipse">The <see cref="XEllipse"/> shape.</param> /// <param name="dx">The X coordinate offset.</param> /// <param name="dy">The Y coordinate offset.</param> /// <param name="db">The properties database.</param> /// <param name="r">The data record.</param> public abstract void Draw(object dc, XEllipse ellipse, double dx, double dy, ImmutableArray<XProperty> db, XRecord r);
/// <inheritdoc/> public override void Draw(object dc, XEllipse ellipse, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var _gfx = dc as Graphics; Brush brush = ToSolidBrush(ellipse.Style.Fill); Pen pen = ToPen(ellipse.Style, _scaleToPage); var rect = CreateRect( ellipse.TopLeft, ellipse.BottomRight, dx, dy); if (ellipse.IsFilled) { _gfx.FillEllipse( brush, _scaleToPage(rect.X), _scaleToPage(rect.Y), _scaleToPage(rect.Width), _scaleToPage(rect.Height)); } if (ellipse.IsStroked) { _gfx.DrawEllipse( pen, _scaleToPage(rect.X), _scaleToPage(rect.Y), _scaleToPage(rect.Width), _scaleToPage(rect.Height)); } brush.Dispose(); pen.Dispose(); }
/// <summary> /// Get the bounding rectangle for <see cref="XEllipse"/> shape. /// </summary> /// <param name="ellipse"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <returns></returns> public static Rect2 GetEllipseBounds(XEllipse ellipse, double dx, double dy) { return Rect2.Create(ellipse.TopLeft, ellipse.BottomRight, dx, dy); }