Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

open-axiom repository from github

24005 views
1
/*
2
Copyright (C) 1991-2002, The Numerical Algorithms Group Ltd.
3
All rights reserved.
4
Copyright (C) 2007-2013, Gabriel Dos Reis.
5
All rights reserved.
6
7
Redistribution and use in source and binary forms, with or without
8
modification, are permitted provided that the following conditions are
9
met:
10
11
- Redistributions of source code must retain the above copyright
12
notice, this list of conditions and the following disclaimer.
13
14
- Redistributions in binary form must reproduce the above copyright
15
notice, this list of conditions and the following disclaimer in
16
the documentation and/or other materials provided with the
17
distribution.
18
19
- Neither the name of The Numerical ALgorithms Group Ltd. nor the
20
names of its contributors may be used to endorse or promote products
21
derived from this software without specific prior written permission.
22
23
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
27
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
*/
35
36
#define _FUN2D_C
37
38
#include <stdlib.h>
39
#include <unistd.h>
40
#include <stdio.h>
41
#include <string.h>
42
43
44
#include "open-axiom.h"
45
#include "viewman.h"
46
#include "actions.h"
47
48
#include "util.H1"
49
#include "sockio.h"
50
#include "fun2D.H1"
51
#include "readView.H1"
52
#include "make2D.H1"
53
#include "cfuns.h"
54
55
using namespace OpenAxiom;
56
57
#define writeEach
58
59
void
60
funView2D(int viewCommand)
61
{
62
63
int viewPID;
64
float f1,f2;
65
int i1,i2,i3;
66
viewManager *viewport;
67
68
viewPID = get_int(spadSock);
69
70
71
viewport = viewports;
72
while ((viewport) && (viewport->PID != viewPID)) {
73
viewport = viewport->nextViewport;
74
}
75
76
if (viewport) {
77
send_int(spadSock,1); /* acknowledge to spad */
78
write(viewport->viewOut,&viewCommand,intSize);
79
80
81
switch (viewCommand) {
82
83
case putGraph:
84
i1 = get_int(spadSock); /* graph key */
85
i2 = get_int(spadSock); /* viewport slot 1..9 */
86
i2--; /* 0..8*/
87
write(viewport->viewOut,&i1,intSize);
88
write(viewport->viewOut,&i2,intSize);
89
i3 = 1; /* continue*/
90
write(viewport->viewOut,&i3,intSize);
91
sendGraphToView2D(0,i1,viewport,&currentGraphState);
92
93
break;
94
95
case translate2D:
96
i1 = get_int(spadSock); /* graph index */
97
f1 = get_float(spadSock); /* translate in the x direction */
98
f2 = get_float(spadSock); /* translate in the y direction */
99
write(viewport->viewOut,&i1,intSize);
100
write(viewport->viewOut,&f1,floatSize);
101
write(viewport->viewOut,&f2,floatSize);
102
break;
103
104
case scale2D:
105
i1 = get_int(spadSock); /* graph index */
106
f1 = get_float(spadSock); /* scale in the x direction */
107
f2 = get_float(spadSock); /* scale in the y direction */
108
write(viewport->viewOut,&i1,intSize);
109
write(viewport->viewOut,&f1,floatSize);
110
write(viewport->viewOut,&f2,floatSize);
111
break;
112
113
case hideControl2D:
114
i1 = get_int(spadSock);
115
write(viewport->viewOut,&i1,intSize);
116
break;
117
118
case axesOnOff2D:
119
case unitsOnOff2D:
120
case connectOnOff:
121
case pointsOnOff:
122
case spline2D:
123
case showing2D:
124
i1 = get_int(spadSock); /* graph index */
125
i2 = get_int(spadSock); /* axes status */
126
write(viewport->viewOut,&i1,intSize);
127
write(viewport->viewOut,&i2,intSize);
128
break;
129
130
case moveViewport:
131
case resizeViewport:
132
i1 = get_int(spadSock);
133
i2 = get_int(spadSock);
134
write(viewport->viewOut,&i1,intSize);
135
write(viewport->viewOut,&i2,intSize);
136
break;
137
138
case changeTitle:
139
s1 = get_string(spadSock);
140
i1 = strlen(s1);
141
write(viewport->viewOut,&i1,intSize);
142
write(viewport->viewOut,s1,i1);
143
break;
144
145
case writeView:
146
s1 = get_string(spadSock);
147
i1 = strlen(s1);
148
write(viewport->viewOut,&i1,intSize);
149
write(viewport->viewOut,s1,i1);
150
/* write out the types of things to be written */
151
i2 = get_int(spadSock);
152
write(viewport->viewOut,&i2,intSize);
153
while (i2) {
154
i2 = get_int(spadSock);
155
write(viewport->viewOut,&i2,intSize);
156
}
157
break;
158
159
case spadPressedAButton:
160
i1 = get_int(spadSock);
161
write(viewport->viewOut,&i1,intSize);
162
break;
163
164
} /* switch */
165
/*** get acknowledge from viewport */
166
readViewport(viewport,&acknow,intSize);
167
send_int(spadSock,1); /* acknowledge to spad */
168
} else {
169
send_int(spadSock,-1); /* send error value in acknowledge to spad */
170
}
171
172
}
173
174
void
175
forkView2D(void)
176
{
177
178
viewManager *viewport;
179
int childPID, code;
180
int i;
181
view2DStruct doView2D;
182
graphStateStruct doGraphStateArray[maxGraphs];
183
int there;
184
int pipe0[2], pipe1[2];
185
186
char envAXIOM[100],runView[100];
187
188
#ifdef DEBUG
189
fprintf(stderr,"fun2D:Pipe calls for 2D\n");
190
#endif
191
check(pipe(pipe0));
192
check(pipe(pipe1));
193
194
#ifdef DEBUG
195
fprintf(stderr,"Fork routine for 2D\n");
196
#endif
197
childPID = check(fork());
198
199
switch(childPID) {
200
201
case -1:
202
fprintf(stderr,
203
"The viewport manager cannot open a viewport window.\nTry closing some viewports.\n");
204
return;
205
206
case 0:
207
/*****************************
208
* child process *
209
*****************************/
210
/* map pipes from viewport manager to standard input and output */
211
#ifdef DEBUG
212
fprintf(stderr,"Mapping pipes to standard I/O in 2D\n");
213
#endif
214
check(dup2(pipe0[0],0));
215
check(dup2(pipe1[1],1));
216
close(pipe0[0]);
217
close(pipe0[1]);
218
close(pipe1[0]);
219
close(pipe1[1]);
220
221
#ifdef DEBUG
222
fprintf(stderr,"Executing TwoDimensionalViewport process\n");
223
#endif
224
sprintf(envAXIOM,"%s",oa_getenv("AXIOM"));
225
sprintf(runView,"%s%s",envAXIOM,"/lib/view2D");
226
check(execl(runView,runView, (char*) NULL));
227
fprintf(stderr,"The viewport manager could not execute view2D.\nCheck that view2D is on your PATH.\n");
228
exit(-1);
229
230
default:
231
/******************************
232
* parent process *
233
******************************/
234
if (!(viewport = (viewManager *)malloc(sizeof(viewManager)))) {
235
fprintf(stderr,"The viewport manager ran out of memory trying to create a new viewport window (viewManager).\n");
236
return;
237
}
238
viewport->viewType = view2DType;
239
viewport->PID = childPID;
240
241
/* set up pipes to child process */
242
close(pipe0[0]);
243
close(pipe1[1]);
244
viewport->viewIn = pipe1[0];
245
viewport->viewOut = pipe0[1];
246
247
/* add new viewport to global list */
248
viewport->nextViewport = viewports;
249
viewports = viewport;
250
251
if (viewport->viewIn <0) {
252
fprintf(stderr,
253
"viewman could not create connection to a 2D viewport window. Try again.\n");
254
return;
255
} else {
256
257
code = readViewport(viewport,&acknow,intSize);
258
259
if (code < 0) {
260
fprintf(stderr,
261
"viewman could not read from a 2D viewport window\ncode=%d\nack=%d\n",
262
code,acknow);
263
return;
264
}
265
}
266
267
makeView2DFromSpadData(&doView2D,doGraphStateArray);
268
269
/* tell the child that mother is a viewport manager */
270
i = no;
271
write(viewport->viewOut,&i,sizeof(int));
272
273
write(viewport->viewOut,&doView2D,sizeof(view2DStruct));
274
i = strlen(doView2D.title)+1;
275
write(viewport->viewOut,&i,intSize); /* send length of the title child */
276
write(viewport->viewOut,doView2D.title,i); /* send title to the child */
277
for (i=0; i<maxGraphs; i++) {
278
there = doView2D.graphKeyArray[i];
279
write(viewport->viewOut,&there,intSize);
280
sendGraphToView2D(i,there,viewport,doGraphStateArray);
281
}; /* for i in graphs */
282
283
/*** get acknowledge from viewport */
284
285
code = readViewport(viewport,&(viewport->viewWindow),sizeof(Window));
286
openaxiom_sleep(1); /* wait a second...*/
287
send_int(spadSock,viewport->PID); /* acknowledge to spad */
288
289
} /* switch */
290
291
} /* forkView2D() */
292
293
294
295
void
296
sendGraphToView2D(int i,int there,viewManager *viewport,graphStateStruct *doGraphStateArray)
297
{
298
299
graphStruct *gPtr;
300
pointListStruct *llPtr;
301
pointStruct *p;
302
viewsWithThisGraph *oneView;
303
int j,k;
304
305
if (there) {
306
gPtr = graphList;
307
while ( gPtr != NULL && gPtr->key != there) /** find the right graph (same key) in graph list **/
308
gPtr = gPtr->nextGraph;
309
if ((gPtr==NULL) ||(gPtr->key != there) ){
310
fprintf(stderr,
311
"The viewport manager cannot find the requested graph and will quit and restart.\n");
312
exit(-1);
313
}
314
315
316
/*** Before sending off the data, insert a pointer to viewport from graph ***/
317
if (!(oneView = (viewsWithThisGraph *)malloc(sizeof(viewsWithThisGraph)))) {
318
fprintf(stderr,"The viewport manager ran out of memory trying to create a new graph (viewsWithThisGraph).\n");
319
return;
320
}
321
oneView->viewGr = viewport;
322
oneView->nextViewthing = gPtr->views;
323
gPtr->views = oneView;
324
325
#ifdef writeEach
326
write(viewport->viewOut,&(gPtr->xmin),floatSize);
327
write(viewport->viewOut,&(gPtr->xmax),floatSize);
328
write(viewport->viewOut,&(gPtr->ymin),floatSize);
329
write(viewport->viewOut,&(gPtr->ymax),floatSize);
330
write(viewport->viewOut,&(gPtr->xNorm),floatSize);
331
write(viewport->viewOut,&(gPtr->yNorm),floatSize);
332
write(viewport->viewOut,&(gPtr->spadUnitX),floatSize);
333
write(viewport->viewOut,&(gPtr->spadUnitY),floatSize);
334
write(viewport->viewOut,&(gPtr->unitX),floatSize);
335
write(viewport->viewOut,&(gPtr->unitY),floatSize);
336
write(viewport->viewOut,&(gPtr->originX),floatSize);
337
write(viewport->viewOut,&(gPtr->originY),floatSize);
338
write(viewport->viewOut,&(gPtr->numberOfLists),intSize);
339
#else
340
write(viewport->viewOut,gPtr,sizeof(graphStruct));
341
#endif
342
343
llPtr = gPtr->listOfListsOfPoints;
344
for (j=0; j<(gPtr->numberOfLists); j++) {
345
write(viewport->viewOut,&(llPtr->numberOfPoints),intSize);
346
p = llPtr->listOfPoints;
347
for (k=0; k<(llPtr->numberOfPoints); k++) {
348
write(viewport->viewOut,&(p->x),floatSize);
349
write(viewport->viewOut,&(p->y),floatSize);
350
write(viewport->viewOut,&(p->hue),floatSize);
351
write(viewport->viewOut,&(p->shade),floatSize);
352
p++;
353
} /* for k in list of points */
354
write(viewport->viewOut,&(llPtr->pointColor),intSize);
355
write(viewport->viewOut,&(llPtr->lineColor),intSize);
356
write(viewport->viewOut,&(llPtr->pointSize),intSize);
357
llPtr++;
358
} /* for j in list of lists of points */
359
360
/* a graph state is defined for a graph if graph is there */
361
write(viewport->viewOut,&(doGraphStateArray[i].scaleX),floatSize);
362
write(viewport->viewOut,&(doGraphStateArray[i].scaleY),floatSize);
363
write(viewport->viewOut,&(doGraphStateArray[i].deltaX),floatSize);
364
write(viewport->viewOut,&(doGraphStateArray[i].deltaY),floatSize);
365
write(viewport->viewOut,&(doGraphStateArray[i].pointsOn),intSize);
366
write(viewport->viewOut,&(doGraphStateArray[i].connectOn),intSize);
367
write(viewport->viewOut,&(doGraphStateArray[i].splineOn),intSize);
368
write(viewport->viewOut,&(doGraphStateArray[i].axesOn),intSize);
369
write(viewport->viewOut,&(doGraphStateArray[i].axesColor),intSize);
370
write(viewport->viewOut,&(doGraphStateArray[i].unitsOn),intSize);
371
write(viewport->viewOut,&(doGraphStateArray[i].unitsColor),intSize);
372
write(viewport->viewOut,&(doGraphStateArray[i].showing),intSize);
373
374
} /* if graph is there */
375
376
}
377
378
379