#!/bin/bash #fonction appelée en cas de paramètres non valide ou de l'option -h usage() { # "$(basename "${0}") pour gérer les espaces echo "$(basename "${0}") description" echo '' echo "Ce script permet de générer un fichier gcode" echo "afin de créer un damier en faisant varier la puissance du laser" echo "de 0 à 255 et générer des niveaux de gris" echo "La hauteur de la mire peut varier de quelques mm à cause des arrondis" echo "" echo "Le fichier gcode en sortie utilisera des coordonées relatives." echo "" echo "La procédure est la suivante :" echo "-connaitre la distance focale" echo "-connaitre le diamètre du laser" echo "-exécuter le fichier gcode" echo "" echo "Détail des options" echo -e "-f\tfocale du laser en mm" echo -e "-d\tdiamètre du laser en mm" echo -e "-v\tvitesse de gravure en mm/min" echo -e "-t\ttaille de la mire mm" } readonly VERSION='1.0' #affiche la version du script version() { echo "$(basename "${0}") : ${VERSION}" echo '' } verification() { if [ -z $1 ] then echo "la variable $2 n'a pas été précisée, la valeur par défaut est $3" VALEUR=$3 else re='^[0-9]+([.][0-9]+)?$' if ! [[ $1 =~ $re ]] then echo "l'argument $2 n'est pas un nombre" usage exit 25 else VALEUR=$1 fi fi } #boucle pour la gestion des options #s: signifie qu'un paramètre est attendu #hV signifie que ces options existent mais ne prennent pas de paramètre while getopts "d:f:v:t:hV" OPT do case "$OPT" in h) usage exit 0 ;; V) version exit 0 ;; d) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly DIAMETRE=${OPTARG} ;; f) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly FOCALE=${OPTARG} ;; v) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly VITESSE=${OPTARG} ;; t) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly TAILLE=${OPTARG} ;; *) #ce point est atteint lorsqu'une option inexistante est demandée echo "parametres non valide" usage exit 1 ;; esac done verification "$DIAMETRE" "diamètre" 0.2 DIAMETRE=$VALEUR echo -e "diamètre=$DIAMETRE" verification "$FOCALE" "focale" 5 FOCALE=$VALEUR echo -e "focale=$FOCALE" verification "$VITESSE" "vitesse" 2000 VITESSE=$VALEUR echo -e "vitesse=$VITESSE" verification "$TAILLE" "taille" 100 TAILLE=$VALEUR echo -e "taille=$TAILLE" #la mire est constitué de carrés formant un dégradé #sur chaque ligne on gravera des carré de plus en plus foncés #on balaye donc sur une ligne des valeurs de n à n + 15 #la largeur d'un carré est donnée par : # ($TAILLE - 15*$DIAMETRE)/16 largeur=$(echo "scale=1; ($TAILLE - 15.0*$DIAMETRE)/16.0" | bc) demi_largeur=$(echo "scale=1; ($TAILLE - 15.0*$DIAMETRE)/32.0" | bc) hauteur_reelle=0 echo -e "G91\nG21\nG0 Z $FOCALE" > sortie.gcode echo -e "G1 F$VITESSE\n" >> sortie.gcode for ligne in `seq 0 15` do for hauteur in `seq 0 $DIAMETRE $demi_largeur` do #on trace une ligne de $DIAMETRE d'épaisseur en faisant varier la puissance for colonne in `seq 0 15` do puissance=$(echo "16*$ligne + $colonne" | bc) echo -e "M106 P1 S$puissance\nG1 X$largeur" >> sortie.gcode done #une fois qu'on a tracé une ligne on se décalle d'abord sur Y echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc) #puis on repart dans l'autre sens for colonne in `seq 15 -1 0` do puissance=$(echo "16*$ligne + $colonne" | bc) echo -e "M106 P1 S$puissance\nG1 X-$largeur" >> sortie.gcode done echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc) done #à ce moment là on vient de finir une ligne de carrés #on place donc une délimitation avant de continuer echo -e "\nM106 P1 S255" >> sortie.gcode echo -e "G1 X$TAILLE" >> sortie.gcode echo -e "G1 X-$TAILLE" >> sortie.gcode echo -e "G1 X0 Y-$DIAMETRE" >> sortie.gcode hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc) echo -e "\nM106 P1 S0\nM400" >> sortie.gcode done #une fois fini on trace les délimitation verticales echo -e "\n;grille\nM106 P1 S255" >> sortie.gcode for colonne in `seq 1 8` do echo -e "G1 X0 Y$hauteur_reelle" >> sortie.gcode echo -e "G1 X$largeur" >> sortie.gcode echo -e "G1 X0 Y-$hauteur_reelle" >> sortie.gcode echo -e "G1 X$largeur" >> sortie.gcode done #on coupe le laser echo -e "\nM106 P1 S0" >> sortie.gcode exit 0