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