コード例 #1
0
        /// <summary>
        /// Indique si le graphe est dans le chemin choisi du 2ème graphe
        /// </summary>
        /// <returns></returns>
        protected bool inSelectedPathSecond()
        {
            CustomNodeMerged merged_source = (CustomNodeMerged)source;
            CustomNodeMerged merged_dest   = (CustomNodeMerged)dest;

            return(merged_source.in_selected_path_second && merged_dest.in_selected_path_second && inSecondGraph);
        }
コード例 #2
0
        /// <summary>
        /// Indique si le graphe est dans le chemin choisi du 1er graphe
        /// </summary>
        /// <returns></returns>
        protected bool inSelectedPathFirst()
        {
            CustomNodeMerged merged_source = (CustomNodeMerged)source;
            CustomNodeMerged merged_dest   = (CustomNodeMerged)dest;

            return(merged_source.in_selected_path && merged_dest.in_selected_path && inFirstGraph);
        }
コード例 #3
0
        /// <summary>
        /// Ajoute tous les arcs du noeuds passé en paramètre dans le graphe courrant
        /// Est utilisé par le constructeur du graph de fusion
        ///
        /// TODO : Ajouté aussi les predécesseurs, pour l'instant n'ajoute que les successeurs
        /// </summary>
        /// <param name="source">Noeud dont on souhaite ajouter tous les arcs</param>
        /// <param name="second_graph">Boolean qui indique si l'arc provient deu deuxième graphe</param>
        private void addMergedEdges(CustomNode source, bool second_graph)
        {
            CustomNodeMerged insertedNode = nodes[source.id];

            // On ajoute les arcs partant du noeuds (via les successeurs)
            foreach (CustomEdge edge in source.successors.Values)
            {
                if (!insertedNode.successors.ContainsKey(edge.dest.id))
                {
                    CustomNodeMerged sourceNode = nodes[edge.source.id];
                    CustomNodeMerged destNode   = nodes[edge.dest.id];

                    insertedNode.successors.Add(edge.dest.id, new CustomEdgeMerged()
                    {
                        name = edge.name, source = sourceNode, dest = destNode
                    });
                }

                CustomEdgeMerged insertedEdge = (CustomEdgeMerged)insertedNode.successors[edge.dest.id];

                if (second_graph)
                {
                    insertedEdge.inSecondGraph = true;
                }
                else
                {
                    insertedEdge.inFirstGraph = true;
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Retourne un Graph MSAGL comprenant tous les noeuds du graph, ou seulement les noeuds visités
        /// Le Graph MSAGL peut ensuite être affiché dans la vue
        /// </summary>
        /// <param name="only_visited">Inclure seulement les noeuds visité dans le visuel</param>
        /// <param name="edge_name">Afficher les nom des arcs dans la visualisation</param>
        /// <returns>Graph MSAGL pouvant être afficher dans la vue</returns>
        private Graph getVisualGraphClassic(bool only_visited, bool edge_name)
        {
            Graph graph = new Graph();

            ColorMap cmap        = new ColorMap(new Color(255, 255, 210, 210), Color.Red, realValueMax(), realValueMin());
            ColorMap cmap_first  = new ColorMap(new Color(255, 230, 255, 230), Color.Green, firstHeuristicMax(), firstheuristicMin());
            ColorMap cmap_second = new ColorMap(new Color(255, 240, 240, 255), Color.Blue, secondHeuristicMax(), secondHeuristicMin());

            foreach (CustomNodeMerged source in nodes.Values)
            {
                foreach (CustomEdge link in source.successors.Values)
                {
                    CustomNodeMerged dest = (CustomNodeMerged)link.dest;

                    // Si l'on ne veut afficher que les noeuds visités
                    if (only_visited && !dest.isVisited())
                    {
                        continue;
                    }

                    Edge msagl_edge = graph.AddEdge(source.id, dest.id);

                    Node msagl_source_node = msagl_edge.SourceNode;
                    Node msagl_dest_node   = msagl_edge.TargetNode;

                    source.styleNodeMerged(msagl_source_node, cmap, cmap_first, cmap_second);
                    dest.styleNodeMerged(msagl_dest_node, cmap, cmap_first, cmap_second);

                    // On change le style de l'arc en fonction des noeuds de départs et d'arrivés
                    link.styleEdge(msagl_edge, edge_name);
                }
            }

            return(graph);
        }
コード例 #5
0
        /// <summary>
        /// Indique si l'arc est dans le chemin final de n'importe quel graphe
        /// </summary>
        /// <returns>Booleen</returns>
        protected override bool inSelectedPath()
        {
            CustomNodeMerged merged_source = (CustomNodeMerged)source;
            CustomNodeMerged merged_dest   = (CustomNodeMerged)dest;

            return((merged_source.in_selected_path && merged_dest.in_selected_path && inFirstGraph) ||
                   (merged_source.in_selected_path_second && merged_dest.in_selected_path_second && inSecondGraph));
        }
コード例 #6
0
        /// <summary>
        /// Indique si cet arc est dans le chemin choisi des 2 graphes
        /// </summary>
        /// <returns>Booleen</returns>
        protected bool selectedPathBothGraph()
        {
            CustomNodeMerged merged_source = (CustomNodeMerged)source;
            CustomNodeMerged merged_dest   = (CustomNodeMerged)dest;

            return(inBothGraph() && merged_source.in_selected_path && merged_dest.in_selected_path &&
                   merged_source.in_selected_path_second && merged_dest.in_selected_path_second);
        }
コード例 #7
0
        /// <summary>
        /// Ajoute le noeud passé en paramètre dans le graphe courrant
        /// Est utilisé par le constructeur du graph de fusion
        /// </summary>
        /// <param name="node">Node à ajouter au gaphe courrant</param>
        /// <param name="second_graph">Boolean qui indique si c'est un noeuds du second graphe</param>
        private void addMergedNode(CustomNode node, bool second_graph)
        {
            if (!nodes.ContainsKey(node.id))
            {
                nodes.Add(node.id, new CustomNodeMerged(node.id));
            }

            CustomNodeMerged insertedNode = nodes[node.id];

            insertedNode.initFromNode(node, second_graph);

            // Si c'est le premier noeud qu'on ajoute, c'est la racine
            if (nodes.Values.Count == 1)
            {
                root = insertedNode;
            }
        }
コード例 #8
0
        /// <summary>
        /// Retourne un Graph MSAGL avec les noeuds qui ne sont pas dans selected_path groupés
        /// </summary>
        /// <param name="only_visited">Inclure seulement les noeuds visité dans le visuel</param>
        /// <param name="edge_name">Afficher les nom des arcs dans la visualisation</param>
        /// <param name="group_level">A partir de quel niveau de profondeur du selected path on doit grouper les noeuds</param>
        /// <returns>Graph MSAGL pouvant être afficher dans la vue</returns>
        private Graph getVisualGraphGrouped(bool only_visited, bool edge_name, int group_level)
        {
            Graph graph = new Graph();

            ColorMap cmap        = new ColorMap(new Color(255, 255, 210, 210), Color.Red, realValueMax(), realValueMin());
            ColorMap cmap_first  = new ColorMap(new Color(255, 230, 255, 230), Color.Green, firstHeuristicMax(), firstheuristicMin());
            ColorMap cmap_second = new ColorMap(new Color(255, 240, 240, 255), Color.Blue, secondHeuristicMax(), secondHeuristicMin());

            HashSet <string> visited = new HashSet <string>();

            // Parcours en largeur du graph pour afficher seulement les noeuds à un certains niveau de distance du selected path
            // Les autres noeuds sont groupés en un seul noeuds
            // L'entier dans le tuple correspond au niveau de distance du selected path
            Queue <Tuple <CustomNodeMerged, int> > queue = new Queue <Tuple <CustomNodeMerged, int> >();

            queue.Enqueue(new Tuple <CustomNodeMerged, int>(root, 0));

            while (queue.Any())
            {
                Tuple <CustomNodeMerged, int> tuple = queue.Dequeue();
                CustomNodeMerged actu = tuple.Item1;
                int profondeur        = tuple.Item2;

                if (visited.Contains(actu.id))
                {
                    continue;
                }
                visited.Add(actu.id);

                Node msagl_source_node = graph.AddNode(actu.id);

                if (profondeur == group_level)
                {
                    actu.styleNodeMergedGrouped(msagl_source_node, cmap, cmap_first, cmap_second);
                }
                else
                {
                    actu.styleNodeMerged(msagl_source_node, cmap, cmap_first, cmap_second);
                }


                foreach (CustomEdge edge in actu.successors.Values)
                {
                    CustomNodeMerged dest = (CustomNodeMerged)edge.dest;

                    if (only_visited && !dest.isVisited())
                    {
                        continue;
                    }

                    // On ajoute que les noeuds du selected path ou avec un profondeur inférieur à la profondeur max
                    if (dest.inSelectedPath() || profondeur < group_level)
                    {
                        Edge msagl_edge = graph.AddEdge(actu.id, dest.id);

                        edge.styleEdge(msagl_edge, edge_name);
                        int next_profondeur = profondeur + 1;

                        if (dest.inSelectedPath())
                        {
                            next_profondeur = 0;
                        }

                        queue.Enqueue(new Tuple <CustomNodeMerged, int>(dest, next_profondeur));
                    }
                }
            }

            return(graph);
        }