1 /***************************************************************************
2 File : Plot3DDialog.cpp
3 Project : SciDAVis
4 --------------------------------------------------------------------
5 Copyright : (C) 2006 by Ion Vasilief, Tilman Benkert
6 Email (use @ for *) : ion_vasilief*yahoo.fr, thzs*gmx.net
7 Description : Surface plot options dialog
8
9 ***************************************************************************/
10
11 /***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 * *
18 * This program is distributed in the hope that it will be useful, *
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
21 * GNU General Public License for more details. *
22 * *
23 * You should have received a copy of the GNU General Public License *
24 * along with this program; if not, write to the Free Software *
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
26 * Boston, MA 02110-1301 USA *
27 * *
28 ***************************************************************************/
29 #ifdef _MSC_VER
30 #define NOMINMAX
31 #endif
32 #include "Plot3DDialog.h"
33 #include "TextDialog.h"
34 #include "MyParser.h"
35 #include "SymbolDialog.h"
36
37 #include <QListWidget>
38 #include <QLineEdit>
39 #include <QLayout>
40 #include <QSpinBox>
41 #include <QDoubleSpinBox>
42 #include <QPushButton>
43 #include <QLabel>
44 #include <QStackedWidget>
45 #include <QWidget>
46 #include <QMessageBox>
47 #include <QComboBox>
48 #include <QWidgetList>
49 #include <QFileDialog>
50 #include <QGroupBox>
51 #include <QFontDialog>
52 #include <QColorDialog>
53
54 #include <qwt3d_color.h>
55
Plot3DDialog(QWidget * parent,Qt::WindowFlags fl)56 Plot3DDialog::Plot3DDialog(QWidget *parent, Qt::WindowFlags fl) : QDialog(parent, fl)
57 {
58 setWindowTitle(tr("Surface Plot Options"));
59
60 bars = 0;
61 points = 0;
62
63 QHBoxLayout *hbox = new QHBoxLayout();
64 hbox->addStretch();
65 btnTable = new QPushButton();
66 btnTable->hide();
67 hbox->addWidget(btnTable);
68 buttonApply = new QPushButton(tr("&Apply"));
69 hbox->addWidget(buttonApply);
70 buttonOk = new QPushButton(tr("&OK"));
71 buttonOk->setDefault(true);
72 hbox->addWidget(buttonOk);
73 buttonCancel = new QPushButton(tr("&Cancel"));
74 hbox->addWidget(buttonCancel);
75
76 generalDialog = new QTabWidget();
77
78 initScalesPage();
79 initAxesPage();
80 initTitlePage();
81 initColorsPage();
82 initGeneralPage();
83
84 QVBoxLayout *vl = new QVBoxLayout(this);
85 vl->addWidget(generalDialog);
86 vl->addLayout(hbox);
87
88 connect(buttonOk, SIGNAL(clicked()), this, SLOT(accept()));
89 connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
90 connect(buttonApply, SIGNAL(clicked()), this, SLOT(updatePlot()));
91 connect(btnTable, SIGNAL(clicked()), this, SLOT(worksheet()));
92 }
93
initScalesPage()94 void Plot3DDialog::initScalesPage()
95 {
96 axesList = new QListWidget();
97 axesList->addItem(tr("X"));
98 axesList->addItem(tr("Y"));
99 axesList->addItem(tr("Z"));
100 axesList->setFixedWidth(50);
101 axesList->setCurrentRow(0);
102
103 QGridLayout *gl1 = new QGridLayout();
104 gl1->addWidget(new QLabel(tr("From")), 0, 0);
105 boxFrom = new QLineEdit();
106 boxFrom->setMaximumWidth(150);
107 gl1->addWidget(boxFrom, 0, 1);
108 gl1->addWidget(new QLabel(tr("To")), 1, 0);
109 boxTo = new QLineEdit();
110 boxTo->setMaximumWidth(150);
111 gl1->addWidget(boxTo, 1, 1);
112 gl1->addWidget(new QLabel(tr("Type")), 2, 0);
113 boxType = new QComboBox();
114 boxType->addItem(tr("linear"));
115 boxType->addItem(tr("logarithmic"));
116 boxType->setMaximumWidth(150);
117 gl1->addWidget(boxType, 2, 1);
118 gl1->setRowStretch(3, 1);
119
120 QGroupBox *gb1 = new QGroupBox();
121 gb1->setLayout(gl1);
122
123 QGridLayout *gl2 = new QGridLayout();
124 gl2->addWidget(new QLabel(tr("Major Ticks")), 0, 0);
125 boxMajors = new QSpinBox();
126 gl2->addWidget(boxMajors, 0, 1);
127 gl2->addWidget(new QLabel(tr("Minor Ticks")), 1, 0);
128 boxMinors = new QSpinBox();
129 gl2->addWidget(boxMinors, 1, 1);
130 gl2->setRowStretch(2, 1);
131
132 TicksGroupBox = new QGroupBox();
133 TicksGroupBox->setLayout(gl2);
134
135 QHBoxLayout *hb = new QHBoxLayout();
136 hb->addWidget(axesList);
137 hb->addWidget(gb1);
138 hb->addWidget(TicksGroupBox);
139
140 scale = new QWidget();
141 scale->setLayout(hb);
142 generalDialog->addTab(scale, tr("&Scale"));
143 }
144
initAxesPage()145 void Plot3DDialog::initAxesPage()
146 {
147 axesList2 = new QListWidget();
148 axesList2->addItem(tr("X"));
149 axesList2->addItem(tr("Y"));
150 axesList2->addItem(tr("Z"));
151 axesList2->setFixedWidth(50);
152 axesList2->setCurrentRow(0);
153
154 QGridLayout *gl1 = new QGridLayout();
155 gl1->addWidget(new QLabel(tr("Title")), 0, 0);
156 boxLabel = new QLineEdit();
157 gl1->addWidget(boxLabel, 0, 1);
158 gl1->addWidget(new QLabel(tr("Axis Font")), 1, 0);
159
160 QHBoxLayout *hb1 = new QHBoxLayout();
161 btnLabelFont = new QPushButton(tr("&Choose font"));
162 hb1->addWidget(btnLabelFont);
163 buttonAxisLowerGreek = new QPushButton(QChar(0x3B1));
164 hb1->addWidget(buttonAxisLowerGreek);
165 buttonAxisUpperGreek = new QPushButton(QChar(0x393));
166 hb1->addWidget(buttonAxisUpperGreek);
167 hb1->addStretch();
168 gl1->addLayout(hb1, 1, 1);
169
170 gl1->addWidget(new QLabel(tr("Major Ticks Length")), 2, 0);
171 boxMajorLength = new QLineEdit();
172 gl1->addWidget(boxMajorLength, 2, 1);
173 gl1->addWidget(new QLabel(tr("Minor Ticks Length")), 3, 0);
174 boxMinorLength = new QLineEdit();
175 gl1->addWidget(boxMinorLength, 3, 1);
176 gl1->setRowStretch(4, 1);
177
178 QGroupBox *gb1 = new QGroupBox();
179 gb1->setLayout(gl1);
180
181 QHBoxLayout *hb2 = new QHBoxLayout();
182 hb2->addWidget(axesList2);
183 hb2->addWidget(gb1);
184
185 axes = new QWidget();
186 axes->setLayout(hb2);
187 generalDialog->addTab(axes, tr("&Axis"));
188
189 connect(buttonAxisLowerGreek, SIGNAL(clicked()), this, SLOT(showLowerGreek()));
190 connect(buttonAxisUpperGreek, SIGNAL(clicked()), this, SLOT(showUpperGreek()));
191 connect(axesList2, SIGNAL(currentRowChanged(int)), this, SLOT(viewAxisOptions(int)));
192 connect(axesList, SIGNAL(currentRowChanged(int)), this, SLOT(viewScaleLimits(int)));
193 connect(btnLabelFont, SIGNAL(clicked()), this, SLOT(pickAxisLabelFont()));
194 }
195
initTitlePage()196 void Plot3DDialog::initTitlePage()
197 {
198 QHBoxLayout *hb1 = new QHBoxLayout();
199 hb1->addStretch();
200 buttonLowerGreek = new QPushButton(QChar(0x3B1));
201 hb1->addWidget(buttonLowerGreek);
202 buttonUpperGreek = new QPushButton(QChar(0x393));
203 hb1->addWidget(buttonUpperGreek);
204 btnTitleColor = new QPushButton(tr("&Color"));
205 hb1->addWidget(btnTitleColor);
206 btnTitleFont = new QPushButton(tr("&Font"));
207 hb1->addWidget(btnTitleFont);
208 hb1->addStretch();
209
210 QVBoxLayout *vl = new QVBoxLayout();
211 boxTitle = new QLineEdit();
212 vl->addWidget(boxTitle);
213 vl->addLayout(hb1);
214 vl->addStretch();
215
216 title = new QWidget();
217 title->setLayout(vl);
218 generalDialog->addTab(title, tr("&Title"));
219
220 connect(btnTitleColor, SIGNAL(clicked()), this, SLOT(pickTitleColor()));
221 connect(btnTitleFont, SIGNAL(clicked()), this, SLOT(pickTitleFont()));
222 connect(buttonLowerGreek, SIGNAL(clicked()), this, SLOT(showLowerGreek()));
223 connect(buttonUpperGreek, SIGNAL(clicked()), this, SLOT(showUpperGreek()));
224 }
225
initColorsPage()226 void Plot3DDialog::initColorsPage()
227 {
228 QVBoxLayout *vl1 = new QVBoxLayout();
229 btnFromColor = new QPushButton(tr("Ma&x"));
230 vl1->addWidget(btnFromColor);
231 btnToColor = new QPushButton(tr("&Min"));
232 vl1->addWidget(btnToColor);
233 btnColorMap = new QPushButton(tr("Color Ma&p"));
234 vl1->addWidget(btnColorMap);
235 vl1->addStretch();
236
237 QGroupBox *gb1 = new QGroupBox(tr("Data"));
238 gb1->setLayout(vl1);
239
240 QVBoxLayout *vl2 = new QVBoxLayout();
241 btnMesh = new QPushButton(tr("&Line"));
242 vl2->addWidget(btnMesh);
243 btnBackground = new QPushButton(tr("&Background"));
244 vl2->addWidget(btnBackground);
245 vl2->addStretch();
246
247 QGroupBox *gb2 = new QGroupBox(tr("General"));
248 gb2->setLayout(vl2);
249
250 QGridLayout *gl1 = new QGridLayout();
251 btnAxes = new QPushButton(tr("&Axes"));
252 gl1->addWidget(btnAxes, 0, 0);
253 btnLabels = new QPushButton(tr("Lab&els"));
254 gl1->addWidget(btnLabels, 0, 1);
255 btnNumbers = new QPushButton(tr("&Numbers"));
256 gl1->addWidget(btnNumbers, 1, 0);
257 btnGrid = new QPushButton(tr("&Grid"));
258 gl1->addWidget(btnGrid, 1, 1);
259 gl1->setRowStretch(2, 1);
260
261 AxesColorGroupBox = new QGroupBox(tr("Coordinate System"));
262 AxesColorGroupBox->setLayout(gl1);
263
264 QHBoxLayout *hb1 = new QHBoxLayout();
265 hb1->addWidget(gb1);
266 hb1->addWidget(gb2);
267 hb1->addWidget(AxesColorGroupBox);
268
269 QHBoxLayout *hb2 = new QHBoxLayout();
270 hb2->addStretch();
271 hb2->addWidget(new QLabel(tr("Opacity")));
272 boxTransparency = new QSpinBox();
273 boxTransparency->setRange(0, 100);
274 boxTransparency->setSingleStep(5);
275 hb2->addWidget(boxTransparency);
276
277 QVBoxLayout *vl = new QVBoxLayout();
278 vl->addLayout(hb2);
279 vl->addLayout(hb1);
280
281 colors = new QWidget();
282 colors->setLayout(vl);
283 generalDialog->addTab(colors, tr("&Colors"));
284
285 connect(btnAxes, SIGNAL(clicked()), this, SLOT(pickAxesColor()));
286 connect(btnLabels, SIGNAL(clicked()), this, SLOT(pickLabelColor()));
287 connect(btnNumbers, SIGNAL(clicked()), this, SLOT(pickNumberColor()));
288 connect(btnBackground, SIGNAL(clicked()), this, SLOT(pickBgColor()));
289 connect(btnFromColor, SIGNAL(clicked()), this, SLOT(pickFromColor()));
290 connect(btnToColor, SIGNAL(clicked()), this, SLOT(pickToColor()));
291 connect(btnColorMap, SIGNAL(clicked()), this, SLOT(pickDataColorMap()));
292 connect(btnGrid, SIGNAL(clicked()), this, SLOT(pickGridColor()));
293 connect(btnMesh, SIGNAL(clicked()), this, SLOT(pickMeshColor()));
294 connect(boxTransparency, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
295 }
296
initGeneralPage()297 void Plot3DDialog::initGeneralPage()
298 {
299 QGridLayout *gl1 = new QGridLayout();
300 boxLegend = new QCheckBox(tr("Show Legend"));
301 gl1->addWidget(boxLegend, 0, 0);
302 boxOrthogonal = new QCheckBox(tr("Orthogonal"));
303 gl1->addWidget(boxOrthogonal, 0, 1);
304
305 gl1->addWidget(new QLabel(tr("Line Width")), 1, 0);
306 boxMeshLineWidth = new QSpinBox();
307 boxMeshLineWidth->setRange(1, 100);
308 gl1->addWidget(boxMeshLineWidth, 1, 1);
309
310 gl1->addWidget(new QLabel(tr("Resolution")), 2, 0);
311 boxResolution = new QSpinBox();
312 boxResolution->setRange(1, 100);
313 boxResolution->setSpecialValueText("1 (all data)");
314 gl1->addWidget(boxResolution, 2, 1);
315
316 gl1->addWidget(new QLabel(tr("Numbers Font")), 3, 0);
317 btnNumbersFont = new QPushButton(tr("&Choose Font"));
318 gl1->addWidget(btnNumbersFont, 3, 1);
319
320 gl1->addWidget(new QLabel(tr("Distance labels - axis")), 4, 0);
321 boxDistance = new QSpinBox();
322 boxDistance->setRange(0, 1000);
323 boxDistance->setSingleStep(5);
324 gl1->addWidget(boxDistance, 4, 1);
325 gl1->setRowStretch(5, 1);
326
327 QGroupBox *gb1 = new QGroupBox();
328 gb1->setLayout(gl1);
329
330 QGridLayout *gl2 = new QGridLayout();
331 gl2->addWidget(new QLabel(tr("Zoom (%)")), 0, 0);
332 boxZoom = new QDoubleSpinBox();
333 boxZoom->setMinimum(0);
334 boxZoom->setMaximum(1e15);
335 boxZoom->setSingleStep(10);
336
337 gl2->addWidget(boxZoom, 0, 1);
338 gl2->addWidget(new QLabel(tr("X Zoom (%)")), 1, 0);
339 boxXScale = new QDoubleSpinBox();
340 boxXScale->setMinimum(0);
341 boxXScale->setMaximum(1e15);
342 boxXScale->setSingleStep(10);
343 gl2->addWidget(boxXScale, 1, 1);
344
345 gl2->addWidget(new QLabel(tr("Y Zoom (%)")), 2, 0);
346 boxYScale = new QDoubleSpinBox();
347 boxYScale->setMinimum(0);
348 boxYScale->setMaximum(1e15);
349 boxYScale->setSingleStep(10);
350 gl2->addWidget(boxYScale, 2, 1);
351
352 gl2->addWidget(new QLabel(tr("Z Zoom (%)")), 3, 0);
353 boxZScale = new QDoubleSpinBox();
354 boxZScale->setMinimum(0);
355 boxZScale->setMaximum(1e15);
356 boxZScale->setSingleStep(10);
357 gl2->addWidget(boxZScale, 3, 1);
358 gl2->setRowStretch(4, 1);
359
360 QGroupBox *gb2 = new QGroupBox();
361 gb2->setLayout(gl2);
362
363 QHBoxLayout *hl = new QHBoxLayout();
364 hl->addWidget(gb1);
365 hl->addWidget(gb2);
366
367 general = new QWidget();
368 general->setLayout(hl);
369 generalDialog->addTab(general, tr("&General"));
370
371 connect(boxResolution, SIGNAL(valueChanged(int)), this, SIGNAL(updateResolution(int)));
372 connect(boxDistance, SIGNAL(valueChanged(int)), this, SIGNAL(adjustLabels(int)));
373 connect(boxMeshLineWidth, SIGNAL(valueChanged(int)), this, SIGNAL(updateMeshLineWidth(int)));
374 connect(boxOrthogonal, SIGNAL(toggled(bool)), this, SIGNAL(setOrtho(bool)));
375 connect(boxLegend, SIGNAL(toggled(bool)), this, SIGNAL(showColorLegend(bool)));
376 connect(boxZoom, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
377 connect(boxXScale, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
378 connect(boxYScale, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
379 connect(boxZScale, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
380 connect(btnNumbersFont, SIGNAL(clicked()), this, SLOT(pickNumbersFont()));
381 }
382
initPointsOptionsStack()383 void Plot3DDialog::initPointsOptionsStack()
384 {
385 QHBoxLayout *hl1 = new QHBoxLayout();
386 hl1->addStretch();
387 hl1->addWidget(new QLabel(tr("Style")));
388 boxPointStyle = new QComboBox();
389 boxPointStyle->addItem(tr("Dot"));
390 boxPointStyle->addItem(tr("Cross Hair"));
391 boxPointStyle->addItem(tr("Cone"));
392 hl1->addWidget(boxPointStyle);
393
394 optionStack = new QStackedWidget();
395 optionStack->setFrameShape(QFrame::StyledPanel);
396 optionStack->setFrameShadow(QStackedWidget::Plain);
397
398 QGridLayout *gl1 = new QGridLayout();
399 gl1->addWidget(new QLabel(tr("Width")), 0, 0);
400 boxSize = new QLineEdit("5");
401 gl1->addWidget(boxSize, 0, 1);
402
403 gl1->addWidget(new QLabel(tr("Smooth angles")), 1, 0);
404 boxSmooth = new QCheckBox();
405 boxSmooth->setChecked(false);
406 gl1->addWidget(boxSmooth, 1, 1);
407
408 dotsPage = new QWidget();
409 dotsPage->setLayout(gl1);
410 optionStack->addWidget(dotsPage);
411
412 QGridLayout *gl2 = new QGridLayout();
413 gl2->addWidget(new QLabel(tr("Radius")), 0, 0);
414 boxCrossRad = new QLineEdit("0.01");
415 gl2->addWidget(boxCrossRad, 0, 1);
416 gl2->addWidget(new QLabel(tr("Line Width")), 1, 0);
417 boxCrossLinewidth = new QLineEdit("1");
418 gl2->addWidget(boxCrossLinewidth, 1, 1);
419 gl2->addWidget(new QLabel(tr("Smooth line")), 2, 0);
420 boxCrossSmooth = new QCheckBox();
421 boxCrossSmooth->setChecked(true);
422 gl2->addWidget(boxCrossSmooth, 2, 1);
423 gl2->addWidget(new QLabel(tr("Boxed")), 3, 0);
424 boxBoxed = new QCheckBox();
425 boxBoxed->setChecked(false);
426 gl2->addWidget(boxBoxed, 3, 1);
427
428 crossPage = new QWidget();
429 crossPage->setLayout(gl2);
430 optionStack->addWidget(crossPage);
431
432 QGridLayout *gl3 = new QGridLayout();
433 gl3->addWidget(new QLabel(tr("Width")), 0, 0);
434 boxConesRad = new QLineEdit("0.5");
435 gl3->addWidget(boxConesRad, 0, 1);
436 gl3->addWidget(new QLabel(tr("Quality")), 1, 0);
437 boxQuality = new QSpinBox();
438 boxQuality->setRange(0, 40);
439 boxQuality->setValue(32);
440 gl3->addWidget(boxQuality, 1, 1);
441
442 conesPage = new QWidget();
443 conesPage->setLayout(gl3);
444 optionStack->addWidget(conesPage);
445
446 QVBoxLayout *vl = new QVBoxLayout();
447 vl->addLayout(hl1);
448 vl->addWidget(optionStack);
449
450 points = new QWidget();
451 points->setLayout(vl);
452
453 generalDialog->insertTab(4, points, tr("Points"));
454 connect(boxPointStyle, SIGNAL(activated(int)), optionStack, SLOT(setCurrentIndex(int)));
455 }
456
showLowerGreek()457 void Plot3DDialog::showLowerGreek()
458 {
459 SymbolDialog *greekLetters = new SymbolDialog(SymbolDialog::lowerGreek, this, Qt::Tool);
460 greekLetters->setAttribute(Qt::WA_DeleteOnClose);
461 connect(greekLetters, SIGNAL(addLetter(const QString &)), this,
462 SLOT(addSymbol(const QString &)));
463 greekLetters->show();
464 greekLetters->activateWindow();
465 }
466
showUpperGreek()467 void Plot3DDialog::showUpperGreek()
468 {
469 SymbolDialog *greekLetters = new SymbolDialog(SymbolDialog::upperGreek, this, Qt::Tool);
470 greekLetters->setAttribute(Qt::WA_DeleteOnClose);
471 connect(greekLetters, SIGNAL(addLetter(const QString &)), this,
472 SLOT(addSymbol(const QString &)));
473 greekLetters->show();
474 greekLetters->activateWindow();
475 }
476
addSymbol(const QString & letter)477 void Plot3DDialog::addSymbol(const QString &letter)
478 {
479 if (generalDialog->currentWidget() == (QWidget *)title)
480 boxTitle->insert(letter);
481 else if (generalDialog->currentWidget() == (QWidget *)axes)
482 boxLabel->insert(letter);
483 }
484
worksheet()485 void Plot3DDialog::worksheet()
486 {
487 emit showWorksheet();
488 close();
489 }
490
customWorksheetBtn(const QString & text)491 void Plot3DDialog::customWorksheetBtn(const QString &text)
492 {
493 if (!text.isEmpty()) {
494 btnTable->show();
495 btnTable->setText(text);
496 }
497 }
498
disableGridOptions()499 void Plot3DDialog::disableGridOptions()
500 {
501 btnGrid->setDisabled(true);
502 }
503
disableAxesOptions()504 void Plot3DDialog::disableAxesOptions()
505 {
506 TicksGroupBox->setDisabled(true);
507 generalDialog->setTabEnabled(generalDialog->indexOf(axes), false);
508 AxesColorGroupBox->setDisabled(true);
509 boxDistance->setDisabled(true);
510 btnNumbersFont->setDisabled(true);
511 }
512
showBarsTab(double rad)513 void Plot3DDialog::showBarsTab(double rad)
514 {
515 bars = new QWidget(generalDialog);
516 QHBoxLayout *bars_layout = new QHBoxLayout();
517 bars->setLayout(bars_layout);
518
519 bars_layout->addWidget(new QLabel(tr("Width")));
520 boxBarsRad = new QLineEdit();
521 boxBarsRad->setText(QString::number(rad));
522 bars_layout->addWidget(boxBarsRad);
523
524 generalDialog->insertTab(4, bars, tr("Bars"));
525 }
526
showPointsTab(double rad,bool smooth)527 void Plot3DDialog::showPointsTab(double rad, bool smooth)
528 {
529 boxPointStyle->setCurrentIndex(0);
530 boxSize->setText(QString::number(rad));
531 boxSmooth->setChecked(smooth);
532 optionStack->setCurrentIndex(0);
533 }
534
showConesTab(double rad,int quality)535 void Plot3DDialog::showConesTab(double rad, int quality)
536 {
537 boxPointStyle->setCurrentIndex(2);
538 boxConesRad->setText(QString::number(rad));
539 boxQuality->setValue(quality);
540 optionStack->setCurrentIndex(2);
541 }
542
showCrossHairTab(double rad,double linewidth,bool smooth,bool boxed)543 void Plot3DDialog::showCrossHairTab(double rad, double linewidth, bool smooth, bool boxed)
544 {
545 boxPointStyle->setCurrentIndex(1);
546 boxCrossRad->setText(QString::number(rad));
547 boxCrossLinewidth->setText(QString::number(linewidth));
548 boxCrossSmooth->setChecked(smooth);
549 boxBoxed->setChecked(boxed);
550 optionStack->setCurrentIndex(1);
551 }
552
disableMeshOptions()553 void Plot3DDialog::disableMeshOptions()
554 {
555 btnMesh->setDisabled(true);
556 boxMeshLineWidth->setDisabled(true);
557 }
558
disableLegend()559 void Plot3DDialog::disableLegend()
560 {
561 boxLegend->setDisabled(true);
562 }
563
setLabelsDistance(int dist)564 void Plot3DDialog::setLabelsDistance(int dist)
565 {
566 boxDistance->setValue(dist);
567 }
568
pickDataColorMap()569 void Plot3DDialog::pickDataColorMap()
570 {
571 QString fn = QFileDialog::getOpenFileName(this, QString(), d_plot->colorMap(),
572 tr("Colormap files") + " (*.map *.MAP)");
573 if (!fn.isEmpty())
574 emit setDataColorMap(fn);
575 }
576
pickFromColor()577 QColor Plot3DDialog::pickFromColor()
578 {
579 QColor c = QColorDialog::getColor(fromColor, this);
580 if (!c.isValid())
581 return fromColor;
582
583 fromColor = c;
584 return fromColor;
585 }
586
pickToColor()587 QColor Plot3DDialog::pickToColor()
588 {
589 QColor c = QColorDialog::getColor(toColor, this);
590 if (!c.isValid())
591 return toColor;
592
593 toColor = c;
594 return toColor;
595 }
596
pickGridColor()597 QColor Plot3DDialog::pickGridColor()
598 {
599 QColor c = QColorDialog::getColor(gridColor, this);
600 if (!c.isValid())
601 return gridColor;
602
603 gridColor = c;
604 return gridColor;
605 }
606
pickAxesColor()607 QColor Plot3DDialog::pickAxesColor()
608 {
609 QColor c = QColorDialog::getColor(axesColor, this);
610 if (!c.isValid())
611 return axesColor;
612
613 axesColor = c;
614 return axesColor;
615 }
616
pickBgColor()617 QColor Plot3DDialog::pickBgColor()
618 {
619 QColor c = QColorDialog::getColor(bgColor, this);
620 if (!c.isValid())
621 return bgColor;
622
623 bgColor = c;
624 return bgColor;
625 }
626
pickNumberColor()627 QColor Plot3DDialog::pickNumberColor()
628 {
629 QColor c = QColorDialog::getColor(numColor, this);
630 if (!c.isValid())
631 return numColor;
632
633 numColor = c;
634 return numColor;
635 }
636
pickLabelColor()637 QColor Plot3DDialog::pickLabelColor()
638 {
639 QColor c = QColorDialog::getColor(labelColor, this);
640 if (!c.isValid())
641 return labelColor;
642
643 labelColor = c;
644 return labelColor;
645 }
646
pickTitleColor()647 QColor Plot3DDialog::pickTitleColor()
648 {
649 QColor c = QColorDialog::getColor(titleColor, this);
650 if (!c.isValid())
651 return titleColor;
652
653 titleColor = c;
654 return titleColor;
655 }
656
pickTitleFont()657 void Plot3DDialog::pickTitleFont()
658 {
659 bool ok;
660 QFont font = QFontDialog::getFont(&ok, titleFont, this);
661 if (ok) {
662 titleFont = font;
663 } else {
664 return;
665 }
666 }
667
pickNumbersFont()668 void Plot3DDialog::pickNumbersFont()
669 {
670 bool ok;
671 QFont font = QFontDialog::getFont(&ok, numbersFont, this);
672 if (ok) {
673 numbersFont = font;
674 } else {
675 return;
676 }
677 }
678
viewAxisOptions(int axis)679 void Plot3DDialog::viewAxisOptions(int axis)
680 {
681 boxLabel->setText(labels[axis]);
682
683 boxMajorLength->setText(tickLengths[2 * axis + 0]);
684 boxMinorLength->setText(tickLengths[2 * axis + 1]);
685 }
686
setAxesLabels(const QStringList & list)687 void Plot3DDialog::setAxesLabels(const QStringList &list)
688 {
689 labels = list;
690 boxLabel->setText(labels[0]);
691 }
692
setScales(const QStringList & list)693 void Plot3DDialog::setScales(const QStringList &list)
694 {
695 scales = list;
696 boxFrom->setText(scales[0]);
697 boxTo->setText(scales[1]);
698 boxMajors->setValue(scales[2].toInt());
699 boxMinors->setValue(scales[3].toInt());
700 boxType->setCurrentIndex(scales[4].toInt());
701 }
702
setAxesTickLengths(const QStringList & list)703 void Plot3DDialog::setAxesTickLengths(const QStringList &list)
704 {
705 tickLengths = list;
706 boxMajorLength->setText(list[0]);
707 boxMinorLength->setText(list[1]);
708 }
709
viewScaleLimits(int axis)710 void Plot3DDialog::viewScaleLimits(int axis)
711 {
712 boxFrom->setText(scales[5 * axis + 0]);
713 boxTo->setText(scales[5 * axis + 1]);
714 boxMajors->setValue(scales[5 * axis + 2].toInt());
715 boxMinors->setValue(scales[5 * axis + 3].toInt());
716 boxType->setCurrentIndex(scales[5 * axis + 4].toInt());
717 }
718
setTitle(const QString & title)719 void Plot3DDialog::setTitle(const QString &title)
720 {
721 boxTitle->setText(title);
722 }
723
setTitleFont(const QFont & font)724 void Plot3DDialog::setTitleFont(const QFont &font)
725 {
726 titleFont = font;
727 }
728
pickMeshColor()729 QColor Plot3DDialog::pickMeshColor()
730 {
731
732 QColor c = QColorDialog::getColor(meshColor, this);
733 if (!c.isValid())
734 return meshColor;
735
736 meshColor = c;
737 return meshColor;
738 }
739
accept()740 void Plot3DDialog::accept()
741 {
742 if (updatePlot())
743 close();
744 }
745
setDataColors(const QColor & minColor,const QColor & maxColor)746 void Plot3DDialog::setDataColors(const QColor &minColor, const QColor &maxColor)
747 {
748 fromColor = minColor;
749 toColor = maxColor;
750 }
751
setColors(const QColor & title,const QColor & mesh,const QColor & axes,const QColor & num,const QColor & label,const QColor & bg,const QColor & grid)752 void Plot3DDialog::setColors(const QColor &title, const QColor &mesh, const QColor &axes,
753 const QColor &num, const QColor &label, const QColor &bg,
754 const QColor &grid)
755 {
756 titleColor = title;
757 meshColor = mesh;
758 axesColor = axes;
759 numColor = num;
760 labelColor = label;
761 bgColor = bg;
762 gridColor = grid;
763 }
764
showLegend(bool show)765 void Plot3DDialog::showLegend(bool show)
766 {
767 boxLegend->setChecked(show);
768 }
769
changeZoom(double)770 void Plot3DDialog::changeZoom(double)
771 {
772 if (generalDialog->currentWidget() != (QWidget *)general)
773 return;
774
775 emit updateZoom(boxZoom->value() * 0.01);
776 emit updateScaling(boxXScale->value(), boxYScale->value() * 0.01, boxZScale->value() * 0.01);
777 }
778
changeTransparency(int val)779 void Plot3DDialog::changeTransparency(int val)
780 {
781 if (generalDialog->currentWidget() != (QWidget *)colors)
782 return;
783
784 emit updateTransparency(val * 0.01);
785 }
786
updatePlot()787 bool Plot3DDialog::updatePlot()
788 {
789 int axis = -1;
790
791 if (generalDialog->currentWidget() == (QWidget *)bars) {
792 emit updateBars(boxBarsRad->text().toDouble());
793 }
794
795 if (generalDialog->currentWidget() == (QWidget *)points) {
796 if (boxPointStyle->currentIndex() == 0)
797 emit updatePoints(boxSize->text().toDouble(), boxSmooth->isChecked());
798 else if (boxPointStyle->currentIndex() == 1)
799 emit updateCross(boxCrossRad->text().toDouble(), boxCrossLinewidth->text().toDouble(),
800 boxCrossSmooth->isChecked(), boxBoxed->isChecked());
801 else if (boxPointStyle->currentIndex() == 2)
802 emit updateCones(boxConesRad->text().toDouble(), boxQuality->value());
803 }
804
805 if (generalDialog->currentWidget() == (QWidget *)title) {
806 emit updateTitle(boxTitle->text(), titleColor, titleFont);
807 }
808
809 if (generalDialog->currentWidget() == (QWidget *)colors) {
810 emit updateTransparency(boxTransparency->value() * 0.01);
811 emit updateDataColors(fromColor, toColor);
812 emit updateColors(meshColor, axesColor, numColor, labelColor, bgColor, gridColor);
813 }
814
815 if (generalDialog->currentWidget() == (QWidget *)general) {
816 emit showColorLegend(boxLegend->isChecked());
817 emit updateMeshLineWidth(boxMeshLineWidth->value());
818 emit adjustLabels(boxDistance->value());
819 emit updateResolution(boxResolution->value());
820 emit showColorLegend(boxLegend->isChecked());
821 emit setNumbersFont(numbersFont);
822 emit updateZoom(boxZoom->value() * 0.01);
823 emit updateScaling(boxXScale->value() * 0.01, boxYScale->value() * 0.01,
824 boxZScale->value() * 0.01);
825 }
826
827 if (generalDialog->currentWidget() == (QWidget *)scale) {
828 axis = axesList->currentRow();
829 QString from = boxFrom->text().toLower();
830 QString to = boxTo->text().toLower();
831 double start, end;
832 bool error = false;
833 try {
834 MyParser parser;
835 parser.SetExpr(from);
836 start = parser.Eval();
837 } catch (mu::ParserError &e) {
838 QMessageBox::critical(0, tr("Start limit error"), QStringFromString(e.GetMsg()));
839 boxFrom->setFocus();
840 error = true;
841 return false;
842 }
843 try {
844 MyParser parser;
845 parser.SetExpr(to);
846 end = parser.Eval();
847 } catch (mu::ParserError &e) {
848 QMessageBox::critical(0, tr("End limit error"), QStringFromString(e.GetMsg()));
849 boxTo->setFocus();
850 error = true;
851 return false;
852 }
853
854 if (start >= end) {
855 QMessageBox::critical(0, tr("Input error"),
856 tr("Please enter scale limits that satisfy: from < to!"));
857 boxTo->setFocus();
858 return false;
859 }
860
861 if (!error)
862 emit updateScale(axis,
863 scaleOptions(axis, start, end, boxMajors->text(), boxMinors->text()));
864 }
865
866 if (generalDialog->currentWidget() == (QWidget *)axes) {
867 axis = axesList2->currentRow();
868 labels[axis] = boxLabel->text();
869 emit updateLabel(axis, boxLabel->text(), axisFont(axis));
870 emit updateTickLength(axis, boxMajorLength->text().toDouble(),
871 boxMinorLength->text().toDouble());
872 }
873
874 return true;
875 }
876
scaleOptions(int axis,double start,double end,const QString & majors,const QString & minors)877 QStringList Plot3DDialog::scaleOptions(int axis, double start, double end, const QString &majors,
878 const QString &minors)
879 {
880 Q_ASSERT(0 <= axis);
881 Q_ASSERT(5 * axis + 4 < scales.size());
882 QStringList l;
883 l << QString::number(start);
884 l << QString::number(end);
885 l << majors;
886 l << minors;
887 l << QString::number(boxType->currentIndex());
888
889 for (int i = 0; i < 5; i++)
890 scales[5 * axis + i] = l[i];
891 return l;
892 }
893
setMeshLineWidth(double lw)894 void Plot3DDialog::setMeshLineWidth(double lw)
895 {
896 boxMeshLineWidth->setValue(int(lw));
897 }
898
setAxesFonts(const QFont & xf,const QFont & yf,const QFont & zf)899 void Plot3DDialog::setAxesFonts(const QFont &xf, const QFont &yf, const QFont &zf)
900 {
901 xAxisFont = xf;
902 yAxisFont = yf;
903 zAxisFont = zf;
904 }
905
pickAxisLabelFont()906 void Plot3DDialog::pickAxisLabelFont()
907 {
908 bool ok;
909 QFont font;
910 switch (axesList2->currentRow()) {
911 case 0:
912 font = QFontDialog::getFont(&ok, xAxisFont, this);
913 if (ok)
914 xAxisFont = font;
915 else
916 return;
917 break;
918
919 case 1:
920 font = QFontDialog::getFont(&ok, yAxisFont, this);
921 if (ok)
922 yAxisFont = font;
923 else
924 return;
925 break;
926
927 case 2:
928 font = QFontDialog::getFont(&ok, zAxisFont, this);
929 if (ok)
930 zAxisFont = font;
931 else
932 return;
933 break;
934 }
935 }
936
axisFont(int axis)937 QFont Plot3DDialog::axisFont(int axis)
938 {
939 QFont f;
940 switch (axis) {
941 case 0:
942 f = xAxisFont;
943 break;
944
945 case 1:
946 f = yAxisFont;
947 break;
948
949 case 2:
950 f = zAxisFont;
951 break;
952 }
953 return f;
954 }
955
setTransparency(double t)956 void Plot3DDialog::setTransparency(double t)
957 {
958 boxTransparency->setValue(int(100 * t));
959 }
960
setResolution(int r)961 void Plot3DDialog::setResolution(int r)
962 {
963 boxResolution->setValue(r);
964 }
965
setZoom(double zoom)966 void Plot3DDialog::setZoom(double zoom)
967 {
968 boxZoom->setValue(zoom * 100);
969 }
970
setScaling(double xVal,double yVal,double zVal)971 void Plot3DDialog::setScaling(double xVal, double yVal, double zVal)
972 {
973 boxXScale->setValue(xVal * 100);
974 boxYScale->setValue(yVal * 100);
975 boxZScale->setValue(zVal * 100);
976 }
977
showGeneralTab()978 void Plot3DDialog::showGeneralTab()
979 {
980 generalDialog->setCurrentIndex(generalDialog->indexOf(general));
981 }
982
showTitleTab()983 void Plot3DDialog::showTitleTab()
984 {
985 generalDialog->setCurrentIndex(2);
986 }
987
showAxisTab()988 void Plot3DDialog::showAxisTab()
989 {
990 generalDialog->setCurrentIndex(1);
991 }
992
~Plot3DDialog()993 Plot3DDialog::~Plot3DDialog() { }
994