Le poste de contrôle (PC) / Les graphes /
Sockets : ports d'entrée-sortie

Nécessaires pour l'interconnexion des nodes


Avant-propos

Refactoring


Description

Code minimum pour afficher un socket dans un node :


Amélioration du résultat :

Plan du tuto :
  1. La forme du node sera triangulaire et non ronde, la pointe du triangle indiquera le sens des signaux.
  2. Chaque type de node doit avoir son propre nombre de sockets en entrée, son propre nombre de sockets en sortie.
  3. Positionnement correct des sockets.
  4. La hauteur du node sera automatiquement ajustée aux sockets.
  5. Affichage des labels en face de chaque socket.
  6. Sélection d'un node et affichage de ses paramètres, lorsqu'on clique sur un de ses sockets.
  7. La couleur de fond dépend de l'état du node (on, off).
  8. Ajout des dictionnaires de sockets à chaque type de node.

1 - Forme du node → un triangle :

Pas de TDD, contrôle visuel.
 


2 - Déclaration des sockets d'entrée et de sortie :


3 - Positionnement correct des sockets.

Pas de TDD, contrôle visuel.


4 - Hauteur automatique du node :

5 - Affichage des labels :


6 - Sélection d'un node et affichage de ses paramètres, lorsqu'on clique sur l'un de ses sockets :

Il y a 2 choses à faire pour réaliser celà :

  1. Autoriser la sélection et le survol d'un socket, par flags dans UiSocket.
  2. La méthode show_params() de CtrlScene concerne tous les widgets de la scène.
    Elle doit être capable de reconnaître le type de widget sur lequel on a cliqué.
    Si c'est un socket, on remonte dans ses ancêtres jusqu'à trouver le node auquel il est rattaché :
    • o_grsocket → o_socket → o_node

  1. Flags dans UiSocket.init_ui(), à la fin :
            """ Flags. """
            self.setFlag(QGraphicsItem.ItemIsSelectable)
            self.setAcceptHoverEvents(True)
    

     

  2. Modification de CtrlScene.show_params() :
        def show_params(self):
            """
            Si aucun élément du graphe n'est sélectionné, affiche les paramètres de la vue.
            Si un seul élément est sélectionné :
                - Si node : affiche ses paramètres.
                - Si socket : affiche les paramètres de son node.
            Si plusieurs éléménts sont sélectionnés, affiche une image 'multi-sélection'.
            :return: NA
            """
            l_selected = self.o_grscene.selectedItems()
            nb_selected = len(l_selected)
    
            if nb_selected == 0:
                self.o_params.show_params()
            elif nb_selected == 1:
                if l_selected[0].__class__.__name__ == 'UiNode':
                    """ l_selected[0] est un o_grnode. """
                    o_node = l_selected[0].o_node
                elif l_selected[0].__class__.__name__ == 'UiSocket':
                    """ l_selected[0] est un o_grsocket. """
                    o_node = l_selected[0].o_socket.o_node
                    o_node.o_grnode.setSelected(True)       # Sélection du node.
                else:
                    return
                o_node.o_params.show_params()
            else:   # > 1
                self.o_params.show_params(b_multi=True)
    


7 - Couleur de fond, ON ou OFF :

Évidemment, vous choisirez une couleur à votre convenance à la place du jaune.


8 - Ajout des dictionnaires de sockets à chaque type de node :
Retirer le mode debug → DEBUG = False

Pour chaque type de node, insérer les dictionnaires dans la méthode Node.setup(), avant super().setup(child_file).
Modifiez les libellés, les positions, les séparateurs à votre convenance.
 


Vérification


Snippets

Essayez de résoudre cette fonctionnalité par vous-même.
Consultez les réponses (snippets) seulement si vous n'avez pas trop de temps.

Bonjour les codeurs !