Example #1
0
        /// <summary>
        /// Performs a Depth-First traversal over the cached segment geometry structure. At each
        /// traversed segment, the given `visitor` is notified. It then can update the current `state`.
        /// </summary>
        /// <param name="initialSegmentGeometry">Specifies the segment at which the traversal
        ///     should start.</param>
        /// <param name="nextNodeIsStartNode">Specifies if the next node to traverse is the start
        ///     node of the initial segment.</param>
        /// <param name="direction">Specifies if traffic should be able to flow towards the initial
        ///     segment (Incoming) or should be able to flow from the initial segment (Outgoing) or
        ///     in both directions (Both).</param>
        /// <param name="maximumDepth">Specifies the maximum depth to explore. At a depth of 0, no
        ///     segment will be traversed (event the initial segment will be omitted).</param>
        /// <param name="visitorFun">Specifies the stateful visitor that should be notified as soon as
        ///     a traversable segment (which has not been traversed before) is found.</param>
        public static IEnumerable <ushort> Traverse(ushort initialSegmentId,
                                                    TraverseDirection direction,
                                                    TraverseSide side,
                                                    SegmentStopCriterion stopCrit,
                                                    SegmentVisitor visitorFun)
        {
            ExtSegment initialSeg = Constants.ManagerFactory.ExtSegmentManager.ExtSegments[initialSegmentId];

            if (!initialSeg.valid)
            {
                return(null);
            }

            // Log._Debug($"SegmentTraverser: Traversing initial segment {initialSegmentId}");
            if (!visitorFun(
                    new SegmentVisitData(
                        ref initialSeg,
                        ref initialSeg,
                        false,
                        false,
                        true)))
            {
                return(null);
            }

            HashSet <ushort> visitedSegmentIds = new HashSet <ushort>();

            visitedSegmentIds.Add(initialSegmentId);

            IExtSegmentEndManager extSegEndMan = Constants.ManagerFactory.ExtSegmentEndManager;

            ref NetSegment initialSegment = ref initialSegmentId.ToSegment();
Example #2
0
        /// <summary>
        /// Performs a Depth-First traversal over the cached segment geometry structure. At each
        /// traversed segment, the given `visitor` is notified. It then can update the current `state`.
        /// </summary>
        /// <param name="initialSegmentGeometry">Specifies the segment at which the traversal
        ///     should start.</param>
        /// <param name="nextNodeIsStartNode">Specifies if the next node to traverse is the start
        ///     node of the initial segment.</param>
        /// <param name="direction">Specifies if traffic should be able to flow towards the initial
        ///     segment (Incoming) or should be able to flow from the initial segment (Outgoing) or
        ///     in both directions (Both).</param>
        /// <param name="maximumDepth">Specifies the maximum depth to explore. At a depth of 0, no
        ///     segment will be traversed (event the initial segment will be omitted).</param>
        /// <param name="visitorFun">Specifies the stateful visitor that should be notified as soon as
        ///     a traversable segment (which has not been traversed before) is found.</param>
        public static IEnumerable <ushort> Traverse(ushort initialSegmentId,
                                                    TraverseDirection direction,
                                                    TraverseSide side,
                                                    SegmentStopCriterion stopCrit,
                                                    SegmentVisitor visitorFun)
        {
            ExtSegment initialSeg = Constants.ManagerFactory.ExtSegmentManager.ExtSegments[initialSegmentId];

            if (!initialSeg.valid)
            {
                return(null);
            }

            // Log._Debug($"SegmentTraverser: Traversing initial segment {initialSegmentId}");
            if (!visitorFun(
                    new SegmentVisitData(
                        ref initialSeg,
                        ref initialSeg,
                        false,
                        false,
                        true)))
            {
                return(null);
            }

            HashSet <ushort> visitedSegmentIds = new HashSet <ushort>();

            visitedSegmentIds.Add(initialSegmentId);

            IExtSegmentEndManager extSegEndMan = Constants.ManagerFactory.ExtSegmentEndManager;

            ushort startNodeId = Constants.ServiceFactory.NetService.GetSegmentNodeId(initialSegmentId, true);

            TraverseRec(
                ref initialSeg,
                ref extSegEndMan.ExtSegmentEnds[extSegEndMan.GetIndex(initialSegmentId, true)],
                ref startNodeId.ToNode(),
                true,
                direction,
                side,
                stopCrit,
                visitorFun,
                visitedSegmentIds);

            ushort endNodeId = Constants.ServiceFactory.NetService.GetSegmentNodeId(initialSegmentId, false);

            TraverseRec(
                ref initialSeg,
                ref extSegEndMan.ExtSegmentEnds[extSegEndMan.GetIndex(initialSegmentId, false)],
                ref endNodeId.ToNode(),
                false,
                direction,
                side,
                stopCrit,
                visitorFun,
                visitedSegmentIds);

            // Log._Debug($"SegmentTraverser: Traversal finished.");
            return(visitedSegmentIds);
        }
Example #3
0
        protected override void Initialize()
        {
            _editorController     = SdlTradosStudio.Application.GetController <EditorController>();
            _projectsController   = SdlTradosStudio.Application.GetController <ProjectsController>();
            _studioVersionService = new StudioVersionService();

            var commonService         = new ProjectFileService();
            var projectHelper         = new ProjectService(_projectsController, _studioVersionService);
            var analysisBands         = projectHelper.GetAnalysisBands(_projectsController.CurrentProject ?? _projectsController.SelectedProjects.FirstOrDefault());
            var filterItemService     = new FilterItemService(analysisBands);
            var sdlxliffMerger        = new SdlxliffMerger();
            var segmentBuilder        = new SegmentBuilder();
            var segmentVisitor        = new SegmentVisitor();
            var paragraphUnitProvider = new ParagraphUnitProvider(segmentVisitor, filterItemService);
            var sdlxliffExporter      = new SdlxliffExporter(segmentBuilder);
            var sdlXliffReader        = new SdlxliffReader();
            var displayFilter         = new DisplayFilter();

            var model = new StudioViewsEditorViewModel(_editorController, filterItemService,
                                                       commonService, sdlxliffMerger, sdlxliffExporter, sdlXliffReader, paragraphUnitProvider, displayFilter);

            _control = new StudioViewsEditorView {
                DataContext = model
            };
        }
Example #4
0
        public ParagraphUnitProviderTests()
        {
            var segmentBuilder = new SegmentBuilder();

            _paragraphUnitHelper = new ParagraphUnitHelper(segmentBuilder);

            var analysisBands = new List <AnalysisBand>
            {
                new AnalysisBand {
                    MaximumMatchValue = 74, MinimumMatchValue = 50
                },
                new AnalysisBand {
                    MaximumMatchValue = 84, MinimumMatchValue = 75
                },
                new AnalysisBand {
                    MaximumMatchValue = 94, MinimumMatchValue = 85
                },
                new AnalysisBand {
                    MaximumMatchValue = 99, MinimumMatchValue = 95
                }
            };
            var filterItemService = new FilterItemService(analysisBands);
            var segmentVisitor    = new SegmentVisitor();

            _paragraphUnitProvider = new ParagraphUnitProvider(segmentVisitor, filterItemService);
        }
        private void Run(IReadOnlyCollection <SystemFileInfo> importFiles, Language language)
        {
            var projectHelper         = new ProjectService(_projectsController, _studioVersionService);
            var analysisBands         = projectHelper.GetAnalysisBands(_projectsController.CurrentProject ?? _projectsController.SelectedProjects.FirstOrDefault());
            var filterItemService     = new FilterItemService(analysisBands);
            var commonService         = new ProjectFileService();
            var segmentVisitor        = new SegmentVisitor();
            var segmentBuilder        = new SegmentBuilder();
            var paragraphUnitProvider = new ParagraphUnitProvider(segmentVisitor, filterItemService, segmentBuilder);
            var sdlxliffImporter      = new SdlxliffImporter(commonService, filterItemService, paragraphUnitProvider, segmentBuilder);
            var sdlXliffReader        = new SdlxliffReader();

            _window = new StudioViewsFilesImportView();
            var model = new StudioViewsFilesImportViewModel(_window, _filesController, language, commonService, filterItemService, sdlxliffImporter, sdlXliffReader);

            _window.DataContext = model;
            if (importFiles != null)
            {
                model.AddFiles(importFiles);
            }

            _window.ShowDialog();

            if (model.DialogResult != DialogResult.OK)
            {
                return;
            }

            OpenMessageWindow(model);
        }
Example #6
0
        private bool IsActiveSegmentText(string text, ILanguage source)
        {
            if (text == null || source == null)
            {
                return(false);
            }

            var selectedSegmentPair = _editorController?.ActiveDocument?.GetActiveSegmentPair();

            if (selectedSegmentPair?.Source == null)
            {
                return(true);
            }

            var regex      = new Regex(@"[\s\t]+", RegexOptions.None);
            var searchText = regex.Replace(text, string.Empty);

            var segment        = new Segment(source.Locale);
            var segmentVisitor = new SegmentVisitor(segment, true);

            segmentVisitor.VisitSegment(selectedSegmentPair.Source);
            var sourceText = regex.Replace(segmentVisitor.Segment.ToPlain(), string.Empty);

            return(string.Compare(searchText, sourceText, StringComparison.InvariantCultureIgnoreCase) == 0);
        }
        private static SegmentVisitor SegmentVisitor(ISegment seg, CultureInfo culture)
        {
            var segment = new Segment(culture);

            var visitor = new SegmentVisitor(segment, false);

            visitor.VisitSegment(seg);

            return(visitor);
        }
Example #8
0
        public DsiViewerViewModel()
        {
            _segmentVisitor = new SegmentVisitor(false);
            _comments       = new List <IComment>();
            _documentStructureInformation = new List <DsiModel>();

            _editorController = DsiViewerInitializer.EditorController;
            _editorController.ActiveDocumentChanged += EditorController_ActiveDocumentChanged;

            SetActiveDocument(_editorController.ActiveDocument);
        }
Example #9
0
        public override long GetIndexToKeep(Segments segments)
        {
            SegmentVisitor visitor = new SegmentVisitor(this);

            segments.VisitBackwards(visitor);

            if (visitor.VisitedCount == 0)
            {
                _log.warn("No log files found during the prune operation. This state should resolve on its own, but" + " if this warning continues, you may want to look for other errors in the user log.");
            }

            return(visitor.PrevIndex);
        }
Example #10
0
        ///<summary>
        /// Determines the <see cref="Location"/> of a point in an areal <see cref="IGeometry"/>.
        ///</summary>
        /// <param name="p">The point to test</param>
        /// <returns>The location of the point in the geometry
        /// </returns>
        public Location Locate(Coordinate p)
        {
            var rcc = new RayCrossingCounter(p);

            var visitor = new SegmentVisitor(rcc);

            _index.Query(p.Y, p.Y, visitor);

            /*
             * // MD - slightly slower alternative
             * List segs = index.query(p.y, p.y);
             * countSegs(rcc, segs);
             */

            return(rcc.Location);
        }
Example #11
0
        public void VisitSegments()
        {
            JliffDocument jlb = new JliffBuilder("en-US", "it-IT")
                                .AddFile(new XlfEventArgs("f1"))
                                .AddUnit(new XlfEventArgs("u1"))
                                .EndSubFiles()
                                .AddSegment(new XlfEventArgs("s1"))
                                .EndSubUnits()
                                .AddSource("Hello")
                                .AddSmElement("mrk1", true)
                                .AddSource("there")
                                .AddEmElement("", true)
                                .AddTarget("Buongiorno")
                                .MoreSubUnits()
                                .AddSegment(new XlfEventArgs("s2"))
                                .EndSubUnits()
                                .AddSource("Congratulations")
                                .MoreSubUnits()
                                .AddSegment(new XlfEventArgs("s3"))
                                .EndSubUnits()
                                .AddSource("Goodbye")
                                .AddTarget("Arrivederci")
                                .Build();

            SegmentVisitor sv = new SegmentVisitor();

            jlb.Files[0].Process(sv);
            Assert.AreEqual <int>(3, sv.Segments.Count);

            sv.Segments[2].Target = new List <IElement>
            {
                new TextElement("So long")
            };

            Unit        u = jlb.Files[0].Subfiles[0] as Unit;
            Segment     s = u.Subunits[2] as Segment;
            TextElement t = s.Target[0] as TextElement;

            Assert.AreEqual <string>("So long", t.Text);
        }
Example #12
0
        /// <summary>
        /// Determines the <see cref="Location"/> of a point in an areal <see cref="Geometry"/>.
        /// </summary>
        /// <param name="p">The point to test</param>
        /// <returns>The location of the point in the geometry
        /// </returns>
        public Location Locate(Coordinate p)
        {
            // avoid calling synchronized method improves performance
            if (_index == null)
            {
                CreateIndex();
            }

            var rcc = new RayCrossingCounter(p);

            var visitor = new SegmentVisitor(rcc);

            _index.Query(p.Y, p.Y, visitor);

            /*
             * // MD - slightly slower alternative
             * List segs = index.query(p.y, p.y);
             * countSegs(rcc, segs);
             */

            return(rcc.Location);
        }
Example #13
0
        /// <summary>
        /// Determines the <see cref="Location"/> of a point in an areal <see cref="Geometry"/>.
        /// </summary>
        /// <param name="p">The point to test</param>
        /// <returns>The location of the point in the geometry
        /// </returns>
        public Location Locate(Coordinate p)
        {
            if (_index == null)
            {
                _index = new IntervalIndexedGeometry(_geom);
                // no need to hold onto geom
                _geom = null;
            }
            var rcc = new RayCrossingCounter(p);

            var visitor = new SegmentVisitor(rcc);

            _index.Query(p.Y, p.Y, visitor);

            /*
             * // MD - slightly slower alternative
             * List segs = index.query(p.y, p.y);
             * countSegs(rcc, segs);
             */

            return(rcc.Location);
        }
Example #14
0
        public static void Traverse(List <ushort> segmentList, SegmentVisitor visitorFun)
        {
            if (segmentList == null)
            {
                return;
            }
            ushort prevSegId = 0;

            ExtSegment[] extSegment_buffer = Constants.ManagerFactory.ExtSegmentManager.ExtSegments;
            NetSegment[] segment_buffer    = Singleton <NetManager> .instance.m_segments.m_buffer;
            foreach (var segId in segmentList)
            {
                SegmentTraverser.SegmentVisitData data;
                if (prevSegId == 0)
                {
                    data = new SegmentVisitData(
                        ref extSegment_buffer[segId],
                        ref extSegment_buffer[segId],
                        false,
                        false,
                        true);
                }
                else
                {
                    data = new SegmentVisitData(
                        ref extSegment_buffer[prevSegId],
                        ref extSegment_buffer[segId],
                        true,
                        segment_buffer[prevSegId].m_endNode == segment_buffer[segId].m_startNode,
                        false);
                }
                if (!visitorFun(data))
                {
                    break;
                }
                prevSegId = segId;
            }
        }
        /// <summary>
        /// Performs a Depth-First traversal over the cached segment geometry structure. At each traversed segment, the given `visitor` is notified. It then can update the current `state`.
        /// </summary>
        /// <param name="initialSegmentGeometry">Specifies the segment at which the traversal should start.</param>
        /// <param name="nextNodeIsStartNode">Specifies if the next node to traverse is the start node of the initial segment.</param>
        /// <param name="direction">Specifies if traffic should be able to flow towards the initial segment (Incoming) or should be able to flow from the initial segment (Outgoing) or in both directions (Both).</param>
        /// <param name="maximumDepth">Specifies the maximum depth to explore. At a depth of 0, no segment will be traversed (event the initial segment will be omitted).</param>
        /// <param name="visitor">Specifies the stateful visitor that should be notified as soon as a traversable segment (which has not been traversed before) is found.</param>
        public static void Traverse(ushort initialSegmentId, TraverseDirection direction, TraverseSide side, SegmentStopCriterion stopCrit, SegmentVisitor visitor)
        {
            SegmentGeometry initialSegGeometry = SegmentGeometry.Get(initialSegmentId);

            if (initialSegGeometry == null)
            {
                return;
            }

            Log._Debug($"SegmentTraverser: Traversing initial segment {initialSegGeometry.SegmentId}");
            if (visitor(new SegmentVisitData(initialSegGeometry, initialSegGeometry, false, false, true)))
            {
                HashSet <ushort> visitedSegmentIds = new HashSet <ushort>();
                visitedSegmentIds.Add(initialSegmentId);

                TraverseRec(initialSegGeometry, true, true, direction, side, stopCrit, visitor, visitedSegmentIds);
                TraverseRec(initialSegGeometry, false, false, direction, side, stopCrit, visitor, visitedSegmentIds);
            }
            Log._Debug($"SegmentTraverser: Traversal finished.");
        }
        private static void TraverseRec(SegmentGeometry prevSegGeometry, bool exploreStartNode, bool viaInitialStartNode, TraverseDirection direction, TraverseSide side, SegmentStopCriterion stopCrit, SegmentVisitor visitor, HashSet <ushort> visitedSegmentIds)
        {
            Log._Debug($"SegmentTraverser: Traversing segment {prevSegGeometry.SegmentId}");

            // collect next segment ids to traverse

            if (direction == TraverseDirection.None)
            {
                throw new ArgumentException($"Invalid direction {direction} given.");
            }

            if (side == TraverseSide.None)
            {
                throw new ArgumentException($"Invalid side {side} given.");
            }

            HashSet <ushort> nextSegmentIds = new HashSet <ushort>();

            switch (direction)
            {
            case TraverseDirection.AnyDirection:
            default:
                if (side == TraverseSide.AnySide)
                {
                    nextSegmentIds.UnionWith(prevSegGeometry.GetConnectedSegments(exploreStartNode));
                }
                else
                {
                    if ((side & TraverseSide.Left) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetLeftSegments(exploreStartNode));
                    }

                    if ((side & TraverseSide.Straight) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetStraightSegments(exploreStartNode));
                    }

                    if ((side & TraverseSide.Right) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetRightSegments(exploreStartNode));
                    }
                }
                break;

            case TraverseDirection.Incoming:
                if (side == TraverseSide.AnySide)
                {
                    nextSegmentIds.UnionWith(prevSegGeometry.GetIncomingSegments(exploreStartNode));
                }
                else
                {
                    if ((side & TraverseSide.Left) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetIncomingLeftSegments(exploreStartNode));
                    }

                    if ((side & TraverseSide.Straight) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetIncomingStraightSegments(exploreStartNode));
                    }

                    if ((side & TraverseSide.Right) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetIncomingRightSegments(exploreStartNode));
                    }
                }
                break;

            case TraverseDirection.Outgoing:
                if (side == TraverseSide.AnySide)
                {
                    nextSegmentIds.UnionWith(prevSegGeometry.GetOutgoingSegments(exploreStartNode));
                }
                else
                {
                    if ((side & TraverseSide.Left) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetOutgoingLeftSegments(exploreStartNode));
                    }

                    if ((side & TraverseSide.Straight) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetOutgoingStraightSegments(exploreStartNode));
                    }

                    if ((side & TraverseSide.Right) != TraverseSide.None)
                    {
                        nextSegmentIds.UnionWith(prevSegGeometry.GetOutgoingRightSegments(exploreStartNode));
                    }
                }
                break;
            }
            nextSegmentIds.Remove(0);

            Log._Debug($"SegmentTraverser: Fetched next segments to traverse: {nextSegmentIds.CollectionToString()}");

            if (nextSegmentIds.Count >= 2 && (stopCrit & SegmentStopCriterion.Junction) != SegmentStopCriterion.None)
            {
                Log._Debug($"SegmentTraverser: Stop criterion reached @ {prevSegGeometry.SegmentId}: {nextSegmentIds.Count} connected segments");
                return;
            }

            ushort prevNodeId = prevSegGeometry.GetNodeId(exploreStartNode);

            // explore next segments
            foreach (ushort nextSegmentId in nextSegmentIds)
            {
                if (nextSegmentId == 0 || visitedSegmentIds.Contains(nextSegmentId))
                {
                    continue;
                }
                visitedSegmentIds.Add(nextSegmentId);

                SegmentGeometry nextSegGeometry = SegmentGeometry.Get(nextSegmentId);
                if (nextSegGeometry != null)
                {
                    Log._Debug($"SegmentTraverser: Traversing segment {nextSegGeometry.SegmentId}");

                    if (visitor(new SegmentVisitData(prevSegGeometry, nextSegGeometry, viaInitialStartNode, prevNodeId == nextSegGeometry.StartNodeId(), false)))
                    {
                        bool nextNodeIsStartNode = nextSegGeometry.StartNodeId() != prevNodeId;
                        TraverseRec(nextSegGeometry, nextNodeIsStartNode, viaInitialStartNode, direction, side, stopCrit, visitor, visitedSegmentIds);
                    }
                }
            }
        }
Example #17
0
 public ParagraphUnitProvider(SegmentVisitor segmentVisitor, FilterItemService filterItemService, SegmentBuilder segmentBuilder)
 {
     _segmentVisitor    = segmentVisitor;
     _filterItemService = filterItemService;
     _segmentBuilder    = segmentBuilder;
 }
Example #18
0
        private static void TraverseRec(ref ExtSegment prevSeg,
                                        ref ExtSegmentEnd prevSegEnd,
                                        ref NetNode node,
                                        bool viaInitialStartNode,
                                        TraverseDirection direction,
                                        TraverseSide side,
                                        SegmentStopCriterion stopCrit,
                                        SegmentVisitor visitorFun,
                                        HashSet <ushort> visitedSegmentIds)
        {
            // Log._Debug($"SegmentTraverser: Traversing segment {prevSegEnd.segmentId}");
            // collect next segment ids to traverse
            if (direction == TraverseDirection.None)
            {
                throw new ArgumentException($"Invalid direction {direction} given.");
            }

            if (side == TraverseSide.None)
            {
                throw new ArgumentException($"Invalid side {side} given.");
            }

            IExtSegmentManager    extSegMan    = Constants.ManagerFactory.ExtSegmentManager;
            IExtSegmentEndManager extSegEndMan = Constants.ManagerFactory.ExtSegmentEndManager;

            HashSet <ushort> nextSegmentIds = new HashSet <ushort>();

            for (int i = 0; i < 8; ++i)
            {
                ushort nextSegmentId = node.GetSegment(i);
                if (nextSegmentId == 0 || nextSegmentId == prevSegEnd.segmentId)
                {
                    continue;
                }

                bool nextIsStartNode =
                    (bool)Constants.ServiceFactory.NetService.IsStartNode(
                        nextSegmentId,
                        prevSegEnd.nodeId);
                ExtSegmentEnd nextSegEnd =
                    extSegEndMan.ExtSegmentEnds[extSegEndMan.GetIndex(nextSegmentId, nextIsStartNode)];

                if (direction == TraverseDirection.AnyDirection ||
                    (direction == TraverseDirection.Incoming && nextSegEnd.incoming) ||
                    (direction == TraverseDirection.Outgoing && nextSegEnd.outgoing))
                {
                    if (side == TraverseSide.AnySide)
                    {
                        nextSegmentIds.Add(nextSegmentId);
                    }
                    else
                    {
                        ArrowDirection dir = extSegEndMan.GetDirection(
                            ref prevSegEnd,
                            nextSegmentId);
                        if (((side & TraverseSide.Left) != TraverseSide.None &&
                             dir == ArrowDirection.Left) ||
                            ((side & TraverseSide.Straight) != TraverseSide.None &&
                             dir == ArrowDirection.Forward) ||
                            ((side & TraverseSide.Right) != TraverseSide.None &&
                             dir == ArrowDirection.Right))
                        {
                            nextSegmentIds.Add(nextSegmentId);
                        }
                    }
                }
            }

            nextSegmentIds.Remove(0);
            // Log._Debug($"SegmentTraverser: Fetched next segments to traverse:
            //     {nextSegmentIds.CollectionToString()}");
            if (nextSegmentIds.Count >= 2 && (stopCrit & SegmentStopCriterion.Junction) !=
                SegmentStopCriterion.None)
            {
                // Log._Debug($"SegmentTraverser: Stop criterion reached @ {prevSegEnd.segmentId}:
                //    {nextSegmentIds.Count} connected segments");
                return;
            }

            // explore next segments
            foreach (ushort nextSegmentId in nextSegmentIds)
            {
                if (visitedSegmentIds.Contains(nextSegmentId))
                {
                    continue;
                }

                visitedSegmentIds.Add(nextSegmentId);
                // Log._Debug($"SegmentTraverser: Traversing segment {nextSegmentId}");
                ushort nextStartNodeId =
                    Constants.ServiceFactory.NetService.GetSegmentNodeId(nextSegmentId, true);

                if (!visitorFun(
                        new SegmentVisitData(
                            ref prevSeg,
                            ref extSegMan.ExtSegments[nextSegmentId],
                            viaInitialStartNode,
                            prevSegEnd.nodeId == nextStartNodeId,
                            false)))
                {
                    continue;
                }

                bool nextNodeIsStartNode = nextStartNodeId != prevSegEnd.nodeId;

                ExtSegmentEnd nextSegEnd
                    = extSegEndMan.ExtSegmentEnds[extSegEndMan.GetIndex(nextSegmentId, nextNodeIsStartNode)];

                Constants.ServiceFactory.NetService.ProcessNode(
                    nextSegEnd.nodeId,
                    (ushort nId, ref NetNode nextNode) => {
                    TraverseRec(
                        ref extSegMan.ExtSegments[nextSegmentId],
                        ref nextSegEnd,
                        ref nextNode,
                        viaInitialStartNode,
                        direction,
                        side,
                        stopCrit,
                        visitorFun,
                        visitedSegmentIds);
                    return(true);
                });
            } // end foreach
        }
Example #19
0
        private static void TraverseRec(SegmentGeometry prevSegGeometry, bool exploreStartNode, bool viaInitialStartNode, TraverseDirection direction, SegmentStopCriterion stopCrit, SegmentVisitor visitor, HashSet <ushort> visitedSegmentIds)
        {
            // collect next segment ids to traverse

            ushort[] nextSegmentIds;
            int      numConnectedSegments;

            switch (direction)
            {
            case TraverseDirection.Both:
            default:
                nextSegmentIds       = prevSegGeometry.GetConnectedSegments(exploreStartNode);
                numConnectedSegments = prevSegGeometry.CountOtherSegments(exploreStartNode);
                break;

            case TraverseDirection.Incoming:
                nextSegmentIds       = prevSegGeometry.GetIncomingSegments(exploreStartNode);
                numConnectedSegments = prevSegGeometry.CountIncomingSegments(exploreStartNode);
                break;

            case TraverseDirection.Outgoing:
                nextSegmentIds       = prevSegGeometry.GetOutgoingSegments(exploreStartNode);
                numConnectedSegments = prevSegGeometry.CountOutgoingSegments(exploreStartNode);
                break;
            }

            if (numConnectedSegments >= 2 && (stopCrit & SegmentStopCriterion.Junction) != SegmentStopCriterion.None)
            {
                Log._Debug($"SegmentTraverser: Stop criterion reached @ {prevSegGeometry.SegmentId}: {numConnectedSegments} connected segments");
                return;
            }

            ushort prevNodeId = prevSegGeometry.GetNodeId(exploreStartNode);

            // explore next segments
            foreach (ushort nextSegmentId in nextSegmentIds)
            {
                if (nextSegmentId == 0 || visitedSegmentIds.Contains(nextSegmentId))
                {
                    continue;
                }
                visitedSegmentIds.Add(nextSegmentId);

                SegmentGeometry nextSegGeometry = SegmentGeometry.Get(nextSegmentId);
                if (nextSegGeometry != null)
                {
                    Log._Debug($"SegmentTraverser: Traversing segment {nextSegGeometry.SegmentId}");

                    if (visitor(new SegmentVisitData(prevSegGeometry, nextSegGeometry, viaInitialStartNode, prevNodeId == nextSegGeometry.StartNodeId(), false)))
                    {
                        bool nextNodeIsStartNode = nextSegGeometry.StartNodeId() != prevNodeId;
                        TraverseRec(nextSegGeometry, nextNodeIsStartNode, viaInitialStartNode, direction, stopCrit, visitor, visitedSegmentIds);
                    }
                }
            }
        }
        /// <summary>
        /// Performs a Depth-First traversal over the cached segment geometry structure. At each traversed segment, the given `visitor` is notified. It then can update the current `state`.
        /// </summary>
        /// <param name="initialSegmentGeometry">Specifies the segment at which the traversal should start.</param>
        /// <param name="nextNodeIsStartNode">Specifies if the next node to traverse is the start node of the initial segment.</param>
        /// <param name="direction">Specifies if traffic should be able to flow towards the initial segment (Incoming) or should be able to flow from the initial segment (Outgoing) or in both directions (Both).</param>
        /// <param name="maximumDepth">Specifies the maximum depth to explore. At a depth of 0, no segment will be traversed (event the initial segment will be omitted).</param>
        /// <param name="visitor">Specifies the stateful visitor that should be notified as soon as a traversable segment (which has not been traversed before) is found.</param>
        public static void Traverse(ushort initialSegmentId, TraverseDirection direction, TraverseSide side, SegmentStopCriterion stopCrit, SegmentVisitor visitor)
        {
            ExtSegment initialSeg = Constants.ManagerFactory.ExtSegmentManager.ExtSegments[initialSegmentId];

            if (!initialSeg.valid)
            {
                return;
            }

            //Log._Debug($"SegmentTraverser: Traversing initial segment {initialSegmentId}");
            if (visitor(new SegmentVisitData(ref initialSeg, ref initialSeg, false, false, true)))
            {
                HashSet <ushort> visitedSegmentIds = new HashSet <ushort>();
                visitedSegmentIds.Add(initialSegmentId);

                IExtSegmentEndManager extSegEndMan = Constants.ManagerFactory.ExtSegmentEndManager;

                ushort startNodeId = Constants.ServiceFactory.NetService.GetSegmentNodeId(initialSegmentId, true);
                Constants.ServiceFactory.NetService.ProcessNode(startNodeId, delegate(ushort nId, ref NetNode node) {
                    TraverseRec(ref initialSeg, ref extSegEndMan.ExtSegmentEnds[extSegEndMan.GetIndex(initialSegmentId, true)], ref node, true, direction, side, stopCrit, visitor, visitedSegmentIds);
                    return(true);
                });

                ushort endNodeId = Constants.ServiceFactory.NetService.GetSegmentNodeId(initialSegmentId, false);
                Constants.ServiceFactory.NetService.ProcessNode(endNodeId, delegate(ushort nId, ref NetNode node) {
                    TraverseRec(ref initialSeg, ref extSegEndMan.ExtSegmentEnds[extSegEndMan.GetIndex(initialSegmentId, false)], ref node, false, direction, side, stopCrit, visitor, visitedSegmentIds);
                    return(true);
                });
            }
            //Log._Debug($"SegmentTraverser: Traversal finished.");
        }