Esempio n. 1
0
File: Tracer.cs Progetto: icprog/cnc
        public void SplitLoop(Entity ent, Point2D pt, DistancePointType pointType)
        {
            Debug.Assert(IsLoop);
            LinkedListNode <Entity> stop = null;

            switch (pointType)
            {
            case DistancePointType.Other:
                Entity ent1, ent2;
                ent.Split(pt, out ent1, out ent2);
                LinkedListNode <Entity> node  = Entities.Find(ent);
                LinkedListNode <Entity> node1 = Entities.AddAfter(node, ent1);
                LinkedListNode <Entity> node2 = Entities.AddAfter(node1, ent2);
                stop = node2;
                Entities.Remove(node);
                break;

            case DistancePointType.Start:
                stop = Entities.Find(ent);
                break;

            case DistancePointType.End:
                stop = Entities.Find(ent).Next;
                break;

            default:
                Debug.Assert(false);
                break;
            }
            if (stop != null)
            {
                while (stop != Entities.First)
                {
                    LinkedListNode <Entity> node = Entities.First;
                    Entities.Remove(node);
                    Entities.AddLast(node);
                    node.Value.Reverse();
                }
            }
        }
Esempio n. 2
0
File: Tracer.cs Progetto: icprog/cnc
        public static Trace ChooseTrace(Point2D from, LinkedList <Trace> traces)
        {
            SelectClosestTraceResult closestTraceRes = SelectClosestTrace(from, traces);

            // если ближайшим оказался цикл то разрезаем его по ближней точке
            if (closestTraceRes.Trace.IsLoop)
            {
                Entity            ent       = closestTraceRes.LoopDistance.Entity;
                Point2D           closest   = closestTraceRes.LoopDistance.Closest;
                DistancePointType pointType = closestTraceRes.LoopDistance.PointType;
                closestTraceRes.Trace.SplitLoop(ent, closest, pointType);
            }
            else
            {
                if (closestTraceRes.NeedReverse)
                {
                    Trace reversed = closestTraceRes.Trace.CreateReversed();
                    traces.Find(closestTraceRes.Trace).Value = reversed;
                    closestTraceRes.Trace = reversed;
                }
            }
            return(closestTraceRes.Trace);
        }