ATLAS Offline Software
Loading...
Searching...
No Matches
IVP13DChannelWidget.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6// //
7// Implementation of class IVP13DChannelWidget //
8// //
9// Author: Thomas Kittelmann <Thomas.Kittelmann@cern.ch> //
10// //
11// Initial version: April 2007 //
12// //
14
19#include "VP1Base/VP1Msg.h"
20
21#include <QPixmap>
22#include <QPainter>
23#include <QBuffer>
24#include <QByteArray>
25
26#include <Inventor/C/errors/debugerror.h>
27#include "Inventor/Qt/SoQtRenderArea.h"
28#include <Inventor/Qt/viewers/SoQtExaminerViewer.h>
29#include "Inventor/nodes/SoNode.h"
30#include <Inventor/actions/SoLineHighlightRenderAction.h>
31#include <iostream>
32
34public:
35
36 // typedef std::vector<SoQtRenderArea*> RenderAreaList;
37 // std::vector<SoQtRenderArea*>::iterator it, itE;
38 typedef std::vector<VP1ExaminerViewer*> RenderAreaList;
39 // cppcheck-suppress uninitMemberVarNoCtor
40 std::vector<VP1ExaminerViewer*>::iterator it, itE;
41
43};
44
45//___________________________________________________
46IVP13DChannelWidget::IVP13DChannelWidget(const QString & name, const QString & information, const QString & contact_info)
48{
49 m_d->itE = m_d->renderareas.end();
50
51}
52
53//___________________________________________________
55{
56 setUpdatesEnabled(false);
57 m_d->it = m_d->renderareas.begin();
58 for (;m_d->it!=m_d->itE;++(m_d->it)) {
59 // SoQtRenderArea* ra = *(m_d->it);
60 VP1ExaminerViewer* ra = *(m_d->it);
61 ra->setAutoRedraw(false);//extra
62 SoNode * root = ra->getSceneGraph();
63 root->ref();
64 ra->setSceneGraph(0);
65 // SoGLRenderAction * renderaction1 = ra->getGLRenderAction();
66 // SoGLRenderAction * renderaction2 = ra->getOverlayGLRenderAction();
67 SoLineHighlightRenderAction * trick = new SoLineHighlightRenderAction();
68 SoLineHighlightRenderAction * trick2 = new SoLineHighlightRenderAction();
69 ra->setGLRenderAction(trick);
70 ra->setOverlayGLRenderAction(trick2);
71 // ra->setGLRenderAction(0);
72 // ra->setOverlayGLRenderAction(0);
73 delete ra;
74 // delete renderaction1;
75 // delete renderaction2;
76 delete trick;
77 delete trick2;
78 root->unref();
79 }
80 delete m_d;
81}
82
83//___________________________________________________
85{
86 m_d->it = m_d->renderareas.begin();
87 for (;m_d->it!=m_d->itE;++(m_d->it)) {
88 (*(m_d->it))->setAutoRedraw(enable);
89 }
90 IVP1ChannelWidget::setUpdatesEnabled(enable);
91}
92
93//___________________________________________________
94//void IVP13DChannelWidget::registerRenderArea(SoQtRenderArea* ra)
96{
97 if (!ra) {
98 message("Error - tried to register NULL render area!");
99 return;
100 }
101
103
104 m_d->renderareas.push_back(ra);
105 m_d->itE = m_d->renderareas.end();
106
107 //To make sure that it is the actual 3D widget that gets focus when
108 //we e.g. click anywhere else in the widget where the render area is
109 //placed within:
110 if (ra->getParentWidget()&&ra->getWidget())
111 ra->getParentWidget()->setFocusProxy(ra->getWidget());
112}
113
114//___________________________________________________
116{
117 //Stop spinning and abort any ongoing animations:
118 m_d->it = m_d->renderareas.begin();
119 for (;m_d->it!=m_d->itE;++(m_d->it)) {
120 VP1ExaminerViewer* ra = *(m_d->it);
121 if (ra->getTypeId().isDerivedFrom(SoQtViewer::getClassTypeId())) {
122 VP1CameraHelper::abortAnyCurrentZoom(static_cast<SoQtViewer*>(ra)->getCamera());
123 if (ra->getTypeId().isDerivedFrom(SoQtExaminerViewer::getClassTypeId())) {
124 if (static_cast<SoQtExaminerViewer*>(ra)->isAnimating())
125 static_cast<SoQtExaminerViewer*>(ra)->stopAnimating();
126 }
127 }
128 }
129}
130
131//_______________________________________________________
132QPixmap IVP13DChannelWidget::getSnapshot(bool transp, int width, bool /*batch*/)
133{
134 VP1Msg::messageVerbose("IVP13DChannelWidget::getSnapshot()");
135
136 // TODO: check if transp and width can be used in this implementation of the method
137 VP1Msg::messageVerbose("(currently, we are not using the values - transp: "+QString::number(transp)+" - width: "+QString::number(width)+")");
138
139 //Unfortunately, the renderer's areas does not render properly by a
140 //simple grabWidget. We remedy this the hard way...
141 // m_d->it = m_d->renderareas.begin();
142 // message("Have "+QString::number(m_d->renderareas.size())+" ras");
143 // for (;m_d->it!=m_d->itE;++(m_d->it)) {
144 // SoQtRenderArea* ra = *(m_d->it);
145 // if (ra->isDoubleBuffer()) message("doublebuffer");
146 // if (ra->isDrawToFrontBufferEnable()) message("isDrawToFrontBufferEnable");
147 // if (ra->isQuadBufferStereo()) message("isQuadBufferStereo");
148 // if (ra->getAccumulationBuffer()) message("getAccumulationBuffer");
149 // if (ra->isOverlayRender()) message("isOverlayRender");
150 // if (ra->isClearBeforeRender()) message("isClearBeforeRender");
151 // ra->render();
152 // }
153 // return QPixmap::grabWidget ( this );
154
155 QPixmap pm(geometry().size());
156
157 QPainter painter;
158 painter.begin(&pm);
159 painter.drawPixmap(0,0,this->grab ( ));
160
161 m_d->it = m_d->renderareas.begin();
162 for (;m_d->it!=m_d->itE;++(m_d->it)) {
163 VP1ExaminerViewer* ra = *(m_d->it);
164 QWidget * ra_w = ra->getNormalWidget();
165 QPixmap pmra = VP1QtInventorUtils::renderToPixmap(ra, ra_w->geometry().width(),ra_w->geometry().height());
166 if (pmra.isNull()) {
167 message("Error rendering scene to QPixmap!");
168 return QPixmap();
169 }
170 QPoint pos = ra_w->mapTo( this, QPoint(0,0) );
171
172 painter.drawPixmap(pos.x(),pos.y(),pmra);
173
174 }
175 painter.end();
176
177 return pm;
178}
179
180//_______________________________________________________
182{
183 // ===> Setup stream writing to a byteArray:
184 QByteArray byteArray;
185 QBuffer buffer(&byteArray);
186 buffer.open(QIODevice::WriteOnly);
187 QDataStream out(&buffer);
188
189 // ===> Write Data:
190
191 //Version & base state:
192 out << (qint32)1; //version
193 out << IVP1ChannelWidget::saveState();//Always include state info from the base class.
194
195 // Data from this class:
196
197 //Transparency types (version 0 saved as strings instead of ints):
198 QList<int> transptypes;
199 m_d->it = m_d->renderareas.begin();
200 for (;m_d->it!=m_d->itE;++(m_d->it))
201 transptypes << VP1QtInventorUtils::transparencyTypeToInt((*(m_d->it))->getTransparencyType());
202 out << transptypes;
203
204 //For any render area that can be casted as an SoQtViewer, we store the camera type and parameters.
205 //SoQtViewer::toggleCameraType()
206 //todo...
207
208 // ===> Finish up:
209 buffer.close();
210 return byteArray;
211
212}
213
214//_______________________________________________________
216{
217 // ===> Setup stream for getting the contents of the byteArray:
218 QBuffer buffer(&ba);
219 buffer.open(QIODevice::ReadOnly);
220 QDataStream state(&buffer);
221 // ===> Check version and pass on state info to base class:
222 qint32 version;
223 state >> version;
224 if (version!=0&&version!=1) {
225 message("Warning: State data in .vp1 file is in wrong format - ignoring!");
226 return;
227 }
228
229 QByteArray basestate;
230 state >> basestate;
231 IVP1ChannelWidget::restoreFromState(std::move(basestate));
232 // ===> Decode the state info:
233
234 //Transparency types:
235 if (version==0) {
236 QStringList dummy;
237 state >> dummy;
238 } else {
239 QList<int> transptypes;
240 state >> transptypes;
241 if (transptypes.count()!=static_cast<int>(m_d->renderareas.size())) {
242 message("Warning: State data in .vp1 file is in wrong format - ignoring!");
243 buffer.close();
244 return;
245 }
246 m_d->it = m_d->renderareas.begin();
247 for (;m_d->it!=m_d->itE;++(m_d->it))
248 (*(m_d->it))->setTransparencyType(VP1QtInventorUtils::intToTransparencyType(transptypes.takeFirst()));
249 }
250
251 //Camera angles:
252 //todo..
253
254 // ===> Finish up:
255 buffer.close();
256}
size_t size() const
Number of registered mappings.
const double width
std::vector< VP1ExaminerViewer * >::iterator it
std::vector< VP1ExaminerViewer * > RenderAreaList
std::vector< VP1ExaminerViewer * >::iterator itE
virtual QByteArray saveState()
void registerRenderArea(VP1ExaminerViewer *)
virtual QPixmap getSnapshot(bool transp=false, int width=0, bool batch=false)
IVP13DChannelWidget(const QString &name, const QString &information, const QString &contact_info)
virtual void restoreFromState(QByteArray)
void setUpdatesEnabled(bool enable)
virtual void restoreFromState(QByteArray)
void message(QString)
const QString & information() const
const QString & name() const
IVP1ChannelWidget(const QString &name, const QString &information, const QString &contact_info)
const QString & contact_info() const
virtual QByteArray saveState()
static void abortAnyCurrentZoom(SoCamera *camera)
virtual void setSceneGraph(SoNode *)
virtual SoNode * getSceneGraph()
static void messageVerbose(const QString &)
Definition VP1Msg.cxx:84
static void ensureInitLineWidthAndPointSize(SoQtRenderArea *)
static QPixmap renderToPixmap(VP1ExaminerViewer *ra, int pixels_x, int pixels_y, bool transparent_background=false, double actualRenderedSizeFact=1.0)
static SoGLRenderAction::TransparencyType intToTransparencyType(int)
static int transparencyTypeToInt(SoGLRenderAction::TransparencyType)