#!/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 "Lorsqu'on cherche à graver une image avec un laser," echo "si la taille des pixels est trop petite alors la machine" echo "devra traiter un grand nombre d'instructions très rapidement." echo "Ce script à pour but de générer un fichier gcode" echo "qui permettra de déterminer la taille de pixel la plus petite" echo "que la machine est capable de traiter à la vitesse souhaité" 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 "-connaitre la vitesse de gravure optimale" echo "-exécuter le fichier gcode" echo "" echo "Détail des options" echo -e "-h\tafficher cette aide" 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 pixel minimale en mm" echo -e "-T\ttaille de pixel maximale en mm" echo -e "-p\tpas entre deux taille" echo -e "-l\tlargeur de la mire" } 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 } #les paramètres sont dans l'ordre : #puissance #axe #distance trace_ligne() { echo -e "M106 P1 S$1" >> sortie.gcode echo -e "G1 $2$3" >> sortie.gcode } #les paramètres sont dans l'ordre : #puissance #axe #distance #taille pixel trace_ligne_pixel() { for i in `seq 1 $4 $3` do trace_ligne $1 $2 $4 done } #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 OPTS=$(getopt -o h,f:,d:,v:,t:,T:,p:,l: -l test,v_min:,v_max: -- "$@" ) eval set -- "$OPTS" while true do case "$1" in -h) usage exit 0 ;; -f) FOCALE=$2 shift 2 ;; -d) DIAMETRE=$2 shift 2 ;; -v) VITESSE=$2 shift 2 ;; -t) TAILLE_MIN=$2 shift 2 ;; -T) TAILLE_MAX=$2 shift 2 ;; -p) PAS=$2 shift 2 ;; -l) LARGEUR=$2 shift 2 ;; --) shift break ;; *) echo "paramètres non valides" 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" "vitesse" 1300 VITESSE=$VALEUR echo -e "vitesse=$VITESSE" verification "$TAILLE_MIN" "taille_min" 0.1 TAILLE_MIN=$VALEUR echo -e "taille_min=$TAILLE_MIN" verification "$TAILLE_MAX" "taille_max" 1 TAILLE_MAX=$VALEUR echo -e "taille_max=$TAILLE_MAX" verification "$PAS" "pas" 0.1 PAS=$VALEUR echo -e "pas=$PAS" verification "$LARGEUR" "largeur" 100 LARGEUR=$VALEUR echo -e "largeur=$LARGEURS" #Pour que seq renvoie des nombre avec '.' et non ',' il faut : LANG=en_US largeur_carre=$(echo "scale=1; $LARGEUR/16.0" | bc) demi_largeur_carre=$(echo "scale=1; $LARGEUR/32.0" | bc) hauteur_reelle=0 echo -e "$largeur_carre ; $demi_largeur_carre" #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 echo -e "G1 F$VITESSE\n" >> sortie.gcode for taille in `seq $TAILLE_MIN $PAS $TAILLE_MAX` do #génération du GCode pour noter la taille openscad -o temp.dxf -D 'valeur="'$taille'"' temp.scad dxf2gcode temp.dxf -q -e "${taille}.gcode" echo -e "\n;écriture de la taille : $taille\n" >> sortie.gcode cat $taille.gcode >> sortie.gcode rm $taille.gcode echo -e "\n;tracage d'une ligne\n" >> sortie.gcode for hauteur in `seq 0 $DIAMETRE $demi_largeur_carre` do echo -e "\n;ligne numéro : $hauteur\n" >> sortie.gcode #on trace une ligne de $DIAMETRE d'épaisseur en faisant varier la puissance for puissance in `seq 15 15 255` do echo -e "\n;carré de puissance : $puissance\n" >> sortie.gcode trace_ligne_pixel $puissance "X" $largeur_carre $taille 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 trace_ligne_pixel $puissance "X-" $largeur_carre $taille 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_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 exit 0