/*
Gerber
Programme écrit par Silicium628
ce logiciel est libre et open source
*/
/**
Si le programme ne se lance pas (plante au démarrage), effacer le fichier ~home/.cnc_gerber/cnc_gerber.ini
qui a sans doute été corrompu par un autre programme.
*/
#include "mainwindow.h"
#include "math.h"
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QDebug>
#include "boutonled.cpp"
#include "qled.cpp"
#include <QMessageBox>
#include <QTextCodec>
#include <QTimer>
#include <stdlib.h> /* atoi */
#include <QScrollBar>
#include <QProcess>
// #include <QMouseEvent>
QString version = "23.5";
QColor couleur_ecran = QColor::fromRgb(0x002020); // 0x001A00
QColor couleur_piste1 = QColor::fromRgb(0x147E00); // non flashée1 0xF57900
QColor couleur_piste2 = QColor::fromRgb(0x999999); // non flashée2
QColor couleur_pisteT = QColor::fromRgb(0x1E90FF); // en cours de tracé
QColor couleur_pisteC = QColor::fromRgb(0x179CFF); // flashée
QColor couleur_pastille1 = QColor::fromRgb(0xFCE94F);// non flashée
QColor couleur_pastilleT = QColor::fromRgb(0x1E90FF); // en cours de tracé
QColor couleur_pastilleC = QColor::fromRgb(0x179CFF); // flashée
QColor couleur_fait = QColor::fromRgb(255, 0, 0, 255);
QColor couleur_envoye = QColor::fromRgb(0, 100, 0, 255);
QColor couleur_pointage = QColor::fromRgb(0x1B85FF);
QColor couleur_milieu = QColor::fromRgb(255, 0, 0, 255);
QColor couleur_DT = QColor::fromRgb(0, 255, 0, 255);
QColor couleur_trou = QColor::fromRgb(0, 0, 0, 255);
QColor couleur_texte = QColor::fromRgb(255, 255, 255, 255);
QColor couleur_erreur = QColor::fromRgb(255, 255, 100, 255);
QBrush brush_pastille;
QBrush brush_milieu;
QBrush brush_DT;
QBrush brush_trou;
QPen pen_piste(couleur_piste1, 2, Qt::SolidLine);
QPen pen_pastille(couleur_pastille1, 1, Qt::SolidLine);
QPen pen_trou(couleur_trou, 1, Qt::SolidLine);
QPen pen_pointage(couleur_pointage, 1, Qt::SolidLine);
QPen pen_milieu(couleur_milieu, 1, Qt::SolidLine);
QPen pen_DT(couleur_DT, 1, Qt::SolidLine);
int x_scene, y_scene;
int memo_x, memo_y;
QStringList liste_gerber1;
QList <Aperture> liste_apertures; //<aperture> désigne une structure déclarée dans le mainwindow.h
QList <Element> liste_elements; // tous types confondus, segments et pastilles
QList <Element> liste_elements_tries;
QList <Element> liste_pastilles; // en vue de les "creuser" logiciellement (ici) en raccourcissant les segments qui y aboutissent
QList <Element> liste_segments;
QList <Element> liste_trous;
//QString dir_gerber;
QString fileName_en_cours;
QStringList liste_log;
QString s_type;
QString s_format;
quint8 num_ap_use; // numéro de l'aperture en service lors de la phase de traçage
QString s_aperture_use; // même chose en texte (D10, D11... etc)
quint16 num_ligne_en_cours1;
quint16 num_ligne_en_cours3;
quint16 num_ligne3;
quint16 nb_lignes_envoyees =0;
quint16 i_dess_tri;
quint16 nb_erreurs =0;
quint16 nb_pistes_nulles; // décrivant des déplacements ou des tracés de pste de longueur = 0
quint16 nb_corrections =0;
quint16 num_element_proche_en_cours =0;
float zoom;
float ech;
qint16 Xcent, Ycent; // en 1/100 mm
qint16 memo_X, memo_Y;
QPointF pos_actuelle;
qint16 X_max =0; // coordonné X max la plus grande parmis toutes celles de tous les éléments du circuit (servira à faire un miroir_x)
qint16 Y_max =0; // coordonné Y max la plus grande parmis toutes celles de tous les éléments du circuit
quint8 connect_ok =0;
quint8 recu_PRET =0;
quint8 flashage_en_cours = 0;
quint8 simulation = 0;
quint8 laser_on = 0; // allumage du laser en continu. POURS TESTS SEULEMENT !
quint8 laser_bloque = 0; // empêche l'allumage du laser si =1 ; pour tests déplacements laser éteint
quint8 trace_aspect_reel;
quint8 findecourse = 0;
quint8 miroir=0;
quint8 pastilles_creuses=0;
char buffer[100];
QString msg ="";
int pourcent = 0;
QList <int> annonces_faites;
QString port_usb_name;
qreal sqr(qreal r1)
{
return r1 * r1;
}
QString valeur2txt4(int v1)
{
QString s;
s.setNum(v1); // conversion num -> txt
s = "0000"+s;
s = s.right(4);
return s;
}
QString valeur2txt2(int v1)
{
QString s;
s.setNum(v1); // conversion num -> txt
s = "00"+s;
s = s.right(2);
return s;
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setupUi(this);
setWindowTitle("Gerber Photoplotter v:" + version + " - Silicium628");
// window()->setGeometry(0,0,1279,889);
window()->setGeometry(0,0,1900,900); // -> affchage étendu
textEdit_1->setGeometry(1285,5,595,855);
//Btn_close_Tx1->setGeometry(1247,715,20,20);
Btn_close_Tx1->setGeometry(1855,10,20,20);
Btn_save_log->setGeometry(1780,10,70,20);
scene1 = new SceneCliquable(this);
InitTable3();
InitTable4();
InitTable5();
brush_pastille.setColor(couleur_pastille1);
brush_pastille.setStyle(Qt::SolidPattern);
brush_milieu.setColor(couleur_milieu);
brush_milieu.setStyle(Qt::SolidPattern);
brush_DT.setColor(couleur_DT);
brush_DT.setStyle(Qt::SolidPattern);
brush_trou.setColor(couleur_trou);
brush_trou.setStyle(Qt::SolidPattern);
pen_piste.setCapStyle(Qt::RoundCap); // extrémités des pistes arrondies - voir QPen dans la doc.
// QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
effacer_ecran(); // et crée les groupes héritiers de la scene ainsi que la connexion entre les clics et le slot ici concerné
BoutonLed1 = new QBoutonLed(frame_10);
BoutonLed1->setGeometry(QRect(4, 4, 40, 40));
BoutonLed1->setCouleur(QColor (255,255,0));
connect(BoutonLed1, SIGNAL(toggled(bool)), this, SLOT(on_BoutonLed1_toggled(bool)));
BoutonLed2 = new QBoutonLed(frame_12); // affichage REEL
BoutonLed2->setGeometry(QRect(4, 4, 40, 40));
BoutonLed2->setCouleur(QColor::fromRgb(0xFFFF00));
connect(BoutonLed2, SIGNAL(toggled(bool)), this, SLOT(on_BoutonLed2_toggled(bool)));
trace_aspect_reel=1;
BoutonLed3 = new QBoutonLed(frame_3); // allumage laser
BoutonLed3->setGeometry(QRect(4, 4, 40, 40));
BoutonLed3->setCouleur(QColor::fromRgb(0x1E90FF));
connect(BoutonLed3, SIGNAL(toggled(bool)), this, SLOT(on_BoutonLed3_toggled(bool)));
BoutonLed4 = new QBoutonLed(frame_17); // blocage laser
BoutonLed4->setGeometry(QRect(4, 4, 40, 40));
BoutonLed4->setCouleur(QColor::fromRgb(0xFF0000));
connect(BoutonLed4, SIGNAL(toggled(bool)), this, SLOT(on_BoutonLed4_toggled(bool)));
Led0 = new QLed(frame1); // Connexion USB ; verte = ok ; rouge = impossible
Led0->setForme(1);
Led0->setGeometry(QRect(4, 4, 40, 40));
Led0->setCouleur(QColor (0,255,0));
Led0->setEtat(0);
//=======================================================================================
// jaune = Connexion USB établie, attente message bienvenue ; verte message "ATMEGA" reçu
Led1 = new QLed(frame_4);
Led1->setForme(1);
Led1->setGeometry(QRect(4, 4, 40, 40));
Led1->setCouleur(QColor (255,255,0));
Led1->setEtat(0);
//=======================================================================================
// envoi commande par USB ; jaune = message envoyé - verte = reçu réponse ("PRET")
Led2 = new QLed(frame_6);
Led2->setForme(1);
Led2->setGeometry(QRect(4, 4, 40, 40));
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(0);
//=======================================================================================
// VERTE ; allumée (verte) = flashage en cours
Led3 = new QLed(frame_7);
Led3->setForme(1);
Led3->setGeometry(QRect(4, 4, 40, 40));
Led3->setCouleur(QColor (0,255,0)); // VERTE
Led3->setEtat(0);
//=======================================================================================
// ROUGE, ronde ; allumée = FIN DE COURSE ACTIF !
Led4 = new QLed(frame_11);
Led4->setForme(2); // ronde
Led4->setGeometry(QRect(4, 4, 40, 40));
Led4->setCouleur(QColor (255,0,0)); // ROUGE
Led4->setEtat(0);
//=======================================================================================
/**
Led5 = new QLed(frame_18);
Led5->setForme(1);
Led5->setGeometry(QRect(2, 2, 20, 20));
Led5->setCouleur(QColor (255,255,0));
Led5->setEtat(0);
**/
//=======================================================================================
Timer1 = new QTimer(this);
connect(Timer1, SIGNAL(timeout()), this, SLOT(Timer1_clic()));
Timer2 = new QTimer(this);
connect(Timer2, SIGNAL(timeout()), this, SLOT(Timer2_clic()));
Timer3 = new QTimer(this);
connect(Timer3, SIGNAL(timeout()), this, SLOT(Timer3_clic()));
memo_X =0;
memo_Y =0;
num_ligne_en_cours1 = 0;
spinBox_zoom2->setValue(5);
// QString filename = "./Fichiers_gerber/attenuateur-F_Cu.gtl";
// QString filename = "./Fichiers_gerber/largeur_pistes-B_Cu.gbl";
fileName_en_cours = "./Fichiers_gerber/largeur_pistes-F_Cu.gtl";
lecture_fichier_init();
lineEdit_6->setText(fileName_en_cours);
int result = lire_fichier_gerber(fileName_en_cours);
if (result == 0)
{
analyse_fichier_gerber();
//tout_decliquer();
//dessiner_liste_elements_tries();
classer_auto();
trace_liste_apertures();
on_BoutonLed2_toggled(true);
BoutonLed2->setChecked(true);
}
BoutonLed4->setChecked(1);
// pardéfaut :
// port_usb_name="ttyUSB0";
efface_buffer();
port_usb_name="ttyACM0";
actionConnexion->setText("Connexion_ttyACM0");
}
MainWindow::~MainWindow()
{
}
void MainWindow::InitTable3()
{
QStringList liste_entetes;
tableWidget_3->clear();
liste_entetes <<"CMD"<<"longueur";
tableWidget_3->setHorizontalHeaderLabels (liste_entetes);
tableWidget_3->setColumnCount(2);
tableWidget_3->setRowCount(1);
}
void MainWindow::InitTable4()
{
QStringList liste_entetes;
liste_entetes <<"CMD";
tableWidget_4->clear();
tableWidget_4->setColumnCount(2);
tableWidget_4->setRowCount(0);
tableWidget_4->setHorizontalHeaderLabels (liste_entetes);
}
void MainWindow::InitTable5()
{
QStringList liste_entetes;
tableWidget_5->clear();
tableWidget_5->setColumnCount(2);
tableWidget_5->setRowCount(0);
tableWidget_5->setHorizontalHeaderLabels (liste_entetes);
}
void MainWindow::effacer_ecran()
{
scene1->clear();
scene1 = new SceneCliquable(this);
connect(scene1, SIGNAL(envoiPosition(int, int) ), this, SLOT (onReceptPos(int, int) ));
connect(scene1, SIGNAL(envoiMove(int, int) ), this, SLOT (onReceptMove(int, int) ));
scene1->setBackgroundBrush(couleur_ecran);
scene1->setSceneRect(-800,-1200,2000,2000); // plus grand que la partie affichée
graphicsView1->setScene(scene1);
graphicsView1->setGeometry(5,10,896,510); // POSITION et dimensions de l'écran
graphicsView1->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
groupe_trace = new QGraphicsItemGroup();
scene1->addItem(groupe_trace);
groupe_segments_faits = new QGraphicsItemGroup();
scene1->addItem(groupe_segments_faits);
groupe_pastilles_faites = new QGraphicsItemGroup();
scene1->addItem(groupe_pastilles_faites);
groupe_pointage = new QGraphicsItemGroup();
scene1->addItem(groupe_pointage);
groupe_trous = new QGraphicsItemGroup();
scene1->addItem(groupe_trous);
}
void MainWindow::effacer_pointage()
{
foreach( QGraphicsItem *item, groupe_pointage->childItems() )
{
delete item;
}
}
void MainWindow::lecture_fichier_init()
{
QString line, tx1, tx2;
int p2;
tx1 = "";
QFile file1(QDir::homePath() + "/.cnc_gerber/cnc_gerber.ini");
if (file1.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&file1);
in.reset();
while ( !in.atEnd() )
{
line = in.readLine();
if (line.left(1) !="#")
{
if (line.indexOf("fileName_en_cours") != -1)
{
if ( (p2 = line.indexOf('=')) != -1)
{
line.remove(0,p2+1);
fileName_en_cours = line;
}
}
}
}
file1.close();
} else { fileName_en_cours = ""; tx1 = "fichier .ini non trouve, ce n'est pas grave !"; }
if (tx1 !="")
{
QMessageBox msgBox;
msgBox.setText(tx1);
msgBox.exec();
}
// statusBar1->showMessage(tx1 + " "+ tx2);
}
void MainWindow::enregistrer_fichier_init()
{
QDir dossierIni(QDir::homePath() + "/.cnc_gerber/");
if (!dossierIni.exists())
{
QMessageBox msgBox;
msgBox.setText("Le repertoire : ~/" + dossierIni.dirName() + " n'existe pas, je vais le creer, et y placer le fichier de configuration 'cnc_gerber.ini' ");
msgBox.exec();
QDir dossierPerso(QDir::homePath());
dossierPerso.mkdir(".cnc_gerber");
}
QFile file1(QDir::homePath() + "/.cnc_gerber/cnc_gerber.ini");
if (file1.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file1);
QString V;
out << "# les lignes commençant par # sont ignorees";
out << '\n';
out << "# Ce fichier est genere automatiquement par le programme";
out << '\n';
out << "#";
out << '\n';
out << "fileName_en_cours=" << fileName_en_cours;
out << '\n';
}
file1.close();
}
int MainWindow::lire_fichier_gerber(QString nom_fichier1)
{
QFile file1(nom_fichier1);
if( !file1.exists() )
{
qDebug() << "Le fichier n'existe pas.";
return 1;
}
QString s1;
liste_gerber1.clear();
listWidget_1->clear();
if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
QTextStream in1(&file1);
int num_ligne = 0;
while ( !in1.atEnd() )
{
num_ligne++;
s1.setNum(num_ligne);// conversion num -> txt
QString line_i = in1.readLine();
listWidget_1->addItem(s1+": "+line_i);
liste_gerber1 << line_i;
}
file1.close();
checkBox_creuser->setChecked(false);
checkBox_miroir->setChecked(false);
return 0;
}
void MainWindow::pointer(int i)
{ // à l'écran
QPoint M;
Element element_i;
element_i = liste_elements_tries[i];
M = element_i.M;
effacer_pointage();
M.setY(-M.y());// symétrie verticale
M /= ech;
// trace ligne verticale
QGraphicsLineItem *segment_pointage1 = new QGraphicsLineItem(groupe_pointage);
segment_pointage1->setPen(pen_pointage);
segment_pointage1->setLine(M.x()+1, -1000, M.x()+1, 1000); // le '+1' évite de masquer la couleur de l'élément pointé si très fin (=1 pixel)
// trace ligne horizontale
QGraphicsLineItem *segment_pointage2 = new QGraphicsLineItem(groupe_pointage);
segment_pointage2->setPen(pen_pointage);
segment_pointage2->setLine(-1000, M.y()+1, 1000, M.y()+1);
}
void MainWindow::tracer_mire_origine()
{ // à l'écran
QPoint P;
P.setX(0);
P.setY(0);
P /= ech;
QGraphicsLineItem *segment_pointage1 = new QGraphicsLineItem(groupe_pointage);
segment_pointage1->setPen(pen_pointage);
segment_pointage1->setLine(P.x()-10, P.x()-10, P.x()+10, P.x()+10);
QGraphicsLineItem *segment_pointage2 = new QGraphicsLineItem(groupe_pointage);
segment_pointage2->setPen(pen_pointage);
segment_pointage2->setLine(P.x()-10, P.x()+10, P.x()+10, P.x()-10);
tracer_texte(-20, -20, " (x=0; y=0)");
QString S1, S2;
S1 = "Unités du fichier Gerber = ";
S2="";
if (s_type == "IN"){S2 = "pouces"; }
if (s_type == "MM"){S2 = "mm"; }
S1 += S2;
tracer_texte(-20, -300, S1);
S1 = "Format des nombres décimaux = " + s_format + " soit : ";
S2=s_format[0];
S2 += " digits unités +";
S2 += s_format[1];
S2 += " décimales" ;
S1 += S2;
tracer_texte(-20, -600, S1);
}
void MainWindow::tracer_segment(QPoint A, QPoint B, qreal largeur, QColor couleur_i, QGraphicsItemGroup *groupe_i )
{ // à l'écran
QPoint M; // milieu
QPoint DT; // deux tiers
QLine SEG;
A.setY(-A.y());// symétrie verticale
B.setY(-B.y());
A /= ech;
B /= ech;
SEG.setPoints(A,B);
M.setX((A.x()+B.x())/2);
M.setY((A.y()+B.y())/2);
DT.setX( A.x()/3 + 2*B.x()/3 );
DT.setY( A.y()/3 + 2*B.y()/3 );
largeur /= ech;
if (largeur <1) {largeur = 1;}
QGraphicsLineItem *segment_trace = new QGraphicsLineItem(groupe_i);
pen_piste.setWidth(largeur);
pen_piste.setColor(couleur_i);
segment_trace->setPen(pen_piste);
segment_trace->setLine (SEG );
QGraphicsEllipseItem *ellipse1 = new QGraphicsEllipseItem (groupe_i); // repere de selection au centre du segment
pen_piste.setWidth(1);
ellipse1->setPen(pen_milieu);
ellipse1->setBrush(brush_milieu);
ellipse1->setRect(M.x()-1, M.y()-1, 2, 2);
QGraphicsEllipseItem *ellipse2 = new QGraphicsEllipseItem (groupe_i); // repere au 2/3 du segment
pen_piste.setWidth(1);
ellipse2->setPen(pen_DT);
ellipse2->setBrush(brush_DT);
ellipse2->setRect(DT.x()-1, DT.y()-1, 2, 2);
}
void MainWindow::tracer_pastille_rectangulaire(QPoint A, QPoint B, QColor couleur_i, QGraphicsItemGroup *groupe_i)
{ // à l'écran
// A est le coin en bas à gauche, B est le coin en haut à droite
qreal w, h;
qreal n;
qreal x1, y1, x2, y2;
qreal largeur_trait, d;
A.setY(-A.y());// symétrie verticale
B.setY(-B.y());
A /= ech;
B /= ech;
w = (A-B).x(); // largeur pastille
h = (A-B).y(); // hauteur
if(trace_aspect_reel == 0)
{
QGraphicsRectItem *rectangle = new QGraphicsRectItem(groupe_i);
brush_pastille.setColor(couleur_i);
rectangle->setBrush(brush_pastille);
rectangle->setRect(A.x()-w/2, A.y()-h/2, w, h);
}
if(trace_aspect_reel == 1)
{
largeur_trait = 10; // à transmettre par paramètre...
largeur_trait /= ech;
pen_piste.setWidth(largeur_trait);
pen_piste.setColor(couleur_i);
n=0.5;
int stop =0;
while ((n<6) && (stop == 0))
{
d= 2 * n * largeur_trait;
if (d > (-w/2) || d > (h/2)) {stop =1;}
//---------------------------------------------------------------------------------
x1=A.x()-w/2 - d;
y1=A.y()-h/2 + d;
x2=A.x()+w/2 + d;
y2=A.y()-h/2 + d;
QGraphicsLineItem *segment_trace1 = new QGraphicsLineItem(groupe_i);
segment_trace1->setPen(pen_piste);
segment_trace1->setLine (x1,y1,x2,y2);
//---------------------------------------------------------------------------------
x1=A.x()+w/2 + d;
y1=A.y()-h/2 + d;
x2=A.x()+w/2 + d;
y2=A.y()+h/2 - d;
QGraphicsLineItem *segment_trace2 = new QGraphicsLineItem(groupe_i);
segment_trace2->setPen(pen_piste);
segment_trace2->setLine (x1,y1,x2,y2);
//---------------------------------------------------------------------------------
x1=A.x()+w/2 + d;
y1=A.y()+h/2 - d;
x2=A.x()-w/2 - d;
y2=A.y()+h/2 - d;
QGraphicsLineItem *segment_trace3 = new QGraphicsLineItem(groupe_i);
segment_trace3->setPen(pen_piste);
segment_trace3->setLine (x1,y1,x2,y2);
//---------------------------------------------------------------------------------
x1=A.x()-w/2 - d;
y1=A.y()+h/2 - d;
x2=A.x()-w/2 - d;
y2=A.y()-h/2 + d;
QGraphicsLineItem *segment_trace4 = new QGraphicsLineItem(groupe_i);
segment_trace4->setPen(pen_piste);
segment_trace4->setLine (x1,y1,x2,y2);
n++;
}
}
}
void MainWindow::tracer_trou(QPoint A, quint16 diametre)
{ // à l'écran
qreal x, y;
A.setY(-A.y());// symétrie verticale
A /= ech;
x=A.x();
y=A.y();
diametre /= ech;
QGraphicsEllipseItem *ellipse1 = new QGraphicsEllipseItem (groupe_trous); // PASTILLE
ellipse1->setBrush(brush_trou);
ellipse1->setRect(x-diametre/2, y-diametre/2, diametre, diametre);
}
void MainWindow::tracer_pastille_ronde(QPoint A, QPoint B, QColor couleur_i, QGraphicsItemGroup *groupe_i)
{ // à l'écran
qreal w, h;
qreal n;
qreal x, y;
qreal largeur_trait, d, rt;
rt = 80 / ech; // rayon du trou
A.setY(-A.y());// symétrie verticale
B.setY(-B.y());// symétrie verticale
A /= ech;
B /= ech;
w = A.x()-B.x();
h = A.y()-B.y();
if (h<(100/ech)) {rt=0;} // ne pas percer les très petites pastilles qui sont des raccordements de pistes
brush_pastille.setColor(couleur_i);
if(trace_aspect_reel == 0)
{
// trace un disque plein
QGraphicsEllipseItem *ellipse1 = new QGraphicsEllipseItem (groupe_i); // PASTILLE
ellipse1->setBrush(brush_pastille);
x=A.x()-w/2;
y=A.y()-h/2;
ellipse1->setRect(x, y, w, h);
}
if(trace_aspect_reel == 1)
{
// trace des cercles concentriques avec l'épaisseur de la plume
largeur_trait = 10; // à transmettre par paramètre...
largeur_trait /= ech;
pen_piste.setWidth(largeur_trait);
pen_piste.setColor(couleur_i);
n=0.5;
int stop =0;
while ((n<12) && (stop == 0))
{
d= 2.5 * n * largeur_trait;
// if (d > (-w/2) || d > (h/2)) {stop =1;}
if ((h-d) < rt ) {stop =1;}
//---------------------------------------------------------------------------------
QGraphicsEllipseItem *ellipse1 = new QGraphicsEllipseItem ();
ellipse1->setPen(pen_piste);
x=A.x()-w/2;
y=A.y()-h/2;
ellipse1->setRect(x-d/2, y+d/2, w+d, h-d);
groupe_i->addToGroup(ellipse1);
//---------------------------------------------------------------------------------
n++;
}
}
}
void MainWindow::tracer_texte(int x, int y, QString texte_i)
{ // à l'écran
y=-y;
x /= ech;
y /= ech;
QGraphicsTextItem *gtexte = new QGraphicsTextItem(groupe_trace);
gtexte->setDefaultTextColor(couleur_texte);
gtexte->setPos(x,y);
gtexte->setPlainText(texte_i);
}
int MainWindow::dessine_1ligne_liste_triee(int i) // dessine à l'écran 1 ligne de la "liste_elements_tries"
{
QColor couleur1;
char sorte_i;
char forme_i;
int clique_i;
QPoint A, B, M, WH; // M : milieu de l'élément
quint8 num_ap, w;
Element element_i;
Aperture aperture_i;
// liste_elements_i = *lst_elm;
int i_max = liste_elements_tries.count();
if (i>i_max) {return 1;}
element_i = liste_elements_tries[i];
sorte_i = element_i.sorte;
clique_i = element_i.clique;
A = element_i.A;
B = element_i.B;
M = element_i.M;
num_ap = element_i.num_aperture-10;
int n_max = liste_apertures.length();
if (num_ap >= n_max) {return 1;}
aperture_i = liste_apertures[num_ap];
WH = aperture_i.WH;
w = WH.x();
forme_i=aperture_i.forme;
if (sorte_i == 'S') // SEGMENT
{
if (clique_i == 0) { couleur1 = couleur_piste1;}; // non tracée
if (clique_i == 1) { couleur1 = couleur_pisteT;} // en cours de traçage
if (clique_i > 1) { couleur1 = couleur_pisteC;} // tracée
tracer_segment(A, B, w, couleur1 , groupe_segments_faits);
}
if (sorte_i == 'P') // PASTILLE
{
if (clique_i == 0) { couleur1 = couleur_pastille1;}
if (clique_i == 1) { couleur1 = couleur_pastilleT;}
if (clique_i > 1) { couleur1 = couleur_pastilleC;}
if (forme_i == 'R') { tracer_pastille_rectangulaire(A, A + WH, couleur1, groupe_pastilles_faites); }
if (forme_i == 'C') { tracer_pastille_ronde(A, A + WH, couleur1, groupe_pastilles_faites); }
}
// s1.setNum(i); // conversion num -> txt
// tracer_texte(Xcent, Ycent, s1);
return 0;
}
void MainWindow::trace_liste_apertures()
{ // à l'écran
Aperture aperture_i;
uint i, i_max, i_max2;
QPoint Ai, Bi;
// int xi, yi, wi, hi;
QString s1, nom_aperture;
i_max = liste_apertures.length();
i_max2 = i_max/2;
int n=0;
for(i=0; i<i_max; i++)
{
aperture_i = liste_apertures[i];
if (i<=i_max2)
{
Ai.setX(-2500);
Ai.setY(500*n);
}
else
{
Ai.setX(-1000);
Ai.setY(500*n);
}
Bi = Ai+aperture_i.WH;
s1.setNum(i+10); // conversion num -> txt
s1="00" + s1;
s1 = s1.right(2);
nom_aperture = "D" + s1;
if (aperture_i.forme == 'R'){ tracer_pastille_rectangulaire(Ai, Bi, QColor::fromRgb(0xE3E300), groupe_trace);}
if (aperture_i.forme == 'C'){ tracer_pastille_ronde(Ai, Bi, QColor::fromRgb(0xE3E300), groupe_trace);}
tracer_texte(Ai.x()+200, Ai.y()+100, nom_aperture);
n++;
if (n>i_max2) {n=0;}
}
}
void MainWindow::dessiner_liste_elements_tries()
{
int i, i_max;
i_max = liste_elements_tries.count();
for (i=0; i<i_max; i++ )
{
dessine_1ligne_liste_triee(i);
}
tracer_mire_origine();
}
int MainWindow::detecte_element_pointe(QPoint P) // par un clic sur le pt milieu d'un élément scene1 (non déjà cliqué)
{
int i, i_max, num_origine, nouveau_num;
qreal distance;
QPointF M;
QString s1, s2;
//int clique_i;
i_max = liste_elements.count();
for (i=0; i<i_max; i++ )
{
//clique_i = liste_elements[i].clique;
M = liste_elements[i].M;
distance = sqrt(sqr(M.x()-P.x()) + sqr(M.y()-P.y()));
if (distance < 50)
{
// qDebug() << "trouvé élément num (TW4): " << i;
liste_elements[i].clique=1;
num_origine = liste_elements[i].num_origine;
nouveau_num = liste_elements[i].nouveau_num;
s1.setNum(num_origine); // conversion num -> txt
s2.setNum(nouveau_num); // conversion num -> txt
lineEdit_5->setText(s1+" - "+s2);
// affiche_liste_elements(); // dans le tableau
// affiche_liste_elements_tries(); // dans le tableau
tableWidget_4->selectRow(num_origine);
tableWidget_5->selectRow(nouveau_num-1);
pointer(nouveau_num-1);
liste_elements_tries[nouveau_num-1].clique =2;
dessine_1ligne_liste_triee(nouveau_num-1); // afin de positionner le pointage sur l'élément cliqué
}
}
return 0;
}
void MainWindow::inverser_element(Element *EL)
{
QPoint PP;
QString s_xa, s_xb, s_ya, s_yb, s_ap, s1;
PP = EL->A;
EL->A = EL->B;
EL->B = PP;
s_xa.setNum(EL->A.x()); // conversion num -> txt
s_xa = "0000"+s_xa;
s_xa = s_xa.right(4);
s_xa = valeur2txt4(EL->A.x());
s_ya = valeur2txt4(EL->A.y());
s_xb = valeur2txt4(EL->B.x());
s_yb = valeur2txt4(EL->B.y());
s_ap = "D" + valeur2txt2(EL->num_aperture);
s1 = "SXA" + s_xa + "YA" + s_ya + "XB" + s_xb + "YB" + s_yb + s_ap;
EL->texte_affichable = s1;
}
quint16 MainWindow::detecte_element_proche()
// source: liste_elements
// destination: liste_elements_tries
{
quint16 i, i_max;
Element EL_ok;
qreal distance1, distance2;
quint16 num_element_proche, nouveau_num;
QPointF ptIa, ptIb;
QPointF D1, D2;
qreal ds_min;
int clique_i;
int a_permuter;
// pos_actuelle = liste_elements[num_element].B; // point d'une des extremités du segment, celle où on se trouve
i_max = liste_elements.count();
ds_min = 1e6;
num_element_proche = 0; // pour retourner 0 si aucune occurence trouvée
a_permuter=0;
for (i=1; i<i_max; i++ ) // attention : 1 et pas 0 ! les numeros d'ordres commencent à 1. (zéro = pas d'élémént trouvé)
{
clique_i = liste_elements[i].clique;
if (clique_i == 0) // on ignore les éléments déjà cliqués
{
ptIa = liste_elements[i].A;
ptIb = liste_elements[i].B;
D1=pos_actuelle-ptIa;
distance1 = sqrt(sqr(D1.x())+sqr(D1.y()));
D2=pos_actuelle-ptIb;
distance2 = sqrt(sqr(D2.x())+sqr(D2.y()));
if ((distance1 < ds_min) )
{// cas(2) le point B(x2,y2) du segment où on se trouve est proche du point A(x1, y1) du segment[i]
ds_min = distance1;
num_element_proche = i;
EL_ok = liste_elements[num_element_proche];
a_permuter=0;
}
if ((distance2 < ds_min) )
{// cas(4) le point B(x2,y2) du segment où on se trouve est proche du point B(x2, y2) du segment[i]
ds_min = distance2;
num_element_proche = i;
EL_ok = liste_elements[num_element_proche];
a_permuter=1;
}
// sachant que les segments seront toujours tracés dans l'ordre A->B, pour les cas (3) et (4) on permute les points A et B du segment[i]
// et vu que l'on se trouve toujours sur le point B à la fin d'un tracé, les cas (1) et (3) ne se présentent pas.
}
}
//qDebug() << num_element_proche +1; // +1 pour correspondre aux num du tableau
//qDebug() << "permuter = " << a_permuter;
if (a_permuter == 1)
{
//qDebug() << "A="<< EL_ok.A << " B=" << EL_ok.B;
//qDebug() << EL_ok.texte_affichable;
inverser_element(&EL_ok);
//qDebug() << "j'ai permuté";
//qDebug() << "A=" << EL_ok.A << " B=" << EL_ok.B;
//qDebug() << EL_ok.texte_affichable;
}
liste_elements[num_element_proche].clique=1;
EL_ok.clique=1;
if(num_element_proche !=0)
{
liste_elements_tries << EL_ok;
nouveau_num = liste_elements_tries.count();
liste_elements[num_element_proche].nouveau_num = nouveau_num;
}
pos_actuelle = EL_ok.B;
/*
affiche_liste_elements(); // dans le tableau
affiche_liste_elements_tries(); // dans le tableau
dessiner_liste_elements(); // sur la scene graphique
*/
// if(num_element_proche !=0) { dessine_1ligne_liste(num_element_proche); } // afin de positionner le pointage sur l'élément cliqué
return num_element_proche; // retournera 0 si aucune occurence trouvée
}
/**
Rappel : différentes lignes de la liste de sortie :
+AP:D11R=X0200Y0045
USE:D12
PX1550Y0851
GX2985Y1080
TX3429Y1334
**/
float convert_unite(float f_i)
{
//entree en inch ( = pouce; 1 pouce = 25.4mm) ou en mm suivant le type de fichier gerber
//resultat en mm
float f2;
f2 =0;
if (s_type == "IN") {f2 = f_i * 25.4; }
if (s_type == "MM") {f2 = f_i;}
return f2;
}
int MainWindow::analyse_1ligne_fichier() // du fichier gerber d'origine
{
/*
D02 moves the current point to the coordinate pair. Nothing is created. This used to be
called a lights-off move.
D01 creates a straight or circular line segment by interpolating from the current point to the
coordinate pair. This used to be called a lights-on move. When region mode is off these
segments are converted to draw or arc objects by stroking them with the current aperture,
see 2.4. When region mode is on these segments form a contour defining a region, see 4.5.
D03 creates a flash object by replicating the current aperture at the coordinate pair.
*/
QString ligne_i, s_X, s_Y, s_D, s_Xcent, s_Ycent, s_val;
QString s1, s2, s3, s_num3, s_aperture, s_ds, s_nb_err;
int p1, p2, p3;
Aperture aperture_i;
int n_max, a, b, c, d, dx, dy, ds;
int imax;
float float_val, float_cent_val;
int row;
n_max= listWidget_1->count();
ligne_i =" ";
if(num_ligne_en_cours1 < n_max-1)
{
listWidget_1->setCurrentRow(num_ligne_en_cours1);
ligne_i = liste_gerber1[num_ligne_en_cours1];
// lecture des paramètres
if ( ligne_i.left(6)==("%FSLAX")) // ce paramètre va définir le format des nombres
{
s_format = ligne_i.mid(6,2); // s_format = "34" ou "45" ou "46"... (par exemple)
qDebug() << "s_format = " << s_format;
}
if ( ligne_i.left(3)==("%MO")) // ce paramètre va définir le type d'unité utilisé, MM->mm ou IN->pouces
{
s_type = ligne_i.mid(3,2); // s_type = "IN" ou "MM"
qDebug() << "s_type = " << s_type;
}
// ================= première partie : constitution de la LISTE DES APERTURES ===========================
//Les dimensions des apertures dans le fichier gerber d'origine sont de la forme :
//0.0787
//c'est une fraction de pouce qu'il faut multiplier par 25.4 pour obtenir des mm.
//puis x par 100 et prendre la partie entière pour obtenir la valeur en centièmes de mm que nous utiliserons exclusivement
//-----------------------------------------------------------------------------------------------
if ( ligne_i.left(4)==("%ADD")) //ajout...
{
s_aperture = ligne_i.mid(4,3); // ex: 10C ou 16R ou 21O (21 + lettre O)
qDebug() << "s_aperture = " << s_aperture;
if ((s_aperture.right(1) == "C") || (s_aperture.right(1) == "P") ) // cercle ou polygone
{
aperture_i.forme = 'C';
s_val = s_aperture.mid(1,2);
p1 = ligne_i.indexOf(",");
p2 = ligne_i.indexOf("*");
s_val = ligne_i.mid(p1+1,p2-p1-1);
float_val = s_val.toFloat(); // conversion txt -> num
float_cent_val =0;
float_cent_val = 100 * convert_unite(float_val); // calcul val en 1/100 mm
s_Xcent = valeur2txt4(round(float_cent_val));
s_Ycent = s_Xcent; //ceci conduit à tracer des cercles et non des ovales (je ne dis pas ellipse puisqu'un cercle EST une ellipse)
s2 = "MX"+s_Xcent+"Y"+s_Ycent+s_aperture;
row = tableWidget_3->rowCount();
tableWidget_3->insertRow(row);
tableWidget_3->setItem(row, 0,new QTableWidgetItem (s2));
tableWidget_3->setItem(row, 1,new QTableWidgetItem ("-"));
tableWidget_3->resizeColumnsToContents();
aperture_i.WH.setX(round(float_cent_val));
aperture_i.WH.setY(round(float_cent_val));
liste_apertures << aperture_i;
}
if ((s_aperture.right(1) == "R") || (s_aperture.right(1) == "O") ) // rectangle ou oblond (ovale)
{
aperture_i.forme = 'R';
s_val = s_aperture.mid(1,2);
p1 = ligne_i.indexOf(","); // pour découpage
p2 = ligne_i.indexOf("X"); // pour découpage
p3 = ligne_i.indexOf("*"); // pour découpage
s_val = ligne_i.mid(p1+1,p2-p1-1); // découpage
float_val = s_val.toFloat(); // conversion txt -> num
float_cent_val = 100 * convert_unite(float_val); // calcul val en 1/100 mm
aperture_i.WH.setX(round(float_cent_val)); // en 1/100 mm et en nombre entier positif
s_Xcent.setNum(round(float_cent_val)); // conversion num -> txt
s_Xcent = "0000"+s_Xcent; // ajout des zéros non significatifs
s_Xcent = s_Xcent.right(4); // forme fixe avec 4 chiffres, dont zéros non sinificatifs devant le cas échéant -> 1234 ou 0056
s_val = ligne_i.mid(p2+1,p3-p2-1);
float_val = s_val.toFloat(); // conversion txt -> num
float_cent_val = 100 * convert_unite(float_val); // calcul val en 1/100 mm
aperture_i.WH.setY(round(float_cent_val));
s_Ycent.setNum(round(float_cent_val)); // conversion num -> txt
s_Ycent = "0000"+s_Ycent;
s_Ycent = s_Ycent.right(4);
s2 = "MX"+s_Xcent+"Y"+s_Ycent+s_aperture; // Le type "R" ou "O" est respecté ici, transmis tel quel
// note : le type "O" sera remplacé par une pastille rectangulaire "R" par le firmware de la carte Mega2560
row = tableWidget_3->rowCount();
tableWidget_3->insertRow(row);
tableWidget_3->setItem(row, 0,new QTableWidgetItem (s2));
tableWidget_3->setItem(row, 1,new QTableWidgetItem ("-"));
tableWidget_3->resizeColumnsToContents();
liste_apertures << aperture_i;
// Note : je pars du principe que les numéros d'aperture commencent à 10 (D10), il n'y a pas de D09 ou D8 etc...
// et se suivent dans l'ordre de la numérotation des entiers naturels lors de leur apparition dans le fichier gerber.
// ce qui permet d'appeller la bonne aperture simplement par sa place dans la Qlist des rectangles (ou dans celle des cercles)
// que nous constituons ici.
}
}
//-----------------------------------------------------------------------------------------------
//======== seconde partie : tracé immédiat à l'écran et constitution de la liste des actions différées (pour la machine)=======================
if ( ligne_i.left(3)==("G54")) // sélection aperture à utiliser pour la version Gerber Fmt 3.4
{
s_aperture = ligne_i.mid(3,3);
num_ap_use=(s_aperture.right(2)).toInt(); // conversion txt -> num ; ATTENTION : num_ap_use est une variable GLOBALE
s_aperture_use = s_aperture; // s_aperture_use est une var globale qui mémo pour util. lors des passages suivant dans cette fonction
}
if ( ligne_i.left(1)==("D")) // sélection aperture à utiliser pour la version Gerber Fmt 4.5
{
s_aperture = ligne_i.mid(0,3);
num_ap_use=(s_aperture.right(2)).toInt(); // conversion txt -> num ; ATTENTION : num_ap_use est une variable GLOBALE
s_aperture_use = s_aperture; // s_aperture_use est une var globale qui mémo pour util. lors des passages suivant dans cette fonction
}
if (ligne_i[0]==('X')) // coordonnées pour effectuer une action (déplacement à vide ou traçage segment, flash piste)
{
//IMPORTANT : Dans kicad, placer le "origin point of drill and place" sur le coin en bas à gauche du circuit avant de créer le fichier gerber.
//Les coordonnées des points dans le fichier gerber d'origine sont de la forme :
/* --------- pour la version %MOIN*% Gerber Fmt 3.4, Leading zero omitted
en pouces
3+4= 7 chiffres
soit :
3 digits in the integer part
4 digits in the fractionnal part
à 14500 il faut donc rajouter 2 chiffres (zéros) au début pour obtenir les 7 chiffres :
0014500
il reste à placer la virgule au bon endroit afin d'obtenir les 3 digits de la partie entière suivie des 4 digits de la partie décimale
0014500 représente donc 001.4500 pouce
il suffit de de prendre le nombre de départ (14500) et de le diviser par 100 pour obtenir la valeur en centièmes de pouces.
------------ pour la version %MOMM*% Gerber Fmt 4.5
en mm
4+5 = 9 chiffres
soit :
4 digits in the integer part
5 digits in the fractionnal part
à 4836714 il faut donc rajouter 2 chiffres (zéros) au début pour obtenir les 9 chiffres :
004836714
il reste à placer la virgule au bon endroit afin d'obtenir les 4 digits de la partie entière suivie des 5 digits de la partie décimale
4836714 représente donc 0048.36714 mm
ce qui montre que 4836714 est la valeur en centmillièmes de mm
il suffit donc en fait de prendre le nombre de départ (4836714) et de le diviser par 100 000 por obtenir la valeur en mm
et comme ce qui nous intéresse c'est la valeur en centièmes de mm,
il suffit de de prendre le nombre de départ (4836714) et de le diviser par 1000 pour obtenir la valeur en centièmes de mm.
*/
memo_X = Xcent;
memo_Y = Ycent;
a = ligne_i.indexOf('X'); // pour découpage
b = ligne_i.indexOf('Y'); // pour découpage
c = ligne_i.indexOf('D'); // pour découpage
d = ligne_i.indexOf('*'); // pour découpage
s_X = ligne_i.mid(a+1,b-a-1); // decoupage1
s_Y = ligne_i.mid(b+1,c-b-1); // decoupage2
s_D = ligne_i.mid(c,d-c); // decoupage3
int FU=0;
FU = s_format.right(1).toInt();
float F2 = pow(10 , FU-2) ; // ici F2 = une puissance de 10
float_val = s_X.toFloat(); // conversion txt -> num
float_cent_val = convert_unite(float_val) / F2; // calcul val en 1/100 mmmm
Xcent = round(float_cent_val);
float_val = s_Y.toFloat(); // conversion txt -> num
float_cent_val = convert_unite(float_val) / F2; // calcul val en 1/100 mmmm
Ycent = round(float_cent_val);
imax = liste_apertures.length();
int i;
i= num_ap_use -10;
if (i<0) {i =0;}
if (i >= imax){i=imax-1;}
aperture_i = liste_apertures[i];
//---------------------------- SEGMENT de piste ----------------------------------
if (s_D == "D01")
{
// tracer_element(memo_X ,memo_Y, Xcent, Ycent, aperture_i.x, groupe_trace);
dx = abs(Xcent-memo_X);
dy = abs(Ycent-memo_Y);
ds = sqrt(dx*dx + dy*dy);
s_ds.setNum(ds); // conversion num -> txt
}
//--------------------------------- DEPLACEMENT ----------------------------------------
if (s_D == "D02")
{
dx = abs(Xcent-memo_X);
dy = abs(Ycent-memo_Y);
ds = sqrt(dx*dx + dy*dy);
s_ds.setNum(ds); // conversion num -> txt
}
//------------------ PASTILLE ("Flash")- -------------------------------------------------
if (s_D == "D03")
{
}
s1 ="-";
if (s_D == "D01") { s1="T";} // TRACE SEGMENT
if (s_D == "D02") { s1="G";} // DEPLACEMENT ("GOTO")
if (s_D == "D03") { s1="P";} // FLASH PASTILLE
s_Xcent.setNum(Xcent);// conversion num -> txt
s_Xcent = "0000"+s_Xcent;
s_Xcent = s_Xcent.right(4);
s_Ycent.setNum(Ycent);
s_Ycent = "0000"+s_Ycent;
s_Ycent = s_Ycent.right(4);
// contrairement au fichier gerber d'origine, les apertures utilisées seront ici précisées pour CHAQUE ligne.
// ceci dans le but de pouvoir ultérieurement déplacer plus facilement les lignes dans le fichier afin d'optimiser le tracé
// (moins de déplacements inutiles de la plume)
s3 = s1+"X"+s_Xcent+"Y"+s_Ycent + s_aperture_use;
row = tableWidget_3->rowCount();
tableWidget_3->insertRow(row);
tableWidget_3->setItem(row, 0,new QTableWidgetItem (s3));
tableWidget_3->setItem(row, 1,new QTableWidgetItem (s_ds));
tableWidget_3->resizeColumnsToContents();
}
}
// scene->addItem(groupe_trace);
return(0);
}
void MainWindow::affiche_liste_elements() // écrit dans le tableau TW4
{
QString ligne_i, s1;
quint16 nouveau_num_i;
int i, i_max, row;
int clique;
i_max = liste_elements.count();
tableWidget_4->clear();
tableWidget_4->setRowCount(0);
for (i=0; i<i_max; i++)
{
clique = liste_elements[i].clique;
nouveau_num_i = liste_elements[i].nouveau_num;
s1.setNum(nouveau_num_i);// conversion num -> txt
ligne_i = liste_elements[i].texte_affichable;
row = tableWidget_4->rowCount();
tableWidget_4->insertRow(row);
tableWidget_4->setItem(row, 0,new QTableWidgetItem (ligne_i));
if (clique == 1) {tableWidget_4->item(row,0)->setBackground(QBrush(QColor::fromRgb(0xFFFFB3)));}
tableWidget_4->setItem(row, 1,new QTableWidgetItem (s1));
tableWidget_4->item(row,1)->setBackground(QBrush(QColor::fromRgb(205, 255, 217)));
}
tableWidget_4->setColumnWidth(0,282);
tableWidget_4->setColumnWidth(1,36);
// tableWidget_4->resizeColumnsToContents();
}
void MainWindow::affiche_liste_elements_tries() // écrit dans le tableau TW5
{
QString ligne_i, s1;
int i, i_max, row;
quint16 num_origine_i;
i_max = liste_elements_tries.count();
s1.setNum(i_max);// conversion num -> txt
lineEdit_7->setText(s1);
tableWidget_5->clear();
tableWidget_5->setRowCount(0);
for (i=0; i<i_max; i++)
{
ligne_i = liste_elements_tries[i].texte_affichable;
num_origine_i = liste_elements_tries[i].num_origine;
s1.setNum(num_origine_i);// conversion num -> txt
row = tableWidget_5->rowCount();
tableWidget_5->insertRow(row);
tableWidget_5->setItem(row, 0,new QTableWidgetItem (ligne_i));
tableWidget_5->setItem(row, 1,new QTableWidgetItem (s1));
tableWidget_5->item(row,1)->setBackground(QBrush(QColor::fromRgb(0xADD8E6)));
}
tableWidget_5->setColumnWidth(0,282);
tableWidget_5->setColumnWidth(1,36);
// tableWidget_5->resizeColumnsToContents();
}
void MainWindow::creation_liste_elements()
{
// source : tableWidget_3 ; destination : tableWidget_4
QString ligne_A, ligne_B, ligne_out;
qint16 xa, ya, xb, yb, n_ap, x_plaque, y_plaque, m;
QString s1, s2, s3, s_xa, s_ya, s_xb, s_yb, s_ap;
Element element_i;
quint16 i;
quint16 num_ordre;
Aperture aperture_i;
X_max =0;
Y_max =0;
int i_max;
num_ordre = 1;
tableWidget_4->setRowCount(1);
InitTable4();
InitTable5();
liste_elements.clear();
liste_elements_tries.clear();
element_i.A.setX(0); element_i.A.setY(0);
element_i.B.setX(0); element_i.B.setY(0);
element_i.clique=0;
element_i.couleur=couleur_piste1;
element_i.M.setX(0); element_i.M.setY(0);
element_i.nouveau_num=0;
element_i.num=0;
element_i.num_aperture=0;
element_i.num_origine=0;
element_i.sorte='S';
element_i.texte_affichable="SXA0000YA0000XB0000YB0000D00";
liste_elements << element_i; // ajoute un element nul à l'adresse 0;
i_max = tableWidget_3->rowCount();
for (i = 0; i< i_max; i++)
{
ligne_A = tableWidget_3->item(i,0)->text();
if ((i+1)<i_max) {ligne_B = tableWidget_3->item(i+1,0)->text();}
//------------------------- AJOUT APERTURE ----------------------------
if ((ligne_A.left(2) == "MX")) //
{
element_i.num_origine = num_ordre;
element_i.sorte='M';
num_ordre++;
s_xa = ligne_A.mid(2,4);
xa = s_xa .toInt(); // conversion txt -> num
s_ya = ligne_A.mid(7,4);
ya = s_ya .toInt();
s_ap = ligne_A.mid(11,4);
qDebug() << "s_ap" << s_ap;
// n_ap = (s_ap.right(2)).toInt();
ligne_out = "MXA" + s_xa + "YA" + s_ya + "XB0000YB0000" + "D" + s_ap; // AJOUT APERTURE
element_i.texte_affichable = ligne_out;
liste_elements << element_i;
//liste_elements_tries << element_i;
//qDebug() << "AP= " << s_ap;
//qDebug() << "ligne_out = " << ligne_out;
}
//------------------------- AJOUT SEGMENT ----------------------------
if (((ligne_A.left(2) == "GX") && (ligne_B.left(2) == "TX"))|| ((ligne_A.left(2) == "TX") && (ligne_B.left(2) == "TX")))
// remarque : il peut y avoir deux lignes "TX" qui se suivent, c'est le cas pour les textes...
// mais dans tous les autres cas, il y a une alternance "GX".."TX" pour les pistes
// en conséquence si on omet la deuxième partie de la condition ci-dessus, les textes (par ex: "EL" ou "CU" seront mal retranscrits)
{
element_i.num_origine = num_ordre;
num_ordre++;
s_xa = ligne_A.mid(2,4);
xa = s_xa .toInt(); // conversion txt -> num
if (X_max < xa) {X_max = xa;}
s_ya = ligne_A.mid(7,4);
ya = s_ya .toInt();
if (Y_max < ya) {Y_max = ya;}
s_xb = ligne_B.mid(2,4);
xb = s_xb .toInt();
s_yb = ligne_B.mid(7,4);
yb = s_yb .toInt();
s_ap = ligne_B.mid(11,3);
n_ap = (s_ap.right(2)).toInt();
ligne_out = "SXA" + s_xa + "YA" + s_ya + "XB" + s_xb + "YB" + s_yb + s_ap; // SEGMENT ; 2 points (extrémités), A et B
element_i.texte_affichable = ligne_out;
element_i.A.setX(xa); element_i.A.setY(ya);
element_i.B.setX(xb); element_i.B.setY(yb);
element_i.M.setX((xa+xb)/2); element_i.M.setY((ya+yb)/2); // point milieu
element_i.num = i;
element_i.num_aperture = n_ap;
element_i.sorte='S'; // =segment
element_i.couleur = couleur_piste1;
element_i.clique = 0;
liste_elements << element_i;
}
//------------------------- AJOUT PASTILLE ----------------------------
if ((ligne_A.left(2) == "PX"))
{
element_i.num_origine = num_ordre;
num_ordre++;
s_xa = ligne_A.mid(2,4);
xa = s_xa .toInt(); // conversion txt -> num
if (X_max < xa) {X_max = xa;}
s_ya = ligne_A.mid(7,4);
ya = s_ya .toInt();
if (Y_max < ya) {Y_max = ya;}
s_ap = ligne_A.mid(11,3);
n_ap = (s_ap.right(2)).toInt();
ligne_out = "PXA" + s_xa + "YA" + s_ya + "xx0000xx0000" + s_ap; //dans le cas d'une pastille, seule la position du point A est définie
element_i.texte_affichable = ligne_out;
element_i.A.setX(xa); element_i.A.setY(ya);
element_i.B.setX(xa); element_i.B.setY(ya);
element_i.M.setX(xa); element_i.M.setY(ya);
element_i.num = i;
element_i.num_aperture = n_ap;
element_i.sorte='P'; // =pastille
element_i.couleur = couleur_pastille1;
element_i.clique = 0;
liste_elements << element_i;
}
}
creation_liste_segments();
creation_liste_trous();
s1.setNum(X_max); //conversion num->txt;
lineEdit_taille_X->setText(s1.left(s1.length()-2)+','+s1.right(2)+"mm");
s1.setNum(Y_max); //conversion num->txt;
lineEdit_taille_Y->setText(s1.left(s1.length()-2)+','+s1.right(2)+"mm");
x_plaque = X_max; //+1000;
m = x_plaque - (x_plaque % 100) + 1000;
s1.setNum(m); //conversion num->txt;
lineEdit_taille_X_2->setText(s1.left(s1.length()-2)+','+s1.right(2)+"mm");
y_plaque = Y_max; //+1000;
m = y_plaque - (y_plaque % 100) + 1000;
s1.setNum(m); //conversion num->txt;
lineEdit_taille_Y_2->setText(s1.left(s1.length()-2)+','+s1.right(2)+"mm");
spinBox_zoom2->setValue(14000 / sqrt(X_max * Y_max));
// qDebug() << "liste_elements[0].num_aperture=" << liste_elements[0].num_aperture;
// qDebug() << "liste_elements[0].texte_affichable=" << liste_elements[0].texte_affichable;
}
void MainWindow::creation_liste_segments()
{
quint16 i, i_max;
Element EL_i;
i_max = liste_elements.count();
for (i=1; i<i_max; i++ ) // attention : 1 et pas 0 ! les numeros d'ordres commencent à 1. (zéro = pas d'élémént trouvé)
{
EL_i = liste_elements[i];
if((EL_i.sorte == 'S' ) )
{
liste_segments << EL_i;
}
}
}
void MainWindow::creation_liste_trous()
{
quint16 n_max;
Element element_i;
quint16 i;
quint8 num_ap;
Aperture aperture_i;
quint16 diametre;
QPoint A;
n_max = liste_elements.count();
for (i=0; i<n_max; i++)
{
element_i = liste_elements[i];
if (element_i.sorte == 'P' ) // pastille (peut être circulaire ou rectangulaire)
{
num_ap = element_i.num_aperture-10;
int n_max = liste_apertures.length();
if (num_ap < n_max)
{
aperture_i = liste_apertures[num_ap];
if (aperture_i.forme == 'C') // pastille circulaire uniquement
{
liste_trous << element_i;
// qDebug() << "i= " << i << "forme=" << "num_ap = " << num_ap+10;
A = element_i.A;
diametre = aperture_i.WH.rx();
diametre /=4;
tracer_trou(A, diametre);
}
}
}
}
}
void MainWindow::inverser_miroir_elements()
{
// source et destination : liste_elements
//inverse tous les éléments suivant l'axe des X. Xmax doit être connu préalablement à l'apper de cette fonction
quint16 n_max;
Element element_i;
quint16 i;
QString sorte_i, s_xa, s_ya, s_xb, s_yb, s_ap, ligne_out;
int xai, xbi;
n_max = liste_elements.count();
for (i=0; i<n_max; i++)
{
element_i = liste_elements[i];
sorte_i = element_i.sorte;
if( (element_i.sorte == 'S' ) || (element_i.sorte == 'P' ) ) // sauf apertures !
{
xai = X_max - element_i.A.x();
element_i.A.setX(xai);
xbi = X_max - element_i.B.x();
element_i.B.setX(xbi);
element_i.M.setX((xai+xbi)/2); // point milieu
s_xa = valeur2txt4(element_i.A.x());
s_ya = valeur2txt4(element_i.A.y());
s_xb = valeur2txt4(element_i.B.x());
s_yb = valeur2txt4(element_i.B.y());
s_ap = "D" + valeur2txt2(element_i.num_aperture);
ligne_out = sorte_i + "XA" + s_xa + "YA" + s_ya + "XB" + s_xb + "YB" + s_yb + s_ap;
element_i.texte_affichable = ligne_out;
liste_elements[i]= element_i;
}
}
}
void MainWindow::efface_buffer()
{
int i;
for(i=0; i<100; i++)
buffer[i] =' ';
//portUSB->flush();
}
void MainWindow::onReadyRead()
{
int nb_Bytes;
QString s1, msg1;
// nb_Bytes = portUSB->bytesAvailable();
//if (nb_Bytes > 30) {nb_Bytes = 30;}
nb_Bytes = portUSB->bytesAvailable();
if (nb_Bytes >99) {nb_Bytes = 99;}
portUSB->read(buffer, nb_Bytes);
buffer[nb_Bytes] = '\0'; // permet de définir la fin du string au bon endroit.
msg += buffer;
if (msg.contains('\n'))
{
msg.remove('\n');
msg.remove('\r');
msg1 ="in = " + msg;
if (msg1.contains("hello"))
{
int p1 = msg1.indexOf("hello");
msg1 = msg1.right(p1);
// textEdit_1->setText("-");
Led0->setCouleur(QColor (0,255,0));
Led1->setCouleur(QColor (0,255,0));
Led1->setEtat(1);
effacer_ecran();
tout_decliquer();
dessiner_liste_elements_tries();
trace_liste_apertures();
}
publier (msg1);
if (msg1.contains("Mega"))
{
publier("-----------------------------------");
}
// textEdit_1->setText(textEdit_1->toPlainText()+'\n'+ "recu : " + msg);
findecourse =0;
Led4->setEtat(0);// éteint la LED fin de course
Timer3->stop();
if((msg[0]=='X') && (msg[6]=='Y') )
{
lineEdit_X->setText( msg.mid(1,3) +"." + msg.mid(4,2) + " mm" );
lineEdit_Y->setText( msg.mid(7,3) +"." + msg.mid(10,2) + " mm" );
}
if (msg.contains("PRET"))
{
recu_PRET=1;
//efface_buffer();
//msg.clear();
Led2->setCouleur(QColor (0,255,0));
Led2->setEtat(1);;
}
if (msg.contains("FINC"))
{
efface_buffer();
findecourse =1;
Led4->setEtat(1);
Timer3->start(300);
msg1 = '\n';
msg1 += "-----------------------------------------------";
msg1 += '\n';
msg1 += "Machine en position FIN DE COURSE -> arrêt forcé ";
msg1 += '\n';
msg1 += "Seule commande valide = GTO origine";
publier (msg1);
}
if ((flashage_en_cours == 1) && (recu_PRET == 1))
{
flash_ligne_suivante();
}
msg="";
}
}
qint8 MainWindow::Connexion(qint8 cnx)
{
msg.clear();
if (cnx == 1)
{
// portUSB = new QextSerialPort("/dev/ttyUSB0", QextSerialPort::EventDriven); // pour Arduino Mega2560 vrai
// portUSB = new QextSerialPort("/dev/ttyACM0", QextSerialPort::EventDriven); // pour Clone SainSmart Mega2560 vrai
portUSB = new QextSerialPort(port_usb_name, QextSerialPort::EventDriven);
portUSB->setBaudRate(BAUD38400); // 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
// check the baud rate on the Arduino since it has to be the same
// as set with Serial.begin(...)
portUSB->setFlowControl(FLOW_OFF);
portUSB->setParity(PAR_NONE);
portUSB->setDataBits(DATA_8);
portUSB->setStopBits(STOP_1);
if(portUSB->open(QIODevice::ReadWrite) == true)
{
connect(portUSB, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(portUSB, SIGNAL(dsrChanged()), this, SLOT(onDsrChanged()));
connect_ok = 1;
msg="";
efface_buffer();
portUSB->flush();
qDebug() << "listening for data on port " << portUSB->portName();
lineEdit_2->setText("attente");
Led1->setCouleur(QColor (255,255,0));
Led1->setEtat(1);
Led0->setCouleur(QColor (255,255,0));
}
else
{
qDebug() << "device failed to open:" << portUSB->errorString();
return (1);
Led1->setEtat(0);
Led2->setEtat(0);
recu_PRET=0;
}
}
else
{
portUSB->close();
}
return(0);
}
void MainWindow::publier(QString msg_i)
{
QString tx2;
tx2 = '\n';
tx2 += msg_i;
textEdit_1->setText(textEdit_1->toPlainText()+tx2);
QScrollBar *SB1 = textEdit_1->verticalScrollBar();
SB1->setValue(SB1->maximum());
liste_log << msg_i;
}
int MainWindow::Envoi_une_ligne()
{
QString ligne_i, s1, s2;
quint16 num_ligne, n_max, pc;
ligne_i ="-";
n_max = tableWidget_5->rowCount();
if (n_max == 0) {return(1);}
num_ligne = tableWidget_5->currentRow();
if (tableWidget_5->currentRow() == -1 ) {return(2);} // évite de planter si aucun élément sélectionné lors de l'appel de cette fonction
ligne_i = tableWidget_5->item(num_ligne,0)->text();
lineEdit_1->setText(ligne_i);
s1.setNum(num_ligne+1); //conversion num->txt; +1 parce que les tableaux sont num depuis 0, alors que les lignes affichés le sont depuis 1
QString msg1;
msg1 = "=========================================================";
msg1 += '\n';
msg1 += "traitement ligne numéro [ " + s1 + " ]";
publier(msg1);
// textEdit_1->setText(textEdit_1->toPlainText()+'\n'+msg);
// QScrollBar *SB1 = textEdit_1->verticalScrollBar();
// SB1->setValue(SB1->maximum());
nb_lignes_envoyees++;
pc = 100 * num_ligne / n_max;
progressBar_1->setValue(pc);
if (pc >= 99) {annonce_vocale(100);}
else if (pc >= 90) {annonce_vocale(90);}
else if (pc >= 80) {annonce_vocale(80);}
else if (pc >= 70) {annonce_vocale(70);}
else if (pc >= 60) {annonce_vocale(60);}
else if (pc >= 50) {annonce_vocale(50);}
else if (pc >= 40) {annonce_vocale(40);}
else if (pc >= 30) {annonce_vocale(30);}
else if (pc >= 20) {annonce_vocale(20);}
else if (pc >= 10) {annonce_vocale(10);}
s2.setNum(nb_lignes_envoyees);
lineEdit_4->setText(s2);
//------------------------------------------------------------
if ( connect_ok == 1 ) // mode NORMAL
{
if( recu_PRET == 1 )
{
if (num_ligne>1)
{
liste_elements_tries[num_ligne-1].clique++; // afin de changer sa couleur
dessine_1ligne_liste_triee(num_ligne-1);
}
pointer(num_ligne); // trace le réticule
liste_elements_tries[num_ligne].clique++;
dessine_1ligne_liste_triee(num_ligne); // afin de changer sa couleur
envoi_vers_Atmega(ligne_i); // ***************** envoi 1 ligne ver ATMEGA **********************
Led1->setCouleur(QColor (255,255,0));
Led1->setEtat(1);
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
// liste_elements_tries[num_ligne].clique = 2;
// dessine_1ligne_liste_triee(num_ligne); // à l'écran
}
else
{
QMessageBox msgBox; msgBox.setText("Occupé"); msgBox.exec();
lineEdit_2->setText("Occupé");
Led1->setEtat(0);
}
}
else
{
QMessageBox msgBox; msgBox.setText("No connect2"); msgBox.exec();
lineEdit_2->setText("no connect2");
Led1->setEtat(0);
}
//num_ligne++;
//if(num_ligne < n_max) { tableWidget_3->setCurrentCell(num_ligne , 1); }
spinBox_depart->setValue(num_ligne+1); //+1 parce que les tableaux sont num depuis 0, alors que les lignes affichés sont depuis 1
return(0);
}
int MainWindow::on_Btn_envoi_clicked()
{
int n_max = tableWidget_5->rowCount();
int num_ligne = tableWidget_5->currentRow();
QString ligne_i = tableWidget_5->item(num_ligne,0)->text();
if(n_max == 0)
{
QString sx = "La liste des éléments classés est vide.\n";
sx +="Vous devez classer les éléments au préalable :\n\n";
sx +="-soit en cliquant sur les points rouges,\n";
sx +="-soit automatiquement.\n";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else
{
QString sx = "Attention : pour un tracé correct\n";
sx +="les apertures (lignes en haut de la liste)\n";
sx +="doivent avoir été transmises au préalable\n";
sx +="à l'Arduino.\n";
QMessageBox::StandardButton mb1;
mb1 = QMessageBox::question(this, "ATTENTION :", sx, QMessageBox::Ok|QMessageBox::Abort);
if (mb1 == QMessageBox::Abort) { return 1; }
envoi_vers_Atmega(ligne_i); // ***************** envoi 1 ligne ver ATMEGA **********************
num_ligne++;
if(num_ligne < n_max) { tableWidget_5->setCurrentCell(num_ligne , 1); }
}
return 0;
}
/*
void MainWindow::on_Btn_TRACER_AUTO_clicked()
{
quint16 num_ligne;
QString s1;
num_ligne = listWidget_1->currentRow();
s1.setNum(num_ligne);// conversion num -> txt
listWidget_4->addItem(s1);
listWidget_4->setCurrentRow(listWidget_4->count());
num_ligne_en_cours1 = num_ligne;
Timer1->start(1);
}
*/
void MainWindow::record_fichier_log(QString dossier1, QString fichier_out)
{
QString ligne_i;
if (!liste_log.isEmpty())
{
QDir dossier_out(QDir::homePath() + "/"+ dossier1);
int nb_lignes;
QFile file1(dossier1 + "/" + fichier_out);
if (file1.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream file_out(&file1);
nb_lignes = liste_log.count();
for (int i=0; i<nb_lignes; i++)
{
file_out << liste_log[i] << char(10);
}
}
file1.close();
}
}
void MainWindow::Timer1_clic() // analyse fichier gerber
{
num_ligne_en_cours1 ++;
analyse_1ligne_fichier();
}
void MainWindow::Timer2_clic() // dessine au ralenti les éléments triés
{
QString s1;
int i_max = liste_elements.count();
if (i_dess_tri < i_max-1 )
{
s1.setNum(i_dess_tri);// conversion num -> txt
lineEdit_3->setText(s1);
liste_elements_tries[i_dess_tri].clique = 1;
dessine_1ligne_liste_triee(i_dess_tri);
tableWidget_5->selectRow(i_dess_tri-1);
i_dess_tri++;
}
else {Timer2->stop();}
}
void MainWindow::Timer3_clic()
{
qDebug() << "Timer3 clic ! ";
// flash_ligne_suivante();
Led4->setEtat(1^Led4->etat());
}
void MainWindow::flash_ligne_suivante()
{
int i, i_max;
i_max = tableWidget_5->rowCount();
if(i_max == 0)
{
QString sx = "La liste des éléments classés est vide.\n";
sx +="Vous devez classer les éléments au préalable :\n\n";
sx +="-soit en cliquant sur les points rouges,\n";
sx +="-soit automatiquement.\n";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
num_ligne_en_cours1 ++;
if(num_ligne_en_cours1 < i_max) { tableWidget_5->setCurrentCell(num_ligne_en_cours1 , 1); }
i = tableWidget_5->currentRow();
if ((num_ligne_en_cours1 < i_max) && (flashage_en_cours == 1) && ((recu_PRET == 1) ) )
{
tableWidget_5->setCurrentCell(i,1);
qDebug() << "flashage_en_cours, ligne " << num_ligne_en_cours1;
Envoi_une_ligne();
}
if (num_ligne_en_cours1 >= i_max)
{
on_Btn_stop_flash_clicked();
QMessageBox msgBox; msgBox.setText("Flashage terminé"); msgBox.exec();
}
}
QString MainWindow::mise_en_forme_ligne_pour_envoi(QString s_i)
{
QString ligne_out;
QString CS;
// calcul checksum de s1 (sans les parties rajoutées "--TRNS:" etc...) -------------
QByteArray caracts; // tableau de caractères
caracts = s_i.toLocal8Bit(); // convertit le string s1 en un tableau de caractères
uint8_t taille = caracts.size();
int8_t n, v;
uint16_t somme =0;
for (n=0; n<taille; n++)
{
v=caracts[n];
somme += v;
}
CS = QString::number(somme);
// ligne_out ="--TRNS:"+ s_i+"-CS=["+CS+']';
ligne_out ="--TRNS:"+ s_i+"-CS=["+CS+"]"+'\n';
return ligne_out;
}
void MainWindow::envoi_vers_Atmega(QString s1) // ok
{
QString ligne_i=mise_en_forme_ligne_pour_envoi(s1);
int Lg = ligne_i.length();
lineEdit_8->setText(ligne_i);
if (connect_ok==1)
{
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
char* s_out = ligne_i.toLocal8Bit().data();
if(connect_ok==1)
{
portUSB->write(s_out, Lg);
label_8->setText("Message envoyé par USB :");
}
msg.clear();
efface_buffer();
QString msg1; // pour affichage dans le EditText_1
msg1 = '\n';
msg1 +="------------------------------------";
msg1 += '\n';
msg1 += "out-> ";
msg1 += ligne_i;
publier(msg1) ;
recu_PRET=0;
}
else { QMessageBox msgBox; msgBox.setText("USB non connecté, ligne non transmise"); msgBox.exec();}
}
void MainWindow::on_Btn_Xplus_clicked()
{
envoi_vers_Atmega("XP");
}
void MainWindow::on_Btn_Xmoins_clicked()
{
envoi_vers_Atmega("XM");
}
void MainWindow::on_Btn_Xplus1mm_clicked()
{
envoi_vers_Atmega("X1");
}
void MainWindow::on_Btn_Xplus10mm_clicked()
{
envoi_vers_Atmega("X2");
}
void MainWindow::on_Btn_Xmoins1mm_clicked()
{
envoi_vers_Atmega("X3");
}
void MainWindow::on_Btn_Xmoins10mm_clicked()
{
envoi_vers_Atmega("X4");
}
void MainWindow::on_Btn_stop_clicked()
{
envoi_vers_Atmega("A");
}
void MainWindow::on_Btn_Yplus_clicked()
{
envoi_vers_Atmega("YP");
}
void MainWindow::on_Btn_Ymoins_clicked()
{
envoi_vers_Atmega("YM");
}
void MainWindow::on_Btn_Yplus1mm_clicked()
{
envoi_vers_Atmega("Y1");
}
void MainWindow::on_Btn_Yplus10mm_clicked()
{
envoi_vers_Atmega("Y2");
}
void MainWindow::on_Btn_Ymoins1mm_clicked()
{
envoi_vers_Atmega("Y3");
}
void MainWindow::on_Btn_Ymoins10mm_clicked()
{
envoi_vers_Atmega("Y4");
}
/*
void MainWindow::on_Btn_Zmoins1mm_clicked()
{
envoi_vers_Atmega("Z1");
}
void MainWindow::on_Btn_Zplus1mm_clicked()
{
envoi_vers_Atmega("Z2");
}
void MainWindow::on_Btn_Zmoins5mm_clicked()
{
envoi_vers_Atmega("Z3");
}
void MainWindow::on_Btn_Zplus5mm_clicked()
{
envoi_vers_Atmega("Z4");
}
*/
void MainWindow::on_Btn_RAZ_pos_clicked()
{
envoi_vers_Atmega("RP");
}
void MainWindow::on_Btn_gotoHome_clicked()
{
QString s_X, s_Y, ligne_i;
qint8 lg;
on_Btn_stop_flash_clicked(); //pour mettre fin au flashage encours éventuel
// listWidget_2->clear();
s_X = doubleSpinBox_X_origine->text();
lg = s_X.length(); if (lg<5) {s_X = "0"+s_X;}
s_X.remove(",");
s_Y = doubleSpinBox_Y_origine->text();
lg = s_Y.length(); if (lg<5) {s_Y = "0"+s_Y;}
s_Y.remove(",");
ligne_i = "GHA" + s_X + "YA" + s_Y;
envoi_vers_Atmega(ligne_i);
}
void MainWindow::on_Btn_gotoSafePos_clicked()
{
on_Btn_stop_flash_clicked(); //pour mettre fin au flashage encours éventuel
envoi_vers_Atmega("GS");
}
void MainWindow::on_Btn_GOTO_clicked()
{
QString s_X, s_Y, ligne_i;
qint8 lg;
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
recu_PRET=0;
s_X = doubleSpinBox_X->text();
lg = s_X.length(); if (lg<5) {s_X = "0"+s_X;}
s_X.remove(",");
s_Y = doubleSpinBox_Y->text();
lg = s_Y.length(); if (lg<5) {s_Y = "0"+s_Y;}
s_Y.remove(",");
ligne_i = "GXA" + s_X + "YA" + s_Y;
envoi_vers_Atmega(ligne_i);
}
/*
void MainWindow::on_Btn_trace1ligne_clicked()
{
qint16 num_ligne;
num_ligne = listWidget_1->currentRow();
num_ligne_en_cours1 = num_ligne;
analyse_1ligne_fichier();
num_ligne_en_cours1 ++;
listWidget_1->setCurrentRow(num_ligne_en_cours1);
}
*/
void MainWindow::on_Btn_R_clicked()
{
doubleSpinBox_X->setValue(0);
doubleSpinBox_Y->setValue(0);
}
/*
void MainWindow::on_Btn_ralentir_clicked()
{
Timer1->stop();
Timer1->start(500);
}
*/
int MainWindow::on_actionOuvrir_triggered()
{
effacer_ecran();
int fich_charge_ok;
fileName_en_cours = lineEdit_6->text();
fileName_en_cours = QFileDialog::getOpenFileName(this, tr("Open File"), fileName_en_cours, tr("Files (*.gtl *gbl *.pho *.GBR *.gbr)"));
lineEdit_6->setText(fileName_en_cours);
liste_gerber1.clear();
listWidget_1->clear();
liste_apertures.clear();
fich_charge_ok = lire_fichier_gerber(fileName_en_cours); // <<------------
if (fich_charge_ok != 0) {return 1;}
enregistrer_fichier_init();
// effacer_ecran();
num_ligne_en_cours1 = 0;
pastilles_creuses=0;
analyse_fichier_gerber();
classer_auto();
trace_liste_apertures();
nb_corrections=0;
return 0;
}
int MainWindow::recharger_fichier()
{
int fich_charge_ok;
lineEdit_6->setText(fileName_en_cours);
liste_gerber1.clear();
listWidget_1->clear();
liste_apertures.clear();
fich_charge_ok = lire_fichier_gerber(fileName_en_cours); // <<------------
if (fich_charge_ok != 0) {return 1;}
effacer_ecran();
num_ligne_en_cours1 = 0;
pastilles_creuses=0;
analyse_fichier_gerber();
classer_auto();
trace_liste_apertures();
nb_corrections=0;
return 0;
}
void MainWindow::on_actionRecharger_triggered()
{
recharger_fichier();
checkBox_creuser->setEnabled(true);
}
void MainWindow::on_actionConnexion_triggered(bool checked)
{
msg="";
efface_buffer();
//listWidget_4->clear();
qint8 result;
if (checked)
{
result = Connexion(1);
if (result == 0)
{
Led0->setCouleur(QColor (0,255,0)); // vert
Led0->setEtat(1);
Led1->setCouleur(QColor (255,255,0)); // jaune
Led1->setEtat(1);
}
else
{
Led0->setCouleur(QColor (255,0,0)); // rouge
Led0->setEtat(1);
textEdit_1->setText("pas de connexion USB");
}
}
else
{
//on_Btn_stop_flash_clicked(); // le cas échéant...
Connexion(0);
Led0->setEtat(0);
Led1->setEtat(0);
Led2->setEtat(0);
Led3->setEtat(0);
// textEdit_1->clear();
// textEdit_1->setText("pas de connexion USB");
}
}
/*
void MainWindow::on_Btn_go_debut_fichier_clicked()
{
Timer1->stop();
InitTable3();
InitTable4();
InitTable5();
tableWidget_3->setRowCount(0);
liste_apertures.clear();
listWidget_1->setCurrentRow(0);
}
*/
void MainWindow::analyse_fichier_gerber()
{
int n, n_max;
n_max = liste_gerber1.length();
InitTable3();
InitTable4();
InitTable5();
tableWidget_3->setRowCount(0);
tableWidget_4->setRowCount(0);
liste_apertures.clear();
liste_elements.clear();
num_ligne_en_cours1=0;
num_ligne_en_cours3=0;
num_ligne3=0;
for (n=0; n<n_max-1; n++)
{
num_ligne_en_cours1 = n;
analyse_1ligne_fichier();
}
creation_liste_elements();
}
void MainWindow::on_Btn_effacer_clicked()
{
effacer_ecran();
}
void MainWindow::on_spinBox_zoom2_valueChanged(double arg1)
{
// effacer_ecran();
zoom = arg1;
ech = 40.0 / zoom;
effacer_ecran();
dessiner_liste_elements_tries();
trace_liste_apertures();
}
void MainWindow::on_Btn_trace_apertures_clicked()
{
trace_liste_apertures();
}
void MainWindow::on_Btn_redessiner_clicked()
{
on_Btn_classe_clicked(); // remplit la liste des éléments triés
tout_decliquer();
dessiner_liste_elements_tries();
}
int MainWindow::on_Btn_tout_flasher_clicked()
{
if ((fileName_en_cours.contains("B_Cu")) && (miroir == 0))
{
QMessageBox::StandardButton mb1;
mb1 = QMessageBox::question(this, "ATTENTION :", "Le fichier chargé est une face bottom, \n pensez à faire une inversion-miroir !",
QMessageBox::Ok|QMessageBox::Abort);
if (mb1 == QMessageBox::Abort) { return 1; }
}
if (laser_bloque) { QMessageBox msgBox; msgBox.setText("ATTENTION : blocage laser en cours"); msgBox.exec();}
nb_lignes_envoyees = 0;
nb_corrections=0;
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
return 1;
}
if (connect_ok==1)
{
int n1= spinBox_depart->value();
if (n1>0)
{
QMessageBox::StandardButton mb1;
mb1 = QMessageBox::question(this, "Attention :", "Début > 0", QMessageBox::Ok|QMessageBox::Abort);
if (mb1 == QMessageBox::Abort) { return 1; }
}
if ( !checkBox_creuser->isChecked())
{
QMessageBox::StandardButton mb1;
mb1 = QMessageBox::question(this, "Attention :", "\"Creuser pastilles\" non coché...", QMessageBox::Ok|QMessageBox::Abort);
if (mb1 == QMessageBox::Abort) { return 1; }
}
tout_decliquer();
num_ligne_en_cours1=n1-1;// -1 parce que la fonction flash_ligne_suivante() va l'incrémenter
tableWidget_5->setCurrentCell(n1, 1);
flashage_en_cours = 1;
recu_PRET = 1; // pour ne pas coincer dès la première ligne
flash_ligne_suivante(); // en fait la première...
Led3->setEtat(1);
return 0;
}
else { QMessageBox msgBox; msgBox.setText("No connect3"); msgBox.exec();}
return 0;
}
void MainWindow::on_Btn_stop_flash_clicked()
{
envoi_vers_Atmega("TN");
flashage_en_cours=0;
BoutonLed1->setChecked(0);
Led3->setEtat(0);
// Connexion(0);
// Connexion(1);
/*
// efface_buffer();
// msg.clear();
num_ligne_en_cours1 = 1000;
*/
}
void MainWindow::on_Btn_pastille_clicked()
{
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else { envoi_vers_Atmega("P1");} // Pastille rectangulaire ici !
}
void MainWindow::on_Btn_pastille_2_clicked()
{
QString s_D, ligne_i;
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else
{
s_D = spinBox_diam_pastille->text();
s_D = "000000"+s_D;
s_D = s_D.right(6);
ligne_i = "PR" + s_D; // Pastille ronde ici !
envoi_vers_Atmega(ligne_i);
}
}
void MainWindow::on_Btn_piste_X_clicked()
{
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else { envoi_vers_Atmega("S1");} // piste ici !
}
void MainWindow::on_Btn_PETIT_CARRE_clicked()
{
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else { envoi_vers_Atmega("C1");} // petit carré ici !
}
void MainWindow::on_Btn_MIRE_clicked()
{
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else { envoi_vers_Atmega("H1");} // piste ici !
}
void MainWindow::on_Btn_rot_n_pas_X_clicked()
{
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else
{
QString s_X, ligne_i;
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
recu_PRET=0;
s_X = spinBox_n_pas_X->text();
s_X = "000000"+s_X;
s_X = s_X.right(6);
ligne_i = "XN" + s_X;
envoi_vers_Atmega(ligne_i);
}
}
void MainWindow::on_Btn_rot_n_pas_Y_clicked()
{
if (findecourse == 1)
{
QString sx = "ATTENTION : en position Fin de course !";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
else
{
QString s_Y, ligne_i;
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
recu_PRET=0;
s_Y = spinBox_n_pas_Y->text();
s_Y = "000000"+s_Y;
s_Y = s_Y.right(6);
ligne_i = "YN" + s_Y;
envoi_vers_Atmega(ligne_i);
}
}
/*
void MainWindow::on_Btn_lever_plume_clicked()
{
envoi_vers_Atmega("ZA");
}
void MainWindow::on_Btn_affleure_plume_clicked()
{
envoi_vers_Atmega("ZB");
}
void MainWindow::on_Btn_touche_plume_clicked()
{
envoi_vers_Atmega("ZC");
}
*/
void MainWindow::on_BoutonLed1_toggled(bool etat) // bouton LED simulation
{
if (connect_ok==1)
{
if (etat == 1)
{
if (laser_bloque != 1)
{
QMessageBox::StandardButton mb1;
mb1 = QMessageBox::question(this, "Attention :", "Laser non bloqué", QMessageBox::Ok|QMessageBox::Abort);
if (mb1 == QMessageBox::Abort) { return; }
}
envoi_vers_Atmega("TI");
}
else {envoi_vers_Atmega("TN");}
}
else
{
BoutonLed1->setChecked(0);
QMessageBox msgBox; msgBox.setText("USB non connecté, ligne non transmise"); msgBox.exec();
}
}
void MainWindow::on_BoutonLed2_toggled(bool etat)
{
on_Btn_classe_clicked();
trace_aspect_reel = etat;
effacer_ecran();
dessiner_liste_elements_tries();
trace_liste_apertures();
}
void MainWindow::on_BoutonLed3_toggled(bool etat)
{
if ((etat == 1) && (BoutonLed4->isChecked()))
{
BoutonLed3->setChecked(0);
QMessageBox msgBox; msgBox.setText("blocage laser en cours"); msgBox.exec();
}
else
{
laser_on = etat;
if (laser_on == 1) { envoi_vers_Atmega("Z1"); } else {envoi_vers_Atmega("Z0"); }
}
}
void MainWindow::on_BoutonLed4_toggled(bool etat)
{
laser_bloque = etat;
if (laser_bloque == 1)
{
BoutonLed3->setChecked(0);
if (connect_ok) { envoi_vers_Atmega("ZB"); } // bloque le laser
}
else {envoi_vers_Atmega("ZD"); } // débloque le laser
}
int MainWindow::on_tableWidget_4_cellClicked(int row, int column)
{
int num_origine, num_element_trie;
QString s1,s2;
column = column; // pour eviter message de compilation...
spinBox_depart->setValue(row);
if(row == 0) {return 1;}
num_origine = liste_elements[row].num_origine;
num_element_trie = liste_elements[row].nouveau_num;
s1.setNum(num_origine); // conversion num -> txt
s2.setNum(num_element_trie); // conversion num -> txt
lineEdit_5->setText(s1+" - "+s2);
liste_elements_tries[num_element_trie-1].clique =1;
dessine_1ligne_liste_triee(num_element_trie-1);
return 0;
}
void MainWindow::on_tableWidget_5_cellClicked(int row, int column)
{
QString ligne_i;
int num_origine, num_element_trie;
QString s1,s2;
ligne_i = tableWidget_5->item(row,0)->text();
lineEdit_1->setText(ligne_i);
column = column; // pour eviter message de compilation...
spinBox_depart->setValue(row);
num_origine = liste_elements_tries[row].num_origine;
num_element_trie = row;
s1.setNum(num_origine); // conversion num -> txt
s2.setNum(num_element_trie+1); // conversion num -> txt
lineEdit_5->setText(s1+" - "+s2);
//liste_elements[num_origine].clique =1;
liste_elements_tries[num_element_trie].clique =1;
dessine_1ligne_liste_triee(num_element_trie);
}
void MainWindow::onReceptPos(int px, int py) // emis depuis un clic sur scene1, voir ma class "scene_cliquable"
{
QString s1,s2;
QPoint P;
s1.setNum(px);// conversion num -> txt
s2.setNum(-py);
lineEdit_2->setText("x="+s1+" y="+s2);
P.setX(px * ech);
P.setY(-py*ech);
detecte_element_pointe(P);
memo_x = 0;
memo_y = 0;
}
/**
REMARQUE :
QGraphicsView possède une propriété 'Dragmode' qui peut se règler à 'ScrollHandDrag' dans l'UI...
Mais ça donne un curseur 'Hand' tout le temps, ce qui ne m'arrange pas ici.
je cite :
"After setting "setDragMode(QGraphicsView::ScrollHandDrag)", the cursor is set permanently to a hand
while over the graphicsview. I thought that the correct mode was to turn the cursor to a hand only
when the left mouse button is pressed. I'd prefer the latter mode of operation, if possible.
Is there any way to correct this?"
Apparemment NON ! C'est la raison de la fonction suivante et du traitement
mousePressEvent et mouseWheelEvent dans la class 'scene_clicable'
ça fait pas mal de code en plus, mais je conserve le pointeur flèche pour cliquer sur les pistes
*/
void MainWindow::onReceptMove(int dx, int dy) // emis depuis roulette souris sur scene1, voir ma class "scene_cliquable"
{
groupe_trace->moveBy(dx - memo_x, dy - memo_y);
groupe_trous->moveBy(dx - memo_x, dy - memo_y);
groupe_pointage->moveBy(dx - memo_x, dy - memo_y);
groupe_segments_faits->moveBy(dx - memo_x, dy - memo_y);
groupe_pastilles_faites->moveBy(dx - memo_x, dy - memo_y);
memo_x = dx;
memo_y = dy;
}
void MainWindow::classer_pastilles()
{
// source liste_elements ; destination : liste_elements_tries et liste_segments
// simple recopie des definitions des apertures et du traçage des pastilles dans l'ordre du fichier d'origine
quint16 i, i_max;
Element EL_i;
i_max = liste_elements.count();
for (i=1; i<i_max; i++ ) // attention : 1 et pas 0 ! les numeros d'ordres commencent à 1. (zéro = pas d'élémént trouvé)
{
EL_i = liste_elements[i];
if((EL_i.sorte == 'M' ) || (EL_i.sorte == 'P' ) )
{
liste_elements[i].clique=1;
EL_i.clique=1;
liste_elements_tries << EL_i;
if (EL_i.sorte == 'P' ) { liste_pastilles << EL_i; }
num_element_proche_en_cours++;
}
if((EL_i.sorte == 'S' ) )
{
liste_segments << EL_i;
}
}
}
void MainWindow::classer_le_reste()
{
// source : TW4 ; destination TW5
pos_actuelle.setX(0);
pos_actuelle.setY(0);
while (num_element_proche_en_cours != 0)
{
num_element_proche_en_cours = detecte_element_proche();
// qDebug() << "n = " << num_element_proche_en_cours;
}
dessine_1ligne_liste_triee(num_element_proche_en_cours); // afin de positionner le pointage sur l'élément cliqué
}
void MainWindow::raccourcir_segment(Element *segment_i, quint16 ls, char bout) // // dp est le diametre de la pastille, ls la largeur du segment
{
qreal x1, y1, x2, y2, x3, y3, dx, dy, rt,rc, a, b;
ls /=2;
//rt = dp/3.5; // rayon trou (proportionnel au diametre de la pastille)
rt = 15; // rayon trou (fixe)
rc = ls+rt; // recul (valeur à retrancher à la longueur du segment)
if (bout == 'A') { x1 = segment_i->A.x(); y1 = segment_i->A.y(); x2 = segment_i->B.x(); y2 = segment_i->B.y(); }
else { x1 = segment_i->B.x(); y1 = segment_i->B.y(); x2 = segment_i->A.x(); y2 = segment_i->A.y(); }
if (x2 == x1) {x2 = x1 + 1;} // ce qui évite les /0 en introduisanr une erreur négligeable
dx= x2-x1;
dy= y2-y1;
a=dy/dx;
b=y1-a*x1;
if(x2>x1) {x3=x1+sqrt((rc*rc)/((a*a)+1));} else {x3=x1-sqrt((rc*rc)/((a*a)+1));}
y3=a*x3+b;
if (bout == 'A') { segment_i->A.setX(x3); segment_i->A.setY(y3); }
if (bout == 'B') { segment_i->B.setX(x3); segment_i->B.setY(y3); }
}
void MainWindow::creuser_pastilles()
{
quint16 s, t, s_max, t_max, num_ap_p, num_ap_s, diametre_p, diametre_s;
Element element_i, trou_i;
Aperture aperture_p, aperture_s;
QPointF D1;
qreal distance, ds_min;
// Btn_creuser_pastilles->setEnabled(false);
ds_min = 49;
t_max = liste_trous.count();
s_max = liste_elements.count();
// n_max = liste_apertures.length();
for (t=0; t<t_max; t++ )
{
trou_i = liste_trous[t];
num_ap_p = trou_i.num_aperture-10;
aperture_p = liste_apertures[num_ap_p]; //aperture_p -> celle de la pastille et de son trou
diametre_p = aperture_p.WH.rx(); // diametre_p est le diametre de la pastille
if (diametre_p > 50) // pour ne pas raccourcir les segments raccordés aux très petites pastiles (= liaisons entre segments)
{
for (s=1; s<s_max; s++ )
{
element_i = liste_elements[s];
if((element_i.sorte == 'S' ) ) // si c'est un segment
{
D1=element_i.A-trou_i.A; // element_i est le segment; extrémité (A); trou_i est la pastille entourant le trou
distance = sqrt(sqr(D1.x())+sqr(D1.y()));
if ((distance < ds_min) )
{
num_ap_s = element_i.num_aperture-10;
aperture_s = liste_apertures[num_ap_s];
diametre_s = aperture_s.WH.rx(); // diametre_s est le diametre (=largeur) du segment
raccourcir_segment(&element_i, diametre_s, 'A');
liste_elements[s]=element_i;
}
D1=element_i.B-trou_i.A; // autre extrémité (B) du segment
distance = sqrt(sqr(D1.x())+sqr(D1.y()));
if ((distance < ds_min) )
{
num_ap_s = element_i.num_aperture-10;
aperture_s = liste_apertures[num_ap_s];
diametre_s = aperture_s.WH.rx(); // diametre_s est le diametre (=largeur) du segment
raccourcir_segment(&element_i, diametre_s, 'B');
liste_elements[s]=element_i;
}
}
}
}
}
pastilles_creuses = 1;
//Led5->setEtat(1);
}
void MainWindow::classer_auto()
{
liste_elements_tries.clear();
tout_decliquer();
num_element_proche_en_cours = 1;
// classer_pastilles(); // je ne le fais plus
classer_le_reste();
affiche_liste_elements(); // dans le tableau
affiche_liste_elements_tries(); // dans le tableau
effacer_ecran();
tout_decliquer();
dessiner_liste_elements_tries(); // sur la scene graphique
}
void MainWindow::on_Btn_classe_clicked()
{
classer_auto();
trace_liste_apertures();
}
void MainWindow::on_Btn_aff5_ralenti_clicked()
{
on_Btn_classe_clicked();
i_dess_tri=0;
effacer_ecran();
tout_decliquer();
dessiner_liste_elements_tries();
Timer2->start(100);
}
void MainWindow::tout_decliquer()
{
quint16 i, i_max;
i_max = liste_elements.count();
for (i=0; i<i_max; i++ ) { liste_elements[i].clique = 0; }
i_max = liste_elements_tries.count();
for (i=0; i<i_max; i++ ) { liste_elements_tries[i].clique = 0; }
affiche_liste_elements(); // dans le tableau
affiche_liste_elements_tries(); // dans le tableau
dessiner_liste_elements_tries(); // sur la scene graphique
}
void MainWindow::on_Btn_declique_tout_clicked()
{
tout_decliquer();
}
void MainWindow::on_actionAide_triggered()
{
QString sx = "Les pastilles ainsi que les points rouges sur les segments sont cliquables.\n";
sx +="Les listes sont cliquables ce qui permet de localiser l'élément sur la platine.\n";
sx +="C'est la liste classée (verte) qui sera flashée.\n";
sx +="Le tracage des segments se fera dans le sens points rouges vers points verts.\n\n";
sx +="Le bouton \"creuser pastilles\" raccourcit les pistes (en RAM) mais ne touche pas au fichier gerber.\n";
sx +="Il n'est pas possible d'annuler cette action, sauf en rechargeant le fichier.\n";
sx +="Il faut creuser les pastilles AVANT de faire (éventuellement) 'miroir x'.\n\n";
sx +="Le choix du port USB doit correspondre 'au device' affiché dans le dossier /dev (sous Linux).\n";
sx +="Ce 'device' apparait (en temps réel lors du branchement) dans /dev sous forme d'un fichier.\n\n";
sx +="Le mode simulation envoie les commandes à la machine, mais celle-ci restera moteurs à l'arrêt.\n";
sx +="Le mode simulation : cliquez sur 'simulation' puis sur 'tout flasher'\n\n";
sx +="Le zoom du graphique peut se faire avec la molette de la souris dans la case 'zoom' sous l'image.\n";
sx +="On peut déplacer le graphique à la souris (clic + drag).\n\n";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
void MainWindow::on_Btn_stop_ralenti_clicked()
{
Timer2->stop();
}
void MainWindow::annonce_vocale(int n)
{
// ces annonces ont pour but de travailler écran éteint pour éviter la lumière parasite dans la pièce
if (! annonces_faites.contains(n)) // s'agissant de l'annonce d'un pourcentage, il ne faut pas répèter 2x la même
{
annonces_faites << n;
QString s;
s.setNum(n); // conversion num -> txt
QString program = "/usr/bin/mplayer"; // sous Linux !
QStringList arguments;
arguments << "../audio/" + s + ".mp3" << "../audio/pourcent.mp3";
QProcess *myProcess = new QProcess();
myProcess->start(program, arguments);
}
}
void MainWindow::on_Btn_TEST_clicked()
{
/*
QString s1;
s1="Il était une fois une marchande de foie qui vendait du foie dans la ville de Foix";
s1="ABCD";
envoi_vers_Atmega(s1);
*/
// envoi_vers_Atmega("TE");
// QScrollBar *SB1 = textEdit_1->verticalScrollBar();
// SB1->setValue(SB1->maximum());
// groupe_trace->moveBy(100,100);
// groupe_pastilles_faites->moveBy(100,100);
// groupe_segments_faits->moveBy(100,100);
// groupe_pointage->moveBy(100,100);
// groupe_trous->moveBy(100,100);
// pourcent +=10;
// annonce_vocale(pourcent);
checkBox_creuser->setEnabled(true);
}
void MainWindow::on_Btn_GOTO_10x10_clicked()
{
doubleSpinBox_X->setValue(10.0);
doubleSpinBox_Y->setValue(10.0);
on_Btn_GOTO_clicked();
}
void MainWindow::on_Btn_GOTO_20x20_clicked()
{
doubleSpinBox_X->setValue(20.0);
doubleSpinBox_Y->setValue(20.0);
on_Btn_GOTO_clicked();
}
void MainWindow::on_Btn_RAZ_flash_clicked()
{
tableWidget_5->selectRow(0);
spinBox_depart->setValue(0);
liste_elements_tries[0].clique =1;
dessine_1ligne_liste_triee(0);
}
/**
void MainWindow::on_Btn_creuser_pastilles_clicked()
{
if(pastilles_creuses == 0)
{
creuser_pastilles();
on_Btn_classe_clicked(); // remplit la liste des éléments triés
effacer_ecran();
dessiner_liste_elements_tries();
}
}
**/
void MainWindow::on_Btn_lum_laser_clicked()
{
//envoi la consigne de luminosité au laser
QString s_L, ligne_i;
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
recu_PRET=0;
s_L = spinBox_lum_laser->text();
s_L = "000000"+s_L;
s_L = s_L.right(6);
ligne_i = "LU" + s_L;
envoi_vers_Atmega(ligne_i);
}
void MainWindow::on_Btn_Z_laser_clicked()
{
//envoi la consigne de de hauteur (axe Z) au laser
QString s_Z, ligne_i;
Led2->setCouleur(QColor (255,255,0));
Led2->setEtat(1);
recu_PRET=0;
s_Z = spinBox_Z_laser->text();
s_Z = "000000"+s_Z;
s_Z = s_Z.right(6);
ligne_i = "LZ" + s_Z;
envoi_vers_Atmega(ligne_i);
}
void MainWindow::on_checkBox_miroir_toggled(bool checked)
{
checkBox_creuser->setDisabled(1);
miroir = checked;
inverser_miroir_elements();
classer_auto();
dessiner_liste_elements_tries();
trace_liste_apertures();
}
void MainWindow::on_Btn_correction_clicked()
{
// listWidget_4->addItem("envoi: CE");
envoi_vers_Atmega("CE");
}
void MainWindow::on_Btn_lire_ERR_clicked()
{
// listWidget_4->addItem("envoi: LE");
envoi_vers_Atmega("LE");
}
void MainWindow::on_Btn_gotoHome_2_clicked()
{
on_Btn_gotoHome_clicked();
}
void MainWindow::on_Btn_help_LW4_clicked()
{
QString sx = "Sur fond vert : les commandes envoyées par le PC vers l'ATmega\n";
sx +="Sur fond jaune : les réponses de l'ATmega\n";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}
void MainWindow::on_checkBox_creuser_toggled(bool checked)
{
if(checked == 1)
{
creuser_pastilles();
on_Btn_classe_clicked(); // remplit la liste des éléments triés
effacer_ecran();
dessiner_liste_elements_tries();
}
else { recharger_fichier(); }
}
void MainWindow::on_actionttyUSB0_triggered()
{
port_usb_name="ttyUSB0";
actionConnexion->setText("Connexion_ttyUSB0");
}
void MainWindow::on_actionttyUSB1_triggered()
{
port_usb_name="ttyUSB1";
actionConnexion->setText("Connexion_ttyUSB1");
}
void MainWindow::on_actionttyACM0_triggered()
{
port_usb_name="ttyACM0";
actionConnexion->setText("Connexion_ttyACM0");
}
void MainWindow::on_actionttyACM1_triggered()
{
port_usb_name="ttyACM1";
actionConnexion->setText("Connexion_ttyACM1");
}
void MainWindow::on_actionttyACM2_triggered()
{
port_usb_name="ttyACM2";
actionConnexion->setText("Connexion_ttyACM2");
}
void MainWindow::on_actionttyACM3_triggered()
{
port_usb_name="ttyACM3";
actionConnexion->setText("Connexion_ttyACM3");
}
void MainWindow::on_actionttyACM4_triggered()
{
port_usb_name="ttyACM4";
actionConnexion->setText("Connexion_ttyACM4");
}
void MainWindow::on_Btn_LST_AP_clicked()
{
envoi_vers_Atmega("TA");
}
void MainWindow::on_actionAffichage_tendu_triggered(bool checked)
{
if (checked)
{
window()->setGeometry(0,0,1900,900);
textEdit_1->setGeometry(1285,5,595,855);
Btn_close_Tx1->setGeometry(1855,10,20,20);
Btn_save_log->setGeometry(1780,10,70,20);
}
else
{
window()->setGeometry(0,0,1279,889);
textEdit_1->setGeometry(910,710,361,151);
Btn_close_Tx1->setGeometry(1247,715,20,20);
Btn_save_log->setGeometry(1172,715,70,20);
}
}
void MainWindow::on_Btn_close_Tx1_clicked()
{
textEdit_1->clear();
}
void MainWindow::on_Btn_save_log_clicked()
{
int lg, p1, i, ok;
liste_log << "";
QString dossier1 = fileName_en_cours;
lg = fileName_en_cours.length();
i= lg;
ok=0;
while ((i>0) && (ok == 0) )
{
i--;
if (fileName_en_cours[i] == '/') { ok=1; }
}
dossier1 = fileName_en_cours.left(i);
// recherche du dernier '/'
qDebug() << "fileName_en_cours = " << fileName_en_cours;
qDebug() << "lg = " << lg;
qDebug() << "i = " << i;
qDebug() << "dossier1 = " << dossier1;
record_fichier_log(dossier1, "/log.txt");
QString sx = "Le fichier log ( " + dossier1 + "/log.txt" + " ) a été enregistré";
QMessageBox msgBox; msgBox.setText(sx); msgBox.exec();
}