|
@@ -9,9 +9,10 @@ class BMP2Gcode
|
|
|
{
|
|
|
public:
|
|
|
BMP2Gcode();
|
|
|
- void traitement(std::string nom_fichier);
|
|
|
- int fichier_configuration(std::string conf);
|
|
|
-
|
|
|
+ void traitement(std::string &nom_fichier);
|
|
|
+ int fichier_configuration(std::string &conf);
|
|
|
+ void position_depart(std::string &position);
|
|
|
+
|
|
|
private:
|
|
|
int entete();
|
|
|
int donnees();
|
|
@@ -23,7 +24,7 @@ class BMP2Gcode
|
|
|
unsigned int BMP_largeur, BMP_hauteur, BMP_offset, BMP_profondeur, BMP_taille;
|
|
|
double conf_taille_laser, conf_puissance_min, conf_puissance_max, conf_vitesse, conf_vitesse_max, conf_taille_image, conf_taille_pixel;
|
|
|
std::vector<unsigned int> tab_donnees;
|
|
|
- std::string nom_fichier_bmp;
|
|
|
+ std::string nom_fichier_bmp, pos_depart;
|
|
|
};
|
|
|
|
|
|
BMP2Gcode::BMP2Gcode()
|
|
@@ -33,24 +34,40 @@ conf_vitesse(-1), conf_vitesse_max(-1),
|
|
|
conf_taille_image(-1), conf_taille_pixel(-1)
|
|
|
{}
|
|
|
|
|
|
-void BMP2Gcode::traitement(std::string nom_fichier)
|
|
|
+void BMP2Gcode::traitement(std::string &nom_fichier)
|
|
|
{
|
|
|
- //convertion du fichier et redimensionnement du fichier
|
|
|
- int nbr_pixel_x = conf_taille_image / conf_taille_pixel;
|
|
|
- std::string commande("convert " + nom_fichier + " -resize " + std::to_string(nbr_pixel_x) + " " + nom_fichier + ".bmp");
|
|
|
- system(commande.c_str());
|
|
|
-
|
|
|
- nom_fichier_bmp = nom_fichier + ".bmp";
|
|
|
+ //vérification de l'existance du fichier image
|
|
|
+ std::ifstream fichier_image(nom_fichier);
|
|
|
|
|
|
- if(entete() == 0)
|
|
|
+ //s'il n'existe pas
|
|
|
+ if(!fichier_image)
|
|
|
+ {
|
|
|
+ std::cout << "ATTENTION ! le fichier image n'existe pas" << std::endl;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- if(donnees() == 0)
|
|
|
- {sortie();}
|
|
|
+ //convertion du fichier et redimensionnement du fichier
|
|
|
+ int nbr_pixel_x = conf_taille_image / conf_taille_pixel;
|
|
|
+ std::string commande("convert " + nom_fichier + " -resize " + std::to_string(nbr_pixel_x) + " " + nom_fichier + ".bmp");
|
|
|
+ system(commande.c_str());
|
|
|
+
|
|
|
+ nom_fichier_bmp = nom_fichier + ".bmp";
|
|
|
+
|
|
|
+ if(entete() == 0)
|
|
|
+ {
|
|
|
+ if(donnees() == 0)
|
|
|
+ {sortie();}
|
|
|
+ else
|
|
|
+ {std::cout << "une erreur s'est produite" << std::endl;}
|
|
|
+ }
|
|
|
else
|
|
|
{std::cout << "une erreur s'est produite" << std::endl;}
|
|
|
}
|
|
|
- else
|
|
|
- {std::cout << "une erreur s'est produite" << std::endl;}
|
|
|
+}
|
|
|
+
|
|
|
+void BMP2Gcode::position_depart(std::string &position)
|
|
|
+{
|
|
|
+ pos_depart = position;
|
|
|
}
|
|
|
|
|
|
int BMP2Gcode::entete()
|
|
@@ -207,7 +224,19 @@ int BMP2Gcode::sortie()
|
|
|
|
|
|
//On passe en mode relatif
|
|
|
fichier_sortie << "G91" << std::endl;
|
|
|
-
|
|
|
+
|
|
|
+ //si une position de départ est fournie
|
|
|
+ if(pos_depart == "centrer")
|
|
|
+ {
|
|
|
+ fichier_sortie << "G0 F" << conf_vitesse_max << " X-" << (double)(BMP_largeur * conf_taille_pixel/2.0) << " Y-" << (double)(BMP_hauteur * conf_taille_pixel/2.0) << std::endl;
|
|
|
+ std::cout << "la position de départ sera le centre en X et Y de l'objet" << std::endl;
|
|
|
+ }
|
|
|
+ else if(pos_depart == "centrerX")
|
|
|
+ {
|
|
|
+ fichier_sortie << "G0 F" << conf_vitesse_max << " X-" << (double)(BMP_largeur * conf_taille_pixel/2.0) << std::endl;
|
|
|
+ std::cout << "la position de départ sera le centre en X l'objet" << std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
//on s'assure que le laser est éteint
|
|
|
fichier_sortie << "M106 P1 S0" << std::endl;
|
|
|
|
|
@@ -323,7 +352,7 @@ unsigned int BMP2Gcode::consecutif(unsigned int indice, unsigned int min, unsign
|
|
|
return nbr;
|
|
|
}
|
|
|
|
|
|
-int BMP2Gcode::fichier_configuration(std::string conf)
|
|
|
+int BMP2Gcode::fichier_configuration(std::string &conf)
|
|
|
{
|
|
|
int nbr_parametres = 0;
|
|
|
//On regarde si le fichier de configuration existe déjà
|
|
@@ -334,7 +363,11 @@ int BMP2Gcode::fichier_configuration(std::string conf)
|
|
|
{
|
|
|
//alors on le crée
|
|
|
std::ofstream fichier_conf;
|
|
|
- fichier_conf.open(conf);
|
|
|
+ if(conf.empty())
|
|
|
+ {fichier_conf.open("laser.conf");}
|
|
|
+ else
|
|
|
+ {fichier_conf.open(conf);}
|
|
|
+
|
|
|
fichier_conf << "taille_laser(mm) 0.2" << std::endl;
|
|
|
fichier_conf << "puissance_min 0" << std::endl;
|
|
|
fichier_conf << "puissance_max 255" << std::endl;
|
|
@@ -390,43 +423,43 @@ int BMP2Gcode::fichier_configuration(std::string conf)
|
|
|
//vérification des paramètres
|
|
|
if(conf_taille_laser == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La taille du laser n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La taille du laser n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
|
if(conf_puissance_min == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La puissance minimale du laser n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La puissance minimale du laser n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
|
if(conf_puissance_max == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La puissance maximale du laser n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La puissance maximale du laser n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
|
if(conf_vitesse == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La vitesse du laser n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La vitesse du laser n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
|
if(conf_vitesse_max == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La vitesse maximale du laser n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La vitesse maximale du laser n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
|
if(conf_taille_image == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La taille de l'image n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La taille de l'image n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
|
if(conf_taille_pixel == -1)
|
|
|
{
|
|
|
- std::cout << "ATTENTION ! La taille du pixel n'a pas été fournie" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! La taille du pixel n'a pas été fourni" << std::endl;
|
|
|
return 3;
|
|
|
}
|
|
|
|
|
@@ -447,62 +480,53 @@ int BMP2Gcode::fichier_configuration(std::string conf)
|
|
|
void aide()
|
|
|
{
|
|
|
std::cout << "Ce programme permet de générer une fichier gcode à partir d'une image." << std::endl;
|
|
|
- std::cout << "Pour fonctionner il nécessite imagemagik afin de convertir et redimensionner les images." << std::endl;
|
|
|
+ std::cout << "Pour fonctionner il nécessite imagemagik afin de convertir et redimensionner les images" << std::endl;
|
|
|
+ std::cout << std::endl;
|
|
|
std::cout << "Les options :" << std::endl;
|
|
|
- std::cout << "-h\t--help\taffiche cette aide" << std::endl;
|
|
|
- std::cout << "-c\t\tpour préciser le fichier de configuration" << std::endl;
|
|
|
- std::cout << "-i\t\tpour préciser l'image à traiter" << std::endl;
|
|
|
+ std::cout << "-h\taffiche cette aide" << std::endl;
|
|
|
+ std::cout << "-c\tpour préciser le fichier de configuration" << std::endl;
|
|
|
+ std::cout << "-i\tpour préciser l'image à traiter" << std::endl;
|
|
|
+ std::cout << "-p\tpour préciser la position de départ (centrer pour centrer en X et Y, centrerX pour uniquement centrer sur X)" << std::endl;
|
|
|
}
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
|
{
|
|
|
+ std::string conf, fichier, position;
|
|
|
+
|
|
|
//Il est nécessaire d'avoir au moins 3 arguments
|
|
|
if(argc >= 3)
|
|
|
{
|
|
|
//On cherche la position des arguments
|
|
|
int position_c = -1, position_i = -1;
|
|
|
|
|
|
- for(int i = 0 ; i < argc ; i++)
|
|
|
+ for(int i = 0 ; i < (argc - 1) ; i++) //on ne va pas jusqu'au bout car chaque option nécessite un paramètre
|
|
|
{
|
|
|
+ //ici on récupère le nom du fichier de configuration placé après l'option -c
|
|
|
if(std::string(argv[i]) == "-c")
|
|
|
- {position_c = i;}
|
|
|
-
|
|
|
+ {conf = argv[i + 1];}
|
|
|
+
|
|
|
if(std::string(argv[i]) == "-i")
|
|
|
- {position_i = i;}
|
|
|
- }
|
|
|
+ {fichier = argv[i + 1];}
|
|
|
|
|
|
- //On vérifie que les positions sont cohérentes
|
|
|
- if(position_c == argc || position_i == argc || abs(position_c - position_i) < 2)
|
|
|
- {
|
|
|
- std::cout << "argument manquant\n" << std::endl;
|
|
|
- aide();
|
|
|
- return 1;
|
|
|
+ if(std::string(argv[i]) == "-p")
|
|
|
+ {position = argv[i + 1];}
|
|
|
}
|
|
|
|
|
|
- //si on arrive ici c'est que des arguments ont été fournis
|
|
|
- //On va donc les récupérer
|
|
|
- std::string conf, fichier;
|
|
|
-
|
|
|
- if(position_c > 0)
|
|
|
- {conf = argv[position_c + 1];}
|
|
|
-
|
|
|
- if(position_i > 0)
|
|
|
- {fichier = argv[position_i + 1];}
|
|
|
+ /*2 fichiers sont nécessaire,
|
|
|
+ le fichier de configuration et le fichier image,
|
|
|
+ on vérifie donc qu'ils aient été fourni*/
|
|
|
|
|
|
- std::cout << "fichier image : " << fichier << std::endl;
|
|
|
-
|
|
|
- //on vérifie qu'il y a bien un fichier image
|
|
|
- //s'il n'existe pas
|
|
|
- std::ifstream fichier_image(fichier);
|
|
|
- if (!fichier_image)
|
|
|
+ if(fichier.empty())
|
|
|
{
|
|
|
- // read away
|
|
|
- std::cout << "Le fichier image n'existe pas" << std::endl;
|
|
|
+ std::cout << "ATTENTION ! Le fichier image n'a pas été fourni" << std::endl;
|
|
|
+ std::cout << std::endl;
|
|
|
+ aide();
|
|
|
return 2;
|
|
|
}
|
|
|
|
|
|
BMP2Gcode image;
|
|
|
-
|
|
|
+
|
|
|
+ image.position_depart(position);
|
|
|
if(image.fichier_configuration(conf) != 0)
|
|
|
{return 3;}
|
|
|
image.traitement(fichier);
|