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

Stellarium / stellarium / 15670918640

16 Jun 2025 02:08AM UTC coverage: 11.775% (-0.2%) from 11.931%
15670918640

push

github

alex-w
Updated data

14700 of 124846 relevant lines covered (11.77%)

18324.52 hits per line

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

0.0
/src/core/modules/GridLinesMgr.cpp
1
/*
2
 * Stellarium
3
 * Copyright (C) 2007 Fabien Chereau
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 "GridLinesMgr.hpp"
21
#include "StelApp.hpp"
22
#include "StelLocaleMgr.hpp"
23
#include "StelUtils.hpp"
24
#include "StelTranslator.hpp"
25
#include "StelProjector.hpp"
26
#include "StelFader.hpp"
27
#include "Planet.hpp"
28
#include "SolarSystem.hpp"
29
#include "StelModuleMgr.hpp"
30
#include "StelCore.hpp"
31
#include "StelObserver.hpp"
32
#include "StelPainter.hpp"
33
#include "StelTextureMgr.hpp"
34
#include "StelFileMgr.hpp"
35
#include "StelMovementMgr.hpp"
36
#include "precession.h"
37

38
#include <vector>
39
#include <QSettings>
40
#include <QDebug>
41
#include <QFontMetrics>
42

43
//! @class SkyGrid
44
//! Class which manages a grid to display in the sky.
45
class SkyGrid
46
{
47
public:
48
        // Create and precompute positions of a SkyGrid
49
        SkyGrid(StelCore::FrameType frame);
50
        virtual ~SkyGrid();
51
        void draw(const StelCore* prj) const;
52
        void setFontSize(int newFontSize);
53
        void setColor(const Vec3f& c) {color = c;}
×
54
        const Vec3f& getColor() const {return color;}
×
55
        void update(double deltaTime) {fader.update(static_cast<int>(deltaTime*1000));}
×
56
        void setFadeDuration(float duration) {fader.setDuration(static_cast<int>(duration*1000.f));}
57
        void setDisplayed(const bool displayed){fader = displayed;}
×
58
        bool isDisplayed() const {return fader;}
×
59
        void setLineThickness(const float thickness) {lineThickness = thickness;}
×
60
        float getLineThickness() const {return lineThickness;}
×
61
private:
62
        Vec3f color;
63
        StelCore::FrameType frameType;
64
        QFont font;
65
        LinearFader fader;
66
        float lineThickness;
67
};
68

69
//! @class SkyPoint
70
//! Class which manages a point to display around the sky like the North Celestial Pole.
71
class SkyPoint
72
{
73
public:
74
        enum SKY_POINT_TYPE
75
        {
76
                CELESTIALPOLES_J2000,
77
                CELESTIALPOLES_OF_DATE,
78
                ZENITH_NADIR,
79
                ECLIPTICPOLES_J2000,
80
                ECLIPTICPOLES_OF_DATE,
81
                GALACTICPOLES,
82
                GALACTICCENTER,
83
                SUPERGALACTICPOLES,
84
                EQUINOXES_J2000,
85
                EQUINOXES_OF_DATE,
86
                SOLSTICES_J2000,
87
                SOLSTICES_OF_DATE,
88
                ANTISOLAR,
89
                EARTH_UMBRA_CENTER,
90
                APEX
91
        };
92
        // Create and precompute positions of a SkyGrid
93
        SkyPoint(SKY_POINT_TYPE _point_type = CELESTIALPOLES_J2000);
94
        virtual ~SkyPoint();
95
        void draw(StelCore* core) const;
96
        void setColor(const Vec3f& c) {color = c;}
×
97
        const Vec3f& getColor() const {return color;}
×
98
        void update(double deltaTime) {fader.update(static_cast<int>(deltaTime*1000));}
×
99
        void setFadeDuration(float duration) {fader.setDuration(static_cast<int>(duration*1000.f));}
100
        void setDisplayed(const bool displayed){fader = displayed;}
×
101
        bool isDisplayed() const {return fader;}
×
102
        void setFontSize(int newSize);
103
        //! Re-translates the label.
104
        void updateLabel();
105
private:
106
        QSharedPointer<Planet> earth, sun;
107
        SKY_POINT_TYPE point_type;
108
        Vec3f color;
109
        StelCore::FrameType frameType;
110
        LinearFader fader;
111
        QFont font;
112
        QString northernLabel, southernLabel;
113
        StelTextureSP texCross;
114
};
115

116

117

118
// rms added color as parameter
119
SkyGrid::SkyGrid(StelCore::FrameType frame) : color(0.2f,0.2f,0.2f), frameType(frame), lineThickness(1)
×
120
{
121
        // Font size is 12
122
        font.setPixelSize(StelApp::getInstance().getScreenFontSize()-1);
×
123
}
×
124

125
SkyGrid::~SkyGrid()
×
126
{
127
}
×
128

129
void SkyGrid::setFontSize(int newFontSize)
×
130
{
131
        font.setPixelSize(newFontSize);
×
132
}
×
133

134
// Step sizes in arcsec
135
static const double STEP_SIZES_DMS[] = {0.05, 0.2, 1., 5., 10., 60., 300., 600., 1200., 3600., 3600.*5., 3600.*10.};
136
static const double STEP_SIZES_HMS[] = {0.05, 0.2, 1.5, 7.5, 15., 15.*5., 15.*10., 15.*60., 15.*60.*5., 15.*60*10., 15.*60*60};
137

138
//! Return the angular grid step in degree which best fits the given scale
139
static double getClosestResolutionDMS(double pixelPerRad)
×
140
{
141
        double minResolution = 80.;
×
142
        double minSizeArcsec = minResolution/pixelPerRad*M_180_PI*3600;
×
143
        for (unsigned int i=0;i<12;++i)
×
144
        {
145
                if (STEP_SIZES_DMS[i]>minSizeArcsec)
×
146
                        return STEP_SIZES_DMS[i]/3600.;
×
147
        }
148
        return 10.;
×
149
}
150

151
//! Return the angular grid step in degree which best fits the given scale
152
static double getClosestResolutionHMS(double pixelPerRad)
×
153
{
154
        double minResolution = 80.;
×
155
        double minSizeArcsec = minResolution/pixelPerRad*M_180_PI*3600;
×
156
        for (unsigned int i=0;i<11;++i)
×
157
        {
158
                if (STEP_SIZES_HMS[i]>minSizeArcsec)
×
159
                        return STEP_SIZES_HMS[i]/3600.;
×
160
        }
161
        return 15.;
×
162
}
163

164
struct ViewportEdgeIntersectCallbackData
165
{
166
        ViewportEdgeIntersectCallbackData(StelPainter* p)
×
167
                : sPainter(p)
×
168
                , raAngle(0.0)
×
169
                , gridStepMeridianRad(0.1)
×
170
                , frameType(StelCore::FrameUninitialized) {}
×
171
        StelPainter* sPainter;
172
        Vec4f textColor;
173
        QString text;                // Label to display at the intersection of the lines and screen side
174
        double raAngle;                // Used for meridians
175
        double gridStepMeridianRad; // used as rounding threshold
176
        StelCore::FrameType frameType;
177
};
178

179
// Callback which draws the label of the grid
180
void viewportEdgeIntersectCallback(const Vec3d& screenPos, const Vec3d& direction, void* userData)
×
181
{
182
        ViewportEdgeIntersectCallbackData* d = static_cast<ViewportEdgeIntersectCallbackData*>(userData);
×
183
        const Vec4f tmpColor = d->sPainter->getColor();
×
184
        d->sPainter->setColor(d->textColor);
×
185
        const bool withDecimalDegree = StelApp::getInstance().getFlagShowDecimalDegrees();
×
186
        const bool useSouthAzimuth = StelApp::getInstance().getFlagSouthAzimuthUsage();
×
187
        const float ppx = static_cast<float>(d->sPainter->getProjector()->getDevicePixelsPerPixel());
×
188

189
        const int viewportWidth  = d->sPainter->getProjector()->getViewportWidth();
×
190
        const int viewportHeight = d->sPainter->getProjector()->getViewportHeight();
×
191

192
        QString text;
×
193
        if (d->text.isEmpty())
×
194
        {
195
                // We are in the case of meridians, we need to determine which of the 2 labels (3h or 15h) to use
196
                Vec3d tmpV;
×
197
                d->sPainter->getProjector()->unProject(screenPos, tmpV);
×
198
                double lon, lat, textAngle, raAngle;
199
                StelUtils::rectToSphe(&lon, &lat, tmpV);
×
200
                switch (d->frameType)
×
201
                {
202
                        case StelCore::FrameAltAz:
×
203
                        {
204
                                raAngle = ::fmod(M_PI-d->raAngle,2.*M_PI);
×
205
                                lon = ::fmod(M_PI-lon,2.*M_PI);
×
206

207
                                if (std::fabs(2.*M_PI-lon)<0.001) // We are at meridian 0
×
208
                                        lon = 0.;
×
209

210
                                const double delta = raAngle<M_PI ? M_PI : -M_PI;                                
×
211
                                if (std::fabs(lon-raAngle) < 0.01 || (lon==0. && !qFuzzyCompare(raAngle, M_PI)))
×
212
                                        textAngle = raAngle;
×
213
                                else
214
                                        textAngle = raAngle+delta;
×
215

216
                                if (qFuzzyCompare(raAngle, 2*M_PI) && qFuzzyCompare(delta, -M_PI))
×
217
                                        textAngle = 0;
×
218

219
                                if (useSouthAzimuth)
×
220
                                        textAngle += M_PI;
×
221

222
                                if (withDecimalDegree)
×
223
                                        text = StelUtils::radToDecDegStr(textAngle, 4, false, true);
×
224
                                else
225
                                        text = StelUtils::radToDmsStrAdapt(textAngle);
×
226

227
                                break;                        
×
228
                        }
229
                        default:
×
230
                        {
231
                                raAngle = StelUtils::fmodpos(d->raAngle, 2.*M_PI);
×
232
                                lon = StelUtils::fmodpos(lon, 2.*M_PI);
×
233

234
                                if (std::fabs(2.*M_PI-lon)<d->gridStepMeridianRad/250.) // We are at meridian 0
×
235
                                        lon = 0.;
×
236

237
                                const double delta = raAngle<M_PI ? M_PI : -M_PI;
×
238
                                if (std::fabs(lon-raAngle) < 1. || lon==0.)
×
239
                                        textAngle = raAngle;
×
240
                                else
241
                                        textAngle = raAngle+delta;
×
242

243
                                if (qFuzzyCompare(raAngle, 2*M_PI) && qFuzzyCompare(delta, -M_PI))
×
244
                                        textAngle = 0;
×
245

246
                                if (d->frameType==StelCore::FrameFixedEquatorial)
×
247
                                        textAngle=2.*M_PI-textAngle;
×
248

249

250
                                textAngle=StelUtils::fmodpos(textAngle, 2.*M_PI);
×
251
                                if (withDecimalDegree)
×
252
                                        text = StelUtils::radToDecDegStr(textAngle, 4, false, true);
×
253
                                else
254
                                {
255
                                        if (QList<StelCore::FrameType>{StelCore::FrameObservercentricEclipticJ2000, StelCore::FrameObservercentricEclipticOfDate,
×
256
                                                StelCore::FrameGalactic, StelCore::FrameSupergalactic}.contains(d->frameType))
×
257
                                                text = StelUtils::radToDmsStrAdapt(textAngle);
×
258
                                        else
259
                                                text = StelUtils::radToHmsStrAdapt(textAngle);
×
260
                                }
261
                        }
262
                }
263
        }
264
        else if (d->text==".")
×
265
                text=QString();
×
266
        else
267
                text = d->text;
×
268

269
        Vec3f direc=direction.toVec3f();        
×
270
        direc.normalize();        
×
271
        float angleDeg = std::atan2(-direc[1], -direc[0])*M_180_PIf;
×
272
        float xshift=6.f;
×
273
        float yshift=6.f;
×
274
        if (angleDeg>90.f || angleDeg<-90.f)
×
275
        {
276
                angleDeg+=180.f;
×
277
                xshift=-(static_cast<float>(d->sPainter->getFontMetrics().boundingRect(text).width()) + xshift*ppx);
×
278
        }
279
        // DEBUG INFO ONLY!
280
        //text=QString(" <:%1°").arg(QString::number(angleDeg, 'f', 2));
281
        //text.append(QString(" <:%1° %2/%3 (%4x%5)").arg(QString::number(angleDeg, 'f', 2), QString::number(screenPos[0], 'f', 2), QString::number(screenPos[1], 'f', 2),
282
        //                QString::number(viewportWidth),        QString::number(viewportHeight)));
283
        if ((fabs(screenPos[0])<1.) && (angleDeg>0.f )) // LEFT
×
284
        {
285
                xshift+=0.5f*tan(angleDeg*M_PI_180f)*d->sPainter->getFontMetrics().boundingRect(text).height();
×
286
        }
287
        else if ((fabs(screenPos[0]-viewportWidth)<1.) && (angleDeg>180.f )) // RIGHT
×
288
        {
289
                xshift += 0.5 * tan(angleDeg*M_PI_180f)*d->sPainter->getFontMetrics().boundingRect(text).height();
×
290
        }
291
        else if ((fabs(screenPos[1]-viewportHeight)<1.) && fabs(angleDeg)>5.f) // TOP
×
292
        {
293
                const float sign = angleDeg<-90.f ? 0.5f : -0.5f;
×
294
                xshift += sign * (1./tan(angleDeg*M_PI_180f))*d->sPainter->getFontMetrics().boundingRect(text).height();
×
295
        }
296
        // It seems bottom edge is always OK!
297

298
        d->sPainter->drawText(static_cast<float>(screenPos[0]), static_cast<float>(screenPos[1]), text, angleDeg, xshift*ppx, yshift*ppx);
×
299
        d->sPainter->setColor(tmpColor);
×
300
}
×
301

302
//! Draw the sky grid in the current frame
303
void SkyGrid::draw(const StelCore* core) const
×
304
{
305
        if (fader.getInterstate() <= 0.f)
×
306
                return;
×
307

308
        const StelProjectorP prj = core->getProjection(frameType, (frameType!=StelCore::FrameAltAz && frameType!=StelCore::FrameFixedEquatorial) ? StelCore::RefractionAuto : StelCore::RefractionOff);
×
309
        const bool withDecimalDegree = StelApp::getInstance().getFlagShowDecimalDegrees();
×
310

311
        // Look for all meridians and parallels intersecting with the disk bounding the viewport
312
        // Check whether the pole are in the viewport
313
        Vec3f win;
×
314
        const bool northPoleInViewport = (prj->project(Vec3f(0,0,1), win) && prj->checkInViewport(win));
×
315
        const bool southPoleInViewport = (prj->project(Vec3f(0,0,-1), win) && prj->checkInViewport(win));
×
316
        // Get the longitude and latitude resolution at the center of the viewport
317
        Vec3d centerV;
×
318
        prj->unProject(prj->getViewportPosX()+prj->getViewportWidth()/2., prj->getViewportPosY()+prj->getViewportHeight()/2.+1., centerV);
×
319
        double lon2, lat2;
320
        StelUtils::rectToSphe(&lon2, &lat2, centerV);
×
321

322
        const double gridStepParallelRad = M_PI_180*getClosestResolutionDMS(static_cast<double>(prj->getPixelPerRadAtCenter()));
×
323
        double gridStepMeridianRad;
324
        if (northPoleInViewport || southPoleInViewport)
×
325
                gridStepMeridianRad = (frameType==StelCore::FrameAltAz) ? M_PI_180 * 10. : M_PI_180 * 15.;
×
326
        else
327
        {
328
                const double closestResLon = (frameType==StelCore::FrameAltAz) ?
×
329
                                        getClosestResolutionDMS(static_cast<double>(prj->getPixelPerRadAtCenter())*std::cos(lat2)) :
×
330
                                        getClosestResolutionHMS(static_cast<double>(prj->getPixelPerRadAtCenter())*std::cos(lat2));
×
331
                gridStepMeridianRad = M_PI_180 * closestResLon;
×
332
        }
333

334
        // Get the bounding halfspace
335
        const SphericalCap& viewPortSphericalCap = prj->getBoundingCap();
×
336

337
        // Compute the first grid starting point. This point is close to the center of the screen
338
        // and lies at the intersection of a meridian and a parallel
339
        lon2 = gridStepMeridianRad*(static_cast<int>(lon2/gridStepMeridianRad+0.5));
×
340
        lat2 = gridStepParallelRad*(static_cast<int>(lat2/gridStepParallelRad+0.5));
×
341
        Vec3d firstPoint;
×
342
        StelUtils::spheToRect(lon2, lat2, firstPoint);
×
343
        firstPoint.normalize();
×
344

345
        // Q_ASSERT(viewPortSphericalCap.contains(firstPoint));
346

347
        // Initialize a painter and set OpenGL state
348
        StelPainter sPainter(prj);
×
349
        sPainter.setBlending(true);
×
350
        if (lineThickness>1.f)
×
351
                sPainter.setLineWidth(lineThickness); // set line thickness
×
352
        sPainter.setLineSmooth(true);
×
353
        sPainter.setColor(color, fader.getInterstate());
×
354
        sPainter.setFont(font);
×
355

356
        ViewportEdgeIntersectCallbackData userData(&sPainter);
×
357
        // make text colors just a bit brighter. (But if >1, QColor::setRgb fails and makes text invisible.)
358
        userData.textColor.set(qMin(1.0f, 1.25f*color[0]), qMin(1.0f, 1.25f*color[1]), qMin(1.0f, 1.25f*color[2]), fader.getInterstate());
×
359
        userData.frameType = frameType;
×
360
        userData.gridStepMeridianRad = gridStepMeridianRad;
×
361

362
        /////////////////////////////////////////////////
363
        // Draw all the meridians (great circles)
364
        SphericalCap meridianSphericalCap(Vec3d(1,0,0), 0);
×
365
        Mat4d rotLon = Mat4d::zrotation(gridStepMeridianRad);
×
366
        Vec3d fpt = firstPoint;
×
367
        Vec3d p1, p2;
×
368
        int maxNbIter = static_cast<int>(M_PI/gridStepMeridianRad);
×
369
        int i;
370
        for (i=0; i<maxNbIter; ++i)
×
371
        {
372
                StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
373
                userData.raAngle = fabs(lon2)<1.e-12 ? 0. : lon2; // Get rid of stupid noise
×
374

375
                meridianSphericalCap.n = fpt^Vec3d(0,0,1);
×
376
                meridianSphericalCap.n.normalize();
×
377
                if (!SphericalCap::intersectionPoints(viewPortSphericalCap, meridianSphericalCap, p1, p2))
×
378
                {
379
                        if (viewPortSphericalCap.d<meridianSphericalCap.d && viewPortSphericalCap.contains(meridianSphericalCap.n))
×
380
                        {
381
                                // The meridian is fully included in the viewport, draw it in 3 sub-arcs to avoid length > 180.
382
                                const Mat4d& rotLon120 = Mat4d::rotation(meridianSphericalCap.n, 120.*M_PI/180.);
×
383
                                Vec3d rotFpt=fpt;
×
384
                                rotFpt.transfo4d(rotLon120);
×
385
                                Vec3d rotFpt2=rotFpt;
×
386
                                rotFpt2.transfo4d(rotLon120);
×
387
                                sPainter.drawGreatCircleArc(fpt, rotFpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
388
                                sPainter.drawGreatCircleArc(rotFpt, rotFpt2, nullptr, viewportEdgeIntersectCallback, &userData);
×
389
                                sPainter.drawGreatCircleArc(rotFpt2, fpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
390
                                fpt.transfo4d(rotLon);
×
391
                                continue;
×
392
                        }
×
393
                        else
394
                                break;
×
395
                }
396

397
                Vec3d middlePoint = p1+p2;
×
398
                middlePoint.normalize();
×
399
                if (!viewPortSphericalCap.contains(middlePoint))
×
400
                        middlePoint*=-1.;
×
401

402
                // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
403
                sPainter.drawGreatCircleArc(p1, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
404
                sPainter.drawGreatCircleArc(p2, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
405

406
                fpt.transfo4d(rotLon);
×
407
        }
408

409
        if (i!=maxNbIter)
×
410
        {
411
                rotLon = Mat4d::zrotation(-gridStepMeridianRad);
×
412
                fpt = firstPoint;
×
413
                fpt.transfo4d(rotLon);
×
414
                for (int j=0; j<maxNbIter-i; ++j)
×
415
                {
416
                        StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
417
                        userData.raAngle = fabs(lon2)<1.e-12 ? 0. : lon2; // Get rid of stupid noise
×
418

419
                        meridianSphericalCap.n = fpt^Vec3d(0,0,1);
×
420
                        meridianSphericalCap.n.normalize();
×
421
                        if (!SphericalCap::intersectionPoints(viewPortSphericalCap, meridianSphericalCap, p1, p2))
×
422
                                break;
×
423

424
                        Vec3d middlePoint = p1+p2;
×
425
                        middlePoint.normalize();
×
426
                        if (!viewPortSphericalCap.contains(middlePoint))
×
427
                                middlePoint*=-1;
×
428

429
                        sPainter.drawGreatCircleArc(p1, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
430
                        sPainter.drawGreatCircleArc(p2, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
431

432
                        fpt.transfo4d(rotLon);
×
433
                }
434
        }
435

436
        /////////////////////////////////////////////////
437
        // Draw all the parallels (small circles)
438
        SphericalCap parallelSphericalCap(Vec3d(0,0,1), 0);
×
439
        rotLon = Mat4d::rotation(firstPoint^Vec3d(0,0,1), gridStepParallelRad);
×
440
        fpt = firstPoint;
×
441
        maxNbIter = static_cast<int>(M_PI/gridStepParallelRad)-1;
×
442
        for (i=0; i<maxNbIter; ++i)
×
443
        {
444
                StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
445
                if (withDecimalDegree)
×
446
                        userData.text = StelUtils::radToDecDegStr(lat2);
×
447
                else
448
                        userData.text = StelUtils::radToDmsStrAdapt(lat2);
×
449

450
                parallelSphericalCap.d = fpt[2];
×
451
                if (parallelSphericalCap.d>0.9999999)
×
452
                        break;
×
453

454
                const Vec3d rotCenter(0,0,parallelSphericalCap.d);
×
455
                if (!SphericalCap::intersectionPoints(viewPortSphericalCap, parallelSphericalCap, p1, p2))
×
456
                {
457
                        if ((viewPortSphericalCap.d<parallelSphericalCap.d && viewPortSphericalCap.contains(parallelSphericalCap.n))
×
458
                                || (viewPortSphericalCap.d<-parallelSphericalCap.d && viewPortSphericalCap.contains(-parallelSphericalCap.n)))
×
459
                        {
460
                                // The parallel is fully included in the viewport, draw it in 3 sub-arcs to avoid lengths >= 180 deg
461
                                static const Mat4d rotLon120 = Mat4d::zrotation(120.*M_PI/180.);
×
462
                                Vec3d rotFpt=fpt;
×
463
                                rotFpt.transfo4d(rotLon120);
×
464
                                Vec3d rotFpt2=rotFpt;
×
465
                                rotFpt2.transfo4d(rotLon120);
×
466
                                sPainter.drawSmallCircleArc(fpt, rotFpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
467
                                sPainter.drawSmallCircleArc(rotFpt, rotFpt2, rotCenter, viewportEdgeIntersectCallback, &userData);
×
468
                                sPainter.drawSmallCircleArc(rotFpt2, fpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
469
                                fpt.transfo4d(rotLon);
×
470
                                continue;
×
471
                        }
×
472
                        else
473
                                break;
×
474
                }
475

476
                // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
477
                Vec3d middlePoint = p1-rotCenter+p2-rotCenter;
×
478
                middlePoint.normalize();
×
479
                middlePoint*=(p1-rotCenter).norm();
×
480
                middlePoint+=rotCenter;
×
481
                if (!viewPortSphericalCap.contains(middlePoint))
×
482
                {
483
                        middlePoint-=rotCenter;
×
484
                        middlePoint*=-1.;
×
485
                        middlePoint+=rotCenter;
×
486
                }
487

488
                sPainter.drawSmallCircleArc(p1, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
489
                sPainter.drawSmallCircleArc(p2, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
490

491
                fpt.transfo4d(rotLon);
×
492
        }
493

494
        if (i!=maxNbIter)
×
495
        {
496
                rotLon = Mat4d::rotation(firstPoint^Vec3d(0,0,1), -gridStepParallelRad);
×
497
                fpt = firstPoint;
×
498
                fpt.transfo4d(rotLon);
×
499
                for (int j=0; j<maxNbIter-i; ++j)
×
500
                {
501
                        StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
502
                        if (withDecimalDegree)
×
503
                                userData.text = StelUtils::radToDecDegStr(lat2);
×
504
                        else
505
                                userData.text = StelUtils::radToDmsStrAdapt(lat2);
×
506

507
                        parallelSphericalCap.d = fpt[2];
×
508
                        const Vec3d rotCenter(0,0,parallelSphericalCap.d);
×
509
                        if (!SphericalCap::intersectionPoints(viewPortSphericalCap, parallelSphericalCap, p1, p2))
×
510
                        {
511
                                if ((viewPortSphericalCap.d<parallelSphericalCap.d && viewPortSphericalCap.contains(parallelSphericalCap.n))
×
512
                                         || (viewPortSphericalCap.d<-parallelSphericalCap.d && viewPortSphericalCap.contains(-parallelSphericalCap.n)))
×
513
                                {
514
                                        // The parallel is fully included in the viewport, draw it in 3 sub-arcs to avoid lengths >= 180 deg
515
                                        static const Mat4d rotLon120 = Mat4d::zrotation(120.*M_PI/180.);
×
516
                                        Vec3d rotFpt=fpt;
×
517
                                        rotFpt.transfo4d(rotLon120);
×
518
                                        Vec3d rotFpt2=rotFpt;
×
519
                                        rotFpt2.transfo4d(rotLon120);
×
520
                                        sPainter.drawSmallCircleArc(fpt, rotFpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
521
                                        sPainter.drawSmallCircleArc(rotFpt, rotFpt2, rotCenter, viewportEdgeIntersectCallback, &userData);
×
522
                                        sPainter.drawSmallCircleArc(rotFpt2, fpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
523
                                        fpt.transfo4d(rotLon);
×
524
                                        continue;
×
525
                                }
×
526
                                else
527
                                        break;
×
528
                        }
529

530
                        // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
531
                        Vec3d middlePoint = p1-rotCenter+p2-rotCenter;
×
532
                        middlePoint.normalize();
×
533
                        middlePoint*=(p1-rotCenter).norm();
×
534
                        middlePoint+=rotCenter;
×
535
                        if (!viewPortSphericalCap.contains(middlePoint))
×
536
                        {
537
                                middlePoint-=rotCenter;
×
538
                                middlePoint*=-1.;
×
539
                                middlePoint+=rotCenter;
×
540
                        }
541

542
                        sPainter.drawSmallCircleArc(p1, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
543
                        sPainter.drawSmallCircleArc(p2, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
544

545
                        fpt.transfo4d(rotLon);
×
546
                }
547
        }
548

549
        if (lineThickness>1)
×
550
                sPainter.setLineWidth(1); // reset thickness of line
×
551
        sPainter.setLineSmooth(false);
×
552
}
×
553

554
SkyLine::SkyLine(SKY_LINE_TYPE _line_type) : line_type(_line_type), color(0.f, 0.f, 1.f), lineThickness(1), partThickness(1), showPartitions(true), showLabel(true), culturalOffset(0.0)
×
555
{
556
        // Font size is 14
557
        font.setPixelSize(StelApp::getInstance().getScreenFontSize()+1);
×
558
        updateLabel();
×
559
}
×
560

561
// Contains ecliptic rotations from -13000, -12900, ... , +13000
562
QMap<int, double> SkyLine::precessionPartitions;
563
// Contains ecliptic partitions {eclLongitude, aberration, nutation} with labels for the current year
564
std::vector<QPair<Vec3d, QString>> SkyLine::eclipticOnDatePartitions;
565
QSharedPointer<Planet> SkyLine::earth, SkyLine::sun, SkyLine::moon;
566

567
//! call once before creating the first line.
568
void SkyLine::init()
×
569
{
570
        setSolarSystem(GETSTELMODULE(SolarSystem));
×
571
        // The years for the precession circles start in -13000, this is 15000 before J2000.
572
        for (int y=-13000; y<=17000; y+=100) // Range of DE431. Maybe extend to -50000..+50000?
×
573
        {
574
                double jdY0, epsilonA, chiA, omegaA, psiA;
575
                StelUtils::getJDFromDate(&jdY0, y, 1, 0, 0, 0, 0); // JD of Jan.0.
×
576
                getPrecessionAnglesVondrak(jdY0, &epsilonA, &chiA, &omegaA, &psiA);
×
577
                precessionPartitions.insert(y, psiA); // Store only the value of shift along the ecliptic.
×
578
        }
579
        StelCore *core=StelApp::getInstance().getCore();
×
580
        const double jde=core->getJDE();
×
581
        int year, month, day;
582
        StelUtils::getDateFromJulianDay(jde, &year, &month, &day);
×
583
        computeEclipticDatePartitions(year);
×
584
}
×
585

586
void SkyLine::computeEclipticDatePartitions(int year)
×
587
{
588
        static GridLinesMgr* gMgr=GETSTELMODULE_SILENT(GridLinesMgr);
×
589
        if (gMgr && (! gMgr->getFlagEclipticDatesLabeled()))
×
590
                return;
×
591

592
        Q_ASSERT(earth);
×
593
        StelCore *core=StelApp::getInstance().getCore();
×
594
        eclipticOnDatePartitions.clear();
×
595

596
        if (year==std::numeric_limits<int>::min())
×
597
        {
598
                int m, d;
599
                StelUtils::getDateFromJulianDay(core->getJD(), &year, &m, &d);
×
600
        }
601
        const int lastDoY = (StelUtils::isLeapYear(year) ? 366 : 365);
×
602
        for (int day=1; day <= lastDoY; day++)
×
603
        {
604
                const Vec3i date=StelUtils::dateFromDayYear(day, year);
×
605
                double jd;
606
                StelUtils::getJDFromDate(&jd, year, date[1], date[2], 0, 0, 0.f);
×
607
                const double tzOffset=core->getUTCOffset(jd)/24.;
×
608
                const double jde=jd+core->getDeltaT()/86400.-tzOffset;
×
609
                Vec3d earthPos=earth->getEclipticPos(jde); // J2000 position!
×
610
                double lng, lat, r;
611
                StelUtils::rectToSphe(&lng, &lat, &r, earthPos);
×
612
                lng+=M_PI; lat*=-1.; // derive Solar data from this.
×
613
                double epsilonA, chiA, omegaA, psiA;
614
                getPrecessionAnglesVondrak(jde, &epsilonA, &chiA, &omegaA, &psiA);
×
615
                lng+=psiA;
×
616
                double aberration=-20.4898/3600.*M_PI_180/r; // Meeus AA (25.10)
×
617
                double deltaEps, deltaPsi;
618
                getNutationAngles(jde, &deltaPsi, &deltaEps);
×
619

620
                QString label;
×
621
                if ((year==1582) && (date[1]==10))
×
622
                {
623
                        // Gregorian calendar reform. Duplicate ticks are harmless, but we must tweak date labels.
624
                        if (QList<int>{1, 4, 15, 20, 25}.contains(date[2]))
×
625
                                label=QString("%1.%2").arg(QString::number(date[2]), StelLocaleMgr::romanMonthName(date[1]));
×
626
                }
627
                else
628
                {
629
                        if (QList<int>{1, 5, 10, 15, 20, 25}.contains(date[2]))
×
630
                                label=QString("%1.%2").arg(QString::number(date[2]), StelLocaleMgr::romanMonthName(date[1]));
×
631
                }
632
                eclipticOnDatePartitions.push_back({Vec3d(lng, aberration, deltaPsi), label});
×
633
        }
×
634
}
635

636
void SkyLine::setSolarSystem(SolarSystem* ss)
×
637
{
638
        earth = ss->getEarth();
×
639
        sun   = ss->getSun();
×
640
        moon  = ss->getMoon();
×
641
}
×
642

643
void SkyLine::deinit()
×
644
{
645
        earth = nullptr;
×
646
        sun   = nullptr;
×
647
        moon  = nullptr;
×
648
}
×
649

650
SkyLine::~SkyLine()
×
651
{
652
}
×
653

654
void SkyLine::setFontSize(int newFontSize)
×
655
{
656
        font.setPixelSize(newFontSize);
×
657
}
×
658

659
void SkyLine::updateLabel()
×
660
{
661
        switch (line_type)
×
662
        {
663
                case MERIDIAN:
×
664
                        frameType = StelCore::FrameAltAz;
×
665
                        label = q_("Meridian");
×
666
                        break;
×
667
                case ECLIPTIC_J2000:
×
668
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
669
                        label = q_("Ecliptic of J2000.0");
×
670
                        break;
×
671
                case ECLIPTIC_OF_DATE:
×
672
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
673
                        label = q_("Ecliptic of Date");
×
674
                        break;
×
675
                case ECLIPTIC_WITH_DATE:
×
676
                case ECLIPTIC_CULTURAL:
677
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
678
                        label = "."; // No label: parallel to ecliptic.
×
679
                        break;
×
680
                case EQUATOR_J2000:
×
681
                        frameType = StelCore::FrameJ2000;
×
682
                        label = q_("Equator of J2000.0");
×
683
                        break;
×
684
                case EQUATOR_OF_DATE:
×
685
                        frameType = StelCore::FrameEquinoxEqu;
×
686
                        label = q_("Equator");
×
687
                        break;
×
688
                case EQUATORIAL_CULTURAL:
×
689
                        frameType = StelCore::FrameEquinoxEqu;
×
690
                        label = "."; // No label: parallel to equator.
×
691
                        break;
×
692
                case FIXED_EQUATOR:
×
693
                        frameType = StelCore::FrameFixedEquatorial; // Apparent Hour Angle is a non-refraction frame.
×
694
                        label = q_("Hour Angle");
×
695
                        break;
×
696
                case PRECESSIONCIRCLE_N:
×
697
                case PRECESSIONCIRCLE_S:
698
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
699
                        label = q_("Precession Circle");
×
700
                        break;
×
701
                case HORIZON:
×
702
                        frameType = StelCore::FrameAltAz;
×
703
                        label = q_("Horizon");
×
704
                        break;
×
705
                case GALACTICEQUATOR:
×
706
                        frameType = StelCore::FrameGalactic;
×
707
                        label = q_("Galactic Equator");
×
708
                        break;
×
709
                case SUPERGALACTICEQUATOR:
×
710
                        frameType = StelCore::FrameSupergalactic;
×
711
                        label = q_("Supergalactic Equator");
×
712
                        break;
×
713
                case LONGITUDE:
×
714
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
715
                        // TRANSLATORS: Full term is "opposition/conjunction longitude"
716
                        label = q_("O./C. longitude");
×
717
                        break;
×
718
                case QUADRATURE:
×
719
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
720
                        label = q_("Quadrature");
×
721
                        break;
×
722
                case PRIME_VERTICAL:
×
723
                        frameType=StelCore::FrameAltAz;
×
724
                        label = q_("Prime Vertical");
×
725
                        break;
×
726
                case CURRENT_VERTICAL:
×
727
                        frameType=StelCore::FrameAltAz;
×
728
                        label = q_("Altitude");
×
729
                        break;
×
730
                case COLURE_1:
×
731
                        frameType=StelCore::FrameEquinoxEqu;
×
732
                        label = q_("Equinoctial Colure");
×
733
                        break;
×
734
                case COLURE_2:
×
735
                        frameType=StelCore::FrameEquinoxEqu;
×
736
                        label = q_("Solstitial Colure");
×
737
                        break;
×
738
                case CIRCUMPOLARCIRCLE_N:
×
739
                case CIRCUMPOLARCIRCLE_S:
740
                        frameType = StelCore::FrameEquinoxEqu;
×
741
                        label = q_("Circumpolar Circle");
×
742
                        break;
×
743
                case EARTH_UMBRA:
×
744
                        frameType = StelCore::FrameHeliocentricEclipticJ2000;
×
745
                        label = q_("Umbra");
×
746
                        break;
×
747
                case EARTH_PENUMBRA:
×
748
                        frameType = StelCore::FrameHeliocentricEclipticJ2000;
×
749
                        label = q_("Penumbra");
×
750
                        break;
×
751
                case INVARIABLEPLANE:
×
752
                        frameType = StelCore::FrameJ2000;
×
753
                        label = q_("Invariable Plane");
×
754
                        break;
×
755
                case SOLAR_EQUATOR:
×
756
                        frameType = StelCore::FrameJ2000;
×
757
                        label = q_("Projected Solar Equator");
×
758
                        break;
×
759
        }
760
}
×
761

762
void SkyLine::draw(StelCore *core) const
×
763
{
764
        if (fader.getInterstate() <= 0.f)
×
765
                return;
×
766

767
        StelProjectorP prj = core->getProjection(frameType, (frameType!=StelCore::FrameAltAz && frameType!=StelCore::FrameFixedEquatorial) ? StelCore::RefractionAuto : StelCore::RefractionOff);
×
768

769
        // Initialize a painter and set openGL state
770
        StelPainter sPainter(prj);
×
771
        sPainter.setColor(color, fader.getInterstate());
×
772
        sPainter.setBlending(true);
×
773
        const float oldLineWidth=sPainter.getLineWidth();
×
774
        sPainter.setLineWidth(lineThickness); // set line thickness
×
775
        sPainter.setLineSmooth(true);
×
776
        sPainter.setFont(font);
×
777

778
        draw(sPainter, oldLineWidth);
×
779
}
×
780

781
void SkyLine::draw(StelPainter &sPainter, const float oldLineWidth) const
×
782
{
783
        static StelCore *core=StelApp::getInstance().getCore();
×
784
        StelProjectorP prj=sPainter.getProjector();
×
785
        // Get the bounding halfspace
786
        const SphericalCap& viewPortSphericalCap = prj->getBoundingCap();
×
787

788
        static StelMovementMgr *sMvMgr=GETSTELMODULE(StelMovementMgr);
×
789
        Q_ASSERT(sMvMgr);
×
790

791
        ViewportEdgeIntersectCallbackData userData(&sPainter);
×
792
        userData.textColor = Vec4f(color, fader.getInterstate());
×
793
        userData.text = label;
×
794
        double alt=0, az=0; // Required only for CURRENT_VERTICAL line. Will contain alt/az of view.
×
795
        /////////////////////////////////////////////////
796
        // Draw the line
797

798
        // Precession, Circumpolar and umbra circles are Small Circles, all others are Great Circles.
799
        if (QList<SKY_LINE_TYPE>({PRECESSIONCIRCLE_N, PRECESSIONCIRCLE_S, CIRCUMPOLARCIRCLE_N, CIRCUMPOLARCIRCLE_S, EARTH_UMBRA, EARTH_PENUMBRA}).contains(line_type))
×
800
        {
801
                // partitions for precession. (mark millennia!)
802
                double lat=0.;
×
803
                if (line_type==PRECESSIONCIRCLE_N || line_type==PRECESSIONCIRCLE_S)
×
804
                {
805
                        lat=(line_type==PRECESSIONCIRCLE_S ? -1.0 : 1.0) * (M_PI_2-getPrecessionAngleVondrakCurrentEpsilonA());
×
806
                }
807
                else if (line_type==CIRCUMPOLARCIRCLE_N || line_type==CIRCUMPOLARCIRCLE_S)
×
808
                {
809
                        const double obsLatRad=core->getCurrentLocation().getLatitude() * (M_PI_180);
×
810
                        if (obsLatRad == 0.)
×
811
                        {
812
                                sPainter.setLineWidth(oldLineWidth); // restore painter state
×
813
                                sPainter.setLineSmooth(false);
×
814
                                sPainter.setBlending(false);
×
815
                                return;
×
816
                        }
817
                        if (line_type==CIRCUMPOLARCIRCLE_N)
×
818
                                lat=(obsLatRad>0 ? -1.0 : +1.0) * obsLatRad + (M_PI_2);
×
819
                        else // southern circle
820
                                lat=(obsLatRad>0 ? +1.0 : -1.0) * obsLatRad - (M_PI_2);
×
821
                }
822

823
                if ((line_type==EARTH_UMBRA) || (line_type==EARTH_PENUMBRA))
×
824
                {
825
                        // resizing the shadow together with the Moon would require considerable trickery.
826
                        // It seems better to just switch it off.
827
                        static SolarSystem *sSystem=GETSTELMODULE(SolarSystem);
×
828
                        if (sSystem->getFlagMoonScale()) return;
×
829

830
                        // We compute the shadow circle attached to the geocenter, but must point it in the opposite direction of the sun's aberrated position.
831
                        const Vec3d pos=earth->getEclipticPos();
×
832
                        const Vec3d dir= - sun->getAberrationPush() + pos;
×
833
                        double lambda, beta;
834
                        StelUtils::rectToSphe(&lambda, &beta, dir);
×
835
                        const QPair<Vec3d, Vec3d> radii=sSystem->getEarthShadowRadiiAtLunarDistance();
×
836
                        const double radius=(line_type==EARTH_UMBRA ? radii.first[1] : radii.second[1]);
×
837
                        const double dist=moon->getEclipticPos().norm();  // geocentric Lunar distance [AU]
×
838
                        const Mat4d rot=Mat4d::zrotation(lambda)*Mat4d::yrotation(-beta);
×
839

840
                        StelVertexArray circle(StelVertexArray::LineLoop);
×
841
                        for (int i=0; i<360; ++i)
×
842
                        {
843
                                Vec3d point(dist, cos(i*M_PI_180)*radius, sin(i*M_PI_180)*radius); // disk towards First Point of Aries
×
844
                                rot.transfo(point);                                                // rotate towards earth position
×
845
                                circle.vertex.append(pos+point);                                   // attach to earth centre
×
846
                        }
847
                        sPainter.drawStelVertexArray(circle, true);
×
848

849
                        // Special case for Umbra and Penumbra labels
850
                        Vec3d point(dist, 0.0, 0.0);
×
851
                        rot.transfo(point);
×
852
                        const float shift=static_cast<float>(sPainter.getProjector()->getPixelPerRadAtCenter()*(line_type==EARTH_UMBRA ? radii.first[0] : radii.second[0]))*0.0000112f/M_PIf;
×
853
                        sPainter.drawText(pos+point, (line_type==EARTH_UMBRA ? q_("Umbra") : q_("Penumbra")), 0.f, shift, shift, false);
×
854
                        return;
×
855
                }
×
856
                else
857
                {
858
                        SphericalCap declinationCap(Vec3d(0,0,1), std::sin(lat));
×
859
                        const Vec3d rotCenter(0,0,declinationCap.d);
×
860

861
                        Vec3d p1, p2;
×
862
                        if (!SphericalCap::intersectionPoints(viewPortSphericalCap, declinationCap, p1, p2))
×
863
                        {
864
                                if ((viewPortSphericalCap.d<declinationCap.d && viewPortSphericalCap.contains(declinationCap.n))
×
865
                                                || (viewPortSphericalCap.d<-declinationCap.d && viewPortSphericalCap.contains(-declinationCap.n)))
×
866
                                {
867
                                        // The line is fully included in the viewport, draw it in 3 sub-arcs to avoid length > 180.
868
                                        Vec3d pt1, pt2, pt3;
×
869
                                        const double lon1=0.0;
×
870
                                        const double lon2=120.0*M_PI_180;
×
871
                                        const double lon3=240.0*M_PI_180;
×
872
                                        StelUtils::spheToRect(lon1, lat, pt1); pt1.normalize();
×
873
                                        StelUtils::spheToRect(lon2, lat, pt2); pt2.normalize();
×
874
                                        StelUtils::spheToRect(lon3, lat, pt3); pt3.normalize();
×
875

876
                                        sPainter.drawSmallCircleArc(pt1, pt2, rotCenter, viewportEdgeIntersectCallback, &userData);
×
877
                                        sPainter.drawSmallCircleArc(pt2, pt3, rotCenter, viewportEdgeIntersectCallback, &userData);
×
878
                                        sPainter.drawSmallCircleArc(pt3, pt1, rotCenter, viewportEdgeIntersectCallback, &userData);
×
879
                                }
880
                        }
881
                        else
882
                        {
883
                                // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
884
                                Vec3d middlePoint = p1-rotCenter+p2-rotCenter;
×
885
                                middlePoint.normalize();
×
886
                                middlePoint*=(p1-rotCenter).norm();
×
887
                                middlePoint+=rotCenter;
×
888
                                if (!viewPortSphericalCap.contains(middlePoint))
×
889
                                {
890
                                        middlePoint-=rotCenter;
×
891
                                        middlePoint*=-1.;
×
892
                                        middlePoint+=rotCenter;
×
893
                                }
894

895
                                sPainter.drawSmallCircleArc(p1, middlePoint, rotCenter,viewportEdgeIntersectCallback, &userData);
×
896
                                sPainter.drawSmallCircleArc(p2, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
897
                        }
898

899
                        if (showPartitions && (line_type==PRECESSIONCIRCLE_N))
×
900
                        {
901
                                const float lineThickness=sPainter.getLineWidth();
×
902
                                sPainter.setLineWidth(partThickness);
×
903

904
                                // Find current value of node rotation.
905
                                double epsilonA, chiA, omegaA, psiA;
906
                                getPrecessionAnglesVondrak(core->getJDE(), &epsilonA, &chiA, &omegaA, &psiA);
×
907
                                // psiA is the current angle, counted from J2000. Other century years have been precomputed in precessionPartitions.
908
                                // We cannot simply sum up the rotations, but must find the century locations one-by-one.
909

910
                                Vec3d part0; // current pole point on the northern precession circle.
×
911
                                StelUtils::spheToRect(0., M_PI/2.-core->getCurrentPlanet().data()->getRotObliquity(core->getJDE()), part0);
×
912
                                Vec3d partAxis(0,1,0);
×
913
                                Vec3d partZAxis = Vec3d(0,0,1); // rotation axis for the year partitions
×
914
                                Vec3d part100=part0;  part100.transfo4d(Mat4d::rotation(partAxis, 0.10*M_PI/180)); // part1 should point to 0.05deg south of "equator"
×
915
                                Vec3d part500=part0;  part500.transfo4d(Mat4d::rotation(partAxis, 0.25*M_PI/180));
×
916
                                Vec3d part1000=part0; part1000.transfo4d(Mat4d::rotation(partAxis, 0.45*M_PI/180));
×
917
                                Vec3d part1000l=part0; part1000l.transfo4d(Mat4d::rotation(partAxis, 0.475*M_PI/180)); // label
×
918

919
                                Vec3d pt0, ptTgt;
×
920
                                for (int y=-13000; y<13000; y+=100)
×
921
                                {
922
                                        const double tickAngle=M_PI_2+psiA-precessionPartitions.value(y, 0.);
×
923
                                        pt0=part0; pt0.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
924
                                        if (y%1000 == 0)
×
925
                                        {
926
                                                ptTgt=part1000; ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
927
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
928
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
929
                                                if (showLabel)
×
930
                                                {
931
                                                        Vec3d ptTgtL=part1000l; ptTgtL.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
932
                                                        QString label(QString::number(y));
×
933
                                                        Vec3d screenPosTgt, screenPosTgtL;
×
934
                                                        prj->project(ptTgt, screenPosTgt);
×
935
                                                        prj->project(ptTgtL, screenPosTgtL);
×
936
                                                        double dx=screenPosTgtL[0]-screenPosTgt[0];
×
937
                                                        double dy=screenPosTgtL[1]-screenPosTgt[1];
×
938
                                                        float textAngle=static_cast<float>(atan2(dy,dx));
×
939

940
                                                        const float shiftx = 2.f;
×
941
                                                        const float shifty = - static_cast<float>(sPainter.getFontMetrics().height()) / 4.f;
×
942
                                                        sPainter.drawText(ptTgt, label, textAngle*M_180_PIf, shiftx, shifty, true);
×
943
                                                }
×
944
                                        }
945
                                        else
946
                                        {
947
                                                ptTgt=(y%500 == 0 ? part500 : part100);
×
948
                                                ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
949
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
950
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
951
                                        }
952
                                }
953

954
                                sPainter.setLineWidth(lineThickness);
×
955
                        }
956
                        if (showPartitions && (line_type==PRECESSIONCIRCLE_S))
×
957
                        {
958
                                const float lineThickness=sPainter.getLineWidth();
×
959
                                sPainter.setLineWidth(partThickness);
×
960

961
                                // Find current value of node rotation.
962
                                double epsilonA, chiA, omegaA, psiA;
963
                                getPrecessionAnglesVondrak(core->getJDE(), &epsilonA, &chiA, &omegaA, &psiA);
×
964
                                // psiA is the current angle, counted from J2000. Other century years have been precomputed in precessionPartitions.
965
                                // We cannot simply sum up the rotations, but must find the century locations one-by-one.
966

967
                                Vec3d part0; // current pole point on the northern precession circle.
×
968
                                StelUtils::spheToRect(0., -M_PI/2.+core->getCurrentPlanet().data()->getRotObliquity(core->getJDE()), part0);
×
969
                                Vec3d partAxis(0,1,0);
×
970
                                Vec3d partZAxis = Vec3d(0,0,1); // rotation axis for the year partitions
×
971
                                Vec3d part100=part0;  part100.transfo4d(Mat4d::rotation(partAxis, -0.10*M_PI/180)); // part1 should point to 0.05deg south of "equator"
×
972
                                Vec3d part500=part0;  part500.transfo4d(Mat4d::rotation(partAxis, -0.25*M_PI/180));
×
973
                                Vec3d part1000=part0; part1000.transfo4d(Mat4d::rotation(partAxis, -0.45*M_PI/180));
×
974
                                Vec3d part1000l=part0; part1000.transfo4d(Mat4d::rotation(partAxis, -0.475*M_PI/180)); // label
×
975

976
                                Vec3d pt0, ptTgt;
×
977
                                for (int y=-13000; y<13000; y+=100)
×
978
                                {
979
                                        const double tickAngle=-M_PI_2+psiA-precessionPartitions.value(y, 0.);
×
980
                                        pt0=part0; pt0.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
981
                                        if (y%1000 == 0)
×
982
                                        {
983
                                                ptTgt=part1000; ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
984
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
985
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
986
                                                if (showLabel)
×
987
                                                {
988
                                                        Vec3d ptTgtL=part1000l; ptTgtL.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
989
                                                        QString label(QString::number(y));
×
990
                                                        Vec3d screenPosTgt, screenPosTgtL;
×
991
                                                        prj->project(ptTgt, screenPosTgt);
×
992
                                                        prj->project(ptTgtL, screenPosTgtL);
×
993
                                                        double dx=screenPosTgtL[0]-screenPosTgt[0];
×
994
                                                        double dy=screenPosTgtL[1]-screenPosTgt[1];
×
995
                                                        float textAngle=static_cast<float>(atan2(dy,dx));
×
996

997
                                                        const float shiftx = -5.f - static_cast<float>(sPainter.getFontMetrics().boundingRect(label).width());
×
998
                                                        const float shifty = - static_cast<float>(sPainter.getFontMetrics().height()) / 4.f;
×
999
                                                        sPainter.drawText(ptTgt, label, textAngle*M_180_PIf, shiftx, shifty, true);
×
1000
                                                }
×
1001
                                        }
1002
                                        else
1003
                                        {
1004
                                                ptTgt=(y%500 == 0 ? part500 : part100);
×
1005
                                                ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
1006
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
1007
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
1008
                                        }
1009
                                }
1010

1011
                                sPainter.setLineWidth(lineThickness);
×
1012
                        }
1013
                }
×
1014
                sPainter.setLineWidth(oldLineWidth); // restore line thickness
×
1015
                sPainter.setLineSmooth(false);
×
1016
                sPainter.setBlending(false);
×
1017

1018
                return;
×
1019
        }
1020

1021
        // All the other "lines" are Great Circles
1022
        SphericalCap sphericalCap(Vec3d(0,0,1), 0);
×
1023
        Vec3d fpt(1,0,0); // First Point
×
1024

1025
        if ((line_type==MERIDIAN) || (line_type==COLURE_1))
×
1026
        {
1027
                sphericalCap.n.set(0,1,0);
×
1028
        }
1029
        else if ((line_type==PRIME_VERTICAL) || (line_type==COLURE_2))
×
1030
        {
1031
                sphericalCap.n.set(1,0,0);
×
1032
                fpt.set(0,0,1);
×
1033
        }
1034
        else if (line_type==CURRENT_VERTICAL)
×
1035
        {
1036
                Vec3d coordJ2000=sMvMgr->getViewDirectionJ2000();
×
1037
                Vec3d coordAltAz=core->j2000ToAltAz(coordJ2000, StelCore::RefractionAuto);
×
1038
                StelUtils::rectToSphe(&az, &alt, coordAltAz);
×
1039
                sphericalCap.n.set(sin(-az), cos(-az), 0.);
×
1040
                fpt.set(0,0,1);
×
1041
        }
1042
        else if (line_type==LONGITUDE)
×
1043
        {
1044
                Vec3d coord;                
×
1045
                const double eclJDE = earth->getRotObliquity(core->getJDE());
×
1046
                double ra_equ, dec_equ, lambdaJDE, betaJDE;
1047

1048
                StelUtils::rectToSphe(&ra_equ,&dec_equ, sun->getEquinoxEquatorialPos(core));
×
1049
                StelUtils::equToEcl(ra_equ, dec_equ, eclJDE, &lambdaJDE, &betaJDE);
×
1050
                if (lambdaJDE<0) lambdaJDE+=2.0*M_PI;
×
1051

1052
                StelUtils::spheToRect(lambdaJDE + M_PI_2, 0., coord);
×
1053
                sphericalCap.n=coord;
×
1054
                fpt.set(0,0,1);
×
1055
        }
1056
        else if (line_type==QUADRATURE)
×
1057
        {
1058
                Vec3d coord;
×
1059
                const double eclJDE = earth->getRotObliquity(core->getJDE());
×
1060
                double ra_equ, dec_equ, lambdaJDE, betaJDE;
1061

1062
                StelUtils::rectToSphe(&ra_equ,&dec_equ, sun->getEquinoxEquatorialPos(core));
×
1063
                StelUtils::equToEcl(ra_equ, dec_equ, eclJDE, &lambdaJDE, &betaJDE);
×
1064
                if (lambdaJDE<0) lambdaJDE+=2.0*M_PI;
×
1065

1066
                StelUtils::spheToRect(lambdaJDE + M_PI, 0., coord);
×
1067
                sphericalCap.n=coord;
×
1068
                fpt.set(0,0,1);
×
1069
        }
1070
        else if (line_type==INVARIABLEPLANE)
×
1071
        {
1072
                // RA, DEC of the Invariable Plane given in WGCCRE2015 report
1073
                static const Mat4d mat=Mat4d::zrotation(M_PI_180*(273.85+90.))*Mat4d::xrotation(M_PI_180*(90.-66.99));
×
1074
                static const Vec3d axis=mat*Vec3d(0, 0, 1);
×
1075
                static const Vec3d ivFpt=mat*Vec3d(1, 0, 0);
×
1076
                sphericalCap.n=axis;
×
1077
                fpt=ivFpt;
×
1078
        }
1079
        else if (line_type==SOLAR_EQUATOR)
×
1080
        {
1081
                // Split out the const part of rotation: rotate along ICRS equator to ascending node
1082
                static const Mat4d solarFrame = Mat4d::zrotation((286.13+90)*M_PI_180) * Mat4d::xrotation((90-63.87)*M_PI_180);
×
1083
                // Axis rotation. N.B. By this formulation, we ignore any light time correction.
1084
                Mat4d solarRot=solarFrame * Mat4d::zrotation((sun->getSiderealTime(core->getJD(), core->getJDE())*M_PI_180));
×
1085

1086
                sphericalCap.n=solarRot*sphericalCap.n;
×
1087
                fpt=solarRot*fpt;
×
1088
        }
1089

1090
        if (showPartitions && !(QList<SKY_LINE_TYPE>({INVARIABLEPLANE, EARTH_UMBRA, EARTH_PENUMBRA, QUADRATURE}).contains(line_type)))
×
1091
        {
1092
                const float lineThickness=sPainter.getLineWidth();
×
1093
                const float rotSign= (line_type==ECLIPTIC_WITH_DATE ? -1.f : 1.f);
×
1094
                sPainter.setLineWidth(partThickness);
×
1095

1096
                // Before drawing the lines themselves (and returning), draw the short partition lines
1097
                // Define short lines from "equator" a bit "southwards"
1098
                Vec3d part0 = fpt;
×
1099
                Vec3d partAxis(0,1,0);
×
1100
                Vec3d partZAxis = sphericalCap.n; // rotation axis for the 360 partitions
×
1101
                if ((line_type==MERIDIAN) || (line_type==COLURE_1))
×
1102
                {
1103
                        partAxis.set(0,0,1);
×
1104
                }
1105
                else if ((line_type==PRIME_VERTICAL) || (line_type==COLURE_2))
×
1106
                {
1107
                        part0.set(0,1,0);
×
1108
                        partAxis.set(0,0,1);
×
1109
                }
1110
                else if ((line_type==LONGITUDE) || (line_type==CURRENT_VERTICAL) || (line_type==SOLAR_EQUATOR))
×
1111
                {
1112
                        partAxis=sphericalCap.n ^ part0;
×
1113
                }
1114

1115
                Vec3d part1=part0;  part1.transfo4d(Mat4d::rotation(partAxis, rotSign*0.10*M_PI/180)); // part1 should point to 0.05deg south of "equator"
×
1116
                Vec3d part5=part0;  part5.transfo4d(Mat4d::rotation(partAxis, rotSign*0.25*M_PI/180));
×
1117
                Vec3d part10=part0; part10.transfo4d(Mat4d::rotation(partAxis, rotSign*0.45*M_PI/180));
×
1118
                Vec3d part30=part0; part30.transfo4d(Mat4d::rotation(partAxis, rotSign*0.75*M_PI/180));
×
1119
                Vec3d part30l=part0; part30l.transfo4d(Mat4d::rotation(partAxis, rotSign*0.775*M_PI/180));
×
1120
                const Mat4d& rotZ1 = Mat4d::rotation(partZAxis, 1.0*M_PI/180.);
×
1121
                // Limit altitude marks to the displayed range
1122
                int i_min= 0;
×
1123
                int i_max=(line_type==CURRENT_VERTICAL ? 181 : 360);
×
1124
                if ((line_type==CURRENT_VERTICAL) && (sMvMgr->getMountMode()==StelMovementMgr::MountAltAzimuthal) &&
×
1125
                    (core->getCurrentProjectionType()!=StelCore::ProjectionEqualArea) && (core->getCurrentProjectionType()!=StelCore::ProjectionStereographic) && (core->getCurrentProjectionType()!=StelCore::ProjectionFisheye))
×
1126
                {
1127
                        // Avoid marks creeping sideways
1128
                        if (alt<= 2*M_PI_180) i_min =static_cast<int>(-alt*M_180_PI)+2;
×
1129
                        if (alt>=-2*M_PI_180) i_max-=static_cast<int>( alt*M_180_PI)+2;
×
1130
                }
1131
                if (line_type==ECLIPTIC_WITH_DATE)
×
1132
                {
1133
                        // we must adapt (rotate) some labels to observers on the southern hemisphere.
1134
                        const bool southernHemi = core->getCurrentLocation().getLatitude() < 0.f;
×
1135
                        const float extraTextAngle = southernHemi ? M_PI_2f : -M_PI_2f;
×
1136
                        const float shifty = (southernHemi ? -1.f : 0.25) *  static_cast<float>(sPainter.getFontMetrics().height());
×
1137
                        const double currentFoV=core->getMovementMgr()->getCurrentFov();
×
1138

1139
                        // This special line type does not show the actual ecliptic line but only the partitions. These must be read from the precomputed static array eclipticOnDatePartitions
1140
                        for (const auto& v : eclipticOnDatePartitions)
×
1141
                        {
1142
                                double lng=v.first[0]; // ecl. longitude, radians
×
1143
                                const double nutation=v.first[1]; // nutation in longitude, radians
×
1144
                                const double aberration=v.first[2]; // aberration, radians
×
1145
                                if (core->getUseNutation())
×
1146
                                        lng+=nutation;
×
1147
                                if (core->getUseAberration())
×
1148
                                        lng+=aberration;
×
1149
                                const QString &label=v.second;
×
1150
                                // draw and labels: derive the irregular tick lengths from labeling
1151
                                Vec3d start=fpt;
×
1152
                                Vec3d end= label.isEmpty() ? part1 : (label.contains("5") ? part5 : part10);
×
1153
                                Vec3d end10=part10;
×
1154

1155
                                const Mat4d& rotDay = Mat4d::rotation(partZAxis, lng);
×
1156
                                start.transfo4d(rotDay);
×
1157
                                end.transfo4d(rotDay);
×
1158
                                end10.transfo4d(rotDay);
×
1159

1160
                                sPainter.drawGreatCircleArc(start, end, nullptr, nullptr, nullptr);
×
1161

1162
                                if (!label.isEmpty() && (
×
1163
                                        currentFoV<60. // all labels
1164
                                        || (currentFoV<=180. && !label.contains("5")) // 1.MM/10.MM/20.MM
×
1165
                                        || label.startsWith("1.") // in any case
×
1166
                                        ))
1167
                                {
1168
                                        Vec3d screenPosTgt, screenPosTgtL;
×
1169
                                        prj->project(start, screenPosTgt);
×
1170
                                        prj->project(end10, screenPosTgtL);
×
1171
                                        double dx=screenPosTgtL[0]-screenPosTgt[0];
×
1172
                                        double dy=screenPosTgtL[1]-screenPosTgt[1];
×
1173
                                        float textAngle=static_cast<float>(atan2(dy,dx))+extraTextAngle;
×
1174
                                        // Gravity labels look outright terrible here! Disable them.
1175
                                        float shiftx = - static_cast<float>(sPainter.getFontMetrics().boundingRect(label).width()) * 0.5f;
×
1176
                                        sPainter.drawText(end10, label, textAngle*M_180_PIf, shiftx, shifty, true);
×
1177
                                }
1178
                        }
1179
                }
1180
                else if (line_type==ECLIPTIC_CULTURAL || line_type==EQUATORIAL_CULTURAL)
×
1181
                {
1182
                        if (culturalPartitions.size()>1)
×
1183
                        {
1184
                                foreach (const double partition, culturalPartitions.at(1))
×
1185
                                {
1186
                                        const Mat4d& rotZ1 = Mat4d::rotation(partZAxis, (culturalOffset+partition)*M_PI_180);
×
1187
                                        Vec3d part0 = rotZ1*fpt;
×
1188
                                        Vec3d part10=fpt; part10.transfo4d(rotZ1*Mat4d::rotation(partAxis, rotSign*0.45*M_PI_180));
×
1189

1190
                                        sPainter.drawGreatCircleArc(part0, part10, nullptr, nullptr, nullptr);
×
1191
                                }
×
1192
                        }
1193
                        if (culturalPartitions.size()>2)
×
1194
                        {
1195
                                foreach (const double partition, culturalPartitions.at(2))
×
1196
                                {
1197
                                        const Mat4d& rotZ1 = Mat4d::rotation(partZAxis, (culturalOffset+partition)*M_PI_180);
×
1198
                                        Vec3d part0 = rotZ1*fpt;
×
1199
                                        Vec3d part5=fpt;  part5.transfo4d(rotZ1*Mat4d::rotation(partAxis, rotSign*0.25*M_PI_180));
×
1200
                                        sPainter.drawGreatCircleArc(part0, part5, nullptr, nullptr, nullptr);
×
1201
                                }
×
1202
                        }
1203
                        if (culturalPartitions.size()>3)
×
1204
                        {
1205
                                foreach (const double partition, culturalPartitions.at(3))
×
1206
                                {
1207
                                        const Mat4d& rotZ1 = Mat4d::rotation(partZAxis, (culturalOffset+partition)*M_PI_180);
×
1208
                                        Vec3d part0 = rotZ1*fpt;
×
1209
                                        Vec3d part1=fpt;  part1.transfo4d(rotZ1*Mat4d::rotation(partAxis, rotSign*0.10*M_PI_180)); // part1 should point to 0.05deg south of "equator"
×
1210
                                        sPainter.drawGreatCircleArc(part0, part1, nullptr, nullptr, nullptr);
×
1211
                                }
×
1212
                        }
1213
                }
×
1214
                else for (int i=0; i<i_max; ++i)
×
1215
                {
1216
                        if ((line_type==CURRENT_VERTICAL && i>=i_min) || (line_type!=CURRENT_VERTICAL))
×
1217
                        {
1218
                                if (i%30 == 0 && (viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part30)))
×
1219
                                {
1220
                                        sPainter.drawGreatCircleArc(part0, part30, nullptr, nullptr, nullptr);
×
1221

1222
                                        if (showLabel)
×
1223
                                        {
1224
                                                // we must adapt (rotate) some labels to observers on the southern hemisphere.
1225
                                                const bool southernHemi = core->getCurrentLocation().getLatitude() < 0.f;
×
1226
                                                int value=i;
×
1227
                                                float extraTextAngle=0.f;
×
1228
                                                // shiftx/y is OK for equator, horizon, ecliptic.
1229
                                                float shiftx = - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) * 0.5f;
×
1230
                                                float shifty = - static_cast<float>(sPainter.getFontMetrics().height());
×
1231
                                                QString unit("°");
×
1232
                                                QString label;
×
1233
                                                switch (line_type)
×
1234
                                                {
1235
                                                        case EQUATOR_J2000:
×
1236
                                                        case EQUATOR_OF_DATE:
1237
                                                        case FIXED_EQUATOR:
1238
                                                                if (line_type==FIXED_EQUATOR) value=(360-i) % 360;
×
1239
                                                                if (!StelApp::getInstance().getFlagShowDecimalDegrees())
×
1240
                                                                {
1241
                                                                        value /= 15;
×
1242
                                                                        unit="h";
×
1243
                                                                }
1244
                                                                extraTextAngle = southernHemi ? -90.f : 90.f;
×
1245
                                                                if (southernHemi) shifty*=-0.25f;
×
1246
                                                                break;
×
1247
                                                        case HORIZON:
×
1248
                                                                value=(360-i+(StelApp::getInstance().getFlagSouthAzimuthUsage() ? 0 : 180)) % 360;
×
1249
                                                                extraTextAngle=90.f;
×
1250
                                                                break;
×
1251
                                                        case MERIDIAN:
×
1252
                                                        case COLURE_1: // Equinoctial Colure
1253
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
1254
                                                                if (i<90) // South..Nadir | ARI0..CSP
×
1255
                                                                {
1256
                                                                        value=-i;
×
1257
                                                                        extraTextAngle = (line_type==COLURE_1 && southernHemi) ? 0.f : 180.f;
×
1258
                                                                        shiftx = (line_type==COLURE_1 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1259
                                                                }
1260
                                                                else if (i>270) // Zenith..South | CNP..ARI0
×
1261
                                                                {
1262
                                                                        value=360-i;
×
1263
                                                                        extraTextAngle = (line_type==COLURE_1 && southernHemi) ? 0.f : 180.f;
×
1264
                                                                        shiftx = (line_type==COLURE_1 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1265
                                                                }
1266
                                                                else // Nadir..North..Zenith | CSP..Equator:12h..CNP
1267
                                                                {
1268
                                                                        value=i-180;
×
1269
                                                                        extraTextAngle = (line_type==COLURE_1 && southernHemi) ? 180.f : 0.f;
×
1270
                                                                        shiftx = (line_type==COLURE_1 && southernHemi) ? - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f : 3.f;
×
1271
                                                                }
1272
                                                                break;
×
1273
                                                        case PRIME_VERTICAL:
×
1274
                                                        case COLURE_2: // Solstitial Colure
1275
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
1276
                                                                if (i<90) // East..Zenith | Equator:6h..SummerSolstice..CNP
×
1277
                                                                {
1278
                                                                        value=i;
×
1279
                                                                        extraTextAngle = (line_type==COLURE_2 && southernHemi) ? 0.f : 180.f;
×
1280
                                                                        shiftx = (line_type==COLURE_2 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1281
                                                                }
1282
                                                                else if (i<270) // Zenith..West..Nadir | CNP..WinterSolstice..CSP
×
1283
                                                                {
1284
                                                                        value=180-i;
×
1285
                                                                        extraTextAngle = (line_type==COLURE_2 && southernHemi) ? 180.f : 0.f;
×
1286
                                                                        shiftx = (line_type==COLURE_2 && southernHemi) ? - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f : 3.f;
×
1287
                                                                }
1288
                                                                else // Nadir..East | CSP..Equator:6h
1289
                                                                {
1290
                                                                        value=i-360;
×
1291
                                                                        extraTextAngle = (line_type==COLURE_2 && southernHemi) ? 0.f : 180.f;
×
1292
                                                                        shiftx = (line_type==COLURE_2 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1293
                                                                }
1294
                                                                break;
×
1295
                                                        case CURRENT_VERTICAL:
×
1296
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
1297
                                                                value=90-i;
×
1298
                                                                shiftx = 3.0f;
×
1299
                                                                break;
×
1300
                                                        case LONGITUDE:
×
1301
                                                                value=( i<180 ? 90-i : i-270 );
×
1302
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
1303
                                                                shiftx = ((i<180) ^ southernHemi) ? 3.f : -static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1304
                                                                extraTextAngle = ((i<180) ^ southernHemi) ? 0.f : 180.f;
×
1305
                                                                break;
×
1306
                                                        case GALACTICEQUATOR:
×
1307
                                                        case SUPERGALACTICEQUATOR:
1308
                                                                extraTextAngle = 90.f;
×
1309
                                                                break;
×
1310
                                                        default:
×
1311
                                                                extraTextAngle = southernHemi ? -90.f : 90.f;
×
1312
                                                                if (southernHemi) shifty*=-0.25f;
×
1313
                                                                break;
×
1314
                                                }
1315
                                                label = QString("%1%2").arg(value).arg(unit);
×
1316
                                                Vec3d screenPosTgt, screenPosTgtL;
×
1317
                                                prj->project(part30, screenPosTgt);
×
1318
                                                prj->project(part30l, screenPosTgtL);
×
1319
                                                double dx=screenPosTgtL[0]-screenPosTgt[0];
×
1320
                                                double dy=screenPosTgtL[1]-screenPosTgt[1];
×
1321
                                                float textAngle=static_cast<float>(atan2(dy,dx));
×
1322
                                                // Gravity labels look outright terrible here! Disable them.
1323
                                                sPainter.drawText(part30l, label, textAngle*M_180_PIf + extraTextAngle, shiftx, shifty, true);
×
1324
                                        }
×
1325
                                }
1326

1327
                                else if (i%10 == 0 && (viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part10)))
×
1328
                                        sPainter.drawGreatCircleArc(part0, part10, nullptr, nullptr, nullptr);
×
1329
                                else if (i%5 == 0 && (viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part5)))
×
1330
                                        sPainter.drawGreatCircleArc(part0, part5, nullptr, nullptr, nullptr);
×
1331
                                else if( viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part1))
×
1332
                                        sPainter.drawGreatCircleArc(part0, part1, nullptr, nullptr, nullptr);
×
1333
                        }
1334
                        part0.transfo4d(rotZ1);
×
1335
                        part1.transfo4d(rotZ1);
×
1336
                        part5.transfo4d(rotZ1);
×
1337
                        part10.transfo4d(rotZ1);
×
1338
                        part30.transfo4d(rotZ1);
×
1339
                        part30l.transfo4d(rotZ1);
×
1340
                }
1341
                sPainter.setLineWidth(lineThickness);
×
1342
        }
1343

1344
        Vec3d p1, p2;
×
1345
        if (line_type==CURRENT_VERTICAL)
×
1346
        {
1347
                // The usual handling should always project this circle into a straight line. However, with some projections we see ugly artifacts. Better handle this line specially.
1348
                p1.set(0.,0.,1.);
×
1349
                p2.set(0.,0.,-1.);
×
1350
                Vec3d pHori;
×
1351
                StelUtils::spheToRect(az, 0., pHori);
×
1352
                if (sMvMgr->getMountMode()==StelMovementMgr::MountAltAzimuthal)
×
1353
                {
1354
                        switch (core->getCurrentProjectionType())
×
1355
                        {
1356
                                case StelCore::ProjectionOrthographic:
×
1357
                                        StelUtils::spheToRect(az, qMin(M_PI_2, alt+M_PI_2), p1);
×
1358
                                        StelUtils::spheToRect(az, qMax(-M_PI_2, alt-M_PI_2), p2);
×
1359
                                        break;
×
1360
                                case StelCore::ProjectionEqualArea:
×
1361
                                        if (alt*M_180_PI<-89.0) StelUtils::spheToRect(az,  89.5*M_PI_180, p1);
×
1362
                                        if (alt*M_180_PI> 89.0) StelUtils::spheToRect(az, -89.5*M_PI_180, p2);
×
1363
                                        break;
×
1364
                                case StelCore::ProjectionHammer:
×
1365
                                case StelCore::ProjectionMollweide:
1366
                                case StelCore::ProjectionSinusoidal:
1367
                                case StelCore::ProjectionMercator:
1368
                                case StelCore::ProjectionMiller:
1369
                                case StelCore::ProjectionCylinder:
1370
                                        StelUtils::spheToRect(az, qMin(M_PI_2, alt+M_PI_2)-0.05*M_PI_180, p1);
×
1371
                                        StelUtils::spheToRect(az, qMax(-M_PI_2, alt-M_PI_2)+0.05*M_PI_180, p2);
×
1372
                                        break;
×
1373
                                default:
×
1374
                                        break;
×
1375
                        }
1376
                }
1377
                // Now draw through a middle point.
1378
                sPainter.drawGreatCircleArc(p1, pHori, nullptr, viewportEdgeIntersectCallback, &userData);
×
1379
                sPainter.drawGreatCircleArc(p2, pHori, nullptr, viewportEdgeIntersectCallback, &userData);
×
1380
        }
1381
        else if (line_type!=ECLIPTIC_WITH_DATE) // Exclude the pseudo-line ecliptic with date marks: This has only partitions!
×
1382
        {
1383
                if (!SphericalCap::intersectionPoints(viewPortSphericalCap, sphericalCap, p1, p2))
×
1384
                {
1385
                        if ((viewPortSphericalCap.d< sphericalCap.d && viewPortSphericalCap.contains( sphericalCap.n))
×
1386
                         || (viewPortSphericalCap.d<-sphericalCap.d && viewPortSphericalCap.contains(-sphericalCap.n)))
×
1387
                        {
1388
                                // The meridian is fully included in the viewport, draw it in 3 sub-arcs to avoid length > 180.
1389
                                const Mat4d& rotLon120 = Mat4d::rotation(sphericalCap.n, 120.*M_PI_180);
×
1390
                                Vec3d rotFpt=fpt;
×
1391
                                rotFpt.transfo4d(rotLon120);
×
1392
                                Vec3d rotFpt2=rotFpt;
×
1393
                                rotFpt2.transfo4d(rotLon120);
×
1394
                                sPainter.drawGreatCircleArc(fpt, rotFpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
1395
                                sPainter.drawGreatCircleArc(rotFpt, rotFpt2, nullptr, viewportEdgeIntersectCallback, &userData);
×
1396
                                sPainter.drawGreatCircleArc(rotFpt2, fpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
1397
                        }
1398
                }
1399
                else
1400
                {
1401
                        Vec3d middlePoint = p1+p2;
×
1402
                        middlePoint.normalize();
×
1403
                        if (!viewPortSphericalCap.contains(middlePoint))
×
1404
                                middlePoint*=-1.;
×
1405

1406
                        // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
1407
                        sPainter.drawGreatCircleArc(p1, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
1408
                        sPainter.drawGreatCircleArc(p2, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
1409
                }
1410
        }
1411

1412
        sPainter.setLineWidth(oldLineWidth); // restore line thickness
×
1413
        sPainter.setLineSmooth(false);
×
1414
        sPainter.setBlending(false);
×
1415
}
×
1416

1417
SkyPoint::SkyPoint(SKY_POINT_TYPE _point_type) : point_type(_point_type), color(0.f, 0.f, 1.f)
×
1418
{
1419
        // Font size is 14
1420
        font.setPixelSize(StelApp::getInstance().getScreenFontSize()+1);
×
1421
        texCross = StelApp::getInstance().getTextureManager().createTexture(StelFileMgr::getInstallationDir()+"/textures/cross.png");
×
1422

1423
        earth = GETSTELMODULE(SolarSystem)->getEarth();
×
1424
        sun = GETSTELMODULE(SolarSystem)->getSun();
×
1425

1426
        updateLabel();
×
1427
}
×
1428

1429
SkyPoint::~SkyPoint()
×
1430
{
1431
        texCross.clear();
×
1432
}
×
1433

1434
void SkyPoint::setFontSize(int newFontSize)
×
1435
{
1436
        font.setPixelSize(newFontSize);
×
1437
}
×
1438

1439
void SkyPoint::updateLabel()
×
1440
{
1441
        switch (point_type)
×
1442
        {
1443
                case CELESTIALPOLES_J2000:
×
1444
                {
1445
                        frameType = StelCore::FrameJ2000;
×
1446
                        // TRANSLATORS: North Celestial Pole
1447
                        northernLabel = q_("NCP");
×
1448
                        // TRANSLATORS: South Celestial Pole
1449
                        southernLabel = q_("SCP");
×
1450
                        break;
×
1451
                }
1452
                case CELESTIALPOLES_OF_DATE:
×
1453
                {
1454
                        frameType = StelCore::FrameEquinoxEqu;
×
1455
                        // TRANSLATORS: North Celestial Pole
1456
                        northernLabel = q_("NCP");
×
1457
                        // TRANSLATORS: South Celestial Pole
1458
                        southernLabel = q_("SCP");
×
1459
                        break;
×
1460
                }
1461
                case ZENITH_NADIR:
×
1462
                {
1463
                        frameType = StelCore::FrameAltAz;
×
1464
                        // TRANSLATORS: Zenith
1465
                        northernLabel = qc_("Z", "zenith");
×
1466
                        // TRANSLATORS: Nadir
1467
                        southernLabel = qc_("Z'", "nadir");
×
1468
                        break;
×
1469
                }
1470
                case ECLIPTICPOLES_J2000:
×
1471
                {
1472
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1473
                        // TRANSLATORS: North Ecliptic Pole
1474
                        northernLabel = q_("NEP");
×
1475
                        // TRANSLATORS: South Ecliptic Pole
1476
                        southernLabel = q_("SEP");
×
1477
                        break;
×
1478
                }
1479
                case ECLIPTICPOLES_OF_DATE:
×
1480
                {
1481
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
1482
                        // TRANSLATORS: North Ecliptic Pole
1483
                        northernLabel = q_("NEP");
×
1484
                        // TRANSLATORS: South Ecliptic Pole
1485
                        southernLabel = q_("SEP");
×
1486
                        break;
×
1487
                }
1488
                case GALACTICPOLES:
×
1489
                {
1490
                        frameType = StelCore::FrameGalactic;
×
1491
                        // TRANSLATORS: North Galactic Pole
1492
                        northernLabel = q_("NGP");
×
1493
                        // TRANSLATORS: South Galactic Pole
1494
                        southernLabel = q_("SGP");
×
1495
                        break;
×
1496
                }
1497
                case GALACTICCENTER:
×
1498
                {
1499
                        frameType = StelCore::FrameGalactic;
×
1500
                        // TRANSLATORS: Galactic Center point
1501
                        northernLabel = q_("GC");
×
1502
                        // TRANSLATORS: Galactic Anticenter point
1503
                        southernLabel = q_("GA");
×
1504
                        break;
×
1505
                }
1506
                case SUPERGALACTICPOLES:
×
1507
                {
1508
                        frameType = StelCore::FrameSupergalactic;
×
1509
                        // TRANSLATORS: North Supergalactic Pole
1510
                        northernLabel = q_("NSGP");
×
1511
                        // TRANSLATORS: South Supergalactic Pole
1512
                        southernLabel = q_("SSGP");
×
1513
                        break;
×
1514
                }
1515
                case EQUINOXES_J2000:
×
1516
                {
1517
                        frameType = StelCore::FrameJ2000;
×
1518
                        northernLabel = QChar(0x2648); // Vernal equinox
×
1519
                        southernLabel = QChar(0x264E); // Autumnal equinox
×
1520
                        break;
×
1521
                }
1522
                case EQUINOXES_OF_DATE:
×
1523
                {
1524
                        frameType = StelCore::FrameEquinoxEqu;
×
1525
                        northernLabel = QChar(0x2648); // Vernal equinox
×
1526
                        southernLabel = QChar(0x264E); // Autumnal equinox
×
1527
                        break;
×
1528
                }
1529
                case SOLSTICES_J2000:
×
1530
                {
1531
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1532
                        northernLabel = QChar(0x264B); // Summer solstice
×
1533
                        southernLabel = QChar(0x2651); // Winter solstice
×
1534
                        break;
×
1535
                }
1536
                case SOLSTICES_OF_DATE:
×
1537
                {
1538
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
1539
                        northernLabel = QChar(0x264B); // Summer solstice
×
1540
                        southernLabel = QChar(0x2651); // Winter solstice
×
1541
                        break;
×
1542
                }
1543
                case ANTISOLAR:
×
1544
                {
1545
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1546
                        // TRANSLATORS: Antisolar Point
1547
                        northernLabel = q_("ASP");
×
1548
                        break;
×
1549
                }
1550
                case EARTH_UMBRA_CENTER:
×
1551
                {
1552
                        frameType = StelCore::FrameHeliocentricEclipticJ2000;
×
1553
                        // TRANSLATORS: Center of the umbra
1554
                        northernLabel = q_("C.U.");
×
1555
                        break;
×
1556
                }
1557
                case APEX:
×
1558
                {
1559
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1560
                        // TRANSLATORS: Apex Point, where the observer planet is heading to
1561
                        northernLabel = q_("Apex");
×
1562
                        // TRANSLATORS: Antapex Point, where the observer planet is receding from
1563
                        southernLabel = q_("Antapex");
×
1564
                        // add heliocentric speed
1565
                        StelCore *core=StelApp::getInstance().getCore();
×
1566
                        QSharedPointer<Planet> planet=core->getCurrentObserver()->getHomePlanet();
×
1567
                        Q_ASSERT(planet);
×
1568
                        const Vec3d dir=planet->getHeliocentricEclipticVelocity();
×
1569
                        const double speed=dir.norm()*(AU/86400.0);
×
1570
                        // In some cases we don't have a valid speed vector
1571
                        if (speed>0.)
×
1572
                        {
1573
                                const QString kms = qc_("km/s", "speed");
×
1574
                                QString speedStr = QString(" (%1 %2)").arg(QString::number(speed, 'f', 2), kms);
×
1575
                                northernLabel += speedStr;
×
1576
                                speedStr = QString(" (-%1 %2)").arg(QString::number(speed, 'f', 2), kms);
×
1577
                                southernLabel += speedStr;
×
1578
                        }
×
1579
                        break;
×
1580
                }                
×
1581
                default:
×
1582
                        Q_ASSERT(0);
×
1583
        }
1584
}
×
1585

1586
void SkyPoint::draw(StelCore *core) const
×
1587
{
1588
        if (!fader.getInterstate())
×
1589
                return;
×
1590

1591
        StelProjectorP prj = core->getProjection(frameType, frameType!=StelCore::FrameAltAz ? StelCore::RefractionAuto : StelCore::RefractionOff);
×
1592

1593
        // Initialize a painter and set openGL state
1594
        StelPainter sPainter(prj);
×
1595
        sPainter.setColor(color, fader.getInterstate());
×
1596
        Vec4f textColor(color, fader.getInterstate());
×
1597

1598
        sPainter.setFont(font);
×
1599
        /////////////////////////////////////////////////
1600
        // Draw the point
1601

1602
        texCross->bind();
×
1603
        const float size = 0.00001f*M_PI_180f*sPainter.getProjector()->getPixelPerRadAtCenter();
×
1604
        const float shift = 4.f + size/1.8f;
×
1605

1606
        sPainter.setBlending(true, GL_ONE, GL_ONE);
×
1607

1608
        switch (point_type)
×
1609
        {
1610
                case CELESTIALPOLES_J2000:
×
1611
                case CELESTIALPOLES_OF_DATE:
1612
                case ZENITH_NADIR:
1613
                case ECLIPTICPOLES_J2000:
1614
                case ECLIPTICPOLES_OF_DATE:
1615
                case GALACTICPOLES:                
1616
                case SUPERGALACTICPOLES:
1617
                {
1618
                        // North Pole
1619
                        sPainter.drawSprite2dMode(Vec3d(0,0,1), 5.f);
×
1620
                        sPainter.drawText(Vec3d(0,0,1), northernLabel, 0, shift, shift, false);
×
1621

1622
                        // South Pole
1623
                        sPainter.drawSprite2dMode(Vec3d(0,0,-1), 5.f);
×
1624
                        sPainter.drawText(Vec3d(0,0,-1), southernLabel, 0, shift, shift, false);
×
1625
                        break;
×
1626
                }
1627
                case EQUINOXES_J2000:
×
1628
                case EQUINOXES_OF_DATE:
1629
                {
1630
                        // Vernal equinox
1631
                        sPainter.drawSprite2dMode(Vec3d(1,0,0), 5.f);
×
1632
                        sPainter.drawText(Vec3d(1,0,0), northernLabel, 0, shift, shift, false);
×
1633

1634
                        // Autumnal equinox
1635
                        sPainter.drawSprite2dMode(Vec3d(-1,0,0), 5.f);
×
1636
                        sPainter.drawText(Vec3d(-1,0,0), southernLabel, 0, shift, shift, false);
×
1637
                        break;
×
1638
                }
1639
                case SOLSTICES_J2000:
×
1640
                case SOLSTICES_OF_DATE:
1641
                {
1642
                        // Summer solstice
1643
                        sPainter.drawSprite2dMode(Vec3d(0,1,0), 5.f);
×
1644
                        sPainter.drawText(Vec3d(0,1,0), northernLabel, 0, shift, shift, false);
×
1645

1646
                        // Winter solstice
1647
                        sPainter.drawSprite2dMode(Vec3d(0,-1,0), 5.f);
×
1648
                        sPainter.drawText(Vec3d(0,-1,0), southernLabel, 0, shift, shift, false);
×
1649
                        break;
×
1650
                }
1651
                case GALACTICCENTER:
×
1652
                {
1653
                        // Galactic Center point
1654
                        sPainter.drawSprite2dMode(Vec3d(1,0,0), 5.f);
×
1655
                        sPainter.drawText(Vec3d(1,0,0), northernLabel, 0, shift, shift, false);
×
1656

1657
                        // Galactic Anticenter point
1658
                        sPainter.drawSprite2dMode(Vec3d(-1,0,0), 5.f);
×
1659
                        sPainter.drawText(Vec3d(-1,0,0), southernLabel, 0, shift, shift, false);
×
1660
                        break;
×
1661
                }
1662
                case ANTISOLAR:
×
1663
                {
1664
                        // Antisolar Point
1665
                        Vec3d coord=core->getCurrentObserver()->getHomePlanet()->getHeliocentricEclipticPos();
×
1666
                        sPainter.drawSprite2dMode(coord, 5.f);
×
1667
                        sPainter.drawText(coord, northernLabel, 0, shift, shift, false);
×
1668
                        break;
×
1669
                }
1670
                case EARTH_UMBRA_CENTER:
×
1671
                {
1672
                        // We compute the shadow center attached to the geocenter, but must point it in the opposite direction of the sun's aberrated position.
1673
                        static PlanetP moon=GETSTELMODULE(SolarSystem)->getMoon();
×
1674
                        const Vec3d pos=earth->getEclipticPos();
×
1675
                        const Vec3d dir= - sun->getAberrationPush() + pos;
×
1676
                        double lambda, beta;
1677
                        StelUtils::rectToSphe(&lambda, &beta, dir);
×
1678
                        const double dist=moon->getEclipticPos().norm();
×
1679
                        const Mat4d rot=Mat4d::zrotation(lambda)*Mat4d::yrotation(-beta);
×
1680

1681
                        Vec3d point(dist, 0.0, 0.0);
×
1682
                        rot.transfo(point);
×
1683
                        Vec3d coord = pos+point;
×
1684
                        sPainter.drawSprite2dMode(coord, 5.f);
×
1685
                        sPainter.drawText(coord, northernLabel, 0, shift, shift, false);
×
1686
                        break;
×
1687
                }
1688
                case APEX:
×
1689
                {
1690
                        // Observer planet apex (heading point)
1691
                        QSharedPointer<Planet> planet=core->getCurrentObserver()->getHomePlanet();
×
1692
                        Q_ASSERT(planet);
×
1693
                        const Vec3d dir=planet->getHeliocentricEclipticVelocity();
×
1694
                        // In some cases we don't have a valid speed vector
1695
                        if (dir.normSquared()>0.)
×
1696
                        {
1697
                                sPainter.drawSprite2dMode(dir, 5.f);
×
1698
                                sPainter.drawText(dir, northernLabel, 0, shift, shift, false);
×
1699
                                sPainter.drawSprite2dMode(-dir, 5.f);
×
1700
                                sPainter.drawText(-dir, southernLabel, 0, shift, shift, false);
×
1701
                        }
1702
                        break;
×
1703
                }                
×
1704
                default:
×
1705
                        Q_ASSERT(0);
×
1706
        }
1707
}
×
1708

1709

1710
GridLinesMgr::GridLinesMgr()
×
1711
        : gridlinesDisplayed(true)
×
1712
{
1713
        setObjectName("GridLinesMgr");
×
1714
        SkyLine::init();
×
1715

1716
        equGrid = new SkyGrid(StelCore::FrameEquinoxEqu);
×
1717
        fixedEquatorialGrid = new SkyGrid(StelCore::FrameFixedEquatorial);
×
1718
        equJ2000Grid = new SkyGrid(StelCore::FrameJ2000);
×
1719
        eclJ2000Grid = new SkyGrid(StelCore::FrameObservercentricEclipticJ2000);
×
1720
        eclGrid = new SkyGrid(StelCore::FrameObservercentricEclipticOfDate);
×
1721
        galacticGrid = new SkyGrid(StelCore::FrameGalactic);
×
1722
        supergalacticGrid = new SkyGrid(StelCore::FrameSupergalactic);
×
1723
        aziGrid = new SkyGrid(StelCore::FrameAltAz);
×
1724
        equatorLine = new SkyLine(SkyLine::EQUATOR_OF_DATE);
×
1725
        equatorJ2000Line = new SkyLine(SkyLine::EQUATOR_J2000);
×
1726
        fixedEquatorLine = new SkyLine(SkyLine::FIXED_EQUATOR);
×
1727
        eclipticJ2000Line = new SkyLine(SkyLine::ECLIPTIC_J2000);
×
1728
        eclipticLine = new SkyLine(SkyLine::ECLIPTIC_OF_DATE);
×
1729
        eclipticWithDateLine = new SkyLine(SkyLine::ECLIPTIC_WITH_DATE);
×
1730
        invariablePlaneLine = new SkyLine(SkyLine::INVARIABLEPLANE);
×
1731
        solarEquatorLine = new SkyLine(SkyLine::SOLAR_EQUATOR);
×
1732
        precessionCircleN = new SkyLine(SkyLine::PRECESSIONCIRCLE_N);
×
1733
        precessionCircleS = new SkyLine(SkyLine::PRECESSIONCIRCLE_S);
×
1734
        meridianLine = new SkyLine(SkyLine::MERIDIAN);
×
1735
        horizonLine = new SkyLine(SkyLine::HORIZON);
×
1736
        galacticEquatorLine = new SkyLine(SkyLine::GALACTICEQUATOR);
×
1737
        supergalacticEquatorLine = new SkyLine(SkyLine::SUPERGALACTICEQUATOR);
×
1738
        longitudeLine = new SkyLine(SkyLine::LONGITUDE);
×
1739
        quadratureLine = new SkyLine(SkyLine::QUADRATURE);
×
1740
        primeVerticalLine = new SkyLine(SkyLine::PRIME_VERTICAL);
×
1741
        currentVerticalLine = new SkyLine(SkyLine::CURRENT_VERTICAL);
×
1742
        colureLine_1 = new SkyLine(SkyLine::COLURE_1);
×
1743
        colureLine_2 = new SkyLine(SkyLine::COLURE_2);
×
1744
        circumpolarCircleN = new SkyLine(SkyLine::CIRCUMPOLARCIRCLE_N);
×
1745
        circumpolarCircleS = new SkyLine(SkyLine::CIRCUMPOLARCIRCLE_S);
×
1746
        umbraCircle = new SkyLine(SkyLine::EARTH_UMBRA);
×
1747
        penumbraCircle = new SkyLine(SkyLine::EARTH_PENUMBRA);
×
1748
        celestialJ2000Poles = new SkyPoint(SkyPoint::CELESTIALPOLES_J2000);
×
1749
        celestialPoles = new SkyPoint(SkyPoint::CELESTIALPOLES_OF_DATE);
×
1750
        zenithNadir = new SkyPoint(SkyPoint::ZENITH_NADIR);
×
1751
        eclipticJ2000Poles = new SkyPoint(SkyPoint::ECLIPTICPOLES_J2000);
×
1752
        eclipticPoles = new SkyPoint(SkyPoint::ECLIPTICPOLES_OF_DATE);
×
1753
        galacticPoles = new SkyPoint(SkyPoint::GALACTICPOLES);
×
1754
        galacticCenter = new SkyPoint(SkyPoint::GALACTICCENTER);
×
1755
        supergalacticPoles = new SkyPoint(SkyPoint::SUPERGALACTICPOLES);
×
1756
        equinoxJ2000Points = new SkyPoint(SkyPoint::EQUINOXES_J2000);
×
1757
        equinoxPoints = new SkyPoint(SkyPoint::EQUINOXES_OF_DATE);
×
1758
        solsticeJ2000Points = new SkyPoint(SkyPoint::SOLSTICES_J2000);
×
1759
        solsticePoints = new SkyPoint(SkyPoint::SOLSTICES_OF_DATE);
×
1760
        antisolarPoint = new SkyPoint(SkyPoint::ANTISOLAR);
×
1761
        umbraCenterPoint = new SkyPoint(SkyPoint::EARTH_UMBRA_CENTER);
×
1762
        apexPoints = new SkyPoint(SkyPoint::APEX);        
×
1763

1764
        earth = GETSTELMODULE(SolarSystem)->getEarth();
×
1765
        connect(GETSTELMODULE(SolarSystem), SIGNAL(solarSystemDataReloaded()), this, SLOT(connectSolarSystem()));
×
1766

1767
        // Whenever year changes we must recompute the labels for the ecliptic when dates are shown.
1768
        connect(StelApp::getInstance().getCore(), &StelCore::dateChangedByYear, this, [=](const int year){ SkyLine::computeEclipticDatePartitions(year);});
×
1769
        // Likewise, recreate when switching them on...
1770
        connect(this, &GridLinesMgr::eclipticDatesLabeledChanged, this, [=](const bool displayed){ if (displayed) SkyLine::computeEclipticDatePartitions();});
×
1771
        // ... or as timezone changes
1772
        connect(StelApp::getInstance().getCore(), &StelCore::currentTimeZoneChanged, this, [=](const QString&){ SkyLine::computeEclipticDatePartitions();});
×
1773
}
×
1774

1775
GridLinesMgr::~GridLinesMgr()
×
1776
{
1777
        delete equGrid;
×
1778
        delete fixedEquatorialGrid;
×
1779
        delete equJ2000Grid;
×
1780
        delete eclJ2000Grid;
×
1781
        delete eclGrid;
×
1782
        delete galacticGrid;
×
1783
        delete supergalacticGrid;
×
1784
        delete aziGrid;
×
1785
        delete equatorLine;
×
1786
        delete equatorJ2000Line;
×
1787
        delete fixedEquatorLine;
×
1788
        delete eclipticLine;
×
1789
        delete eclipticWithDateLine;
×
1790
        delete eclipticJ2000Line;
×
1791
        delete invariablePlaneLine;
×
1792
        delete solarEquatorLine;
×
1793
        delete precessionCircleN;
×
1794
        delete precessionCircleS;
×
1795
        delete meridianLine;
×
1796
        delete horizonLine;
×
1797
        delete galacticEquatorLine;
×
1798
        delete supergalacticEquatorLine;
×
1799
        delete longitudeLine;
×
1800
        delete quadratureLine;
×
1801
        delete primeVerticalLine;
×
1802
        delete currentVerticalLine;
×
1803
        delete colureLine_1;
×
1804
        delete colureLine_2;
×
1805
        delete circumpolarCircleN;
×
1806
        delete circumpolarCircleS;
×
1807
        delete umbraCircle;
×
1808
        delete penumbraCircle;
×
1809
        delete celestialJ2000Poles;
×
1810
        delete celestialPoles;
×
1811
        delete zenithNadir;
×
1812
        delete eclipticJ2000Poles;
×
1813
        delete eclipticPoles;
×
1814
        delete galacticPoles;
×
1815
        delete galacticCenter;
×
1816
        delete supergalacticPoles;
×
1817
        delete equinoxJ2000Points;
×
1818
        delete equinoxPoints;
×
1819
        delete solsticeJ2000Points;
×
1820
        delete solsticePoints;
×
1821
        delete antisolarPoint;
×
1822
        delete umbraCenterPoint;
×
1823
        delete apexPoints;        
×
1824
        SkyLine::deinit();
×
1825
}
×
1826

1827
/*************************************************************************
1828
 Reimplementation of the getCallOrder method
1829
*************************************************************************/
1830
double GridLinesMgr::getCallOrder(StelModuleActionName actionName) const
×
1831
{
1832
        if (actionName==StelModule::ActionDraw)
×
1833
                return StelApp::getInstance().getModuleMgr().getModule("NebulaMgr")->getCallOrder(actionName)+10.;
×
1834
        return 0.;
×
1835
}
1836

1837
void GridLinesMgr::init()
×
1838
{
1839
        QSettings* conf = StelApp::getInstance().getSettings();
×
1840
        Q_ASSERT(conf);
×
1841

1842
        // Upgrade config keys
1843
        if (conf->contains("color/longitude_color"))
×
1844
        {
1845
                conf->setValue("color/oc_longitude_color", conf->value("color/longitude_color", "0.2,0.4,0.4").toString());
×
1846
                conf->remove("color/longitude_color");
×
1847
        }
1848

1849
        setFlagGridlines(conf->value("viewing/flag_gridlines", true).toBool());
×
1850
        setFlagAzimuthalGrid(conf->value("viewing/flag_azimuthal_grid").toBool());
×
1851
        setFlagEquatorGrid(conf->value("viewing/flag_equatorial_grid").toBool());
×
1852
        setFlagFixedEquatorGrid(conf->value("viewing/flag_fixed_equatorial_grid").toBool());
×
1853
        setFlagEquatorJ2000Grid(conf->value("viewing/flag_equatorial_J2000_grid").toBool());
×
1854
        setFlagEclipticJ2000Grid(conf->value("viewing/flag_ecliptic_J2000_grid").toBool());
×
1855
        setFlagEclipticGrid(conf->value("viewing/flag_ecliptic_grid").toBool());
×
1856
        setFlagGalacticGrid(conf->value("viewing/flag_galactic_grid").toBool());
×
1857
        setFlagSupergalacticGrid(conf->value("viewing/flag_supergalactic_grid").toBool());
×
1858
        setFlagEquatorLine(conf->value("viewing/flag_equator_line").toBool());
×
1859
        setFlagEquatorParts(conf->value("viewing/flag_equator_parts").toBool());
×
1860
        setFlagEquatorLabeled(conf->value("viewing/flag_equator_labels").toBool());
×
1861
        setFlagEquatorJ2000Line(conf->value("viewing/flag_equator_J2000_line").toBool());
×
1862
        setFlagEquatorJ2000Parts(conf->value("viewing/flag_equator_J2000_parts").toBool());
×
1863
        setFlagEquatorJ2000Labeled(conf->value("viewing/flag_equator_J2000_labels").toBool());
×
1864
        setFlagFixedEquatorLine(conf->value("viewing/flag_fixed_equator_line").toBool());
×
1865
        setFlagFixedEquatorParts(conf->value("viewing/flag_fixed_equator_parts").toBool());
×
1866
        setFlagFixedEquatorLabeled(conf->value("viewing/flag_fixed_equator_labels").toBool());
×
1867
        setFlagEclipticLine(conf->value("viewing/flag_ecliptic_line").toBool());
×
1868
        setFlagEclipticParts(conf->value("viewing/flag_ecliptic_parts").toBool());
×
1869
        setFlagEclipticLabeled(conf->value("viewing/flag_ecliptic_labels").toBool());
×
1870
        setFlagEclipticDatesLabeled(conf->value("viewing/flag_ecliptic_dates_labels", true).toBool());
×
1871
        setFlagEclipticJ2000Line(conf->value("viewing/flag_ecliptic_J2000_line").toBool());
×
1872
        setFlagEclipticJ2000Parts(conf->value("viewing/flag_ecliptic_J2000_parts").toBool());
×
1873
        setFlagEclipticJ2000Labeled(conf->value("viewing/flag_ecliptic_J2000_labels").toBool());        
×
1874
        setFlagInvariablePlaneLine(conf->value("viewing/flag_invariable_plane_line").toBool());
×
1875
        setFlagSolarEquatorLine(conf->value("viewing/flag_solar_equator_line").toBool());
×
1876
        setFlagSolarEquatorParts(conf->value("viewing/flag_solar_equator_parts").toBool());
×
1877
        setFlagSolarEquatorLabeled(conf->value("viewing/flag_solar_equator_labels").toBool());
×
1878
        setFlagPrecessionCircles(conf->value("viewing/flag_precession_circles").toBool());
×
1879
        setFlagPrecessionParts(conf->value("viewing/flag_precession_parts").toBool());
×
1880
        setFlagPrecessionLabeled(conf->value("viewing/flag_precession_labels").toBool());
×
1881
        setFlagMeridianLine(conf->value("viewing/flag_meridian_line").toBool());
×
1882
        setFlagMeridianParts(conf->value("viewing/flag_meridian_parts").toBool());
×
1883
        setFlagMeridianLabeled(conf->value("viewing/flag_meridian_labels").toBool());
×
1884
        setFlagHorizonLine(conf->value("viewing/flag_horizon_line").toBool());
×
1885
        setFlagHorizonParts(conf->value("viewing/flag_horizon_parts").toBool());
×
1886
        setFlagHorizonLabeled(conf->value("viewing/flag_horizon_labels").toBool());
×
1887
        setFlagGalacticEquatorLine(conf->value("viewing/flag_galactic_equator_line").toBool());
×
1888
        setFlagGalacticEquatorParts(conf->value("viewing/flag_galactic_equator_parts").toBool());
×
1889
        setFlagGalacticEquatorLabeled(conf->value("viewing/flag_galactic_equator_labels").toBool());
×
1890
        setFlagSupergalacticEquatorLine(conf->value("viewing/flag_supergalactic_equator_line").toBool());
×
1891
        setFlagSupergalacticEquatorParts(conf->value("viewing/flag_supergalactic_equator_parts").toBool());
×
1892
        setFlagSupergalacticEquatorLabeled(conf->value("viewing/flag_supergalactic_equator_labels").toBool());
×
1893
        setFlagLongitudeLine(conf->value("viewing/flag_longitude_line").toBool());
×
1894
        setFlagLongitudeParts(conf->value("viewing/flag_longitude_parts").toBool());
×
1895
        setFlagLongitudeLabeled(conf->value("viewing/flag_longitude_labels").toBool());
×
1896
        setFlagQuadratureLine(conf->value("viewing/flag_quadrature_line").toBool());
×
1897
        setFlagPrimeVerticalLine(conf->value("viewing/flag_prime_vertical_line").toBool());
×
1898
        setFlagPrimeVerticalParts(conf->value("viewing/flag_prime_vertical_parts").toBool());
×
1899
        setFlagPrimeVerticalLabeled(conf->value("viewing/flag_prime_vertical_labels").toBool());
×
1900
        setFlagCurrentVerticalLine(conf->value("viewing/flag_current_vertical_line").toBool());
×
1901
        setFlagCurrentVerticalParts(conf->value("viewing/flag_current_vertical_parts").toBool());
×
1902
        setFlagCurrentVerticalLabeled(conf->value("viewing/flag_current_vertical_labels").toBool());
×
1903
        setFlagColureLines(conf->value("viewing/flag_colure_lines").toBool());
×
1904
        setFlagColureParts(conf->value("viewing/flag_colure_parts").toBool());
×
1905
        setFlagColureLabeled(conf->value("viewing/flag_colure_labels").toBool());
×
1906
        setFlagCircumpolarCircles(conf->value("viewing/flag_circumpolar_circles").toBool());
×
1907
        setFlagUmbraCircle(conf->value("viewing/flag_umbra_circle").toBool());
×
1908
        setFlagPenumbraCircle(conf->value("viewing/flag_penumbra_circle").toBool());
×
1909
        setFlagCelestialJ2000Poles(conf->value("viewing/flag_celestial_J2000_poles").toBool());
×
1910
        setFlagCelestialPoles(conf->value("viewing/flag_celestial_poles").toBool());
×
1911
        setFlagZenithNadir(conf->value("viewing/flag_zenith_nadir").toBool());
×
1912
        setFlagEclipticJ2000Poles(conf->value("viewing/flag_ecliptic_J2000_poles").toBool());
×
1913
        setFlagEclipticPoles(conf->value("viewing/flag_ecliptic_poles").toBool());
×
1914
        setFlagGalacticPoles(conf->value("viewing/flag_galactic_poles").toBool());
×
1915
        setFlagGalacticCenter(conf->value("viewing/flag_galactic_center").toBool());
×
1916
        setFlagSupergalacticPoles(conf->value("viewing/flag_supergalactic_poles").toBool());
×
1917
        setFlagEquinoxJ2000Points(conf->value("viewing/flag_equinox_J2000_points").toBool());
×
1918
        setFlagEquinoxPoints(conf->value("viewing/flag_equinox_points").toBool());
×
1919
        setFlagSolsticeJ2000Points(conf->value("viewing/flag_solstice_J2000_points").toBool());
×
1920
        setFlagSolsticePoints(conf->value("viewing/flag_solstice_points").toBool());
×
1921
        setFlagAntisolarPoint(conf->value("viewing/flag_antisolar_point").toBool());
×
1922
        setFlagUmbraCenterPoint(conf->value("viewing/flag_umbra_center_point").toBool());
×
1923
        setFlagApexPoints(conf->value("viewing/flag_apex_points").toBool());
×
1924

1925
        // Set the line thickness for grids and lines
1926
        setLineThickness(conf->value("viewing/line_thickness", 1.f).toFloat());
×
1927
        setPartThickness(conf->value("viewing/part_thickness", 1.f).toFloat());
×
1928

1929
        // Load colors from config file
1930
        QString defaultColor = conf->value("color/default_color", "0.5,0.5,0.7").toString();
×
1931
        setColorEquatorGrid(             Vec3f(conf->value("color/equatorial_color", defaultColor).toString()));
×
1932
        setColorFixedEquatorGrid(        Vec3f(conf->value("color/fixed_equatorial_color", defaultColor).toString()));
×
1933
        setColorEquatorJ2000Grid(        Vec3f(conf->value("color/equatorial_J2000_color", defaultColor).toString()));
×
1934
        setColorEclipticJ2000Grid(       Vec3f(conf->value("color/ecliptical_J2000_color", defaultColor).toString()));
×
1935
        setColorEclipticGrid(            Vec3f(conf->value("color/ecliptical_color", defaultColor).toString()));
×
1936
        setColorGalacticGrid(            Vec3f(conf->value("color/galactic_color", defaultColor).toString()));
×
1937
        setColorSupergalacticGrid(       Vec3f(conf->value("color/supergalactic_color", defaultColor).toString()));
×
1938
        setColorAzimuthalGrid(           Vec3f(conf->value("color/azimuthal_color", defaultColor).toString()));
×
1939
        setColorEquatorLine(             Vec3f(conf->value("color/equator_color", defaultColor).toString()));
×
1940
        setColorEquatorJ2000Line(        Vec3f(conf->value("color/equator_J2000_color", defaultColor).toString()));
×
1941
        setColorFixedEquatorLine(        Vec3f(conf->value("color/fixed_equator_color", defaultColor).toString()));
×
1942
        setColorEclipticLine(            Vec3f(conf->value("color/ecliptic_color", defaultColor).toString()));
×
1943
        setColorEclipticJ2000Line(       Vec3f(conf->value("color/ecliptic_J2000_color", defaultColor).toString()));
×
1944
        setColorInvariablePlaneLine(     Vec3f(conf->value("color/invariable_plane_color", defaultColor).toString()));
×
1945
        setColorSolarEquatorLine(        Vec3f(conf->value("color/solar_equator_color", defaultColor).toString()));
×
1946
        setColorPrecessionCircles(       Vec3f(conf->value("color/precession_circles_color", defaultColor).toString()));
×
1947
        setColorMeridianLine(            Vec3f(conf->value("color/meridian_color", defaultColor).toString()));
×
1948
        setColorHorizonLine(             Vec3f(conf->value("color/horizon_color", defaultColor).toString()));
×
1949
        setColorGalacticEquatorLine(     Vec3f(conf->value("color/galactic_equator_color", defaultColor).toString()));
×
1950
        setColorSupergalacticEquatorLine(Vec3f(conf->value("color/supergalactic_equator_color", defaultColor).toString()));
×
1951
        setColorLongitudeLine(                 Vec3f(conf->value("color/oc_longitude_color", defaultColor).toString()));
×
1952
        setColorQuadratureLine(                 Vec3f(conf->value("color/quadrature_color", defaultColor).toString()));
×
1953
        setColorPrimeVerticalLine(       Vec3f(conf->value("color/prime_vertical_color", defaultColor).toString()));
×
1954
        setColorCurrentVerticalLine(     Vec3f(conf->value("color/current_vertical_color", defaultColor).toString()));
×
1955
        setColorColureLines(             Vec3f(conf->value("color/colures_color", defaultColor).toString()));
×
1956
        setColorCircumpolarCircles(      Vec3f(conf->value("color/circumpolar_circles_color", defaultColor).toString()));
×
1957
        setColorUmbraCircle(                 Vec3f(conf->value("color/umbra_circle_color", defaultColor).toString()));
×
1958
        setColorPenumbraCircle(                 Vec3f(conf->value("color/penumbra_circle_color", defaultColor).toString()));
×
1959
        setColorCelestialJ2000Poles(     Vec3f(conf->value("color/celestial_J2000_poles_color", defaultColor).toString()));
×
1960
        setColorCelestialPoles(          Vec3f(conf->value("color/celestial_poles_color", defaultColor).toString()));
×
1961
        setColorZenithNadir(             Vec3f(conf->value("color/zenith_nadir_color", defaultColor).toString()));
×
1962
        setColorEclipticJ2000Poles(      Vec3f(conf->value("color/ecliptic_J2000_poles_color", defaultColor).toString()));
×
1963
        setColorEclipticPoles(           Vec3f(conf->value("color/ecliptic_poles_color", defaultColor).toString()));
×
1964
        setColorGalacticPoles(           Vec3f(conf->value("color/galactic_poles_color", defaultColor).toString()));
×
1965
        setColorGalacticCenter(          Vec3f(conf->value("color/galactic_center_color", defaultColor).toString()));
×
1966
        setColorSupergalacticPoles(      Vec3f(conf->value("color/supergalactic_poles_color", defaultColor).toString()));
×
1967
        setColorEquinoxJ2000Points(      Vec3f(conf->value("color/equinox_J2000_points_color", defaultColor).toString()));
×
1968
        setColorEquinoxPoints(           Vec3f(conf->value("color/equinox_points_color", defaultColor).toString()));
×
1969
        setColorSolsticeJ2000Points(     Vec3f(conf->value("color/solstice_J2000_points_color", defaultColor).toString()));
×
1970
        setColorSolsticePoints(          Vec3f(conf->value("color/solstice_points_color", defaultColor).toString()));
×
1971
        setColorAntisolarPoint(          Vec3f(conf->value("color/antisolar_point_color", defaultColor).toString()));
×
1972
        setColorApexPoints(              Vec3f(conf->value("color/apex_points_color", defaultColor).toString()));
×
1973

1974
        StelApp& app = StelApp::getInstance();
×
1975
        connect(&app, SIGNAL(languageChanged()), this, SLOT(updateLabels()));
×
1976
        connect(&app, SIGNAL(screenFontSizeChanged(int)), this, SLOT(setFontSizeFromApp(int)));
×
1977
        
1978
        QString displayGroup = N_("Display Options");
×
1979
        addAction("actionShow_Gridlines",                  displayGroup, N_("Grids and lines"), "gridlinesDisplayed");
×
1980
        addAction("actionShow_Equatorial_Grid",            displayGroup, N_("Equatorial grid"), "equatorGridDisplayed", "E");
×
1981
        addAction("actionShow_Fixed_Equatorial_Grid",      displayGroup, N_("Fixed Equatorial grid"), "fixedEquatorGridDisplayed");
×
1982
        addAction("actionShow_Azimuthal_Grid",             displayGroup, N_("Azimuthal grid"), "azimuthalGridDisplayed", "Z");
×
1983
        addAction("actionShow_Ecliptic_Line",              displayGroup, N_("Ecliptic line"), "eclipticLineDisplayed", ",");
×
1984
        addAction("actionShow_Ecliptic_J2000_Line",        displayGroup, N_("Ecliptic J2000 line"), "eclipticJ2000LineDisplayed");
×
1985
        addAction("actionShow_Invariable_Plane_Line",      displayGroup, N_("Invariable Plane line"), "invariablePlaneLineDisplayed");
×
1986
        addAction("actionShow_Solar_Equator_Line",         displayGroup, N_("Solar Equator Plane line"), "solarEquatorLineDisplayed");
×
1987
        addAction("actionShow_Equator_Line",               displayGroup, N_("Equator line"), "equatorLineDisplayed", ".");
×
1988
        addAction("actionShow_Equator_J2000_Line",         displayGroup, N_("Equator J2000 line"), "equatorJ2000LineDisplayed"); // or with Hotkey??
×
1989
        addAction("actionShow_Fixed_Equator_Line",         displayGroup, N_("Fixed Equator line"), "fixedEquatorLineDisplayed");
×
1990
        addAction("actionShow_Meridian_Line",              displayGroup, N_("Meridian line"), "meridianLineDisplayed", ";");
×
1991
        addAction("actionShow_Horizon_Line",               displayGroup, N_("Horizon line"), "horizonLineDisplayed", "H");
×
1992
        addAction("actionShow_Equatorial_J2000_Grid",      displayGroup, N_("Equatorial J2000 grid"), "equatorJ2000GridDisplayed");
×
1993
        addAction("actionShow_Ecliptic_J2000_Grid",        displayGroup, N_("Ecliptic J2000 grid"), "eclipticJ2000GridDisplayed");
×
1994
        addAction("actionShow_Ecliptic_Grid",              displayGroup, N_("Ecliptic grid"), "eclipticGridDisplayed");
×
1995
        addAction("actionShow_Galactic_Grid",              displayGroup, N_("Galactic grid"), "galacticGridDisplayed");
×
1996
        addAction("actionShow_Galactic_Equator_Line",      displayGroup, N_("Galactic equator"), "galacticEquatorLineDisplayed");
×
1997
        addAction("actionShow_Supergalactic_Grid",         displayGroup, N_("Supergalactic grid"), "supergalacticGridDisplayed");
×
1998
        addAction("actionShow_Supergalactic_Equator_Line", displayGroup, N_("Supergalactic equator"), "supergalacticEquatorLineDisplayed");
×
1999
        addAction("actionShow_Longitude_Line",             displayGroup, N_("Opposition/conjunction longitude line"), "longitudeLineDisplayed");
×
2000
        addAction("actionShow_Quadrature_Line",            displayGroup, N_("Quadrature line"), "quadratureLineDisplayed");
×
2001
        addAction("actionShow_Precession_Circles",         displayGroup, N_("Precession Circles"), "precessionCirclesDisplayed");
×
2002
        addAction("actionShow_Prime_Vertical_Line",        displayGroup, N_("Prime Vertical"), "primeVerticalLineDisplayed");
×
2003
        addAction("actionShow_Current_Vertical_Line",      displayGroup, N_("Current Vertical"), "currentVerticalLineDisplayed");
×
2004
        addAction("actionShow_Colure_Lines",               displayGroup, N_("Colure Lines"), "colureLinesDisplayed");
×
2005
        addAction("actionShow_Circumpolar_Circles",        displayGroup, N_("Circumpolar Circles"), "circumpolarCirclesDisplayed");
×
2006
        addAction("actionShow_Umbra_Circle",               displayGroup, N_("Umbra Circle"), "umbraCircleDisplayed");
×
2007
        addAction("actionShow_Penumbra_Circle",            displayGroup, N_("Penumbra Circle"), "penumbraCircleDisplayed");
×
2008
        addAction("actionShow_Celestial_J2000_Poles",      displayGroup, N_("Celestial J2000 poles"), "celestialJ2000PolesDisplayed");
×
2009
        addAction("actionShow_Celestial_Poles",            displayGroup, N_("Celestial poles"), "celestialPolesDisplayed");
×
2010
        addAction("actionShow_Zenith_Nadir",               displayGroup, N_("Zenith and nadir"), "zenithNadirDisplayed");
×
2011
        addAction("actionShow_Ecliptic_J2000_Poles",       displayGroup, N_("Ecliptic J2000 poles"), "eclipticJ2000PolesDisplayed");
×
2012
        addAction("actionShow_Ecliptic_Poles",             displayGroup, N_("Ecliptic poles"), "eclipticPolesDisplayed");
×
2013
        addAction("actionShow_Galactic_Poles",             displayGroup, N_("Galactic poles"), "galacticPolesDisplayed");
×
2014
        addAction("actionShow_Galactic_Center",            displayGroup, N_("Galactic center and anticenter"), "galacticCenterDisplayed");
×
2015
        addAction("actionShow_Supergalactic_Poles",        displayGroup, N_("Supergalactic poles"), "supergalacticPolesDisplayed");
×
2016
        addAction("actionShow_Equinox_J2000_Points",       displayGroup, N_("Equinox J2000 points"), "equinoxJ2000PointsDisplayed");
×
2017
        addAction("actionShow_Equinox_Points",             displayGroup, N_("Equinox points"), "equinoxPointsDisplayed");
×
2018
        addAction("actionShow_Solstice_J2000_Points",      displayGroup, N_("Solstice J2000 points"), "solsticeJ2000PointsDisplayed");
×
2019
        addAction("actionShow_Solstice_Points",            displayGroup, N_("Solstice points"), "solsticePointsDisplayed");
×
2020
        addAction("actionShow_Antisolar_Point",            displayGroup, N_("Antisolar point"), "antisolarPointDisplayed");
×
2021
        addAction("actionShow_Umbra_Center_Point",         displayGroup, N_("The center of the Earth's umbra"), "umbraCenterPointDisplayed");
×
2022
        addAction("actionShow_Apex_Points",                displayGroup, N_("Apex points"), "apexPointsDisplayed");
×
2023
}
×
2024

2025
void GridLinesMgr::connectSolarSystem()
×
2026
{
2027
        SolarSystem *ss=GETSTELMODULE(SolarSystem);
×
2028
        earth = ss->getEarth();
×
2029
        SkyLine::setSolarSystem(ss);
×
2030
}
×
2031

2032
void GridLinesMgr::update(double deltaTime)
×
2033
{
2034
        // Update faders
2035
        equGrid->update(deltaTime);
×
2036
        fixedEquatorialGrid->update(deltaTime);
×
2037
        equJ2000Grid->update(deltaTime);
×
2038
        eclJ2000Grid->update(deltaTime);
×
2039
        eclGrid->update(deltaTime);
×
2040
        galacticGrid->update(deltaTime);
×
2041
        supergalacticGrid->update(deltaTime);
×
2042
        aziGrid->update(deltaTime);
×
2043
        equatorLine->update(deltaTime);
×
2044
        equatorJ2000Line->update(deltaTime);
×
2045
        fixedEquatorLine->update(deltaTime);
×
2046
        eclipticLine->update(deltaTime);
×
2047
        eclipticWithDateLine->update(deltaTime);
×
2048
        eclipticJ2000Line->update(deltaTime);
×
2049
        invariablePlaneLine->update(deltaTime);
×
2050
        solarEquatorLine->update(deltaTime);
×
2051
        precessionCircleN->update(deltaTime);
×
2052
        precessionCircleS->update(deltaTime);
×
2053
        meridianLine->update(deltaTime);
×
2054
        horizonLine->update(deltaTime);
×
2055
        galacticEquatorLine->update(deltaTime);
×
2056
        supergalacticEquatorLine->update(deltaTime);
×
2057
        longitudeLine->update(deltaTime);
×
2058
        quadratureLine->update(deltaTime);
×
2059
        primeVerticalLine->update(deltaTime);
×
2060
        currentVerticalLine->update(deltaTime);
×
2061
        colureLine_1->update(deltaTime);
×
2062
        colureLine_2->update(deltaTime);
×
2063
        circumpolarCircleN->update(deltaTime);
×
2064
        circumpolarCircleS->update(deltaTime);
×
2065
        umbraCircle->update(deltaTime);
×
2066
        penumbraCircle->update(deltaTime);
×
2067
        celestialJ2000Poles->update(deltaTime);
×
2068
        celestialPoles->update(deltaTime);
×
2069
        zenithNadir->update(deltaTime);
×
2070
        eclipticJ2000Poles->update(deltaTime);
×
2071
        eclipticPoles->update(deltaTime);
×
2072
        galacticPoles->update(deltaTime);
×
2073
        galacticCenter->update(deltaTime);
×
2074
        supergalacticPoles->update(deltaTime);
×
2075
        equinoxJ2000Points->update(deltaTime);
×
2076
        equinoxPoints->update(deltaTime);
×
2077
        solsticeJ2000Points->update(deltaTime);
×
2078
        solsticePoints->update(deltaTime);
×
2079
        antisolarPoint->update(deltaTime);
×
2080
        umbraCenterPoint->update(deltaTime);
×
2081
        apexPoints->update(deltaTime);
×
2082
        apexPoints->updateLabel();        
×
2083
}
×
2084

2085
void GridLinesMgr::draw(StelCore* core)
×
2086
{
2087
        if (!gridlinesDisplayed)
×
2088
                return;
×
2089

2090
        // Draw elements from the outside in.
2091
        // Lines after corresponding grids, to be able to e.g. draw equators in different color!
2092
        // Points should come last, to avoid text overdraw.
2093
        supergalacticGrid->draw(core);
×
2094
        galacticGrid->draw(core);
×
2095
        supergalacticEquatorLine->draw(core);
×
2096
        galacticEquatorLine->draw(core);
×
2097
        invariablePlaneLine->draw(core);
×
2098
        solarEquatorLine->draw(core);
×
2099

2100
        eclJ2000Grid->draw(core);
×
2101
        eclipticJ2000Line->draw(core);
×
2102

2103
        equJ2000Grid->draw(core);
×
2104
        equatorJ2000Line->draw(core);
×
2105

2106
        equGrid->draw(core);
×
2107
        equatorLine->draw(core);
×
2108
        // While ecliptic of J2000 may be helpful to get a feeling of the Z=0 plane of VSOP87,
2109
        // ecliptic of date is related to Earth and does not make much sense for the other planets.
2110
        // Of course, orbital plane of respective planet would be better, but is not implemented.
2111
        if (core->getCurrentPlanet()==earth)
×
2112
        {
2113
                penumbraCircle->draw(core);
×
2114
                umbraCircle->draw(core);
×
2115
                eclGrid->draw(core);
×
2116
                eclipticLine->draw(core);
×
2117
                eclipticWithDateLine->draw(core);
×
2118
                precessionCircleN->draw(core);
×
2119
                precessionCircleS->draw(core);
×
2120
                colureLine_1->draw(core);
×
2121
                colureLine_2->draw(core);
×
2122
                eclipticPoles->draw(core);
×
2123
                equinoxPoints->draw(core);
×
2124
                solsticePoints->draw(core);
×
2125
                longitudeLine->draw(core);
×
2126
                quadratureLine->draw(core);
×
2127
                umbraCenterPoint->draw(core);
×
2128
        }
2129
        circumpolarCircleN->draw(core);
×
2130
        circumpolarCircleS->draw(core);
×
2131

2132
        if (core->getCurrentPlanet()->getPlanetType()!=Planet::isObserver)
×
2133
        {
2134
                fixedEquatorialGrid->draw(core);
×
2135
                fixedEquatorLine->draw(core);
×
2136
        }
2137

2138
        aziGrid->draw(core);
×
2139
        meridianLine->draw(core);
×
2140
        horizonLine->draw(core);
×
2141
        primeVerticalLine->draw(core);
×
2142

2143
        currentVerticalLine->draw(core);
×
2144

2145
        supergalacticPoles->draw(core);
×
2146
        galacticPoles->draw(core);
×
2147
        galacticCenter->draw(core);
×
2148
        apexPoints->draw(core);
×
2149
        antisolarPoint->draw(core);
×
2150
        eclipticJ2000Poles->draw(core);
×
2151
        equinoxJ2000Points->draw(core);
×
2152
        solsticeJ2000Points->draw(core);
×
2153
        celestialJ2000Poles->draw(core);
×
2154
        celestialPoles->draw(core);
×
2155

2156
        zenithNadir->draw(core);
×
2157
}
2158

2159
void GridLinesMgr::updateLabels()
×
2160
{
2161
        equatorJ2000Line->updateLabel();
×
2162
        equatorLine->updateLabel();
×
2163
        fixedEquatorLine->updateLabel();
×
2164
        eclipticLine->updateLabel();
×
2165
        eclipticWithDateLine->updateLabel();
×
2166
        eclipticJ2000Line->updateLabel();
×
2167
        invariablePlaneLine->updateLabel();
×
2168
        solarEquatorLine->updateLabel();
×
2169
        precessionCircleN->updateLabel();
×
2170
        precessionCircleS->updateLabel();
×
2171
        meridianLine->updateLabel();
×
2172
        horizonLine->updateLabel();
×
2173
        galacticEquatorLine->updateLabel();
×
2174
        supergalacticEquatorLine->updateLabel();
×
2175
        longitudeLine->updateLabel();
×
2176
        quadratureLine->updateLabel();
×
2177
        primeVerticalLine->updateLabel();
×
2178
        currentVerticalLine->updateLabel();
×
2179
        colureLine_1->updateLabel();
×
2180
        colureLine_2->updateLabel();
×
2181
        circumpolarCircleN->updateLabel();
×
2182
        circumpolarCircleS->updateLabel();
×
2183
        umbraCircle->updateLabel();
×
2184
        penumbraCircle->updateLabel();
×
2185
        celestialJ2000Poles->updateLabel();
×
2186
        celestialPoles->updateLabel();
×
2187
        zenithNadir->updateLabel();
×
2188
        eclipticJ2000Poles->updateLabel();
×
2189
        eclipticPoles->updateLabel();
×
2190
        galacticPoles->updateLabel();
×
2191
        galacticCenter->updateLabel();
×
2192
        supergalacticPoles->updateLabel();
×
2193
        equinoxJ2000Points->updateLabel();
×
2194
        equinoxPoints->updateLabel();
×
2195
        solsticeJ2000Points->updateLabel();
×
2196
        solsticePoints->updateLabel();
×
2197
        antisolarPoint->updateLabel();
×
2198
        umbraCenterPoint->updateLabel();
×
2199
        apexPoints->updateLabel();        
×
2200
}
×
2201

2202
//! Setter ("master switch") for displaying any grid/line.
2203
void GridLinesMgr::setFlagGridlines(const bool displayed)
×
2204
{
2205
        if(displayed != gridlinesDisplayed)
×
2206
        {
2207
                gridlinesDisplayed=displayed;
×
2208
                StelApp::immediateSave("viewing/flag_gridlines", displayed);
×
2209
                emit gridlinesDisplayedChanged(displayed);
×
2210
        }
2211
}
×
2212
//! Accessor ("master switch") for displaying any grid/line.
2213
bool GridLinesMgr::getFlagGridlines() const
×
2214
{
2215
        return gridlinesDisplayed;
×
2216
}
2217

2218
//! Setter ("master switch by type") for displaying all grids esp. for scripting
2219
void GridLinesMgr::setFlagAllGrids(const bool displayed)
×
2220
{
2221
        setFlagEquatorGrid(displayed);
×
2222
        setFlagFixedEquatorGrid(displayed);
×
2223
        setFlagEclipticGrid(displayed);
×
2224
        setFlagGalacticGrid(displayed);
×
2225
        setFlagAzimuthalGrid(displayed);
×
2226
        setFlagEquatorJ2000Grid(displayed);
×
2227
        setFlagEclipticJ2000Grid(displayed);
×
2228
        setFlagSupergalacticGrid(displayed);
×
2229
}
×
2230

2231
//! Setter ("master switch by type") for displaying all lines esp. for scripting
2232
void GridLinesMgr::setFlagAllLines(const bool displayed)
×
2233
{
2234
        setFlagColureLines(displayed);
×
2235
        setFlagEquatorLine(displayed);
×
2236
        setFlagFixedEquatorLine(displayed);
×
2237
        setFlagHorizonLine(displayed);
×
2238
        setFlagEclipticLine(displayed);
×
2239
        setFlagMeridianLine(displayed);
×
2240
        setFlagLongitudeLine(displayed);
×
2241
        setFlagQuadratureLine(displayed);
×
2242
        setFlagEquatorJ2000Line(displayed);
×
2243
        setFlagEclipticJ2000Line(displayed);
×
2244
        setFlagInvariablePlaneLine(displayed);
×
2245
        setFlagSolarEquatorLine(displayed);
×
2246
        setFlagPrecessionCircles(displayed);
×
2247
        setFlagPrimeVerticalLine(displayed);
×
2248
        setFlagCurrentVerticalLine(displayed);
×
2249
        setFlagCircumpolarCircles(displayed);
×
2250
        setFlagUmbraCircle(displayed);
×
2251
        setFlagPenumbraCircle(displayed);
×
2252
        setFlagGalacticEquatorLine(displayed);
×
2253
        setFlagSupergalacticEquatorLine(displayed);
×
2254
}
×
2255

2256
//! Setter ("master switch by type") for displaying all points esp. for scripting
2257
void GridLinesMgr::setFlagAllPoints(const bool displayed)
×
2258
{
2259
        setFlagZenithNadir(displayed);
×
2260
        setFlagEclipticPoles(displayed);
×
2261
        setFlagEquinoxPoints(displayed);
×
2262
        setFlagGalacticPoles(displayed);
×
2263
        setFlagGalacticCenter(displayed);
×
2264
        setFlagAntisolarPoint(displayed);
×
2265
        setFlagCelestialPoles(displayed);
×
2266
        setFlagSolsticePoints(displayed);
×
2267
        setFlagEclipticJ2000Poles(displayed);
×
2268
        setFlagEquinoxJ2000Points(displayed);
×
2269
        setFlagSupergalacticPoles(displayed);
×
2270
        setFlagCelestialJ2000Poles(displayed);
×
2271
        setFlagSolsticeJ2000Points(displayed);
×
2272
        setFlagApexPoints(displayed);
×
2273
        setFlagUmbraCenterPoint(displayed);
×
2274
}
×
2275

2276
//! Set flag for displaying Azimuthal Grid
2277
void GridLinesMgr::setFlagAzimuthalGrid(const bool displayed)
×
2278
{
2279
        if(displayed != aziGrid->isDisplayed())
×
2280
        {
2281
                aziGrid->setDisplayed(displayed);
×
2282
                StelApp::immediateSave("viewing/flag_azimuthal_grid", displayed);
×
2283
                emit azimuthalGridDisplayedChanged(displayed);
×
2284
        }
2285
}
×
2286
//! Get flag for displaying Azimuthal Grid
2287
bool GridLinesMgr::getFlagAzimuthalGrid() const
×
2288
{
2289
        return aziGrid->isDisplayed();
×
2290
}
2291
Vec3f GridLinesMgr::getColorAzimuthalGrid() const
×
2292
{
2293
        return aziGrid->getColor();
×
2294
}
2295
void GridLinesMgr::setColorAzimuthalGrid(const Vec3f& newColor)
×
2296
{
2297
        if(newColor != aziGrid->getColor())
×
2298
        {
2299
                aziGrid->setColor(newColor);
×
2300
                emit azimuthalGridColorChanged(newColor);
×
2301
        }
2302
}
×
2303

2304
//! Set flag for displaying Equatorial Grid
2305
void GridLinesMgr::setFlagEquatorGrid(const bool displayed)
×
2306
{
2307
        if(displayed != equGrid->isDisplayed())
×
2308
        {
2309
                equGrid->setDisplayed(displayed);
×
2310
                StelApp::immediateSave("viewing/flag_equatorial_grid", displayed);
×
2311
                emit equatorGridDisplayedChanged(displayed);
×
2312
        }
2313
}
×
2314
//! Get flag for displaying Equatorial Grid
2315
bool GridLinesMgr::getFlagEquatorGrid() const
×
2316
{
2317
        return equGrid->isDisplayed();
×
2318
}
2319
Vec3f GridLinesMgr::getColorEquatorGrid() const
×
2320
{
2321
        return equGrid->getColor();
×
2322
}
2323
void GridLinesMgr::setColorEquatorGrid(const Vec3f& newColor)
×
2324
{
2325
        if(newColor != equGrid->getColor())
×
2326
        {
2327
                equGrid->setColor(newColor);
×
2328
                emit equatorGridColorChanged(newColor);
×
2329
        }
2330
}
×
2331

2332
//! Set flag for displaying Fixed Equatorial Grid (Hour Angle/Declination)
2333
void GridLinesMgr::setFlagFixedEquatorGrid(const bool displayed)
×
2334
{
2335
        if(displayed != fixedEquatorialGrid->isDisplayed())
×
2336
        {
2337
                fixedEquatorialGrid->setDisplayed(displayed);
×
2338
                StelApp::immediateSave("viewing/flag_fixed_equatorial_grid", displayed);
×
2339
                emit fixedEquatorGridDisplayedChanged(displayed);
×
2340
        }
2341
}
×
2342
//! Get flag for displaying Fixed Equatorial Grid (Hour Angle/Declination)
2343
bool GridLinesMgr::getFlagFixedEquatorGrid() const
×
2344
{
2345
        return fixedEquatorialGrid->isDisplayed();
×
2346
}
2347
Vec3f GridLinesMgr::getColorFixedEquatorGrid() const
×
2348
{
2349
        return fixedEquatorialGrid->getColor();
×
2350
}
2351
void GridLinesMgr::setColorFixedEquatorGrid(const Vec3f& newColor)
×
2352
{
2353
        if(newColor != fixedEquatorialGrid->getColor())
×
2354
        {
2355
                fixedEquatorialGrid->setColor(newColor);
×
2356
                emit fixedEquatorGridColorChanged(newColor);
×
2357
        }
2358
}
×
2359

2360
//! Set flag for displaying Equatorial J2000 Grid
2361
void GridLinesMgr::setFlagEquatorJ2000Grid(const bool displayed)
×
2362
{
2363
        if(displayed != equJ2000Grid->isDisplayed())
×
2364
        {
2365
                equJ2000Grid->setDisplayed(displayed);
×
2366
                StelApp::immediateSave("viewing/flag_equatorial_J2000_grid", displayed);
×
2367
                emit equatorJ2000GridDisplayedChanged(displayed);
×
2368
        }
2369
}
×
2370
//! Get flag for displaying Equatorial J2000 Grid
2371
bool GridLinesMgr::getFlagEquatorJ2000Grid() const
×
2372
{
2373
        return equJ2000Grid->isDisplayed();
×
2374
}
2375
Vec3f GridLinesMgr::getColorEquatorJ2000Grid() const
×
2376
{
2377
        return equJ2000Grid->getColor();
×
2378
}
2379
void GridLinesMgr::setColorEquatorJ2000Grid(const Vec3f& newColor)
×
2380
{
2381
        if(newColor != equJ2000Grid->getColor())
×
2382
        {
2383
                equJ2000Grid->setColor(newColor);
×
2384
                emit equatorJ2000GridColorChanged(newColor);
×
2385
        }
2386
}
×
2387

2388
//! Set flag for displaying Ecliptic J2000 Grid
2389
void GridLinesMgr::setFlagEclipticJ2000Grid(const bool displayed)
×
2390
{
2391
        if(displayed != eclJ2000Grid->isDisplayed())
×
2392
        {
2393
                eclJ2000Grid->setDisplayed(displayed);
×
2394
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_grid", displayed);
×
2395
                emit eclipticJ2000GridDisplayedChanged(displayed);
×
2396
        }
2397
}
×
2398
//! Get flag for displaying Ecliptic J2000 Grid
2399
bool GridLinesMgr::getFlagEclipticJ2000Grid() const
×
2400
{
2401
        return eclJ2000Grid->isDisplayed();
×
2402
}
2403
Vec3f GridLinesMgr::getColorEclipticJ2000Grid() const
×
2404
{
2405
        return eclJ2000Grid->getColor();
×
2406
}
2407
void GridLinesMgr::setColorEclipticJ2000Grid(const Vec3f& newColor)
×
2408
{
2409
        if(newColor != eclJ2000Grid->getColor())
×
2410
        {
2411
                eclJ2000Grid->setColor(newColor);
×
2412
                emit eclipticJ2000GridColorChanged(newColor);
×
2413
        }
2414
}
×
2415

2416
//! Set flag for displaying Ecliptic of Date Grid
2417
void GridLinesMgr::setFlagEclipticGrid(const bool displayed)
×
2418
{
2419
        if(displayed != eclGrid->isDisplayed())
×
2420
        {
2421
                eclGrid->setDisplayed(displayed);
×
2422
                StelApp::immediateSave("viewing/flag_ecliptic_grid", displayed);
×
2423
                emit eclipticGridDisplayedChanged(displayed);
×
2424
        }
2425
}
×
2426
//! Get flag for displaying Ecliptic of Date Grid
2427
bool GridLinesMgr::getFlagEclipticGrid() const
×
2428
{
2429
        return eclGrid->isDisplayed();
×
2430
}
2431
Vec3f GridLinesMgr::getColorEclipticGrid() const
×
2432
{
2433
        return eclGrid->getColor();
×
2434
}
2435
void GridLinesMgr::setColorEclipticGrid(const Vec3f& newColor)
×
2436
{
2437
        if(newColor != eclGrid->getColor())
×
2438
        {
2439
                eclGrid->setColor(newColor);
×
2440
                emit eclipticGridColorChanged(newColor);
×
2441
        }
2442
}
×
2443

2444
//! Set flag for displaying Galactic Grid
2445
void GridLinesMgr::setFlagGalacticGrid(const bool displayed)
×
2446
{
2447
        if(displayed != galacticGrid->isDisplayed())
×
2448
        {
2449
                galacticGrid->setDisplayed(displayed);
×
2450
                StelApp::immediateSave("viewing/flag_galactic_grid", displayed);
×
2451
                emit galacticGridDisplayedChanged(displayed);
×
2452
        }
2453
}
×
2454
//! Get flag for displaying Galactic Grid
2455
bool GridLinesMgr::getFlagGalacticGrid() const
×
2456
{
2457
        return galacticGrid->isDisplayed();
×
2458
}
2459
Vec3f GridLinesMgr::getColorGalacticGrid() const
×
2460
{
2461
        return galacticGrid->getColor();
×
2462
}
2463
void GridLinesMgr::setColorGalacticGrid(const Vec3f& newColor)
×
2464
{
2465
        if(newColor != galacticGrid->getColor())
×
2466
        {
2467
                galacticGrid->setColor(newColor);
×
2468
                emit galacticGridColorChanged(newColor);
×
2469
        }
2470
}
×
2471

2472
//! Set flag for displaying Supergalactic Grid
2473
void GridLinesMgr::setFlagSupergalacticGrid(const bool displayed)
×
2474
{
2475
        if(displayed != supergalacticGrid->isDisplayed())
×
2476
        {
2477
                supergalacticGrid->setDisplayed(displayed);
×
2478
                StelApp::immediateSave("viewing/flag_supergalactic_grid", displayed);
×
2479
                emit supergalacticGridDisplayedChanged(displayed);
×
2480
        }
2481
}
×
2482
//! Get flag for displaying Supergalactic Grid
2483
bool GridLinesMgr::getFlagSupergalacticGrid() const
×
2484
{
2485
        return supergalacticGrid->isDisplayed();
×
2486
}
2487
Vec3f GridLinesMgr::getColorSupergalacticGrid() const
×
2488
{
2489
        return supergalacticGrid->getColor();
×
2490
}
2491
void GridLinesMgr::setColorSupergalacticGrid(const Vec3f& newColor)
×
2492
{
2493
        if(newColor != supergalacticGrid->getColor())
×
2494
        {
2495
                supergalacticGrid->setColor(newColor);
×
2496
                emit supergalacticGridColorChanged(newColor);
×
2497
        }
2498
}
×
2499

2500
//! Set flag for displaying Equatorial Line
2501
void GridLinesMgr::setFlagEquatorLine(const bool displayed)
×
2502
{
2503
        if(displayed != equatorLine->isDisplayed())
×
2504
        {
2505
                equatorLine->setDisplayed(displayed);
×
2506
                StelApp::immediateSave("viewing/flag_equator_line", displayed);
×
2507
                emit equatorLineDisplayedChanged(displayed);
×
2508
        }
2509
}
×
2510
//! Get flag for displaying Equatorial Line
2511
bool GridLinesMgr::getFlagEquatorLine() const
×
2512
{
2513
        return equatorLine->isDisplayed();
×
2514
}
2515
//! Set flag for displaying Equatorial Line partitions
2516
void GridLinesMgr::setFlagEquatorParts(const bool displayed)
×
2517
{
2518
        if(displayed != equatorLine->showsPartitions())
×
2519
        {
2520
                equatorLine->setPartitions(displayed);
×
2521
                StelApp::immediateSave("viewing/flag_equator_parts", displayed);
×
2522
                emit equatorPartsDisplayedChanged(displayed);
×
2523
        }
2524
}
×
2525
//! Get flag for displaying Equatorial Line partitions
2526
bool GridLinesMgr::getFlagEquatorParts() const
×
2527
{
2528
        return equatorLine->showsPartitions();
×
2529
}
2530
void GridLinesMgr::setFlagEquatorLabeled(const bool displayed)
×
2531
{
2532
        if(displayed != equatorLine->isLabeled())
×
2533
        {
2534
                equatorLine->setLabeled(displayed);
×
2535
                StelApp::immediateSave("viewing/flag_equator_labels", displayed);
×
2536
                emit equatorPartsLabeledChanged(displayed);
×
2537
        }
2538
}
×
2539
bool GridLinesMgr::getFlagEquatorLabeled() const
×
2540
{
2541
        return equatorLine->isLabeled();
×
2542
}
2543
Vec3f GridLinesMgr::getColorEquatorLine() const
×
2544
{
2545
        return equatorLine->getColor();
×
2546
}
2547
void GridLinesMgr::setColorEquatorLine(const Vec3f& newColor)
×
2548
{
2549
        if(newColor != equatorLine->getColor())
×
2550
        {
2551
                equatorLine->setColor(newColor);
×
2552
                emit equatorLineColorChanged(newColor);
×
2553
        }
2554
}
×
2555

2556
//! Set flag for displaying J2000 Equatorial Line
2557
void GridLinesMgr::setFlagEquatorJ2000Line(const bool displayed)
×
2558
{
2559
        if(displayed != equatorJ2000Line->isDisplayed())
×
2560
        {
2561
                equatorJ2000Line->setDisplayed(displayed);
×
2562
                StelApp::immediateSave("viewing/flag_equator_J2000_line", displayed);
×
2563
                emit equatorJ2000LineDisplayedChanged(displayed);
×
2564
        }
2565
}
×
2566
//! Get flag for displaying J2000 Equatorial Line
2567
bool GridLinesMgr::getFlagEquatorJ2000Line() const
×
2568
{
2569
        return equatorJ2000Line->isDisplayed();
×
2570
}
2571
//! Set flag for displaying J2000 Equatorial Line partitions
2572
void GridLinesMgr::setFlagEquatorJ2000Parts(const bool displayed)
×
2573
{
2574
        if(displayed != equatorJ2000Line->showsPartitions())
×
2575
        {
2576
                equatorJ2000Line->setPartitions(displayed);
×
2577
                StelApp::immediateSave("viewing/flag_equator_J2000_parts", displayed);
×
2578
                emit equatorJ2000PartsDisplayedChanged(displayed);
×
2579
        }
2580
}
×
2581
//! Get flag for displaying J2000 Equatorial Line partitions
2582
bool GridLinesMgr::getFlagEquatorJ2000Parts() const
×
2583
{
2584
        return equatorJ2000Line->showsPartitions();
×
2585
}
2586
void GridLinesMgr::setFlagEquatorJ2000Labeled(const bool displayed)
×
2587
{
2588
        if(displayed != equatorJ2000Line->isLabeled())
×
2589
        {
2590
                equatorJ2000Line->setLabeled(displayed);
×
2591
                StelApp::immediateSave("viewing/flag_equator_J2000_labels", displayed);
×
2592
                emit equatorJ2000PartsLabeledChanged(displayed);
×
2593
        }
2594
}
×
2595
bool GridLinesMgr::getFlagEquatorJ2000Labeled() const
×
2596
{
2597
        return equatorJ2000Line->isLabeled();
×
2598
}
2599
Vec3f GridLinesMgr::getColorEquatorJ2000Line() const
×
2600
{
2601
        return equatorJ2000Line->getColor();
×
2602
}
2603
void GridLinesMgr::setColorEquatorJ2000Line(const Vec3f& newColor)
×
2604
{
2605
        if(newColor != equatorJ2000Line->getColor())
×
2606
        {
2607
                equatorJ2000Line->setColor(newColor);
×
2608
                emit equatorJ2000LineColorChanged(newColor);
×
2609
        }
2610
}
×
2611

2612
//! Set flag for displaying Fixed Equator Line
2613
void GridLinesMgr::setFlagFixedEquatorLine(const bool displayed)
×
2614
{
2615
        if(displayed != fixedEquatorLine->isDisplayed())
×
2616
        {
2617
                fixedEquatorLine->setDisplayed(displayed);
×
2618
                StelApp::immediateSave("viewing/flag_fixed_equator_line", displayed);
×
2619
                emit fixedEquatorLineDisplayedChanged(displayed);
×
2620
        }
2621
}
×
2622
//! Get flag for displaying Fixed Equator Line
2623
bool GridLinesMgr::getFlagFixedEquatorLine() const
×
2624
{
2625
        return fixedEquatorLine->isDisplayed();
×
2626
}
2627
//! Set flag for displaying Fixed Equator Line partitions
2628
void GridLinesMgr::setFlagFixedEquatorParts(const bool displayed)
×
2629
{
2630
        if(displayed != fixedEquatorLine->showsPartitions())
×
2631
        {
2632
                fixedEquatorLine->setPartitions(displayed);
×
2633
                StelApp::immediateSave("viewing/flag_fixed_equator_parts", displayed);
×
2634
                emit fixedEquatorPartsDisplayedChanged(displayed);
×
2635
        }
2636
}
×
2637
//! Get flag for displaying Fixed Equator Line partitions
2638
bool GridLinesMgr::getFlagFixedEquatorParts() const
×
2639
{
2640
        return fixedEquatorLine->showsPartitions();
×
2641
}
2642
void GridLinesMgr::setFlagFixedEquatorLabeled(const bool displayed)
×
2643
{
2644
        if(displayed != fixedEquatorLine->isLabeled())
×
2645
        {
2646
                fixedEquatorLine->setLabeled(displayed);
×
2647
                StelApp::immediateSave("viewing/flag_fixed_equator_labels", displayed);
×
2648
                emit fixedEquatorPartsLabeledChanged(displayed);
×
2649
        }
2650
}
×
2651
bool GridLinesMgr::getFlagFixedEquatorLabeled() const
×
2652
{
2653
        return fixedEquatorLine->isLabeled();
×
2654
}
2655
Vec3f GridLinesMgr::getColorFixedEquatorLine() const
×
2656
{
2657
        return fixedEquatorLine->getColor();
×
2658
}
2659
void GridLinesMgr::setColorFixedEquatorLine(const Vec3f& newColor)
×
2660
{
2661
        if(newColor != fixedEquatorLine->getColor())
×
2662
        {
2663
                fixedEquatorLine->setColor(newColor);
×
2664
                emit fixedEquatorLineColorChanged(newColor);
×
2665
        }
2666
}
×
2667

2668
//! Set flag for displaying Ecliptic Line
2669
void GridLinesMgr::setFlagEclipticLine(const bool displayed)
×
2670
{
2671
        if(displayed != eclipticLine->isDisplayed())
×
2672
        {
2673
                eclipticLine->setDisplayed(displayed);
×
2674
                eclipticWithDateLine->setDisplayed(displayed);
×
2675
                StelApp::immediateSave("viewing/flag_ecliptic_line", displayed);
×
2676
                emit eclipticLineDisplayedChanged(displayed);
×
2677
        }
2678
}
×
2679
//! Get flag for displaying Ecliptic Line
2680
bool GridLinesMgr::getFlagEclipticLine() const
×
2681
{
2682
        return eclipticLine->isDisplayed();
×
2683
}
2684
//! Set flag for displaying Ecliptic Line partitions
2685
void GridLinesMgr::setFlagEclipticParts(const bool displayed)
×
2686
{
2687
        if(displayed != eclipticLine->showsPartitions())
×
2688
        {
2689
                eclipticLine->setPartitions(displayed);
×
2690
                StelApp::immediateSave("viewing/flag_ecliptic_parts", displayed);
×
2691
                emit eclipticPartsDisplayedChanged(displayed);
×
2692
        }
2693
}
×
2694
//! Get flag for displaying Ecliptic Line partitions
2695
bool GridLinesMgr::getFlagEclipticParts() const
×
2696
{
2697
        return eclipticLine->showsPartitions();
×
2698
}
2699
//! Set flag for displaying Ecliptic Line partitions
2700
void GridLinesMgr::setFlagEclipticLabeled(const bool displayed)
×
2701
{
2702
        if(displayed != eclipticLine->isLabeled())
×
2703
        {
2704
                eclipticLine->setLabeled(displayed);
×
2705
                StelApp::immediateSave("viewing/flag_ecliptic_labels", displayed);
×
2706
                emit eclipticPartsLabeledChanged(displayed);
×
2707
        }
2708
}
×
2709
//! Get flag for displaying Ecliptic Line partitions
2710
bool GridLinesMgr::getFlagEclipticLabeled() const
×
2711
{
2712
        return eclipticLine->isLabeled();
×
2713
}
2714

2715
//! Set flag for displaying Ecliptic Date partitions
2716
void GridLinesMgr::setFlagEclipticDatesLabeled(const bool displayed)
×
2717
{
2718
        if(displayed != eclipticWithDateLine->isLabeled())
×
2719
        {
2720
                eclipticWithDateLine->setPartitions(displayed);
×
2721
                eclipticWithDateLine->setLabeled(displayed);
×
2722
                StelApp::immediateSave("viewing/flag_ecliptic_date_labels", displayed);
×
2723
                emit eclipticDatesLabeledChanged(displayed);
×
2724
        }
2725
}
×
2726
//! Get flag for displaying Ecliptic Line partitions
2727
bool GridLinesMgr::getFlagEclipticDatesLabeled() const
×
2728
{
2729
        return eclipticWithDateLine->isLabeled();
×
2730
}
2731
Vec3f GridLinesMgr::getColorEclipticLine() const
×
2732
{
2733
        return eclipticLine->getColor();
×
2734
}
2735
void GridLinesMgr::setColorEclipticLine(const Vec3f& newColor)
×
2736
{
2737
        if(newColor != eclipticLine->getColor())
×
2738
        {
2739
                eclipticLine->setColor(newColor);
×
2740
                eclipticWithDateLine->setColor(newColor); // One color for both!
×
2741
                emit eclipticLineColorChanged(newColor);
×
2742
        }
2743
}
×
2744

2745
//! Set flag for displaying Ecliptic J2000 Line
2746
void GridLinesMgr::setFlagEclipticJ2000Line(const bool displayed)
×
2747
{
2748
        if(displayed != eclipticJ2000Line->isDisplayed())
×
2749
        {
2750
                eclipticJ2000Line->setDisplayed(displayed);
×
2751
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_line", displayed);
×
2752
                emit eclipticJ2000LineDisplayedChanged(displayed);
×
2753
        }
2754
}
×
2755
//! Get flag for displaying Ecliptic J2000 Line
2756
bool GridLinesMgr::getFlagEclipticJ2000Line() const
×
2757
{
2758
        return eclipticJ2000Line->isDisplayed();
×
2759
}
2760
//! Set flag for displaying Ecliptic J2000 Line partitions
2761
void GridLinesMgr::setFlagEclipticJ2000Parts(const bool displayed)
×
2762
{
2763
        if(displayed != eclipticJ2000Line->showsPartitions())
×
2764
        {
2765
                eclipticJ2000Line->setPartitions(displayed);
×
2766
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_parts", displayed);
×
2767
                emit eclipticJ2000PartsDisplayedChanged(displayed);
×
2768
        }
2769
}
×
2770
//! Get flag for displaying Ecliptic J2000 Line partitions
2771
bool GridLinesMgr::getFlagEclipticJ2000Parts() const
×
2772
{
2773
        return eclipticJ2000Line->showsPartitions();
×
2774
}
2775
//! Set flag for displaying Ecliptic J2000 Line partitions
2776
void GridLinesMgr::setFlagEclipticJ2000Labeled(const bool displayed)
×
2777
{
2778
        if(displayed != eclipticJ2000Line->isLabeled())
×
2779
        {
2780
                eclipticJ2000Line->setLabeled(displayed);
×
2781
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_labels", displayed);
×
2782
                emit eclipticJ2000PartsLabeledChanged(displayed);
×
2783
        }
2784
}
×
2785
//! Get flag for displaying Ecliptic J2000 Line partitions
2786
bool GridLinesMgr::getFlagEclipticJ2000Labeled() const
×
2787
{
2788
        return eclipticJ2000Line->isLabeled();
×
2789
}
2790
Vec3f GridLinesMgr::getColorEclipticJ2000Line() const
×
2791
{
2792
        return eclipticJ2000Line->getColor();
×
2793
}
2794
void GridLinesMgr::setColorEclipticJ2000Line(const Vec3f& newColor)
×
2795
{
2796
        if(newColor != eclipticJ2000Line->getColor())
×
2797
        {
2798
                eclipticJ2000Line->setColor(newColor);
×
2799
                emit eclipticJ2000LineColorChanged(newColor);
×
2800
        }
2801
}
×
2802

2803
//! Set flag for displaying Invariable Plane Line
2804
void GridLinesMgr::setFlagInvariablePlaneLine(const bool displayed)
×
2805
{
2806
        if(displayed != invariablePlaneLine->isDisplayed())
×
2807
        {
2808
                invariablePlaneLine->setDisplayed(displayed);
×
2809
                StelApp::immediateSave("viewing/flag_invariable_plane_line", displayed);
×
2810
                emit invariablePlaneLineDisplayedChanged(displayed);
×
2811
        }
2812
}
×
2813
//! Get flag for displaying Invariable Plane Line
2814
bool GridLinesMgr::getFlagInvariablePlaneLine() const
×
2815
{
2816
        return invariablePlaneLine->isDisplayed();
×
2817
}
2818
Vec3f GridLinesMgr::getColorInvariablePlaneLine() const
×
2819
{
2820
        return invariablePlaneLine->getColor();
×
2821
}
2822
void GridLinesMgr::setColorInvariablePlaneLine(const Vec3f& newColor)
×
2823
{
2824
        if(newColor != invariablePlaneLine->getColor())
×
2825
        {
2826
                invariablePlaneLine->setColor(newColor);
×
2827
                emit invariablePlaneLineColorChanged(newColor);
×
2828
        }
2829
}
×
2830

2831
//! Set flag for displaying Solar Equator Line
2832
void GridLinesMgr::setFlagSolarEquatorLine(const bool displayed)
×
2833
{
2834
        if(displayed != solarEquatorLine->isDisplayed())
×
2835
        {
2836
                solarEquatorLine->setDisplayed(displayed);
×
2837
                StelApp::immediateSave("viewing/flag_solar_equator_line", displayed);
×
2838
                emit solarEquatorLineDisplayedChanged(displayed);
×
2839
        }
2840
}
×
2841
//! Get flag for displaying Solar Equator Line
2842
bool GridLinesMgr::getFlagSolarEquatorLine() const
×
2843
{
2844
        return solarEquatorLine->isDisplayed();
×
2845
}
2846
//! Set flag for displaying Solar Equator Line partitions
2847
void GridLinesMgr::setFlagSolarEquatorParts(const bool displayed)
×
2848
{
2849
        if(displayed != solarEquatorLine->showsPartitions())
×
2850
        {
2851
                solarEquatorLine->setPartitions(displayed);
×
2852
                StelApp::immediateSave("viewing/flag_solar_equator_parts", displayed);
×
2853
                emit solarEquatorPartsDisplayedChanged(displayed);
×
2854
        }
2855
}
×
2856
//! Get flag for displaying Solar Equator Line partitions
2857
bool GridLinesMgr::getFlagSolarEquatorParts() const
×
2858
{
2859
        return solarEquatorLine->showsPartitions();
×
2860
}
2861
//! Set flag for displaying Solar Equator Line partitions
2862
void GridLinesMgr::setFlagSolarEquatorLabeled(const bool displayed)
×
2863
{
2864
        if(displayed != solarEquatorLine->isLabeled())
×
2865
        {
2866
                solarEquatorLine->setLabeled(displayed);
×
2867
                StelApp::immediateSave("viewing/flag_solar_equator_labels", displayed);
×
2868
                emit solarEquatorPartsLabeledChanged(displayed);
×
2869
        }
2870
}
×
2871
//! Get flag for displaying Solar Equator Line partitions
2872
bool GridLinesMgr::getFlagSolarEquatorLabeled() const
×
2873
{
2874
        return solarEquatorLine->isLabeled();
×
2875
}
2876
Vec3f GridLinesMgr::getColorSolarEquatorLine() const
×
2877
{
2878
        return solarEquatorLine->getColor();
×
2879
}
2880
void GridLinesMgr::setColorSolarEquatorLine(const Vec3f& newColor)
×
2881
{
2882
        if(newColor != solarEquatorLine->getColor())
×
2883
        {
2884
                solarEquatorLine->setColor(newColor);
×
2885
                emit solarEquatorLineColorChanged(newColor);
×
2886
        }
2887
}
×
2888

2889
//! Set flag for displaying Precession Circles
2890
void GridLinesMgr::setFlagPrecessionCircles(const bool displayed)
×
2891
{
2892
        if(displayed != precessionCircleN->isDisplayed())
×
2893
        {
2894
                precessionCircleN->setDisplayed(displayed);
×
2895
                precessionCircleS->setDisplayed(displayed);
×
2896
                StelApp::immediateSave("viewing/flag_precession_circles", displayed);
×
2897
                emit precessionCirclesDisplayedChanged(displayed);
×
2898
        }
2899
}
×
2900
//! Get flag for displaying Precession Circles
2901
bool GridLinesMgr::getFlagPrecessionCircles() const
×
2902
{
2903
        // precessionCircleS is always synchronous, no separate queries.
2904
        return precessionCircleN->isDisplayed();
×
2905
}
2906
//! Set flag for displaying Precession Circle partitions
2907
void GridLinesMgr::setFlagPrecessionParts(const bool displayed)
×
2908
{
2909
        if(displayed != precessionCircleN->showsPartitions())
×
2910
        {
2911
                precessionCircleN->setPartitions(displayed);
×
2912
                precessionCircleS->setPartitions(displayed);
×
2913
                StelApp::immediateSave("viewing/flag_precession_parts", displayed);
×
2914
                emit precessionPartsDisplayedChanged(displayed);
×
2915
        }
2916
}
×
2917
//! Get flag for displaying Precession Circle partitions
2918
bool GridLinesMgr::getFlagPrecessionParts() const
×
2919
{
2920
        // precessionCircleS is always synchronous, no separate queries.
2921
        return precessionCircleN->showsPartitions();
×
2922
}
2923
//! Set flag for displaying Precession Circle partitions
2924
void GridLinesMgr::setFlagPrecessionLabeled(const bool displayed)
×
2925
{
2926
        if(displayed != precessionCircleN->isLabeled())
×
2927
        {
2928
                precessionCircleN->setLabeled(displayed);
×
2929
                precessionCircleS->setLabeled(displayed);
×
2930
                StelApp::immediateSave("viewing/flag_precession_labels", displayed);
×
2931
                emit precessionPartsLabeledChanged(displayed);
×
2932
        }
2933
}
×
2934
//! Get flag for displaying Precession Circle partitions
2935
bool GridLinesMgr::getFlagPrecessionLabeled() const
×
2936
{
2937
        // precessionCircleS is always synchronous, no separate queries.
2938
        return precessionCircleN->isLabeled();
×
2939
}
2940
Vec3f GridLinesMgr::getColorPrecessionCircles() const
×
2941
{
2942
        return precessionCircleN->getColor();
×
2943
}
2944
void GridLinesMgr::setColorPrecessionCircles(const Vec3f& newColor)
×
2945
{
2946
        if(newColor != precessionCircleN->getColor())
×
2947
        {
2948
                precessionCircleN->setColor(newColor);
×
2949
                precessionCircleS->setColor(newColor);
×
2950
                emit precessionCirclesColorChanged(newColor);
×
2951
        }
2952
}
×
2953

2954
//! Set flag for displaying Meridian Line
2955
void GridLinesMgr::setFlagMeridianLine(const bool displayed)
×
2956
{
2957
        if(displayed != meridianLine->isDisplayed())
×
2958
        {
2959
                meridianLine->setDisplayed(displayed);
×
2960
                StelApp::immediateSave("viewing/flag_meridian_line", displayed);
×
2961
                emit meridianLineDisplayedChanged(displayed);
×
2962
        }
2963
}
×
2964
//! Get flag for displaying Meridian Line
2965
bool GridLinesMgr::getFlagMeridianLine() const
×
2966
{
2967
        return meridianLine->isDisplayed();
×
2968
}
2969
//! Set flag for displaying Meridian Line partitions
2970
void GridLinesMgr::setFlagMeridianParts(const bool displayed)
×
2971
{
2972
        if(displayed != meridianLine->showsPartitions())
×
2973
        {
2974
                meridianLine->setPartitions(displayed);
×
2975
                StelApp::immediateSave("viewing/flag_meridian_parts", displayed);
×
2976
                emit meridianPartsDisplayedChanged(displayed);
×
2977
        }
2978
}
×
2979
//! Get flag for displaying Meridian Line partitions
2980
bool GridLinesMgr::getFlagMeridianParts() const
×
2981
{
2982
        return meridianLine->showsPartitions();
×
2983
}
2984
//! Set flag for displaying Meridian Line partitions
2985
void GridLinesMgr::setFlagMeridianLabeled(const bool displayed)
×
2986
{
2987
        if(displayed != meridianLine->isLabeled())
×
2988
        {
2989
                meridianLine->setLabeled(displayed);
×
2990
                StelApp::immediateSave("viewing/flag_meridian_labels", displayed);
×
2991
                emit meridianPartsLabeledChanged(displayed);
×
2992
        }
2993
}
×
2994
//! Get flag for displaying Meridian Line partitions
2995
bool GridLinesMgr::getFlagMeridianLabeled() const
×
2996
{
2997
        return meridianLine->isLabeled();
×
2998
}
2999
Vec3f GridLinesMgr::getColorMeridianLine() const
×
3000
{
3001
        return meridianLine->getColor();
×
3002
}
3003
void GridLinesMgr::setColorMeridianLine(const Vec3f& newColor)
×
3004
{
3005
        if(newColor != meridianLine->getColor())
×
3006
        {
3007
                meridianLine->setColor(newColor);
×
3008
                emit meridianLineColorChanged(newColor);
×
3009
        }
3010
}
×
3011

3012
//! Set flag for displaying opposition/conjunction longitude line
3013
void GridLinesMgr::setFlagLongitudeLine(const bool displayed)
×
3014
{
3015
        if(displayed != longitudeLine->isDisplayed())
×
3016
        {
3017
                longitudeLine->setDisplayed(displayed);
×
3018
                StelApp::immediateSave("viewing/flag_longitude_line", displayed);
×
3019
                emit longitudeLineDisplayedChanged(displayed);
×
3020
        }
3021
}
×
3022
//! Get flag for displaying opposition/conjunction longitude line
3023
bool GridLinesMgr::getFlagLongitudeLine() const
×
3024
{
3025
        return longitudeLine->isDisplayed();
×
3026
}
3027
//! Set flag for displaying opposition/conjunction longitude line partitions
3028
void GridLinesMgr::setFlagLongitudeParts(const bool displayed)
×
3029
{
3030
        if(displayed != longitudeLine->showsPartitions())
×
3031
        {
3032
                longitudeLine->setPartitions(displayed);
×
3033
                StelApp::immediateSave("viewing/flag_longitude_parts", displayed);
×
3034
                emit longitudePartsDisplayedChanged(displayed);
×
3035
        }
3036
}
×
3037
//! Get flag for displaying opposition/conjunction longitude line partitions
3038
bool GridLinesMgr::getFlagLongitudeParts() const
×
3039
{
3040
        return longitudeLine->showsPartitions();
×
3041
}
3042
//! Set flag for displaying opposition/conjunction longitude line partitions
3043
void GridLinesMgr::setFlagLongitudeLabeled(const bool displayed)
×
3044
{
3045
        if(displayed != longitudeLine->isLabeled())
×
3046
        {
3047
                longitudeLine->setLabeled(displayed);
×
3048
                StelApp::immediateSave("viewing/flag_longitude_labels", displayed);
×
3049
                emit longitudePartsLabeledChanged(displayed);
×
3050
        }
3051
}
×
3052
bool GridLinesMgr::getFlagLongitudeLabeled() const
×
3053
{
3054
        return longitudeLine->isLabeled();
×
3055
}
3056
Vec3f GridLinesMgr::getColorLongitudeLine() const
×
3057
{
3058
        return longitudeLine->getColor();
×
3059
}
3060
void GridLinesMgr::setColorLongitudeLine(const Vec3f& newColor)
×
3061
{
3062
        if(newColor != longitudeLine->getColor())
×
3063
        {
3064
                longitudeLine->setColor(newColor);
×
3065
                emit longitudeLineColorChanged(newColor);
×
3066
        }
3067
}
×
3068

3069
//! Set flag for displaying quadrature line
3070
void GridLinesMgr::setFlagQuadratureLine(const bool displayed)
×
3071
{
3072
        if(displayed != quadratureLine->isDisplayed())
×
3073
        {
3074
                quadratureLine->setDisplayed(displayed);
×
3075
                StelApp::immediateSave("viewing/flag_quadrature_line", displayed);
×
3076
                emit quadratureLineDisplayedChanged(displayed);
×
3077
        }
3078
}
×
3079
//! Get flag for displaying quadrature line
3080
bool GridLinesMgr::getFlagQuadratureLine() const
×
3081
{
3082
        return quadratureLine->isDisplayed();
×
3083
}
3084
Vec3f GridLinesMgr::getColorQuadratureLine() const
×
3085
{
3086
        return quadratureLine->getColor();
×
3087
}
3088
void GridLinesMgr::setColorQuadratureLine(const Vec3f& newColor)
×
3089
{
3090
        if(newColor != quadratureLine->getColor())
×
3091
        {
3092
                quadratureLine->setColor(newColor);
×
3093
                emit quadratureLineColorChanged(newColor);
×
3094
        }
3095
}
×
3096

3097
//! Set flag for displaying Horizon Line
3098
void GridLinesMgr::setFlagHorizonLine(const bool displayed)
×
3099
{
3100
        if(displayed != horizonLine->isDisplayed())
×
3101
        {
3102
                horizonLine->setDisplayed(displayed);
×
3103
                StelApp::immediateSave("viewing/flag_horizon_line", displayed);
×
3104
                emit horizonLineDisplayedChanged(displayed);
×
3105
        }
3106
}
×
3107
//! Get flag for displaying Horizon Line
3108
bool GridLinesMgr::getFlagHorizonLine() const
×
3109
{
3110
        return horizonLine->isDisplayed();
×
3111
}
3112
//! Set flag for displaying Horizon Line partitions
3113
void GridLinesMgr::setFlagHorizonParts(const bool displayed)
×
3114
{
3115
        if(displayed != horizonLine->showsPartitions())
×
3116
        {
3117
                horizonLine->setPartitions(displayed);
×
3118
                StelApp::immediateSave("viewing/flag_horizon_parts", displayed);
×
3119
                emit horizonPartsDisplayedChanged(displayed);
×
3120
        }
3121
}
×
3122
//! Get flag for displaying Horizon Line partitions
3123
bool GridLinesMgr::getFlagHorizonParts() const
×
3124
{
3125
        return horizonLine->showsPartitions();
×
3126
}
3127
//! Set flag for displaying Horizon Line partitions
3128
void GridLinesMgr::setFlagHorizonLabeled(const bool displayed)
×
3129
{
3130
        if(displayed != horizonLine->isLabeled())
×
3131
        {
3132
                horizonLine->setLabeled(displayed);
×
3133
                StelApp::immediateSave("viewing/flag_horizon_labels", displayed);
×
3134
                emit horizonPartsLabeledChanged(displayed);
×
3135
        }
3136
}
×
3137
//! Get flag for displaying Horizon Line partitions
3138
bool GridLinesMgr::getFlagHorizonLabeled() const
×
3139
{
3140
        return horizonLine->isLabeled();
×
3141
}
3142
Vec3f GridLinesMgr::getColorHorizonLine() const
×
3143
{
3144
        return horizonLine->getColor();
×
3145
}
3146
void GridLinesMgr::setColorHorizonLine(const Vec3f& newColor)
×
3147
{
3148
        if(newColor != horizonLine->getColor())
×
3149
        {
3150
                horizonLine->setColor(newColor);
×
3151
                emit horizonLineColorChanged(newColor);
×
3152
        }
3153
}
×
3154

3155
//! Set flag for displaying Galactic Equator Line
3156
void GridLinesMgr::setFlagGalacticEquatorLine(const bool displayed)
×
3157
{
3158
        if(displayed != galacticEquatorLine->isDisplayed())
×
3159
        {
3160
                galacticEquatorLine->setDisplayed(displayed);
×
3161
                StelApp::immediateSave("viewing/flag_galactic_equator_line", displayed);
×
3162
                emit galacticEquatorLineDisplayedChanged(displayed);
×
3163
        }
3164
}
×
3165
//! Get flag for displaying Galactic Equator Line
3166
bool GridLinesMgr::getFlagGalacticEquatorLine() const
×
3167
{
3168
        return galacticEquatorLine->isDisplayed();
×
3169
}
3170
//! Set flag for displaying Galactic Equator Line partitions
3171
void GridLinesMgr::setFlagGalacticEquatorParts(const bool displayed)
×
3172
{
3173
        if(displayed != galacticEquatorLine->showsPartitions())
×
3174
        {
3175
                galacticEquatorLine->setPartitions(displayed);
×
3176
                StelApp::immediateSave("viewing/flag_galactic_equator_parts", displayed);
×
3177
                emit galacticEquatorPartsDisplayedChanged(displayed);
×
3178
        }
3179
}
×
3180
//! Get flag for displaying Galactic Equator Line partitions
3181
bool GridLinesMgr::getFlagGalacticEquatorParts() const
×
3182
{
3183
        return galacticEquatorLine->showsPartitions();
×
3184
}
3185
//! Set flag for displaying Galactic Equator Line partitions
3186
void GridLinesMgr::setFlagGalacticEquatorLabeled(const bool displayed)
×
3187
{
3188
        if(displayed != galacticEquatorLine->isLabeled())
×
3189
        {
3190
                galacticEquatorLine->setLabeled(displayed);
×
3191
                StelApp::immediateSave("viewing/flag_galactic_equator_labels", displayed);
×
3192
                emit galacticEquatorPartsLabeledChanged(displayed);
×
3193
        }
3194
}
×
3195
//! Get flag for displaying Galactic Equator Line partitions
3196
bool GridLinesMgr::getFlagGalacticEquatorLabeled() const
×
3197
{
3198
        return galacticEquatorLine->isLabeled();
×
3199
}
3200
Vec3f GridLinesMgr::getColorGalacticEquatorLine() const
×
3201
{
3202
        return galacticEquatorLine->getColor();
×
3203
}
3204
void GridLinesMgr::setColorGalacticEquatorLine(const Vec3f& newColor)
×
3205
{
3206
        if(newColor != galacticEquatorLine->getColor())
×
3207
        {
3208
                galacticEquatorLine->setColor(newColor);
×
3209
                emit galacticEquatorLineColorChanged(newColor);
×
3210
        }
3211
}
×
3212

3213
//! Set flag for displaying Supergalactic Equator Line
3214
void GridLinesMgr::setFlagSupergalacticEquatorLine(const bool displayed)
×
3215
{
3216
        if(displayed != supergalacticEquatorLine->isDisplayed())
×
3217
        {
3218
                supergalacticEquatorLine->setDisplayed(displayed);
×
3219
                StelApp::immediateSave("viewing/flag_supergalactic_equator_line", displayed);
×
3220
                emit supergalacticEquatorLineDisplayedChanged(displayed);
×
3221
        }
3222
}
×
3223
//! Get flag for displaying Supergalactic Equator Line
3224
bool GridLinesMgr::getFlagSupergalacticEquatorLine() const
×
3225
{
3226
        return supergalacticEquatorLine->isDisplayed();
×
3227
}
3228
//! Set flag for displaying Supergalactic Equator Line partitions
3229
void GridLinesMgr::setFlagSupergalacticEquatorParts(const bool displayed)
×
3230
{
3231
        if(displayed != supergalacticEquatorLine->showsPartitions())
×
3232
        {
3233
                supergalacticEquatorLine->setPartitions(displayed);
×
3234
                StelApp::immediateSave("viewing/flag_supergalactic_equator_parts", displayed);
×
3235
                emit supergalacticEquatorPartsDisplayedChanged(displayed);
×
3236
        }
3237
}
×
3238
//! Get flag for displaying Supergalactic Equator Line partitions
3239
bool GridLinesMgr::getFlagSupergalacticEquatorParts() const
×
3240
{
3241
        return supergalacticEquatorLine->showsPartitions();
×
3242
}
3243
//! Set flag for displaying Supergalactic Equator Line partitions
3244
void GridLinesMgr::setFlagSupergalacticEquatorLabeled(const bool displayed)
×
3245
{
3246
        if(displayed != supergalacticEquatorLine->isLabeled())
×
3247
        {
3248
                supergalacticEquatorLine->setLabeled(displayed);
×
3249
                StelApp::immediateSave("viewing/flag_supergalactic_equator_labels", displayed);
×
3250
                emit supergalacticEquatorPartsLabeledChanged(displayed);
×
3251
        }
3252
}
×
3253
//! Get flag for displaying Supergalactic Equator Line partitions
3254
bool GridLinesMgr::getFlagSupergalacticEquatorLabeled() const
×
3255
{
3256
        return supergalacticEquatorLine->isLabeled();
×
3257
}
3258
Vec3f GridLinesMgr::getColorSupergalacticEquatorLine() const
×
3259
{
3260
        return supergalacticEquatorLine->getColor();
×
3261
}
3262
void GridLinesMgr::setColorSupergalacticEquatorLine(const Vec3f& newColor)
×
3263
{
3264
        if(newColor != supergalacticEquatorLine->getColor())
×
3265
        {
3266
                supergalacticEquatorLine->setColor(newColor);
×
3267
                emit supergalacticEquatorLineColorChanged(newColor);
×
3268
        }
3269
}
×
3270

3271
//! Set flag for displaying Prime Vertical Line
3272
void GridLinesMgr::setFlagPrimeVerticalLine(const bool displayed)
×
3273
{
3274
        if(displayed != primeVerticalLine->isDisplayed())
×
3275
        {
3276
                primeVerticalLine->setDisplayed(displayed);
×
3277
                StelApp::immediateSave("viewing/flag_prime_vertical_line", displayed);
×
3278
                emit  primeVerticalLineDisplayedChanged(displayed);
×
3279
        }
3280
}
×
3281
//! Get flag for displaying Prime Vertical Line
3282
bool GridLinesMgr::getFlagPrimeVerticalLine() const
×
3283
{
3284
        return primeVerticalLine->isDisplayed();
×
3285
}
3286
//! Set flag for displaying Prime Vertical Line partitions
3287
void GridLinesMgr::setFlagPrimeVerticalParts(const bool displayed)
×
3288
{
3289
        if(displayed != primeVerticalLine->showsPartitions())
×
3290
        {
3291
                primeVerticalLine->setPartitions(displayed);
×
3292
                StelApp::immediateSave("viewing/flag_prime_vertical_parts", displayed);
×
3293
                emit  primeVerticalPartsDisplayedChanged(displayed);
×
3294
        }
3295
}
×
3296
//! Get flag for displaying Prime Vertical Line partitions
3297
bool GridLinesMgr::getFlagPrimeVerticalParts() const
×
3298
{
3299
        return primeVerticalLine->showsPartitions();
×
3300
}
3301
//! Set flag for displaying Prime Vertical Line partitions
3302
void GridLinesMgr::setFlagPrimeVerticalLabeled(const bool displayed)
×
3303
{
3304
        if(displayed != primeVerticalLine->isLabeled())
×
3305
        {
3306
                primeVerticalLine->setLabeled(displayed);
×
3307
                StelApp::immediateSave("viewing/flag_prime_vertical_labels", displayed);
×
3308
                emit  primeVerticalPartsLabeledChanged(displayed);
×
3309
        }
3310
}
×
3311
//! Get flag for displaying Prime Vertical Line partitions
3312
bool GridLinesMgr::getFlagPrimeVerticalLabeled() const
×
3313
{
3314
        return primeVerticalLine->isLabeled();
×
3315
}
3316
Vec3f GridLinesMgr::getColorPrimeVerticalLine() const
×
3317
{
3318
        return primeVerticalLine->getColor();
×
3319
}
3320
void GridLinesMgr::setColorPrimeVerticalLine(const Vec3f& newColor)
×
3321
{
3322
        if(newColor != primeVerticalLine->getColor())
×
3323
        {
3324
                primeVerticalLine->setColor(newColor);
×
3325
                emit primeVerticalLineColorChanged(newColor);
×
3326
        }
3327
}
×
3328

3329
//! Set flag for displaying Current Vertical Line
3330
void GridLinesMgr::setFlagCurrentVerticalLine(const bool displayed)
×
3331
{
3332
        if(displayed != currentVerticalLine->isDisplayed())
×
3333
        {
3334
                currentVerticalLine->setDisplayed(displayed);
×
3335
                StelApp::immediateSave("viewing/flag_current_vertical_line", displayed);
×
3336
                emit  currentVerticalLineDisplayedChanged(displayed);
×
3337
        }
3338
}
×
3339
//! Get flag for displaying Current Vertical Line
3340
bool GridLinesMgr::getFlagCurrentVerticalLine() const
×
3341
{
3342
        return currentVerticalLine->isDisplayed();
×
3343
}
3344
//! Set flag for displaying Current Vertical Line partitions
3345
void GridLinesMgr::setFlagCurrentVerticalParts(const bool displayed)
×
3346
{
3347
        if(displayed != currentVerticalLine->showsPartitions())
×
3348
        {
3349
                currentVerticalLine->setPartitions(displayed);
×
3350
                StelApp::immediateSave("viewing/flag_current_vertical_parts", displayed);
×
3351
                emit  currentVerticalPartsDisplayedChanged(displayed);
×
3352
        }
3353
}
×
3354
//! Get flag for displaying Current Vertical Line partitions
3355
bool GridLinesMgr::getFlagCurrentVerticalParts() const
×
3356
{
3357
        return currentVerticalLine->showsPartitions();
×
3358
}
3359
//! Set flag for displaying Current Vertical Line partitions
3360
void GridLinesMgr::setFlagCurrentVerticalLabeled(const bool displayed)
×
3361
{
3362
        if(displayed != currentVerticalLine->isLabeled())
×
3363
        {
3364
                currentVerticalLine->setLabeled(displayed);
×
3365
                StelApp::immediateSave("viewing/flag_current_vertical_labels", displayed);
×
3366
                emit  currentVerticalPartsLabeledChanged(displayed);
×
3367
        }
3368
}
×
3369
//! Get flag for displaying Current Vertical Line partitions
3370
bool GridLinesMgr::getFlagCurrentVerticalLabeled() const
×
3371
{
3372
        return currentVerticalLine->isLabeled();
×
3373
}
3374
Vec3f GridLinesMgr::getColorCurrentVerticalLine() const
×
3375
{
3376
        return currentVerticalLine->getColor();
×
3377
}
3378
void GridLinesMgr::setColorCurrentVerticalLine(const Vec3f& newColor)
×
3379
{
3380
        if(newColor != currentVerticalLine->getColor())
×
3381
        {
3382
                currentVerticalLine->setColor(newColor);
×
3383
                emit currentVerticalLineColorChanged(newColor);
×
3384
        }
3385
}
×
3386

3387
//! Set flag for displaying Colure Lines
3388
void GridLinesMgr::setFlagColureLines(const bool displayed)
×
3389
{
3390
        if(displayed != colureLine_1->isDisplayed())
×
3391
        {
3392
                colureLine_1->setDisplayed(displayed);
×
3393
                colureLine_2->setDisplayed(displayed);
×
3394
                StelApp::immediateSave("viewing/flag_colure_lines", displayed);
×
3395
                emit  colureLinesDisplayedChanged(displayed);
×
3396
        }
3397
}
×
3398
//! Get flag for displaying Colure Lines
3399
bool GridLinesMgr::getFlagColureLines() const
×
3400
{
3401
        return colureLine_1->isDisplayed();
×
3402
}
3403
//! Set flag for displaying Colure Line partitions
3404
void GridLinesMgr::setFlagColureParts(const bool displayed)
×
3405
{
3406
        if(displayed != colureLine_1->showsPartitions())
×
3407
        {
3408
                colureLine_1->setPartitions(displayed);
×
3409
                colureLine_2->setPartitions(displayed);
×
3410
                StelApp::immediateSave("viewing/flag_colure_parts", displayed);
×
3411
                emit  colurePartsDisplayedChanged(displayed);
×
3412
        }
3413
}
×
3414
//! Get flag for displaying Colure Line partitions
3415
bool GridLinesMgr::getFlagColureParts() const
×
3416
{
3417
        return colureLine_1->showsPartitions();
×
3418
}
3419
void GridLinesMgr::setFlagColureLabeled(const bool displayed)
×
3420
{
3421
        if(displayed != colureLine_1->isLabeled())
×
3422
        {
3423
                colureLine_1->setLabeled(displayed);
×
3424
                colureLine_2->setLabeled(displayed);
×
3425
                StelApp::immediateSave("viewing/flag_colure_labels", displayed);
×
3426
                emit  colurePartsLabeledChanged(displayed);
×
3427
        }
3428
}
×
3429
//! Get flag for displaying Colure Line partitions
3430
bool GridLinesMgr::getFlagColureLabeled() const
×
3431
{
3432
        return colureLine_1->isLabeled();
×
3433
}
3434
Vec3f GridLinesMgr::getColorColureLines() const
×
3435
{
3436
        return colureLine_1->getColor();
×
3437
}
3438
void GridLinesMgr::setColorColureLines(const Vec3f& newColor)
×
3439
{
3440
        if(newColor != colureLine_1->getColor())
×
3441
        {
3442
                colureLine_1->setColor(newColor);
×
3443
                colureLine_2->setColor(newColor);
×
3444
                emit colureLinesColorChanged(newColor);
×
3445
        }
3446
}
×
3447

3448
//! Set flag for displaying Circumpolar Circles
3449
void GridLinesMgr::setFlagCircumpolarCircles(const bool displayed)
×
3450
{
3451
        if(displayed != circumpolarCircleN->isDisplayed())
×
3452
        {
3453
                circumpolarCircleN->setDisplayed(displayed);
×
3454
                circumpolarCircleS->setDisplayed(displayed);
×
3455
                StelApp::immediateSave("viewing/flag_circumpolar_circles", displayed);
×
3456
                emit circumpolarCirclesDisplayedChanged(displayed);
×
3457
        }
3458
}
×
3459
//! Get flag for displaying Circumpolar Circles
3460
bool GridLinesMgr::getFlagCircumpolarCircles() const
×
3461
{
3462
        // circumpolarCircleS is always synchronous, no separate queries.
3463
        return circumpolarCircleN->isDisplayed();
×
3464
}
3465
Vec3f GridLinesMgr::getColorCircumpolarCircles() const
×
3466
{
3467
        return circumpolarCircleN->getColor();
×
3468
}
3469
void GridLinesMgr::setColorCircumpolarCircles(const Vec3f& newColor)
×
3470
{
3471
        if(newColor != circumpolarCircleN->getColor())
×
3472
        {
3473
                circumpolarCircleN->setColor(newColor);
×
3474
                circumpolarCircleS->setColor(newColor);
×
3475
                emit circumpolarCirclesColorChanged(newColor);
×
3476
        }
3477
}
×
3478

3479
//! Set flag for displaying Umbra Circle
3480
void GridLinesMgr::setFlagUmbraCircle(const bool displayed)
×
3481
{
3482
        if(displayed != umbraCircle->isDisplayed())
×
3483
        {
3484
                umbraCircle->setDisplayed(displayed);
×
3485
                StelApp::immediateSave("viewing/flag_umbra_circle", displayed);
×
3486
                emit umbraCircleDisplayedChanged(displayed);
×
3487
        }
3488
}
×
3489
//! Get flag for displaying Umbra Circle
3490
bool GridLinesMgr::getFlagUmbraCircle() const
×
3491
{
3492
        return umbraCircle->isDisplayed();
×
3493
}
3494
Vec3f GridLinesMgr::getColorUmbraCircle() const
×
3495
{
3496
        return umbraCircle->getColor();
×
3497
}
3498
void GridLinesMgr::setColorUmbraCircle(const Vec3f& newColor)
×
3499
{
3500
        if(newColor != umbraCircle->getColor())
×
3501
        {
3502
                umbraCircle->setColor(newColor);
×
3503
                umbraCenterPoint->setColor(newColor);
×
3504
                emit umbraCircleColorChanged(newColor);
×
3505
        }
3506
}
×
3507

3508
//! Set flag for displaying Penumbra Circle
3509
void GridLinesMgr::setFlagPenumbraCircle(const bool displayed)
×
3510
{
3511
        if(displayed != penumbraCircle->isDisplayed())
×
3512
        {
3513
                penumbraCircle->setDisplayed(displayed);
×
3514
                StelApp::immediateSave("viewing/flag_penumbra_circle", displayed);
×
3515
                emit penumbraCircleDisplayedChanged(displayed);
×
3516
        }
3517
}
×
3518
//! Get flag for displaying Penumbra Circle
3519
bool GridLinesMgr::getFlagPenumbraCircle() const
×
3520
{
3521
        return penumbraCircle->isDisplayed();
×
3522
}
3523
Vec3f GridLinesMgr::getColorPenumbraCircle() const
×
3524
{
3525
        return penumbraCircle->getColor();
×
3526
}
3527
void GridLinesMgr::setColorPenumbraCircle(const Vec3f& newColor)
×
3528
{
3529
        if(newColor != penumbraCircle->getColor())
×
3530
        {
3531
                penumbraCircle->setColor(newColor);
×
3532
                emit penumbraCircleColorChanged(newColor);
×
3533
        }
3534
}
×
3535

3536
//! Set flag for displaying celestial poles of J2000
3537
void GridLinesMgr::setFlagCelestialJ2000Poles(const bool displayed)
×
3538
{
3539
        if(displayed != celestialJ2000Poles->isDisplayed())
×
3540
        {
3541
                celestialJ2000Poles->setDisplayed(displayed);
×
3542
                StelApp::immediateSave("viewing/flag_celestial_J2000_poles", displayed);
×
3543
                emit celestialJ2000PolesDisplayedChanged(displayed);
×
3544
        }
3545
}
×
3546
//! Get flag for displaying celestial poles of J2000
3547
bool GridLinesMgr::getFlagCelestialJ2000Poles() const
×
3548
{
3549
        return celestialJ2000Poles->isDisplayed();
×
3550
}
3551
Vec3f GridLinesMgr::getColorCelestialJ2000Poles() const
×
3552
{
3553
        return celestialJ2000Poles->getColor();
×
3554
}
3555
void GridLinesMgr::setColorCelestialJ2000Poles(const Vec3f& newColor)
×
3556
{
3557
        if(newColor != celestialJ2000Poles->getColor())
×
3558
        {
3559
                celestialJ2000Poles->setColor(newColor);
×
3560
                emit celestialJ2000PolesColorChanged(newColor);
×
3561
        }
3562
}
×
3563

3564
//! Set flag for displaying celestial poles
3565
void GridLinesMgr::setFlagCelestialPoles(const bool displayed)
×
3566
{
3567
        if(displayed != celestialPoles->isDisplayed())
×
3568
        {
3569
                celestialPoles->setDisplayed(displayed);
×
3570
                StelApp::immediateSave("viewing/flag_celestial_poles", displayed);
×
3571
                emit celestialPolesDisplayedChanged(displayed);
×
3572
        }
3573
}
×
3574
//! Get flag for displaying celestial poles
3575
bool GridLinesMgr::getFlagCelestialPoles() const
×
3576
{
3577
        return celestialPoles->isDisplayed();
×
3578
}
3579
Vec3f GridLinesMgr::getColorCelestialPoles() const
×
3580
{
3581
        return celestialPoles->getColor();
×
3582
}
3583
void GridLinesMgr::setColorCelestialPoles(const Vec3f& newColor)
×
3584
{
3585
        if(newColor != celestialPoles->getColor())
×
3586
        {
3587
                celestialPoles->setColor(newColor);
×
3588
                emit celestialPolesColorChanged(newColor);
×
3589
        }
3590
}
×
3591

3592
//! Set flag for displaying zenith and nadir
3593
void GridLinesMgr::setFlagZenithNadir(const bool displayed)
×
3594
{
3595
        if(displayed != zenithNadir->isDisplayed())
×
3596
        {
3597
                zenithNadir->setDisplayed(displayed);
×
3598
                StelApp::immediateSave("viewing/flag_zenith_nadir", displayed);
×
3599
                emit zenithNadirDisplayedChanged(displayed);
×
3600
        }
3601
}
×
3602
//! Get flag for displaying zenith and nadir
3603
bool GridLinesMgr::getFlagZenithNadir() const
×
3604
{
3605
        return zenithNadir->isDisplayed();
×
3606
}
3607
Vec3f GridLinesMgr::getColorZenithNadir() const
×
3608
{
3609
        return zenithNadir->getColor();
×
3610
}
3611
void GridLinesMgr::setColorZenithNadir(const Vec3f& newColor)
×
3612
{
3613
        if(newColor != zenithNadir->getColor())
×
3614
        {
3615
                zenithNadir->setColor(newColor);
×
3616
                emit zenithNadirColorChanged(newColor);
×
3617
        }
3618
}
×
3619

3620
//! Set flag for displaying ecliptic poles of J2000
3621
void GridLinesMgr::setFlagEclipticJ2000Poles(const bool displayed)
×
3622
{
3623
        if(displayed != eclipticJ2000Poles->isDisplayed())
×
3624
        {
3625
                eclipticJ2000Poles->setDisplayed(displayed);
×
3626
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_poles", displayed);
×
3627
                emit eclipticJ2000PolesDisplayedChanged(displayed);
×
3628
        }
3629
}
×
3630
//! Get flag for displaying ecliptic poles of J2000
3631
bool GridLinesMgr::getFlagEclipticJ2000Poles() const
×
3632
{
3633
        return eclipticJ2000Poles->isDisplayed();
×
3634
}
3635
Vec3f GridLinesMgr::getColorEclipticJ2000Poles() const
×
3636
{
3637
        return eclipticJ2000Poles->getColor();
×
3638
}
3639
void GridLinesMgr::setColorEclipticJ2000Poles(const Vec3f& newColor)
×
3640
{
3641
        if(newColor != eclipticJ2000Poles->getColor())
×
3642
        {
3643
                eclipticJ2000Poles->setColor(newColor);
×
3644
                emit eclipticJ2000PolesColorChanged(newColor);
×
3645
        }
3646
}
×
3647

3648
//! Set flag for displaying ecliptic poles
3649
void GridLinesMgr::setFlagEclipticPoles(const bool displayed)
×
3650
{
3651
        if(displayed != eclipticPoles->isDisplayed())
×
3652
        {
3653
                eclipticPoles->setDisplayed(displayed);
×
3654
                StelApp::immediateSave("viewing/flag_ecliptic_poles", displayed);
×
3655
                emit eclipticPolesDisplayedChanged(displayed);
×
3656
        }
3657
}
×
3658
//! Get flag for displaying ecliptic poles
3659
bool GridLinesMgr::getFlagEclipticPoles() const
×
3660
{
3661
        return eclipticPoles->isDisplayed();
×
3662
}
3663
Vec3f GridLinesMgr::getColorEclipticPoles() const
×
3664
{
3665
        return eclipticPoles->getColor();
×
3666
}
3667
void GridLinesMgr::setColorEclipticPoles(const Vec3f& newColor)
×
3668
{
3669
        if(newColor != eclipticPoles->getColor())
×
3670
        {
3671
                eclipticPoles->setColor(newColor);
×
3672
                emit eclipticPolesColorChanged(newColor);
×
3673
        }
3674
}
×
3675

3676
//! Set flag for displaying galactic poles
3677
void GridLinesMgr::setFlagGalacticPoles(const bool displayed)
×
3678
{
3679
        if(displayed != galacticPoles->isDisplayed())
×
3680
        {
3681
                galacticPoles->setDisplayed(displayed);
×
3682
                StelApp::immediateSave("viewing/flag_galactic_poles", displayed);
×
3683
                emit galacticPolesDisplayedChanged(displayed);
×
3684
        }
3685
}
×
3686
//! Get flag for displaying galactic poles
3687
bool GridLinesMgr::getFlagGalacticPoles() const
×
3688
{
3689
        return galacticPoles->isDisplayed();
×
3690
}
3691
Vec3f GridLinesMgr::getColorGalacticPoles() const
×
3692
{
3693
        return galacticPoles->getColor();
×
3694
}
3695
void GridLinesMgr::setColorGalacticPoles(const Vec3f& newColor)
×
3696
{
3697
        if(newColor != galacticPoles->getColor())
×
3698
        {
3699
                galacticPoles->setColor(newColor);
×
3700
                emit galacticPolesColorChanged(newColor);
×
3701
        }
3702
}
×
3703

3704
//! Set flag for displaying galactic center and anticenter markers
3705
void GridLinesMgr::setFlagGalacticCenter(const bool displayed)
×
3706
{
3707
        if(displayed != galacticCenter->isDisplayed())
×
3708
        {
3709
                galacticCenter->setDisplayed(displayed);
×
3710
                StelApp::immediateSave("viewing//flag_galactic_center", displayed);
×
3711
                emit galacticCenterDisplayedChanged(displayed);
×
3712
        }
3713
}
×
3714
//! Get flag for displaying galactic center and anticenter markers
3715
bool GridLinesMgr::getFlagGalacticCenter() const
×
3716
{
3717
        return galacticCenter->isDisplayed();
×
3718
}
3719
Vec3f GridLinesMgr::getColorGalacticCenter() const
×
3720
{
3721
        return galacticCenter->getColor();
×
3722
}
3723
void GridLinesMgr::setColorGalacticCenter(const Vec3f& newColor)
×
3724
{
3725
        if(newColor != galacticCenter->getColor())
×
3726
        {
3727
                galacticCenter->setColor(newColor);
×
3728
                emit galacticCenterColorChanged(newColor);
×
3729
        }
3730
}
×
3731

3732
//! Set flag for displaying supergalactic poles
3733
void GridLinesMgr::setFlagSupergalacticPoles(const bool displayed)
×
3734
{
3735
        if(displayed != supergalacticPoles->isDisplayed())
×
3736
        {
3737
                supergalacticPoles->setDisplayed(displayed);
×
3738
                StelApp::immediateSave("viewing/flag_supergalactic_poles", displayed);
×
3739
                emit supergalacticPolesDisplayedChanged(displayed);
×
3740
        }
3741
}
×
3742
//! Get flag for displaying supergalactic poles
3743
bool GridLinesMgr::getFlagSupergalacticPoles() const
×
3744
{
3745
        return supergalacticPoles->isDisplayed();
×
3746
}
3747
Vec3f GridLinesMgr::getColorSupergalacticPoles() const
×
3748
{
3749
        return supergalacticPoles->getColor();
×
3750
}
3751
void GridLinesMgr::setColorSupergalacticPoles(const Vec3f& newColor)
×
3752
{
3753
        if(newColor != supergalacticPoles->getColor())
×
3754
        {
3755
                supergalacticPoles->setColor(newColor);
×
3756
                emit supergalacticPolesColorChanged(newColor);
×
3757
        }
3758
}
×
3759

3760
//! Set flag for displaying equinox points of J2000
3761
void GridLinesMgr::setFlagEquinoxJ2000Points(const bool displayed)
×
3762
{
3763
        if(displayed != equinoxJ2000Points->isDisplayed())
×
3764
        {
3765
                equinoxJ2000Points->setDisplayed(displayed);
×
3766
                StelApp::immediateSave("viewing/flag_equinox_J2000_points", displayed);
×
3767
                emit equinoxJ2000PointsDisplayedChanged(displayed);
×
3768
        }
3769
}
×
3770
//! Get flag for displaying equinox points of J2000
3771
bool GridLinesMgr::getFlagEquinoxJ2000Points() const
×
3772
{
3773
        return equinoxJ2000Points->isDisplayed();
×
3774
}
3775
Vec3f GridLinesMgr::getColorEquinoxJ2000Points() const
×
3776
{
3777
        return equinoxJ2000Points->getColor();
×
3778
}
3779
void GridLinesMgr::setColorEquinoxJ2000Points(const Vec3f& newColor)
×
3780
{
3781
        if(newColor != equinoxJ2000Points->getColor())
×
3782
        {
3783
                equinoxJ2000Points->setColor(newColor);
×
3784
                emit equinoxJ2000PointsColorChanged(newColor);
×
3785
        }
3786
}
×
3787

3788
//! Set flag for displaying equinox points
3789
void GridLinesMgr::setFlagEquinoxPoints(const bool displayed)
×
3790
{
3791
        if(displayed != equinoxPoints->isDisplayed())
×
3792
        {
3793
                equinoxPoints->setDisplayed(displayed);
×
3794
                StelApp::immediateSave("viewing/flag_equinox_points", displayed);
×
3795
                emit equinoxPointsDisplayedChanged(displayed);
×
3796
        }
3797
}
×
3798
//! Get flag for displaying equinox points
3799
bool GridLinesMgr::getFlagEquinoxPoints() const
×
3800
{
3801
        return equinoxPoints->isDisplayed();
×
3802
}
3803
Vec3f GridLinesMgr::getColorEquinoxPoints() const
×
3804
{
3805
        return equinoxPoints->getColor();
×
3806
}
3807
void GridLinesMgr::setColorEquinoxPoints(const Vec3f& newColor)
×
3808
{
3809
        if(newColor != equinoxPoints->getColor())
×
3810
        {
3811
                equinoxPoints->setColor(newColor);
×
3812
                emit equinoxPointsColorChanged(newColor);
×
3813
        }
3814
}
×
3815

3816
//! Set flag for displaying solstice points of J2000
3817
void GridLinesMgr::setFlagSolsticeJ2000Points(const bool displayed)
×
3818
{
3819
        if(displayed != solsticeJ2000Points->isDisplayed())
×
3820
        {
3821
                solsticeJ2000Points->setDisplayed(displayed);
×
3822
                StelApp::immediateSave("viewing/flag_solstice_J2000_points", displayed);
×
3823
                emit solsticeJ2000PointsDisplayedChanged(displayed);
×
3824
        }
3825
}
×
3826
//! Get flag for displaying solstice points of J2000
3827
bool GridLinesMgr::getFlagSolsticeJ2000Points() const
×
3828
{
3829
        return solsticeJ2000Points->isDisplayed();
×
3830
}
3831
Vec3f GridLinesMgr::getColorSolsticeJ2000Points() const
×
3832
{
3833
        return solsticeJ2000Points->getColor();
×
3834
}
3835
void GridLinesMgr::setColorSolsticeJ2000Points(const Vec3f& newColor)
×
3836
{
3837
        if(newColor != solsticeJ2000Points->getColor())
×
3838
        {
3839
                solsticeJ2000Points->setColor(newColor);
×
3840
                emit solsticeJ2000PointsColorChanged(newColor);
×
3841
        }
3842
}
×
3843

3844
//! Set flag for displaying solstice points
3845
void GridLinesMgr::setFlagSolsticePoints(const bool displayed)
×
3846
{
3847
        if(displayed != solsticePoints->isDisplayed())
×
3848
        {
3849
                solsticePoints->setDisplayed(displayed);
×
3850
                StelApp::immediateSave("viewing/flag_solstice_points", displayed);
×
3851
                emit solsticePointsDisplayedChanged(displayed);
×
3852
        }
3853
}
×
3854
//! Get flag for displaying solstice points
3855
bool GridLinesMgr::getFlagSolsticePoints() const
×
3856
{
3857
        return solsticePoints->isDisplayed();
×
3858
}
3859
Vec3f GridLinesMgr::getColorSolsticePoints() const
×
3860
{
3861
        return solsticePoints->getColor();
×
3862
}
3863
void GridLinesMgr::setColorSolsticePoints(const Vec3f& newColor)
×
3864
{
3865
        if(newColor != solsticePoints->getColor())
×
3866
        {
3867
                solsticePoints->setColor(newColor);
×
3868
                emit solsticePointsColorChanged(newColor);
×
3869
        }
3870
}
×
3871

3872
//! Set flag for displaying antisolar point
3873
void GridLinesMgr::setFlagAntisolarPoint(const bool displayed)
×
3874
{
3875
        if(displayed != antisolarPoint->isDisplayed())
×
3876
        {
3877
                antisolarPoint->setDisplayed(displayed);
×
3878
                StelApp::immediateSave("viewing/flag_antisolar_point", displayed);
×
3879
                emit antisolarPointDisplayedChanged(displayed);
×
3880
        }
3881
}
×
3882
//! Get flag for displaying antisolar point
3883
bool GridLinesMgr::getFlagAntisolarPoint() const
×
3884
{
3885
        return antisolarPoint->isDisplayed();
×
3886
}
3887
Vec3f GridLinesMgr::getColorAntisolarPoint() const
×
3888
{
3889
        return antisolarPoint->getColor();
×
3890
}
3891
void GridLinesMgr::setColorAntisolarPoint(const Vec3f& newColor)
×
3892
{
3893
        if(newColor != antisolarPoint->getColor())
×
3894
        {
3895
                antisolarPoint->setColor(newColor);
×
3896
                emit antisolarPointColorChanged(newColor);
×
3897
        }
3898
}
×
3899

3900
void GridLinesMgr::setFlagUmbraCenterPoint(const bool displayed)
×
3901
{
3902
        if(displayed != umbraCenterPoint->isDisplayed())
×
3903
        {
3904
                umbraCenterPoint->setDisplayed(displayed);
×
3905
                StelApp::immediateSave("viewing/flag_umbra_center_point", displayed);
×
3906
                emit umbraCenterPointDisplayedChanged(displayed);
×
3907
        }
3908
}
×
3909
bool GridLinesMgr::getFlagUmbraCenterPoint() const
×
3910
{
3911
        return umbraCenterPoint->isDisplayed();
×
3912
}
3913

3914
//! Set flag for displaying vector point
3915
void GridLinesMgr::setFlagApexPoints(const bool displayed)
×
3916
{
3917
        if(displayed != apexPoints->isDisplayed())
×
3918
        {
3919
                apexPoints->setDisplayed(displayed);
×
3920
                StelApp::immediateSave("viewing/flag_apex_points", displayed);
×
3921
                emit apexPointsDisplayedChanged(displayed);
×
3922
        }
3923
}
×
3924
//! Get flag for displaying vector point
3925
bool GridLinesMgr::getFlagApexPoints() const
×
3926
{
3927
        return apexPoints->isDisplayed();
×
3928
}
3929
Vec3f GridLinesMgr::getColorApexPoints() const
×
3930
{
3931
        return apexPoints->getColor();
×
3932
}
3933
void GridLinesMgr::setColorApexPoints(const Vec3f& newColor)
×
3934
{
3935
        if(newColor != apexPoints->getColor())
×
3936
        {
3937
                apexPoints->setColor(newColor);
×
3938
                emit apexPointsColorChanged(newColor);
×
3939
        }
3940
}
×
3941

3942
void GridLinesMgr::setLineThickness(const float thickness)
×
3943
{
3944
        float lineThickness = equGrid->getLineThickness();
×
3945
        if (!qFuzzyCompare(lineThickness, thickness))
×
3946
        {
3947
                lineThickness=qBound(1.f, thickness, 5.f);
×
3948
                // Grids
3949
                equGrid->setLineThickness(lineThickness);
×
3950
                equJ2000Grid->setLineThickness(lineThickness);
×
3951
                fixedEquatorialGrid->setLineThickness(lineThickness);
×
3952
                galacticGrid->setLineThickness(lineThickness);
×
3953
                supergalacticGrid->setLineThickness(lineThickness);
×
3954
                eclGrid->setLineThickness(lineThickness);
×
3955
                eclJ2000Grid->setLineThickness(lineThickness);
×
3956
                aziGrid->setLineThickness(lineThickness);
×
3957
                // Lines
3958
                equatorLine->setLineThickness(lineThickness);
×
3959
                equatorJ2000Line->setLineThickness(lineThickness);
×
3960
                fixedEquatorLine->setLineThickness(lineThickness);
×
3961
                eclipticLine->setLineThickness(lineThickness);
×
3962
                eclipticWithDateLine->setLineThickness(lineThickness);
×
3963
                eclipticJ2000Line->setLineThickness(lineThickness);
×
3964
                invariablePlaneLine->setLineThickness(lineThickness);
×
3965
                solarEquatorLine->setLineThickness(lineThickness);
×
3966
                precessionCircleN->setLineThickness(lineThickness);
×
3967
                precessionCircleS->setLineThickness(lineThickness);
×
3968
                meridianLine->setLineThickness(lineThickness);
×
3969
                longitudeLine->setLineThickness(lineThickness);
×
3970
                quadratureLine->setLineThickness(lineThickness);
×
3971
                horizonLine->setLineThickness(lineThickness);
×
3972
                galacticEquatorLine->setLineThickness(lineThickness);
×
3973
                supergalacticEquatorLine->setLineThickness(lineThickness);
×
3974
                primeVerticalLine->setLineThickness(lineThickness);
×
3975
                currentVerticalLine->setLineThickness(lineThickness);
×
3976
                colureLine_1->setLineThickness(lineThickness);
×
3977
                colureLine_2->setLineThickness(lineThickness);
×
3978
                circumpolarCircleN->setLineThickness(lineThickness);
×
3979
                circumpolarCircleS->setLineThickness(lineThickness);
×
3980
                umbraCircle->setLineThickness(lineThickness);
×
3981
                penumbraCircle->setLineThickness(lineThickness);
×
3982

3983
                StelApp::immediateSave("viewing/line_thickness", lineThickness);
×
3984
                emit lineThicknessChanged(lineThickness);
×
3985
        }
3986
}
×
3987

3988
float GridLinesMgr::getLineThickness() const
×
3989
{
3990
        return equGrid->getLineThickness();
×
3991
}
3992

3993
void GridLinesMgr::setPartThickness(const float thickness)
×
3994
{
3995
        float partThickness = equatorLine->getPartThickness();
×
3996
        if (!qFuzzyCompare(partThickness, thickness))
×
3997
        {
3998
                partThickness=qBound(1.f, thickness, 5.f);
×
3999
                // Lines
4000
                equatorLine->setPartThickness(partThickness);
×
4001
                equatorJ2000Line->setPartThickness(partThickness);
×
4002
                fixedEquatorLine->setPartThickness(partThickness);
×
4003
                eclipticLine->setPartThickness(partThickness);
×
4004
                eclipticWithDateLine->setPartThickness(partThickness);
×
4005
                eclipticJ2000Line->setPartThickness(partThickness);
×
4006
                //invariablePlaneLine->setPartThickness(partThickness);
4007
                solarEquatorLine->setPartThickness(partThickness);
×
4008
                precessionCircleN->setPartThickness(partThickness);
×
4009
                precessionCircleS->setPartThickness(partThickness);
×
4010
                meridianLine->setPartThickness(partThickness);
×
4011
                longitudeLine->setPartThickness(partThickness);
×
4012
                horizonLine->setPartThickness(partThickness);
×
4013
                galacticEquatorLine->setPartThickness(partThickness);
×
4014
                supergalacticEquatorLine->setPartThickness(partThickness);
×
4015
                primeVerticalLine->setPartThickness(partThickness);
×
4016
                currentVerticalLine->setPartThickness(partThickness);
×
4017
                colureLine_1->setPartThickness(partThickness);
×
4018
                colureLine_2->setPartThickness(partThickness);
×
4019
                //circumpolarCircleN->setPartThickness(partThickness);
4020
                //circumpolarCircleS->setPartThickness(partThickness);
4021

4022
                StelApp::immediateSave("viewing/part_thickness", partThickness);
×
4023
                emit partThicknessChanged(partThickness);
×
4024
        }
4025
}
×
4026

4027
float GridLinesMgr::getPartThickness() const
×
4028
{
4029
        return equatorLine->getPartThickness();
×
4030
}
4031

4032
void GridLinesMgr::setFontSizeFromApp(int size)
×
4033
{
4034
        const int gridFontSize=size-1;
×
4035
        const int lineFontSize=size+1;
×
4036
        const int pointFontSize=size+1;
×
4037

4038
        equGrid->setFontSize(gridFontSize);
×
4039
        equJ2000Grid->setFontSize(gridFontSize);
×
4040
        fixedEquatorialGrid->setFontSize(gridFontSize);
×
4041
        galacticGrid->setFontSize(gridFontSize);
×
4042
        supergalacticGrid->setFontSize(gridFontSize);
×
4043
        eclGrid->setFontSize(gridFontSize);
×
4044
        eclJ2000Grid->setFontSize(gridFontSize);
×
4045
        aziGrid->setFontSize(gridFontSize);
×
4046
        equatorLine->setFontSize(lineFontSize);
×
4047
        equatorJ2000Line->setFontSize(lineFontSize);
×
4048
        fixedEquatorLine->setFontSize(lineFontSize);
×
4049
        eclipticLine->setFontSize(lineFontSize);
×
4050
        eclipticWithDateLine->setFontSize(lineFontSize);
×
4051
        eclipticJ2000Line->setFontSize(lineFontSize);
×
4052
        invariablePlaneLine->setFontSize(lineFontSize);
×
4053
        solarEquatorLine->setFontSize(lineFontSize);
×
4054
        precessionCircleN->setFontSize(lineFontSize);
×
4055
        precessionCircleS->setFontSize(lineFontSize);
×
4056
        meridianLine->setFontSize(lineFontSize);
×
4057
        longitudeLine->setFontSize(lineFontSize);
×
4058
        quadratureLine->setFontSize(lineFontSize);
×
4059
        horizonLine->setFontSize(lineFontSize);
×
4060
        galacticEquatorLine->setFontSize(lineFontSize);
×
4061
        supergalacticEquatorLine->setFontSize(lineFontSize);
×
4062
        primeVerticalLine->setFontSize(lineFontSize);
×
4063
        currentVerticalLine->setFontSize(lineFontSize);
×
4064
        colureLine_1->setFontSize(lineFontSize);
×
4065
        colureLine_2->setFontSize(lineFontSize);
×
4066
        circumpolarCircleN->setFontSize(lineFontSize);
×
4067
        circumpolarCircleS->setFontSize(lineFontSize);
×
4068
        umbraCircle->setFontSize(lineFontSize);
×
4069
        penumbraCircle->setFontSize(lineFontSize);
×
4070
        celestialJ2000Poles->setFontSize(pointFontSize);
×
4071
        celestialPoles->setFontSize(pointFontSize);
×
4072
        zenithNadir->setFontSize(pointFontSize);
×
4073
        eclipticJ2000Poles->setFontSize(pointFontSize);
×
4074
        eclipticPoles->setFontSize(pointFontSize);
×
4075
        galacticPoles->setFontSize(pointFontSize);
×
4076
        galacticCenter->setFontSize(pointFontSize);
×
4077
        supergalacticPoles->setFontSize(pointFontSize);
×
4078
        equinoxJ2000Points->setFontSize(pointFontSize);
×
4079
        equinoxPoints->setFontSize(pointFontSize);
×
4080
        solsticeJ2000Points->setFontSize(pointFontSize);
×
4081
        solsticePoints->setFontSize(pointFontSize);
×
4082
        apexPoints->setFontSize(pointFontSize);
×
4083
        umbraCenterPoint->setFontSize(pointFontSize);
×
4084
}
×
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