• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Stellarium / stellarium / 15291801018

28 May 2025 04:52AM UTC coverage: 11.931% (-0.02%) from 11.951%
15291801018

push

github

alex-w
Added new set of navigational stars (XIX century)

0 of 6 new or added lines in 2 files covered. (0.0%)

14124 existing lines in 74 files now uncovered.

14635 of 122664 relevant lines covered (11.93%)

18291.42 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/core/modules/StarWrapper.cpp
1
/*
2
 * The big star catalogue extension to Stellarium:
3
 * Author and Copyright: Johannes Gajdosik, 2006, 2007
4
 * The implementation of most functions in this file
5
 * (getInfoString,getShortInfoString,...) is taken from
6
 * Stellarium, Copyright (C) 2002 Fabien Chereau,
7
 * and therefore the copyright of these belongs to Fabien Chereau.
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA  02110-1335, USA.
22
 */
23

24
#include "StarWrapper.hpp"
25
#include "ZoneArray.hpp"
26

27
#include "StelUtils.hpp"
28
#include "StelTranslator.hpp"
29
#include "StarMgr.hpp"
30

31
#include <QTextStream>
32
#include <limits>
33

34
template<typename T> inline bool isNan(T value)
35
{
36
        return value != value; // lgtm [cpp/comparison-of-identical-expressions]
37
}
38

39
template<typename T> inline bool isInf(T value)
40
{
41
        return std::numeric_limits<T>::has_infinity && value == std::numeric_limits<T>::infinity();
42
}
43

44
QString StarWrapperBase::getInfoString(const StelCore *core, const InfoStringGroup& flags) const
×
45
{
46
        QString str;
×
47
        QTextStream oss(&str);
×
48

49
        if (flags&ObjectType)
×
50
                oss << QString("%1: <b>%2</b>").arg(q_("Type"), getObjectTypeI18n()) << "<br />";
×
51

52
        oss << getMagnitudeInfoString(core, flags, 2);
×
53

54
        if (flags&Extra)
×
55
                oss << QString("%1: <b>%2</b>").arg(q_("Color Index (B-V)"), QString::number(getBV(), 'f', 2)) << "<br />";
×
56
        
57
        oss << getCommonInfoString(core, flags);
×
58
        oss << getSolarLunarInfoString(core, flags);
×
59

60
        StelObject::postProcessInfoString(str, flags);
×
61

62
        return str;
×
63
}
×
64

65
QString StarWrapper1::getEnglishName(void) const
×
66
{
67
        if (s->getHip())
×
68
                return QString("HIP %1").arg(s->getHip());
×
69
        else
70
                return QString("Gaia DR3 %1").arg(s->getGaia());
×
71
}
72

73
QString StarWrapper1::getID(void) const
×
74
{
75
        QString hip;
×
76
        if (s->getHip())
×
77
        {
78
                if (s->hasComponentID())
×
79
                        hip = QString("HIP %1 %2").arg(s->getHip()).arg(StarMgr::convertToComponentIds(s->getComponentIds()));
×
80
                else
81
                        hip = QString("HIP %1").arg(s->getHip());
×
82
        }
83
        else
84
        {
85
                hip = QString("Gaia DR3 %1").arg(s->getGaia());
×
86
        }
87

88
        return hip;
×
89
}
×
90

91
QString StarWrapper1::getObjectType() const
×
92
{
93
        StarId star_id = s->getHip() ?  s->getHip() : s->getGaia();
×
94

95
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
96
        const int wdsObs = StarMgr::getWdsLastObservation(star_id);
×
97
        QString startype = (s->getComponentIds() || wdsObs>0) ? N_("double star") : N_("star");
×
98
        if(!varType.isEmpty())
×
99
        {
100
                QString varstartype = "";
×
101
                // see also http://www.sai.msu.su/gcvs/gcvs/vartype.htm
102
                if (QString("BE FU GCAS I IA IB IN INA INB INT IT IN(YY) IS ISA ISB RCB RS SDOR UV UVN WR").contains(varType))
×
103
                        varstartype = N_("eruptive variable star");
×
104
                else if (QString("ACYG BCEP BCEPS BLBOO CEP CEP(B) CW CWA CWB DCEP DCEPS DSCT DSCTC GDOR L LB LC LPB M PVTEL RPHS RR RR(B) RRAB RRC RV RVA RVB SR SRA SRB SRC SRD SXPHE ZZ ZZA ZZB ZZO").contains(varType))
×
105
                        varstartype = N_("pulsating variable star");
×
106
                else if (QString("ACV, ACVO, BY, ELL, FKCOM, PSR, SXARI").contains(varType))
×
107
                        varstartype = N_("rotating variable star");
×
108
                else if (QString("N NA NB NC NL NR SN SNI SNII UG UGSS UGSU UGZ ZAND").contains(varType))
×
109
                        varstartype = N_("cataclysmic variable star");
×
110
                else if (QString("E EA EB EP EW GS PN RS WD WR AR D DM DS DW K KE KW SD E: E:/WR E/D E+LPB: EA/D EA/D+BY EA/RS EA/SD EA/SD: EA/GS EA/GS+SRC EA/DM EA/WR EA+LPB EA+LPB: EA+DSCT EA+BCEP: EA+ZAND EA+ACYG EA+SRD EB/GS EB/DM EB/KE EB/KE: EW/KE EA/AR/RS EA/GS/D EA/D/WR").contains(varType))
×
111
                        varstartype = N_("eclipsing binary system");
×
112
                else
113
                // XXX intense variable X-ray sources "AM, X, XB, XF, XI, XJ, XND, XNG, XP, XPR, XPRM, XM)"
114
                // XXX other symbols "BLLAC, CST, GAL, L:, QSO, S,"
115
                        varstartype = N_("variable star");
×
116

117
                QString vtt = varstartype;
×
118
                if (s->getComponentIds() || wdsObs>0)
×
119
                        vtt = QString("%1, %2").arg(startype, varstartype);
×
120
                return vtt;
×
121
        }
×
122
        else
123
                return startype;
×
124
}
×
125

126
QString StarWrapper1::getObjectTypeI18n() const
×
127
{
128
        QString stypefinal, stype = getObjectType();
×
129
        StarId star_id = s->getHip() ?  s->getHip() : s->getGaia();
×
130

131
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
132
        if (!varType.isEmpty())
×
133
        {
134
                if (stype.contains(","))
×
135
                {
136
                        const QStringList stypes = stype.split(",");
×
137
                        QStringList stypesI18n;
×
138
                        for (const auto &st: stypes) { stypesI18n << q_(st.trimmed()); }
×
139
                        stypefinal = stypesI18n.join(", ");
×
UNCOV
140
                }
×
141
                else
UNCOV
142
                        stypefinal = q_(stype);
×
143
        }
144
        else
UNCOV
145
                stypefinal = q_(stype);
×
146

147
        return stypefinal;
×
UNCOV
148
}
×
149

UNCOV
150
QString StarWrapper1::getInfoString(const StelCore *core, const InfoStringGroup& flags) const
×
151
{
152
        QString str;
×
UNCOV
153
        QTextStream oss(&str);
×
154
        double az_app, alt_app;
UNCOV
155
        StelUtils::rectToSphe(&az_app,&alt_app,getAltAzPosApparent(core));
×
156
        Q_UNUSED(az_app)
157

UNCOV
158
        StarId star_id = s->getHip() ?  s->getHip() : s->getGaia();
×
159

160
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
161
        const QString objType = StarMgr::convertToOjectTypes(s->getObjType());
×
162
        const int wdsObs = StarMgr::getWdsLastObservation(star_id);
×
163
        const float wdsPA = StarMgr::getWdsLastPositionAngle(star_id);
×
164
        const float wdsSep = StarMgr::getWdsLastSeparation(star_id);
×
165
        const float maxVMag = StarMgr::getGcvsMaxMagnitude(star_id);
×
166
        const float magFlag = StarMgr::getGcvsMagnitudeFlag(star_id);
×
167
        const float minVMag = StarMgr::getGcvsMinMagnitude(star_id);
×
168
        const float min2VMag = StarMgr::getGcvsMinMagnitude(star_id, false);
×
169
        const QString photoVSys = StarMgr::getGcvsPhotometricSystem(star_id);
×
170
        const double vEpoch = StarMgr::getGcvsEpoch(star_id);
×
171
        const double vPeriod = StarMgr::getGcvsPeriod(star_id);
×
UNCOV
172
        const int vMm = StarMgr::getGcvsMM(star_id);
×
173

174
        if ((flags&Name) || (flags&CatalogNumber))
×
UNCOV
175
                oss << "<h2>";
×
176

177
        const QString commonNameI18 = StarMgr::getCommonNameI18n(star_id);
×
178
        const QString culturalInfoName=StarMgr::getCulturalInfoLabel(star_id);
×
179
        const QString sciName = StarMgr::getSciDesignation(star_id);
×
180
        const QString sciExtraName = StarMgr::getSciExtraDesignation(star_id);
×
181
        const QString varSciName = StarMgr::getGcvsDesignation(star_id);
×
182
        const QString wdsSciName = StarMgr::getWdsDesignation(star_id);
×
183
        QStringList designations;
×
184
        if (!sciName.isEmpty())
×
185
                designations.append(sciName);
×
186
        if (!sciExtraName.isEmpty())
×
187
                designations.append(sciExtraName);
×
188
        if (!varSciName.isEmpty() && !sciName.contains(varSciName, Qt::CaseInsensitive))
×
UNCOV
189
                designations.append(varSciName);
×
190

191
        QString hip, hipq;
×
UNCOV
192
        if (s->getHip())
×
193
        {
UNCOV
194
                if (s->hasComponentID())
×
195
                {
196
                        hip = QString("HIP %1 %2").arg(s->getHip()).arg(StarMgr::convertToComponentIds(s->getComponentIds()));
×
UNCOV
197
                        hipq = QString("%1%2").arg(s->getHip()).arg(StarMgr::convertToComponentIds(s->getComponentIds()));
×
198
                }
199
                else
200
                {
201
                        hip = QString("HIP %1").arg(s->getHip());
×
UNCOV
202
                        hipq = QString::number(s->getHip());
×
203
                }
UNCOV
204
                designations.append(hip);
×
205
        }
206
        else
UNCOV
207
                hipq = QString::number(s->getGaia());  // need to look up with Gaia number
×
208

209
        const QString crossIndexData = StarMgr::getCrossIdentificationDesignations(hipq);
×
210
        if (!crossIndexData.isEmpty())
×
UNCOV
211
                designations.append(crossIndexData);
×
212

213
        if (s->getGaia())
×
UNCOV
214
                designations.append(QString("Gaia DR3 %1").arg(s->getGaia()));
×
215

216
        if (!wdsSciName.isEmpty() && !sciName.contains(wdsSciName, Qt::CaseInsensitive))
×
UNCOV
217
                designations.append(wdsSciName);
×
218

219
        QString designationsList = designations.join(" - ");
×
220
        designations.clear();
×
221
        designations = designationsList.split(" - ");
×
222
        designations.removeDuplicates();
×
223
        int asize = designations.size();
×
UNCOV
224
        if (asize>6) // Special case for many designations (max - 7 items per line); NOTE: Should we add size to the config data for skyculture?
×
225
        {
226
                designationsList = "";
×
UNCOV
227
                for(int i=0; i<asize; i++)
×
228
                {
229
                        designationsList.append(designations.at(i));
×
230
                        if (i<asize-1)
×
UNCOV
231
                                designationsList.append(" - ");
×
232

233
                        if (i>0 && (i % 6)==0 && i<(asize-1))
×
UNCOV
234
                                designationsList.append("<br />");
×
235
                }
236
        }
237
        else
UNCOV
238
                designationsList = designations.join(" - ");
×
239

UNCOV
240
        if (flags&Name)
×
241
        {
242
                QString allNames = culturalInfoName;
×
243

244
                // TODO: Finalize appearance of cultural Names
245
                if (culturalInfoName.isEmpty())
×
UNCOV
246
                        allNames = commonNameI18;
×
247

248
                if (!allNames.isEmpty())
×
UNCOV
249
                        oss << StelUtils::wrapText(allNames, 80);
×
250

251
                if (!allNames.isEmpty() && !designationsList.isEmpty() && flags&CatalogNumber)
×
UNCOV
252
                        oss << "<br />";
×
253
        }
×
254

UNCOV
255
        if (flags&CatalogNumber)
×
256
                oss << designationsList;
×
257

258
        if ((flags&Name) || (flags&CatalogNumber))
×
UNCOV
259
                oss << "</h2>";
×
260

261
        if (flags&Name)
×
262
        {
263
                QStringList extraNames=getExtraInfoStrings(Name);
×
264
                if (!extraNames.isEmpty())
×
UNCOV
265
                        oss << q_("Additional names: ") << extraNames.join(", ") << "<br/>";
×
266
        }
×
UNCOV
267
        if (flags&CatalogNumber)
×
268
        {
269
                QStringList extraCat=getExtraInfoStrings(CatalogNumber);
×
270
                if (!extraCat.isEmpty())
×
271
                        oss << q_("Additional catalog numbers: ") << extraCat.join(", ") << "<br/>";
×
272
        }
×
273

274
        QString stype = getObjectType();
×
275
        QString objectTypeI18nStr = getObjectTypeI18n();
×
276
        bool ebsFlag = stype.contains("eclipsing binary system");
×
277
        if (flags&ObjectType)
×
278
        {
279
                QStringList stypes;
×
280
                if (!objType.isEmpty())
×
281
                        stypes.append(objType);
×
282
                if (!varType.isEmpty())
×
UNCOV
283
                        stypes.append(varType);
×
284
                if (stypes.size()>0)
×
285
                        oss << QString("%1: <b>%2</b> (%3)").arg(q_("Type"), objectTypeI18nStr, stypes.join(", ")) << "<br />";
×
286
                else
287
                        oss << QString("%1: <b>%2</b>").arg(q_("Type"), objectTypeI18nStr) << "<br />";
×
288

289
                oss << getExtraInfoStrings(flags&ObjectType).join("");
×
290
        }
×
291

292
        double RA, DEC, pmra, pmdec, Plx, RadialVel;
UNCOV
293
        double PlxErr = s->getPlxErr();
×
294
        float dyrs = static_cast<float>(core->getJDE()-STAR_CATALOG_JDEPOCH)/365.25;
×
295
        s->getFull6DSolution(RA, DEC, Plx, pmra, pmdec, RadialVel, dyrs);
×
UNCOV
296
        Vec3d v;
×
UNCOV
297
        double binary_sep = 0.0, binary_pa = 0.0;  // binary star separation and position angle
×
298
        s->getBinaryOrbit(core->getJDE(), v, RA, DEC, Plx, pmra, pmdec, RadialVel, binary_sep, binary_pa);
×
299
        binary_pa *= M_180_PIf;
×
300

301
        float magOffset = 0.f;
×
302
        if (Plx && s->getPlx())
×
303
        {
304
                magOffset = 5.f * log10(s->getPlx()/Plx);
×
305
        } 
306
        oss << getMagnitudeInfoString(core, flags, 2, magOffset);
×
307

308
        // should use Plx from getPlx because Plx can change with time, but not absolute magnitude
309
        if ((flags&AbsoluteMagnitude) && s->getPlx())
×
UNCOV
310
                oss << QString("%1: %2").arg(q_("Absolute Magnitude")).arg(getVMagnitude(core)+5.*(1.+std::log10(0.001*s->getPlx())), 0, 'f', 2) << "<br />";
×
311
        if (flags&AbsoluteMagnitude)
×
UNCOV
312
                oss << getExtraInfoStrings(AbsoluteMagnitude).join("");
×
313

314
        if (flags&Extra)
×
315
        {
316
                oss << QString("%1: <b>%2</b>").arg(q_("Color Index (B-V)"), QString::number(s->getBV(), 'f', 2)) << "<br />";
×
317

UNCOV
318
                if (!varType.isEmpty())
×
319
                {
UNCOV
320
                        float minimumM1 = minVMag;
×
321
                        float minimumM2 = min2VMag;
×
UNCOV
322
                        if (magFlag==1.f) // Amplitude
×
323
                        {
UNCOV
324
                                minimumM1 += maxVMag;
×
325
                                minimumM2 += maxVMag;
×
326
                        }
327

UNCOV
328
                        if (maxVMag!=99.f) // seems it is not eruptive variable star
×
329
                        {
330
                                QString minStr = QString::number(minimumM1, 'f', 2);
×
UNCOV
331
                                if (min2VMag<99.f)
×
UNCOV
332
                                        minStr = QString("%1/%2").arg(QString::number(minimumM1, 'f', 2), QString::number(minimumM2, 'f', 2));
×
333

UNCOV
334
                                oss << QString("%1: <b>%2</b>%3<b>%4</b> (%5: %6)").arg(q_("Magnitude range"), QString::number(maxVMag, 'f', 2), QChar(0x00F7), minStr, q_("Photometric system"), photoVSys) << "<br />";
×
335
                        }
×
336
                }
337
        }
338

339
        oss << getCommonInfoString(core, flags);
×
340

341
        // kinda impossible for both parallax and parallax_err to be exactly 0, so they must just be missing
UNCOV
342
        if (flags&Distance)
×
343
        {
344
                // do parallax SNR cut because we are calculating distance, inverse parallax is bad for >20% uncertainty
UNCOV
345
                if ((Plx!=0) && (PlxErr!=0) && (Plx/PlxErr>5))
×
346
                {
347
                        //TRANSLATORS: Unit of measure for distance - Light Years
UNCOV
348
                        QString ly = qc_("ly", "distance");
×
UNCOV
349
                        double distance = PARSEC_LY * 1000. / Plx;
×
350
                        oss << QString("%1: %2%3%4 %5").arg(q_("Distance"), QString::number(distance, 'f', 2), QChar(0x00B1), QString::number(distance * PlxErr / Plx, 'f', 2), ly) << "<br />";
×
UNCOV
351
                }
×
UNCOV
352
                oss << getExtraInfoStrings(Distance).join("");
×
353
        }
354

355
        // kinda impossible for both pm to be exactly 0, so they must just be missing
356
        if ((flags&ProperMotion) && (pmra || pmdec))
×
357
        {
UNCOV
358
                float pa = std::atan2(pmra, pmdec)*M_180_PIf;
×
UNCOV
359
                if (pa<0)
×
UNCOV
360
                        pa += 360.f;
×
361
                oss << QString("%1: %2 %3 %4 %5°").arg(q_("Proper motion"),
×
UNCOV
362
                                                        QString::number(std::sqrt(pmra * pmra + pmdec * pmdec), 'f', 2),
×
363
                                                        qc_("mas/yr", "milliarc second per year"),
×
364
                                                        qc_("towards", "into the direction of"),
×
365
                                                        QString::number(pa, 'f', 1)) << "<br />";
×
366
                oss << QString("%1: %2 %3 (%4)").arg(q_("Proper motions by axes"),
×
367
                                                        QString::number(pmra, 'f', 2),
×
368
                                                        QString::number(pmdec, 'f', 2),
×
369
                                                        qc_("mas/yr", "milliarc second per year")) << "<br />";
×
370
        }
371

372
        if (flags&Velocity)
×
373
        {
374
                if (RadialVel)
×
375
                {
376
                        // TRANSLATORS: Unit of measure for speed - kilometers per second
377
                        QString kms = qc_("km/s", "speed");
×
UNCOV
378
                        oss << QString("%1: %2 %3").arg(q_("Radial velocity"), QString::number(RadialVel, 'f', 1), kms) << "<br />";
×
379
                }
×
380
        }
381

382
        if (flags&Extra)
×
383
        {
384
                if (Plx!=0)
×
385
                {
UNCOV
386
                        QString plx = q_("Parallax");
×
387
                        if (PlxErr>0.f)
×
UNCOV
388
                                oss <<  QString("%1: %2%3%4 ").arg(plx, QString::number(Plx, 'f', 3), QChar(0x00B1), QString::number(PlxErr, 'f', 3));
×
389
                        else
UNCOV
390
                                oss << QString("%1: %2 ").arg(plx, QString::number(Plx, 'f', 3));
×
391
                        oss  << qc_("mas", "parallax") << "<br />";
×
392
                }
×
393

UNCOV
394
                if (s->getSpInt())
×
395
                        oss << QString("%1: %2").arg(q_("Spectral Type"), StarMgr::convertToSpectralType(s->getSpInt())) << "<br />";
×
396

397
                if (vPeriod>0.)
×
UNCOV
398
                        oss << QString("%1: %2 %3").arg(q_("Period")).arg(vPeriod).arg(qc_("days", "duration")) << "<br />";
×
399

400
                if (vEpoch>0. && vPeriod>0.)
×
401
                {
402
                        // Calculate next minimum or maximum light
403
                        double vsEpoch = 2400000+vEpoch;
×
UNCOV
404
                        double npDate = vsEpoch + vPeriod * ::floor(1.0 + (core->getJD() - vsEpoch)/vPeriod);
×
405
                        QString nextDate = StelUtils::julianDayToISO8601String(npDate).replace("T", " ");
×
UNCOV
406
                        QString dateStr = q_("Next maximum light");
×
UNCOV
407
                        if (ebsFlag)
×
408
                                dateStr = q_("Next minimum light");
×
409

410
                        oss << QString("%1: %2 UTC").arg(dateStr, nextDate) << "<br />";
×
411
                }
×
412

413
                if (vMm>0)
×
414
                {
415
                        QString mmStr = q_("Rising time");
×
416
                        if (ebsFlag)
×
UNCOV
417
                                mmStr = q_("Duration of eclipse");
×
418

UNCOV
419
                        float daysFraction = vPeriod * vMm / 100.f;
×
420
                        auto dms = StelUtils::daysFloatToDHMS(daysFraction);
×
421
                        oss << QString("%1: %2% (%3)").arg(mmStr).arg(vMm).arg(dms) << "<br />";
×
422
                }
×
423

424
                if ((wdsObs>0) || (binary_sep>0.f))  // either have a WDS observation or a separation modelled by the binary orbit
×
425
                {
426
                        // use separation and position angle from the binary orbit if available
427
                        oss << QString("%1 (%3): %2°").arg(q_("Position angle"),
×
UNCOV
428
                                                        QString::number((binary_sep>0.f) ? binary_pa: wdsPA, 'f', 2),
×
429
                                                        (binary_sep>0.f) ? qc_("on date", "coordinates for current epoch"): QString::number(wdsObs)) << "<br />";
×
UNCOV
430
                        if (wdsSep>0.f && wdsSep<999.f) // A spectroscopic binary or not?
×
431
                        {
432
                                if (wdsSep>60.f) // A wide binary star?
×
433
                                        oss << QString("%1 (%4): %2\" (%3)").arg(
×
434
                                                                            q_("Separation"),
×
435
                                                                            QString::number((binary_sep>0.f) ? binary_sep: wdsSep, 'f', 3),
×
UNCOV
436
                                                                            StelUtils::decDegToDmsStr(((binary_sep>0.f) ? binary_sep: wdsSep)/3600.f),
×
437
                                                                            (binary_sep>0.f) ? qc_("on date", "coordinates for current epoch"): QString::number(wdsObs)) << "<br />";
×
438
                                else
439
                                        oss << QString("%1 (%3): %2\"").arg(q_("Separation"), QString::number(wdsSep, 'f', 3), QString::number(wdsObs)) << "<br />";
×
440
                        }
441
                }
442
        }
443

444
        oss << getSolarLunarInfoString(core, flags);
×
445

UNCOV
446
        StelObject::postProcessInfoString(str, flags);
×
447

UNCOV
448
        return str;
×
449
}
×
450

451
QVariantMap StarWrapper1::getInfoMap(const StelCore *core) const
×
452
{
453
        QVariantMap map = StelObject::getInfoMap(core);
×
454
        StarId star_id;
UNCOV
455
        if (s->getHip())
×
456
        {
UNCOV
457
                star_id = s->getHip();
×
458
        }
459
        else
460
        {
UNCOV
461
                star_id = s->getGaia();
×
462
        }
UNCOV
463
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
UNCOV
464
        const int wdsObs = StarMgr::getWdsLastObservation(star_id);
×
UNCOV
465
        const float wdsPA = StarMgr::getWdsLastPositionAngle(star_id);
×
466
        const float wdsSep = StarMgr::getWdsLastSeparation(star_id);
×
UNCOV
467
        const double vPeriod = StarMgr::getGcvsPeriod(star_id);
×
468

469
        QString varstartype = "no";
×
470
        QString startype = "star";
×
471
        if(!varType.isEmpty())
×
472
        {
UNCOV
473
                if (QString("BE FU GCAS I IA IB IN INA INB INT IT IN(YY) IS ISA ISB RCB RS SDOR UV UVN WR").contains(varType))
×
474
                        varstartype = "eruptive";
×
475
                else if (QString("ACYG BCEP BCEPS BLBOO CEP CEP(B) CW CWA CWB DCEP DCEPS DSCT DSCTC GDOR L LB LC LPB M PVTEL RPHS RR RR(B) RRAB RRC RV RVA RVB SR SRA SRB SRC SRD SXPHE ZZ ZZA ZZB ZZO").contains(varType))
×
476
                        varstartype = "pulsating";
×
UNCOV
477
                else if (QString("ACV, ACVO, BY, ELL, FKCOM, PSR, SXARI").contains(varType))
×
478
                        varstartype = "rotating";
×
479
                else if (QString("N NA NB NC NL NR SN SNI SNII UG UGSS UGSU UGZ ZAND").contains(varType))
×
480
                        varstartype = "cataclysmic";
×
481
                else if (QString("E EA EB EP EW GS PN RS WD WR AR D DM DS DW K KE KW SD E: E:/WR E/D E+LPB: EA/D EA/D+BY EA/RS EA/SD EA/SD: EA/GS EA/GS+SRC EA/DM EA/WR EA+LPB EA+LPB: EA+DSCT EA+BCEP: EA+ZAND EA+ACYG EA+SRD EB/GS EB/DM EB/KE EB/KE: EW/KE EA/AR/RS EA/GS/D EA/D/WR").contains(varType))
×
482
                        varstartype = "eclipsing-binary";
×
483
                else
484
                        varstartype = "variable";
×
485
        }
486
        map.insert("variable-star", varstartype);
×
487

UNCOV
488
        if (s->getComponentIds() || wdsObs>0)
×
489
                startype = "double-star";
×
490

491
        map.insert("star-type", startype);
×
492

493
        map.insert("bV", s->getBV());
×
494

UNCOV
495
        if (s->getPlx())
×
496
        {
UNCOV
497
                map.insert("parallax", 0.001*s->getPlx());
×
498
                map.insert("absolute-mag", getVMagnitude(core)+5.f*(std::log10(0.001*s->getPlx())));
×
UNCOV
499
                map.insert("distance-ly", (AU/(SPEED_OF_LIGHT*86400*365.25)) / (s->getPlx()*((0.001/3600)*(M_PI/180))));
×
500
        }
501

502
        if (s->getSpInt())
×
503
                map.insert("spectral-class", StarMgr::convertToSpectralType(s->getSpInt()));
×
504

UNCOV
505
        if (vPeriod>0)
×
UNCOV
506
                map.insert("period", vPeriod);
×
507

508
        if (wdsObs>0)
×
509
        {
510
                map.insert("wds-year", wdsObs);
×
511
                map.insert("wds-position-angle", wdsPA);
×
UNCOV
512
                map.insert("wds-separation", wdsSep);
×
513
        }
514

515
        return map;
×
516
}
×
517

UNCOV
518
QString StarWrapper2::getObjectType() const
×
519
{
520
        StarId star_id =  s->getGaia();
×
521

UNCOV
522
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
523
        QString startype = N_("star");
×
UNCOV
524
        if(!varType.isEmpty())
×
525
        {
UNCOV
526
                QString varstartype = "";
×
527
                // see also http://www.sai.msu.su/gcvs/gcvs/vartype.htm
528
                if (QString("BE FU GCAS I IA IB IN INA INB INT IT IN(YY) IS ISA ISB RCB RS SDOR UV UVN WR").contains(varType))
×
529
                        varstartype = N_("eruptive variable star");
×
UNCOV
530
                else if (QString("ACYG BCEP BCEPS BLBOO CEP CEP(B) CW CWA CWB DCEP DCEPS DSCT DSCTC GDOR L LB LC LPB M PVTEL RPHS RR RR(B) RRAB RRC RV RVA RVB SR SRA SRB SRC SRD SXPHE ZZ ZZA ZZB ZZO").contains(varType))
×
531
                        varstartype = N_("pulsating variable star");
×
UNCOV
532
                else if (QString("ACV, ACVO, BY, ELL, FKCOM, PSR, SXARI").contains(varType))
×
533
                        varstartype = N_("rotating variable star");
×
534
                else if (QString("N NA NB NC NL NR SN SNI SNII UG UGSS UGSU UGZ ZAND").contains(varType))
×
535
                        varstartype = N_("cataclysmic variable star");
×
536
                else if (QString("E EA EB EP EW GS PN RS WD WR AR D DM DS DW K KE KW SD E: E:/WR E/D E+LPB: EA/D EA/D+BY EA/RS EA/SD EA/SD: EA/GS EA/GS+SRC EA/DM EA/WR EA+LPB EA+LPB: EA+DSCT EA+BCEP: EA+ZAND EA+ACYG EA+SRD EB/GS EB/DM EB/KE EB/KE: EW/KE EA/AR/RS EA/GS/D EA/D/WR").contains(varType))
×
537
                        varstartype = N_("eclipsing binary system");
×
538
                else
539
                // XXX intense variable X-ray sources "AM, X, XB, XF, XI, XJ, XND, XNG, XP, XPR, XPRM, XM)"
540
                // XXX other symbols "BLLAC, CST, GAL, L:, QSO, S,"
541
                        varstartype = N_("variable star");
×
542

UNCOV
543
                return varstartype;
×
UNCOV
544
        }
×
545
        else
546
                return startype;
×
UNCOV
547
}
×
548

549
QString StarWrapper2::getID(void) const
×
550
{
551
        return QString("Gaia DR3 %1").arg(s->getGaia());
×
552
}
553

554
QString StarWrapper2::getObjectTypeI18n() const
×
555
{
556
        QString stypefinal, stype = getObjectType();
×
UNCOV
557
        StarId star_id =  s->getGaia();
×
558

559
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
UNCOV
560
        if (!varType.isEmpty())
×
561
        {
562
                if (stype.contains(","))
×
563
                {
564
                        const QStringList stypes = stype.split(",");
×
565
                        QStringList stypesI18n;
×
UNCOV
566
                        for (const auto &st: stypes) { stypesI18n << q_(st.trimmed()); }
×
567
                        stypefinal = stypesI18n.join(", ");
×
UNCOV
568
                }
×
569
                else
570
                        stypefinal = q_(stype);
×
571
        }
572
        else
UNCOV
573
                stypefinal = q_(stype);
×
574

UNCOV
575
        return stypefinal;
×
UNCOV
576
}
×
577

UNCOV
578
QString StarWrapper2::getInfoString(const StelCore *core, const InfoStringGroup& flags) const
×
579
{
580
        QString str;
×
UNCOV
581
        QTextStream oss(&str);
×
582

UNCOV
583
        StarId star_id = s->getGaia();
×
584
        const QString commonNameI18 = StarMgr::getCommonNameI18n(star_id);
×
585
        const QString culturalInfoName=StarMgr::getCulturalInfoLabel(star_id);
×
UNCOV
586
        const QString sciName = StarMgr::getSciDesignation(star_id);
×
587
        const QString sciExtraName = StarMgr::getSciExtraDesignation(star_id);
×
588
        const QString varSciName = StarMgr::getGcvsDesignation(star_id);
×
589
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
590

591
        if ((flags&Name) || (flags&CatalogNumber))
×
592
                oss << "<h2>";
×
593

UNCOV
594
        QStringList designations;
×
595
        if (!sciName.isEmpty())
×
596
                designations.append(sciName);
×
UNCOV
597
        if (!sciExtraName.isEmpty())
×
598
                designations.append(sciExtraName);
×
599
        if (!varSciName.isEmpty() && !sciName.contains(varSciName, Qt::CaseInsensitive))
×
600
                designations.append(varSciName);
×
601

602
        const QString crossIndexData = StarMgr::getCrossIdentificationDesignations(QString::number(s->getGaia()));
×
603
        if (!crossIndexData.isEmpty())
×
604
                designations.append(crossIndexData);
×
605

606
        designations.append(QString("Gaia DR3 %1").arg(s->getGaia()));
×
607

608
        QString designationsList = designations.join(" - ");
×
UNCOV
609
        designations.clear();
×
610
        designations = designationsList.split(" - ");
×
UNCOV
611
        designations.removeDuplicates();
×
612
        int asize = designations.size();
×
613
        if (asize>6) // Special case for many designations (max - 7 items per line); NOTE: Should we add size to the config data for skyculture?
×
614
        {
615
                designationsList = "";
×
616
                for(int i=0; i<asize; i++)
×
617
                {
UNCOV
618
                        designationsList.append(designations.at(i));
×
619
                        if (i<asize-1)
×
620
                                designationsList.append(" - ");
×
621

622
                        if (i>0 && (i % 6)==0 && i<(asize-1))
×
623
                                designationsList.append("<br />");
×
624
                }
625
        }
626
        else
627
                designationsList = designations.join(" - ");
×
628

UNCOV
629
        if (flags&Name)
×
630
        {
631
                QString commonNames;
×
UNCOV
632
                if (!commonNameI18.isEmpty())
×
633
                        commonNames = commonNameI18;
×
634

635
                // TODO: Finalize appearance of cultural Names
636
                if (!culturalInfoName.isEmpty() && StarMgr::getFlagAdditionalNames())
×
637
                        oss << culturalInfoName << "<br />";
×
638

639
                if (!commonNames.isEmpty())
×
UNCOV
640
                        oss << StelUtils::wrapText(commonNames, 80);
×
641

642
                if (!commonNameI18.isEmpty() && !designationsList.isEmpty() && flags&CatalogNumber)
×
UNCOV
643
                        oss << "<br />";
×
644
        }
×
645

UNCOV
646
        if (flags&CatalogNumber)
×
647
                oss << designationsList;
×
648

UNCOV
649
        if ((flags&Name) || (flags&CatalogNumber))
×
650
                oss << "</h2>";
×
651

652
        if (flags&ObjectType)
×
653
        {
654
                const QString objectTypeI18nStr = getObjectTypeI18n();
×
655
                if (!varType.isEmpty())
×
UNCOV
656
                        oss << QString("%1: <b>%2</b> (%3)").arg(q_("Type"), objectTypeI18nStr, varType) << "<br />";
×
657
                else
658
                        oss << QString("%1: <b>%2</b>").arg(q_("Type"), objectTypeI18nStr) << "<br />";
×
UNCOV
659
        }
×
660

UNCOV
661
        oss << getMagnitudeInfoString(core, flags, 2);
×
662

663
        double RA, DEC, pmra, pmdec, Plx, RadialVel;
664
        double PlxErr = s->getPlxErr();
×
UNCOV
665
        float dyrs = static_cast<float>(core->getJDE()-STAR_CATALOG_JDEPOCH)/365.25;
×
666
        s->getFull6DSolution(RA, DEC, Plx, pmra, pmdec, RadialVel, dyrs);
×
667
        bool computeAstrometryFlag = (flags&ProperMotion) && (pmra || pmdec);
×
668

669
        if ((flags&AbsoluteMagnitude) && s->getPlx())
×
670
                // should use Plx from getPlx because Plx can change with time, but not absolute magnitude
UNCOV
671
                oss << QString("%1: %2").arg(q_("Absolute Magnitude")).arg(getVMagnitude(core)+5.*(1.+std::log10(0.001*s->getPlx())), 0, 'f', 2) << "<br />";
×
672

673
        if (flags&Extra)
×
674
        {
675
                oss << QString("%1: <b>%2</b>").arg(q_("Color Index (B-V)"), QString::number(getBV(), 'f', 2)) << "<br />";
×
676

677
                if (!varType.isEmpty())
×
678
                {
679
                        const float maxVMag = StarMgr::getGcvsMaxMagnitude(star_id);
×
UNCOV
680
                        const float magFlag = StarMgr::getGcvsMagnitudeFlag(star_id);
×
681
                        const float minVMag = StarMgr::getGcvsMinMagnitude(star_id);
×
UNCOV
682
                        const float min2VMag = StarMgr::getGcvsMinMagnitude(star_id, false);
×
683
                        const QString photoVSys = StarMgr::getGcvsPhotometricSystem(star_id);
×
684

685
                        float minimumM1 = minVMag;
×
UNCOV
686
                        float minimumM2 = min2VMag;
×
687
                        if (magFlag==1.f) // Amplitude
×
688
                        {
689
                                minimumM1 += maxVMag;
×
690
                                minimumM2 += maxVMag;
×
691
                        }
692

693
                        if (maxVMag!=99.f) // seems it is not eruptive variable star
×
694
                        {
695
                                QString minStr = QString::number(minimumM1, 'f', 2);
×
UNCOV
696
                                if (min2VMag<99.f)
×
697
                                        minStr = QString("%1/%2").arg(QString::number(minimumM1, 'f', 2), QString::number(minimumM2, 'f', 2));
×
698

UNCOV
699
                                oss << QString("%1: <b>%2</b>%3<b>%4</b> (%5: %6)").arg(q_("Magnitude range"), QString::number(maxVMag, 'f', 2), QChar(0x00F7), minStr, q_("Photometric system"), photoVSys) << "<br />";
×
UNCOV
700
                        }
×
701
                }
×
702
        }
703
        
704
        oss << getCommonInfoString(core, flags);
×
705

706
        // kinda impossible for both pm to be exactly 0, so they must just be missing
707
        if (computeAstrometryFlag)
×
708
        {
709
                float pa = std::atan2(pmra, pmdec)*M_180_PIf;
×
UNCOV
710
                if (pa<0)
×
UNCOV
711
                        pa += 360.f;
×
712
                oss << QString("%1: %2 %3 %4 %5°").arg(q_("Proper motion"),
×
UNCOV
713
                                                        QString::number(std::sqrt(pmra * pmra + pmdec * pmdec), 'f', 2),
×
UNCOV
714
                                                        qc_("mas/yr", "milliarc second per year"),
×
715
                                                        qc_("towards", "into the direction of"),
×
UNCOV
716
                                                        QString::number(pa, 'f', 1)) << "<br />";
×
717
                oss << QString("%1: %2 %3 (%4)").arg(q_("Proper motions by axes"),
×
718
                                                        QString::number(pmra, 'f', 2),
×
719
                                                        QString::number(pmdec, 'f', 2),
×
720
                                                        qc_("mas/yr", "milliarc second per year")) << "<br />";
×
721
        }
722

723
        // kinda impossible for both parallax and parallax_err to be exactly 0, so they must just be missing
724
        if (flags&Distance)
×
725
        {
726
                // do parallax SNR cut because we are calculating distance, inverse parallax is bad for >20% uncertainty
727
                if ((Plx!=0) && (PlxErr!=0) & (Plx/PlxErr > 5.))
×
728
                {
729
                        //TRANSLATORS: Unit of measure for distance - Light Years
UNCOV
730
                        QString ly = qc_("ly", "distance");
×
UNCOV
731
                        double distance = PARSEC_LY * 1000. / Plx;
×
732
                        oss << QString("%1: %2%3%4 %5").arg(q_("Distance"), QString::number(distance, 'f', 2), QChar(0x00B1), QString::number(distance * PlxErr / Plx, 'f', 2), ly) << "<br />";
×
UNCOV
733
                }
×
UNCOV
734
                if ((Plx!=0) && (PlxErr!=0))  // as long as having parallax, display it (but not necessarily displaying inverse parallax)
×
735
                {
UNCOV
736
                        QString plx = q_("Parallax");
×
UNCOV
737
                        if (PlxErr>0.f)
×
738
                                oss <<  QString("%1: %2%3%4 ").arg(plx, QString::number(Plx, 'f', 3), QChar(0x00B1), QString::number(PlxErr, 'f', 3));
×
739
                        else
740
                                oss << QString("%1: %2 ").arg(plx, QString::number(Plx, 'f', 3));
×
741
                        oss  << qc_("mas", "parallax") << "<br />";
×
742
                }
×
UNCOV
743
                oss << getExtraInfoStrings(Distance).join("");
×
744
        }
745

746
        if (flags&Extra)
×
747
        {
748
                const double vEpoch = StarMgr::getGcvsEpoch(star_id);
×
749
                const double vPeriod = StarMgr::getGcvsPeriod(star_id);
×
750
                const int vMm = StarMgr::getGcvsMM(star_id);
×
751
                const QString sType = StarMgr::getGcvsSpectralType(star_id);
×
752

UNCOV
753
                QString stype = getObjectType();
×
754
                bool ebsFlag = stype.contains("eclipsing binary system");
×
755

756
                if (!sType.isEmpty())
×
757
                        oss << QString("%1: %2").arg(q_("Spectral Type"), sType) << "<br />";
×
758

759
                if (vPeriod>0.)
×
UNCOV
760
                        oss << QString("%1: %2 %3").arg(q_("Period")).arg(vPeriod).arg(qc_("days", "duration")) << "<br />";
×
761

762
                if (vEpoch>0. && vPeriod>0.)
×
763
                {
764
                        // Calculate next minimum or maximum light
765
                        double vsEpoch = 2400000+vEpoch;
×
UNCOV
766
                        double npDate = vsEpoch + vPeriod * ::floor(1.0 + (core->getJD() - vsEpoch)/vPeriod);
×
767
                        QString nextDate = StelUtils::julianDayToISO8601String(npDate).replace("T", " ");
×
768
                        QString dateStr = q_("Next maximum light");
×
UNCOV
769
                        if (ebsFlag)
×
770
                                dateStr = q_("Next minimum light");
×
771

UNCOV
772
                        oss << QString("%1: %2 UTC").arg(dateStr, nextDate) << "<br />";
×
773
                }
×
774

775
                if (vMm>0)
×
776
                {
777
                        QString mmStr = q_("Rising time");
×
778
                        if (ebsFlag)
×
UNCOV
779
                                mmStr = q_("Duration of eclipse");
×
780

781
                        float daysFraction = vPeriod * vMm / 100.f;
×
UNCOV
782
                        auto dms = StelUtils::daysFloatToDHMS(daysFraction);
×
783
                        oss << QString("%1: %2% (%3)").arg(mmStr).arg(vMm).arg(dms) << "<br />";
×
UNCOV
784
                }
×
785
        }
×
786

787
        oss << getSolarLunarInfoString(core, flags);
×
788

789
        StelObject::postProcessInfoString(str, flags);
×
790

791
        return str;
×
792
}
×
793

UNCOV
794
QString StarWrapper3::getID(void) const
×
795
{
UNCOV
796
        return QString("Gaia DR3 %1").arg(s->getGaia());
×
797
}
798

799
QString StarWrapper3::getObjectType() const
×
800
{
UNCOV
801
        StarId star_id =  s->getGaia();
×
802

UNCOV
803
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
804
        QString startype = N_("star");
×
UNCOV
805
        if(!varType.isEmpty())
×
806
        {
807
                QString varstartype = "";
×
808
                // see also http://www.sai.msu.su/gcvs/gcvs/vartype.htm
809
                if (QString("BE FU GCAS I IA IB IN INA INB INT IT IN(YY) IS ISA ISB RCB RS SDOR UV UVN WR").contains(varType))
×
UNCOV
810
                        varstartype = N_("eruptive variable star");
×
811
                else if (QString("ACYG BCEP BCEPS BLBOO CEP CEP(B) CW CWA CWB DCEP DCEPS DSCT DSCTC GDOR L LB LC LPB M PVTEL RPHS RR RR(B) RRAB RRC RV RVA RVB SR SRA SRB SRC SRD SXPHE ZZ ZZA ZZB ZZO").contains(varType))
×
812
                        varstartype = N_("pulsating variable star");
×
813
                else if (QString("ACV, ACVO, BY, ELL, FKCOM, PSR, SXARI").contains(varType))
×
UNCOV
814
                        varstartype = N_("rotating variable star");
×
815
                else if (QString("N NA NB NC NL NR SN SNI SNII UG UGSS UGSU UGZ ZAND").contains(varType))
×
UNCOV
816
                        varstartype = N_("cataclysmic variable star");
×
817
                else if (QString("E EA EB EP EW GS PN RS WD WR AR D DM DS DW K KE KW SD E: E:/WR E/D E+LPB: EA/D EA/D+BY EA/RS EA/SD EA/SD: EA/GS EA/GS+SRC EA/DM EA/WR EA+LPB EA+LPB: EA+DSCT EA+BCEP: EA+ZAND EA+ACYG EA+SRD EB/GS EB/DM EB/KE EB/KE: EW/KE EA/AR/RS EA/GS/D EA/D/WR").contains(varType))
×
818
                        varstartype = N_("eclipsing binary system");
×
819
                else
820
                // XXX intense variable X-ray sources "AM, X, XB, XF, XI, XJ, XND, XNG, XP, XPR, XPRM, XM)"
821
                // XXX other symbols "BLLAC, CST, GAL, L:, QSO, S,"
822
                        varstartype = N_("variable star");
×
823

824
                return varstartype;
×
825
        }
×
826
        else
UNCOV
827
                return startype;
×
UNCOV
828
}
×
829

830
QString StarWrapper3::getObjectTypeI18n() const
×
831
{
832
        QString stypefinal, stype = getObjectType();
×
833
        StarId star_id =  s->getGaia();
×
834

835
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
836
        if (!varType.isEmpty())
×
837
        {
838
                if (stype.contains(","))
×
839
                {
840
                        const QStringList stypes = stype.split(",");
×
841
                        QStringList stypesI18n;
×
UNCOV
842
                        for (const auto &st: stypes) { stypesI18n << q_(st.trimmed()); }
×
843
                        stypefinal = stypesI18n.join(", ");
×
844
                }
×
845
                else
846
                        stypefinal = q_(stype);
×
847
        }
848
        else
849
                stypefinal = q_(stype);
×
850

851
        return stypefinal;
×
UNCOV
852
}
×
853

UNCOV
854
QString StarWrapper3::getInfoString(const StelCore *core, const InfoStringGroup& flags) const
×
855
{
856
        QString str;
×
UNCOV
857
        QTextStream oss(&str);
×
858

859
        StarId star_id = s->getGaia();
×
UNCOV
860
        const QString varType = StarMgr::getGcvsVariabilityType(star_id);
×
861

UNCOV
862
        if (flags&CatalogNumber)
×
863
        {
864
                oss << "<h2>";
×
865

866
                QStringList designations;
×
867

UNCOV
868
                const QString varSciName = StarMgr::getGcvsDesignation(star_id);
×
869
                if (!varSciName.isEmpty())
×
UNCOV
870
                        designations.append(varSciName);
×
871

UNCOV
872
                designations.append(QString("Gaia DR3 %1").arg(star_id));
×
873

UNCOV
874
                oss << designations.join(" - ");
×
875
                oss << "</h2>";
×
876
        }
×
877

UNCOV
878
        if (flags&ObjectType)
×
879
        {
UNCOV
880
                const QString objectTypeI18nStr = getObjectTypeI18n();
×
881
                if (!varType.isEmpty())
×
882
                        oss << QString("%1: <b>%2</b> (%3)").arg(q_("Type"), objectTypeI18nStr, varType) << "<br />";
×
883
                else
UNCOV
884
                        oss << QString("%1: <b>%2</b>").arg(q_("Type"), objectTypeI18nStr) << "<br />";
×
885
        }
×
886

887
        oss << getMagnitudeInfoString(core, flags, 2);
×
888

889
        if (flags&Extra)
×
890
        {
891
                oss << QString("%1: <b>%2</b>").arg(q_("Color Index (B-V)"), QString::number(getBV(), 'f', 2)) << "<br />";
×
892

UNCOV
893
                if (!varType.isEmpty())
×
894
                {
UNCOV
895
                        const float maxVMag = StarMgr::getGcvsMaxMagnitude(star_id);
×
896
                        const float magFlag = StarMgr::getGcvsMagnitudeFlag(star_id);
×
UNCOV
897
                        const float minVMag = StarMgr::getGcvsMinMagnitude(star_id);
×
898
                        const float min2VMag = StarMgr::getGcvsMinMagnitude(star_id, false);
×
UNCOV
899
                        const QString photoVSys = StarMgr::getGcvsPhotometricSystem(star_id);
×
900

UNCOV
901
                        float minimumM1 = minVMag;
×
902
                        float minimumM2 = min2VMag;
×
903
                        if (magFlag==1.f) // Amplitude
×
904
                        {
905
                                minimumM1 += maxVMag;
×
906
                                minimumM2 += maxVMag;
×
907
                        }
908

909
                        if (maxVMag!=99.f) // seems it is not eruptive variable star
×
910
                        {
UNCOV
911
                                QString minStr = QString::number(minimumM1, 'f', 2);
×
912
                                if (min2VMag<99.f)
×
913
                                        minStr = QString("%1/%2").arg(QString::number(minimumM1, 'f', 2), QString::number(minimumM2, 'f', 2));
×
914

UNCOV
915
                                oss << QString("%1: <b>%2</b>%3<b>%4</b> (%5: %6)").arg(q_("Magnitude range"), QString::number(maxVMag, 'f', 2), QChar(0x00F7), minStr, q_("Photometric system"), photoVSys) << "<br />";
×
916
                        }
×
UNCOV
917
                }
×
918
        }
919
        
920
        oss << getCommonInfoString(core, flags);
×
921

922
        if (flags&Extra)
×
923
        {
924
                const double vEpoch = StarMgr::getGcvsEpoch(star_id);
×
UNCOV
925
                const double vPeriod = StarMgr::getGcvsPeriod(star_id);
×
UNCOV
926
                const int vMm = StarMgr::getGcvsMM(star_id);
×
927
                const QString sType = StarMgr::getGcvsSpectralType(star_id);
×
928

929
                QString stype = getObjectType();
×
UNCOV
930
                bool ebsFlag = stype.contains("eclipsing binary system");
×
931

932
                if (!sType.isEmpty())
×
933
                        oss << QString("%1: %2").arg(q_("Spectral Type"), sType) << "<br />";
×
934

UNCOV
935
                if (vPeriod>0.)
×
936
                        oss << QString("%1: %2 %3").arg(q_("Period")).arg(vPeriod).arg(qc_("days", "duration")) << "<br />";
×
937

UNCOV
938
                if (vEpoch>0. && vPeriod>0.)
×
939
                {
940
                        // Calculate next minimum or maximum light
UNCOV
941
                        double vsEpoch = 2400000+vEpoch;
×
942
                        double npDate = vsEpoch + vPeriod * ::floor(1.0 + (core->getJD() - vsEpoch)/vPeriod);
×
943
                        QString nextDate = StelUtils::julianDayToISO8601String(npDate).replace("T", " ");
×
UNCOV
944
                        QString dateStr = q_("Next maximum light");
×
945
                        if (ebsFlag)
×
UNCOV
946
                                dateStr = q_("Next minimum light");
×
947

948
                        oss << QString("%1: %2 UTC").arg(dateStr, nextDate) << "<br />";
×
949
                }
×
950

951
                if (vMm>0)
×
952
                {
953
                        QString mmStr = q_("Rising time");
×
UNCOV
954
                        if (ebsFlag)
×
955
                                mmStr = q_("Duration of eclipse");
×
956

UNCOV
957
                        float daysFraction = vPeriod * vMm / 100.f;
×
958
                        auto dms = StelUtils::daysFloatToDHMS(daysFraction);
×
UNCOV
959
                        oss << QString("%1: %2% (%3)").arg(mmStr).arg(vMm).arg(dms) << "<br />";
×
960
                }
×
961
        }
×
962

UNCOV
963
        oss << getSolarLunarInfoString(core, flags);
×
964

965
        StelObject::postProcessInfoString(str, flags);
×
966

967
        return str;
×
968
}
×
969

970

UNCOV
971
StelObjectP Star1::createStelObject(const SpecialZoneArray<Star1> *a, const SpecialZoneData<Star1> *z) const
×
972
{
UNCOV
973
        return StelObjectP(new StarWrapper1(a,z,this), true);
×
974
}
975

UNCOV
976
StelObjectP Star2::createStelObject(const SpecialZoneArray<Star2> *a, const SpecialZoneData<Star2> *z) const
×
977
{
978
        return StelObjectP(new StarWrapper2(a,z,this), true);
×
979
}
980

UNCOV
981
StelObjectP Star3::createStelObject(const SpecialZoneArray<Star3> *a, const SpecialZoneData<Star3> *z) const
×
982
{
983
        return StelObjectP(new StarWrapper3(a,z,this), true);
×
984
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc