Articles avec le tag ‘State chart’

Refactorisation et évolution de l’outil Cage

Hello,

Un article rapide pour vous dire que j’ai commencé un refactoring du code de l’outil cage de Gimp. C’est une étape nécessaire pour atteindre une bonne qualité de fonctionnement et une bonne base pour implémenter de nouvelle choses. Cela passe ici par une réécriture de la gestion de l’interface avec une machine à états (comme décrit ici il y a quelques jours),  des changements dans les structures de données, de la documentation, et pas mal de petites simplifications et corrections.

Pour l’avenir, une sélection multiple des points de la cage devrait arriver rapidement dans la branche soc-2010-cage-2. Ce mode d’édition fonctionnera de manière similaire à celui de l’outil chemin.

Un mode d’édition proportionnelle similaire à ce qu’on peut trouver dans Blender devrait voir le jour également.

Si ça se trouve, je vais finir par être satisfait de mon boulot un jour … =)

Implémenter une machine à état

Si vous avez déjà fait de la programmation événementielle (typiquement, les interfaces graphiques avec tout leurs boutons, qui sont activés n’importe quand), vous avez du tomber sur le problème du code à mettre derrière. Le problème est de gérer tous les cas possibles, sans zone de cas indéterminé, et donc sans bugs.

J’ai récemment réécris la gestion de l’interface de de mon outil de déformation par cage pour Gimp, sous forme de machine à état. Cette approche est à mon avis la plus simple a mettre en œuvre, et présente pas mal d’avantage:

  • On voit très facilement si tout les cas sont gérés
  • S’implémente de façon très simple, presque mécanique
  • Facile à maintenir et à étendre

La première étape est de dessiner un diagramme UML d’état. Voici le diagramme que nous allons implémenter:
State Chart UML
3 états et 6 transitions, c’est un automate relativement simple, mais déjà pas facile à implémenter si on ne suis pas cette approche.

Une fois qu’on a ce diagramme, toute la phase de réflexion pour savoir comment va marcher notre système est terminée. J’ai ici implémenté ce système en Java. On commence par définir un enum qui contient tous les états possibles du système:

public class StateMachine {

  private enum State {STATE1, STATE2, STATE3};

Une variable pour stocker l’état actuel:

  private State state;

L’état initial est défini dans le constructeur:

  public StateMachine() {
    this.state = State.STATE1;
  }

Le traitement sur les évènements se fait avec un switch case:

  public void event1() {
    switch(this.state) {
    case STATE1:
      //Action
      this.state = State.STATE2;
      break;
    default:
      //Nothing
      break;
    }
  }
 
  public void event2() {
    switch(this.state) {
    case STATE1:
      //Action
      this.state = State.STATE3;
      break;
    case STATE2:
      //Action
      this.state = State.STATE3;
      break;
    case STATE3:
      //Action
      this.state = State.STATE2;
      break;
    }
  }

  public void event3() {
    switch(this.state) {
    case STATE1:
      //Action
      this.state = State.STATE1;
      break;
    case STATE3:
      //Action
      this.state = State.STATE1;
      break;
    default:
      //Nothing
      break;
    }
  }
}

Et c’est tout ! Ça juste marche =)

ps: J’ai crée le diagramme UML avec PlantUML, très simple à utiliser et encore plus avec le plugin Eclipse !