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

Stellarium / stellarium / 10609521019

29 Aug 2024 05:56AM UTC coverage: 12.113% (-0.03%) from 12.138%
10609521019

Pull #3847

github

alex-w
[SSE] Add info for total candidates for addiing...
Pull Request #3847: Threaded planet computation (and a few more speedups)

30 of 686 new or added lines in 51 files covered. (4.37%)

41 existing lines in 18 files now uncovered.

14434 of 119159 relevant lines covered (12.11%)

19024.8 hits per line

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

0.0
/src/core/modules/NomenclatureMgr.cpp
1
/*
2
 * Copyright (C) 2017 Alexander Wolf
3
 * Copyright (C) 2017 Teresa Huertas Roldán
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA  02110-1335, USA.
18
 */
19

20
#include "StelPainter.hpp"
21
#include "StelApp.hpp"
22
#include "StelCore.hpp"
23
#include "StelModuleMgr.hpp"
24
#include "StelObjectMgr.hpp"
25
#include "StelTextureMgr.hpp"
26
#include "StelFileMgr.hpp"
27
#include "StelUtils.hpp"
28
#include "StelTranslator.hpp"
29
#include "StelLocaleMgr.hpp"
30
#include "NomenclatureMgr.hpp"
31
#include "NomenclatureItem.hpp"
32

33
#include <QSettings>
34
#include <QFile>
35
#include <QDir>
36
#include <QBuffer>
37
#include <QRegularExpression>
38

39
NomenclatureMgr::NomenclatureMgr() : StelObjectModule()
×
40
{
41
        setObjectName("NomenclatureMgr");
×
42
        font.setPixelSize(StelApp::getInstance().getScreenFontSize());
×
43
        connect(&StelApp::getInstance(), SIGNAL(screenFontSizeChanged(int)), this, SLOT(setFontSize(int)));
×
44
        ssystem = GETSTELMODULE(SolarSystem);
×
45
        setForceItems(true);
×
46
}
×
47

48
NomenclatureMgr::~NomenclatureMgr()
×
49
{
50
        StelApp::getInstance().getStelObjectMgr().unSelect();
×
51
}
×
52

53
double NomenclatureMgr::getCallOrder(StelModuleActionName actionName) const
×
54
{
55
        if (actionName==StelModule::ActionDraw)
×
56
                return StelApp::getInstance().getModuleMgr().getModule("SolarSystem")->getCallOrder(actionName)+10.;
×
57
        return 0;
×
58
}
59

60
void NomenclatureMgr::init()
×
61
{
62
        texPointer = StelApp::getInstance().getTextureManager().createTexture(StelFileMgr::getInstallationDir()+"/textures/pointeur2.png");
×
63

64
        // Load the nomenclature
65
        NomenclatureItem::createNameLists();
×
66
        loadNomenclature();
×
67
        loadSpecialNomenclature();
×
68

69
        QSettings *conf = StelApp::getInstance().getSettings();
×
70
        setColor(Vec3f(                    conf->value("color/planet_nomenclature_color", "0.1,1.0,0.1").toString()));
×
71
        setFlagShowNomenclature(           conf->value("astro/flag_planets_nomenclature", false).toBool());
×
72
        setFlagShowTerminatorZoneOnly(     conf->value("astro/flag_planets_nomenclature_terminator_only", false).toBool());
×
73
        setTerminatorMinAltitude(          conf->value("astro/planet_nomenclature_solar_altitude_min", -5).toInt());
×
74
        setTerminatorMaxAltitude(          conf->value("astro/planet_nomenclature_solar_altitude_max", 40).toInt());
×
75
        setFlagOutlineCraters(             conf->value("astro/flag_planets_nomenclature_outline_craters", false).toBool());
×
76
        setFlagHideLocalNomenclature(      conf->value("astro/flag_hide_local_nomenclature", true).toBool());
×
77
        setFlagShowSpecialNomenclatureOnly(conf->value("astro/flag_special_nomenclature_only", false).toBool());
×
78

NEW
79
        sObjMgr=GETSTELMODULE(StelObjectMgr);
×
NEW
80
        sObjMgr->registerStelObjectMgr(this);
×
81

82
        StelApp *app = &StelApp::getInstance();
×
83
        connect(app, SIGNAL(languageChanged()), this, SLOT(updateI18n()));        
×
84
        connect(ssystem, SIGNAL(solarSystemDataReloaded()), this, SLOT(updateNomenclatureData()));
×
85

86
        StelCore *core=app->getCore();
×
87
        connect(core, &StelCore::locationChanged, this, [=](){setForceItems(true);});
×
88

89
        QString displayGroup = N_("Display Options");
×
90
        addAction("actionShow_Planets_Nomenclature", displayGroup, N_("Nomenclature labels"), "flagShowNomenclature", "Alt+N");
×
91
        addAction("actionShow_Planets_Nomenclature_SpecialPoints_Only", displayGroup, N_("Special nomenclature points only"), "specialNomenclatureOnlyDisplayed");
×
92
}
×
93

94
void NomenclatureMgr::updateNomenclatureData()
×
95
{
96
        bool flag = getFlagShowNomenclature();
×
97
        loadNomenclature();
×
98
        loadSpecialNomenclature();
×
99
        updateI18n();
×
100
        setFlagShowNomenclature(flag);
×
101
}
×
102

103
void NomenclatureMgr::loadSpecialNomenclature()
×
104
{
105
        int featureId = 50000;
×
106
        const QList<PlanetP> ss = ssystem->getAllPlanets();
×
107
        for (const auto& p: ss)
×
108
        {
109
                const double size = p->getEquatorialRadius()*AU*0.25; // formal radius of point is 25% of equatorial radius
×
110
                NomenclatureItemP nomNP = NomenclatureItemP(new NomenclatureItem(p, featureId, N_("North Pole"), "", "", NomenclatureItem::niSpecialPointPole, 90., 0., size));
×
111
                if (!nomNP.isNull())
×
112
                        nomenclatureItems.insert(p, nomNP);
×
113
                featureId++;
×
114
                NomenclatureItemP nomSP = NomenclatureItemP(new NomenclatureItem(p, featureId, N_("South Pole"), "", "", NomenclatureItem::niSpecialPointPole, -90., 0., size));
×
115
                if (!nomSP.isNull())
×
116
                        nomenclatureItems.insert(p, nomSP);
×
117
                featureId++;
×
118
                // longitude is fake, used just to define the object
119
                NomenclatureItemP nomE = NomenclatureItemP(new NomenclatureItem(p, featureId, N_("East"), "", "", NomenclatureItem::niSpecialPointEast, 0., 0., size));
×
120
                if (!nomE.isNull())
×
121
                        nomenclatureItems.insert(p, nomE);
×
122
                featureId++;
×
123
                // longitude is fake, used just to define the object
124
                NomenclatureItemP nomW = NomenclatureItemP(new NomenclatureItem(p, featureId, N_("West"), "", "", NomenclatureItem::niSpecialPointWest, 0., 180., size));
×
125
                if (!nomW.isNull())
×
126
                        nomenclatureItems.insert(p, nomW);
×
127
                featureId++;
×
128
                // longitude is fake, used just to define the object
129
                NomenclatureItemP nomC = NomenclatureItemP(new NomenclatureItem(p, featureId, N_("Centre"), "", "", NomenclatureItem::niSpecialPointCenter, 0., 180., size));
×
130
                if (!nomC.isNull())
×
131
                        nomenclatureItems.insert(p, nomC);
×
132
                featureId++;
×
133
                // longitude is fake, used just to define the object
134
                NomenclatureItemP nomS = NomenclatureItemP(new NomenclatureItem(p, featureId, N_("Subsolar"), "", "", NomenclatureItem::niSpecialPointSubSolar, 0., 180., size));
×
135
                if (!nomS.isNull())
×
136
                        nomenclatureItems.insert(p, nomS);
×
137
                featureId++;
×
138
        }
×
139
}
×
140

141
void NomenclatureMgr::loadNomenclature()
×
142
{
143
        qDebug() << "Loading nomenclature for Solar system bodies ...";
×
144

145
        nomenclatureItems.clear();        
×
146

147
        // regular expression to find the comments and empty lines
148
        static const QRegularExpression commentRx("^(\\s*#.*|\\s*)$");
×
149

150
        // regular expression to find the nomenclature data
151
        // Rules:
152
        // One rule per line. Each rule contains seven elements with white space (or "tab char") as delimiter.
153
        // Format:
154
        //        planet name                                : string
155
        //        ID of surface feature                        : unique integer (feature id obtained from https://planetarynames.wr.usgs.gov/)
156
        //        translatable name of surface feature        : string
157
        //        type of surface feature                        : string (2-char code)
158
        //        latitude of surface feature                : float (decimal degrees)
159
        //        longitude of surface feature                : float (decimal degrees)
160
        //        diameter of surface feature                : float (kilometers)
161
        //        translatable origin of name                : string
162
        static const QRegularExpression recRx("^\\s*(\\w+)\\s+(\\d+)\\s+_[(]\"(.*)\"[)]\\s+(\\w+)\\s+([\\-\\+\\.\\d]+)\\s+([\\-\\+\\.\\d]+)\\s+([\\-\\+\\.\\d]+)\\s+_[(]\"(.*)\"[)](.*)");
×
163
        static const QRegularExpression ctxRx("(.*)\",\\s*\"(.*)");
×
164

165
        QString surfNamesFile = StelFileMgr::findFile("data/nomenclature.dat"); // compressed version of file nomenclature.fab
×
166
        if (!surfNamesFile.isEmpty()) // OK, the file exists!
×
167
        {
168
                // Open file
169
                QFile planetSurfNamesFile(surfNamesFile);
×
170
                if (!planetSurfNamesFile.open(QIODevice::ReadOnly))
×
171
                {
172
                        qDebug() << "Cannot open file" << QDir::toNativeSeparators(surfNamesFile);
×
173
                        return;
×
174
                }
175
                QByteArray data = StelUtils::uncompress(planetSurfNamesFile);
×
176
                planetSurfNamesFile.close();
×
177
                //check if decompressing was successful
178
                if(data.isEmpty())
×
179
                {
180
                        qDebug() << "Could not decompress file" << QDir::toNativeSeparators(surfNamesFile);
×
181
                        return;
×
182
                }
183
                //create and open a QBuffer for reading
184
                QBuffer buf(&data);
×
185
                buf.open(QIODevice::ReadOnly);
×
186

187
                // keep track of how many records we processed.
188
                int totalRecords=0;
×
189
                int readOk=0;
×
190
                int lineNumber=0;
×
191

192
                PlanetP p;
×
193

194
                int featureId;
195
                QString name, planet = "", planetName = "", context = "", origin = "";
×
196
                NomenclatureItem::NomenclatureItemType ntype;
197
                double latitude, longitude, size;
198
                QStringList missingPlanets;
×
199

200
                while (!buf.atEnd())
×
201
                {
202
                        QString record = QString::fromUtf8(buf.readLine());
×
203
                        lineNumber++;
×
204

205
                        // Skip comments
206
                        if (commentRx.match(record).hasMatch())
×
207
                                continue;
×
208

209
                        totalRecords++;
×
210
                        QRegularExpressionMatch recMatch=recRx.match(record);
×
211
                        if (!recMatch.hasMatch())
×
212
                                qWarning() << "ERROR - cannot parse record at line" << lineNumber << "in surface nomenclature file" << QDir::toNativeSeparators(surfNamesFile);
×
213
                        else
214
                        {
215
                                // Read planet name, feature ID, context
216
                                planet        = recMatch.captured(1).trimmed();
×
217
                                featureId        = recMatch.captured(2).toInt();
×
218
                                QString ctxt        = recMatch.captured(3).trimmed();
×
219
                                QRegularExpressionMatch ctxMatch=ctxRx.match(ctxt);
×
220
                                if (ctxMatch.hasMatch())
×
221
                                {
222
                                        name = ctxMatch.captured(1).trimmed();
×
223
                                        context = ctxMatch.captured(2).trimmed();
×
224
                                }
225
                                else
226
                                {
227
                                        name = ctxt;
×
228
                                        context = "";
×
229
                                }
230
                                // Read the type of feature
231
                                QString ntypecode        = recMatch.captured(4).trimmed();
×
232
                                ntype = NomenclatureItem::getNomenclatureItemType(ntypecode.toUpper());
×
233
                                // Read lat/long/size of feature
234
                                latitude        = recMatch.captured(5).toDouble();
×
235
                                longitude        = recMatch.captured(6).toDouble();
×
236
                                size                = recMatch.captured(7).toDouble();
×
237
                                QString otxt        = recMatch.captured(8).trimmed();
×
238
                                QRegularExpressionMatch otxMatch=ctxRx.match(otxt);
×
239
                                if (otxMatch.hasMatch())
×
240
                                        origin  = otxMatch.captured(1).trimmed();
×
241
                                else
242
                                        origin  = otxt;
×
243

244
                                if (planetName.isEmpty() || planet!=planetName)
×
245
                                {
246
                                        p = ssystem->searchByEnglishName(planet);
×
247
                                        if (p.isNull()) // is it a minor planet?
×
248
                                                p = ssystem->searchMinorPlanetByEnglishName(planet);
×
249
                                        planetName = planet;                                        
×
250
                                }
251

252
                                if (!p.isNull())
×
253
                                {
254
                                        NomenclatureItemP nom = NomenclatureItemP(new NomenclatureItem(p, featureId, name, context, origin, ntype, latitude, longitude, size));
×
255
                                        if (!nom.isNull())
×
256
                                                nomenclatureItems.insert(p, nom);
×
257

258
                                        readOk++;
×
259
                                }
×
260
                                else
261
                                        missingPlanets.append(planet);
×
262
                        }
×
263
                }
×
264

265
                buf.close();
×
266
                qDebug() << "Loaded" << readOk << "/" << totalRecords << "items of planetary surface nomenclature";
×
267

268
                missingPlanets.removeDuplicates();
×
269
                if (!missingPlanets.isEmpty())
×
270
                        // Nothing to worry about - We still don't include all objects.
271
                        qInfo() << "INFO: Cannot find these planetary objects to assign nomenclature items:" << missingPlanets.join(", ");
×
272
        }
×
273
}
×
274

275
void NomenclatureMgr::deinit()
×
276
{
277
        nomenclatureItems.clear();
×
278
        texPointer.clear();
×
279
}
×
280

281
void NomenclatureMgr::draw(StelCore* core)
×
282
{
283
        StelProjectorP prj = core->getProjection(StelCore::FrameJ2000);
×
284
        StelPainter painter(prj);
×
285
        painter.setBlending(true);
×
286

NEW
287
        if (sObjMgr->getFlagSelectedObjectPointer())
×
288
            drawPointer(core, painter);
×
289

290
        if (NomenclatureItem::labelsFader.getInterstate()<=0.f)
×
291
            return;
×
292

293
        painter.setFont(font);
×
294
        const SphericalCap& viewportRegion = painter.getProjector()->getBoundingCap();
×
295

296
        for (const auto& p : nomenclatureItems.uniqueKeys())
×
297
        {
298
                // Early exit if the planet is not visible or too small to render the labels.
299
                const Vec3d equPos = p->getJ2000EquatorialPos(core);
×
300
                const double r = p->getEquatorialRadius() * static_cast<double>(p->getSphereScale());
×
301
                double angularSize = atan2(r, equPos.norm());
×
302
                double screenSize = angularSize * static_cast<double>(painter.getProjector()->getPixelPerRadAtCenter());
×
303
                if (screenSize < 50)
×
304
                        continue;
×
305
                Vec3d n = equPos; n.normalize();
×
306
                SphericalCap boundingCap(n, cos(angularSize));
×
307
                if (!viewportRegion.intersects(boundingCap))
×
308
                        continue;
×
309
                if (p->getVMagnitude(core) >= 20.f)
×
310
                        continue;
×
311

312
                // Render all the items of this planet.
313
                for (auto i = nomenclatureItems.find(p); i != nomenclatureItems.end() && i.key() == p; ++i)
×
314
                {
315
                        const NomenclatureItemP& nItem = i.value();
×
316
                        if (nItem)
×
317
                                nItem->draw(core, &painter);
×
318
                }
319
        }
×
320
        // avoid further forcing
321
        setForceItems(false);
×
322
}
×
323

324
void NomenclatureMgr::setForceItems(bool b)
×
325
{
326
        NomenclatureItem::forceItems=b;
×
327
}
×
328

329
void NomenclatureMgr::drawPointer(StelCore* core, StelPainter& painter)
×
330
{
NEW
331
        const QList<StelObjectP> newSelected = sObjMgr->getSelectedObject("NomenclatureItem");
×
332
        if (!newSelected.empty())
×
333
        {
334
                const StelObjectP obj = newSelected[0];
×
335
                Vec3d pos=obj->getJ2000EquatorialPos(core);
×
336

337
                Vec3d screenpos;
×
338
                // Compute 2D pos and return if outside screen
339
                if (!painter.getProjector()->project(pos, screenpos))
×
340
                        return;
×
341

342
                painter.setColor(obj->getInfoColor());
×
343
                texPointer->bind();
×
344
                painter.drawSprite2dMode(static_cast<float>(screenpos[0]), static_cast<float>(screenpos[1]), 13.f, static_cast<float>(StelApp::getInstance().getTotalRunTime()*40.));
×
345
        }
×
346
}
×
347

348
QList<StelObjectP> NomenclatureMgr::searchAround(const Vec3d& av, double limitFov, const StelCore* core) const
×
349
{
350
        QList<StelObjectP> result;
×
351

352
        const bool withAberration=core->getUseAberration();
×
353
        Vec3d v(av);
×
354
        v.normalize();
×
355
        if (withAberration)
×
356
        {
357
            Vec3d vel=core->getCurrentPlanet()->getHeliocentricEclipticVelocity();
×
358
            StelCore::matVsop87ToJ2000.transfo(vel);
×
359
            vel*=core->getAberrationFactor()*(AU/(86400.0*SPEED_OF_LIGHT));
×
360
            v+=vel;
×
361
            v.normalize();
×
362
        }
363

364
        const double cosLimFov = cos(limitFov * M_PI/180.);
×
365
        Vec3d equPos;
×
366

367
        for (const auto& nItem : nomenclatureItems)
×
368
        {
369
                equPos = nItem->getJ2000EquatorialPos(core);
×
370
                equPos.normalize();
×
371
                if (equPos.dot(v) >= cosLimFov)
×
372
                {
373
                        result.append(qSharedPointerCast<StelObject>(nItem));
×
374
                }
375
        }
376
        return result;
×
377
}
×
378

379
StelObjectP NomenclatureMgr::searchByName(const QString& englishName) const
×
380
{
381
        if (getFlagShowNomenclature())
×
382
        {
383
                NomenclatureItem::NomenclatureItemType niType;
384
                for (const auto& nItem : nomenclatureItems)
×
385
                {
386
                        niType = nItem->getNomenclatureType();
×
387
                        if (niType!=NomenclatureItem::niSatelliteFeature && niType!=NomenclatureItem::niSpecialPointPole && niType!=NomenclatureItem::niSpecialPointEast && niType!=NomenclatureItem::niSpecialPointWest && nItem->getEnglishName().toUpper() == englishName.toUpper())
×
388
                        {
389
                                return qSharedPointerCast<StelObject>(nItem);
×
390
                        }
391
                }
392
        }
393
        return Q_NULLPTR;
×
394
}
395

396
StelObjectP NomenclatureMgr::searchByNameI18n(const QString& nameI18n) const
×
397
{
398
        if (getFlagShowNomenclature())
×
399
        {
400
                NomenclatureItem::NomenclatureItemType niType;
401
                for (const auto& nItem : nomenclatureItems)
×
402
                {
403
                        niType = nItem->getNomenclatureType();
×
404
                        if (niType!=NomenclatureItem::niSatelliteFeature && niType!=NomenclatureItem::niSpecialPointPole && niType!=NomenclatureItem::niSpecialPointEast && niType!=NomenclatureItem::niSpecialPointWest  && nItem->getNameI18n().toUpper() == nameI18n.toUpper())
×
405
                        {
406
                                return qSharedPointerCast<StelObject>(nItem);
×
407
                        }
408
                }
409
        }
410
        return Q_NULLPTR;
×
411
}
412

413
QStringList NomenclatureMgr::listAllObjects(bool inEnglish) const
×
414
{
415
        QStringList result;
×
416

417
        if (getFlagShowNomenclature())
×
418
        {
419
                NomenclatureItem::NomenclatureItemType niType;
420
                if (inEnglish)
×
421
                {
422
                        for (const auto& nItem : nomenclatureItems)
×
423
                        {
424
                                niType = nItem->getNomenclatureType();
×
425
                                if (niType!=NomenclatureItem::niSatelliteFeature && niType!=NomenclatureItem::niSpecialPointPole && niType!=NomenclatureItem::niSpecialPointEast && niType!=NomenclatureItem::niSpecialPointWest)
×
426
                                        result << nItem->getEnglishName();
×
427
                        }
428
                }
429
                else
430
                {
431
                        for (const auto& nItem : nomenclatureItems)
×
432
                        {
433
                                niType = nItem->getNomenclatureType();
×
434
                                if (niType!=NomenclatureItem::niSatelliteFeature && niType!=NomenclatureItem::niSpecialPointPole && niType!=NomenclatureItem::niSpecialPointEast && niType!=NomenclatureItem::niSpecialPointWest)
×
435
                                        result << nItem->getNameI18n();
×
436
                        }
437
                }
438
        }
439
        return result;
×
440
}
×
441

442
QStringList NomenclatureMgr::listAllObjectsByType(const QString &objType, bool inEnglish) const
×
443
{
444
        QStringList result;
×
445

446
        if (getFlagShowNomenclature())
×
447
        {
448
                int type = objType.toInt();
×
449
                switch (type)
×
450
                {
451
                        case 0:
×
452
                        {
453
                                NomenclatureItem::NomenclatureItemType niType;
454
                                for (const auto& nItem : nomenclatureItems)
×
455
                                {
456
                                        niType = nItem->getNomenclatureType();
×
457
                                        if (nItem->getPlanet()->getEnglishName().contains(objType, Qt::CaseSensitive) && niType!=NomenclatureItem::niSatelliteFeature && niType!=NomenclatureItem::niSpecialPointPole && niType!=NomenclatureItem::niSpecialPointEast && niType!=NomenclatureItem::niSpecialPointWest)
×
458
                                        {
459
                                                if (inEnglish)
×
460
                                                        result << nItem->getEnglishName();
×
461
                                                else
462
                                                        result << nItem->getNameI18n();
×
463
                                        }
464
                                }
465
                                break;
×
466
                        }
467
                        default:
×
468
                        {
469
                                for (const auto& nItem : nomenclatureItems)
×
470
                                {
471
                                        if (nItem->getNomenclatureType()==type)
×
472
                                        {
473
                                                if (inEnglish)
×
474
                                                        result << nItem->getEnglishName();
×
475
                                                else
476
                                                        result << nItem->getNameI18n();
×
477
                                        }
478
                                }
479
                                break;
×
480
                        }
481
                }
482
                result.removeDuplicates();
×
483
        }
484

485
        return result;
×
486
}
×
487

488
NomenclatureItemP NomenclatureMgr::searchByEnglishName(QString nomenclatureItemEnglishName) const
×
489
{
490
        if (getFlagShowNomenclature())
×
491
        {
492
                NomenclatureItem::NomenclatureItemType niType;
493
                for (const auto& p : nomenclatureItems)
×
494
                {
495
                        niType = p->getNomenclatureType();
×
496
                        if (niType!=NomenclatureItem::niSatelliteFeature && niType!=NomenclatureItem::niSpecialPointPole && niType!=NomenclatureItem::niSpecialPointEast && niType!=NomenclatureItem::niSpecialPointWest && p->getEnglishName() == nomenclatureItemEnglishName)
×
497
                                return p;
×
498
                }
499
        }
500

501
        return NomenclatureItemP();
×
502
}
503

504
void NomenclatureMgr::setColor(const Vec3f& c)
×
505
{
506
        NomenclatureItem::color = c;
×
507
        emit nomenclatureColorChanged(c);
×
508
}
×
509

510
const Vec3f& NomenclatureMgr::getColor(void) const
×
511
{
512
        return NomenclatureItem::color;
×
513
}
514

515
void NomenclatureMgr::setFlagShowNomenclature(bool b)
×
516
{
517
        if (getFlagShowNomenclature() != b)
×
518
        {
519
                NomenclatureItem::setFlagLabels(b);
×
520
                emit flagShowNomenclatureChanged(b);
×
521
        }
522
}
×
523

524
bool NomenclatureMgr::getFlagShowNomenclature() const
×
525
{
526
        return NomenclatureItem::getFlagLabels();
×
527
}
528

529
// Set flag which determines if only nomenclature along the terminator should be shown.
530
void NomenclatureMgr::setFlagShowTerminatorZoneOnly(bool b)
×
531
{
532
        if (b!=NomenclatureItem::showTerminatorZoneOnly)
×
533
        {
534
                NomenclatureItem::showTerminatorZoneOnly=b;
×
535
                StelApp::immediateSave("astro/flag_planets_nomenclature_terminator_only", b);
×
536
                emit flagShowTerminatorZoneOnlyChanged(b);
×
537
        }
538
}
×
539
// Get flag which determines if only nomenclature along the terminator should be shown.
540
bool NomenclatureMgr::getFlagShowTerminatorZoneOnly() const
×
541
{
542
        return NomenclatureItem::showTerminatorZoneOnly;
×
543
}
544

545
// Set minimum solar altitude (degrees) to draw only nomenclature along the terminator.
546
void NomenclatureMgr::setTerminatorMinAltitude(int deg)
×
547
{
548
        if (deg!=NomenclatureItem::terminatorMinAltitude)
×
549
        {
550
                NomenclatureItem::terminatorMinAltitude=qBound(-90, deg, 90);
×
551
                StelApp::immediateSave("astro/planet_nomenclature_solar_altitude_min", NomenclatureItem::terminatorMinAltitude);
×
552
                emit terminatorMinAltitudeChanged(NomenclatureItem::terminatorMinAltitude);
×
553
        }
554
}
×
555
// Get minimum solar altitude (degrees) to draw only nomenclature along the terminator.
556
int NomenclatureMgr::getTerminatorMinAltitude() const
×
557
{
558
        return NomenclatureItem::terminatorMinAltitude;
×
559
}
560

561
// Set maximum solar altitude (degrees) to draw only nomenclature along the terminator.
562
void NomenclatureMgr::setTerminatorMaxAltitude(int deg)
×
563
{
564
        if (deg!=NomenclatureItem::terminatorMaxAltitude)
×
565
        {
566
                NomenclatureItem::terminatorMaxAltitude=qBound(-90, deg, 90);
×
567
                StelApp::immediateSave("astro/planet_nomenclature_solar_altitude_max", NomenclatureItem::terminatorMaxAltitude);
×
568
                emit terminatorMaxAltitudeChanged(NomenclatureItem::terminatorMaxAltitude);
×
569
        }
570
}
×
571
// Get maximum solar altitude (degrees) to draw only nomenclature along the terminator.
572
int NomenclatureMgr::getTerminatorMaxAltitude() const
×
573
{
574
        return NomenclatureItem::terminatorMaxAltitude;
×
575
}
576

577
void NomenclatureMgr::setFlagOutlineCraters(bool b)
×
578
{
579
        NomenclatureItem::flagOutlineCraters = b;
×
580
        StelApp::immediateSave("astro/flag_planets_nomenclature_outline_craters", b);
×
581
        emit flagOutlineCratersChanged(b);
×
582
}
×
583

584
bool NomenclatureMgr::getFlagOutlineCraters() const
×
585
{
586
        return NomenclatureItem::flagOutlineCraters;
×
587
}
588

589
void NomenclatureMgr::setFlagHideLocalNomenclature(bool b)
×
590
{
591
        NomenclatureItem::hideLocalNomenclature = b;
×
592
        StelApp::immediateSave("astro/flag_hide_local_nomenclature", b);
×
593
        emit localNomenclatureHidingChanged(b);
×
594
}
×
595

596
bool NomenclatureMgr::getFlagHideLocalNomenclature() const
×
597
{
598
        return NomenclatureItem::hideLocalNomenclature;
×
599
}
600

601
void NomenclatureMgr::setFlagShowSpecialNomenclatureOnly(bool b)
×
602
{
603
        NomenclatureItem::showSpecialNomenclatureOnly = b;
×
604
        StelApp::immediateSave("astro/flag_special_nomenclature_only", b);
×
605
        emit specialNomenclatureOnlyDisplayingChanged(b);
×
606
}
×
607

608
bool NomenclatureMgr::getFlagShowSpecialNomenclatureOnly() const
×
609
{
610
        return NomenclatureItem::showSpecialNomenclatureOnly;
×
611
}
612

613
// Update i18 names from english names according to current sky culture translator
614
void NomenclatureMgr::updateI18n()
×
615
{
616
        NomenclatureItem::createNameLists();
×
617
        const StelTranslator& trans = StelApp::getInstance().getLocaleMgr().getPlanetaryFeaturesTranslator();
×
618
        const StelTranslator& transSpecial = StelApp::getInstance().getLocaleMgr().getAppStelTranslator();
×
619
        for (const auto& i : std::as_const(nomenclatureItems))
×
620
        {
621
                NomenclatureItem::NomenclatureItemType niType = i->getNomenclatureType();
×
622
                if (niType>=NomenclatureItem::niSpecialPointPole)
×
623
                        i->translateName(transSpecial);
×
624
                else
625
                        i->translateName(trans);
×
626
        }
627
}
×
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