public PointRalation(PointDelegateArgs point, PointDelegateArgs parentPoint) { Line = new ScreenSpaceLine2() { Stroke = Brushes.Blue, StrokeDashArray = new DoubleCollection(new[] { 5.0, 3.0 }), StrokeThickness = 1.0 }; var binding = new Binding(parentPoint.Path); binding.Source = parentPoint.Object; binding.Mode = BindingMode.OneWay; BindingOperations.SetBinding(Line, ScreenSpaceLine2.StartPointProperty, binding); DependencyPropertyDescriptor.FromProperty(ScreenSpaceLine2.StartPointProperty, typeof(ScreenSpaceLine2)).AddValueChanged(Line, OnParentPointChanged); parentPoint.Gripper.DragStart += ParentGripper_DragStart; parentPoint.Gripper.DragEnd += ParentGripper_DragEnd; binding = new Binding(point.Path); binding.Source = point.Object; binding.Mode = BindingMode.TwoWay; BindingOperations.SetBinding(Line, ScreenSpaceLine2.EndPointProperty, binding); DependencyPropertyDescriptor.FromProperty(ScreenSpaceLine2.EndPointProperty, typeof(ScreenSpaceLine2)).AddValueChanged(Line, OnPointChanged); _Delta = Line.EndPoint - Line.StartPoint; }
public PointDelegateArgs(Point pt, DependencyObject o, string path, PointDelegateArgs parentPoint) { Point = pt; Object = o; Path = path; ParentPoint = parentPoint; PointModified = false; }
private void ForEachAbsPoint(PointDelegate ptCallback) { foreach (var figure in Path.Figures) { var args = new PointDelegateArgs(figure.StartPoint, figure, "StartPoint"); ptCallback(args); if (args.PointModified) { figure.StartPoint = args.Point; } var lastEndPoint = args; foreach (var segment in figure.Segments) { if (segment is ArcSegment) { var arc = segment as ArcSegment; args = new PointDelegateArgs(arc.Point, segment, "Point"); ptCallback(args); if (args.PointModified) { arc.Point = args.Point; } lastEndPoint = args; } else if (segment is BezierSegment) { var b = segment as BezierSegment; args = new PointDelegateArgs(b.Point1, segment, "Point1", lastEndPoint); ptCallback(args); if (args.PointModified) { b.Point1 = args.Point; } args = new PointDelegateArgs(b.Point3, segment, "Point3"); ptCallback(args); if (args.PointModified) { b.Point3 = args.Point; } lastEndPoint = args; args = new PointDelegateArgs(b.Point2, segment, "Point2", lastEndPoint); ptCallback(args); if (args.PointModified) { b.Point2 = args.Point; } } else if (segment is LineSegment) { var l = segment as LineSegment; args = new PointDelegateArgs(l.Point, segment, "Point"); ptCallback(args); if (args.PointModified) { l.Point = args.Point; } lastEndPoint = args; } else if (segment is PolyBezierSegment) { var pb = segment as PolyBezierSegment; for (int n = 0; n < pb.Points.Count; n += 3) { args = new PointDelegateArgs(pb.Points[n + 0], segment, String.Format("Points[{0}]", n + 0), lastEndPoint); ptCallback(args); if (args.PointModified) { pb.Points[n + 0] = args.Point; } args = new PointDelegateArgs(pb.Points[n + 2], segment, String.Format("Points[{0}]", n + 2)); ptCallback(args); if (args.PointModified) { pb.Points[n + 2] = args.Point; } lastEndPoint = args; args = new PointDelegateArgs(pb.Points[n + 1], segment, String.Format("Points[{0}]", n + 1), lastEndPoint); ptCallback(args); if (args.PointModified) { pb.Points[n + 1] = args.Point; } } } else if (segment is PolyLineSegment) { var pl = segment as PolyLineSegment; for (int n = 0; n < pl.Points.Count; ++n) { args = new PointDelegateArgs(pl.Points[n], segment, String.Format("Points[{0}]", n)); ptCallback(args); if (args.PointModified) { pl.Points[n] = args.Point; } lastEndPoint = args; } } else if (segment is PolyQuadraticBezierSegment) { var pqb = segment as PolyQuadraticBezierSegment; for (int n = 0; n < pqb.Points.Count; ++n) { args = new PointDelegateArgs(pqb.Points[n + 1], segment, String.Format("Points[{0}]", n + 1)); ptCallback(args); if (args.PointModified) { pqb.Points[n + 1] = args.Point; } lastEndPoint = args; args = new PointDelegateArgs(pqb.Points[n + 0], segment, String.Format("Points[{0}]", n + 0), lastEndPoint); ptCallback(args); if (args.PointModified) { pqb.Points[n + 0] = args.Point; } } } else if (segment is QuadraticBezierSegment) { var qb = segment as QuadraticBezierSegment; args = new PointDelegateArgs(qb.Point2, segment, "Point2"); ptCallback(args); if (args.PointModified) { qb.Point2 = args.Point; } lastEndPoint = args; args = new PointDelegateArgs(qb.Point1, segment, "Point1", lastEndPoint); ptCallback(args); if (args.PointModified) { qb.Point1 = args.Point; } } } } }