KSPlanetBase *PlanetCatalog::findByName( const QString n) const { if (n == "Earth") return Earth; QPtrListIterator<KSPlanetBase> it(planets); for (KSPlanetBase *ksp = it.toFirst(); ksp != 0; ksp = ++it) { if (ksp->name() == n) return ksp; } kdDebug() << k_funcinfo << "could not find planet named " << n << endl; return 0; }
bool PlanetCatalog::initialize() { KSPlanetBase *ksp; Earth = new KSPlanet( kd, I18N_NOOP( "Earth" ), "", 12756.28 /*diameter in km*/ ); if (!Earth->loadData()) return false; Sun = new KSSun( kd, "sun.png", 1392000. /*diameter in km*/ ); if (Sun->loadData()) { planets.append(Sun); } ksp = new KSPluto( kd, "pluto.png", 2320. /*diameter in km*/ ); planets.append(ksp); ksp = new KSPlanet( kd, I18N_NOOP( "Mercury" ), "mercury.png", 4879.4 /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } ksp = new KSPlanet( kd, I18N_NOOP( "Venus" ), "venus.png", 12103.6 /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } ksp = new KSPlanet( kd, I18N_NOOP( "Mars" ), "mars.png", 6792.4 /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } ksp = new KSPlanet( kd, I18N_NOOP( "Jupiter" ), "jupiter.png", 142984. /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } ksp = new KSPlanet( kd, I18N_NOOP( "Saturn" ), "saturn.png", 120536. /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } ksp = new KSPlanet( kd, I18N_NOOP( "Uranus" ), "uranus.png", 51118. /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } ksp = new KSPlanet( kd, I18N_NOOP( "Neptune" ), "neptune.png", 49572. /*diameter in km*/ ); if (ksp->loadData()) { planets.append(ksp); } return true; }
void PlanetViewer::updatePlanets() { KSNumbers num( ut.djd() ); bool changed(false); //Check each planet to see if it needs to be updated for ( unsigned int i=0; i<9; ++i ) { if ( abs( int(ut.date().jd()) - LastUpdate[i] ) > UpdateInterval[i] ) { KSPlanetBase *p = PCat.findByName( pName[i] ); p->findPosition( &num ); double s, c, s2, c2; p->helEcLong()->SinCos( s, c ); p->helEcLat()->SinCos( s2, c2 ); planet[i]->point(0)->setX( p->rsun()*c*c2 ); planet[i]->point(0)->setY( p->rsun()*s*c2 ); planetLabel[i]->point(0)->setX( p->rsun()*c*c2 ); planetLabel[i]->point(0)->setY( p->rsun()*s*c2 ); if ( centerPlanet() == pName[i] ) { double xc = (pw->map->x2() + pw->map->x())*0.5; double yc = (pw->map->y2() + pw->map->y())*0.5; double dx = planet[i]->point(0)->x() - xc; double dy = planet[i]->point(0)->y() - yc; pw->map->setLimits( pw->map->x() + dx, pw->map->x2() + dx, pw->map->y() + dy, pw->map->y2() + dy ); } LastUpdate[i] = int(ut.date().jd()); changed = true; } } if ( changed ) pw->map->update(); }
void SkyMap::keyPressEvent( QKeyEvent *e ) { KStars* kstars = KStars::Instance(); QString s; bool arrowKeyPressed( false ); bool shiftPressed( false ); float step = 1.0; if ( e->modifiers() & Qt::ShiftModifier ) { step = 10.0; shiftPressed = true; } //If the DBus resume key is not empty, then DBus processing is //paused while we wait for a keypress if ( ! data->resumeKey.isEmpty() && QKeySequence(e->key()) == data->resumeKey ) { //The resumeKey was pressed. Signal that it was pressed by //resetting it to empty; this will break the loop in //KStars::waitForKey() data->resumeKey = QKeySequence(); return; } if(m_previewLegend) { slotCancelLegendPreviewMode(); } switch ( e->key() ) { case Qt::Key_Left : if ( Options::useAltAz() ) { focus()->setAz( dms( focus()->az().Degrees() - step * MINZOOM/Options::zoomFactor() ).reduce() ); focus()->HorizontalToEquatorial( data->lst(), data->geo()->lat() ); } else { focus()->setRA( focus()->ra().Hours() + 0.05*step * MINZOOM/Options::zoomFactor() ); focus()->EquatorialToHorizontal( data->lst(), data->geo()->lat() ); } arrowKeyPressed = true; slewing = true; break; case Qt::Key_Right : if ( Options::useAltAz() ) { focus()->setAz( dms( focus()->az().Degrees() + step * MINZOOM/Options::zoomFactor() ).reduce() ); focus()->HorizontalToEquatorial( data->lst(), data->geo()->lat() ); } else { focus()->setRA( focus()->ra().Hours() - 0.05*step * MINZOOM/Options::zoomFactor() ); focus()->EquatorialToHorizontal( data->lst(), data->geo()->lat() ); } arrowKeyPressed = true; slewing = true; break; case Qt::Key_Up : if ( Options::useAltAz() ) { focus()->setAlt( focus()->alt().Degrees() + step * MINZOOM/Options::zoomFactor() ); if ( focus()->alt().Degrees() > 90.0 ) focus()->setAlt( 90.0 ); focus()->HorizontalToEquatorial( data->lst(), data->geo()->lat() ); } else { focus()->setDec( focus()->dec().Degrees() + step * MINZOOM/Options::zoomFactor() ); if (focus()->dec().Degrees() > 90.0) focus()->setDec( 90.0 ); focus()->EquatorialToHorizontal( data->lst(), data->geo()->lat() ); } arrowKeyPressed = true; slewing = true; break; case Qt::Key_Down: if ( Options::useAltAz() ) { focus()->setAlt( focus()->alt().Degrees() - step * MINZOOM/Options::zoomFactor() ); if ( focus()->alt().Degrees() < -90.0 ) focus()->setAlt( -90.0 ); focus()->HorizontalToEquatorial(data->lst(), data->geo()->lat() ); } else { focus()->setDec( focus()->dec().Degrees() - step * MINZOOM/Options::zoomFactor() ); if (focus()->dec().Degrees() < -90.0) focus()->setDec( -90.0 ); focus()->EquatorialToHorizontal( data->lst(), data->geo()->lat() ); } arrowKeyPressed = true; slewing = true; break; case Qt::Key_Plus: //Zoom in case Qt::Key_Equal: zoomInOrMagStep( e->modifiers() ); break; case Qt::Key_Minus: //Zoom out case Qt::Key_Underscore: zoomOutOrMagStep( e->modifiers() ); break; case Qt::Key_0: //center on Sun setClickedObject( data->skyComposite()->planet( KSPlanetBase::SUN ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_1: //center on Mercury setClickedObject( data->skyComposite()->planet( KSPlanetBase::MERCURY ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_2: //center on Venus setClickedObject( data->skyComposite()->planet( KSPlanetBase::VENUS ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_3: //center on Moon setClickedObject( data->skyComposite()->planet( KSPlanetBase::MOON ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_4: //center on Mars setClickedObject( data->skyComposite()->planet( KSPlanetBase:: MARS) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_5: //center on Jupiter setClickedObject( data->skyComposite()->planet( KSPlanetBase::JUPITER ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_6: //center on Saturn setClickedObject( data->skyComposite()->planet( KSPlanetBase::SATURN ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_7: //center on Uranus setClickedObject( data->skyComposite()->planet( KSPlanetBase::URANUS ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_8: //center on Neptune setClickedObject( data->skyComposite()->planet( KSPlanetBase::NEPTUNE ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_9: //center on Pluto setClickedObject( data->skyComposite()->planet( KSPlanetBase::PLUTO ) ); setClickedPoint( clickedObject() ); slotCenter(); break; case Qt::Key_BracketLeft: // Begin measuring angular distance if( !rulerMode ) slotBeginAngularDistance(); break; case Qt::Key_Escape: // Cancel angular distance measurement { if( rulerMode ) slotCancelRulerMode(); if( m_fovCaptureMode ) slotFinishFovCaptureMode(); break; } case Qt::Key_C: //Center clicked object if ( clickedObject() ) slotCenter(); break; case Qt::Key_D: //Details window for Clicked/Centered object { SkyObject *orig = 0; if ( shiftPressed ) { orig = clickedObject(); setClickedObject( focusObject() ); } if ( clickedObject() ) { slotDetail(); } if ( orig ) { setClickedObject( orig ); } break; } case Qt::Key_P: //Show Popup menu for Clicked/Centered object if ( shiftPressed ) { if ( focusObject() ) focusObject()->showPopupMenu( pmenu, QCursor::pos() ); } else { if ( clickedObject() ) clickedObject()->showPopupMenu( pmenu, QCursor::pos() ); } break; case Qt::Key_O: //Add object to Observing List { SkyObject *orig = 0; if ( shiftPressed ) { orig = clickedObject(); setClickedObject( focusObject() ); } if ( clickedObject() ) { kstars->observingList()->slotAddObject(); } if ( orig ) { setClickedObject( orig ); } break; } case Qt::Key_L: //Toggle User label on Clicked/Centered object { SkyObject *orig = 0; if ( shiftPressed ) { orig = clickedObject(); setClickedObject( focusObject() ); } if ( clickedObject() ) { if ( isObjectLabeled( clickedObject() ) ) slotRemoveObjectLabel(); else slotAddObjectLabel(); } if ( orig ) { setClickedObject( orig ); } break; } case Qt::Key_T: //Toggle planet trail on Clicked/Centered object (if solsys) { SkyObject *orig = 0; if ( shiftPressed ) { orig = clickedObject(); setClickedObject( focusObject() ); } KSPlanetBase* planet = dynamic_cast<KSPlanetBase*>( clickedObject() ); if( planet ) { if( planet->hasTrail() ) slotRemovePlanetTrail(); else slotAddPlanetTrail(); } if ( orig ) { setClickedObject( orig ); } break; } case Qt::Key_R: { // Toggle relativistic corrections Options::setUseRelativistic( ! Options::useRelativistic() ); kDebug() << "Relativistc corrections: " << Options::useRelativistic(); forceUpdate(); break; } case Qt::Key_A: Options::setUseAntialias( ! Options::useAntialias() ); kDebug() << "Use Antialiasing: " << Options::useAntialias(); forceUpdate(); break; case Qt::Key_K: { if(m_fovCaptureMode) slotCaptureFov(); break; } case Qt::Key_PageUp: { KStars::Instance()->selectPreviousFov(); break; } case Qt::Key_PageDown: { KStars::Instance()->selectNextFov(); break; } default: // We don't want to do anything in this case. Key is unknown return; } if ( arrowKeyPressed ) { stopTracking(); setDestination( *focus() ); } forceUpdate(); //need a total update, or slewing with the arrow keys doesn't work. }
void DetailsTable::createGeneralTable(SkyObject *obj) { clearContents(); QTextCursor cursor = m_Document->rootFrame()->firstCursorPosition(); //Fill in the data fields //Contents depend on type of object StarObject *s = 0; DeepSkyObject *dso = 0; KSPlanetBase *ps = 0; QString pname, oname; QString objNamesVal, objTypeVal, objDistVal, objSizeVal, objMagVal, objBvVal, objIllumVal; QString objSizeLabel, objMagLabel; switch(obj->type()) { case SkyObject::STAR: { s = (StarObject *)obj; objNamesVal = s->longname(); if(s->getHDIndex() != 0) { if(!s->longname().isEmpty()) { objNamesVal = s->longname() + QString(", HD%1").arg(QString::number(s->getHDIndex())) ; } else { objNamesVal = QString(", HD%1").arg(QString::number(s->getHDIndex())); } } objTypeVal = s->sptype() + ' ' + i18n("star"); objMagVal = i18nc("number in magnitudes", "%1 mag", KGlobal::locale()->formatNumber(s->mag(), 1)); //show to tenths place if(s->getBVIndex() < 30.0) { objBvVal = QString::number(s->getBVIndex(), 'g', 2); } //distance if(s->distance() > 2000. || s->distance() < 0.) // parallax < 0.5 mas { objDistVal = i18nc("larger than 2000 parsecs", "> 2000 pc"); } else if(s->distance() > 50.0) //show to nearest integer { objDistVal = i18nc("number in parsecs", "%1 pc", KGlobal::locale()->formatNumber(s->distance(), 0)); } else if(s->distance() > 10.0) //show to tenths place { objDistVal = i18nc("number in parsecs", "%1 pc", KGlobal::locale()->formatNumber(s->distance(), 1)); } else //show to hundredths place { objDistVal = i18nc("number in parsecs", "%1 pc", KGlobal::locale()->formatNumber(s->distance(), 2)); } //Note multiplicity/variablility in angular size label if(s->isMultiple() && s->isVariable()) { objSizeLabel = i18nc("the star is a multiple star", "multiple") + ','; objSizeVal = i18nc("the star is a variable star", "variable"); } else if(s->isMultiple()) { objSizeLabel = i18nc("the star is a multiple star", "multiple"); } else if(s->isVariable()) { objSizeLabel = i18nc("the star is a variable star", "variable"); } objIllumVal = "--"; break; //End of stars case } case SkyObject::ASTEROID: //[fall through to planets] case SkyObject::COMET: //[fall through to planets] case SkyObject::MOON: //[fall through to planets] case SkyObject::PLANET: { ps = (KSPlanetBase *)obj; objNamesVal = ps->longname(); //Type is "G5 star" for Sun if(ps->name() == "Sun") { objTypeVal = i18n("G5 star"); } else if(ps->name() == "Moon") { objTypeVal = ps->translatedName(); } else if(ps->name() == i18n("Pluto") || ps->name() == "Ceres" || ps->name() == "Eris") // TODO: Check if Ceres / Eris have translations and i18n() them { objTypeVal = i18n("Dwarf planet"); } else { objTypeVal = ps->typeName(); } //Magnitude: The moon displays illumination fraction instead if(obj->name() == "Moon") { objIllumVal = QString("%1 %").arg(KGlobal::locale()->formatNumber(((KSMoon *)obj)->illum()*100., 0)); } objMagVal = i18nc("number in magnitudes", "%1 mag", KGlobal::locale()->formatNumber(ps->mag(), 1)); //show to tenths place //Distance from Earth. The moon requires a unit conversion if(ps->name() == "Moon") { objDistVal = i18nc("distance in kilometers", "%1 km", KGlobal::locale()->formatNumber(ps->rearth() * AU_KM )); } else { objDistVal = i18nc("distance in Astronomical Units", "%1 AU", KGlobal::locale()->formatNumber(ps->rearth())); } //Angular size; moon and sun in arcmin, others in arcsec if(ps->angSize()) { if(ps->name() == "Sun" || ps->name() == "Moon") { // Needn't be a plural form because sun / moon will never contract to 1 arcminute objSizeVal = i18nc("angular size in arcminutes", "%1 arcmin", KGlobal::locale()->formatNumber(ps->angSize())); } else { objSizeVal = i18nc("angular size in arcseconds","%1 arcsec", KGlobal::locale()->formatNumber(ps->angSize() * 60.0)); } } else { objSizeVal = "--"; } break; //End of planets/comets/asteroids case } default: //Deep-sky objects { dso = (DeepSkyObject *)obj; //Show all names recorded for the object if(!dso->longname().isEmpty() && dso->longname() != dso->name()) { pname = dso->translatedLongName(); oname = dso->translatedName(); } else { pname = dso->translatedName(); } if(!dso->translatedName2().isEmpty()) { if(oname.isEmpty()) { oname = dso->translatedName2(); } else { oname += ", " + dso->translatedName2(); } } if(dso->ugc() != 0) { if(!oname.isEmpty()) { oname += ", "; } oname += "UGC " + QString::number(dso->ugc()); } if(dso->pgc() != 0) { if(!oname.isEmpty()) { oname += ", "; } oname += "PGC " + QString::number(dso->pgc()); } if(!oname.isEmpty()) { pname += ", " + oname; } objNamesVal = pname; objTypeVal = dso->typeName(); if(dso->type() == SkyObject::RADIO_SOURCE) { objMagLabel = i18nc("integrated flux at a frequency", "Flux(%1):", dso->customCatalog()->fluxFrequency()); objMagVal = i18nc("integrated flux value", "%1 %2", KGlobal::locale()->formatNumber(dso->flux(), 1), dso->customCatalog()->fluxUnit()); //show to tenths place } else if(dso->mag() > 90.0) { objMagVal = "--"; } else { objMagVal = i18nc("number in magnitudes", "%1 mag", KGlobal::locale()->formatNumber(dso->mag(), 1)); //show to tenths place } //No distances at this point... objDistVal = "--"; //Only show decimal place for small angular sizes if(dso->a() > 10.0) { objSizeVal = i18nc("angular size in arcminutes", "%1 arcmin", KGlobal::locale()->formatNumber(dso->a(), 0)); } else if(dso->a()) { objSizeVal = i18nc("angular size in arcminutes", "%1 arcmin", KGlobal::locale()->formatNumber(dso->a(), 1)); } else { objSizeVal = "--"; } break; //End of deep-space objects case } } //Common to all types: if(obj->type() == SkyObject::CONSTELLATION ) { objTypeVal = KStarsData::Instance()->skyComposite()->getConstellationBoundary()->constellationName(obj); } else { objTypeVal = i18nc("%1 type of sky object (planet, asteroid etc), %2 name of a constellation", "%1 in %2", objTypeVal, KStarsData::Instance()->skyComposite()->getConstellationBoundary()->constellationName(obj)); } QVector<QTextLength> constraints; constraints << QTextLength(QTextLength::PercentageLength, 25) << QTextLength(QTextLength::PercentageLength, 25) << QTextLength(QTextLength::PercentageLength, 25) << QTextLength(QTextLength::PercentageLength, 25); m_TableFormat.setColumnWidthConstraints(constraints); QTextTable *table = cursor.insertTable(5, 4, m_TableFormat); table->mergeCells(0, 0, 1, 4); QTextBlockFormat centered; centered.setAlignment(Qt::AlignCenter); table->cellAt(0, 0).firstCursorPosition().setBlockFormat(centered); table->cellAt(0, 0).firstCursorPosition().insertText(i18n("General"), m_TableTitleCharFormat); table->mergeCells(1, 1, 1, 3); table->cellAt(1, 0).firstCursorPosition().insertText(i18n("Names:"), m_ItemNameCharFormat); table->cellAt(1, 0).firstCursorPosition().setBlockFormat(centered); table->cellAt(1, 1).firstCursorPosition().insertText(objNamesVal, m_ItemValueCharFormat); table->cellAt(2, 0).firstCursorPosition().insertText(i18n("Type:"), m_ItemNameCharFormat); table->cellAt(2, 0).firstCursorPosition().setBlockFormat(centered); table->cellAt(2, 1).firstCursorPosition().insertText(objTypeVal, m_ItemValueCharFormat); table->cellAt(3, 0).firstCursorPosition().insertText(i18n("Distance:"), m_ItemNameCharFormat); table->cellAt(3, 0).firstCursorPosition().setBlockFormat(centered); table->cellAt(3, 1).firstCursorPosition().insertText(objDistVal, m_ItemValueCharFormat); table->cellAt(4, 0).firstCursorPosition().insertText(i18n("Size:"), m_ItemNameCharFormat); table->cellAt(4, 0).firstCursorPosition().setBlockFormat(centered); table->cellAt(4, 1).firstCursorPosition().insertText(objSizeVal, m_ItemValueCharFormat); table->cellAt(2, 2).firstCursorPosition().insertText(i18n("Magnitude:"), m_ItemNameCharFormat); table->cellAt(2, 2).firstCursorPosition().setBlockFormat(centered); table->cellAt(2, 3).firstCursorPosition().insertText(objMagVal, m_ItemValueCharFormat); table->cellAt(3, 2).firstCursorPosition().insertText(i18n("B-V index:"), m_ItemNameCharFormat); table->cellAt(3, 2).firstCursorPosition().setBlockFormat(centered); table->cellAt(3, 3).firstCursorPosition().insertText(objBvVal, m_ItemValueCharFormat); table->cellAt(4, 2).firstCursorPosition().insertText(i18n("Illumination:"), m_ItemNameCharFormat); table->cellAt(4, 2).firstCursorPosition().setBlockFormat(centered); table->cellAt(4, 3).firstCursorPosition().insertText(objIllumVal, m_ItemValueCharFormat); }
void PlanetCatalog::EquatorialToHorizontal( dms *LST, const dms *lat ) { for (KSPlanetBase * ksp = planets.first(); ksp != 0; ksp = planets.next()) { ksp->EquatorialToHorizontal( LST, lat); if ( ksp->hasTrail() ) ksp->updateTrail( LST, lat ); } }
void PlanetCatalog::findPosition( const KSNumbers *num, const dms *lat, const dms *LST ) { Earth->findPosition(num); for (KSPlanetBase * ksp = planets.first(); ksp != 0; ksp = planets.next()) { ksp->findPosition(num, lat, LST, Earth); } }