Kstars

simplefovexporter.cpp
1 /*
2  SPDX-FileCopyrightText: 2011 Rafał Kułaga <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "simplefovexporter.h"
8 
9 #include "kstars.h"
10 #include "kstarsdata.h"
11 #include "skymap.h"
12 #include "skyqpainter.h"
13 #include "fov.h"
14 #include "skymapcomposite.h"
15 #include "kstars/Options.h"
16 
18  : m_KSData(KStarsData::Instance()), m_Map(KStars::Instance()->map()), m_StopClock(false), m_OverrideFovShape(false),
19  m_DrawFovSymbol(false), m_PrevClockState(false), m_PrevSlewing(false), m_PrevPoint(nullptr), m_PrevZoom(0)
20 {
21 }
22 
24 {
25  saveState(true);
26  pExportFov(point, fov, pd);
27  restoreState(true);
28 }
29 
31 {
32  pExportFov(nullptr, fov, pd);
33 }
34 
36 {
37  SkyQPainter painter(m_Map, pd);
38  painter.begin();
39 
40  painter.drawSkyBackground();
41 
42  // translate painter coordinates - it's necessary to extract only the area of interest (FOV)
43  int dx = (m_Map->width() - pd->width()) / 2;
44  int dy = (m_Map->height() - pd->height()) / 2;
45  painter.translate(-dx, -dy);
46 
47  m_KSData->skyComposite()->draw(&painter);
48  m_Map->getSkyMapDrawAbstract()->drawOverlays(painter, false);
49 }
50 
52  const QList<QPaintDevice *> &pds)
53 {
54  Q_ASSERT(points.size() == fovs.size() && fovs.size() == pds.size());
55 
56  saveState(true);
57 
58  for (int i = 0; i < points.size(); i++)
59  {
60  exportFov(points.value(i), fovs.at(i), pds.value(i));
61  }
62 
63  restoreState(true);
64 }
65 
67 {
68  Q_ASSERT(points.size() == pds.size());
69 
70  saveState(true);
71 
72  for (int i = 0; i < points.size(); i++)
73  {
74  exportFov(points.at(i), fov, pds.at(i));
75  }
76 
77  restoreState(true);
78 }
79 
80 void SimpleFovExporter::pExportFov(SkyPoint *point, FOV *fov, QPaintDevice *pd)
81 {
82  if (point)
83  {
84  // center sky map on selected point
85  m_Map->setClickedPoint(point);
86  m_Map->slotCenter();
87  }
88 
89  // this is temporary 'solution' that will be changed during the implementation of printing
90  // on large paper sizes (>A4), in which case it'll be desirable to export high-res FOV
91  // representations
92  if (pd->height() > m_Map->height() || pd->width() > m_Map->width())
93  {
94  return;
95  }
96 
97  // calculate zoom factor
98  double zoom = 0;
99  QRegion region;
100  int regionX(0), regionY(0);
101  double fovSizeX(0), fovSizeY(0);
102  if (fov->sizeX() > fov->sizeY())
103  {
104  zoom = calculateZoomLevel(pd->width(), fov->sizeX());
105 
106  // calculate clipping region size
107  fovSizeX = calculatePixelSize(fov->sizeX(), zoom);
108  fovSizeY = calculatePixelSize(fov->sizeY(), zoom);
109  regionX = 0;
110  regionY = 0.5 * (pd->height() - fovSizeY);
111  }
112 
113  else
114  {
115  zoom = calculateZoomLevel(pd->height(), fov->sizeY());
116 
117  // calculate clipping region size
118  fovSizeX = calculatePixelSize(fov->sizeX(), zoom);
119  fovSizeY = calculatePixelSize(fov->sizeY(), zoom);
120  regionX = 0.5 * (pd->width() - fovSizeX);
121  regionY = 0;
122  }
123 
124  if (fov->shape() == FOV::SQUARE)
125  {
126  region = QRegion(regionX, regionY, fovSizeX, fovSizeY, QRegion::Rectangle);
127  }
128 
129  else
130  {
131  region = QRegion(regionX, regionY, fovSizeX, fovSizeY, QRegion::Ellipse);
132  }
133 
134  m_Map->setZoomFactor(zoom);
135 
136  SkyQPainter painter(m_Map, pd);
137  painter.begin();
138 
139  painter.drawSkyBackground();
140 
141  if (!m_OverrideFovShape)
142  {
143  painter.setClipRegion(region);
144  }
145  // translate painter coordinates - it's necessary to extract only the area of interest (FOV)
146  int dx = (m_Map->width() - pd->width()) / 2;
147  int dy = (m_Map->height() - pd->height()) / 2;
148  painter.translate(-dx, -dy);
149 
150  m_KSData->skyComposite()->draw(&painter);
151  m_Map->getSkyMapDrawAbstract()->drawOverlays(painter, false);
152 
153  // reset painter coordinate transform to paint FOV symbol in the center
154  painter.resetTransform();
155 
156  if (m_DrawFovSymbol)
157  {
158  fov->draw(painter, zoom);
159  }
160 }
161 
162 void SimpleFovExporter::saveState(bool savePos)
163 {
164  // stop simulation if it's not already stopped
165  m_PrevClockState = m_KSData->clock()->isActive();
166  if (m_StopClock && m_PrevClockState)
167  {
168  m_KSData->clock()->stop();
169  }
170 
171  // disable useAnimatedSlewing option
172  m_PrevSlewing = Options::useAnimatedSlewing();
173  if (m_PrevSlewing)
174  {
175  Options::setUseAnimatedSlewing(false);
176  }
177 
178  // save current central point and zoom level
179  m_PrevPoint = savePos ? m_Map->focusPoint() : nullptr;
180  m_PrevZoom = Options::zoomFactor();
181 }
182 
183 void SimpleFovExporter::restoreState(bool restorePos)
184 {
185  // restore previous useAnimatedSlewing option
186  if (m_PrevSlewing)
187  {
188  Options::setUseAnimatedSlewing(true);
189  }
190 
191  if (restorePos)
192  {
193  // restore previous central point
194  m_Map->setClickedPoint(m_PrevPoint);
195  m_Map->slotCenter();
196  }
197  // restore previous zoom level
198  m_Map->setZoomFactor(m_PrevZoom);
199 
200  // restore clock state (if it was stopped)
201  if (m_StopClock && m_PrevClockState)
202  {
203  m_KSData->clock()->start();
204  }
205 }
void exportFov(SkyPoint *point, FOV *fov, QPaintDevice *pd)
Paint FOV representation on passed QPaintDevice subclass.
Definition: fov.h:27
void begin() override
Begin painting.
int width() const const
The QPainter-based painting backend.
Definition: skyqpainter.h:28
Stores dms coordinates for a point in the sky. for converting between coordinate systems.
Definition: skypoint.h:44
void setZoomFactor(double factor)
@ Set zoom factor.
Definition: skymap.cpp:1176
void drawSkyBackground() override
Draw the sky background.
SimpleFovExporter()
Constructor.
void setClickedPoint(const SkyPoint *f)
Set the ClickedPoint to the skypoint given as an argument.
Definition: skymap.cpp:996
void drawOverlays(QPainter &p, bool drawFov=true)
Draw the overlays on top of the sky map.
void draw(QPainter &p, float zoomFactor)
draw the FOV symbol on a QPainter
Definition: fov.cpp:230
int height() const const
int size() const const
void draw(SkyPainter *skyp) override
Delegate draw requests to all sub components psky Reference to the QPainter on which to paint.
QAction * zoom(const QObject *recvr, const char *slot, QObject *parent)
const T & at(int i) const const
Q_INVOKABLE SimClock * clock()
Definition: kstarsdata.h:217
This is the main window for KStars. In addition to the GUI elements, the class contains the program c...
Definition: kstars.h:92
Q_SCRIPTABLE Q_NOREPLY void stop()
DBUS function to stop the SimClock.
Definition: simclock.cpp:104
void slotCenter()
Center the display at the point ClickedPoint.
Definition: skymap.cpp:345
SkyMapComposite * skyComposite()
Definition: kstarsdata.h:165
Q_SCRIPTABLE Q_NOREPLY void start()
DBUS function to start the SimClock.
Definition: simclock.cpp:120
static double calculateZoomLevel(int pixelSize, float degrees)
Calculate zoom level at which given angular length will occupy given length in pixels.
void translate(const QPointF &offset)
SkyPoint * focusPoint()
retrieve the FocusPoint position.
Definition: skymap.h:148
Q_INVOKABLE bool isActive()
Whether the clock is active or not is a bit complicated by the introduction of "manual mode".
Definition: simclock.cpp:96
static double calculatePixelSize(float degrees, double zoomLevel)
Calculate pixel size of given angular length at given zoom level.
T value(int i) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Fri Aug 19 2022 03:57:55 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.