• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • skycomponents
cometscomponent.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  cometscomponent.cpp - K Desktop Planetarium
3  -------------------
4  begin : 2005/24/09
5  copyright : (C) 2005 by Jason Harris
6  email : kstars@30doradus.org
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "cometscomponent.h"
19 #include "solarsystemcomposite.h"
20 
21 #include "Options.h"
22 #include "skyobjects/kscomet.h"
23 #include "ksutils.h"
24 #include "kstarsdata.h"
25 #include "ksfilereader.h"
26 #include "skymap.h"
27 #include "skylabeler.h"
28 #include "skypainter.h"
29 #include "projections/projector.h"
30 #include <kio/job.h>
31 #include <kio/netaccess.h>
32 #include <kio/jobuidelegate.h>
33 #include <kstandarddirs.h>
34 #include <kglobal.h>
35 #include <kdebug.h>
36 #include <QFile>
37 #include <QPen>
38 
39 CometsComponent::CometsComponent( SolarSystemComposite *parent )
40  : SolarSystemListComponent( parent ) {
41  loadData();
42 }
43 
44 CometsComponent::~CometsComponent()
45 {}
46 
47 bool CometsComponent::selected() {
48  return Options::showComets();
49 }
50 
51 /*
52  * @short Initialize the comets list.
53  * Reads in the comets data from the comets.dat file.
54  *
55  * Populate the list of Comets from the data file.
56  * The data file is a CSV file with the following columns :
57  * @li 1 full name [string]
58  * @li 2 modified julian day of orbital elements [int]
59  * @li 3 perihelion distance in AU [double]
60  * @li 4 eccentricity of orbit [double]
61  * @li 5 inclination angle of orbit in degrees [double]
62  * @li 6 argument of perihelion in degrees [double]
63  * @li 7 longitude of the ascending node in degrees [double]
64  * @li 8 time of perihelion passage (YYYYMMDD.DDD) [double]
65  * @li 9 orbit solution ID [string]
66  * @li 10 Near-Earth Object (NEO) flag [bool]
67  * @li 11 comet total magnitude parameter [float]
68  * @li 12 comet nuclear magnitude parameter [float]
69  * @li 13 object diameter (from equivalent sphere) [float]
70  * @li 14 object bi/tri-axial ellipsoid dimensions [string]
71  * @li 15 geometric albedo [float]
72  * @li 16 rotation period [float]
73  * @li 17 orbital period [float]
74  * @li 18 earth minimum orbit intersection distance [double]
75  * @li 19 orbit classification [string]
76  * @li 20 comet total magnitude slope parameter
77  * @li 21 comet nuclear magnitude slope parameter
78  * @note See KSComet constructor for more details.
79  */
80 void CometsComponent::loadData() {
81  QString name, orbit_id, orbit_class, dimensions;
82  bool neo;
83  int mJD;
84  double q, e, dble_i, dble_w, dble_N, Tp, earth_moid;
85  long double JD;
86  float M1, M2, K1, K2, diameter, albedo, rot_period, period;
87 
88  emitProgressText(i18n("Loading comets"));
89  objectNames(SkyObject::COMET).clear();
90 
91  QList< QPair<QString, KSParser::DataTypes> > sequence;
92  sequence.append(qMakePair(QString("full name"), KSParser::D_QSTRING));
93  sequence.append(qMakePair(QString("epoch_mjd"), KSParser::D_INT));
94  sequence.append(qMakePair(QString("q"), KSParser::D_DOUBLE));
95  sequence.append(qMakePair(QString("e"), KSParser::D_DOUBLE));
96  sequence.append(qMakePair(QString("i"), KSParser::D_DOUBLE));
97  sequence.append(qMakePair(QString("w"), KSParser::D_DOUBLE));
98  sequence.append(qMakePair(QString("om"), KSParser::D_DOUBLE));
99  sequence.append(qMakePair(QString("tp_calc"), KSParser::D_DOUBLE));
100  sequence.append(qMakePair(QString("orbit_id"), KSParser::D_QSTRING));
101  sequence.append(qMakePair(QString("neo"), KSParser::D_QSTRING));
102  sequence.append(qMakePair(QString("M1"), KSParser::D_FLOAT));
103  sequence.append(qMakePair(QString("M2"), KSParser::D_FLOAT));
104  sequence.append(qMakePair(QString("diameter"), KSParser::D_FLOAT));
105  sequence.append(qMakePair(QString("extent"), KSParser::D_QSTRING));
106  sequence.append(qMakePair(QString("albedo"), KSParser::D_FLOAT));
107  sequence.append(qMakePair(QString("rot_period"), KSParser::D_FLOAT));
108  sequence.append(qMakePair(QString("per_y"), KSParser::D_FLOAT));
109  sequence.append(qMakePair(QString("moid"), KSParser::D_DOUBLE));
110  sequence.append(qMakePair(QString("class"), KSParser::D_QSTRING));
111  sequence.append(qMakePair(QString("H"), KSParser::D_SKIP));
112  sequence.append(qMakePair(QString("G"), KSParser::D_SKIP));
113 
114  QString file_name = KStandardDirs::locate( "appdata",
115  QString("comets.dat") );
116  KSParser cometParser(file_name, '#', sequence);
117 
118  QHash<QString, QVariant> row_content;
119  while (cometParser.HasNextRow()){
120  KSComet *com = 0;
121  row_content = cometParser.ReadNextRow();
122  name = row_content["full name"].toString();
123  name = name.trimmed();
124  mJD = row_content["epoch_mjd"].toInt();
125  q = row_content["q"].toDouble();
126  e = row_content["e"].toDouble();
127  dble_i = row_content["i"].toDouble();
128  dble_w = row_content["w"].toDouble();
129  dble_N = row_content["om"].toDouble();
130  Tp = row_content["tp_calc"].toDouble();
131  orbit_id = row_content["orbit_id"].toString();
132  neo = row_content["neo"] == "Y";
133 
134  if(row_content["M1"].toFloat()==0.0)
135  M1 = 101.0;
136  else
137  M1 = row_content["M1"].toFloat();
138 
139  if(row_content["M2"].toFloat()==0.0)
140  M2 = 101.0;
141  else
142  M2 = row_content["M2"].toFloat();
143 
144  diameter = row_content["diameter"].toFloat();
145  dimensions = row_content["extent"].toString();
146  albedo = row_content["albedo"].toFloat();
147  rot_period = row_content["rot_period"].toFloat();
148  period = row_content["per_y"].toFloat();
149  earth_moid = row_content["moid"].toDouble();
150  orbit_class = row_content["class"].toString();
151  K1 = row_content["H"].toFloat();
152  K2 = row_content["G"].toFloat();
153 
154  JD = static_cast<double>( mJD ) + 2400000.5;
155 
156  com = new KSComet( name, QString(), JD, q, e,
157  dms( dble_i ), dms( dble_w ),
158  dms( dble_N ), Tp, M1, M2,
159  K1, K2 );
160  com->setOrbitID( orbit_id );
161  com->setNEO( neo );
162  com->setDiameter( diameter );
163  com->setDimensions( dimensions );
164  com->setAlbedo( albedo );
165  com->setRotationPeriod( rot_period );
166  com->setPeriod( period );
167  com->setEarthMOID( earth_moid );
168  com->setOrbitClass( orbit_class );
169  com->setAngularSize( 0.005 );
170  m_ObjectList.append( com );
171 
172  // Add *short* name to the list of object names
173  objectNames( SkyObject::COMET ).append( com->name() );
174  }
175 }
176 
177 void CometsComponent::draw( SkyPainter *skyp )
178 {
179  if( !selected() || Options::zoomFactor() < 10*MINZOOM )
180  return;
181 
182  bool hideLabels = ! Options::showCometNames() ||
183  (SkyMap::Instance()->isSlewing() &&
184  Options::hideLabels() );
185  double rsunLabelLimit = Options::maxRadCometName();
186 
187  //FIXME: Should these be config'able?
188  skyp->setPen( QPen( QColor( "darkcyan" ) ) );
189  skyp->setBrush( QBrush( QColor( "darkcyan" ) ) );
190 
191  foreach ( SkyObject *so, m_ObjectList ) {
192  KSComet *com = (KSComet*)so;
193  bool drawn = skyp->drawPointSource(com,com->getTotalMagnitudeParameter());
194  if ( drawn && !(hideLabels || com->rsun() >= rsunLabelLimit) )
195  SkyLabeler::AddLabel( com, SkyLabeler::COMET_LABEL );
196  }
197 }
198 
199 void CometsComponent::updateDataFile()
200 {
201  KUrl url = KUrl( "http://ssd.jpl.nasa.gov/sbdb_query.cgi" );
202  QByteArray post_data = QByteArray( "obj_group=all&obj_kind=com&obj_numbere"
203  "d=all&OBJ_field=0&OBJ_op=0&OBJ_value=&ORB_field=0&ORB_op=0&ORB_value=&com"
204  "bine_mode=AND&c1_group=OBJ&c1_item=Af&c1_op=!%3D&c1_value=D&c2_group=OBJ&"
205  "c2_item=Ae&c2_op=!%3D&c2_value=SOHO&c_fields=AcBdBiBgBjBlBkBqBbAgAkAlApAq"
206  "ArAsBsBtChAmAn&table_format=CSV&max_rows=10&format_option=full&query=Gene"
207  "rate%20Table&.cgifields=format_option&.cgifields=field_list&.cgifields=ob"
208  "j_kind&.cgifields=obj_group&.cgifields=obj_numbered&.cgifields=combine_mo"
209  "de&.cgifields=ast_orbit_class&.cgifields=table_format&.cgifields=ORB_fiel"
210  "d_set&.cgifields=OBJ_field_set&.cgifields=preset_field_set&.cgifields=com"
211  "_orbit_class" );
212  QString content_type = "Content-Type: application/x-www-form-urlencoded";
213 
214  // Download file
215  KIO::StoredTransferJob* get_job = KIO::storedHttpPost( post_data, url );
216  get_job->addMetaData("content-type", content_type );
217 
218  if( KIO::NetAccess::synchronousRun( get_job, 0 ) ) {
219  // Comment the first line
220  QByteArray data = get_job->data();
221  data.insert( 0, '#' );
222 
223  // Write data to comets.dat
224  QFile file( KStandardDirs::locateLocal( "appdata", "comets.dat" ) );
225  file.open( QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text );
226  file.write( data );
227  file.close();
228 
229  // Reload comets
230  loadData();
231 
232  KStars::Instance()->data()->setFullTimeUpdate();
233  } else {
234  get_job->ui()->showErrorMessage();
235  }
236 }
SkyPainter::drawPointSource
virtual bool drawPointSource(SkyPoint *loc, float mag, char sp= 'A')=0
Draw a point source (e.g., a star).
KSComet::setDiameter
void setDiameter(float diam)
Sets the comet's diameter.
Definition: kscomet.cpp:280
SkyPainter::setBrush
virtual void setBrush(const QBrush &brush)=0
Set the brush of the painter.
KSParser
Generic class for text file parsers used in KStars.
Definition: ksparser.h:49
Options::showComets
static bool showComets()
Get Draw comets in the sky map?
Definition: Options.h:1398
ListComponent::m_ObjectList
QList< SkyObject * > m_ObjectList
Definition: listcomponent.h:64
KStars::Instance
static KStars * Instance()
Definition: kstars.h:125
skypainter.h
KSParser::D_DOUBLE
Definition: ksparser.h:71
KSComet::setPeriod
void setPeriod(float per)
Sets the comet's period.
Definition: kscomet.cpp:305
KStarsData::setFullTimeUpdate
void setFullTimeUpdate()
The Sky is updated more frequently than the moon, which is updated more frequently than the planets...
Definition: kstarsdata.cpp:260
SkyObject::COMET
Definition: skyobject.h:110
Options::hideLabels
static bool hideLabels()
Get Hide object name labels while moving?
Definition: Options.h:1341
KSComet::setEarthMOID
void setEarthMOID(double earth_moid)
Sets the comet's earth minimum orbit intersection distance.
Definition: kscomet.cpp:270
solarsystemcomposite.h
SkyLabeler::COMET_LABEL
Definition: skylabeler.h:122
KSComet::setRotationPeriod
void setRotationPeriod(float rot_per)
Sets the comet's rotation period.
Definition: kscomet.cpp:310
KSComet::setOrbitClass
void setOrbitClass(QString orbit_class)
Sets the comet's orbit class.
Definition: kscomet.cpp:295
SolarSystemListComponent
Definition: solarsystemlistcomponent.h:32
Options::maxRadCometName
static double maxRadCometName()
Get Maximum distance from Sun for labeling comets, in AU.
Definition: Options.h:2721
KSParser::D_FLOAT
Definition: ksparser.h:70
MINZOOM
#define MINZOOM
Definition: kstarsdata.h:38
KSComet
A subclass of KSPlanetBase that implements comets.
Definition: kscomet.h:50
SkyMap::isSlewing
bool isSlewing() const
Definition: skymap.cpp:1133
skymap.h
KSPlanetBase::rsun
double rsun() const
Definition: ksplanetbase.h:126
KSComet::setOrbitID
void setOrbitID(QString orbit_id)
Sets the comet's orbit solution ID.
Definition: kscomet.cpp:300
KSComet::getTotalMagnitudeParameter
float getTotalMagnitudeParameter()
Definition: kscomet.h:98
dms
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:42
KSParser::D_INT
Definition: ksparser.h:69
CometsComponent::~CometsComponent
virtual ~CometsComponent()
Definition: cometscomponent.cpp:44
SkyPainter::setPen
virtual void setPen(const QPen &pen)=0
Set the pen of the painter.
Options.h
CometsComponent::draw
virtual void draw(SkyPainter *skyp)
Draw the object on the SkyMap skyp a pointer to the SkyPainter to use.
Definition: cometscomponent.cpp:177
ksfilereader.h
kscomet.h
KSComet::setDimensions
void setDimensions(QString dim)
Sets the comet's dimensions.
Definition: kscomet.cpp:285
CometsComponent::updateDataFile
void updateDataFile()
Definition: cometscomponent.cpp:199
Options::zoomFactor
static double zoomFactor()
Get Zoom Factor, in pixels per radian.
Definition: Options.h:2531
cometscomponent.h
KSComet::setAlbedo
void setAlbedo(float albedo)
Sets the comet's albedo.
Definition: kscomet.cpp:275
projector.h
SkyMap::Instance
static SkyMap * Instance()
Definition: skymap.cpp:141
KStars::data
KStarsData * data() const
Definition: kstars.h:131
SkyComponent::emitProgressText
virtual void emitProgressText(const QString &message)
Emit signal about progress.
Definition: skycomponent.cpp:35
kstarsdata.h
skylabeler.h
KSPlanetBase::setAngularSize
void setAngularSize(double size)
set the planet's angular size, in km.
Definition: ksplanetbase.h:176
SkyObject::name
virtual QString name(void) const
Definition: skyobject.h:124
SkyComponent::objectNames
QHash< int, QStringList > & objectNames()
Definition: skycomponent.h:127
ksutils.h
SkyObject
Provides all necessary information about an object in the sky: its coordinates, name(s), type, magnitude, and QStringLists of URLs for images and webpages regarding the object.
Definition: skyobject.h:46
KSParser::D_SKIP
Definition: ksparser.h:72
SkyPainter
Draws things on the sky, without regard to backend.
Definition: skypainter.h:47
KSParser::D_QSTRING
Definition: ksparser.h:68
Options::showCometNames
static bool showCometNames()
Get Label comet names in the sky map?
Definition: Options.h:1417
SolarSystemComposite
The solar system composite manages all planets, asteroids and comets.
Definition: solarsystemcomposite.h:41
CometsComponent::selected
virtual bool selected()
Definition: cometscomponent.cpp:47
SkyLabeler::AddLabel
static void AddLabel(SkyObject *obj, label_t type)
static version of addLabel() below.
Definition: skylabeler.h:149
QList
CometsComponent::CometsComponent
CometsComponent(SolarSystemComposite *parent)
Default constructor.
Definition: cometscomponent.cpp:39
KSComet::setNEO
void setNEO(bool neo)
Sets if the comet is a near earth object.
Definition: kscomet.cpp:290
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal