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