1 /****************************************************************************
2 * MeshLab o o *
3 * A versatile mesh processing toolbox o o *
4 * _ O _ *
5 * Copyright(C) 2005 \/)\/ *
6 * Visual Computing Lab /\/| *
7 * ISTI - Italian National Research Council | *
8 * \ *
9 * All rights reserved. *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
20 * for more details. *
21 * *
22 ****************************************************************************/
23
24 #include <QtCore>
25 #include <QMap>
26 #include <QPair>
27 #include <QAction>
28 #include <vcg/math/matrix44.h>
29 #include <wrap/qt/col_qt_convert.h>
30
31 #include "meshmodel.h"
32 #include "filterparameter.h"
33
34
35 using namespace vcg;
36
37 // Very similar to the findParameter but this one does not print out debugstuff.
hasParameter(const QString & name) const38 bool RichParameterSet::hasParameter(const QString& name) const
39 {
40 QList<RichParameter*>::const_iterator fpli;
41 for(fpli=paramList.begin();fpli!=paramList.end();++fpli)
42 {
43 if((*fpli != NULL) && (*fpli)->name==name)
44 return true;
45 }
46 return false;
47 }
48 // You should never use this one to know if a given parameter is present.
findParameter(const QString & name) const49 RichParameter* RichParameterSet::findParameter(const QString& name) const
50 {
51 QList<RichParameter*>::const_iterator fpli;
52 for(fpli=paramList.begin();fpli!=paramList.end();++fpli)
53 {
54 if((*fpli != NULL) && (*fpli)->name==name)
55 return *fpli;
56 }
57 qDebug("FilterParameter Warning: Unable to find a parameter with name '%s',\n"
58 " Please check types and names of the parameter in the calling filter", qUtf8Printable(name));
59 assert(0);
60 return 0;
61 }
62
removeParameter(const QString & name)63 RichParameterSet& RichParameterSet::removeParameter(const QString& name){
64 paramList.removeAll(findParameter(name));
65 return (*this);
66 }
67
addParam(RichParameter * pd)68 RichParameterSet& RichParameterSet::addParam(RichParameter* pd )
69 {
70 assert(!hasParameter(pd->name));
71 paramList.push_back(pd);
72 return (*this);
73 }
74
75 //--------------------------------------
76
77
setValue(const QString & name,const Value & newval)78 void RichParameterSet::setValue(const QString& name,const Value& newval){ findParameter(name)->val->set(newval); }
79
80 //- All the get<TYPE> are very similar. Nothing interesting here.
81
getBool(const QString & name) const82 bool RichParameterSet::getBool(const QString& name) const { return findParameter(name)->val->getBool(); }
getInt(const QString & name) const83 int RichParameterSet::getInt(const QString& name) const { return findParameter(name)->val->getInt();}
getFloat(const QString & name) const84 float RichParameterSet::getFloat(const QString& name) const { return findParameter(name)->val->getFloat();}
getColor(const QString & name) const85 QColor RichParameterSet::getColor(const QString& name) const { return findParameter(name)->val->getColor();}
getColor4b(const QString & name) const86 Color4b RichParameterSet::getColor4b(const QString& name) const { return ColorConverter::ToColor4b(findParameter(name)->val->getColor());}
getString(const QString & name) const87 QString RichParameterSet::getString(const QString& name) const { return findParameter(name)->val->getString();}
getMatrix44(const QString & name) const88 Matrix44f RichParameterSet::getMatrix44(const QString& name) const { return findParameter(name)->val->getMatrix44f();}
getMatrix44m(const QString & name) const89 Matrix44<MESHLAB_SCALAR> RichParameterSet::getMatrix44m(const QString& name) const { return Matrix44<MESHLAB_SCALAR>::Construct(findParameter(name)->val->getMatrix44f());}
getPoint3f(const QString & name) const90 Point3f RichParameterSet::getPoint3f(const QString& name) const { return findParameter(name)->val->getPoint3f();}
getPoint3m(const QString & name) const91 Point3<MESHLAB_SCALAR> RichParameterSet::getPoint3m(const QString& name) const { return Point3<MESHLAB_SCALAR>::Construct(findParameter(name)->val->getPoint3f());}
getShotf(const QString & name) const92 Shotf RichParameterSet::getShotf(const QString& name) const { return findParameter(name)->val->getShotf();}
getShotm(const QString & name) const93 Shot<MESHLAB_SCALAR> RichParameterSet::getShotm(const QString& name) const { return Shot<MESHLAB_SCALAR>::Construct(findParameter(name)->val->getShotf());}
getAbsPerc(const QString & name) const94 float RichParameterSet::getAbsPerc(const QString& name) const { return findParameter(name)->val->getAbsPerc();}
getEnum(const QString & name) const95 int RichParameterSet::getEnum(const QString& name) const { return findParameter(name)->val->getEnum();}
getFloatList(const QString & name) const96 QList<float> RichParameterSet::getFloatList(const QString& name) const { return findParameter(name)->val->getFloatList();}
getMesh(const QString & name) const97 MeshModel * RichParameterSet::getMesh(const QString& name) const { return findParameter(name)->val->getMesh();}
getDynamicFloat(const QString & name) const98 float RichParameterSet::getDynamicFloat(const QString& name) const { return findParameter(name)->val->getDynamicFloat();}
getOpenFileName(const QString & name) const99 QString RichParameterSet::getOpenFileName(const QString& name) const { return findParameter(name)->val->getFileName();}
getSaveFileName(const QString & name) const100 QString RichParameterSet::getSaveFileName(const QString& name) const { return findParameter(name)->val->getFileName(); }
101
operator =(const RichParameterSet & rps)102 RichParameterSet& RichParameterSet::operator=( const RichParameterSet& rps )
103 {
104 copy(rps);
105 return *this;
106 }
107
operator ==(const RichParameterSet & rps)108 bool RichParameterSet::operator==( const RichParameterSet& rps )
109 {
110 if (rps.paramList.size() != paramList.size())
111 return false;
112
113 bool iseq = true;
114 int ii = 0;
115 while((ii < rps.paramList.size()) && iseq)
116 {
117 if (!(*rps.paramList.at(ii) == *paramList.at(ii)))
118 iseq = false;
119 ++ii;
120 }
121
122 return iseq;
123 }
124
~RichParameterSet()125 RichParameterSet::~RichParameterSet()
126 {
127 //int val = _CrtCheckMemory( );
128 for(int ii = 0;ii < paramList.size();++ii)
129 delete paramList.at(ii);
130 paramList.clear();
131
132 }
133
copy(const RichParameterSet & rps)134 RichParameterSet& RichParameterSet::copy( const RichParameterSet& rps )
135 {
136 if (this != &rps) {
137 clear();
138
139 RichParameterCopyConstructor copyvisitor;
140 for(int ii = 0;ii < rps.paramList.size();++ii)
141 {
142 rps.paramList.at(ii)->accept(copyvisitor);
143 paramList.push_back(copyvisitor.lastCreated);
144 }
145 }
146 return (*this);
147 }
148
149
RichParameterSet(const RichParameterSet & rps)150 RichParameterSet::RichParameterSet( const RichParameterSet& rps )
151 {
152 clear();
153
154 RichParameterCopyConstructor copyvisitor;
155 for(int ii = 0;ii < rps.paramList.size();++ii)
156 {
157 rps.paramList.at(ii)->accept(copyvisitor);
158 paramList.push_back(copyvisitor.lastCreated);
159 }
160 }
161
RichParameterSet()162 RichParameterSet::RichParameterSet()
163 {
164
165 }
166
isEmpty() const167 bool RichParameterSet::isEmpty() const
168 {
169 return paramList.isEmpty();
170 }
171
clear()172 void RichParameterSet::clear()
173 {
174 paramList.clear();
175 }
176
join(const RichParameterSet & rps)177 RichParameterSet& RichParameterSet::join( const RichParameterSet& rps )
178 {
179 RichParameterCopyConstructor copyvisitor;
180 for(int ii = 0;ii < rps.paramList.size();++ii)
181 {
182 rps.paramList.at(ii)->accept(copyvisitor);
183 paramList.push_back(copyvisitor.lastCreated);
184 }
185 return (*this);
186 }
187 /****************************************/
188
visit(RichBool & pd)189 void RichParameterCopyConstructor::visit( RichBool& pd )
190 {
191 lastCreated = new RichBool(pd.name,pd.val->getBool(),pd.pd->defVal->getBool(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
192 }
193
visit(RichInt & pd)194 void RichParameterCopyConstructor::visit( RichInt& pd )
195 {
196 lastCreated = new RichInt(pd.name,pd.val->getInt(),pd.pd->defVal->getInt(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
197 }
198
visit(RichFloat & pd)199 void RichParameterCopyConstructor::visit( RichFloat& pd )
200 {
201 lastCreated = new RichFloat(pd.name,pd.val->getFloat(),pd.pd->defVal->getFloat(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
202 }
203
visit(RichString & pd)204 void RichParameterCopyConstructor::visit( RichString& pd )
205 {
206 lastCreated = new RichString(pd.name,pd.val->getString(),pd.pd->defVal->getString(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
207 }
208
visit(RichMatrix44f & pd)209 void RichParameterCopyConstructor::visit( RichMatrix44f& pd )
210 {
211 lastCreated = new RichMatrix44f(pd.name,pd.val->getMatrix44f(),pd.pd->defVal->getMatrix44f(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
212 }
213
visit(RichPoint3f & pd)214 void RichParameterCopyConstructor::visit( RichPoint3f& pd )
215 {
216 lastCreated = new RichPoint3f(pd.name,pd.val->getPoint3f(),pd.pd->defVal->getPoint3f(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
217 }
218
visit(RichShotf & pd)219 void RichParameterCopyConstructor::visit( RichShotf& pd )
220 {
221 lastCreated = new RichShotf(pd.name,pd.val->getShotf(),pd.pd->defVal->getShotf(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
222 }
223
visit(RichColor & pd)224 void RichParameterCopyConstructor::visit( RichColor& pd )
225 {
226 lastCreated = new RichColor(pd.name,pd.val->getColor(),pd.pd->defVal->getColor(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
227 }
228
229
visit(RichAbsPerc & pd)230 void RichParameterCopyConstructor::visit( RichAbsPerc& pd )
231 {
232 AbsPercDecoration* dec = reinterpret_cast<AbsPercDecoration*>(pd.pd);
233 lastCreated = new RichAbsPerc(pd.name,pd.val->getAbsPerc(),pd.pd->defVal->getAbsPerc(),dec->min,dec->max,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
234 }
235
visit(RichEnum & pd)236 void RichParameterCopyConstructor::visit( RichEnum& pd )
237 {
238 EnumDecoration* dec = reinterpret_cast<EnumDecoration*>(pd.pd);
239 lastCreated = new RichEnum(pd.name,pd.val->getEnum(),pd.pd->defVal->getEnum(),dec->enumvalues,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
240 }
241
visit(RichFloatList &)242 void RichParameterCopyConstructor::visit( RichFloatList& /*pd*/ )
243 {
244 /*lastCreated = new FloatListWidget(par,&pd);*/
245 }
246
visit(RichDynamicFloat & pd)247 void RichParameterCopyConstructor::visit( RichDynamicFloat& pd )
248 {
249 DynamicFloatDecoration* dec = reinterpret_cast<DynamicFloatDecoration*>(pd.pd);
250 lastCreated = new RichDynamicFloat(pd.name,pd.val->getDynamicFloat(),pd.pd->defVal->getDynamicFloat(),dec->min,dec->max,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
251 }
252
visit(RichOpenFile & pd)253 void RichParameterCopyConstructor::visit( RichOpenFile& pd )
254 {
255 OpenFileDecoration* dec = reinterpret_cast<OpenFileDecoration*>(pd.pd);
256 lastCreated = new RichOpenFile(pd.name,pd.pd->defVal->getFileName(),dec->exts,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
257 }
258
visit(RichSaveFile & pd)259 void RichParameterCopyConstructor::visit( RichSaveFile& pd )
260 {
261 SaveFileDecoration* dec = reinterpret_cast<SaveFileDecoration*>(pd.pd);
262 lastCreated = new RichSaveFile(pd.name,pd.val->getFileName(),dec->ext,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
263 }
264
visit(RichMesh & pd)265 void RichParameterCopyConstructor::visit( RichMesh& pd )
266 {
267 MeshDecoration* dec = reinterpret_cast<MeshDecoration*>(pd.pd);
268 if (dec->defVal != NULL)
269 lastCreated = new RichMesh(pd.name,pd.val->getMesh(),dec->defVal->getMesh(),dec->meshdoc,dec->fieldDesc,dec->tooltip, pd.isDerivedFromXMLParam());
270 else
271 lastCreated = new RichMesh(pd.name,dec->meshindex, pd.isDerivedFromXMLParam());
272 }
273
fillRichParameterAttribute(const QString & type,const QString & name,const QString & desc,const QString & tooltip,bool isxmlpar)274 void RichParameterXMLVisitor::fillRichParameterAttribute(const QString& type, const QString& name, const QString& desc, const QString& tooltip, bool isxmlpar)
275 {
276 parElem = docdom.createElement("Param");
277 parElem.setAttribute("name",name);
278 parElem.setAttribute("type",type);
279 parElem.setAttribute("description",desc);
280 parElem.setAttribute("tooltip",tooltip);
281 parElem.setAttribute("isxmlparam", isxmlpar);
282 }
283
fillRichParameterAttribute(const QString & type,const QString & name,const QString & val,const QString & desc,const QString & tooltip,bool isxmlpar)284 void RichParameterXMLVisitor::fillRichParameterAttribute(const QString& type,const QString& name,const QString& val,const QString& desc,const QString& tooltip, bool isxmlpar)
285 {
286 fillRichParameterAttribute(type,name,desc,tooltip, isxmlpar);
287 parElem.setAttribute("value",val);
288 }
289
visit(RichBool & pd)290 void RichParameterXMLVisitor::visit( RichBool& pd )
291 {
292 QString v;
293 if (pd.val->getBool())
294 v = "true";
295 else
296 v = "false";
297 fillRichParameterAttribute("RichBool",pd.name,v,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
298 }
299
visit(RichInt & pd)300 void RichParameterXMLVisitor::visit( RichInt& pd )
301 {
302 fillRichParameterAttribute("RichInt",pd.name,QString::number(pd.val->getInt()),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
303 }
304
visit(RichFloat & pd)305 void RichParameterXMLVisitor::visit( RichFloat& pd )
306 {
307 fillRichParameterAttribute("RichFloat",pd.name,QString::number(pd.val->getFloat()),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
308 }
309
visit(RichString & pd)310 void RichParameterXMLVisitor::visit( RichString& pd )
311 {
312 fillRichParameterAttribute("RichString",pd.name,pd.val->getString(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
313 }
314
visit(RichMatrix44f & pd)315 void RichParameterXMLVisitor::visit( RichMatrix44f& pd )
316 {
317 fillRichParameterAttribute("RichMatrix44f",pd.name,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
318 vcg::Matrix44f mat = pd.val->getMatrix44f();
319 for(unsigned int ii = 0;ii < 16;++ii)
320 parElem.setAttribute(QString("val")+QString::number(ii),QString::number(mat.V()[ii]));
321 }
322
visit(RichPoint3f & pd)323 void RichParameterXMLVisitor::visit( RichPoint3f& pd )
324 {
325 fillRichParameterAttribute("RichPoint3f",pd.name,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
326 vcg::Point3f p = pd.val->getPoint3f();
327 parElem.setAttribute("x",QString::number(p.X()));
328 parElem.setAttribute("y",QString::number(p.Y()));
329 parElem.setAttribute("z",QString::number(p.Z()));
330 }
331
visit(RichShotf & pd)332 void RichParameterXMLVisitor::visit( RichShotf& pd )
333 {
334 fillRichParameterAttribute("RichShotf",pd.name,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
335 assert(0); // TODO !!!!
336 }
337
338
visit(RichColor & pd)339 void RichParameterXMLVisitor::visit( RichColor& pd )
340 {
341 fillRichParameterAttribute("RichColor",pd.name,pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
342 QColor p = pd.val->getColor();
343 parElem.setAttribute("r",QString::number(p.red()));
344 parElem.setAttribute("g",QString::number(p.green()));
345 parElem.setAttribute("b",QString::number(p.blue()));
346 parElem.setAttribute("a",QString::number(p.alpha()));
347 }
348
visit(RichAbsPerc & pd)349 void RichParameterXMLVisitor::visit( RichAbsPerc& pd )
350 {
351 fillRichParameterAttribute("RichAbsPerc",pd.name,QString::number(pd.val->getAbsPerc()),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
352 AbsPercDecoration* dec = reinterpret_cast<AbsPercDecoration*>(pd.pd);
353 parElem.setAttribute("min",QString::number(dec->min));
354 parElem.setAttribute("max",QString::number(dec->max));
355 }
356
visit(RichEnum & pd)357 void RichParameterXMLVisitor::visit( RichEnum& pd )
358 {
359 fillRichParameterAttribute("RichEnum",pd.name,QString::number(pd.val->getEnum()),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
360 EnumDecoration* dec = reinterpret_cast<EnumDecoration*>(pd.pd);
361 parElem.setAttribute("enum_cardinality",dec->enumvalues.size());
362 for(int ii = 0; ii < dec->enumvalues.size();++ii)
363 parElem.setAttribute(QString("enum_val")+QString::number(ii),dec->enumvalues.at(ii));
364
365 }
366
visit(RichFloatList &)367 void RichParameterXMLVisitor::visit( RichFloatList& /*pd*/ )
368 {
369 assert(0);
370 }
371
visit(RichDynamicFloat & pd)372 void RichParameterXMLVisitor::visit(RichDynamicFloat& pd)
373 {
374 fillRichParameterAttribute("RichDynamicFloat",pd.name,QString::number(pd.val->getDynamicFloat()),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
375 DynamicFloatDecoration* dec = reinterpret_cast<DynamicFloatDecoration*>(pd.pd);
376 parElem.setAttribute("min",QString::number(dec->min));
377 parElem.setAttribute("max",QString::number(dec->max));
378 }
379
visit(RichOpenFile & pd)380 void RichParameterXMLVisitor::visit( RichOpenFile& pd )
381 {
382 fillRichParameterAttribute("RichOpenFile",pd.name,pd.val->getFileName(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
383 OpenFileDecoration* dec = reinterpret_cast<OpenFileDecoration*>(pd.pd);
384 parElem.setAttribute("exts_cardinality",dec->exts.size());
385 for(int ii = 0; ii < dec->exts.size();++ii)
386 parElem.setAttribute(QString("ext_val")+QString::number(ii),dec->exts[ii]);
387 }
388
visit(RichSaveFile & pd)389 void RichParameterXMLVisitor::visit( RichSaveFile& pd )
390 {
391 fillRichParameterAttribute("RichSaveFile",pd.name,pd.val->getFileName(),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
392 SaveFileDecoration* dec = reinterpret_cast<SaveFileDecoration*>(pd.pd);
393 parElem.setAttribute("ext",dec->ext);
394 }
395
visit(RichMesh & pd)396 void RichParameterXMLVisitor::visit( RichMesh& pd )
397 {
398 // MeshDecoration* dec = reinterpret_cast<MeshDecoration*>(pd.pd);
399 fillRichParameterAttribute("RichMesh",pd.name,QString::number(pd.meshindex),pd.pd->fieldDesc,pd.pd->tooltip, pd.isDerivedFromXMLParam());
400 }
401
create(const QDomElement & np,RichParameter ** par)402 bool RichParameterAdapter::create( const QDomElement& np,RichParameter** par )
403 {
404 QString name=np.attribute("name");
405 QString type=np.attribute("type");
406 QString desc=np.attribute("description");
407 QString tooltip=np.attribute("tooltip");
408
409 QString isxml = np.attribute("isxmlparam");
410 if (isxml.isNull())
411 isxml = QString("0");
412
413 // qDebug(" Reading Param with name %s : %s", qUtf8Printable(name), qUtf8Printable(type));
414
415 bool corrconv = false;
416 if(type=="RichBool")
417 {
418 QString val = np.attribute("value").toLower();
419 if ((val != QString("true")) && (val != QString("false")))
420 return false;
421 *par = new RichBool(name,np.attribute("value")!=QString("false"),desc,tooltip);
422 return true;
423 }
424
425 if(type=="RichInt")
426 {
427 int val = np.attribute("value").toInt(&corrconv);
428 if (!corrconv)
429 return false;
430 *par = new RichInt(name,val,desc,tooltip);
431 return true;
432 }
433
434 if(type=="RichFloat")
435 {
436 float val = np.attribute("value").toFloat(&corrconv);
437 if (!corrconv)
438 return false;
439 *par = new RichFloat(name,val,desc,tooltip);
440 return true;
441 }
442
443 if(type=="RichString")
444 {
445 *par = new RichString(name,np.attribute("value"),desc,tooltip);
446 return true;
447 }
448
449 if(type=="RichAbsPerc")
450 {
451 float val = np.attribute("value").toFloat(&corrconv);
452 if ((!corrconv) && (val >= 0.0f) && (val <= 100.0f))
453 return false;
454 float min = np.attribute("min").toFloat(&corrconv);
455 if (!corrconv)
456 return false;
457 float max = np.attribute("max").toFloat(&corrconv);
458 if (!corrconv)
459 return false;
460 *par = new RichAbsPerc(name,val,min,max,desc,tooltip);
461 return true;
462 }
463
464 if(type=="RichColor")
465 {
466 unsigned int r = np.attribute("r").toUInt(&corrconv);
467 if ((!corrconv) && (r <= 255))
468 return false;
469 unsigned int g = np.attribute("g").toUInt(&corrconv);
470 if ((!corrconv) && (g <= 255))
471 return false;
472 unsigned int b = np.attribute("b").toUInt(&corrconv);
473 if ((!corrconv) && (b <= 255))
474 return false;
475 unsigned int a = np.attribute("a").toUInt(&corrconv);
476 if ((!corrconv) && (a <= 255))
477 return false;
478 QColor col(r,g,b,a);
479 *par= new RichColor(name,col,desc,tooltip);
480 return true;
481 }
482
483 if(type=="RichMatrix44f")
484 {
485 Matrix44f mm;
486 for(int i=0;i<16;++i)
487 {
488 float val = np.attribute(QString("val")+QString::number(i)).toFloat(&corrconv);
489 if (!corrconv)
490 return false;
491 mm.V()[i]=val;
492 }
493 *par = new RichMatrix44f(name,mm,desc,tooltip);
494 return true;
495 }
496
497 if(type=="RichEnum")
498 {
499 QStringList list;
500 int enum_card = np.attribute(QString("enum_cardinality")).toUInt(&corrconv);
501 if (!corrconv)
502 return false;
503
504 for(int i=0;i<enum_card;++i)
505 list<<np.attribute(QString("enum_val")+QString::number(i));
506
507 int val = np.attribute("value").toInt(&corrconv);
508 if ((!corrconv) && (val >=0) && (val < enum_card))
509 return false;
510 *par = new RichEnum(name,val,list,desc,tooltip);
511 return true;
512 }
513
514 if(type == "RichMesh")
515 {
516 int val = np.attribute("value").toInt(&corrconv);
517
518 if (!corrconv)
519 return false;
520
521 *par = new RichMesh(name, val,desc,tooltip);
522 return true;
523 }
524
525 if(type == "RichFloatList")
526 {
527 //to be implemented
528 assert(0);
529 }
530
531 if(type == "RichDynamicFloat")
532 {
533 float min = np.attribute("min").toFloat(&corrconv);
534 if (!corrconv)
535 return false;
536 float max = np.attribute("max").toFloat(&corrconv);
537 if (!corrconv)
538 return false;
539
540 float val = np.attribute("value").toFloat(&corrconv);
541 if ((!corrconv) && (val >= min) && (val <= max))
542 return false;
543
544 *par = new RichDynamicFloat(name, val, min, max, desc, tooltip);
545 return true;
546 }
547
548 if(type == "RichOpenFile")
549 {
550 QStringList list;
551 int exts_card = np.attribute(QString("exts_cardinality")).toUInt(&corrconv);
552 if (!corrconv)
553 return false;
554
555 for(int i=0;i<exts_card;++i)
556 list<<np.attribute(QString("exts_val")+QString::number(i));
557
558 QString defdir = np.attribute("value");
559
560 *par = new RichOpenFile(name,defdir,list,desc,tooltip);
561 return true;
562 }
563
564 if(type == "RichSaveFile")
565 {
566 QString deffile = np.attribute("value");
567 QString ext = np.attribute("ext");
568 *par = new RichSaveFile(name,deffile,ext,desc,tooltip);
569 return true;
570 }
571
572 if(type=="RichPoint3f")
573 {
574 Point3f val;
575 val[0]=np.attribute("x").toFloat(&corrconv);
576 if (!corrconv)
577 return false;
578 val[1]=np.attribute("y").toFloat(&corrconv);
579 if (!corrconv)
580 return false;
581 val[2]=np.attribute("z").toFloat(&corrconv);
582 if (!corrconv)
583 return false;
584
585 *par = new RichPoint3f(name, val,desc,tooltip);
586 return true;
587 }
588 if(type=="RichShotf")
589 {
590 Shotf val;
591 assert(0); //TODO!!!!
592 *par = new RichShotf(name, val,desc,tooltip);
593 return true;
594 }
595
596 return false;
597 }
598
create(const QString & namepreamble,const MLXMLPluginInfo::XMLMap & xmlparam,RichParameter ** par)599 bool RichParameterAdapter::create(const QString& namepreamble, const MLXMLPluginInfo::XMLMap & xmlparam, RichParameter ** par)
600 {
601 QString tmppreamble = namepreamble;
602 if (!tmppreamble.isEmpty())
603 tmppreamble += ".";
604 QString name = tmppreamble + xmlparam[MLXMLElNames::paramName];
605 QString desc = xmlparam[MLXMLElNames::guiLabel];
606 QString tooltip = xmlparam[MLXMLElNames::paramHelpTag];
607
608 // qDebug(" Reading Param with name %s : %s", qUtf8Printable(name), qUtf8Printable(xmlparam[MLXMLElNames::paramDefExpr]));
609
610 *par = new RichString(name, xmlparam[MLXMLElNames::paramDefExpr], desc, tooltip);
611 if (par != NULL)
612 {
613 (*par)->setIsDerivedFromXMLParam(xmlparam[MLXMLElNames::paramIsPersistent] == "true");
614 return true;
615 }
616 return false;
617 }
618
convertToStringValue(RichParameter & rp)619 QString RichParameterAdapter::convertToStringValue(RichParameter& rp)
620 {
621 RichParameterValueToStringVisitor v;
622 rp.accept(v);
623 return v.stringvalue;
624 }
625
BoolValue(const bool val)626 BoolValue::BoolValue( const bool val ) : pval(val)
627 {
628
629 }
630
ParameterDecoration(Value * defvalue,const QString & desc,const QString & tltip)631 ParameterDecoration::ParameterDecoration( Value* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :fieldDesc(desc),tooltip(tltip),defVal(defvalue)
632 {
633
634 }
635
~ParameterDecoration()636 ParameterDecoration::~ParameterDecoration()
637 {
638 delete defVal;
639 }
640
BoolDecoration(BoolValue * defvalue,const QString & desc,const QString & tltip)641 BoolDecoration::BoolDecoration( BoolValue* defvalue,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
642 {
643
644 }
645
IntDecoration(IntValue * defvalue,const QString & desc,const QString & tltip)646 IntDecoration::IntDecoration( IntValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
647 {
648
649 }
650
FloatDecoration(FloatValue * defvalue,const QString & desc,const QString & tltip)651 FloatDecoration::FloatDecoration( FloatValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
652 {
653
654 }
655
StringDecoration(StringValue * defvalue,const QString & desc,const QString & tltip)656 StringDecoration::StringDecoration( StringValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
657 {
658
659 }
660
Matrix44fDecoration(Matrix44fValue * defvalue,const QString & desc,const QString & tltip)661 Matrix44fDecoration::Matrix44fDecoration( Matrix44fValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
662 {
663
664 }
665
Point3fDecoration(Point3fValue * defvalue,const QString & desc,const QString & tltip)666 Point3fDecoration::Point3fDecoration( Point3fValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
667 {
668
669 }
ShotfDecoration(ShotfValue * defvalue,const QString & desc,const QString & tltip)670 ShotfDecoration::ShotfDecoration( ShotfValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
671 {
672
673 }
674
ColorDecoration(ColorValue * defvalue,const QString & desc,const QString & tltip)675 ColorDecoration::ColorDecoration( ColorValue* defvalue,const QString& desc /*= QString()*/,const QString& tltip/*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip)
676 {
677
678 }
679
AbsPercDecoration(AbsPercValue * defvalue,const float minVal,const float maxVal,const QString & desc,const QString & tltip)680 AbsPercDecoration::AbsPercDecoration( AbsPercValue* defvalue,const float minVal,const float maxVal,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip),min(minVal),max(maxVal)
681 {
682
683 }
684
EnumDecoration(EnumValue * defvalue,QStringList values,const QString & desc,const QString & tltip)685 EnumDecoration::EnumDecoration( EnumValue* defvalue, QStringList values,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip),enumvalues(std::move(values))
686 {
687
688 }
689
DynamicFloatDecoration(DynamicFloatValue * defvalue,const float minVal,const float maxVal,const QString & desc,const QString & tltip)690 DynamicFloatDecoration::DynamicFloatDecoration( DynamicFloatValue* defvalue, const float minVal,const float maxVal,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip),min(minVal),max(maxVal)
691 {
692
693 }
694
SaveFileDecoration(FileValue * defvalue,const QString & extension,const QString & desc,const QString & tltip)695 SaveFileDecoration::SaveFileDecoration( FileValue* defvalue,const QString& extension/*=QString(".*")*/,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(defvalue,desc,tltip),ext(extension)
696 {
697
698 }
699
OpenFileDecoration(FileValue * directorydefvalue,const QStringList & extensions,const QString & desc,const QString & tltip)700 OpenFileDecoration::OpenFileDecoration( FileValue* directorydefvalue,const QStringList& extensions,const QString& desc /*= QString()*/,const QString& tltip /*= QString()*/ ) :ParameterDecoration(directorydefvalue,desc,tltip),exts(extensions)
701 {
702
703 }
704
MeshDecoration(MeshValue * defvalue,MeshDocument * doc,const QString & desc,const QString & tltip)705 MeshDecoration::MeshDecoration( MeshValue* defvalue,MeshDocument* doc,const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/ ) :ParameterDecoration(defvalue,desc,tltip),meshdoc(doc)
706 {
707 meshindex = -1;
708 if (doc != NULL)
709 meshindex = doc->meshList.indexOf(defvalue->getMesh());
710 assert((meshindex != -1) || (doc == NULL));
711 }
712
MeshDecoration(int meshind,MeshDocument * doc,const QString & desc,const QString & tltip)713 MeshDecoration::MeshDecoration( int meshind,MeshDocument* doc,const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/ ) :ParameterDecoration(NULL,desc,tltip),meshdoc(doc)
714 {
715 assert(meshind < doc->size() && meshind >= 0);
716 meshindex = meshind;
717 if (doc != NULL)
718 defVal = new MeshValue(doc->meshList.at(meshind));
719 }
720
MeshDecoration(int meshind,const QString & desc,const QString & tooltip)721 MeshDecoration::MeshDecoration( int meshind,const QString& desc/*=QString()*/,const QString& tooltip/*=QString()*/) :ParameterDecoration(NULL,desc,tooltip),meshdoc(NULL),meshindex(meshind)
722 {
723
724 }
725
RichParameter(const QString & nm,Value * v,ParameterDecoration * prdec,bool isxmlpar)726 RichParameter::RichParameter(const QString& nm, Value* v, ParameterDecoration* prdec, bool isxmlpar) : name(nm), val(v), pd(prdec), isxmlparam(isxmlpar)
727 {
728
729 }
730
~RichParameter()731 RichParameter::~RichParameter()
732 {
733 delete val;delete pd;
734 }
735 /*
736 RichBool::RichBool( const QString nm,const bool defval) : RichParameter(nm,new BoolValue(defval),new BoolDecoration(new BoolValue(defval),"",""))
737 {
738
739 }
740 RichBool::RichBool( const QString nm,const bool defval,const QString desc) : RichParameter(nm,new BoolValue(defval),new BoolDecoration(new BoolValue(defval),desc,""))
741 {
742
743 }
744 */
RichBool(const QString & nm,const bool defval,const QString & desc,const QString & tltip)745 RichBool::RichBool( const QString& nm,const bool defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) : RichParameter(nm,new BoolValue(defval),new BoolDecoration(new BoolValue(defval),desc,tltip))
746 {}
747
748
RichBool(const QString & nm,const bool val,const bool defval,const QString & desc,const QString & tltip,bool isxmlpar)749 RichBool::RichBool(const QString& nm, const bool val, const bool defval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new BoolValue(val), new BoolDecoration(new BoolValue(defval), desc, tltip), isxmlpar)
750 {}
751
accept(Visitor & v)752 void RichBool::accept( Visitor& v )
753 {
754 v.visit(*this);
755 }
756
operator ==(const RichParameter & rb)757 bool RichBool::operator==( const RichParameter& rb )
758 {
759 return (rb.val->isBool() && (name == rb.name) && (val->getBool() == rb.val->getBool()));
760 }
761
~RichBool()762 RichBool::~RichBool()
763 {
764
765 }
766
RichInt(const QString & nm,const int defval,const QString & desc,const QString & tltip)767 RichInt::RichInt( const QString& nm,const int defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new IntValue(defval),new IntDecoration(new IntValue(defval),desc,tltip))
768 {
769
770 }
771
RichInt(const QString & nm,const int val,const int defval,const QString & desc,const QString & tltip,bool isxmlpar)772 RichInt::RichInt(const QString& nm, const int val, const int defval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new IntValue(val), new IntDecoration(new IntValue(defval), desc, tltip), isxmlpar)
773 {
774
775 }
776
accept(Visitor & v)777 void RichInt::accept( Visitor& v )
778 {
779 v.visit(*this);
780 }
781
operator ==(const RichParameter & rb)782 bool RichInt::operator==( const RichParameter& rb )
783 {
784 return (rb.val->isInt() &&(name == rb.name) && (val->getInt() == rb.val->getInt()));
785 }
786
~RichInt()787 RichInt::~RichInt()
788 {
789
790 }
791
RichFloat(const QString & nm,const float defval,const QString & desc,const QString & tltip)792 RichFloat::RichFloat( const QString& nm,const float defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new FloatValue(defval),new FloatDecoration(new FloatValue(defval),desc,tltip))
793 {
794
795 }
796
RichFloat(const QString & nm,const float val,const float defval,const QString & desc,const QString & tltip,bool isxmlpar)797 RichFloat::RichFloat(const QString& nm, const float val, const float defval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new FloatValue(val), new FloatDecoration(new FloatValue(defval), desc, tltip), isxmlpar)
798 {
799
800 }
801
accept(Visitor & v)802 void RichFloat::accept( Visitor& v )
803 {
804 v.visit(*this);
805 }
806
operator ==(const RichParameter & rb)807 bool RichFloat::operator==( const RichParameter& rb )
808 {
809 return (rb.val->isFloat() &&(name == rb.name) && (val->getFloat() == rb.val->getFloat()));
810 }
811
~RichFloat()812 RichFloat::~RichFloat()
813 {
814
815 }
816
RichString(const QString & nm,const QString & defval,const QString & desc,const QString & tltip)817 RichString::RichString( const QString& nm,const QString& defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new StringValue(defval),new StringDecoration(new StringValue(defval),desc,tltip))
818 {
819
820 }
821
RichString(const QString & nm,const QString & val,const QString & defval,const QString & desc,const QString & tltip,bool isxmlpar)822 RichString::RichString(const QString& nm, const QString& val, const QString& defval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new StringValue(val), new StringDecoration(new StringValue(defval), desc, tltip), isxmlpar)
823 {
824
825 }
826
RichString(const QString & nm,const QString & defval)827 RichString::RichString( const QString& nm,const QString& defval ) : RichParameter(nm,new StringValue(defval),new StringDecoration(new StringValue(defval),"",""))
828 {
829
830 }
831
RichString(const QString & nm,const QString & defval,const QString & desc)832 RichString::RichString( const QString& nm,const QString& defval,const QString& desc ) : RichParameter(nm,new StringValue(defval),new StringDecoration(new StringValue(defval),desc,""))
833 {
834
835 }
836
accept(Visitor & v)837 void RichString::accept( Visitor& v )
838 {
839 v.visit(*this);
840 }
841
operator ==(const RichParameter & rb)842 bool RichString::operator==( const RichParameter& rb )
843 {
844 return (rb.val->isString() &&(name == rb.name) && (val->getString() == rb.val->getString()));
845 }
846
~RichString()847 RichString::~RichString()
848 {
849
850 }
851
RichMatrix44f(const QString & nm,const vcg::Matrix44f & defval,const QString & desc,const QString & tltip)852 RichMatrix44f::RichMatrix44f( const QString& nm,const vcg::Matrix44f& defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new Matrix44fValue(defval),new Matrix44fDecoration(new Matrix44fValue(defval),desc,tltip)) { }
RichMatrix44f(const QString & nm,const vcg::Matrix44d & defval,const QString & desc,const QString & tltip)853 RichMatrix44f::RichMatrix44f( const QString& nm,const vcg::Matrix44d& defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new Matrix44fValue(defval),new Matrix44fDecoration(new Matrix44fValue(defval),desc,tltip)) { }
854
RichMatrix44f(const QString & nm,const vcg::Matrix44f & val,const vcg::Matrix44f & defval,const QString & desc,const QString & tltip,bool)855 RichMatrix44f::RichMatrix44f(const QString& nm, const vcg::Matrix44f& val, const vcg::Matrix44f& defval, const QString& desc /*= QString()*/, const QString& tltip /*= QString()*/, bool /*isxmlpar = false*/)
856 : RichParameter(nm, new Matrix44fValue(val), new Matrix44fDecoration(new Matrix44fValue(defval), desc, tltip)) { }
857
accept(Visitor & v)858 void RichMatrix44f::accept( Visitor& v )
859 {
860 v.visit(*this);
861 }
862
operator ==(const RichParameter & rb)863 bool RichMatrix44f::operator==( const RichParameter& rb )
864 {
865 return (rb.val->isMatrix44f() &&(name == rb.name) && (val->getMatrix44f() == rb.val->getMatrix44f()));
866 }
867
~RichMatrix44f()868 RichMatrix44f::~RichMatrix44f()
869 {
870
871 }
872
RichPoint3f(const QString & nm,const vcg::Point3f & defval,const QString & desc,const QString & tltip)873 RichPoint3f::RichPoint3f( const QString& nm,const vcg::Point3f& defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new Point3fValue(defval),new Point3fDecoration(new Point3fValue(defval),desc,tltip)){}
RichPoint3f(const QString & nm,const vcg::Point3d & defval,const QString & desc,const QString & tltip)874 RichPoint3f::RichPoint3f( const QString& nm,const vcg::Point3d& defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new Point3fValue(defval),new Point3fDecoration(new Point3fValue(defval),desc,tltip)){}
875
RichPoint3f(const QString & nm,const vcg::Point3f & val,const vcg::Point3f & defval,const QString & desc,const QString & tltip,bool isxmlpar)876 RichPoint3f::RichPoint3f(const QString& nm, const vcg::Point3f& val, const vcg::Point3f& defval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new Point3fValue(val), new Point3fDecoration(new Point3fValue(defval), desc, tltip), isxmlpar)
877 {
878
879 }
880
accept(Visitor & v)881 void RichPoint3f::accept( Visitor& v )
882 {
883 v.visit(*this);
884 }
885
operator ==(const RichParameter & rb)886 bool RichPoint3f::operator==( const RichParameter& rb )
887 {
888 return (rb.val->isPoint3f() &&(name == rb.name) && (val->getPoint3f() == rb.val->getPoint3f()));
889 }
890
~RichPoint3f()891 RichPoint3f::~RichPoint3f()
892 {
893
894 }
895 //----
RichShotf(const QString & nm,const vcg::Shotf & defval,const QString & desc,const QString & tltip)896 RichShotf::RichShotf( const QString& nm,const vcg::Shotf& defval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new ShotfValue(defval),new ShotfDecoration(new ShotfValue(defval),desc,tltip))
897 {}
898
RichShotf(const QString & nm,const vcg::Shotf & val,const vcg::Shotf & defval,const QString & desc,const QString & tltip,bool isxmlpar)899 RichShotf::RichShotf(const QString& nm, const vcg::Shotf& val, const vcg::Shotf& defval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new ShotfValue(val), new ShotfDecoration(new ShotfValue(defval), desc, tltip), isxmlpar)
900 {}
901
accept(Visitor & v)902 void RichShotf::accept( Visitor& v )
903 {
904 v.visit(*this);
905 }
906
operator ==(const RichParameter & rb)907 bool RichShotf::operator==( const RichParameter& rb )
908 {
909 return (rb.val->isShotf() &&(name == rb.name) ); // TODO REAL TEST OF EQUALITY // && (val->getShotf() == rb.val->getShotf()));
910 }
911
~RichShotf()912 RichShotf::~RichShotf()
913 { }
914 //----
RichColor(const QString & nm,const QColor & defval,const QString & desc,const QString & tltip)915 RichColor::RichColor( const QString& nm,const QColor& defval,const QString& desc,const QString& tltip ) :RichParameter(nm,new ColorValue(defval),new ColorDecoration(new ColorValue(defval),desc,tltip))
916 {
917
918 }
919
RichColor(const QString & nm,const QColor & val,const QColor & defval,const QString & desc,const QString & tltip,bool isxmlpar)920 RichColor::RichColor(const QString& nm, const QColor& val, const QColor& defval, const QString& desc, const QString& tltip, bool isxmlpar) : RichParameter(nm, new ColorValue(val), new ColorDecoration(new ColorValue(defval), desc, tltip), isxmlpar)
921 {
922
923 }
924
RichColor(const QString & nm,const QColor & defval)925 RichColor::RichColor( const QString& nm,const QColor& defval )
926 :RichParameter(nm,new ColorValue(defval),new ColorDecoration(new ColorValue(defval),"",""))
927 {
928
929 }
930
RichColor(const QString & nm,const QColor & defval,const QString & desc)931 RichColor::RichColor( const QString& nm,const QColor& defval,const QString& desc )
932 :RichParameter(nm,new ColorValue(defval),new ColorDecoration(new ColorValue(defval),desc,""))
933 {
934 }
935
accept(Visitor & v)936 void RichColor::accept( Visitor& v )
937 {
938 v.visit(*this);
939 }
940
operator ==(const RichParameter & rb)941 bool RichColor::operator==( const RichParameter& rb )
942 {
943 return (rb.val->isColor() &&(name == rb.name) && (val->getColor() == rb.val->getColor()));
944 }
945
~RichColor()946 RichColor::~RichColor()
947 {
948
949 }
950
RichAbsPerc(const QString & nm,const float defval,const float minval,const float maxval,const QString & desc,const QString & tltip)951 RichAbsPerc::RichAbsPerc( const QString& nm,const float defval,const float minval,const float maxval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm, new AbsPercValue(defval), new AbsPercDecoration(new AbsPercValue(defval),minval,maxval,desc,tltip))
952 {
953
954 }
955
RichAbsPerc(const QString & nm,const float val,const float defval,const float minval,const float maxval,const QString & desc,const QString & tltip,bool isxmlpar)956 RichAbsPerc::RichAbsPerc(const QString& nm, const float val, const float defval, const float minval, const float maxval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new AbsPercValue(val), new AbsPercDecoration(new AbsPercValue(defval), minval, maxval, desc, tltip), isxmlpar)
957 {
958
959 }
960
accept(Visitor & v)961 void RichAbsPerc::accept( Visitor& v )
962 {
963 v.visit(*this);
964 }
965
operator ==(const RichParameter & rb)966 bool RichAbsPerc::operator==( const RichParameter& rb )
967 {
968 return (rb.val->isAbsPerc() &&(name == rb.name) && (val->getAbsPerc() == rb.val->getAbsPerc()));
969 }
970
~RichAbsPerc()971 RichAbsPerc::~RichAbsPerc()
972 {
973
974 }
975
RichEnum(const QString & nm,const int defval,const QStringList & values,const QString & desc,const QString & tltip)976 RichEnum::RichEnum( const QString& nm,const int defval,const QStringList& values,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new EnumValue(defval),new EnumDecoration(new EnumValue(defval),values,desc,tltip))
977 {
978
979 }
980
RichEnum(const QString & nm,const int val,const int defval,const QStringList & values,const QString & desc,const QString & tltip,bool isxmlpar)981 RichEnum::RichEnum(const QString& nm, const int val, const int defval, const QStringList& values, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new EnumValue(val), new EnumDecoration(new EnumValue(defval), values, desc, tltip), isxmlpar)
982 {
983
984 }
985
accept(Visitor & v)986 void RichEnum::accept( Visitor& v )
987 {
988 v.visit(*this);
989 }
990
operator ==(const RichParameter & rb)991 bool RichEnum::operator==( const RichParameter& rb )
992 {
993 return (rb.val->isEnum() &&(name == rb.name) && (val->getEnum() == rb.val->getEnum()));
994 }
995
~RichEnum()996 RichEnum::~RichEnum()
997 {
998
999 }
1000
RichMesh(const QString & nm,MeshModel * defval,MeshDocument * doc,const QString & desc,const QString & tltip)1001 RichMesh::RichMesh( const QString& nm,MeshModel* defval,MeshDocument* doc,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ )
1002 :RichParameter(nm, new MeshValue(defval),new MeshDecoration( new MeshValue(defval),doc,desc,tltip))
1003 {
1004 meshindex = -1;
1005 if (doc != NULL)
1006 meshindex = doc->meshList.indexOf(defval);
1007 assert((meshindex != -1) || (doc == NULL));
1008 }
1009
RichMesh(const QString & nm,int meshind,MeshDocument * doc,const QString & desc,const QString & tltip)1010 RichMesh::RichMesh( const QString& nm,int meshind,MeshDocument* doc,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ )
1011 :RichParameter(nm,NULL, new MeshDecoration(meshind,doc,desc,tltip))
1012 {
1013 assert(meshind < doc->size() && meshind >= 0);
1014 meshindex = meshind;
1015 if (doc != NULL)
1016 val = new MeshValue(doc->meshList.at(meshindex));
1017 else
1018 val = NULL;
1019 }
1020
RichMesh(const QString & nm,int meshind,bool isxmlpar)1021 RichMesh::RichMesh(const QString& nm, int meshind, bool isxmlpar /*= false*/)
1022 : RichParameter(nm, new MeshValue(NULL), new MeshDecoration(meshind), isxmlpar)
1023 {
1024 meshindex = meshind;
1025 }
1026
RichMesh(const QString & nm,MeshModel * val,MeshModel * defval,MeshDocument * doc,const QString & desc,const QString & tltip,bool isxmlpar)1027 RichMesh::RichMesh(const QString& nm, MeshModel* val, MeshModel* defval, MeshDocument* doc, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar)
1028 : RichParameter(nm, new MeshValue(val), new MeshDecoration(new MeshValue(defval), doc, desc, tltip), isxmlpar)
1029 {
1030 meshindex = -1;
1031 if (doc != NULL)
1032 meshindex = doc->meshList.indexOf(val);
1033 }
1034
RichMesh(const QString & nm,int meshind,const QString & desc,const QString & tltip,bool isxmlpar)1035 RichMesh::RichMesh(const QString& nm, int meshind, const QString& desc /*= QString()*/, const QString& tltip /*= QString()*/, bool isxmlpar /*= false*/)
1036 : RichParameter(nm, new MeshValue(NULL), new MeshDecoration(meshind, desc, tltip), isxmlpar)
1037 {
1038 meshindex = meshind;
1039 }
1040
accept(Visitor & v)1041 void RichMesh::accept( Visitor& v )
1042 {
1043 v.visit(*this);
1044 }
1045
operator ==(const RichParameter & rb)1046 bool RichMesh::operator==( const RichParameter& rb )
1047 {
1048 return (rb.val->isMesh() &&(name == rb.name) && (val->getMesh() == rb.val->getMesh()));
1049 }
1050
~RichMesh()1051 RichMesh::~RichMesh()
1052 {
1053
1054 }
1055
RichFloatList(const QString & nm,FloatListValue * v,FloatListDecoration * prdec)1056 RichFloatList::RichFloatList( const QString& nm,FloatListValue* v,FloatListDecoration* prdec ) :RichParameter(nm,v,prdec)
1057 {
1058
1059 }
1060
RichFloatList(const QString & nm,FloatListValue *,FloatListValue * v,FloatListDecoration * prdec,bool isxmlpar)1061 RichFloatList::RichFloatList(const QString& nm, FloatListValue* /*val*/, FloatListValue* v, FloatListDecoration* prdec, bool isxmlpar) : RichParameter(nm, v, prdec, isxmlpar)
1062 {
1063
1064 }
1065
accept(Visitor & v)1066 void RichFloatList::accept( Visitor& v )
1067 {
1068 v.visit(*this);
1069 }
1070
operator ==(const RichParameter & rb)1071 bool RichFloatList::operator==( const RichParameter& rb )
1072 {
1073 return (rb.val->isFloatList() &&(name == rb.name) && (val->getFloatList() == rb.val->getFloatList()));
1074 }
1075
~RichFloatList()1076 RichFloatList::~RichFloatList()
1077 {
1078
1079 }
1080
RichDynamicFloat(const QString & nm,const float defval,const float minval,const float maxval,const QString & desc,const QString & tltip)1081 RichDynamicFloat::RichDynamicFloat( const QString& nm,const float defval,const float minval,const float maxval,const QString& desc/*=QString()*/,const QString& tltip/*=QString()*/ ) :RichParameter(nm,new DynamicFloatValue(defval),new DynamicFloatDecoration(new DynamicFloatValue(defval),minval,maxval,desc,tltip))
1082 {
1083
1084 }
1085
RichDynamicFloat(const QString & nm,const float val,const float defval,const float minval,const float maxval,const QString & desc,const QString & tltip,bool isxmlpar)1086 RichDynamicFloat::RichDynamicFloat(const QString& nm, const float val, const float defval, const float minval, const float maxval, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) : RichParameter(nm, new DynamicFloatValue(val), new DynamicFloatDecoration(new DynamicFloatValue(defval), minval, maxval, desc, tltip), isxmlpar)
1087 {
1088
1089 }
1090
accept(Visitor & v)1091 void RichDynamicFloat::accept( Visitor& v )
1092 {
1093 v.visit(*this);
1094 }
1095
operator ==(const RichParameter & rb)1096 bool RichDynamicFloat::operator==( const RichParameter& rb )
1097 {
1098 return (rb.val->isDynamicFloat() &&(name == rb.name) && (val->getDynamicFloat() == rb.val->getDynamicFloat()));
1099 }
1100
~RichDynamicFloat()1101 RichDynamicFloat::~RichDynamicFloat()
1102 {
1103
1104 }
1105
RichOpenFile(const QString & nm,const QString & directorydefval,const QStringList & exts,const QString & desc,const QString & tltip,bool isxmlpar)1106 RichOpenFile::RichOpenFile(const QString& nm, const QString& directorydefval, const QStringList& exts /*= QString("*.*")*/, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) :RichParameter(nm, new FileValue(directorydefval), new OpenFileDecoration(new FileValue(directorydefval), exts, desc, tltip), isxmlpar)
1107 {
1108 }
1109
accept(Visitor & v)1110 void RichOpenFile::accept( Visitor& v )
1111 {
1112 v.visit(*this);
1113 }
1114
operator ==(const RichParameter & rb)1115 bool RichOpenFile::operator==( const RichParameter& rb )
1116 {
1117 return (rb.val->isFileName() &&(name == rb.name) && (val->getFileName() == rb.val->getFileName()));
1118 }
1119
~RichOpenFile()1120 RichOpenFile::~RichOpenFile()
1121 {
1122
1123 }
1124
RichSaveFile(const QString & nm,const QString & filedefval,const QString & ext,const QString & desc,const QString & tltip,bool isxmlpar)1125 RichSaveFile::RichSaveFile(const QString& nm, const QString& filedefval, const QString& ext, const QString& desc/*=QString()*/, const QString& tltip/*=QString()*/, bool isxmlpar) :RichParameter(nm, new FileValue(filedefval), new SaveFileDecoration(new FileValue(filedefval), ext, desc, tltip), isxmlpar)
1126 {
1127
1128 }
1129
accept(Visitor & v)1130 void RichSaveFile::accept( Visitor& v )
1131 {
1132 v.visit(*this);
1133 }
1134
operator ==(const RichParameter & rb)1135 bool RichSaveFile::operator==( const RichParameter& rb )
1136 {
1137 return (rb.val->isFileName() &&(name == rb.name) && (val->getFileName() == rb.val->getFileName()));
1138 }
1139
~RichSaveFile()1140 RichSaveFile::~RichSaveFile()
1141 {
1142
1143 }
1144
visit(RichBool & pd)1145 void RichParameterValueToStringVisitor::visit( RichBool& pd )
1146 {
1147 if (pd.val == NULL)
1148 return;
1149 stringvalue.clear();
1150 if (pd.val->getBool())
1151 stringvalue = "true";
1152 else
1153 stringvalue = "false";
1154 }
1155
visit(RichInt & pd)1156 void RichParameterValueToStringVisitor::visit( RichInt& pd )
1157 {
1158 if (pd.val == NULL)
1159 return;
1160 stringvalue.clear();
1161 stringvalue = QString::number(pd.val->getInt());
1162 }
1163
visit(RichFloat & pd)1164 void RichParameterValueToStringVisitor::visit( RichFloat& pd )
1165 {
1166 if (pd.val == NULL)
1167 return;
1168 stringvalue.clear();
1169 stringvalue = QString::number(pd.val->getFloat());
1170 }
1171
visit(RichString & pd)1172 void RichParameterValueToStringVisitor::visit( RichString& pd )
1173 {
1174 if (pd.val == NULL)
1175 return;
1176 stringvalue.clear();
1177 stringvalue = "\"" + pd.val->getString()+"\"";
1178 }
1179
visit(RichMatrix44f & pd)1180 void RichParameterValueToStringVisitor::visit( RichMatrix44f& pd )
1181 {
1182 if (pd.val == NULL)
1183 return;
1184 stringvalue.clear();
1185 QString tmp("[");
1186 vcg::Matrix44f mat = pd.val->getMatrix44f();
1187 for(int ii = 0;ii < 4;++ii)
1188 {
1189 for(int jj = 0;jj < 4;++jj)
1190 tmp = tmp + QString::number(mat[ii][jj]) + ",";
1191 }
1192 tmp.replace(tmp.lastIndexOf(","),1,"]");
1193 stringvalue = tmp;
1194 }
1195
visit(RichPoint3f & pd)1196 void RichParameterValueToStringVisitor::visit( RichPoint3f& pd )
1197 {
1198 if (pd.val == NULL)
1199 return;
1200 stringvalue.clear();
1201 QString tmp("[");
1202 vcg::Point3f mat = pd.val->getPoint3f();
1203 for(int ii = 0;ii < 3;++ii)
1204 {
1205 tmp = tmp + QString::number(mat[ii]) + ",";
1206 }
1207 tmp.replace(tmp.lastIndexOf(","),1,"]");
1208 stringvalue = tmp;
1209 }
1210
visit(RichShotf &)1211 void RichParameterValueToStringVisitor::visit( RichShotf& /*pd*/ )
1212 {
1213
1214 }
1215
visit(RichColor & pd)1216 void RichParameterValueToStringVisitor::visit( RichColor& pd )
1217 {
1218 if (pd.val == NULL)
1219 return;
1220 stringvalue.clear();
1221 QString tmp("[");
1222 QColor mat = pd.val->getColor();
1223 tmp = tmp + QString::number(mat.red()) + "," + QString::number(mat.green()) + "," + QString::number(mat.blue()) + "," + QString::number(mat.alpha()) + "]";
1224 stringvalue = tmp;
1225 }
1226
visit(RichAbsPerc & pd)1227 void RichParameterValueToStringVisitor::visit( RichAbsPerc& pd )
1228 {
1229 if (pd.val == NULL)
1230 return;
1231 stringvalue.clear();
1232 stringvalue = QString::number(pd.val->getAbsPerc());
1233 }
1234
visit(RichEnum & pd)1235 void RichParameterValueToStringVisitor::visit( RichEnum& pd )
1236 {
1237 if (pd.val == NULL)
1238 return;
1239 stringvalue.clear();
1240 stringvalue = QString::number(pd.val->getEnum());
1241 }
1242
visit(RichFloatList &)1243 void RichParameterValueToStringVisitor::visit( RichFloatList& /*pd*/ )
1244 {
1245
1246 }
1247
visit(RichDynamicFloat & pd)1248 void RichParameterValueToStringVisitor::visit( RichDynamicFloat& pd )
1249 {
1250 if (pd.val == NULL)
1251 return;
1252 stringvalue.clear();
1253 stringvalue = QString::number(pd.val->getDynamicFloat());
1254 }
1255
visit(RichOpenFile &)1256 void RichParameterValueToStringVisitor::visit( RichOpenFile& /*pd*/ )
1257 {
1258
1259 }
1260
visit(RichSaveFile &)1261 void RichParameterValueToStringVisitor::visit( RichSaveFile& /*pd*/ )
1262 {
1263
1264 }
1265
visit(RichMesh &)1266 void RichParameterValueToStringVisitor::visit( RichMesh& /*pd*/ )
1267 {
1268
1269 }
1270
1271