GOTO pour monture équatoriale
ATmega32 + LINUX
pour télescope 114x900 ou lunette astronomique

Nécessite une monture équatoriale ayant les deux mouvements RA et DEC équipés de vis sans fin sur roue dentée. ( et non pas une vis + butée sur la déclinaison comme en en trouve sur certaines montures bon marché).
  • Montage unique pilotant le moteur d'ascension droite ET celui de déclinaison (moteurs pas-à-pas).
  • Avec affichage des 2 infos sur le même afficheur, LCD 4 lignes de 20 caractères, rétro-éclairé (bleu).
  • Compensation de la rotation terrestre (suivi en ascension droite).
  • Vitesses lentes (par moteur pas à pas) et rapides (par moteur DC démultiplié), avec embrayage automatique.
  • Montage basé sur un microcontrôleur AVR ATmega32 programmé directement en C (avec KontrollerLab sous LINUX), tournant à 16MHz.
  • Pilotage à distance avec une simple télécommande TV universelle.
  • Fonction GOTO.
  • Positions de 1000 étoiles de référence mémorisées dans un fichier texte dans une carte mémoire SD-card.
  • Le montage (carte ATmega de commande des moteurs et affichages + télécommande IR) peut fonctionner SANS l'ordi, d'une manière autonome.
  • Montage évolutif puisque les ATmega sont des uContrôleurs flash reprogrammables.
Cette réalisation est la suite logique de l'APE2002 ... APE2007 L'utilisation d'un ATmega32 permet de tout faire avec un seul microcontrôleur, ce qui simplifie grandement la réalisation, la mise au point, la complexité de l'électronique et l'évolution de l'ensemble. La programmation en langage C, par rapport à l'assembleur, devient un réel plaisir. Le temps d'étude et réalisation et divisé par dix! Les précédentes versions étaient programmées respectivement en assembleur AVR puis en Pascal sous Window$

Cette version est basée sur des logiciels LIBRES, sous LINUX.

1 Evolution:

Septembre 2009:
L'APE2009 remplace l'APE2008
La principale différence est que l'APE2009 est entièrement basé sur l'OS libre LINUX
Les softs seront programmés sous Linux, pour Linux.
Le programme PC associé permettant de visualiser les catalogues d'objets astronomiques et de les charger dans l'APE a été ré-écrit avec Lazarus sous Linux Ubuntu.
Le firmware est écrit en langage C sous KontrolleurLab, sous Linux (Ubuntu 9.04)

18 Octobre 2009:
Depuis la version 4.1 l'APE2009 lit directement les données (noms, numéros et coordonnées des objets célestes sur une carte mémoire SD-CARD)
( Un grand merci à CC Dharmani pour la partie interface SD-card (voir liens externes))

24 novembre 2009:
Le soft côté PC est désormais programmé en C++ et Qt4 pour LINUX avec qdevelop pour LINUX.

2 LA MISE AU POINT

On aperçoit en haut au centre le programmateur USB.

En haut à droite, c'est le récepteur IR à ATmega8 qui ne servira plus.

En bas à droite, l'alimentation 5V à découpage. (Voir sa description sur ma page de l'APE2007).

3 LA REALISATION

Le petit rectangle noir sur la photo, juste à gauche de l'ATmega32, c'est le récepteur Infra-rouge.

4 -

L'ensemble du boitier électronique et de la mécanique avec ses deux moteurs pas à pas et son moteur DC adaptés sur la monture équatoriale d'une lunette 120x600.

La partie mécanique est décrite plus bas sur cette page.

L'ensemble est piloté avec une télécommande IR universelle.

5 PRINCIPE

Tout d'abord je vous invite à consulter les articles suivants sur Wikipédia si vous n'êtes pas familiarisés avec toutes ces notions utilisées par l'APE2009: Ensuite vous trouverez des explications dans les commentaires du code source en C du firmware de l'ATmega32
(le fichier ape2009.c est un fichier au format texte qui s'ouvre avec n'importe quel éditeur de texte, comme gedit, edit etc...)

Voir aussi:
Ensuite vous trouverez des explications dans les commentaires du code source en C du firmware de l'ATmega32 (le fichier ape2009.c est un fichier au format texte qui s'ouvre avec n'importe quel éditeur de texte, comme gedit, edit etc...) Voir aussi les liens externes en bas de page.

6 Le programme

Ce soft permet en quelques clics d'importer des objets depuis les catalogues d'objets astronomiques (BSC5 soit 9100 étoiles et SAC soit 11000 objets du ciel profond, nébuleuses et galaxies...), de les gérer et de les enregistrer dans une SDcard.

On a ainsi accès à des catalogues de plusieurs dizaines de milliers d'étoiles et d'objets.

Une "petite" SDcard de 1Go permet de mémoriser des milliers d'objets ce qui devrait être suffisant pour une séance d'observation en utilisation autonome! (On a pas toujours envie de promener son ordi portable la nuit dans la nature ) ; toutefois, avec le Raspberry Pi, d'autre possibilités s'offrent à nous maintenant (en 2020).

11 oct 2020 :
J'ai en effet publié cet article en 2009, et en une dizaine d'année la technique à énormément évoluée. Je parlais ci-dessus d'une carte de 1Go, et à l'époque 4GB était la "norme". Actuellement on trouve plutôt des SDcards de 256 Go et plus !

7 -

Dessin du ciel en projection "orthographique", généré automatiquement à partir de la liste des objets. Rotations et zoom fonctionnels, le tout programmé en langage Qt4 et C++.

Je fournis les sources commentées et l'exécutable pour Linux (voir plus bas). Idéal pour débuter avec C++ et Qt4.

8 -

Une vue en mode aperçu avant impression. Sont affichés par défaut les numéros HR pour les étoiles et les numéros NGC pour les onjets du ciel profond. Tout est paramétrable.

9 -

Affichage des lettres grecques de la désignation de Bayer

10 -

Zoom sur la Lyre avec affichage du catalogue Tycho

11 -

Je me suis amusé à comparer une carte affichée par mon logiciel avec une vraie photo (en médailllon, affichée dans GIMP, après rotation ce qui la dégrade un peu...) que j'ai prise avec un vrai APN (boitier Pentax K100D) au foyer d'une vraie lunette (Skywarcher 120x600). C'est "le bout" de la constellation de La Lyre avec M57 en prime. Comme vous pouvez le constater les étoiles du catalogue Tycho sont correctement représentées.

12 Code source en C++ et Qt4 du soft Planétarium

CODE SOURCE en langage C++ (with QT)
  1. /**************************************************************************
  2.  * Copyright (C) 2009-2010 by Silicium628 (France) *
  3.  * http://silicium628.chez-alice.fr/ *
  4.  * http://www.silicium628.fr/ *
  5.  * *
  6.  * This program is free software; you can redistribute it and/or modify *
  7.  * it under the terms of the GNU General Public License as published by *
  8.  * the Free Software Foundation; *
  9.  * *
  10.  * This program is distributed in the hope that it will be useful, *
  11.  * but WITHOUT ANY WARRANTY; *
  12.  * See the GNU General Public License for more details. *
  13.  ***************************************************************************/
  14.  
  15. //programme ecrit avec le logiciel libre Qdevelop avec Qt4.5.2 (dispo sous Ubuntu 9.04 et >)
  16. //attention: sous Qt4.0 ce source ne compile pas (fonctions manquantes dans certaines classes)
  17. //et l'executable compile avec Qt4.5.2 ne tourne pas sous Ubuntu 8.10 et < pour la meme raison
  18. //note: j'ai supprime les accents dans les commentaires pour ameliorer la lisibilite sur tous les OS
  19. //desole pour les personnes respectueuses de la langue (dont je suis, enfin j'essaye...)
  20.  
  21. // derniere modification de ce programme le 10 aout 2010
  22.  
  23.  
  24. /*===========================================================================================
  25. RAPPELS:
  26. ===========================================================================================
  27. GENERALITES: (source Wikipedia)
  28. --------------------------------------------------------------------------------
  29. En une annee, la Terre effectue environ 365 tours sur elle-meme par rapport au Soleil,
  30. mais effectue aussi un tour complet autour du Soleil. Donc, par rapport aux etoiles,
  31. 365 jours solaires equivalent a 366 jours sideraux.
  32. Les jours sideraux sont donc un peu plus courts que les jours solaires.
  33. La periode reelle de l'annee etant de 365,2422 jours solaires, la duree exacte
  34. du jour sideral est de : 365,2422/(365,2422+1) = 0,9972696 jour solaire, soit 23h 56m 4,09s,
  35. soit une difference d'environ 4mn par rapport au jour solaire,
  36. le rapport entre les deux etant de 1/360 = 0.0027 soit moins de 0.3% dont il faut tenir compte.
  37.  
  38. En astronomie, la position d'un astre sur la sphere celeste est reperee par deux
  39. coordonnees, l'ascension droite et la declinaison.
  40. A tout instant la somme de l'ascension droite d'un astre et de son angle horaire
  41. est egale au temps sideral.
  42. En quelque sorte le temps sideral mesure le deplacement de la voûte celeste en
  43. un lieu donne par rapport au meridien local.
  44.  
  45. Unites de l'ascension droite
  46. L'heure d'ascension droite est une unite de mesure d'angle plan et vaut 360deg/24 = 15deg.
  47. La minute d'ascension droite vaut 1/60 heure d'ascension droite soit 15 minutes d'arc.
  48. La seconde d'ascension droite vaut 1/60 minute d'ascension droite = 15 secondes d'arc.
  49.  
  50. (fin de citation de Wikipedia)
  51. ==============================================================================================
  52. Remarque:
  53. Dans ce logiciel l'ascension droite est notee RA (de Right ascension en anglais )
  54. et la declinaison est notee DE (du 'dec' de declination en anglais, mais sans le 'c'
  55. pour ne pas confondre avec 'dec' = decimal ou decrementer...)
  56. ==============================================================================================
  57.  
  58. Une lunette astronomique immobile par rapport au sol terrestre pointe dans une
  59. direction du ciel dont l'ascenssion droite (RA) augmente de 1s (de coordonnees
  60. RA siderales, =15s d'arc) toutes les 1s (de temps sideral)
  61.  
  62. 1 jour solaire = 24h00 = 1440 mn
  63. 1 jour sideral = 23h56' = 1436 mn
  64. 365 * 4' = 24h (au bout d'une annee le decallage s'annule donc)
  65. Les 4' qu'il faut ajouter au jour sideral pour obtenir un jour terrestre sont dues
  66. au deplacement de la terre sur son orbite autour du soleil d'un jour sur l'autre
  67.  
  68.  
  69. ================================ Bright Star Catalogue ====================================
  70. Je cite ici l'article de Wikipedia (version 13 fevrier 2010):
  71.  
  72. Le Bright Star Catalogue (BSC), le Catalogue des etoiles brillantes,
  73. appele egalement Yale Catalogue of Bright Stars ou Yale Bright Star Catalogue,
  74. est un catalogue d'etoiles qui liste toutes les etoiles de magnitude inferieure ou egale 6,5,
  75. ce qui correspond en gros a toutes les etoiles visibles a l'oeil nu.
  76. Sa 5e edition est actuellement disponible en ligne sur plusieurs sites.
  77. Bien que l'abreviation du catalogue soit BS ou YBS, les citations des etoiles listees
  78. dans le catalogue utilisent HR avant le numero d'ordre, d'apres le nom de son predecesseur,
  79. le Harvard Revised Photometry Catalogue cree en 1908 par l'observatoire de Harvard.
  80. (fin de citation de Wikipedia)
  81. ==============================================================================================*/
  82.  
  83. #include "mainwindow.h"
  84. // #include <string.h>
  85.  
  86. #include <QFileDialog>
  87. #include <QTextStream>
  88. #include <QMessageBox>
  89. #include <QPainter>
  90. #include <QMouseEvent>
  91. #include <QWheelEvent>
  92. #include <QPrinter>
  93. #include <QPrintDialog>
  94. // #include <QApplication>
  95.  
  96. //TYPES
  97. enum ANGLE_ou_TEMPS { isA, isT };
  98.  
  99.  
  100. //VARIABLES
  101. long RA, DE; // en secondes (de temps pour RA et d'arc pour DE)
  102. long RA_pointe, DE_pointe; // RA et DE de l'objet clique a la souris
  103. int HR_pointe, NGC_pointe; // Numero HR de l'objet pointe
  104. int memo_HR_pointe, memo_NGC_pointe; // memo Numero HR de l'objet precedemment pointe
  105. long RA_centre, DE_centre; // coordonnees du centre de l'ecran en secondes (de temps pour RA et d'arc pour DE)
  106. long RA_aff_min, RA_aff_max, DE_aff_min, DE_aff_max; //en secondes (de temps pour RA et d'arc pour DE)
  107. float RA_min_deg, RA_max_deg, DE_min_deg, DE_max_deg;//en degres decimaux, D'ANGLE pour les deux
  108. int num_objet_BSC = 0;
  109. int num_objet_SAC = 0;
  110. int num_objet_BSC_pointe = 0;
  111. int num_objet_SAC_pointe = 0;
  112. int num_etoile_TYC_pointe = 0; // numero dans la 'liste_etoiles_TYC'
  113. QString cstl_pointee;
  114. int p1, l1;
  115. QStringList liste_figures_cstl;
  116. QStringList liste_noms_etoiles;
  117. bool objet_valide = false;
  118. bool fichier_cstl_ok = false;
  119. bool cliquee_G = false;
  120. bool a_dessiner = false;
  121. bool ne_pas_dessiner_maintenant = false;
  122. bool first = false;
  123. bool etoiles_tyc_visibles = false;
  124.  
  125. QString version_i = "v8.2";
  126. QString chemin_BSC;
  127. QString chemin_SAC;
  128. QString chemin_thycho2;
  129.  
  130. int w_ecran;
  131. int h_ecran;
  132. //QSize size1(1100, 620);
  133. //QSize size2(1200,890);
  134. QSize size_bordure(10,5);
  135. int x_max_ecran = 1200; // de l'ecran de projection
  136. int y_max_ecran = 800; // de l'ecran de projection
  137. int x_max_image = x_max_ecran; // de l'image calculee (qui peut etre plus grande que l'ecran, en particulier pour imprimer)
  138. int y_max_image = y_max_ecran; // de l'image calculee
  139. uchar buffer_image[32000000];
  140. QImage image1(buffer_image, 1200,800, QImage::Format_RGB32);
  141.  
  142. int PosX, PosY; // du clic de la souris
  143. int orientation_observateur;
  144.  
  145. double zoom_double;
  146. float zoom;
  147.  
  148. float angleA,angleB,angleC,angleD;
  149. float latitude_obs;
  150. int rayon_sphere = 600; //rayon de la sphere pour projection ecran
  151.  
  152. QDate date1;
  153. QTime time1;
  154. int day_oh_year1; // 0..365
  155.  
  156. QList<BSCrec> liste_etoiles_BSC; // 9110 objets du catalogue BSC5
  157. QList<TYC2rec> liste_etoiles_TYC; // liste des etoiles Tycho a afficher
  158. QList<RegionTYC> Liste_regions_tyc; // liste des numeros de regions TYCHO a afficher
  159.  
  160. int num_zone_BSC_centre;
  161. int num_zone_BSC_centre_memo;
  162.  
  163. QColor Tableau_couleurs_etoiles[7]; // O B A F G K M (oh be a fine girl, kiss me!)
  164. QColor couleur_etoile;
  165. QColor couleur_halo;
  166. int saturation = 100; // saturation des couleurs des etoiles
  167.  
  168. //pour gerer le TableWidget_BSC:
  169. #define colHR 0
  170. #define colNomCom 1
  171. #define colNomBay 2
  172. #define colHD 3
  173. #define colRA 4
  174. #define colDE 5
  175. #define colCSTL 6
  176. #define colMV 7
  177. #define colClsSpect 8
  178.  
  179. //pour gerer le TableWidget_NGC:
  180. #define colNGCNom1 0
  181. #define colNGCNom2 1
  182. #define colNGCRA 2
  183. #define colNGCDE 3
  184. #define colNGCType 4
  185. #define colNGCCons 5
  186. #define colNGCMagn 6
  187. #define colNGCDiam 7
  188.  
  189. int nb_objets_SAC = 0;
  190.  
  191.  
  192.  
  193. MainWindow::MainWindow (QWidget * parent, Qt::WFlags f)
  194. : QMainWindow(parent, f)
  195. {
  196. setupUi(this);
  197. setWindowTitle("APE2009 version: " + version_i);
  198.  
  199. chemin_BSC="/catalogues/bsc5/";
  200. chemin_SAC="/catalogues/sac/";
  201. chemin_thycho2="/thycho2/";
  202.  
  203. QMessageBox msgBox;
  204. QString tx1;
  205. tx1="Le chargement des catalogues va prendre un certain temps, veuillez cliquer sur ok pour continuer";
  206. msgBox.setText(tx1);
  207. msgBox.exec();
  208.  
  209. setCursor(Qt::WaitCursor);
  210.  
  211. InitTableBSC();
  212. InitTableNGC();
  213. createActions();
  214.  
  215. p1=0;
  216. l1=0;
  217.  
  218. Bt_copier_vers_cadre->setIcon(QIcon(QDir::currentPath() +"/fleche_verte3b.png"));
  219. Bt_top1->setIcon(QIcon(QDir::currentPath() +"/premier.png"));
  220.  
  221. liste_etoiles_BSC.clear();
  222. getBSC(&liste_etoiles_BSC, chemin_BSC + "bsc5_628.dat");
  223.  
  224. Listage_objets_BSC();
  225.  
  226. charger_fichier_SAC();
  227.  
  228. int z4 = charger_noms_etoiles(QDir::currentPath() + "/catalogues/noms_etoiles1.txt");
  229. // si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
  230. if (z4 == 1) { z4 = charger_noms_etoiles(QDir::currentPath() +"/noms_etoiles1.txt");}
  231.  
  232. Listage_noms_etoiles();
  233.  
  234. int z2 = charger_constellations(QDir::currentPath() + "/catalogues/constellations1.txt");
  235. // si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
  236. if (z2 == 1) { z2 = charger_constellations (QDir::currentPath() +"/constellations1.txt");}
  237. if (z2 == 0) {fichier_cstl_ok = true;}
  238.  
  239. int z3 = charger_figures_cstl(QDir::currentPath() + "/catalogues/figures_constellations.txt");
  240. // si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
  241. if (z3 == 1) { z3 = charger_figures_cstl (QDir::currentPath() +"/figures_constellations.txt");}
  242.  
  243. Tableau_couleurs_etoiles[0]= QColor::fromRgb(130,150,240,255); // O bleu
  244. Tableau_couleurs_etoiles[1]= QColor::fromRgb(116,220,235,255); // B cyan
  245. Tableau_couleurs_etoiles[2]= QColor::fromRgb(255,255,255,255); // A blanc
  246. Tableau_couleurs_etoiles[3]= QColor::fromRgb(250,250,200,255); // F jaune vif
  247. Tableau_couleurs_etoiles[4]= QColor::fromRgb(235,242,138,255); // G jaune orange
  248. Tableau_couleurs_etoiles[5]= QColor::fromRgb(240,190,140,255); // K orange
  249. Tableau_couleurs_etoiles[6]= QColor::fromRgb(250,112,100,255); // M rouge
  250.  
  251. Bt_nord->click();
  252. calendrier1->hide();
  253. Edit_ligne_cstl->hide();
  254. spinBox_magnitude_max->setValue(4.0);
  255. spinBoxZoom->setValue(3.0);
  256. MAJ_zoom(spinBoxZoom->value());
  257. Edit_FindName->setText("vega");
  258.  
  259. //a_dessiner = true;
  260. //dessiner_ciel(totalite);
  261.  
  262. this->setWindowState(Qt::WindowMaximized);
  263. w_ecran = width();
  264. h_ecran = height();
  265. // QString txt1;
  266.  
  267. // ordre d'empilement des widgets (parfois delicat a maitriser avec QDevelop, donc precise ici):
  268. frame_3->raise(); //Raises this widget to the top of the parent widget's stack -> "bring to front"
  269. Edit_ligne_cstl->raise();
  270. calendrier1->raise();
  271.  
  272. //calcul_anglesABC();
  273. angleD = 0;
  274. redimmensionner_tout();
  275. a_dessiner = true;
  276. dessiner_ciel(totalite);
  277.  
  278. setCursor(Qt::ArrowCursor);
  279. }
  280.  
  281. int charger_noms_etoiles(QString nom_fichier1)
  282. {
  283. int n=0;
  284. QFile file1(nom_fichier1);
  285. if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
  286. QTextStream in(&file1);
  287. QString ligne;
  288. while ( !in.atEnd() )
  289. {
  290. ligne = in.readLine();
  291. if (ligne.left(1) !="#")
  292. {
  293. liste_noms_etoiles<<ligne;
  294. n++;
  295. }
  296. }
  297. file1.close();
  298. return 0;
  299. }
  300.  
  301.  
  302. int MainWindow::charger_constellations(QString nom_fichier1)
  303. {
  304. QStringList liste1;
  305. QFile file1(nom_fichier1);
  306. if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
  307. QTextStream in(&file1);
  308. while ( !in.atEnd() )
  309. {
  310. QString line = in.readLine();
  311. if (line.left(1) !="#") { liste1<<line; }
  312. }
  313. liste1<<"===";
  314. Cbox_Constellations->addItems(liste1);
  315. file1.close();
  316. return 0;
  317. }
  318.  
  319.  
  320. void MainWindow::InitTableBSC(void)
  321. {
  322. int n;
  323. TableWidget_BSC->setColumnCount(10);
  324. QStringList liste_entetes_BSC;
  325. liste_entetes_BSC <<"HR"<<"Nom commun"<<"Bayer"<<"HD"<<"RA"<<"DE"<<"Cstl"<<"Mv"<<"Cls Spect";
  326. TableWidget_BSC->setHorizontalHeaderLabels (liste_entetes_BSC );
  327. TableWidget_BSC->resizeColumnsToContents();
  328.  
  329. for (n=0; n<9200; n++)
  330. {
  331. TableWidget_BSC->setItem(n, colNomCom, new QTableWidgetItem ("~") );
  332. TableWidget_BSC->setItem(n, colNomBay, new QTableWidgetItem ("~") );
  333. TableWidget_BSC->setItem(n, colHD, new QTableWidgetItem ("0") );
  334. TableWidget_BSC->setItem(n, colHR, new QTableWidgetItem ("----") );
  335. TableWidget_BSC->setItem(n, colRA, new QTableWidgetItem ("00000") );
  336. TableWidget_BSC->setItem(n, colDE, new QTableWidgetItem ("0000000") );
  337. TableWidget_BSC->setItem(n, colCSTL, new QTableWidgetItem ("~__") );
  338. TableWidget_BSC->setItem(n, colMV, new QTableWidgetItem ("=___") );
  339. TableWidget_BSC->setItem(n, colClsSpect, new QTableWidgetItem ("-") );
  340. }
  341. }
  342.  
  343.  
  344. void MainWindow::InitTableNGC(void)
  345. {
  346. TableWidget_NGC->setColumnCount(8);
  347. QStringList liste_entetes_NGC;
  348. liste_entetes_NGC <<"Nom1"<<"Nom2"<<"RA"<<"DE"<<"Type"<<"Const"<<"Magn"<<"Diam";
  349. // int count =TableWidget_BSC->rowCount();
  350. TableWidget_NGC->setHorizontalHeaderLabels (liste_entetes_NGC );
  351. // TableWidget_BSC->setItem(0,0, new QTableWidgetItem("ABC")); // ( pour ecrire dans 1 case)
  352. TableWidget_NGC->resizeColumnsToContents();
  353. }
  354.  
  355.  
  356.  
  357. int MainWindow::charger_texte_doc(QString nom_fichier1)
  358. {
  359. // listeDoc->setSource(QUrl::fromLocalFile(nom_fichier1));
  360.  
  361. QFile file1(nom_fichier1);
  362. if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
  363. QTextStream in(&file1);
  364. listeDoc->clear();
  365. while ( !in.atEnd() )
  366. {
  367. QString line = in.readLine();
  368. listeDoc->addItem(line);
  369. }
  370. file1.close();
  371. return 0;
  372. }
  373.  
  374.  
  375. int charger_figures_cstl(QString nom_fichier1)
  376. {
  377. QFile file1(nom_fichier1);
  378. if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
  379. QTextStream in(&file1);
  380. liste_figures_cstl.clear();
  381. while ( !in.atEnd() )
  382. {
  383. QString line = in.readLine();
  384. if (line.left(1) !="#") { liste_figures_cstl<<line; }
  385. }
  386. file1.close();
  387. return 0;
  388. }
  389.  
  390.  
  391. void MainWindow::enregistrer_fichier_ETOILES()
  392. {
  393. QString nom1, st1, st2, ligne1 ;
  394. QString RA_txt, DE_txt, DE1, magnitude_txt;
  395. float mv, mv_max;
  396.  
  397. QFile file1(QDir::currentPath() + "/catalogues/ETOILES1.ETL");
  398. if (!file1.open(QIODevice::WriteOnly | QIODevice::Text)) return;
  399. QTextStream out(&file1);
  400. setCursor(Qt::WaitCursor);
  401.  
  402. out<< "# Liste d'objets astronomiques (catalogue BSC) pour l'APE2009 (GOTO pour telescope base sur un ATmega32)";
  403. out<<'\n'; //retour a la ligne
  404. out<< "# Les positions sont donnees en secondes (de temps pour RA et d'arc pour DE)";
  405. out<<'\n'; //retour a la ligne
  406. out<< "# Les objets sont enregistres tries par numero HR qui constitue l'index de la table";
  407. out<<'\n'; //retour a la ligne
  408. out<<'#';
  409. out<<'\n'; //retour a la ligne
  410.  
  411. mv_max = 4.5;
  412. int compte = 0;
  413. int row = 0;
  414. while (row < 9110)
  415. {
  416. magnitude_txt = TableWidget_BSC->item(row,colMV)->text(); // magnitude
  417. mv = magnitude_txt.toFloat();
  418. if ((mv != 0) && (mv < mv_max))
  419. {
  420. //-------------------------------------------------------------------------------
  421. ligne1="!E";
  422. //-------------------------------------------------------------------------------
  423. st1 = TableWidget_BSC->item(row,colHR)->text(); // numero HR
  424. st1=("0000"+st1).right(4); // formatage: toujours 4 chiffres
  425. ligne1 += st1;
  426. //-------------------------------------------------------------------------------
  427. ligne1 += "_R";
  428. RA_txt = "00000"+TableWidget_BSC->item(row,colRA)->text(); // RA
  429. ligne1 += RA_txt.right(5);
  430. //-------------------------------------------------------------------------------
  431. ligne1 += "D";
  432. DE_txt = "0000000"+TableWidget_BSC->item(row,colDE)->text(); // DE
  433. ligne1 += DE_txt.right(7);
  434. ligne1 += "_";
  435. //-------------------------------------------------------------------------------
  436. nom1 = TableWidget_BSC->item(row,colNomCom)->text(); // nom commun
  437. nom1 +="----------";
  438. ligne1 += nom1.left(10);
  439. ligne1 += "_";
  440. //-------------------------------------------------------------------------------
  441. st1 = TableWidget_BSC->item(row,colCSTL)->text(); // constellation
  442. st1+="---";
  443. ligne1 += st1.left(3);
  444. ligne1 += "_";
  445. //-------------------------------------------------------------------------------
  446. ligne1 += magnitude_txt;
  447.  
  448. out<< ligne1;
  449. out<<'\n'; //retour a la ligne
  450. compte++;
  451. }
  452. row++;
  453. }
  454. out.flush();
  455.  
  456. setCursor(Qt::ArrowCursor);
  457. st1.setNum(compte); // conversion num -> txt
  458. st2.setNum(mv_max); // conversion num -> txt
  459.  
  460. QMessageBox msgBox;
  461. msgBox.setText("Le fichier ETOILES1.ETL a ete enregistre; Il comprend " + st1 + " Etoiles de magnitude < " + st2 );
  462. msgBox.exec();
  463.  
  464. TableWidget_BSC->setCurrentCell(0,0);
  465. }
  466.  
  467.  
  468. void MainWindow::enregistrer_fichier_NGC()
  469. {
  470. QString nom1, st1, st2, ligne1 ;
  471. QString RA_txt, DE_txt, DE1, magnitude_txt;
  472. float mv, mv_max;
  473. QFile file1(QDir::currentPath() + "/catalogues/NGCSKY1.OBJ");
  474. if (!file1.open(QIODevice::WriteOnly | QIODevice::Text)) return;
  475. QTextStream out(&file1);
  476.  
  477. setCursor(Qt::WaitCursor);
  478. out<< "# Liste d'objets astronomiques NGC (catalogue SAC) pour l'APE2009 (GOTO pour telescope base sur un ATmega32)";
  479. out<<'\n'; //retour a la ligne
  480. out<< "# Les positions sont donnees en secondes (de temps pour RA et d'arc pour DE)";
  481. out<<'\n'; //retour a la ligne
  482. out<<'#';
  483. out<<'\n'; //retour a la ligne
  484.  
  485. mv_max = 10;
  486. int compte = 0;
  487. int row = 0;
  488. while (row < nb_objets_SAC)
  489. {
  490. magnitude_txt = TableWidget_NGC->item(row,colNGCMagn)->text(); // magnitude
  491. mv = magnitude_txt.toFloat();
  492. if ((mv != 0) && (mv < mv_max))
  493. {
  494. //-------------------------------------------------------------------------------
  495. ligne1="!E";
  496. //-------------------------------------------------------------------------------
  497. st1 = TableWidget_NGC->item(row,colNGCNom1)->text(); // nom1 (NGCxxxx dans la plupart des cas)
  498. if (st1.left(3) == "NGC") // on ne retient que les objets NGC
  499. {
  500. st1.remove(0,3); // (NGC)
  501. st1=("0000"+st1).right(4); // formatage: toujours 4 chiffres
  502. ligne1 += st1;
  503. //-------------------------------------------------------------------------------
  504. ligne1 += "_R";
  505. RA_txt = "00000"+TableWidget_NGC->item(row,colNGCRA)->text(); // RA
  506. ligne1 += RA_txt.right(5);
  507. //-------------------------------------------------------------------------------
  508. ligne1 += "D";
  509. DE_txt = "0000000"+TableWidget_NGC->item(row,colNGCDE)->text(); // DE
  510. ligne1 += DE_txt.right(7);
  511. ligne1 += "_";
  512. //-------------------------------------------------------------------------------
  513. nom1 = TableWidget_NGC->item(row,colNGCNom2)->text(); // nom2
  514. nom1 +="----------";
  515. ligne1 += nom1.left(10);
  516. ligne1 += "_";
  517. //-------------------------------------------------------------------------------
  518. st1 = TableWidget_NGC->item(row,colNGCCons)->text(); // constellation
  519. st1+="---";
  520. ligne1 += st1.left(3);
  521. ligne1 += "_";
  522. //-------------------------------------------------------------------------------
  523. ligne1 += magnitude_txt;
  524.  
  525. out<< ligne1;
  526. out<<'\n'; //retour a la ligne
  527. compte++;
  528. }
  529. }
  530. row++;
  531. }
  532. out.flush();
  533.  
  534. setCursor(Qt::ArrowCursor);
  535. st1.setNum(compte); // conversion num -> txt
  536. st2.setNum(mv_max); // conversion num -> txt
  537. QMessageBox msgBox;
  538.  
  539. msgBox.setText("Le fichier NGCSKY1.OBJ a ete enregistre; Il comprend " + st1 + " objets de magnitude < " + st2 );
  540. msgBox.exec();
  541.  
  542. TableWidget_BSC->setCurrentCell(0,0);
  543. }
  544.  
  545.  
  546. void MainWindow::decodage_abrev_constell(void)
  547. //par comparaison des textes entiers et/ou des abreviations
  548. {
  549. int i1;
  550. QString texte1, texte2, texteA, texteB ="";
  551. i1=0;
  552.  
  553. texteB = Edit7->text().left(4); // debut du texte complet
  554. texte2 = Edit7->text().right(3); // abreviation seulement
  555. while ((texte1 != texte2 ) && (texteA != texteB ) && (i1<=88))
  556. {
  557. Cbox_Constellations->setCurrentIndex(i1);
  558. texteA = Cbox_Constellations->currentText().left(4);
  559. texte1 = Cbox_Constellations->currentText().right(3);
  560. i1++;
  561. }
  562. if (i1>88) { Edit12->setText(texte1); } else {Edit12 ->setText("===");}
  563. }
  564.  
  565.  
  566. int MainWindow::text2secondes (QLineEdit *Edit_i)
  567. // convertit le texte du QLineEdit passe par adresse en un nombre de secondes
  568. // le texte du QLineEdit doit etre de la forme "12:34:56" pour: degres:minutes:secondes OU heures:minutes:secondes
  569. {
  570. //19:8:39
  571. //on va decouper le texte en 3 tronçons '19' , '8' et '39'
  572. QString txt0,txt1,txt2,txt3;
  573. int p1,p2;
  574. int h,m,s;
  575. long s_out;
  576. char signeD ='+';
  577.  
  578. txt0 = Edit_i->text();
  579. p1 = txt0.indexOf(":"); // position du premier ":"
  580. txt1 = txt0.left(p1); // '19'
  581. if (txt1.left(1) == "-")
  582. {
  583. signeD='-';
  584. txt1.remove(0,1);
  585. }
  586. // if (txt0.contains("-", Qt::CaseInsensitive)) {signeD='-';}
  587. txt0.remove(0, p1+1); // on coupe le debut
  588. p2 = txt0.indexOf(":"); // position du ":" suivant
  589. txt2 = txt0.left(p2); // '8' remarque: ok quel que soit le nb de chiffres
  590. txt0.remove(0, p2+1); // on coupe le debut
  591. txt3 = txt0; // le compilateur simplifiera!
  592. h = txt1.toInt(); // conversion txt -> num
  593. m = txt2.toInt(); // conversion txt -> num
  594. s = txt3.toInt(); // conversion txt -> num
  595. s_out = s + 60 * m + 3600 * h;
  596. if (signeD == '-') { s_out = 324000 + s_out; }
  597. return s_out;
  598. }
  599.  
  600.  
  601. float sec2deg_decim(long nb_sec, ANGLE_ou_TEMPS typ_i)
  602. //convertit un nombre de secondes en degres decimaux (degres d'angles)
  603. // si la valeur entree est une ascension droite (RA), le resultat est une valeur comprise entre 0 et 360
  604. // si la valeur entree est une declinaison (DE), le resultat est une valeur comprise entre -90 et +90
  605. {
  606. float d;
  607. if( typ_i == isT)
  608. {
  609. d = 15 * (float)nb_sec / 3600; // RA=360deg/24h soit 15deg/h
  610. }
  611. else if( typ_i == isA)
  612. {
  613. if (nb_sec > 324000)
  614. {
  615. nb_sec -= 324000;
  616. d = -(float)nb_sec / 3600; // il y a un signe (-) devant float!!!!
  617. }
  618. else
  619. {
  620. d = (float)nb_sec / 3600;
  621. }
  622. }
  623. else d=0;
  624. return d;
  625. }
  626.  
  627.  
  628. long deg_decim2sec(float valeur)
  629. //convertit un reel (degres decimaux) en secondes
  630. {
  631. float f;
  632. long s;
  633.  
  634. f = valeur * 3600;
  635. if (valeur < 0) { f = -f +324000; }
  636. s = floor(f);
  637. return s;
  638. }
  639.  
  640.  
  641. void MainWindow::on_Bt_copier_vers_cadre_clicked()
  642. {
  643. long nb_secondes;
  644.  
  645. int row = TableWidget_BSC->currentRow();
  646. Edit_nom->setText(TableWidget_BSC->item(row,colNomCom)->text()); // nom commun
  647.  
  648. Edit_RAs->setText(TableWidget_BSC->item(row,colRA)->text()); // RA affichage en secondes
  649.  
  650. nb_secondes = Edit_RAs->text().toInt(); // conversion txt -> num
  651. Edit_RA->setText(nb_secondes2txt_hms(nb_secondes) ); //affichage hh:mm:ss
  652.  
  653. Edit_DEs->setText(TableWidget_BSC->item(row,colDE)->text());
  654. nb_secondes = Edit_DEs->text().toInt(); // conversion txt -> num
  655. if (nb_secondes > 324000) {nb_secondes = 324000 - nb_secondes ;}
  656. Edit_DE->setText(nb_secondes2txt_hms(nb_secondes) ); //affichage hh:mm:ss
  657.  
  658. Edit_magnitude->setText(TableWidget_BSC->item(row,colMV)->text()); // magnitude
  659.  
  660. Edit7->setText(TableWidget_BSC->item(row,colCSTL)->text()); // constellation
  661. decodage_abrev_constell();
  662. }
  663.  
  664.  
  665. void MainWindow::on_Edit_RA_editingFinished()
  666. {
  667. QString RA_txt;
  668. RA_txt.setNum(text2secondes(Edit_RA)); // conversion num -> txt
  669.  
  670. RA_txt.insert(0, "00000");
  671. RA_txt = RA_txt.right(5); // le string RA contient exactement 5 caracteres (avec des 0 devant)
  672. Edit_RAs -> setText(RA_txt);// AffichageEtendu en secondes; plus grand AffichageEtendu = '86400' (5 caract)
  673. }
  674.  
  675.  
  676. void MainWindow::on_Edit_DE_editingFinished()
  677. {
  678. QString DE_txt;
  679.  
  680. DE_txt.setNum(text2secondes(Edit_DE)); // conversion num -> txt
  681. DE_txt.insert(0, "00000");
  682. DE_txt = DE_txt.right(7); // le string DE contient exactement 7 caracteres (avec des 0 devant)
  683. Edit_DEs -> setText(DE_txt);// AffichageEtendu en secondes; plus grand AffichageEtendu = '-324000' (7 caract)
  684. }
  685.  
  686.  
  687. void MainWindow::on_actionEnregistrer_activated()
  688. {
  689. spinBox_magnitude_max->setValue(4.5);
  690. spinBoxNGC_mag_max->setValue(10.0);
  691. enregistrer_fichier_ETOILES(); // pour la SDcard
  692. enregistrer_fichier_NGC(); // pour la SDcard
  693. }
  694.  
  695.  
  696. void MainWindow::efface_objet_pointe()
  697. {
  698. Edit_objPointe->setText("");
  699. Edit_RAobjPointe->setText("");
  700. Edit_DEobjPointe->setText("");
  701. }
  702.  
  703. void MainWindow::efface_position_pointee()
  704. {
  705. Edit_RAposPointe->setText("");
  706. Edit_DEposPointe->setText("");
  707. }
  708.  
  709.  
  710. void MainWindow::extraire_RA_DE_from_Tableau(int row_i, long *RA_out, long *DE_out)
  711. {
  712. QString txt1;
  713. txt1 = TableWidget_BSC->item(row_i,colRA)->text(); // RA
  714. *RA_out = txt1.toInt(); // conversion txt -> num
  715. txt1 = TableWidget_BSC->item(row_i,colDE)->text(); // DE
  716. *DE_out = txt1.toLong();
  717. }
  718.  
  719.  
  720. int MainWindow::projection(long RAs, long DEs, QPoint *P)
  721. //convertit les coordonnees RA et DE (donnees en secondes de temps et d'arc) en projection plane
  722.  
  723. /*=============================== PROJECTION =====================================================
  724. Projection "orthographique":
  725. On place le plan de projection tangent a la sphere et on projette les points perpendiculairement a ce plan
  726. ==================================================================================================*/
  727. {
  728. double x = 0; // du point projete sur le plan
  729. double y = 0; // du point projete sur le plan
  730. double R, D; // de l'etoile, en radians
  731.  
  732. QPoint Pt1;
  733. Vecteur3D v1;
  734. QString txt1;
  735.  
  736. if (DEs > 324000) {DEs = 324000 - DEs ;}
  737.  
  738. R = 2*M_PI / (24*3600) * RAs; // en radians
  739. D = M_PI / (180*3600) * DEs; // en radians
  740.  
  741. v1.x = rayon_sphere * cos(D) * cos (R);
  742. v1.y = rayon_sphere * cos(D) * sin (R);
  743. v1.z = rayon_sphere * sin(D);
  744.  
  745. v1.RotZ(angleA); // rotation terrestre
  746. v1.RotY(angleB); // inclinaison de l'axe des poles due a la latitude RotX
  747. v1.RotZ(angleC); // rotation de l'observateur sur lui-meme
  748.  
  749. v1.RotX(angleD); // rotation de champ
  750.  
  751. /* REMARQUE:
  752. -les rotations se font par rapport a l'observateur (repere x,y,z) et non par rapport a l'objet
  753. -l'ordre des rotations est donc important
  754. */
  755.  
  756. //projection sur l'ecran:
  757. x = x_max_image/2 - zoom * v1.y;
  758. y = y_max_image/2 - zoom * v1.z;
  759.  
  760. Pt1.setX(x);
  761. Pt1.setY(y);
  762. *P = Pt1;
  763. if (v1.x < 0) {return 1;} else {return 0;} // pour ne pas tracer les objets situes derriere l'observateur
  764. }
  765.  
  766.  
  767. double arc_cos_sin(double cosAlpha, double sinAlpha)
  768. {
  769. //cettte fonction retourne l'angle en fontion du couple [cos, sin] ce qui leve l'ambiguite sur 4 quadrants
  770. if ( sinAlpha >= 0 ) {return acos(cosAlpha);} else {return -acos(cosAlpha);}
  771. }
  772.  
  773.  
  774. int MainWindow::projection_inverse(QPoint P, long *RAs, long *DEs)
  775. //calcule les coordonnees RA et DE en fonction de leur point projete sur le plan
  776. {
  777. double x = 0; // du point projete sur le plan
  778. double y = 0; // du point projete sur le plan
  779. double R, D; // de l'etoile, en radians
  780. double carre_x;
  781. Vecteur3D v1;
  782.  
  783. v1.x=0;
  784. v1.y=0;
  785. v1.z=0;
  786.  
  787. x=P.x();
  788. y=P.y();
  789.  
  790. v1.y = ( x_max_image/2 -x) /zoom;
  791. v1.z = ( y_max_image/2 -y) /zoom;
  792.  
  793. //le point se situant sur la sphere, v1.x est determine en fonction de v1.y et v1.z
  794. // (sur une sphere de rayon r et de centre 0, on a: x²+y²+z²=r² )
  795. // d'ou: x² = r² - y² - z²
  796. // x = SQRT(r² - y² - z²)
  797. carre_x = rayon_sphere * rayon_sphere - v1.y * v1.y - v1.z * v1.z;
  798. if (carre_x < 0)
  799. {// on a pointe en dehors de la sphere
  800. *RAs=0;
  801. *DEs=0;
  802. return 1;
  803. }
  804. v1.x = sqrt(carre_x);
  805. //reste a faire tourner le vecteur en sens inverse de celui de la fonction projection
  806. //et dans l'ordre inverse:
  807. v1.RotX(-angleD); // rotation de champ
  808. v1.RotZ(-angleC);
  809. v1.RotY(-angleB);
  810. v1.RotZ(-angleA);
  811. // il faut maintenant en deduire les coordonnees RA et DE du point de la sphere
  812. // RAPPEL:
  813. // v1.x = rayon_sphere * cos(D) * cos (R);
  814. // v1.y = rayon_sphere * cos(D) * sin (R);
  815. // v1.z = rayon_sphere * sin(D);
  816. D = asin(v1.z / rayon_sphere);
  817. R = arc_cos_sin(v1.x / rayon_sphere / cos(D) , v1.y / rayon_sphere / cos(D));
  818. //conversion des radians en secondes d'angle et de temps:
  819. // RAPPEL:
  820. // R = 2*M_PI / (24*3600) * RAs; // en radians
  821. // D = M_PI / (180*3600) * DEs; // en radians
  822. *RAs = R * 24 * 3600 / 2 / M_PI;
  823. if (*RAs<0) {*RAs += 24*3600;}
  824. *DEs = D * 180 * 3600 / M_PI;
  825. if (*DEs < 0) {*DEs = 324000 - *DEs ;}
  826.  
  827. return 0;
  828. }
  829.  
  830.  
  831. void MainWindow::trace_bande_H(int di, int pas_ri, int num_zone_min, QPainter *painter_i)
  832. //trace les arcs de cercles des longitudes ("verticales" passant par les poles)
  833. {
  834. int r1;
  835. int d1;
  836. int num_zone2 = num_zone_min;
  837. QPoint P;
  838. QString txt_num;
  839. QFont font1 = painter_i->font();
  840. painter_i->setPen(Qt::cyan);
  841.  
  842. for (r1=0; r1<=(23*3600); r1+=pas_ri)
  843. {
  844. if (projection(r1, 0, &P) == 0)
  845. {
  846. txt_num.setNum(r1 / 3600); // conversion num -> txt
  847. font1.setPointSize(7); painter_i->setFont(font1);
  848. painter_i->drawText(P,txt_num + "h");
  849. }
  850.  
  851. // 2.1.1) numerotation des zones hemisphere nord
  852. if (projection(r1+15*240, di*3600, &P) == 0)
  853. {
  854. txt_num.setNum(num_zone2); // conversion num -> txt
  855. font1.setPointSize(12); painter_i->setFont(font1);
  856. painter_i->drawText(P,txt_num);
  857. }
  858. // 2.1.1) numerotation des zones symetriques hemisphere sud
  859. if (projection(r1+15*240, -di*3600, &P) == 0)
  860. {
  861. txt_num.setNum(num_zone2+25); // conversion num -> txt
  862. font1.setPointSize(12); painter_i->setFont(font1);
  863. painter_i->drawText(P,txt_num);
  864. }
  865. // trace des lignes
  866. for (d1=3600*(di-15); d1<=3600*(di+15); d1+=2000)
  867. {
  868. if (projection(r1, d1, &P) == 0) { painter_i->drawPoint(P); }// trace un point
  869. if (projection(r1, -d1, &P) == 0) { painter_i->drawPoint(P); }// trace un point symetrique
  870. }
  871. num_zone2++;
  872. }
  873. }
  874.  
  875.  
  876. void MainWindow::calcul_aspect_etoile(float mv, float *z, float *rayon_etoile, int *rayon_halo, int *lum1 )
  877. //calcule tous ces parametres d'affichages en fonction de la magnitude mv
  878. {
  879. int m_max = spinBox_magnitude_max->value();
  880. if (m_max > 8) {m_max = 8; }
  881. *z = (16.0 - 2.1 * mv ) * m_max / 6;
  882. if (*z > 22) { *z=22;}
  883. if (*z < 1) {*z=1;}
  884.  
  885. *rayon_halo = int(*z * *z /6 * zoom_double / 4.0);
  886. *rayon_etoile = *z /2.0 * zoom_double / 4.0 ;
  887. if (actionEtoiles_ponctuelles->isChecked()) {*rayon_etoile=1.5;}
  888. if (actionMode_Impression->isChecked()) *rayon_etoile *= 4;
  889.  
  890. *lum1 = 255 - 10.0 * mv;
  891. if (*lum1>255) { *lum1=255;}
  892. if (*lum1<5) { *lum1=5;}
  893. }
  894.  
  895.  
  896. void MainWindow::affiche_legende_etoiles(QPainter *painter_i)
  897. {
  898. QPoint P;
  899. int n;
  900. float mv,z;
  901. int lum1, rayon_halo;
  902. float rayon_etoile;
  903. int h, s, v, a;
  904. QFont font1 = painter_i->font();
  905. QString txt;
  906. //==================================================================================
  907. //trace du cartouche des legendes
  908. painter_i->setPen(Qt::gray);
  909. painter_i->setBrush(Qt::black);
  910. painter_i->drawRect(1,1,280,70);
  911. //trace de la legende des couleurs des etoiles
  912. for (n=0; n<8; n++)
  913. {
  914. font1.setPointSize(7); painter_i->setFont(font1);
  915. painter_i->setBrush(Tableau_couleurs_etoiles[n]);
  916. painter_i->setPen(Tableau_couleurs_etoiles[n]);
  917. painter_i->drawEllipse(20+20*n,15,10,10); // dessine un cercle de couleur
  918. }
  919. painter_i->setPen(Qt::white);
  920. painter_i->drawText(20,40,"O B A F G K M");
  921.  
  922. //==================================================================================
  923. //trace de la legende de la taille des etoiles
  924. for (n=0; n<7; n++)
  925. {
  926. mv = n+1;
  927. calcul_aspect_etoile(mv, &z, &rayon_etoile, &rayon_halo, &lum1);
  928. // int demiRayonH = rayon_halo/2;
  929. couleur_etoile = Tableau_couleurs_etoiles[2];
  930. couleur_etoile.getHsv(&h,&s,&v,&a);
  931. couleur_etoile.setHsv(h,saturation,lum1,a);
  932.  
  933. couleur_halo = couleur_etoile;
  934. couleur_halo.getHsv(&h,&s,&v,&a);
  935. couleur_halo.setHsv(h,s,255,100);
  936.  
  937. P.setX(20+40*n);
  938. P.setY(50);
  939.  
  940. /*
  941. if (zoom > 1)
  942. {
  943. if (rayon_halo > 20)
  944. {
  945. QPen pen(Qt::white);
  946. pen.setWidth(1);
  947. painter_i->setPen(pen);
  948.   painter_i->drawLine(P.x()-demiRayonH,P.y(),P.x()+demiRayonH,P.y()); // aigrette V
  949.   painter_i->drawLine(P.x(),P.y()-demiRayonH,P.x(),P.y()+demiRayonH); // aigrette H
  950.   }
  951. painter_i->setBrush(couleur_halo);
  952. painter_i->setPen(Qt::NoPen);
  953.   painter_i->drawEllipse(P,rayon_halo,rayon_halo);
  954. }
  955. */
  956.  
  957. // DESSIN DES ETOILES
  958. painter_i->setBrush(couleur_etoile);
  959. painter_i->setPen(couleur_etoile);
  960. if (rayon_etoile < 1.5)
  961. {
  962. painter_i->setBrush(Qt::white);
  963. painter_i->drawPoint(P); // ponctuel
  964. }
  965. else
  966. {
  967. painter_i->setPen(Qt::NoPen);
  968. painter_i->drawEllipse(P,int(rayon_etoile),int(rayon_etoile)); // dessine une etoile
  969. }
  970.  
  971. painter_i->setPen(Qt::white);
  972. font1.setPointSize(7); painter_i->setFont(font1);
  973. txt.setNum(n+1);
  974. painter_i->drawText(25+40*n,65,txt);
  975. }
  976. }
  977.  
  978.  
  979. void MainWindow::trace_constellations(QPainter *painter_i, QColor couleur_ligne, QColor couleur_nom)
  980. {
  981. long RA_s, DE_s;
  982. QPoint P;
  983. QFont font1 = painter_i->font();
  984. int x1=0; int y1=0; int x2=0; int y2=0;
  985. QString ligne;
  986. QString nbtxt;
  987. QString nom2;
  988. QString separ1, separ2;
  989.  
  990. int nb_lignes = liste_figures_cstl.size();
  991. int l1, lg;
  992. int G_x, G_y; // coordonnees du barycentre de la constellation
  993. int pos1, pos2;
  994. int hr1, row1, row2;
  995.  
  996. if (actionTracer_Constellations->isChecked())
  997. {
  998. for (l1=0; l1<nb_lignes; l1++) // chaque ligne code pour une constellation
  999. {
  1000. G_x = 0;
  1001. G_y = 0;
  1002. ligne = liste_figures_cstl.operator [](l1);
  1003. pos1=ligne.indexOf(";");
  1004. if (pos1 != -1)
  1005. {
  1006. nom2= ligne.left(pos1); // recupere le nom de la constellation
  1007. int n=0;
  1008. //ls=ligne.size();
  1009. ligne.remove(0, pos1+1); // coupe le nom et le premier ";"
  1010. //a_tracer = false;
  1011. pos1=ligne.indexOf("-");
  1012. if (pos1 != -1)
  1013. { //des nombres sont presents
  1014. bool stop=false;
  1015. pos2=0;
  1016. row1=0;
  1017. row2=0;
  1018. separ1="";
  1019. separ2="";
  1020. while (!stop)
  1021. { //analyse du reste de la ligne (trace de la constellation)
  1022.  
  1023. pos2=0;
  1024. lg = ligne.length();
  1025. while ((pos2 < lg) && (ligne[pos2]!='-') && (ligne[pos2]!=';')) {pos2++;}
  1026.  
  1027. if (pos2 == lg) {stop=true;}
  1028.  
  1029. nbtxt=ligne.left(pos2); // extraction du nombre
  1030. hr1 = nbtxt.toInt(); // conversion txt -> num
  1031. row1 = row2; // debut du segment = fin du precedent
  1032. row2 = hr1-1; // fin du segment
  1033. separ1 = separ2;
  1034. separ2 = ligne[pos2];
  1035.  
  1036.  
  1037. ligne.remove(0, pos2+1); // coupe le nombre, et le separateur ("-" ou ";")
  1038.  
  1039.  
  1040. if ((separ1 == "-") && (row1 > 0) && (row2 > 0))
  1041. {
  1042. extraire_RA_DE_from_Tableau(row1, &RA_s, &DE_s);
  1043. if (projection(RA_s, DE_s, &P) == 0) // x et y sont modifies par cette fonction
  1044. {
  1045. x1=P.x();
  1046. y1=P.y();
  1047. G_x += x1;
  1048. G_y += y1;
  1049. n++;
  1050. }
  1051. extraire_RA_DE_from_Tableau(row2, &RA_s, &DE_s);
  1052. if (projection(RA_s, DE_s, &P) == 0)
  1053. {
  1054. x2=P.x();
  1055. y2=P.y();
  1056. }
  1057. painter_i->setPen(couleur_ligne);
  1058. long ds=sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
  1059. if (ds < 500*zoom) { painter_i->drawLine(x1,y1,x2,y2); }
  1060.  
  1061. }
  1062. //ls=ligne.indexOf("-"); // test d'arret de la boucle si plus de "-"
  1063. }
  1064. }
  1065. if (n>0)
  1066. {
  1067. G_x /=n;
  1068. G_y /=n;
  1069. }
  1070. if (!actionMode_Impression->isChecked())
  1071. {
  1072. font1.setPointSize(11);
  1073. painter_i->setFont(font1);
  1074. painter_i->setPen(couleur_nom);
  1075. painter_i->drawText(G_x,G_y,nom2);
  1076. }
  1077. }
  1078. }
  1079. }
  1080. }
  1081.  
  1082.  
  1083. void MainWindow::centrer_position(long RA_i, long DE_i)
  1084. //calul les angles dont il faut faire tourner la sphere afin que la position donnee
  1085. //soit affichee au centre de l'ecran
  1086. {
  1087. float R, D; // de l'objet, en radian
  1088. Vecteur3D v1;
  1089.  
  1090. if (DE_i > 324000) {DE_i = 324000 - DE_i ;}
  1091. R = 2*M_PI / (24*3600) * RA_i; // R en radian
  1092. D = M_PI / (180*3600) * DE_i; // D en radian
  1093.  
  1094. v1.x = rayon_sphere * cos(D) * cos (R);
  1095. v1.y = rayon_sphere * cos(D) * sin (R);
  1096. v1.z = rayon_sphere * sin(D);
  1097.  
  1098. angleA = -R;
  1099. angleB = D;
  1100. angleC = 0;
  1101.  
  1102. RA_centre = RA_i;
  1103. DE_centre = DE_i;
  1104. }
  1105.  
  1106.  
  1107. void MainWindow::calcul_anglesABC()
  1108. // en fonction de la date, de l'heure et de la position de l'observateur
  1109. {
  1110. time1 = timeEdit1->time();
  1111.  
  1112. float minutes = 8 + 60.0 * time1.hour() + time1.minute() + 4.0 * (day_oh_year1-79) * 0.9972696;
  1113. // sur la ligne qui suit j'ecris ostensiblement le signe moins afin qu'il ne se barre pas!
  1114. //(ce qui ferait tourner la Terre a l'envers!!!!)
  1115. angleA = (-1) * M_PI * (minutes * 0.25) / 180;
  1116. latitude_obs = M_PI / 180 *(90 - spinBox_latitude->value()); // en radian
  1117. angleB = latitude_obs;
  1118. angleC = M_PI * orientation_observateur / 180;
  1119. //angleD = M_PI / 180 *(spinBox_rot_champ->value()); // en radian
  1120. }
  1121.  
  1122.  
  1123. void MainWindow::dessiner_ciel(mode_dessin mode_i)
  1124. {
  1125. if (tabWidget1->currentIndex() != 2) { return; }
  1126. if (!a_dessiner) {return;}
  1127.  
  1128. a_dessiner = false;
  1129.  
  1130. //if (actionObjetsSDcardSeulement->isChecked())
  1131. //{
  1132. // spinBox_magnitude_max->setValue(4.5);
  1133. // spinBoxNGC_mag_max->setValue(7.0);
  1134. // actionAfficher_Numeros->setChecked(true);
  1135. // actionAfficher_Noms->setChecked(true);
  1136. //}
  1137.  
  1138. setCursor(Qt::WaitCursor);
  1139. int row;
  1140. long RA_s, DE_s;
  1141. float mv, z;
  1142. int lum1,rayon_halo;
  1143. float rayon_etoile;
  1144. int h, s, v, a;
  1145. QString txt_num, txt1, str1;
  1146. QString nom1, nom2, nomCommun, txt_numHR, classeSpectrale, cstl, bayer;
  1147. QString RAcentre_txt, DEcentre_txt;
  1148. QPoint P, P1, Pdecal_num, Pdecal_nom;
  1149. QPoint centre; // d'un objet
  1150.  
  1151.  
  1152. int x, y, pas_x, pas_y; // pour quadriller l'ecran avec des cases recevant du texte
  1153. bool tableau_cases[20][60]; // memorise les cases situees en [x][y] occupees par un texte (anti-collision)
  1154. for (x=0; x<20; x++) {for (y=0; y<60; y++) {tableau_cases[x][y]=false;}}
  1155.  
  1156. // QList <QPoint> listePoints;
  1157.  
  1158.  
  1159. // definition des couleurs
  1160. QColor gris_fonce = QColor::fromHsv(240, 0, 80, 255);
  1161. QColor gris_tres_fonce = QColor::fromHsv(240, 0, 45, 255);
  1162. QColor gris_galaxie = QColor::fromHsv(120, 5, 230, 70);
  1163.  
  1164. QColor bleu_tres_fonce = QColor::fromHsv(240, 255, 10, 255);
  1165. QColor bleu_fonce = QColor::fromHsv(240, 255, 120, 255);
  1166. QColor vert_fonce = QColor::fromHsv(120, 255, 100, 255);
  1167.  
  1168.  
  1169. //affectations des couleurs
  1170. QColor couleur_ciel = Qt::black;
  1171. QColor couleur_grille = gris_tres_fonce;
  1172. QColor couleur_texte_grille = gris_fonce;
  1173. QColor couleur_centre = Qt::white;
  1174. QColor couleur_zones_BSC = Qt::cyan;
  1175. QColor couleur_ecliptique = Qt::yellow;
  1176. QColor couleur_pointVernal = Qt::cyan;
  1177. QColor couleur_lignes_cstl = bleu_fonce;
  1178. QColor couleur_noms_cstl = Qt::yellow;
  1179. QColor couleur_point_vise = Qt::cyan;
  1180. QColor couleur_aigrettes = Qt::white;
  1181. QColor couleur_nom_etoile = gris_fonce;
  1182. QColor couleur_NGC = vert_fonce;
  1183. QColor couleur_champ_CCD = Qt::red;
  1184.  
  1185. if (actionMode_Impression->isChecked())
  1186. {
  1187. couleur_ciel = Qt::white;
  1188. couleur_grille = Qt::black;
  1189. couleur_texte_grille = Qt::black;
  1190. couleur_centre = Qt::black;
  1191. couleur_zones_BSC = Qt::black;
  1192. couleur_ecliptique = Qt::black;
  1193. couleur_pointVernal = Qt::black;
  1194. couleur_lignes_cstl = Qt::black;
  1195. couleur_noms_cstl = Qt::black;
  1196. couleur_point_vise = Qt::black;
  1197. couleur_aigrettes = Qt::black;
  1198. couleur_nom_etoile = Qt::black;
  1199. couleur_NGC = Qt::black;
  1200. couleur_champ_CCD = Qt::black;
  1201. }
  1202.  
  1203. if (actionMode_Impression->isChecked())
  1204. {
  1205. x_max_image = 2400;
  1206. y_max_image = 1800;
  1207. }
  1208. else
  1209. {
  1210. x_max_image = x_max_ecran;
  1211. y_max_image = y_max_ecran;
  1212. }
  1213.  
  1214. int x_centre_ecran = x_max_image/2;
  1215. int y_centre_ecran = y_max_image/2;
  1216.  
  1217. pas_x = int(x_max_image/20);
  1218. pas_y = int(y_max_image/60);
  1219.  
  1220. QPixmap pixmap1(x_max_image, y_max_image);
  1221. pixmap1.fill(couleur_ciel);
  1222.  
  1223. if (actionMode_Impression->isChecked())
  1224. {
  1225. Pdecal_nom.setX(15);
  1226. Pdecal_nom.setY(40);
  1227. Pdecal_num.setX(15);
  1228. Pdecal_num.setY(10);
  1229. }
  1230. else
  1231. {
  1232. Pdecal_nom.setX(10);
  1233. Pdecal_nom.setY(20);
  1234. Pdecal_num.setX(10);
  1235. Pdecal_num.setY(10);
  1236. }
  1237.  
  1238. int ri = 0;
  1239. int di = 45*3600;
  1240.  
  1241. zoom = float(pow(2,zoom_double)) /4;
  1242.  
  1243. if ((mode_i == totalite) || (mode_i == impr))
  1244. {
  1245. QPainter painter1(& pixmap1); // adresse de pixmap1 dans le constructeur
  1246. QFont font1 = painter1.font();
  1247.  
  1248. //==================================================================================
  1249. // boites de coordonnees de l'objet pointe
  1250. frame_4->setVisible(!actionMode_Impression->isChecked());
  1251. frame_5->setVisible(!actionMode_Impression->isChecked());
  1252.  
  1253. //==================================================================================
  1254. // trace le centre de l'image
  1255. if ( !actionPasTracerCentre->isChecked() || actionMode_Impression->isChecked() )
  1256. {
  1257.  
  1258. painter1.setPen(couleur_centre);
  1259. //painter1.setBrush(Qt::white);
  1260. painter1.drawLine(x_centre_ecran-20,y_centre_ecran,x_centre_ecran-10,y_centre_ecran); // 1er segment H
  1261. painter1.drawLine(x_centre_ecran+10,y_centre_ecran,x_centre_ecran+20,y_centre_ecran); // 2nd segment H
  1262. painter1.drawLine(x_centre_ecran,y_centre_ecran-20,x_centre_ecran,y_centre_ecran-10); // 1er segment V
  1263. painter1.drawLine(x_centre_ecran,y_centre_ecran+10,x_centre_ecran,y_centre_ecran+20); // 2nd segment V
  1264.  
  1265. //int r = zoom*103; painter1.drawEllipse(x0,y0, r, r); // cercle de 10 degres de diametre
  1266. //float r = zoom*103/10/3600; painter1.drawEllipse(x0,y0, r, r); // cercle de 1 seconde de diametre
  1267. }
  1268.  
  1269. //==================================================================================
  1270. // trace de la grille equatoriale
  1271. int LBL; // Largeur Bande Laterale
  1272. QPoint memo_P;
  1273. memo_P.setX(0);
  1274. memo_P.setY(0);
  1275. // 1) trace les cercles des latitudes ("horizontales // equateur")
  1276. if (actionTracer_grille->isChecked())
  1277. {
  1278. // 1) trace les cercles des latitudes ("horizontales // equateur")
  1279. if (!actionMode_Impression->isChecked())
  1280. {
  1281. font1.setPointSize(10);
  1282. LBL=200;
  1283. }
  1284. else
  1285. {
  1286. font1.setPointSize(16);
  1287. LBL=400;
  1288. }
  1289. painter1.setFont(font1);
  1290. for (di=-90*3600; di<=90*3600; di+=10*3600) // pas = 10 degres
  1291. {
  1292. painter1.setPen(couleur_texte_grille);
  1293.  
  1294. for (ri=10*60; ri<23.5*3600; ri+=3600)
  1295. {
  1296. if (projection(ri, di, &P) == 0)
  1297. {
  1298. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image)
  1299. { //dans l'ecran
  1300. if ( P.x() < LBL || P.x() > x_max_image - LBL)
  1301. { // mais en peripherie seulement
  1302. txt_num.setNum(di / 3600); // conversion num -> txt
  1303. painter1.drawText(P,txt_num + "deg");
  1304. }
  1305. }
  1306. }
  1307. }
  1308. painter1.setPen(couleur_grille);
  1309. memo_P.setX(0);
  1310. memo_P.setY(0);
  1311. for (ri=0; ri<=23.5*3600; ri+=400)
  1312. {
  1313. if (projection(ri, di, &P) == 0)
  1314. {
  1315. if ((P.x()!=0)&&(P.y()!=0)&&(memo_P.x()!=0)&&(memo_P.y()!=0))
  1316. { painter1.drawLine(memo_P,P);}
  1317. memo_P = P;
  1318. //painter1.drawPoint(P); // trace un point
  1319. }
  1320. else memo_P.setX(0);
  1321. }
  1322. }
  1323. // 2) trace les cercles des longitudes ("verticales" passant par les poles)
  1324.  
  1325. ri = 0;
  1326. di = 45*3600;
  1327.  
  1328. for (ri=0*3600; ri<=23*3600; ri+=1*3600) // pas =1h
  1329. {
  1330. painter1.setPen(couleur_texte_grille);
  1331. for (di=-68; di<=72; di+=10)
  1332. {
  1333. if (projection(ri, di*3600, &P) == 0)
  1334. {
  1335. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image)
  1336. { //dans l'ecran
  1337. if (P.y() < LBL || P.y() > y_max_image - LBL/2 )
  1338. { // mais en peripherie seulement
  1339. txt_num.setNum(ri / 3600); // conversion num -> txt
  1340. painter1.drawText(P,txt_num + "h");
  1341. }
  1342. }
  1343. }
  1344. }
  1345.  
  1346. painter1.setPen(couleur_grille);
  1347. memo_P.setX(0);
  1348. memo_P.setY(0);
  1349. for (di=-90*3600; di<=90*3600; di+=4000)
  1350. {
  1351.  
  1352. if (projection(ri, di, &P) == 0)
  1353. {
  1354. if ((P.x()!=0)&&(P.y()!=0)&&(memo_P.x()!=0)&&(memo_P.y()!=0))
  1355. { painter1.drawLine(memo_P,P);}
  1356. memo_P = P;
  1357. //painter1.drawPoint(P); // trace un point
  1358. }
  1359. else memo_P.setX(0);
  1360. }
  1361. }
  1362. }
  1363. //==================================================================================
  1364. // trace des limites des zones BSC5
  1365. // 1) trace les cercles des latitudes ("horizontales // equateur")
  1366. if (actionTracer_limites_cartes_BSC5->isChecked())
  1367. {
  1368. painter1.setPen(couleur_zones_BSC);
  1369. for (di=-90*3600; di<=90*3600; di+=30*3600) // pas = 30 degres
  1370. {
  1371. for (ri=0; ri<=24*3600; ri+=200)
  1372. {
  1373. if (projection(ri, di, &P) == 0) { painter1.drawPoint(P);}
  1374. }
  1375. }
  1376. // 2) trace les arcs de cercles des longitudes ("verticales" passant par les poles)
  1377. int num_zone =1;
  1378. trace_bande_H(15, 30*240, num_zone, &painter1); // entre 0deg et 30deg -> 12 zones de 30deg
  1379. num_zone =13;
  1380. trace_bande_H(45, 40*240, num_zone, &painter1); // entre 30deg et 60deg -> 9 zones de 40deg
  1381. num_zone =22;
  1382. trace_bande_H(75, 90*240, num_zone, &painter1); // entre 60deg et 90deg -> 4 zones de 90deg
  1383. }
  1384.  
  1385. //==================================================================================
  1386. // trace de l'ecliptique (plan dans lequel se meuh, pardon meut la Terre autour du soleil)
  1387. // et par consequence dans lequel on voit le soleil et les planetes depuis la Terre
  1388. if (actionTracer_Ecliptique->isChecked())
  1389. {
  1390. double ri_float, di_float;
  1391. memo_P.setX(0);
  1392. memo_P.setY(0);
  1393. for (ri_float=0; ri_float<=24*3600; ri_float+=1000)
  1394. {
  1395. di_float = 23.5 * 3600 * sin(ri_float/(24*3600)*2*M_PI);
  1396. painter1.setPen(couleur_ecliptique);
  1397. if (projection(ri_float, di_float, &P) == 0)
  1398. {
  1399. if ((P.x()!=0)&&(P.y()!=0)&&(memo_P.x()!=0)&&(memo_P.y()!=0))
  1400. { painter1.drawLine(memo_P,P);}
  1401. memo_P = P;
  1402. }
  1403. else memo_P.setX(0);
  1404. }
  1405. }
  1406. //==================================================================================
  1407. font1.setPointSize(7); painter1.setFont(font1);
  1408. if (projection(0, 0, &P) == 0)
  1409. {
  1410. painter1.setPen(couleur_pointVernal);
  1411. painter1.drawLine(P.x()-5,P.y(),P.x()+5,P.y()); // aigrette V
  1412. painter1.drawLine(P.x(),P.y()-5,P.x(),P.y()+5); // aigrette H
  1413. painter1.drawText(P,"Point Vernal");
  1414. }
  1415. font1.setPointSize(8); painter1.setFont(font1);
  1416.  
  1417. //==================================================================================
  1418. //calcul des coordonnees des 4 coins de l'ecran
  1419. QPoint P1;
  1420. P1.setX(0); P1.setY(0);
  1421. projection_inverse(P1, &RA_aff_max, &DE_aff_max);
  1422. P1.setX(x_max_ecran); P1.setY(y_max_ecran);
  1423. projection_inverse(P1, &RA_aff_min, &DE_aff_min);
  1424. RA_min_deg = sec2deg_decim(RA_aff_min, isT)-1;
  1425. RA_max_deg = sec2deg_decim(RA_aff_max, isT)+1;
  1426. DE_min_deg = sec2deg_decim(DE_aff_min, isA)-2;
  1427. DE_max_deg = sec2deg_decim(DE_aff_max, isA)+2;
  1428.  
  1429. /*
  1430. //affichage (pour test)
  1431. QString RA_aff_min_txt, RA_aff_max_txt, DE_aff_min_txt, DE_aff_max_txt;
  1432. RA_aff_min_txt.setNum(RA_min_deg,'f',2);
  1433. RA_aff_max_txt.setNum(RA_max_deg,'f',2);
  1434. DE_aff_min_txt.setNum(DE_min_deg,'f',2);
  1435. DE_aff_max_txt.setNum(DE_max_deg,'f',2);
  1436. Edit_afficheur->setText(" RAmin=" + RA_aff_min_txt +" RAmax=" + RA_aff_max_txt
  1437. +" DEmin=" + DE_aff_min_txt +" DEmax=" + DE_aff_max_txt);
  1438. */
  1439.  
  1440. /*====================================================================================
  1441. BOUCLE DE DESSIN DES ETOILES du catalogue Tycho2
  1442. ======================================================================================*/
  1443. if (actionCatalogue_Tycho->isChecked() && !actionMode_Impression->isChecked())
  1444. {
  1445. if (!actionMode_Impression->isChecked()) {font1.setPointSize(8);} else {font1.setPixelSize(30);}
  1446. painter1.setFont(font1);
  1447. QString st1, st2;
  1448.  
  1449. if (spinBoxZoom->value() > 5)
  1450. {
  1451. etoiles_tyc_visibles = true; // sert en particulier pour le menu contextuel et "trouve_TYC_at_xy"
  1452. Liste_regions_tyc.clear();
  1453. liste_etoiles_TYC.clear();
  1454. get_LSTreg_tyc2(RA_min_deg, RA_max_deg, DE_min_deg, DE_max_deg, &Liste_regions_tyc, "/tycho2/", 'A');
  1455. get_lst_Tyc2(&liste_etoiles_TYC, &Liste_regions_tyc,"/tycho2/", 'A');
  1456.  
  1457. if (spinBoxZoom->value() > 6)
  1458. {
  1459. get_LSTreg_tyc2(RA_min_deg, RA_max_deg, DE_min_deg, DE_max_deg, &Liste_regions_tyc, "/tycho2/", 'B');
  1460. get_lst_Tyc2(&liste_etoiles_TYC, &Liste_regions_tyc,"/tycho2/", 'B');
  1461. }
  1462.  
  1463. TYC2rec etoile1;
  1464. int32_t i;
  1465. int32_t i_max = liste_etoiles_TYC.count();
  1466. float RAr, DEr;
  1467. long tyc_RA, tyc_DE;
  1468.  
  1469. painter1.setBrush(Qt::white);
  1470.  
  1471. for (i=0; i<i_max; i++)
  1472. {
  1473. etoile1 = liste_etoiles_TYC.at(i);
  1474.  
  1475. RAr =(float)etoile1.ra/15; //RAr en heures decimales (1 heure = 15 degres d'angle)
  1476. DEr =(float)etoile1.de;
  1477.  
  1478. tyc_RA =deg_decim2sec(RAr);
  1479. tyc_DE =deg_decim2sec(DEr);
  1480.  
  1481. uint8_t vt = etoile1.vt;
  1482.  
  1483. if (vt < spinBox_magnitude_max->value())
  1484. {
  1485. rayon_etoile = (10-vt) * zoom_double / 5.5 ;
  1486.  
  1487. if (actionEtoiles_ponctuelles->isChecked()) {rayon_etoile=1;}
  1488.  
  1489. if (projection(tyc_RA, tyc_DE, &P) == 0)
  1490. {
  1491. if (rayon_etoile < 1)
  1492. {
  1493. painter1.setPen(Qt::white);
  1494. painter1.drawPoint(P);
  1495. }
  1496. else
  1497. {
  1498. painter1.setPen(Qt::NoPen);
  1499. painter1.setBrush(Qt::white);
  1500. painter1.drawEllipse(P,int(rayon_etoile),int(rayon_etoile));
  1501. }
  1502.  
  1503. }
  1504. }
  1505. }
  1506. }
  1507. else { etoiles_tyc_visibles = false;}
  1508. }
  1509.  
  1510. /*====================================================================================
  1511. BOUCLE DE DESSIN DES ETOILES du catalogue BSC5
  1512. ======================================================================================*/
  1513. if (!actionMode_Impression->isChecked()) {font1.setPointSize(8);} else {font1.setPixelSize(30);}
  1514. painter1.setFont(font1);
  1515.  
  1516. QRadialGradient radialGradient1;
  1517.  
  1518. // painter1.setPen(Qt::NoPen);
  1519.  
  1520. //parcours la Table Winget1
  1521. row = 0;
  1522. while (row < 9110)
  1523. {
  1524. txt1 = TableWidget_BSC->item(row,colMV)->text(); // magnitude
  1525. mv = txt1.toFloat(); // conversion txt -> num
  1526.  
  1527. if (mv < spinBox_magnitude_max->value())
  1528. {
  1529. extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s); //RA et DE
  1530. P.setX(0);
  1531. P.setY(0);
  1532.  
  1533. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  1534. if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
  1535. {
  1536. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
  1537. {
  1538. //listePoints << P;
  1539.  
  1540. txt_numHR = TableWidget_BSC->item(row,colHR)->text(); // Numero HR
  1541. nomCommun = TableWidget_BSC->item(row,colNomCom)->text();//+ QChar(945); // Nom commun
  1542. removeCaractere('-', &nomCommun);
  1543. classeSpectrale = TableWidget_BSC->item(row,colClsSpect)->text(); // couleur
  1544. removeCaractere(' ', &classeSpectrale);
  1545. cstl = TableWidget_BSC->item(row,colCSTL)->text(); // Constellation
  1546. bayer = TableWidget_BSC->item(row,colNomBay)->text(); // abrev lettre grecque de bayer
  1547. int code_unicode_bayer = code_grec(bayer.left(3));
  1548.  
  1549. calcul_aspect_etoile(mv, &z, &rayon_etoile, &rayon_halo, &lum1);
  1550. int demiRayonH = rayon_halo/2;
  1551.  
  1552. if (classeSpectrale.at(0) == 'O') { couleur_etoile = Tableau_couleurs_etoiles[0];;}
  1553. else if (classeSpectrale.at(0) == 'B') { couleur_etoile = Tableau_couleurs_etoiles[1]; }
  1554. else if (classeSpectrale.at(0) == 'A') { couleur_etoile = Tableau_couleurs_etoiles[2]; }
  1555. else if (classeSpectrale.at(0) == 'F') { couleur_etoile = Tableau_couleurs_etoiles[3]; }
  1556. else if (classeSpectrale.at(0) == 'G') { couleur_etoile = Tableau_couleurs_etoiles[4]; }
  1557. else if (classeSpectrale.at(0) == 'K') { couleur_etoile = Tableau_couleurs_etoiles[5]; }
  1558. else if (classeSpectrale.at(0) == 'M') { couleur_etoile = Tableau_couleurs_etoiles[6]; }
  1559. else { couleur_etoile = Qt::white; }
  1560.  
  1561. couleur_etoile.getHsv(&h,&s,&v,&a);
  1562. //couleur_etoile.setHsv(h,saturation,lum1,a);
  1563. couleur_etoile.setHsv(h,saturation,v,a);
  1564.  
  1565. if (actionEtoiles_blanches->isChecked()) {couleur_etoile = Qt::white;}
  1566. if (actionMode_Impression->isChecked()) {couleur_etoile = Qt::black;}
  1567. if (actionSouligner_Etoiles_d_une_CSTL->isChecked())
  1568. {
  1569. if (cstl == cstl_pointee) { couleur_etoile = Qt::green;}
  1570. }
  1571.  
  1572. couleur_halo = couleur_etoile;
  1573. couleur_halo.getHsv(&h,&s,&v,&a);
  1574. couleur_halo.setHsv(h,s,255,100);
  1575. a=0;
  1576.  
  1577. radialGradient1.setColorAt(0.0, couleur_halo);
  1578. radialGradient1.setColorAt(1.0, Qt::black);
  1579.  
  1580. // DESSIN DES ETOILES
  1581. // 1 ) Aigrettes
  1582. centre = P;
  1583. if (zoom > 1)
  1584. {
  1585. if (rayon_halo > 20)
  1586. {
  1587. if (!actionEtoiles_ponctuelles->isChecked())
  1588. {
  1589. QPen pen(couleur_aigrettes);
  1590. pen.setWidth(1);
  1591. painter1.setPen(pen);
  1592. painter1.drawLine(P.x()-demiRayonH,P.y(),P.x()+demiRayonH,P.y()); // aigrette V
  1593. painter1.drawLine(P.x(),P.y()-demiRayonH,P.x(),P.y()+demiRayonH); // aigrette H
  1594. }
  1595. }
  1596. // 2) halo
  1597. if (!actionMode_Impression->isChecked()
  1598. && !actionEtoiles_ponctuelles->isChecked()
  1599. && !actionPas_de_halo->isChecked()
  1600. )
  1601. {
  1602. painter1.setBrush(couleur_halo);
  1603. painter1.setPen(Qt::NoPen);
  1604. radialGradient1.setCenter(P);
  1605. radialGradient1.setRadius(rayon_halo);
  1606. radialGradient1.setFocalPoint(P);
  1607. painter1.setBrush(radialGradient1);
  1608. painter1.drawEllipse(P,rayon_halo,rayon_halo);
  1609.  
  1610. }
  1611. }
  1612. // 3) disque de l'etoile
  1613. painter1.setBrush(couleur_etoile);
  1614. painter1.setPen(couleur_etoile);
  1615. if (rayon_etoile < 1.5)
  1616. {
  1617. painter1.setBrush(Qt::NoBrush);
  1618. painter1.drawPoint(P); // ponctuel
  1619. }
  1620. else
  1621. {
  1622. if (actionMode_Impression->isChecked())
  1623. {
  1624. painter1.setBrush(Qt::NoBrush);
  1625. }
  1626. else { painter1.setPen(Qt::NoPen);}
  1627.  
  1628. painter1.drawEllipse(P,int(rayon_etoile),int(rayon_etoile)); // dessine une etoile
  1629. }
  1630. //affichage du numero HR et du Nom
  1631. painter1.setPen(couleur_nom_etoile);
  1632. painter1.setBrush(Qt::NoBrush);
  1633. QPoint P_rayonEtoile;
  1634. P_rayonEtoile.setX(rayon_etoile);
  1635. P_rayonEtoile.setY(0);
  1636.  
  1637. QPoint P1 = P + P_rayonEtoile;
  1638. x = int(P1.x() / pas_x);
  1639. y = int(P1.y() / pas_y);
  1640.  
  1641. if (actionLettres_grecques->isChecked() && code_unicode_bayer !=-1)
  1642. {
  1643. font1.setPixelSize(16); painter1.setFont(font1);
  1644. painter1.setPen(couleur_etoile);
  1645. painter1.drawText(P1, QChar(code_unicode_bayer));
  1646. }
  1647. else if (actionAfficher_Noms->isChecked() && (nomCommun != "~"))
  1648. {
  1649. if (actionMode_Impression->isChecked())
  1650. { //en mode impression on evite le chevauchement des textes
  1651. if (tableau_cases[x][y+1] == false )
  1652. { // la case est libre
  1653. //painter1.drawRect(pas_x * x, pas_y * y, pas_x, pas_y);
  1654. painter1.drawText(pas_x * x, pas_y * (y+1) +50,nomCommun);
  1655. tableau_cases[x][y+1] = true; // on coche la case
  1656. }
  1657. }
  1658. else
  1659. { // en mode affichage ecran, on ecrit directement au plus pres de l'etoile
  1660. painter1.drawText(P1,nomCommun);
  1661. }
  1662. }
  1663. if (actionAfficher_Numeros->isChecked())
  1664. {
  1665. if (actionMode_Impression->isChecked())
  1666. { //en mode impression on evite le chevauchement des textes
  1667. if (tableau_cases[x][y] == false )
  1668. { // la case est libre
  1669. //painter1.drawRect(x * pas_x, pas_y * (y+1), pas_x, pas_y);
  1670. //painter1.drawLine(P.x(),P.y(),x * pas_x, pas_y * (y+1) +40);
  1671. painter1.drawText(x * pas_x, pas_y * y +50,txt_numHR);
  1672. tableau_cases[x][y] = true; // on coche la case
  1673. }
  1674. }
  1675. else
  1676. {
  1677. painter1.drawText(P + P_rayonEtoile + Pdecal_num,txt_numHR);
  1678. }
  1679. }
  1680. }
  1681. }
  1682. }
  1683. row++;
  1684. }
  1685.  
  1686. /*====================================================================================
  1687. BOUCLE DE DESSIN DES OBJETS du catalogue SAC (Ciel profond)
  1688. ======================================================================================*/
  1689. if (actionCiel_Profond->isChecked())
  1690. {
  1691. if (!actionMode_Impression->isChecked()) { font1.setPointSize(7);} else {font1.setPixelSize(25);}
  1692. painter1.setFont(font1);
  1693. row = 0;
  1694. while (row < nb_objets_SAC)
  1695. {
  1696. txt1 = TableWidget_NGC->item(row,colNGCMagn)->text(); // magnitude
  1697. mv = txt1.toFloat(); // conversion txt -> num
  1698. nom2 = TableWidget_NGC->item(row,colNGCNom2)->text(); // Nom2
  1699. bool isMessier = ( (nom2[0] == 'M') && nom2[1].isNumber() && nom2[2].isNumber());
  1700.  
  1701. if ( mv < spinBoxNGC_mag_max->value() || isMessier )
  1702. { // on affiche toujours les objets Messier quel que soit leur magnitude
  1703. txt1 = TableWidget_NGC->item(row,colNGCRA)->text(); // RA
  1704. RA_s = txt1.toInt();
  1705. txt1 = TableWidget_NGC->item(row,colNGCDE)->text(); // DE
  1706. DE_s = txt1.toLong();
  1707.  
  1708. txt1 = TableWidget_NGC->item(row,colNGCDiam)->text(); // diametre en secondes
  1709. long diametre_NGC = txt1.toLong();//en secondes
  1710. float d_NGC = zoom * diametre_NGC*103/10/3600; // en pixels
  1711.  
  1712. P.setX(0);
  1713. P.setY(0);
  1714.  
  1715. if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
  1716. {
  1717. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
  1718. {
  1719. nom1 = TableWidget_NGC->item(row,colNGCNom1)->text(); // Nom1
  1720.  
  1721. if ((!actionObjetsSDcardSeulement->isChecked()) || (nom1.left(3) == "NGC") )
  1722. {
  1723. if (actionAfficher_Noms->isChecked() && (nom1 != "~"))
  1724. {
  1725. painter1.setPen(couleur_NGC);
  1726. if (actionMode_Impression->isChecked())
  1727. {
  1728. painter1.setBackgroundMode(Qt::OpaqueMode);
  1729. x = int(P.x() / pas_x);
  1730. y = int(P.y() / pas_y);
  1731.  
  1732. while ((x<20) && (y<60) && ((tableau_cases[x][y] == true ) || (tableau_cases[x+1][y] == true)))
  1733. { //tant que les deux cases ne sont pas libres pas libre, on decalle
  1734. x++;
  1735. y++;
  1736. }
  1737. painter1.drawLine(P.x(),P.y(),pas_x * x, pas_y * y +50);
  1738. painter1.drawText(pas_x * x, pas_y * y +50, nom1 +" " +nom2);
  1739. tableau_cases[x][y] = true; // on coche la case
  1740. tableau_cases[x+1][y] = true; // ainsi que la suivante
  1741. }
  1742. else {painter1.drawText(P+Pdecal_nom,nom1 +" " +nom2);}
  1743. //painter1.drawText(P+Pdecal_num,nom2);
  1744. }
  1745. painter1.setBrush(Qt::NoBrush);
  1746. if (actionMode_Impression->isChecked())
  1747. {
  1748. painter1.setPen(Qt::black);
  1749. painter1.drawEllipse(P.x()-d_NGC/2,P.y()-d_NGC/2, d_NGC, d_NGC); // dessine un objet
  1750. }
  1751. else
  1752. {
  1753. painter1.setPen(couleur_NGC);
  1754. painter1.drawEllipse(P.x()-d_NGC/2,P.y()-d_NGC/2, d_NGC, d_NGC); // dessine un objet
  1755. 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
  1756. painter1.drawLine(P.x()-d_NGC/10,P.y()+d_NGC/10,P.x()+d_NGC/10,P.y()-d_NGC/10);
  1757. }
  1758. }
  1759. }
  1760. }
  1761. }
  1762. row++;
  1763. }
  1764. }
  1765. //====================================================================================
  1766. // trace le dessin des constellations
  1767. trace_constellations(&painter1, couleur_lignes_cstl, couleur_noms_cstl);
  1768. //====================================================================================
  1769. // trace le champ CCD
  1770. if (actionAfficher_champ_CCD->isChecked())
  1771. {
  1772. painter1.setPen(couleur_champ_CCD);
  1773. painter1.setBrush(Qt::NoBrush);
  1774. float r = zoom*103/10/60; // 1' d'angle
  1775. int x_champ = 154*r; // pour un capteur 24x36mm (APN K100D) au foyer d'une focale de 600mm
  1776. int y_champ = 2 * x_champ / 3; // pour un capteur au format 3/2
  1777. painter1.drawRect(x_centre_ecran-x_champ/2, y_centre_ecran-y_champ/2, x_champ, y_champ);
  1778.  
  1779. }
  1780. //====================================================================================
  1781. // Imprime les coordonnees du centre de la page dans un cartouche en haut a gauche de la page
  1782. if (actionMode_Impression->isChecked())
  1783. {
  1784. RAcentre_txt = nb_secondes2txt_hms(RA_centre);
  1785. DEcentre_txt = nb_secondes2txt_hms(DE_centre);
  1786. int x0 =30;
  1787. int y0 = 3;
  1788. painter1.setPen(Qt::black);
  1789. painter1.setBrush(Qt::white);
  1790. painter1.setBackgroundMode(Qt::OpaqueMode);
  1791. painter1.drawRect(x0, y0, 250, 100); // cartouche
  1792.  
  1793. painter1.setBackgroundMode(Qt::TransparentMode);
  1794. painter1.setBrush(Qt::NoBrush);
  1795. painter1.drawText(x0+10,y0+30, "Centre de la page:");
  1796. painter1.drawText(x0+10,y0+60, "RA=" +RAcentre_txt);
  1797. painter1.drawText(x0+10,y0+90, "DE=" + DEcentre_txt);
  1798.  
  1799. // trace un rectangle autour de la zone imprimee
  1800. painter1.drawRect(0,0, x_max_image-1, y_max_image-3);
  1801. }
  1802. //====================================================================================
  1803. if (!actionEtoiles_blanches->isChecked() && (!actionMode_Impression->isChecked()))
  1804. {
  1805. affiche_legende_etoiles(&painter1);
  1806. }
  1807.  
  1808. }
  1809. /*====================================================================================
  1810. AFFICHAGE PARTIEL dans les modes ci-dessous
  1811. (ne tracent pas la totalite, mais juste un detail. Rechargent l'image du ciel precedemment
  1812. affichee sur laquelle on va continuer a dessiner)
  1813. ====================================================================================*/
  1814.  
  1815. else if (mode_i == partiel_BSC) //concerne: ETOILES BSC
  1816. {
  1817. pixmap1 = QPixmap::fromImage(image1);
  1818. QPainter painter2(& pixmap1); // adresse de pixmap1 dans le constructeur
  1819. QFont font1 = painter2.font();
  1820. row = num_objet_BSC_pointe -1;
  1821. extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s); //RA et DE
  1822. P.setX(0);
  1823. P.setY(0);
  1824. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  1825. if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
  1826. {
  1827. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
  1828. {
  1829. txt_numHR = TableWidget_BSC->item(row,colHR)->text(); // Numero BSC
  1830. nomCommun = TableWidget_BSC->item(row,colNomCom)->text(); // Nom commun
  1831. removeCaractere('-', &nomCommun);
  1832. font1.setPointSize(7); painter2.setFont(font1);
  1833. painter2.setPen(Qt::cyan);
  1834. if (nomCommun !="~") {painter2.drawText(P+Pdecal_nom,nomCommun);}
  1835. painter2.drawText(P+Pdecal_num,"HR" + txt_numHR);
  1836.  
  1837. QString Nom=TableWidget_BSC->item(row, colNomCom)->text();
  1838. Edit_objPointe->setText("HR" + txt_numHR + " " +Nom);
  1839. txt1=TableWidget_BSC->item(row, colRA)->text();
  1840. long RAs=txt1.toLong();
  1841. Edit_RAobjPointe->setText(nb_secondes2txt_hms (RAs));
  1842. txt1=TableWidget_BSC->item(row, colDE)->text();
  1843. long DEs = txt1.toLong(); // conversion txt -> num
  1844. Edit_DEobjPointe->setText(nb_secondes2txt_hms (DEs));
  1845. }
  1846. }
  1847.  
  1848. }
  1849. else if (mode_i == partiel_NGC) //concerne: OBJETS NGC
  1850. {
  1851. pixmap1 = QPixmap::fromImage(image1);
  1852. QPainter painter2(& pixmap1); // adresse de pixmap1 dans le constructeur
  1853. QFont font1 = painter2.font();
  1854. QString nom1, nom2;
  1855. row = num_objet_SAC_pointe -1;
  1856. txt1 = TableWidget_NGC->item(row,colNGCRA)->text(); // RA
  1857. RA_s = txt1.toInt();
  1858. txt1 = TableWidget_NGC->item(row,colNGCDE)->text(); // DE
  1859. DE_s = txt1.toLong();
  1860.  
  1861. P.setX(0);
  1862. P.setY(0);
  1863. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  1864. if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
  1865. {
  1866. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
  1867. {
  1868. font1.setPointSize(7); painter2.setFont(font1);
  1869. painter2.setPen(Qt::cyan);
  1870. nom1=TableWidget_NGC->item(row, colNGCNom1)->text();
  1871. nom2=TableWidget_NGC->item(row, colNGCNom2)->text();
  1872. painter2.drawText(P+Pdecal_nom, nom1);
  1873. painter2.drawText(P+Pdecal_num, nom2);
  1874. Edit_objPointe->setText(nom1 +" "+nom2);
  1875. Edit_RAobjPointe->setText(nb_secondes2txt_hms (RA_s));
  1876. Edit_DEobjPointe->setText(nb_secondes2txt_hms (DE_s));
  1877. }
  1878. }
  1879. }
  1880.  
  1881. else if (mode_i == partiel_TYC) //concerne: ETOILES TYCHO
  1882. {
  1883. pixmap1 = QPixmap::fromImage(image1);
  1884. QPainter painter3(& pixmap1); // adresse de pixmap1 dans le constructeur
  1885. QFont font1 = painter3.font();
  1886. QString st1, st2;
  1887. TYC2rec etoile1 = liste_etoiles_TYC.at(num_etoile_TYC_pointe);
  1888. float RAr =(float)etoile1.ra/15;
  1889. float DEr =(float)etoile1.de;
  1890. long tyc_RA =deg_decim2sec(RAr);
  1891. long tyc_DE =deg_decim2sec(DEr);
  1892.  
  1893. // P.setX(0);
  1894. // P.setY(0);
  1895. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  1896. if (projection(tyc_RA, tyc_DE, &P) == 0) // x et y sont calcules par cette fonction
  1897. {
  1898. font1.setPointSize(7); painter3.setFont(font1);
  1899. painter3.setPen(Qt::yellow);
  1900. painter3.setBrush(Qt::NoBrush);
  1901. painter3.drawEllipse(P,5,5);
  1902. st1.setNum(etoile1.gscz);
  1903. st1=st1.right(4);
  1904. st2.setNum(etoile1.gscn);
  1905. painter3.drawText(P.x()+7,P.y(), "TIC "+st1 +"-"+st2);
  1906.  
  1907. Edit_objPointe->setText("TIC "+st1 +"-"+st2);
  1908. Edit_RAobjPointe->setText(nb_secondes2txt_hms (tyc_RA));
  1909. Edit_DEobjPointe->setText(nb_secondes2txt_hms (tyc_DE));
  1910.  
  1911. }
  1912. }
  1913.  
  1914. image1 = pixmap1.toImage();
  1915.  
  1916. if (actionMode_Impression->isChecked())
  1917. { label_5->setScaledContents(true); }
  1918. else { label_5->setScaledContents(false);} // important, sinon projection inverse fausse!
  1919.  
  1920. label_5->setPixmap(pixmap1);
  1921.  
  1922. num_objet_SAC = num_objet_SAC_pointe;
  1923. setCursor(Qt::ArrowCursor);
  1924. }
  1925.  
  1926.  
  1927. void MainWindow::on_tabWidget1_currentChanged(int index)
  1928. {
  1929. if ((index == 0) ) //onglet tableau BSC5
  1930. {
  1931. // tabWidget1->resize(size1);
  1932. // this->resize(size1+size_bordure);
  1933. TableWidget_BSC->selectRow(num_objet_BSC_pointe-1);
  1934. }
  1935. else if ((index == 1) ) //onglet tableau NGC SKY
  1936. {
  1937. // tabWidget1->resize(size1);
  1938. // this->resize(size1+size_bordure);
  1939. TableWidget_NGC->selectRow(num_objet_SAC_pointe-1);
  1940. }
  1941. else if (index == 2) //onglet dessin de la carte
  1942. {
  1943. num_objet_BSC = TableWidget_BSC->currentRow()+1;
  1944. num_objet_SAC = TableWidget_NGC->currentRow()+1;
  1945. //tabWidget1->resize(2000,1500);
  1946. //label_5->setGeometry(0,0,w-40,h-40);
  1947. //label_5->setGeometry(0,0,1200,900);
  1948.  
  1949. // tabWidget1->resize(size2);
  1950. // this->resize(size2+size_bordure);
  1951. // label_5->setGeometry(0,0,1200,800);
  1952. a_dessiner = true;
  1953. dessiner_ciel(totalite);
  1954. }
  1955. else if (index == 3) //onglet texte DOC
  1956. {
  1957. // this->showMaximized();
  1958. int w = this->width();
  1959. int h = this->height();
  1960. // tabWidget1->resize(2000,1500);
  1961. listeDoc->resize(w-20,h-10);
  1962. }
  1963. }
  1964.  
  1965.  
  1966. void MainWindow::calcul_num_zone_BSC()
  1967. //determine le numero de zone (catalogue BSC) figurant au centre de l'ecran
  1968. {
  1969. int bande_DEC = 0;
  1970. QString str1;
  1971.  
  1972. //hemisphere nord ==============================================================================
  1973. if ((DE_centre > 0) && (DE_centre < 30*3600))
  1974. {
  1975. bande_DEC=15; // decli du centre de la bande qui comporte 12 zones de 30deg en RA
  1976. num_zone_BSC_centre = 1+(RA_centre/3600*15/30)%12;
  1977. }
  1978. else if ((DE_centre > 30*3600) && (DE_centre < 60*3600))
  1979. {
  1980. bande_DEC=45; // decli du centre de la bande qui comporte 9 zones de 40deg en RA
  1981. num_zone_BSC_centre = 13+(RA_centre/3600*15/40)%9;
  1982. }
  1983. else if ((DE_centre > 60*3600) && (DE_centre < 90*3600))
  1984. {
  1985. bande_DEC=75; // decli du centre de la bande qui comporte 4 zones de 90deg en RA
  1986. num_zone_BSC_centre = 22+(RA_centre/3600*15/90)%4;
  1987. }
  1988. //hemisphere sud ===============================================================================
  1989. if ((DE_centre < 0) && (DE_centre > -30*3600))
  1990. {
  1991. bande_DEC=-15; // decli du centre de la bande qui comporte 12 zones de 30deg en RA
  1992. num_zone_BSC_centre = 1+25+(RA_centre/3600*15/30)%12;
  1993. }
  1994. else if ((DE_centre < 30*3600) && (DE_centre > -60*3600))
  1995. {
  1996. bande_DEC=-45; // decli du centre de la bande qui comporte 9 zones de 40deg en RA
  1997. num_zone_BSC_centre = 25+13+(RA_centre/3600*15/40)%9;
  1998. }
  1999. else if ((DE_centre < 60*3600) && (DE_centre > 90*3600))
  2000. {
  2001. bande_DEC=-75; // decli du centre de la bande qui comporte 4 zones de 90deg en RA
  2002. num_zone_BSC_centre = 25+22+(RA_centre/3600*15/90)%4;
  2003. }
  2004. // =============================================================================================
  2005.  
  2006. str1.setNum(num_zone_BSC_centre); // conversion num -> txt
  2007. //Edit_zone_BSC_pointee->setText(str1);
  2008. str1.setNum(bande_DEC); // conversion num -> txt
  2009. //Edit_bande_DE->setText(str1);
  2010. }
  2011.  
  2012.  
  2013. int MainWindow::trouve_TYC_at_xy(QPoint P)
  2014. //retourne le numero HR de l'objet le plus proche de la position fournie
  2015. {
  2016. if (etoiles_tyc_visibles)
  2017. {
  2018. QString txt1;
  2019. bool ok=false;
  2020. TYC2rec etoile1;
  2021. int32_t i;
  2022. int32_t i_max = liste_etoiles_TYC.count();
  2023. float RAr, DEr;
  2024. long tyc_RA, tyc_DE;
  2025. num_etoile_TYC_pointe = 0;
  2026. i =1;
  2027. while ( (i < i_max) && !ok)
  2028. {
  2029. etoile1 = liste_etoiles_TYC.at(i);
  2030. RAr =(float)etoile1.ra/15; //etoile1.ra en degres d'angle; RAr en heures decimales
  2031. DEr =(float)etoile1.de;
  2032. tyc_RA =deg_decim2sec(RAr);
  2033. tyc_DE =deg_decim2sec(DEr);
  2034.  
  2035. P.setX(0);
  2036. P.setY(0);
  2037. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  2038. if (projection(tyc_RA, tyc_DE, &P) == 0) // x et y sont calcules par cette fonction
  2039. { // on ne teste que les etoiles situee devant l'observateur
  2040. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
  2041. {// on ne teste que les etoiles projetables dans le rectangle de l'ecran
  2042. if ( (sqrt((P.x()-PosX)*(P.x()-PosX)+(P.y()-PosY)*(P.y()-PosY))) < 10)
  2043. { // on teste par calcul de la distance dans le plan de projection
  2044. num_etoile_TYC_pointe = i; // pour selectionner la ligne concernee dans le tableau
  2045. ok = true;
  2046. }
  2047. }
  2048. }
  2049.  
  2050. i++;
  2051. }
  2052. }
  2053. else num_etoile_TYC_pointe =0;
  2054. return num_etoile_TYC_pointe;
  2055. }
  2056.  
  2057.  
  2058. int MainWindow::trouve_NGC_at_xy(QPoint P)
  2059. //retourne le numero HR de l'objet le plus proche de la position fournie
  2060. {
  2061. QString txt1;
  2062. long RA_s, DE_s;
  2063. float mv;
  2064. int row = 0;
  2065. num_objet_SAC_pointe = 0;
  2066. bool ok=false;
  2067. while ( (row < nb_objets_SAC-1) && !ok)
  2068. {
  2069. txt1 = TableWidget_NGC->item(row,colNGCMagn)->text(); // magnitude
  2070. mv = txt1.toFloat(); // conversion txt -> num
  2071.  
  2072. if (mv < spinBoxNGC_mag_max->value())
  2073. { // on ne teste que les objets suffisamment lumineux pour etre affichees
  2074. txt1 = TableWidget_NGC->item(row,colNGCRA)->text(); // RA
  2075. RA_s = txt1.toInt();
  2076. txt1 = TableWidget_NGC->item(row,colNGCDE)->text(); // DE
  2077. DE_s = txt1.toLong();
  2078.  
  2079. P.setX(0);
  2080. P.setY(0);
  2081. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  2082. if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
  2083. { // on ne teste que les etoiles situee devant l'observateur
  2084. if ( P.x() > 0 && P.x() < x_max_image && P.y() > 30 && P.y() < y_max_image )
  2085. {// on ne teste que les etoiles projetables dans le rectangle de l'ecran
  2086. if ( (sqrt((P.x()-PosX)*(P.x()-PosX)+(P.y()-PosY)*(P.y()-PosY))) < 10)
  2087. { // on teste par calcul de la distance dans le plan de projection
  2088. num_objet_SAC_pointe = row+1;
  2089. ok = true;
  2090. }
  2091. }
  2092. }
  2093. }
  2094. row++;
  2095. }
  2096. return num_objet_SAC_pointe;
  2097. }
  2098.  
  2099.  
  2100.  
  2101. int MainWindow::trouve_etoile_at_xy(QPoint P)
  2102. //retourne le numero HR de l'etoile la plus proche de la position fournie
  2103. {
  2104. QString txt1;
  2105. long RA_s, DE_s;
  2106. float mv;
  2107. int row = 0;
  2108. num_objet_BSC_pointe = 0;
  2109. bool ok=false;
  2110. while ( (row < 9110) && !ok)
  2111. {
  2112. txt1 = TableWidget_BSC->item(row,colMV)->text(); // magnitude
  2113. mv = txt1.toFloat(); // conversion txt -> num
  2114.  
  2115. if (mv < spinBox_magnitude_max->value())
  2116. { // on ne teste que les etoiles suffisamment lumineuses pour etre affichees
  2117. extraire_RA_DE_from_Tableau(row, &RA_s, &DE_s); //RA et DE
  2118. P.setX(0);
  2119. P.setY(0);
  2120. // x et y vont etre calcules par la fonction 'projection' qui retourne 0 si le point est en arriere de l'observateur
  2121. if (projection(RA_s, DE_s, &P) == 0) // x et y sont calcules par cette fonction
  2122. { // on ne teste que les etoiles situee devant l'observateur
  2123. if ( P.x() > 0 && P.x() < x_max_ecran && P.y() > 30 && P.y() < y_max_ecran )
  2124. {// on ne teste que les etoiles projetables dans le rectangle de l'ecran
  2125. if ( (sqrt((P.x()-PosX)*(P.x()-PosX)+(P.y()-PosY)*(P.y()-PosY))) < 10)
  2126. { // on teste par calcul de la distance dans le plan de projection
  2127. num_objet_BSC_pointe = row+1; // pour selectionner la ligne concernee dans le tableau
  2128. ok = true;
  2129. }
  2130. }
  2131. }
  2132. }
  2133. row++;
  2134. }
  2135. return num_objet_BSC_pointe;
  2136. }
  2137.  
  2138.  
  2139. void MainWindow::mousePressEvent(QMouseEvent *event)
  2140. //remarque: le menu contextuel qui s'ouvre avec le clic de droite n'est pas declenche ici,
  2141. //void MainWindow::contextMenuEvent
  2142. {
  2143. if (actionMode_Impression->isChecked())
  2144. {
  2145. actionMode_Impression->setChecked(false); // revient a l'affichage ciel noir avec menu contextuel actif
  2146. return; // a cause de recadrage de l'image + grande que l'ecran
  2147. }
  2148.  
  2149. QString txt_HR, txt1, Nom, nom1, nom2;
  2150. QPoint P;
  2151. long RAs, DEs;
  2152. if (event->button() == Qt::LeftButton)
  2153. {
  2154. PosX = event->x() - label_5->x()-1;
  2155. PosY = event->y() - label_5->y() - 55;
  2156. if (PosY < 20) { return;}
  2157.  
  2158. P.setX(PosX);
  2159. P.setY(PosY);
  2160. projection_inverse(P, &RAs, &DEs);
  2161. RA_pointe = RAs;
  2162. DE_pointe = DEs;
  2163.  
  2164. efface_position_pointee();
  2165.  
  2166. Edit_RAposPointe->setText(nb_secondes2txt_hms (RAs));
  2167. Edit_DEposPointe->setText(nb_secondes2txt_hms (DEs));
  2168. HR_pointe = trouve_etoile_at_xy(P);
  2169.  
  2170. if (actionSouligner_Etoiles_d_une_CSTL->isChecked())
  2171. {
  2172. if (HR_pointe !=0)
  2173. {
  2174. cstl_pointee = TableWidget_BSC->item(HR_pointe-1,colCSTL)->text();
  2175. a_dessiner = true;
  2176. dessiner_ciel(totalite);
  2177. }
  2178. }
  2179.  
  2180. if ((HR_pointe !=0) && (HR_pointe != memo_HR_pointe))
  2181. {
  2182. efface_objet_pointe();
  2183. a_dessiner = true;
  2184. dessiner_ciel(partiel_BSC); // rajoute l'etiquette a cote de l'etoile pointee
  2185.  
  2186. if (actionEditeur_de_Constellations->isChecked())
  2187. {
  2188. txt_HR.setNum(HR_pointe);
  2189. Edit_ligne_cstl->insert(txt_HR + "-") ;
  2190. }
  2191. memo_HR_pointe = HR_pointe;
  2192. }
  2193. NGC_pointe = trouve_NGC_at_xy(P);
  2194. if ((NGC_pointe !=0) && (NGC_pointe != memo_NGC_pointe))
  2195. {
  2196. efface_objet_pointe();
  2197. a_dessiner = true;
  2198. dessiner_ciel(partiel_NGC); // rajoute l'etiquette a cote de l'objet pointe
  2199. memo_NGC_pointe = NGC_pointe;
  2200. }
  2201. trouve_TYC_at_xy(P);
  2202. if ((num_etoile_TYC_pointe !=0) && etoiles_tyc_visibles )
  2203. {
  2204. a_dessiner = true;
  2205. dessiner_ciel(partiel_TYC); // rajoute l'etiquette a cote de l'etoile TYC pointe
  2206. }
  2207. }
  2208. event->accept();
  2209. }
  2210.  
  2211.  
  2212. void MainWindow::wheelEvent (QWheelEvent * event)
  2213. {
  2214. if (tabWidget1->currentIndex() != 2) return;
  2215.  
  2216. int numDegrees = event->delta() / 8;
  2217. int numSteps = numDegrees / 15;
  2218.  
  2219. if (event->orientation() == Qt::Vertical)
  2220. {
  2221. if (numSteps>0)
  2222. { spinBoxZoom->setValue(spinBoxZoom->value()+ 0.5);}
  2223. else
  2224. { spinBoxZoom->setValue(spinBoxZoom->value()- 0.5);}
  2225. }
  2226.  
  2227. event->accept();
  2228. }
  2229.  
  2230.  
  2231. void MainWindow::redimmensionner_tout()
  2232. {
  2233. tabWidget1->resize(w_ecran-10, h_ecran-30);
  2234. TableWidget_BSC->setFixedHeight(h_ecran-100);
  2235. TableWidget_NGC->setFixedHeight(h_ecran-100);
  2236. Liste_Messier->setFixedHeight(h_ecran-252);
  2237.  
  2238. listeDoc->setFixedWidth(w_ecran-20);
  2239. listeDoc->setFixedHeight(h_ecran-120);
  2240.  
  2241. label_5->setFixedWidth(w_ecran-20);
  2242. label_5->setFixedHeight(h_ecran-60);
  2243. x_max_ecran = w_ecran-10;
  2244. y_max_ecran = h_ecran-60;
  2245. a_dessiner = true;
  2246. dessiner_ciel(totalite);
  2247. }
  2248.  
  2249.  
  2250. void MainWindow::resizeEvent(QResizeEvent *event)
  2251. {
  2252. w_ecran = event->size().width();
  2253. h_ecran = event->size().height();
  2254. event->accept();
  2255. redimmensionner_tout();
  2256. }
  2257.  
  2258.  
  2259. void MainWindow::MAJ_zoom(double z)
  2260. {
  2261. zoom_double = z;
  2262. if (actionMagnitude_max_auto->isChecked())
  2263. {
  2264. if (z<3) { actionAfficher_Noms->setChecked(false);}
  2265. spinBox_magnitude_max->setValue(2 + 2*zoom_double);
  2266. }
  2267.  
  2268. if (!ne_pas_dessiner_maintenant)
  2269. {
  2270. a_dessiner = true;
  2271. dessiner_ciel(totalite);
  2272. }
  2273. }
  2274.  
  2275.  
  2276. void MainWindow::on_spinBox_latitude_valueChanged(int )
  2277. {
  2278. calcul_anglesABC();
  2279. if (!ne_pas_dessiner_maintenant)
  2280. {
  2281. a_dessiner = true;
  2282. dessiner_ciel(totalite);
  2283. }
  2284. }
  2285.  
  2286.  
  2287. void MainWindow::on_pushButton_Date_clicked()
  2288. {
  2289. if ( !calendrier1->isVisible ()) {calendrier1->show();} else {calendrier1->hide();}
  2290. }
  2291.  
  2292.  
  2293. void MainWindow::on_actionRecharger_fichier_constellations_activated()
  2294. {
  2295. int z3 = charger_figures_cstl(QDir::currentPath() + "/catalogues/figures_constellations.txt");
  2296. // si le fichier a ete trouve dans le dir /catalogues, alors z=0 sinon on le chercher dans le dir de l'executable
  2297. if (z3 == 1) { z3 = charger_figures_cstl (QDir::currentPath() +"/figures_constellations.txt");}
  2298. a_dessiner = true;
  2299. dessiner_ciel(totalite);
  2300. }
  2301.  
  2302.  
  2303.  
  2304. int MainWindow::Listage_objets_BSC() // dans le TableWidget_BSC
  2305. {
  2306. QString st1, st2;
  2307. long RAs, DEs;
  2308. int n;
  2309. int nb_objets_lus=0;
  2310. int i;
  2311. int hr;
  2312. BSCrec etoile_i;
  2313.  
  2314. int i_max = liste_etoiles_BSC.length();
  2315. for (i=0; i< i_max; i++)
  2316. {
  2317. etoile_i = liste_etoiles_BSC.at(i);
  2318. RAs = etoile_i.ra * 3600 /15;
  2319. if (RAs !=0)
  2320. {
  2321. hr = etoile_i.hr;
  2322. st1.setNum(RAs); // conversion num -> txt
  2323. TableWidget_BSC->setItem(hr-1, colRA, new QTableWidgetItem (st1) ); // RA
  2324. DEs = etoile_i.de * 3600;
  2325. if (DEs<0) {DEs = 324000 - DEs;}
  2326. st1.setNum(DEs); // conversion num -> txt
  2327. TableWidget_BSC->setItem(hr-1, colDE, new QTableWidgetItem (st1) ); // DE
  2328. st1=""; for (n=0; n<=3; n++) {st1 += etoile_i.bayer[n]; } //lettre de Bayer
  2329. removeCaractere(' ', &st1);
  2330. st2=""; for (n=0; n<=2; n++) {st2 += etoile_i.cstl[n]; } // constellation
  2331. removeCaractere(' ', &st2);
  2332. TableWidget_BSC->setItem(hr-1, colCSTL, new QTableWidgetItem (st2) ); // constellation
  2333. TableWidget_BSC->setItem(hr-1, colNomBay, new QTableWidgetItem (st1+" "+st2) );
  2334. st1.setNum(long(etoile_i.hd)); // conversion num -> txt
  2335. TableWidget_BSC->setItem(hr-1, colHD, new QTableWidgetItem (st1) ); //HD
  2336. st1.setNum(etoile_i.hr); // conversion num -> txt
  2337. TableWidget_BSC->setItem(hr-1, colHR, new QTableWidgetItem (st1) ); //HR
  2338. st1.setNum(etoile_i.mv, 'f',3); // conversion num -> txt
  2339. if (st1.length()==1) { st1+=".00"; }
  2340. if (st1.length()==2) { st1+="00"; }
  2341. if (st1.length()==3) { st1+="0"; }
  2342. if (st1.length() > 4) { st1 = st1.left(4); }
  2343. TableWidget_BSC->setItem(hr-1, colMV, new QTableWidgetItem (st1) ); // magnitude visuelle
  2344. st1.setNum(etoile_i.mv); // conversion num -> txt
  2345. TableWidget_BSC->setItem(hr-1, colClsSpect, new QTableWidgetItem (st1) );
  2346. st1=""; for (n=0; n<=15; n++) {st1 += etoile_i.sp[n]; }
  2347. removeCaractere(' ', &st1);
  2348. TableWidget_BSC->setItem(hr-1, colClsSpect, new QTableWidgetItem (st1) ); // Classe spectrale
  2349. }
  2350.  
  2351. }
  2352. TableWidget_BSC->resizeColumnsToContents();
  2353. return nb_objets_lus;
  2354. }
  2355.  
  2356.  
  2357. void MainWindow::Listage_noms_etoiles()
  2358. {
  2359. int n, p;
  2360. QString ligne, nom1, nbtxt;
  2361. int hr;
  2362. int nb_lignes = liste_noms_etoiles.size();
  2363. n=0;
  2364. while (n<nb_lignes)
  2365. {
  2366. ligne = liste_noms_etoiles.operator [](n);
  2367. listeNoms->addItem(ligne);
  2368.  
  2369. p=ligne.indexOf(";");
  2370. nbtxt=ligne.left(p);
  2371. hr = nbtxt.toInt();
  2372. ligne.remove(0, p+1);
  2373. p=ligne.indexOf(";");
  2374. nom1= ligne.left(p); // recupere le 1er nom de l'etoile
  2375. TableWidget_BSC->setItem(hr-1, colNomCom, new QTableWidgetItem (nom1) );
  2376. n++;
  2377. }
  2378. }
  2379.  
  2380.  
  2381. int MainWindow::charger_fichier_SAC() // catalogue SAC contenant (essentiellement) les objets NGC
  2382. {
  2383. QString SAC_fileName, txt, magnitude;
  2384. int row;
  2385. int p;
  2386. row=0;
  2387.  
  2388. QDir repertoire1;
  2389. repertoire1.setPath(QDir::currentPath());
  2390. SAC_fileName = repertoire1.path() + chemin_SAC + "NGC628f.txt";
  2391. QFile file1(SAC_fileName);
  2392. if (file1.exists()) { file1.open(QIODevice::ReadOnly | QIODevice::Text); }
  2393. else
  2394. {
  2395. repertoire1.cdUp(); //si lance depuis le repertoire /run
  2396. SAC_fileName = repertoire1.path() + chemin_SAC + "NGC628f.txt";
  2397. file1.setFileName(SAC_fileName);
  2398. if (file1.exists()) { file1.open(QIODevice::ReadOnly | QIODevice::Text); }
  2399. else {return 1;}
  2400. }
  2401. QTextStream textStream1(&file1);
  2402. while ( !textStream1.atEnd() )
  2403. {
  2404. QString ligne = textStream1.readLine();
  2405. //Nom1 ;Nom2 ;TYPE ;Constell ;RAs ;DEs ;MAG ;SIZE_MAX ;SIZE_MIN ;PA
  2406. //NGC7831 ;IC1530 ;GALXY ;AND ;438 ;117420 ;12,8 ;1.5m ;0.3m ;38
  2407. //le fichier ne comprend pas les tabulations
  2408. if (ligne.left(1) !="#")
  2409. {
  2410. p=ligne.indexOf(";");
  2411. txt = ligne.left(p);
  2412. TableWidget_NGC->setItem(row, colNGCNom1, new QTableWidgetItem (txt) );
  2413. //hr = nbtxt.toInt();
  2414.  
  2415. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2416. TableWidget_NGC->setItem(row, colNGCNom2, new QTableWidgetItem (txt) );
  2417.  
  2418. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2419. TableWidget_NGC->setItem(row, colNGCType, new QTableWidgetItem (txt) );
  2420.  
  2421. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2422. TableWidget_NGC->setItem(row, colNGCCons, new QTableWidgetItem (txt) );
  2423.  
  2424. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2425. TableWidget_NGC->setItem(row, colNGCRA, new QTableWidgetItem (txt) );
  2426.  
  2427. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2428. TableWidget_NGC->setItem(row, colNGCDE, new QTableWidgetItem (txt) );
  2429.  
  2430. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2431. TableWidget_NGC->setItem(row, colNGCMagn, new QTableWidgetItem (txt) );
  2432.  
  2433. ligne.remove(0, p+1); p=ligne.indexOf(";"); txt = ligne.left(p);
  2434. TableWidget_NGC->setItem(row, colNGCDiam, new QTableWidgetItem (txt) );
  2435.  
  2436. row++;
  2437. }
  2438. nb_objets_SAC = row;
  2439. }
  2440. TableWidget_NGC->resizeColumnsToContents();
  2441. TableWidget_NGC->setSelectionBehavior(QAbstractItemView::SelectRows);
  2442. TableWidget_NGC->selectRow(0);
  2443. return 0;
  2444. }
  2445.  
  2446.  
  2447. void MainWindow::on_timeEdit1_timeChanged(QTime )
  2448. {
  2449. calcul_anglesABC();
  2450. a_dessiner = true;
  2451. dessiner_ciel(totalite);
  2452. }
  2453.  
  2454.  
  2455. void MainWindow::on_spin_inc_date_valueChanged(int valeur)
  2456. {
  2457. QString txt1;
  2458. day_oh_year1 = valeur;
  2459. txt1.setNum(day_oh_year1); // conversion num -> txt
  2460. Edit_dayOfYear->setText(txt1 + "/365");
  2461. calendrier1->hide();
  2462. calcul_anglesABC();
  2463. a_dessiner = true;
  2464. dessiner_ciel(totalite);
  2465. }
  2466.  
  2467.  
  2468. void MainWindow::on_spinBox_magnitude_max_valueChanged(double )
  2469. {
  2470. if (!ne_pas_dessiner_maintenant)
  2471. {
  2472. a_dessiner = true;
  2473. dessiner_ciel(totalite);
  2474. }
  2475. }
  2476.  
  2477.  
  2478. void MainWindow::on_Bt_Go_clicked()
  2479. {
  2480. QString str1;
  2481. int hr;
  2482. long RA1, DE1;
  2483. QString RAs, DEs;
  2484. str1 = Edit_GoNumBSC->text();
  2485. hr = str1.toInt();
  2486. if ((hr>=0) && (hr < 9110))
  2487. {
  2488. TableWidget_BSC->setCurrentCell(hr-1,colRA); // pour selectionner la ligne (a l'affichage)
  2489. RAs=TableWidget_BSC->item(hr-1,colRA)->text();
  2490. RA1 = RAs.toInt(); // conversion txt -> num
  2491. DEs=TableWidget_BSC->item(hr-1,colDE)->text();
  2492. DE1 = DEs.toLong(); // conversion txt -> num
  2493. spinBoxZoom->setValue(3); // zoom
  2494. actionAfficher_Noms->setChecked(true);
  2495. centrer_position (RA1, DE1);
  2496. num_objet_BSC = hr;
  2497. num_objet_BSC_pointe = hr;
  2498. }
  2499. }
  2500.  
  2501.  
  2502. void MainWindow::on_listeNoms_currentRowChanged(int )
  2503. {
  2504. QString ligne, hrtxt;
  2505. int p;
  2506. ligne = listeNoms->currentItem()->text();
  2507. p=ligne.indexOf(";");
  2508. hrtxt=ligne.left(p);
  2509. Edit_GoNumBSC->setText(hrtxt);
  2510. on_Bt_Go_clicked();
  2511. }
  2512.  
  2513.  
  2514. void MainWindow::on_Edit_FindName_textChanged(QString )
  2515. {
  2516. QString ligne, nom1, nom2;
  2517. int nb_car;
  2518. int n, p;
  2519. int nb_lignes = listeNoms->count();
  2520. nom1 = Edit_FindName->text().toLower();
  2521. nb_car = nom1.length();
  2522. n=0;
  2523. ligne = "";
  2524. nom2 = "";
  2525. while((nom1.left(nb_car) != nom2.left(nb_car)) && (n < nb_lignes))
  2526. {
  2527. listeNoms->setCurrentRow(n);
  2528. ligne = listeNoms->item(n)->text();
  2529. p=ligne.indexOf(";");
  2530. ligne.remove(0, p+1);
  2531. p=ligne.indexOf(";");
  2532. nom2= ligne.left(p).toLower();
  2533. n++;
  2534. }
  2535. }
  2536.  
  2537.  
  2538. void MainWindow::on_spinBoxNGC_mag_max_valueChanged(double )
  2539. {
  2540. if (!ne_pas_dessiner_maintenant)
  2541. {
  2542. a_dessiner = true;
  2543. dessiner_ciel(totalite);
  2544. }
  2545. }
  2546.  
  2547.  
  2548. void MainWindow::rechercher_LW(QString txt_i, QListWidget *listWidget_i)
  2549. // Recherche d'un texte dans un QListWidget
  2550. {
  2551. QString txt2;
  2552. int p =0;
  2553. if (txt_i != "")
  2554. {
  2555. setCursor(Qt::WaitCursor);
  2556.  
  2557. int nb_lignes = listWidget_i->count();
  2558. int num_ligne = listWidget_i->currentRow()+1;
  2559. bool ok = false;
  2560. while((num_ligne < nb_lignes) && !ok)
  2561. {
  2562.  
  2563. txt2 = listWidget_i->item(num_ligne)->text();
  2564. if (txt2.contains(txt_i,Qt::CaseInsensitive))
  2565. {
  2566. p = txt2.indexOf(txt_i,Qt::CaseInsensitive);
  2567. ok = true;
  2568. }
  2569. else { num_ligne++; }
  2570. }
  2571. setCursor(Qt::ArrowCursor);
  2572. if (num_ligne < nb_lignes)
  2573. {
  2574. listWidget_i->setCurrentRow(num_ligne);
  2575. }
  2576. else
  2577. {
  2578. listWidget_i->setCurrentRow(0);
  2579. QMessageBox msgBox;
  2580. msgBox.setText("Occurence non trouvee, retour en haut de la liste" );
  2581. msgBox.exec();
  2582. }
  2583. }
  2584. }
  2585.  
  2586.  
  2587. void MainWindow::rechercher_TW(QString txt_i, int col_i, QTableWidget *tableWidget_i)
  2588. // Recherche d'un texte dans la colonne 'col_i' d'un QTableWidget
  2589. {
  2590. QString txt2;
  2591. if (txt_i != "")
  2592. {
  2593. setCursor(Qt::WaitCursor);
  2594. int row = tableWidget_i->currentRow()+1;
  2595. bool ok = false;
  2596. while((row < nb_objets_SAC) && !ok)
  2597. {
  2598. txt2 = tableWidget_i->item(row,col_i)->text();
  2599. if (txt2.contains(txt_i,Qt::CaseInsensitive)) {ok = true;}
  2600. row++;
  2601. }
  2602. setCursor(Qt::ArrowCursor);
  2603. if (row != nb_objets_SAC)
  2604. {
  2605. tableWidget_i->setCurrentCell(row-1,0);
  2606. }
  2607. else
  2608. {
  2609. tableWidget_i->setCurrentCell(0,0);
  2610. QMessageBox msgBox;
  2611. msgBox.setText("Occurence non trouvee, retour en haut de la liste" );
  2612. msgBox.exec();
  2613. }
  2614. }
  2615. }
  2616.  
  2617.  
  2618. void MainWindow::on_Bt_okRech1_clicked()
  2619. {
  2620. rechercher_TW(Edit_FindNameNGC1->text(), 0, TableWidget_NGC);
  2621. }
  2622.  
  2623.  
  2624. void MainWindow::on_Bt_okRech2_clicked()
  2625. {
  2626. rechercher_TW(Edit_FindNameNGC2->text(), 1, TableWidget_NGC);
  2627.  
  2628. }
  2629.  
  2630.  
  2631. void MainWindow::on_Bt_top1_clicked()
  2632. {
  2633. TableWidget_NGC->setCurrentCell(0,0);
  2634. }
  2635.  
  2636.  
  2637. void MainWindow::on_Bt_rech_Messier_clicked()
  2638. {
  2639. QString txt1, txt2, txt3, ligne;
  2640. int row=0;
  2641. setCursor(Qt::WaitCursor);
  2642. Liste_Messier->clear();
  2643. while((row < nb_objets_SAC))
  2644. {
  2645. txt2 = TableWidget_NGC->item(row,1)->text().toUpper() + "0";
  2646. if( (txt2[0] == 'M') && txt2[1].isNumber() && txt2[2].isNumber())
  2647. {
  2648. txt1 = TableWidget_NGC->item(row,0)->text();
  2649. txt3.setNum(row+1);
  2650. txt2.truncate(txt2.size()-1);
  2651. ligne = txt2 + '\t' + txt1 + '\t' + txt3;
  2652. Liste_Messier->addItem(ligne);
  2653. }
  2654. row++;
  2655. }
  2656. Liste_Messier->sortItems(Qt::AscendingOrder);
  2657. setCursor(Qt::ArrowCursor);
  2658. }
  2659.  
  2660.  
  2661. void MainWindow::designe_objet_NGC(int row)
  2662. {
  2663. long RA1, DE1;
  2664. float mv;
  2665. QString RAs, DEs, txt1;
  2666.  
  2667. RAs=TableWidget_NGC->item(row, colNGCRA)->text();
  2668. RA1 = RAs.toInt(); // conversion txt -> num
  2669. DEs=TableWidget_NGC->item(row, colNGCDE)->text();
  2670. DE1 = DEs.toLong(); // conversion txt -> num
  2671.  
  2672. txt1=TableWidget_NGC->item(row, colNGCMagn)->text();
  2673. mv = txt1.toFloat(); // conversion txt -> reel
  2674.  
  2675. //la ligne suivante evite d'avoir d'innombrables noms affiches a l'ecran
  2676. if (mv < 10) {spinBoxZoom->setValue(4); } else {spinBoxZoom->setValue(6); } // zoom; attention modifie aussi spinBoxNGC_mag_max
  2677.  
  2678. spinBoxNGC_mag_max->setValue(mv+1);
  2679. actionAfficher_Noms->setChecked(true);
  2680. centrer_position (RA1, DE1);
  2681. }
  2682.  
  2683.  
  2684. void MainWindow::on_Liste_Messier_currentRowChanged(int currentRow1)
  2685. {
  2686.  
  2687. QString ligne, nNGCtxt;
  2688. int row = 0;
  2689. int p;
  2690. if (currentRow1 > 0)
  2691. {
  2692. ligne = Liste_Messier->item(currentRow1)->text();
  2693. p=ligne.indexOf('\t');
  2694. ligne.remove(0, p+1);
  2695. p=ligne.indexOf('\t');
  2696. ligne.remove(0, p+1);
  2697. nNGCtxt=ligne.left(p);
  2698. row=nNGCtxt.toInt()-1; // le numero de ligne dans le grand tableau est egal au numero NGC decrypte ici (-1)
  2699. // (-1 parce que la numerotation des lignes dans le tableau commence par 0 )
  2700. if ((row >= 0) && (row < nb_objets_SAC-1))
  2701. {
  2702. Edit_goNumNGC->setText(nNGCtxt);
  2703. // NGC_gotoLine(row);
  2704. TableWidget_NGC->setCurrentCell(row,colNGCRA);
  2705. designe_objet_NGC(row); // prepare son centrage sur la carte
  2706. }
  2707. }
  2708. }
  2709.  
  2710.  
  2711. void MainWindow::on_TableWidget_NGC_cellClicked(int row, int )
  2712. {
  2713. designe_objet_NGC(row); // prepare son centrage sur la carte
  2714. }
  2715.  
  2716.  
  2717. void MainWindow::on_TableWidget_BSC_cellClicked