xref: /petsc/src/sys/classes/draw/impls/tikz/tikz.c (revision 71d8d82df958004b26197eb63ed50e0190a1ca60)
142963b84SBarry Smith 
242963b84SBarry Smith /*
342963b84SBarry Smith     Defines the operations for the X PetscDraw implementation.
442963b84SBarry Smith */
542963b84SBarry Smith 
6af0996ceSBarry Smith #include <petsc/private/drawimpl.h>         /*I  "petscsys.h" I*/
742963b84SBarry Smith 
842963b84SBarry Smith typedef struct {
942963b84SBarry Smith   char      *filename;
1042963b84SBarry Smith   FILE      *fd;
1142963b84SBarry Smith   PetscBool written;  /* something has been written to the current frame */
1242963b84SBarry Smith } PetscDraw_TikZ;
1342963b84SBarry Smith 
1442963b84SBarry Smith #define TikZ_BEGIN_DOCUMENT  "\\documentclass{beamer}\n\n\
1542963b84SBarry Smith \\usepackage{tikz}\n\
1642963b84SBarry Smith \\usepackage{pgflibraryshapes}\n\
1742963b84SBarry Smith \\usetikzlibrary{backgrounds}\n\
1842963b84SBarry Smith \\usetikzlibrary{arrows}\n\
1942963b84SBarry Smith \\newenvironment{changemargin}[2]{%%\n\
2042963b84SBarry Smith   \\begin{list}{}{%%\n\
2142963b84SBarry Smith     \\setlength{\\topsep}{0pt}%%\n\
2242963b84SBarry Smith     \\setlength{\\leftmargin}{#1}%%\n\
2342963b84SBarry Smith     \\setlength{\\rightmargin}{#2}%%\n\
2442963b84SBarry Smith     \\setlength{\\listparindent}{\\parindent}%%\n\
2542963b84SBarry Smith     \\setlength{\\itemindent}{\\parindent}%%\n\
2642963b84SBarry Smith     \\setlength{\\parsep}{\\parskip}%%\n\
2742963b84SBarry Smith   }%%\n\
2842963b84SBarry Smith   \\item[]}{\\end{list}}\n\n\
2942963b84SBarry Smith \\begin{document}\n"
3042963b84SBarry Smith 
3142963b84SBarry Smith #define TikZ_BEGIN_FRAME "\\begin{frame}{}\n\
3242963b84SBarry Smith \\begin{changemargin}{-1cm}{0cm}\n\
3342963b84SBarry Smith \\begin{center}\n\
3442963b84SBarry Smith \\begin{tikzpicture}[scale = 10.00,font=\\fontsize{8}{8}\\selectfont]\n"
3542963b84SBarry Smith 
3642963b84SBarry Smith #define TikZ_END_FRAME "\\end{tikzpicture}\n\
3742963b84SBarry Smith \\end{center}\n\
3842963b84SBarry Smith \\end{changemargin}\n\
3942963b84SBarry Smith \\end{frame}\n"
4042963b84SBarry Smith 
4142963b84SBarry Smith #define TikZ_END_DOCUMENT  "\\end{document}\n"
4242963b84SBarry Smith 
4342963b84SBarry Smith #undef __FUNCT__
4442963b84SBarry Smith #define __FUNCT__ "PetscDrawDestroy_TikZ"
4542963b84SBarry Smith PetscErrorCode  PetscDrawDestroy_TikZ(PetscDraw draw)
4642963b84SBarry Smith {
4742963b84SBarry Smith   PetscDraw_TikZ *win = (PetscDraw_TikZ*)draw->data;
4842963b84SBarry Smith   PetscErrorCode ierr;
4942963b84SBarry Smith 
5042963b84SBarry Smith   PetscFunctionBegin;
51ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,TikZ_END_FRAME);CHKERRQ(ierr);
52ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,TikZ_END_DOCUMENT);CHKERRQ(ierr);
53ce94432eSBarry Smith   ierr = PetscFClose(PetscObjectComm((PetscObject)draw),win->fd);CHKERRQ(ierr);
5442963b84SBarry Smith   ierr = PetscFree(win->filename);CHKERRQ(ierr);
5550c74209SLisandro Dalcin   ierr = PetscFree(draw->data);CHKERRQ(ierr);
5642963b84SBarry Smith   PetscFunctionReturn(0);
5742963b84SBarry Smith }
5842963b84SBarry Smith 
5942963b84SBarry Smith static const char *TikZColors[] = { "white",  "black", "red",  "green", "cyan",   "blue", "magenta", 0, 0, "orange",
6042963b84SBarry Smith                                     "violet", "brown", "pink", 0,       "yellow", 0};
6142963b84SBarry Smith 
6242963b84SBarry Smith PETSC_STATIC_INLINE const char *TikZColorMap(int cl)
6342963b84SBarry Smith {
6442963b84SBarry Smith   return((cl < 16) ? (TikZColors[cl] ? TikZColors[cl] : "black") : "black");
6542963b84SBarry Smith }
6642963b84SBarry Smith 
6742963b84SBarry Smith /*
6842963b84SBarry Smith      These macros transform from the users coordinates to the (0,0) -> (1,1) coordinate system
6942963b84SBarry Smith */
7042963b84SBarry Smith #define XTRANS(draw,x)  (double)(((draw)->port_xl + (((x - (draw)->coor_xl)*((draw)->port_xr - (draw)->port_xl))/((draw)->coor_xr - (draw)->coor_xl))))
7142963b84SBarry Smith #define YTRANS(draw,y)  (double)(((draw)->port_yl + (((y - (draw)->coor_yl)*((draw)->port_yr - (draw)->port_yl))/((draw)->coor_yr - (draw)->coor_yl))))
7242963b84SBarry Smith 
7342963b84SBarry Smith #undef __FUNCT__
7442963b84SBarry Smith #define __FUNCT__ "PetscDrawClear_TikZ"
7542963b84SBarry Smith PetscErrorCode PetscDrawClear_TikZ(PetscDraw draw)
7642963b84SBarry Smith {
7742963b84SBarry Smith   PetscDraw_TikZ *win = (PetscDraw_TikZ*)draw->data;
7842963b84SBarry Smith   PetscErrorCode ierr;
7942963b84SBarry Smith 
8042963b84SBarry Smith   PetscFunctionBegin;
8142963b84SBarry Smith   /* often PETSc generates unneeded clears, we want avoid creating empy pictures for them */
8242963b84SBarry Smith   if (!win->written) PetscFunctionReturn(0);
83ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,TikZ_END_FRAME);CHKERRQ(ierr);
84ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,TikZ_BEGIN_FRAME);CHKERRQ(ierr);
8542963b84SBarry Smith   PetscFunctionReturn(0);
8642963b84SBarry Smith }
8742963b84SBarry Smith 
8842963b84SBarry Smith #undef __FUNCT__
89*71d8d82dSLisandro Dalcin #define __FUNCT__ "PetscDrawSynchronizedClear_TikZ"
90*71d8d82dSLisandro Dalcin PetscErrorCode PetscDrawSynchronizedClear_TikZ(PetscDraw draw)
91*71d8d82dSLisandro Dalcin {
92*71d8d82dSLisandro Dalcin   PetscErrorCode ierr;
93*71d8d82dSLisandro Dalcin 
94*71d8d82dSLisandro Dalcin   PetscFunctionBegin;
95*71d8d82dSLisandro Dalcin   ierr = PetscDrawClear_TikZ(draw);CHKERRQ(ierr);
96*71d8d82dSLisandro Dalcin   PetscFunctionReturn(0);
97*71d8d82dSLisandro Dalcin }
98*71d8d82dSLisandro Dalcin 
99*71d8d82dSLisandro Dalcin #undef __FUNCT__
10042963b84SBarry Smith #define __FUNCT__ "PetscDrawLine_TikZ"
10142963b84SBarry Smith PetscErrorCode PetscDrawLine_TikZ(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl)
10242963b84SBarry Smith {
10342963b84SBarry Smith   PetscDraw_TikZ *win = (PetscDraw_TikZ*)draw->data;
10442963b84SBarry Smith   PetscErrorCode ierr;
10542963b84SBarry Smith 
10642963b84SBarry Smith   PetscFunctionBegin;
10742963b84SBarry Smith   win->written = PETSC_TRUE;
108ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,"\\draw [%s] (%g,%g) --(%g,%g);\n",TikZColorMap(cl),XTRANS(draw,xl),YTRANS(draw,yl),XTRANS(draw,xr),YTRANS(draw,yr));CHKERRQ(ierr);
10942963b84SBarry Smith   PetscFunctionReturn(0);
11042963b84SBarry Smith }
11142963b84SBarry Smith 
11242963b84SBarry Smith #undef __FUNCT__
11342963b84SBarry Smith #define __FUNCT__ "PetscDrawString_TikZ"
11442963b84SBarry Smith PetscErrorCode PetscDrawString_TikZ(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
11542963b84SBarry Smith {
11642963b84SBarry Smith   PetscDraw_TikZ *win = (PetscDraw_TikZ*)draw->data;
11742963b84SBarry Smith   PetscErrorCode ierr;
11842963b84SBarry Smith 
11942963b84SBarry Smith   PetscFunctionBegin;
12042963b84SBarry Smith   win->written = PETSC_TRUE;
121ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,"\\node [above right, %s] at (%g,%g) {%s};\n",TikZColorMap(cl),XTRANS(draw,xl),YTRANS(draw,yl),text);CHKERRQ(ierr);
12242963b84SBarry Smith   PetscFunctionReturn(0);
12342963b84SBarry Smith }
12442963b84SBarry Smith 
12542963b84SBarry Smith #undef __FUNCT__
126d6ed00deSBarry Smith #define __FUNCT__ "PetscDrawStringVertical_TikZ"
127d6ed00deSBarry Smith PetscErrorCode PetscDrawStringVertical_TikZ(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
128d6ed00deSBarry Smith {
129d6ed00deSBarry Smith   PetscDraw_TikZ *win = (PetscDraw_TikZ*)draw->data;
130d6ed00deSBarry Smith   PetscErrorCode ierr;
131d6ed00deSBarry Smith   size_t         len;
132d6ed00deSBarry Smith   PetscReal      width;
133d6ed00deSBarry Smith 
134d6ed00deSBarry Smith   PetscFunctionBegin;
135d6ed00deSBarry Smith   win->written = PETSC_TRUE;
136d6ed00deSBarry Smith   ierr = PetscStrlen(text,&len);CHKERRQ(ierr);
137d6ed00deSBarry Smith   ierr = PetscDrawStringGetSize(draw,&width,NULL);CHKERRQ(ierr);
138d6ed00deSBarry Smith   yl   = yl - len*width*(draw->coor_yr - draw->coor_yl)/(draw->coor_xr - draw->coor_xl);
139d6ed00deSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,"\\node [rotate=90, %s] at (%g,%g) {%s};\n",TikZColorMap(cl),XTRANS(draw,xl),YTRANS(draw,yl),text);CHKERRQ(ierr);
140d6ed00deSBarry Smith   PetscFunctionReturn(0);
141d6ed00deSBarry Smith }
142d6ed00deSBarry Smith 
143d6ed00deSBarry Smith #undef __FUNCT__
14451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringBoxed_TikZ"
14542963b84SBarry Smith /*
14642963b84SBarry Smith     Does not handle multiline strings correctly
14742963b84SBarry Smith */
14851fa3d41SBarry Smith PetscErrorCode PetscDrawStringBoxed_TikZ(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,int ct,const char text[],PetscReal *w,PetscReal *h)
14942963b84SBarry Smith {
15042963b84SBarry Smith   PetscDraw_TikZ *win = (PetscDraw_TikZ*)draw->data;
15142963b84SBarry Smith   PetscErrorCode ierr;
15242963b84SBarry Smith   size_t         len;
15342963b84SBarry Smith 
15442963b84SBarry Smith   PetscFunctionBegin;
15542963b84SBarry Smith   win->written = PETSC_TRUE;
156ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,"\\draw (%g,%g) node [rectangle, draw, align=center, inner sep=1ex] {%s};\n",XTRANS(draw,xl),YTRANS(draw,yl),text);CHKERRQ(ierr);
15742963b84SBarry Smith 
15842963b84SBarry Smith   /* make up totally bogus height and width of box */
15942963b84SBarry Smith   ierr = PetscStrlen(text,&len);CHKERRQ(ierr);
16042963b84SBarry Smith   if (w) *w = .07*len;
16142963b84SBarry Smith   if (h) *h = .07;
16242963b84SBarry Smith   PetscFunctionReturn(0);
16342963b84SBarry Smith }
16442963b84SBarry Smith 
165d6ed00deSBarry Smith #undef __FUNCT__
166d6ed00deSBarry Smith #define __FUNCT__ "PetscDrawStringGetSize_TikZ"
167d6ed00deSBarry Smith PetscErrorCode PetscDrawStringGetSize_TikZ(PetscDraw draw,PetscReal *x,PetscReal  *y)
168d6ed00deSBarry Smith {
169d6ed00deSBarry Smith   PetscFunctionBegin;
170d6ed00deSBarry Smith   if (x) *x = .014*(draw->coor_xr - draw->coor_xl)/((draw->port_xr - draw->port_xl));
171d6ed00deSBarry Smith   if (y) *y = .05*(draw->coor_yr - draw->coor_yl)/((draw->port_yr - draw->port_yl));
172d6ed00deSBarry Smith   PetscFunctionReturn(0);
173d6ed00deSBarry Smith }
174d6ed00deSBarry Smith 
17542963b84SBarry Smith static struct _PetscDrawOps DvOps = { 0,
17642963b84SBarry Smith                                       0,
17742963b84SBarry Smith                                       PetscDrawLine_TikZ,
17842963b84SBarry Smith                                       0,
17942963b84SBarry Smith                                       0,
18042963b84SBarry Smith                                       0,
18142963b84SBarry Smith                                       0,
18242963b84SBarry Smith                                       PetscDrawString_TikZ,
183d6ed00deSBarry Smith                                       PetscDrawStringVertical_TikZ,
18442963b84SBarry Smith                                       0,
185d6ed00deSBarry Smith                                       PetscDrawStringGetSize_TikZ,
18642963b84SBarry Smith                                       0,
18742963b84SBarry Smith                                       PetscDrawClear_TikZ,
18842963b84SBarry Smith                                       0,
18942963b84SBarry Smith                                       0,
19042963b84SBarry Smith                                       0,
19142963b84SBarry Smith                                       0,
19242963b84SBarry Smith                                       0,
19342963b84SBarry Smith                                       0,
194*71d8d82dSLisandro Dalcin                                       PetscDrawSynchronizedClear_TikZ,
19542963b84SBarry Smith                                       0,
19642963b84SBarry Smith                                       0,
19742963b84SBarry Smith                                       0,
19842963b84SBarry Smith                                       0,
19942963b84SBarry Smith                                       0,
20042963b84SBarry Smith                                       0,
20142963b84SBarry Smith                                       PetscDrawDestroy_TikZ,
20242963b84SBarry Smith                                       0,
20342963b84SBarry Smith                                       0,
20442963b84SBarry Smith                                       0,
20542963b84SBarry Smith                                       0,
20642963b84SBarry Smith                                       0,
20742963b84SBarry Smith                                       0,
20842963b84SBarry Smith                                       0,
20942963b84SBarry Smith                                       0,
21042963b84SBarry Smith                                       0,
21142963b84SBarry Smith                                       0,
21251fa3d41SBarry Smith                                       PetscDrawStringBoxed_TikZ};
21342963b84SBarry Smith 
21442963b84SBarry Smith #undef __FUNCT__
21542963b84SBarry Smith #define __FUNCT__ "PetscDrawCreate_TikZ"
2168cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscDrawCreate_TikZ(PetscDraw draw)
21742963b84SBarry Smith {
21842963b84SBarry Smith   PetscDraw_TikZ *win;
21942963b84SBarry Smith   PetscErrorCode ierr;
22042963b84SBarry Smith 
22142963b84SBarry Smith   PetscFunctionBegin;
22242963b84SBarry Smith   ierr = PetscMemcpy(draw->ops,&DvOps,sizeof(DvOps));CHKERRQ(ierr);
223b00a9115SJed Brown   ierr = PetscNew(&win);CHKERRQ(ierr);
2243bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)draw,sizeof(PetscDraw_TikZ));CHKERRQ(ierr);
225a297a907SKarl Rupp 
22642963b84SBarry Smith   draw->data = (void*) win;
22742963b84SBarry Smith 
22842963b84SBarry Smith   if (draw->title) {
22942963b84SBarry Smith     ierr = PetscStrallocpy(draw->title,&win->filename);CHKERRQ(ierr);
23042963b84SBarry Smith   } else {
23142963b84SBarry Smith     const char *fname;
23242963b84SBarry Smith     ierr = PetscObjectGetName((PetscObject)draw,&fname);CHKERRQ(ierr);
23342963b84SBarry Smith     ierr = PetscStrallocpy(fname,&win->filename);CHKERRQ(ierr);
23442963b84SBarry Smith   }
235ce94432eSBarry Smith   ierr = PetscFOpen(PetscObjectComm((PetscObject)draw),win->filename,"w",&win->fd);CHKERRQ(ierr);
236ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,TikZ_BEGIN_DOCUMENT);CHKERRQ(ierr);
237ce94432eSBarry Smith   ierr = PetscFPrintf(PetscObjectComm((PetscObject)draw),win->fd,TikZ_BEGIN_FRAME);CHKERRQ(ierr);
238a297a907SKarl Rupp 
23942963b84SBarry Smith   win->written = PETSC_FALSE;
24042963b84SBarry Smith   PetscFunctionReturn(0);
24142963b84SBarry Smith }
24242963b84SBarry Smith 
24342963b84SBarry Smith 
24442963b84SBarry Smith 
24542963b84SBarry Smith 
24642963b84SBarry Smith 
24742963b84SBarry Smith 
24842963b84SBarry Smith 
24942963b84SBarry Smith 
25042963b84SBarry Smith 
251