00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "MainWindow.hpp"
00024 #include "ProgressDialog.hpp"
00025 #include "PromptGenerationDialog.hpp"
00026 #include "PromptCurveDialog.hpp"
00027 #include "PromptSettings.hpp"
00028 #include "GammaDialog.hpp"
00029 #include "ColoursDialog.hpp"
00030 #include "WidgetImage.hpp"
00031
00032 #include "../Calculation/Generation.hpp"
00033 #include "../Calculation/Curve.hpp"
00034
00035 #include <QApplication>
00036 #include <QMainWindow>
00037 #include <QWidget>
00038 #include <QTabWidget>
00039 #include <QFileDialog>
00040 #include <QMenuBar>
00041 #include <QMenu>
00042 #include <QAction>
00043 #include <QImageWriter>
00044 #include <QImageReader>
00045 #include <QTime>
00046
00047 #include <QString>
00048 #include <QList>
00049
00050 #include <iostream>
00051
00052 #ifndef QT_NO_DEBUG
00053 #include <iomanip>
00054 #endif
00055
00056 MainWindow :: MainWindow(const QString& windowName, const unsigned int width, const unsigned int height, QWidget* parent)
00057 :QMainWindow(parent)
00058 {
00059
00060 pFileMenu = NULL;
00061 pGenerationMenu = NULL;
00062 pImageMenu = NULL;
00063
00064 pGammaCorrectionAction = NULL;
00065
00066
00067 this->setWindowTitle(windowName);
00068 this->resize(width, height);
00069
00070 this->createMenus();
00071
00072 tabImage = new QTabWidget(this);
00073
00074 tabImage->setTabsClosable(true);
00075
00076 this->setCentralWidget(tabImage);
00077
00078 connect(tabImage, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int)));
00079
00080 #ifndef QT_NO_DEBUG
00081 std::cout << "MainWindow constructed (" << width << ";" << height << ")" << std::endl;
00082 #endif
00083 }
00084
00085 MainWindow :: ~MainWindow(void)
00086 {
00087
00088 for ( QList<QAction*>::iterator it_pAction = actions.begin() ; it_pAction != actions.end() ; ++it_pAction )
00089 {
00090
00091 delete (*it_pAction);
00092 }
00093 actions.clear();
00094
00095
00096 delete pImageMenu;
00097 delete pGenerationMenu;
00098 delete pFileMenu;
00099
00100 delete tabImage;
00101
00102 #ifndef QT_NO_DEBUG
00103 std::cout << "MainWindow deleted" << std::endl;
00104 #endif
00105 }
00106
00107 QAction* MainWindow :: addAction(QMenu* pParentMenu,const QString& entryName, const QString& keySequence, const QString& statusTipMessage, const QObject* pObject, const char* pSlot, const bool enabled, const bool checkable)
00108 {
00109 QAction* pAction = pParentMenu->addAction(entryName, pObject, pSlot, QKeySequence(keySequence));
00110
00111 pAction->setStatusTip(statusTipMessage);
00112 pAction->setEnabled(enabled);
00113 pAction->setCheckable(checkable);
00114 pAction->setChecked(checkable);
00115
00116
00117 actions.push_back(pAction);
00118
00119 #ifndef QT_NO_DEBUG
00120 std::cout << "\tNew action added to a menu (" << entryName.toStdString() << "; Tip: " << statusTipMessage.toStdString() << "; Raccourci: " << keySequence.toStdString() << ")" << std::endl;
00121 #endif
00122
00123 return pAction;
00124 }
00125
00126 void MainWindow :: createMenus(void)
00127 {
00128 if ( pFileMenu != NULL )
00129 {
00130 delete pFileMenu;
00131 }
00132
00140 pFileMenu = new QMenu(tr("&File"), this);
00141 {
00142 pSaveAction = this->addAction(pFileMenu, tr("&Save"), tr("Ctrl+S"), tr("Save the fractale in a file"), this, SLOT(savePicture()));
00143 actions.push_back(pFileMenu->addSeparator());
00144 this->addAction(pFileMenu, tr("&Quit"), tr("Ctrl+Q"), tr("Quit the application"), qApp, SLOT(quit()));
00145 }
00146
00147 this->menuBar()->addMenu(pFileMenu);
00148
00149
00150 if ( pGenerationMenu != NULL )
00151 {
00152 delete pGenerationMenu;
00153 }
00154
00160 pGenerationMenu = new QMenu(tr("&Generation"), this);
00161 {
00162 this->addAction(pGenerationMenu, tr("&Generate..."), tr("Ctrl+G"), tr("Generate fractales"), this, SLOT(startGeneration()));
00163 this->addAction(pGenerationMenu, tr("&Generate curves..."), tr("Ctrl+F"), tr("Generate fractales based on curves"), this, SLOT(startCurve()));
00164 actions.push_back(pGenerationMenu->addSeparator());
00165 this->addAction(pGenerationMenu, tr("&Preferences"), tr("Ctrl+Alt+P"), tr("Where to change some settings on the generation"), this, SLOT(settingsBox()));
00166 }
00167
00168 this->menuBar()->addMenu(pGenerationMenu);
00169
00170
00176 pImageMenu = new QMenu(tr("&Picture"), this);
00177 {
00178 pGammaCorrectionAction = this->addAction(pImageMenu, tr("Gamma &correction..."), tr("Ctrl+C"), tr("Change the gamma of the picture"), this, SLOT(gammaCorrection()));
00179 pRandomColoursAction = this->addAction(pImageMenu, tr("&Change colours..."), tr("Ctrl+R"), tr("Change the colour of the picture"), this, SLOT(changeColours()));
00180 }
00181 this->desactivateImageMenu();
00182
00183 this->menuBar()->addMenu(pImageMenu);
00184 }
00185
00186 void MainWindow :: activateImageMenu(void)
00187 {
00188 if ( pSaveAction != NULL )
00189 pSaveAction->setEnabled(true);
00190
00191 if ( pGammaCorrectionAction != NULL )
00192 pGammaCorrectionAction->setEnabled(true);
00193
00194 if ( pRandomColoursAction != NULL )
00195 pRandomColoursAction->setEnabled(true);
00196
00197 if ( pImageMenu != NULL )
00198 pImageMenu->setEnabled(true);
00199 }
00200
00201 void MainWindow :: desactivateImageMenu(void)
00202 {
00203 if ( pSaveAction != NULL )
00204 pSaveAction->setEnabled(false);
00205
00206 if ( pGammaCorrectionAction != NULL )
00207 pGammaCorrectionAction->setEnabled(false);
00208
00209 if ( pRandomColoursAction != NULL )
00210 pRandomColoursAction->setEnabled(false);
00211
00212 if ( pImageMenu != NULL )
00213 pImageMenu->setEnabled(false);
00214 }
00215
00216
00217
00218
00220 void MainWindow :: savePicture(void)
00221 {
00222 #ifndef QT_NO_DEBUG
00223 std::cout << "\tSLOT: savePicture() ";
00224 #endif
00225
00226 QString formatFilters;
00227 QString selectedFilter;
00228 QList<QByteArray> formatSupported = QImageWriter::supportedImageFormats();
00229 bool first = true;
00230
00231 for ( QList<QByteArray>::iterator it_list = formatSupported.begin() ; it_list != formatSupported.end() ; ++it_list )
00232 {
00233 if ( first )
00234 {
00235
00236 selectedFilter += it_list->data();
00237 first = false;
00238 }
00239 else
00240 {
00241
00242 formatFilters += ";;";
00243 }
00244
00245 #ifndef QT_NO_DEBUG
00246 std::cout << "Supported: " << it_list->data() << std::endl;
00247 #endif
00248
00249
00250 formatFilters += "*.";
00251 formatFilters += it_list->data();
00252
00253 }
00254
00255
00256 QString fileName = QFileDialog::getSaveFileName(this, tr("Save fractale file"), QDir::currentPath(), formatFilters, &selectedFilter);
00257 if ( fileName != "" )
00258 {
00259 QString completeFileName;
00260 bool hasExtension = false;
00261
00262
00263 for ( QList<QByteArray>::iterator it_list = formatSupported.begin() ; it_list != formatSupported.end() ; ++it_list )
00264 {
00265 hasExtension |= fileName.endsWith(QString(it_list->data()));
00266 }
00267
00268 if ( hasExtension )
00269 {
00270
00271 completeFileName = fileName;
00272 }
00273 else
00274 {
00275
00276 completeFileName = fileName + QString(selectedFilter.right(4));
00277 }
00278
00279 ((WidgetImage*)(tabImage->widget(tabImage->currentIndex())))->getImage().save(completeFileName);
00280
00281 #ifndef QT_NO_DEBUG
00282 std::cout << "(Fichier selectionné: '" << fileName.toStdString() << " ; Filtre selectionné:" << selectedFilter.toStdString() << " ; Fichier de sorite: " << completeFileName.toStdString() <<"')" << std::endl;
00283 #endif
00284 }
00285 }
00286
00287 void MainWindow :: startGeneration(void)
00288 {
00289 PromptGenerationDialog prompt(this);
00290 int result = prompt.exec();
00291
00292 if ( result == 0 )
00293 {
00294
00295 Params params;
00296
00297 params.lifct = prompt.getInitializor();
00298 params.lgfct = prompt.getGenerator();
00299 params.lafct = prompt.getAccumulator();
00300
00301 params.iWidth = prompt.getImageW();
00302 params.iHeight = prompt.getImageH();
00303
00304 params.zWidth = prompt.getZoneW();
00305 params.zHeight = prompt.getZoneH();
00306 params.zX = prompt.getZoneX();
00307 params.zY = prompt.getZoneY();
00308
00309 #ifndef QT_NO_DEBUG
00310 std::cout << "Initializor: " << params.lifct << std::endl;
00311 std::cout << "Generator: " << params.lgfct << std::endl;
00312 std::cout << "Accumulator: " << params.lafct << std::endl << std::endl;
00313
00314 std::cout << "Image(" << params.iWidth << ";" << params.iHeight << ")" << std::endl;
00315 std::cout << "Zone(" << params.zX << ";" << params.zY << ";" << params.zWidth << ";" << params.zHeight << ")" << std::endl << std::endl;
00316 #endif
00317
00318 {
00319
00320 QVector<QRgb> table;
00321 QTime* timeStamp = new QTime();
00322
00323 for ( unsigned int i = 0 ; i < 256 ; i++ )
00324 {
00325 table.push_back(qRgb(i,i,i));
00326 }
00327
00328 Generation* g = new Generation(params, table, this);
00329
00330 generationThreads.push_back(g);
00331 timesGeneration.push_back(timeStamp);
00332 connect(g, SIGNAL(finished()), this, SLOT(deleteThreadGeneration()));
00333
00334
00335 timeStamp->start();
00336 g->start();
00337 }
00338 }
00339
00340 #ifndef QT_NO_DEBUG
00341 std::cout << "\tSLOT: startGeneration()" << std::endl;
00342 #endif
00343 }
00344
00345 void MainWindow :: startCurve(void)
00346 {
00347 PromptCurveDialog prompt(this);
00348 int result = prompt.exec();
00349
00350 if ( result == 0 )
00351 {
00352
00353 ParamsCurve params;
00354
00355 params.lcfct = prompt.getCurve();
00356
00357 params.nbPoints = prompt.getNbPoints();
00358
00359 params.pX = prompt.getPointX();
00360 params.pY = prompt.getPointY();
00361
00362 params.paramA = prompt.getPA();
00363 params.paramB = prompt.getPB();
00364 params.paramC = prompt.getPC();
00365 params.paramD = prompt.getPD();
00366
00367 params.iWidth = prompt.getImageW();
00368 params.iHeight = prompt.getImageH();
00369
00370 params.zWidth = prompt.getZoneW();
00371 params.zHeight = prompt.getZoneH();
00372 params.zX = prompt.getZoneX();
00373 params.zY = prompt.getZoneY();
00374
00375 #ifndef QT_NO_DEBUG
00376 std::cout << "Generator: " << params.lcfct << std::endl;
00377
00378 std::cout << "Points (nb, X, Y)" << params.nbPoints << "; " << params.pX << "; " << params.pY << std::endl;
00379
00380 std::cout << "Image(" << params.iWidth << ";" << params.iHeight << ")" << std::endl;
00381 std::cout << "Zone(" << params.zX << ";" << params.zY << ";" << params.zWidth << ";" << params.zHeight << ")" << std::endl << std::endl;
00382 #endif
00383
00384 {
00385
00386 QVector<QRgb> table;
00387 QTime* timeStamp = new QTime();
00388
00389 for ( unsigned int i = 0 ; i < 256 ; i++ )
00390 {
00391 table.push_back(qRgb(i,i,i));
00392 }
00393
00394 Curve* c = new Curve(params, table, this);
00395
00396 curveThreads.push_back(c);
00397 timesCurve.push_back(timeStamp);
00398 connect(c, SIGNAL(finished()), this, SLOT(deleteThreadCurve()));
00399
00400 timeStamp->start();
00401 c->start();
00402 }
00403 }
00404
00405 #ifndef QT_NO_DEBUG
00406 std::cout << "\tSLOT: startCurve()" << std::endl;
00407 #endif
00408 }
00409
00410 void MainWindow :: settingsBox(void)
00411 {
00412 #ifndef QT_NO_DEBUG
00413 std::cout << "\tSLOT: settingsBox()" << std::endl;
00414 #endif
00415 PromptSettings ps(this);
00416 ps.exec();
00417 }
00418
00419 void MainWindow :: gammaCorrection(void)
00420 {
00421 #ifndef QT_NO_DEBUG
00422 std::cout << "\tSLOT: gammaCorrection()" << std::endl;
00423 #endif
00424
00425 GammaDialog gd(this);
00426 int result;
00427 WidgetImage* wi = (WidgetImage*)tabImage->widget(tabImage->currentIndex());
00428
00429 connect(&gd, SIGNAL(valueChanged(double)), wi , SLOT(gammaChanged(double)));
00430 result = gd.exec();
00431
00432 if ( result == 1 )
00433 {
00434 wi->needRestore();
00435 }
00436 else
00437 {
00438 wi->needSave();
00439 }
00440
00441 disconnect(&gd, SIGNAL(valueChanged(double)), wi , SLOT(gammaChanged(double)));
00442 }
00443
00444 void MainWindow :: changeColours(void)
00445 {
00446 #ifndef QT_NO_DEBUG
00447 std::cout << "\tSLOT: changeColours()" << std::endl;
00448 #endif
00449
00450 int result;
00451 WidgetImage* wi = (WidgetImage*)tabImage->widget(tabImage->currentIndex());
00452 ColoursDialog cd(wi->getColourTable(), this);
00453
00454 connect(&cd, SIGNAL(coloursTableChanged(QVector<QRgb>)), wi , SLOT(setColourTable(QVector<QRgb>)));
00455 result = cd.exec();
00456
00457 wi->setColourTable(cd.getColourTable());
00458 disconnect(&cd, SIGNAL(coloursTableChanged(QVector<QRgb>)), wi , SLOT(setColourTable(QVector<QRgb>)));
00459 }
00460
00461 void MainWindow :: deleteThreadGeneration(void)
00462 {
00463 unsigned int counter = 0;
00464
00465 #ifndef QT_NO_DEBUG
00466 std::cout << "\tSLOT: deleteThreadGeneration()" << std::endl;
00467 #endif
00468
00469
00470 for ( QVector< Generation* >::iterator it_generation = generationThreads.begin() ; it_generation != generationThreads.end() ; )
00471 {
00472 if ( (*it_generation)->isFinished() )
00473 {
00474 WidgetImage* wi = new WidgetImage((*it_generation)->getFractale(), (*it_generation)->getTable(), (*it_generation)->getParams(), this);
00475 int newIndex = 0;
00476
00477 newIndex = tabImage->addTab(wi, (*it_generation)->getTitle());
00478 tabImage->setCurrentIndex(newIndex);
00479
00480 connect(wi, SIGNAL(zoom(QPoint, QPoint, Params, QVector<QRgb>)), this, SLOT(renderZoom(QPoint, QPoint, Params, QVector<QRgb>)));
00481 connect(wi, SIGNAL(unzoom(Params, QVector<QRgb>)), this, SLOT(renderUnZoom(Params, QVector<QRgb>)));
00482
00483
00484 this->activateImageMenu();
00485
00486
00487
00488 qDebug("Generation time: %d ms", timesGeneration[counter]->elapsed());
00489
00490
00491 delete timesGeneration[counter];
00492 timesGeneration.remove(counter);
00493 delete (*it_generation);
00494
00495 it_generation = generationThreads.erase(it_generation);
00496 }
00497 else
00498 {
00499 it_generation++;
00500 }
00501
00502 counter++;
00503 }
00504 }
00505
00506 void MainWindow :: deleteThreadCurve(void)
00507 {
00508 unsigned int counter = 0;
00509
00510 #ifndef QT_NO_DEBUG
00511 std::cout << "\tSLOT: deleteThreadCurve()" << std::endl;
00512 #endif
00513
00514
00515 for ( QVector< Curve* >::iterator it_curves = curveThreads.begin() ; it_curves != curveThreads.end() ; )
00516 {
00517 if ( (*it_curves)->isFinished() )
00518 {
00519 WidgetImage* wi = new WidgetImage((*it_curves)->getFractale(), (*it_curves)->getTable(), (*it_curves)->getParams(), this);
00520 int newIndex = 0;
00521
00522 newIndex = tabImage->addTab(wi, (*it_curves)->getTitle());
00523 tabImage->setCurrentIndex(newIndex);
00524
00525 connect(wi, SIGNAL(zoom(QPoint, QPoint, ParamsCurve, QVector<QRgb>)), this, SLOT(renderZoom(QPoint, QPoint, ParamsCurve, QVector<QRgb>)));
00526 connect(wi, SIGNAL(unzoom(ParamsCurve, QVector<QRgb>)), this, SLOT(renderUnZoom(ParamsCurve, QVector<QRgb>)));
00527
00528
00529 this->activateImageMenu();
00530
00531
00532
00533 qDebug("Generation time: %d ms", timesCurve[counter]->elapsed());
00534
00535
00536 delete timesCurve[counter];
00537 timesCurve.remove(counter);
00538
00539 delete (*it_curves);
00540
00541 it_curves = curveThreads.erase(it_curves);
00542 }
00543 else
00544 {
00545 it_curves++;
00546 }
00547
00548 counter++;
00549 }
00550 }
00551
00552 void MainWindow :: closeTab(int index)
00553 {
00554 #ifndef QT_NO_DEBUG
00555 std::cout << "\tSLOT: closeTab(" << index << ")" << std::endl;
00556 #endif
00557
00558 WidgetImage* wi = reinterpret_cast<WidgetImage*>(tabImage->widget(index));
00559
00560 tabImage->removeTab(index);
00561
00562 disconnect(wi, SIGNAL(zoom(QPoint, QPoint, Params, QVector<QRgb>)), this, SLOT(renderZoom(QPoint, QPoint, Params, QVector<QRgb>)));
00563
00564 delete wi;
00565
00566 if ( tabImage->count() == 0 )
00567 {
00568 desactivateImageMenu();
00569 }
00570 }
00571
00572 void MainWindow :: renderZoom(QPoint start, QPoint end, Params params, QVector<QRgb> table)
00573 {
00574
00575 Params newParams = params;
00576 QTime* timeStamp = new QTime();
00577
00578
00579 if ( start.x() > end.x() )
00580 {
00581 int tmpX = start.x();
00582 start.setX(end.x());
00583 end.setX(tmpX);
00584 }
00585
00586 if ( start.y() > end.y() )
00587 {
00588 int tmpY = start.y();
00589 start.setY(end.y());
00590 end.setY(tmpY);
00591 }
00592
00593 newParams.zX = ( ( start.x() / static_cast<double>(params.iWidth - 1)) * params.zWidth) + params.zX;
00594 newParams.zY = ( ( start.y() / static_cast<double>(params.iHeight - 1)) * params.zHeight) + params.zY;
00595 newParams.zWidth = (( end.x() - start.x() ) / static_cast<double>(params.iWidth - 1)) * params.zWidth ;
00596 newParams.zHeight = (( end.y() - start.y() ) / static_cast<double>(params.iHeight - 1)) * params.zHeight ;
00597
00598 #ifndef QT_NO_DEBUG
00599 std::cout << "Start:(" << start.x() << ";" << start.y() << ")" << std::endl;
00600 std::cout << "End:(" << end.x() << ";" << end.y() << ")" << std::endl << std::endl;
00601 #endif
00602
00603 #ifndef QT_NO_DEBUG
00604 std::cout << "Initializor: " << params.lifct << std::endl;
00605 std::cout << "Generator: " << params.lgfct << std::endl;
00606 std::cout << "Accumulator: " << params.lafct << std::endl << std::endl;
00607
00608 std::cout << "Image(" << params.iWidth << ";" << params.iHeight << ")" << std::endl;
00609 std::cout << "Zone(" << params.zX << ";" << params.zY << ";" << params.zWidth << ";" << params.zHeight << ")" << std::endl << std::endl;
00610 #endif
00611
00612 #ifndef QT_NO_DEBUG
00613 std::cout << "Initializor: " << newParams.lifct << std::endl;
00614 std::cout << "Generator: " << newParams.lgfct << std::endl;
00615 std::cout << "Accumulator: " << newParams.lafct << std::endl << std::endl;
00616
00617 std::cout << "Image(" << newParams.iWidth << ";" << newParams.iHeight << ")" << std::endl;
00618 std::cout << "Zone(" << newParams.zX << ";" << newParams.zY << ";" << newParams.zWidth << ";" << newParams.zHeight << ")" << std::endl << std::endl;
00619 #endif
00620
00621 {
00622 Generation* g = new Generation(newParams, table, this);
00623
00624 generationThreads.push_back(g);
00625 timesGeneration.push_back(timeStamp);
00626 connect(g, SIGNAL(finished()), this, SLOT(deleteThreadGeneration()));
00627
00628 timeStamp->start();
00629 g->start();
00630 }
00631 }
00632
00633 void MainWindow :: renderZoom(QPoint start, QPoint end, ParamsCurve params, QVector<QRgb> table)
00634 {
00635
00636 ParamsCurve newParams = params;
00637 QTime* timeStamp = new QTime();
00638
00639
00640 if ( start.x() > end.x() )
00641 {
00642 int tmpX = start.x();
00643 start.setX(end.x());
00644 end.setX(tmpX);
00645 }
00646
00647 if ( start.y() > end.y() )
00648 {
00649 int tmpY = start.y();
00650 start.setY(end.y());
00651 end.setY(tmpY);
00652 }
00653
00654 newParams.zX = ( ( start.x() / static_cast<double>(params.iWidth - 1)) * params.zWidth) + params.zX;
00655 newParams.zY = ( ( start.y() / static_cast<double>(params.iHeight - 1)) * params.zHeight) + params.zY;
00656 newParams.zWidth = (( end.x() - start.x() ) / static_cast<double>(params.iWidth - 1)) * params.zWidth ;
00657 newParams.zHeight = (( end.y() - start.y() ) / static_cast<double>(params.iHeight - 1)) * params.zHeight ;
00658
00659 {
00660 Curve* c = new Curve(newParams, table, this);
00661
00662 curveThreads.push_back(c);
00663 timesCurve.push_back(timeStamp);
00664 connect(c, SIGNAL(finished()), this, SLOT(deleteThreadCurve()));
00665
00666 timeStamp->start();
00667 c->start();
00668 }
00669
00670 #ifndef QT_NO_DEBUG
00671 std::cout << " Curve thread zoom" << std::endl << std::endl;
00672 #endif
00673 }
00674
00675
00676 void MainWindow :: renderUnZoom(Params params, QVector<QRgb> table)
00677 {
00678
00679 Params newParams = params;
00680 QTime* timeStamp = new QTime();
00681
00682
00683 newParams.zX = params.zX * 2;
00684 newParams.zY = params.zY * 2;;
00685 newParams.zWidth = params.zWidth * 2;
00686 newParams.zHeight = params.zHeight * 2;
00687
00688 {
00689 Generation* g = new Generation(newParams, table, this);
00690
00691 generationThreads.push_back(g);
00692 timesGeneration.push_back(timeStamp);
00693 connect(g, SIGNAL(finished()), this, SLOT(deleteThreadGeneration()));
00694
00695 timeStamp->start();
00696 g->start();
00697 }
00698 }
00699
00700 void MainWindow :: renderUnZoom(ParamsCurve params, QVector<QRgb> table)
00701 {
00702
00703 ParamsCurve newParams = params;
00704 QTime* timeStamp = new QTime();
00705
00706
00707 newParams.zX = params.zX * 2;
00708 newParams.zY = params.zY * 2;;
00709 newParams.zWidth = params.zWidth * 2;
00710 newParams.zHeight = params.zHeight * 2;
00711
00712 {
00713 Curve* c = new Curve(newParams, table, this);
00714
00715 curveThreads.push_back(c);
00716 timesCurve.push_back(timeStamp);
00717 connect(c, SIGNAL(finished()), this, SLOT(deleteThreadCurve()));
00718
00719 timeStamp->start();
00720 c->start();
00721 }
00722
00723 #ifndef QT_NO_DEBUG
00724 std::cout << " Curve thread zoom" << std::endl << std::endl;
00725 #endif
00726 }