1 /***************************************************************************
2  *   Copyright (C) 2021 by Abderrahman Taha                                *
3  *                                                                         *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
19  ***************************************************************************/
20 #include "drawingoptions.h"
21 #include <qmessagebox.h>
22 
23 static int IndexcurrentComponent = -1;
24 static int indexcurrentSet = 0;
25 static int CurrentFormulaType = -1; // 0:Pariso; 1:Parametric; 2:Isosurface
26 static QTreeWidgetItem *MyselectionItemReference;
27 static QStringList qlstPos, qlstStep, qlstmin, qlstmax, qlstnames;
28 
29 // Error messages returned by ErrorMsg():
30 static const char *ScriptErrorMessage[] =
31 {
32     "SCRIPT_NO_ERROR",      // 0
33     "MAXGRID_OUT_OF_RANGE", // 1
34     "MAXPT_OUT_OF_RANGE",   // 2
35     "MAXTRI_OUT_OF_RANGE",  // 3
36     "FXYZ_OUT_OF_RANGE",    // 4
37     "FX_OUT_OF_RANGE",
38     "XMAX_NBCOMPONENT_MISMATCH",                // 5
39     "YMAX_NBCOMPONENT_MISMATCH",                // 6
40     "ZMAX_NBCOMPONENT_MISMATCH",                // 7
41     "XMIN_NBCOMPONENT_MISMATCH",                // 8
42     "YMIN_NBCOMPONENT_MISMATCH",                // 9
43     "ZMIN_NBCOMPONENT_MISMATCH",                // 10
44     "FY_FX_MISMATCH",                           // 11
45     "FZ_FX_MISMATCH",                           // 12
46     "FW_FX_MISMATCH",                           // 13
47     "UMAX_NBCOMPONENT_MISMATCH",                // 14
48     "VMAX_NBCOMPONENT_MISMATCH",                // 15
49     "WMAX_NBCOMPONENT_MISMATCH",                // 16
50     "UMIN_NBCOMPONENT_MISMATCH",                // 17
51     "VMIN_NBCOMPONENT_MISMATCH",                // 18
52     "WMIN_NBCOMPONENT_MISMATCH",                // 19
53     "GRID_NBCOMPONENT_MISMATCH",                // 20
54     "COMPONENT_NBCOMPONENT_MISMATCH",           // 21
55     "CND_NBCOMPONENT_MISMATCH",                 // 22
56     "NBSLIDERS_OUT_OF_RANGE",                   // 23
57     "NBSLIDERSVALUES_OUT_OF_RANGE",             // 24
58     "VERTEX_TAB_MEM_OVERFLOW",                  // 25
59     "TRIANGLES_TAB_MEM_OVERFLOW",               // 26
60     "MINPOLY_TAB_MEM_OVERFLOW",                 // 27
61     "POLY_TAB_MEM_OVERFLOW",                    // 28
62     "CND_TAB_MEM_OVERFLOW",                     // 29
63     "CND_POL_MEM_OVERFLOW",                     // 30
64     "DEFINED_PARAM_GRID_VERTEX_TAB_OVERFLOW",   // 31
65     "DEFINED_PARAM_GRID_TRIANGLE_TAB_OVERFLOW", // 32
66     "GRID_SUPERIOR_TO_GRIDMAX",                 // 33
67     "Vect_DIMENSION_ERROR",                     // 34
68     "Not enough memory available to complete this operation", // 35
69     "EMPTY_MANDATORY_FIELD"                     // 36
70 };
71 
ErrorMsg() const72 void DrawingOptions::ErrorMsg() const
73 {
74     QMessageBox msgBox;
75     if (scriptErrorType != SCRIPT_NO_ERROR)
76     {
77         statusBar()->showMessage(ScriptErrorMessage[scriptErrorType]);
78         msgBox.setText(ScriptErrorMessage[scriptErrorType]);
79         msgBox.exec();
80     }
81 }
82 
MemoryErrorMsg(int err) const83 void DrawingOptions::MemoryErrorMsg(int err) const
84 {
85     QMessageBox msgBox;
86     if (err != SCRIPT_NO_ERROR)
87     {
88         msgBox.setText(ScriptErrorMessage[err]);
89         msgBox.exec();
90     }
91 }
92 
editorwin()93 void DrawingOptions::editorwin()
94 {
95     editor *editorwindow = new editor();
96     editorwindow->show();
97 }
98 
colorsoptions()99 void DrawingOptions::colorsoptions()
100 {
101     ColorsOptions *colorwindow = new ColorsOptions();
102     connect(colorwindow->ui.color_2, SIGNAL(activated(int)), this,SLOT(oncolor_2activated(int)));
103     connect(colorwindow->ui.red_2, SIGNAL(valueChanged(int)), this,SLOT(onred_2valueChanged(int)));
104     connect(colorwindow->ui.green_2, SIGNAL(valueChanged(int)), this,SLOT(ongreen_2valueChanged(int)));
105     connect(colorwindow->ui.blue_2, SIGNAL(valueChanged(int)), this,SLOT(onblue_2valueChanged(int)));
106     colorwindow->show();
107 }
108 
videoplay()109 void DrawingOptions::videoplay()
110 {
111     QImage buf = MathmodRef->Copyscreenshot();
112     screenimage *player = new screenimage(buf);
113     player->connectcontrols();
114     player->show();
115 }
116 
~DrawingOptions()117 DrawingOptions::~DrawingOptions()
118 {
119     delete[] SliderArray;
120 }
121 
DrawingOptions(QWidget * parent)122 DrawingOptions::DrawingOptions(QWidget *parent) : QMainWindow(parent)
123 {
124     ui.setupUi(this);
125     IndexcurrentComponent = -1;
126     IsolistItemRef = nullptr;
127     select.selectedoptions.showall = false;
128     select.selectedoptions.sensitive = false;
129     select.selectedoptions.AND = true;
130     select.selectedoptions.parsefunctions = true;
131     select.selectedoptions.parsenames = true;
132     select.selectedoptions.parsecmpnames = true;
133     connect(sliderconf.ui.SaveButton, SIGNAL(clicked()), this,SLOT(update_slider_param()));
134     connect(sliderconf.ui.ParametersComboBox, SIGNAL(activated(int)), this,SLOT(update_infos_param(int)));
135     connect(addnewparam.ui.SaveButton, SIGNAL(clicked()), this,SLOT(add_new_param()));
136     connect(&select, SIGNAL(UpdateSignal()), this, SLOT(SearchListModels()));
137     statusBar()->addPermanentWidget(ui.Progressbarwidget, 1);
138     SaveSlidersRef();
139     BuildAllVect();
140     ui.ObjectClasseCurrent->hide();
141     ui.ObjectClasseCurrent->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
142 }
143 
SaveSlidersRef(int nb)144 void DrawingOptions::SaveSlidersRef(int nb)
145 {
146     SliderArray = new SliderStruct[nb];
147 
148     SliderArray[0].SliderScrollBar = ui.C1ScrollBar;
149     SliderArray[0].SliderLabel = ui.C1label;
150     SliderArray[0].SliderLabelMax = ui.C1labelMax;
151     SliderArray[0].SliderLabelMin = ui.C1labelMin;
152     SliderArray[0].SliderGroupeBox = ui.groupBox_9;
153 
154     SliderArray[1].SliderScrollBar = ui.C2ScrollBar;
155     SliderArray[1].SliderLabel = ui.C2label;
156     SliderArray[1].SliderLabelMax = ui.C2labelMax;
157     SliderArray[1].SliderLabelMin = ui.C2labelMin;
158     SliderArray[1].SliderGroupeBox = ui.groupBox_10;
159 
160     SliderArray[2].SliderScrollBar = ui.C3ScrollBar;
161     SliderArray[2].SliderLabel = ui.C3label;
162     SliderArray[2].SliderLabelMax = ui.C3labelMax;
163     SliderArray[2].SliderLabelMin = ui.C3labelMin;
164     SliderArray[2].SliderGroupeBox = ui.groupBox_11;
165 
166     SliderArray[3].SliderScrollBar = ui.C4ScrollBar;
167     SliderArray[3].SliderLabel = ui.C4label;
168     SliderArray[3].SliderLabelMax = ui.C4labelMax;
169     SliderArray[3].SliderLabelMin = ui.C4labelMin;
170     SliderArray[3].SliderGroupeBox = ui.groupBox_12;
171 
172     SliderArray[4].SliderScrollBar = ui.C5ScrollBar;
173     SliderArray[4].SliderLabel = ui.C5label;
174     SliderArray[4].SliderLabelMax = ui.C5labelMax;
175     SliderArray[4].SliderLabelMin = ui.C5labelMin;
176     SliderArray[4].SliderGroupeBox = ui.groupBox_13;
177 
178     SliderArray[5].SliderScrollBar = ui.C6ScrollBar;
179     SliderArray[5].SliderLabel = ui.C6label;
180     SliderArray[5].SliderLabelMax = ui.C6labelMax;
181     SliderArray[5].SliderLabelMin = ui.C6labelMin;
182     SliderArray[5].SliderGroupeBox = ui.groupBox_14;
183 
184     SliderArray[6].SliderScrollBar = ui.C7ScrollBar;
185     SliderArray[6].SliderLabel = ui.C7label;
186     SliderArray[6].SliderLabelMax = ui.C7labelMax;
187     SliderArray[6].SliderLabelMin = ui.C7labelMin;
188     SliderArray[6].SliderGroupeBox = ui.groupBox_15;
189 
190     SliderArray[7].SliderScrollBar = ui.C8ScrollBar;
191     SliderArray[7].SliderLabel = ui.C8label;
192     SliderArray[7].SliderLabelMax = ui.C8labelMax;
193     SliderArray[7].SliderLabelMin = ui.C8labelMin;
194     SliderArray[7].SliderGroupeBox = ui.groupBox_16;
195 
196     SliderArray[8].SliderScrollBar = ui.C9ScrollBar;
197     SliderArray[8].SliderLabel = ui.C9label;
198     SliderArray[8].SliderLabelMax = ui.C9labelMax;
199     SliderArray[8].SliderLabelMin = ui.C9labelMin;
200     SliderArray[8].SliderGroupeBox = ui.groupBox_17;
201 
202     SliderArray[9].SliderScrollBar = ui.C10ScrollBar;
203     SliderArray[9].SliderLabel = ui.C10label;
204     SliderArray[9].SliderLabelMax = ui.C10labelMax;
205     SliderArray[9].SliderLabelMin = ui.C10labelMin;
206     SliderArray[9].SliderGroupeBox = ui.groupBox_18;
207 
208     SliderArray[10].SliderScrollBar = ui.C11ScrollBar;
209     SliderArray[10].SliderLabel = ui.C11label;
210     SliderArray[10].SliderLabelMax = ui.C11labelMax;
211     SliderArray[10].SliderLabelMin = ui.C11labelMin;
212     SliderArray[10].SliderGroupeBox = ui.groupBox_19;
213 
214     SliderArray[11].SliderScrollBar = ui.C12ScrollBar;
215     SliderArray[11].SliderLabel = ui.C12label;
216     SliderArray[11].SliderLabelMax = ui.C12labelMax;
217     SliderArray[11].SliderLabelMin = ui.C12labelMin;
218     SliderArray[11].SliderGroupeBox = ui.groupBox_20;
219 
220     SliderArray[12].SliderScrollBar = ui.C13ScrollBar;
221     SliderArray[12].SliderLabel = ui.C13label;
222     SliderArray[12].SliderLabelMax = ui.C13labelMax;
223     SliderArray[12].SliderLabelMin = ui.C13labelMin;
224     SliderArray[12].SliderGroupeBox = ui.groupBox_21;
225 
226     SliderArray[13].SliderScrollBar = ui.C14ScrollBar;
227     SliderArray[13].SliderLabel = ui.C14label;
228     SliderArray[13].SliderLabelMax = ui.C14labelMax;
229     SliderArray[13].SliderLabelMin = ui.C14labelMin;
230     SliderArray[13].SliderGroupeBox = ui.groupBox_22;
231 
232     SliderArray[14].SliderScrollBar = ui.C15ScrollBar;
233     SliderArray[14].SliderLabel = ui.C15label;
234     SliderArray[14].SliderLabelMax = ui.C15labelMax;
235     SliderArray[14].SliderLabelMin = ui.C15labelMin;
236     SliderArray[14].SliderGroupeBox = ui.groupBox_23;
237 
238     SliderArray[15].SliderScrollBar = ui.C16ScrollBar;
239     SliderArray[15].SliderLabel = ui.C16label;
240     SliderArray[15].SliderLabelMax = ui.C16labelMax;
241     SliderArray[15].SliderLabelMin = ui.C16labelMin;
242     SliderArray[15].SliderGroupeBox = ui.groupBox_24;
243 
244     SliderArray[16].SliderScrollBar = ui.C17ScrollBar;
245     SliderArray[16].SliderLabel = ui.C17label;
246     SliderArray[16].SliderLabelMax = ui.C17labelMax;
247     SliderArray[16].SliderLabelMin = ui.C17labelMin;
248     SliderArray[16].SliderGroupeBox = ui.groupBox_25;
249 
250     SliderArray[17].SliderScrollBar = ui.C18ScrollBar;
251     SliderArray[17].SliderLabel = ui.C18label;
252     SliderArray[17].SliderLabelMax = ui.C18labelMax;
253     SliderArray[17].SliderLabelMin = ui.C18labelMin;
254     SliderArray[17].SliderGroupeBox = ui.groupBox_26;
255 
256     SliderArray[18].SliderScrollBar = ui.C19ScrollBar;
257     SliderArray[18].SliderLabel = ui.C19label;
258     SliderArray[18].SliderLabelMax = ui.C19labelMax;
259     SliderArray[18].SliderLabelMin = ui.C19labelMin;
260     SliderArray[18].SliderGroupeBox = ui.groupBox_27;
261 
262     SliderArray[19].SliderScrollBar = ui.C20ScrollBar;
263     SliderArray[19].SliderLabel = ui.C20label;
264     SliderArray[19].SliderLabelMax = ui.C20labelMax;
265     SliderArray[19].SliderLabelMin = ui.C20labelMin;
266     SliderArray[19].SliderGroupeBox = ui.groupBox_28;
267 }
268 
on_xyzg_valueChanged(int value)269 void DrawingOptions::on_xyzg_valueChanged(int value)
270 {
271     ui.Isogroupbox->setTitle("Grid/MaxGrid = (" +
272                              QString::number(ui.xyzg->value()) + " / " +
273                              QString::number(Parameters->IsoMaxGrid) + ")");
274     if (!MathmodRef->IsoObjet->isRunning())
275     {
276         (MathmodRef->RootObjet.CurrentJsonObject["ParIso"].isArray()) ?
277         MathmodRef->xyzg_valueChanged(value, PARISO_TYPE) : MathmodRef->xyzg_valueChanged(value, ISO_TYPE);
278     }
279     else
280     {
281         ui.ChangeGrid->blockSignals(true);
282         ui.ChangeGrid->setChecked(false);
283         ui.ChangeGrid->blockSignals(false);
284         MathmodRef->xyzactivated = -1;
285     }
286 }
287 
on_ChangeGrid_clicked()288 void DrawingOptions::on_ChangeGrid_clicked()
289 {
290     (MathmodRef->RootObjet.CurrentJsonObject["ParIso"].isArray()) ?
291     MathmodRef->slot_checkBox73_clicked(PARISO_TYPE) : MathmodRef->slot_checkBox73_clicked(ISO_TYPE);
292 }
293 
AddParObjectToTree(QTreeWidgetItem * paramlistItem,TreeStruct & currentstruct)294 void DrawingOptions::AddParObjectToTree(QTreeWidgetItem *paramlistItem,
295                                         TreeStruct &currentstruct)
296 {
297     if (!currentstruct.name.empty())
298         paramlistItem->setText(0, currentstruct.name[0]);
299     QColor greenColor = QColor(0, 255, 0, 50);
300     paramlistItem->setBackground(0, greenColor);
301 
302     if (currentstruct.Component.size() > 0)
303     {
304         QTreeWidgetItem *cmpitem = new QTreeWidgetItem(paramlistItem);
305         cmpitem->setText(0, "Components (" +QString::number(currentstruct.Component.size()) +"):");
306 
307         for (int j = 0; j < currentstruct.Component.size(); j++)
308         {
309             QTreeWidgetItem *cmpitem2 = new QTreeWidgetItem(cmpitem);
310             cmpitem2->setText(0, currentstruct.Component.at(j));
311             QTreeWidgetItem *cmpitem3 = new QTreeWidgetItem(cmpitem2);
312             cmpitem3->setText(0, "fx(u,v,t) = " + currentstruct.fx.at(j));
313             QTreeWidgetItem *cmpitem4 = new QTreeWidgetItem(cmpitem2);
314             cmpitem4->setText(0, "fy(u,v,t) = " + currentstruct.fy.at(j));
315             QTreeWidgetItem *cmpitem5 = new QTreeWidgetItem(cmpitem2);
316             cmpitem5->setText(0, "fz(u,v,t) = " + currentstruct.fz.at(j));
317             if (MathmodRef->RootObjet.CurrentJsonObject["Param4D"].isObject())
318             {
319                 QTreeWidgetItem *cmpitem8 = new QTreeWidgetItem(cmpitem2);
320                 cmpitem8->setText(0, "fw(u,v,t) = " + currentstruct.fw.at(j));
321             }
322             QTreeWidgetItem *cmpitem6 = new QTreeWidgetItem(cmpitem2);
323             cmpitem6->setText(0, "U = [" + currentstruct.umin.at(j) + ", " +currentstruct.umax.at(j) + "]");
324             QTreeWidgetItem *cmpitem7 = new QTreeWidgetItem(cmpitem2);
325             cmpitem7->setText(0, "V = [" + currentstruct.vmin.at(j) + ", " +currentstruct.vmax.at(j) + "]");
326             // Grid resolution:
327             if (currentstruct.Grid.size() > 0 &&(2 * j + 1) < currentstruct.Grid.size() &&
328                     !MathmodRef->RootObjet.CurrentJsonObject["Param4D"].isObject())
329             {
330                 QTreeWidgetItem *cmpitem7 = new QTreeWidgetItem(cmpitem2);
331                 cmpitem7->setText(0, "Grid = (" + currentstruct.Grid.at(2 * j) + " , " +currentstruct.Grid.at(2 * j + 1) + ")");
332             }
333         }
334         // Add Global parameters:
335         AddParametersToTree(paramlistItem, currentstruct);
336     }
337 }
338 
AddIsoObjectToTree(QTreeWidgetItem * IsolistItem,TreeStruct & currentstruct)339 void DrawingOptions::AddIsoObjectToTree(QTreeWidgetItem *IsolistItem, TreeStruct &currentstruct)
340 {
341     if (!currentstruct.name.empty())
342         IsolistItem->setText(0, currentstruct.name[0]);
343     QColor greenColor = QColor(0, 255, 0, 50);
344     IsolistItem->setBackground(0, greenColor);
345     if (currentstruct.Component.size() > 0)
346     {
347         QTreeWidgetItem *cmpitem = new QTreeWidgetItem(IsolistItem);
348         cmpitem->setText(0, "Components (" +
349                          QString::number(currentstruct.Component.size()) +
350                          "):");
351         for (int j = 0; j < currentstruct.Component.size(); j++)
352         {
353             QTreeWidgetItem *cmpitem2 = new QTreeWidgetItem(cmpitem);
354             cmpitem2->setText(0, currentstruct.Component.at(j));
355             QTreeWidgetItem *cmpitem3 = new QTreeWidgetItem(cmpitem2);
356             cmpitem3->setText(0, "f(x,y,z) = " + currentstruct.fxyz.at(j));
357             QTreeWidgetItem *cmpitem4 = new QTreeWidgetItem(cmpitem2);
358             cmpitem4->setText(0, "X = [" + currentstruct.xmin.at(j) + ", " +currentstruct.xmax.at(j) + "]");
359             QTreeWidgetItem *cmpitem5 = new QTreeWidgetItem(cmpitem2);
360             cmpitem5->setText(0, "Y = [" + currentstruct.ymin.at(j) + ", " +currentstruct.ymax.at(j) + "]");
361             QTreeWidgetItem *cmpitem6 = new QTreeWidgetItem(cmpitem2);
362             cmpitem6->setText(0, "Z = [" + currentstruct.zmin.at(j) + ", " +currentstruct.zmax.at(j) + "]");
363             // Grid resolution:
364             if (currentstruct.Grid.size() > 0 && j < currentstruct.Grid.size())
365             {
366                 QTreeWidgetItem *cmpitem7 = new QTreeWidgetItem(cmpitem2);
367                 cmpitem7->setText(0, "Grid = " + currentstruct.Grid.at(j));
368             }
369         }
370         // Add Global parameters:
371         AddParametersToTree(IsolistItem, currentstruct);
372     }
373 }
374 
AddParametersToTree(QTreeWidgetItem * parameterslistItem,TreeStruct & currentstruct)375 void DrawingOptions::AddParametersToTree(QTreeWidgetItem *parameterslistItem,
376         TreeStruct &currentstruct)
377 {
378     QTreeWidgetItem *parameteritem = new QTreeWidgetItem(parameterslistItem);
379     parameteritem->setText(0, "Parameters:");
380     int size = 0;
381 
382     if ((size = currentstruct.Const.size()) > 0)
383     {
384         QTreeWidgetItem *cstitem = new QTreeWidgetItem(parameteritem);
385         cstitem->setText(0, "Constantes:");
386         for (int j = 0; j < size; j++)
387         {
388             QTreeWidgetItem *cstitem2 = new QTreeWidgetItem(cstitem);
389             cstitem2->setText(0, currentstruct.Const.at(j));
390         }
391     }
392     if ((size = currentstruct.Funct.size()) > 0)
393     {
394         QTreeWidgetItem *fctitem = new QTreeWidgetItem(parameteritem);
395         fctitem->setText(0, "Functions:");
396         for (int j = 0; j < size; j++)
397         {
398             QTreeWidgetItem *fctitem2 = new QTreeWidgetItem(fctitem);
399             fctitem2->setText(0, currentstruct.Funct.at(j));
400         }
401     }
402 }
403 
AddObjectToMySelectionTree()404 void DrawingOptions::AddObjectToMySelectionTree()
405 {
406     if (MathmodRef->RootObjet.CurrentJsonObject["Iso3D"].isObject())
407     {
408         QTreeWidgetItem *isolistItem =
409             new QTreeWidgetItem(MyselectionItemReference);
410         AddIsoObjectToTree(isolistItem, MathmodRef->RootObjet.CurrentTreestruct);
411     }
412     else if (MathmodRef->RootObjet.CurrentJsonObject["Param3D"].isObject() ||
413              MathmodRef->RootObjet.CurrentJsonObject["Param4D"].isObject() ||
414              MathmodRef->RootObjet.CurrentJsonObject["Param3D_C"].isObject() ||
415              MathmodRef->RootObjet.CurrentJsonObject["Param4D_C"].isObject())
416     {
417         QTreeWidgetItem *paramlistItem =
418             new QTreeWidgetItem(MyselectionItemReference);
419         AddParObjectToTree(paramlistItem, MathmodRef->RootObjet.CurrentTreestruct);
420     }
421 }
422 
UpdateTreeObject()423 void DrawingOptions::UpdateTreeObject()
424 {
425     // Update Object Tree
426     if (MathmodRef->RootObjet.CurrentJsonObject["ParIso"].isArray()) // isoObject
427     {
428         ui.ObjectClasseCurrent->model()->removeRows(
429             0, ui.ObjectClasseCurrent->model()->rowCount());
430         for (uint i = 0; i < MathmodRef->RootObjet.CurrentParisoTreestruct.size();
431                 i++)
432         {
433             QTreeWidgetItem *parisochild = new QTreeWidgetItem(ui.ObjectClasseCurrent);
434             if (MathmodRef->RootObjet.CurrentParisoTreestruct[i].type == ISO_TYPE)
435                 AddIsoObjectToTree(parisochild,MathmodRef->RootObjet.CurrentParisoTreestruct[i]);
436             else
437                 AddParObjectToTree(parisochild,MathmodRef->RootObjet.CurrentParisoTreestruct[i]);
438         }
439     }
440     else
441     {
442         if (MathmodRef->RootObjet.CurrentJsonObject["Iso3D"].isObject()) // isoObject
443         {
444             ui.ObjectClasseCurrent->model()->removeRows(0, ui.ObjectClasseCurrent->model()->rowCount());
445             QTreeWidgetItem *IsolistItem = new QTreeWidgetItem(ui.ObjectClasseCurrent);
446             AddIsoObjectToTree(IsolistItem, MathmodRef->RootObjet.CurrentTreestruct);
447         }
448         else if (MathmodRef->RootObjet.CurrentJsonObject["Param3D"].isObject() ||
449                  MathmodRef->RootObjet.CurrentJsonObject["Param4D"].isObject() ||
450                  MathmodRef->RootObjet.CurrentJsonObject["Param3D_C"].isObject() ||
451                  MathmodRef->RootObjet.CurrentJsonObject["Param4D_C"].isObject() )
452         {
453             ui.ObjectClasseCurrent->model()->removeRows(0, ui.ObjectClasseCurrent->model()->rowCount());
454             QTreeWidgetItem *paramlistItem =new QTreeWidgetItem(ui.ObjectClasseCurrent);
455             AddParObjectToTree(paramlistItem,MathmodRef->RootObjet.CurrentTreestruct);
456         }
457     }
458 }
459 
UpdatePar4DModelDetailsPage(TreeStruct & currentstruct)460 void DrawingOptions::UpdatePar4DModelDetailsPage(TreeStruct &currentstruct)
461 {
462     ui.ParamComponent_2->clear();
463     if (!currentstruct.name.empty())
464         ui.groupBox->setTitle(currentstruct.name.at(0));
465     ui.ParamComponent_2->insertItems(0, currentstruct.Component);
466     ui.stackedProperties->setCurrentIndex(3);
467     UpdateDescription(0, PAR_4D_TYPE, currentstruct);
468 }
469 
UpdatePar3DModelDetailsPage(TreeStruct & currentstruct)470 void DrawingOptions::UpdatePar3DModelDetailsPage(TreeStruct &currentstruct)
471 {
472     ui.ParamComponent->clear();
473     if (!currentstruct.name.empty())
474         ui.groupBox->setTitle(currentstruct.name.at(0));
475     ui.ParamComponent->insertItems(0, currentstruct.Component);
476     ui.stackedProperties->setCurrentIndex(2);
477     ui.ShowParComp->setChecked(true);
478     ui.ShowParComp->setText("Show");
479     UpdateDescription(0, PAR_TYPE, currentstruct);
480 }
481 
UpdateIsoModelDetailsPage(TreeStruct & currentstruct)482 void DrawingOptions::UpdateIsoModelDetailsPage(TreeStruct &currentstruct)
483 {
484     ui.stackedProperties->setCurrentIndex(1);
485     if (!currentstruct.name.empty())
486         ui.groupBox->setTitle(currentstruct.name.at(0));
487     ui.IsoComponent->clear();
488     ui.IsoComponent->insertItems(0, currentstruct.Component);
489     ui.ShowIsoComp->setChecked(true);
490     ui.ShowIsoComp->setText("Show");
491     UpdateDescription(0, ISO_TYPE, currentstruct);
492 }
493 
UpdateScriptEditorAndTreeObject()494 void DrawingOptions::UpdateScriptEditorAndTreeObject()
495 {
496     // Update the current Tree Object:
497     if (ShowCurrentObjectTree)
498         UpdateTreeObject();
499     // Update the "Script Edit" page
500     ui.ParamEdit->setText(MathmodRef->RootObjet.CurrentTreestruct.text);
501     // Update the "Model Details" page
502     if (MathmodRef->RootObjet.CurrentJsonObject["ParIso"].isArray())
503     {
504         ui.parisocomboBox->clear();
505         if (MathmodRef->RootObjet.CurrentParisoTreestruct.size() > 0)
506         {
507             for (uint i = 0; i < MathmodRef->RootObjet.CurrentParisoTreestruct.size();i++)
508                 ui.parisocomboBox->insertItem(i, MathmodRef->RootObjet.CurrentParisoTreestruct[i].name[0]);
509             if (MathmodRef->RootObjet.CurrentParisoTreestruct[0].fxyz.size() != 0)
510                 UpdateIsoModelDetailsPage(MathmodRef->RootObjet.CurrentParisoTreestruct[0]);
511             else if (MathmodRef->RootObjet.CurrentParisoTreestruct[0].fw.size() != 0)
512                 UpdatePar4DModelDetailsPage(MathmodRef->RootObjet.CurrentParisoTreestruct[0]);
513             else if (MathmodRef->RootObjet.CurrentParisoTreestruct[0].fx.size() != 0)
514                 UpdatePar3DModelDetailsPage(MathmodRef->RootObjet.CurrentParisoTreestruct[0]);
515         }
516     }
517     else if (MathmodRef->RootObjet.CurrentJsonObject["Iso3D"].isObject())
518         UpdateIsoModelDetailsPage(MathmodRef->RootObjet.CurrentTreestruct);
519     else if (MathmodRef->RootObjet.CurrentJsonObject["Param3D"].isObject() ||
520              MathmodRef->RootObjet.CurrentJsonObject["Param3D_C"].isObject())
521         UpdatePar3DModelDetailsPage(MathmodRef->RootObjet.CurrentTreestruct);
522     else if (MathmodRef->RootObjet.CurrentJsonObject["Param4D"].isObject() ||
523              MathmodRef->RootObjet.CurrentJsonObject["Param4D_C"].isObject())
524         UpdatePar4DModelDetailsPage(MathmodRef->RootObjet.CurrentTreestruct);
525     else
526         ui.stackedProperties->setCurrentIndex(0);
527 }
528 
HideSliders()529 void DrawingOptions::HideSliders()
530 {
531     ui.groupBox_9->hide();
532     ui.groupBox_10->hide();
533     ui.groupBox_11->hide();
534     ui.groupBox_12->hide();
535     ui.groupBox_13->hide();
536     ui.groupBox_14->hide();
537     ui.groupBox_15->hide();
538     ui.groupBox_16->hide();
539     ui.groupBox_17->hide();
540     ui.groupBox_18->hide();
541     ui.groupBox_19->hide();
542     ui.groupBox_20->hide();
543     ui.groupBox_21->hide();
544     ui.groupBox_22->hide();
545     ui.groupBox_23->hide();
546     ui.groupBox_24->hide();
547     ui.groupBox_25->hide();
548     ui.groupBox_26->hide();
549     ui.groupBox_27->hide();
550     ui.groupBox_28->hide();
551     ui.PredefinedSets->clear();
552     ui.PredefinedSets->addItem("Predefined Sets");
553     ui.ParametersList->clear();
554     ui.ParametersList->addItem("Parameters List");
555     sliderconf.ui.ParametersComboBox->clear();
556     sliderconf.ui.ParametersComboBox->addItem("Parameters List");
557 }
558 
ObjArrayToString(QJsonArray & lst,QString & str)559 void DrawingOptions::ObjArrayToString(QJsonArray &lst, QString &str)
560 {
561     str = "";
562     for (int j = 0; j < lst.size() - 1; j++)
563         str += lst[j].toString() + ";";
564     if (lst.size() >= 1)
565         str += lst[lst.size() - 1].toString();
566     str.replace("\n", "");
567     str.replace("\t", "");
568     str.replace(" ", "");
569 }
570 
ShowSliders(const QJsonObject & Jobj)571 void DrawingOptions::ShowSliders(const QJsonObject &Jobj)
572 {
573     QString result;
574     QJsonArray lst;
575     QJsonObject QObj;
576     if (Jobj["Sliders"].isObject())
577     {
578         // Hide all sliders
579         HideSliders();
580         QObj = Jobj["Sliders"].toObject();
581         // Min
582         lst = QObj["Min"].toArray();
583         ObjArrayToString(lst, result);
584         qlstmin = result.split(";", QString::SkipEmptyParts);
585         // Max
586         lst = QObj["Max"].toArray();
587         ObjArrayToString(lst, result);
588         qlstmax = result.split(";", QString::SkipEmptyParts);
589         // Position
590         lst = QObj["Position"].toArray();
591         ObjArrayToString(lst, result);
592         qlstPos = result.split(";", QString::SkipEmptyParts);
593         for (int i = 0; i < qlstPos.size(); ++i)
594         {
595             MathmodRef->IsoObjet->masterthread->SliderValues.push_back(
596                 qlstPos.at(i).toDouble());
597             MathmodRef->ParObjet->masterthread->SliderValues.push_back(
598                 qlstPos.at(i).toDouble());
599         }
600         // Name
601         lst = QObj["Name"].toArray();
602         ObjArrayToString(lst, result);
603         qlstnames = result.split(";", QString::SkipEmptyParts);
604         for (int i = 0; i < qlstnames.size(); ++i)
605         {
606             MathmodRef->IsoObjet->masterthread->SliderNames.push_back(
607                 qlstnames.at(i).toStdString());
608             MathmodRef->ParObjet->masterthread->SliderNames.push_back(
609                 qlstnames.at(i).toStdString());
610         }
611         MathmodRef->IsoObjet->masterthread->Nb_Sliders =
612             uint(qlstnames.size());
613         MathmodRef->ParObjet->masterthread->Nb_Sliders =
614             uint(qlstnames.size());
615         ui.ParametersList->clear();
616         ui.ParametersList->addItem("Parameters List  (" +
617                                    QString::number(qlstnames.size()) + ")");
618         ui.ParametersList->addItems(qlstnames);
619         sliderconf.ui.ParametersComboBox->clear();
620         sliderconf.ui.ParametersComboBox->addItem(
621             "Parameters List  (" + QString::number(qlstnames.size()) + ")");
622         sliderconf.ui.ParametersComboBox->addItems(qlstnames);
623         // Step
624         lst = QObj["Step"].toArray();
625         ObjArrayToString(lst, result);
626         qlstStep = result.split(";", QString::SkipEmptyParts);
627         QStringList qlist;
628         if (qlstPos.size() >= qlstnames.size())
629         {
630             ui.PredefinedSets->clear();
631             int NbSets = (qlstPos.size() == 0 || qlstnames.size() == 0)
632                          ? 0
633                          : qlstPos.size() / qlstnames.size();
634             qlist += "Predefined Sets (" + QString::number(NbSets) + ")";
635             if (QObj["SetNames"].isArray() &&
636                     (lst = QObj["SetNames"].toArray()).size())
637             {
638                 ObjArrayToString(lst, result);
639                 qlist += result.split(";", QString::SkipEmptyParts);
640             }
641             else
642             {
643                 for (int i = 1; i < NbSets + 1; i++)
644                 {
645                     qlist += "Set_" + QString::number(i);
646                 }
647             }
648             ui.PredefinedSets->addItems(qlist);
649         }
650         for (int sl = 0; sl < 20; sl++)
651         {
652             if (qlstnames.size() >= (sl + 1))
653             {
654                 (SliderArray[sl].SliderScrollBar)->blockSignals(true);
655                 (SliderArray[sl].SliderScrollBar)->setMaximum(qlstmax.at(sl).toInt());
656                 (SliderArray[sl].SliderScrollBar)->setMinimum(qlstmin.at(sl).toInt());
657                 (SliderArray[sl].SliderScrollBar)
658                 ->setSingleStep(qlstStep.at(sl).toInt());
659                 (SliderArray[sl].SliderScrollBar)->setPageStep(qlstStep.at(sl).toInt());
660                 (SliderArray[sl].SliderScrollBar)
661                 ->setSliderPosition(qlstPos.at(sl).toInt());
662                 (SliderArray[sl].SliderLabel)
663                 ->setText(qlstnames.at(sl) + " = " + qlstPos.at(sl) + "(" +
664                           qlstStep.at(sl) + ")");
665                 (SliderArray[sl].SliderLabelMin)->setText(qlstmin.at(sl));
666                 (SliderArray[sl].SliderLabelMax)->setText(qlstmax.at(sl));
667                 (SliderArray[sl].SliderScrollBar)->blockSignals(false);
668                 (SliderArray[sl].SliderGroupeBox)->show();
669             }
670         }
671     }
672     else
673     {
674         MathmodRef->IsoObjet->masterthread->Nb_Sliders = 0;
675         MathmodRef->ParObjet->masterthread->Nb_Sliders = 0;
676         HideSliders();
677     }
678 }
679 
DrawJsonModel(const QJsonObject & Jobj,int textureIndex,bool Inspect)680 void DrawingOptions::DrawJsonModel(const QJsonObject &Jobj, int textureIndex,
681                                    bool Inspect)
682 {
683     if (!MathmodRef->ParObjet->isRunning() &&
684             !MathmodRef->IsoObjet->isRunning())
685     {
686         if (Inspect & !VerifiedJsonModel(Jobj, Inspect))
687             return;
688         ShowJsonModel(Jobj, textureIndex);
689         UpdateScriptEditorAndTreeObject();
690     }
691 }
692 
MandatoryParFieldToQString(const MandatoryParField & idx)693 QString DrawingOptions::MandatoryParFieldToQString(const MandatoryParField &idx)
694 {
695     QString arg = "";
696     switch (idx)
697     {
698     case PAR_FX:
699         arg = "Fx";
700         break;
701     case PAR_FY:
702         arg = "Fy";
703         break;
704     case PAR_FZ:
705         arg = "Fz";
706         break;
707     case PAR_FW:
708         arg = "Fw";
709         break;
710     case PAR_UMAX:
711         arg = "Umax";
712         break;
713     case PAR_UMIN:
714         arg = "Umin";
715         break;
716     case PAR_VMAX:
717         arg = "Vmax";
718         break;
719     case PAR_VMIN:
720         arg = "Vmin";
721         break;
722     case PAR_NAME:
723         arg = "Name";
724         break;
725     case PAR_COMP:
726         arg = "Component";
727         break;
728     }
729     return(arg);
730 }
731 
MandatoryIsoFieldToQString(const MandatoryIsoField & idx)732 QString DrawingOptions::MandatoryIsoFieldToQString(const MandatoryIsoField &idx)
733 {
734     QString arg = "";
735     switch (idx)
736     {
737     case ISO_FXYZ:
738         arg = "Fxyz";
739         break;
740     case ISO_XMAX:
741         arg = "Xmax";
742         break;
743     case ISO_YMAX:
744         arg = "Ymax";
745         break;
746     case ISO_ZMAX:
747         arg = "Zmax";
748         break;
749     case ISO_XMIN:
750         arg = "Xmin";
751         break;
752     case ISO_YMIN:
753         arg = "Ymin";
754         break;
755     case ISO_ZMIN:
756         arg = "Zmin";
757         break;
758     case ISO_NAME:
759         arg = "Name";
760         break;
761     case ISO_COMP:
762         arg = "Component";
763         break;
764     }
765     return(arg);
766 }
767 
VerifyIsoFieldEmptySpace(const QJsonObject & QObj,const MandatoryIsoField & idx)768 bool DrawingOptions::VerifyIsoFieldEmptySpace(const QJsonObject &QObj, const MandatoryIsoField &idx)
769 {
770     QString arg = MandatoryIsoFieldToQString(idx);
771     for(int i=0; i<(QObj[arg].toArray()).size(); i++)
772     {
773         if((QObj[arg].toArray())[i].toString().replace(" ","") == "")
774         {
775             return false;
776         }
777     }
778     return true;
779 }
780 
VerifyParFieldEmptySpace(const QJsonObject & QObj,const MandatoryParField & idx)781 bool DrawingOptions::VerifyParFieldEmptySpace(const QJsonObject &QObj, const MandatoryParField &idx)
782 {
783     QString arg = MandatoryParFieldToQString(idx);
784     for(int i=0; i<(QObj[arg].toArray()).size(); i++)
785     {
786         if((QObj[arg].toArray())[i].toString().replace(" ","") == "")
787             return false;
788     }
789     return true;
790 }
791 
VerifyParEmptySpace(const QJsonObject & QObj)792 bool DrawingOptions::VerifyParEmptySpace(const QJsonObject& QObj)
793 {
794     for (std::vector<MandatoryParField>::const_iterator it =
795                 MandParFields.begin();
796             it != MandParFields.end(); ++it)
797     {
798         MandatoryParField Opt = *it;
799         if(!VerifyParFieldEmptySpace(QObj, Opt))
800             return false;
801     }
802     return true;
803 }
804 
VerifyIsoEmptySpace(const QJsonObject & QObj)805 bool DrawingOptions::VerifyIsoEmptySpace(const QJsonObject& QObj)
806 {
807     for (std::vector<MandatoryIsoField>::const_iterator it =
808                 MandIsoFields.begin();
809             it != MandIsoFields.end(); ++it)
810     {
811         MandatoryIsoField Opt = *it;
812         if(!VerifyIsoFieldEmptySpace(QObj, Opt))
813             return false;
814     }
815     return true;
816 }
817 
VerifiedIsoJsonModel(const QJsonObject & QObj)818 bool DrawingOptions::VerifiedIsoJsonModel(const QJsonObject &QObj)
819 {
820     QJsonArray lst;
821     int NbFxyz;
822     if (!VerifyIsoEmptySpace(QObj))
823     {
824         scriptErrorType = EMPTY_MANDATORY_FIELD;
825         ErrorMsg();
826         return false;
827     }
828     // Fxyz
829     NbFxyz = (QObj["Fxyz"].toArray()).size();
830     if ((QObj["Xmax"].toArray()).size() != NbFxyz)
831     {
832         scriptErrorType = XMAX_NBCOMPONENT_MISMATCH;
833         ErrorMsg();
834         return false;
835     }
836     if ((QObj["Ymax"].toArray()).size() != NbFxyz)
837     {
838         scriptErrorType = YMAX_NBCOMPONENT_MISMATCH;
839         ErrorMsg();
840         return false;
841     }
842     if ((QObj["Zmax"].toArray()).size() != NbFxyz)
843     {
844         scriptErrorType = ZMAX_NBCOMPONENT_MISMATCH;
845         ErrorMsg();
846         return false;
847     }
848     if ((QObj["Xmin"].toArray()).size() != NbFxyz)
849     {
850         scriptErrorType = XMIN_NBCOMPONENT_MISMATCH;
851         ErrorMsg();
852         return false;
853     }
854     if ((QObj["Ymin"].toArray()).size() != NbFxyz)
855     {
856         scriptErrorType = YMIN_NBCOMPONENT_MISMATCH;
857         ErrorMsg();
858         return false;
859     }
860     if ((QObj["Zmin"].toArray()).size() != NbFxyz)
861     {
862         scriptErrorType = ZMIN_NBCOMPONENT_MISMATCH;
863         ErrorMsg();
864         return false;
865     }
866     if ((QObj["Component"].toArray()).size() != NbFxyz)
867     {
868         scriptErrorType = COMPONENT_NBCOMPONENT_MISMATCH;
869         ErrorMsg();
870         return false;
871     }
872     if (((lst = QObj["Grid"].toArray()).size() > 0) && (lst.size() != NbFxyz))
873     {
874         scriptErrorType = GRID_NBCOMPONENT_MISMATCH;
875         ErrorMsg();
876         return false;
877     }
878     // variables
879     if (((lst = QObj["Vect"].toArray()).size() > 1))
880     {
881         scriptErrorType = VECT_DIMENSION_ERROR;
882         ErrorMsg();
883         return false;
884     }
885     if (lst.size() > 0)
886     {
887         for (int i = 0; i < lst.size(); i++)
888             if ((lst[i].toString()).toUInt() >= uint(Parameters->IsoMaxGrid))
889             {
890                 scriptErrorType = GRID_SUPERIOR_TO_GRIDMAX;
891                 ErrorMsg();
892                 return false;
893             }
894     }
895     if (((QObj["Cnd"].toArray()).size() > 0) &&
896             ((QObj["Cnd"].toArray()).size() != NbFxyz))
897     {
898         scriptErrorType = CND_NBCOMPONENT_MISMATCH;
899         ErrorMsg();
900         return false;
901     }
902     return true;
903 }
904 
VerifiedParJsonModel(const QJsonObject & QObj)905 bool DrawingOptions::VerifiedParJsonModel(const QJsonObject &QObj)
906 {
907     QJsonArray lst;
908     int NbFx;
909     if (!VerifyParEmptySpace(QObj))
910     {
911         scriptErrorType = EMPTY_MANDATORY_FIELD;
912         ErrorMsg();
913         return false;
914     }
915     // Fx
916     NbFx = (QObj["Fx"].toArray()).size();
917     // Fy
918     if ((QObj["Fy"].toArray()).size() != NbFx)
919     {
920         scriptErrorType = FY_FX_MISMATCH;
921         ErrorMsg();
922         return false;
923     }
924     // Fz
925     if ((QObj["Fz"].toArray()).size() != NbFx)
926     {
927         scriptErrorType = FZ_FX_MISMATCH;
928         ErrorMsg();
929         return false;
930     }
931     if (((QObj["Fw"].toArray()).size() != 0) &&
932             ((QObj["Fw"].toArray()).size() != NbFx))
933     {
934         scriptErrorType = FW_FX_MISMATCH;
935         ErrorMsg();
936         return false;
937     }
938     if ((QObj["Umax"].toArray()).size() != NbFx)
939     {
940         scriptErrorType = UMAX_NBCOMPONENT_MISMATCH;
941         ErrorMsg();
942         return false;
943     }
944     if ((QObj["Vmax"].toArray()).size() != NbFx)
945     {
946         scriptErrorType = VMAX_NBCOMPONENT_MISMATCH;
947         ErrorMsg();
948         return false;
949     }
950     if (((QObj["Wmax"].toArray()).size() > 0) &&
951             ((QObj["Wmax"].toArray()).size() != NbFx))
952     {
953         scriptErrorType = WMAX_NBCOMPONENT_MISMATCH;
954         ErrorMsg();
955         return false;
956     }
957     if ((QObj["Umin"].toArray()).size() != NbFx)
958     {
959         scriptErrorType = UMIN_NBCOMPONENT_MISMATCH;
960         ErrorMsg();
961         return false;
962     }
963     if ((QObj["Vmin"].toArray()).size() != NbFx)
964     {
965         scriptErrorType = VMIN_NBCOMPONENT_MISMATCH;
966         ErrorMsg();
967         return false;
968     }
969     if (((QObj["Wmin"].toArray()).size() > 0) &&
970             ((QObj["Wmin"].toArray()).size() != NbFx))
971     {
972         scriptErrorType = WMIN_NBCOMPONENT_MISMATCH;
973         ErrorMsg();
974         return false;
975     }
976     if ((QObj["Component"].toArray()).size() != NbFx)
977     {
978         scriptErrorType = COMPONENT_NBCOMPONENT_MISMATCH;
979         ErrorMsg();
980         return false;
981     }
982     // Start Grid field processing
983     if ((lst = QObj["Grid"].toArray()).size() > 0 && (lst.size() != 2 * NbFx))
984     {
985         scriptErrorType = GRID_NBCOMPONENT_MISMATCH;
986         ErrorMsg();
987         return false;
988     }
989     if (((lst = QObj["Vect"].toArray()).size() > 1))
990     {
991         scriptErrorType = VECT_DIMENSION_ERROR;
992         ErrorMsg();
993         return false;
994     }
995     if (((QObj["Cnd"].toArray()).size() > 0) &&
996             ((QObj["Cnd"].toArray()).size() != NbFx))
997     {
998         scriptErrorType = CND_NBCOMPONENT_MISMATCH;
999         ErrorMsg();
1000         return false;
1001     }
1002     return true;
1003 }
1004 
VerifiedJsonModel(const QJsonObject & Jobj,bool Inspect)1005 bool DrawingOptions::VerifiedJsonModel(const QJsonObject &Jobj, bool Inspect)
1006 {
1007     QJsonObject QObj;
1008     bool verif = false;
1009     if (!Inspect)
1010         return true;
1011     if (Jobj["Iso3D"].isObject())
1012     {
1013         QObj = Jobj["Iso3D"].toObject();
1014         verif = VerifiedIsoJsonModel(QObj);
1015         if (verif)
1016         {
1017             MathmodRef->LocalScene.componentsinfos.pariso = false;
1018             MathmodRef->LocalScene.componentsinfos.ParisoNbComponents =1;
1019             MathmodRef->LocalScene.componentsinfos.ParisoCurrentComponentIndex = 0;
1020         }
1021         return (verif);
1022     }
1023     if (Jobj["Param3D"].isObject() || Jobj["Param3D_C"].isObject() ||
1024         Jobj["Param4D"].isObject() || Jobj["Param4D_C"].isObject())
1025     {
1026         if(Jobj["Param3D"].isObject())
1027             QObj = Jobj["Param3D"].toObject();
1028         else if(Jobj["Param4D"].isObject())
1029                 QObj = Jobj["Param4D"].toObject();
1030         else if(Jobj["Param3D_C"].isObject())
1031                 QObj = Jobj["Param3D_C"].toObject();
1032         else if(Jobj["Param4D_C"].isObject())
1033                 QObj = Jobj["Param4D_C"].toObject();
1034         MathmodRef->LocalScene.componentsinfos.ParisoNbComponents = 1;
1035         verif = VerifiedParJsonModel(QObj);
1036         if (verif)
1037         {
1038             MathmodRef->LocalScene.componentsinfos.pariso = false;
1039             MathmodRef->LocalScene.componentsinfos.ParisoNbComponents = 1;
1040             MathmodRef->LocalScene.componentsinfos.ParisoCurrentComponentIndex = 0;
1041         }
1042         return (verif);
1043     }
1044     if (Jobj["ParIso"].isArray())
1045     {
1046         QJsonArray listeObj = Jobj["ParIso"].toArray();
1047         QJsonArray listeIsoObj;
1048         QJsonArray listeParObj;
1049         for (int i = 0; i < listeObj.size(); i++)
1050             if ((listeObj[i].toObject())["Iso3D"].isObject())
1051                 listeIsoObj.append(listeObj[i].toObject()["Iso3D"].toObject());
1052             else
1053                 listeParObj.append(listeObj[i].toObject()["Param3D"].toObject());
1054         MathmodRef->LocalScene.componentsinfos.pariso = true;
1055         MathmodRef->LocalScene.componentsinfos.ParisoNbComponents = listeIsoObj.size() + listeParObj.size();
1056         MathmodRef->LocalScene.componentsinfos.ParisoCurrentComponentIndex = 0;
1057         for (int i = 0; i < listeIsoObj.size(); i++)
1058             if (!VerifiedIsoJsonModel(listeIsoObj[i].toObject()))
1059                 return (false);
1060         for (int i = 0; i < listeParObj.size(); i++)
1061             if (!VerifiedParJsonModel(listeParObj[i].toObject()))
1062                 return (false);
1063     }
1064     return true;
1065 }
1066 
LoadTexture(const QJsonObject & QObj,const ModelType & opt)1067 void DrawingOptions::LoadTexture(const QJsonObject &QObj,
1068                                  const ModelType &opt)
1069 {
1070     QString noise1 = QObj["Noise"].toString();
1071     QJsonArray lst = QObj["Colors"].toArray();
1072     noise1.replace("\n", "");
1073     noise1.replace("\t", "");
1074     noise1.replace(" ", "");
1075     QString result;
1076     ObjArrayToString(lst, result);
1077 
1078     if (opt == ISO_TYPE)
1079     {
1080         MathmodRef->LocalScene.componentsinfos.hsv.push_back(result.contains("H="));
1081         MathmodRef->IsoObjet->masterthread->Rgbt = result.toStdString();
1082         MathmodRef->IsoObjet->masterthread->Noise = noise1.toStdString();
1083         MathmodRef->IsoObjet->masterthread->RgbtSize = uint(lst.size());
1084     }
1085     else if (opt == PAR_TYPE || opt == PAR_4D_TYPE)
1086     {
1087         MathmodRef->LocalScene.componentsinfos.hsv.push_back(result.contains("H="));
1088         MathmodRef->ParObjet->masterthread->Rgbt = result.toStdString();
1089         MathmodRef->ParObjet->masterthread->Noise = noise1.toStdString();
1090         MathmodRef->ParObjet->masterthread->RgbtSize = uint(lst.size());
1091     }
1092     MathmodRef->RootObjet.CurrentTreestruct.Noise = noise1;
1093     MathmodRef->RootObjet.CurrentTreestruct.RGBT = result.split(";", QString::SkipEmptyParts);
1094 }
1095 
LoadPigment(const QJsonObject & QObj,const ModelType & opt)1096 void DrawingOptions::LoadPigment(const QJsonObject &QObj,
1097                                  const ModelType &opt)
1098 {
1099     QString noise = "";
1100     QJsonArray tmp;
1101     QString strtmp = QObj["Gradient"].toString();
1102     noise = QObj["Noise"].toString();
1103     QJsonArray lst = QObj["Colors"].toArray();
1104     QString result = "";
1105     int VRgbtSize = 0;
1106     for (int j = 0; j < lst.size(); j++)
1107     {
1108         tmp = (lst[j].toObject())["Color"].toObject()["Vrgba"].toArray();
1109         for (int k = 0; k < tmp.count(); k++)
1110         {
1111             result += tmp[k].toString() + ";";
1112             VRgbtSize++;
1113         }
1114     }
1115     strtmp.replace("\n", "");
1116     strtmp.replace("\t", "");
1117     strtmp.replace(" ", "");
1118     noise.replace("\n", "");
1119     noise.replace("\t", "");
1120     noise.replace(" ", "");
1121     result.replace("\n", "");
1122     result.replace("\t", "");
1123     result.replace(" ", "");
1124     if (opt == ISO_TYPE)
1125     {
1126         MathmodRef->IsoObjet->masterthread->Gradient = strtmp.toStdString();
1127         MathmodRef->IsoObjet->masterthread->VRgbt = result.toStdString();
1128         MathmodRef->IsoObjet->masterthread->Noise = noise.toStdString();
1129         MathmodRef->IsoObjet->masterthread->VRgbtSize = uint(VRgbtSize);
1130     }
1131     else if (opt == PAR_TYPE || opt == PAR_4D_TYPE)
1132     {
1133         MathmodRef->ParObjet->masterthread->Gradient = strtmp.toStdString();
1134         MathmodRef->ParObjet->masterthread->VRgbt = result.toStdString();
1135         MathmodRef->ParObjet->masterthread->Noise = noise.toStdString();
1136         MathmodRef->ParObjet->masterthread->VRgbtSize = uint(VRgbtSize);
1137     }
1138     MathmodRef->RootObjet.CurrentTreestruct.Noise = noise;
1139     MathmodRef->RootObjet.CurrentTreestruct.VRGBT =
1140         result.split(";", QString::SkipEmptyParts);
1141 }
1142 
ShowJsonModel(const QJsonObject & Jobj,int textureIndex)1143 void DrawingOptions::ShowJsonModel(const QJsonObject &Jobj, int textureIndex)
1144 {
1145     QJsonObject QObj, QIso, QPar;
1146     QJsonObject QTextureObj, QPigmentObj;
1147     bool loadtext, loadpigm;
1148     QJsonDocument document;
1149     if (textureIndex != -1)
1150     {
1151         if (textureIndex < 1000)
1152             QTextureObj = MathmodRef->collection.JTextures[textureIndex]
1153                           .toObject()["Texture"]
1154                           .toObject();
1155         else
1156             QPigmentObj = MathmodRef->collection.JPigments[textureIndex - 1000]
1157                           .toObject()["Pigment"]
1158                           .toObject();
1159     }
1160     else
1161     {
1162         if (Jobj["Texture"].isObject())
1163             QTextureObj = Jobj["Texture"].toObject();
1164 
1165         if (Jobj["Pigment"].isObject())
1166             QPigmentObj = Jobj["Pigment"].toObject();
1167     }
1168 
1169     ShowSliders(Jobj);
1170     updateCurrentTreestruct();
1171     MathmodRef->LocalScene.componentsinfos.ParisoCondition.clear();
1172     MathmodRef->LocalScene.componentsinfos.hsv.clear();
1173     if (Jobj["ParIso"].isArray())
1174     {
1175         QJsonArray listeObj = Jobj["ParIso"].toArray();
1176         QJsonArray listeIsoObj;
1177         QJsonArray listeParObj;
1178         for (int i = 0; i < listeObj.size(); i++)
1179             if ((listeObj[i].toObject())["Iso3D"].isObject())
1180                 listeIsoObj.append(listeObj[i].toObject());
1181             else
1182                 listeParObj.append(listeObj[i].toObject());
1183         // Right now, we only support pariso object with 1 Iso3D and 1 Param3D objects.
1184         if (listeParObj.size() > 0)
1185             QPar = listeParObj[0].toObject();
1186         if (listeIsoObj.size() > 0)
1187             QIso = listeIsoObj[0].toObject();
1188 
1189         loadtext = loadpigm = false;
1190         if (QPar["Texture"].isObject())
1191             QTextureObj = QPar["Texture"].toObject();
1192         if (QPar["Pigment"].isObject())
1193             QPigmentObj = QPar["Pigment"].toObject();
1194         // Colors
1195         loadtext = MathmodRef->ParObjet->masterthread->rgbtnotnull =
1196                        (QPar["Texture"].isObject() ||
1197                         ((textureIndex < 1000) && (textureIndex != -1)));
1198         // Pigment
1199         loadpigm = MathmodRef->ParObjet->masterthread->vrgbtnotnull =
1200                        (QPar["Pigment"].isObject() ||
1201                         ((textureIndex != -1) && (textureIndex > 999)));
1202         LoadMandatoryAndOptionnalFields(QPar["Param3D"].toObject(), PAR_TYPE,
1203                                         loadtext, QTextureObj, loadpigm,
1204                                         QPigmentObj);
1205         // Save this Current Parametric Tree struct
1206         MathmodRef->RootObjet.CurrentParisoTreestruct.push_back(
1207             MathmodRef->RootObjet.CurrentTreestruct);
1208 
1209         loadtext = loadpigm = false;
1210         if (QIso["Texture"].isObject())
1211             QTextureObj = QIso["Texture"].toObject();
1212         if (QIso["Pigment"].isObject())
1213             QPigmentObj = QIso["Pigment"].toObject();
1214         // Colors
1215         loadtext = MathmodRef->IsoObjet->masterthread->rgbtnotnull =
1216                        (QIso["Texture"].isObject() ||
1217                         ((textureIndex < 1000) && (textureIndex != -1)));
1218         // Pigment
1219         loadpigm = MathmodRef->IsoObjet->masterthread->vrgbtnotnull =
1220                        (QIso["Pigment"].isObject() ||
1221                         ((textureIndex != -1) && (textureIndex > 999)));
1222         LoadMandatoryAndOptionnalFields(QIso["Iso3D"].toObject(), ISO_TYPE,
1223                                         loadtext, QTextureObj, loadpigm,
1224                                         QPigmentObj);
1225         // Save this Current Isosurface Tree struct
1226         MathmodRef->RootObjet.CurrentParisoTreestruct.push_back(
1227             MathmodRef->RootObjet.CurrentTreestruct);
1228 
1229         document.setObject(Jobj);
1230         MathmodRef->RootObjet.CurrentTreestruct.text = QString(document.toJson());
1231 
1232         // Update the current pariso struct
1233         MathmodRef->RootObjet.CurrentJsonObject = Jobj;
1234         CurrentFormulaType = 2;
1235         /// process the new surface
1236         if (textureIndex == -1)
1237         {
1238             MathmodRef->LocalScene.componentsinfos.pariso = true;
1239             MathmodRef->ParisoObjectProcess();
1240         }
1241 
1242         ui.parisogroupbox->show();
1243     }
1244     else
1245     {
1246         ui.parisogroupbox->hide();
1247         MathmodRef->LocalScene.componentsinfos.pariso = false;
1248         if (Jobj["Iso3D"].isObject())
1249         {
1250             QObj = Jobj["Iso3D"].toObject();
1251 
1252             // Colors
1253             loadtext = MathmodRef->IsoObjet->masterthread->rgbtnotnull =
1254                            (Jobj["Texture"].isObject() ||
1255                             ((textureIndex < 1000) && (textureIndex != -1)));
1256 
1257             // Pigment
1258             loadpigm = MathmodRef->IsoObjet->masterthread->vrgbtnotnull =
1259                            (Jobj["Pigment"].isObject() ||
1260                             ((textureIndex != -1) && (textureIndex > 999)));
1261 
1262             LoadMandatoryAndOptionnalFields(QObj, ISO_TYPE, loadtext, QTextureObj,
1263                                             loadpigm, QPigmentObj);
1264 
1265             QJsonObject Jobjtmp = Jobj;
1266             // Some keys cleaning..
1267             Jobjtmp.remove("ParIso");
1268             Jobjtmp.remove("Param3D");Jobjtmp.remove("Param3D_C");
1269             Jobjtmp.remove("Param4D");Jobjtmp.remove("Param4D_C");
1270             document.setObject(Jobjtmp);
1271             MathmodRef->RootObjet.CurrentTreestruct.text = QString(document.toJson());
1272 
1273             // Update the current parametric struct
1274             MathmodRef->RootObjet.CurrentJsonObject = Jobjtmp;
1275             CurrentFormulaType = 2;
1276             /// process the new surface
1277             if (textureIndex == -1)
1278             {
1279                 if (MathmodRef->RootObjet.CurrentTreestruct.fxyz.count() > 0)
1280                     MathmodRef->ProcessNewIsoSurface();
1281             }
1282             else
1283             {
1284                 int result = MathmodRef->ParseIso();
1285                 if (result == -1)
1286                     return;
1287                 textureIndex < 1000
1288                 ? MathmodRef->CalculateTexturePoints(1)
1289                 : MathmodRef->CalculatePigmentPoints(1);
1290                 MathmodRef->LocalScene.componentsinfos.Interleave=true;
1291                 MathmodRef->update();
1292             }
1293         }
1294         else if (Jobj["Param3D"].isObject() || (MathmodRef->ParObjet->masterthread->param3d_C=Jobj["Param3D_C"].isObject()))
1295         {
1296             if(Jobj["Param3D"].isObject())
1297                 QObj = Jobj["Param3D"].toObject();
1298             else
1299                 QObj = Jobj["Param3D_C"].toObject();
1300             // Colors
1301             loadtext = MathmodRef->ParObjet->masterthread->rgbtnotnull =
1302                            (Jobj["Texture"].isObject() ||
1303                             ((textureIndex < 1000) && (textureIndex != -1)));
1304 
1305             // Pigment
1306             loadpigm = MathmodRef->ParObjet->masterthread->vrgbtnotnull =
1307                            (Jobj["Pigment"].isObject() ||
1308                             ((textureIndex != -1) && (textureIndex > 999)));
1309 
1310             LoadMandatoryAndOptionnalFields(QObj, PAR_TYPE, loadtext, QTextureObj,
1311                                             loadpigm, QPigmentObj);
1312 
1313             QJsonObject Jobjtmp = Jobj;
1314             // Some keys cleaning..
1315             if(Jobj["Param3D"].isObject())
1316                 Jobjtmp.remove("Param3D_C");
1317             else
1318                 Jobjtmp.remove("Param3D");
1319             Jobjtmp.remove("ParIso");
1320             Jobjtmp.remove("Iso3D");
1321             Jobjtmp.remove("Param4D");
1322 
1323             QJsonDocument document;
1324             document.setObject(Jobjtmp);
1325             MathmodRef->RootObjet.CurrentTreestruct.text = QString(document.toJson());
1326 
1327             MathmodRef->RootObjet.CurrentJsonObject = Jobjtmp;
1328             CurrentFormulaType = 1;
1329             /// process the new surface
1330             if (textureIndex == -1)
1331             {
1332                 MathmodRef->ParametricSurfaceProcess(1);
1333             }
1334             else
1335             {
1336                 int result = MathmodRef->ParsePar();
1337                 if (result == -1)
1338                     return;
1339                 textureIndex < 1000
1340                 ? MathmodRef->CalculateTexturePoints(0)
1341                 : MathmodRef->CalculatePigmentPoints(0);
1342                 MathmodRef->LocalScene.componentsinfos.Interleave=true;
1343                 MathmodRef->update();
1344             }
1345         }
1346 
1347         else if (Jobj["Param4D"].isObject() || (MathmodRef->ParObjet->masterthread->param4d_C=Jobj["Param4D_C"].isObject()))
1348         {
1349             if (Jobj["Param4D"].isObject())
1350                 QObj = Jobj["Param4D"].toObject();
1351             else
1352                 QObj = Jobj["Param4D_C"].toObject();
1353 
1354             // Colors
1355             loadtext = MathmodRef->ParObjet->masterthread->rgbtnotnull =
1356                            (Jobj["Texture"].isObject() ||
1357                             ((textureIndex < 1000) && (textureIndex != -1)));
1358 
1359             // Pigment
1360             loadpigm = MathmodRef->ParObjet->masterthread->vrgbtnotnull =
1361                            (Jobj["Pigment"].isObject() ||
1362                             ((textureIndex != -1) && (textureIndex > 1000)));
1363 
1364             LoadMandatoryAndOptionnalFields(QObj, PAR_4D_TYPE, loadtext, QTextureObj,
1365                                             loadpigm, QPigmentObj);
1366 
1367             QJsonObject Jobjtmp = Jobj;
1368             // Some keys cleaning..
1369             if (Jobj["Param4D"].isObject())
1370                 Jobjtmp.remove("Param4D_C");
1371             else
1372                 Jobjtmp.remove("Param4D");
1373             Jobjtmp.remove("Iso3D");
1374             Jobjtmp.remove("Param3D");
1375 
1376             QJsonDocument document;
1377             document.setObject(Jobjtmp);
1378             MathmodRef->RootObjet.CurrentTreestruct.text = QString(document.toJson());
1379 
1380             MathmodRef->RootObjet.CurrentJsonObject = Jobjtmp;
1381             CurrentFormulaType = 3;
1382 
1383             /// process the new surface
1384             if (textureIndex == -1)
1385             {
1386                 MathmodRef->ParametricSurfaceProcess(3);
1387             }
1388             else
1389             {
1390                 int result = MathmodRef->ParsePar();
1391                 if (result == -1)
1392                     return;
1393                 textureIndex < 1000
1394                 ? MathmodRef->CalculateTexturePoints(0)
1395                 : MathmodRef->CalculatePigmentPoints(0);
1396                 MathmodRef->LocalScene.componentsinfos.Interleave=true;
1397                 MathmodRef->update();
1398             }
1399         }
1400     }
1401 }
1402 
updateCurrentTreestruct()1403 void DrawingOptions::updateCurrentTreestruct()
1404 {
1405     // Initialize the current Object struct
1406     MathmodRef->RootObjet.CurrentTreestruct
1407     .fw = MathmodRef->RootObjet.CurrentTreestruct
1408     .fx = MathmodRef->RootObjet.CurrentTreestruct
1409     .fy = MathmodRef->RootObjet.CurrentTreestruct.fz =
1410     MathmodRef->RootObjet.CurrentTreestruct
1411     .Cnd = MathmodRef->RootObjet.CurrentTreestruct
1412     .RGBT = MathmodRef->RootObjet.CurrentTreestruct.Const =
1413     MathmodRef->RootObjet.CurrentTreestruct
1414     .Funct = MathmodRef->RootObjet.CurrentTreestruct.VRGBT =
1415     MathmodRef->RootObjet.CurrentTreestruct
1416     .Gradient = MathmodRef->RootObjet.CurrentTreestruct.fxyz =
1417     MathmodRef->RootObjet.CurrentTreestruct
1418     .umin = MathmodRef->RootObjet.CurrentTreestruct.umax =
1419     MathmodRef->RootObjet.CurrentTreestruct
1420     .vmin = MathmodRef->RootObjet.CurrentTreestruct.vmax =
1421     MathmodRef->RootObjet.CurrentTreestruct
1422     .xmin = MathmodRef->RootObjet.CurrentTreestruct
1423     .xmax = MathmodRef->RootObjet
1424     .CurrentTreestruct.ymin =
1425     MathmodRef->RootObjet.CurrentTreestruct.ymax =
1426     MathmodRef->RootObjet.CurrentTreestruct.zmin = MathmodRef->RootObjet
1427     .CurrentTreestruct.zmax = MathmodRef->RootObjet.CurrentTreestruct.tmin = MathmodRef->RootObjet
1428     .CurrentTreestruct.tmax = MathmodRef->RootObjet
1429     .CurrentTreestruct.name = MathmodRef->RootObjet
1430     .CurrentTreestruct.Component = MathmodRef->RootObjet
1431     .CurrentTreestruct.Grid = QStringList();
1432     MathmodRef->RootObjet.CurrentTreestruct.Noise =
1433         MathmodRef->RootObjet.CurrentTreestruct.text = "";
1434     MathmodRef->RootObjet.CurrentTreestruct.type = UNDEFINED_TYPE;
1435     // Initialize the current JSON Object
1436     MathmodRef->RootObjet.CurrentJsonObject = QJsonObject();
1437     // Initialize the Current Pariso Trees truct
1438     MathmodRef->RootObjet.CurrentParisoTreestruct.clear();
1439 }
1440 
1441 
MandatoryParFieldprocess(const QJsonObject & QObj,const MandatoryParField & idx,const ModelType & mod)1442 void DrawingOptions::MandatoryParFieldprocess(const QJsonObject &QObj,
1443         const MandatoryParField &idx,
1444         const ModelType &mod)
1445 {
1446     QString result, arg = MandatoryParFieldToQString(idx);
1447     QJsonArray lst;
1448 
1449     lst = QObj[arg].toArray();
1450     ObjArrayToString(lst, result);
1451     switch (idx)
1452     {
1453     case PAR_FX:
1454         MathmodRef->ParObjet->masterthread->expression_X =
1455             result.toStdString();
1456         MathmodRef->ParObjet->masterthread->componentsNumber =
1457             uint(lst.size());
1458         MathmodRef->RootObjet.CurrentTreestruct.fx =
1459             result.split(";", QString::SkipEmptyParts);
1460         break;
1461     case PAR_FY:
1462         MathmodRef->ParObjet->masterthread->expression_Y =
1463             result.toStdString();
1464         MathmodRef->ParObjet->masterthread->expression_YSize =
1465             lst.size();
1466         MathmodRef->RootObjet.CurrentTreestruct.fy =
1467             result.split(";", QString::SkipEmptyParts);
1468         break;
1469     case PAR_FZ:
1470         MathmodRef->ParObjet->masterthread->expression_Z =
1471             result.toStdString();
1472         MathmodRef->ParObjet->masterthread->expression_ZSize =
1473             lst.size();
1474         MathmodRef->RootObjet.CurrentTreestruct.fz =
1475             result.split(";", QString::SkipEmptyParts);
1476         break;
1477     case PAR_FW:
1478         if (mod == PAR_4D_TYPE)
1479         {
1480             MathmodRef->ParObjet->masterthread->expression_W =
1481                 result.toStdString();
1482             MathmodRef->RootObjet.CurrentTreestruct.fw =
1483                 result.split(";", QString::SkipEmptyParts);
1484         }
1485         break;
1486     case PAR_UMIN:
1487         MathmodRef->ParObjet->masterthread->inf_u =
1488             result.toStdString();
1489         MathmodRef->RootObjet.CurrentTreestruct.umin =
1490             result.split(";", QString::SkipEmptyParts);
1491         break;
1492     case PAR_UMAX:
1493         MathmodRef->ParObjet->masterthread->sup_u =
1494             result.toStdString();
1495         MathmodRef->RootObjet.CurrentTreestruct.umax =
1496             result.split(";", QString::SkipEmptyParts);
1497         break;
1498     case PAR_VMAX:
1499         MathmodRef->ParObjet->masterthread->sup_v =
1500             result.toStdString();
1501         MathmodRef->RootObjet.CurrentTreestruct.vmax =
1502             result.split(";", QString::SkipEmptyParts);
1503         break;
1504     case PAR_VMIN:
1505         MathmodRef->ParObjet->masterthread->inf_v =
1506             result.toStdString();
1507         MathmodRef->RootObjet.CurrentTreestruct.vmin =
1508             result.split(";", QString::SkipEmptyParts);
1509         break;
1510     case PAR_COMP:
1511         MathmodRef->RootObjet.CurrentTreestruct.Component =
1512             result.split(";", QString::SkipEmptyParts);
1513         break;
1514     case PAR_NAME:
1515         MathmodRef->RootObjet.CurrentTreestruct.name =
1516             result.split(";", QString::SkipEmptyParts);
1517         break;
1518     }
1519 }
1520 
1521 
MandatoryIsoFieldprocess(const QJsonObject & QObj,const MandatoryIsoField & idx)1522 void DrawingOptions::MandatoryIsoFieldprocess(const QJsonObject &QObj,
1523         const MandatoryIsoField &idx)
1524 {
1525     QString result, arg = MandatoryIsoFieldToQString(idx);
1526     QJsonArray lst;
1527 
1528     lst = QObj[arg].toArray();
1529     ObjArrayToString(lst, result);
1530     switch (idx)
1531     {
1532     case ISO_FXYZ:
1533         MathmodRef->IsoObjet->masterthread->ImplicitFunction =
1534             result.toStdString();
1535         MathmodRef->IsoObjet->masterthread->componentsNumber =
1536             uint(lst.size());
1537         MathmodRef->RootObjet.CurrentTreestruct.fxyz =
1538             result.split(";", QString::SkipEmptyParts);
1539         break;
1540     case ISO_XMAX:
1541         MathmodRef->IsoObjet->masterthread->XlimitSup =
1542             result.toStdString();
1543         MathmodRef->RootObjet.CurrentTreestruct.xmax =
1544             result.split(";", QString::SkipEmptyParts);
1545         break;
1546     case ISO_YMAX:
1547         MathmodRef->IsoObjet->masterthread->YlimitSup =
1548             result.toStdString();
1549         MathmodRef->RootObjet.CurrentTreestruct.ymax =
1550             result.split(";", QString::SkipEmptyParts);
1551         break;
1552     case ISO_ZMAX:
1553         MathmodRef->IsoObjet->masterthread->ZlimitSup =
1554             result.toStdString();
1555         MathmodRef->RootObjet.CurrentTreestruct.zmax =
1556             result.split(";", QString::SkipEmptyParts);
1557         break;
1558     case ISO_XMIN:
1559         MathmodRef->IsoObjet->masterthread->XlimitInf =
1560             result.toStdString();
1561         MathmodRef->RootObjet.CurrentTreestruct.xmin =
1562             result.split(";", QString::SkipEmptyParts);
1563         break;
1564     case ISO_YMIN:
1565         MathmodRef->IsoObjet->masterthread->YlimitInf =
1566             result.toStdString();
1567         MathmodRef->RootObjet.CurrentTreestruct.ymin =
1568             result.split(";", QString::SkipEmptyParts);
1569         break;
1570     case ISO_ZMIN:
1571         MathmodRef->IsoObjet->masterthread->ZlimitInf =
1572             result.toStdString();
1573         MathmodRef->RootObjet.CurrentTreestruct.zmin =
1574             result.split(";", QString::SkipEmptyParts);
1575         break;
1576     case ISO_COMP:
1577         MathmodRef->RootObjet.CurrentTreestruct.Component =
1578             result.split(";", QString::SkipEmptyParts);
1579         break;
1580     case ISO_NAME:
1581         MathmodRef->RootObjet.CurrentTreestruct.name =
1582             result.split(";", QString::SkipEmptyParts);
1583         break;
1584     }
1585 }
1586 
OptionalIsoScriptFieldprocess(const QJsonObject & QObj,OptionnalIsoScriptFIELD idx)1587 void DrawingOptions::OptionalIsoScriptFieldprocess(
1588     const QJsonObject &QObj, OptionnalIsoScriptFIELD idx)
1589 {
1590     QString result, arg = "";
1591     QJsonArray lst;
1592     bool argnotnull = false;
1593     switch (idx)
1594     {
1595     case ISO_VECT:
1596         arg = "Vect";
1597         argnotnull = MathmodRef->IsoObjet->masterthread->vectnotnull =
1598                          QObj[arg].isArray();
1599         break;
1600     case ISO_GRID:
1601         arg = "Grid";
1602         argnotnull = MathmodRef->IsoObjet->masterthread->gridnotnull =
1603                          QObj[arg].isArray();
1604         break;
1605     case ISO_CND:
1606         arg = "Cnd";
1607         argnotnull = MathmodRef->IsoObjet->masterthread->cndnotnull =
1608                          QObj[arg].isArray();
1609         break;
1610     case ISO_CONST:
1611         arg = "Const";
1612         argnotnull = MathmodRef->IsoObjet->masterthread->constnotnull =
1613                          QObj[arg].isArray();
1614         break;
1615     case ISO_FUNCT:
1616         arg = "Funct";
1617         argnotnull = MathmodRef->IsoObjet->masterthread->functnotnull =
1618                          QObj[arg].isArray();
1619         break;
1620     }
1621     if (argnotnull)
1622     {
1623         lst = QObj[arg].toArray();
1624         ObjArrayToString(lst, result);
1625     }
1626     switch (idx)
1627     {
1628     case ISO_VECT:
1629         if (argnotnull)
1630         {
1631             MathmodRef->IsoObjet->masterthread->vect.clear();
1632             for (int j = 0; j < lst.size(); j++)
1633                 MathmodRef->IsoObjet->masterthread->vect.push_back(
1634                     (lst[j].toString()).toUInt());
1635             MathmodRef->IsoObjet->masterthread->Vect =
1636                 result.toStdString();
1637             MathmodRef->RootObjet.CurrentTreestruct.Vect =
1638                 result.split(";", QString::SkipEmptyParts);
1639         }
1640         else
1641         {
1642             MathmodRef->IsoObjet->masterthread->Vect = "";
1643         }
1644         break;
1645     case ISO_GRID:
1646         if (argnotnull)
1647         {
1648             MathmodRef->IsoObjet->masterthread->grid.clear();
1649             for (int j = 0; j < lst.size(); j++)
1650                 MathmodRef->IsoObjet->masterthread->grid.push_back(
1651                     (lst[j].toString()).toUInt());
1652             MathmodRef->IsoObjet->masterthread->Grid =
1653                 result.toStdString();
1654             MathmodRef->RootObjet.CurrentTreestruct.Grid =
1655                 result.split(";", QString::SkipEmptyParts);
1656         }
1657         else
1658         {
1659             MathmodRef->IsoObjet->masterthread->Grid = "";
1660         }
1661         break;
1662     case ISO_CND:
1663         if (argnotnull)
1664         {
1665             MathmodRef->IsoObjet->masterthread->Condition = result.toStdString();
1666             for(int i=0; i<lst.size(); i++)
1667                 MathmodRef->LocalScene.componentsinfos.ParisoCondition.push_back((lst[i].toString()).replace(" ", "")=="");
1668             MathmodRef->RootObjet.CurrentTreestruct.Cnd = result.split(";");
1669         }
1670         else
1671         {
1672             for(int i=0; i<lst.size(); i++)
1673                 MathmodRef->LocalScene.componentsinfos.ParisoCondition.push_back(false);
1674             MathmodRef->IsoObjet->masterthread->Condition = "";
1675         }
1676         break;
1677     case ISO_FUNCT:
1678         if (argnotnull)
1679         {
1680             MathmodRef->IsoObjet->masterthread->Funct = result.toStdString();
1681             MathmodRef->IsoObjet->masterthread->FunctSize = uint(lst.size());
1682             MathmodRef->RootObjet.CurrentTreestruct.Funct = result.split(";", QString::SkipEmptyParts);
1683         }
1684         else
1685         {
1686             MathmodRef->IsoObjet->masterthread->Funct = "";
1687             MathmodRef->IsoObjet->masterthread->FunctSize = 0;
1688         }
1689         break;
1690     case ISO_CONST:
1691         if (argnotnull)
1692         {
1693             MathmodRef->IsoObjet->masterthread->Const =
1694                 result.toStdString();
1695             MathmodRef->IsoObjet->masterthread->ConstSize =
1696                 uint(lst.size());
1697             MathmodRef->RootObjet.CurrentTreestruct.Const =
1698                 result.split(";", QString::SkipEmptyParts);
1699         }
1700         else
1701         {
1702             MathmodRef->IsoObjet->masterthread->Const = "";
1703             MathmodRef->IsoObjet->masterthread->ConstSize = 0;
1704         }
1705         break;
1706     }
1707 }
1708 
OptionalParScriptFieldprocess(const QJsonObject & QObj,OptionnalParScriptFIELD idx)1709 void DrawingOptions::OptionalParScriptFieldprocess(
1710     const QJsonObject &QObj, OptionnalParScriptFIELD idx)
1711 {
1712     QString result, arg = "";
1713     QJsonArray lst;
1714     bool argnotnull = false;
1715     switch (idx)
1716     {
1717     case PAR_VECT:
1718         arg = "Vect";
1719         argnotnull = MathmodRef->ParObjet->masterthread->vectnotnull =
1720                          QObj[arg].isArray();
1721         break;
1722     case PAR_GRID:
1723         arg = "Grid";
1724         argnotnull = MathmodRef->ParObjet->masterthread->gridnotnull =
1725                          QObj[arg].isArray();
1726         break;
1727     case PAR_CONST:
1728         arg = "Const";
1729         argnotnull = MathmodRef->ParObjet->masterthread->constnotnull =
1730                          QObj[arg].isArray();
1731         break;
1732     case PAR_FUNCT:
1733         arg = "Funct";
1734         argnotnull = MathmodRef->ParObjet->masterthread->functnotnull =
1735                          QObj[arg].isArray();
1736         break;
1737     case PAR_CND:
1738         arg = "Cnd";
1739         argnotnull = MathmodRef->ParObjet->masterthread->cndnotnull =
1740                          QObj[arg].isArray();
1741         break;
1742     }
1743     if (argnotnull)
1744     {
1745         lst = QObj[arg].toArray();
1746         ObjArrayToString(lst, result);
1747     }
1748     switch (idx)
1749     {
1750     case PAR_VECT:
1751         if (argnotnull)
1752         {
1753             MathmodRef->ParObjet->masterthread->vect.clear();
1754             for (int j = 0; j < lst.size(); j++)
1755                 MathmodRef->ParObjet->masterthread->vect.push_back(
1756                     (lst[j].toString()).toUInt());
1757             MathmodRef->ParObjet->masterthread->Vect =
1758                 result.toStdString();
1759             MathmodRef->RootObjet.CurrentTreestruct.Vect =
1760                 result.split(";", QString::SkipEmptyParts);
1761         }
1762         else
1763         {
1764             MathmodRef->ParObjet->masterthread->Vect = "";
1765         }
1766         break;
1767     case PAR_GRID:
1768         if (argnotnull)
1769         {
1770             MathmodRef->ParObjet->masterthread->grid.clear();
1771             for (int j = 0; j < lst.size(); j++)
1772                 MathmodRef->ParObjet->masterthread->grid.push_back(
1773                     (lst[j].toString()).toUInt());
1774             MathmodRef->ParObjet->masterthread->Grid =
1775                 result.toStdString();
1776             MathmodRef->RootObjet.CurrentTreestruct.Grid =
1777                 result.split(";", QString::SkipEmptyParts);
1778         }
1779         else
1780         {
1781             MathmodRef->ParObjet->masterthread->Grid = "";
1782         }
1783         break;
1784     case PAR_CND:
1785         if (argnotnull)
1786         {
1787             MathmodRef->ParObjet->masterthread->expression_CND = result.toStdString();
1788             for(int i=0; i<lst.size(); i++)
1789                 MathmodRef->LocalScene.componentsinfos.ParisoCondition.push_back((lst[i].toString()).replace(" ", "") == "");
1790             MathmodRef->RootObjet.CurrentTreestruct.Cnd = result.split(";");
1791         }
1792         else
1793         {
1794             for(int i=0; i<lst.size(); i++)
1795                 MathmodRef->LocalScene.componentsinfos.ParisoCondition.push_back(false);
1796             MathmodRef->ParObjet->masterthread->expression_CND = "";
1797         }
1798         break;
1799     case PAR_CONST:
1800         if (argnotnull)
1801         {
1802             MathmodRef->ParObjet->masterthread->Const = result.toStdString();
1803             MathmodRef->ParObjet->masterthread->ConstSize = uint(lst.size());
1804             MathmodRef->RootObjet.CurrentTreestruct.Const = result.split(";", QString::SkipEmptyParts);
1805         }
1806         else
1807         {
1808             MathmodRef->ParObjet->masterthread->Const = "";
1809             MathmodRef->ParObjet->masterthread->ConstSize = 0;
1810         }
1811         break;
1812     case PAR_FUNCT:
1813         if (argnotnull)
1814         {
1815             MathmodRef->ParObjet->masterthread->Funct =
1816                 result.toStdString();
1817             MathmodRef->ParObjet->masterthread->FunctSize =
1818                 uint(lst.size());
1819             MathmodRef->RootObjet.CurrentTreestruct.Funct =
1820                 result.split(";", QString::SkipEmptyParts);
1821         }
1822         else
1823         {
1824             MathmodRef->ParObjet->masterthread->Funct = "";
1825             MathmodRef->ParObjet->masterthread->FunctSize = 0;
1826         }
1827         break;
1828     }
1829 }
1830 
BuildAllVect()1831 void DrawingOptions::BuildAllVect()
1832 {
1833     const OptionnalIsoScriptFIELD optiso[] = {ISO_GRID, ISO_VECT, ISO_CND, ISO_CONST, ISO_FUNCT};
1834     OptIsoFields = std::vector<OptionnalIsoScriptFIELD>(
1835                        optiso, optiso + sizeof(optiso) / sizeof(OptionnalIsoScriptFIELD));
1836 
1837     const OptionnalParScriptFIELD optpar[] = {PAR_GRID, PAR_VECT,PAR_CND, PAR_CONST,
1838                                               PAR_FUNCT
1839                                              };
1840     OptParFields = std::vector<OptionnalParScriptFIELD>(
1841                        optpar, optpar + sizeof(optpar) / sizeof(OptionnalParScriptFIELD));
1842     const MandatoryIsoField maniso[] = {ISO_FXYZ, ISO_XMIN, ISO_XMAX,
1843                                         ISO_YMIN, ISO_YMAX, ISO_ZMIN,
1844                                         ISO_ZMAX, ISO_COMP, ISO_NAME
1845                                        };
1846     MandIsoFields = std::vector<MandatoryIsoField>(
1847                         maniso, maniso + sizeof(maniso) / sizeof(MandatoryIsoField));
1848     const MandatoryParField manpar[] = {PAR_FX,   PAR_FY,   PAR_FZ,   PAR_FW,
1849                                         PAR_UMIN, PAR_UMAX, PAR_VMIN, PAR_VMAX,
1850                                         PAR_COMP, PAR_NAME
1851                                        };
1852     MandParFields = std::vector<MandatoryParField>(
1853                         manpar, manpar + sizeof(manpar) / sizeof(MandatoryParField));
1854 }
1855 
JSON_choice_activated(const QString & arg1)1856 int DrawingOptions::JSON_choice_activated(const QString &arg1)
1857 {
1858     QString result;
1859     QJsonArray array = JSONMathModels["MathModels"].toArray();
1860     QJsonArray lst;
1861     QJsonObject QObj, QObj1;
1862     QJsonObject QTextureObj, QPigmentObj;
1863     bool loadtext, loadpigm;
1864     QMessageBox msgBox;
1865     updateCurrentTreestruct();
1866     MathmodRef->LocalScene.componentsinfos.ParisoCondition.clear();
1867     MathmodRef->LocalScene.componentsinfos.hsv.clear();
1868     for (int i = 0; i < array.size(); i++)
1869     {
1870         if ((QObj1 = array[i].toObject())["ParIso"].isArray() &&
1871                 (QObj1)["Name"].toString() == arg1)
1872         {
1873             if (!VerifiedJsonModel((array[i].toObject())))
1874                 return (0);
1875             ShowSliders(array[i].toObject());
1876             QJsonArray listeObj = QObj1["ParIso"].toArray();
1877             QJsonArray listeIsoObj;
1878             QJsonArray listeParObj;
1879             QJsonObject QPar, QIso;
1880             for (int i = 0; i < listeObj.size(); i++)
1881                 if ((listeObj[i].toObject())["Iso3D"].isObject())
1882                     listeIsoObj.append(listeObj[i].toObject());
1883                 else
1884                     listeParObj.append(listeObj[i].toObject());
1885             // Right now, we only support pariso object with 1 Iso3D and 1 Param3D objects.
1886             if (listeParObj.size() > 0)
1887                 QPar = listeParObj[0].toObject();
1888             if (listeIsoObj.size() > 0)
1889                 QIso = listeIsoObj[0].toObject();
1890             loadtext = loadpigm = false;
1891             if (QPar["Texture"].isObject())
1892                 QTextureObj = QPar["Texture"].toObject();
1893             if (QPar["Pigment"].isObject())
1894                 QPigmentObj = QPar["Pigment"].toObject();
1895             // Colors
1896             loadtext = MathmodRef->ParObjet->masterthread->rgbtnotnull =
1897                            (QPar["Texture"].isObject());
1898             // Pigment
1899             loadpigm = MathmodRef->ParObjet->masterthread->vrgbtnotnull =
1900                            (QPar["Pigment"].isObject());
1901             LoadMandatoryAndOptionnalFields(QPar["Param3D"].toObject(), PAR_TYPE,
1902                                             loadtext, QTextureObj, loadpigm,
1903                                             QPigmentObj);
1904             // Save this Current Parametric Tree struct
1905             MathmodRef->RootObjet.CurrentParisoTreestruct.push_back(
1906                 MathmodRef->RootObjet.CurrentTreestruct);
1907             loadtext = loadpigm = false;
1908             if (QIso["Texture"].isObject())
1909                 QTextureObj = QIso["Texture"].toObject();
1910             if (QIso["Pigment"].isObject())
1911                 QPigmentObj = QIso["Pigment"].toObject();
1912             // Colors
1913             loadtext = MathmodRef->IsoObjet->masterthread->rgbtnotnull =
1914                            (QIso["Texture"].isObject());
1915             // Pigment
1916             loadpigm = MathmodRef->IsoObjet->masterthread->vrgbtnotnull =
1917                            (QIso["Pigment"].isObject());
1918             LoadMandatoryAndOptionnalFields(QIso["Iso3D"].toObject(), ISO_TYPE,
1919                                             loadtext, QTextureObj, loadpigm,
1920                                             QPigmentObj);
1921             // Save this Current Isosurface Tree struct
1922             MathmodRef->RootObjet.CurrentParisoTreestruct.push_back(
1923                 MathmodRef->RootObjet.CurrentTreestruct);
1924             QJsonDocument document;
1925             document.setObject(QObj1);
1926             MathmodRef->RootObjet.CurrentTreestruct.text = QString(document.toJson());
1927             // Update the current pariso struct
1928             MathmodRef->RootObjet.CurrentJsonObject = QObj1;
1929             CurrentFormulaType = 2;
1930             /// process the new surface
1931             MathmodRef->LocalScene.componentsinfos.ParisoCurrentComponentIndex = 0;
1932             MathmodRef->LocalScene.componentsinfos.ParisoNbComponents =2;
1933             MathmodRef->LocalScene.componentsinfos.pariso = true;
1934             MathmodRef->ParisoObjectProcess();
1935             ui.parisogroupbox->show();
1936             return (1);
1937         }
1938         else
1939         {
1940             MathmodRef->LocalScene.componentsinfos.pariso = false;
1941             MathmodRef->LocalScene.componentsinfos.ParisoNbComponents = 1;
1942             MathmodRef->LocalScene.componentsinfos.ParisoCurrentComponentIndex = 0;
1943             ui.parisogroupbox->hide();
1944             if ((QObj1 = array[i].toObject())["Iso3D"].isObject() &&
1945                     (QObj = (array[i].toObject())["Iso3D"].toObject())["Name"]
1946                     .toArray()[0]
1947                     .toString() == arg1)
1948             {
1949                 if (!VerifiedJsonModel((array[i].toObject())))
1950                     return (0);
1951                 ShowSliders(array[i].toObject());
1952                 // Colors
1953                 if ((loadtext = MathmodRef->IsoObjet->masterthread->rgbtnotnull = QObj1["Texture"].isObject()))
1954                     QTextureObj = QObj1["Texture"].toObject();
1955                 // Pigment
1956                 if ((loadpigm = MathmodRef->IsoObjet->masterthread->vrgbtnotnull = QObj1["Pigment"].isObject()))
1957                     QPigmentObj = QObj1["Pigment"].toObject();
1958                 LoadMandatoryAndOptionnalFields(QObj, ISO_TYPE, loadtext, QTextureObj,
1959                                                 loadpigm, QPigmentObj);
1960                 QJsonDocument document;
1961                 document.setObject(array[i].toObject());
1962                 MathmodRef->RootObjet.CurrentTreestruct.text =
1963                     QString(document.toJson());
1964                 // Update the current parametric struct
1965                 // MathmodRef->RootObjet.CurrentIsoStruct =
1966                 // MathmodRef->RootObjet.IsoTable[indextable];
1967                 MathmodRef->RootObjet.CurrentJsonObject = array[i].toObject();
1968                 CurrentFormulaType = 2;
1969                 /// process the new surface
1970                 MathmodRef->ProcessNewIsoSurface();
1971                 return (2);
1972             }
1973             else if (((array[i].toObject())["Param3D"].isObject() &&
1974                      (QObj = (array[i].toObject())["Param3D"].toObject())["Name"]
1975                      .toArray()[0]
1976                      .toString() == arg1)  ||
1977 
1978                      ( (MathmodRef->ParObjet->masterthread->param3d_C =  (array[i].toObject())["Param3D_C"].isObject() ) &&
1979                      (QObj = (array[i].toObject())["Param3D_C"].toObject())["Name"]
1980                      .toArray()[0]
1981                      .toString() == arg1))
1982             {
1983                 if (!VerifiedJsonModel((array[i].toObject())))
1984                     return (0);
1985                 ShowSliders(array[i].toObject());
1986                 // Colors
1987                 if ((loadtext =
1988                             MathmodRef->ParObjet->masterthread->rgbtnotnull =
1989                                 QObj1["Texture"].isObject()))
1990                     QTextureObj = QObj1["Texture"].toObject();
1991                 // Pigment
1992                 if ((loadpigm =
1993                             MathmodRef->ParObjet->masterthread->vrgbtnotnull =
1994                                 QObj1["Pigment"].isObject()))
1995                     QPigmentObj = QObj1["Pigment"].toObject();
1996                 LoadMandatoryAndOptionnalFields(QObj, PAR_TYPE, loadtext, QTextureObj,
1997                                                 loadpigm, QPigmentObj);
1998                 QJsonDocument document;
1999                 document.setObject(array[i].toObject());
2000                 MathmodRef->RootObjet.CurrentTreestruct.text =
2001                     QString(document.toJson());
2002 
2003                 MathmodRef->RootObjet.CurrentJsonObject = array[i].toObject();
2004                 CurrentFormulaType = 1;
2005                 /// process the new surface
2006                 MathmodRef->ParametricSurfaceProcess(1);
2007                 return (1);
2008             }
2009             else if (((array[i].toObject())["Param4D"].isObject() &&
2010                      (QObj = (array[i].toObject())["Param4D"].toObject())["Name"]
2011                      .toArray()[0]
2012                      .toString() == arg1)  ||
2013 
2014                      ((MathmodRef->ParObjet->masterthread->param4d_C = (array[i].toObject())["Param4D_C"].isObject()) &&
2015                                           (QObj = (array[i].toObject())["Param4D_C"].toObject())["Name"]
2016                                           .toArray()[0]
2017                                           .toString() == arg1))
2018             {
2019                 if (!VerifiedJsonModel((array[i].toObject())))
2020                     return (0);
2021                 ShowSliders(array[i].toObject());
2022                 // Colors
2023                 if ((loadtext =
2024                             MathmodRef->ParObjet->masterthread->rgbtnotnull =
2025                                 QObj1["Texture"].isObject()))
2026                     QTextureObj = QObj1["Texture"].toObject();
2027                 // Pigment
2028                 if ((loadpigm =
2029                             MathmodRef->ParObjet->masterthread->vrgbtnotnull =
2030                                 QObj1["Pigment"].isObject()))
2031                     QPigmentObj = QObj1["Pigment"].toObject();
2032                 LoadMandatoryAndOptionnalFields(QObj, PAR_4D_TYPE, loadtext,
2033                                                 QTextureObj, loadpigm, QPigmentObj);
2034                 QJsonDocument document;
2035                 document.setObject(array[i].toObject());
2036                 MathmodRef->RootObjet.CurrentTreestruct.text =
2037                     QString(document.toJson());
2038                 MathmodRef->RootObjet.CurrentJsonObject = array[i].toObject();
2039                 CurrentFormulaType = 3;
2040                 /// process the new surface
2041                 MathmodRef->ParametricSurfaceProcess(3);
2042                 return (3);
2043             }
2044         }
2045     }
2046     return (0);
2047 }
2048 
LoadMandatoryAndOptionnalFields(const QJsonObject & qobj,const ModelType & mod,bool loadtext,const QJsonObject & QTextureObj,bool loadpigm,const QJsonObject & QPigmentObj)2049 void DrawingOptions::LoadMandatoryAndOptionnalFields(
2050     const QJsonObject &qobj, const ModelType &mod, bool loadtext,
2051     const QJsonObject &QTextureObj, bool loadpigm,
2052     const QJsonObject &QPigmentObj)
2053 {
2054     // We First deactivate the pariso flag
2055     MathmodRef->LocalScene.componentsinfos.pariso = false;
2056     MathmodRef->RootObjet.CurrentTreestruct.type = mod;
2057     switch (mod)
2058     {
2059     case PAR_TYPE:
2060         for (std::vector<MandatoryParField>::const_iterator it =
2061                     MandParFields.begin();
2062                 it != MandParFields.end(); ++it)
2063         {
2064             MandatoryParField Opt = *it;
2065             MandatoryParFieldprocess(qobj, Opt);
2066         }
2067 
2068         for (std::vector<OptionnalParScriptFIELD>::const_iterator it =
2069                     OptParFields.begin();
2070                 it != OptParFields.end(); ++it)
2071         {
2072             OptionnalParScriptFIELD Opt = *it;
2073             OptionalParScriptFieldprocess(qobj, Opt);
2074         }
2075         break;
2076     case PAR_4D_TYPE:
2077         for (std::vector<MandatoryParField>::const_iterator it =
2078                     MandParFields.begin();
2079                 it != MandParFields.end(); ++it)
2080         {
2081             MandatoryParField Opt = *it;
2082             MandatoryParFieldprocess(qobj, Opt, PAR_4D_TYPE);
2083         }
2084 
2085         for (std::vector<OptionnalParScriptFIELD>::const_iterator it =
2086                     OptParFields.begin();
2087                 it != OptParFields.end(); ++it)
2088         {
2089             OptionnalParScriptFIELD Opt = *it;
2090             OptionalParScriptFieldprocess(qobj, Opt);
2091         }
2092         break;
2093     case ISO_TYPE:
2094         for (std::vector<MandatoryIsoField>::const_iterator it =
2095                     MandIsoFields.begin();
2096                 it != MandIsoFields.end(); ++it)
2097         {
2098             MandatoryIsoField Opt = *it;
2099             MandatoryIsoFieldprocess(qobj, Opt);
2100         }
2101 
2102         for (std::vector<OptionnalIsoScriptFIELD>::const_iterator it =
2103                     OptIsoFields.begin();
2104                 it != OptIsoFields.end(); ++it)
2105         {
2106             OptionnalIsoScriptFIELD Opt = *it;
2107             OptionalIsoScriptFieldprocess(qobj, Opt);
2108         }
2109         break;
2110     case PARISO_TYPE:
2111         break;
2112     case UNDEFINED_TYPE:
2113         break;
2114     }
2115     // Colors
2116     if (loadtext)
2117     {
2118         LoadTexture(QTextureObj, mod);
2119     }
2120     // Pigment
2121     if (loadpigm)
2122     {
2123         LoadPigment(QPigmentObj, mod);
2124     }
2125 }
2126 
on_choice_activated(const QString & arg)2127 int DrawingOptions::on_choice_activated(const QString &arg)
2128 {
2129     // Draw here
2130     int Result = JSON_choice_activated(arg);
2131     if (Result != 0)
2132     {
2133         UpdateScriptEditorAndTreeObject();
2134     }
2135 
2136     return Result;
2137 }
2138 
Run_JsonObject_activeted()2139 void DrawingOptions::Run_JsonObject_activeted()
2140 {
2141     QJsonParseError err;
2142     QString script =
2143         ui.ParamEdit->toPlainText()
2144         .trimmed()
2145         .replace("\n", "")
2146         .replace("\t", "")
2147         .replace("DOTSYMBOL", Parameters->dotsymbol.toStdString().c_str());
2148     QJsonDocument doc = QJsonDocument::fromJson(script.toUtf8(), &err);
2149     if (err.error)
2150     {
2151         ShowErrorMessage(err, script);
2152         return;
2153     }
2154 
2155     // Draw here
2156     DrawJsonModel(doc.object());
2157 }
2158 
slot_comboBox18_3_activated(const QString & arg1)2159 void DrawingOptions::slot_comboBox18_3_activated(const QString &arg1)
2160 {
2161     if (arg1 == "Triangles")
2162     {
2163         MathmodRef->slot_triangles_clicked();
2164         return;
2165     }
2166     if (arg1 == "Normales")
2167     {
2168         MathmodRef->draw_norm_clicked();
2169         return;
2170     }
2171     if (arg1 == "Infos")
2172     {
2173         MathmodRef->iso_infos();
2174         return;
2175     }
2176     if (arg1 == "Fill")
2177     {
2178         MathmodRef->fill();
2179         return;
2180     }
2181     if (arg1 == "Mesh")
2182     {
2183         MathmodRef->Mesh();
2184         return;
2185     }
2186 }
2187 
slot_checkBox_clicked()2188 void DrawingOptions::slot_checkBox_clicked()
2189 {
2190     MathmodRef->slot_uv_clicked();
2191 }
2192 
LoadNewFileModels(bool upd)2193 void DrawingOptions::LoadNewFileModels(bool upd)
2194 {
2195     QString mathmodcollection;
2196 
2197     mathmodcollection = QFileDialog::getOpenFileName(
2198                             nullptr, tr("Load Json Script"), "", tr("Json (*.js)"));
2199     if (upd)
2200     {
2201         ui.ObjectClasse->clear();
2202         for (int i = 0; i < MathmodRef->RootObjet.MyJsonObjectSelection.count();
2203                 i++)
2204             MathmodRef->RootObjet.MyJsonObjectSelection.removeAt(i);
2205         MathmodRef->RootObjet.NbIsoStruct = MathmodRef->RootObjet.NbParamStruct = 0;
2206         MathmodRef->collection.JPar.clear();
2207         MathmodRef->collection.JIso.clear();
2208     }
2209     MathmodRef->RootObjet.ReadJsonFile(mathmodcollection, JSONMathModels);
2210     QJsonArray array = JSONMathModels["MathModels"].toArray();
2211     QStringList lst;
2212     QString a;
2213     QJsonObject jsobj;
2214 
2215     for (int i = 0; i < array.size(); i++)
2216     {
2217         if ((array[i].toObject())["Iso3D"].isObject())
2218         {
2219             jiso newjiso;
2220             jsobj = (array[i].toObject())["Iso3D"].toObject();
2221             newjiso.read(jsobj);
2222             MathmodRef->collection.JIso.append(newjiso);
2223             a = (jsobj)["Name"].toArray()[0].toString();
2224             lst.append(a);
2225         }
2226         else if ((array[i].toObject())["Param3D"].isObject())
2227         {
2228             jpar newjpar;
2229             jsobj = ((array[i].toObject())["Param3D"].toObject());
2230             newjpar.read(jsobj);
2231             MathmodRef->collection.JPar.append(newjpar);
2232             a = (jsobj)["Name"].toArray()[0].toString();
2233             lst.append(a);
2234         }
2235         else if ((array[i].toObject())["Param4D"].isObject())
2236         {
2237             jpar newjpar;
2238             jsobj = ((array[i].toObject())["Param4D"].toObject());
2239             newjpar.read(jsobj);
2240             MathmodRef->collection.JPar.append(newjpar);
2241             a = (jsobj)["Name"].toArray()[0].toString();
2242             lst.append(a);
2243         }
2244         else if ((array[i].toObject())["Param3D_C"].isObject())
2245         {
2246             jpar newjpar;
2247             jsobj = ((array[i].toObject())["Param3D_C"].toObject());
2248             newjpar.read(jsobj);
2249             MathmodRef->collection.JPar.append(newjpar);
2250             a = (jsobj)["Name"].toArray()[0].toString();
2251             lst.append(a);
2252         }
2253         else if ((array[i].toObject())["Param4D_C"].isObject())
2254         {
2255             jpar newjpar;
2256             jsobj = ((array[i].toObject())["Param4D_C"].toObject());
2257             newjpar.read(jsobj);
2258             MathmodRef->collection.JPar.append(newjpar);
2259             a = (jsobj)["Name"].toArray()[0].toString();
2260             lst.append(a);
2261         }
2262     }
2263     lst.insert(0, "Examples (" + QString::number(lst.count()) + ")");
2264     // Load the script containing isosurface and parametric formulas:
2265     ui.choice->clear();
2266     ui.choice->insertItems(0, lst);
2267     AddListModels(upd);
2268 }
2269 
LoadK3DSurfScript(QString filename,int type)2270 void DrawingOptions::LoadK3DSurfScript(QString filename, int type)
2271 {
2272     int current = 0, currentfunction = 0, separator = 0;
2273     QString name, line, IsoFct, Xfct, Yfct, Zfct, xlimit, ylimit, zlimit, ulimit,
2274             vlimit, xmin, xmax, ymin, ymax, zmin, zmax, umin, umax, vmin, vmax,
2275             condition, Au, Bu, Cu, Duv, Euv, Fuv, comments, fctcomts;
2276     int EquationsNumber = 0;
2277     QString JsonString = "";
2278     int FctType = -1;
2279     filename = QFileDialog::getOpenFileName(
2280                    nullptr, QObject::tr("Open K3DSurf script File"), "",
2281                    QObject::tr("K3DS (*.k3ds)"));
2282     QFile file(filename);
2283     if (type == 1)
2284     {
2285         if (file.open(QIODevice::ReadOnly | QIODevice::Text))
2286         {
2287             QTextStream stream(&file);
2288             while (!stream.atEnd())
2289             {
2290                 line = (stream.readLine()).trimmed(); // line of text excluding '\n'
2291                 if (line.contains("F():"))
2292                 {
2293                     currentfunction = 1;
2294                     FctType = 0;
2295                 }
2296                 else if (line.contains("[x]:"))
2297                     currentfunction = 2;
2298                 else if (line.contains("[y]:"))
2299                     currentfunction = 3;
2300                 else if (line.contains("[z]:"))
2301                     currentfunction = 4;
2302 
2303                 else if (line.contains("X():"))
2304                 {
2305                     currentfunction = 21;
2306                     FctType = 1;
2307                 }
2308                 else if (line.contains("Y():"))
2309                     currentfunction = 22;
2310                 else if (line.contains("Z():"))
2311                     currentfunction = 23;
2312                 else if (line.contains("[u]:"))
2313                     currentfunction = 24;
2314                 else if (line.contains("[v]:"))
2315                     currentfunction = 25;
2316 
2317                 else if (line.contains("Cnd:"))
2318                     currentfunction = 5;
2319                 else if (line.contains("A[u]:"))
2320                     currentfunction = 6;
2321                 else if (line.contains("B[u]:"))
2322                     currentfunction = 7;
2323                 else if (line.contains("C[u]:"))
2324                     currentfunction = 8;
2325                 else if (line.contains("D[u,v]:"))
2326                     currentfunction = 9;
2327                 else if (line.contains("E[u,v]:"))
2328                     currentfunction = 10;
2329                 else if (line.contains("F[u,v]:"))
2330                     currentfunction = 11;
2331                 else if (line.contains("#"))
2332                     currentfunction = 12;
2333                 else if (line.contains("/*"))
2334                     currentfunction = 13;
2335                 else if (line.contains("*/"))
2336                     currentfunction = 14;
2337                 else if (line.contains("Name:"))
2338                     currentfunction = 15;
2339                 else if (line.contains(";"))
2340                     currentfunction = 16;
2341                 else
2342                     currentfunction = 18;
2343                 switch (currentfunction)
2344                 {
2345                 case 1:
2346                     IsoFct += line.remove(0, 4);
2347                     current = 1;
2348                     break;
2349 
2350                 case 21:
2351                     Xfct += line.replace("X():", "");
2352                     current = 21;
2353                     break;
2354                 case 22:
2355                     Yfct += line.replace("Y():", "");
2356                     current = 22;
2357                     break;
2358                 case 23:
2359                     Zfct += line.replace("Z():", "");
2360                     current = 23;
2361                     break;
2362                 case 24:
2363                     ulimit += line.replace("[u]:", "");
2364                     current = 24;
2365                     break;
2366                 case 25:
2367                     vlimit += line.replace("[v]:", "");
2368                     current = 25;
2369                     break;
2370 
2371                 case 2:
2372                     xlimit = line.remove(0, 4);
2373                     current = 2;
2374                     break;
2375                 case 3:
2376                     ylimit = line.remove(0, 4);
2377                     current = 3;
2378                     break;
2379                 case 4:
2380                     zlimit = line.remove(0, 4);
2381                     current = 4;
2382                     break;
2383                 case 5:
2384                     condition = line.remove(0, 4);
2385                     current = 5;
2386                     break;
2387                 case 6:
2388                     Au = line.remove(0, 5);
2389                     current = 6;
2390                     break;
2391                 case 7:
2392                     Bu = line.remove(0, 5);
2393                     current = 7;
2394                     break;
2395                 case 8:
2396                     Cu = line.remove(0, 5);
2397                     current = 8;
2398                     break;
2399                 case 9:
2400                     Duv = line.remove(0, 7);
2401                     current = 9;
2402                     break;
2403                 case 10:
2404                     Euv = line.remove(0, 7);
2405                     current = 10;
2406                     break;
2407                 case 11:
2408                     Fuv = line.remove(0, 7);
2409                     current = 11;
2410                     break;
2411                 case 12:
2412                     comments += line.replace("#", "");
2413                     current = 12;
2414                     break;
2415                 case 13:
2416                     comments += line.replace("/*", "").replace("*/", "");
2417                     current = 13;
2418                     break;
2419                 case 14:
2420                     comments += line.replace("*/", "");
2421                     current = 14;
2422                     break;
2423                 case 15:
2424                     name = line.remove(0, 5);
2425                     current = 15;
2426                     break;
2427                 case 16:
2428                     // Save the equation:
2429                     name = name.trimmed();
2430                     if (FctType == 0)
2431                     {
2432                         EquationsNumber++;
2433                         if (name == "")
2434                             name = "_" + QString::number(EquationsNumber);
2435                         xlimit = xlimit.trimmed();
2436                         separator = xlimit.indexOf(",");
2437                         xmin = xlimit.left(separator);
2438                         xmax = xlimit.remove(xmin + ",");
2439                         ylimit = ylimit.trimmed();
2440                         separator = ylimit.indexOf(",");
2441                         ymin = ylimit.left(separator);
2442                         ymax = ylimit.remove(ymin + ",");
2443                         zlimit = zlimit.trimmed();
2444                         separator = zlimit.indexOf(",");
2445                         zmin = zlimit.left(separator);
2446                         zmax = zlimit.remove(zmin + ",");
2447                         if (JsonString != "")
2448                             JsonString += ",";
2449                         JsonString += "{\"Iso3D\": {  \
2450                          \"Description \": [ \"" +
2451                                       comments + "\"], ";
2452                         JsonString += "\"Name\": [\"" + name + "\"], ";
2453                         JsonString += "\"Component\": [\"" + name + "\"], ";
2454                         JsonString += "\"Fxyz\": [\"" + IsoFct.trimmed() + "\"], ";
2455                         JsonString += "\"Cnd\": [\"" + condition + "\"], ";
2456                         JsonString += "\"Xmin\": [\"" + xmin + "\"], ";
2457                         JsonString += "\"Xmax\": [\"" + xmax + "\"], ";
2458                         JsonString += "\"Ymin\": [\"" + ymin + "\"], ";
2459                         JsonString += "\"Ymax\": [\"" + ymax + "\"], ";
2460                         JsonString += "\"Zmin\": [\"" + zmin + "\"], ";
2461                         JsonString += "\"Zmax\": [\"" + zmax + "\"] ";
2462                         JsonString += "}}";
2463                     }
2464 
2465                     else if (FctType == 1)
2466                     {
2467                         EquationsNumber++;
2468                         if (name == "")
2469                             name = "_" + QString::number(EquationsNumber);
2470 
2471                         ulimit = ulimit.trimmed();
2472                         separator = ulimit.indexOf(",");
2473                         umin = ulimit.left(separator);
2474                         umax = ulimit.remove(umin + ",");
2475                         vlimit = vlimit.trimmed();
2476                         separator = vlimit.indexOf(",");
2477                         vmin = vlimit.left(separator);
2478                         vmax = vlimit.remove(vmin + ",");
2479                         if (JsonString != "")
2480                             JsonString += ",";
2481                         JsonString += "{\"Param3D\": {  \
2482                          \"Description \": [ \"" +
2483                                       comments + "\"],";
2484                         JsonString += "\"Name\": [\"" + name + "\"],";
2485                         JsonString += "\"Component\": [\"" + name + "\"],";
2486                         JsonString += "\"Fx\": [\"" + Xfct.trimmed() + "\"],";
2487                         JsonString += "\"Fy\": [\"" + Yfct.trimmed() + "\"],";
2488                         JsonString += "\"Fz\": [\"" + Zfct.trimmed() + "\"],";
2489                         JsonString += "\"Cnd\": [\"" + condition + "\"],";
2490                         JsonString += "\"Umin\": [\"" + umin + "\"],";
2491                         JsonString += "\"Umax\": [\"" + umax + "\"],";
2492                         JsonString += "\"Vmin\": [\"" + vmin + "\"],";
2493                         JsonString += "\"Vmax\": [\"" + vmax + "\"]";
2494                         JsonString += "}}";
2495                     }
2496                     current = 16;
2497                     // Init all Parameters fo new formula:
2498                     IsoFct = Xfct = Yfct = Zfct = name = comments = condition = "";
2499                     umin = umax = vmin = vmax = xmin = xmax = ymin = ymax = zmin = zmax = "";
2500                     ulimit = vlimit = xlimit = ylimit = zlimit = "";
2501                     FctType = -1;
2502                     break;
2503                 case 18:
2504                     if (current == 1)
2505                         IsoFct += line;
2506                     else if (current == 2)
2507                         xlimit += line;
2508                     else if (current == 3)
2509                         ylimit += line;
2510                     else if (current == 4)
2511                         zlimit += line;
2512                     else if (current == 21)
2513                         Xfct += line;
2514                     else if (current == 22)
2515                         Yfct += line;
2516                     else if (current == 23)
2517                         Zfct += line;
2518                     else if (current == 24)
2519                         ulimit += line;
2520                     else if (current == 25)
2521                         vlimit += line;
2522                     else if (current == 5)
2523                         condition += line;
2524                     else if (current == 6)
2525                         Au += line;
2526                     else if (current == 7)
2527                         Bu += line;
2528                     else if (current == 8)
2529                         Cu += line;
2530                     else if (current == 9)
2531                         Duv += line;
2532                     else if (current == 10)
2533                         Euv += line;
2534                     else if (current == 11)
2535                         Fuv += line;
2536                     else if (current == 12)
2537                         comments += line;
2538                     else if (current == 13)
2539                         comments += line;
2540                     else if (current == 14)
2541                         comments += line;
2542                     else if (current == 15)
2543                         name += line;
2544                     break;
2545                 }
2546             }
2547             file.close();
2548             JsonString = " { \"MathModels\": [ " + JsonString + "]}";
2549             QFile f(filename.replace(".k3ds", ".js"));
2550             if (f.exists())
2551                 f.remove();
2552             if (!f.open(QIODevice::ReadWrite | QIODevice::Text))
2553             {
2554                 statusBar()->showMessage(tr("Could not write to %1").arg(filename),2000);
2555                 return;
2556             }
2557             QTextStream t(&f);
2558             t << JsonString;
2559             f.close();
2560         }
2561     }
2562 }
2563 
ChildItemTreeProperty(QTreeWidgetItem * item,QString proprty)2564 QTreeWidgetItem *DrawingOptions::ChildItemTreeProperty(QTreeWidgetItem *item,
2565         QString proprty)
2566 {
2567     int childcount = item->childCount();
2568     for (int j = 0; j < childcount; j++)
2569     {
2570         if ((item->child(j))->text(0).contains(proprty))
2571             return item->child(j);
2572     }
2573     return nullptr;
2574 }
2575 
ParseItemTree(QTreeWidgetItem * item,QList<bool> & list,bool viewall)2576 void DrawingOptions::ParseItemTree(QTreeWidgetItem *item, QList<bool> &list, bool viewall)
2577 {
2578     int childcount = item->childCount();
2579     bool sel = false;
2580     bool result;
2581     for (int j = 0; j < childcount; j++)
2582     {
2583         item->child(j)->setForeground(0, QColor(255, 255, 255, 255));
2584         if (!viewall)
2585         {
2586             result = false;
2587             for (int k = 1; k < select.selectedoptions.selectedwords.count(); k++)
2588             {
2589                 sel = (item->child(j))
2590                       ->text(0)
2591                       .contains(select.selectedoptions.selectedwords[k],
2592                                 (select.selectedoptions.sensitive
2593                                  ? Qt::CaseSensitive
2594                                  : Qt::CaseInsensitive));
2595                 result = result || sel;
2596                 list[k - 1] = (list.at(k - 1) || sel);
2597             }
2598             if (result)
2599                 item->child(j)->setForeground(0, QColor(255, 0, 0, 255));
2600         }
2601     }
2602 }
2603 
SearchListModels()2604 void DrawingOptions::SearchListModels()
2605 {
2606     QTreeWidgetItem *Toplevel;
2607     QTreeWidgetItem *Childlevel = nullptr;
2608     QTreeWidgetItem *SubChildlevel;
2609     int topcount = ui.ObjectClasse->topLevelItemCount();
2610     int childcount;
2611     bool sel1 = false;
2612     int searchresult = 0;
2613     // init boolean lists:
2614     for (int i = 0; i < select.selectedoptions.selectedwords.count() - 1; i++)
2615     {
2616         select.selectedoptions.namelist.append(false);
2617         select.selectedoptions.functlist.append(false);
2618         select.selectedoptions.cmpnamelist.append(false);
2619         select.selectedoptions.complist.append(false);
2620     }
2621     for (int i = 0; i < topcount; ++i)
2622     {
2623         Toplevel = ui.ObjectClasse->topLevelItem(i);
2624         childcount = Toplevel->childCount();
2625         searchresult = 0;
2626         for (int j = 0; j < childcount; j++)
2627         {
2628             sel1 = true;
2629             if (!select.selectedoptions.showall)
2630             {
2631                 // init boolean lists:
2632                 for (int m = 0; m < select.selectedoptions.selectedwords.count() - 1;
2633                         m++)
2634                 {
2635                     select.selectedoptions.namelist[m] = false;
2636                     select.selectedoptions.functlist[m] = false;
2637                     select.selectedoptions.cmpnamelist[m] = false;
2638                     select.selectedoptions.complist[m] = false;
2639                 }
2640                 // Search in scripts names:
2641                 if (select.selectedoptions.parsenames)
2642                     for (int k = 1; k < select.selectedoptions.selectedwords.count();
2643                             k++)
2644                     {
2645                         select.selectedoptions.namelist[k - 1] =
2646                             (Toplevel->child(j))
2647                             ->text(0)
2648                             .contains(select.selectedoptions.selectedwords[k],
2649                                       (select.selectedoptions.sensitive
2650                                        ? Qt::CaseSensitive
2651                                        : Qt::CaseInsensitive));
2652                     }
2653                 // continue searching in the functions list when needed:
2654                 if (select.selectedoptions.parsefunctions &&
2655                         (Childlevel = ChildItemTreeProperty(Toplevel->child(j),
2656                                       "Parameters")) != nullptr)
2657                     if ((SubChildlevel =
2658                                 ChildItemTreeProperty(Childlevel, "Functions")) != nullptr)
2659                     {
2660                         ParseItemTree(SubChildlevel, select.selectedoptions.functlist);
2661                     }
2662                 // continue searching in the components names list when needed:
2663                 if (select.selectedoptions.parsecmpnames &&
2664                         (Childlevel = ChildItemTreeProperty(Toplevel->child(j),
2665                                       "Components")) != nullptr)
2666                 {
2667                     ParseItemTree(Childlevel, select.selectedoptions.cmpnamelist);
2668                     int ct = Childlevel->childCount();
2669                     for (int m = 0; m < ct; m++)
2670                         ParseItemTree(Childlevel->child(m),
2671                                       select.selectedoptions.complist);
2672                 }
2673                 // now look in the search results
2674                 if (select.selectedoptions.AND)
2675                 {
2676                     sel1 = true;
2677                     for (int l = 0; l < select.selectedoptions.selectedwords.count() - 1;
2678                             l++)
2679                         sel1 = sel1 && (select.selectedoptions.namelist.at(l) ||
2680                                         select.selectedoptions.functlist.at(l) ||
2681                                         select.selectedoptions.cmpnamelist.at(l) ||
2682                                         select.selectedoptions.complist.at(l));
2683                 }
2684                 else
2685                 {
2686                     sel1 = false;
2687                     for (int l = 0; l < select.selectedoptions.selectedwords.count() - 1;
2688                             l++)
2689                         sel1 = sel1 || (select.selectedoptions.namelist.at(l) ||
2690                                         select.selectedoptions.functlist.at(l) ||
2691                                         select.selectedoptions.cmpnamelist.at(l) ||
2692                                         select.selectedoptions.complist.at(l));
2693                 }
2694             }
2695             else
2696             {
2697                 // Make sure the text color is white when showall is activated
2698                 if ((Childlevel = ChildItemTreeProperty(Toplevel->child(j),
2699                                                         "Parameters")) != nullptr)
2700                     if ((SubChildlevel =
2701                                 ChildItemTreeProperty(Childlevel, "Functions")) != nullptr)
2702                     {
2703                         ParseItemTree(SubChildlevel, select.selectedoptions.functlist,
2704                                       true);
2705                     }
2706                 // Components names and their childs:
2707                 if ((Childlevel = ChildItemTreeProperty(Toplevel->child(j),
2708                                                         "Components")) != nullptr)
2709                 {
2710                     ParseItemTree(Childlevel, select.selectedoptions.cmpnamelist, true);
2711                     int ct = Childlevel->childCount();
2712                     for (int m = 0; m < ct; m++)
2713                         ParseItemTree(Childlevel->child(m), select.selectedoptions.complist, true);
2714                 }
2715             }
2716             // Now count and show only scripts with appropiate search results:
2717             if (sel1)
2718                 searchresult++;
2719             (Toplevel->child(j))->setHidden(!sel1);
2720             if (Toplevel->text(0).contains("IsoSurfaces"))
2721                 Toplevel->setText(0, "IsoSurfaces (" + QString::number(searchresult) +
2722                                   ")");
2723             else if (Toplevel->text(0).contains("Parametric"))
2724                 Toplevel->setText(0,
2725                                   "Parametric (" + QString::number(searchresult) + ")");
2726             else
2727                 Toplevel->setText(0, "My Selection (" + QString::number(searchresult) +
2728                                   ")");
2729         }
2730     }
2731     // Clear boolean lists:
2732     select.selectedoptions.namelist.clear();
2733     select.selectedoptions.functlist.clear();
2734     select.selectedoptions.cmpnamelist.clear();
2735     select.selectedoptions.complist.clear();
2736 }
2737 
AddListModels(bool update)2738 void DrawingOptions::AddListModels(bool update)
2739 {
2740     if (!update)
2741     {
2742         QMenu *contextMenu = new QMenu(ui.ObjectClasse);
2743         ui.ObjectClasse->setContextMenuPolicy(Qt::ActionsContextMenu);
2744         QAction *addElement =
2745             new QAction("Add Current Model to MySelection", contextMenu);
2746         QAction *deleteElement =
2747             new QAction("Erase selected row from MySelection", contextMenu);
2748         QAction *separator = new QAction(ui.ObjectClasse);
2749         separator->setSeparator(true);
2750         ui.ObjectClasse->addAction(addElement);
2751         ui.ObjectClasse->addAction(separator);
2752         ui.ObjectClasse->addAction(deleteElement);
2753         connect(addElement, SIGNAL(triggered()), this,
2754                 SLOT(slot_pushButton_2_clicked()));
2755         connect(deleteElement, SIGNAL(triggered()), this,
2756                 SLOT(slot_unselect_clicked()));
2757     }
2758     QColor greenColor = QColor(0, 255, 0, 50);
2759     // Parametric:
2760     QTreeWidgetItem *ParlistItem = new QTreeWidgetItem(ui.ObjectClasse);
2761     QString Text = "Parametric (" +
2762                    QString::number(MathmodRef->collection.JPar.count()) + ")";
2763     ParlistItem->setBackground(0, greenColor);
2764     ParlistItem->setText(0, Text);
2765     for (int i = 0; i < MathmodRef->collection.JPar.count(); ++i)
2766     {
2767         QTreeWidgetItem *nameitem = new QTreeWidgetItem(ParlistItem);
2768         nameitem->setText(0, MathmodRef->collection.JPar[i].Name[0]);
2769         if (MathmodRef->collection.JPar[i].Component.count() > 0)
2770         {
2771             QTreeWidgetItem *cmpitem = new QTreeWidgetItem(nameitem);
2772             cmpitem->setText(0, "Components");
2773             for (int j = 0; j < MathmodRef->collection.JPar[i].Component.count();
2774                     j++)
2775             {
2776                 QTreeWidgetItem *cmpitem2 = new QTreeWidgetItem(cmpitem);
2777                 cmpitem2->setText(0, MathmodRef->collection.JPar[i].Component.at(j));
2778                 QTreeWidgetItem *cmpitem3 = new QTreeWidgetItem(cmpitem2);
2779                 cmpitem3->setText(0, "X(u,v) = " +
2780                                   MathmodRef->collection.JPar[i].Fx.at(j));
2781                 QTreeWidgetItem *cmpitem4 = new QTreeWidgetItem(cmpitem2);
2782                 cmpitem4->setText(0, "Y(u,v) = " +
2783                                   MathmodRef->collection.JPar[i].Fy.at(j));
2784                 QTreeWidgetItem *cmpitem5 = new QTreeWidgetItem(cmpitem2);
2785                 cmpitem5->setText(0, "Z(u,v) = " +
2786                                   MathmodRef->collection.JPar[i].Fz.at(j));
2787                 QTreeWidgetItem *cmpitem6 = new QTreeWidgetItem(cmpitem2);
2788                 cmpitem6->setText(
2789                     0, "U = [" + MathmodRef->collection.JPar[i].Umin.at(j) + ", " +
2790                     MathmodRef->collection.JPar[i].Umax.at(j) + "]");
2791                 QTreeWidgetItem *cmpitem7 = new QTreeWidgetItem(cmpitem2);
2792                 cmpitem7->setText(
2793                     0, "V = [" + MathmodRef->collection.JPar[i].Vmin.at(j) + ", " +
2794                     MathmodRef->collection.JPar[i].Vmax.at(j) + "]");
2795                 // Grid resolution:
2796                 if (MathmodRef->collection.JPar[i].Grid.size() > 0 &&
2797                         2 * j + 1 < MathmodRef->collection.JPar[i].Grid.size())
2798                 {
2799                     QTreeWidgetItem *cmpitem8 = new QTreeWidgetItem(cmpitem2);
2800                     cmpitem8->setText(
2801                         0, "Grid = (" + MathmodRef->collection.JPar[i].Grid.at(2 * j) +
2802                         " , " + MathmodRef->collection.JPar[i].Grid.at(2 * j + 1) +
2803                         ")");
2804                 }
2805             }
2806         }
2807         // Add Global parameters:
2808         if (MathmodRef->collection.JPar[i].Csts.count() ||
2809                 MathmodRef->collection.JPar[i].Funct.count())
2810         {
2811             QTreeWidgetItem *parameteritem = new QTreeWidgetItem(nameitem);
2812             parameteritem->setText(0, "Parameters:");
2813             if (MathmodRef->collection.JPar[i].Csts.count() > 0)
2814             {
2815                 QTreeWidgetItem *cstitem = new QTreeWidgetItem(parameteritem);
2816                 cstitem->setText(0, "Constantes:");
2817                 for (int j = 0; j < MathmodRef->collection.JPar[i].Csts.count(); j++)
2818                 {
2819                     QTreeWidgetItem *cstitem2 = new QTreeWidgetItem(cstitem);
2820                     cstitem2->setText(0, MathmodRef->collection.JPar[i].Csts.at(j));
2821                 }
2822             }
2823             if (MathmodRef->collection.JPar[i].Funct.count() > 0)
2824             {
2825                 QTreeWidgetItem *fctitem = new QTreeWidgetItem(parameteritem);
2826                 fctitem->setText(0, "Functions:");
2827                 for (int j = 0; j < MathmodRef->collection.JPar[i].Funct.count(); j++)
2828                 {
2829                     QTreeWidgetItem *fctitem2 = new QTreeWidgetItem(fctitem);
2830                     fctitem2->setText(0, MathmodRef->collection.JPar[i].Funct.at(j));
2831                 }
2832             }
2833         }
2834     }
2835     ParlistItem->sortChildren(0, Qt::AscendingOrder);
2836     // Iso:
2837     QTreeWidgetItem *IsolistItem = IsolistItemRef =
2838                                        new QTreeWidgetItem(ui.ObjectClasse);
2839     Text = "IsoSurfaces (" +
2840            QString::number(MathmodRef->collection.JIso.count()) + ")";
2841     IsolistItem->setBackground(0, greenColor);
2842     IsolistItem->setText(0, Text);
2843     for (int i = 0; i < MathmodRef->collection.JIso.count(); ++i)
2844     {
2845         QTreeWidgetItem *nameitem = new QTreeWidgetItem(IsolistItem);
2846         nameitem->setText(0, MathmodRef->collection.JIso[i].Name[0]);
2847         if (MathmodRef->collection.JIso[i].Component.count() > 0)
2848         {
2849             QTreeWidgetItem *cmpitem = new QTreeWidgetItem(nameitem);
2850             cmpitem->setText(0, "Components");
2851             for (int j = 0; j < MathmodRef->collection.JIso[i].Component.count();
2852                     j++)
2853             {
2854                 QTreeWidgetItem *cmpitem2 = new QTreeWidgetItem(cmpitem);
2855                 cmpitem2->setText(0, MathmodRef->collection.JIso[i].Component.at(j));
2856                 QTreeWidgetItem *cmpitem3 = new QTreeWidgetItem(cmpitem2);
2857                 cmpitem3->setText(0, "F(x,y,z) = " +
2858                                   MathmodRef->collection.JIso[i].Fxyz.at(j));
2859                 QTreeWidgetItem *cmpitem6 = new QTreeWidgetItem(cmpitem2);
2860                 cmpitem6->setText(
2861                     0, "X = [" + MathmodRef->collection.JIso[i].Xmin.at(j) + ", " +
2862                     MathmodRef->collection.JIso[i].Xmax.at(j) + "]");
2863                 QTreeWidgetItem *cmpitem7 = new QTreeWidgetItem(cmpitem2);
2864                 cmpitem7->setText(
2865                     0, "Y = [" + MathmodRef->collection.JIso[i].Ymin.at(j) + ", " +
2866                     MathmodRef->collection.JIso[i].Ymax.at(j) + "]");
2867                 QTreeWidgetItem *cmpitem8 = new QTreeWidgetItem(cmpitem2);
2868                 cmpitem8->setText(
2869                     0, "Z = [" + MathmodRef->collection.JIso[i].Zmin.at(j) + ", " +
2870                     MathmodRef->collection.JIso[i].Zmax.at(j) + "]");
2871                 // Grid resolution:
2872                 if (MathmodRef->collection.JIso[i].Grid.size() > 0 &&
2873                         j < MathmodRef->collection.JIso[i].Grid.size())
2874                 {
2875                     QTreeWidgetItem *cmpitem9 = new QTreeWidgetItem(cmpitem2);
2876                     cmpitem9->setText(0, "Grid = " +
2877                                       MathmodRef->collection.JIso[i].Grid.at(j));
2878                 }
2879             }
2880         }
2881         // Add Global parameters:
2882         if (MathmodRef->collection.JIso[i].Csts.count() ||
2883                 MathmodRef->collection.JIso[i].Funct.count())
2884         {
2885             QTreeWidgetItem *parameteritem = new QTreeWidgetItem(nameitem);
2886             parameteritem->setText(0, "Parameters:");
2887             if (MathmodRef->collection.JIso[i].Csts.count() > 0)
2888             {
2889                 QTreeWidgetItem *cstitem = new QTreeWidgetItem(parameteritem);
2890                 cstitem->setText(0, "Constantes:");
2891                 for (int j = 0; j < MathmodRef->collection.JIso[i].Csts.count(); j++)
2892                 {
2893                     QTreeWidgetItem *cstitem2 = new QTreeWidgetItem(cstitem);
2894                     cstitem2->setText(0, MathmodRef->collection.JIso[i].Csts.at(j));
2895                 }
2896             }
2897             if (MathmodRef->collection.JIso[i].Funct.count() > 0)
2898             {
2899                 QTreeWidgetItem *fctitem = new QTreeWidgetItem(parameteritem);
2900                 fctitem->setText(0, "Functions:");
2901                 for (int j = 0; j < MathmodRef->collection.JIso[i].Funct.count(); j++)
2902                 {
2903                     QTreeWidgetItem *fctitem2 = new QTreeWidgetItem(fctitem);
2904                     fctitem2->setText(0, MathmodRef->collection.JIso[i].Funct.at(j));
2905                 }
2906             }
2907         }
2908     }
2909     IsolistItemRef->sortChildren(0, Qt::AscendingOrder);
2910     // Parametric:
2911     QTreeWidgetItem *ParisolistItem = new QTreeWidgetItem(ui.ObjectClasse);
2912     Text = "Pariso (" +
2913                    QString::number(MathmodRef->collection.JParIso.count()) + ")";
2914     ParisolistItem->setBackground(0, greenColor);
2915     ParisolistItem->setText(0, Text);
2916     for (int i = 0; i < MathmodRef->collection.JParIso.count(); ++i)
2917     {
2918         QTreeWidgetItem *nameitem = new QTreeWidgetItem(ParisolistItem);
2919         nameitem->setText(0, MathmodRef->collection.JParIso[i].Name);
2920 
2921     }
2922     ParisolistItem->sortChildren(0, Qt::AscendingOrder);
2923     // My Selection:
2924     // Isosurfaces:
2925     QTreeWidgetItem *MyselectionItem = new QTreeWidgetItem(ui.ObjectClasse);
2926     MyselectionItemReference = MyselectionItem;
2927     MyselectionItem->setBackground(0, greenColor);
2928     MyselectionItem->setText(0, "My Selection");
2929     return;
2930 }
2931 
on_pushButton_clicked()2932 void DrawingOptions::on_pushButton_clicked()
2933 {
2934     static int checked = 1;
2935     checked *= -1;
2936     (checked == -1) ? ui.ObjectClasse->hide() : ui.ObjectClasse->show();
2937 }
2938 
on_action_Exit_triggered()2939 void DrawingOptions::on_action_Exit_triggered()
2940 {
2941     MathmodRef->LabelInfos.close();
2942     MathmodRef->close();
2943     this->close();
2944 }
2945 
on_actionTriangles_triggered()2946 void DrawingOptions::on_actionTriangles_triggered()
2947 {
2948     MathmodRef->slot_triangles_clicked();
2949 }
2950 
on_actionInfos_triggered()2951 void DrawingOptions::on_actionInfos_triggered()
2952 {
2953     MathmodRef->iso_infos();
2954 }
2955 
on_actionFill_triggered()2956 void DrawingOptions::on_actionFill_triggered()
2957 {
2958     MathmodRef->fill();
2959 }
2960 
on_ObjectClasse_clicked(const QModelIndex & index)2961 void DrawingOptions::on_ObjectClasse_clicked(const QModelIndex &index)
2962 {
2963     if (!MathmodRef->IsoObjet->isRunning() &&
2964             !MathmodRef->ParObjet->isRunning())
2965     {
2966         on_InitTButton_clicked();
2967         // int result;
2968         QString tst;
2969         MathmodRef->LocalScene.IndexCurrentFormula = -1;
2970         if (index.data().isValid())
2971         {
2972             QVariant data = index.data();
2973             QString s = data.toString();
2974             QModelIndex parent = index.parent();
2975             if (parent.data().isValid())
2976             {
2977                 QString prt = parent.data().toString();
2978                 if (prt != "My Selection")
2979                 {
2980                     on_choice_activated(s);
2981                 }
2982                 else
2983                 {
2984                     for (int i = 0;
2985                             i < MathmodRef->RootObjet.MyJsonObjectSelection.size(); i++)
2986                         if ((MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Iso3D"].isObject()))
2987                         {
2988                             if (s == (tst = (MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Iso3D"]).toObject()["Name"].toArray()[0].toString()))
2989                             {
2990                                 // Draw here
2991 
2992                                 DrawJsonModel(MathmodRef->RootObjet.MyJsonObjectSelection.at(i).toObject());
2993                                 return;
2994                             }
2995                         }
2996                         else if ((MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param3D"].isObject()))
2997                         {
2998                             if (s == (tst = (MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param3D"]).toObject()["Name"].toArray()[0].toString()))
2999                             {
3000                                 // Draw here
3001                                 DrawJsonModel(MathmodRef->RootObjet.MyJsonObjectSelection.at(i).toObject());
3002                                 return;
3003                             }
3004                         }
3005                         else if ((MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param4D"].isObject()))
3006                         {
3007                             if (s == (tst = (MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param4D"]).toObject()["Name"].toArray()[0].toString()))
3008                             {
3009                                 // Draw here
3010                                 DrawJsonModel(MathmodRef->RootObjet.MyJsonObjectSelection.at(i).toObject());
3011                                 return;
3012                             }
3013                         }
3014                         else if ((MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param3D_C"].isObject()))
3015                         {
3016                             if (s == (tst = (MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param3D_C"]).toObject()["Name"].toArray()[0].toString()))
3017                             {
3018                                 // Draw here
3019                                 DrawJsonModel(MathmodRef->RootObjet.MyJsonObjectSelection.at(i).toObject());
3020                                 return;
3021                             }
3022                         }
3023                         else if ((MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param4D_C"].isObject()))
3024                         {
3025                             if (s == (tst = (MathmodRef->RootObjet.MyJsonObjectSelection[i].toObject()["Param4D_C"]).toObject()["Name"].toArray()[0].toString()))
3026                             {
3027                                 // Draw here
3028                                 DrawJsonModel(MathmodRef->RootObjet.MyJsonObjectSelection.at(i).toObject());
3029                                 return;
3030                             }
3031                         }
3032                 }
3033             }
3034         }
3035         return;
3036     }
3037 }
3038 
slot_pushButton_2_clicked()3039 void DrawingOptions::slot_pushButton_2_clicked()
3040 {
3041     MathmodRef->RootObjet.MyJsonObjectSelection.append(MathmodRef->RootObjet.CurrentJsonObject);
3042     AddObjectToMySelectionTree();
3043 }
3044 
slot_unselect_clicked()3045 void DrawingOptions::slot_unselect_clicked()
3046 {
3047     int index =
3048         MyselectionItemReference->indexOfChild(ui.ObjectClasse->currentItem());
3049     MathmodRef->RootObjet.MyJsonObjectSelection.removeAt(index);
3050     MyselectionItemReference->removeChild(ui.ObjectClasse->currentItem());
3051 }
3052 
slot_XYZscrollBar_valueChanged(int value)3053 void DrawingOptions::slot_XYZscrollBar_valueChanged(int value)
3054 {
3055     MathmodRef->xyzg_valueChanged(value, ISO_TYPE);
3056 }
3057 
UpdateDescription(int position,ModelType type,TreeStruct & currentstruct)3058 void DrawingOptions::UpdateDescription(int position, ModelType type, TreeStruct &currentstruct)
3059 {
3060     if (type == PAR_TYPE)
3061     {
3062         if (position > -1)
3063         {
3064             IndexcurrentComponent = position;
3065             MathmodRef->LocalScene.IndexCurrentFormula == position
3066             ? MathmodRef->LocalScene.IndexCurrentFormula = -1
3067                     : MathmodRef->LocalScene.IndexCurrentFormula = position;
3068             // currentFormula = sparent;
3069             ui.paramNameEdit->setText(currentstruct.Component.at(position));
3070             ui.XEdit->setText(currentstruct.fx.at(position));
3071             ui.YEdit->setText(currentstruct.fy.at(position));
3072             ui.ZEdit->setText(currentstruct.fz.at(position));
3073             ui.umin->setText(currentstruct.umin.at(position));
3074             ui.vmin->setText(currentstruct.vmin.at(position));
3075             ui.umax->setText(currentstruct.umax.at(position));
3076             ui.vmax->setText(currentstruct.vmax.at(position));
3077             if (!currentstruct.Component.empty())
3078                 ui.paramNameEdit->setText(currentstruct.Component.at(position));
3079             else
3080                 ui.paramNameEdit->setText("");
3081             if (!currentstruct.Cnd.empty())
3082             {
3083                 ui.CndUpdateEdit_2->setText(currentstruct.Cnd.at(position));
3084             }
3085             else
3086             {
3087                 ui.CndUpdateEdit_2->setText("");
3088             }
3089             // Function:
3090             if (!currentstruct.Funct.empty())
3091             {
3092                 ui.tableWidget_Fct_2->clearContents();
3093                 ui.tableWidget_Fct_2->setRowCount(0);
3094                 for (int i = 0; i < currentstruct.Funct.size(); i++)
3095                 {
3096                     ui.tableWidget_Fct_2->setRowCount(i + 1);
3097                     ui.tableWidget_Fct_2->setItem(i, 0, new QTableWidgetItem(currentstruct.Funct.at(i)));
3098                 }
3099             }
3100             else
3101             {
3102                 ui.tableWidget_Fct_2->clearContents();
3103                 ui.tableWidget_Fct_2->setRowCount(0);
3104             }
3105             // Constantes:
3106             if (!currentstruct.Const.empty())
3107             {
3108                 ui.tableWidget_Cst_2->clearContents();
3109                 ui.tableWidget_Cst_2->setRowCount(0);
3110                 for (int i = 0; i < currentstruct.Const.size(); i++)
3111                 {
3112                     ui.tableWidget_Cst_2->setRowCount(i + 1);
3113                     ui.tableWidget_Cst_2->setItem(i, 0, new QTableWidgetItem(currentstruct.Const.at(i)));
3114                 }
3115             }
3116             else
3117             {
3118                 ui.tableWidget_Cst_2->clearContents();
3119                 ui.tableWidget_Cst_2->setRowCount(0);
3120             }
3121         }
3122         ui.stackedProperties->setCurrentIndex(2);
3123     }
3124     if (type == PAR_4D_TYPE)
3125     {
3126         if (position > -1)
3127         {
3128             IndexcurrentComponent = position;
3129             MathmodRef->LocalScene.IndexCurrentFormula == position
3130             ? MathmodRef->LocalScene.IndexCurrentFormula = -1
3131                     : MathmodRef->LocalScene.IndexCurrentFormula = position;
3132             // currentFormula = sparent;
3133             ui.paramNameEdit_2->setText(currentstruct.Component.at(position));
3134             ui.XEdit_2->setText(currentstruct.fx.at(position));
3135             ui.YEdit_2->setText(currentstruct.fy.at(position));
3136             ui.ZEdit_2->setText(currentstruct.fz.at(position));
3137             ui.WEdit_2->setText(currentstruct.fw.at(position));
3138             ui.umin_2->setText(currentstruct.umin.at(position));
3139             ui.vmin_2->setText(currentstruct.vmin.at(position));
3140             ui.umax_2->setText(currentstruct.umax.at(position));
3141             ui.vmax_2->setText(currentstruct.vmax.at(position));
3142             if (!currentstruct.Component.empty())
3143                 ui.paramNameEdit_2->setText(currentstruct.Component.at(position));
3144             else
3145                 ui.paramNameEdit_2->setText("");
3146         }
3147         ui.stackedProperties->setCurrentIndex(3);
3148     }
3149     if (type == ISO_TYPE)
3150     {
3151         if (position > -1)
3152         {
3153             IndexcurrentComponent = position;
3154             MathmodRef->LocalScene.IndexCurrentFormula == position
3155             ? MathmodRef->LocalScene.IndexCurrentFormula = -1
3156                     : MathmodRef->LocalScene.IndexCurrentFormula = position;
3157             ui.UpdateEdit->setText(currentstruct.fxyz.at(position));
3158             ui.xmin->setText(currentstruct.xmin.at(position));
3159             ui.ymin->setText(currentstruct.ymin.at(position));
3160             ui.zmin->setText(currentstruct.zmin.at(position));
3161             ui.xmax->setText(currentstruct.xmax.at(position));
3162             ui.ymax->setText(currentstruct.ymax.at(position));
3163             ui.zmax->setText(currentstruct.zmax.at(position));
3164             if (!currentstruct.Component.empty())
3165                 ui.isoNameEdit->setText(currentstruct.Component.at(position));
3166             else
3167                 ui.isoNameEdit->setText("");
3168 
3169             if (!currentstruct.Cnd.empty())
3170             {
3171                 position < currentstruct.Cnd.size()
3172                 ? ui.CndUpdateEdit->setText(currentstruct.Cnd.at(position))
3173                 : ui.CndUpdateEdit->setText(currentstruct.Cnd.at(0));
3174             }
3175             else
3176             {
3177                 ui.CndUpdateEdit->setText("");
3178             }
3179             // Function:
3180             if (!currentstruct.Funct.empty())
3181             {
3182                 ui.tableWidget_Fct->clearContents();
3183                 ui.tableWidget_Fct->setRowCount(0);
3184                 for (int i = 0; i < currentstruct.Funct.size(); i++)
3185                 {
3186                     ui.tableWidget_Fct->setRowCount(i + 1);
3187                     ui.tableWidget_Fct->setItem(i, 0, new QTableWidgetItem(currentstruct.Funct.at(i)));
3188                 }
3189             }
3190             else
3191             {
3192                 ui.tableWidget_Fct->clearContents();
3193                 ui.tableWidget_Fct->setRowCount(0);
3194             }
3195             // Constantes:
3196             if (!currentstruct.Const.empty())
3197             {
3198                 ui.tableWidget_Cst->clearContents();
3199                 ui.tableWidget_Cst->setRowCount(0);
3200                 for (int i = 0; i < currentstruct.Const.size(); i++)
3201                 {
3202                     ui.tableWidget_Cst->setRowCount(i + 1);
3203                     ui.tableWidget_Cst->setItem(i, 0, new QTableWidgetItem(currentstruct.Const.at(i)));
3204                 }
3205             }
3206             else
3207             {
3208                 ui.tableWidget_Cst->clearContents();
3209                 ui.tableWidget_Cst->setRowCount(0);
3210             }
3211         }
3212         ui.stackedProperties->setCurrentIndex(1);
3213     }
3214 }
3215 
oncolor_2activated(int index)3216 void DrawingOptions::oncolor_2activated(int index)
3217 {
3218     MathmodRef->colorstype(index);
3219 }
3220 
onred_2valueChanged(int value)3221 void DrawingOptions::onred_2valueChanged(int value)
3222 {
3223     MathmodRef->red(value, IndexcurrentComponent);
3224 }
3225 
ongreen_2valueChanged(int value)3226 void DrawingOptions::ongreen_2valueChanged(int value)
3227 {
3228     MathmodRef->green(value, IndexcurrentComponent);
3229 }
3230 
onblue_2valueChanged(int value)3231 void DrawingOptions::onblue_2valueChanged(int value)
3232 {
3233     MathmodRef->blue(value, IndexcurrentComponent);
3234 }
3235 
on_red_ParIso_valueChanged(int value)3236 void DrawingOptions::on_red_ParIso_valueChanged(int value)
3237 {
3238     MathmodRef->red(value, IndexcurrentComponent);
3239 }
3240 
on_green_ParIso_valueChanged(int value)3241 void DrawingOptions::on_green_ParIso_valueChanged(int value)
3242 {
3243     MathmodRef->green(value, IndexcurrentComponent);
3244 }
3245 
on_blue_ParIso_valueChanged(int value)3246 void DrawingOptions::on_blue_ParIso_valueChanged(int value)
3247 {
3248     MathmodRef->blue(value, IndexcurrentComponent);
3249 }
3250 
removeat(int idx,QJsonObject & QObj,QString str)3251 void DrawingOptions::removeat(int idx, QJsonObject& QObj, QString str)
3252 {
3253     QJsonArray array;
3254     array = QObj[str].toArray();
3255     array.removeAt(idx);
3256     QObj[str] = array;
3257 }
3258 
removeat2(int idx,QJsonObject & QObj,QString str)3259 void DrawingOptions::removeat2(int idx, QJsonObject& QObj, QString str)
3260 {
3261     if (QObj[str].isArray())
3262     {
3263         QJsonArray array;
3264         array = QObj[str].toArray();
3265         array.removeAt(idx);
3266         QObj[str] = array;
3267     }
3268     else
3269         QObj.remove(str);
3270 }
3271 
appendall(QJsonObject & QObj,QString str,QTableWidget * table)3272 void DrawingOptions::appendall(QJsonObject& QObj, QString str, QTableWidget* table)
3273 {
3274     if (QObj[str].isArray() && table->rowCount() > 0)
3275     {
3276         QJsonArray array2;
3277         for (int i = 0; i < table->rowCount(); i++)
3278         {
3279             if ((table->item(i, 0))->text() != "")
3280                 array2.append((table->item(i, 0))->text());
3281         }
3282         QObj[str] = array2;
3283     }
3284     else
3285         QObj.remove(str);
3286 }
3287 
replaceat(int idx,QJsonObject & QObj,QString str,QTextEdit * text)3288 void DrawingOptions::replaceat(int idx, QJsonObject& QObj, QString str, QTextEdit* text)
3289 {
3290     QJsonArray array;
3291     array = QObj[str].toArray();
3292     array.replace(idx, text->toPlainText());
3293     QObj[str] = array;
3294 }
3295 
insertat(int idx,QJsonObject & QObj,QString str,QTextEdit * text)3296 void DrawingOptions::insertat(int idx, QJsonObject& QObj, QString str, QTextEdit* text)
3297 {
3298     QJsonArray array;
3299     array = QObj[str].toArray();
3300     array.insert(idx, text->toPlainText());
3301     QObj[str] = array;
3302 }
3303 
appednew(QJsonObject & QObj,QString str,QTextEdit * text)3304 void DrawingOptions::appednew(QJsonObject& QObj, QString str, QTextEdit* text)
3305 {
3306     QJsonArray array;
3307     array = QObj[str].toArray();
3308     array.append(text->toPlainText());
3309     QObj[str] = array;
3310 }
3311 
on_updateJObject(QJsonObject & copyCurrentObject)3312 void DrawingOptions::on_updateJObject(QJsonObject &copyCurrentObject)
3313 {
3314     QJsonArray array;
3315     if (copyCurrentObject["Iso3D"].isObject())
3316     {
3317         if (IndexcurrentComponent != -1)
3318         {
3319             QJsonObject copyCurrentObject2 = copyCurrentObject["Iso3D"].toObject();
3320             // Cut the component at the index indexcurrentFormula :
3321             if ((ui.isoNameEdit->toPlainText()).replace(" ", "") == "")
3322             {
3323                 for(uint ui=0; ui<MandatoryIsosurfaceFields.size(); ui++)
3324                     removeat(IndexcurrentComponent, copyCurrentObject2, MandatoryIsosurfaceFields[ui]);
3325 
3326                 removeat2(IndexcurrentComponent, copyCurrentObject2, "Grid");
3327                 removeat2(IndexcurrentComponent, copyCurrentObject2, "Cnd");
3328                 appendall(copyCurrentObject2, "Funct", ui.tableWidget_Fct);
3329                 appendall(copyCurrentObject2, "Const", ui.tableWidget_Cst);
3330                 // Some keys cleaning..
3331                 copyCurrentObject2.remove("Param3D");
3332                 copyCurrentObject2.remove("Param4D");
3333                 copyCurrentObject["Iso3D"] = copyCurrentObject2;
3334             }
3335             // Update the component at the index indexcurrentFormula;
3336             else if ((copyCurrentObject["Iso3D"].toObject())["Component"].toArray().size() > 0 &&
3337                      IndexcurrentComponent > -1 && IndexcurrentComponent <
3338                      (copyCurrentObject["Iso3D"].toObject())["Component"].toArray().size() &&
3339                      (((copyCurrentObject["Iso3D"].toObject())["Component"].toArray())[IndexcurrentComponent]).toString().replace(" ", "") ==
3340                      (ui.isoNameEdit->toPlainText()).replace(" ", ""))
3341             {
3342                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fxyz", ui.UpdateEdit);
3343                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Xmin", ui.xmin);
3344                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Xmax", ui.xmax);
3345                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Ymin", ui.ymin);
3346                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Ymax", ui.ymax);
3347                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Zmin", ui.zmin);
3348                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Zmax", ui.zmax);
3349                 appendall(copyCurrentObject2, "Funct", ui.tableWidget_Fct);
3350                 appendall(copyCurrentObject2, "Const", ui.tableWidget_Cst);
3351 
3352                 copyCurrentObject2.remove("Param3D");
3353                 copyCurrentObject2.remove("Param4D");
3354                 copyCurrentObject["Iso3D"] = copyCurrentObject2;
3355             }
3356             else
3357             {
3358                 // Add new component:
3359                 if ((((copyCurrentObject["Iso3D"].toObject())["Component"].toArray())[IndexcurrentComponent]).toString().replace(" ", "") !=
3360                         (ui.isoNameEdit->toPlainText()).replace(" ", ""))
3361                 {
3362                     appednew(copyCurrentObject2, "Component", ui.isoNameEdit);
3363                     appednew(copyCurrentObject2, "Fxyz", ui.UpdateEdit);
3364                     appednew(copyCurrentObject2, "Xmin", ui.xmin);
3365                     appednew(copyCurrentObject2, "Xmax", ui.xmax);
3366                     appednew(copyCurrentObject2, "Ymin", ui.ymin);
3367                     appednew(copyCurrentObject2, "Ymax", ui.ymax);
3368                     appednew(copyCurrentObject2, "Zmin", ui.zmin);
3369                     appednew(copyCurrentObject2, "Zmax", ui.zmax);
3370 
3371                     if (copyCurrentObject2["Cnd"].isArray())
3372                     {
3373                         array = copyCurrentObject2["Cnd"].toArray();
3374                         array.append(ui.CndUpdateEdit->toPlainText());
3375                         copyCurrentObject2["Cnd"] = array;
3376                     }
3377                     else if (ui.CndUpdateEdit->toPlainText() != "")
3378                     {
3379                         array = copyCurrentObject2["Cnd"].toArray();
3380                         for (int i = 0; i < copyCurrentObject2["Fxyz"].toArray().count();
3381                                 i++)
3382                             array.append(ui.CndUpdateEdit->toPlainText());
3383                         copyCurrentObject2["Cnd"] = array;
3384                     }
3385                     else
3386                         copyCurrentObject2.remove("Cnd");
3387 
3388                     if (copyCurrentObject2["Grid"].isArray())
3389                     {
3390                         array = copyCurrentObject2["Grid"].toArray();
3391                         array.append(QString::number(ui.xyzg->value()));
3392                         copyCurrentObject2["Grid"] = array;
3393                     }
3394                     else
3395                         copyCurrentObject2.remove("Grid");
3396                 }
3397                 else
3398                 {
3399                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fxyz", ui.UpdateEdit);
3400                     insertat(IndexcurrentComponent, copyCurrentObject2, "Xmin", ui.xmin);
3401                     insertat(IndexcurrentComponent, copyCurrentObject2, "Xmax", ui.xmax);
3402                     insertat(IndexcurrentComponent, copyCurrentObject2, "Ymin", ui.ymin);
3403                     insertat(IndexcurrentComponent, copyCurrentObject2, "Ymax", ui.ymax);
3404                     insertat(IndexcurrentComponent, copyCurrentObject2, "Zmin", ui.zmin);
3405                     insertat(IndexcurrentComponent, copyCurrentObject2, "Zmax", ui.zmax);
3406 
3407                     if (copyCurrentObject2["Cnd"].isArray())
3408                     {
3409                         array = copyCurrentObject2["Cnd"].toArray();
3410                         array.insert(IndexcurrentComponent, ui.CndUpdateEdit->toPlainText());
3411                         copyCurrentObject2["Cnd"] = array;
3412                     }
3413                     else if (ui.CndUpdateEdit->toPlainText() != "")
3414                     {
3415                         array = copyCurrentObject2["Cnd"].toArray();
3416                         for (int i = 0; i < copyCurrentObject2["Fxyz"].toArray().count();
3417                                 i++)
3418                             array.append(ui.CndUpdateEdit->toPlainText());
3419                         copyCurrentObject2["Cnd"] = array;
3420                     }
3421                     else
3422                         copyCurrentObject2.remove("Cnd");
3423                 }
3424 
3425                 appendall(copyCurrentObject2, "Funct", ui.tableWidget_Fct);
3426                 appendall(copyCurrentObject2, "Const", ui.tableWidget_Cst);
3427 
3428                 copyCurrentObject["Iso3D"] = copyCurrentObject2;
3429             }
3430         }
3431     }
3432     else if (copyCurrentObject["Param3D"].isObject() || copyCurrentObject["Param3D_C"].isObject())
3433     {
3434         copyCurrentObject.remove("Iso3D");
3435         QJsonObject copyCurrentObject2 =
3436                 copyCurrentObject["Param3D"].isObject() ? copyCurrentObject["Param3D"].toObject() : copyCurrentObject["Param3D_C"].toObject();
3437         if (IndexcurrentComponent != -1)
3438         {
3439             if ((ui.paramNameEdit->toPlainText()).replace(" ", "") == "")
3440             {
3441                 for(uint ui=0; ui<MandatoryParmetric3DFields.size(); ui++)
3442                     removeat(IndexcurrentComponent, copyCurrentObject2, MandatoryParmetric3DFields[ui]);
3443                 removeat2(2*IndexcurrentComponent, copyCurrentObject2, "Grid");
3444                 removeat2(2*IndexcurrentComponent, copyCurrentObject2, "Grid");
3445                 removeat2(IndexcurrentComponent, copyCurrentObject2, "Cnd");
3446                 appendall(copyCurrentObject2, "Funct", ui.tableWidget_Fct_2);
3447                 appendall(copyCurrentObject2, "Const", ui.tableWidget_Cst_2);
3448                 // Some keys cleaning..
3449                 copyCurrentObject2.remove("Iso3D");
3450                 copyCurrentObject2.remove("Param4D");
3451                 if(copyCurrentObject["Param3D"].isObject())
3452                     copyCurrentObject["Param3D"] = copyCurrentObject2;
3453                 else
3454                     copyCurrentObject["Param3D_C"] = copyCurrentObject2;
3455             }
3456             else if ((((copyCurrentObject["Param3D"].toObject())["Component"].toArray()).count() > 0 &&
3457                      IndexcurrentComponent > -1 && IndexcurrentComponent <
3458                      ((copyCurrentObject["Param3D"].toObject())["Component"].toArray()).size() &&
3459                      ((copyCurrentObject["Param3D"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") ==
3460                      (ui.paramNameEdit->toPlainText()).replace(" ", ""))  ||
3461 
3462                      (((copyCurrentObject["Param3D_C"].toObject())["Component"].toArray()).count() > 0 &&
3463                      IndexcurrentComponent > -1 && IndexcurrentComponent <
3464                      ((copyCurrentObject["Param3D_C"].toObject())["Component"].toArray()).size() &&
3465                      ((copyCurrentObject["Param3D_C"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") ==
3466                      (ui.paramNameEdit->toPlainText()).replace(" ", ""))
3467                      )
3468             {
3469                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fx", ui.XEdit);
3470                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fy", ui.YEdit);
3471                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fz", ui.ZEdit);
3472                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Umin", ui.umin);
3473                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Umax", ui.umax);
3474                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Vmin", ui.vmin);
3475                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Vmax", ui.vmax);
3476                 appendall(copyCurrentObject2, "Funct", ui.tableWidget_Fct_2);
3477                 appendall(copyCurrentObject2, "Const", ui.tableWidget_Cst_2);
3478                 if (copyCurrentObject2["Cnd"].isArray() &&
3479                         copyCurrentObject2["Cnd"].toArray().count() > IndexcurrentComponent)
3480                 {
3481                     array = copyCurrentObject2["Cnd"].toArray();
3482                     array.replace(IndexcurrentComponent, ui.CndUpdateEdit_2->toPlainText());
3483                     copyCurrentObject2["Cnd"] = array;
3484                 }
3485                 else if (ui.CndUpdateEdit_2->toPlainText() != "")
3486                 {
3487                     array = copyCurrentObject2["Cnd"].toArray();
3488                     for (int i = 0; i < copyCurrentObject2["Fx"].toArray().count(); i++)
3489                         array.append(ui.CndUpdateEdit_2->toPlainText());
3490                     copyCurrentObject2["Cnd"] = array;
3491                 }
3492                 else
3493                     copyCurrentObject2.remove("Cnd");
3494                 if(copyCurrentObject["Param3D"].isObject())
3495                     copyCurrentObject["Param3D"] = copyCurrentObject2;
3496                 else
3497                     copyCurrentObject["Param3D_C"] = copyCurrentObject2;
3498             }
3499             else
3500             {
3501                 if ((((copyCurrentObject["Param3D"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") !=
3502                         (ui.paramNameEdit->toPlainText()).replace(" ", "")) ||
3503                     (((copyCurrentObject["Param3D_C"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") !=
3504                                                 (ui.paramNameEdit->toPlainText()).replace(" ", ""))
3505                     )
3506                 {
3507                     appednew(copyCurrentObject2, "Component", ui.paramNameEdit);
3508                     appednew(copyCurrentObject2, "Fx", ui.XEdit);
3509                     appednew(copyCurrentObject2, "Fy", ui.YEdit);
3510                     appednew(copyCurrentObject2, "Fz", ui.ZEdit);
3511                     appednew(copyCurrentObject2, "Umin", ui.umin);
3512                     appednew(copyCurrentObject2, "Umax", ui.umax);
3513                     appednew(copyCurrentObject2, "Vmin", ui.vmin);
3514                     appednew(copyCurrentObject2, "Vmax", ui.vmax);
3515                     if (copyCurrentObject2["Grid"].isArray())
3516                     {
3517                         array = copyCurrentObject2["Grid"].toArray();
3518                         int pos=2*IndexcurrentComponent;
3519                         array.append((array.at(pos).toString()));
3520                         array.append((array.at(pos+1).toString()));
3521                         copyCurrentObject2["Grid"] = array;
3522                     }
3523                     else
3524                         copyCurrentObject2.remove("Grid");
3525 
3526                     if (copyCurrentObject2["Cnd"].isArray())
3527                     {
3528                         array = copyCurrentObject2["Cnd"].toArray();
3529                         array.append(ui.CndUpdateEdit_2->toPlainText());
3530                         copyCurrentObject2["Cnd"] = array;
3531                     }
3532                     else if (ui.CndUpdateEdit_2->toPlainText() != "")
3533                     {
3534                         array = copyCurrentObject2["Cnd"].toArray();
3535                         for (int i = 0; i < copyCurrentObject2["Fx"].toArray().count(); i++)
3536                             array.append(ui.CndUpdateEdit_2->toPlainText());
3537                         copyCurrentObject2["Cnd"] = array;
3538                     }
3539                     else
3540                         copyCurrentObject2.remove("Cnd");
3541                 }
3542                 else
3543                 {
3544                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fx", ui.XEdit);
3545                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fy", ui.YEdit);
3546                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fz", ui.ZEdit);
3547                     insertat(IndexcurrentComponent, copyCurrentObject2, "Umin", ui.umin);
3548                     insertat(IndexcurrentComponent, copyCurrentObject2, "Umax", ui.umax);
3549                     insertat(IndexcurrentComponent, copyCurrentObject2, "Vmin", ui.vmin);
3550                     insertat(IndexcurrentComponent, copyCurrentObject2, "Vmax", ui.vmax);
3551                     array = copyCurrentObject2["Component"].toArray();
3552                     array.insert(IndexcurrentComponent, ui.paramNameEdit->toPlainText());
3553                     copyCurrentObject2["Component"] = array;
3554                     if (copyCurrentObject2["Cnd"].isArray())
3555                     {
3556                         array = copyCurrentObject2["Cnd"].toArray();
3557                         array.append(ui.CndUpdateEdit_2->toPlainText());
3558                         copyCurrentObject2["Cnd"] = array;
3559                     }
3560                     else if (ui.CndUpdateEdit_2->toPlainText() != "")
3561                     {
3562                         array = copyCurrentObject2["Cnd"].toArray();
3563                         for (int i = 0; i < copyCurrentObject2["Fx"].toArray().count(); i++)
3564                             array.append(ui.CndUpdateEdit_2->toPlainText());
3565                         copyCurrentObject2["Cnd"] = array;
3566                     }
3567                     else
3568                         copyCurrentObject2.remove("Cnd");
3569                 }
3570                 appendall(copyCurrentObject2, "Funct", ui.tableWidget_Fct_2);
3571                 appendall(copyCurrentObject2, "Const", ui.tableWidget_Cst_2);
3572                 if(copyCurrentObject["Param3D"].isObject())
3573                     copyCurrentObject["Param3D"] = copyCurrentObject2;
3574                 else
3575                     copyCurrentObject["Param3D_C"] = copyCurrentObject2;
3576             }
3577         }
3578     }
3579     else if (copyCurrentObject["Param4D"].isObject() || copyCurrentObject["Param4D_C"].isObject())
3580     {
3581         copyCurrentObject.remove("Iso3D");
3582         copyCurrentObject.remove("Param3D");
3583         copyCurrentObject.remove("Param3D_C");
3584         QJsonObject copyCurrentObject2 = copyCurrentObject["Param4D"].isObject() ? copyCurrentObject["Param4D"].toObject() : copyCurrentObject["Param4D_C"].toObject();
3585         if (IndexcurrentComponent != -1)
3586         {
3587             if ((ui.paramNameEdit_2->toPlainText()).replace(" ", "") == "")
3588             {
3589                 for(uint ui=0; ui<MandatoryParmetric4DFields.size(); ui++)
3590                     removeat(IndexcurrentComponent, copyCurrentObject2, MandatoryParmetric4DFields[ui]);
3591                 removeat2(2*IndexcurrentComponent, copyCurrentObject2, "Grid");
3592                 removeat2(2*IndexcurrentComponent, copyCurrentObject2, "Grid");
3593                 if(copyCurrentObject["Param4D"].isObject())
3594                     copyCurrentObject["Param4D"] = copyCurrentObject2;
3595                 else
3596                     copyCurrentObject["Param4D_C"] = copyCurrentObject2;
3597             }
3598             else if ((((copyCurrentObject["Param4D"].toObject())["Component"].toArray()).count() > 0 &&
3599                      IndexcurrentComponent > -1 && IndexcurrentComponent <((copyCurrentObject["Param4D"].toObject())["Component"].toArray()).size() &&
3600                      ((copyCurrentObject["Param4D"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") ==(ui.paramNameEdit_2->toPlainText()).replace(" ", ""))
3601                  ||
3602                      (((copyCurrentObject["Param4D_C"].toObject())["Component"].toArray()).count() > 0 &&
3603                                           IndexcurrentComponent > -1 && IndexcurrentComponent <((copyCurrentObject["Param4D_C"].toObject())["Component"].toArray()).size() &&
3604                                           ((copyCurrentObject["Param4D_C"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") ==(ui.paramNameEdit_2->toPlainText()).replace(" ", ""))
3605                 )
3606             {
3607                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fx", ui.XEdit_2);
3608                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fy", ui.YEdit_2);
3609                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fz", ui.ZEdit_2);
3610                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Fw", ui.WEdit_2);
3611                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Umin", ui.umin_2);
3612                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Umax", ui.umax_2);
3613                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Vmin", ui.vmin_2);
3614                 replaceat(IndexcurrentComponent, copyCurrentObject2, "Vmax", ui.vmax_2);
3615                 if(copyCurrentObject["Param4D"].isObject())
3616                     copyCurrentObject["Param4D"] = copyCurrentObject2;
3617                 else
3618                     copyCurrentObject["Param4D_C"] = copyCurrentObject2;
3619             }
3620             else
3621             {
3622                 if ((((copyCurrentObject["Param4D"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") !=
3623                         (ui.paramNameEdit_2->toPlainText()).replace(" ", "")) ||
3624                         (((copyCurrentObject["Param4D_C"].toObject())["Component"].toArray())[IndexcurrentComponent].toString().replace(" ", "") !=
3625                                                 (ui.paramNameEdit_2->toPlainText()).replace(" ", ""))
3626                         )
3627                 {
3628                     appednew(copyCurrentObject2, "Component", ui.paramNameEdit_2);
3629                     appednew(copyCurrentObject2, "Fx", ui.XEdit_2);
3630                     appednew(copyCurrentObject2, "Fy", ui.YEdit_2);
3631                     appednew(copyCurrentObject2, "Fz", ui.ZEdit_2);
3632                     appednew(copyCurrentObject2, "Fw", ui.WEdit_2);
3633                     appednew(copyCurrentObject2, "Umin", ui.umin_2);
3634                     appednew(copyCurrentObject2, "Umax", ui.umax_2);
3635                     appednew(copyCurrentObject2, "Vmin", ui.vmin_2);
3636                     appednew(copyCurrentObject2, "Vmax", ui.vmax_2);
3637                     if (copyCurrentObject2["Grid"].isArray())
3638                     {
3639                         array = copyCurrentObject2["Grid"].toArray();
3640                         int pos=2*IndexcurrentComponent;
3641                         array.append((array.at(pos).toString()));
3642                         array.append((array.at(pos+1).toString()));
3643                         copyCurrentObject2["Grid"] = array;
3644                     }
3645                     else
3646                         copyCurrentObject2.remove("Grid");
3647                     if(copyCurrentObject["Param4D"].isObject())
3648                         copyCurrentObject["Param4D"] = copyCurrentObject2;
3649                     else
3650                         copyCurrentObject["Param4D_C"] = copyCurrentObject2;
3651                 }
3652                 else
3653                 {
3654                     insertat(IndexcurrentComponent, copyCurrentObject2, "Component", ui.paramNameEdit_2);
3655                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fx", ui.XEdit_2);
3656                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fy", ui.YEdit_2);
3657                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fz", ui.ZEdit_2);
3658                     insertat(IndexcurrentComponent, copyCurrentObject2, "Fw", ui.WEdit_2);
3659                     insertat(IndexcurrentComponent, copyCurrentObject2, "Umin", ui.umin_2);
3660                     insertat(IndexcurrentComponent, copyCurrentObject2, "Umax", ui.umax_2);
3661                     insertat(IndexcurrentComponent, copyCurrentObject2, "Vmin", ui.vmin_2);
3662                     insertat(IndexcurrentComponent, copyCurrentObject2, "Vmax", ui.vmax_2);
3663 
3664                     if(copyCurrentObject["Param4D"].isObject())
3665                         copyCurrentObject["Param4D"] = copyCurrentObject2;
3666                     else
3667                         copyCurrentObject["Param4D_C"] = copyCurrentObject2;
3668                 }
3669             }
3670         }
3671     }
3672 }
3673 
RunUpdatedJObject(QJsonObject & CurrentObject)3674 void DrawingOptions::RunUpdatedJObject(QJsonObject &CurrentObject)
3675 {
3676     if (IndexcurrentComponent != -1)
3677     {
3678         if (CurrentObject["Iso3D"].isObject())
3679         {
3680             CurrentObject.remove("Param3D");CurrentObject.remove("Param3D_C");
3681             CurrentObject.remove("Param4D");CurrentObject.remove("Param4D_C");
3682             CurrentObject.remove("ParIso");
3683             DrawJsonModel(CurrentObject);
3684         }
3685         else if (CurrentObject["Param3D"].isObject() || CurrentObject["Param3D_C"].isObject())
3686         {
3687             CurrentObject.remove("Iso3D");
3688             CurrentObject.remove("Param4D");CurrentObject.remove("Param4D_C");
3689             CurrentObject.remove("ParIso");
3690             DrawJsonModel(CurrentObject);
3691         }
3692         else if (CurrentObject["Param4D"].isObject() || CurrentObject["Param4D_C"].isObject())
3693         {
3694             CurrentObject.remove("Iso3D");
3695             CurrentObject.remove("Param3D");CurrentObject.remove("Param3D_C");
3696             CurrentObject.remove("ParIso");
3697             DrawJsonModel(CurrentObject);
3698         }
3699         else
3700         {
3701             CurrentObject.remove("Iso3D");
3702             CurrentObject.remove("Param3D");
3703             CurrentObject.remove("Param4D");
3704             CurrentObject.remove("Param3D_C");
3705             CurrentObject.remove("Param4D_C");
3706             DrawJsonModel(CurrentObject);
3707         }
3708     }
3709 }
3710 
on_updateButton_clicked()3711 void DrawingOptions::on_updateButton_clicked()
3712 {
3713     QJsonObject CurrentObject = MathmodRef->RootObjet.CurrentJsonObject;
3714     QJsonObject parisoComponent;
3715     if (CurrentObject["ParIso"].isArray())
3716     {
3717         QJsonArray listeObj = CurrentObject["ParIso"].toArray();
3718         QJsonArray listeIsoObj;
3719         QJsonArray listeParObj;
3720         for (int i = 0; i < listeObj.size(); i++)
3721             if ((listeObj[i].toObject())["Iso3D"].isObject())
3722                 listeIsoObj.append(listeObj[i].toObject());
3723             else
3724                 listeParObj.append(listeObj[i].toObject());
3725         int page = ui.parisocomboBox->currentIndex();
3726         if (page == 1) // Iso3D
3727         {
3728             parisoComponent = listeIsoObj[0].toObject();
3729             on_updateJObject(parisoComponent);
3730             QJsonArray newlisteObj;
3731             newlisteObj.append(parisoComponent);
3732             if (listeParObj.size() > 0)
3733                 newlisteObj.append(listeParObj[0].toObject());
3734             CurrentObject["ParIso"] = newlisteObj;
3735             RunUpdatedJObject(CurrentObject);
3736         }
3737         else if (page == 0)   // Param3D
3738         {
3739             parisoComponent = listeParObj[0].toObject();
3740             on_updateJObject(parisoComponent);
3741             QJsonArray newlisteObj;
3742             newlisteObj.append(parisoComponent);
3743             if (listeIsoObj.size() > 0)
3744                 newlisteObj.append(listeIsoObj[0].toObject());
3745             CurrentObject["ParIso"] = newlisteObj;
3746             RunUpdatedJObject(CurrentObject);
3747         }
3748     }
3749     else
3750     {
3751         CurrentObject.remove("ParIso");
3752         on_updateJObject(CurrentObject);
3753         RunUpdatedJObject(CurrentObject);
3754     }
3755 }
3756 
on_updateParam_clicked()3757 void DrawingOptions::on_updateParam_clicked()
3758 {
3759     on_updateButton_clicked();
3760 }
3761 
on_actionPolygonWavefront_obj_triggered()3762 void DrawingOptions::on_actionPolygonWavefront_obj_triggered()
3763 {
3764     MathmodRef->SaveSceneAsObjPoly();
3765 }
3766 
on_actionColorPolygonWavefront_obj_triggered()3767 void DrawingOptions::on_actionColorPolygonWavefront_obj_triggered()
3768 {
3769     MathmodRef->SaveSceneAsObjPoly(1);
3770 }
3771 
on_linecolumn_2_valueChanged(int value)3772 void DrawingOptions::on_linecolumn_2_valueChanged(int value)
3773 {
3774     ui.ParamgroupBox_2->setTitle("Grid(u,v)/MaxGrid = (" + QString::number(value) +
3775                                  ", " + QString::number(value) +") / "+QString::number(Parameters->ParMaxGrid));
3776     if (!MathmodRef->ParObjet->isRunning())
3777     {
3778         (MathmodRef->RootObjet.CurrentJsonObject["ParIso"].isArray()) ?
3779         MathmodRef->linecolumn_valueChanged(value, PARISO_TYPE) : MathmodRef->linecolumn_valueChanged(value, PAR_TYPE);
3780     }
3781     else
3782     {
3783         ui.uv->blockSignals(true);
3784         ui.uv->setChecked(false);
3785         ui.uv->blockSignals(false);
3786         MathmodRef->uvactivated = -1;
3787     }
3788 }
3789 
on_lineScrollBar_valueChanged(int value)3790 void DrawingOptions::on_lineScrollBar_valueChanged(int value)
3791 {
3792     ui.ParamgroupBox_2->setTitle(
3793         "Grid(u,v)/MaxGrid = (" + QString::number(value) + ", " +
3794         QString::number(MathmodRef->ParObjet->Ugrid) +") / "+QString::number(Parameters->ParMaxGrid));
3795     if (!MathmodRef->ParObjet->isRunning())
3796     {
3797         MathmodRef->line_valueChanged(value);
3798     }
3799     else
3800     {
3801         ui.uv->blockSignals(true);
3802         ui.uv->setChecked(false);
3803         ui.uv->blockSignals(false);
3804         MathmodRef->uvactivated = -1;
3805     }
3806 }
3807 
on_coloneScrollBar_valueChanged(int value)3808 void DrawingOptions::on_coloneScrollBar_valueChanged(int value)
3809 {
3810     ui.ParamgroupBox_2->setTitle(
3811         "Param Grid(u,v)/MaxGrid = (" +
3812         QString::number(MathmodRef->ParObjet->Vgrid) + ", " +
3813         QString::number(value) +") / "+QString::number(Parameters->ParMaxGrid));
3814     if (!MathmodRef->ParObjet->isRunning())
3815     {
3816         MathmodRef->column_valueChanged(value);
3817     }
3818     else
3819     {
3820         ui.uv->blockSignals(true);
3821         ui.uv->setChecked(false);
3822         ui.uv->blockSignals(false);
3823         MathmodRef->uvactivated = -1;
3824     }
3825 }
3826 
on_IsoComponent_activated(int index)3827 void DrawingOptions::on_IsoComponent_activated(int index)
3828 {
3829     UpdateDescription(index, ISO_TYPE, MathmodRef->RootObjet.CurrentTreestruct);
3830     updateShowIsoCmp(index);
3831 }
updateShowParComp(int index)3832 void DrawingOptions::updateShowParComp(int index)
3833 {
3834     if(MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[index])
3835     {
3836         ui.ShowParComp->setChecked(true);
3837         ui.ShowParComp->setText("Hide");
3838     }
3839     else
3840     {
3841         ui.ShowParComp->setChecked(false);
3842         ui.ShowParComp->setText("Show");
3843     }
3844 }
updateShowIsoCmp(int index)3845 void DrawingOptions::updateShowIsoCmp(int index)
3846 {
3847     uint idx=0;
3848     if(!MathmodRef->LocalScene.componentsinfos.pariso)
3849         idx = index;
3850     else
3851         idx = MathmodRef->LocalScene.componentsinfos.NbComponentsType[0]+index;
3852     if(MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[idx])
3853     {
3854         ui.ShowIsoComp->setChecked(true);
3855         ui.ShowIsoComp->setText("Hide");
3856     }
3857     else
3858     {
3859         ui.ShowIsoComp->setChecked(false);
3860         ui.ShowIsoComp->setText("Show");
3861     }
3862 }
on_ParamComponent_activated(int index)3863 void DrawingOptions::on_ParamComponent_activated(int index)
3864 {
3865     UpdateDescription(index, PAR_TYPE, MathmodRef->RootObjet.CurrentTreestruct);
3866     updateShowParComp(index);
3867 }
3868 
on_xyzcheckBox2_clicked()3869 void DrawingOptions::on_xyzcheckBox2_clicked()
3870 {
3871     MathmodRef->LocalScene.animxyz *= -1;
3872 }
3873 
on_xycheckBox2_clicked()3874 void DrawingOptions::on_xycheckBox2_clicked()
3875 {
3876     MathmodRef->LocalScene.animx *= -1;
3877 }
3878 
on_xyhorizontalScrollBar2_valueChanged(int value)3879 void DrawingOptions::on_xyhorizontalScrollBar2_valueChanged(int value)
3880 {
3881     MathmodRef->LocalScene.animxValueStep = float(value) / 4;
3882 }
3883 
on_xzcheckBox2_clicked()3884 void DrawingOptions::on_xzcheckBox2_clicked()
3885 {
3886     MathmodRef->LocalScene.animy *= -1;
3887 }
3888 
on_xzhorizontalScrollBar2_valueChanged(int value)3889 void DrawingOptions::on_xzhorizontalScrollBar2_valueChanged(int value)
3890 {
3891     MathmodRef->LocalScene.animyValueStep = float(value) / 4;
3892 }
3893 
on_yzcheckBox2_clicked()3894 void DrawingOptions::on_yzcheckBox2_clicked()
3895 {
3896     MathmodRef->LocalScene.animz *= -1;
3897 }
3898 
on_yzhorizontalScrollBar2_valueChanged(int value)3899 void DrawingOptions::on_yzhorizontalScrollBar2_valueChanged(int value)
3900 {
3901     MathmodRef->LocalScene.animzValueStep = float(value) / 4;
3902 }
3903 
on_InitMatrix_2_clicked()3904 void DrawingOptions::on_InitMatrix_2_clicked()
3905 {
3906     MathmodRef->LocalScene.RotStrength =
3907         MathmodRef->LocalScene.animxValueStep =
3908             MathmodRef->LocalScene.animyValueStep =
3909                 MathmodRef->LocalScene.animzValueStep = 0.0;
3910 }
3911 
on_xycheckBox_clicked()3912 void DrawingOptions::on_xycheckBox_clicked()
3913 {
3914     MathmodRef->ParObjet->tetaxy_ok *= -1;
3915 }
3916 
on_xyhorizontalScrollBar_valueChanged(int value)3917 void DrawingOptions::on_xyhorizontalScrollBar_valueChanged(int value)
3918 {
3919     MathmodRef->ParObjet->tetaxy = value / 4.0;
3920 }
3921 
on_xzcheckBox_clicked()3922 void DrawingOptions::on_xzcheckBox_clicked()
3923 {
3924     MathmodRef->ParObjet->tetaxz_ok *= -1;
3925 }
3926 
on_xzhorizontalScrollBar_valueChanged(int value)3927 void DrawingOptions::on_xzhorizontalScrollBar_valueChanged(int value)
3928 {
3929     MathmodRef->ParObjet->tetaxz = value / 4.0;
3930 }
3931 
on_yzcheckBox_clicked()3932 void DrawingOptions::on_yzcheckBox_clicked()
3933 {
3934     MathmodRef->ParObjet->tetayz_ok *= -1;
3935 }
3936 
on_yzhorizontalScrollBar_valueChanged(int value)3937 void DrawingOptions::on_yzhorizontalScrollBar_valueChanged(int value)
3938 {
3939     MathmodRef->ParObjet->tetayz = value / 4.0;
3940 }
3941 
on_xwcheckBox_clicked()3942 void DrawingOptions::on_xwcheckBox_clicked()
3943 {
3944     MathmodRef->ParObjet->tetaxw_ok *= -1;
3945 }
3946 
on_xwhorizontalScrollBar_valueChanged(int value)3947 void DrawingOptions::on_xwhorizontalScrollBar_valueChanged(int value)
3948 {
3949     MathmodRef->ParObjet->tetaxw = value / 4.0;
3950 }
3951 
on_ywcheckBox_clicked()3952 void DrawingOptions::on_ywcheckBox_clicked()
3953 {
3954     MathmodRef->ParObjet->tetayw_ok *= -1;
3955 }
3956 
on_ywhorizontalScrollBar_valueChanged(int value)3957 void DrawingOptions::on_ywhorizontalScrollBar_valueChanged(int value)
3958 {
3959     MathmodRef->ParObjet->tetayw = value / 4.0;
3960 }
3961 
on_zwcheckBox_clicked()3962 void DrawingOptions::on_zwcheckBox_clicked()
3963 {
3964     MathmodRef->ParObjet->tetazw_ok *= -1;
3965 }
3966 
on_zwhorizontalScrollBar_valueChanged(int value)3967 void DrawingOptions::on_zwhorizontalScrollBar_valueChanged(int value)
3968 {
3969     MathmodRef->ParObjet->tetazw = value / 4.0;
3970 }
3971 
on_linecolumn_3_valueChanged(int value)3972 void DrawingOptions::on_linecolumn_3_valueChanged(int value)
3973 {
3974     ui.ParamgroupBox_3->setTitle("Grid(u,v)/MaxGrid = (" + QString::number(value) +
3975                                  ", " + QString::number(value) +") / "+QString::number(Parameters->ParMaxGrid));
3976     if (!MathmodRef->ParObjet->isRunning())
3977     {
3978         MathmodRef->linecolumn_valueChanged_2(value);
3979     }
3980     else
3981     {
3982         ui.uv4D->blockSignals(true);
3983         ui.uv4D->setChecked(false);
3984         ui.uv4D->blockSignals(false);
3985         MathmodRef->uvactivated4D = -1;
3986     }
3987 }
3988 
oncolor_4activated(int index)3989 void DrawingOptions::oncolor_4activated(int index)
3990 {
3991     MathmodRef->colorstypeParam(index);
3992 }
3993 
on_uv4D_clicked()3994 void DrawingOptions::on_uv4D_clicked()
3995 {
3996     MathmodRef->slot_uv4D_clicked();
3997 }
3998 
on_uv_clicked()3999 void DrawingOptions::on_uv_clicked()
4000 {
4001     (MathmodRef->RootObjet.CurrentJsonObject["ParIso"].isArray()) ?
4002     MathmodRef->slot_uv_clicked(PARISO_TYPE) : MathmodRef->slot_uv_clicked(PAR_TYPE);
4003 }
4004 
on_InitMatrix_clicked()4005 void DrawingOptions::on_InitMatrix_clicked()
4006 {
4007     MathmodRef->ParObjet->mat4D.unit();
4008     on_calculate_clicked();
4009 }
4010 
on_ActivateCND_clicked(bool checked)4011 void DrawingOptions::on_ActivateCND_clicked(bool checked)
4012 {
4013     ui.CNDgroupBox->setEnabled(checked);
4014     MathmodRef->LocalScene.activarecnd = checked;
4015     MathmodRef->update();
4016 }
4017 
on_TCNDcheckBox_clicked(bool checked)4018 void DrawingOptions::on_TCNDcheckBox_clicked(bool checked)
4019 {
4020     MathmodRef->LocalScene.cndoptions[3] = checked;
4021     MathmodRef->update();
4022 }
4023 
on_FCNDcheckBox_clicked(bool checked)4024 void DrawingOptions::on_FCNDcheckBox_clicked(bool checked)
4025 {
4026     MathmodRef->LocalScene.cndoptions[0] = checked;
4027     MathmodRef->update();
4028 }
4029 
on_TNCNDcheckBox_clicked(bool checked)4030 void DrawingOptions::on_TNCNDcheckBox_clicked(bool checked)
4031 {
4032     MathmodRef->LocalScene.cndoptions[4] = checked;
4033     MathmodRef->update();
4034 }
4035 
on_FNCNDcheckBox_clicked(bool checked)4036 void DrawingOptions::on_FNCNDcheckBox_clicked(bool checked)
4037 {
4038     MathmodRef->LocalScene.cndoptions[1] = checked;
4039     MathmodRef->update();
4040 }
4041 
on_TBordercheckBox_clicked(bool checked)4042 void DrawingOptions::on_TBordercheckBox_clicked(bool checked)
4043 {
4044     MathmodRef->LocalScene.cndoptions[2] = checked;
4045     MathmodRef->update();
4046 }
4047 
on_actionMesh_triggered()4048 void DrawingOptions::on_actionMesh_triggered()
4049 {
4050     MathmodRef->Mesh();
4051 }
4052 
on_calculate_clicked()4053 void DrawingOptions::on_calculate_clicked()
4054 {
4055     on_InitTButton_clicked();
4056     Run_JsonObject_activeted();
4057 }
4058 
on_actionAbout_2_triggered()4059 void DrawingOptions::on_actionAbout_2_triggered()
4060 {
4061     ab.show();
4062 }
4063 
on_actionLoad_json_script_triggered()4064 void DrawingOptions::on_actionLoad_json_script_triggered()
4065 {
4066     LoadNewFileModels(true);
4067 }
4068 
on_actionScreenshot_triggered()4069 void DrawingOptions::on_actionScreenshot_triggered()
4070 {
4071     videoplay();
4072 }
4073 
on_actionEditor_triggered()4074 void DrawingOptions::on_actionEditor_triggered()
4075 {
4076     editorwin();
4077 }
4078 
on_actionColors_triggered()4079 void DrawingOptions::on_actionColors_triggered()
4080 {
4081     colorsoptions();
4082 }
4083 
on_Infos_clicked()4084 void DrawingOptions::on_Infos_clicked()
4085 {
4086     MathmodRef->iso_infos();
4087 }
4088 
on_Mesh_clicked()4089 void DrawingOptions::on_Mesh_clicked()
4090 {
4091     MathmodRef->Mesh();
4092 }
4093 
on_Fill_clicked()4094 void DrawingOptions::on_Fill_clicked()
4095 {
4096     MathmodRef->fill();
4097 }
4098 
on_Trian_clicked()4099 void DrawingOptions::on_Trian_clicked()
4100 {
4101     MathmodRef->slot_triangles_clicked();
4102 }
4103 
on_actionOpenGL_triggered()4104 void DrawingOptions::on_actionOpenGL_triggered()
4105 {
4106     Parameters->on_loadconfig_clicked();
4107     Parameters->show();
4108 }
4109 
on_cut_clicked()4110 void DrawingOptions::on_cut_clicked()
4111 {
4112     if (ui.IsoComponent->count() > 1)
4113     {
4114         ui.isoNameEdit->setText("");
4115         on_updateButton_clicked();
4116     }
4117     else
4118     {
4119         QMessageBox msgBox;
4120         msgBox.setText("Only one component in this mathematical model.");
4121         msgBox.exec();
4122     }
4123 }
4124 
on_actionConvert_K3DS_script_triggered()4125 void DrawingOptions::on_actionConvert_K3DS_script_triggered()
4126 {
4127     LoadK3DSurfScript("", 1);
4128 }
4129 
on_actionConfiguration_triggered()4130 void DrawingOptions::on_actionConfiguration_triggered()
4131 {
4132     on_actionOpenGL_triggered();
4133 }
4134 
on_actionColors_2_triggered()4135 void DrawingOptions::on_actionColors_2_triggered()
4136 {
4137     on_actionColors_triggered();
4138 }
4139 
on_Load_clicked()4140 void DrawingOptions::on_Load_clicked()
4141 {
4142     LoadNewFileModels(true);
4143 }
4144 
on_ParamComponent_2_activated(int index)4145 void DrawingOptions::on_ParamComponent_2_activated(int index)
4146 {
4147     UpdateDescription(index, PAR_4D_TYPE,
4148                       MathmodRef->RootObjet.CurrentTreestruct);
4149 }
4150 
on_updateParam_2_clicked()4151 void DrawingOptions::on_updateParam_2_clicked()
4152 {
4153     on_updateButton_clicked();
4154 }
4155 
Multiplier(int x,int y,int z,QJsonObject & iso,int index)4156 void DrawingOptions::Multiplier(int x, int y, int z, QJsonObject &iso,
4157                                 int index)
4158 {
4159     QString Minx, Miny, Minz, Maxx, Maxy, Maxz;
4160     QString Difx, Dify, Difz;
4161     QString componentName, fct, cnd, grid;
4162     QJsonArray oldminx, oldminy, oldminz, oldmaxx, oldmaxy, oldmaxz, oldcmpname,
4163                oldfxyz, oldcnd, oldgrid;
4164     bool cndb = false;
4165     bool gridb = false;
4166     oldminx = iso["Iso3D"].toObject()["Xmin"].toArray();
4167     oldminy = iso["Iso3D"].toObject()["Ymin"].toArray();
4168     oldminz = iso["Iso3D"].toObject()["Zmin"].toArray();
4169     oldmaxx = iso["Iso3D"].toObject()["Xmax"].toArray();
4170     oldmaxy = iso["Iso3D"].toObject()["Ymax"].toArray();
4171     oldmaxz = iso["Iso3D"].toObject()["Zmax"].toArray();
4172     oldcmpname = iso["Iso3D"].toObject()["Component"].toArray();
4173     oldfxyz = iso["Iso3D"].toObject()["Fxyz"].toArray();
4174     if ((gridb = (iso["Iso3D"].toObject()["Grid"].isArray())))
4175         grid =
4176             (oldgrid = iso["Iso3D"].toObject()["Grid"].toArray())[index].toString();
4177     if ((cndb = (iso["Iso3D"].toObject()["Cnd"].isArray())))
4178         cnd = (oldcnd = iso["Iso3D"].toObject()["Cnd"].toArray())[index].toString();
4179     componentName = oldcmpname[index].toString();
4180     fct = oldfxyz[index].toString();
4181     Minx = "(" + oldminx[index].toString() + ")";
4182     Miny = "(" + oldminy[index].toString() + ")";
4183     Minz = "(" + oldminz[index].toString() + ")";
4184     Maxx = "(" + oldmaxx[index].toString() + ")";
4185     Maxy = "(" + oldmaxy[index].toString() + ")";
4186     Maxz = "(" + oldmaxz[index].toString() + ")";
4187     Difx = "((" + Maxx + "-" + Minx + ")/" + QString::number(x) + ")";
4188     Dify = "((" + Maxy + "-" + Miny + ")/" + QString::number(y) + ")";
4189     Difz = "((" + Maxz + "-" + Minz + ")/" + QString::number(z) + ")";
4190     int l = 0;
4191     for (int i = 0; i < x; i++)
4192         for (int j = 0; j < y; j++)
4193             for (int k = 0; k < z; k++)
4194             {
4195                 oldminx.append(Minx + "+" + QString::number(i) + "*" + Difx);
4196                 oldmaxx.append(Minx + "+" + QString::number(i + 1) + "*" + Difx);
4197                 oldminy.append(Miny + "+" + QString::number(j) + "*" + Dify);
4198                 oldmaxy.append(Miny + "+" + QString::number(j + 1) + "*" + Dify);
4199                 oldminz.append(Minz + "+" + QString::number(k) + "*" + Difz);
4200                 oldmaxz.append(Minz + "+" + QString::number(k + 1) + "*" + Difz);
4201                 oldcmpname.append(componentName + QString::number(l));
4202                 oldfxyz.append(fct);
4203                 if (cndb)
4204                     oldcnd.append(cnd);
4205                 if (gridb)
4206                     oldgrid.append(grid);
4207                 l++;
4208             }
4209     oldminx.removeAt(index);
4210     oldminy.removeAt(index);
4211     oldminz.removeAt(index);
4212     oldmaxx.removeAt(index);
4213     oldmaxy.removeAt(index);
4214     oldmaxz.removeAt(index);
4215     oldcmpname.removeAt(index);
4216     oldfxyz.removeAt(index);
4217     if (cndb)
4218         oldcnd.removeAt(index);
4219     if (gridb)
4220         oldgrid.removeAt(index);
4221     QJsonObject tmp = iso["Iso3D"].toObject();
4222     tmp["Xmin"] = oldminx;
4223     tmp["Ymin"] = oldminy;
4224     tmp["Zmin"] = oldminz;
4225     tmp["Xmax"] = oldmaxx;
4226     tmp["Ymax"] = oldmaxy;
4227     tmp["Zmax"] = oldmaxz;
4228     tmp["Component"] = oldcmpname;
4229     tmp["Fxyz"] = oldfxyz;
4230     if (cndb)
4231         tmp["Cnd"] = oldcnd;
4232     if (gridb)
4233         tmp["Grid"] = oldgrid;
4234     iso["Iso3D"] = tmp;
4235 }
4236 
on_Multiplier_clicked()4237 void DrawingOptions::on_Multiplier_clicked()
4238 {
4239     int i = ui.xcomboBox->currentIndex(), j = ui.ycomboBox->currentIndex(),
4240         k = ui.zcomboBox->currentIndex();
4241     if (i > 0 && j > 0 && k > 0)
4242     {
4243         QJsonObject copyCurrentObject = MathmodRef->RootObjet.CurrentJsonObject;
4244         // Erase unused Keys:
4245         copyCurrentObject.remove("Param3D");
4246         copyCurrentObject.remove("Param4D");
4247         copyCurrentObject.remove("Param3D_C");
4248         copyCurrentObject.remove("Param4D_C");
4249         Multiplier(i, j, k, copyCurrentObject, IndexcurrentComponent);
4250         // Draw here
4251         DrawJsonModel(copyCurrentObject);
4252     }
4253     // Init Combo
4254     ui.xcomboBox->setCurrentIndex(0);
4255     ui.ycomboBox->setCurrentIndex(0);
4256     ui.zcomboBox->setCurrentIndex(0);
4257 }
4258 
UpdateGuiMaxgrid()4259 void DrawingOptions::UpdateGuiMaxgrid()
4260 {
4261     int maxgrd = int(Parameters->IsoMaxGrid);
4262     ui.xyzg->blockSignals(true);
4263     ui.xyzg->setMaximum(maxgrd);
4264     ui.xyzg->setValue(int(Parameters->InitIsoGrid));
4265     ui.xyzg->blockSignals(false);
4266     ui.linecolumn_2->blockSignals(true);
4267     ui.linecolumn_2->setMaximum(int(Parameters->ParMaxGrid));
4268     ui.linecolumn_2->setValue(int(Parameters->InitParGrid));
4269     ui.linecolumn_2->blockSignals(false);
4270     ui.linecolumn_3->blockSignals(true);
4271     ui.linecolumn_3->setMaximum(int(Parameters->ParMaxGrid));
4272     ui.linecolumn_3->setValue(int(Parameters->InitParGrid));
4273     ui.linecolumn_3->blockSignals(false);
4274 }
4275 
UpdateGui(int argc)4276 void DrawingOptions::UpdateGui(int argc)
4277 {
4278     UpdateGuiMaxgrid();
4279     ListeModelTexture LstModelTexture = (Parameters->LoadCollectionModels(
4280             JSONMathModels, MathmodRef->collection, argc));
4281     // Load the script containing isosurface and parametric formulas:
4282     ui.choice->insertItems(0, LstModelTexture.listeModels);
4283     ui.comboBoxTexture->insertItems(0, LstModelTexture.listeTextures);
4284     ui.comboBoxPigment->insertItems(0, LstModelTexture.listePigments);
4285     AddListModels();
4286     // Threads setting:
4287     SetThreadValues(Parameters->Threads);
4288     // OpenGl specular:
4289     SetSpecularValues(Parameters->Specular);
4290     // OpenGl shininess:
4291     SetShininessValue(Parameters->Shininess);
4292     // OpenGl diffuse:
4293     SetDiffuseValues(Parameters->Diffuse);
4294     // OpenGl Ambient:
4295     SetAmbientValues(Parameters->Ambient);
4296     // Gl Front Face Suupport
4297     if(!Parameters->glFrontFacingSupport)
4298         SetglFrontFacingSupport();
4299     // Show the two windows of the application:
4300     move(Parameters->ControlX, Parameters->ControlY);
4301     resize(Parameters->ControlW, Parameters->ControlH);
4302     // ui.CndGroupBox->hide();
4303     // ui.NameLabel->hide();
4304     MathmodRef->move(Parameters->GlwinX, Parameters->GlwinY);
4305     MathmodRef->resize(Parameters->GlwinW, Parameters->GlwinH);
4306     //MathmodRef->setFixedSize(Parameters->GlwinW, Parameters->GlwinH);
4307     // Pigment/texture
4308     ui.textureEdit->hide();
4309     // Hide all sliders
4310     HideSliders();
4311     // ProgressBar + text informations (set to minimum size 0)
4312     QList<int> Sizes;
4313     Sizes << 500 << 300;
4314     ui.splitter_6->setSizes(Sizes);
4315     ui.Messagetext->setFontPointSize(10);
4316 }
4317 
on_TimeStepScrollBar_valueChanged(int value)4318 void DrawingOptions::on_TimeStepScrollBar_valueChanged(int value)
4319 {
4320     double P = 1.0 / double(value);
4321     uint maxnbthreads = MathmodRef->IsoObjet->WorkerThreadsNumber;
4322     ui.label_5->setText("1/" + QString::number(value));
4323     MathmodRef->IsoObjet->masterthread->pace = P;
4324     for (uint nbthreds = 0; nbthreds < maxnbthreads - 1; nbthreds++)
4325         MathmodRef->IsoObjet->workerthreads[nbthreds].pace = P;
4326     MathmodRef->ParObjet->masterthread->pace = P;
4327     for (uint nbthreds = 0; nbthreds < maxnbthreads - 1; nbthreds++)
4328         MathmodRef->ParObjet->workerthreads[nbthreds].pace = P;
4329 }
4330 
on_InitTButton_clicked()4331 void DrawingOptions::on_InitTButton_clicked()
4332 {
4333     uint maxnbthreads = MathmodRef->IsoObjet->WorkerThreadsNumber;
4334     MathmodRef->IsoObjet->masterthread->stepMorph = 0;
4335     for (uint nbthreds = 0; nbthreds < maxnbthreads - 1; nbthreds++)
4336         MathmodRef->IsoObjet->workerthreads[nbthreds].stepMorph = 0;
4337     MathmodRef->ParObjet->masterthread->stepMorph = 0;
4338     for (uint nbthreds = 0; nbthreds < maxnbthreads - 1; nbthreds++)
4339         MathmodRef->ParObjet->workerthreads[nbthreds].stepMorph = 0;
4340 }
4341 
ShowErrorMessage(QJsonParseError & err,QString & script)4342 void DrawingOptions::ShowErrorMessage(QJsonParseError &err, QString &script)
4343 {
4344     QString sortie;
4345     QMessageBox message;
4346     message.setWindowTitle("Error at : ");
4347     sortie = (script);
4348     int before, after;
4349     if (sortie.length() > (err.offset + 30))
4350         after = 30;
4351     else
4352         after = sortie.length() - err.offset;
4353     sortie.truncate(err.offset + after);
4354     if (err.offset - 30 > 0)
4355         before = 30;
4356     else
4357         before = 0;
4358     sortie = sortie.remove(0, err.offset - before);
4359     sortie.replace("\t", " ");
4360     sortie.replace("\n", " ");
4361     sortie.insert(before, " >>> Error <<< ");
4362     message.setText("Error : " + err.errorString() +
4363                     " at position: " + QString::number(err.offset) +
4364                     "\n\n***********\n" + "..." + sortie + "...");
4365     message.adjustSize();
4366     message.exec();
4367     return;
4368 }
4369 
on_pushButton_2_clicked()4370 void DrawingOptions::on_pushButton_2_clicked()
4371 {
4372     QJsonParseError err;
4373     QString sortie;
4374     QString script =
4375         ui.ParamEdit->toPlainText().trimmed().replace("\n", "").replace("\t", "").replace("DOTSYMBOL", Parameters->dotsymbol.toStdString().c_str());
4376     QJsonDocument doc = QJsonDocument::fromJson(script.toUtf8(), &err);
4377     if (err.error)
4378     {
4379         ShowErrorMessage(err, script);
4380         return;
4381     }
4382     Parameters->SaveToFile_CurentMathModel(doc.object());
4383 }
4384 
on_pushButton_3_clicked()4385 void DrawingOptions::on_pushButton_3_clicked()
4386 {
4387     ui.isoNameEdit->setText(ui.isoNameEdit->toPlainText() + "_01");
4388     on_updateButton_clicked();
4389 }
4390 
on_cut_2_clicked()4391 void DrawingOptions::on_cut_2_clicked()
4392 {
4393     if (ui.ParamComponent->count() > 1)
4394     {
4395         ui.paramNameEdit->setText("");
4396         on_updateButton_clicked();
4397     }
4398     else
4399     {
4400         QMessageBox msgBox;
4401         msgBox.setText("Only one component in this mathematical model.");
4402         msgBox.exec();
4403     }
4404 }
4405 
on_pushButton_4_clicked()4406 void DrawingOptions::on_pushButton_4_clicked()
4407 {
4408     ui.paramNameEdit->setText(ui.paramNameEdit->toPlainText() + "_01");
4409     on_updateButton_clicked();
4410 }
4411 
on_color_5_activated(int index)4412 void DrawingOptions::on_color_5_activated(int index)
4413 {
4414     MathmodRef->colorstypeParIso(index);
4415 }
4416 
on_transparent_ParIso_valueChanged(int value)4417 void DrawingOptions::on_transparent_ParIso_valueChanged(int value)
4418 {
4419     MathmodRef->transparency(value, IndexcurrentComponent);
4420 }
4421 
on_comboBoxTexture_activated(int index)4422 void DrawingOptions::on_comboBoxTexture_activated(int index)
4423 {
4424     QJsonObject tmp;
4425     tmp = MathmodRef->RootObjet.CurrentJsonObject;
4426 
4427     if (index > 0)
4428     {
4429         QJsonDocument document;
4430         document.setObject(MathmodRef->collection.JTextures[index - 1].toObject());
4431         ui.textureEdit->setText(QString(document.toJson()));
4432         DrawJsonModel(tmp, index - 1);
4433     }
4434     return;
4435 }
4436 
on_comboBoxPigment_activated(int index)4437 void DrawingOptions::on_comboBoxPigment_activated(int index)
4438 {
4439     QJsonObject tmp;
4440     tmp = MathmodRef->RootObjet.CurrentJsonObject;
4441     if (index > 0)
4442     {
4443         QJsonDocument document;
4444         document.setObject(MathmodRef->collection.JPigments[index - 1].toObject());
4445         ui.textureEdit->setText(QString(document.toJson()));
4446         DrawJsonModel(tmp, 1000 + index - 1);
4447     }
4448     return;
4449 }
4450 
on_actionTrianglesWavefront_obj_triggered()4451 void DrawingOptions::on_actionTrianglesWavefront_obj_triggered()
4452 {
4453     MathmodRef->SaveSceneAsObjTrian();
4454 }
4455 
on_actionColorTrianglesWavefront_obj_triggered()4456 void DrawingOptions::on_actionColorTrianglesWavefront_obj_triggered()
4457 {
4458     MathmodRef->SaveSceneAsObjTrian(1);
4459 }
4460 
on_ShowtextureScript_clicked()4461 void DrawingOptions::on_ShowtextureScript_clicked()
4462 {
4463     static int show = -1;
4464     show *= -1;
4465     if (show == 1)
4466     {
4467         ui.textureEdit->show();
4468         ui.ShowtextureScript->setText("Hide Script");
4469     }
4470     else
4471     {
4472         ui.textureEdit->hide();
4473         ui.ShowtextureScript->setText("Show Script");
4474     }
4475 }
4476 
on_pushButton_5_clicked()4477 void DrawingOptions::on_pushButton_5_clicked()
4478 {
4479     QJsonParseError err;
4480     QString sortie;
4481     QString script = ui.textureEdit->toPlainText().trimmed().replace("\n", "").replace("\t", "").replace("DOTSYMBOL", Parameters->dotsymbol.toStdString().c_str());
4482     QJsonDocument doc = QJsonDocument::fromJson(script.toUtf8(), &err);
4483     if (err.error)
4484     {
4485         ShowErrorMessage(err, script);
4486         return;
4487     }
4488     QJsonObject tmp = doc.object();
4489     if (tmp["Texture"].isObject())
4490     {
4491         MathmodRef->collection.JTextures[ui.comboBoxTexture->currentIndex() - 1] =doc.object();
4492         on_comboBoxTexture_activated(ui.comboBoxTexture->currentIndex());
4493     }
4494     else
4495     {
4496         MathmodRef->collection.JPigments[ui.comboBoxPigment->currentIndex() - 1] =doc.object();
4497         on_comboBoxPigment_activated(ui.comboBoxPigment->currentIndex());
4498     }
4499 }
4500 
on_C1ScrollBar_valueChanged(int val)4501 void DrawingOptions::on_C1ScrollBar_valueChanged(int val)
4502 {
4503     CScrollBar_valueChanged(val, 0);
4504 }
4505 
on_C2ScrollBar_valueChanged(int val)4506 void DrawingOptions::on_C2ScrollBar_valueChanged(int val)
4507 {
4508     CScrollBar_valueChanged(val, 1);
4509 }
4510 
on_C3ScrollBar_valueChanged(int val)4511 void DrawingOptions::on_C3ScrollBar_valueChanged(int val)
4512 {
4513     CScrollBar_valueChanged(val, 2);
4514 }
4515 
on_C4ScrollBar_valueChanged(int val)4516 void DrawingOptions::on_C4ScrollBar_valueChanged(int val)
4517 {
4518     CScrollBar_valueChanged(val, 3);
4519 }
4520 
on_C5ScrollBar_valueChanged(int val)4521 void DrawingOptions::on_C5ScrollBar_valueChanged(int val)
4522 {
4523     CScrollBar_valueChanged(val, 4);
4524 }
4525 
on_C6ScrollBar_valueChanged(int val)4526 void DrawingOptions::on_C6ScrollBar_valueChanged(int val)
4527 {
4528     CScrollBar_valueChanged(val, 5);
4529 }
4530 
on_C7ScrollBar_valueChanged(int val)4531 void DrawingOptions::on_C7ScrollBar_valueChanged(int val)
4532 {
4533     CScrollBar_valueChanged(val, 6);
4534 }
4535 
on_C8ScrollBar_valueChanged(int val)4536 void DrawingOptions::on_C8ScrollBar_valueChanged(int val)
4537 {
4538     CScrollBar_valueChanged(val, 7);
4539 }
4540 
on_C9ScrollBar_valueChanged(int val)4541 void DrawingOptions::on_C9ScrollBar_valueChanged(int val)
4542 {
4543     CScrollBar_valueChanged(val, 8);
4544 }
4545 
on_C10ScrollBar_valueChanged(int val)4546 void DrawingOptions::on_C10ScrollBar_valueChanged(int val)
4547 {
4548     CScrollBar_valueChanged(val, 9);
4549 }
4550 
on_C11ScrollBar_valueChanged(int val)4551 void DrawingOptions::on_C11ScrollBar_valueChanged(int val)
4552 {
4553     CScrollBar_valueChanged(val, 10);
4554 }
4555 
on_C12ScrollBar_valueChanged(int val)4556 void DrawingOptions::on_C12ScrollBar_valueChanged(int val)
4557 {
4558     CScrollBar_valueChanged(val, 11);
4559 }
4560 
on_C13ScrollBar_valueChanged(int val)4561 void DrawingOptions::on_C13ScrollBar_valueChanged(int val)
4562 {
4563     CScrollBar_valueChanged(val, 12);
4564 }
4565 
on_C14ScrollBar_valueChanged(int val)4566 void DrawingOptions::on_C14ScrollBar_valueChanged(int val)
4567 {
4568     CScrollBar_valueChanged(val, 13);
4569 }
4570 
on_C15ScrollBar_valueChanged(int val)4571 void DrawingOptions::on_C15ScrollBar_valueChanged(int val)
4572 {
4573     CScrollBar_valueChanged(val, 14);
4574 }
4575 
on_C16ScrollBar_valueChanged(int val)4576 void DrawingOptions::on_C16ScrollBar_valueChanged(int val)
4577 {
4578     CScrollBar_valueChanged(val, 15);
4579 }
4580 
on_C17ScrollBar_valueChanged(int val)4581 void DrawingOptions::on_C17ScrollBar_valueChanged(int val)
4582 {
4583     CScrollBar_valueChanged(val, 16);
4584 }
4585 
on_C18ScrollBar_valueChanged(int val)4586 void DrawingOptions::on_C18ScrollBar_valueChanged(int val)
4587 {
4588     CScrollBar_valueChanged(val, 17);
4589 }
4590 
on_C19ScrollBar_valueChanged(int val)4591 void DrawingOptions::on_C19ScrollBar_valueChanged(int val)
4592 {
4593     CScrollBar_valueChanged(val, 18);
4594 }
4595 
on_C20ScrollBar_valueChanged(int val)4596 void DrawingOptions::on_C20ScrollBar_valueChanged(int val)
4597 {
4598     CScrollBar_valueChanged(val, 19);
4599 }
4600 
CScrollBar_valueChanged(int val,int idx)4601 void DrawingOptions::CScrollBar_valueChanged(int val, int idx)
4602 {
4603     MathmodRef->LocalScene.slider = 1;
4604     MathmodRef->IsoObjet->masterthread->SliderValues[uint(idx)] =val;
4605     MathmodRef->ParObjet->masterthread->SliderValues[uint(idx)] =val;
4606     SliderArray[idx].SliderLabel->setText(qlstnames.at(idx) + " = " +QString::number(val));
4607     if (CurrentFormulaType == 2)
4608         MathmodRef->ProcessNewIsoSurface();
4609     else
4610         MathmodRef->ParametricSurfaceProcess(CurrentFormulaType);
4611     MathmodRef->LocalScene.slider = -1;
4612 }
4613 
on_PredefinedSets_activated(int index)4614 void DrawingOptions::on_PredefinedSets_activated(int index)
4615 {
4616     indexcurrentSet = index;
4617     if (index > 0)
4618     {
4619         int size = (qlstnames.size());
4620         MathmodRef->LocalScene.slider = 1;
4621         for (int i = 0; i < size; ++i)
4622         {
4623             MathmodRef->IsoObjet->masterthread->SliderValues[uint(i)] =
4624                 qlstPos.at(i + (index - 1) * size).toDouble();
4625             MathmodRef->ParObjet->masterthread->SliderValues[uint(i)] =
4626                 qlstPos.at(i + (index - 1) * size).toDouble();
4627         }
4628         for (int sl = 0; sl < 20; sl++)
4629         {
4630             if (size >= (sl + 1))
4631             {
4632                 (SliderArray[sl].SliderLabel)
4633                 ->setText(qlstnames.at(sl) + " = " +qlstPos.at(sl + (index - 1) * size) + "(" +qlstStep.at(sl) + ")");
4634                 (SliderArray[sl].SliderScrollBar)->blockSignals(true);
4635                 if (qlstmin.size() > qlstnames.size())
4636                 {
4637                     (SliderArray[sl].SliderScrollBar)->setMaximum(qlstmax.at(sl + (index - 1) * size).toInt());
4638                     (SliderArray[sl].SliderScrollBar)->setMinimum(qlstmin.at(sl + (index - 1) * size).toInt());
4639                     (SliderArray[sl].SliderScrollBar)->setSingleStep(qlstStep.at(sl + (index - 1) * size).toInt());
4640                     (SliderArray[sl].SliderLabel)->setText(qlstnames.at(sl) + " = " +qlstPos.at(sl + (index - 1) * size) + "(" +qlstStep.at(sl + (index - 1) * size) + ")");
4641                     (SliderArray[sl].SliderLabelMin)->setText(qlstmin.at(sl + (index - 1) * size));
4642                     (SliderArray[sl].SliderLabelMax)->setText(qlstmax.at(sl + (index - 1) * size));
4643                 }
4644                 (SliderArray[sl].SliderScrollBar)->setSliderPosition(qlstPos.at(sl + (index - 1) * size).toInt());
4645                 (SliderArray[sl].SliderScrollBar)->blockSignals(false);
4646             }
4647         }
4648         // Draw
4649         if (CurrentFormulaType == 2)
4650             MathmodRef->ProcessNewIsoSurface();
4651         else
4652             MathmodRef->ParametricSurfaceProcess(CurrentFormulaType);
4653         MathmodRef->LocalScene.slider = -1;
4654     }
4655 }
CIndextoolButton_clicked(int idx)4656 void DrawingOptions::CIndextoolButton_clicked(int idx)
4657 {
4658     int range = (indexcurrentSet < 1)? (idx - 1) : (indexcurrentSet - 1) * qlstnames.size() + (idx - 1);
4659     sliderconf.currentSlider = (idx - 1);
4660     sliderconf.ui.MaxEdit->setText(qlstmax[range]);
4661     sliderconf.ui.MinEdit->setText(qlstmin[range]);
4662     sliderconf.ui.StepEdit->setText(qlstStep[range]);
4663     sliderconf.ui.PosEdit->setText(qlstPos[range]);
4664     sliderconf.ui.ParametersComboBox->blockSignals(true);
4665     sliderconf.ui.ParametersComboBox->setCurrentIndex(idx);
4666     sliderconf.ui.ParametersComboBox->blockSignals(false);
4667     sliderconf.show();
4668 }
4669 
on_C20toolButton_clicked()4670 void DrawingOptions::on_C20toolButton_clicked()
4671 {
4672     CIndextoolButton_clicked(20);
4673 }
4674 
on_C19toolButton_clicked()4675 void DrawingOptions::on_C19toolButton_clicked()
4676 {
4677     CIndextoolButton_clicked(19);
4678 }
4679 
on_C18toolButton_clicked()4680 void DrawingOptions::on_C18toolButton_clicked()
4681 {
4682     CIndextoolButton_clicked(18);
4683 }
4684 
on_C17toolButton_clicked()4685 void DrawingOptions::on_C17toolButton_clicked()
4686 {
4687     CIndextoolButton_clicked(17);
4688 }
4689 
on_C16toolButton_clicked()4690 void DrawingOptions::on_C16toolButton_clicked()
4691 {
4692     CIndextoolButton_clicked(16);
4693 }
4694 
on_C15toolButton_clicked()4695 void DrawingOptions::on_C15toolButton_clicked()
4696 {
4697     CIndextoolButton_clicked(15);
4698 }
4699 
on_C14toolButton_clicked()4700 void DrawingOptions::on_C14toolButton_clicked()
4701 {
4702     CIndextoolButton_clicked(14);
4703 }
4704 
on_C13toolButton_clicked()4705 void DrawingOptions::on_C13toolButton_clicked()
4706 {
4707     CIndextoolButton_clicked(13);
4708 }
4709 
on_C12toolButton_clicked()4710 void DrawingOptions::on_C12toolButton_clicked()
4711 {
4712     CIndextoolButton_clicked(12);
4713 }
4714 
on_C11toolButton_clicked()4715 void DrawingOptions::on_C11toolButton_clicked()
4716 {
4717     CIndextoolButton_clicked(11);
4718 }
4719 
on_C10toolButton_clicked()4720 void DrawingOptions::on_C10toolButton_clicked()
4721 {
4722     CIndextoolButton_clicked(10);
4723 }
4724 
on_C9toolButton_clicked()4725 void DrawingOptions::on_C9toolButton_clicked()
4726 {
4727     CIndextoolButton_clicked(9);
4728 }
4729 
on_C8toolButton_clicked()4730 void DrawingOptions::on_C8toolButton_clicked()
4731 {
4732     CIndextoolButton_clicked(8);
4733 }
4734 
on_C7toolButton_clicked()4735 void DrawingOptions::on_C7toolButton_clicked()
4736 {
4737     CIndextoolButton_clicked(7);
4738 }
4739 
on_C6toolButton_clicked()4740 void DrawingOptions::on_C6toolButton_clicked()
4741 {
4742     CIndextoolButton_clicked(6);
4743 }
4744 
on_C5toolButton_clicked()4745 void DrawingOptions::on_C5toolButton_clicked()
4746 {
4747     CIndextoolButton_clicked(5);
4748 }
4749 
on_C4toolButton_clicked()4750 void DrawingOptions::on_C4toolButton_clicked()
4751 {
4752     CIndextoolButton_clicked(4);
4753 }
4754 
on_C3toolButton_clicked()4755 void DrawingOptions::on_C3toolButton_clicked()
4756 {
4757     CIndextoolButton_clicked(3);
4758 }
4759 
on_C2toolButton_clicked()4760 void DrawingOptions::on_C2toolButton_clicked()
4761 {
4762     CIndextoolButton_clicked(2);
4763 }
4764 
on_C1toolButton_clicked()4765 void DrawingOptions::on_C1toolButton_clicked()
4766 {
4767     CIndextoolButton_clicked(1);
4768 }
4769 
update_slider_param()4770 void DrawingOptions::update_slider_param()
4771 {
4772     int SliderIndex = sliderconf.currentSlider;
4773 
4774     for (int sl = 0; sl < 20; sl++)
4775     {
4776         if (SliderIndex == sl)
4777         {
4778             qlstmax[sl] = sliderconf.ui.MaxEdit->text();
4779             qlstmin[sl] = sliderconf.ui.MinEdit->text();
4780             qlstStep[sl] = sliderconf.ui.StepEdit->text();
4781             qlstPos[sl] = sliderconf.ui.PosEdit->text();
4782             (SliderArray[sl].SliderScrollBar)->blockSignals(true);
4783             (SliderArray[sl].SliderScrollBar)->setMaximum(qlstmax.at(sl).toInt());
4784             (SliderArray[sl].SliderScrollBar)->setMinimum(qlstmin.at(sl).toInt());
4785             (SliderArray[sl].SliderScrollBar)->setSingleStep(qlstStep.at(sl).toInt());
4786             (SliderArray[sl].SliderScrollBar)->setPageStep(qlstStep.at(sl).toInt());
4787             (SliderArray[sl].SliderScrollBar)->setSliderPosition(qlstPos.at(sl).toInt());
4788             (SliderArray[sl].SliderLabel)->setText(qlstnames.at(sl) + " = " + qlstPos.at(sl) + "(" +qlstStep.at(sl) + ")");
4789             (SliderArray[sl].SliderLabelMin)->setText(qlstmin.at(sl));
4790             (SliderArray[sl].SliderLabelMax)->setText(qlstmax.at(sl));
4791             (SliderArray[sl].SliderScrollBar)->blockSignals(false);
4792             MathmodRef->IsoObjet->masterthread->SliderNames.push_back(qlstnames.at(sl).toStdString());
4793             MathmodRef->ParObjet->masterthread->SliderNames.push_back(qlstnames.at(sl).toStdString());
4794             MathmodRef->IsoObjet->masterthread->SliderValues.push_back(qlstPos.at(sl).toDouble());
4795             MathmodRef->ParObjet->masterthread->SliderValues.push_back(qlstPos.at(sl).toDouble());
4796         }
4797     }
4798     // Draw
4799     MathmodRef->LocalScene.slider = 1;
4800     if (CurrentFormulaType == 2)
4801         MathmodRef->ProcessNewIsoSurface();
4802     else
4803         MathmodRef->ParametricSurfaceProcess(CurrentFormulaType);
4804     MathmodRef->LocalScene.slider = -1;
4805 }
4806 
on_AddSetButton_clicked()4807 void DrawingOptions::on_AddSetButton_clicked()
4808 {
4809     QJsonArray array1, array2, array3, array4, array5;
4810     QJsonObject tmp, tmp2;
4811     tmp = MathmodRef->RootObjet.CurrentJsonObject;
4812     tmp2 = tmp["Sliders"].toObject();
4813     array2 = tmp2["Position"].toArray();
4814     array3 = tmp2["Min"].toArray();
4815     array4 = tmp2["Max"].toArray();
4816     array5 = tmp2["Step"].toArray();
4817     int size = qlstnames.size();
4818     if (tmp2["SetNames"].isArray())
4819     {
4820         array1 = tmp2["SetNames"].toArray();
4821         array1.append("Objet_"+QString::number(tmp2["SetNames"].toArray().size()));
4822     }
4823     else
4824         tmp2.remove("SetNames");
4825     for (int sl = 0; sl < 20; sl++)
4826     {
4827         if (size >= (sl + 1))
4828         {
4829             array2.append(QString::number((SliderArray[sl].SliderScrollBar)->sliderPosition()));
4830             array3.append(QString::number((SliderArray[sl].SliderScrollBar)->minimum()));
4831             array4.append(QString::number((SliderArray[sl].SliderScrollBar)->maximum()));
4832             array5.append(QString::number((SliderArray[sl].SliderScrollBar)->singleStep()));
4833         }
4834     }
4835     if (tmp2["SetNames"].isArray())
4836     {
4837         tmp2["SetNames"] = array1;
4838     }
4839     else
4840         tmp2.remove("SetNames");
4841     tmp2["Position"] = array2;
4842     tmp2["Min"] = array3;
4843     tmp2["Max"] = array4;
4844     tmp2["Step"] = array5;
4845     tmp["Sliders"] = tmp2;
4846     // Draw here
4847     DrawJsonModel(tmp);
4848 }
4849 
on_CutSetButton_clicked()4850 void DrawingOptions::on_CutSetButton_clicked()
4851 {
4852     int size2 = qlstPos.size();
4853     int size = qlstnames.size();
4854     if (size2 >= 2 * size)
4855     {
4856         QJsonArray array1, array2, array3, array4, array5;
4857         QJsonObject tmp, tmp2;
4858         tmp = MathmodRef->RootObjet.CurrentJsonObject;
4859         tmp2 = tmp["Sliders"].toObject();
4860         if (tmp2["SetNames"].isArray())
4861         {
4862             array1 = tmp2["SetNames"].toArray();
4863             array1.removeAt(indexcurrentSet - 1);
4864         }
4865         array2 = tmp2["Position"].toArray();
4866         for (int i = 0; i < size; i++)
4867             array2.removeAt((indexcurrentSet - 1) * size);
4868         array3 = tmp2["Min"].toArray();
4869         for (int i = 0; i < size; i++)
4870             array3.removeAt((indexcurrentSet - 1) * size);
4871         array4 = tmp2["Max"].toArray();
4872         for (int i = 0; i < size; i++)
4873             array4.removeAt((indexcurrentSet - 1) * size);
4874         array5 = tmp2["Step"].toArray();
4875         for (int i = 0; i < size; i++)
4876             array5.removeAt((indexcurrentSet - 1) * size);
4877         if (tmp2["SetNames"].isArray())
4878         {
4879             tmp2["SetNames"] = array1;
4880         }
4881         else
4882             tmp2.remove("SetNames");
4883         tmp2["Position"] = array2;
4884         tmp2["Min"] = array3;
4885         tmp2["Max"] = array4;
4886         tmp2["Step"] = array5;
4887         tmp["Sliders"] = tmp2;
4888         // Draw here
4889         DrawJsonModel(tmp);
4890     }
4891 }
4892 
on_AddParam_clicked()4893 void DrawingOptions::on_AddParam_clicked()
4894 {
4895     addnewparam.ui.NameEdit->setText("ParamName");
4896     addnewparam.ui.MaxEdit->setText("50");
4897     addnewparam.ui.MinEdit->setText("0");
4898     addnewparam.ui.StepEdit->setText("1");
4899     addnewparam.ui.PosEdit->setText("10");
4900     addnewparam.show();
4901 }
4902 
on_CutParam_clicked()4903 void DrawingOptions::on_CutParam_clicked()
4904 {
4905     int index = ui.ParametersList->currentIndex();
4906     if (index > 0)
4907     {
4908         QJsonArray array2;
4909         QJsonObject tmp, tmp2;
4910         int names, position;
4911         tmp = MathmodRef->RootObjet.CurrentJsonObject;
4912         tmp2 = tmp["Sliders"].toObject();
4913         array2 = tmp2["Name"].toArray();
4914         names = array2.size();
4915         array2.removeAt(index - 1);
4916         tmp2["Name"] = array2;
4917         array2 = tmp2["Max"].toArray();
4918         position = array2.size();
4919         for (int i = 0; i * names < position; i++)
4920             array2.removeAt(index - 1 - i + i * names);
4921         tmp2["Max"] = array2;
4922         array2 = tmp2["Min"].toArray();
4923         position = array2.size();
4924         for (int i = 0; i * names < position; i++)
4925             array2.removeAt(index - 1 - i + i * names);
4926         tmp2["Min"] = array2;
4927         array2 = tmp2["Step"].toArray();
4928         position = array2.size();
4929         for (int i = 0; i * names < position; i++)
4930             array2.removeAt(index - 1 - i + i * names);
4931         tmp2["Step"] = array2;
4932         array2 = tmp2["Position"].toArray();
4933         position = array2.size();
4934         for (int i = 0; i * names < position; i++)
4935             array2.removeAt(index - 1 - i + i * names);
4936         tmp2["Position"] = array2;
4937         tmp["Sliders"] = tmp2;
4938         // Draw here
4939         DrawJsonModel(tmp);
4940     }
4941 }
4942 
add_new_param()4943 void DrawingOptions::add_new_param()
4944 {
4945     QJsonArray array2;
4946     QJsonObject tmp, tmp2;
4947     int names, position;
4948     tmp = MathmodRef->RootObjet.CurrentJsonObject;
4949     tmp2 = tmp["Sliders"].toObject();
4950     array2 = tmp2["Name"].toArray();
4951     names = array2.empty() ? 0 : array2.size();
4952     array2.append(addnewparam.ui.NameEdit->text());
4953     tmp2["Name"] = array2;
4954     array2 = tmp2["Position"].toArray();
4955     position = array2.empty() ? 0 : array2.size();
4956     if (names == 0)
4957         array2.append(addnewparam.ui.PosEdit->text());
4958     else
4959         for (int i = 1; i * names <= position; i++)
4960             array2.insert(i * names + i - 1, addnewparam.ui.PosEdit->text());
4961     tmp2["Position"] = array2;
4962     array2 = tmp2["Max"].toArray();
4963     position = array2.empty() ? 0 : array2.size();
4964     if (names == 0)
4965         array2.append(addnewparam.ui.MaxEdit->text());
4966     else
4967         for (int i = 1; i * names <= position; i++)
4968             array2.insert(i * names + i - 1, addnewparam.ui.MaxEdit->text());
4969     tmp2["Max"] = array2;
4970     array2 = tmp2["Min"].toArray();
4971     position = array2.empty() ? 0 : array2.size();
4972     if (names == 0)
4973         array2.append(addnewparam.ui.MinEdit->text());
4974     else
4975         for (int i = 1; i * names <= position; i++)
4976             array2.insert(i * names + i - 1, addnewparam.ui.MinEdit->text());
4977     tmp2["Min"] = array2;
4978     array2 = tmp2["Step"].toArray();
4979     position = array2.empty() ? 0 : array2.size();
4980     if (names == 0)
4981         array2.append(addnewparam.ui.StepEdit->text());
4982     else
4983         for (int i = 1; i * names <= position; i++)
4984             array2.insert(i * names + i - 1, addnewparam.ui.StepEdit->text());
4985     tmp2["Step"] = array2;
4986     tmp["Sliders"] = tmp2;
4987     // Draw here
4988     DrawJsonModel(tmp);
4989 }
4990 
update_infos_param(int index)4991 void DrawingOptions::update_infos_param(int index)
4992 {
4993     CIndextoolButton_clicked(index);
4994     sliderconf.currentSlider = index - 1;
4995 }
4996 
on_actionFrames_triggered()4997 void DrawingOptions::on_actionFrames_triggered()
4998 {
4999     MathmodRef->frames_clicked();
5000 }
5001 
SetSpecularValues(int * spec)5002 void DrawingOptions::SetSpecularValues(int *spec)
5003 {
5004     ui.red_Specular->blockSignals(true);
5005     ui.red_Specular->setSliderPosition(spec[0]);
5006     ui.red_Specular->blockSignals(false);
5007     ui.green_Specular->blockSignals(true);
5008     ui.green_Specular->setSliderPosition(spec[1]);
5009     ui.green_Specular->blockSignals(false);
5010     ui.blue_Specular->blockSignals(true);
5011     ui.blue_Specular->setSliderPosition(spec[2]);
5012     ui.blue_Specular->blockSignals(false);
5013     ui.transparent_Specular->blockSignals(true);
5014     ui.transparent_Specular->setSliderPosition(spec[3]);
5015     ui.transparent_Specular->blockSignals(false);
5016     MathmodRef->lightSpecular[0]= Parameters->Specular[0]/100.0f;
5017     MathmodRef->lightSpecular[1]= Parameters->Specular[1]/100.0f;
5018     MathmodRef->lightSpecular[2]= Parameters->Specular[2]/100.0f;
5019     MathmodRef->lightSpecular[3]= Parameters->Specular[3]/100.0f;
5020 }
SetDiffuseValues(int * spec)5021 void DrawingOptions::SetDiffuseValues(int *spec)
5022 {
5023     ui.red_Diffuse->blockSignals(true);
5024     ui.red_Diffuse->setSliderPosition(spec[0]);
5025     ui.red_Diffuse->blockSignals(false);
5026     ui.green_Diffuse->blockSignals(true);
5027     ui.green_Diffuse->setSliderPosition(spec[1]);
5028     ui.green_Diffuse->blockSignals(false);
5029     ui.blue_Diffuse->blockSignals(true);
5030     ui.blue_Diffuse->setSliderPosition(spec[2]);
5031     ui.blue_Diffuse->blockSignals(false);
5032     ui.transparent_Diffuse->blockSignals(true);
5033     ui.transparent_Diffuse->setSliderPosition(spec[3]);
5034     ui.transparent_Diffuse->blockSignals(false);
5035     MathmodRef->lightDiffuse[0]= Parameters->Diffuse[0]/100.0f;
5036     MathmodRef->lightDiffuse[1]= Parameters->Diffuse[1]/100.0f;
5037     MathmodRef->lightDiffuse[2]= Parameters->Diffuse[2]/100.0f;
5038     MathmodRef->lightDiffuse[3]= Parameters->Diffuse[3]/100.0f;
5039 }
SetAmbientValues(int * spec)5040 void DrawingOptions::SetAmbientValues(int *spec)
5041 {
5042     ui.red_Ambient->blockSignals(true);
5043     ui.red_Ambient->setSliderPosition(spec[0]);
5044     ui.red_Ambient->blockSignals(false);
5045     ui.green_Ambient->blockSignals(true);
5046     ui.green_Ambient->setSliderPosition(spec[1]);
5047     ui.green_Ambient->blockSignals(false);
5048     ui.blue_Ambient->blockSignals(true);
5049     ui.blue_Ambient->setSliderPosition(spec[2]);
5050     ui.blue_Ambient->blockSignals(false);
5051     ui.transparent_Ambient->blockSignals(true);
5052     ui.transparent_Ambient->setSliderPosition(spec[3]);
5053     ui.transparent_Ambient->blockSignals(false);
5054     MathmodRef->lightAmbient[0]= Parameters->Ambient[0]/100.0f;
5055     MathmodRef->lightAmbient[1]= Parameters->Ambient[1]/100.0f;
5056     MathmodRef->lightAmbient[2]= Parameters->Ambient[2]/100.0f;
5057     MathmodRef->lightAmbient[3]= Parameters->Ambient[3]/100.0f;
5058 }
5059 
SetThreadValues(int * thread)5060 void DrawingOptions::SetThreadValues(int *thread)
5061 {
5062     ui.ThreadNumberScrollBar->blockSignals(true);
5063     ui.ThreadNumberScrollBar->setSliderPosition(thread[0]);
5064     ui.ThreadNumberScrollBar->setMinimum(thread[1]);
5065     ui.ThreadNumberScrollBar->setMaximum(thread[2]);
5066     ui.ThreadgroupBox->setTitle(
5067         "Threads: " + QString::number(ui.ThreadNumberScrollBar->minimum()) +
5068         "  <  " + QString::number(thread[0]) + "  <  " +
5069         QString::number(ui.ThreadNumberScrollBar->maximum()));
5070     ui.ThreadNumberScrollBar->blockSignals(false);
5071 }
5072 
SetShininessValue(int shin)5073 void DrawingOptions::SetShininessValue(int shin)
5074 {
5075     ui.ShininessScrollBar->blockSignals(true);
5076     ui.ShininessScrollBar->setSliderPosition(shin);
5077     ui.ShininessScrollBar->blockSignals(false);
5078     MathmodRef->LocalScene.shininess = Parameters->Shininess;
5079 }
5080 
SetglFrontFacingSupport()5081 void DrawingOptions::SetglFrontFacingSupport()
5082 {
5083     ui.GLFrontSurfaceSupport->blockSignals(true);
5084     ui.GLFrontSurfaceSupport->setChecked(false);
5085     ui.GLFrontSurfaceSupport->blockSignals(false);
5086     MathmodRef->LocalScene.glFrontFacingSupport = 0;
5087 }
5088 
on_red_Specular_valueChanged(int value)5089 void DrawingOptions::on_red_Specular_valueChanged(int value)
5090 {
5091     MathmodRef->redSpec(value);
5092     if (ui.GcheckBox->isChecked())
5093     {
5094         ui.green_Specular->blockSignals(true);
5095         ui.green_Specular->setSliderPosition(value);
5096         ui.green_Specular->blockSignals(false);
5097         MathmodRef->greenSpec(value);
5098     }
5099     if (ui.BcheckBox->isChecked())
5100     {
5101         ui.blue_Specular->blockSignals(true);
5102         ui.blue_Specular->setSliderPosition(value);
5103         ui.blue_Specular->blockSignals(false);
5104         MathmodRef->blueSpec(value);
5105     }
5106     //MathmodRef->InitSpecularParameters();
5107 }
5108 
on_green_Specular_valueChanged(int value)5109 void DrawingOptions::on_green_Specular_valueChanged(int value)
5110 {
5111     MathmodRef->greenSpec(value);
5112     if (ui.RcheckBox->isChecked())
5113     {
5114         ui.red_Specular->blockSignals(true);
5115         ui.red_Specular->setSliderPosition(value);
5116         ui.red_Specular->blockSignals(false);
5117         MathmodRef->redSpec(value);
5118     }
5119     if (ui.BcheckBox->isChecked())
5120     {
5121         ui.blue_Specular->blockSignals(true);
5122         ui.blue_Specular->setSliderPosition(value);
5123         ui.blue_Specular->blockSignals(false);
5124         MathmodRef->blueSpec(value);
5125     }
5126     //MathmodRef->InitSpecularParameters();
5127 }
5128 
on_blue_Specular_valueChanged(int value)5129 void DrawingOptions::on_blue_Specular_valueChanged(int value)
5130 {
5131     MathmodRef->blueSpec(value);
5132     if (ui.GcheckBox->isChecked())
5133     {
5134         ui.green_Specular->blockSignals(true);
5135         ui.green_Specular->setSliderPosition(value);
5136         ui.green_Specular->blockSignals(false);
5137         MathmodRef->greenSpec(value);
5138     }
5139     if (ui.RcheckBox->isChecked())
5140     {
5141         ui.red_Specular->blockSignals(true);
5142         ui.red_Specular->setSliderPosition(value);
5143         ui.red_Specular->blockSignals(false);
5144         MathmodRef->redSpec(value);
5145     }
5146     //MathmodRef->InitSpecularParameters();
5147 }
5148 
on_transparent_Specular_valueChanged(int value)5149 void DrawingOptions::on_transparent_Specular_valueChanged(int value)
5150 {
5151     MathmodRef->transSpec(value);
5152 }
5153 
on_ShininessScrollBar_valueChanged(int value)5154 void DrawingOptions::on_ShininessScrollBar_valueChanged(int value)
5155 {
5156     MathmodRef->Shininess(value);
5157 }
5158 
on_ThreadNumberScrollBar_valueChanged(int value)5159 void DrawingOptions::on_ThreadNumberScrollBar_valueChanged(int value)
5160 {
5161     MathmodRef->ParObjet->UpdateThredsNumber(uint(value));
5162     MathmodRef->IsoObjet->UpdateThredsNumber(uint(value));
5163     ui.ThreadgroupBox->setTitle(
5164         "Threads: " + QString::number(ui.ThreadNumberScrollBar->minimum()) +
5165         "  <  " + QString::number(value) + "  <  " +
5166         QString::number(ui.ThreadNumberScrollBar->maximum()));
5167 }
5168 
on_StopCalculationsButton_clicked()5169 void DrawingOptions::on_StopCalculationsButton_clicked()
5170 {
5171     MathmodRef->IsoObjet->stopcalculations(true);
5172     MathmodRef->ParObjet->stopcalculations(true);
5173 }
5174 
on_stopButton_clicked()5175 void DrawingOptions::on_stopButton_clicked()
5176 {
5177     on_StopCalculationsButton_clicked();
5178 }
5179 
on_actionScripts_selection_triggered()5180 void DrawingOptions::on_actionScripts_selection_triggered()
5181 {
5182     select.show();
5183 }
5184 
on_actionBoundingBox_clicked()5185 void DrawingOptions::on_actionBoundingBox_clicked()
5186 {
5187     MathmodRef->boundingboxOk();
5188     MathmodRef->update();
5189 }
5190 
on_actionAnimation_Rotation_triggered()5191 void DrawingOptions::on_actionAnimation_Rotation_triggered()
5192 {
5193     MathmodRef->anim();
5194 }
5195 
on_actionMorph_use_t_parameter_triggered()5196 void DrawingOptions::on_actionMorph_use_t_parameter_triggered()
5197 {
5198     MathmodRef->morph();
5199 }
5200 
on_TreeViewButton_clicked()5201 void DrawingOptions::on_TreeViewButton_clicked()
5202 {
5203     ShowCurrentObjectTree = !ShowCurrentObjectTree;
5204     if (ShowCurrentObjectTree)
5205     {
5206         UpdateTreeObject();
5207         ui.ObjectClasseCurrent->show();
5208     }
5209     else
5210     {
5211         UpdateTreeObject();
5212         ui.ObjectClasseCurrent->hide();
5213     }
5214 }
5215 
ApplypushButton_clicked()5216 void DrawingOptions::ApplypushButton_clicked()
5217 {
5218     int maxisogrid = 0;
5219     int maxpargrid = 0;
5220     if ((Parameters->ui.IsoMaxGridLineEdit->text()).replace(" ", "")!= "" &&
5221             (maxisogrid = (Parameters->ui.IsoMaxGridLineEdit->text()).toInt()) !=
5222             Parameters->IsoMaxGrid)
5223     {
5224         Parameters->IsoMaxGrid = maxisogrid;
5225         ui.Isogroupbox->setTitle("Iso Grid/MaxGrid ( " +
5226                                  QString::number(ui.xyzg->value()) + " / " +
5227                                  QString::number(maxisogrid) + " ) :");
5228         ui.xyzg->blockSignals(true);
5229         ui.xyzg->setMaximum(maxisogrid);
5230         ui.xyzg->blockSignals(false);
5231     }
5232 
5233     if ((Parameters->ui.ParMaxGridLineEdit->text()).replace(" ", "")!= "" &&
5234             (maxpargrid = (Parameters->ui.ParMaxGridLineEdit->text()).toInt()) !=
5235             Parameters->ParMaxGrid)
5236     {
5237         Parameters->ParMaxGrid = maxpargrid;
5238         ui.ParamgroupBox_2->setTitle("Grid(u,v)/MaxGrid = ( " + QString::number(ui.linecolumn_2->value()) +
5239                                      ", " + QString::number(ui.linecolumn_2->value()) + " ) / "+QString::number(maxpargrid));
5240         ui.linecolumn_2->blockSignals(true);
5241         ui.linecolumn_2->setMaximum(int(Parameters->ParMaxGrid));
5242         ui.linecolumn_2->blockSignals(false);
5243         ui.ParamgroupBox_3->setTitle("Grid(u,v)/MaxGrid = ( " + QString::number(ui.linecolumn_3->value()) +
5244                                      ", " + QString::number(ui.linecolumn_3->value()) + " ) / "+QString::number(maxpargrid));
5245         ui.linecolumn_3->blockSignals(true);
5246         ui.linecolumn_3->setMaximum(int(Parameters->ParMaxGrid));
5247         ui.linecolumn_3->blockSignals(false);
5248     }
5249 }
5250 
on_ObjectClasseCurrent_clicked(const QModelIndex & idx)5251 void DrawingOptions::on_ObjectClasseCurrent_clicked(const QModelIndex &idx)
5252 {
5253     QModelIndex parentItem = idx.parent();
5254     if (!parentItem.isValid())
5255     {
5256         int row = idx.row();
5257         if (MathmodRef->RootObjet.CurrentParisoTreestruct.size() > 0 &&
5258                 int(MathmodRef->RootObjet.CurrentParisoTreestruct.size()) > row)
5259             ui.parisocomboBox->setCurrentIndex(row);
5260     }
5261 }
5262 
on_parisocomboBox_currentIndexChanged(int index)5263 void DrawingOptions::on_parisocomboBox_currentIndexChanged(int index)
5264 {
5265     if (index >= 0)
5266     {
5267         ModelType type = MathmodRef->RootObjet.CurrentParisoTreestruct[index].type;
5268         if (type == ISO_TYPE)
5269             UpdateIsoModelDetailsPage(MathmodRef->RootObjet.CurrentParisoTreestruct[index]);
5270         else if (type == PAR_TYPE)
5271             UpdatePar3DModelDetailsPage(MathmodRef->RootObjet.CurrentParisoTreestruct[index]);
5272         else if (type == PAR_4D_TYPE)
5273             UpdatePar4DModelDetailsPage(MathmodRef->RootObjet.CurrentParisoTreestruct[index]);
5274     }
5275 }
5276 
on_ApplypushButton_clicked()5277 void DrawingOptions::on_ApplypushButton_clicked()
5278 {
5279     int maxisogrid = 0;
5280     if ((ui.IsoMaxGridLineEdit->text()).replace(" ", "")!= "" &&
5281          (maxisogrid = (ui.IsoMaxGridLineEdit->text()).toInt()) != Parameters->IsoMaxGrid)
5282     {
5283         Parameters->IsoMaxGrid = maxisogrid;
5284         ui.Isogroupbox->setTitle("Grid/MaxGrid = (" +
5285                                  QString::number(ui.xyzg->value()) + "/" +
5286                                  QString::number(maxisogrid) + ")");
5287         ui.xyzg->blockSignals(true);
5288         ui.xyzg->setMaximum(maxisogrid);
5289         ui.xyzg->blockSignals(false);
5290     }
5291 }
5292 
updateParametricGridSliders(int maxpargrid)5293 void DrawingOptions::updateParametricGridSliders(int maxpargrid)
5294 {
5295     Parameters->ParMaxGrid = maxpargrid;
5296     ui.ParamgroupBox_2->setTitle("Grid(u,v)/MaxGrid = ("+ QString::number(ui.linecolumn_2->value()) +
5297                                  ", " + QString::number(ui.linecolumn_2->value()) +")/"+QString::number(maxpargrid));
5298     ui.linecolumn_2->blockSignals(true);
5299     ui.linecolumn_2->setMaximum(int(maxpargrid));
5300     ui.linecolumn_2->blockSignals(false);
5301     ui.ParamgroupBox_3->setTitle("Grid(u,v)/MaxGrid = ("+ QString::number(ui.linecolumn_3->value()) +
5302                                  ", " + QString::number(ui.linecolumn_3->value()) +")/"+QString::number(maxpargrid));
5303     ui.linecolumn_3->blockSignals(true);
5304     ui.linecolumn_3->setMaximum(int(maxpargrid));
5305     ui.linecolumn_3->blockSignals(false);
5306 }
5307 
on_ApplypushButton_2_clicked()5308 void DrawingOptions::on_ApplypushButton_2_clicked()
5309 {
5310     int maxpargrid = 0;
5311     if ((ui.ParMaxGridLineEdit->text()).replace(" ", "")!= "" &&
5312         (maxpargrid = (ui.ParMaxGridLineEdit->text()).toInt()) != Parameters->ParMaxGrid)
5313         updateParametricGridSliders(maxpargrid);
5314 }
on_ApplypushButton_3_clicked()5315 void DrawingOptions::on_ApplypushButton_3_clicked()
5316 {
5317     int maxpargrid = 0;
5318     if ((ui.ParMaxGridLineEdit_2->text()).replace(" ", "")!= "" &&
5319         (maxpargrid = (ui.ParMaxGridLineEdit_2->text()).toInt()) != Parameters->ParMaxGrid)
5320         updateParametricGridSliders(maxpargrid);
5321 }
5322 
5323 #include <QDesktopServices>
on_actionDocumentation_triggered()5324 void DrawingOptions::on_actionDocumentation_triggered()
5325 {
5326     QString link = QApplication::applicationDirPath() + "/../Resources/documentation/index.html";
5327     QDesktopServices::openUrl(QUrl(QUrl::fromLocalFile(link)));
5328 }
5329 
on_ScaleButton_clicked()5330 void DrawingOptions::on_ScaleButton_clicked()
5331 {
5332     bool valx, valy, valz;
5333     double fx = ui.lineEditSx->text().toDouble(&valx);
5334     double fy = ui.lineEditSy->text().toDouble(&valy);
5335     double fz = ui.lineEditSz->text().toDouble(&valz);
5336     if (valx && valy && valz)
5337     {
5338         MathmodRef->factx=fx;
5339         MathmodRef->facty=fy;
5340         MathmodRef->factz=fz;
5341     }
5342     else
5343     {
5344         QMessageBox msgBox;
5345         msgBox.setText("Invalid number");
5346         msgBox.exec();
5347     }
5348 }
5349 
on_ShowIsoComp_clicked()5350 void DrawingOptions::on_ShowIsoComp_clicked()
5351 {
5352     if(!ui.ShowIsoComp->isChecked())
5353     {
5354         ui.ShowIsoComp->setText("Show");
5355         if(!MathmodRef->LocalScene.componentsinfos.pariso)
5356             MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[IndexcurrentComponent]=false;
5357         else
5358             MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[MathmodRef->LocalScene.componentsinfos.NbComponentsType[0]+IndexcurrentComponent]=false;
5359     }
5360     else
5361     {
5362         ui.ShowIsoComp->setText("Hide");
5363         if(!MathmodRef->LocalScene.componentsinfos.pariso)
5364             MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[IndexcurrentComponent]=true;
5365         else
5366             MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[MathmodRef->LocalScene.componentsinfos.NbComponentsType[0]+IndexcurrentComponent]=true;
5367     }
5368     MathmodRef->update();
5369 }
5370 
on_ShowParComp_clicked()5371 void DrawingOptions::on_ShowParComp_clicked()
5372 {
5373     if(!ui.ShowParComp->isChecked())
5374     {
5375         ui.ShowParComp->setText("Show");
5376         MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[IndexcurrentComponent]=false;
5377     }
5378     else
5379     {
5380         ui.ShowParComp->setText("Hide");
5381         MathmodRef->LocalScene.componentsinfos.ShowParIsoCmp[IndexcurrentComponent]=true;
5382     }
5383     MathmodRef->update();
5384 }
5385 
on_actionAxe_triggered()5386 void DrawingOptions::on_actionAxe_triggered()
5387 {
5388     MathmodRef->LocalScene.axe *=-1;
5389     MathmodRef->update();
5390 }
5391 
on_actionPlan_triggered()5392 void DrawingOptions::on_actionPlan_triggered()
5393 {
5394     MathmodRef->LocalScene.plan *=-1;
5395     MathmodRef->update();
5396 }
5397 
on_actionDetach_WinInfos_triggered()5398 void DrawingOptions::on_actionDetach_WinInfos_triggered()
5399 {
5400     MathmodRef->LocalScene.attachwininfos*=-1;
5401     MathmodRef->attachinfos();
5402 }
5403 
on_red_Ambient_valueChanged(int value)5404 void DrawingOptions::on_red_Ambient_valueChanged(int value)
5405 {
5406     MathmodRef->redAmb(value);
5407 }
5408 
on_green_Ambient_valueChanged(int value)5409 void DrawingOptions::on_green_Ambient_valueChanged(int value)
5410 {
5411     MathmodRef->greenAmb(value);
5412 }
5413 
on_blue_Ambient_valueChanged(int value)5414 void DrawingOptions::on_blue_Ambient_valueChanged(int value)
5415 {
5416     MathmodRef->blueAmb(value);
5417 }
5418 
on_transparent_Ambient_valueChanged(int value)5419 void DrawingOptions::on_transparent_Ambient_valueChanged(int value)
5420 {
5421     MathmodRef->transAmb(value);
5422 }
5423 
on_red_Diffuse_valueChanged(int value)5424 void DrawingOptions::on_red_Diffuse_valueChanged(int value)
5425 {
5426     MathmodRef->redDiff(value);
5427 }
5428 
on_green_Diffuse_valueChanged(int value)5429 void DrawingOptions::on_green_Diffuse_valueChanged(int value)
5430 {
5431     MathmodRef->greenDiff(value);
5432 }
5433 
on_blue_Diffuse_valueChanged(int value)5434 void DrawingOptions::on_blue_Diffuse_valueChanged(int value)
5435 {
5436     MathmodRef->blueDiff(value);
5437 }
5438 
on_transparent_Diffuse_valueChanged(int value)5439 void DrawingOptions::on_transparent_Diffuse_valueChanged(int value)
5440 {
5441     MathmodRef->transDiff(value);
5442 }
5443 
on_GLFrontSurfaceSupport_clicked()5444 void DrawingOptions::on_GLFrontSurfaceSupport_clicked()
5445 {
5446     if(!(ui.GLFrontSurfaceSupport->isChecked()))
5447         MathmodRef->glfrontfacesupp(0);
5448     else
5449         MathmodRef->glfrontfacesupp(1);
5450 }
5451