Skip to content

Implémentation d'un outil en script

Le scripting ne se limite pas à des transformations sur les cartons, mais peut permettre également de compléter l'écran par de nouveaux outils.

ci dessous est expliqué comment créer un nouvel outil, utilisable dans la fenetre de carton. Cet outil présenté propose un action de "Punch" pour faire des trous calibrés dans le carton.

Cet outil montre le coup de poinçon donné sur le carton, Les touches + et - permettent de régler la taille du poinçon

Le code source associé à l'outil

import org.barrelorgandiscovery.gui.aedit.*
import org.barrelorgandiscovery.virtualbook.*

import javax.swing.*
import java.awt.event.*
import java.awt.*


// JOptionPane.showMessageDialog(null,"Punch Tool Activated")

class PunchTool extends Tool {

    def pianoroll

    // position actuelle de la souris
    // utilisé pour l'affichage du texte
    Integer currentX
    Integer currentY

    // taille du trou pour les coups de poinçons
    double tailleTrou = 5.0

    // position courante sur le carton
    // si null, on est pas dans une position connue sur la matrice du carton
    def position

    def void activated() {
       //  JOptionPane.showMessageDialog(null,"activated " + pianoroll)
    }

    def void unactivated() {
     // JOptionPane.showMessageDialog(null,"unactivated")
    }

    def void paintElements(Graphics g) {
    if (position != null) { // on est sur une position dans le carton
        position.track; // piste matchée
        position.position; // timestamp, in micros

        // calcul de la position de la piste en mm
        def axis = pianoroll.trackToMM(position.track)
        def debut =  pianoroll.timeToMM(position.position)

        def scale = pianoroll.virtualBook.scale
        def hauteurPiste = scale.intertrackHeight
        g.drawRect(pianoroll.convertCartonToScreenX(debut ), 
               pianoroll.convertCartonToScreenY(axis - hauteurPiste/2),
            pianoroll.MmToPixel(tailleTrou),
            pianoroll.MmToPixel(hauteurPiste))
        g.drawString("" + tailleTrou + " mm" , currentX, currentY)
    }    
    }

    def void mouseMoved(MouseEvent e) {
      currentX = e.x
      currentY = e.y
      // on question pour savoir sur quelle piste on est
      // et à quel horodatage dans le carton
      position = pianoroll.query(e.x, e.y)

      // on demande le réaffichage pour que le dessin
      // se fasse
      pianoroll.repaint()
    }

    def void mouseReleased(MouseEvent e) {
    if (position != null) {
        try {
        // definition de la position du "trou", ou "matière à remettre sur le carton"
        def h = new Hole(position.track, position.position, pianoroll.MMToTime(tailleTrou))

        pianoroll.startEventTransaction();
        try {
            def us = pianoroll.undoStack
            us.push(new GlobalVirtualBookUndoOperation(pianoroll.virtualBook, "Undo Punch", pianoroll));

            if (e.button == MouseEvent.BUTTON1) {
            // on a clické sur le bouton gauche, on découpe le carton
            pianoroll.virtualBook.addAndMerge(h)                        
            } else if (e.button == MouseEvent.BUTTON3) {
            // on a clické sur le bouton droit, on remet de la matière
            pianoroll.virtualBook.cutHoles(h)
            }
        } finally {
            pianoroll.endEventTransaction()
        }
        // pianoroll.repaint()
        } catch(Throwable t) {
            // en cas d'erreur, on l'affiche
            JOptionPane.showMessageDialog(null,t.message)
        }
    } // if position != null
    }

    void keyTyped(KeyEvent e) {
    // on a appuyé sur une touche
    // JOptionPane.showMessageDialog(null,e.keyChar)
    if (e.keyChar == '+') {
        tailleTrou = tailleTrou + 1
        pianoroll.repaint()
    } else if (e.keyChar == '-') {
        tailleTrou = tailleTrou -1
        pianoroll.repaint()
    }
    }
}

// création de l'outil
def p = new PunchTool( pianoroll: pianoroll  );
// activation de l'outil dans la fenetre
pianoroll.setCurrentTool(p);