File indexing completed on 2024-05-19 11:32:04
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2012 Rene Kuettner <rene@bitkanal.net> 0004 // 0005 0006 0007 #include "SatellitesMSCItem.h" 0008 0009 #include <QFile> 0010 #include <QColor> 0011 0012 #include "MarbleClock.h" 0013 #include "MarbleDebug.h" 0014 #include "MarbleGlobal.h" 0015 #include "GeoPainter.h" 0016 #include "GeoDataCoordinates.h" 0017 #include "GeoDataPlacemark.h" 0018 #include "GeoDataStyle.h" 0019 #include "GeoDataTrack.h" 0020 #include "GeoDataPoint.h" 0021 0022 namespace Marble { 0023 0024 SatellitesMSCItem::SatellitesMSCItem( const QString &name, 0025 const QString &category, 0026 const QString &relatedBody, 0027 const QString &catalog, 0028 const QDateTime &missionStart, 0029 const QDateTime &missionEnd, 0030 int catalogIndex, 0031 PlanetarySats *planSat, 0032 const MarbleClock *clock ) 0033 : TrackerPluginItem( name ), 0034 m_track( new GeoDataTrack() ), 0035 m_clock( clock ), 0036 m_planSat( planSat ), 0037 m_category( category ), 0038 m_relatedBody( relatedBody ), 0039 m_catalog( catalog ), 0040 m_catalogIndex( catalogIndex ), 0041 m_missionStart( missionStart ), 0042 m_missionEnd( missionEnd ) 0043 { 0044 placemark()->setVisualCategory(GeoDataPlacemark::Satellite); 0045 placemark()->setZoomLevel( 0 ); 0046 placemark()->setGeometry( m_track ); 0047 0048 m_planSat->getKeplerElements( 0049 m_perc, m_apoc, m_inc, m_ecc, m_ra, m_tano, m_m0, m_a, m_n0 ); 0050 0051 m_period = 86400. / m_n0; 0052 m_step_secs = m_period / 500; 0053 0054 setDescription(); 0055 update(); 0056 } 0057 0058 SatellitesMSCItem::~SatellitesMSCItem() 0059 { 0060 delete m_planSat; 0061 } 0062 0063 QString SatellitesMSCItem::category() const 0064 { 0065 return m_category; 0066 } 0067 0068 QString SatellitesMSCItem::relatedBody() const 0069 { 0070 return m_relatedBody; 0071 } 0072 0073 QString SatellitesMSCItem::catalog() const 0074 { 0075 return m_catalog; 0076 } 0077 0078 int SatellitesMSCItem::catalogIndex() const 0079 { 0080 return m_catalogIndex; 0081 } 0082 0083 QString SatellitesMSCItem::id() const 0084 { 0085 return QString( "%1:%2" ).arg( catalog() ).arg( catalogIndex() ); 0086 } 0087 0088 const QDateTime& SatellitesMSCItem::missionStart() const 0089 { 0090 return m_missionStart; 0091 } 0092 0093 const QDateTime& SatellitesMSCItem::missionEnd() const 0094 { 0095 return m_missionEnd; 0096 } 0097 0098 void SatellitesMSCItem::setDescription() 0099 { 0100 /*QString description = 0101 QObject::tr( "Object name: %1 <br />" 0102 "Category: %2 <br />" 0103 "Pericentre: %3 km<br />" 0104 "Apocentre: %4 km<br />" 0105 "Inclination: %5 Degree<br />" 0106 "Revolutions per day (24h): %6" ) 0107 .arg( name(), category(), QString::number( m_perc, 'f', 2 ), 0108 QString::number( m_apoc, 'f', 2 ), 0109 QString::number( m_inc, 'f', 2 ), 0110 QString::number( m_n0, 'f', 2 ) );*/ 0111 0112 QFile templateFile(QStringLiteral(":/marble/satellites/satellite.html")); 0113 if (!templateFile.open(QIODevice::ReadOnly)) { 0114 placemark()->setDescription(QObject::tr("No info available.")); 0115 return; 0116 } 0117 QString html = templateFile.readAll(); 0118 0119 html.replace("%name%", name()); 0120 html.replace("%noradId%", QString::number(catalogIndex())); 0121 html.replace("%perigee%", QString::number(m_perc, 'f', 2)); 0122 html.replace("%apogee%", QString::number(m_apoc, 'f', 2)); 0123 html.replace("%inclination%", QString::number(m_inc, 'f', 2)); 0124 html.replace("%period%", "?"); 0125 html.replace("%semiMajorAxis%", "?"); 0126 0127 placemark()->setDescription( html ); 0128 } 0129 0130 void SatellitesMSCItem::update() 0131 { 0132 if( m_missionStart.isValid() ) { 0133 setVisible( ( m_clock->dateTime() > m_missionStart ) ); 0134 } 0135 0136 if( m_missionEnd.isValid() ) { 0137 setVisible( ( m_clock->dateTime() < m_missionEnd ) ); 0138 } 0139 0140 if( !isEnabled() || !isVisible() ) { 0141 return; 0142 } 0143 0144 QDateTime t = m_clock->dateTime(); 0145 QDateTime endTime = t; 0146 if( isTrackVisible() ) { 0147 t = t.addSecs( - m_period / 2. ); 0148 endTime = t.addSecs( m_period ); 0149 0150 m_track->removeBefore( t ); 0151 m_track->removeAfter( endTime ); 0152 0153 if( m_track->firstWhen().isValid() && m_track->firstWhen() < t) { 0154 t = m_track->firstWhen().addSecs( m_step_secs ); 0155 } 0156 0157 for(; t < endTime; t = t.addSecs(m_step_secs)) { 0158 addTrackPointAt( t ); 0159 } 0160 } else { 0161 m_track->clear(); 0162 } 0163 0164 addTrackPointAt( m_clock->dateTime() ); 0165 } 0166 0167 void SatellitesMSCItem::addTrackPointAt( const QDateTime &dateTime ) 0168 { 0169 double lng = 0.; 0170 double lat = 0.; 0171 double height = 0.; 0172 0173 QDateTime dt = dateTime.toUTC(); 0174 QDate date = dt.date(); 0175 QTime time = dt.time(); 0176 0177 m_planSat->setMJD( date.year(), date.month(), date.day(), 0178 time.hour(), time.minute(), time.second() ); 0179 m_planSat->currentPos(); 0180 m_planSat->getPlanetographic( lng, lat, height ); 0181 0182 m_track->addPoint( dateTime, 0183 GeoDataCoordinates( lng, lat, height * 1000, 0184 GeoDataCoordinates::Degree) ); 0185 } 0186 0187 } // namespace Marble