| 1 | 
– | 
/* Copyright (c) 1996 Regents of the University of California */ | 
| 2 | 
– | 
 | 
| 1 | 
  | 
#ifndef lint | 
| 2 | 
< | 
static char SCCSid[] = "$SunId$ LBL"; | 
| 2 | 
> | 
static const char       RCSid[] = "$Id$"; | 
| 3 | 
  | 
#endif | 
| 6 | 
– | 
 | 
| 4 | 
  | 
/* | 
| 5 | 
  | 
 * Convert IES luminaire data to Radiance description | 
| 6 | 
  | 
 * | 
| 7 | 
  | 
 *      07Apr90         Greg Ward | 
| 8 | 
+ | 
 * | 
| 9 | 
+ | 
 *  Fixed correction factor for flat sources 29Oct2001 GW | 
| 10 | 
  | 
 */ | 
| 11 | 
  | 
 | 
| 12 | 
  | 
#include <stdio.h> | 
| 13 | 
+ | 
#include <string.h> | 
| 14 | 
  | 
#include <math.h> | 
| 15 | 
  | 
#include <sys/types.h> | 
| 16 | 
  | 
#include <ctype.h> | 
| 124 | 
  | 
int     gargc;                          /* global argc (minus filenames) */ | 
| 125 | 
  | 
char    **gargv;                        /* global argv */ | 
| 126 | 
  | 
 | 
| 127 | 
< | 
extern char     *strcpy(), *strcat(), *stradd(), *tailtrunc(), *filetrunc(), | 
| 128 | 
< | 
                *filename(), *libname(), *fullname(), *malloc(), | 
| 129 | 
< | 
                *getword(), *atos(); | 
| 127 | 
> | 
extern char     *stradd(), *tailtrunc(), *filetrunc(), | 
| 128 | 
> | 
                *filename(), *libname(), *fullnam(), *getword(), *atos(); | 
| 129 | 
  | 
extern float    *matchlamp(); | 
| 130 | 
  | 
extern time_t   fdate(); | 
| 131 | 
  | 
 | 
| 326 | 
  | 
 | 
| 327 | 
  | 
 | 
| 328 | 
  | 
char * | 
| 329 | 
< | 
fullname(path, fname, suffix)           /* return full path name */ | 
| 329 | 
> | 
fullnam(path, fname, suffix)            /* return full path name */ | 
| 330 | 
  | 
char    *path, *fname, *suffix; | 
| 331 | 
  | 
{ | 
| 332 | 
  | 
        if (prefdir != NULL && abspath(prefdir)) | 
| 473 | 
  | 
        } | 
| 474 | 
  | 
        if (out2stdout) | 
| 475 | 
  | 
                outfp = stdout; | 
| 476 | 
< | 
        else if ((outfp = fopen(fullname(buf,outname,T_RAD), "w")) == NULL) { | 
| 476 | 
> | 
        else if ((outfp = fopen(fullnam(buf,outname,T_RAD), "w")) == NULL) { | 
| 477 | 
  | 
                perror(buf); | 
| 478 | 
  | 
                fclose(inpfp); | 
| 479 | 
  | 
                return(-1); | 
| 539 | 
  | 
readerr: | 
| 540 | 
  | 
        fclose(inpfp); | 
| 541 | 
  | 
        fclose(outfp); | 
| 542 | 
< | 
        unlink(fullname(buf,outname,T_RAD)); | 
| 542 | 
> | 
        unlink(fullnam(buf,outname,T_RAD)); | 
| 543 | 
  | 
        return(-1); | 
| 544 | 
  | 
} | 
| 545 | 
  | 
 | 
| 550 | 
  | 
{ | 
| 551 | 
  | 
        int     nangles, tlt_type; | 
| 552 | 
  | 
        double  minmax[2]; | 
| 553 | 
< | 
        char    buf[MAXPATH], tltname[MAXWORD]; | 
| 553 | 
> | 
        char    buf[PATH_MAX], tltname[MAXWORD]; | 
| 554 | 
  | 
        FILE    *datin, *datout; | 
| 555 | 
  | 
 | 
| 556 | 
  | 
        if (!strcmp(tltspec, TLTNONE)) { | 
| 571 | 
  | 
                tailtrunc(strcpy(tltname,filename(tltspec))); | 
| 572 | 
  | 
        } | 
| 573 | 
  | 
        if (datin != NULL) { | 
| 574 | 
< | 
                if ((datout = fopen(fullname(buf,tltname,T_TLT),"w")) == NULL) { | 
| 574 | 
> | 
                if ((datout = fopen(fullnam(buf,tltname,T_TLT),"w")) == NULL) { | 
| 575 | 
  | 
                        perror(buf); | 
| 576 | 
  | 
                        if (datin != in) | 
| 577 | 
  | 
                                fclose(datin); | 
| 583 | 
  | 
                        fclose(datout); | 
| 584 | 
  | 
                        if (datin != in) | 
| 585 | 
  | 
                                fclose(datin); | 
| 586 | 
< | 
                        unlink(fullname(buf,tltname,T_TLT)); | 
| 586 | 
> | 
                        unlink(fullnam(buf,tltname,T_TLT)); | 
| 587 | 
  | 
                        return(-1); | 
| 588 | 
  | 
                } | 
| 589 | 
  | 
                fclose(datout); | 
| 622 | 
  | 
FILE    *in, *out; | 
| 623 | 
  | 
char    *mod, *name; | 
| 624 | 
  | 
{ | 
| 625 | 
< | 
        char    buf[MAXPATH], id[MAXWORD]; | 
| 625 | 
> | 
        char    buf[PATH_MAX], id[MAXWORD]; | 
| 626 | 
  | 
        FILE    *datout; | 
| 627 | 
  | 
        double  mult, bfactor, pfactor, width, length, height, wattage; | 
| 628 | 
  | 
        double  bounds[2][2]; | 
| 629 | 
  | 
        int     nangles[2], pmtype, unitype; | 
| 630 | 
  | 
        double  d1; | 
| 631 | 
+ | 
        int     doupper, dolower, dosides;  | 
| 632 | 
  | 
 | 
| 633 | 
  | 
        if (!isint(getword(in)) || !isflt(getword(in)) || !scnflt(in,&mult) | 
| 634 | 
  | 
                        || !scnint(in,&nangles[0]) || !scnint(in,&nangles[1]) | 
| 653 | 
  | 
                fprintf(stderr, "dosource: illegal source dimensions"); | 
| 654 | 
  | 
                return(-1); | 
| 655 | 
  | 
        } | 
| 656 | 
< | 
        if ((datout = fopen(fullname(buf,name,T_DST), "w")) == NULL) { | 
| 656 | 
> | 
        if ((datout = fopen(fullnam(buf,name,T_DST), "w")) == NULL) { | 
| 657 | 
  | 
                perror(buf); | 
| 658 | 
  | 
                return(-1); | 
| 659 | 
  | 
        } | 
| 660 | 
  | 
        if (cvdata(in, datout, 2, nangles, 1./WHTEFFICACY, bounds) != 0) { | 
| 661 | 
  | 
                fprintf(stderr, "dosource: bad distribution data\n"); | 
| 662 | 
  | 
                fclose(datout); | 
| 663 | 
< | 
                unlink(fullname(buf,name,T_DST)); | 
| 663 | 
> | 
                unlink(fullnam(buf,name,T_DST)); | 
| 664 | 
  | 
                return(-1); | 
| 665 | 
  | 
        } | 
| 666 | 
  | 
        fclose(datout); | 
| 676 | 
  | 
                fprintf(out, "7 "); | 
| 677 | 
  | 
        else | 
| 678 | 
  | 
                fprintf(out, "5 "); | 
| 679 | 
+ | 
        dolower = (bounds[0][0] < 90.); | 
| 680 | 
+ | 
        doupper = (bounds[0][1] > 90.); | 
| 681 | 
+ | 
        dosides = (doupper & dolower && sinf->h > MINDIM); | 
| 682 | 
  | 
        fprintf(out, "%s %s source.cal ", | 
| 683 | 
  | 
                        sinf->type==SPHERE ? "corr" : | 
| 684 | 
+ | 
                        !dosides ? "flatcorr" : | 
| 685 | 
  | 
                        sinf->type==DISK ? "cylcorr" : "boxcorr", | 
| 686 | 
  | 
                        libname(buf,name,T_DST)); | 
| 687 | 
  | 
        if (pmtype == PM_B) { | 
| 690 | 
  | 
                else | 
| 691 | 
  | 
                        fprintf(out, "srcB_horiz "); | 
| 692 | 
  | 
                fprintf(out, "srcB_vert "); | 
| 693 | 
< | 
        } else { | 
| 693 | 
> | 
        } else /* pmtype == PM_A */ { | 
| 694 | 
  | 
                if (nangles[1] >= 2) { | 
| 695 | 
  | 
                        d1 = bounds[1][1] - bounds[1][0]; | 
| 696 | 
  | 
                        if (d1 <= 90.+FTINY) | 
| 697 | 
  | 
                                fprintf(out, "src_phi4 "); | 
| 698 | 
< | 
                        else if (d1 <= 180.+FTINY) | 
| 699 | 
< | 
                                fprintf(out, "src_phi2 "); | 
| 700 | 
< | 
                        else | 
| 698 | 
> | 
                        else if (d1 <= 180.+FTINY) { | 
| 699 | 
> | 
                                if (FEQ(bounds[1][0],90.)) | 
| 700 | 
> | 
                                        fprintf(out, "src_phi2+90 "); | 
| 701 | 
> | 
                                else | 
| 702 | 
> | 
                                        fprintf(out, "src_phi2 "); | 
| 703 | 
> | 
                        } else | 
| 704 | 
  | 
                                fprintf(out, "src_phi "); | 
| 705 | 
  | 
                        fprintf(out, "src_theta "); | 
| 706 | 
  | 
                        if (FEQ(bounds[1][0],90.) && FEQ(bounds[1][1],270.)) | 
| 708 | 
  | 
                } else | 
| 709 | 
  | 
                        fprintf(out, "src_theta "); | 
| 710 | 
  | 
        } | 
| 711 | 
< | 
        if (sinf->type == SPHERE) | 
| 711 | 
> | 
        if (!dosides || sinf->type == SPHERE) | 
| 712 | 
  | 
                fprintf(out, "\n0\n1 %g\n", sinf->mult/sinf->area); | 
| 713 | 
  | 
        else if (sinf->type == DISK) | 
| 714 | 
  | 
                fprintf(out, "\n0\n3 %g %g %g\n", sinf->mult, | 
| 715 | 
< | 
                                sinf->l, sinf->h); | 
| 715 | 
> | 
                                sinf->w, sinf->h); | 
| 716 | 
  | 
        else | 
| 717 | 
  | 
                fprintf(out, "\n0\n4 %g %g %g %g\n", sinf->mult, | 
| 718 | 
  | 
                                sinf->l, sinf->w, sinf->h); | 
| 719 | 
  | 
        if (putsource(sinf, out, id, filename(name), | 
| 720 | 
< | 
                        bounds[0][0]<90., bounds[0][1]>90.) != 0) | 
| 720 | 
> | 
                        dolower, doupper, dosides) != 0) | 
| 721 | 
  | 
                return(-1); | 
| 722 | 
  | 
        return(0); | 
| 723 | 
  | 
} | 
| 724 | 
  | 
 | 
| 725 | 
  | 
 | 
| 726 | 
< | 
putsource(shp, fp, mod, name, dolower, doupper)         /* put out source */ | 
| 726 | 
> | 
putsource(shp, fp, mod, name, dolower, doupper, dosides) /* put out source */ | 
| 727 | 
  | 
SRCINFO *shp; | 
| 728 | 
  | 
FILE    *fp; | 
| 729 | 
  | 
char    *mod, *name; | 
| 730 | 
  | 
int     dolower, doupper; | 
| 731 | 
  | 
{ | 
| 725 | 
– | 
        int     dosides = doupper && dolower && shp->h > MINDIM; | 
| 732 | 
  | 
        char    lname[MAXWORD]; | 
| 733 | 
  | 
         | 
| 734 | 
  | 
        strcat(strcpy(lname, name), "_light"); | 
| 956 | 
  | 
                                putc('\n', out); | 
| 957 | 
  | 
                        } | 
| 958 | 
  | 
                } | 
| 959 | 
< | 
                free((char *)pt[i]); | 
| 959 | 
> | 
                free((void *)pt[i]); | 
| 960 | 
  | 
        } | 
| 961 | 
  | 
        for (i = 0; i < total; i++) { | 
| 962 | 
  | 
                if (i%4 == 0) | 
| 1044 | 
  | 
        if (instantiate) {              /* instantiate octree */ | 
| 1045 | 
  | 
                strcpy(cp, "| oconv - > "); | 
| 1046 | 
  | 
                cp += 12; | 
| 1047 | 
< | 
                fullname(cp,outname,T_OCT); | 
| 1047 | 
> | 
                fullnam(cp,outname,T_OCT); | 
| 1048 | 
  | 
                if (fdate(inpname) > fdate(outname) && | 
| 1049 | 
  | 
                                system(buf)) {          /* create octree */ | 
| 1050 | 
  | 
                        fclose(outfp); | 
| 1068 | 
  | 
                        fclose(outfp); | 
| 1069 | 
  | 
                        strcpy(cp, ">> ");      /* append works for DOS? */ | 
| 1070 | 
  | 
                        cp += 3; | 
| 1071 | 
< | 
                        fullname(cp,outname,T_RAD); | 
| 1071 | 
> | 
                        fullnam(cp,outname,T_RAD); | 
| 1072 | 
  | 
                } | 
| 1073 | 
  | 
                if (system(buf)) | 
| 1074 | 
  | 
                        return(-1); |