static ICurve CreateLabelBoundary(GeomLabel label) { double w = label.Width / 2; double h = label.Height / 2; Curve curve = new Curve(); Curve.AddLineSegment(curve, label.Center.X - w, label.Center.Y - h, label.Center.X - w, label.Center.Y + h); Curve.ContinueWithLineSegment(curve, label.Center.X + w, label.Center.Y + h); Curve.ContinueWithLineSegment(curve, label.Center.X + w, label.Center.Y - h); Curve.CloseCurve(curve); return(curve); }
/// <summary> /// drags elements by the delta /// </summary> /// <param name="delta"></param> public void Drag(Point delta) { GraphBoundingBoxGetsExtended = false; if (delta.X != 0 || delta.Y != 0) { if (EditedEdge == null) { foreach (GeometryObject geomObj in objectsToDrag) { GeomNode node = geomObj as GeomNode; if (node != null) { DragNode(node, delta, CurrentUndoAction.GetRestoreData(node) as NodeRestoreData); } else { GeomEdge edge = geomObj as GeomEdge; if (edge != null) { TranslateEdge(edge, delta, CurrentUndoAction.GetRestoreData(edge) as EdgeRestoreData); } else { GeomLabel label = geomObj as GeomLabel; if (label != null) { DragLabel(label, delta, (CurrentUndoAction.GetRestoreData(label) as LabelRestoreData).Center); } else { throw new NotImplementedException(); } } } UpdateGraphBoundingBoxWithCheck(geomObj); } DragEdgesWithSource(delta); DragEdgesWithTarget(delta); } else if (EditedEdge != null) { DragEdgeEdit(delta); UpdateGraphBoundingBoxWithCheck(EditedEdge); } } }
/// <summary> /// redoes the editing /// </summary> public override void Redo() { base.Redo(); foreach (GeometryObject geomObj in movedObjects) { GeomNode node = geomObj as GeomNode; if (node != null) { GeometryGraphEditor.DragNode(node, Delta, GetRestoreData(node) as NodeRestoreData); foreach (GeomEdge edge in node.OutEdges) { GeometryGraphEditor.DragEdgeWithSource(Delta, edge, GetRestoreData(edge) as EdgeRestoreData); } foreach (GeomEdge edge in node.InEdges) { GeometryGraphEditor.DragEdgeWithTarget(Delta, edge, GetRestoreData(edge) as EdgeRestoreData); } foreach (GeomEdge edge in node.SelfEdges) { GeometryGraphEditor.DragEdge(Delta, edge, GetRestoreData(edge) as EdgeRestoreData, movedObjects); } } else { GeomEdge edge = geomObj as GeomEdge; if (edge != null) { GeometryGraphEditor.DragEdge(Delta, edge, GetRestoreData(edge) as EdgeRestoreData, movedObjects); } else { GeomLabel label = geomObj as GeomLabel; if (label != null) { GeometryGraphEditor.DragLabel(label, Delta, (GetRestoreData(label) as LabelRestoreData).Center); } else { throw new System.NotImplementedException(); } } } } }
static internal void DragLabel(GeomLabel label, Point delta, Point dragStartCenter) { label.Center = dragStartCenter + delta; GeomEdge edge = label.Parent as GeomEdge; if (edge != null) { CalculateAttachedSegmentEnd(label, edge); label.AttachmentSegmentStart = label.Center; if (!Curve.Close(label.AttachmentSegmentEnd, label.Center)) { foreach (IntersectionInfo x in Curve.CurveCurveIntersect(CreateLabelBoundary(label), new LineSegment(label.AttachmentSegmentEnd, label.Center), false)) { label.AttachmentSegmentStart = x.IntersectionPoint; break; } } } }
/// <summary> /// Undoes the editing /// </summary> public override void Undo() { base.Undo(); Point point = new Point(); foreach (GeometryObject geomObj in movedObjects) { GeomNode node = geomObj as GeomNode; if (node != null) { GeometryGraphEditor.DragNode(node, point, GetRestoreData(node) as NodeRestoreData); foreach (GeomEdge edge in node.Edges) { RestoreEdge(edge); } } else { GeomEdge edge = geomObj as GeomEdge; if (edge != null) { GeometryGraphEditor.DragEdge(point, edge, GetRestoreData(edge) as EdgeRestoreData, movedObjects); } else { GeomLabel label = geomObj as GeomLabel; if (label != null) { GeometryGraphEditor.DragLabel(label, point, (GetRestoreData(label) as LabelRestoreData).Center); } else { throw new System.NotImplementedException(); } } } } }
private IEnumerable <GeometryObject> ChangedElements() { if (this.EditedEdge == null) { foreach (GeometryObject obj in ObjectsToDrag) { GeomNode node = obj as GeomNode; if (node != null) { yield return(node); foreach (GeomEdge e in node.OutEdges) { yield return(e); } foreach (GeomEdge e in node.SelfEdges) { yield return(e); } foreach (GeomEdge e in node.InEdges) { yield return(e); } } else { GeomEdge edge = obj as GeomEdge; if (edge != null) { yield return(edge); yield return(edge.Source); foreach (GeomEdge e in edge.Source.Edges) { yield return(e); } yield return(edge.Target); foreach (GeomEdge e in edge.Target.Edges) { yield return(e); } } else { GeomLabel label = obj as GeomLabel; if (label != null) { yield return(label); } else { throw new NotImplementedException(); } } } } } else { yield return(this.EditedEdge); } }
static void CalculateAttachedSegmentEnd(GeomLabel label, GeomEdge edge) { label.AttachmentSegmentEnd = edge.Curve[edge.Curve.ClosestParameter(label.Center)]; }