123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624 |
- using ComPDFKit.PDFAnnotation;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Media;
- namespace PDF_Master.Helper
- {
- public class ArrowHelper
- {
- /// <summary>
- /// 是否有开始箭头
- /// </summary>
- public bool HasStartArrow
- {
- get
- {
- if (StartSharp != C_LINE_TYPE.LINETYPE_UNKNOWN && StartSharp != C_LINE_TYPE.LINETYPE_NONE)
- {
- return true;
- }
- return false;
- }
- }
- /// <summary>
- /// 开始箭头是否封闭
- /// </summary>
- public bool IsStartClosed
- {
- get
- {
- if (StartSharp == C_LINE_TYPE.LINETYPE_CLOSEDARROW || StartSharp == C_LINE_TYPE.LINETYPE_RCLOSEDARROW || StartSharp == C_LINE_TYPE.LINETYPE_DIAMOND)
- {
- return true;
- }
- return false;
- }
- }
- /// <summary>
- /// 是否有结束箭头
- /// </summary>
- public bool HasEndArrow
- {
- get
- {
- if (EndSharp != C_LINE_TYPE.LINETYPE_UNKNOWN && EndSharp != C_LINE_TYPE.LINETYPE_NONE)
- {
- return true;
- }
- return false;
- }
- }
- /// <summary>
- /// 结束箭头是否封闭
- /// </summary>
- public bool IsEndClosed
- {
- get
- {
- if(EndSharp==C_LINE_TYPE.LINETYPE_CLOSEDARROW || EndSharp==C_LINE_TYPE.LINETYPE_RCLOSEDARROW || EndSharp == C_LINE_TYPE.LINETYPE_DIAMOND)
- {
- return true;
- }
- return false;
- }
- }
- /// <summary>
- /// 箭头角度
- /// </summary>
- public uint ArrowAngle { get; set; }
- /// <summary>
- /// 箭头长度
- /// </summary>
- public uint ArrowLength { get; set; }
- /// <summary>
- /// 起始点
- /// </summary>
- public Point? LineStart { get; set; }
- /// <summary>
- /// 结束点
- /// </summary>
- public Point? LineEnd { get; set; }
- /// <summary>
- /// 线段路径
- /// </summary>
- public PathGeometry Body { get; set; }
- /// <summary>
- /// 开始箭头形状
- /// </summary>
- public C_LINE_TYPE StartSharp { get; set; }
- /// <summary>
- /// 结束箭头形状
- /// </summary>
- public C_LINE_TYPE EndSharp { get; set; }
- /// <summary>
- /// 箭头帮助类
- /// </summary>
- public ArrowHelper()
- {
- Body = new PathGeometry();
- ArrowLength = 12;
- ArrowAngle = 60;
- }
- protected PathFigure CreateLineBody()
- {
- if (LineStart != null && LineEnd != null)
- {
- PathFigure lineFigure = new PathFigure();
- // lineFigure.IsClosed = true;
- lineFigure.StartPoint = (Point)LineStart;
- LineSegment linePath = new LineSegment();
- linePath.Point = (Point)LineEnd;
- //linePath.IsSmoothJoin = true;
- //linePath.IsStroked = true;
- lineFigure.Segments.Add(linePath);
- return lineFigure;
- }
- return null;
- }
- protected PathFigure CreateStartArrow()
- {
- switch (StartSharp)
- {
- case C_LINE_TYPE.LINETYPE_NONE:
- case C_LINE_TYPE.LINETYPE_UNKNOWN:
- break;
- case C_LINE_TYPE.LINETYPE_ARROW:
- case C_LINE_TYPE.LINETYPE_CLOSEDARROW:
- return CreateStartOpenArrow();
- case C_LINE_TYPE.LINETYPE_ROPENARROW:
- case C_LINE_TYPE.LINETYPE_RCLOSEDARROW:
- return CreateStartReverseArrow();
- case C_LINE_TYPE.LINETYPE_BUTT:
- return CreateStartButtArrow();
- case C_LINE_TYPE.LINETYPE_DIAMOND:
- return CreateStartDiamondArrow();
- case C_LINE_TYPE.LINETYPE_CIRCLE:
- return CreateStartRoundArrow();
- case C_LINE_TYPE.LINETYPE_SQUARE:
- return CreateStartSquareArrow();
- case C_LINE_TYPE.LINETYPE_SLASH:
- return CreateStartSlashArrow();
- default:
- break;
- }
- return null;
- }
- protected virtual PathFigure CreateEndArrow()
- {
- switch (EndSharp)
- {
- case C_LINE_TYPE.LINETYPE_NONE:
- case C_LINE_TYPE.LINETYPE_UNKNOWN:
- break;
- case C_LINE_TYPE.LINETYPE_ARROW:
- case C_LINE_TYPE.LINETYPE_CLOSEDARROW:
- return CreateEndOpenArrow();
- case C_LINE_TYPE.LINETYPE_ROPENARROW:
- case C_LINE_TYPE.LINETYPE_RCLOSEDARROW:
- return CreateEndReverseArrow();
- case C_LINE_TYPE.LINETYPE_BUTT:
- return CreateEndButtArrow();
- case C_LINE_TYPE.LINETYPE_DIAMOND:
- return CreateEndDiamondArrow();
- case C_LINE_TYPE.LINETYPE_CIRCLE:
- return CreateEndRoundArrow();
- case C_LINE_TYPE.LINETYPE_SQUARE:
- return CreateEndSquareArrow();
- case C_LINE_TYPE.LINETYPE_SLASH:
- return CreateEndSlashArrow();
- default:
- break;
- }
- return null;
- }
- /// <summary>
- /// 创建箭头路径
- /// </summary>
- /// <returns></returns>
- public PathGeometry BuildArrowBody()
- {
- Body.Figures.Clear();
- PathFigure lineBody = CreateLineBody();
- if (lineBody != null)
- {
- Body.Figures.Add(lineBody);
- PathFigure arrowFigure = CreateStartArrow();
- if (arrowFigure != null)
- {
- Body.Figures.Add(arrowFigure);
- }
- arrowFigure = CreateEndArrow();
- if (arrowFigure != null)
- {
- Body.Figures.Add(arrowFigure);
- }
- }
- return Body;
- }
- /// <summary>
- /// 绘制开始箭头
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartOpenArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null || ArrowAngle == 0)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment arrowSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(ArrowAngle / 2);
- arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix);
- arrowSegment.Points.Add((Point)LineStart);
- rotateMatrix.Rotate(-ArrowAngle);
- arrowSegment.Points.Add((Point)LineStart + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(arrowSegment);
- arrowFigure.IsClosed = IsStartClosed;
- arrowFigure.IsFilled = IsStartClosed;
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束箭头
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndOpenArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null || ArrowAngle == 0)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment arrowSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(ArrowAngle / 2);
- arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix);
- arrowSegment.Points.Add((Point)LineEnd);
- rotateMatrix.Rotate(-ArrowAngle);
- arrowSegment.Points.Add((Point)LineEnd + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(arrowSegment);
- arrowFigure.IsClosed = IsEndClosed;
- arrowFigure.IsFilled = IsEndClosed;
- return arrowFigure;
- }
- /// <summary>
- /// 绘制开始箭头(逆向)
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartReverseArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null || ArrowAngle == 0)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment arrowSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(ArrowAngle / 2);
- arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix);
- arrowSegment.Points.Add((Point)LineStart);
- rotateMatrix.Rotate(-ArrowAngle);
- arrowSegment.Points.Add((Point)LineStart + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(arrowSegment);
- arrowFigure.IsClosed = IsStartClosed;
- arrowFigure.IsFilled = IsStartClosed;
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束箭头(逆向)
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndReverseArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null || ArrowAngle == 0)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment arrowSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(ArrowAngle / 2);
- arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix);
- arrowSegment.Points.Add((Point)LineEnd);
- rotateMatrix.Rotate(-ArrowAngle);
- arrowSegment.Points.Add((Point)LineEnd + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(arrowSegment);
- arrowFigure.IsClosed = IsEndClosed;
- arrowFigure.IsFilled = IsEndClosed;
- return arrowFigure;
- }
- /// <summary>
- /// 绘制开始平头
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartButtArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- LineSegment buttSegment = new LineSegment();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(90);
- arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix);
- rotateMatrix.Rotate(-180);
- buttSegment.Point = ((Point)LineStart + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(buttSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束平头
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndButtArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- LineSegment buttSegment = new LineSegment();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(90);
- arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix);
- rotateMatrix.Rotate(-180);
- buttSegment.Point = ((Point)LineEnd + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(buttSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制开始菱形
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartDiamondArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment arrowSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(45);
- Point cornerTop = (Point)LineStart + (lineVector * rotateMatrix);
- Vector turnVector = cornerTop - (Point)LineStart;
- turnVector.Normalize();
- turnVector *= ArrowLength;
- Matrix turnMatrix = new Matrix();
- turnMatrix.Rotate(-90);
- Point awayPoint = cornerTop + (turnVector * turnMatrix);
- rotateMatrix = new Matrix();
- rotateMatrix.Rotate(-45);
- Point cornerDown = (Point)LineStart + (lineVector * rotateMatrix);
- arrowFigure.StartPoint = (Point)LineStart;
- arrowSegment.Points.Add(cornerTop);
- arrowSegment.Points.Add(awayPoint);
- arrowSegment.Points.Add(cornerDown);
- arrowSegment.Points.Add((Point)LineStart);
- arrowFigure.Segments.Add(arrowSegment);
- arrowFigure.IsClosed = IsStartClosed;
- arrowFigure.IsFilled = IsStartClosed;
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束菱形
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndDiamondArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment arrowSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(45);
- Point cornerTop = (Point)LineEnd + (lineVector * rotateMatrix);
- Vector turnVector = cornerTop - (Point)LineEnd;
- turnVector.Normalize();
- turnVector *= ArrowLength;
- Matrix turnMatrix = new Matrix();
- turnMatrix.Rotate(-90);
- Point awayPoint = cornerTop + (turnVector * turnMatrix);
- rotateMatrix = new Matrix();
- rotateMatrix.Rotate(-45);
- Point cornerDown = (Point)LineEnd + (lineVector * rotateMatrix);
- arrowFigure.StartPoint = (Point)LineEnd;
- arrowSegment.Points.Add(cornerTop);
- arrowSegment.Points.Add(awayPoint);
- arrowSegment.Points.Add(cornerDown);
- arrowSegment.Points.Add((Point)LineEnd);
- arrowFigure.Segments.Add(arrowSegment);
- arrowFigure.IsClosed = IsEndClosed;
- arrowFigure.IsFilled = IsEndClosed;
- return arrowFigure;
- }
- /// <summary>
- /// 绘制开始圆形
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartRoundArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(180);
- arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix);
- ArcSegment circleSegment = new ArcSegment();
- circleSegment.Point = (Point)LineStart;
- circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2);
- arrowFigure.Segments.Add(circleSegment);
- circleSegment = new ArcSegment();
- circleSegment.Point = (Point)arrowFigure.StartPoint;
- circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2);
- arrowFigure.Segments.Add(circleSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束圆形
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndRoundArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(180);
- arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix);
- ArcSegment circleSegment = new ArcSegment();
- circleSegment.Point = (Point)LineEnd;
- circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2);
- arrowFigure.Segments.Add(circleSegment);
- circleSegment = new ArcSegment();
- circleSegment.Point = (Point)arrowFigure.StartPoint;
- circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2);
- arrowFigure.Segments.Add(circleSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制开始方形
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartSquareArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment squreSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= (ArrowLength / 2);
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(90);
- arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix);
- rotateMatrix.Rotate(-180);
- Point pointCorner = (Point)LineStart + (lineVector * rotateMatrix);
- squreSegment.Points.Add(pointCorner);
- Vector moveVector = arrowFigure.StartPoint - pointCorner;
- moveVector.Normalize();
- moveVector *= (ArrowLength);
- rotateMatrix = new Matrix();
- rotateMatrix.Rotate(90);
- squreSegment.Points.Add(pointCorner + (moveVector * rotateMatrix));
- squreSegment.Points.Add(arrowFigure.StartPoint + (moveVector * rotateMatrix));
- squreSegment.Points.Add(arrowFigure.StartPoint);
- squreSegment.Points.Add((Point)LineStart);
- arrowFigure.Segments.Add(squreSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束方形
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndSquareArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- PolyLineSegment squreSegment = new PolyLineSegment();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= (ArrowLength / 2);
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(90);
- arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix);
- rotateMatrix.Rotate(-180);
- Point pointCorner = (Point)LineEnd + (lineVector * rotateMatrix);
- squreSegment.Points.Add(pointCorner);
- Vector moveVector = arrowFigure.StartPoint - pointCorner;
- moveVector.Normalize();
- moveVector *= (ArrowLength);
- rotateMatrix = new Matrix();
- rotateMatrix.Rotate(90);
- squreSegment.Points.Add(pointCorner + (moveVector * rotateMatrix));
- squreSegment.Points.Add(arrowFigure.StartPoint + (moveVector * rotateMatrix));
- squreSegment.Points.Add(arrowFigure.StartPoint);
- squreSegment.Points.Add((Point)LineEnd);
- arrowFigure.Segments.Add(squreSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制开始斜线
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateStartSlashArrow()
- {
- if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- LineSegment buttSegment = new LineSegment();
- Vector lineVector = (Point)LineStart - (Point)LineEnd;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(45);
- arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix);
- rotateMatrix.Rotate(-180);
- buttSegment.Point = ((Point)LineStart + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(buttSegment);
- return arrowFigure;
- }
- /// <summary>
- /// 绘制结束斜线
- /// </summary>
- /// <returns></returns>
- private PathFigure CreateEndSlashArrow()
- {
- if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null)
- {
- return null;
- }
- PathFigure arrowFigure = new PathFigure();
- LineSegment buttSegment = new LineSegment();
- Vector lineVector = (Point)LineEnd - (Point)LineStart;
- lineVector.Normalize();
- lineVector *= ArrowLength;
- Matrix rotateMatrix = new Matrix();
- rotateMatrix.Rotate(45);
- arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix);
- rotateMatrix.Rotate(-180);
- buttSegment.Point = ((Point)LineEnd + (lineVector * rotateMatrix));
- arrowFigure.Segments.Add(buttSegment);
- return arrowFigure;
- }
- }
- }
|