From adf1ee08050b7fec68a497eccac0c57fc57317c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Wed, 10 May 2023 22:46:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E6=93=A6=E9=99=A4=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=A6=81=E5=AE=9E=E7=8E=B0=E7=94=BB=E7=AC=94?= =?UTF-8?q?=EF=BC=8C=E6=98=AF=E4=B8=8D=E6=98=AF=E8=BF=98=E5=BE=97=E7=94=A8?= =?UTF-8?q?ink=E6=9D=A5=E5=81=9A=E6=AF=94=E8=BE=83=E5=A5=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseViewModel/SelectableViewModelBase.cs | 9 ++ .../DrawingDesignerItemViewModelBase.cs | 4 +- .../EraserDrawingDesignerItemViewModel.cs | 69 +++++------- ...aserPreviewDrawingDesignerItemViewModel.cs | 105 ++++++++++++++++++ 4 files changed, 143 insertions(+), 44 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserPreviewDrawingDesignerItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs index d9febc2..a3e570d 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs @@ -185,6 +185,11 @@ namespace AIStudio.Wpf.DiagramDesigner get; set; } + public bool DisableSelected + { + get;set; + } + private bool _isSelected; [Browsable(false)] //[CanDo] @@ -192,6 +197,10 @@ namespace AIStudio.Wpf.DiagramDesigner { get { + if (DisableSelected == true) + { + return false; + } return _isSelected; } set diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/DrawingDesignerItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/DrawingDesignerItemViewModelBase.cs index 324af7a..afb18c6 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/DrawingDesignerItemViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/DrawingDesignerItemViewModelBase.cs @@ -34,6 +34,7 @@ namespace AIStudio.Wpf.DiagramDesigner DrawMode = drawMode; Points = points; Erasable = erasable; + DisableSelected = Erasable; } public virtual bool OnMouseMove(IInputElement sender, MouseEventArgs e) @@ -66,7 +67,7 @@ namespace AIStudio.Wpf.DiagramDesigner public virtual bool Erase(Geometry erase) { - if (Erasable) + if (Erasable && Keyboard.IsKeyDown(Key.LeftShift) == false) { erase.Transform = new TranslateTransform(0 - Left, 0 - Top); Geometry = Geometry.Combine(Geometry, erase, GeometryCombineMode.Exclude, null); @@ -135,7 +136,6 @@ namespace AIStudio.Wpf.DiagramDesigner protected override void Init(IDiagramViewModel root, bool initNew) { base.Init(root, initNew); - IsHitTestVisible = false; } protected override void InitNew() diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserDrawingDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserDrawingDesignerItemViewModel.cs index 86b9524..689e678 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserDrawingDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserDrawingDesignerItemViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; +using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using SvgPathProperties; @@ -29,39 +30,8 @@ namespace AIStudio.Wpf.DiagramDesigner } public override bool OnMouseMove(IInputElement sender, MouseEventArgs e) - { - if (e.RightButton == MouseButtonState.Pressed) - { - var point = e.GetPosition(sender); - if (Points == null || Points.Count == 0)//没有起始点 - { - return true; - } - - if ((Points.LastOrDefault() - point).Length < ColorViewModel.LineWidth) - { - return true; - } - - Points.Add(point); - if (Geometry is PathGeometry geometry) - { - - } - else - { - geometry = new PathGeometry(); - var figure = new PathFigure { StartPoint = Points[0] }; - geometry.Figures.Add(figure); - } - - LineSegment arc = new LineSegment(point, true);// { IsSmoothJoin = true }; - geometry.Figures[0].Segments.Add(arc); - Geometry = geometry; - - return true; - } - else if (e.LeftButton == MouseButtonState.Pressed) + { + if (e.LeftButton == MouseButtonState.Pressed) { var point = e.GetPosition(sender); if (Points == null || Points.Count == 0)//没有起始点 @@ -75,18 +45,37 @@ namespace AIStudio.Wpf.DiagramDesigner } var geometry = new PathGeometry(); - var figure = new PathFigure { StartPoint = Points[0] }; + var figure = new PathFigure { IsClosed = true, IsFilled = true }; geometry.Figures.Add(figure); - LineSegment arc = new LineSegment(point, true);// { IsSmoothJoin = true }; - geometry.Figures[0].Segments.Add(arc); + var radius = ColorViewModel.LineWidth / 2; + var positiveX = radius * (point.X > Points[0].X ? 1 : -1); + var positiveY = radius * (point.Y > Points[0].Y ? 1 : -1); + + figure.StartPoint = new Point(Points[0].X - positiveX, Points[0].Y - positiveY); + + var line = new LineSegment(new Point(Points[0].X + positiveX, Points[0].Y - positiveY), false); + figure.Segments.Add(line); + + line = new LineSegment(new Point(point.X + positiveX, point.Y - positiveY), false); + figure.Segments.Add(line); + + line = new LineSegment(new Point(point.X + positiveX, point.Y + positiveY), false); + figure.Segments.Add(line); + + line = new LineSegment(new Point(point.X - positiveX, point.Y + positiveY), false); + figure.Segments.Add(line); + + line = new LineSegment(new Point(Points[0].X - positiveX, Points[0].Y + positiveY), false); + figure.Segments.Add(line); + Geometry = geometry; Points[0] = point; Erase(Geometry); return true; } - + else { return false; @@ -100,10 +89,6 @@ namespace AIStudio.Wpf.DiagramDesigner public override bool OnMouseUp(IInputElement sender, MouseButtonEventArgs e) { - if (Geometry != null) - { - Erase(Geometry); - } return base.OnMouseUp(sender, e); } @@ -113,7 +98,7 @@ namespace AIStudio.Wpf.DiagramDesigner List deleteDrawGeometries = new List(); foreach (var g in this.Root.Items.OfType()) { - if (g.Erase(geometry)) + if (g.Erase(geometry.CloneCurrentValue())) deleteDrawGeometries.Add(g); else empty = false; diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserPreviewDrawingDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserPreviewDrawingDesignerItemViewModel.cs new file mode 100644 index 0000000..4b70caf --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DrawingViewModel/Erasable/EraserPreviewDrawingDesignerItemViewModel.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using SvgPathProperties; + +namespace AIStudio.Wpf.DiagramDesigner +{ + public class EraserPreviewDrawingDesignerItemViewModel : DrawingDesignerItemViewModelBase + { + public EraserPreviewDrawingDesignerItemViewModel() + { + } + + public EraserPreviewDrawingDesignerItemViewModel(IDiagramViewModel root) : base(root) + { + } + + public EraserPreviewDrawingDesignerItemViewModel(IDiagramViewModel root, Point startPoint) : base(root, DrawMode.Eraser, startPoint, true) + { + } + + public EraserPreviewDrawingDesignerItemViewModel(IDiagramViewModel root, List points) : base(root, DrawMode.Eraser, points, true) + { + } + + public override bool OnMouseMove(IInputElement sender, MouseEventArgs e) + { + if (e.LeftButton == MouseButtonState.Pressed) + { + var point = e.GetPosition(sender); + if (Points == null || Points.Count == 0)//没有起始点 + { + return true; + } + + if ((Points.LastOrDefault() - point).Length < ColorViewModel.LineWidth) + { + return true; + } + + Points.Add(point); + if (Geometry is PathGeometry geometry) + { + + } + else + { + geometry = new PathGeometry(); + var figure = new PathFigure { StartPoint = Points[0] }; + geometry.Figures.Add(figure); + } + + LineSegment arc = new LineSegment(point, true) { IsSmoothJoin = true }; + geometry.Figures[0].Segments.Add(arc); + Geometry = geometry; + + return true; + } + else + { + return false; + } + } + + public override bool OnMouseDown(IInputElement sender, MouseButtonEventArgs e) + { + return true; + } + + public override bool OnMouseUp(IInputElement sender, MouseButtonEventArgs e) + { + if (Geometry != null) + { + Erase(Geometry); + } + return base.OnMouseUp(sender, e); + } + + private new bool Erase(Geometry geometry) + { + var empty = true; + List deleteDrawGeometries = new List(); + foreach (var g in this.Root.Items.OfType()) + { + if (g.Erase(geometry.GetWidenedPathGeometry(new Pen(ColorObject.ToBrush(ColorViewModel.LineColor), ColorViewModel.LineWidth)))) + deleteDrawGeometries.Add(g); + else + empty = false; + } + + foreach (var g in deleteDrawGeometries) + { + this.Root.Remove(g); + } + + return empty; + } + } +}