From 234263d0a3feefb625ac7879b221994314b52b81 Mon Sep 17 00:00:00 2001
From: Maxime Graulich <maxime.graulich@gmail.com>
Date: Fri, 2 Aug 2013 06:53:20 +0000
Subject: [PATCH] Use shared files in Documents to get models list (iOS)

---
 contrib/mobile/drawGModel.cpp                 | 655 ------------------
 contrib/mobile/drawGModel.h                   |  57 --
 contrib/mobile/iOS/Onelab/EAGLView.mm         |   7 +-
 .../mobile/iOS/Onelab/ModelListController.h   |   6 +-
 .../mobile/iOS/Onelab/ModelListController.mm  |  80 ++-
 .../files/{ => magnet}/Magnetostatics.pro     |   0
 .../mobile/iOS/Onelab/files/magnet/infos.xml  |   5 +
 .../iOS/Onelab/files/{ => magnet}/magnet.geo  |   0
 .../iOS/Onelab/files/{ => magnet}/magnet.pro  |   0
 .../Onelab/files/{ => magnet}/magnet_data.pro |   0
 .../mobile/iOS/Onelab/files/{ => pmsm}/BH.pro |   0
 .../mobile/iOS/Onelab/files/pmsm/infos.xml    |   4 +
 .../files/{ => pmsm}/machine_magstadyn_a.pro  |   0
 .../iOS/Onelab/files/{ => pmsm}/pmsm.geo      |   0
 .../iOS/Onelab/files/{ => pmsm}/pmsm.pro      |   0
 .../files/{ => pmsm}/pmsm_8p_circuit.pro      |   0
 .../iOS/Onelab/files/{ => pmsm}/pmsm_data.geo |   0
 .../Onelab/files/{ => pmsm}/pmsm_rotor.geo    |   0
 .../Onelab/files/{ => pmsm}/pmsm_stator.geo   |   0
 19 files changed, 83 insertions(+), 731 deletions(-)
 delete mode 100644 contrib/mobile/drawGModel.cpp
 delete mode 100644 contrib/mobile/drawGModel.h
 rename contrib/mobile/iOS/Onelab/files/{ => magnet}/Magnetostatics.pro (100%)
 create mode 100644 contrib/mobile/iOS/Onelab/files/magnet/infos.xml
 rename contrib/mobile/iOS/Onelab/files/{ => magnet}/magnet.geo (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => magnet}/magnet.pro (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => magnet}/magnet_data.pro (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/BH.pro (100%)
 create mode 100644 contrib/mobile/iOS/Onelab/files/pmsm/infos.xml
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/machine_magstadyn_a.pro (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/pmsm.geo (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/pmsm.pro (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/pmsm_8p_circuit.pro (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/pmsm_data.geo (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/pmsm_rotor.geo (100%)
 rename contrib/mobile/iOS/Onelab/files/{ => pmsm}/pmsm_stator.geo (100%)

diff --git a/contrib/mobile/drawGModel.cpp b/contrib/mobile/drawGModel.cpp
deleted file mode 100644
index 45c352d4b4..0000000000
--- a/contrib/mobile/drawGModel.cpp
+++ /dev/null
@@ -1,655 +0,0 @@
-#if !defined(BUILD_ANDROID)
-#define BUILD_IOS 1
-#endif
-
-#include <map>
-
-#if defined(BUILD_IOS)
-#include <OpenGLES/ES1/gl.h>
-#include <OpenGLES/ES1/glext.h>
-
-#include <Gmsh/Gmsh.h>
-#include <Gmsh/GModel.h>
-#include <Gmsh/MElement.h>
-#include <Gmsh/VertexArray.h>
-#include <Gmsh/onelab.h>
-#include <Gmsh/onelabUtils.h>
-#include <Gmsh/PView.h>
-#include <Gmsh/PViewOptions.h>
-#include <Gmsh/Context.h>
-#include <Gmsh/StringUtils.h>
-
-#include <GetDP/GetDP.h>
-#endif
-
-#if defined(BUILD_ANDROID)
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <android/log.h>
-
-#define	LOG_TAG		"Gmsh"
-#define	LOGI(...)	__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
-#define	LOGE(...)	__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
-
-#include <gmsh/Gmsh.h>
-#include <gmsh/GModel.h>
-#include <gmsh/MElement.h>
-#include <gmsh/VertexArray.h>
-#include <gmsh/onelab.h>
-#include <gmsh/onelabUtils.h>
-#include <gmsh/PView.h>
-#include <gmsh/PViewOptions.h>
-#include <gmsh/Context.h>
-#include <gmsh/StringUtils.h>
-
-#include <getdp/GetDP.h>
-
-#include "androidGModel.h"
-#endif
-
-#include "drawGModel.h"
-
-drawGModel::drawGModel()
-{
-	new GModel();
-	GmshInitialize();
-	GmshSetOption("Mesh", "SurfaceFaces", 1.);
-	GmshSetOption("General", "Terminal", 1.);
-	GmshSetOption("General", "Verbosity", 99.);
-	onelabUtils::setFirstComputationFlag(false);
-	for(int i = 0; i < 3; i++){
-		_translation[i] = 0.;
-		_scale[i] = 1.;
-		_rotate[i] = 0.;
-	}
-    
-	_fillMesh = false;
-	_showMesh = false;
-	_showGeom = true;
-	_gradiant = true;
-}
-
-static void checkGlError(const char* op) {
-	for (GLint error = glGetError(); error; error	= glGetError())
-		Msg::Error("%s: glError (0x%x)",op,error);
-}
-
-static bool locked = false;
-
-void drawGModel::load(std::string filename)
-{
-	if(locked) return;
-	// clear previous GModel, onelab datas and PView
-	GModel::list.clear();
-	PView::list.clear();
-	onelab::server::instance()->clear();
-	
-	// open the file with Gmsh
-	GmshOpenProject(filename);
-    
-	// run getdp witout parameter
-	onelab_cb("check");
-    
-	// to allow the firs run
-	onelab::server::instance()->setChanged(true, "Gmsh");
-	onelab::server::instance()->setChanged(true, "GetDP");
-}
-
-void drawGModel::setTranslation(float tx, float ty, float tz)
-{
-	if(tx == 0 && tx == ty && ty == tz)
-		_translation[0] = _translation[1] = _translation[2] = 0;
-	else
-	{
-		_translation[0] += tx * (this->right - this->left);
-		_translation[1] += ty * (this->right - this->left);
-		_translation[2] += tz * (this->right - this->left);
-	}
-}
-
-void drawGModel::setScale(float sx, float sy, float sz)
-{
-	_scale[0] = sx;
-	_scale[1] = sy ? sy : sx;
-	_scale[2] = sz ? sz : sx;
-}
-
-void drawGModel::setRotation(float rx, float ry, float rz)
-{
-	if(rx == 0 && rx == ry && ry == rz)
-		_rotate[0] = _rotate[1] = _rotate[2] = 0;
-	else
-	{
-		_rotate[0] += rx;
-		_rotate[1] += ry;
-		_rotate[2] += rz;
-	}
-}
-void drawGModel::OrthofFromGModel()
-{
-	SBoundingBox3d bb = GModel::current()->bounds();
-	double ratio = (double)(width ? width : 1.) / (double)(height ? height : 1.);
-	double modelh = bb.max().y() - bb.min().y(), modelw = bb.max().x() - bb.min().x();
-	double modelratio = (modelw ? modelw : 1.) / (modelh ? modelh : 1.);
-	double xmin = -ratio, xmax = ratio, ymin = -1., ymax = 1.;
-	xmin = bb.min().x();
-	xmax = bb.max().x();
-	ymin = bb.min().x() / ratio;
-	ymax = bb.max().x() / ratio;
-	xmax += (xmax - xmin) / 5.;
-	xmin -= (xmax - xmin) / 5.;
-	ymax += (ymax - ymin) / 5.;
-	ymin -= (ymax - ymin) / 5.;
-	
-	// clipping
-	double zmax = std::max(fabs(bb.min().z()), fabs(bb.max().z()));
-	double clip = zmax  * 5.;
-	clip = 1.;
-	
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	this->left = (xmin != 0 || xmax != 0)? xmin : -ratio;
-	this->right = (xmin != 0 || xmax != 0)? xmax : ratio;
-	this->top = (xmin != 0 || xmax != 0)? ymax : 1.0;
-	this->bottom = (xmin != 0 || xmax != 0)? ymin : -1.0;
-	glOrthof(this->left, this->right, this->bottom, this->top, -clip, clip);
-    
-	glMatrixMode(GL_MODELVIEW);
-}
-void drawGModel::initView(int w, int h)
-{
-	this->height = h;
-	this->width = w;
-	glViewport(0, 0, w, h);
-    
-	this->OrthofFromGModel();
-    
-	glClearColor(.83,.85,.98,1.);
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-	glLoadIdentity();
-}
-
-void drawArray(VertexArray *va, GLint type, bool colorArray=false)
-{
-	if(!va) return;
-	glEnable(GL_BLEND);
-	glEnable(GL_RESCALE_NORMAL);
-	glShadeModel(GL_SMOOTH);
-	glVertexPointer(3, GL_FLOAT, 0, va->getVertexArray());
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glNormalPointer(GL_BYTE, 0, va->getNormalArray());
-	glEnableClientState(GL_NORMAL_ARRAY);
-	if(colorArray)
-	{
-		glColorPointer(4, GL_UNSIGNED_BYTE, 0, va->getColorArray());
-		glEnableClientState(GL_COLOR_ARRAY);
-	}
-	glDrawArrays(type, 0, va->getNumVertices());
-	glDisable(GL_POLYGON_OFFSET_FILL);
-	glDisableClientState(GL_VERTEX_ARRAY);
-	glDisableClientState(GL_NORMAL_ARRAY);
-	glDisableClientState(GL_COLOR_ARRAY);
-	glDisable(GL_RESCALE_NORMAL);
-	glDisable(GL_BLEND);
-}
-
-void drawVector(double x, double y, double z, double dx, double dy, double dz)
-{
-	double l = sqrt(dx * dx + dy * dy + dz * dz), lt;
-	double n[3], t[3], u[3];
-    
-	if(l == 0.0) return;
-    
-	GLfloat line[] = {
-		(GLfloat)x, (GLfloat)y, (GLfloat)z,
-		(GLfloat)(x+dx), (GLfloat)(y+dy), (GLfloat)(z+dz),
-    };
-    glVertexPointer(3, GL_FLOAT, 0, line);
-    glEnableClientState(GL_VERTEX_ARRAY);
-    glDrawArrays(GL_LINES, 0, 2);
-	glDisableClientState(GL_VERTEX_ARRAY);
-    
-	n[0] = dx / l;
-	n[1] = dy / l;
-	n[2] = dz / l;
-    
-	if((fabs(n[0]) >= fabs(n[1]) && fabs(n[0]) >= fabs(n[2])) ||
-       (fabs(n[1]) >= fabs(n[0]) && fabs(n[1]) >= fabs(n[2]))) {
-		t[0] = n[1];
-		t[1] = -n[0];
-		t[2] = 0.;
-	}
-	else {
-		t[0] = 0.;
-		t[1] = n[2];
-		t[2] = -n[1];
-	}
-    
-	lt = sqrt(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]);
-	t[0] /= lt;
-	t[1] /= lt;
-	t[2] /= lt;
-    
-	u[0] = n[1] * t[2] - n[2] * t[1];
-	u[1] = n[2] * t[0] - n[0] * t[2];
-	u[2] = n[0] * t[1] - n[1] * t[0];
-    
-	lt = sqrt(u[0] * u[0] + u[1] * u[1] + u[2] * u[2]);
-	u[0] /= lt;
-	u[1] /= lt;
-	u[2] /= lt;
-    
-	double f1 = 0.75; // Stem lenght
-	double b = 0.1 * l;
-	
-	GLfloat arrow[] = {
-		(GLfloat)(x + dx), (GLfloat)(y + dy), (GLfloat)(z + dz),
-		(GLfloat)(x + f1 * dx + b * (t[0])), (GLfloat)(y + f1 * dy + b * (t[1])), (GLfloat)(z + f1 * dz + b * (t[2])),
-		(GLfloat)(x + f1 * dx + b * (-t[0])), (GLfloat)(y + f1 * dy + b * (-t[1])), (GLfloat)(z + f1 * dz + b * (-t[2])),
-        
-		(GLfloat)(x + dx), (GLfloat)(y + dy), (GLfloat)(z + dz),
-		(GLfloat)(x + f1 * dx + b * (-u[0])), (GLfloat)(y + f1 * dy + b * (-u[1])), (GLfloat)(z + f1 * dz + b * (-u[2])),
-		(GLfloat)(x + f1 * dx + b * (u[0])), (GLfloat)(y + f1 * dy + b * (u[1])), (GLfloat)(z + f1 * dz + b * (u[2])),
-	};
-    glVertexPointer(3, GL_FLOAT, 0, arrow);
-    glEnableClientState(GL_VERTEX_ARRAY);
-	glEnable(GL_LINE_SMOOTH);
-    glDrawArrays(GL_TRIANGLES, 0, 6);
-	glDisableClientState(GL_VERTEX_ARRAY);
-	glDisable(GL_LINE_SMOOTH);
-    
-}
-
-void drawGModel::drawVectorArray(PViewOptions *opt, VertexArray *va)
-{
-	if(!va || va->getNumVerticesPerElement() != 2) return;
-    
-	for(int i = 0; i < va->getNumVertices(); i += 2){
-		float *s = va->getVertexArray(3 * i);
-		float *v = va->getVertexArray(3 * (i + 1));
-		double l = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
-		double lmax = opt->tmpMax;
-		if((l && opt->vectorType) && lmax)
-		{
-			double scale = (opt->arrowSizeMax - opt->arrowSizeMin) / lmax;
-			if(opt->arrowSizeMin && l) scale += opt->arrowSizeMin / l;
-			double dx = scale * v[0];
-			double dy = scale * v[1];
-			double dz = scale * v[2];
-			GLubyte *color = (GLubyte *)va->getColorArray(4 * i);
-			glColor4ub(*(color), *(color+1), *(color+2), *(color+3));
-			if(fabs(dx) > 1. || fabs(dy) > 1. || fabs(dz) > 1.)
-			{
-				double d = (this->right - this->left) / this->width / _scale[0];
-				dx *= d; dy *= d; dz *= d;
-				double x = s[0], y = s[1], z = s[2];
-				drawVector(x,y,z,dx,dy,dz);
-			}
-		}
-	}
-}
-
-void drawGModel::drawPView(PView *p)
-{
-	PViewOptions *opt = p->getOptions();
-	PViewData *data = p->getData(true);
-	if(!opt->visible) return;
-    
-	glPointSize((GLfloat)opt->pointSize);
-	glLineWidth((GLfloat)opt->lineWidth);
-    
-	drawArray(p->va_points, GL_POINTS,true);
-	drawArray(p->va_lines, GL_LINES,true);
-	drawArray(p->va_triangles, GL_TRIANGLES,true);
-
-	glLineWidth(1);
-	glPointSize(1);
-    
-	drawVectorArray(p->getOptions(), p->va_vectors);
-}
-
-void drawGModel::drawScale()
-{
-	glPushMatrix();
-	glLoadIdentity();
-	// Draw the scale bar
-	if(PView::list.size() < 1) return;
-	PView *p = PView::list[PView::list.size()-1];
-	PViewOptions *opt = p->getOptions();
-    
-	double width = 6*(this->right -this->left) / 10.;
-	double height = (this->top - this->bottom) / 20.;
-	double box = width / (opt->nbIso ? opt->nbIso : 1);
-	double xmin = this->left + (this->right - this->left -width)/2.;
-	double ymin = this->bottom + height;
-    
-    GLfloat *vertex = (GLfloat *)malloc(opt->nbIso*3*4*sizeof(GLfloat));
-    GLubyte *color = (GLubyte *)malloc(opt->nbIso*4*4*sizeof(GLubyte));
-	for(int i = 0; i < opt->nbIso; i++){
-		if(opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric)
-		{
-			unsigned int col = opt->getColor(i, opt->nbIso);
-			color[i*4*4+0] = color[i*4*4+4] = color[i*4*4+8] = color[i*4*4+12] = (GLubyte)CTX::instance()->unpackRed(col);
-			color[i*4*4+1] = color[i*4*4+5] = color[i*4*4+9] = color[i*4*4+13] = (GLubyte)CTX::instance()->unpackGreen(col);
-			color[i*4*4+2] = color[i*4*4+6] = color[i*4*4+10] = color[i*4*4+14] = (GLubyte)CTX::instance()->unpackBlue(col);
-			color[i*4*4+3] = color[i*4*4+7] = color[i*4*4+11] = color[i*4*4+15] = (GLubyte)CTX::instance()->unpackAlpha(col);
-			vertex[i*3*4+0] = xmin + i * box;
-			vertex[i*3*4+1] = ymin;
-			vertex[i*3*4+2] = 0.;
-			vertex[i*3*4+3] = xmin + i * box;
-			vertex[i*3*4+4] = ymin + height;
-			vertex[i*3*4+5] = 0.;
-			vertex[i*3*4+6] = xmin + (i + 1) * box;
-			vertex[i*3*4+7] = ymin;
-			vertex[i*3*4+8] = 0.;
-			vertex[i*3*4+9] = xmin + (i + 1) * box;
-			vertex[i*3*4+10] = ymin + height;
-			vertex[i*3*4+11] = 0.;
-		}
-		else if(opt->intervalsType == PViewOptions::Continuous)
-		{
-			double dv = (opt->tmpMax - opt->tmpMin) / (opt->nbIso ? opt->nbIso : 1);
-			double v1 = opt->tmpMin + i * dv;
-			unsigned int col1 = opt->getColor(v1, opt->tmpMin, opt->tmpMax, true);
-			color[i*4*4+0] = color[i*4*4+4] = (GLubyte)CTX::instance()->unpackRed(col1);
-			color[i*4*4+1] = color[i*4*4+5] = (GLubyte)CTX::instance()->unpackGreen(col1);
-			color[i*4*4+2] = color[i*4*4+6] = (GLubyte)CTX::instance()->unpackBlue(col1);
-			color[i*4*4+3] = color[i*4*4+7] = (GLubyte)CTX::instance()->unpackAlpha(col1);
-			vertex[i*3*4+0] = xmin + i * box;
-			vertex[i*3*4+1] = ymin;
-			vertex[i*3*4+2] = 0.;
-			vertex[i*3*4+3] = xmin + i * box;
-			vertex[i*3*4+4] = ymin + height;
-			vertex[i*3*4+5] = 0.;
-			double v2 = opt->tmpMin + (i + 1) * dv;
-            unsigned int col2 = opt->getColor(v2, opt->tmpMin, opt->tmpMax, true);
-			color[i*4*4+8] = color[i*4*4+12] = (GLubyte)CTX::instance()->unpackRed(col2);
-			color[i*4*4+9] = color[i*4*4+13] = (GLubyte)CTX::instance()->unpackGreen(col2);
-			color[i*4*4+10] = color[i*4*4+14] = (GLubyte)CTX::instance()->unpackBlue(col2);
-			color[i*4*4+11] = color[i*4*4+15] = (GLubyte)CTX::instance()->unpackAlpha(col2);
-			vertex[i*3*4+6] = xmin + (i + 1) * box;
-			vertex[i*3*4+7] = ymin;
-			vertex[i*3*4+8] = 0.;
-			vertex[i*3*4+9] = xmin + (i + 1) * box;
-			vertex[i*3*4+10] = ymin + height;
-			vertex[i*3*4+11] = 0.;
-		}
-		else
-		{
-			unsigned int col = opt->getColor(i, opt->nbIso);
-			color[i*4*4+0] = color[i*4*4+4] = color[i*4*4+8] = color[i*4*4+12] = (GLubyte)CTX::instance()->unpackRed(col);
-			color[i*4*4+1] = color[i*4*4+5] = color[i*4*4+9] = color[i*4*4+13] = (GLubyte)CTX::instance()->unpackGreen(col);
-			color[i*4*4+2] = color[i*4*4+6] = color[i*4*4+10] = color[i*4*4+14] = (GLubyte)CTX::instance()->unpackBlue(col);
-			color[i*4*4+3] = color[i*4*4+7] = color[i*4*4+11] = color[i*4*4+15] = (GLubyte)CTX::instance()->unpackAlpha(col);
-			vertex[i*3*4+0] = xmin + i * box;
-			vertex[i*3*4+1] = ymin;
-			vertex[i*3*4+2] = 0.;
-			vertex[i*3*4+3] = xmin + i * box;
-			vertex[i*3*4+4] = ymin + height;
-			vertex[i*3*4+5] = 0.;
-			vertex[i*3*4+6] = xmin + (i + 1) * box;
-			vertex[i*3*4+7] = ymin;
-			vertex[i*3*4+8] = 0.;
-			vertex[i*3*4+9] = xmin + (i + 1) * box;
-			vertex[i*3*4+10] = ymin + height;
-			vertex[i*3*4+11] = 0.;
-		}
-	}
-	
-	{
-        glVertexPointer(3, GL_FLOAT, 0, vertex);
-        glEnableClientState(GL_VERTEX_ARRAY);
-        glColorPointer(4, GL_UNSIGNED_BYTE, 0, color);
-        glEnableClientState(GL_COLOR_ARRAY);
-        if(opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric || opt->intervalsType == PViewOptions::Continuous)
-            glDrawArrays(GL_TRIANGLE_STRIP, 0, opt->nbIso*4);
-        else
-            glDrawArrays(GL_LINES, 0, opt->nbIso*4);
-        glDisableClientState(GL_COLOR_ARRAY);
-        glDisableClientState(GL_VERTEX_ARRAY);
-	}
-	free(vertex);
-	free(color);
-	glPopMatrix();
-}
-
-void drawGModel::drawMesh()
-{
-	GModel::current()->fillVertexArrays();
-	glColor4f(0,0,0,1.);
-	for(GModel::fiter it = GModel::current()->firstFace(); it != GModel::current()->lastFace(); it++){
-		if(_fillMesh) drawArray((*it)->va_triangles, GL_TRIANGLES);
-		else drawArray((*it)->va_lines, GL_LINES);
-	}
-}
-
-void drawGModel::drawPost()
-{
-	if(PView::list.empty()) return ;
-    
-	for(unsigned int i = 0; i < PView::list.size(); i++){
-		PView::list[i]->fillVertexArrays();
-		drawPView(PView::list[i]);
-	}
-}
-
-void drawGModel::drawGeom()
-{
-	glColor4f(0,0,1.,1.);
-	glLineWidth(3);
-	for(GModel::eiter it = GModel::current()->firstEdge(); it != GModel::current()->lastEdge(); it++){
-		GEdge *e = *it;
-		int N = e->minimumDrawSegments() + 1;
-		Range<double> t_bounds = e->parBounds(0);
-		double t_min = t_bounds.low();
-		double t_max = t_bounds.high();
-        
-		// Create a VA for this edge
-		GLfloat edge[N*3];
-        
-		for(unsigned int i=0; i < N; i++) {
-			double t = t_min + (double)i / (double)(N-1) * (t_max - t_min);
-			GPoint p = e->point(t);
-			edge[i*3] = p.x(); edge[i*3+1] = p.y(); edge[i*3+2] = p.z();
-		}
-		// Then print the VA
-		glVertexPointer(3, GL_FLOAT, 0, edge);
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glDrawArrays(GL_LINE_STRIP, 0, N);
-		glDisableClientState(GL_VERTEX_ARRAY);
-	}
-	glLineWidth(1);
-}
-
-void drawGModel::drawAxes(double x0, double y0, double z0, double h)
-{
-	glLineWidth(5);
-	glPushMatrix();
-	glLoadIdentity();
-	glTranslatef(x0, y0, z0);
-	glRotatef(this->_rotate[0], 1, 0, 0);
-	glRotatef(this->_rotate[1], 0, 1, 0);
-	glRotatef(this->_rotate[2], 0, 0, 1);
-	glTranslatef(-x0, -y0, -z0);
-    
-    const GLfloat axes[] = {
-		(GLfloat)x0, (GLfloat)y0, (GLfloat)z0,
-		(GLfloat)(x0+h), (GLfloat)y0, (GLfloat)z0,
-		(GLfloat)x0, (GLfloat)y0, (GLfloat)z0,
-		(GLfloat)x0, (GLfloat)(y0+h), (GLfloat)z0,
-		(GLfloat)x0, (GLfloat)y0, (GLfloat)z0,
-		(GLfloat)x0, (GLfloat)y0, (GLfloat)(z0+h),
-	};
-    const GLubyte colors[] = {
-        255, 0, 0, 255,
-        255, 0, 0, 255,
-        0, 0, 255, 255,
-        0, 0, 255, 255,
-        0, 255, 0, 255,
-        0, 255, 0, 255,
-    };
-	glVertexPointer(3, GL_FLOAT, 0, axes);
-	glEnableClientState(GL_VERTEX_ARRAY);
-    glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
-    glEnableClientState(GL_COLOR_ARRAY);
-	glDrawArrays(GL_LINES, 0, 6);
-	glDisableClientState(GL_VERTEX_ARRAY);
-    glDisableClientState(GL_COLOR_ARRAY);
-	glPopMatrix();
-	glLineWidth(1);
-}
-
-void drawGModel::drawView()
-{
-	this->OrthofFromGModel();
-    
-	glMatrixMode(GL_MODELVIEW);
-	// fill the background
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-	if(_gradiant)
-	{
-		glPushMatrix();
-		glLoadIdentity();
-		const GLfloat squareVertices[] = {
-			(GLfloat)this->top,	(GLfloat)this->left, -5.,
-			(GLfloat)this->top,	(GLfloat)this->right, -5.,
-			(GLfloat)this->bottom,	(GLfloat)this->left, -5.,
-			(GLfloat)this->bottom,	(GLfloat)this->right, -5.,
-		};
-		const GLubyte squareColors[] = {
-			255, 255, 255, 255,
-			255, 255, 255, 255,
-			190, 200, 255, 255,
-			190, 200, 255, 255,
-		};
-		glVertexPointer(3, GL_FLOAT, 0, squareVertices);
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
-		glEnableClientState(GL_COLOR_ARRAY);
-		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-		glDisableClientState(GL_COLOR_ARRAY);
-		glPopMatrix();
-	}
-	checkGlError("glError -> drawGradiant");
-	//
-	glLoadIdentity();
-	glRotatef(this->_rotate[0], 1, 0, 0);
-	glRotatef(this->_rotate[1], 0, 1, 0);
-	glRotatef(this->_rotate[2], 0, 0, 1);
-	glTranslatef(this->_translation[0]/this->height,this->_translation[1]/this->width,0);
-	glScalef(this->_scale[0], this->_scale[1], this->_scale[2]);
-	checkGlError("glTranslatef");
-    
-	this->drawAxes(this->right - (this->top - this->bottom)/9.0, this->bottom + (this->top - this->bottom)/9.0, 0, (this->top - this->bottom)/10.);
-	this->drawPost();
-	if(_showGeom) this->drawGeom();
-	if(_showMesh) this->drawMesh();
-	//this->drawScale();
-	glDisable(GL_LIGHTING);
-	glDisable(GL_LIGHT0);
-	glDisable(GL_DEPTH_TEST);
-}
-
-std::vector<std::string> commandToVector(const std::string cmd)
-{
-	std::vector<std::string> ret;
-	int pos=0, last=0;
-	Msg::Info("Cut: %s", cmd.c_str());
-	while((pos = cmd.find("-", last+1)) != std::string::npos)
-	{
-		ret.push_back(cmd.substr(last,pos-1-last));
-		Msg::Info("Add: %s (%d,%d)", ret[ret.size()-1].c_str(), last, pos-1);
-		last = pos;
-	}
-	ret.push_back(cmd.substr(last,cmd.size()-1));
-	Msg::Info("Add: %s", ret[ret.size()-1].c_str());
-	return ret;
-}
-
-int onelab_cb(std::string action)
-{
-	Msg::Debug("Ask onlab to %s", action.c_str());
-	if(action == "stop")
-	{
-		onelab::string o("GetDP/Action", "stop");
-		o.setVisible(false);
-		o.setNeverChanged(true);
-		onelab::server::instance()->set(o);
-		return 0;
-	}
-	if(locked) return -1;
-	locked = true;
-	int redraw = 0;
-	if(action == "reset")
-	{
-        onelab::server::instance()->clear();
-        onelabUtils::runGmshClient(action, true);
-		action = "check";
-	}
-    
-	Msg::ResetErrorCounter();
-    
-	if(action == "compute")
-	{
-		onelabUtils::initializeLoop("1");
-		onelabUtils::initializeLoop("2");
-		onelabUtils::initializeLoop("3");
-	}
-    
-	do
-	{
-		if(onelabUtils::runGmshClient(action, true))
-			redraw = 1;
-        
-		if(redraw == 0 && !onelab::server::instance()->getChanged("GetDP"))continue;
-        
-		std::vector<onelab::string> ps;
-		onelab::server::instance()->get(ps, "GetDP/1ModelName");
-		if(ps.empty()){
-			std::vector<std::string> split = SplitFileName(GModel::current()->getFileName());
-			std::string name(split[0] + split[1]);
-			onelab::string o("GetDP/1ModelName", name, "Model name");
-			o.setKind("file");
-			onelab::server::instance()->set(o);
-		}
-		onelab::string o("GetDP/Action", action);
-		o.setVisible(false);
-		o.setNeverChanged(true);
-		onelab::server::instance()->set(o);
-        
-		if(action == "compute")
-		{
-			std::string filename = GModel::current()->getFileName();
-			std::vector<std::string> args;
-			args.push_back("getdp");
-			std::vector<onelab::string> onelabArgs;
-			onelab::server::instance()->get(onelabArgs, "GetDP/1ModelName");
-			args.push_back((onelabArgs.empty())? SplitFileName(filename)[0] + SplitFileName(filename)[1] : onelabArgs[0].getValue());
-			onelab::server::instance()->get(onelabArgs, "GetDP/9ComputeCommand");
-			std::vector<std::string> compute = commandToVector((onelabArgs.empty())? "" : onelabArgs[0].getValue().c_str());
-			args.insert( args.end(), compute.begin(), compute.end() );
-			args.push_back("-onelab");
-			args.push_back("GetDP");
-			GetDP(args, onelab::server::instance());
-		}
-		if(action == "check")
-		{
-			std::string filename = GModel::current()->getFileName();
-			std::vector<std::string> args;
-			args.push_back("getdp");
-			std::vector<onelab::string> onelabArgs;
-			args.push_back(SplitFileName(filename)[0] + SplitFileName(filename)[1]);
-			onelab::server::instance()->get(onelabArgs, "GetDP/9CheckCommand");
-			args.push_back((onelabArgs.empty())? "" : onelabArgs[0].getValue());
-			args.push_back("-onelab");
-			args.push_back("GetDP");
-			GetDP(args, onelab::server::instance());
-		}
-	} while(action == "compute" && (onelabUtils::incrementLoop("3") || onelabUtils::incrementLoop("2") || onelabUtils::incrementLoop("1")));
-    
-	locked = false;
-    
-	return redraw;
-}
-
-// vim:set ts=2:
diff --git a/contrib/mobile/drawGModel.h b/contrib/mobile/drawGModel.h
deleted file mode 100644
index 47ff709ff8..0000000000
--- a/contrib/mobile/drawGModel.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef _DRAW_GMODEL_H_
-#define _DRAW_GMODEL_H_
-
-#if !defined(BUILD_ANDROID)
-#define BUILD_IOS 1
-#endif
-
-#include <string>
-
-#if defined(BUILD_IOS)
-#include <Gmsh/PView.h>
-#include <Gmsh/PViewOptions.h>
-#include <Gmsh/Context.h>
-#endif
-
-int onelab_cb(const std::string);
-
-class drawGModel{
-private:
-	float _translation[3];
-	float _scale[3];
-	int width, height;
-	double left, right, top, bottom;
-	float _rotate[3];
-	bool _gradiant, // show the background gradiant
-    _showGeom, // show the Geometry
-    _showMesh, // show the Mesh
-    _fillMesh; // fill the Mesh
-    
-	void OrthofFromGModel(void);
-	void drawPView(PView *p);
-	void drawVectorArray(PViewOptions *opt, VertexArray *va);
-    
-public:
-	drawGModel();
-	~drawGModel(){}
-	void load(std::string filename);
-	void setTranslation(float tx, float ty, float tz=0);
-	void setScale(float sx, float sy=0, float sz=0);
-	void setRotation(float rx, float ry, float rz);
-	void initView(int w, int h);
-	void drawView();
-	void drawAxes(double x0=0., double y0=0., double z0=0., double h=0.5);
-	void drawGeom();
-	void drawMesh();
-	void drawPost();
-	void drawScale();
-    
-	void useGradiant(bool gradiant=true) {_gradiant = gradiant;}
-	void showGeom(bool show=true) {_showGeom = show;}
-	void showMesh(bool show=true) {_showMesh = show;}
-	void fillMesh(bool show=true) {_fillMesh = show;}
-    bool isShowedMesh(){return _showMesh;}
-    bool isShowedGeom(){return _showGeom;}
-};
-
-#endif
diff --git a/contrib/mobile/iOS/Onelab/EAGLView.mm b/contrib/mobile/iOS/Onelab/EAGLView.mm
index e4f3b3cc85..07c2ee68d9 100644
--- a/contrib/mobile/iOS/Onelab/EAGLView.mm
+++ b/contrib/mobile/iOS/Onelab/EAGLView.mm
@@ -43,8 +43,7 @@
             return nil;
         }
         [self copyRes];
-        //NSString *ressourcePath = [[NSBundle mainBundle] resourcePath];
-        NSString *startupModel = [docPath stringByAppendingPathComponent:@"pmsm.geo"];
+        NSString *startupModel = [docPath stringByAppendingPathComponent:@"pmsm/pmsm.geo"];
 
         mContext = new drawContext();
         mContext->load(*new std::string([startupModel fileSystemRepresentation]));
@@ -81,9 +80,7 @@
 }
 - (void)loadMsh:(NSString*) file
 {
-    NSString *msh = [docPath stringByAppendingPathComponent: file];
-    //mContext = new drawContext();
-    mContext->load(*new std::string([msh fileSystemRepresentation]));
+    mContext->load(*new std::string([file fileSystemRepresentation]));
     [self drawView];
 }
 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
diff --git a/contrib/mobile/iOS/Onelab/ModelListController.h b/contrib/mobile/iOS/Onelab/ModelListController.h
index 1ce2da94b0..8d76d7c75a 100644
--- a/contrib/mobile/iOS/Onelab/ModelListController.h
+++ b/contrib/mobile/iOS/Onelab/ModelListController.h
@@ -11,10 +11,12 @@
 #import "AppDelegate.h"
 #import "EAGLView.h"
 
-@interface ModelListController : UITableViewController
+@interface ModelListController : UITableViewController <NSXMLParserDelegate>
 {
     @private
-    NSArray *models;
+    NSMutableArray *models, *modelsName, *modelsDescription;
+    NSString *currentElement;
+    NSMutableString *currentElementValue;
 }
 @property (nonatomic, retain) EAGLView *glView;
 @end
diff --git a/contrib/mobile/iOS/Onelab/ModelListController.mm b/contrib/mobile/iOS/Onelab/ModelListController.mm
index 583d359986..d6ebf31359 100644
--- a/contrib/mobile/iOS/Onelab/ModelListController.mm
+++ b/contrib/mobile/iOS/Onelab/ModelListController.mm
@@ -18,7 +18,30 @@
 @implementation ModelListController
 -(void)viewDidLoad
 {
-    models = [NSArray arrayWithObjects:@"magnet", @"pmsm", nil];
+    models = [[NSMutableArray alloc] init];
+    modelsName = [[NSMutableArray alloc] init];
+    modelsDescription = [[NSMutableArray alloc] init];
+    NSString *docsPath = [ModelListController getApplicationDocumentsDirectory];
+    
+    
+    NSArray *docs = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsPath error:NULL];
+    for(NSString* doc in docs){
+        NSString *docPath = [NSString stringWithFormat:@"%@/%@/", docsPath, doc];
+        BOOL isDir = NO; [[NSFileManager defaultManager] fileExistsAtPath:docPath isDirectory:&isDir];
+        if(isDir){
+            [models addObject:doc];
+            NSString *infos = [NSString stringWithFormat:@"%@%@", docPath, @"infos.xml"];
+            if([[NSFileManager defaultManager] fileExistsAtPath:infos]) {
+                [self parseInfosFile:infos];
+                if(models.count > modelsName.count)[modelsName addObject:@""];
+                if(models.count > modelsDescription.count)[modelsDescription addObject:@""];
+            }
+            else {
+                [modelsName addObject:@""];
+                [modelsDescription addObject:@""];
+            }
+        }
+    }
 }
 
 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
@@ -38,16 +61,10 @@
     NSString *modelName = [models objectAtIndex:indexPath.row];
     cell = [tableView dequeueReusableCellWithIdentifier:modelName];
     if(cell != nil) return cell;
-    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:modelName];
-    switch (indexPath.row) {
-        case 0:
-            [cell.textLabel setText:@"Magnet"];
-            [cell.detailTextLabel setText:@"A simple magnet example"];
-            break;
-        case 1:
-            [cell.textLabel setText:@"Eight-pole permanent magnet synchronous machine"];
-            break;
-    }
+    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:modelName];
+    [cell.textLabel setText:(![[modelsName objectAtIndex:indexPath.row] isEqual:@""])? [modelsName objectAtIndex:indexPath.row] : [models objectAtIndex:indexPath.row]];
+    if(![[modelsDescription objectAtIndex:indexPath.row] isEqual:@""])
+        [cell.detailTextLabel setText:[modelsDescription objectAtIndex:indexPath.row]];
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
     return cell;
 }
@@ -58,8 +75,47 @@
 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
     NSString *modelName = [models objectAtIndex:indexPath.row];
-    [_glView loadMsh:[NSString stringWithFormat:@"%@%@%@",@"/",modelName,@".geo"]];
+    [_glView loadMsh:[NSString stringWithFormat:@"%@/%@/%@.geo",[ModelListController getApplicationDocumentsDirectory],modelName,modelName]];
     [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil];
     [self.navigationController popViewControllerAnimated:YES];
 }
++ (NSString *) getApplicationDocumentsDirectory
+{
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
+    return basePath;
+}
+- (BOOL) parseInfosFile:(NSString *)file
+{
+    NSData *xmlFile = [[NSFileManager defaultManager] contentsAtPath:file];
+    NSXMLParser *parser;
+    parser = [[NSXMLParser alloc] initWithData:xmlFile];
+    [parser setDelegate:self];
+    
+    // You may need to turn some of these on depending on the type of XML file you are parsing
+    [parser setShouldProcessNamespaces:NO];
+    [parser setShouldReportNamespacePrefixes:NO];
+    [parser setShouldResolveExternalEntities:NO];
+    
+    return [parser parse];
+}
+-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
+{
+    currentElement = elementName;
+    currentElementValue = nil;
+}
+-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
+{
+    if (!currentElementValue)
+        currentElementValue = [[NSMutableString alloc] initWithString:string];
+    else
+        [currentElementValue appendString:string];
+}
+-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
+{
+    if([elementName isEqual:@"name"] && models.count > modelsName.count) [modelsName addObject:currentElementValue];
+    else if([elementName isEqual:@"description"] && models.count > modelsDescription.count) [modelsDescription addObject:currentElementValue];
+    //[currentElementValue release];
+    currentElementValue = nil;
+}
 @end
diff --git a/contrib/mobile/iOS/Onelab/files/Magnetostatics.pro b/contrib/mobile/iOS/Onelab/files/magnet/Magnetostatics.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/Magnetostatics.pro
rename to contrib/mobile/iOS/Onelab/files/magnet/Magnetostatics.pro
diff --git a/contrib/mobile/iOS/Onelab/files/magnet/infos.xml b/contrib/mobile/iOS/Onelab/files/magnet/infos.xml
new file mode 100644
index 0000000000..15eb756d44
--- /dev/null
+++ b/contrib/mobile/iOS/Onelab/files/magnet/infos.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<info>
+	<name>Magnet</name>
+	<description>Simple magnet example</description>
+<info>
\ No newline at end of file
diff --git a/contrib/mobile/iOS/Onelab/files/magnet.geo b/contrib/mobile/iOS/Onelab/files/magnet/magnet.geo
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/magnet.geo
rename to contrib/mobile/iOS/Onelab/files/magnet/magnet.geo
diff --git a/contrib/mobile/iOS/Onelab/files/magnet.pro b/contrib/mobile/iOS/Onelab/files/magnet/magnet.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/magnet.pro
rename to contrib/mobile/iOS/Onelab/files/magnet/magnet.pro
diff --git a/contrib/mobile/iOS/Onelab/files/magnet_data.pro b/contrib/mobile/iOS/Onelab/files/magnet/magnet_data.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/magnet_data.pro
rename to contrib/mobile/iOS/Onelab/files/magnet/magnet_data.pro
diff --git a/contrib/mobile/iOS/Onelab/files/BH.pro b/contrib/mobile/iOS/Onelab/files/pmsm/BH.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/BH.pro
rename to contrib/mobile/iOS/Onelab/files/pmsm/BH.pro
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm/infos.xml b/contrib/mobile/iOS/Onelab/files/pmsm/infos.xml
new file mode 100644
index 0000000000..eb4ae428b9
--- /dev/null
+++ b/contrib/mobile/iOS/Onelab/files/pmsm/infos.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<info>
+	<name>Eight-pole permanent magnet synchronous machine</name>
+<info>
\ No newline at end of file
diff --git a/contrib/mobile/iOS/Onelab/files/machine_magstadyn_a.pro b/contrib/mobile/iOS/Onelab/files/pmsm/machine_magstadyn_a.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/machine_magstadyn_a.pro
rename to contrib/mobile/iOS/Onelab/files/pmsm/machine_magstadyn_a.pro
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm.geo b/contrib/mobile/iOS/Onelab/files/pmsm/pmsm.geo
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/pmsm.geo
rename to contrib/mobile/iOS/Onelab/files/pmsm/pmsm.geo
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm.pro b/contrib/mobile/iOS/Onelab/files/pmsm/pmsm.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/pmsm.pro
rename to contrib/mobile/iOS/Onelab/files/pmsm/pmsm.pro
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm_8p_circuit.pro b/contrib/mobile/iOS/Onelab/files/pmsm/pmsm_8p_circuit.pro
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/pmsm_8p_circuit.pro
rename to contrib/mobile/iOS/Onelab/files/pmsm/pmsm_8p_circuit.pro
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm_data.geo b/contrib/mobile/iOS/Onelab/files/pmsm/pmsm_data.geo
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/pmsm_data.geo
rename to contrib/mobile/iOS/Onelab/files/pmsm/pmsm_data.geo
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm_rotor.geo b/contrib/mobile/iOS/Onelab/files/pmsm/pmsm_rotor.geo
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/pmsm_rotor.geo
rename to contrib/mobile/iOS/Onelab/files/pmsm/pmsm_rotor.geo
diff --git a/contrib/mobile/iOS/Onelab/files/pmsm_stator.geo b/contrib/mobile/iOS/Onelab/files/pmsm/pmsm_stator.geo
similarity index 100%
rename from contrib/mobile/iOS/Onelab/files/pmsm_stator.geo
rename to contrib/mobile/iOS/Onelab/files/pmsm/pmsm_stator.geo
-- 
GitLab