internal static ICurve CreateBaseSegmentForDraggingEdgeWithSource(Point delta, GeomEdge edge, EdgeRestoreData edgeRestoreData, Dictionary <GeomEdge, double> offsets) { double offset; ICurve seg; Point a = edgeRestoreData.UnderlyingPolyline.HeadSite.Point + delta; Point b = edgeRestoreData.UnderlyingPolyline.LastSite.Point; if (offsets.TryGetValue(edge, out offset) && offset != 0) { Point ab = b - a; Point abOrtog = ab.Normalize().Rotate(Math.PI / 2) * offset; seg = CreateBaseSegOnSourceTargetAndOrth(ref a, ref b, ref abOrtog); // SugiyamaLayoutSettings.Show(seg, edge.Curve, edge.Source.BoundaryCurve); } else { seg = new LineSegment(a, b); } return(seg); }
static internal void DragEdgeWithTarget(Point delta, GeomEdge edge, EdgeRestoreData edgeRestoreData) { double closenessToLine = Math.Min(1.0, (delta.Length / edgeRestoreData.DistanceWhenEdgeIsTurningToLine)); Point lineStart = edgeRestoreData.Polyline.HeadSite.Point; Point lineEnd = edgeRestoreData.Polyline.LastSite.Point + delta; edge.UnderlyingPolyline.LastSite.Point = lineEnd; Point lineVectorBetweenToPolylinePoints = (lineEnd - lineStart) / edgeRestoreData.NumberOfPolylineSegments; Site liveSite = edge.UnderlyingPolyline.HeadSite; Site restoreSite = edgeRestoreData.Polyline.HeadSite; for (int i = 1; i < edgeRestoreData.NumberOfPolylineSegments; i++) { Point linePoint = lineStart + ((double)i) * lineVectorBetweenToPolylinePoints; liveSite = liveSite.Next; restoreSite = restoreSite.Next; liveSite.Point = closenessToLine * linePoint + (1 - closenessToLine) * restoreSite.Point; } CreateCurveOnChangedPolyline(delta, edge, edgeRestoreData); }
/// <summary> /// redoes the editing /// </summary> public override void Redo() { EdgeRestoreData erd = (EdgeRestoreData)GetRestoreData(editedEdge); GeometryGraphEditor.DragEdgeWithSite(Delta, editedEdge, erd, erd.Site, erd.InitialSitePosition); }
/// <summary> /// undoes the editing /// </summary> public override void Undo() { EdgeRestoreData erd = (EdgeRestoreData)GetRestoreData(editedEdge); GeometryGraphEditor.DragEdgeWithSite(new Point(0, 0), editedEdge, erd, erd.Site, erd.InitialSitePosition); }
/// <summary> /// /// </summary> /// <param name="delta">delta of the drag</param> /// <param name="e">the modified edge</param> /// <param name="edgeRestoreData"></param> /// <param name="site"></param> /// <param name="previousSitePosition"></param> static internal void DragEdgeWithSite(Point delta, GeomEdge e, EdgeRestoreData edgeRestoreData, Site site, Point previousSitePosition) { site.Point = previousSitePosition + delta; CreateCurveOnChangedPolyline(delta, e, edgeRestoreData); }