Developer Documentation

QtBaseViewerSnapshot.cc
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openflipper.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenFlipper. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41
42
43
44
45
46 //=============================================================================
47 //
48 // CLASS QtBaseViewer - IMPLEMENTATION
49 //
50 //=============================================================================
51
52
53 //== INCLUDES =================================================================
54
55 #include "QtBaseViewer.hh"
56 #include "QtGLGraphicsScene.hh"
57 #include "QtGLGraphicsView.hh"
58
59 #include <QApplication>
60 #include <QStatusBar>
61 #include <QFileInfo>
62 #include <QFileDialog>
63
64 //== NAMESPACES ===============================================================
65
66 namespace ACG {
67 namespace QtWidgets {
68
69
70 //== IMPLEMENTATION ==========================================================
71
72 void QtBaseViewer::snapshotBaseFileName(const QString& _fname)
73 {
74 snapshotName_=_fname;
75 snapshotCounter_=0;
76 }
77
78
79 //-----------------------------------------------------------------------------
80
81
82 void QtBaseViewer::snapshot()
83 {
84 makeCurrent();
85
86 glView_->raise();
87 qApp->processEvents();
88 makeCurrent();
89 paintGL();
90 glFinish();
91 copyToImage(*snapshot_, 0, 0, glWidth(), glHeight(), GL_BACK);
92
93 QFileInfo fi(snapshotName_);
94
95 QString fname = fi.path() + QDir::separator() +fi.baseName() + "." + QString::number(snapshotCounter_).rightJustified(7, '0') + ".";
96
97 QString format="png";
98
99 if (fi.completeSuffix() == "ppm")
100 format="ppmraw";
101
102 fname += format;
103
104 bool rval=snapshot_->save(fname,format.toUpper().toLatin1());
105
106
107 assert(statusbar_!=0);
108 if (rval)
109 {
110 statusbar_->showMessage(QString("snapshot: ")+fname,5000);
111 if ( action_["SnapshotSavesView"]->isChecked() )
112 {
113 QString view; encodeView(view);
114 QFile f(fname+".view"); f.open(QIODevice::WriteOnly|QIODevice::Truncate);
115 QTextStream sf(&f); sf << view; f.close();
116 }
117 }
118 else
119 {
120 statusbar_->showMessage(QString("could not save snapshot to ")+fname);
121 }
122
123 ++snapshotCounter_;
124 }
125
126 //-----------------------------------------------------------------------------
127
128
129 void QtBaseViewer::actionSnapshot()
130 {
131 snapshot();
132 }
133
134
135 //-----------------------------------------------------------------------------
136
137
138 void QtBaseViewer::actionSnapshotName()
139 {
140 QString fname=snapshotName_;
141
142 fname.replace('%', '$');
143 fname = QFileDialog::getSaveFileName ( 0, "Save snapshot name" );
144 if (!fname.isEmpty())
145 {
146 fname.replace('$', '%');
147
148 snapshotBaseFileName(fname);
149 assert(statusbar_!=0);
150 QString msg="next snapshot: ";
151 statusbar_->showMessage(msg);
152 }
153 }
154
155
156 //-----------------------------------------------------------------------------
157
158
159 void QtBaseViewer::actionSnapshotSavesView()
160 {
161 }
162
163 //=============================================================================
164 } // namespace QtWidgets
165 } // namespace ACG
166 //=============================================================================
ACG::QtWidgets::QtBaseViewer::encodeView
void encodeView(QString &_view)
convert current view to text representation
Definition: QtBaseViewer.cc:1323
ACG::QtWidgets::QtBaseViewer::snapshotName_
QString snapshotName_
Definition: QtBaseViewer.hh:1151
ACG
Namespace providing different geometric functions concerning angles.
Definition: BaseObjectData.hh:68
ACG::QtWidgets::QtBaseViewer::actionSnapshotName
void actionSnapshotName()
Definition: QtBaseViewerSnapshot.cc:138
ACG::QtWidgets::QtBaseViewer::makeCurrent
virtual void makeCurrent()
Makes this widget the current widget for OpenGL operations.
Definition: QtBaseViewer_qt.cc:131
ACG::QtWidgets::QtBaseViewer::snapshotCounter_
int snapshotCounter_
Definition: QtBaseViewer.hh:1152
ACG::QtWidgets::QtBaseViewer::paintGL
virtual void paintGL()
draw the scene. Triggered by updateGL().
Definition: QtBaseViewer.cc:1212
ACG::QtWidgets::QtBaseViewer::copyToImage
void copyToImage(QImage &_image, GLenum _buffer=GL_BACK)
copy current framebuffer to an QImage
Definition: QtBaseViewer.hh:434
ACG::QtWidgets::QtBaseViewer::glWidth
unsigned int glWidth() const
get width of QGLWidget
Definition: QtBaseViewer.cc:1727
ACG::QtWidgets::QtBaseViewer::actionSnapshot
void actionSnapshot()
Definition: QtBaseViewerSnapshot.cc:129
ACG::QtWidgets::QtBaseViewer::actionSnapshotSavesView
void actionSnapshotSavesView()
Definition: QtBaseViewerSnapshot.cc:159
ACG::QtWidgets::QtBaseViewer::snapshot
virtual void snapshot()
Definition: QtBaseViewerSnapshot.cc:82
ACG::QtWidgets::QtBaseViewer::snapshot_
QImage * snapshot_
Definition: QtBaseViewer.hh:1153
ACG::QtWidgets::QtBaseViewer::snapshotBaseFileName
virtual void snapshotBaseFileName(const QString &_fname)
Definition: QtBaseViewerSnapshot.cc:72
ACG::QtWidgets::QtBaseViewer::glHeight
unsigned int glHeight() const
get height of QGLWidget
Definition: QtBaseViewer.cc:1730