/**************************************************************************
* Copyright (C) 2009-2010 by Silicium628 (France) *
* http://silicium628.chez-alice.fr/ *
* http://www.silicium628.fr/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; *
* See the GNU General Public License for more details. *
***************************************************************************/
//programme ecrit avec le logiciel libre Qdevelop avec Qt4.5.2 (dispo sous Ubuntu 9.04 et >)
//attention: sous Qt4.0 ce source ne compile pas (fonctions manquantes dans certaines classes)
//et l'executable compile avec Qt4.5.2 ne tourne pas sous Ubuntu 8.10 et < pour la meme raison
//note: j'ai supprime les accents dans les commentaires pour ameliorer la lisibilite sur tous les OS
//desole pour les personnes respectueuses de la langue (dont je suis, enfin j'essaye...)
// derniere modification de ce programme le 10 aout 2010
/*===========================================================================================
RAPPELS:
===========================================================================================
GENERALITES: (source Wikipedia)
--------------------------------------------------------------------------------
En une annee, la Terre effectue environ 365 tours sur elle-meme par rapport au Soleil,
mais effectue aussi un tour complet autour du Soleil. Donc, par rapport aux etoiles,
365 jours solaires equivalent a 366 jours sideraux.
Les jours sideraux sont donc un peu plus courts que les jours solaires.
La periode reelle de l'annee etant de 365,2422 jours solaires, la duree exacte
du jour sideral est de : 365,2422/(365,2422+1) = 0,9972696 jour solaire, soit 23h 56m 4,09s,
soit une difference d'environ 4mn par rapport au jour solaire,
le rapport entre les deux etant de 1/360 = 0.0027 soit moins de 0.3% dont il faut tenir compte.
En astronomie, la position d'un astre sur la sphere celeste est reperee par deux
coordonnees, l'ascension droite et la declinaison.
A tout instant la somme de l'ascension droite d'un astre et de son angle horaire
est egale au temps sideral.
En quelque sorte le temps sideral mesure le deplacement de la voûte celeste en
un lieu donne par rapport au meridien local.
Unites de l'ascension droite
L'heure d'ascension droite est une unite de mesure d'angle plan et vaut 360deg/24 = 15deg.
La minute d'ascension droite vaut 1/60 heure d'ascension droite soit 15 minutes d'arc.
La seconde d'ascension droite vaut 1/60 minute d'ascension droite = 15 secondes d'arc.
(fin de citation de Wikipedia)
==============================================================================================
Remarque:
Dans ce logiciel l'ascension droite est notee RA (de Right ascension en anglais )
et la declinaison est notee DE (du 'dec' de declination en anglais, mais sans le 'c'
pour ne pas confondre avec 'dec' = decimal ou decrementer...)
==============================================================================================
Une lunette astronomique immobile par rapport au sol terrestre pointe dans une
direction du ciel dont l'ascenssion droite (RA) augmente de 1s (de coordonnees
RA siderales, =15s d'arc) toutes les 1s (de temps sideral)
1 jour solaire = 24h00 = 1440 mn
1 jour sideral = 23h56' = 1436 mn
365 * 4' = 24h (au bout d'une annee le decallage s'annule donc)
Les 4' qu'il faut ajouter au jour sideral pour obtenir un jour terrestre sont dues
au deplacement de la terre sur son orbite autour du soleil d'un jour sur l'autre
================================ Bright Star Catalogue ====================================
Je cite ici l'article de Wikipedia (version 13 fevrier 2010):
Le Bright Star Catalogue (BSC), le Catalogue des etoiles brillantes,
appele egalement Yale Catalogue of Bright Stars ou Yale Bright Star Catalogue,
est un catalogue d'etoiles qui liste toutes les etoiles de magnitude inferieure ou egale 6,5,
ce qui correspond en gros a toutes les etoiles visibles a l'oeil nu.
Sa 5e edition est actuellement disponible en ligne sur plusieurs sites.
Bien que l'abreviation du catalogue soit BS ou YBS, les citations des etoiles listees
dans le catalogue utilisent HR avant le numero d'ordre, d'apres le nom de son predecesseur,
le Harvard Revised Photometry Catalogue cree en 1908 par l'observatoire de Harvard.
(fin de citation de Wikipedia)
==============================================================================================*/
#include "mainwindow.h"
// #include <string.h>
#include <QFileDialog>
#include <QTextStream>
#include <QMessageBox>
#include <QPainter>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QPrinter>
#include <QPrintDialog>
// #include <QApplication>
//TYPES
enum ANGLE_ou_TEMPS { isA, isT };
//VARIABLES
long RA, DE; // en secondes (de temps pour RA et d'arc pour DE)
long RA_pointe, DE_pointe; // RA et DE de l'objet clique a la souris
int HR_pointe, NGC_pointe; // Numero HR de l'objet pointe
int memo_HR_pointe, memo_NGC_pointe; // memo Numero HR de l'objet precedemment pointe
long RA_centre, DE_centre; // coordonnees du centre de l'ecran en secondes (de temps pour RA et d'arc pour DE)
long RA_aff_min, RA_aff_max, DE_aff_min, DE_aff_max; //en secondes (de temps pour RA et d'arc pour DE)
float RA_min_deg, RA_max_deg, DE_min_deg, DE_max_deg;//en degres decimaux, D'ANGLE pour les deux
int num_objet_BSC = 0;
int num_objet_SAC = 0;
int num_objet_BSC_pointe = 0;
int num_objet_SAC_pointe = 0;
int num_etoile_TYC_pointe = 0; // numero dans la 'liste_etoiles_TYC'
QString cstl_pointee;
int p1, l1;
QStringList liste_figures_cstl;
QStringList liste_noms_etoiles;
bool objet_valide = false;
bool fichier_cstl_ok = false;
bool cliquee_G = false;
bool a_dessiner = false;
bool ne_pas_dessiner_maintenant = false;
bool first = false;
bool etoiles_tyc_visibles = false;
QString version_i = "v8.2";
QString chemin_BSC;
QString chemin_SAC;
QString chemin_thycho2;
int w_ecran;
int h_ecran;
//QSize size1(1100, 620);
//QSize size2(1200,890);
QSize size_bordure(10,5);
int x_max_ecran = 1200; // de l'ecran de projection
int y_max_ecran = 800; // de l'ecran de projection
int x_max_image = x_max_ecran; // de l'image calculee (qui peut etre plus grande que l'ecran, en particulier pour imprimer)
int y_max_image = y_max_ecran; // de l'image calculee
uchar buffer_image[32000000];
QImage image1(buffer_image, 1200,800, QImage::Format_RGB32);
int PosX, PosY; // du clic de la souris
int orientation_observateur;
double zoom_double;
float zoom;
float angleA,angleB,angleC,angleD;
float latitude_obs;
int rayon_sphere = 600; //rayon de la sphere pour projection ecran
QDate date1;
QTime time1;
int day_oh_year1; // 0..365
QList<BSCrec> liste_etoiles_BSC; // 9110 objets du catalogue BSC5
QList<TYC2rec> liste_etoiles_TYC; // liste des etoiles Tycho a afficher
QList<RegionTYC> Liste_regions_tyc; // liste des numeros de regions TYCHO a afficher
int num_zone_BSC_centre;
int num_zone_BSC_centre_memo;
QColor Tableau_couleurs_etoiles[7]; // O B A F G K M (oh be a fine girl, kiss me!)
QColor couleur_etoile;
QColor couleur_halo;
int saturation = 100; // saturation des couleurs des etoiles
//pour gerer le TableWidget_BSC:
#define colHR 0
#define colNomCom 1
#define colNomBay 2
#define colHD 3
#define colRA 4
#define colDE 5
#define colCSTL 6
#define colMV 7
#define colClsSpect 8
//pour gerer le TableWidget_NGC:
#define colNGCNom1 0
#define colNGCNom2 1
#define colNGCRA 2
#define colNGCDE 3
#define colNGCType 4
#define colNGCCons 5
#define colNGCMagn 6
#define colNGCDiam 7
int nb_objets_SAC = 0;
MainWindow::MainWindow (QWidget * parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
setupUi(this);
setWindowTitle("APE2009 version: " + version_i);
chemin_BSC="/catalogues/bsc5/";
chemin_SAC="/catalogues/sac/";
chemin_thycho2="/thycho2/";
QMessageBox msgBox;
QString tx1;
tx1="Le chargement des catalogues va prendre un certain temps, veuillez cliquer sur ok pour continuer";
msgBox.setText(tx1);
msgBox.exec();
setCursor(Qt::WaitCursor);
InitTableBSC();
InitTableNGC();
createActions();
p1=0;
l1=0;
Bt_copier_vers_cadre->setIcon(QIcon(QDir::currentPath() +"/fleche_verte3b.png"));
Bt_top1->setIcon(QIcon(QDir::currentPath() +"/premier.png"));
liste_etoiles_BSC.clear();
getBSC(&liste_etoiles_BSC, chemin_BSC + "bsc5_628.dat");
Listage_objets_BSC();
charger_fichier_SAC();
int z4 = charger_noms_etoiles(QDir::currentPath() + "/catalogues/noms_etoiles1.txt");
// si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
if (z4 == 1) { z4 = charger_noms_etoiles(QDir::currentPath() +"/noms_etoiles1.txt");}
Listage_noms_etoiles();
int z2 = charger_constellations(QDir::currentPath() + "/catalogues/constellations1.txt");
// si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
if (z2 == 1) { z2 = charger_constellations (QDir::currentPath() +"/constellations1.txt");}
if (z2 == 0) {fichier_cstl_ok = true;}
int z3 = charger_figures_cstl(QDir::currentPath() + "/catalogues/figures_constellations.txt");
// si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
if (z3 == 1) { z3 = charger_figures_cstl (QDir::currentPath() +"/figures_constellations.txt");}
Tableau_couleurs_etoiles[0]= QColor::fromRgb(130,150,240,255); // O bleu
Tableau_couleurs_etoiles[1]= QColor::fromRgb(116,220,235,255); // B cyan
Tableau_couleurs_etoiles[2]= QColor::fromRgb(255,255,255,255); // A blanc
Tableau_couleurs_etoiles[3]= QColor::fromRgb(250,250,200,255); // F jaune vif
Tableau_couleurs_etoiles[4]= QColor::fromRgb(235,242,138,255); // G jaune orange
Tableau_couleurs_etoiles[5]= QColor::fromRgb(240,190,140,255); // K orange
Tableau_couleurs_etoiles[6]= QColor::fromRgb(250,112,100,255); // M rouge
Bt_nord->click();
calendrier1->hide();
Edit_ligne_cstl->hide();
spinBox_magnitude_max->setValue(4.0);
spinBoxZoom->setValue(3.0);
MAJ_zoom(spinBoxZoom->value());
Edit_FindName->setText("vega");
//a_dessiner = true;
//dessiner_ciel(totalite);
this->setWindowState(Qt::WindowMaximized);
w_ecran = width();
h_ecran = height();
// QString txt1;
// ordre d'empilement des widgets (parfois delicat a maitriser avec QDevelop, donc precise ici):
frame_3->raise(); //Raises this widget to the top of the parent widget's stack -> "bring to front"
Edit_ligne_cstl->raise();
calendrier1->raise();
//calcul_anglesABC();
angleD = 0;
redimmensionner_tout();
a_dessiner = true;
dessiner_ciel(totalite);
setCursor(Qt::ArrowCursor);
}
int charger_noms_etoiles(QString nom_fichier1)
{
int n=0;
QFile file1(nom_fichier1);
if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
QTextStream in(&file1);
QString ligne;
while ( !in.atEnd() )
{
ligne = in.readLine();
if (ligne.left(1) !="#")
{
liste_noms_etoiles<<ligne;
n++;
}
}
file1.close();
return 0;
}
int MainWindow::charger_constellations(QString nom_fichier1)
{
QStringList liste1;
QFile file1(nom_fichier1);
if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
QTextStream in(&file1);
while ( !in.atEnd() )
{
QString line = in.readLine();
if (line.left(1) !="#") { liste1<<line; }
}
liste1<<"===";
Cbox_Constellations->addItems(liste1);
file1.close();
return 0;
}
void MainWindow::InitTableBSC(void)
{
int n;
TableWidget_BSC->setColumnCount(10);
QStringList liste_entetes_BSC;
liste_entetes_BSC <<"HR"<<"Nom commun"<<"Bayer"<<"HD"<<"RA"<<"DE"<<"Cstl"<<"Mv"<<"Cls Spect";
TableWidget_BSC->setHorizontalHeaderLabels (liste_entetes_BSC );
TableWidget_BSC->resizeColumnsToContents();
for (n=0; n<9200; n++)
{
TableWidget_BSC->setItem(n, colNomCom, new QTableWidgetItem ("~") );
TableWidget_BSC->setItem(n, colNomBay, new QTableWidgetItem ("~") );
TableWidget_BSC->setItem(n, colHD, new QTableWidgetItem ("0") );
TableWidget_BSC->setItem(n, colHR, new QTableWidgetItem ("----") );
TableWidget_BSC->setItem(n, colRA, new QTableWidgetItem ("00000") );
TableWidget_BSC->setItem(n, colDE, new QTableWidgetItem ("0000000") );
TableWidget_BSC->setItem(n, colCSTL, new QTableWidgetItem ("~__") );
TableWidget_BSC->setItem(n, colMV, new QTableWidgetItem ("=___") );
TableWidget_BSC->setItem(n, colClsSpect, new QTableWidgetItem ("-") );
}
}
void MainWindow::InitTableNGC(void)
{
TableWidget_NGC->setColumnCount(8);
QStringList liste_entetes_NGC;
liste_entetes_NGC <<"Nom1"<<"Nom2"<<"RA"<<"DE"<<"Type"<<"Const"<<"Magn"<<"Diam";
// int count =TableWidget_BSC->rowCount();
TableWidget_NGC->setHorizontalHeaderLabels (liste_entetes_NGC );
// TableWidget_BSC->setItem(0,0, new QTableWidgetItem("ABC")); // ( pour ecrire dans 1 case)
TableWidget_NGC->resizeColumnsToContents();
}
int MainWindow::charger_texte_doc(QString nom_fichier1)
{
// listeDoc->setSource(QUrl::fromLocalFile(nom_fichier1));
QFile file1(nom_fichier1);
if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
QTextStream in(&file1);
listeDoc->clear();
while ( !in.atEnd() )
{
QString line = in.readLine();
listeDoc->addItem(line);
}
file1.close();
return 0;
}
int charger_figures_cstl(QString nom_fichier1)
{
QFile file1(nom_fichier1);
if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
QTextStream in(&file1);
liste_figures_cstl.clear();
while ( !in.atEnd() )
{
QString line = in.readLine();
if (line.left(1) !="#") { liste_figures_cstl<<line; }
}
file1.close();
return 0;
}
void MainWindow::enregistrer_fichier_ETOILES()
{
QString nom1, st1, st2, ligne1 ;
QString RA_txt, DE_txt, DE1, magnitude_txt;
float mv, mv_max;
QFile file1(QDir::currentPath() + "/catalogues/ETOILES1.ETL");
if (!file1.open(QIODevice::WriteOnly | QIODevice::Text)) return;
QTextStream out(&file1);
setCursor(Qt::WaitCursor);
out<< "# Liste d'objets astronomiques (catalogue BSC) pour l'APE2009 (GOTO pour telescope base sur un ATmega32)";
out<<'\n'; //retour a la ligne
out<< "# Les positions sont donnees en secondes (de temps pour RA et d'arc pour DE)";
out<<'\n'; //retour a la ligne
out<< "# Les objets sont enregistres tries par numero HR qui constitue l'index de la table";
out<<'\n'; //retour a la ligne
out<<'#';
out<<'\n'; //retour a la ligne
mv_max = 4.5;
int compte = 0;
int row = 0;
while (row < 9110)
{
magnitude_txt = TableWidget_BSC->item(row,colMV)->text(); // magnitude
mv = magnitude_txt.toFloat();
if ((mv != 0) && (mv < mv_max))
{
//-------------------------------------------------------------------------------
ligne1="!E";
//-------------------------------------------------------------------------------
st1 = TableWidget_BSC->item(row,colHR)->text(); // numero HR
st1=("0000"+st1).right(4); // formatage: toujours 4 chiffres
ligne1 += st1;
//-------------------------------------------------------------------------------
ligne1 += "_R";
RA_txt = "00000"+TableWidget_BSC->item(row,colRA)->text(); // RA
ligne1 += RA_txt.right(5);
//-------------------------------------------------------------------------------
ligne1 += "D";
DE_txt = "0000000"+TableWidget_BSC->item(row,colDE)->text(); // DE
ligne1 += DE_txt.right(7);
ligne1 += "_";
//-------------------------------------------------------------------------------
nom1 = TableWidget_BSC->item(row,colNomCom)->text(); // nom commun
nom1 +="----------";
ligne1 += nom1.left(10);
ligne1 += "_";
//-------------------------------------------------------------------------------
st1 = TableWidget_BSC->item(row,colCSTL)->text(); // constellation
st1+="---";
ligne1 += st1.left(3);
ligne1 += "_";
//-------------------------------------------------------------------------------
ligne1 += magnitude_txt;
out<< ligne1;
out<<'\n'; //retour a la ligne
compte++;
}
row++;
}
out.flush();
setCursor(Qt::ArrowCursor);
st1.setNum(compte); // conversion num -> txt
st2.setNum(mv_max); // conversion num -> txt
QMessageBox msgBox;
msgBox.setText("Le fichier ETOILES1.ETL a ete enregistre; Il comprend " + st1 + " Etoiles de magnitude < " + st2 );
msgBox.exec();
TableWidget_BSC->setCurrentCell(0,0);
}
void MainWindow::enregistrer_fichier_NGC()
{
QString nom1, st1, st2, ligne1 ;
QString RA_txt, DE_txt, DE1, magnitude_txt;
float mv, mv_max;
QFile file1(QDir::currentPath() + "/catalogues/NGCSKY1.OBJ");
if (!file1.open(QIODevice::WriteOnly | QIODevice::Text)) return;
QTextStream out(&file1);
setCursor(Qt::WaitCursor);
out<< "# Liste d'objets astronomiques NGC (catalogue SAC) pour l'APE2009 (GOTO pour telescope base sur un ATmega32)";
out<<'\n'; //retour a la ligne
out<< "# Les positions sont donnees en secondes (de temps pour RA et d'arc pour DE)";
out<<'\n'; //retour a la ligne
out<<'#';
out<<'\n'; //retour a la ligne
mv_max = 10;
int compte = 0;
int row = 0;
while (row < nb_objets_SAC)
{
magnitude_txt = TableWidget_NGC->item(row,colNGCMagn)->text(); // magnitude
mv = magnitude_txt.toFloat();
if ((mv != 0) && (mv < mv_max))
{
//-------------------------------------------------------------------------------
ligne1="!E";
//-------------------------------------------------------------------------------
st1 = TableWidget_NGC->item(row,colNGCNom1)->text(); // nom1 (NGCxxxx dans la plupart des cas)
if (st1.left(3) == "NGC") // on ne retient que les objets NGC
{
st1.remove(0,3); // (NGC)
st1=("0000"+st1).right(4); // formatage: toujours 4 chiffres
ligne1 += st1;
//-------------------------------------------------------------------------------
ligne1 += "_R";
RA_txt = "00000"+TableWidget_NGC->item(row,colNGCRA)->text(); // RA
ligne1 += RA_txt.right(5);
//-------------------------------------------------------------------------------
ligne1 += "D";
DE_txt = "0000000"+TableWidget_NGC->item(row,colNGCDE)->text(); // DE
ligne1 += DE_txt.right(7);
ligne1 += "_";
//-------------------------------------------------------------------------------
nom1 = TableWidget_NGC->item(row,colNGCNom2)->text(); // nom2
nom1 +="----------";
ligne1 += nom1.left(10);
ligne1 += "_";
//-------------------------------------------------------------------------------
st1 = TableWidget_NGC->item(row,colNGCCons)->text(); // constellation
st1+="---";
ligne1 += st1.left(3);
ligne1 += "_";
//-------------------------------------------------------------------------------
ligne1 += magnitude_txt;
out<< ligne1;
out<<'\n'; //retour a la ligne
compte++;
}
}
row++;
}
out.flush();
setCursor(Qt::ArrowCursor);
st1.setNum(compte); // conversion num -> txt
st2.setNum(mv_max); // conversion num -> txt
QMessageBox msgBox;
msgBox.setText("Le fichier NGCSKY1.OBJ a ete enregistre; Il comprend " + st1 + " objets de magnitude < " + st2 );
msgBox.exec();
TableWidget_BSC->setCurrentCell(0,0);
}
void MainWindow::decodage_abrev_constell(void)
//par comparaison des textes entiers et/ou des abreviations
{
int i1;
QString texte1, texte2, texteA, texteB ="";
i1=0;
texteB = Edit7->text().left(4); // debut du texte complet
texte2 = Edit7->text().right(3); // abreviation seulement
while ((texte1 != texte2 ) && (texteA != texteB ) && (i1<=88))
{
Cbox_Constellations->setCurrentIndex(i1);
texteA = Cbox_Constellations->currentText().left(4);
texte1 = Cbox_Constellations->currentText().right(3);
i1++;
}
if (i1>88) { Edit12->setText(texte1); } else {Edit12 ->setText("===");}
}
int MainWindow::text2secondes (QLineEdit *Edit_i)
// convertit le texte du QLineEdit passe par adresse en un nombre de secondes
// le texte du QLineEdit doit etre de la forme "12:34:56" pour: degres:minutes:secondes OU heures:minutes:secondes
{
//19:8:39
//on va decouper le texte en 3 tronçons '19' , '8' et '39'
QString txt0,txt1,txt2,txt3;
int p1,p2;
int h,m,s;
long s_out;
char signeD ='+';
txt0 = Edit_i->text();
p1 = txt0.indexOf(":"); // position du premier ":"
txt1 = txt0.left(p1); // '19'
if (txt1.left(1) == "-")
{
signeD='-';
txt1.remove(0,1);
}
// if (txt0.contains("-", Qt::CaseInsensitive)) {signeD='-';}
txt0.remove(0, p1+1); // on coupe le debut
p2 = txt0.indexOf(":"); // position du ":" suivant
txt2 = txt0.left(p2); // '8' remarque: ok quel que soit le nb de chiffres
txt0.remove(0, p2+1); // on coupe le debut
txt3 = txt0; // le compilateur simplifiera!
h = txt1.toInt(); // conversion txt -> num
m = txt2.toInt(); // conversion txt -> num
s = txt3.toInt(); // conversion txt -> num
s_out = s + 60 * m + 3600 * h;
if (signeD == '-') { s_out = 324000 + s_out; }
return s_out;
}
float sec2deg_decim(long nb_sec, ANGLE_ou_TEMPS typ_i)
//convertit un nombre de secondes en degres decimaux (degres d'angles)
// si la valeur entree est une ascension droite (RA), le resultat est une valeur comprise entre 0 et 360
// si la valeur entree est une declinaison (DE), le resultat est une valeur comprise entre -90 et +90
{
float d;
if( typ_i == isT)
{
d = 15 * (float)nb_sec / 3600; // RA=360deg/24h soit 15deg/h
}
else if( typ_i == isA)
{
if (nb_sec > 324000)
{
nb_sec -= 324000;
d = -(float)nb_sec / 3600; // il y a un signe (-) devant float!!!!
}
else
{
d = (float)nb_sec / 3600;
}
}
else d=0;
return d;
}
long deg_decim2sec(float valeur)
//convertit un reel (degres decimaux) en secondes
{
float f;
long s;
f = valeur * 3600;
if (valeur < 0) { f = -f +324000; }
s = floor(f);
return s;
}
void MainWindow::on_Bt_copier_vers_cadre_clicked()
{
long nb_secondes;
int row = TableWidget_BSC->currentRow();
Edit_nom->setText(TableWidget_BSC->item(row,colNomCom)->text()); // nom commun
Edit_RAs->setText(TableWidget_BSC->item(row,colRA)->text()); // RA affichage en secondes
nb_secondes = Edit_RAs->text().toInt(); // conversion txt -> num
Edit_RA->setText(nb_secondes2txt_hms(nb_secondes) ); //affichage hh:mm:ss
Edit_DEs->setText(TableWidget_BSC->item(row,colDE)->text());
nb_secondes = Edit_DEs->text().toInt(); // conversion txt -> num
if (nb_secondes > 324000) {nb_secondes = 324000 - nb_secondes ;}
Edit_DE->setText(nb_secondes2txt_hms(nb_secondes) ); //affichage hh:mm:ss
Edit_magnitude->setText(TableWidget_BSC->item(row,colMV)->text()); // magnitude
Edit7->setText(TableWidget_BSC->item(row,colCSTL)->text()); // constellation
decodage_abrev_constell();
}
void MainWindow::on_Edit_RA_editingFinished()
{
QString RA_txt;
RA_txt.setNum(text2secondes(Edit_RA)); // conversion num -> txt
RA_txt.insert(0, "00000");
RA_txt = RA_txt.right(5); // le string RA contient exactement 5 caracteres (avec des 0 devant)
Edit_RAs -> setText(RA_txt);// AffichageEtendu en secondes; plus grand AffichageEtendu = '86400' (5 caract)
}
void MainWindow::on_Edit_DE_editingFinished()
{
QString DE_txt;
DE_txt.setNum(text2secondes(Edit_DE)); // conversion num -> txt
DE_txt.insert(0, "00000");
DE_txt = DE_txt.right(7); // le string DE contient exactement 7 caracteres (avec des 0 devant)
Edit_DEs -> setText(DE_txt);// AffichageEtendu en secondes; plus grand AffichageEtendu = '-324000' (7 caract)
}
void MainWindow::on_actionEnregistrer_activated()
{
spinBox_magnitude_max->setValue(4.5);
spinBoxNGC_mag_max->setValue(10.0);
enregistrer_fichier_ETOILES(); // pour la SDcard
enregistrer_fichier_NGC(); // pour la SDcard
}
void MainWindow::efface_objet_pointe()
{
Edit_objPointe->setText("");
Edit_RAobjPointe->setText("");
Edit_DEobjPointe->setText("");
}
void MainWindow::efface_position_pointee()
{
Edit_RAposPointe->setText("");
Edit_DEposPointe->setText("");
}
void MainWindow::extraire_RA_DE_from_Tableau(int row_i, long *RA_out, long *DE_out)
{
QString txt1;
txt1 = TableWidget_BSC->item(row_i,colRA)->text(); // RA
*RA_out = txt1.toInt(); // conversion txt -> num
txt1 = TableWidget_BSC->item(row_i,colDE)->text(); // DE
*DE_out = txt1.toLong();
}
int MainWindow::projection(long RAs, long DEs, QPoint *P)
//convertit les coordonnees RA et DE (donnees en secondes de temps et d'arc) en projection plane
/*=============================== PROJECTION =====================================================
Projection "orthographique":
On place le plan de projection tangent a la sphere et on projette les points perpendiculairement a ce plan
==================================================================================================*/
{
double x = 0; // du point projete sur le plan
double y = 0; // du point projete sur le plan
double R, D; // de l'etoile, en radians
QPoint Pt1;
Vecteur3D v1;
QString txt1;
if (DEs > 324000) {DEs = 324000 - DEs ;}
R = 2*M_PI / (24*3600) * RAs; // en radians
D = M_PI / (180*3600) * DEs; // en radians
v1.x = rayon_sphere * cos(D) * cos (R);
v1.y = rayon_sphere * cos(D) * sin (R);
v1.z = rayon_sphere * sin(D);
v1.RotZ(angleA); // rotation terrestre
v1.RotY(angleB); // inclinaison de l'axe des poles due a la latitude RotX
v1.RotZ(angleC); // rotation de l'observateur sur lui-meme
v1.RotX(angleD); // rotation de champ
/* REMARQUE:
-les rotations se font par rapport a l'observateur (repere x,y,z) et non par rapport a l'objet
-l'ordre des rotations est donc important
*/
//projection sur l'ecran:
x = x_max_image/2 - zoom * v1.y;
y = y_max_image/2 - zoom * v1.z;
Pt1.setX(x);
Pt1.setY(y);
*P = Pt1;
if (v1.x < 0) {return 1;} else {return 0;} // pour ne pas tracer les objets situes derriere l'observateur
}
double arc_cos_sin(double cosAlpha, double sinAlpha)
{
//cettte fonction retourne l'angle en fontion du couple [cos, sin] ce qui leve l'ambiguite sur 4 quadrants
if ( sinAlpha >= 0 ) {return acos(cosAlpha);} else {return -acos(cosAlpha);}
}
int MainWindow::projection_inverse(QPoint P, long *RAs, long *DEs)
//calcule les coordonnees RA et DE en fonction de leur point projete sur le plan
{
double x = 0; // du point projete sur le plan
double y = 0; // du point projete sur le plan
double R, D; // de l'etoile, en radians
double carre_x;
Vecteur3D v1;
v1.x=0;
v1.y=0;
v1.z=0;
x=P.x();
y=P.y();
v1.y = ( x_max_image/2 -x) /zoom;
v1.z = ( y_max_image/2 -y) /zoom;
//le point se situant sur la sphere, v1.x est determine en fonction de v1.y et v1.z
// (sur une sphere de rayon r et de centre 0, on a: x²+y²+z²=r² )
// d'ou: x² = r² - y² - z²
// x = SQRT(r² - y² - z²)
carre_x = rayon_sphere * rayon_sphere - v1.y * v1.y - v1.z * v1.z;
if (carre_x < 0)
{// on a pointe en dehors de la sphere
*RAs=0;
*DEs=0;
return 1;
}
v1.x = sqrt(carre_x);
//reste a faire tourner le vecteur en sens inverse de celui de la fonction projection
//et dans l'ordre inverse:
v1.RotX(-angleD); // rotation de champ
v1.RotZ(-angleC);
v1.RotY(-angleB);
v1.RotZ(-angleA);
// il faut maintenant en deduire les coordonnees RA et DE du point de la sphere
// RAPPEL:
// v1.x = rayon_sphere * cos(D) * cos (R);
// v1.y = rayon_sphere * cos(D) * sin (R);
// v1.z = rayon_sphere * sin(D);
D = asin(v1.z / rayon_sphere);
R = arc_cos_sin(v1.x / rayon_sphere / cos(D) , v1.y / rayon_sphere / cos(D));
//conversion des radians en secondes d'angle et de temps:
// RAPPEL:
// R = 2*M_PI / (24*3600) * RAs; // en radians
// D = M_PI / (180*3600) * DEs; // en radians
*RAs = R * 24 * 3600 / 2 / M_PI;
if (*RAs<0) {*RAs += 24*3600;}
*DEs = D * 180 * 3600 / M_PI;
if (*DEs < 0) {*DEs = 324000 - *DEs ;}
return 0;
}
void MainWindow::trace_bande_H(int di, int pas_ri, int num_zone_min, QPainter *painter_i)
//trace les arcs de cercles des longitudes ("verticales" passant par les poles)
{
int r1;
int d1;
int num_zone2 = num_zone_min;
QPoint P;
QString txt_num;
QFont font1 = painter_i->font();
painter_i->setPen(Qt::cyan);
for (r1=0; r1<=(23*3600); r1+=pas_ri)
{
if (projection(r1, 0, &P) == 0)
{
txt_num.setNum(r1 / 3600); // conversion num -> txt
font1.setPointSize(7); painter_i->setFont(font1);
painter_i->drawText(P,txt_num + "h");
}
// 2.1.1) numerotation des zones hemisphere nord
if (projection(r1+15*240, di*3600, &P) == 0)
{
txt_num.setNum(num_zone2); // conversion num -> txt
font1.setPointSize(12); painter_i->setFont(font1);
painter_i->drawText(P,txt_num);
}
// 2.1.1) numerotation des zones symetriques hemisphere sud
if (projection(r1+15*240, -di*3600, &P) == 0)
{
txt_num.setNum(num_zone2+25); // conversion num -> txt
font1.setPointSize(12); painter_i->setFont(font1);
painter_i->drawText(P,txt_num);
}
// trace des lignes
for (d1=3600*(di-15); d1<=3600*(di+15); d1+=2000)
{
if (projection(r1, d1, &P) == 0) { painter_i->drawPoint(P); }// trace un point
if (projection(r1, -d1, &P) == 0) { painter_i->drawPoint(P); }// trace un point symetrique
}
num_zone2++;
}
}
void MainWindow::calcul_aspect_etoile(float mv, float *z, float *rayon_etoile, int *rayon_halo, int *lum1 )
//calcule tous ces parametres d'affichages en fonction de la magnitude mv
{
int m_max = spinBox_magnitude_max->value();
if (m_max > 8) {m_max = 8; }
*z = (16.0 - 2.1 * mv ) * m_max / 6;
if (*z > 22) { *z=22;}
if (*z < 1) {*z=1;}
*rayon_halo = int(*z * *z /6 * zoom_double / 4.0);
*rayon_etoile = *z /2.0 * zoom_double / 4.0 ;
if (actionEtoiles_ponctuelles->isChecked()) {*rayon_etoile=1.5;}
if (actionMode_Impression->isChecked()) *rayon_etoile *= 4;
*lum1 = 255 - 10.0 * mv;
if (*lum1>255) { *lum1=255;}
if (*lum1<5) { *lum1=5;}
}
void MainWindow::affiche_legende_etoiles(QPainter *painter_i)
{
QPoint P;
int n;
float mv,z;
int lum1, rayon_halo;
float rayon_etoile;
int h, s, v, a;
QFont font1 = painter_i->font();
QString txt;
//==================================================================================
//trace du cartouche des legendes
painter_i->setPen(Qt::gray);
painter_i->setBrush(Qt::black);
painter_i->drawRect(1,1,280,70);
//trace de la legende des couleurs des etoiles
for (n=0; n<8; n++)
{
font1.setPointSize(7); painter_i->setFont(font1);
painter_i->setBrush(Tableau_couleurs_etoiles[n]);
painter_i->setPen(Tableau_couleurs_etoiles[n]);
painter_i->drawEllipse(20+20*n,15,10,10); // dessine un cercle de couleur
}
painter_i->setPen(Qt::white);
painter_i->drawText(20,40,"O B A F G K M");
//==================================================================================
//trace de la legende de la taille des etoiles
for (n=0; n<7; n++)
{
mv = n+1;
calcul_aspect_etoile(mv, &z, &rayon_etoile, &rayon_halo, &lum1);
// int demiRayonH = rayon_halo/2;
couleur_etoile = Tableau_couleurs_etoiles[2];
couleur_etoile.getHsv(&h,&s,&v,&a);
couleur_etoile.setHsv(h,saturation,lum1,a);
couleur_halo = couleur_etoile;
couleur_halo.getHsv(&h,&s,&v,&a);
couleur_halo.setHsv(h,s,255,100);
P.setX(20+40*n);
P.setY(50);
/*
if (zoom > 1)
{
if (rayon_halo > 20)
{
QPen pen(Qt::white);
pen.setWidth(1);
painter_i->setPen(pen);
painter_i->drawLine(P.x()-demiRayonH,P.y(),P.x()+demiRayonH,P.y()); // aigrette V
painter_i->drawLine(P.x(),P.y()-demiRayonH,P.x(),P.y()+demiRayonH); // aigrette H
}
painter_i->setBrush(couleur_halo);
painter_i->setPen(Qt::NoPen);
painter_i->drawEllipse(P,rayon_halo,rayon_halo);
}
*/
// DESSIN DES ETOILES
painter_i->setBrush(couleur_etoile);
painter_i->setPen(couleur_etoile);
if (rayon_etoile < 1.5)
{
painter_i->setBrush(Qt::white);
painter_i->drawPoint(P); // ponctuel
}
else
{
painter_i->setPen(Qt::NoPen);
painter_i->drawEllipse(P,int(rayon_etoile),int(rayon_etoile)); // dessine une etoile
}
painter_i->setPen(Qt::white);
font1.setPointSize(7); painter_i->setFont(font1);
txt.setNum(n+1);
painter_i->drawText(25+40*n,65,txt);
}
}
void MainWindow::trace_constellations(QPainter *painter_i, QColor couleur_ligne, QColor couleur_nom)
{
long RA_s, DE_s;
QPoint P;
QFont font1 = painter_i->font();
int x1=0; int y1=0; int x2=0; int y2=0;
QString ligne;
QString nbtxt;
QString nom2;
QString separ1, separ2;
int nb_lignes = liste_figures_cstl.size();
int l1, lg;
int G_x, G_y; // coordonnees du barycentre de la constellation
int pos1, pos2;
int hr1, row1, row2;
if (actionTracer_Constellations->isChecked())
{
for (l1=0; l1<nb_lignes; l1++) // chaque ligne code pour une constellation
{
G_x = 0;
G_y = 0;
ligne = liste_figures_cstl.operator [](l1);
pos1=ligne.indexOf(";");
if (pos1 != -1)
{
nom2= ligne.left(pos1); // recupere le nom de la constellation
int n=0;
//ls=ligne.size();
ligne.remove(0, pos1+1); // coupe le nom et le premier ";"
//a_tracer = false;
pos1=ligne.indexOf("-");
if (pos1 != -1)
{ //des nombres sont presents
bool stop=false;
pos2=0;
row1=0;
row2=0;
separ1="";
separ2="";
while (!stop)
{ //analyse du reste de la ligne (trace de la constellation)
pos2=0;
lg = ligne.length();
while ((pos2 < lg) && (ligne[pos2]!='-') && (ligne[pos2]!=';')) {pos2++;}
if (pos2 == lg) {stop=true;}
nbtxt=ligne.left(pos2); // extraction du nombre
hr1 = nbtxt.toInt(); // conversion txt -> num
row1 = row2; // debut du segment = fin du precedent
row2 = hr1-1; // fin du segment
separ1 = separ2;
separ2 = ligne[pos2];
ligne.remove(0, pos2+1); // coupe le nombre, et le separateur ("-" ou ";")
if ((separ1 == "-") && (row1 > 0) && (row2 > 0))
{
extraire_RA_DE_from_Tableau(row1, &RA_s, &DE_s);
if (projection(RA_s, DE_s, &P) == 0) // x et y sont modifies par cette fonction
{
x1=P.x();
y1=P.y();
G_x += x1;
G_y += y1;
n++;
}
extraire_RA_DE_from_Tableau(row2, &RA_s, &DE_s);
if (projection(RA_s, DE_s, &P) == 0)
{
x2=P.x();
y2=P.y();
}
painter_i->setPen(couleur_ligne);
long ds=sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
if (ds < 500*zoom) { painter_i->drawLine(x1,y1,x2,y2); }
}
//ls=ligne.indexOf("-"); // test d'arret de la boucle si plus de "-"
}
}
if (n>0)
{
G_x /=n;
G_y /=n;
}
if (!actionMode_Impression->isChecked())
{
font1.setPointSize(11);
painter_i->setFont(font1);
painter_i->setPen(couleur_nom);
painter_i->drawText(G_x,G_y,nom2);
}
}
}
}
}
void MainWindow::centrer_position(long RA_i, long DE_i)
//calul les angles dont il faut faire tourner la sphere afin que la position donnee
//soit affichee au centre de l'ecran
{
float R, D; // de l'objet, en radian
Vecteur3D v1;
if (DE_i > 324000) {DE_i = 324000 - DE_i ;}
R = 2*M_PI / (24*3600) * RA_i; // R en radian
D = M_PI / (180*3600) * DE_i; // D en radian
v1.x = rayon_sphere * cos(D) * cos (R);
v1.y = rayon_sphere * cos(D) * sin (R);
v1.z = rayon_sphere * sin(D);
angleA = -R;
angleB = D;
angleC = 0;
RA_centre = RA_i;
DE_centre = DE_i;
}
void MainWindow::calcul_anglesABC()
// en fonction de la date, de l'heure et de la position de l'observateur
{
time1 = timeEdit1->time();
float minutes = 8 + 60.0 * time1.hour() + time1.minute() + 4.0 * (day_oh_year1-79) * 0.9972696;
// sur la ligne qui suit j'ecris ostensiblement le signe moins afin qu'il ne se barre pas!
//(ce qui ferait tourner la Terre a l'envers!!!!)
angleA = (-1) * M_PI * (minutes * 0.25) / 180;
latitude_obs = M_PI / 180 *(90 - spinBox_latitude->value()); // en radian
angleB = latitude_obs;
angleC = M_PI * orientation_observateur / 180;
//angleD = M_PI / 180 *(spinBox_rot_champ->value()); // en radian
}
void MainWindow::dessiner_ciel(mode_dessin mode_i)
{
if (tabWidget1->currentIndex() != 2) { return; }
if (!a_dessiner) {return;}
a_dessiner = false;
//if (actionObjetsSDcardSeulement->isChecked())
//{
// spinBox_magnitude_max->setValue(4.5);
// spinBoxNGC_mag_max->setValue(7.0);
// actionAfficher_Numeros->setChecked(true);
// actionAfficher_Noms->setChecked(true);
//}
setCursor(Qt::WaitCursor);
int row;
long RA_s, DE_s;
float mv, z;
int lum1,rayon_halo;
float rayon_etoile;
int h, s, v, a;
QString txt_num, txt1, str1;
QString nom1, nom2, nomCommun, txt_numHR, classeSpectrale, cstl, bayer;
QString RAcentre_txt, DEcentre_txt;
QPoint P, P1, Pdecal_num, Pdecal_nom;
QPoint centre; // d'un objet
int x, y, pas_x, pas_y; // pour quadriller l'ecran avec des cases recevant du texte
bool tableau_cases[20][60]; // memorise les cases situees en [x][y] occupees par un texte (anti-collision)
for (x=0; x<20; x++) {for (y=0; y<60; y++) {tableau_cases[x][y]=false;}}
// QList <QPoint> listePoints;
// definition des couleurs
QColor gris_fonce = QColor::fromHsv(240, 0, 80, 255);
QColor gris_tres_fonce = QColor::fromHsv(240, 0, 45, 255);
QColor gris_galaxie = QColor::fromHsv(120, 5, 230, 70);
QColor bleu_tres_fonce = QColor::fromHsv(240, 255, 10, 255);
QColor bleu_fonce = QColor::fromHsv(240, 255, 120, 255);
QColor vert_fonce = QColor::fromHsv(120, 255, 100, 255);
//affectations des couleurs
QColor couleur_ciel = Qt::black;
QColor couleur_grille = gris_tres_fonce;
QColor couleur_texte_grille = gris_fonce;
QColor couleur_centre = Qt::white;
QColor couleur_zones_BSC = Qt::cyan;
QColor couleur_ecliptique = Qt::yellow;
QColor couleur_pointVernal = Qt::cyan;
QColor couleur_lignes_cstl = bleu_fonce;
QColor couleur_noms_cstl = Qt::yellow;
QColor couleur_point_vise = Qt::cyan;
QColor couleur_aigrettes = Qt::white;
QColor couleur_nom_etoile = gris_fonce;
QColor couleur_NGC = vert_fonce;
QColor couleur_champ_CCD = Qt::red;
if (actionMode_Impression->isChecked())
{
couleur_ciel = Qt::white;
couleur_grille = Qt::black;
couleur_texte_grille = Qt::black;
couleur_centre = Qt::black;
couleur_zones_BSC = Qt::black;
couleur_ecliptique = Qt::black;
couleur_pointVernal = Qt::black;
couleur_lignes_cstl = Qt::black;
couleur_noms_cstl = Qt::black;
couleur_point_vise = Qt::black;
couleur_aigrettes = Qt::black;
couleur_nom_etoile = Qt::black;
couleur_NGC = Qt::black;
couleur_champ_CCD = Qt::black;
}
if (actionMode_Impression->isChecked())
{
x_max_image = 2400;
y_max_image = 1800;
}
else
{
x_max_image = x_max_ecran;
y_max_image = y_max_ecran;
}
int x_centre_ecran = x_max_image/2;
int y_centre_ecran = y_max_image/2;
pas_x = int(x_max_image/20);
pas_y = int(y_max_image/60);
QPixmap pixmap1(x_max_image, y_max_image);
pixmap1.fill(couleur_ciel);
if (actionMode_Impression->isChecked())
{
Pdecal_nom.setX(15);
Pdecal_nom.setY(40);
Pdecal_num.setX(15);
Pdecal_num.setY(10);
}
else
{
Pdecal_nom.setX(10);
Pdecal_nom.setY(20);
Pdecal_num.setX(10);
Pdecal_num.setY(10);
}
int ri = 0;
int di = 45*3600;
zoom = float(pow(2,zoom_double)) /4;
if ((mode_i == totalite) || (mode_i == impr))
{
QPainter painter1(& pixmap1); // adresse de pixmap1 dans le constructeur
QFont font1 = painter1.font();
//==================================================================================
// boites de coordonnees de l'objet pointe
frame_4->setVisible(!actionMode_Impression->isChecked());
frame_5->setVisible(!actionMode_Impression->isChecked());
//==================================================================================
// trace le centre de l'image
if ( !actionPasTracerCentre->isChecked() || actionMode_Impression->isChecked() )
{
painter1.setPen(couleur_centre);
//painter1.setBrush(Qt::white);
painter1.drawLine(x_centre_ecran-20,y_centre_ecran,x_centre_ecran-10,y_centre_ecran); // 1er segment H
painter1.drawLine(x_centre_ecran+10,y_centre_ecran,x_centre_ecran+20,y_centre_ecran); // 2nd segment H
painter1.drawLine(x_centre_ecran,y_centre_ecran-20,x_centre_ecran,y_centre_ecran-10); // 1er segment V
painter1.drawLine(x_centre_ecran,y_centre_ecran+10,x_centre_ecran,y_centre_ecran+20); // 2nd segment V
//int r = zoom*103; painter1.drawEllipse(x0,y0, r, r); // cercle de 10 degres de diametre
//float r = zoom*103/10/3600; painter1.drawEllipse(x0,y0, r, r); // cercle de 1 seconde de diametre
}
//==================================================================================
// trace de la grille equatoriale
int LBL; // Largeur Bande Laterale
QPoint memo_P;
memo_P.setX(0);
memo_P.setY(0);
// 1) trace les cercles des latitudes ("horizontales // equateur")
if (actionTracer_grille->isChecked())
{
// 1) trace les cercles des latitudes ("horizontales // equateur")
if (!actionMode_Impression->isChecked())
{
font1.setPointSize(10);
LBL=200;
}
else
{
font1.setPointSize(16);
LBL=400;
}
painter1.setFont(font1);
for (di=-90*3600; di<=90*3600; di+=10*3600) // pas = 10 degres
{
painter1.setPen(couleur_texte_grille);
for (ri=10*60; ri<23.5*3600; ri+=3600)
{
if (projection(ri, di, &P) == 0)
{
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image)
{ //dans l'ecran
if ( P.x() < LBL || P.x() > x_max_image - LBL)
{ // mais en peripherie seulement
txt_num.setNum(di / 3600); // conversion num -> txt
painter1.drawText(P,txt_num + "deg");
}
}
}
}
painter1.setPen(couleur_grille);
memo_P.setX(0);
memo_P.setY(0);
for (ri=0; ri<=23.5*3600; ri+=400)
{
if (projection(ri, di, &P) == 0)
{
if ((P.x()!=0)&&(P.y()!=0)&&(memo_P.x()!=0)&&(memo_P.y()!=0))
{ painter1.drawLine(memo_P,P);}
memo_P = P;
//painter1.drawPoint(P); // trace un point
}
else memo_P.setX(0);
}
}
// 2) trace les cercles des longitudes ("verticales" passant par les poles)
ri = 0;
di = 45*3600;
for (ri=0*3600; ri<=23*3600; ri+=1*3600) // pas =1h
{
painter1.setPen(couleur_texte_grille);
for (di=-68; di<=72; di+=10)
{
if (projection(ri, di*3600, &P) == 0)
{
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image)
{ //dans l'ecran
if (P.y() < LBL || P.y() > y_max_image - LBL/2 )
{ // mais en peripherie seulement
txt_num.setNum(ri / 3600); // conversion num -> txt
painter1.drawText(P,txt_num + "h");
}
}
}
}
painter1.setPen(couleur_grille);
memo_P.setX(0);
memo_P.setY(0);
for (di=-90*3600; di<=90*3600; di+=4000)
{
if (projection(ri, di, &P) == 0)
{
if ((P.x()!=0)&&(P.y()!=0)&&(memo_P.x()!=0)&&(memo_P.y()!=0))
{ painter1.drawLine(memo_P,P);}
memo_P = P;
//painter1.drawPoint(P); // trace un point
}
else memo_P.setX(0);
}
}
}
//==================================================================================
// trace des limites des zones BSC5
// 1) trace les cercles des latitudes ("horizontales // equateur")
if (actionTracer_limites_cartes_BSC5->isChecked())
{
painter1.setPen(couleur_zones_BSC);
for (di=-90*3600; di<=90*3600; di+=30*3600) // pas = 30 degres
{
for (ri=0; ri<=24*3600; ri+=200)
{
if (projection(ri, di, &P) == 0) { painter1.drawPoint(P);}
}
}
// 2) trace les arcs de cercles des longitudes ("verticales" passant par les poles)
int num_zone =1;
trace_bande_H(15, 30*240, num_zone, &painter1); // entre 0deg et 30deg -> 12 zones de 30deg
num_zone =13;
trace_bande_H(45, 40*240, num_zone, &painter1); // entre 30deg et 60deg -> 9 zones de 40deg
num_zone =22;
trace_bande_H(75, 90*240, num_zone, &painter1); // entre 60deg et 90deg -> 4 zones de 90deg
}
//==================================================================================
// trace de l'ecliptique (plan dans lequel se meuh, pardon meut la Terre autour du soleil)
// et par consequence dans lequel on voit le soleil et les planetes depuis la Terre
if (actionTracer_Ecliptique->isChecked())
{
double ri_float, di_float;
memo_P.setX(0);
memo_P.setY(0);
for (ri_float=0; ri_float<=24*3600; ri_float+=1000)
{
di_float = 23.5 * 3600 * sin(ri_float/(24*3600)*2*M_PI);
painter1.setPen(couleur_ecliptique);
if (projection(ri_float, di_float, &P) == 0)
{
if ((P.x()!=0)&&(P.y()!=0)&&(memo_P.x()!=0)&&(memo_P.y()!=0))
{ painter1.drawLine(memo_P,P);}
memo_P = P;
}
else memo_P.setX(0);
}
}
//==================================================================================
font1.setPointSize(7); painter1.setFont(font1);
if (projection(0, 0, &P) == 0)
{
painter1.setPen(couleur_pointVernal);
painter1.drawLine(P.x()-5,P.y(),P.x()+5,P.y()); // aigrette V
painter1.drawLine(P.x(),P.y()-5,P.x(),P.y()+5); // aigrette H
painter1.drawText(P,"Point Vernal");
}
font1.setPointSize(8); painter1.setFont(font1);
//==================================================================================
//calcul des coordonnees des 4 coins de l'ecran
QPoint P1;
P1.setX(0); P1.setY(0);
projection_inverse(P1, &RA_aff_max, &DE_aff_max);
P1.setX(x_max_ecran); P1.setY(y_max_ecran);
projection_inverse(P1, &RA_aff_min, &DE_aff_min);
RA_min_deg = sec2deg_decim(RA_aff_min, isT)-1;
RA_max_deg = sec2deg_decim(RA_aff_max, isT)+1;
DE_min_deg = sec2deg_decim(DE_aff_min, isA)-2;
DE_max_deg = sec2deg_decim(DE_aff_max, isA)+2;
/*
//affichage (pour test)
QString RA_aff_min_txt, RA_aff_max_txt, DE_aff_min_txt, DE_aff_max_txt;
RA_aff_min_txt.setNum(RA_min_deg,'f',2);
RA_aff_max_txt.setNum(RA_max_deg,'f',2);
DE_aff_min_txt.setNum(DE_min_deg,'f',2);
DE_aff_max_txt.setNum(DE_max_deg,'f',2);
Edit_afficheur->setText(" RAmin=" + RA_aff_min_txt +" RAmax=" + RA_aff_max_txt
+" DEmin=" + DE_aff_min_txt +" DEmax=" + DE_aff_max_txt);
*/
/*====================================================================================
BOUCLE DE DESSIN DES ETOILES du catalogue Tycho2
======================================================================================*/
if (actionCatalogue_Tycho->isChecked() && !actionMode_Impression->isChecked())
{
if (!actionMode_Impression->isChecked()) {font1.setPointSize(8);} else {font1.setPixelSize(30);}
painter1.setFont(font1);
QString st1, st2;
if (spinBoxZoom->value() > 5)
{
etoiles_tyc_visibles = true; // sert en particulier pour le menu contextuel et "trouve_TYC_at_xy"
Liste_regions_tyc.clear();
liste_etoiles_TYC.clear();
get_LSTreg_tyc2(RA_min_deg, RA_max_deg, DE_min_deg, DE_max_deg, &Liste_regions_tyc, "/tycho2/", 'A');
get_lst_Tyc2(&liste_etoiles_TYC, &Liste_regions_tyc,"/tycho2/", 'A');
if (spinBoxZoom->value() > 6)
{
get_LSTreg_tyc2(RA_min_deg, RA_max_deg, DE_min_deg, DE_max_deg, &Liste_regions_tyc, "/tycho2/", 'B');
get_lst_Tyc2(&liste_etoiles_TYC, &Liste_regions_tyc,"/tycho2/", 'B');
}
TYC2rec etoile1;
int32_t i;
int32_t i_max = liste_etoiles_TYC.count();
float RAr, DEr;
long tyc_RA, tyc_DE;
painter1.setBrush(Qt::white);
for (i=0; i<i_max; i++)
{
etoile1 = liste_etoiles_TYC.at(i);
RAr =(float)etoile1.ra/15; //RAr en heures decimales (1 heure = 15 degres d'angle)
DEr =(float)etoile1.de;
tyc_RA =deg_decim2sec(RAr);
tyc_DE =deg_decim2sec(DEr);
uint8_t vt = etoile1.vt;
if (vt < spinBox_magnitude_max->value())
{
rayon_etoile = (10-vt) * zoom_double / 5.5 ;
if (actionEtoiles_ponctuelles->isChecked()) {rayon_etoile=1;}
if (projection(tyc_RA, tyc_DE, &P) == 0)
{
if (rayon_etoile < 1)
{
painter1.setPen(Qt::white);
painter1.drawPoint(P);
}
else
{
painter1.setPen(Qt::NoPen);
painter1.setBrush(Qt::white);
painter1.drawEllipse(P,int(rayon_etoile),int(rayon_etoile));
}
}
}
}
}
else { etoiles_tyc_visibles = false;}
}
/*====================================================================================
BOUCLE DE DESSIN DES ETOILES du catalogue BSC5
======================================================================================*/
if (!actionMode_Impression->isChecked()) {font1.setPointSize(8);} else {font1.setPixelSize(30);}
painter1.setFont(font1);
QRadialGradient radialGradient1;
// painter1.setPen(Qt::NoPen);
//parcours la Table Winget1
row = 0;
while (row < 9110)
{
txt1 = TableWidget_BSC->item(row,colMV)->text(); // magnitude
mv = txt1.toFloat(); // conversion txt -> num
if (mv < spinBox_magnitude_max->value())
{
extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s); //RA et DE
P.setX(0);
P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
{
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
{
//listePoints << P;
txt_numHR = TableWidget_BSC->item(row,colHR)->text(); // Numero HR
nomCommun = TableWidget_BSC->item(row,colNomCom)->text();//+ QChar(945); // Nom commun
removeCaractere('-', &nomCommun);
classeSpectrale = TableWidget_BSC->item(row,colClsSpect)->text(); // couleur
removeCaractere(' ', &classeSpectrale);
cstl = TableWidget_BSC->item(row,colCSTL)->text(); // Constellation
bayer = TableWidget_BSC->item(row,colNomBay)->text(); // abrev lettre grecque de bayer
int code_unicode_bayer = code_grec(bayer.left(3));
calcul_aspect_etoile(mv, &z, &rayon_etoile, &rayon_halo, &lum1);
int demiRayonH = rayon_halo/2;
if (classeSpectrale.at(0) == 'O') { couleur_etoile = Tableau_couleurs_etoiles[0];;}
else if (classeSpectrale.at(0) == 'B') { couleur_etoile = Tableau_couleurs_etoiles[1]; }
else if (classeSpectrale.at(0) == 'A') { couleur_etoile = Tableau_couleurs_etoiles[2]; }
else if (classeSpectrale.at(0) == 'F') { couleur_etoile = Tableau_couleurs_etoiles[3]; }
else if (classeSpectrale.at(0) == 'G') { couleur_etoile = Tableau_couleurs_etoiles[4]; }
else if (classeSpectrale.at(0) == 'K') { couleur_etoile = Tableau_couleurs_etoiles[5]; }
else if (classeSpectrale.at(0) == 'M') { couleur_etoile = Tableau_couleurs_etoiles[6]; }
else { couleur_etoile = Qt::white; }
couleur_etoile.getHsv(&h,&s,&v,&a);
//couleur_etoile.setHsv(h,saturation,lum1,a);
couleur_etoile.setHsv(h,saturation,v,a);
if (actionEtoiles_blanches->isChecked()) {couleur_etoile = Qt::white;}
if (actionMode_Impression->isChecked()) {couleur_etoile = Qt::black;}
if (actionSouligner_Etoiles_d_une_CSTL->isChecked())
{
if (cstl == cstl_pointee) { couleur_etoile = Qt::green;}
}
couleur_halo = couleur_etoile;
couleur_halo.getHsv(&h,&s,&v,&a);
couleur_halo.setHsv(h,s,255,100);
a=0;
radialGradient1.setColorAt(0.0, couleur_halo);
radialGradient1.setColorAt(1.0, Qt::black);
// DESSIN DES ETOILES
// 1 ) Aigrettes
centre = P;
if (zoom > 1)
{
if (rayon_halo > 20)
{
if (!actionEtoiles_ponctuelles->isChecked())
{
QPen pen(couleur_aigrettes);
pen.setWidth(1);
painter1.setPen(pen);
painter1.drawLine(P.x()-demiRayonH,P.y(),P.x()+demiRayonH,P.y()); // aigrette V
painter1.drawLine(P.x(),P.y()-demiRayonH,P.x(),P.y()+demiRayonH); // aigrette H
}
}
// 2) halo
if (!actionMode_Impression->isChecked()
&& !actionEtoiles_ponctuelles->isChecked()
&& !actionPas_de_halo->isChecked()
)
{
painter1.setBrush(couleur_halo);
painter1.setPen(Qt::NoPen);
radialGradient1.setCenter(P);
radialGradient1.setRadius(rayon_halo);
radialGradient1.setFocalPoint(P);
painter1.setBrush(radialGradient1);
painter1.drawEllipse(P,rayon_halo,rayon_halo);
}
}
// 3) disque de l'etoile
painter1.setBrush(couleur_etoile);
painter1.setPen(couleur_etoile);
if (rayon_etoile < 1.5)
{
painter1.setBrush(Qt::NoBrush);
painter1.drawPoint(P); // ponctuel
}
else
{
if (actionMode_Impression->isChecked())
{
painter1.setBrush(Qt::NoBrush);
}
else { painter1.setPen(Qt::NoPen);}
painter1.drawEllipse(P,int(rayon_etoile),int(rayon_etoile)); // dessine une etoile
}
//affichage du numero HR et du Nom
painter1.setPen(couleur_nom_etoile);
painter1.setBrush(Qt::NoBrush);
QPoint P_rayonEtoile;
P_rayonEtoile.setX(rayon_etoile);
P_rayonEtoile.setY(0);
QPoint P1 = P + P_rayonEtoile;
x = int(P1.x() / pas_x);
y = int(P1.y() / pas_y);
if (actionLettres_grecques->isChecked() && code_unicode_bayer !=-1)
{
font1.setPixelSize(16); painter1.setFont(font1);
painter1.setPen(couleur_etoile);
painter1.drawText(P1, QChar(code_unicode_bayer));
}
else if (actionAfficher_Noms->isChecked() && (nomCommun != "~"))
{
if (actionMode_Impression->isChecked())
{ //en mode impression on evite le chevauchement des textes
if (tableau_cases[x][y+1] == false )
{ // la case est libre
//painter1.drawRect(pas_x * x, pas_y * y, pas_x, pas_y);
painter1.drawText(pas_x * x, pas_y * (y+1) +50,nomCommun);
tableau_cases[x][y+1] = true; // on coche la case
}
}
else
{ // en mode affichage ecran, on ecrit directement au plus pres de l'etoile
painter1.drawText(P1,nomCommun);
}
}
if (actionAfficher_Numeros->isChecked())
{
if (actionMode_Impression->isChecked())
{ //en mode impression on evite le chevauchement des textes
if (tableau_cases[x][y] == false )
{ // la case est libre
//painter1.drawRect(x * pas_x, pas_y * (y+1), pas_x, pas_y);
//painter1.drawLine(P.x(),P.y(),x * pas_x, pas_y * (y+1) +40);
painter1.drawText(x * pas_x, pas_y * y +50,txt_numHR);
tableau_cases[x][y] = true; // on coche la case
}
}
else
{
painter1.drawText(P + P_rayonEtoile + Pdecal_num,txt_numHR);
}
}
}
}
}
row++;
}
/*====================================================================================
BOUCLE DE DESSIN DES OBJETS du catalogue SAC (Ciel profond)
======================================================================================*/
if (actionCiel_Profond->isChecked())
{
if (!actionMode_Impression->isChecked()) { font1.setPointSize(7);} else {font1.setPixelSize(25);}
painter1.setFont(font1);
row = 0;
while (row < nb_objets_SAC)
{
txt1 = TableWidget_NGC->item(row,colNGCMagn)->text(); // magnitude
mv = txt1.toFloat(); // conversion txt -> num
nom2 = TableWidget_NGC->item(row,colNGCNom2)->text(); // Nom2
bool isMessier = ( (nom2[0] == 'M') && nom2[1].isNumber() && nom2[2].isNumber());
if ( mv < spinBoxNGC_mag_max->value() || isMessier )
{ // on affiche toujours les objets Messier quel que soit leur magnitude
txt1 = TableWidget_NGC->item(row,colNGCRA)->text(); // RA
RA_s = txt1.toInt();
txt1 = TableWidget_NGC->item(row,colNGCDE)->text(); // DE
DE_s = txt1.toLong();
txt1 = TableWidget_NGC->item(row,colNGCDiam)->text(); // diametre en secondes
long diametre_NGC = txt1.toLong();//en secondes
float d_NGC = zoom * diametre_NGC*103/10/3600; // en pixels
P.setX(0);
P.setY(0);
if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
{
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
{
nom1 = TableWidget_NGC->item(row,colNGCNom1)->text(); // Nom1
if ((!actionObjetsSDcardSeulement->isChecked()) || (nom1.left(3) == "NGC") )
{
if (actionAfficher_Noms->isChecked() && (nom1 != "~"))
{
painter1.setPen(couleur_NGC);
if (actionMode_Impression->isChecked())
{
painter1.setBackgroundMode(Qt::OpaqueMode);
x = int(P.x() / pas_x);
y = int(P.y() / pas_y);
while ((x<20) && (y<60) && ((tableau_cases[x][y] == true ) || (tableau_cases[x+1][y] == true)))
{ //tant que les deux cases ne sont pas libres pas libre, on decalle
x++;
y++;
}
painter1.drawLine(P.x(),P.y(),pas_x * x, pas_y * y +50);
painter1.drawText(pas_x * x, pas_y * y +50, nom1 +" " +nom2);
tableau_cases[x][y] = true; // on coche la case
tableau_cases[x+1][y] = true; // ainsi que la suivante
}
else {painter1.drawText(P+Pdecal_nom,nom1 +" " +nom2);}
//painter1.drawText(P+Pdecal_num,nom2);
}
painter1.setBrush(Qt::NoBrush);
if (actionMode_Impression->isChecked())
{
painter1.setPen(Qt::black);
painter1.drawEllipse(P.x()-d_NGC/2,P.y()-d_NGC/2, d_NGC, d_NGC); // dessine un objet
}
else
{
painter1.setPen(couleur_NGC);
painter1.drawEllipse(P.x()-d_NGC/2,P.y()-d_NGC/2, d_NGC, d_NGC); // dessine un objet
painter1.drawLine(P.x()-d_NGC/10,P.y()-d_NGC/10,P.x()+d_NGC/10,P.y()+d_NGC/10); // x pour situer le centre
painter1.drawLine(P.x()-d_NGC/10,P.y()+d_NGC/10,P.x()+d_NGC/10,P.y()-d_NGC/10);
}
}
}
}
}
row++;
}
}
//====================================================================================
// trace le dessin des constellations
trace_constellations(&painter1, couleur_lignes_cstl, couleur_noms_cstl);
//====================================================================================
// trace le champ CCD
if (actionAfficher_champ_CCD->isChecked())
{
painter1.setPen(couleur_champ_CCD);
painter1.setBrush(Qt::NoBrush);
float r = zoom*103/10/60; // 1' d'angle
int x_champ = 154*r; // pour un capteur 24x36mm (APN K100D) au foyer d'une focale de 600mm
int y_champ = 2 * x_champ / 3; // pour un capteur au format 3/2
painter1.drawRect(x_centre_ecran-x_champ/2, y_centre_ecran-y_champ/2, x_champ, y_champ);
}
//====================================================================================
// Imprime les coordonnees du centre de la page dans un cartouche en haut a gauche de la page
if (actionMode_Impression->isChecked())
{
RAcentre_txt = nb_secondes2txt_hms(RA_centre);
DEcentre_txt = nb_secondes2txt_hms(DE_centre);
int x0 =30;
int y0 = 3;
painter1.setPen(Qt::black);
painter1.setBrush(Qt::white);
painter1.setBackgroundMode(Qt::OpaqueMode);
painter1.drawRect(x0, y0, 250, 100); // cartouche
painter1.setBackgroundMode(Qt::TransparentMode);
painter1.setBrush(Qt::NoBrush);
painter1.drawText(x0+10,y0+30, "Centre de la page:");
painter1.drawText(x0+10,y0+60, "RA=" +RAcentre_txt);
painter1.drawText(x0+10,y0+90, "DE=" + DEcentre_txt);
// trace un rectangle autour de la zone imprimee
painter1.drawRect(0,0, x_max_image-1, y_max_image-3);
}
//====================================================================================
if (!actionEtoiles_blanches->isChecked() && (!actionMode_Impression->isChecked()))
{
affiche_legende_etoiles(&painter1);
}
}
/*====================================================================================
AFFICHAGE PARTIEL dans les modes ci-dessous
(ne tracent pas la totalite, mais juste un detail. Rechargent l'image du ciel precedemment
affichee sur laquelle on va continuer a dessiner)
====================================================================================*/
else if (mode_i == partiel_BSC) //concerne: ETOILES BSC
{
pixmap1 = QPixmap::fromImage(image1);
QPainter painter2(& pixmap1); // adresse de pixmap1 dans le constructeur
QFont font1 = painter2.font();
row = num_objet_BSC_pointe -1;
extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s); //RA et DE
P.setX(0);
P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
{
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
{
txt_numHR = TableWidget_BSC->item(row,colHR)->text(); // Numero BSC
nomCommun = TableWidget_BSC->item(row,colNomCom)->text(); // Nom commun
removeCaractere('-', &nomCommun);
font1.setPointSize(7); painter2.setFont(font1);
painter2.setPen(Qt::cyan);
if (nomCommun !="~") {painter2.drawText(P+Pdecal_nom,nomCommun);}
painter2.drawText(P+Pdecal_num,"HR" + txt_numHR);
QString Nom=TableWidget_BSC->item(row, colNomCom)->text();
Edit_objPointe->setText("HR" + txt_numHR + " " +Nom);
txt1=TableWidget_BSC->item(row, colRA)->text();
long RAs=txt1.toLong();
Edit_RAobjPointe->setText(nb_secondes2txt_hms (RAs));
txt1=TableWidget_BSC->item(row, colDE)->text();
long DEs = txt1.toLong(); // conversion txt -> num
Edit_DEobjPointe->setText(nb_secondes2txt_hms (DEs));
}
}
}
else if (mode_i == partiel_NGC) //concerne: OBJETS NGC
{
pixmap1 = QPixmap::fromImage(image1);
QPainter painter2(& pixmap1); // adresse de pixmap1 dans le constructeur
QFont font1 = painter2.font();
QString nom1, nom2;
row = num_objet_SAC_pointe -1;
txt1 = TableWidget_NGC->item(row,colNGCRA)->text(); // RA
RA_s = txt1.toInt();
txt1 = TableWidget_NGC->item(row,colNGCDE)->text(); // DE
DE_s = txt1.toLong();
P.setX(0);
P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
{
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
{
font1.setPointSize(7); painter2.setFont(font1);
painter2.setPen(Qt::cyan);
nom1=TableWidget_NGC->item(row, colNGCNom1)->text();
nom2=TableWidget_NGC->item(row, colNGCNom2)->text();
painter2.drawText(P+Pdecal_nom, nom1);
painter2.drawText(P+Pdecal_num, nom2);
Edit_objPointe->setText(nom1 +" "+nom2);
Edit_RAobjPointe->setText(nb_secondes2txt_hms (RA_s));
Edit_DEobjPointe->setText(nb_secondes2txt_hms (DE_s));
}
}
}
else if (mode_i == partiel_TYC) //concerne: ETOILES TYCHO
{
pixmap1 = QPixmap::fromImage(image1);
QPainter painter3(& pixmap1); // adresse de pixmap1 dans le constructeur
QFont font1 = painter3.font();
QString st1, st2;
TYC2rec etoile1 = liste_etoiles_TYC.at(num_etoile_TYC_pointe);
float RAr =(float)etoile1.ra/15;
float DEr =(float)etoile1.de;
long tyc_RA =deg_decim2sec(RAr);
long tyc_DE =deg_decim2sec(DEr);
// P.setX(0);
// P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(tyc_RA, tyc_DE, &P) == 0) // x et y sont calcules par cette fonction
{
font1.setPointSize(7); painter3.setFont(font1);
painter3.setPen(Qt::yellow);
painter3.setBrush(Qt::NoBrush);
painter3.drawEllipse(P,5,5);
st1.setNum(etoile1.gscz);
st1=st1.right(4);
st2.setNum(etoile1.gscn);
painter3.drawText(P.x()+7,P.y(), "TIC "+st1 +"-"+st2);
Edit_objPointe->setText("TIC "+st1 +"-"+st2);
Edit_RAobjPointe->setText(nb_secondes2txt_hms (tyc_RA));
Edit_DEobjPointe->setText(nb_secondes2txt_hms (tyc_DE));
}
}
image1 = pixmap1.toImage();
if (actionMode_Impression->isChecked())
{ label_5->setScaledContents(true); }
else { label_5->setScaledContents(false);} // important, sinon projection inverse fausse!
label_5->setPixmap(pixmap1);
num_objet_SAC = num_objet_SAC_pointe;
setCursor(Qt::ArrowCursor);
}
void MainWindow::on_tabWidget1_currentChanged(int index)
{
if ((index == 0) ) //onglet tableau BSC5
{
// tabWidget1->resize(size1);
// this->resize(size1+size_bordure);
TableWidget_BSC->selectRow(num_objet_BSC_pointe-1);
}
else if ((index == 1) ) //onglet tableau NGC SKY
{
// tabWidget1->resize(size1);
// this->resize(size1+size_bordure);
TableWidget_NGC->selectRow(num_objet_SAC_pointe-1);
}
else if (index == 2) //onglet dessin de la carte
{
num_objet_BSC = TableWidget_BSC->currentRow()+1;
num_objet_SAC = TableWidget_NGC->currentRow()+1;
//tabWidget1->resize(2000,1500);
//label_5->setGeometry(0,0,w-40,h-40);
//label_5->setGeometry(0,0,1200,900);
// tabWidget1->resize(size2);
// this->resize(size2+size_bordure);
// label_5->setGeometry(0,0,1200,800);
a_dessiner = true;
dessiner_ciel(totalite);
}
else if (index == 3) //onglet texte DOC
{
// this->showMaximized();
int w = this->width();
int h = this->height();
// tabWidget1->resize(2000,1500);
listeDoc->resize(w-20,h-10);
}
}
void MainWindow::calcul_num_zone_BSC()
//determine le numero de zone (catalogue BSC) figurant au centre de l'ecran
{
int bande_DEC = 0;
QString str1;
//hemisphere nord ==============================================================================
if ((DE_centre > 0) && (DE_centre < 30*3600))
{
bande_DEC=15; // decli du centre de la bande qui comporte 12 zones de 30deg en RA
num_zone_BSC_centre = 1+(RA_centre/3600*15/30)%12;
}
else if ((DE_centre > 30*3600) && (DE_centre < 60*3600))
{
bande_DEC=45; // decli du centre de la bande qui comporte 9 zones de 40deg en RA
num_zone_BSC_centre = 13+(RA_centre/3600*15/40)%9;
}
else if ((DE_centre > 60*3600) && (DE_centre < 90*3600))
{
bande_DEC=75; // decli du centre de la bande qui comporte 4 zones de 90deg en RA
num_zone_BSC_centre = 22+(RA_centre/3600*15/90)%4;
}
//hemisphere sud ===============================================================================
if ((DE_centre < 0) && (DE_centre > -30*3600))
{
bande_DEC=-15; // decli du centre de la bande qui comporte 12 zones de 30deg en RA
num_zone_BSC_centre = 1+25+(RA_centre/3600*15/30)%12;
}
else if ((DE_centre < 30*3600) && (DE_centre > -60*3600))
{
bande_DEC=-45; // decli du centre de la bande qui comporte 9 zones de 40deg en RA
num_zone_BSC_centre = 25+13+(RA_centre/3600*15/40)%9;
}
else if ((DE_centre < 60*3600) && (DE_centre > 90*3600))
{
bande_DEC=-75; // decli du centre de la bande qui comporte 4 zones de 90deg en RA
num_zone_BSC_centre = 25+22+(RA_centre/3600*15/90)%4;
}
// =============================================================================================
str1.setNum(num_zone_BSC_centre); // conversion num -> txt
//Edit_zone_BSC_pointee->setText(str1);
str1.setNum(bande_DEC); // conversion num -> txt
//Edit_bande_DE->setText(str1);
}
int MainWindow::trouve_TYC_at_xy(QPoint P)
//retourne le numero HR de l'objet le plus proche de la position fournie
{
if (etoiles_tyc_visibles)
{
QString txt1;
bool ok=false;
TYC2rec etoile1;
int32_t i;
int32_t i_max = liste_etoiles_TYC.count();
float RAr, DEr;
long tyc_RA, tyc_DE;
num_etoile_TYC_pointe = 0;
i =1;
while ( (i < i_max) && !ok)
{
etoile1 = liste_etoiles_TYC.at(i);
RAr =(float)etoile1.ra/15; //etoile1.ra en degres d'angle; RAr en heures decimales
DEr =(float)etoile1.de;
tyc_RA =deg_decim2sec(RAr);
tyc_DE =deg_decim2sec(DEr);
P.setX(0);
P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(tyc_RA, tyc_DE, &P) == 0) // x et y sont calcules par cette fonction
{ // on ne teste que les etoiles situee devant l'observateur
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
{// on ne teste que les etoiles projetables dans le rectangle de l'ecran
if ( (sqrt((P.x()-PosX)*(P.x()-PosX)+(P.y()-PosY)*(P.y()-PosY))) < 10)
{ // on teste par calcul de la distance dans le plan de projection
num_etoile_TYC_pointe = i; // pour selectionner la ligne concernee dans le tableau
ok = true;
}
}
}
i++;
}
}
else num_etoile_TYC_pointe =0;
return num_etoile_TYC_pointe;
}
int MainWindow::trouve_NGC_at_xy(QPoint P)
//retourne le numero HR de l'objet le plus proche de la position fournie
{
QString txt1;
long RA_s, DE_s;
float mv;
int row = 0;
num_objet_SAC_pointe = 0;
bool ok=false;
while ( (row < nb_objets_SAC-1) && !ok)
{
txt1 = TableWidget_NGC->item(row,colNGCMagn)->text(); // magnitude
mv = txt1.toFloat(); // conversion txt -> num
if (mv < spinBoxNGC_mag_max->value())
{ // on ne teste que les objets suffisamment lumineux pour etre affichees
txt1 = TableWidget_NGC->item(row,colNGCRA)->text(); // RA
RA_s = txt1.toInt();
txt1 = TableWidget_NGC->item(row,colNGCDE)->text(); // DE
DE_s = txt1.toLong();
P.setX(0);
P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
{ // on ne teste que les etoiles situee devant l'observateur
if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
{// on ne teste que les etoiles projetables dans le rectangle de l'ecran
if ( (sqrt((P.x()-PosX)*(P.x()-PosX)+(P.y()-PosY)*(P.y()-PosY))) < 10)
{ // on teste par calcul de la distance dans le plan de projection
num_objet_SAC_pointe = row+1;
ok = true;
}
}
}
}
row++;
}
return num_objet_SAC_pointe;
}
int MainWindow::trouve_etoile_at_xy(QPoint P)
//retourne le numero HR de l'etoile la plus proche de la position fournie
{
QString txt1;
long RA_s, DE_s;
float mv;
int row = 0;
num_objet_BSC_pointe = 0;
bool ok=false;
while ( (row < 9110) && !ok)
{
txt1 = TableWidget_BSC->item(row,colMV)->text(); // magnitude
mv = txt1.toFloat(); // conversion txt -> num
if (mv < spinBox_magnitude_max->value())
{ // on ne teste que les etoiles suffisamment lumineuses pour etre affichees
extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s); //RA et DE
P.setX(0);
P.setY(0);
// x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
{ // on ne teste que les etoiles situee devant l'observateur
if ( P.x() > 0 && P.x() < x_max_ecran && P.y() > 30 && P.y() < y_max_ecran )
{// on ne teste que les etoiles projetables dans le rectangle de l'ecran
if ( (sqrt((P.x()-PosX)*(P.x()-PosX)+(P.y()-PosY)*(P.y()-PosY))) < 10)
{ // on teste par calcul de la distance dans le plan de projection
num_objet_BSC_pointe = row+1; // pour selectionner la ligne concernee dans le tableau
ok = true;
}
}
}
}
row++;
}
return num_objet_BSC_pointe;
}
void MainWindow::mousePressEvent(QMouseEvent *event)
//remarque: le menu contextuel qui s'ouvre avec le clic de droite n'est pas declenche ici,
//void MainWindow::contextMenuEvent
{
if (actionMode_Impression->isChecked())
{
actionMode_Impression->setChecked(false); // revient a l'affichage ciel noir avec menu contextuel actif
return; // a cause de recadrage de l'image + grande que l'ecran
}
QString txt_HR, txt1, Nom, nom1, nom2;
QPoint P;
long RAs, DEs;
if (event->button() == Qt::LeftButton)
{
PosX = event->x() - label_5->x()-1;
PosY = event->y() - label_5->y() - 55;
if (PosY < 20) { return;}
P.setX(PosX);
P.setY(PosY);
projection_inverse(P, &RAs, &DEs);
RA_pointe = RAs;
DE_pointe = DEs;
efface_position_pointee();
Edit_RAposPointe->setText(nb_secondes2txt_hms (RAs));
Edit_DEposPointe->setText(nb_secondes2txt_hms (DEs));
HR_pointe = trouve_etoile_at_xy(P);
if (actionSouligner_Etoiles_d_une_CSTL->isChecked())
{
if (HR_pointe !=0)
{
cstl_pointee = TableWidget_BSC->item(HR_pointe-1,colCSTL)->text();
a_dessiner = true;
dessiner_ciel(totalite);
}
}
if ((HR_pointe !=0) && (HR_pointe != memo_HR_pointe))
{
efface_objet_pointe();
a_dessiner = true;
dessiner_ciel(partiel_BSC); // rajoute l'etiquette a cote de l'etoile pointee
if (actionEditeur_de_Constellations->isChecked())
{
txt_HR.setNum(HR_pointe);
Edit_ligne_cstl->insert(txt_HR + "-") ;
}
memo_HR_pointe = HR_pointe;
}
NGC_pointe = trouve_NGC_at_xy(P);
if ((NGC_pointe !=0) && (NGC_pointe != memo_NGC_pointe))
{
efface_objet_pointe();
a_dessiner = true;
dessiner_ciel(partiel_NGC); // rajoute l'etiquette a cote de l'objet pointe
memo_NGC_pointe = NGC_pointe;
}
trouve_TYC_at_xy(P);
if ((num_etoile_TYC_pointe !=0) && etoiles_tyc_visibles )
{
a_dessiner = true;
dessiner_ciel(partiel_TYC); // rajoute l'etiquette a cote de l'etoile TYC pointe
}
}
event->accept();
}
void MainWindow::wheelEvent (QWheelEvent * event)
{
if (tabWidget1->currentIndex() != 2) return;
int numDegrees = event->delta() / 8;
int numSteps = numDegrees / 15;
if (event->orientation() == Qt::Vertical)
{
if (numSteps>0)
{ spinBoxZoom->setValue(spinBoxZoom->value()+ 0.5);}
else
{ spinBoxZoom->setValue(spinBoxZoom->value()- 0.5);}
}
event->accept();
}
void MainWindow::redimmensionner_tout()
{
tabWidget1->resize(w_ecran-10, h_ecran-30);
TableWidget_BSC->setFixedHeight(h_ecran-100);
TableWidget_NGC->setFixedHeight(h_ecran-100);
Liste_Messier->setFixedHeight(h_ecran-252);
listeDoc->setFixedWidth(w_ecran-20);
listeDoc->setFixedHeight(h_ecran-120);
label_5->setFixedWidth(w_ecran-20);
label_5->setFixedHeight(h_ecran-60);
x_max_ecran = w_ecran-10;
y_max_ecran = h_ecran-60;
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
w_ecran = event->size().width();
h_ecran = event->size().height();
event->accept();
redimmensionner_tout();
}
void MainWindow::MAJ_zoom(double z)
{
zoom_double = z;
if (actionMagnitude_max_auto->isChecked())
{
if (z<3) { actionAfficher_Noms->setChecked(false);}
spinBox_magnitude_max->setValue(2 + 2*zoom_double);
}
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_spinBox_latitude_valueChanged(int )
{
calcul_anglesABC();
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_pushButton_Date_clicked()
{
if ( !calendrier1->isVisible ()) {calendrier1->show();} else {calendrier1->hide();}
}
void MainWindow::on_actionRecharger_fichier_constellations_activated()
{
int z3 = charger_figures_cstl(QDir::currentPath() + "/catalogues/figures_constellations.txt");
// si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
if (z3 == 1) { z3 = charger_figures_cstl (QDir::currentPath() +"/figures_constellations.txt");}
a_dessiner = true;
dessiner_ciel(totalite);
}
int MainWindow::Listage_objets_BSC() // dans le TableWidget_BSC
{
QString st1, st2;
long RAs, DEs;
int n;
int nb_objets_lus=0;
int i;
int hr;
BSCrec etoile_i;
int i_max = liste_etoiles_BSC.length();
for (i=0; i< i_max; i++)
{
etoile_i = liste_etoiles_BSC.at(i);
RAs = etoile_i.ra * 3600 /15;
if (RAs !=0)
{
hr = etoile_i.hr;
st1.setNum(RAs); // conversion num -> txt
TableWidget_BSC->setItem(hr-1, colRA, new QTableWidgetItem (st1) ); // RA
DEs = etoile_i.de * 3600;
if (DEs<0) {DEs = 324000 - DEs;}
st1.setNum(DEs); // conversion num -> txt
TableWidget_BSC->setItem(hr-1, colDE, new QTableWidgetItem (st1) ); // DE
st1=""; for (n=0; n<=3; n++) {st1 += etoile_i.bayer[n]; } //lettre de Bayer
removeCaractere(' ', &st1);
st2=""; for (n=0; n<=2; n++) {st2 += etoile_i.cstl[n]; } // constellation
removeCaractere(' ', &st2);
TableWidget_BSC->setItem(hr-1, colCSTL, new QTableWidgetItem (st2) ); // constellation
TableWidget_BSC->setItem(hr-1, colNomBay, new QTableWidgetItem (st1+" "+st2) );
st1.setNum(long(etoile_i.hd)); // conversion num -> txt
TableWidget_BSC->setItem(hr-1, colHD, new QTableWidgetItem (st1) ); //HD
st1.setNum(etoile_i.hr); // conversion num -> txt
TableWidget_BSC->setItem(hr-1, colHR, new QTableWidgetItem (st1) ); //HR
st1.setNum(etoile_i.mv, 'f',3); // conversion num -> txt
if (st1.length()==1) { st1+=".00"; }
if (st1.length()==2) { st1+="00"; }
if (st1.length()==3) { st1+="0"; }
if (st1.length() > 4) { st1 = st1.left(4); }
TableWidget_BSC->setItem(hr-1, colMV, new QTableWidgetItem (st1) ); // magnitude visuelle
st1.setNum(etoile_i.mv); // conversion num -> txt
TableWidget_BSC->setItem(hr-1, colClsSpect, new QTableWidgetItem (st1) );
st1=""; for (n=0; n<=15; n++) {st1 += etoile_i.sp[n]; }
removeCaractere(' ', &st1);
TableWidget_BSC->setItem(hr-1, colClsSpect, new QTableWidgetItem (st1) ); // Classe spectrale
}
}
TableWidget_BSC->resizeColumnsToContents();
return nb_objets_lus;
}
void MainWindow::Listage_noms_etoiles()
{
int n, p;
QString ligne, nom1, nbtxt;
int hr;
int nb_lignes = liste_noms_etoiles.size();
n=0;
while (n<nb_lignes)
{
ligne = liste_noms_etoiles.operator [](n);
listeNoms->addItem(ligne);
p=ligne.indexOf(";");
nbtxt=ligne.left(p);
hr = nbtxt.toInt();
ligne.remove(0, p+1);
p=ligne.indexOf(";");
nom1= ligne.left(p); // recupere le 1er nom de l'etoile
TableWidget_BSC->setItem(hr-1, colNomCom, new QTableWidgetItem (nom1) );
n++;
}
}
int MainWindow::charger_fichier_SAC() // catalogue SAC contenant (essentiellement) les objets NGC
{
QString SAC_fileName, txt, magnitude;
int row;
int p;
row=0;
QDir repertoire1;
repertoire1.setPath(QDir::currentPath());
SAC_fileName = repertoire1.path() + chemin_SAC + "NGC628f.txt";
QFile file1(SAC_fileName);
if (file1.exists()) { file1.open(QIODevice::ReadOnly | QIODevice::Text); }
else
{
repertoire1.cdUp(); //si lance depuis le repertoire /run
SAC_fileName = repertoire1.path() + chemin_SAC + "NGC628f.txt";
file1.setFileName(SAC_fileName);
if (file1.exists()) { file1.open(QIODevice::ReadOnly | QIODevice::Text); }
else {return 1;}
}
QTextStream textStream1(&file1);
while ( !textStream1.atEnd() )
{
QString ligne = textStream1.readLine();
//Nom1 ;Nom2 ;TYPE ;Constell ;RAs ;DEs ;MAG ;SIZE_MAX ;SIZE_MIN ;PA
//NGC7831 ;IC1530 ;GALXY ;AND ;438 ;117420 ;12,8 ;1.5m ;0.3m ;38
//le fichier ne comprend pas les tabulations
if (ligne.left(1) !="#")
{
p=ligne.indexOf(";");
txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCNom1, new QTableWidgetItem (txt) );
//hr = nbtxt.toInt();
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCNom2, new QTableWidgetItem (txt) );
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCType, new QTableWidgetItem (txt) );
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCCons, new QTableWidgetItem (txt) );
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCRA, new QTableWidgetItem (txt) );
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCDE, new QTableWidgetItem (txt) );
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCMagn, new QTableWidgetItem (txt) );
ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
TableWidget_NGC->setItem(row, colNGCDiam, new QTableWidgetItem (txt) );
row++;
}
nb_objets_SAC = row;
}
TableWidget_NGC->resizeColumnsToContents();
TableWidget_NGC->setSelectionBehavior(QAbstractItemView::SelectRows);
TableWidget_NGC->selectRow(0);
return 0;
}
void MainWindow::on_timeEdit1_timeChanged(QTime )
{
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_spin_inc_date_valueChanged(int valeur)
{
QString txt1;
day_oh_year1 = valeur;
txt1.setNum(day_oh_year1); // conversion num -> txt
Edit_dayOfYear->setText(txt1 + "/365");
calendrier1->hide();
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_spinBox_magnitude_max_valueChanged(double )
{
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_Bt_Go_clicked()
{
QString str1;
int hr;
long RA1, DE1;
QString RAs, DEs;
str1 = Edit_GoNumBSC->text();
hr = str1.toInt();
if ((hr>=0) && (hr < 9110))
{
TableWidget_BSC->setCurrentCell(hr-1,colRA); // pour selectionner la ligne (a l'affichage)
RAs=TableWidget_BSC->item(hr-1,colRA)->text();
RA1 = RAs.toInt(); // conversion txt -> num
DEs=TableWidget_BSC->item(hr-1,colDE)->text();
DE1 = DEs.toLong(); // conversion txt -> num
spinBoxZoom->setValue(3); // zoom
actionAfficher_Noms->setChecked(true);
centrer_position (RA1, DE1);
num_objet_BSC = hr;
num_objet_BSC_pointe = hr;
}
}
void MainWindow::on_listeNoms_currentRowChanged(int )
{
QString ligne, hrtxt;
int p;
ligne = listeNoms->currentItem()->text();
p=ligne.indexOf(";");
hrtxt=ligne.left(p);
Edit_GoNumBSC->setText(hrtxt);
on_Bt_Go_clicked();
}
void MainWindow::on_Edit_FindName_textChanged(QString )
{
QString ligne, nom1, nom2;
int nb_car;
int n, p;
int nb_lignes = listeNoms->count();
nom1 = Edit_FindName->text().toLower();
nb_car = nom1.length();
n=0;
ligne = "";
nom2 = "";
while((nom1.left(nb_car) != nom2.left(nb_car)) && (n < nb_lignes))
{
listeNoms->setCurrentRow(n);
ligne = listeNoms->item(n)->text();
p=ligne.indexOf(";");
ligne.remove(0, p+1);
p=ligne.indexOf(";");
nom2= ligne.left(p).toLower();
n++;
}
}
void MainWindow::on_spinBoxNGC_mag_max_valueChanged(double )
{
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::rechercher_LW(QString txt_i, QListWidget *listWidget_i)
// Recherche d'un texte dans un QListWidget
{
QString txt2;
int p =0;
if (txt_i != "")
{
setCursor(Qt::WaitCursor);
int nb_lignes = listWidget_i->count();
int num_ligne = listWidget_i->currentRow()+1;
bool ok = false;
while((num_ligne < nb_lignes) && !ok)
{
txt2 = listWidget_i->item(num_ligne)->text();
if (txt2.contains(txt_i,Qt::CaseInsensitive))
{
p = txt2.indexOf(txt_i,Qt::CaseInsensitive);
ok = true;
}
else { num_ligne++; }
}
setCursor(Qt::ArrowCursor);
if (num_ligne < nb_lignes)
{
listWidget_i->setCurrentRow(num_ligne);
}
else
{
listWidget_i->setCurrentRow(0);
QMessageBox msgBox;
msgBox.setText("Occurence non trouvee, retour en haut de la liste" );
msgBox.exec();
}
}
}
void MainWindow::rechercher_TW(QString txt_i, int col_i, QTableWidget *tableWidget_i)
// Recherche d'un texte dans la colonne 'col_i' d'un QTableWidget
{
QString txt2;
if (txt_i != "")
{
setCursor(Qt::WaitCursor);
int row = tableWidget_i->currentRow()+1;
bool ok = false;
while((row < nb_objets_SAC) && !ok)
{
txt2 = tableWidget_i->item(row,col_i)->text();
if (txt2.contains(txt_i,Qt::CaseInsensitive)) {ok = true;}
row++;
}
setCursor(Qt::ArrowCursor);
if (row != nb_objets_SAC)
{
tableWidget_i->setCurrentCell(row-1,0);
}
else
{
tableWidget_i->setCurrentCell(0,0);
QMessageBox msgBox;
msgBox.setText("Occurence non trouvee, retour en haut de la liste" );
msgBox.exec();
}
}
}
void MainWindow::on_Bt_okRech1_clicked()
{
rechercher_TW(Edit_FindNameNGC1->text(), 0, TableWidget_NGC);
}
void MainWindow::on_Bt_okRech2_clicked()
{
rechercher_TW(Edit_FindNameNGC2->text(), 1, TableWidget_NGC);
}
void MainWindow::on_Bt_top1_clicked()
{
TableWidget_NGC->setCurrentCell(0,0);
}
void MainWindow::on_Bt_rech_Messier_clicked()
{
QString txt1, txt2, txt3, ligne;
int row=0;
setCursor(Qt::WaitCursor);
Liste_Messier->clear();
while((row < nb_objets_SAC))
{
txt2 = TableWidget_NGC->item(row,1)->text().toUpper() + "0";
if( (txt2[0] == 'M') && txt2[1].isNumber() && txt2[2].isNumber())
{
txt1 = TableWidget_NGC->item(row,0)->text();
txt3.setNum(row+1);
txt2.truncate(txt2.size()-1);
ligne = txt2 + '\t' + txt1 + '\t' + txt3;
Liste_Messier->addItem(ligne);
}
row++;
}
Liste_Messier->sortItems(Qt::AscendingOrder);
setCursor(Qt::ArrowCursor);
}
void MainWindow::designe_objet_NGC(int row)
{
long RA1, DE1;
float mv;
QString RAs, DEs, txt1;
RAs=TableWidget_NGC->item(row, colNGCRA)->text();
RA1 = RAs.toInt(); // conversion txt -> num
DEs=TableWidget_NGC->item(row, colNGCDE)->text();
DE1 = DEs.toLong(); // conversion txt -> num
txt1=TableWidget_NGC->item(row, colNGCMagn)->text();
mv = txt1.toFloat(); // conversion txt -> reel
//la ligne suivante evite d'avoir d'innombrables noms affiches a l'ecran
if (mv < 10) {spinBoxZoom->setValue(4); } else {spinBoxZoom->setValue(6); } // zoom; attention modifie aussi spinBoxNGC_mag_max
spinBoxNGC_mag_max->setValue(mv+1);
actionAfficher_Noms->setChecked(true);
centrer_position (RA1, DE1);
}
void MainWindow::on_Liste_Messier_currentRowChanged(int currentRow1)
{
QString ligne, nNGCtxt;
int row = 0;
int p;
if (currentRow1 > 0)
{
ligne = Liste_Messier->item(currentRow1)->text();
p=ligne.indexOf('\t');
ligne.remove(0, p+1);
p=ligne.indexOf('\t');
ligne.remove(0, p+1);
nNGCtxt=ligne.left(p);
row=nNGCtxt.toInt()-1; // le numero de ligne dans le grand tableau est egal au numero NGC decrypte ici (-1)
// (-1 parce que la numerotation des lignes dans le tableau commence par 0 )
if ((row >= 0) && (row < nb_objets_SAC-1))
{
Edit_goNumNGC->setText(nNGCtxt);
// NGC_gotoLine(row);
TableWidget_NGC->setCurrentCell(row,colNGCRA);
designe_objet_NGC(row); // prepare son centrage sur la carte
}
}
}
void MainWindow::on_TableWidget_NGC_cellClicked(int row, int )
{
designe_objet_NGC(row); // prepare son centrage sur la carte
}
void MainWindow::on_TableWidget_BSC_cellClicked(int row, int )
{
long RA1, DE1;
QString RAs, DEs;
RAs=TableWidget_BSC->item(row, colRA)->text();
RA1 = RAs.toInt(); // conversion txt -> num
DEs=TableWidget_BSC->item(row, colDE)->text();
DE1 = DEs.toLong(); // conversion txt -> num
spinBoxZoom->setValue(3); // zoom
spinBoxNGC_mag_max->setValue(8.0);
actionAfficher_Noms->setChecked(true);
centrer_position (RA1, DE1);
}
void MainWindow::on_actionTracer_Ecliptique_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_actionAfficher_Noms_toggled(bool )
{
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_actionAfficher_Numeros_triggered()
{
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_actionTracer_grille_toggled(bool )
{
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_actionTracer_Constellations_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_actionTracer_limites_cartes_BSC5_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::centrer()
//slot appele par l'action correspondante du menu contextuel
{
cliquee_G = true;
centrer_position(RA_pointe, DE_pointe);
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::centrer_plus_zoom()
//slot appele par l'action correspondante du menu contextuel
{
cliquee_G = true;
centrer_position(RA_pointe, DE_pointe);
spinBoxZoom->setValue(spinBoxZoom->value()+2);
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::centrer_moins_zoom()
//slot appele par l'action correspondante du menu contextuel
{
cliquee_G = true;
centrer_position(RA_pointe, DE_pointe);
spinBoxZoom->setValue(spinBoxZoom->value()-2);
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::centrer_objet()
//slot appele par l'action correspondante du menu contextuel
{
int row;
QString RAs, DEs;
long RA1, DE1;
efface_position_pointee();
row = HR_pointe-1;
RAs=TableWidget_BSC->item(row, colRA)->text();
RA1 = RAs.toInt(); // conversion txt -> num
DEs=TableWidget_BSC->item(row, colDE)->text();
DE1 = DEs.toLong(); // conversion txt -> num
actionAfficher_Noms->setChecked(true);
centrer_position (RA1, DE1);
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow:: a_propos_de()
{
QMessageBox msgBox;
QString st1,st2;
long RA_s, DE_s;
float RAr,DEr;
msgBox.setWindowTitle("Info");
if (HR_pointe !=0)
{
int row = HR_pointe-1;
extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s);
QString ra_txt = nb_secondes2txt_hms (RA_s);
QString de_txt = nb_secondes2txt_hms (DE_s);
QString magnitude = TableWidget_BSC->item(row,colMV)->text();
QString cstl = TableWidget_BSC->item(row,colCSTL)->text();
QString bayer = TableWidget_BSC->item(row,colNomBay)->text();
QString classeSpectrale = TableWidget_BSC->item(row,colClsSpect)->text();
msgBox.setText(Edit_objPointe->text()
+ '\n' + "Ascension droite " + ra_txt
+ '\n' + "Declinaison " + de_txt
+ '\n' + "Constellation: " + cstl
+ '\n' + "magnitude visuelle: " + magnitude
+ '\n' + "Classe spectrale: " + classeSpectrale);
}
else if (num_etoile_TYC_pointe != 0)
{
TYC2rec etoile1 = liste_etoiles_TYC.at(num_etoile_TYC_pointe);
st1.setNum(etoile1.gscz);
st1=st1.right(4);
st2.setNum(etoile1.gscn);
RAr =(float)etoile1.ra/5000000/15;
DEr =(float)etoile1.de/5000000;
RA_s =deg_decim2sec(RAr);
DE_s =deg_decim2sec(DEr);
QString ra_txt = nb_secondes2txt_hms (RA_s);
QString de_txt = nb_secondes2txt_hms (DE_s);
msgBox.setText("TIC "+st1 +"-"+st2
+ '\n' + "Ascension droite " + ra_txt
+ '\n' + "Declinaison " + de_txt);
}
msgBox.exec();
}
void MainWindow::createActions() // appele par la fonction principale
{
centrerAct = new QAction(tr("Centrer ici"), this);
connect(centrerAct, SIGNAL(triggered()), this, SLOT(centrer()));
centrer_objetAct = new QAction(tr("Centrer l'objet"), this);
connect(centrer_objetAct, SIGNAL(triggered()), this, SLOT(centrer_objet()));
centrer_zoom_plusAct = new QAction(tr("Centrer +zoom"), this);
connect(centrer_zoom_plusAct, SIGNAL(triggered()), this, SLOT(centrer_plus_zoom()));
centrer_zoom_moinsAct = new QAction(tr("Centrer -zoom"), this);
connect(centrer_zoom_moinsAct, SIGNAL(triggered()), this, SLOT(centrer_moins_zoom()));
aProposDeAct = new QAction(tr("A propos de..."), this);
connect(aProposDeAct, SIGNAL(triggered()), this, SLOT(a_propos_de()));
}
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
//declenche le menu contextuel lors du clic de droite
{
if (actionMode_Impression->isChecked()) return; // a cause de recadrage de l'image + grande que l'ecran
if (tabWidget1->currentIndex() != 2) return;
QPoint P;
long RAs, DEs, RAsP, DEsP;
QString st1,st2, Nom;
int row;
QMenu menu(this);
menu.addAction(centrerAct);
PosX = event->x() - label_5->x()-1;
PosY = event->y() - label_5->y() - 55;
if (PosY < 20) { return;}
P.setX(PosX);
P.setY(PosY);
efface_objet_pointe();
efface_position_pointee();
projection_inverse(P, &RAsP, &DEsP);
RA_pointe = RAsP;
DE_pointe = DEsP;
Edit_RAposPointe->setText(nb_secondes2txt_hms (RAsP));
Edit_DEposPointe->setText(nb_secondes2txt_hms (DEsP));
HR_pointe = trouve_etoile_at_xy(P);
num_etoile_TYC_pointe =trouve_TYC_at_xy(P);
if (HR_pointe !=0)
{
row = HR_pointe-1;
st1.setNum(HR_pointe);
Nom=TableWidget_BSC->item(row, colNomCom)->text();
Edit_objPointe->setText("HR" + st1 + " " +Nom);
menu.addAction(centrer_objetAct);
centrer_objetAct->setText("Centrer " + Edit_objPointe->text()); //change le label dans le menu contextuel
st1=TableWidget_BSC->item(row, colRA)->text();
RAs=st1.toLong();
Edit_RAobjPointe->setText(nb_secondes2txt_hms (RAs));
st1=TableWidget_BSC->item(row, colDE)->text();
DEs = st1.toLong(); // conversion txt -> num
Edit_DEobjPointe->setText(nb_secondes2txt_hms (DEs));
}
menu.addAction(centrer_zoom_plusAct);
menu.addAction(centrer_zoom_moinsAct);
if (HR_pointe !=0)
{
menu.addAction(aProposDeAct);
aProposDeAct->setText("A propos de " + Edit_objPointe->text());
}
else if (num_etoile_TYC_pointe != 0)
{
TYC2rec etoile1 = liste_etoiles_TYC.at(num_etoile_TYC_pointe);
st1.setNum(etoile1.gscz);
st1=st1.right(4);
st2.setNum(etoile1.gscn);
menu.addAction(aProposDeAct);
aProposDeAct->setText("A propos de TIC "+st1 +"-"+st2);
a_dessiner = true;
dessiner_ciel(partiel_TYC); // rajoute l'etiquette a cote de l'etoile TYC pointe
}
menu.exec(event->globalPos()); // passe la main aux sous-menus
}
void MainWindow::on_actionEtoiles_blanches_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_actionEtoiles_ponctuelles_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_actionPasTracerCentre_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_Bt_nord_clicked()
{
orientation_observateur=0;
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_Bt_sud_clicked()
{
orientation_observateur=180;
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_Bt_est_clicked()
{
orientation_observateur=90;
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_Bt_ouest_clicked()
{
orientation_observateur=-90;
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_calendrier1_clicked(QDate date)
{
QString txt1;
// date1 = calendrier1->selectedDate();
day_oh_year1 = date.dayOfYear();
spin_inc_date->setValue(day_oh_year1);
txt1.setNum(day_oh_year1); // conversion num -> txt
Edit_dayOfYear->setText(txt1 + "/365");
calendrier1->hide();
calcul_anglesABC();
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_spinBoxZoom_valueChanged(double valeurZoom)
{
MAJ_zoom(valeurZoom);
}
void MainWindow::on_actionCiel_Profond_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_actionObjetsSDcardSeulement_toggled(bool Checked)
{
if (Checked)
{
spinBox_magnitude_max->setValue(4.5);
spinBoxNGC_mag_max->setValue(7.0);
actionAfficher_Numeros->setChecked(true);
actionAfficher_Noms->setChecked(true);
}
else
{
spinBox_magnitude_max->setValue(7.0);
spinBoxNGC_mag_max->setValue(12.0);
actionAfficher_Numeros->setChecked(false);
actionAfficher_Noms->setChecked(false);
}
}
void MainWindow::on_actionImprimer_activated(int )
{
actionMode_Impression->setChecked(true);
a_dessiner = true;
dessiner_ciel(impr);
//image1 = image1.convertToFormat(QImage::Format_Mono, Qt::DiffuseDither);
QPrinter printer(QPrinter::HighResolution);
//QPrinter printer(QPrinter::ScreenResolution);
//printer.setColorMode(QPrinter::GrayScale);
printer.setPageSize(QPrinter::A4);
printer.setOrientation(QPrinter::Landscape);
printer.setResolution(300);
printer.setPageMargins ( 30, 20, 0, 0, QPrinter::Millimeter);
QPrintDialog *dialog = new QPrintDialog(&printer);
if (dialog->exec() == QDialog::Accepted)
{
QPainter painter (&printer);
painter.begin(&printer);
painter.drawImage (QRect(0,0,x_max_image,y_max_image),image1);
painter.end();
}
}
void MainWindow::on_actionMode_Impression_toggled(bool coche)
{
if (coche)
{
ne_pas_dessiner_maintenant = true; // evite de redessiner x fois a la suite
//actionTracer_grille->setChecked(false);
actionMagnitude_max_auto ->setChecked(false);
spinBoxZoom->setValue(spinBoxZoom->value() +1); //attention: cette ligne doit preceder la suivante
actionObjetsSDcardSeulement->setChecked(true); //attention: cette ligne doit suivre la precedente
}
else
{
actionObjetsSDcardSeulement->setChecked(false);
spinBoxZoom->setValue(spinBoxZoom->value() -1);
}
a_dessiner = true;
dessiner_ciel(impr);
ne_pas_dessiner_maintenant = false;
}
void MainWindow::on_Bt_docNGC_clicked()
{
int z3 = charger_texte_doc(QDir::currentPath() + "/catalogues/NGC/NGC_doc.txt");
// si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
if (z3 == 1) { z3 = charger_texte_doc (QDir::currentPath() +"/NGC_doc.txt");}
}
void MainWindow::on_Bt_astuces_clicked()
{
int z3 = charger_texte_doc(QDir::currentPath() + "/catalogues/astuces.txt");
// si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
if (z3 == 1) { z3 = charger_texte_doc (QDir::currentPath() +"/astuces.txt");}
}
void MainWindow::on_actionQuitter_activated()
{
close();
}
void MainWindow::on_actionEditeur_de_Constellations_toggled(bool coche)
{
Edit_ligne_cstl->setVisible(coche);
}
void MainWindow::on_actionSouligner_Etoiles_d_une_CSTL_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(impr);
}
void MainWindow::on_actionLettres_grecques_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_Bt_chercher_clicked()
{
rechercher_LW(Edit_rech->text(), listeDoc);
}
void MainWindow::on_actionAfficher_champ_CCD_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_actionCatalogue_Tycho_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}
void MainWindow::on_spinBox_rot_champ_valueChanged(int )
{
angleD = M_PI / 180 *(spinBox_rot_champ->value()); // en radian
if (!ne_pas_dessiner_maintenant)
{
a_dessiner = true;
dessiner_ciel(totalite);
}
}
void MainWindow::on_actionPas_de_halo_toggled(bool )
{
a_dessiner = true;
dessiner_ciel(totalite);
}