ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/ies2rad.c
(Generate patch)

Comparing ray/src/cv/ies2rad.c (file contents):
Revision 2.8 by greg, Fri Jun 4 14:40:25 1993 UTC vs.
Revision 2.13 by greg, Wed Jun 12 19:13:42 1996 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1992 Regents of the University of California */
1 > /* Copyright (c) 1996 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 20 | Line 20 | static char SCCSid[] = "$SunId$ LBL";
20                                          /* floating comparisons */
21   #define FTINY           1e-6
22   #define FEQ(a,b)        ((a)<=(b)+FTINY&&(a)>=(b)-FTINY)
23 +                                        /* keywords */
24 + #define MAGICID         "IESNA"
25 + #define LMAGICID        5
26 + #define FIRSTREV        86
27 + #define LASTREV         95
28 +
29 + #define D86             0               /* keywords defined in LM-63-1986 */
30 +
31 + #define K_TST           0
32 + #define K_MAN           1
33 + #define K_LMC           2
34 + #define K_LMN           3
35 + #define K_LPC           4
36 + #define K_LMP           5
37 + #define K_BAL           6
38 + #define K_MTC           7
39 + #define K_OTH           8
40 + #define K_SCH           9
41 + #define K_MOR           10
42 + #define K_BLK           11
43 + #define K_EBK           12
44 +
45 + #define D91             ((1L<<13)-1)    /* keywords defined in LM-63-1991 */
46 +
47 + #define K_LMG           13
48 +
49 + #define D95             ((1L<<14)-1)    /* keywords defined in LM-63-1995 */
50 +
51 + char    k_kwd[][20] = {"TEST", "MANUFAC", "LUMCAT", "LUMINAIRE", "LAMPCAT",
52 +                        "LAMP", "BALLAST", "MAINTCAT", "OTHER", "SEARCH",
53 +                        "MORE", "BLOCK", "ENDBLOCK", "LUMINOUSGEOMETRY"};
54 +
55 + long k_defined[] = {D86, D86, D86, D86, D86, D91, D91, D91, D91, D95};
56 +
57 + int     filerev = FIRSTREV;
58 +
59 + #define keymatch(i,s)   (k_defined[filerev-FIRSTREV]&1L<<(i) &&\
60 +                                k_match(k_kwd[i],s))
61 +
62 + #define checklamp(s)    (!(k_defined[filerev-FIRSTREV]&(1<<K_LMP|1<<K_LPC)) ||\
63 +                                keymatch(K_LMP,s) || keymatch(K_LPC,s))
64 +
65                                          /* tilt specs */
66   #define TLTSTR          "TILT="
67   #define TLTSTRLEN       5
# Line 40 | Line 82 | static char SCCSid[] = "$SunId$ LBL";
82                                          /* file types */
83   #define T_RAD           ".rad"
84   #define T_DST           ".dat"
85 < #define T_TLT           "+.dat"
85 > #define T_TLT           "%.dat"
86 > #define T_OCT           ".oct"
87                                          /* shape types */
88   #define RECT            1
89   #define DISK            2
# Line 65 | Line 108 | float  defcolor[3] = {1.,1.,1.};       /* default lamp color
108   float   *lampcolor = defcolor;          /* pointer to current lamp color */
109   double  multiplier = 1.0;               /* multiplier for all light sources */
110   char    units[64] = "meters";           /* output units */
111 + int     out2stdout = 0;                 /* put out to stdout r.t. file */
112 + int     instantiate = 0;                /* instantiate geometry */
113   double  illumrad = 0.0;                 /* radius for illum sphere */
114  
115   typedef struct {
116 +        int     isillum;                        /* do as illum */
117          int     type;                           /* RECT, DISK, SPHERE */
118 +        double  mult;                           /* candela multiplier */
119          double  w, l, h;                        /* width, length, height */
120          double  area;                           /* max. projected area */
121 < } SHAPE;                                /* a source shape */
121 > } SRCINFO;                              /* a source shape (units=meters) */
122  
123   int     gargc;                          /* global argc (minus filenames) */
124   char    **gargv;                        /* global argv */
# Line 157 | Line 204 | char   *argv[];
204                  case 'f':               /* lamp data file */
205                          lampdat = argv[++i];
206                          break;
207 <                case 'o':               /* output file name */
207 >                case 'o':               /* output file root name */
208                          outfile = argv[++i];
209                          break;
210 +                case 's':               /* output to stdout */
211 +                        out2stdout = !out2stdout;
212 +                        break;
213                  case 'i':               /* illum */
214                          illumrad = atof(argv[++i]);
165                        if (illumrad < MINDIM)
166                                illumrad = MINDIM;
215                          break;
216 +                case 'g':               /* instatiate geometry? */
217 +                        instantiate = !instantiate;
218 +                        break;
219                  case 't':               /* override lamp type */
220                          lamptype = argv[++i];
221                          break;
# Line 194 | Line 245 | char   *argv[];
245                          exit(ies2rad(NULL, outfile) == 0 ? 0 : 1);
246                  else if (i == argc-1)
247                          exit(ies2rad(argv[i], outfile) == 0 ? 0 : 1);
248 <                else {
249 <                        fprintf(stderr, "%s: single input file required\n",
199 <                                        argv[0]);
200 <                        exit(1);
201 <                }
248 >                else
249 >                        goto needsingle;
250          } else if (i >= argc) {
251                  fprintf(stderr, "%s: missing output file specification\n",
252                                  argv[0]);
253                  exit(1);
254          }
255 +        if (out2stdout && i != argc-1)
256 +                goto needsingle;
257          status = 0;
258          for ( ; i < argc; i++) {
259                  tailtrunc(strcpy(outname,filename(argv[i])));
# Line 211 | Line 261 | char   *argv[];
261                          status = 1;
262          }
263          exit(status);
264 + needsingle:
265 +        fprintf(stderr, "%s: single input file required\n", argv[0]);
266 +        exit(1);
267   }
268  
269  
# Line 321 | Line 374 | char   *path;
374          for (p1 = p2 = path; *p2; p2++)
375                  if (ISDIRSEP(*p2))
376                          p1 = p2;
377 +        if (p1 == path && ISDIRSEP(*p1))
378 +                p1++;
379          *p1 = '\0';
380          return(path);
381   }
# Line 357 | Line 412 | char   *s;
412   }
413  
414  
415 + k_match(kwd, hdl)                       /* header line matches keyword? */
416 + register char   *kwd, *hdl;
417 + {
418 +        if (!*hdl++ == '[')
419 +                return(0);
420 +        while (islower(*hdl) ? toupper(*hdl) == *kwd++ : *hdl == *kwd++)
421 +                if (!*hdl++)
422 +                        return(0);
423 +        return(!*kwd & *hdl == ']');
424 + }
425 +
426 +
427 + char *
428 + keyargs(hdl)                            /* return keyword arguments */
429 + register char   *hdl;
430 + {
431 +        while (*hdl && *hdl++ != ']')
432 +                ;
433 +        while (isspace(*hdl))
434 +                hdl++;
435 +        return(hdl);
436 + }
437 +
438 +
439   putheader(out)                          /* print header */
440   FILE    *out;
441   {
# Line 376 | Line 455 | FILE   *out;
455   ies2rad(inpname, outname)               /* convert IES file */
456   char    *inpname, *outname;
457   {
458 +        SRCINFO srcinfo;
459          char    buf[MAXLINE], tltid[MAXWORD];
460 +        char    geomfile[128];
461          FILE    *inpfp, *outfp;
462 +        int     lineno = 0;
463  
464 +        geomfile[0] = '\0';
465 +        srcinfo.isillum = 0;
466          if (inpname == NULL) {
467                  inpname = "<stdin>";
468                  inpfp = stdin;
# Line 386 | Line 470 | char   *inpname, *outname;
470                  perror(inpname);
471                  return(-1);
472          }
473 <        if ((outfp = fopen(fullname(buf,outname,T_RAD), "w")) == NULL) {
473 >        if (out2stdout)
474 >                outfp = stdout;
475 >        else if ((outfp = fopen(fullname(buf,outname,T_RAD), "w")) == NULL) {
476                  perror(buf);
477                  fclose(inpfp);
478                  return(-1);
# Line 399 | Line 485 | char   *inpname, *outname;
485                  blanktrunc(buf);
486                  if (!buf[0])
487                          continue;
488 +                if (!lineno++ && !strncmp(buf, MAGICID, LMAGICID)) {
489 +                        filerev = atoi(buf+LMAGICID);
490 +                        if (filerev < FIRSTREV)
491 +                                filerev = FIRSTREV;
492 +                        else if (filerev > LASTREV)
493 +                                filerev = LASTREV;
494 +                }
495                  fputs("#<", outfp);
496                  fputs(buf, outfp);
497                  putc('\n', outfp);
498 <                if (lampcolor == NULL)
499 <                        lampcolor = matchlamp(buf);
498 >                if (lampcolor == NULL && checklamp(buf))
499 >                        lampcolor = matchlamp( buf[0] == '[' ?
500 >                                                keyargs(buf) : buf );
501 >                if (keymatch(K_LMG, buf)) {             /* geometry file */
502 >                        strcpy(geomfile, inpname);
503 >                        strcpy(filename(geomfile), keyargs(buf));
504 >                        srcinfo.isillum = 1;
505 >                }
506          }
507          if (lampcolor == NULL) {
508                  fprintf(stderr, "%s: warning - no lamp type\n", inpname);
509 +                fputs("# Unknown lamp type (used default)\n", outfp);
510                  lampcolor = defcolor;
511 <        }
511 >        } else if (lamptype == NULL)
512 >                fprintf(outfp,"# CIE(x,y) = (%f,%f)\n# Depreciation = %.1f%%\n",
513 >                                lampcolor[3], lampcolor[4], 100.*lampcolor[5]);
514          if (feof(inpfp)) {
515                  fprintf(stderr, "%s: not in IES format\n", inpname);
516                  goto readerr;
# Line 422 | Line 524 | char   *inpname, *outname;
524                  fprintf(stderr, "%s: bad tilt data\n", inpname);
525                  goto readerr;
526          }
527 <        if (dosource(inpfp, outfp, tltid, outname) != 0) {
527 >        if (dosource(&srcinfo, inpfp, outfp, tltid, outname) != 0) {
528                  fprintf(stderr, "%s: bad luminaire data\n", inpname);
529                  goto readerr;
530          }
429        fclose(outfp);
531          fclose(inpfp);
532 +                                        /* cvgeometry closes outfp */
533 +        if (cvgeometry(geomfile, &srcinfo, outname, outfp) != 0) {
534 +                fprintf(stderr, "%s: bad geometry file\n", geomfile);
535 +                return(-1);
536 +        }
537          return(0);
538   readerr:
433        fclose(outfp);
539          fclose(inpfp);
540 +        fclose(outfp);
541          unlink(fullname(buf,outname,T_RAD));
542          return(-1);
543   }
# Line 510 | Line 616 | char   *dir, *tltspec, *dfltname, *tltid;
616   }
617  
618  
619 < dosource(in, out, mod, name)            /* create source and distribution */
619 > dosource(sinf, in, out, mod, name)      /* create source and distribution */
620 > SRCINFO *sinf;
621   FILE    *in, *out;
622   char    *mod, *name;
623   {
517        SHAPE   srcshape;
624          char    buf[MAXPATH], id[MAXWORD];
625          FILE    *datout;
626          double  mult, bfactor, pfactor, width, length, height, wattage;
# Line 531 | Line 637 | char   *mod, *name;
637                  fprintf(stderr, "dosource: bad lamp specification\n");
638                  return(-1);
639          }
640 +        sinf->mult = multiplier*mult*bfactor*pfactor;
641          if (nangles[0] < 2 || nangles[1] < 1) {
642                  fprintf(stderr, "dosource: too few measured angles\n");
643                  return(-1);
# Line 540 | Line 647 | char   *mod, *name;
647                  length *= F_M;
648                  height *= F_M;
649          }
650 <        if (makeshape(&srcshape, width, length, height) != 0) {
650 >        if (makeshape(sinf, width, length, height) != 0) {
651                  fprintf(stderr, "dosource: illegal source dimensions");
652                  return(-1);
653          }
# Line 568 | Line 675 | char   *mod, *name;
675          else
676                  fprintf(out, "5 ");
677          fprintf(out, "%s %s source.cal ",
678 <                        srcshape.type==SPHERE ? "corr" : "flatcorr",
678 >                        sinf->type==SPHERE ? "corr" : "flatcorr",
679                          libname(buf,name,T_DST));
680          if (pmtype == PM_B) {
681                  if (FEQ(bounds[1][0],0.))
# Line 591 | Line 698 | char   *mod, *name;
698                  } else
699                          fprintf(out, "src_theta ");
700          }
701 <        fprintf(out, "\n0\n1 %g\n", multiplier*mult*bfactor*pfactor);
702 <        if (putsource(&srcshape, out, id, filename(name),
701 >        fprintf(out, "\n0\n1 %g\n", sinf->mult);
702 >        if (putsource(sinf, out, id, filename(name),
703                          bounds[0][0]<90., bounds[0][1]>90.) != 0)
704                  return(-1);
705          return(0);
# Line 600 | Line 707 | char   *mod, *name;
707  
708  
709   putsource(shp, fp, mod, name, dolower, doupper)         /* put out source */
710 < SHAPE   *shp;
710 > SRCINFO *shp;
711   FILE    *fp;
712   char    *mod, *name;
713   int     dolower, doupper;
# Line 608 | Line 715 | int    dolower, doupper;
715          char    buf[MAXWORD];
716          
717          fprintf(fp, "\n%s %s %s_light\n", mod,
718 <                        illumrad>=MINDIM/2. ? "illum" : "light",
718 >                        shp->isillum ? "illum" : "light",
719                          name);
720          fprintf(fp, "0\n0\n3 %g %g %g\n",
721                          lampcolor[0]/shp->area,
722                          lampcolor[1]/shp->area,
723                          lampcolor[2]/shp->area);
724 <        if (doupper && dolower && shp->type != SPHERE && shp->h > MINDIM) {
725 <                fprintf(fp, "\n%s glow %s_glow\n", mod, name);
726 <                fprintf(fp, "0\n0\n4 %g %g %g -1\n",
727 <                                lampcolor[0]/shp->area,
728 <                                lampcolor[1]/shp->area,
729 <                                lampcolor[2]/shp->area);
730 <        }
724 >        if (doupper && dolower && shp->type != SPHERE && shp->h > MINDIM)
725 >                if (shp->isillum) {
726 >                        fprintf(fp, "\nvoid illum %s_glow\n", name);
727 >                        fprintf(fp, "0\n0\n3 0 0 0\n");
728 >                } else {
729 >                        fprintf(fp, "\n%s glow %s_glow\n", mod, name);
730 >                        fprintf(fp, "0\n0\n4 %g %g %g -1\n",
731 >                                        lampcolor[0]/shp->area,
732 >                                        lampcolor[1]/shp->area,
733 >                                        lampcolor[2]/shp->area);
734 >                }
735          switch (shp->type) {
736          case RECT:
737                  strcat(strcpy(buf, name), "_light");
# Line 654 | Line 765 | int    dolower, doupper;
765  
766  
767   makeshape(shp, width, length, height)           /* make source shape */
768 < register SHAPE  *shp;
768 > register SRCINFO        *shp;
769   double  width, length, height;
770   {
771 <        if (illumrad >= MINDIM/2.) {
771 >        if (illumrad/meters2out >= MINDIM/2.) {
772 >                shp->isillum = 1;
773                  shp->type = SPHERE;
774 <                shp->w = shp->l = shp->h = 2.*illumrad;
774 >                shp->w = shp->l = shp->h = 2.*illumrad / meters2out;
775          } else if (width < MINDIM) {
776                  width = -width;
777                  if (width < MINDIM) {
# Line 702 | Line 814 | double width, length, height;
814  
815  
816   putrectsrc(shp, fp, mod, name, up)              /* rectangular source */
817 < SHAPE   *shp;
817 > SRCINFO *shp;
818   FILE    *fp;
819   char    *mod, *name;
820   int     up;
# Line 715 | Line 827 | int    up;
827  
828  
829   putsides(shp, fp, mod, name)                    /* put out sides of box */
830 < register SHAPE  *shp;
830 > register SRCINFO        *shp;
831   FILE    *fp;
832   char    *mod, *name;
833   {
# Line 727 | Line 839 | char   *mod, *name;
839          
840  
841   putrect(shp, fp, mod, name, suffix, a, b, c, d) /* put out a rectangle */
842 < SHAPE   *shp;
842 > SRCINFO *shp;
843   FILE    *fp;
844   char    *mod, *name, *suffix;
845   int     a, b, c, d;
# Line 741 | Line 853 | int    a, b, c, d;
853  
854  
855   putpoint(shp, fp, p)                            /* put out a point */
856 < register SHAPE  *shp;
856 > register SRCINFO        *shp;
857   FILE    *fp;
858   int     p;
859   {
# Line 755 | Line 867 | int    p;
867  
868  
869   putdisksrc(shp, fp, mod, name, up)              /* put out a disk source */
870 < register SHAPE  *shp;
870 > register SRCINFO        *shp;
871   FILE    *fp;
872   char    *mod, *name;
873   int     up;
# Line 777 | Line 889 | int    up;
889  
890  
891   putcyl(shp, fp, mod, name)                      /* put out a cylinder */
892 < register SHAPE  *shp;
892 > register SRCINFO        *shp;
893   FILE    *fp;
894   char    *mod, *name;
895   {
# Line 790 | Line 902 | char   *mod, *name;
902  
903  
904   putspheresrc(shp, fp, mod, name)                /* put out a sphere source */
905 < SHAPE   *shp;
905 > SRCINFO *shp;
906   FILE    *fp;
907   char    *mod, *name;
908   {
# Line 905 | Line 1017 | char   *word;
1017                  return(0);
1018          *rp = atof(word);
1019          return(1);
1020 + }
1021 +
1022 +
1023 + cvgeometry(inpname, sinf, outname, outfp)
1024 + char    *inpname;
1025 + register SRCINFO        *sinf;
1026 + char    *outname;
1027 + FILE    *outfp;                 /* close output file upon return */
1028 + {
1029 +        char    buf[256];
1030 +        register char   *cp;
1031 +
1032 +        if (inpname == NULL || !inpname[0]) {   /* no geometry file */
1033 +                fclose(outfp);
1034 +                return(0);
1035 +        }
1036 +        putc('\n', outfp);
1037 +        strcpy(buf, "mgf2rad ");                /* build mgf2rad command */
1038 +        cp = buf+8;
1039 +        if (!FEQ(sinf->mult, 1.0)) {
1040 +                sprintf(cp, "-m %f ", sinf->mult);
1041 +                cp += strlen(cp);
1042 +        }
1043 +        sprintf(cp, "-g %f %s ",
1044 +                sqrt(sinf->w*sinf->w + sinf->h*sinf->h + sinf->l*sinf->l),
1045 +                        inpname);
1046 +        cp += strlen(cp);
1047 +        if (instantiate) {              /* instantiate octree */
1048 +                strcpy(cp, "| oconv - > ");
1049 +                cp += 12;
1050 +                fullname(cp,outname,T_OCT);
1051 +                if (system(buf)) {              /* create octree */
1052 +                        fclose(outfp);
1053 +                        return(-1);
1054 +                }
1055 +                fprintf(outfp, "void instance %s_inst\n", outname);
1056 +                if (!FEQ(meters2out, 1.0))
1057 +                        fprintf(outfp, "3 %s -s %f\n",
1058 +                                        libname(buf,outname,T_OCT),
1059 +                                        meters2out);
1060 +                else
1061 +                        fprintf(outfp, "1 %s\n", libname(buf,outname,T_OCT));
1062 +                fprintf(outfp, "0\n0\n");
1063 +                fclose(outfp);
1064 +        } else {                        /* else append to luminaire file */
1065 +                if (!FEQ(meters2out, 1.0)) {    /* apply scalefactor */
1066 +                        sprintf(cp, "| xform -s %f ", meters2out);
1067 +                        cp += strlen(cp);
1068 +                }
1069 +                if (!out2stdout) {
1070 +                        fclose(outfp);
1071 +                        strcpy(cp, ">> ");      /* append works for DOS? */
1072 +                        cp += 3;
1073 +                        fullname(cp,outname,T_RAD);
1074 +                }
1075 +                if (system(buf))
1076 +                        return(-1);
1077 +        }
1078 +        return(0);
1079   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines