#!/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 trouver la taille du point focal du laser" echo "un ensemble de trait seront tracés de plus en plus espacés" 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 "-placer la tête de l'imprimante 3D en buté sur l'objet à graver" echo "-exécuter le fichier gcode" echo "" echo "Détail des options" echo -e "-l\tlargeur minimale en mm" echo -e "-L\tlargeur maximale en mm" echo -e "-p\tpas entre deux hauteurs en mm" echo -e "-f\tla distance focale du laser en mm" } readonly VERSION='1.0' #affiche la version du script version() { echo "$(basename "${0}") : ${VERSION}" echo '' } #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 "l:L:p:f:hV" OPT do case "$OPT" in h) usage exit 0 ;; V) version exit 0 ;; l) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly readonly L_MIN=${OPTARG} ;; L) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly readonly L_MAX=${OPTARG} ;; p) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly readonly PAS=${OPTARG} ;; f) #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly readonly FOCALE=${OPTARG} ;; *) #ce point est atteint lorsqu'une option inexistante est demandée echo "parametres non valide" usage exit 1 ;; esac done if [ -z "${L_MIN}" ] then echo "la largeur minimale est inconnue" usage exit 10 else re='^[0-9]+([.][0-9]+)?$' if ! [[ $L_MIN =~ $re ]] then echo "l'argument de largeur minimale n'est pas un nombre" usage exit 15 fi fi if [ -z "${L_MAX}" ] then echo "la largeur maximale est inconnue" usage exit 20 else re='^[0-9]+([.][0-9]+)?$' if ! [[ $L_MAX =~ $re ]] then echo "l'argument de largeur maximale n'est pas un nombre" usage exit 25 fi fi if [ -z "${PAS}" ] then echo "le pas est inconnue sa valeur sera fixée à 0.1mm" PAS=0.1 else re='^[0-9]+([.][0-9]+)?$' if ! [[ $PAS =~ $re ]] then echo "l'argument de largeur maximale n'est pas un nombre" usage exit 35 fi fi if [ -z "${FOCALE}" ] then echo "la distance focale est inconnue sa valeur sera fixée à 5mm" FOCALE=5 else re='^[0-9]+([.][0-9]+)?$' if ! [[ $FOCALE =~ $re ]] then echo "l'argument de largeur maximale n'est pas un nombre" usage exit 45 fi fi #echo "valeur=\"0\";text(valeur, size=50, halign=\"right\", valign =\"center\");" > temp.scad echo "\$fn = 30;valeur=\"0\";translate([0, 1, 0]){text(valeur, size=3);}" > temp.scad echo -e "G91" > sortie.gcode echo -e "G0 Z $FOCALE" >> sortie.gcode echo -e "G1 F2000\n" >> sortie.gcode #Pour que seq renvoie des nombre avec '.' et non ',' il faut : LANG=en_US for i in `seq $L_MIN $PAS $L_MAX` do openscad -o temp.dxf -D 'valeur="'$i'"' temp.scad dxf2gcode temp.dxf -q -e "${i}.gcode" #numérotation de la ligne cat $i.gcode >> sortie.gcode #On trace un paquet de lignes sur une hauteur de 3mm #La première doit s'éloigner du nombre écrit juste avant echo -e "\nM400\nM106 P1 S255\nG1 X 20" >> sortie.gcode DELTA=$(echo "2*$i" | bc) for j in `seq $i $DELTA 3` do #Une fois la première ligne tracée on fait des aller-retour sur 10mm echo -e ";changement de ligne\nG1 X 0 Y $i" >> sortie.gcode echo -e "M400\nG1 X -10" >> sortie.gcode echo -e ";changement de ligne\nG1 X 0 Y $i" >> sortie.gcode echo -e "M400\nG1 X 10" >> sortie.gcode done #pour la dernière étape on se déplace une dernière fois de $PAS sur l'axe Y et on revient au début sur X echo -e ";changement de ligne\nG1 X 0 Y $i\n" >> sortie.gcode echo -e "M400\nM106 P1 S0\nG1 X -20" >> sortie.gcode echo -e "M400\nM106 P1 S0\n" >> sortie.gcode rm $i.gcode done rm temp.scad rm temp.dxf exit 0