#!/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 "Pour permettre de déterminer la vitesse maximale pour laquelle" echo "le rendu des noirs est vraiment noir" 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 minimale en mm/min" echo -e "-V\tvitesse de gravure maximale mm/min" echo -e "-p\tpas entre deux vitesses" echo -e "-l\tlargeur de la mire" } 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 "f:d:v:V:p:l:h" OPT do case "$OPT" in h) usage exit 0 ;; f) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly FOCALE=${OPTARG} ;; d) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly DIAMETRE=${OPTARG} ;; v) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly VITESSE_MIN=${OPTARG} ;; V) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly VITESSE_MAX=${OPTARG} ;; p) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly PAS=${OPTARG} ;; l) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly LARGEUR=${OPTARG} ;; *) #ce point est atteint lorsqu'une option inexistante est demandée echo "parametres non valide" usage exit 1 ;; esac done verification "$FOCALE" "focale" 5 FOCALE=$VALEUR echo -e "focale=$FOCALE" verification "$DIAMETRE" "diamètre" 0.2 DIAMETRE=$VALEUR echo -e "diamètre=$DIAMETRE" verification "$VITESSE_MIN" "vitesse_min" 500 VITESSE_MIN=$VALEUR echo -e "vitesse_min=$VITESSE_MIN" verification "$VITESSE_MAX" "vitesse_max" 2000 VITESSE_MAX=$VALEUR echo -e "vitesse_max=$VITESSE_MAX" verification "$PAS" "taille" 100 PAS=$VALEUR echo -e "taille=$PAS" verification "$LARGEUR" "largeur" 100 LARGEUR=$VALEUR echo -e "largeur=$LARGEUR" #la mire est constitué de carrés formant un dégradé #sur chaque ligne on gravera des carré de plus en plus foncés #16 carrés de 0 à 255 largeur_carre=$(echo "scale=1; $LARGEUR/16.0" | bc) demi_largeur_carre=$(echo "scale=1; $LARGEUR/32.0" | bc) hauteur_reelle=0 #création du fichier openscad echo "\$fn = 30;valeur=\"0\";translate([-1, -1, 0]){text(valeur, size=3, valign=\"top\", halign=\"right\");}" > temp.scad echo -e "G91\nG21\nG0 Z $FOCALE" > sortie.gcode for vitesse in `seq $VITESSE_MIN $PAS $VITESSE_MAX` do #génération du GCode pour noter la vitesse openscad -o temp.dxf -D 'valeur="'$vitesse'"' temp.scad dxf2gcode temp.dxf -q -e "${vitesse}.gcode" echo -e "\n;écriture de la vitesse : $vitesse\n" >> sortie.gcode cat $vitesse.gcode >> sortie.gcode rm $vitesse.gcode echo -e "G1 F$vitesse\n" >> sortie.gcode for hauteur in `seq 0 $DIAMETRE $demi_largeur_carre` do #on trace une ligne de $DIAMETRE d'épaisseur en faisant varier la puissance for puissance in `seq 15 15 255` do echo -e "M106 P1 S$puissance\nG1 X$largeur_carre" >> 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 puissance in `seq 255 -15 15` do echo -e "M106 P1 S$puissance\nG1 X-$largeur_carre" >> 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 #suppression des fichiers temporaires rm temp.dxf rm temp.scad #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_carre" >> sortie.gcode echo -e "G1 X0 Y-$hauteur_reelle" >> sortie.gcode echo -e "G1 X$largeur_carre" >> sortie.gcode done #on coupe le laser echo -e "\nM106 P1 S0" >> sortie.gcode echo -e "\nhauteur de la mire : $hauteur_reelle\n" exit 0