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 #ifndef SCRIPTINTERFACE_H
25 #define SCRIPTINTERFACE_H
26 
27 #include <QtScript>
28 #include "meshmodel.h"
29 #include "filterparameter.h"
30 #include "xmlfilterinfo.h"
31 #include "vcg/space/point3.h"
32 
33 
34 class ScriptAdapterGenerator
35 {
36 private:
37     QString parNames(const RichParameterSet& set) const;
optName()38     static inline QString optName() {return QString("optional");}
meshID()39     static inline QString meshID() {return QString ("meshID");}
40 public:
41 
meshDocVarName()42     inline static const QString meshDocVarName() {return QString("meshDoc");}
43 
44     QString mergeOptParamsCodeGenerator() const;
45     QString parNames(const QString&  filterName,MLXMLPluginInfo& xmlInfo) const;
46     QString funCodeGenerator(const QString&  filtername,const RichParameterSet& set) const;
47     QString funCodeGenerator(const QString&  filtername,MLXMLPluginInfo& xmlInfo) const;
48 
49 };
50 
51 
52 //QScriptValue PluginInterfaceInit(QScriptContext *context, QScriptEngine *engine, void * param);
53 //QScriptValue PluginInterfaceApply(QScriptContext *context, QScriptEngine *engine, void * param);
54 QScriptValue PluginInterfaceApplyXML(QScriptContext *context, QScriptEngine *engine, void * param);
55 
56 QScriptValue IRichParameterSet_prototype_setBool(QScriptContext* c,QScriptEngine* e);
57 QScriptValue IRichParameterSet_prototype_setInt(QScriptContext* c,QScriptEngine* e);
58 QScriptValue IRichParameterSet_prototype_setAbsPerc(QScriptContext* c,QScriptEngine* e);
59 QScriptValue IRichParameterSet_prototype_setFloat(QScriptContext* c,QScriptEngine* e);
60 
61 QScriptValue IRichParameterSet_ctor(QScriptContext* c,QScriptEngine* e);
62 
63 QScriptValue myprint (QScriptContext* sc, QScriptEngine* se);
64 
65 
66 typedef Point3m VCGPoint3SI;
67 typedef QVector<QVector<Scalarm> > Point3Vector;
68 
69 
70 class ScriptInterfaceUtilities
71 {
72 public:
73     static QVector<Scalarm> vcgPoint2ToVector2(const Point2m& p);
74     static Point2m vector2ToVcgPoint2(const QVector<Scalarm>& v);
75     static vcg::Point2i vector2ToVcgPoint2i(const QVector<Scalarm>& v);
76     static QVector<Scalarm> vcgPoint3ToVector3(const Point3m &p);
77     static Point3m vector3ToVcgPoint3(const QVector<Scalarm>& v);
78     static QVector<Scalarm> vcgPoint4ToVector4(const Point4m& p);
79     static Point4m vector4ToVcgPoint4(const QVector<Scalarm>& v);
80     static QVector<Scalarm> vcgMatrix44ToVector16(const Matrix44m& m);
81     static Matrix44m vector16ToVcgMatrix44(const QVector<Scalarm>& v);
82 };
83 
84 //class VCGPoint3fSI : public QObject
85 //{
86 //	Q_OBJECT
87 //public:
88 //
89 //	VCGPoint3fSI& operator =(const VCGPoint3fSI& b);
90 //	VCGPoint3fSI();
91 //	VCGPoint3fSI(const float x,const float y,const float z);
92 //	Q_INVOKABLE void add(const VCGPoint3fSI& p);
93 //	Q_INVOKABLE void mult(const float s);
94 //	//Q_INVOKABLE VCGPoint3fSI& set(const float x,const float y,const float z);
95 //	vcg::Point3f pp;
96 //};
97 
98 
99 
100 class VCGVertexSI : public QObject
101 {
102     Q_OBJECT
103 public:
104     VCGVertexSI(CMeshO::VertexType& v);
105 
106     //Q_INVOKABLE vcg::Point3f* p();
107     Q_INVOKABLE QVector<Scalarm> getP();
108     Q_INVOKABLE VCGPoint3SI getPoint();
109     Q_INVOKABLE void setPC(const Scalarm x,const Scalarm y,const Scalarm z);
110     Q_INVOKABLE void setP(const QVector<Scalarm>& p);
111     Q_INVOKABLE void setPoint(const VCGPoint3SI& p);
112     Q_INVOKABLE QVector<Scalarm> getN();
113     Q_INVOKABLE VCGPoint3SI getNormal();
114     Q_INVOKABLE void setNormal(const VCGPoint3SI& p);
115     Q_INVOKABLE void setN(const Scalarm x,const Scalarm y,const Scalarm z);
116 
117     CMeshO::VertexType& vv;
118 };
119 
120 class MeshModelSI;
121 
122 class MeshDocumentSI : public QObject
123 {
124     Q_OBJECT
125 
126 public:
127     MeshDocumentSI(MeshDocument* doc);
~MeshDocumentSI()128     ~MeshDocumentSI(){}
129 
130     Q_INVOKABLE MeshModelSI* getMesh(const int meshId);
131     Q_INVOKABLE MeshModelSI* operator[](const QString& name);
132     Q_INVOKABLE MeshModelSI* getMeshByName(const QString& name);
133     Q_INVOKABLE MeshModelSI* current();
134     Q_INVOKABLE int currentId();
135     Q_INVOKABLE int setCurrent(const int meshId);
136     MeshDocument* md;
137 };
138 
139 class ShotSI;
140 
141 class MeshModelSI : public QObject
142 {
143     Q_OBJECT
144 
145 public:
146     MeshModelSI(MeshModel& meshModel,MeshDocumentSI* mdsi);
147 
148     Q_INVOKABLE int id() const;
149     Q_INVOKABLE Scalarm bboxDiag() const;
150     Q_INVOKABLE QVector<Scalarm> bboxMin() const;
151     Q_INVOKABLE QVector<Scalarm> bboxMax() const;
computeMinVQ()152 Q_INVOKABLE inline Scalarm computeMinVQ() const {  return vcg::tri::Stat<CMeshO>::ComputePerVertexQualityMinMax(mm.cm).first;  }
computeMaxVQ()153 Q_INVOKABLE inline Scalarm computeMaxVQ() const {  return vcg::tri::Stat<CMeshO>::ComputePerVertexQualityMinMax(mm.cm).second; }
computeMinFQ()154 Q_INVOKABLE inline Scalarm computeMinFQ() const {  return vcg::tri::Stat<CMeshO>::ComputePerFaceQualityMinMax(mm.cm).first;  }
computeMaxFQ()155 Q_INVOKABLE inline Scalarm computeMaxFQ() const {  return vcg::tri::Stat<CMeshO>::ComputePerFaceQualityMinMax(mm.cm).second; }
156 
157     Q_INVOKABLE QVector<VCGVertexSI*> vert();
158     Q_INVOKABLE Point3Vector getVertPosArray();
159     Q_INVOKABLE Point3Vector getVertNormArray();
160     Q_INVOKABLE void setVertPosArray(const Point3Vector& pa);
161     Q_INVOKABLE void setVertNormArray(const Point3Vector& na);
162     //Q_INVOKABLE void setV(const QVector<VCGVertexSI*>& v);
label()163     Q_INVOKABLE QString label() const { return mm.label(); }
164     Q_INVOKABLE int vn() const;
165     Q_INVOKABLE int fn() const;
166     Q_INVOKABLE VCGVertexSI* v(const int ind);
167     Q_INVOKABLE ShotSI* shot();
168 
169     MeshModel& mm;
170 };
171 
172 
173 //Q_DECLARE_METATYPE(Scalarm)
174 //QScriptValue ScalarmToScriptValue(QScriptEngine* eng,Scalarm* const& in);
175 //
176 //void ScalarmFromScriptValue(const QScriptValue& val,Scalarm*& out);
177 
178 Q_DECLARE_METATYPE(MeshDocumentSI*)
179 QScriptValue MeshDocumentScriptInterfaceToScriptValue(QScriptEngine* eng,MeshDocumentSI* const& in);
180 
181 void MeshDocumentScriptInterfaceFromScriptValue(const QScriptValue& val,MeshDocumentSI*& out);
182 
183 Q_DECLARE_METATYPE(MeshModelSI*)
184 
185 QScriptValue MeshModelScriptInterfaceToScriptValue(QScriptEngine* eng,MeshModelSI* const& in);
186 
187 void MeshModelScriptInterfaceFromScriptValue(const QScriptValue& val,MeshModelSI*& out);
188 
189 Q_DECLARE_METATYPE(VCGVertexSI*)
190 
191 QScriptValue VCGVertexScriptInterfaceToScriptValue(QScriptEngine* eng,VCGVertexSI* const& in);
192 
193 void VCGVertexScriptInterfaceFromScriptValue(const QScriptValue& val,VCGVertexSI*& out);
194 
195 
196 Q_DECLARE_METATYPE(QVector<Scalarm>)
197 Q_DECLARE_METATYPE(QVector<Scalarm>*)
198 Q_DECLARE_METATYPE(Point3Vector)
199 Q_DECLARE_METATYPE(QVector<VCGVertexSI*>)
200 
201 Q_DECLARE_METATYPE(VCGPoint3SI*)
202 Q_DECLARE_METATYPE(VCGPoint3SI)
203 
204 QScriptValue VCGPoint3ScriptInterface_ctor(QScriptContext *context, QScriptEngine *engine);
205 
206 //QScriptValue VCGPoint3fScriptInterfaceToScriptValue(QScriptEngine* eng,VCGPoint3fSI* const& in);
207 //void VCGPoint3fScriptInterfaceFromScriptValue(const QScriptValue& val,VCGPoint3fSI*& out);
208 
209 class PluginManager;
210 
211 class Env :public QScriptEngine
212 {
213     Q_OBJECT
214 
215     QString out;
216     QList<QObject*> _tobedeleted;
217 public:
218     Env();
219     ~Env();
220     Q_INVOKABLE void insertExpressionBinding(const QString& nm,const QString& exp);
221 
222     QString output();
223     void appendOutput(const QString& output);
224     QScriptValue loadMLScriptEnv(MeshDocument& md,PluginManager& pm);
225 
226 	//global map contains purified name (i.e. Env::convertToAMLScriptValidName(paramname) fun is called) of the global parameters and their values
227 	QScriptValue loadMLScriptEnv(MeshDocument& md, PluginManager& pm, const QMap<QString, QString>& global);
228 	////global map contains purified name (i.e. Env::convertToAMLScriptValidName(paramname) fun is called) of the global parameters and their values
229 	//QScriptValue loadMLScriptEnv(MeshDocument& md, PluginManager& pm, const QString & xmlpluginnamespace, const QString & pluginname, const QString & filtername, const QMap<QString,QString>& global);
230 
231 private:
232 	void insertParamsExpressionBinding(const QString & xmlpluginnamespace, const QString & pluginname, const QString & filtername, const QMap<QString, QString>& parvalmap);
233 
234 	static QString convertToAMLScriptValidName(const QString& name);
235 };
236 
237 QScriptValue Env_ctor(QScriptContext *context,QScriptEngine *engine);
238 
Q_DECLARE_METATYPE(Env *)239 Q_DECLARE_METATYPE(Env*)
240 
241 class EnvWrap
242 {
243 private:
244     bool constStatement(const QString& statement) const;
245     QScriptValue evalExp( const QString& nm );
246     Env* env;
247 public:
248     EnvWrap():env(NULL){}
249     EnvWrap(Env& envir);
250     bool evalBool(const QString& nm);
251     double evalDouble(const QString& nm);
252     float evalFloat( const QString& nm );
253     MESHLAB_SCALAR evalReal(const QString& nm);
254     int evalInt( const QString& nm );
255     vcg::Point3f evalVec3(const QString& nm);
256     vcg::Point3<MESHLAB_SCALAR> evalVec3Real(const QString& nm);
257     QColor evalColor(const QString& nm);
258     /*QString getExpType(const QString& nm);*/
259     QString evalString(const QString& nm);
260     int evalEnum( const QString& nm );
261     MeshModel* evalMesh(const QString& nm);
262     Shotm evalShot(const QString& nm);
263 };
264 
265 QScriptValue EnvWrap_ctor(QScriptContext* c,QScriptEngine* e);
266 
267 
268 class ShotSI : public QObject
269 {
270     Q_OBJECT
271 public:
272     ShotSI();
273     ShotSI(const Shotm &st);
~ShotSI()274     ~ShotSI() {}
275 
276     Q_INVOKABLE ShotSI* itSelf();
277 
278     Shotm shot;
279 };
280 
281 Q_DECLARE_METATYPE(ShotSI*)
282 QScriptValue ShotScriptInterfaceToScriptValue(QScriptEngine* eng,ShotSI* const& in);
283 void ShotScriptInterfaceFromScriptValue(const QScriptValue& val,ShotSI*& out);
284 QScriptValue ShotSI_ctor(QScriptContext* c,QScriptEngine* e);
285 QScriptValue ShotSI_defctor(QScriptContext* c,QScriptEngine* e);
286 
287 
288 
289 
VCGPoint3SI_addV3(QScriptContext * c,QScriptEngine * e)290     inline QScriptValue VCGPoint3SI_addV3(QScriptContext * c,QScriptEngine *e )
291     {
292         return e->toScriptValue(*qscriptvalue_cast<VCGPoint3SI*>(c->argument(0)) + *qscriptvalue_cast<VCGPoint3SI*>(c->argument(1)));
293     }
294 
VCGPoint3SI_multV3S(QScriptContext * c,QScriptEngine * e)295     inline QScriptValue VCGPoint3SI_multV3S( QScriptContext * c,QScriptEngine *e )
296     {
297         return e->toScriptValue(*qscriptvalue_cast<VCGPoint3SI*>(c->argument(0)) * (Scalarm) c->argument(1).toNumber());
298     }
299 
300 
301 //QScriptValue VCGPoint3SI_multV3S(QScriptContext * c,QScriptEngine *e );
302 //class EnvWrap : protected virtual QScriptEngine
303 //{
304 //private:
305 //	bool constStatement(const QString& statement) const;
306 //	QScriptValue getExp( const QString& nm );
307 //public:
308 //	EnvWrap();
309 //	bool getBool(const QString& nm);
310 //	float getFloat(const QString& nm);
311 //};
312 //
313 //
314 //class Env : public EnvWrap, public virtual QScriptEngine
315 //{
316 //public:
317 //	Env();
318 //	void insertExpressionBinding(const QString& nm,const QString& exp);
319 //};
320 
321 
322 #endif
323