ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/ies2rad.c
Revision: 2.3
Committed: Thu May 21 09:56:36 1992 UTC (31 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +1 -1 lines
Log Message:
fixed register allocation IBM RS/6000 didn't like

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1990 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * Convert IES luminaire data to Radiance description
9     *
10     * 07Apr90 Greg Ward
11     */
12    
13     #include <stdio.h>
14     #include <ctype.h>
15 greg 1.2 #include "color.h"
16 greg 1.1
17     #define PI 3.14159265358979323846
18     /* floating comparisons */
19     #define FTINY 1e-6
20     #define FEQ(a,b) ((a)<=(b)+FTINY&&(a)>=(b)-FTINY)
21     /* tilt specs */
22     #define TLTSTR "TILT="
23     #define TLTSTRLEN 5
24     #define TLTNONE "NONE"
25     #define TLTINCL "INCLUDE"
26     #define TLT_VERT 1
27     #define TLT_H0 2
28     #define TLT_H90 3
29     /* photometric types */
30     #define PM_C 1
31     #define PM_B 2
32     /* unit types */
33     #define U_FEET 1
34     #define U_METERS 2
35     /* string lengths */
36     #define MAXLINE 132
37     #define MAXWORD 76
38     #define MAXPATH 128
39     /* file types */
40     #define T_RAD ".rad"
41     #define T_DST ".dat"
42     #define T_TLT "+.dat"
43     /* shape types */
44     #define RECT 1
45     #define DISK 2
46     #define SPHERE 3
47    
48     #define MINDIM .001 /* minimum dimension (point source) */
49    
50     #define F_M .3048 /* feet to meters */
51    
52     #define abspath(p) ((p)[0] == '/' || (p)[0] == '.')
53    
54 greg 1.2 static char default_name[] = "default";
55    
56 greg 1.1 char *libdir = NULL; /* library directory location */
57     char *prefdir = NULL; /* subdirectory */
58     char *lampdat = "lamp.tab"; /* lamp data file */
59    
60     double meters2out = 1.0; /* conversion from meters to output */
61     char *lamptype = NULL; /* selected lamp type */
62 greg 1.2 char *deflamp = NULL; /* default lamp type */
63 greg 1.1 float defcolor[3] = {1.,1.,1.}; /* default lamp color */
64 greg 1.2 float *lampcolor = defcolor; /* pointer to current lamp color */
65 greg 1.1 double multiplier = 1.0; /* multiplier for all light sources */
66     char units[64] = "meters"; /* output units */
67     double minaspect = 0.0; /* minimum allowed aspect ratio */
68     int maxemitters = 1; /* maximum emitters per hemisphere */
69     double illumrad = 0.0; /* radius for illum sphere */
70    
71     typedef struct {
72     int type; /* RECT, DISK, SPHERE */
73     double w, l, h; /* width, length, height */
74 greg 1.3 double area; /* max. projected area */
75 greg 1.1 } SHAPE; /* a source shape */
76    
77     int gargc; /* global argc (minus filenames) */
78     char **gargv; /* global argv */
79    
80     extern char *strcpy(), *strcat(), *stradd(), *tailtrunc(), *filetrunc(),
81     *filename(), *libname(), *fullname(), *malloc();
82     extern float *matchlamp();
83    
84    
85     main(argc, argv)
86     int argc;
87     char *argv[];
88     {
89     char *outfile = NULL;
90     int status;
91     char outname[MAXWORD];
92     double d1;
93     int i;
94    
95     for (i = 1; i < argc && argv[i][0] == '-'; i++)
96     switch (argv[i][1]) {
97     case 'd': /* dimensions */
98     if (argv[i][2] == '\0')
99     goto badopt;
100     if (argv[i][3] == '\0')
101     d1 = 1.0;
102     else if (argv[i][3] == '/') {
103     d1 = atof(argv[i]+4);
104     if (d1 <= FTINY)
105     goto badopt;
106     } else
107     goto badopt;
108     switch (argv[i][2]) {
109     case 'c': /* centimeters */
110     if (FEQ(d1,10.))
111     strcpy(units,"millimeters");
112     else {
113     strcpy(units,"centimeters");
114     strcat(units,argv[i]+3);
115     }
116     meters2out = 100.*d1;
117     break;
118     case 'm': /* meters */
119     if (FEQ(d1,1000.))
120     strcpy(units,"millimeters");
121     else if (FEQ(d1,100.))
122     strcpy(units,"centimeters");
123     else {
124     strcpy(units,"meters");
125     strcat(units,argv[i]+3);
126     }
127     meters2out = d1;
128     break;
129     case 'i': /* inches */
130     strcpy(units,"inches");
131     strcat(units,argv[i]+3);
132     meters2out = d1*(12./F_M);
133     break;
134     case 'f': /* feet */
135     if (FEQ(d1,12.))
136     strcpy(units,"inches");
137     else {
138     strcpy(units,"feet");
139     strcat(units,argv[i]+3);
140     }
141     meters2out = d1/F_M;
142     break;
143     default:
144     goto badopt;
145     }
146     break;
147     case 'l': /* library directory */
148     libdir = argv[++i];
149     break;
150     case 'p': /* prefix subdirectory */
151     prefdir = argv[++i];
152     break;
153     case 'f': /* lamp data file */
154     lampdat = argv[++i];
155     break;
156     case 'o': /* output file name */
157     outfile = argv[++i];
158     break;
159     case 's': /* square emitters */
160     minaspect = .6;
161     if (argv[i][2] == '/') {
162     maxemitters = atoi(argv[i]+3);
163     if (maxemitters < 1)
164     goto badopt;
165     }
166     break;
167     case 'i': /* illum */
168     illumrad = atof(argv[++i]);
169     if (illumrad < MINDIM)
170     illumrad = MINDIM;
171     break;
172 greg 1.2 case 't': /* override lamp type */
173 greg 1.1 lamptype = argv[++i];
174     break;
175 greg 1.2 case 'u': /* default lamp type */
176     deflamp = argv[++i];
177     break;
178 greg 1.1 case 'c': /* default lamp color */
179     defcolor[0] = atof(argv[++i]);
180     defcolor[1] = atof(argv[++i]);
181     defcolor[2] = atof(argv[++i]);
182     break;
183     case 'm': /* multiplier */
184     multiplier = atof(argv[++i]);
185     break;
186     default:
187     badopt:
188     fprintf(stderr, "%s: bad option: %s\n",
189     argv[0], argv[i]);
190     exit(1);
191     }
192     gargc = i;
193     gargv = argv;
194 greg 1.2 initlamps(); /* get lamp data (if needed) */
195 greg 1.1 /* convert ies file(s) */
196     if (outfile != NULL) {
197     if (i == argc)
198     exit(ies2rad(NULL, outfile) == 0 ? 0 : 1);
199     else if (i == argc-1)
200     exit(ies2rad(argv[i], outfile) == 0 ? 0 : 1);
201     else {
202     fprintf(stderr, "%s: single input file required\n",
203     argv[0]);
204     exit(1);
205     }
206     } else if (i >= argc) {
207     fprintf(stderr, "%s: missing output file specification\n",
208     argv[0]);
209     exit(1);
210     }
211     status = 0;
212     for ( ; i < argc; i++) {
213     tailtrunc(strcpy(outname,filename(argv[i])));
214     if (ies2rad(argv[i], outname) != 0)
215     status = 1;
216     }
217     exit(status);
218 greg 1.2 }
219    
220    
221     initlamps() /* set up lamps */
222     {
223     float *lcol;
224     int status;
225    
226     if (lamptype != NULL && !strcmp(lamptype, default_name) &&
227     deflamp == NULL)
228     return; /* no need for data */
229     /* else load file */
230     if ((status = loadlamps(lampdat)) < 0)
231     exit(1);
232     if (status == 0) {
233     fprintf(stderr, "%s: warning - no lamp data\n", lampdat);
234     lamptype = default_name;
235     return;
236     }
237     if (deflamp != NULL) { /* match default type */
238     if ((lcol = matchlamp(deflamp)) == NULL)
239     fprintf(stderr,
240     "%s: warning - unknown default lamp type\n",
241     deflamp);
242     else
243     copycolor(defcolor, lcol);
244     }
245     if (lamptype != NULL) { /* match selected type */
246     if (strcmp(lamptype, default_name)) {
247     if ((lcol = matchlamp(lamptype)) == NULL) {
248     fprintf(stderr,
249     "%s: warning - unknown lamp type\n",
250     lamptype);
251     lamptype = default_name;
252     } else
253     copycolor(defcolor, lcol);
254     }
255     freelamps(); /* all done with data */
256     }
257     /* else keep lamp data */
258 greg 1.1 }
259    
260    
261     char *
262     stradd(dst, src, sep) /* add a string at dst */
263     register char *dst, *src;
264     int sep;
265     {
266     if (src && *src) {
267     do
268     *dst++ = *src++;
269     while (*src);
270     if (sep && dst[-1] != sep)
271     *dst++ = sep;
272     }
273     *dst = '\0';
274     return(dst);
275     }
276    
277    
278     char *
279     fullname(path, fname, suffix) /* return full path name */
280     char *path, *fname, *suffix;
281     {
282     if (prefdir != NULL && abspath(prefdir))
283     libname(path, fname, suffix);
284     else if (abspath(fname))
285     strcpy(stradd(path, fname, 0), suffix);
286     else
287     libname(stradd(path, libdir, '/'), fname, suffix);
288    
289     return(path);
290     }
291    
292    
293     char *
294     libname(path, fname, suffix) /* return library relative name */
295     char *path, *fname, *suffix;
296     {
297     if (abspath(fname))
298     strcpy(stradd(path, fname, 0), suffix);
299     else
300     strcpy(stradd(stradd(path, prefdir, '/'), fname, 0), suffix);
301    
302     return(path);
303     }
304    
305    
306     char *
307     filename(path) /* get final component of pathname */
308     register char *path;
309     {
310     register char *cp;
311    
312     for (cp = path; *path; path++)
313     if (*path == '/')
314     cp = path+1;
315     return(cp);
316     }
317    
318    
319     char *
320     filetrunc(path) /* truncate filename at end of path */
321     char *path;
322     {
323     register char *p1, *p2;
324    
325     for (p1 = p2 = path; *p2; p2++)
326     if (*p2 == '/')
327     p1 = p2;
328     *p1 = '\0';
329     return(path);
330     }
331    
332    
333     char *
334     tailtrunc(name) /* truncate tail of filename */
335     char *name;
336     {
337     register char *p1, *p2;
338    
339     for (p1 = filename(name); *p1 == '.'; p1++)
340     ;
341     p2 = NULL;
342     for ( ; *p1; p1++)
343     if (*p1 == '.')
344     p2 = p1;
345     if (p2 != NULL)
346     *p2 = '\0';
347     return(name);
348     }
349    
350    
351     blanktrunc(s) /* truncate spaces at end of line */
352     char *s;
353     {
354     register char *cp;
355    
356     for (cp = s; *cp; cp++)
357     ;
358     while (cp-- > s && isspace(*cp))
359     ;
360     *++cp = '\0';
361     }
362    
363    
364     putheader(out) /* print header */
365     FILE *out;
366     {
367     register int i;
368    
369     putc('#', out);
370     for (i = 0; i < gargc; i++) {
371     putc(' ', out);
372     fputs(gargv[i], out);
373     }
374     fputs("\n# Dimensions in ", out);
375     fputs(units, out);
376     putc('\n', out);
377     }
378    
379    
380     ies2rad(inpname, outname) /* convert IES file */
381     char *inpname, *outname;
382     {
383     char buf[MAXLINE], tltid[MAXWORD];
384     FILE *inpfp, *outfp;
385    
386     if (inpname == NULL) {
387     inpname = "<stdin>";
388     inpfp = stdin;
389     } else if ((inpfp = fopen(inpname, "r")) == NULL) {
390     perror(inpname);
391     return(-1);
392     }
393     if ((outfp = fopen(fullname(buf,outname,T_RAD), "w")) == NULL) {
394     perror(buf);
395     fclose(inpfp);
396     return(-1);
397     }
398     putheader(outfp);
399     if (lamptype == NULL)
400     lampcolor = NULL;
401     while (fgets(buf,sizeof(buf),inpfp) != NULL
402     && strncmp(buf,TLTSTR,TLTSTRLEN)) {
403     blanktrunc(buf);
404     if (!buf[0])
405     continue;
406     fputs("#<", outfp);
407     fputs(buf, outfp);
408     putc('\n', outfp);
409     if (lampcolor == NULL)
410     lampcolor = matchlamp(buf);
411     }
412     if (lampcolor == NULL) {
413     fprintf(stderr, "%s: warning - no lamp type\n", inpname);
414     lampcolor = defcolor;
415     }
416     if (feof(inpfp)) {
417     fprintf(stderr, "%s: not in IES format\n", inpname);
418     goto readerr;
419     }
420     sscanf(buf+TLTSTRLEN, "%s", tltid);
421     if (inpfp == stdin)
422     buf[0] = '\0';
423     else
424     filetrunc(strcpy(buf, inpname));
425     if (dotilt(inpfp, outfp, buf, tltid, outname, tltid) != 0) {
426     fprintf(stderr, "%s: bad tilt data\n", inpname);
427     goto readerr;
428     }
429     if (dosource(inpfp, outfp, tltid, outname) != 0) {
430     fprintf(stderr, "%s: bad luminaire data\n", inpname);
431     goto readerr;
432     }
433     fclose(outfp);
434     fclose(inpfp);
435     return(0);
436     readerr:
437     fclose(outfp);
438     fclose(inpfp);
439     unlink(fullname(buf,outname,T_RAD));
440     return(-1);
441     }
442    
443    
444     dotilt(in, out, dir, tltspec, dfltname, tltid) /* convert tilt data */
445     FILE *in, *out;
446     char *dir, *tltspec, *dfltname, *tltid;
447     {
448     int nangles, tlt_type;
449     double minmax[2];
450     char buf[MAXPATH], tltname[MAXWORD];
451     FILE *datin, *datout;
452    
453     if (!strcmp(tltspec, TLTNONE)) {
454     datin = NULL;
455     strcpy(tltid, "void");
456     } else if (!strcmp(tltspec, TLTINCL)) {
457     datin = in;
458     strcpy(tltname, dfltname);
459     } else {
460     if (tltspec[0] == '/')
461     strcpy(buf, tltspec);
462     else
463     strcpy(stradd(buf, dir, '/'), tltspec);
464     if ((datin = fopen(buf, "r")) == NULL) {
465     perror(buf);
466     return(-1);
467     }
468     tailtrunc(strcpy(tltname,filename(tltspec)));
469     }
470     if (datin != NULL) {
471     if ((datout = fopen(fullname(buf,tltname,T_TLT),"w")) == NULL) {
472     perror(buf);
473     if (datin != in)
474     fclose(datin);
475     return(-1);
476     }
477     if (fscanf(datin, "%d %d", &tlt_type, &nangles) != 2
478     || cvdata(datin,datout,1,&nangles,1.,minmax) != 0) {
479     fprintf(stderr, "%s: data format error\n", tltspec);
480     fclose(datout);
481     if (datin != in)
482     fclose(datin);
483     unlink(fullname(buf,tltname,T_TLT));
484     return(-1);
485     }
486     fclose(datout);
487     if (datin != in)
488     fclose(datin);
489     strcat(strcpy(tltid, filename(tltname)), "_tilt");
490     fprintf(out, "\nvoid brightdata %s\n", tltid);
491     libname(buf,tltname,T_TLT);
492     switch (tlt_type) {
493     case TLT_VERT: /* vertical */
494     fprintf(out, "4 noop %s tilt.cal %s\n", buf,
495     minmax[1]>90.+FTINY ? "tilt_ang" : "tilt_ang2");
496     break;
497     case TLT_H0: /* horiz. in 0 deg. plane */
498     fprintf(out, "6 noop %s tilt.cal %s -rz 90\n", buf,
499     minmax[1]>90.+FTINY ? "tilt_xang" : "tilt_xang2");
500     break;
501     case TLT_H90:
502     fprintf(out, "4 noop %s tilt.cal %s\n", buf,
503     minmax[1]>90.+FTINY ? "tilt_xang" : "tilt_xang2");
504     break;
505     default:
506     fprintf(stderr,
507     "%s: illegal lamp to luminaire geometry (%d)\n",
508     tltspec, tlt_type);
509     return(-1);
510     }
511     fprintf(out, "0\n0\n");
512     }
513     return(0);
514     }
515    
516    
517     dosource(in, out, mod, name) /* create source and distribution */
518     FILE *in, *out;
519     char *mod, *name;
520     {
521     SHAPE srcshape;
522     char buf[MAXPATH], id[MAXWORD];
523     FILE *datout;
524     double mult, bfactor, pfactor, width, length, height, wattage;
525     double bounds[2][2];
526     int nangles[2], pmtype, unitype;
527     double d1;
528    
529     if (fscanf(in, "%*d %*f %lf %d %d %d %d %lf %lf %lf %lf %lf %lf",
530     &mult, &nangles[0], &nangles[1], &pmtype, &unitype,
531     &width, &length, &height, &bfactor, &pfactor,
532     &wattage) != 11) {
533     fprintf(stderr, "dosource: bad lamp specification\n");
534     return(-1);
535     }
536     if (nangles[0] < 2 || nangles[1] < 1) {
537     fprintf(stderr, "dosource: too few measured angles\n");
538     return(-1);
539     }
540     if (unitype == U_FEET) {
541     width *= F_M;
542     length *= F_M;
543     height *= F_M;
544     }
545     if (makeshape(&srcshape, width, length, height) != 0) {
546     fprintf(stderr, "dosource: illegal source dimensions");
547     return(-1);
548     }
549     if ((datout = fopen(fullname(buf,name,T_DST), "w")) == NULL) {
550     perror(buf);
551     return(-1);
552     }
553 greg 1.5 if (cvdata(in, datout, 2, nangles, 1./WHTEFFICACY, bounds) != 0) {
554 greg 1.1 fprintf(stderr, "dosource: bad distribution data\n");
555     fclose(datout);
556     unlink(fullname(buf,name,T_DST));
557     return(-1);
558     }
559     fclose(datout);
560     fprintf(out, "# %g watt luminaire, lamp*ballast factor = %g\n",
561     wattage, bfactor*pfactor);
562     strcat(strcpy(id, filename(name)), "_dist");
563     fprintf(out, "\n%s brightdata %s\n", mod, id);
564     if (nangles[1] < 2)
565     fprintf(out, "4 ");
566     else if (pmtype == PM_B)
567     fprintf(out, "5 ");
568     else if (FEQ(bounds[1][0],90.) && FEQ(bounds[1][1],270.))
569     fprintf(out, "8 ");
570     else
571     fprintf(out, "6 ");
572     fprintf(out, "%s %s source.cal ",
573     srcshape.type==SPHERE ? "corr" : "flatcorr",
574     libname(buf,name,T_DST));
575     if (pmtype == PM_B) {
576     if (FEQ(bounds[1][0],0.))
577     fprintf(out, "srcB_horiz2 ");
578     else
579     fprintf(out, "srcB_horiz ");
580     fprintf(out, "srcB_vert ");
581     } else {
582     if (nangles[1] >= 2) {
583     d1 = bounds[1][1] - bounds[1][0];
584     if (d1 <= 90.+FTINY)
585     fprintf(out, "src_phi4 ");
586     else if (d1 <= 180.+FTINY)
587     fprintf(out, "src_phi2 ");
588     else
589     fprintf(out, "src_phi ");
590     fprintf(out, "src_theta -my ");
591     if (FEQ(bounds[1][0],90.) && FEQ(bounds[1][1],270.))
592     fprintf(out, "-rz -90 ");
593     } else
594     fprintf(out, "src_theta ");
595     }
596     fprintf(out, "\n0\n1 %g\n", multiplier*mult*bfactor*pfactor);
597     if (putsource(&srcshape, out, id, filename(name),
598     bounds[0][0]<90., bounds[0][1]>90.) != 0)
599     return(-1);
600     return(0);
601     }
602    
603    
604     putsource(shp, fp, mod, name, dolower, doupper) /* put out source */
605     SHAPE *shp;
606     FILE *fp;
607     char *mod, *name;
608     int dolower, doupper;
609     {
610     char buf[MAXWORD];
611    
612     fprintf(fp, "\n%s %s %s_light\n", mod,
613     illumrad>=MINDIM/2. ? "illum" : "light",
614     name);
615     fprintf(fp, "0\n0\n3 %g %g %g\n",
616     lampcolor[0]/shp->area,
617     lampcolor[1]/shp->area,
618     lampcolor[2]/shp->area);
619     if (doupper && dolower && shp->type != SPHERE && shp->h > MINDIM) {
620     fprintf(fp, "\n%s glow %s_glow\n", mod, name);
621     fprintf(fp, "0\n0\n4 %g %g %g 0\n",
622     lampcolor[0]/shp->area,
623     lampcolor[1]/shp->area,
624     lampcolor[2]/shp->area);
625     }
626     switch (shp->type) {
627     case RECT:
628     strcat(strcpy(buf, name), "_light");
629     if (dolower)
630     putrectsrc(shp, fp, buf, name, 0);
631     if (doupper)
632     putrectsrc(shp, fp, buf, name, 1);
633     if (doupper && dolower && shp->h > MINDIM) {
634     strcat(strcpy(buf, name), "_glow");
635     putsides(shp, fp, buf, name);
636     }
637     break;
638     case DISK:
639     strcat(strcpy(buf, name), "_light");
640     if (dolower)
641     putdisksrc(shp, fp, buf, name, 0);
642     if (doupper)
643     putdisksrc(shp, fp, buf, name, 1);
644     if (doupper && dolower && shp->h > MINDIM) {
645     strcat(strcpy(buf, name), "_glow");
646     putcyl(shp, fp, buf, name);
647     }
648     break;
649     case SPHERE:
650     strcat(strcpy(buf, name), "_light");
651     putspheresrc(shp, fp, buf, name);
652     break;
653     }
654     return(0);
655     }
656    
657    
658     makeshape(shp, width, length, height) /* make source shape */
659     register SHAPE *shp;
660     double width, length, height;
661     {
662     if (illumrad >= MINDIM/2.) {
663     shp->type = SPHERE;
664     shp->w = shp->l = shp->h = 2.*illumrad;
665     } else if (width < MINDIM) {
666     width = -width;
667     if (width < MINDIM) {
668     shp->type = SPHERE;
669     shp->w = shp->l = shp->h = MINDIM;
670     } else if (height < .5*width) {
671     shp->type = DISK;
672     shp->w = shp->l = width;
673     if (height >= MINDIM)
674     shp->h = height;
675     else
676     shp->h = .5*MINDIM;
677     } else {
678     shp->type = SPHERE;
679     shp->w = shp->l = shp->h = width;
680     }
681     } else {
682     shp->type = RECT;
683     shp->w = width;
684     if (length >= MINDIM)
685     shp->l = length;
686     else
687     shp->l = MINDIM;
688     if (height >= MINDIM)
689     shp->h = height;
690     else
691     shp->h = .5*MINDIM;
692     }
693     switch (shp->type) {
694     case RECT:
695     shp->area = shp->w * shp->l;
696     break;
697     case DISK:
698 greg 1.3 case SPHERE:
699 greg 1.1 shp->area = PI/4. * shp->w * shp->w;
700     break;
701     }
702     return(0);
703     }
704    
705    
706     putrectsrc(shp, fp, mod, name, up) /* rectangular source */
707     SHAPE *shp;
708     FILE *fp;
709     char *mod, *name;
710     int up;
711     {
712     if (up)
713     putrect(shp, fp, mod, name, ".u", 4, 5, 7, 6);
714     else
715     putrect(shp, fp, mod, name, ".d", 0, 2, 3, 1);
716     }
717    
718    
719     putsides(shp, fp, mod, name) /* put out sides of box */
720     register SHAPE *shp;
721     FILE *fp;
722     char *mod, *name;
723     {
724     putrect(shp, fp, mod, name, ".1", 0, 1, 5, 4);
725     putrect(shp, fp, mod, name, ".2", 1, 3, 7, 5);
726     putrect(shp, fp, mod, name, ".3", 3, 2, 6, 7);
727     putrect(shp, fp, mod, name, ".4", 2, 0, 4, 6);
728     }
729    
730    
731     putrect(shp, fp, mod, name, suffix, a, b, c, d) /* put out a rectangle */
732     SHAPE *shp;
733     FILE *fp;
734     char *mod, *name, *suffix;
735     int a, b, c, d;
736     {
737     fprintf(fp, "\n%s polygon %s%s\n0\n0\n12\n", mod, name, suffix);
738     putpoint(shp, fp, a);
739     putpoint(shp, fp, b);
740     putpoint(shp, fp, c);
741     putpoint(shp, fp, d);
742     }
743    
744    
745     putpoint(shp, fp, p) /* put out a point */
746     register SHAPE *shp;
747     FILE *fp;
748     int p;
749     {
750     static double mult[2] = {-.5, .5};
751    
752     fprintf(fp, "\t%g\t%g\t%g\n",
753     mult[p&1]*shp->l*meters2out,
754     mult[p>>1&1]*shp->w*meters2out,
755     mult[p>>2]*shp->h*meters2out);
756     }
757    
758    
759     putdisksrc(shp, fp, mod, name, up) /* put out a disk source */
760     register SHAPE *shp;
761     FILE *fp;
762     char *mod, *name;
763     int up;
764     {
765     if (up) {
766     fprintf(fp, "\n%s ring %s.u\n", mod, name);
767     fprintf(fp, "0\n0\n8\n");
768     fprintf(fp, "\t0 0 %g\n", .5*shp->h*meters2out);
769     fprintf(fp, "\t0 0 1\n");
770     fprintf(fp, "\t0 %g\n", .5*shp->w*meters2out);
771     } else {
772     fprintf(fp, "\n%s ring %s.d\n", mod, name);
773     fprintf(fp, "0\n0\n8\n");
774     fprintf(fp, "\t0 0 %g\n", -.5*shp->h*meters2out);
775     fprintf(fp, "\t0 0 -1\n");
776     fprintf(fp, "\t0 %g\n", .5*shp->w*meters2out);
777     }
778     }
779    
780    
781     putcyl(shp, fp, mod, name) /* put out a cylinder */
782     register SHAPE *shp;
783     FILE *fp;
784     char *mod, *name;
785     {
786     fprintf(fp, "\n%s cylinder %s.c\n", mod, name);
787     fprintf(fp, "0\n0\n7\n");
788     fprintf(fp, "\t0 0 %g\n", .5*shp->h*meters2out);
789     fprintf(fp, "\t0 0 %g\n", -.5*shp->h*meters2out);
790     fprintf(fp, "\t%g\n", .5*shp->w*meters2out);
791     }
792    
793    
794     putspheresrc(shp, fp, mod, name) /* put out a sphere source */
795     SHAPE *shp;
796     FILE *fp;
797     char *mod, *name;
798     {
799     fprintf(fp, "\n%s sphere %s.s\n", mod, name);
800     fprintf(fp, "0\n0\n4 0 0 0 %g\n", .5*shp->w*meters2out);
801     }
802    
803    
804     cvdata(in, out, ndim, npts, mult, lim) /* convert data */
805     FILE *in, *out;
806     int ndim, npts[];
807     double mult, lim[][2];
808     {
809 greg 2.3 double *pt[4];
810 greg 1.1 register int i, j;
811     double val;
812     int total;
813    
814     total = 1; j = 0;
815     for (i = 0; i < ndim; i++)
816     if (npts[i] > 1) {
817     total *= npts[i];
818     j++;
819     }
820     fprintf(out, "%d\n", j);
821     /* get coordinates */
822     for (i = 0; i < ndim; i++) {
823     pt[i] = (double *)malloc(npts[i]*sizeof(double));
824     for (j = 0; j < npts[i]; j++)
825     fscanf(in, "%lf", &pt[i][j]);
826     if (lim != NULL) {
827     lim[i][0] = pt[i][0];
828     lim[i][1] = pt[i][npts[i]-1];
829     }
830     }
831     /* write out in reverse */
832     for (i = ndim-1; i >= 0; i--) {
833     if (npts[i] > 1) {
834     for (j = 1; j < npts[i]-1; j++)
835     if (!FEQ(pt[i][j]-pt[i][j-1],
836     pt[i][j+1]-pt[i][j]))
837     break;
838     if (j == npts[i]-1)
839     fprintf(out, "%g %g %d\n", pt[i][0], pt[i][j],
840     npts[i]);
841     else {
842     fprintf(out, "0 0 %d", npts[i]);
843     for (j = 0; j < npts[i]; j++) {
844     if (j%4 == 0)
845     putc('\n', out);
846     fprintf(out, "\t%g", pt[i][j]);
847     }
848     putc('\n', out);
849     }
850     }
851     free((char *)pt[i]);
852     }
853     for (i = 0; i < total; i++) {
854     if (i%4 == 0)
855     putc('\n', out);
856     if (fscanf(in, "%lf", &val) != 1)
857     return(-1);
858     fprintf(out, "\t%g", val*mult);
859     }
860     putc('\n', out);
861     return(0);
862     }