Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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();
                 }
             }
         }
     }
 }
Exemplo n.º 4
0
        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();
                        }
                    }
                }
            }
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
 static void CalculateAttachedSegmentEnd(GeomLabel label, GeomEdge edge)
 {
     label.AttachmentSegmentEnd = edge.Curve[edge.Curve.ClosestParameter(label.Center)];
 }