Actual source code: fdrawv.c
1: #include <../src/sys/classes/viewer/impls/draw/vdraw.h>
2: #include <petscviewer.h>
4: /*@
5: PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PETSCVIEWERDRAW` `PetscViewer` object.
6: This `PetscDraw` object may then be used to perform graphics using `PetscDraw` commands.
8: Collective
10: Input Parameters:
11: + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`)
12: - windownumber - indicates which subwindow (usually 0) to obtain
14: Output Parameter:
15: . draw - the draw object
17: Level: intermediate
19: .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
20: @*/
21: PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw)
22: {
23: PetscViewer_Draw *vdraw;
24: PetscBool isdraw;
26: PetscFunctionBegin;
29: if (draw) PetscAssertPointer(draw, 3);
30: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
31: PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
32: PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
33: vdraw = (PetscViewer_Draw *)viewer->data;
35: windownumber += vdraw->draw_base;
36: if (windownumber >= vdraw->draw_max) {
37: /* allocate twice as many slots as needed */
38: PetscInt draw_max = vdraw->draw_max;
39: PetscDraw *tdraw = vdraw->draw;
40: PetscDrawLG *drawlg = vdraw->drawlg;
41: PetscDrawAxis *drawaxis = vdraw->drawaxis;
43: vdraw->draw_max = 2 * windownumber;
45: PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
46: PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max));
47: PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max));
48: PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max));
49: PetscCall(PetscFree3(tdraw, drawlg, drawaxis));
50: }
52: if (!vdraw->draw[windownumber]) {
53: char *title = vdraw->title, tmp_str[128];
54: if (windownumber) {
55: PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber));
56: title = tmp_str;
57: }
58: PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber]));
59: if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype));
60: PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause));
61: PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix));
62: PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber]));
63: }
64: if (draw) *draw = vdraw->draw[windownumber];
66: PetscFunctionReturn(PETSC_SUCCESS);
67: }
69: /*@
70: PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`.
71: This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands.
73: Collective
75: Input Parameters:
76: + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
77: - windownumber - indicates which subwindow (usually 0)
79: Output Parameter:
80: . drawlg - the draw line graph object
82: Level: intermediate
84: Note:
85: A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
87: .seealso: [](sec_viewers), `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
88: @*/
89: PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg)
90: {
91: PetscBool isdraw;
92: PetscViewer_Draw *vdraw;
94: PetscFunctionBegin;
97: PetscAssertPointer(drawlg, 3);
98: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
99: PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
100: PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
101: vdraw = (PetscViewer_Draw *)viewer->data;
103: if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
104: if (!vdraw->drawlg[windownumber + vdraw->draw_base]) {
105: PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base]));
106: PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base]));
107: }
108: *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base];
109: PetscFunctionReturn(PETSC_SUCCESS);
110: }
112: /*@
113: PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`.
114: This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands.
116: Collective
118: Input Parameters:
119: + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
120: - windownumber - indicates which subwindow (usually 0)
122: Output Parameter:
123: . drawaxis - the draw axis object
125: Level: advanced
127: Note:
128: A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
130: .seealso: [](sec_viewers), `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()`
131: @*/
132: PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis)
133: {
134: PetscBool isdraw;
135: PetscViewer_Draw *vdraw;
137: PetscFunctionBegin;
140: PetscAssertPointer(drawaxis, 3);
141: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
142: PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
143: PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
144: vdraw = (PetscViewer_Draw *)viewer->data;
146: if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
147: if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base]));
148: *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base];
149: PetscFunctionReturn(PETSC_SUCCESS);
150: }
152: PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype)
153: {
154: PetscViewer_Draw *vdraw;
155: PetscBool isdraw;
157: PetscFunctionBegin;
159: PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
160: if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
161: vdraw = (PetscViewer_Draw *)v->data;
163: PetscCall(PetscFree(vdraw->drawtype));
164: PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype));
165: PetscFunctionReturn(PETSC_SUCCESS);
166: }
168: PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype)
169: {
170: PetscViewer_Draw *vdraw;
171: PetscBool isdraw;
173: PetscFunctionBegin;
175: PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
176: PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
177: vdraw = (PetscViewer_Draw *)v->data;
179: *drawtype = vdraw->drawtype;
180: PetscFunctionReturn(PETSC_SUCCESS);
181: }