#include <unistd.h>\r
mglPoint pnt; // some global variable for changable data\r
void *mgl_fltk_tmp(void *) { mgl_fltk_run(); return 0; }\r
+//#define PTHREAD_SAMPLE\r
//-----------------------------------------------------------------------------\r
int main(int argc,char **argv)\r
{\r
#ifdef PTHREAD_SAMPLE\r
- mglGraphFLTK gr;\r
- gr.Window(argc,argv,NULL,"test",0,0); // create window\r
- gr.ClfOnUpdate = false;\r
- static pthread_t tmp;\r
- pthread_create(&tmp, 0, mgl_fltk_tmp, 0);\r
- pthread_detach(tmp); // run window handling in the separate thread\r
+ mglWindow gr("test");\r
+ gr.RunThr();\r
for(int i=0;i<10;i++) // do calculation\r
{\r
- sleep(2); // which can be very long\r
+ sleep(1); // which can be very long\r
pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
gr.Clf(); // make new drawing\r
gr.Line(mglPoint(),pnt,"Ar2");\r
char str[10] = "i=0"; str[3] = '0'+i;\r
- gr.Text(mglPoint(),"");\r
+ gr.Puts(mglPoint(),"");\r
gr.Update(); // update window\r
}\r
return 0; // finish calculations and close the window\r
//-----------------------------------------------------------------------------\r
class Foo : public mglDraw\r
{\r
+ mglPoint pnt; // some result of calculation\r
public:\r
+ mglWindow *Gr; // graphics to be updated\r
int Draw(mglGraph *gr);\r
+ void Calc();\r
} foo;\r
//-----------------------------------------------------\r
+void Foo::Calc()\r
+{\r
+ for(int i=0;i<30;i++) // do calculation\r
+ {\r
+ sleep(1); // which can be very long\r
+ pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
+ Gr->Update(); // update window\r
+ }\r
+}\r
+//-----------------------------------------------------\r
int Foo::Draw(mglGraph *gr)\r
{\r
- gr->Rotate(60,40);\r
+ gr->Line(mglPoint(),pnt,"Ar2");\r
gr->Box();\r
return 0;\r
}\r
//-----------------------------------------------------\r
+//#define PTHREAD_SAMPLE\r
int main(int argc,char **argv)\r
{\r
#ifdef PTHREAD_SAMPLE\r
- mglWindow gr(1,NULL,"test"); // create window\r
- gr.ClfOnUpdate = false;\r
- static pthread_t tmp;\r
- pthread_create(&tmp, 0, mgl_qt_tmp, 0);\r
- pthread_detach(tmp); // run window handling in the separate thread\r
- for(int i=0;i<10;i++) // do calculation\r
- {\r
- sleep(2); // which can be very long\r
- pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
- gr.Clf(); // make new drawing\r
- gr.Line(mglPoint(),pnt,"Ar2");\r
- char str[10] = "i=0"; str[3] = '0'+i;\r
- gr.Text(mglPoint(),"");\r
- gr.Update(); // update window\r
- }\r
- return 0; // finish calculations and close the window\r
+ mglWindow gr(&foo,"MathGL examples");\r
+ foo.Gr = &gr; foo.Run();\r
+ return gr.Run();\r
#else\r
mglWindow *gr;\r
char key = 0;\r
return !memcmp(b.a,d.a,b.nx*b.ny*b.nz*sizeof(mreal)); }\r
#endif\r
//-----------------------------------------------------------------------------\r
+#ifndef SWIG\r
mreal mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0);\r
+#endif\r
//-----------------------------------------------------------------------------\r
/// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase\r
inline mglData mglTransformA(const mglDataA &am, const mglDataA &ph, const char *tr)\r
#endif\r
/*****************************************************************************/\r
void _mgl_key_up(unsigned char ch,int ,int );\r
-HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par);\r
+HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p));\r
/*****************************************************************************/\r
#ifdef __cplusplus\r
}\r
class mglGLUT: public mglGraph\r
{\r
public:\r
- mglGLUT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL) : mglGraph(-1)\r
- { gr = mgl_create_graph_glut(draw,title,par); }\r
+ mglGLUT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=0, void (*load)(void *p)=0) : mglGraph(-1)\r
+ { gr = mgl_create_graph_glut(draw,title,par,load); }\r
mglGLUT(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglGraph(-1)\r
- { gr = mgl_create_graph_glut(mgl_draw_graph,title,(void*)draw); }\r
- mglGLUT(mglDraw *dr=NULL, const char *title="MathGL") : mglGraph(-1)\r
- { mgl_create_graph_glut(mgl_draw_class,title,dr); }\r
+ { gr = mgl_create_graph_glut(mgl_draw_graph,title,(void*)draw,0); }\r
+ mglGLUT(mglDraw *dr=0, const char *title="MathGL") : mglGraph(-1)\r
+ { mgl_create_graph_glut(mgl_draw_class,title,dr,0); }\r
};\r
//-----------------------------------------------------------------------------\r
#endif\r
%{
#define SWIG_FILE_WITH_INIT
+#include "mgl/config.h"
#include "mgl/type.h"
#include "mgl/data.h"
#include "mgl/mgl.h"
%apply (int DIM1, int DIM2, int DIM3, double* IN_ARRAY3) {(int rows, int cols, int slc, const double* d)};
#endif
+%include "mgl/config.h"
%include "mgl/type.h"
%include "mgl/data.h"
%include "mgl/mgl.h"
case '+':\r
fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
- fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+ fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
fprintf(fp,"l -2/%ld -1/%ld\n", i,i); break;\r
}\r
break;\r
case 1: fprintf(fp,"l %ld/%ld %ld/%ld\n", n1,n1, n2,n2); break;\r
- case 2: fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
- n1,n1,n1, n2,n2,n2, n3,n3,n3); break;\r
+ case 2:\r
+ fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n1,n1, n2,n2, n3,n3); break;\r
case 3:\r
- fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
- n1,n1,n1, n2,n2,n2, n3,n3,n3);\r
- fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
- n4,n4,n4, n2,n2,n2, n3,n3,n3);break;\r
+ fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n1,n1, n2,n2, n3,n3);\r
+ fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n4,n4, n2,n2, n3,n3); break;\r
case 4: break; // TODO: add glyphs export later\r
}\r
}\r
if(m_P) { m_p=true; m_s=true; }\r
if(m_X) { m_x=true; m_s=true; }\r
if(m_p) mgl_printf(fp, gz, "<ProtoDeclare name='m_p'><ProtoInterface/>\n<ProtoBody>"\r
- "<LineSet vertexCount=''>\n<Coordinate point='-1 0 0, 1 0 0, 0 -1 0, 0 1 0'/>"\r
+ "<LineSet vertexCount='0,1,2,3'>\n<Coordinate point='-1 0 0, 1 0 0, 0 -1 0, 0 1 0'/>"\r
"\n</LineSet></ProtoBody></ProtoDeclare>\n");\r
/*if(m_x) mgl_printf(fp, gz, "/m_x {sm sm rm s2 s2 rl 0 sm 2 mul rm sm 2 mul s2 rl d0} def\n"); // TODO\r
* if(m_s) mgl_printf(fp, gz, "/m_s {sm sm rm 0 s2 rl s2 0 rl 0 sm 2 mul rl cp d0} def\n");\r
//-----------------------------------------------------------------------------\r
void mgl_x3d_prim(const mglPrim &q, const mglPnt &p, const long *pnt, void *fp,bool gz, float size)\r
{\r
+ // <ProtoInstance name='EmissiveMaterial'/>\r
/* if(q.type==0) // mark\r
{\r
float x0 = p1.x,y0 = p1.y;\r
{
mglPoint pnt; // some result of calculation
public:
- mglGraph *Gr; // graphics to be updated
+ mglWindow *Gr; // graphics to be updated
int Draw(mglGraph *gr);
void Calc();
} foo;
//-----------------------------------------------------
-int Foo::Calc()
+void Foo::Calc()
{
for(int i=0;i<30;i++) // do calculation
{
This class is derived from mglGraph class (@pxref{MathGL core}). It provide methods for handling window with MathGL graphics.
@deftypefn {Constructor on @code{mglWindow}} {} mglWindow (@code{const char *}title=@code{"MathGL"})
-@deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title=@code{"MathGL"}, @code{void *}par=@code{NULL}, @code{int} kind=@code{0})
+@deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title=@code{"MathGL"}, @code{void *}par=@code{NULL}, @code{int} kind=@code{0}, @code{void} (*reload)(@code{HMGL} gr, @code{void *}p)=0)
@deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{mglGraph *}gr), @code{const char *}title=@code{"MathGL"}, @code{int} kind=@code{0})
@deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{mglDraw *}draw, @code{const char *}title=@code{"MathGL"}, @code{int} kind=@code{0})
-@deftypefnx {C function} @code{HMGL} mgl_create_graph_qt (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par)
-@deftypefnx {C function} @code{HMGL} mgl_create_graph_fltk (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par)
-@deftypefnx {C function} @code{HMGL} mgl_create_graph_glut (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par)
+@deftypefnx {C function} @code{HMGL} mgl_create_graph_qt (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par, @code{void} (*reload)(@code{HMGL} gr, @code{void *}p))
+@deftypefnx {C function} @code{HMGL} mgl_create_graph_fltk (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par, @code{void} (*reload)(@code{HMGL} gr, @code{void *}p))
+@deftypefnx {C function} @code{HMGL} mgl_create_graph_glut (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par, @code{void} (*reload)(@code{HMGL} gr, @code{void *}p))
Creates a window for plotting. Parameter @var{draw} sets a pointer to drawing function (this is the name of function) or instance of @code{mglDraw} class. There is support of a list of plots (frames). So as one can prepare a set of frames at first and redraw it fast later (but it requires more memory). Function should return positive number of frames for the list or zero if it will plot directly. Note, that @var{draw} can be @code{NULL} for displaying static bitmaps only (no animation or slides). Parameter @var{title} sets the title of the window. Parameter @var{par} contains pointer to data for the plotting function @var{draw}. Parameter @var{kind} may have following values: @samp{0} -- use FLTK window, @samp{1} -- use Qt window.
1. Add sample for window in python/octave (like pthread) -- Docs
2. Add help about cmake into the "Installation and using" -- after build system will be ready
3. Export to X3D
+4. Check RunThr()
============= FOR V.2.1 ========
glDeleteLists(1,NumFig);\r
}\r
//-----------------------------------------------------------------------------\r
-HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par)\r
+HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p))\r
{\r
mglCanvasGLUT *g = new mglCanvasGLUT;\r
- g->Window(0,0,draw,title,par);\r
+ g->Window(0,0,draw,title,par, load);\r
return g;\r
}\r
//-----------------------------------------------------------------------------\r
//-----------------------------------------------------------------------------\r
int mgl_fltk_thr() // NOTE: Qt couldn't be running in non-primary thread\r
{\r
+#if MGL_HAVE_PTHREAD\r
static pthread_t thr;\r
pthread_create(&thr,0,mgl_fltk_tmp,0);\r
pthread_detach(thr);\r
+#endif\r
return 0; // stupid, but I don't want keep result returned by Fl::Run()\r
}\r
//-----------------------------------------------------------------------------\r