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