Blame view
sources/RoboforkApp/Controls/ScheduleCanvas.cs
4.7 KB
|
d55d921a3
|
1 2 3 4 5 6 7 8 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; |
|
ec7e1c699
|
9 |
using System.Windows.Media.Animation; |
|
d55d921a3
|
10 11 12 13 14 15 |
using System.Windows.Shapes;
namespace RoboforkApp
{
public class ScheduleCanvas : Canvas
{
|
|
4bed9f746
|
16 17 18 19 20 21 22 23 |
const double COOR_Y = 65;
const double RADIUS_NODE = 25;
private simulationRobo simulation;
private Point startPoint;
private Point endPoint;
private bool _isGoal = false;
private double _speed = 0.2; //Now _speed is fixed, but when update node
private int index;
|
|
d55d921a3
|
24 |
|
|
4bed9f746
|
25 26 27 28 29 30 31 |
private List<ucNode> _lstNode;
/// <summary>
/// Create simulation
/// </summary>
/// <param name="lstNode"></param>
public void CreateSimulation(List<ucNode> lstNode)
|
|
d55d921a3
|
32 |
{
|
|
4bed9f746
|
33 34 35 36 37 38 39 |
//If node is less than 2 so return
if (this.Children.Count < 2)
{
return;
}
this.Children.Remove(simulation);
|
|
d55d921a3
|
40 |
|
|
4bed9f746
|
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
//Init data
this._lstNode = lstNode;
this.startPoint = new Point(Canvas.GetLeft(_lstNode[index]) + RADIUS_NODE, COOR_Y);
this.endPoint = new Point(Canvas.GetLeft(_lstNode[index + 1]) + RADIUS_NODE, COOR_Y);
this.index += 1;
if (index == _lstNode.Count - 1)
{
_isGoal = true;
}
// Start simulation
RoboSimulation();
}
/// <summary>
/// Create robo simulation on line
/// </summary>
private void RoboSimulation()
{
simulation = new simulationRobo();
simulation.storyBoard = CreatPathAnimation(startPoint, endPoint, _speed); //pathAnimationStoryboard;
this.Children.Add(simulation);
}
/// <summary>
/// Get storyboard
/// </summary>
/// <param name="startPoint">Point start line</param>
/// <param name="endPoit">Point end line</param>
/// <param name="speed">speed on line</param>
/// <returns>Storyboard</returns>
private Storyboard CreatPathAnimation(Point startPoint, Point endPoit, double speed)
{
|
|
ec7e1c699
|
74 75 |
PathGeometry animationPath = new PathGeometry();
PathFigure pFigure = new PathFigure();
|
|
4bed9f746
|
76 |
pFigure.StartPoint = startPoint; //new Point(50, 65); |
|
ec7e1c699
|
77 |
LineSegment lineSegment = new LineSegment(); |
|
4bed9f746
|
78 |
lineSegment.Point = endPoit; // new Point(800, 65); |
|
ec7e1c699
|
79 80 81 82 83 84 85 |
pFigure.Segments.Add(lineSegment);
animationPath.Figures.Add(pFigure);
// Freeze the PathGeometry for performance benefits.
animationPath.Freeze();
// Create a MatrixAnimationUsingPath to move the
|
|
4bed9f746
|
86 |
// simulation along the path by animating |
|
ec7e1c699
|
87 88 89 |
// its MatrixTransform.
MatrixAnimationUsingPath matrixAnimation = new MatrixAnimationUsingPath();
matrixAnimation.PathGeometry = animationPath;
|
|
4bed9f746
|
90 |
matrixAnimation.SpeedRatio = speed; |
|
ec7e1c699
|
91 92 |
matrixAnimation.AutoReverse = false;
matrixAnimation.DoesRotateWithTangent = true;
|
|
4bed9f746
|
93 |
matrixAnimation.Completed += delegate { AnimationCompleted(this._isGoal); };
|
|
ec7e1c699
|
94 95 96 97 98 99 100 101 102 |
// Set the animation to target the Matrix property
// of the MatrixTransform named "ButtonMatrixTransform".
Storyboard.SetTargetName(matrixAnimation, "fl");
Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath(MatrixTransform.MatrixProperty));
// Create a Storyboard to contain and apply the animation.
Storyboard pathAnimationStoryboard = new Storyboard();
pathAnimationStoryboard.Children.Add(matrixAnimation);
|
|
4bed9f746
|
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
return pathAnimationStoryboard;
}
/// <summary>
/// Process when simulation is end line
/// </summary>
/// <param name="isGoal">check is node end</param>
private void AnimationCompleted(bool isGoal)
{
// If not end node
if (!isGoal)
{
this.index += 1;
this.Children.Remove(simulation);
this.startPoint = endPoint;
this.endPoint = new Point(Canvas.GetLeft(_lstNode[index]) + RADIUS_NODE, COOR_Y);
if (this.index == this._lstNode.Count - 1)
{
this._isGoal = true;
}
this._speed += 0.2;
RoboSimulation();
return;
}
// Reset data when finish
this.index = 0;
this._speed = 0.2;
this._isGoal = false;
|
|
d55d921a3
|
133 134 135 |
}
}
}
|