#!/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 contenant toutes les nuances de gris" 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 gravute 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/16 largeur=$(echo "scale=1; $TAILLE/16.0" | bc) demi_largeur=$(echo "scale=1; $TAILLE/32.0" | bc) 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 1 $DIAMETRE $demi_largeur` do #on trace des lignes de $DIAMETRE d'épaisseur 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 "G1 X0 Y-$DIAMETRE" >> sortie.gcode #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 "G1 X0 Y-$DIAMETRE" >> sortie.gcode done #à ce moment là on vient de finir une ligne de caré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 done #une fois fini on trace les délimitation verticales echo -e "\nM106 P1 S255" >> sortie.gcode for colonne in `seq 1 8` do echo -e "G1 X0 Y$TAILLE" >> sortie.gcode echo -e "G1 X$largeur" >> sortie.gcode echo -e "G1 X0 Y-$TAILLE" >> sortie.gcode echo -e "G1 X$largeur" >> sortie.gcode done echo -e "\nM106 P1 S255" >> sortie.gcode exit 0