17#include "ui_vp1customtoureditor.h"
26#include <Inventor/nodes/SoGroup.h>
27#include <Inventor/nodes/SoCamera.h>
28#include <Inventor/SbBox.h>
34#include <QtCoreVersion>
42 Ui::VP1CustomTourEditorForm
ui;
45 QList<VP1CustomTourFrameWidget*>
frames;
51 int& nEnabledOrthographicFrames )
const;
61 QList<QByteArray> frameStates;
64 s.ignoreWidget(frame);
67 s.save(
m_d->ui.doubleSpinBox_theta);
68 s.save(
m_d->ui.doubleSpinBox_radius);
69 s.save(
m_d->ui.groupBox_utilityZoom);
84 QList<QByteArray> frameStates = s.restore<QList<QByteArray> >();
85 s.restore(
m_d->ui.doubleSpinBox_theta);
86 s.restore(
m_d->ui.doubleSpinBox_radius);
87 s.restore(
m_d->ui.groupBox_utilityZoom);
88 s.warnUnrestored(
this);
90 m_d->ui.widget_utilityZoomContents->setVisible(
m_d->ui.groupBox_utilityZoom->isChecked());
92 for (
const QByteArray& ba2 : frameStates)
94 m_d->updateFrameListVisuals();
101 : QWidget(0,Qt::WindowStaysOnTopHint),
m_d(new
Imp)
104 m_d->theclass =
this;
105 m_d->ui.setupUi(
this);
106 m_d->ui.groupBox_utilityZoom->setChecked(
false);
107 m_d->ui.widget_utilityZoomContents->setVisible(
false);
108 m_d->viewer = viewer;
109 setWindowIcon(QIcon(QString(
":/vp1/icons/icons/3d_32x32.png")));
110 m_d->frameHolderWidget =
new QWidget;
111 m_d->ui.scrollArea->setWidgetResizable(
true);
112 m_d->ui.scrollArea->setWidget(
m_d->frameHolderWidget);
114 connect(
new QShortcut(QKeySequence(Qt::Key_Escape),
this),SIGNAL(activated()),
this,SLOT(hide()));
115 connect(
m_d->ui.pushButton_close,SIGNAL(clicked()),
this,SLOT(hide()));
117 connect(
m_d->ui.pushButton_addCurrentView,SIGNAL(clicked()),
this,SLOT(
buttonClicked()));
118 connect(
m_d->ui.pushButton_refreshPreviews,SIGNAL(clicked()),
this,SLOT(
buttonClicked()));
119 connect(
m_d->ui.pushButton_execute,SIGNAL(clicked()),
this,SLOT(
buttonClicked()));
120 connect(
m_d->ui.pushButton_utilityZoomShow,SIGNAL(clicked()),
this,SLOT(
buttonClicked()));
122 m_d->objectsToDisableWhenTourUnavailable <<
m_d->ui.pushButton_execute;
130 m_d->frameHolderWidget->deleteLater();
132 frame->deleteLater();
163 int sliderpos=
ui.scrollArea->verticalScrollBar()->value();
165 if (o->isWidgetType()) {
166 static_cast<QWidget*
>(o)->setVisible(
false);
171 QVBoxLayout * vlayout =
new QVBoxLayout;
173 vlayout->addWidget(frame);
175 frame->setVisible(
true);
177 vlayout->addStretch(1);
180 sliderpos=std::max(
ui.scrollArea->verticalScrollBar()->minimum(),
181 std::min(
ui.scrollArea->verticalScrollBar()->maximum(),sliderpos));
182 ui.scrollArea->verticalScrollBar()->setValue(sliderpos);
183 theclass->enabledFrameListChanged();
195#if QTCORE_VERSION >= 0x050D00
196 m_d->frames.swapItemsAt(iframe-1,iframe);
198 m_d->frames.swap(iframe-1,iframe);
200 m_d->updateFrameListVisuals();
209 if (iframe>=
m_d->frames.count()-1)
211#if QTCORE_VERSION >= 0x050D00
212 m_d->frames.swapItemsAt(iframe,iframe+1);
214 m_d->frames.swap(iframe,iframe+1);
216 m_d->updateFrameListVisuals();
225 m_d->frames.removeAll(frame);
226 frame->deleteLater();
227 m_d->updateFrameStepControlsEnablement();
240 SoCamera * cam =
m_d->viewer->getCamera();
241 SoNode * root =
m_d->viewer->getSceneGraph();
242 if (!cam||!root||!root->getTypeId().isDerivedFrom(SoGroup::getClassTypeId()))
245 if (
m_d->viewer->isAnimating())
246 m_d->viewer->stopAnimating();
254 m_d->viewer->toggleCameraType();
255 SoCamera * cam =
m_d->viewer->getCamera();
266 for (
int i = 0; i <
frames.count(); ++i) {
268 bool earlier(
true), later(
true);
282 int iframe1(
m_d->frames.indexOf(frame1));
283 int iframe2(
m_d->frames.indexOf(frame2));
284 if ( iframe1==iframe2
287 ||iframe1>=
m_d->frames.count()
288 ||iframe2>=
m_d->frames.count() )
290#if QTCORE_VERSION >= 0x050D00
291 m_d->frames.swapItemsAt(iframe1,iframe2);
293 m_d->frames.swap(iframe1,iframe2);
295 m_d->updateFrameListVisuals();
301 if (
m_d->ui.pushButton_addCurrentView==sender()) {
303 m_d->viewer->currentCameraState());
304 m_d->addFrame(frame);
305 m_d->updateFrameSnapshot(frame);
306 m_d->updateFrameListVisuals();
307 }
else if (
m_d->ui.pushButton_refreshPreviews==sender()) {
309 m_d->updateFrameSnapshot(frame);
310 }
else if (
m_d->ui.pushButton_execute==sender()) {
311 m_d->viewer->startCustomTour();
312 }
else if (
m_d->ui.pushButton_utilityZoomShow==sender()) {
313 SoCamera * cam =
m_d->viewer->getCamera();
314 SoNode * root =
m_d->viewer->getSceneGraph();
315 if (!cam||!root||!root->getTypeId().isDerivedFrom(SoGroup::getClassTypeId()))
318 double r(
m_d->ui.doubleSpinBox_radius->value()*1000.0);
319 double theta(
m_d->ui.doubleSpinBox_theta->value()/180.0*
M_PI);
323 double a(
r/sqrt(3.0));
324 SbBox3f box(-
a,-
a,-
a,
a,
a,
a);
325 SbVec3f lookat = SbVec3f(sin(
theta),0,cos(
theta));
326 SbVec3f upvec = SbVec3f(0,1,0);
327 bool notifyenabled = cam->enableNotify(
false);
328 m_d->viewer->resetCamera();
330 box, 0.0, 100.0, 1.0,lookat,upvec);
332 cam->enableNotify(
true);
349 int& nEnabledOrthographicFrames )
const
351 nEnabledPerspectiveFrames = 0;
352 nEnabledOrthographicFrames = 0;
354 if (frame->frameIsEnabled()) {
355 if (frame->camStateIsPerspective())
356 ++nEnabledPerspectiveFrames;
358 ++nEnabledOrthographicFrames;
361 return nEnabledPerspectiveFrames+nEnabledOrthographicFrames;
368 int nEnabledPerspectiveFrames, nEnabledOrthographicFrames;
369 int n =
m_d->countEnabledFrames( nEnabledPerspectiveFrames,
370 nEnabledOrthographicFrames );
374 s =
"Add at least two frames for tour";
377 if (nEnabledPerspectiveFrames>0&&nEnabledOrthographicFrames>0) {
378 s =
"Mixed camera types are forbidden";
381 if (nEnabledPerspectiveFrames>0)
382 s=
"Perspective camera tour";
384 s=
"Orthographic camera tour";
387 m_d->ui.label_statustext->setText(s);
389 for (QObject * o :
m_d->objectsToDisableWhenTourUnavailable) {
390 if (o->isWidgetType())
391 static_cast<QWidget*
>(o)->setEnabled(enable);
393 static_cast<QAction*
>(o)->setEnabled(enable);
400 int nEnabledPerspectiveFrames, nEnabledOrthographicFrames;
401 int n =
m_d->countEnabledFrames( nEnabledPerspectiveFrames,
402 nEnabledOrthographicFrames );
403 if (nEnabledPerspectiveFrames>0&&nEnabledOrthographicFrames>0)
411 int nEnabledPerspectiveFrames, nEnabledOrthographicFrames;
412 m_d->countEnabledFrames( nEnabledPerspectiveFrames,
413 nEnabledOrthographicFrames );
415 return nEnabledOrthographicFrames==0;
423 bool firstInDirectJump(jumpDirectlyToFirstFrame);
427 if (firstInDirectJump) {
429 firstInDirectJump =
false;
454 m_d->objectsToDisableWhenTourUnavailable << o;
Scalar theta() const
theta method
void addFrame(REGION reg, const SbVec3f &dir, const SbVec3f &upvec, double t, bool variableSpeed=false, bool forceCircular=false, double clip=100.0)
AnimationSequence & sequence()
static VP1CameraHelper * animatedZoomToCameraState(SoCamera *camera, SoGroup *sceneroot, const QByteArray &camstate, double duration_in_secs=1.0, double clipVolPercent=100.0, double lastClipVolPercent=100.0, bool varySpeed=true, bool forceCircular=false)
static VP1CameraHelper * animatedZoomToBBox(SoCamera *camera, SoGroup *sceneroot, const SbBox3f &box, double duration_in_secs=1.0, double clipVolPercent=100.0, double slack=1.0, const SbVec3f &lookat=SbVec3f(999, 999, 999), const SbVec3f &upvec=SbVec3f(999, 999, 999), bool varySpeed=true, bool forceCircular=false)
VP1ExaminerViewer * viewer
int countEnabledFrames(int &nEnabledPerspectiveFrames, int &nEnabledOrthographicFrames) const
void updateFrameStepControlsEnablement()
VP1CustomTourEditor * theclass
QWidget * frameHolderWidget
void addFrame(VP1CustomTourFrameWidget *frame)
Ui::VP1CustomTourEditorForm ui
void updateFrameListVisuals()
QList< VP1CustomTourFrameWidget * > frames
void updateFrameSnapshot(VP1CustomTourFrameWidget *)
QList< QObject * > objectsToDisableWhenTourUnavailable
void swap(VP1CustomTourFrameWidget *, VP1CustomTourFrameWidget *)
void disableObjectWhenTourNotAvailable(QObject *)
void addTourToAnimationSequencer(AnimationSequencer &, bool jumpDirectlyToFirstFrame) const
void setClipVolumePercentOfATLAS(double)
bool tourIsPerspective() const
VP1CustomTourEditor(VP1ExaminerViewer *)
void setState(const QByteArray &)
void frameStepToEarlier()
void enabledFrameListChanged()
void closeEvent(QCloseEvent *)
void clipVolumeRadiusChanged(double)
bool tourAvailable() const
void clipVolumePercentOfATLAS(double)
virtual ~VP1CustomTourEditor()
static bool deserializeSoCameraParameters(QByteArray &, SoCamera &)