]> Creatis software - clitk.git/blob - vv/vvToolRigidReg.cxx
Added Loading initial transformation functionality
[clitk.git] / vv / vvToolRigidReg.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #include "vvToolRigidReg.h"
19 #include <QComboBox>
20 #include <QCursor>
21 #include <QApplication>
22 #include <vtkImageData.h>
23 #include <vtkSmartPointer.h>
24 #include <vtkTransform.h>
25 #include <vvImageReader.h>
26 #include "vvImage.h"
27 #include "vvSlicer.h"
28 #include <QFile>
29 #include "clitkTransformUtilities.h"
30 #include <QString>
31 #include <QMessageBox>
32 #include <vvMainWindow.h>
33 #include <QFileDialog>
34 #include <QTextStream>
35 //------------------------------------------------------------------------------
36 // Create the tool and automagically (I like this word) insert it in
37 // the main window menu.
38 ADD_TOOL(vvToolRigidReg);
39 //------------------------------------------------------------------------------
40
41 //------------------------------------------------------------------------------
42 vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
43     vvToolWidgetBase(parent, f),
44     vvToolBase<vvToolRigidReg>(parent),
45     Ui::vvToolRigidReg()
46 {
47   // GUI Initialization
48   Ui_vvToolRigidReg::setupUi(mToolWidget);
49    QSize qsize;
50    qsize.setHeight(470);
51    qsize.setWidth(850);
52    mToolWidget->setFixedSize(qsize);
53
54
55   // Set how many inputs are needed for this tool
56  // mFilter = new clitk::AffineTransformGenericFilter<args_info_clitkAffineTransform>;
57
58   // Set how many inputs are needed for this tool
59  AddInputSelector("Select moving image");
60  AddInputSelector("Select fixed image");
61 }
62 //------------------------------------------------------------------------------
63
64 //------------------------------------------------------------------------------
65 vvToolRigidReg::~vvToolRigidReg()
66 {
67 }
68 //------------------------------------------------------------------------------
69
70 //------------------------------------------------------------------------------
71 bool vvToolRigidReg::close()
72 {
73   ResetTransform();
74   RemoveOverlay();
75   return vvToolWidgetBase::close();
76 }
77 //------------------------------------------------------------------------------
78
79 //------------------------------------------------------------------------------
80 void vvToolRigidReg::reject()
81 {
82    return vvToolWidgetBase::reject();
83 }
84 //------------------------------------------------------------------------------
85
86 //------------------------------------------------------------------------------
87 void vvToolRigidReg::GetArgsInfoFromGUI()
88 {
89   DD("works");
90 }
91 //------------------------------------------------------------------------------
92
93 //------------------------------------------------------------------------------
94 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
95 {
96   //inputs
97   mInput1 = l[0];
98   mInput2 = l[1];
99
100   UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),textEdit_2);
101
102   for(int i =0;i<4;i++)
103     for(int j=0;j<4;j++)
104      mInitialMatrix[i*4+j]=mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j);
105
106   if(mInput1->GetFileName()==mInput2->GetFileName())
107   {
108     QMessageBox::information(this, "Warning","Your Reference and Target Images are the same");
109   }
110   mTwoInputs = true;
111   SetOverlay();
112   mImageSize=mInput1->GetImage()->GetSize();
113   SetRotationCenter();
114   SetSliderRanges();
115
116     //connect all sigs to slots
117    connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform()));
118    connect(tab2loadbutton, SIGNAL(pressed()), this, SLOT(AutoRegister()));
119
120    connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
121    connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
122    connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
123
124    connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
125    connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
126    connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
127
128
129    connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
130    connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
131    connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
132
133    connect(xtrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
134    connect(ytrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
135    connect(ztrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
136    connect(xrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
137    connect(yrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
138    connect(zrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
139
140    connect(loadbutton, SIGNAL(pressed()), this, SLOT(ReadFile()));
141    connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile()));
142
143 }
144 //------------------------------------------------------------------------------
145
146 //------------------------------------------------------------------------------
147 void vvToolRigidReg::apply()
148 {
149   RemoveOverlay();
150 }
151 //------------------------------------------------------------------------------
152
153 //------------------------------------------------------------------------------
154 void vvToolRigidReg::SetOverlay()
155 {
156     for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
157    mCurrentSlicerManager->GetSlicer(i)->SetOverlay(mInput2->GetImage());
158    mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true);
159    mCurrentSlicerManager->SetColorMap();
160    mCurrentSlicerManager->Render();
161    }
162   }
163 //------------------------------------------------------------------------------
164
165 //------------------------------------------------------------------------------
166 void vvToolRigidReg::RemoveOverlay()
167 {
168    for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers();i++)
169          {
170            mInput1->RemoveActor("overlay",0);
171            mInput1->SetColorMap(0);
172            mInput1->Render();
173            hide();
174          }
175 }
176 //------------------------------------------------------------------------------
177
178 //------------------------------------------------------------------------------
179 void vvToolRigidReg::SetXvalue()
180 {
181   QString xstr = Xval->text();
182 }
183 //------------------------------------------------------------------------------
184
185 //------------------------------------------------------------------------------
186 void vvToolRigidReg::SetYvalue()
187 {
188   QString ystr = Yval->text();
189 }
190 //------------------------------------------------------------------------------
191
192 //------------------------------------------------------------------------------
193 void vvToolRigidReg::SetZvalue()
194 {
195   QString zstr = Zval->text();
196 }
197 //------------------------------------------------------------------------------
198
199 //------------------------------------------------------------------------------
200 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ,bool update)
201 {
202   vtkSmartPointer<vtkTransform> transform = mInput1->GetImage()->GetTransform();
203   transform->PostMultiply();
204   //Rotations
205   if (aX!=0 || aY!=0 || aZ!=0) {
206     double x, y ,z;
207     x= Xval->text().toDouble();
208     y= Yval->text().toDouble();
209     z= Zval->text().toDouble();
210     transform->Translate(-x,-y,-z);
211     if (aX!=0) transform->RotateX(aX);
212     if (aY!=0) transform->RotateY(aY);
213     if (aZ!=0) transform->RotateZ(aZ);
214     transform->Translate(x,y,z);
215   }
216   //Translations
217   if (tX!=0||tY!=0||tZ!=0)
218     transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],tY*mInput1->GetImage()->GetSpacing()[1],tZ*mInput1->GetImage()->GetSpacing()[2]);
219 }
220 //------------------------------------------------------------------------------
221
222 //------------------------------------------------------------------------------
223 void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
224 {
225     vtkSmartPointer<vtkTransform> transform =mCurrentSlicerManager->GetImage()->GetTransform();
226     transform->SetMatrix(matrix);
227     Render();
228 }
229 //------------------------------------------------------------------------------
230
231 //------------------------------------------------------------------------------
232 void vvToolRigidReg::Render()
233 {
234     for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
235       mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
236       mCurrentSlicerManager->GetSlicer(i)->Render();
237       }
238 }
239 //------------------------------------------------------------------------------
240
241 //------------------------------------------------------------------------------
242   void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QTextEdit* textEdit)
243 {
244     QFont font=QFont("Times New Roman",11);
245     textEdit->setCurrentFont(font);
246     textEdit->update();
247
248     QString str1,str2,str3;
249     QColor color;
250     textEdit->clear();
251     textEdit->setAcceptRichText(true);
252     str2=textEdit->toPlainText();
253     str2.append("#Rotation Center(mm): \n#");
254     textEdit->setText(str2);
255
256     str2=textEdit->toPlainText();
257     textEdit->setTextColor(QColor(255,0,0));
258     str2.append(str3.append(Xval->text()));
259     textEdit->setText(str2);
260     str3.clear();
261
262     str2=textEdit->toPlainText();
263     str2.append("\t");
264     textEdit->setText(str2);
265
266     str2=textEdit->toPlainText();
267     str2.append(str3.append(Yval->text()));
268     textEdit->setText(str2);
269     str3.clear();
270
271     str2=textEdit->toPlainText();
272     str2.append("\t");
273     textEdit->setText(str2);
274
275
276     str2=textEdit->toPlainText();
277     str2.append(str3.append(Zval->text()));
278     textEdit->setText(str2);
279
280
281     str2=textEdit->toPlainText();
282     str2.append("\n");
283     textEdit->setText(str2);
284
285
286     str2=textEdit->toPlainText();
287     str2.append("#Transformation Matrix(mm):\n");
288     textEdit->setText(str2);
289     for(int i=0;i<4;i++)
290     {
291     for(int j=0;j<4;j++)
292       {
293     str2=textEdit->toPlainText();
294    // str2.append("\t"+str1.setNum(matrix->Element[i][j]));
295     str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),2));
296     textEdit->setText(str2);
297       }
298     str2=textEdit->toPlainText();
299     str2.append("\n");
300     textEdit->setText(str2);
301     }
302     //QString str = QFileDialog::getOpenFileName();
303     textEdit->setTextColor(QColor(255,0,0));
304     textEdit->setFont(QFont("courrier new",12,4,true));
305     textEdit->toPlainText().toAscii();
306
307     str2=textEdit->toPlainText();
308     textEdit->setText(str2);
309 }
310 //------------------------------------------------------------------------------
311
312 //------------------------------------------------------------------------------
313 void vvToolRigidReg::UpdateTransform_sliders()
314 {
315        InitializeSliders(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],
316                          ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],
317                          ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2],
318                         xrot_slider->value(),yrot_slider->value(),zrot_slider->value(),false);
319       UpdateTransform(true);
320       Render();
321 }
322 //------------------------------------------------------------------------------
323
324 //------------------------------------------------------------------------------
325 void vvToolRigidReg::UpdateTransform_sb()
326 {
327    InitializeSliders(xtrans_sb->value(),
328       ytrans_sb->value(),
329       ztrans_sb->value(),
330                         xrot_sb->value(),yrot_sb->value(),zrot_sb->value(),false);
331       UpdateTransform(false);
332       Render();
333 }
334 //------------------------------------------------------------------------------
335
336 //------------------------------------------------------------------------------
337 void vvToolRigidReg::AutoRegister()
338 {
339  GetArgsInfoFromGUI();
340     //clitk::AffineRegistrationGenericFilter::Pointer filter =
341    // clitk::AffineRegistrationGenericFilter::New();
342     //filter->SetArgsInfo(mArgsInfo);
343    // filter->Update();
344
345 }
346 //------------------------------------------------------------------------------
347
348 //------------------------------------------------------------------------------
349 void vvToolRigidReg::UpdateTransform(bool slider_enabled)
350 {
351      vtkSmartPointer<vtkTransform> transform_final=vtkSmartPointer<vtkTransform>::New();
352      transform_final->SetMatrix(mInitialMatrix);
353      transform_final->PostMultiply();
354   //Rotations
355     double x=0, y=0 ,z=0;
356     x= Xval->text().toDouble();
357     y= Yval->text().toDouble();
358     z= Zval->text().toDouble();
359     transform_final->Translate(-x,-y,-z);
360     if(slider_enabled){
361     transform_final->RotateY(yrot_slider->value());
362     transform_final->RotateX(xrot_slider->value());
363     transform_final->RotateZ(zrot_slider->value());
364     }
365     else{
366     transform_final->RotateY(yrot_sb->value());
367     transform_final->RotateX(xrot_sb->value());
368     transform_final->RotateZ(zrot_sb->value());
369     }
370     transform_final->Translate(x,y,z);
371     transform_final->PreMultiply();
372     if(slider_enabled){
373     transform_final->Translate(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],0,0);
374     transform_final->Translate(0,ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],0);
375     transform_final->Translate(0,0,ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2]);
376     }
377     else{
378     transform_final->Translate(xtrans_sb->value(),0,0);
379     transform_final->Translate(0,ytrans_sb->value(),0);
380     transform_final->Translate(0,0,ztrans_sb->value());
381     }
382     SetTransform(transform_final->GetMatrix());
383     UpdateTextEditor(transform_final->GetMatrix(),textEdit);
384 }
385 //------------------------------------------------------------------------------
386
387 //------------------------------------------------------------------------------
388 void vvToolRigidReg::SaveFile()
389 {
390   //Write the Transformation Matrix
391     QString f1 = QFileDialog::getSaveFileName(this, tr("Save Transformation Matrix File"),
392                             "/home",
393                             tr("Text (*.mat *.txt *.doc *.rtf)"));
394     QFile file1(f1);
395     std::vector<QString> transparameters;
396     QString line1;
397
398     for(int i =0;i<4;i++)
399       for(int j=0;j<4;j++)
400     transparameters.push_back(line1.setNum(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->Element[i][j]));
401
402     if (file1.open(QFile::WriteOnly | QFile::Truncate)) {
403     QTextStream out1(&file1);
404      for(int i =0;i<4;i++){
405       for(int j=0;j<4;j++) {
406       out1<<transparameters[i*4+j]+"\t";
407       }
408       out1<<"\n";
409      }
410     }
411      else
412      {
413       QMessageBox::information(this,"Warning","Error Reading Parameters");
414      }
415 }
416 //------------------------------------------------------------------------------
417
418 //------------------------------------------------------------------------------
419 void vvToolRigidReg::ReadFile()
420 {
421    std::string x;
422    QString center;
423    double * orientations=new double[3];
424    double * translations=new double[3];
425    vtkMatrix4x4 *matrix=vtkMatrix4x4::New();
426    vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
427
428    //Open File to read the transformation parameters
429    QString file1 = QFileDialog::getOpenFileName(
430                     this,
431                     "Choose the Transformation Parameters file",
432                     "/home",
433                     "Text (*.mat *.txt *.rtf *.doc)");
434     if (file1.isEmpty())
435     return;
436    QFile Qfile1(file1);
437   // ifstream readfile;
438    std::string transfile= file1.toStdString();
439    std::string filename1(transfile);
440    std::ifstream f1(filename1.c_str());
441    if(f1.is_open())
442    {
443    f1.close();
444    itk::Matrix<double, 4, 4> itkMat = clitk::ReadMatrix3D(transfile);
445    for(int j=0; j<4; j++)
446       for(int i=0; i<4; i++)
447     matrix->SetElement(i,j,itkMat[i][j]);
448    }
449     UpdateTextEditor(matrix,textEdit);
450     transform->SetMatrix(matrix);
451     transform->GetOrientation(orientations);
452     transform->PostMultiply();
453
454      //Obtain the Rotation Center , set it to origin
455     Xval->setText(center.setNum(0));
456     Yval->setText(center.setNum(0));
457     Zval->setText(center.setNum(0));
458
459     //In the Order or Y X Z //
460     //now  postmultiply for the rotations
461     SetTransform(0,0,0,0,0,-round(orientations[2]),false);
462     SetTransform(0,0,0,-round(orientations[0]),0,0,false);
463     SetTransform(0,0,0,0,-round(orientations[1]),0,false);
464
465     transform->GetPosition(translations);
466     transform->Identity();
467
468     DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]);
469     DD(translations[1]/mInput1->GetImage()->GetSpacing()[1]);
470     DD(translations[2]/mInput1->GetImage()->GetSpacing()[2]);
471     DD(orientations[0]);
472     DD(orientations[1]);
473     DD(orientations[2]);
474       //set the sliders  and spin box values
475     InitializeSliders(rint(translations[0]),rint(translations[1])
476     ,rint(translations[2]),rint(orientations[0]),rint(orientations[1]),rint(orientations[2]),true);
477     SetTransform(matrix);
478 }
479 //------------------------------------------------------------------------------
480
481 //------------------------------------------------------------------------------
482 void vvToolRigidReg::ResetTransform()
483 {
484   vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
485   for(int i=0;i<4;i++)
486     for(int j=0;j<4;j++)
487           matrix->SetElement(i,j,mInitialMatrix[i*4+j]);
488    SetTransform(matrix);
489    SetRotationCenter();
490    SetSliderRanges();
491    UpdateTextEditor(matrix,textEdit);
492 }
493 //------------------------------------------------------------------------------
494
495 //------------------------------------------------------------------------------
496 void vvToolRigidReg::SetRotationCenter()
497 {
498     //default image rotation center is the center of the image
499     QString xcord,ycord,zcord;
500     std::vector<double> imageorigin;
501     imageorigin=mInput1->GetImage()->GetOrigin();
502
503     xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mInput1->GetImage()->GetSpacing()[0]/2, 'g', 3);
504     ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mInput1->GetImage()->GetSpacing()[1]/2, 'g', 3);
505     zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mInput1->GetImage()->GetSpacing()[2]/2, 'g', 3);
506
507     Xval->setText(xcord);
508     Yval->setText(ycord);
509     Zval->setText(zcord);
510     InitializeSliders(0,0,0,0,0,0,true);
511 }
512 //------------------------------------------------------------------------------
513
514 //------------------------------------------------------------------------------
515 void vvToolRigidReg::InitializeSliders(double xtrans,double ytrans, double ztrans, double xrot, double yrot, double zrot,bool sliders)
516 {
517
518     xtrans_sb->blockSignals(true);
519     xtrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[0]);
520     xtrans_sb->setValue(xtrans);
521     xtrans_sb->blockSignals(false);
522     ytrans_sb->blockSignals(true);
523     ytrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[1]);
524     ytrans_sb->setValue(ytrans);
525     ytrans_sb->blockSignals(false);
526     ztrans_sb->blockSignals(true);
527     ztrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[2]);
528     ztrans_sb->setValue(ztrans);
529     ztrans_sb->blockSignals(false);
530
531     if(sliders){
532     xtrans_slider->blockSignals(true);
533     DD(xtrans_slider->value());
534     xtrans_slider->setValue(rint(xtrans));
535     xtrans_slider->blockSignals(false);
536     ytrans_slider->blockSignals(true);
537     ytrans_slider->setValue(rint(ytrans));
538     ytrans_slider->blockSignals(false);
539     ztrans_slider->blockSignals(true);
540     ztrans_slider->setValue(rint(ztrans));
541     ztrans_slider->blockSignals(false);
542     }
543     xrot_sb->blockSignals(true);
544     xrot_sb->setValue(xrot);
545     xrot_sb->blockSignals(false);
546     yrot_sb->blockSignals(true);
547     yrot_sb->setValue(yrot);
548     yrot_sb->blockSignals(false);
549     zrot_sb->blockSignals(true);
550     zrot_sb->setValue(zrot);
551     zrot_sb->blockSignals(false);
552     xrot_slider->blockSignals(true);
553     xrot_slider->setValue(xrot);
554     xrot_slider->blockSignals(false);
555     yrot_slider->blockSignals(true);
556     yrot_slider->setValue(yrot);
557     yrot_slider->blockSignals(false);
558     zrot_slider->blockSignals(true);
559     zrot_slider->setValue(zrot);
560     zrot_slider->blockSignals(false);
561 }
562 //------------------------------------------------------------------------------
563
564 //------------------------------------------------------------------------------
565 void vvToolRigidReg::SetSliderRanges()
566 {
567   xtrans_slider->blockSignals(true);
568   xtrans_slider->setRange(-2000,2000);
569   xtrans_slider->blockSignals(false);
570
571   ytrans_slider->blockSignals(true);
572   ytrans_slider->setRange(-2000,2000);
573   ytrans_slider->blockSignals(false);
574
575   ztrans_slider->blockSignals(true);
576   ztrans_slider->setRange(-2000,2000);
577   ztrans_slider->blockSignals(false);
578
579   xtrans_sb->blockSignals(true);
580   xtrans_sb->setRange(-2000,2000);
581   xtrans_sb->setDecimals(3);
582   xtrans_sb->blockSignals(false);
583
584   ytrans_sb->blockSignals(true);
585   ytrans_sb->setRange(-2000,2000);
586   ytrans_sb->setDecimals(3);
587   ytrans_sb->blockSignals(false);
588
589   ztrans_sb->blockSignals(true);
590   ztrans_sb->setRange(-2000,2000);
591   ztrans_sb->setDecimals(3);
592   ztrans_sb->blockSignals(false);
593
594   xrot_slider->blockSignals(true);
595   xrot_slider->setRange(-360,360);
596   xrot_slider->blockSignals(false);
597
598   yrot_slider->blockSignals(true);
599   yrot_slider->setRange(-360,360);
600   yrot_slider->blockSignals(false);
601
602   zrot_slider->blockSignals(true);
603   zrot_slider->setRange(-360,360);
604   zrot_slider->blockSignals(false);
605
606
607   xrot_sb->blockSignals(true);
608   xrot_sb->setRange(-360,360);
609   xrot_sb->blockSignals(false);
610
611   yrot_sb->blockSignals(true);
612   yrot_sb->setRange(-360,360);
613   yrot_sb->blockSignals(false);
614
615   zrot_sb->blockSignals(true);
616   zrot_sb->setRange(-360,360);
617   zrot_sb->blockSignals(false);
618 }