using ComPDFKit.Import;
using ComPDFKit.Measure;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Tool.SettingParam;
using ComPDFKit.Viewer.Helper;
using ComPDFKitViewer;
using ComPDFKitViewer.Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace ComPDFKit.Tool.DrawTool
{
internal class AnnotEdit : DrawingVisual
{
#region public Attributes
///
/// Data changing event
///
public event EventHandler DataChanging;
///
/// Data changed event
///
public event EventHandler DataChanged;
#endregion
#region private Attributes
protected DefaultDrawParam drawParam = new DefaultDrawParam();
///
/// Max drawing range
///
protected Rect maxRect { get; set; } = new Rect(0, 0, 0, 0);
///
/// Is mouse down
///
protected bool isMouseDown { get; set; }
protected DrawingContext drawDC { get; set; }
///
/// Current annotation's control points collection (96 DPI coordinate points, minus page offset)
///
private PointCollection activePoints { get; set; } = new PointCollection();
///
/// Current annotation's drawing range box (96 DPI coordinate points, minus page offset)
///
private Rect activeRect { get; set; } = new Rect();
private int hitIndex = -1;
protected AnnotData annotData { get; set; }
///
/// Position information recorded when the mouse is pressed
///
protected Point mouseDownPoint { get; set; }
///
/// Mouse last draw position information
///
protected Point mouseEndDrawPoint { get; set; }
///
/// Move offset during movement
///
protected Point moveOffset { get; set; } = new Point(0, 0);
///
/// Point size
///
protected int pointSize { get; set; } = 6;
protected SelectedAnnotData annotEditData = new SelectedAnnotData();
//Measure
private PointCollection leftLine { get; set; } = new PointCollection();
private PointCollection rightLine { get; set; } = new PointCollection();
private PointCollection crossLine { get; set; } = new PointCollection();
private Point[] moveLeftLine;
private Point[] moveRightLine;
private Point[] moveCrossLine;
#endregion
///
/// Re-locate child elements
///
public void Arrange()
{
foreach (Visual child in Children)
{
if (!(child is UIElement))
{
continue;
}
UIElement checkChild = child as UIElement;
try
{
double left = Canvas.GetLeft(checkChild);
double top = Canvas.GetTop(checkChild);
double width = (double)checkChild.GetValue(FrameworkElement.WidthProperty);
double height = (double)checkChild.GetValue(FrameworkElement.HeightProperty);
checkChild.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
checkChild.Arrange(new Rect(
double.IsNaN(left) ? 0 : left,
double.IsNaN(top) ? 0 : top,
double.IsNaN(width) ? checkChild.DesiredSize.Width : width,
double.IsNaN(height) ? checkChild.DesiredSize.Height : height));
}
catch (Exception ex)
{
}
}
}
public AnnotEdit(DefaultDrawParam defaultDrawParam) : base()
{
drawParam = defaultDrawParam;
}
public bool SetAnnotObject(AnnotData Data)
{
activePoints.Clear();
if (Data == null)
{
return false;
}
annotData = Data;
annotEditData = new SelectedAnnotData();
annotEditData.annotData = annotData;
SetMaxRect(annotData.PaintOffset);
switch (annotData.Annot.Type)
{
case C_ANNOTATION_TYPE.C_ANNOTATION_NONE:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_UNKOWN:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_TEXT:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_LINK:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_FREETEXT:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_LINE:
for (int i = 0; i < (annotData.Annot as CPDFLineAnnotation).Points.Length; i++)
{
Point point = DpiHelper.PDFPointToStandardPoint(new Point((annotData.Annot as CPDFLineAnnotation).Points[i].x, (annotData.Annot as CPDFLineAnnotation).Points[i].y));
point = new Point(
point.X * annotData.CurrentZoom + annotData.PaintOffset.X - annotData.CropLeft * annotData.CurrentZoom,
point.Y * annotData.CurrentZoom + annotData.PaintOffset.Y - annotData.CropTop * annotData.CurrentZoom
);
activePoints.Add(point);
}
if ((annotData.Annot as CPDFLineAnnotation).IsMeasured())
{
CRect rawRect = annotData.Annot.GetRect();
Rect rect = DataConversionForWPF.CRectConversionForRect(rawRect);
rect = DpiHelper.PDFRectToStandardRect(rect);
activeRect = new Rect(
rect.X * annotData.CurrentZoom + annotData.PaintOffset.X - annotData.CropLeft * annotData.CurrentZoom,
rect.Y * annotData.CurrentZoom + annotData.PaintOffset.Y - annotData.CropTop * annotData.CurrentZoom,
rect.Width * annotData.CurrentZoom,
rect.Height * annotData.CurrentZoom
);
CalcMeasurePoints(annotData.Annot as CPDFLineAnnotation);
}
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_SQUARE:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_CIRCLE:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON:
{
for (int i = 0; i < (annotData.Annot as CPDFPolygonAnnotation).Points.Count; i++)
{
Point point = DpiHelper.PDFPointToStandardPoint(new Point((annotData.Annot as CPDFPolygonAnnotation).Points[i].x, (annotData.Annot as CPDFPolygonAnnotation).Points[i].y));
point = new Point(
point.X * annotData.CurrentZoom + annotData.PaintOffset.X - annotData.CropLeft * annotData.CurrentZoom,
point.Y * annotData.CurrentZoom + annotData.PaintOffset.Y - annotData.CropTop * annotData.CurrentZoom
);
activePoints.Add(point);
}
CRect rawRect = annotData.Annot.GetRect();
Rect rect = DataConversionForWPF.CRectConversionForRect(rawRect);
rect = DpiHelper.PDFRectToStandardRect(rect);
activeRect = new Rect(
rect.X * annotData.CurrentZoom + annotData.PaintOffset.X - annotData.CropLeft * annotData.CurrentZoom,
rect.Y * annotData.CurrentZoom + annotData.PaintOffset.Y - annotData.CropTop * annotData.CurrentZoom,
rect.Width * annotData.CurrentZoom,
rect.Height * annotData.CurrentZoom
);
}
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE:
{
for (int i = 0; i < (annotData.Annot as CPDFPolylineAnnotation).Points.Count; i++)
{
Point point = DpiHelper.PDFPointToStandardPoint(new Point((annotData.Annot as CPDFPolylineAnnotation).Points[i].x, (annotData.Annot as CPDFPolylineAnnotation).Points[i].y));
point = new Point(
point.X * annotData.CurrentZoom + annotData.PaintOffset.X - annotData.CropLeft * annotData.CurrentZoom,
point.Y * annotData.CurrentZoom + annotData.PaintOffset.Y - annotData.CropTop * annotData.CurrentZoom
);
activePoints.Add(point);
}
CRect rawRect = annotData.Annot.GetRect();
Rect rect = DataConversionForWPF.CRectConversionForRect(rawRect);
rect = DpiHelper.PDFRectToStandardRect(rect);
activeRect = new Rect(
rect.X * annotData.CurrentZoom + annotData.PaintOffset.X - annotData.CropLeft * annotData.CurrentZoom,
rect.Y * annotData.CurrentZoom + annotData.PaintOffset.Y - annotData.CropTop * annotData.CurrentZoom,
rect.Width * annotData.CurrentZoom,
rect.Height * annotData.CurrentZoom
);
}
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_HIGHLIGHT:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_UNDERLINE:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_SQUIGGLY:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_STRIKEOUT:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_STAMP:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_CARET:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_INK:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_POPUP:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_FILEATTACHMENT:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_SOUND:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_MOVIE:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_WIDGET:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_SCREEN:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_PRINTERMARK:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_TRAPNET:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_WATERMARK:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_3D:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_RICHMEDIA:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_REDACT:
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_INTERCHANGE:
break;
default:
break;
}
return true;
}
public void SetMaxRect(Rect rect)
{
maxRect = rect;
}
public int GetHitIndex(Point point)
{
for (int i = 0; i < activePoints.Count; i++)
{
Vector checkVector = activePoints[i] - point;
if (checkVector.Length < pointSize)
{
return i;
}
}
return -1;
}
///
/// Calculate the control points of the measurement annotation
///
///
/// Measurement annotation object
///
private void CalcMeasurePoints(CPDFLineAnnotation Annot)
{
leftLine.Clear();
crossLine.Clear();
rightLine.Clear();
CPDFDistanceMeasure LineMeasure = Annot.GetDistanceMeasure();
double LeadLength = LineMeasure.GetLeadLength() / 72D * 96D;
double LeadOffset = LineMeasure.GetLeadOffset() / 72D * 96D;
double LeadExtension = LineMeasure.GetLeadExtension() / 72D * 96D;
List orderPoints = activePoints.AsEnumerable().OrderBy(x => x.X).ToList();
Vector lineVector = (activePoints[1] - activePoints[0]) * annotData.CurrentZoom;
lineVector.Normalize();
Vector leadEndVector = lineVector * (Math.Abs(LeadLength) + Math.Abs(LeadOffset) + Math.Abs(LeadExtension) * annotData.CurrentZoom);
Vector leadStartVector = lineVector * (Math.Abs(LeadOffset)) * annotData.CurrentZoom;
Vector leadCrossVector = lineVector * (Math.Abs(LeadLength) * annotData.CurrentZoom + Math.Abs(LeadOffset));
Matrix rotateMatrix = new Matrix();
double angle = LeadLength < 0 ? 90 : -90;
rotateMatrix.Rotate(angle);
Point leftEndPoint = rotateMatrix.Transform(leadEndVector) + activePoints[0];
Point leftStartPoint = rotateMatrix.Transform(leadStartVector) + activePoints[0];
Point leftCrossPoint = rotateMatrix.Transform(leadCrossVector) + activePoints[0];
leftLine.Add(leftStartPoint);
leftLine.Add(leftCrossPoint);
crossLine.Add(leftCrossPoint);
lineVector = activePoints[1] - activePoints[0];
rightLine.Add(leftStartPoint + lineVector);
rightLine.Add(leftCrossPoint + lineVector);
crossLine.Add(leftCrossPoint + lineVector);
activePoints.Insert(1, new Point(
(crossLine[0].X + crossLine[1].X) / 2,
(crossLine[0].Y + crossLine[1].Y) / 2
));
}
#region Event
public virtual void OnMouseLeftButtonDown(Point downPoint)
{
isMouseDown = true;
hitIndex = -1;
mouseDownPoint = downPoint;
moveOffset = new Point(0, 0);
HitTestResult hitResult = VisualTreeHelper.HitTest(this, downPoint);
if (hitResult != null && hitResult.VisualHit is DrawingVisual)
{
hitIndex = GetHitIndex(downPoint);
}
}
public virtual void OnMouseMove(Point mousePoint, out bool Tag)
{
Tag = false;
if (isMouseDown)
{
Tag = isMouseDown;
mouseEndDrawPoint = mousePoint;
Point newOffset = new Point(
mouseEndDrawPoint.X - mouseDownPoint.X,
mouseEndDrawPoint.Y - mouseDownPoint.Y
);
Point movePoint = CheckMoveOffSet(activePoints.ToList(), maxRect, newOffset);
if(movePoint.X==0)
{
newOffset.X=moveOffset.X;
}
if(movePoint.Y==0)
{
newOffset.Y=moveOffset.Y;
}
moveOffset = newOffset;
Draw();
InvokeDataChangEvent(false);
}
}
public virtual void OnMouseLeftButtonUp(Point upPoint)
{
if (annotData == null)
return;
isMouseDown = false;
if (annotData.AnnotType == C_ANNOTATION_TYPE.C_ANNOTATION_LINE)
{
if ((annotData.Annot as CPDFLineAnnotation).IsMeasured())
{
activePoints.Clear();
if (moveLeftLine == null)
{
moveLeftLine = leftLine.ToArray();
}
if (moveRightLine == null)
{
moveRightLine = rightLine.ToArray();
}
if (moveCrossLine == null)
{
moveCrossLine = crossLine.ToArray();
}
activePoints.Add(moveLeftLine[0]);
activePoints.Add(moveLeftLine[1]);
activePoints.Add(moveRightLine[0]);
activePoints.Add(moveRightLine[1]);
activePoints.Add(moveCrossLine[0]);
activePoints.Add(moveCrossLine[1]);
}
}
moveLeftLine = null;
moveRightLine = null;
moveCrossLine = null;
if (moveOffset!= new Point(0, 0))
{
InvokeDataChangEvent(true);
}
moveOffset = new Point(0, 0);
mouseDownPoint = new Point();
mouseEndDrawPoint = new Point();
hitIndex = -1;
SetAnnotObject(annotData);
}
///
/// Used to notify events during/after drawing data
///
///
/// Is the data change complete
///
protected void InvokeDataChangEvent(bool isFinish)
{
PointCollection ActivePoints1 = new PointCollection();
for (int i = 0; i < activePoints.Count; i++)
{
Point currentPoint = activePoints[i];
if (hitIndex == -1)
{
if (annotData.AnnotType == C_ANNOTATION_TYPE.C_ANNOTATION_LINE)
{
if (!(annotData.Annot as CPDFLineAnnotation).IsMeasured())
{
currentPoint.X += moveOffset.X;
currentPoint.Y += moveOffset.Y;
}
}
else
{
currentPoint.X += moveOffset.X;
currentPoint.Y += moveOffset.Y;
}
}
ActivePoints1.Add(currentPoint);
}
annotEditData.Points = ActivePoints1;
if (isFinish)
{
DataChanged?.Invoke(this, annotEditData);
}
else
{
DataChanging?.Invoke(this, annotEditData);
}
}
#endregion
#region Draw
public void Draw()
{
Dispatcher.Invoke(() =>
{
if (annotData == null)
{
return;
}
drawDC = RenderOpen();
switch (annotData.Annot.Type)
{
case C_ANNOTATION_TYPE.C_ANNOTATION_LINE:
{
if ((annotData.Annot as CPDFLineAnnotation).IsMeasured())
{
DrawLineMeasure(drawDC);
}
else
{
DrawLine(drawDC);
}
}
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE:
DrawPolyLineMeasure(drawDC);
break;
case C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON:
DrawPolygonMeasure(drawDC);
break;
default:
break;
}
drawDC?.Close();
drawDC = null;
});
}
private Point CheckPointBound(Point checkPoint,Rect bound)
{
if (checkPoint.X < bound.Left)
{
checkPoint.X = bound.Left;
}
if (checkPoint.X > bound.Right)
{
checkPoint.X = bound.Right;
}
if (checkPoint.Y < bound.Top)
{
checkPoint.Y = bound.Top;
}
if (checkPoint.Y > bound.Bottom)
{
checkPoint.Y = bound.Bottom;
}
return checkPoint;
}
private Point CheckMoveOffSet(List checkPoints, Rect bound, Point moveOffset)
{
double left = 0;
double top = 0;
double right = 0;
double bottom = 0;
if (checkPoints != null && checkPoints.Count > 0)
{
left = checkPoints.AsEnumerable().Select(p => p.X).Min();
right = checkPoints.AsEnumerable().Select(p => p.X).Max();
top = checkPoints.AsEnumerable().Select(p => p.Y).Min();
bottom = checkPoints.AsEnumerable().Select(p => p.Y).Max();
}
Point movePoint = moveOffset;
if(left+moveOffset.Xbound.Right)
{
movePoint.X = 0;
}
if (top + moveOffset.Y < bound.Top || bottom + moveOffset.Y > bound.Bottom)
{
movePoint.Y = 0;
}
return movePoint;
}
private void DrawLine(DrawingContext drawingContext)
{
PathGeometry drawPath = new PathGeometry();
PathFigure drawFigure = new PathFigure();
PolyLineSegment polySegment = new PolyLineSegment();
if (hitIndex != -1 && hitIndex < activePoints.Count)
{
if (mouseEndDrawPoint!=new Point() && !activePoints.Contains(mouseEndDrawPoint))
{
activePoints[hitIndex] = CheckPointBound(mouseEndDrawPoint, maxRect);
}
}
Point StartPoint = activePoints[0];
if (hitIndex == -1)
{
StartPoint.X += moveOffset.X;
StartPoint.Y += moveOffset.Y;
}
drawFigure.StartPoint = StartPoint;
for (int i = 1; i < activePoints.Count; i++)
{
Point currentPoint = activePoints[i];
if (hitIndex == -1)
{
currentPoint.X += moveOffset.X;
currentPoint.Y += moveOffset.Y;
}
polySegment.Points.Add(currentPoint);
}
if (polySegment.Points.Count > 0)
{
drawFigure.Segments.Add(polySegment);
}
if (drawFigure.Segments.Count > 0)
{
drawPath.Figures.Add(drawFigure);
}
foreach (Point controlPoint in activePoints)
{
Point drawPoint = new Point(
controlPoint.X,
controlPoint.Y);
if (hitIndex == -1)
{
drawPoint.X += moveOffset.X;
drawPoint.Y += moveOffset.Y;
}
drawingContext?.DrawEllipse(drawParam.EditControlLineBrush, drawParam.EditControlLinePen, (drawPoint), pointSize, pointSize);
}
if (isMouseDown)
{
drawingContext?.DrawGeometry(null, drawParam.EditLinePen, drawPath);
}
}
private void DrawLineMeasure(DrawingContext drawingContext)
{
foreach (Point controlPoint in activePoints)
{
Point drawPoint = new Point(
controlPoint.X,
controlPoint.Y);
if (hitIndex == -1)
{
drawPoint.X += moveOffset.X;
drawPoint.Y += moveOffset.Y;
}
drawingContext?.DrawEllipse(drawParam.EditControlLineBrush, drawParam.EditControlLinePen, (drawPoint), pointSize, pointSize);
}
Rect drawRect = activeRect;
drawRect.X += moveOffset.X;
drawRect.Y += moveOffset.Y;
if (isMouseDown)
{
PointCollection drawLeftPoints = new PointCollection();
PointCollection drawRightPoints = new PointCollection();
PointCollection drawCrossPoints = new PointCollection();
moveLeftLine = leftLine.ToArray();
moveRightLine = rightLine.ToArray();
moveCrossLine = crossLine.ToArray();
switch (hitIndex)
{
case 0://Left
{
moveLeftLine[0].X += moveOffset.X;
moveLeftLine[0].Y += moveOffset.Y;
moveLeftLine[0].X = Math.Max(maxRect.Left, moveLeftLine[0].X);
moveLeftLine[0].X = Math.Min(maxRect.Right, moveLeftLine[0].X);
moveLeftLine[0].Y = Math.Max(maxRect.Top, moveLeftLine[0].Y);
moveLeftLine[0].Y = Math.Min(maxRect.Bottom, moveLeftLine[0].Y);
Vector newVector = moveLeftLine[0] - rightLine[0];
Vector leftVector = leftLine[1] - leftLine[0];
double angle = leftLine[0].Y < crossLine[0].Y ? -90 : 90;
newVector.Normalize();
newVector = newVector * leftVector.Length;
Matrix rotateMatrix = new Matrix();
rotateMatrix.Rotate(angle);
moveLeftLine[1] = moveLeftLine[0] + newVector * rotateMatrix;
moveRightLine[0] = rightLine[0];
moveRightLine[1] = moveRightLine[0] + newVector * rotateMatrix;
moveCrossLine[0] = moveLeftLine[1];
moveCrossLine[1] = moveRightLine[1];
}
break;
case 1:// Center
{
Point centerPoint = new Point(
(crossLine[0].X + crossLine[1].X) / 2,
(crossLine[0].Y + crossLine[1].Y) / 2
);
Point movePoint = new Point(centerPoint.X, centerPoint.Y);
movePoint.X += moveOffset.X;
movePoint.Y += moveOffset.Y;
Vector ruleVector = crossLine[1] - crossLine[0];
bool rateMove = true;
if (ruleVector.X == 0)
{
movePoint.Y = centerPoint.Y;
rateMove = false;
}
if (ruleVector.Y == 0)
{
movePoint.X = centerPoint.X;
rateMove = false;
}
if (rateMove)
{
Vector moveVector = movePoint - centerPoint;
double moveLength = moveVector.Length;
double ruleLength = ruleVector.Length;
ruleVector.Normalize();
moveVector.Normalize();
Vector crossVector = new Vector(-ruleVector.Y, ruleVector.X);
crossVector.Normalize();
if (Math.Abs(Vector.AngleBetween(moveVector, crossVector)) > 90)
{
crossVector.Negate();
}
Point saveCenter = crossVector * moveLength + centerPoint;
double halfLenght = ruleLength / 2;
Point SaveRight = ruleVector * halfLenght + saveCenter;
Point saveLeft = saveCenter - ruleVector * halfLenght;
moveCrossLine[0] = saveLeft;
moveCrossLine[1] = SaveRight;
moveLeftLine[1] = saveLeft;
moveRightLine[1] = SaveRight;
moveLeftLine[0] = leftLine[0];
moveRightLine[0] = rightLine[0];
}
else
{
Point moveOffset = new Point(
movePoint.X - centerPoint.X,
movePoint.Y - centerPoint.Y);
moveCrossLine[0].X += moveOffset.X;
moveCrossLine[0].Y += moveOffset.Y;
moveCrossLine[1].X += moveOffset.X;
moveCrossLine[1].Y += moveOffset.Y;
moveLeftLine[1].X += moveOffset.X;
moveLeftLine[1].Y += moveOffset.Y;
moveRightLine[1].X += moveOffset.X;
moveRightLine[1].Y += moveOffset.Y;
}
}
break;
case 2://Right
{
moveRightLine[0].X += moveOffset.X;
moveRightLine[0].Y += moveOffset.Y;
Vector newVector = moveRightLine[0] - leftLine[0];
Vector leftVector = rightLine[1] - rightLine[0];
double angle = (rightLine[0].Y + leftLine[0].Y) / 2 > (crossLine[0].Y + crossLine[1].Y) / 2 ? -90 : 90;
newVector.Normalize();
newVector = newVector * leftVector.Length;
Matrix rotateMatrix = new Matrix();
rotateMatrix.Rotate(angle);
moveLeftLine[1] = moveLeftLine[0] + newVector * rotateMatrix;
moveLeftLine[0] = leftLine[0];
moveRightLine[1] = moveRightLine[0] + newVector * rotateMatrix;
moveCrossLine[0] = moveLeftLine[1];
moveCrossLine[1] = moveRightLine[1];
}
break;
case -1:
moveLeftLine[0].X += moveOffset.X;
moveLeftLine[0].Y += moveOffset.Y;
moveLeftLine[1].X += moveOffset.X;
moveLeftLine[1].Y += moveOffset.Y;
moveRightLine[0].X += moveOffset.X;
moveRightLine[0].Y += moveOffset.Y;
moveRightLine[1].X += moveOffset.X;
moveRightLine[1].Y += moveOffset.Y;
moveCrossLine[0] = moveLeftLine[1];
moveCrossLine[1] = moveRightLine[1];
break;
default:
break;
}
//Left
drawLeftPoints.Add(new Point(
moveLeftLine[0].X,
moveLeftLine[0].Y));
drawLeftPoints.Add(new Point(
moveLeftLine[1].X,
moveLeftLine[1].Y));
//Right
drawRightPoints.Add(new Point(
moveRightLine[0].X,
moveRightLine[0].Y));
drawRightPoints.Add(new Point(
moveRightLine[1].X,
moveRightLine[1].Y));
//Middle
drawCrossPoints.Add(new Point(
moveCrossLine[0].X,
moveCrossLine[0].Y));
drawCrossPoints.Add(new Point(
moveCrossLine[1].X,
moveCrossLine[1].Y));
drawingContext?.DrawLine(drawParam.EditLinePen, drawLeftPoints[0], drawLeftPoints[1]);
drawingContext?.DrawLine(drawParam.EditLinePen, drawRightPoints[0], drawRightPoints[1]);
drawingContext?.DrawLine(drawParam.EditLinePen, drawCrossPoints[0], drawCrossPoints[1]);
}
else
{
drawingContext?.DrawRectangle(null, drawParam.EditLinePen, drawRect);
}
}
private void DrawPolyLineMeasure(DrawingContext drawingContext)
{
PathGeometry drawPath = new PathGeometry();
PathFigure drawFigure = new PathFigure();
PolyLineSegment polySegment = new PolyLineSegment();
if (hitIndex != -1 && hitIndex < activePoints.Count)
{
if (mouseEndDrawPoint != new Point())
{
activePoints[hitIndex] = mouseEndDrawPoint;
}
}
Point StartPoint = activePoints[0];
if (hitIndex == -1)
{
StartPoint.X += moveOffset.X;
StartPoint.Y += moveOffset.Y;
}
drawFigure.StartPoint = StartPoint;
for (int i = 1; i < activePoints.Count; i++)
{
Point currentPoint = activePoints[i];
if (hitIndex == -1)
{
currentPoint.X += moveOffset.X;
currentPoint.Y += moveOffset.Y;
}
polySegment.Points.Add(currentPoint);
}
if (polySegment.Points.Count > 0)
{
drawFigure.Segments.Add(polySegment);
}
if (drawFigure.Segments.Count > 0)
{
drawPath.Figures.Add(drawFigure);
}
foreach (Point controlPoint in activePoints)
{
Point drawPoint = new Point(
controlPoint.X,
controlPoint.Y);
if (hitIndex == -1)
{
drawPoint.X += moveOffset.X;
drawPoint.Y += moveOffset.Y;
}
drawingContext?.DrawEllipse(drawParam.EditControlLineBrush, drawParam.EditControlLinePen, (drawPoint), pointSize, pointSize);
}
Rect drawRect = activeRect;
drawRect.X += moveOffset.X;
drawRect.Y += moveOffset.Y;
if (isMouseDown)
{
drawingContext?.DrawGeometry(null, drawParam.EditLinePen, drawPath);
}
else
{
drawingContext?.DrawRectangle(null, drawParam.EditLinePen, drawRect);
}
}
private void DrawPolygonMeasure(DrawingContext drawingContext)
{
PathGeometry drawPath = new PathGeometry();
PathFigure drawFigure = new PathFigure();
PolyLineSegment polySegment = new PolyLineSegment();
if (hitIndex != -1 && hitIndex < activePoints.Count)
{
if (mouseEndDrawPoint!=new Point())
{
activePoints[hitIndex] = mouseEndDrawPoint;
}
}
Point StartPoint = activePoints[0];
if (hitIndex == -1)
{
StartPoint.X += moveOffset.X;
StartPoint.Y += moveOffset.Y;
}
drawFigure.StartPoint = StartPoint;
for (int i = 1; i < activePoints.Count; i++)
{
Point currentPoint = activePoints[i];
if (hitIndex == -1)
{
currentPoint.X += moveOffset.X;
currentPoint.Y += moveOffset.Y;
}
polySegment.Points.Add(currentPoint);
}
if (polySegment.Points.Count > 0)
{
polySegment.Points.Add(drawFigure.StartPoint);
drawFigure.Segments.Add(polySegment);
}
if (drawFigure.Segments.Count > 0)
{
drawPath.Figures.Add(drawFigure);
}
foreach (Point controlPoint in activePoints)
{
Point drawPoint = new Point(
controlPoint.X,
controlPoint.Y);
if (hitIndex == -1)
{
drawPoint.X += moveOffset.X;
drawPoint.Y += moveOffset.Y;
}
drawingContext?.DrawEllipse(drawParam.EditControlLineBrush, drawParam.EditControlLinePen, (drawPoint), pointSize, pointSize);
}
Rect drawRect = activeRect;
drawRect.X += moveOffset.X;
drawRect.Y += moveOffset.Y;
if (isMouseDown)
{
drawingContext?.DrawGeometry(null, drawParam.EditLinePen, drawPath);
}
else
{
drawingContext?.DrawRectangle(null, drawParam.EditLinePen, drawRect);
}
}
public virtual void ClearDraw()
{
drawDC = RenderOpen();
drawDC?.Close();
drawDC = null;
}
#endregion
}
}