summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/tools/modcalcplanets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/tools/modcalcplanets.cpp')
-rw-r--r--kstars/kstars/tools/modcalcplanets.cpp591
1 files changed, 591 insertions, 0 deletions
diff --git a/kstars/kstars/tools/modcalcplanets.cpp b/kstars/kstars/tools/modcalcplanets.cpp
new file mode 100644
index 00000000..c927d71e
--- /dev/null
+++ b/kstars/kstars/tools/modcalcplanets.cpp
@@ -0,0 +1,591 @@
+/***************************************************************************
+ modcalcequinox.cpp - description
+ -------------------
+ begin : dom may 2 2004
+ copyright : (C) 2004-2005 by Pablo de Vicente
+ email : p.devicentea@wanadoo.es
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "modcalcplanets.h"
+#include "modcalcplanets.moc"
+#include "dms.h"
+#include "dmsbox.h"
+#include "kstars.h"
+#include "kstarsdata.h"
+#include "kssun.h"
+#include "ksplanet.h"
+#include "ksmoon.h"
+#include "kspluto.h"
+#include "libkdeedu/extdate/extdatetimeedit.h"
+#include "ksnumbers.h"
+
+#include <qcombobox.h>
+#include <qdatetimeedit.h>
+#include <qstring.h>
+#include <qtextstream.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+
+
+modCalcPlanets::modCalcPlanets(QWidget *parentSplit, const char *name) : modCalcPlanetsDlg (parentSplit,name) {
+ showCurrentDateTime();
+ showLongLat();
+ raBox->setDegType(FALSE);
+ show();
+}
+
+modCalcPlanets::~modCalcPlanets(){
+}
+
+void modCalcPlanets::showCurrentDateTime (void)
+{
+ KStars *ks = (KStars*) parent()->parent()->parent(); // QSplitter->AstroCalc->KStars
+ KStarsDateTime dt = ks->data()->geo()->LTtoUT( KStarsDateTime::currentDateTime() );
+
+ dateBox->setDate( dt.date() );
+ timeBox->setTime( dt.time() );
+
+ dateBoxBatch->setDate( dt.date() );
+ utBoxBatch->setTime( dt.time() );
+}
+
+KStarsDateTime modCalcPlanets::getDateTime (void)
+{
+ return KStarsDateTime( dateBox->date() , timeBox->time() );
+}
+
+void modCalcPlanets::showLongLat(void)
+{
+
+ KStars *ks = (KStars*) parent()->parent()->parent(); // QSplitter->AstroCalc->KStars
+ longBox->show( ks->geo()->lng() );
+ latBox->show( ks->geo()->lat() );
+
+ longBoxBatch->show( ks->geo()->lng() );
+ latBoxBatch->show( ks->geo()->lat() );
+}
+
+
+GeoLocation modCalcPlanets::getObserverPosition (void)
+{
+ GeoLocation geoPlace;
+
+ geoPlace.setLong( longBox->createDms() );
+ geoPlace.setLat( latBox->createDms() );
+ geoPlace.setHeight( 0.0 );
+
+ return geoPlace;
+}
+
+void modCalcPlanets::slotComputePosition (void)
+{
+ KStarsData *kd = (KStarsData*) parent()->parent()->parent();
+ KStarsDateTime dt = getDateTime();
+ long double julianDay = dt.djd();
+ GeoLocation position( getObserverPosition() );
+ KSNumbers num( julianDay );
+ dms LST( position.GSTtoLST( dt.gst() ) );
+
+ // Earth
+ KSPlanet Earth( kd, I18N_NOOP( "Earth" ));
+ Earth.findPosition( &num );
+
+ // Mercury
+ if (planetComboBox->currentItem() == 0 ) {
+ KSPlanet p( kd, I18N_NOOP( "Mercury" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 1) {
+ KSPlanet p( kd, I18N_NOOP( "Venus" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 2) {
+ showCoordinates( Earth );
+ }
+ else if(planetComboBox->currentItem() == 3) {
+ KSPlanet p( kd, I18N_NOOP( "Mars" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 4) {
+ KSPlanet p( kd, I18N_NOOP( "Jupiter" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 5) {
+ KSPlanet p( kd, I18N_NOOP( "Saturn" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 6) {
+ KSPlanet p( kd, I18N_NOOP( "Uranus" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 7) {
+ KSPlanet p( kd, I18N_NOOP( "Neptune" ));
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 8) {
+ KSPluto p( kd );
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 9) {
+ KSMoon p( kd );
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ showCoordinates( p );
+ }
+ else if(planetComboBox->currentItem() == 10) {
+ KSSun p( kd );
+ p.findPosition( &num, position.lat(), &LST, &Earth);
+ p.EquatorialToHorizontal( &LST, position.lat());
+ p.setRsun(0.0);
+ showCoordinates( p );
+ }
+}
+
+void modCalcPlanets::showCoordinates( const KSPlanet &ksp) {
+
+ showHeliocentricEclipticCoords(ksp.helEcLong(), ksp.helEcLat(), ksp.rsun() );
+ showGeocentricEclipticCoords(ksp.ecLong(), ksp.ecLat(), ksp.rearth() );
+ showEquatorialCoords(ksp.ra(), ksp.dec() );
+ showTopocentricCoords(ksp.az(), ksp.alt() );
+
+}
+
+void modCalcPlanets::showCoordinates( const KSMoon &ksp ) {
+
+ showHeliocentricEclipticCoords(ksp.helEcLong(), ksp.helEcLat(), ksp.rsun() );
+ showGeocentricEclipticCoords(ksp.ecLong(), ksp.ecLat(), ksp.rearth() );
+ showEquatorialCoords(ksp.ra(), ksp.dec() );
+ showTopocentricCoords(ksp.az(), ksp.alt() );
+
+}
+void modCalcPlanets::showCoordinates( const KSPluto &ksp ) {
+
+ showHeliocentricEclipticCoords(ksp.helEcLong(), ksp.helEcLat(), ksp.rsun() );
+ showGeocentricEclipticCoords(ksp.ecLong(), ksp.ecLat(), ksp.rearth() );
+ showEquatorialCoords(ksp.ra(), ksp.dec() );
+ showTopocentricCoords(ksp.az(), ksp.alt() );
+
+}
+
+void modCalcPlanets::showCoordinates( const KSSun &ksp ) {
+
+ showHeliocentricEclipticCoords(ksp.helEcLong(), ksp.helEcLat(), ksp.rsun() );
+ showGeocentricEclipticCoords(ksp.ecLong(), ksp.ecLat(), ksp.rearth() );
+ showEquatorialCoords(ksp.ra(), ksp.dec() );
+ showTopocentricCoords(ksp.az(), ksp.alt() );
+
+}
+
+void modCalcPlanets::slotClear(void){
+ helLongBox->setText( "" );
+ helLatBox->setText( "" );
+ sunDistBox->setText( "" );
+ geoLongBox->setText("");
+ geoLatBox->setText("");
+ earthDistBox->setText("");
+ raBox->clearFields();
+ decBox->clearFields();
+ azBox->setText("");
+ altBox->setText("");
+}
+
+void modCalcPlanets::showHeliocentricEclipticCoords(const dms *hLong, const dms *hLat, double dist)
+{
+ helLongBox->show( hLong );
+ helLatBox->show( hLat );
+ sunDistBox->setText( KGlobal::locale()->formatNumber( dist,6));
+}
+
+void modCalcPlanets::showGeocentricEclipticCoords(const dms *eLong, const dms *eLat, double dist)
+{
+ geoLongBox->show( eLong );
+ geoLatBox->show( eLat );
+ earthDistBox->setText( KGlobal::locale()->formatNumber( dist,6));
+}
+
+void modCalcPlanets::showEquatorialCoords(const dms *ra, const dms *dec)
+{
+ raBox->show( ra, FALSE );
+ decBox->show( dec );
+}
+
+void modCalcPlanets::showTopocentricCoords(const dms *az, const dms *el)
+{
+ azBox->show( az );
+ altBox->show( el );
+}
+
+void modCalcPlanets::slotPlanetsCheckedBatch(){
+
+ if ( planetCheckBatch->isChecked() )
+ planetComboBoxBatch->setEnabled( false );
+ else {
+ planetComboBoxBatch->setEnabled( true );
+ }
+}
+
+void modCalcPlanets::slotUtCheckedBatch(){
+
+ if ( utCheckBatch->isChecked() )
+ utBoxBatch->setEnabled( false );
+ else {
+ utBoxBatch->setEnabled( true );
+ }
+}
+
+void modCalcPlanets::slotDateCheckedBatch(){
+
+ if ( dateCheckBatch->isChecked() )
+ dateBoxBatch->setEnabled( false );
+ else {
+ dateBoxBatch->setEnabled( true );
+ }
+}
+
+void modCalcPlanets::slotLongCheckedBatch(){
+
+ if ( longCheckBatch->isChecked() )
+ longBoxBatch->setEnabled( false );
+ else {
+ longBoxBatch->setEnabled( true );
+ }
+}
+
+void modCalcPlanets::slotLatCheckedBatch(){
+
+ if ( latCheckBatch->isChecked() )
+ latBoxBatch->setEnabled( false );
+ else {
+ latBoxBatch->setEnabled( true );
+ }
+}
+
+void modCalcPlanets::slotInputFile() {
+ QString inputFileName;
+ inputFileName = KFileDialog::getOpenFileName( );
+ InputLineEditBatch->setText( inputFileName );
+}
+
+void modCalcPlanets::slotOutputFile() {
+ QString outputFileName;
+ outputFileName = KFileDialog::getSaveFileName( );
+ OutputLineEditBatch->setText( outputFileName );
+}
+
+void modCalcPlanets::slotRunBatch() {
+
+ QString inputFileName;
+
+ inputFileName = InputLineEditBatch->text();
+
+ // We open the input file and read its content
+
+ if ( QFile::exists(inputFileName) ) {
+ QFile f( inputFileName );
+ if ( !f.open( IO_ReadOnly) ) {
+ QString message = i18n( "Could not open file %1.").arg( f.name() );
+ KMessageBox::sorry( 0, message, i18n( "Could Not Open File" ) );
+ inputFileName = "";
+ return;
+ }
+
+ QTextStream istream(&f);
+ processLines(istream);
+ f.close();
+ } else {
+ QString message = i18n( "Invalid file: %1" ).arg( inputFileName );
+ KMessageBox::sorry( 0, message, i18n( "Invalid file" ) );
+ inputFileName = "";
+ InputLineEditBatch->setText( inputFileName );
+ return;
+ }
+}
+
+unsigned int modCalcPlanets::requiredBatchFields(void) {
+ unsigned int i = 0;
+
+ if(planetCheckBatch->isChecked() )
+ i++;
+ if(utCheckBatch->isChecked() )
+ i++;
+ if(dateCheckBatch->isChecked() )
+ i++;
+ if (longCheckBatch->isChecked() )
+ i++;
+ if (latCheckBatch->isChecked() )
+ i++;
+
+ return i;
+
+}
+
+void modCalcPlanets::processLines( QTextStream &istream ) {
+
+ // we open the output file
+
+ QString outputFileName, lineToWrite;
+ outputFileName = OutputLineEditBatch->text();
+ QFile fOut( outputFileName );
+ fOut.open(IO_WriteOnly);
+ QTextStream ostream(&fOut);
+ bool lineIsValid = true;
+ QString message;
+
+ QString line;
+ QString space = " ";
+ QString planetB;
+ unsigned int i = 0, nline = 0;
+ QTime utB;
+ ExtDate dtB;
+ dms longB, latB, hlongB, hlatB, glongB, glatB, raB, decB, azmB, altB;
+ double rSunB(0.0), rEarthB(0.0);
+ KStarsData *kd = (KStarsData*) parent()->parent()->parent(); // QSplitter->AstroCalc->KStars
+ PlanetCatalog PCat( kd );
+ PCat.initialize();
+
+ QString pName[11], pNamei18n[11];
+
+ pName[0] = "Mercury"; pNamei18n[0]= i18n("Mercury");
+ pName[1] = "Venus"; pNamei18n[1]= i18n("Venus");
+ pName[2] = "Earth"; pNamei18n[2]= i18n("Earth");
+ pName[3] = "Mars"; pNamei18n[3]= i18n("Mars");
+ pName[4] = "Jupiter"; pNamei18n[4]= i18n("Jupiter");
+ pName[5] = "Saturn"; pNamei18n[5]= i18n("Saturn");
+ pName[6] = "Uranus"; pNamei18n[6]= i18n("Uranus");
+ pName[7] = "Neptune"; pNamei18n[7]= i18n("Neptune");
+ pName[8] = "Pluto"; pNamei18n[8]= i18n("Pluto");
+ pName[9] = "Sun"; pNamei18n[9]= i18n("Sun");
+ pName[10] = "Moon"; pNamei18n[10]= i18n("Moon");
+
+ unsigned int numberOfRequiredFields = requiredBatchFields();
+
+ while ( ! istream.eof() ) {
+ lineToWrite="";
+ line = istream.readLine();
+ line.stripWhiteSpace();
+
+ //Go through the line, looking for parameters
+
+ QStringList fields = QStringList::split( " ", line );
+
+ if (fields.count() != numberOfRequiredFields ) {
+ lineIsValid = false;
+ kdWarning() << i18n( "Incorrect number of fields in line %1: " ).arg(nline)
+ << i18n( "Present fields %1. " ).arg(fields.count())
+ << i18n( "Required fields %1. " ).arg(numberOfRequiredFields) << endl;
+ nline++;
+ continue;
+ }
+
+ i = 0;
+ if(planetCheckBatch->isChecked() ) {
+ planetB = fields[i];
+ unsigned int result = 1;
+ int j = 0;
+ while (j < 11) {
+ //while (result != 0 && j < 11) {
+ result = QString::compare( pNamei18n[j] , planetB );
+ if (result == 0)
+ break;
+ j++;
+ }
+ if (j == 11) {
+ kdWarning() << i18n("Unknown planet ")
+ << fields[i]
+ << i18n(" in line %1: ").arg(nline) << endl;
+ continue;
+ }
+ i++;
+ } else
+ planetB = planetComboBoxBatch->currentText( );
+
+ if ( allRadioBatch->isChecked() ) {
+ lineToWrite = planetB;
+ lineToWrite += space;
+ }
+ else
+ if(planetCheckBatch->isChecked() ) {
+ lineToWrite = planetB;
+ lineToWrite += space;
+ }
+
+ // Read Ut and write in ostream if corresponds
+
+ if(utCheckBatch->isChecked() ) {
+ utB = QTime::fromString( fields[i] );
+ if ( !utB.isValid() ) {
+ kdWarning() << i18n( "Line %1 contains an invalid time" ).arg(nline) << endl;
+ lineIsValid=false;
+ nline++;
+ continue;
+ }
+ i++;
+ } else
+ utB = utBoxBatch->time();
+
+ if ( allRadioBatch->isChecked() )
+ lineToWrite += utB.toString().append(space);
+ else
+ if(utCheckBatch->isChecked() )
+ lineToWrite += utB.toString().append(space);
+
+ // Read date and write in ostream if corresponds
+
+ if(dateCheckBatch->isChecked() ) {
+ dtB = ExtDate::fromString( fields[i], Qt::ISODate );
+ if ( !dtB.isValid() ) {
+ kdWarning() << i18n( "Line %1 contains an invalid date: " ).arg(nline) <<
+ fields[i] << endl ;
+ lineIsValid=false;
+ nline++;
+ continue;
+ }
+ i++;
+ } else
+ dtB = dateBoxBatch->date();
+ if ( allRadioBatch->isChecked() )
+ lineToWrite += dtB.toString().append(space);
+ else
+ if(dateCheckBatch->isChecked() )
+ lineToWrite += dtB.toString().append(space);
+
+ // Read Longitude and write in ostream if corresponds
+
+ if (longCheckBatch->isChecked() ) {
+ longB = dms::fromString( fields[i],TRUE);
+ i++;
+ } else
+ longB = longBoxBatch->createDms(TRUE);
+
+ if ( allRadioBatch->isChecked() )
+ lineToWrite += longB.toDMSString() + space;
+ else
+ if (longCheckBatch->isChecked() )
+ lineToWrite += longB.toDMSString() + space;
+
+ // Read Latitude
+
+ if (latCheckBatch->isChecked() ) {
+ latB = dms::fromString( fields[i], TRUE);
+ i++;
+ } else
+ latB = latBoxBatch->createDms(TRUE);
+ if ( allRadioBatch->isChecked() )
+ lineToWrite += latB.toDMSString() + space;
+ else
+ if (latCheckBatch->isChecked() )
+ lineToWrite += latB.toDMSString() + space;
+
+ KStarsDateTime edt( dtB, utB );
+ dms LST = edt.gst().Degrees() + longB.Degrees();
+
+ KSNumbers num( edt.djd() );
+
+ PCat.findPosition( &num, &latB, &LST );
+ PCat.EquatorialToHorizontal(&LST, &latB);
+
+ KSPlanet Earth( kd, I18N_NOOP( "Earth" ));
+ Earth.findPosition( &num );
+
+ KSMoon Moon( kd );
+ Moon.findPosition( &num, &latB, &LST, &Earth );
+ Moon.EquatorialToHorizontal( &LST, &latB );
+
+ int result = 1;
+ int jp = -1;
+ while (result != 0 && jp < 10) {
+ jp++;
+ result = QString::compare( pNamei18n[jp] , planetB );
+ }
+
+ if (jp < 11) {
+ if (jp < 10) {
+ // Heliocentric Ecl. coords.
+ hlongB.setD(PCat.findByName( pName[jp] )->helEcLong()->Degrees());
+ hlatB.setD( PCat.findByName( pName[jp] )->helEcLat()->Degrees());
+ rSunB = PCat.findByName( pName[jp] )->rsun();
+
+ // Geocentric Ecl. coords.
+ glongB .setD( PCat.findByName( pName[jp] )->ecLong()->Degrees() );
+ glatB.setD( PCat.findByName( pName[jp] )->ecLat()->Degrees() );
+ rEarthB = PCat.findByName( pName[jp] )->rearth();
+
+ // Equatorial coords.
+ decB.setD( PCat.findByName( pName[jp] )->dec()->Degrees() );
+ raB.setD( PCat.findByName( pName[jp] )->ra()->Degrees() );
+
+ // Topocentric Coords.
+ azmB.setD( PCat.findByName( pName[jp] )->az()->Degrees() );
+ altB.setD( PCat.findByName( pName[jp] )->alt()->Degrees() );
+ } else {
+
+ // Heliocentric Ecl. coords.
+ hlongB.setD( Moon.helEcLong()->Degrees() );
+ hlatB.setD( Moon.helEcLat()->Degrees() );
+
+ // Geocentric Ecl. coords.
+ glongB .setD( Moon.ecLong()->Degrees() );
+ glatB.setD( Moon.ecLat()->Degrees() );
+ rEarthB = Moon.rearth();
+
+ // Equatorial coords.
+ decB.setD( Moon.dec()->Degrees() );
+ raB.setD( Moon.ra()->Degrees() );
+
+ // Topocentric Coords.
+ azmB.setD( Moon.az()->Degrees() );
+ altB.setD( Moon.alt()->Degrees() );
+ }
+
+
+ ostream << lineToWrite;
+
+ if ( helEclCheckBatch->isChecked() )
+ ostream << hlongB.toDMSString() << space << hlatB.toDMSString() << space << rSunB << space ;
+ if ( geoEclCheckBatch->isChecked() )
+ ostream << glongB.toDMSString() << space << glatB.toDMSString() << space << rEarthB << space ;
+ if ( equGeoCheckBatch->isChecked() )
+ ostream << raB.toHMSString() << space << decB.toDMSString() << space ;
+ if ( topoCheckBatch->isChecked() )
+ ostream << azmB.toDMSString() << space << altB.toDMSString() << space ;
+
+ ostream << endl;
+ }
+ nline++;
+
+ }
+
+ if (!lineIsValid) {
+ QString message = i18n("Errors found while parsing some lines in the input file");
+ KMessageBox::sorry( 0, message, i18n( "Errors in lines" ) );
+ }
+
+ fOut.close();
+}