|
@@ -0,0 +1,174 @@
|
|
|
|
+#!/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
|