/*!***************************************************** * * ex9.c * ===== * * EXclgm(); Interface-routine for CLEAR_GM * EXldgm(); Interface-routine for LOAD_GM * EXsvgm(); Interface-routine for SAVE_GM * * EXldjb(); Interface-routine for LOAD_JOB * EXsvjb(); Interface-routine for SAVE_JOB * * EXbllv(); Interface-routine for BLANK_LEV * EXublv(); Interface-routine for UNBLANK_LEV * EXgtlv(); Interface-routine for GET_LEV * * EXcrvp(); Interface-routine for CRE_VIEW by position * EXcrvc(); Interface-routine for CRE_VIEW by coord.sys. * EXacvi(); Interface-routine for ACT_VIEW * EXscvi(); Interface-routine for SCL_VIEW * EXcevi(); Interface-routine for CEN_VIEW * EXhdvi(); Interface-routine for HIDE_VIEW * EXprvi(); Interface-routine for PERP_VIEW * EXervi(); Interface-routine for ERASE_VIEW * EXrpvi(); Interface-routine for REP_VIEW * EXgvnl(); Returns viewname list * EXcavi(); Interface-routine for CACC_VIEW * EXplvi(); Interface-routine for PLOT_VIEW * EXplwi(); Interface-routine for PLOT_WIN * * vyindx(); Translate viewname -> address in vytab * * This file is part of the VARKON Execute Library. * URL: http://www.varkon.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * (C)Microform AB 1984-1998, Johan Kjellander, johan@microform.se * *********************************************************/ #include "../../DB/include/DB.h" #include "../../DB/include/DBintern.h" #include "../../IG/include/IG.h" #include "../../GE/include/GE.h" #include "../../GP/include/GP.h" #ifdef V3_X11 #include "../../WP/include/WP.h" #endif #include "../include/EX.h" #include "../include/oldatts.h" #include extern DBptr lsysla; extern char jobdir[],jobnam[],tmprit[]; extern tbool nivtb1[]; extern NIVNAM nivtb2[]; extern V2NAPA defnap; extern VY vytab[],actvy; extern double gpgszx,gpgszy; extern bool rstron,tmpref; extern gmflt rstrox,rstroy,rstrdx,rstrdy; extern V3MDAT sydata; extern V3MSIZ sysize; extern short gptrty,modtyp,modatt,menlev,stalev,posmod; extern char actcnm[]; extern DBTmat *lsyspk; extern DBTmat lklsys,lklsyi; #ifdef WIN32 extern int msacvi(),msupvi(),msmaut(),msrepa(); extern short mssvjb(),msldjb(),msuppr(); #endif /*!******************************************************/ short EXclgm() /* Interface-rutin för CLEAR_GM(). Nollställer och * initierar GM. * * In: Inget. * * Ut: Inget. * * FV: 0 => Ok. * * (C)microform ab 18/2/86 J. Kjellander * ******************************************************!*/ { /* ***Sudda skärm och displayfil. */ #ifdef V3_X11 if ( gptrty == X11 ) wpergw(GWIN_ALL); else { gperal(); gpdram(); } #else gperal(); gpdram(); #endif /* ***Töm och initiera GM. */ DBreset(); return(0); } /********************************************************/ /*!******************************************************/ short EXldgm(char *filnam) /* Interface-rutin för LOAD_GM(fil). Laddar resultatfil * till GM. * * In: filnam = Pekare till filnamn. * * Ut: Inget. * * Felkoder: EX1642 = Kan ej ladda filen till GM. * * (C)microform ab 1/6/86 J. Kjellander * * 22/4/88 gmexit(), J. Kjellander * ******************************************************!*/ { short status; /* ***Sudda skärm och displayfil. */ #ifdef V3_X11 if ( gptrty == X11 ) wpergw(GWIN_ALL); else { gperal(); gpdram(); } #else gperal(); gpdram(); #endif /* ***Lagra GM. */ if ( (status=DBexit()) < 0 ) return(status); /* ***Ladda den nya resultatfilen. */ if ( DBload(filnam,sysize.gm, DB_LIBVERSION,DB_LIBREVISION,DB_LIBLEVEL) < 0 ) return(erpush("EX1642",filnam)); return(0); } /********************************************************/ /*!******************************************************/ short EXsvgm(char *filnam) /* Interface-rutin för SAVE_GM(fil). Lagrar GM i * resultatfilen filnam. * * In: filnam = Pekare till filnamn. * * Ut: Inget. * * Felkoder: EX1652 = Kan ej lagra resultatfil * * (C)microform ab 1/6/86 J. Kjellander * * 19/9/95 Ritmodulen, J. Kjellander * ******************************************************!*/ { short status; char resfil[V3PTHLEN+1]; /* ***Lagra GM. */ if ( (status=DBexit()) < 0 ) return(status); /* ***Om vi kör bas-moulen heter pagefilen någonting.RES. */ if ( sydata.opmode == BAS_MOD ) { strcpy(resfil,jobdir); strcat(resfil,jobnam); strcat(resfil,RESEXT); } /* ***Om vi kör ritmodulen heter den något temporärt. */ else strcpy(resfil,tmprit); /* ***Kopiera den lagrade resultatfilen till en fil med det nya namnet. */ if ( v3fcpy(resfil,filnam) < 0 ) return(erpush("EX1652",filnam)); /* ***Ladda den gamla resultatfilen igen. */ return(DBload(resfil,sysize.gm, DB_LIBVERSION,DB_LIBREVISION,DB_LIBLEVEL)); } /********************************************************/ /*!******************************************************/ short EXsvjb(char *filnam) /* Rutin för att lagra aktiva jobbdata i filen * filnam.JOB. * * In: filnam = Pekare till filnamn. * * Ut: Inget. * * FELKODER: EX1863 => Kan ej öppna jobbfil "filnamn". * EX1873 => Kan ej skriva till jobbfil "filnamn". * EX1883 => Kan ej stänga jobbfil "filnamn". * * (C)microform ab 17/10/88 R. Svedin * * 15/11/88 posmod, J. Kjellander * 28/1-95 Multifönster, J. Kjellander * ******************************************************!*/ { FILE *jobfpk; short y,m,d,h,min,s; int winant; double cnog,dscl; /* ***Öppna filen. */ #ifdef WIN32 if ( (jobfpk=fopen(filnam, "w+b")) == 0 ) return(erpush("EX1863",filnam)); #else if ( (jobfpk=fopen(filnam, "w+")) == 0 ) return(erpush("EX1863",filnam)); #endif /* ***Uppdatera senaste tid för uppdatering. */ EXtime(&y,&m,&d,&h,&min,&s); sydata.year_c = y; sydata.mon_c = m; sydata.day_c = d; sydata.hour_c = h; sydata.min_c = min; /* ***Ta reda på aktuell kurvnoggrannhet och ritningsskala. */ gpgtcn(&cnog); gpgrsk(&dscl); /* ***Skriv ut jobb-data. */ if ( fwrite((char *)&sydata, sizeof(V3MDAT), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&modtyp, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&modatt, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&tmpref, sizeof(bool), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&lsyspk, sizeof(DBTmat *), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&lklsys, sizeof(DBTmat), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&defnap, sizeof(V2NAPA), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)nivtb1, sizeof(tbool), NT1SIZ, jobfpk) == 0 ) goto error; if ( fwrite((char *)nivtb2, sizeof(NIVNAM),NT2SIZ, jobfpk) == 0 ) goto error; if ( fwrite((char *)&actvy, sizeof(VY), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)vytab, sizeof(VY), GPMAXV, jobfpk) == 0 ) goto error; if ( fwrite((char *)actcnm, sizeof(char),GMCNLN+1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&rstrox, sizeof(gmflt), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&rstroy, sizeof(gmflt), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&rstrdx, sizeof(gmflt), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&rstrdy, sizeof(gmflt), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&rstron, sizeof(bool), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&cnog, sizeof(double), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&dscl, sizeof(double), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&menlev, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&stalev, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&posmod, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fwrite((char *)&lsysla, sizeof(DBptr), 1, jobfpk) == 0 ) goto error; /* ***Multifönster. */ winant = 0; #ifdef V3_X11 if ( gptrty == X11 ) { if ( wpsvjb(jobfpk) < 0 ) goto error; } else { if ( fwrite((char *)&winant,sizeof(int),1,jobfpk) == 0 ) goto error; } #else #ifdef WIN32 if ( mssvjb(jobfpk) < 0 ) goto error; #else if ( fwrite((char *)&winant,sizeof(int),1, jobfpk) == 0 ) goto error; #endif #endif /* ***Stäng jobfilen. */ if ( fclose(jobfpk) == EOF) return(erpush("EX1883",filnam)); return(0); /* ***Felutgång. */ error: return(erpush("EX1873",filnam)); } /********************************************************/ /*!******************************************************/ short EXldjb( char *filnam, short kod) /* Rutin för läsa in jobdata ur filen filnam.JOB * enligt angiven kod. * kod = 0 Alla jobbdata. kod = 1 Endast nivåer. * kod = 2 Endast aktiv nivå. kod = 3 Endast attribut. * * In: filnam = Pekare till filnamn. * kod = Typ av jobbdata att läsa in * * Ut: Inget. * * Felkod: EX1862 => Kan ej öppna jobbfil "filnamn". * EX1893 => Fel vid läsning av jobbfil "filnamn". * EX1902 => Jobbfilen ej kompatibel med * aktuell V3-version. * EX1912 => Felaktig kod för LOAD_JOB() * * (C)microform ab 21/10/88 R. Svedin * * 15/11/88 posmod, J. Kjellander * 1/2/89 Ny VY, J. Kjellander * 12/1/92 Kurvattribut, J. Kjellander * 25/3/92 lsysla, J. Kjellander * 25/9/92 Ny VY, J. Kjellander * 27/12/92 Nya attribut, J. Kjellander * 28/1-95 Multifönster, J. Kjellander * 1997-12-25 WIDTH, J.Kjellander * 1998-10-01 TPMODE, J.Kjellander * ******************************************************!*/ { short i; double cnog,dscl; char dumbuf[4*GMXMXL]; /* Skall klara största */ V3MDAT tmpsyd; V2NAPA tmpdfn; NIV nivvek[NIVANT]; FILE *jobfpk; OVY17 avy17,vyt17[GPMAXV]; OVY111 avy111,vyt111[GPMAXV]; if ( kod < 0 || kod > 3 ) return(erpush("EX1912","")); /* ***Prova att öppna filen. */ #ifdef WIN32 if ( (jobfpk=fopen(filnam, "rb")) == 0 ) return(erpush("EX1862",filnam)); #else if ( (jobfpk=fopen(filnam, "r")) == 0 ) return(erpush("EX1862",filnam)); #endif /* ***Läs sydata från job-filen och kolla att ***kompatibilitetsproblem ej föreligger. */ if ( fread( &tmpsyd,sizeof(V3MDAT),1,jobfpk) == 0 ) goto error; if ( tmpsyd.revnr < 1 ) return(erpush("EX1902",filnam)); /* ***Om hela jobbfilen skall läsas in kopiera datum. */ if ( kod == 0 ) { sydata.year_c = tmpsyd.year_c; sydata.mon_c = tmpsyd.mon_c; sydata.day_c = tmpsyd.day_c; sydata.hour_c = tmpsyd.hour_c; sydata.min_c = tmpsyd.min_c; sydata.year_u = tmpsyd.year_u; sydata.mon_u = tmpsyd.mon_u; sydata.day_u = tmpsyd.day_u; sydata.hour_u = tmpsyd.hour_u; sydata.min_u = tmpsyd.min_u; } /* ***Läs från jobfilen till global eller dummy variabel. */ if ( kod == 0 ) { if ( fread( &modtyp, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fread( &modatt, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fread( &tmpref, sizeof(bool), 1, jobfpk) == 0 ) goto error; if ( fread( &lsyspk, sizeof(DBTmat *), 1, jobfpk) == 0 ) goto error; if ( fread( &lklsys, sizeof(DBTmat), 1, jobfpk) == 0 ) goto error; } else { if ( fread( dumbuf, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(bool), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(DBTmat *), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(DBTmat), 1, jobfpk) == 0 ) goto error; } /* ***Defnap läses olika beroende på jobfilens ålder. */ if ( tmpsyd.revnr > 16 || (tmpsyd.revnr == 16 && tmpsyd.level > 'B') ) { if ( kod == 0 || (kod == 2) || (kod == 3 )) { if ( fread( &tmpdfn,sizeof(V2NAPA), 1, jobfpk) == 0 ) goto error; } else { if ( fread( dumbuf,sizeof(V2NAPA), 1, jobfpk) == 0 ) goto error; } } else if ( tmpsyd.revnr > 15 || (tmpsyd.revnr == 15 && tmpsyd.level > 'B') ) { if ( kod == 0 || (kod == 2) || (kod == 3 )) { if ( fread( &tmpdfn,sizeof(ONAP116B), 1, jobfpk) == 0 ) goto error; defnap.tpmode = 0; } else { if ( fread( dumbuf,sizeof(ONAP116B), 1, jobfpk) == 0 ) goto error; } } else if ( tmpsyd.revnr > 11 || (tmpsyd.revnr == 11 && tmpsyd.level > 'F') ) { if ( kod == 0 || (kod == 2) || (kod == 3 )) { if ( fread( &tmpdfn,sizeof(ONAP115), 1, jobfpk) == 0 ) goto error; defnap.tpmode = 0; } else { if ( fread( dumbuf,sizeof(ONAP115), 1, jobfpk) == 0 ) goto error; } } else if ( tmpsyd.revnr > 10 || (tmpsyd.revnr == 10 && tmpsyd.level > 'L') ) { if ( kod == 0 || (kod == 2) || (kod == 3 )) { if ( fread( &tmpdfn,sizeof(ONAP111), 1, jobfpk) == 0 ) goto error; defnap.tfont = 0; defnap.tpmode = 0; } else { if ( fread( dumbuf,sizeof(ONAP111), 1, jobfpk) == 0 ) goto error; } } else if ( tmpsyd.revnr > 3 || (tmpsyd.revnr == 2 && tmpsyd.level > 'B') ) { if ( kod == 0 || (kod == 2) || (kod == 3 )) { if ( fread( &tmpdfn,sizeof(ONAP110), 1, jobfpk) == 0 ) goto error; defnap.cfont = 0; defnap.cdashl = 3.0; defnap.tfont = 0; defnap.tpmode = 0; } else { if ( fread( dumbuf,sizeof(ONAP110), 1, jobfpk) == 0 ) goto error; } } else { if ( kod == 0 || (kod == 2) || (kod == 3 )) { if ( fread( &tmpdfn,sizeof(ONAP13),1,jobfpk) == 0 ) goto error; defnap.hit = TRUE; defnap.save = TRUE; defnap.cfont = 0; defnap.cdashl = 3.0; defnap.tfont = 0; defnap.tpmode = 0; } else { if ( fread( dumbuf,sizeof(ONAP13),1,jobfpk) == 0 ) goto error; } } /* ***Nivåer läses olika from. V1.2I. */ if ( tmpsyd.revnr > 2 || (tmpsyd.revnr == 2 && tmpsyd.level > 'H') ) { if ( kod == 0 || (kod == 1 )) { if ( fread( nivtb1, sizeof(tbool), NT1SIZ, jobfpk) == 0 ) goto error; if ( fread( nivtb2, sizeof(NIVNAM), NT2SIZ, jobfpk) == 0 ) goto error; } else { if ( fread( dumbuf, sizeof(tbool), NT1SIZ, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(NIVNAM), NT2SIZ, jobfpk) == 0 ) goto error; } } else { if ( kod == 0 || (kod == 1 )) { if (fread( nivvek, sizeof(NIV), NIVANT, jobfpk) == 0 ) goto error; for ( i=0; i 11 || (tmpsyd.revnr == 11 && tmpsyd.level > 'B') ) { if ( kod == 0 ) { if ( fread( &actvy, sizeof(VY), 1, jobfpk) == 0 ) goto error; if ( fread( vytab, sizeof(VY),GPMAXV, jobfpk) == 0 ) goto error; } else { if ( fread( dumbuf, sizeof(VY), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(VY),GPMAXV, jobfpk) == 0 ) goto error; } } else if ( tmpsyd.revnr > 7 || (tmpsyd.revnr == 7 && tmpsyd.level > 'D') ) { if ( kod == 0 ) { if ( fread( &avy111, sizeof(OVY111), 1, jobfpk) == 0 ) goto error; strcpy(actvy.vynamn,avy111.vynamn); V3MOME(&avy111.vyrikt,&actvy.vyrikt,sizeof(VYVEC)); V3MOME(avy111.vywin,actvy.vywin,4*sizeof(double)); actvy.vydist = avy111.vydist; actvy.vy3d = avy111.vy3d; actvy.vytypp = TRUE; if ( fread( vyt111, sizeof(OVY111),GPMAXV, jobfpk) == 0 ) goto error; for ( i=0; i 2 ) { if ( kod == 0 ) { if ( fread( &cnog, sizeof(double), 1, jobfpk) == 0 ) goto error; gpstcn(cnog); if ( fread( &dscl, sizeof(double), 1, jobfpk) == 0 ) goto error; gpsrsk(dscl); if ( fread( &menlev, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fread( &stalev, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( stalev == 2 ) igslv2(); } else { if ( fread( dumbuf, sizeof(double), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(double), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(short), 1, jobfpk) == 0 ) goto error; if ( fread( dumbuf, sizeof(short), 1, jobfpk) == 0 ) goto error; } } /* ***From. V1.7 även följande. */ if ( tmpsyd.revnr > 6 ) { if ( kod == 0 ) { if ( fread( &posmod, sizeof(short), 1, jobfpk) == 0 ) goto error; } else { if ( fread( dumbuf, sizeof(short), 1, jobfpk) == 0 ) goto error; } } else posmod = 0; /* ***From. V1.10O även följande. */ if ( tmpsyd.revnr > 10 || (tmpsyd.revnr == 10 && tmpsyd.level > 'N') ) { if ( kod == 0 ) { if ( fread( &lsysla, sizeof(DBptr), 1, jobfpk) == 0 ) goto error; } else { if ( fread( dumbuf, sizeof(DBptr), 1, jobfpk) == 0 ) goto error; } } else lsysla = DBNULL; /* ***From. V1.12G även multifönster. */ #ifdef V3_X11 if ( tmpsyd.revnr > 12 || (tmpsyd.revnr == 12 && tmpsyd.level > 'F') ) { if ( kod == 0 && gptrty == X11 ) { if ( wpldjb(jobfpk) < 0 ) goto error; } } #endif /* ***WIN32 innebär alltid multifönster. */ #ifdef WIN32 if ( msldjb(jobfpk,&tmpsyd) < 0 ) goto error; #endif /* ***Stäng jobbfilen. */ if ( fclose(jobfpk) == EOF ) goto error; /* ***Jobbfil inläst. ***Om hela jobbfilen eller något attribut är inläst uppdatera defnap. */ if ( kod == 0 || (kod == 2) || (kod == 3) ) incdnp(&tmpdfn,kod); return(0); /* ***Felutgång. */ error: return(erpush("EX1893",filnam)); } /********************************************************/ /*!******************************************************/ short EXbllv( DBint levnum, DBint win_id) /* Interface-rutin för BLANK_LEV(n). Släcker * nivå. * * In: levnum = Nivånummer. * win_id = Fönster-ID. * * Ut: Inget. * * Felkoder: EX1632 = Otillåtet nivånummer. * * (C)microform ab 1/6/86 J. Kjellander * * 1/9/86 R. Svedin. Ändrad feltest. * 29/9/86 R. Svedin. Ny nivåhant. * 17/1-95 Multifönster, J. Kjellander * ******************************************************!*/ { short status; /* ***Initiering. */ status = 0; /* ***Kolla att levnum har rimligt värde. */ if ( levnum < 0 || levnum > NT1SIZ-1) return(erpush("EX1632","")); /* ***Släck nivån. */ #ifdef V3_X11 if ( gptrty == X11 ) status = wpmtsl(win_id,levnum,levnum,WP_BLANKL); else nivtb1[levnum] = TRUE; #else nivtb1[levnum] = TRUE; #endif return(status); } /********************************************************/ /*!******************************************************/ short EXublv( DBint levnum, DBint win_id) /* Interface-rutin för UNBLANK_LEV(n). Tänder * nivå. * * In: levnum = Nivånummer. * win_id = Fönster-ID. * * Ut: Inget. * * Felkoder: EX1632 = Otillåtet nivånummer. * * (C)microform ab 1/6/86 J. Kjellander * * 1/8/86 Ändrad feltest, R. Svedin. * 29/9/86 Ny nivåhantering, R. Svedin. * 17/1-95 Multifönster, J. Kjellander * ******************************************************!*/ { short status; /* ***Initiering. */ status = 0; /* ***Kolla att levnum har rimligt värde. */ if ( levnum < 0 || levnum > NT1SIZ-1 ) return(erpush("EX1632","")); /* ***Tänd nivån. */ #ifdef V3_X11 if ( gptrty == X11 ) status = wpmtsl(win_id,levnum,levnum,WP_UBLANKL); else nivtb1[levnum] = FALSE; #else nivtb1[levnum] = FALSE; #endif return(status); } /********************************************************/ /*!******************************************************/ short EXgtlv( DBshort levnum, bool *blank, char *name) /* Interface-rutin för GET_LEV(n,blank,name). * Returnerar information om nivå. * * In: levnum = Nivånummer. * * Ut: blank = 0=>Tänd, 1=>Släckt * name = Pekare till namn. * * Felkoder: EX1632 = Otillåtet nivånummer. * * (C)microform ab 1/6/86 J. Kjellander * * 29/9/86 Ny nivåhantering, R. Svedin. * ******************************************************!*/ { short i; /* ***Kolla att levnum har rimligt värde. */ if ( levnum < 0 || levnum > NT1SIZ-1 ) return(erpush("EX1632","")); /* ***Returnera värden. */ name[0] = '\0'; *blank = nivtb1[levnum]; for ( i = 0; i < NT2SIZ; ++i ) { if ( nivtb2[i].nam[0] != '\0' && nivtb2[i].num == levnum ) strcpy(name,nivtb2[i].nam); } return(0); } /********************************************************/ /*!******************************************************/ short EXcrvp( char name[], VYVEC *bpos) /* Interface-rutin för CRE_VIEW. Skapar en ny vy * med hjälp av en betraktelseposition. * * In: name => Vyns namn. * bpos => Betraktelseposition. * * Ut: Inget. * * Felkoder: EX1672 = Max antal vyer redan skapade, vy'n ej skapad. * * (C)microform ab 22/7/86 R. Svedin * * 10/10/86 Tagit bort param. för vyfönster, R. Svedin * 18/10/86 gpgwin(), J. Kjellander * 24/10/91 Bytt namn till EXcrvp(), J. Kjellander * 29/9/92 vytypp, J. Kjellander * 23/1-95 Multifönster, J. Kjellander * ******************************************************!*/ { short i; VY actwin; /* ***Om vyn inte finns redan, leta upp en ledig plats i vytab. */ if ( (i=vyindx(name)) == -1 ) { for ( i=0; ix_vy; vytab[i].vyrikt.y_vy = bpos->y_vy; vytab[i].vyrikt.z_vy = bpos->z_vy; /* ***Kopiera aktivt modellfönster. */ gpgwin(&actwin); vytab[i].vywin[0] = actwin.vywin[0]; vytab[i].vywin[1] = actwin.vywin[1]; vytab[i].vywin[2] = actwin.vywin[2]; vytab[i].vywin[3] = actwin.vywin[3]; /* ***Betraktelseavstånd och 3D-flagga. */ vytab[i].vydist = 0.0; if ( bpos->x_vy == 0.0 && bpos->y_vy == 0.0 && bpos->z_vy > 0 ) vytab[i].vy3d = FALSE; else vytab[i].vy3d = TRUE; /* ***Vy är skapad med hjälp av betraktelseposition. */ vytab[i].vytypp = TRUE; return(0); } /********************************************************/ /*!******************************************************/ short EXcrvc( char name[], DBId *idvek) /* Skapar en ny vy med hjälp av ett koordinatsystem. * * In: name => Vyns namn. * idvek => Pekare till identitet. * * Ut: Inget. * * Felkoder: EX1672 = Max antal vyer redan skapade, vy'n ej skapad. * EX1402 = Storheten finns ej. * * (C)microform ab 29/9/92 J. Kjellander * * 23/1-95 Multifönster, J. Kjellander * ******************************************************!*/ { int i; DBptr la; DBetype typ; VY actwin; GMCSY csy; DBTmat mat; /* ***Hämta koordinatsystemet ur GM. */ if ( DBget_pointer('I',idvek,&la,&typ) < 0 || typ != CSYTYP ) return(erpush("EX1402","EXcrvc")); DBread_csys(&csy,&mat,la); /* ***Om vyn inte finns redan, leta upp en ledig plats i vytab. */ if ( (i=vyindx(name)) == -1 ) { for ( i=0; i Vyns namn. * win_id => ID för grafiskt fönster. * * Ut: Inget. * * Felkoder: EX1682 = Vy med detta namn finns ej. * * (C)microform ab 1/8/86 R. Svedin * * 7/10/86 Tagit bort repagm, R. Svedin. * 15/10/86 gpswin(), J. Kjellander * 18/10/86 gpgwin(), J. Kjellander * 29/10/86 uppdatering av vytab, J. Kjellander * 20/12/94 Multipla fönster, J. Kjellander * ******************************************************!*/ { short i=0; VY actwin; /* ***Om vi kör X11 eller WIN32 låter vi winpac göra jobbet. */ #ifdef V3_X11 if ( gptrty == X11 ) return(wpacvi(name,win_id)); #endif #ifdef WIN32 return(msacvi(name,win_id)); #endif /* ***Uppdatera först fönstret i den nu aktiva vyn så ***att samma fönster återfås nästa gång vyn aktiveras. ***Om aktiv vy inte har något namn som finns i vytab, ***som tex. under uppstart, sker ingen uppdatering. */ gpgwin(&actwin); if ( (i=vyindx(actwin.vynamn)) != -1 ) { vytab[i].vywin[0] = actwin.vywin[0]; vytab[i].vywin[1] = actwin.vywin[1]; vytab[i].vywin[2] = actwin.vywin[2]; vytab[i].vywin[3] = actwin.vywin[3]; } /* ***Gör den nya vyn aktiv. */ if ((i=vyindx(name)) == -1) return(erpush("EX1682",name)); gpswin(&vytab[i]); gpstvi(&vytab[i]); return(0); } /********************************************************/ /*!******************************************************/ short EXscvi( char name[], DBfloat scl) /* Interface-rutin för SCL_VIEW. Byter skala. * * In: name => Vyns namn. * scl => Ny skala. * * Ut: Inget. * * Felkoder: EX1682 = Vy med detta namn finns ej. * EX1692 = Kan ej minska skalan till begärt värde * EX1702 = Kan ej skapa fönster. * * (C)microform ab 1/8/86 R. Svedin * * 7/10/86 Tagit bort repagm, R. Svedin * 15/10/86 gpswin(), J. Kjellander * 18/10/86 gpgwin(), J. Kjellander * 1996-11-03 wpupvi(), J.Kjellander * ******************************************************!*/ { short i=0; bool aktiv; VY oldwin,newwin; /* *** Kolla skalan. */ if ( scl <= 1e-10 ) return(erpush("EX1702","")); /* *** Om begärd vy är aktiv hämta den. */ gpgwin(&newwin); gpgwin(&oldwin); if (strcmp(name,oldwin.vynamn) == 0) aktiv = TRUE; /* ***Om begärd vy ej är aktiv plocka fram den ur vytab. */ else { aktiv = FALSE; if ((i=vyindx(name)) == -1) return(erpush("EX1682",name)); oldwin.vywin[0] = vytab[i].vywin[0]; oldwin.vywin[1] = vytab[i].vywin[1]; oldwin.vywin[2] = vytab[i].vywin[2]; oldwin.vywin[3] = vytab[i].vywin[3]; } /* *** Beräkna det nya fönstret. */ newwin.vywin[0] = oldwin.vywin[0] + (oldwin.vywin[2]-oldwin.vywin[0])/2.0 - gpgszx/2.0/scl; newwin.vywin[2] = oldwin.vywin[0] + (oldwin.vywin[2]-oldwin.vywin[0])/2.0 + gpgszx/2.0/scl; newwin.vywin[1] = oldwin.vywin[1] + (oldwin.vywin[3]-oldwin.vywin[1])/2.0 - gpgszy/2.0/scl; newwin.vywin[3] = oldwin.vywin[1] + (oldwin.vywin[3]-oldwin.vywin[1])/2.0 + gpgszy/2.0/scl; /* *** Om Vyn är aktiv, uppdatera den *** och uppdatera statusfältet. */ if ( aktiv ) { if (gpswin(&newwin) < 0 ) return(erpush("EX1692","")); } /* ***Vyn är ej aktiv, uppdatera bara vytab. */ else { if ( newwin.vywin[0] >= newwin.vywin[2] ) return(erpush("EX1702","")); if ( newwin.vywin[1] >= newwin.vywin[3] ) return(erpush("EX1702","")); vytab[i].vywin[0] = newwin.vywin[0]; vytab[i].vywin[1] = newwin.vywin[1]; vytab[i].vywin[2] = newwin.vywin[2]; vytab[i].vywin[3] = newwin.vywin[3]; } /* ***Uppdatera winpac. */ #ifdef V3_X11 if ( gptrty == X11 ) wpupvi(name,&newwin); #endif #ifdef WIN32 msupvi(name,&newwin); #endif return(0); } /********************************************************/ /*!******************************************************/ short EXcevi( char name[], DBfloat x, DBfloat y) /* Interface-rutin för CEN_VIEW. Sätter ett nytt centrum. * * In: name => Vyns namn. * x => X-koord för nytt centrum. * y => Y-koord för nytt centrum. * * Ut: Inget. * * Felkoder: EX1682 = Vy med detta namn finns ej. * EX1692 = Kan ej minska skalan till begärt värde * EX1702 = Kan ej skapa fönster. * * (C)microform ab 4/8/86 R. Svedin * * 7/10/86 Tagit bort repagm, R. Svedin * 15/10/86 gpswin(), J. Kjellander * 18/10/86 gpgwin(), J. Kjellander * 1996-11-03 wpupvi(), J.Kjellander * ******************************************************!*/ { short i=0; bool aktiv; VY oldwin,newwin; /* ***Om begärd vy är aktiv hämta den. */ gpgwin(&oldwin); gpgwin(&newwin); if (strcmp(name,oldwin.vynamn) == 0) aktiv = TRUE; /* ***Om begärd vy ej är aktiv plocka fram den. */ else { aktiv = FALSE; if ((i=vyindx(name)) == -1) return(erpush("EX1682",name)); oldwin.vywin[0] = vytab[i].vywin[0]; oldwin.vywin[1] = vytab[i].vywin[1]; oldwin.vywin[2] = vytab[i].vywin[2]; oldwin.vywin[3] = vytab[i].vywin[3]; } /* ***Beräkna det nya fönstret. */ newwin.vywin[0] = x - (oldwin.vywin[2]-oldwin.vywin[0])/2.0; newwin.vywin[2] = x + (oldwin.vywin[2]-oldwin.vywin[0])/2.0; newwin.vywin[1] = y - (oldwin.vywin[3]-oldwin.vywin[1])/2.0; newwin.vywin[3] = y + (oldwin.vywin[3]-oldwin.vywin[1])/2.0; /* ***Om Vyn är aktiv, uppdatera den och ***uppdatera statusfältet och generera ny bild. */ if ( aktiv ) { if (gpswin(&newwin) < 0 ) return(erpush("EX1692","")); } /* ***Vyn är ej aktiv, uppdatera bara vytab. */ else { if ( newwin.vywin[0] >= newwin.vywin[2] ) return(erpush("EX1702","")); if ( newwin.vywin[1] >= newwin.vywin[3] ) return(erpush("EX1702","")); vytab[i].vywin[0] = newwin.vywin[0]; vytab[i].vywin[1] = newwin.vywin[1]; vytab[i].vywin[2] = newwin.vywin[2]; vytab[i].vywin[3] = newwin.vywin[3]; } /* ***Uppdatera winpac. */ #ifdef V3_X11 if ( gptrty == X11 ) wpupvi(name,&newwin); #endif #ifdef WIN32 msupvi(name,&newwin); #endif return(0); } /********************************************************/ /*!******************************************************/ short EXhdvi( char name[], bool flag1, bool flag2, FILE *pfil, DBVector *origo) /* Interface-rutin för HIDE_VIEW. * * In: name => Vyns namn * flag1 => TRUE = Rita på skärm * flag2 => TRUE = Rita till fil * pfil => Filpekare * origo => Pekare till nollpunkt eller NULL * * Ut: Inget. * * FV: 0 = Ok. * AVBRYT = c i gphide(). * * Felkoder: EX1682 = Vy med detta namn finns ej. * * (C)microform ab 21/3/89 J. Kjellander * * 29/5/91 Origo, J. Kjellander * ******************************************************!*/ { short i,status; VY tmpavy; DBVector nollp; /* ***Kolla att vyn finns. */ if ((i=vyindx(name)) == -1) return(erpush("EX1682",name)); /* *** Om begärd vy är inte är aktiv, gör den aktiv. */ gpgwin(&tmpavy); if ( strcmp(name,actvy.vynamn) != 0 ) { gpswin(&vytab[i]); gpstvi(&vytab[i]); } /* ***Transformera origo till basic och sedan till aktiv vy och ***beräkna avstånd till vy:ns nedre vänstra hörn. Om origo = NULL ***ta nedre vänstra hörnet på aktiv vy. */ if ( origo != NULL ) { if ( lsyspk != NULL ) GEtfpos_to_local(origo,&lklsyi,origo); gptrpv(origo); nollp.x_gm = origo->x_gm - actvy.vywin[0]; nollp.y_gm = origo->y_gm - actvy.vywin[1]; nollp.z_gm = 0.0; } else nollp.x_gm = nollp.y_gm = nollp.z_gm = 0.0; /* ***Gör hide. */ status = gphide(flag1,flag2,pfil,&nollp); /* ***Slut. */ gpswin(&tmpavy); gpstvi(&tmpavy); return(status); } /********************************************************/ /*!******************************************************/ short EXprvi( char name[], DBfloat dist) /* Interface-rutin för PERP_VIEW. Ändrar perspektiv- * avstånd. * * In: name => Vyns namn. * dist => Nytt avstånd. 0 = Parallellprojektion. * * Ut: Inget. * * Felkoder: EX1682 = Vy med detta namn finns ej. * EX1922 = Avstånd < 0. * * (C)microform ab 21/3/89 J. Kjellander * * 1999-02-02 wpuppr(), J.Kjellander * ******************************************************!*/ { short i; /* *** Kolla avståndet. */ if ( dist < 0.0 ) return(erpush("EX1922","")); /* ***Uppdatera vytab. */ if ((i=vyindx(name)) == -1) return(erpush("EX1682",name)); vytab[i].vydist = dist; /* *** Om begärd vy är aktiv ändra även i actvy. */ if ( strcmp(name,actvy.vynamn) == 0 ) { actvy.vydist = dist; gpstvi(&actvy); } /* ***Uppdatera winpac. */ #ifdef V3_X11 if ( gptrty == X11 ) wpuppr(name,dist); #endif #ifdef WIN32 msuppr(name,dist); #endif /* ***Slut. */ return(0); } /********************************************************/ /*!******************************************************/ short EXervi(DBint win_id) /* Interface-rutin för ERASE_VIEW(). Suddar fönster. * * In: win_id => Fönsterid. * * Ut: Inget. * * FV: 0 => Ok. * * (C)microform ab 30/6/86 R. Svedin * * 20/1-95 Multifönster, J. Kjellander * ******************************************************!*/ { /* ***Sudda skärm och displayfil. */ #ifdef V3_X11 if ( gptrty == X11 ) wpergw(win_id); else { gperal(); gpdram(); } #else gperal(); gpdram(); #endif return(0); } /********************************************************/ /*!******************************************************/ short EXrpvi( DBint autoz, DBint win_id) /* Interface-rutin för REP_VIEW(). Genererar en ny bild. * * In: autoz => Autozoom = 1 annars 0. * win_id => Fönster att rita om. * * Ut: Inget. * * FV: 0 => Ok. * * (C)microform ab 30/6/86 R. Svedin * * 7/10/86 Bytt till repagm, R. Svedin * 1/1/95 Multifönster, J. Kjellander * 1996-12-19 WIN32, J.Kjellander * ******************************************************!*/ { short status; /* ***X-Windows. */ #ifdef V3_X11 if ( gptrty == X11 ) { if ( autoz == 1 ) { status = wpmaut(win_id); return(status); } else { wprepa(win_id); return(0); } } #endif /* ***Microsoft Windows. */ #ifdef WIN32 if ( autoz == 1 ) { status = (short)msmaut(win_id); return(status); } else { msrepa(win_id); return(0); } /* ***Övriga UNIX-skärmar. */ #else if ( autoz == 1 ) status = igascl(); else status = repagm(); igupsa(); return(status); #endif } /********************************************************/ /*!******************************************************/ short EXgvnl( char *namptr[], DBint *numptr) /* Returnerar en lista med alla definierade vyers namn. * * In: namptr => Pekare till utdata. * numptr => Pekare till utdata. * * Ut: *namptr = Pekare till vynamn. * *numptr = Antal definierade vyer. * * (C)microform ab 1998-11-25 J.Kjellander * ******************************************************!*/ { int i,n; for ( i=n=0; i 100.0 ) return(erpush("EX1712","")); gpstcn(newcn); return(0); } /********************************************************/ /*!******************************************************/ short EXplvi( char *vynam, char *filnam) /* Interface-rutin för PLOT_VIEW(). * Skapar plottfil av en namngiven vy. * * In: vynam = Pekare till vynamn. * filnam = Pekare till filnamn. * * Ut: Inget. * * Felkoder: EX1682 = Vyn %s finns ej. * EX1742 = Kan ej skapa plotfil, fel från OS. * * (C)microform ab 4/11/86 R. Svedin * * 5/11/86 gpstvi(), R. Svedin * 7/5/87 plotorigo, J. Kjellander * 17/2/88 plotvy, J. Kjellander * ******************************************************!*/ { VY tmpavy; short vynum; DBVector origo; FILE *filpek; /* ***Spara actvy i temporär filvariabel. */ gpgwin(&tmpavy); /* ***Aktivera vyn. */ if ( (vynum=vyindx(vynam)) == -1 ) { erpush("EX1682",vynam); goto error; } gpswin(&vytab[vynum]); gpstvi(&vytab[vynum]); /* ***Skapa meta_fil. */ if ( (filpek=fopen(filnam,"w+")) == NULL ) { erpush("EX1742",""); goto error; } origo.x_gm = origo.y_gm = 0.0; if ( strcmp(filnam+strlen(filnam)-4,DXFEXT) == 0 ) dxfout(filpek,&vytab[vynum],&origo); else gpmeta(filpek,&vytab[vynum],&origo); fclose(filpek); goto exit; /* ***Fel. */ error: errmes(); exit: gpswin(&tmpavy); gpstvi(&tmpavy); return(0); } /********************************************************/ /*!******************************************************/ short EXplwi( DBVector *p1, DBVector *p2, char *filnam, DBVector *p0) /* Interface-rutin för PLOT_WIN(). * Skapar plottfil av visst område. * * In: p1,p2 = Plotområde. * filnam = Pekare till filnamn. * p0 = Plotorigo. * * Ut: Inget. * * Felkoder: EX1852 = Felaktigt plotfönster. * EX1742 = Kan ej skapa plotfil, fel från OS. * * (C)microform ab 17/2/88 J. Kjellander * * 11/10/88 Bug, plotorigo. J. Kjellander * 2/10/91 Bug, DXF-origo. J. Kjellander * ******************************************************!*/ { DBVector origo; VY tmpavy,plotvy; FILE *filpek; /* ***Spara actvy i temporär variabel. */ gpgwin(&tmpavy); gpgwin(&plotvy); /* ***Skapa plotvy. */ plotvy.vywin[0] = p1->x_gm; plotvy.vywin[1] = p1->y_gm; plotvy.vywin[2] = p2->x_gm; plotvy.vywin[3] = p2->y_gm; if ( gpswin(&plotvy) < 0 ) return(erpush("EX1852","")); /* ***Skapa meta_fil. */ if ( (filpek=fopen(filnam,"w+")) == NULL ) { erpush("EX1742",""); goto error; } if ( strcmp(filnam+strlen(filnam)-4,DXFEXT) == 0 ) { origo.x_gm = p0->x_gm; origo.y_gm = p0->y_gm; dxfout(filpek,&plotvy,&origo); } else { origo.x_gm = p0->x_gm - p1->x_gm; origo.y_gm = p0->y_gm - p1->y_gm; gpmeta(filpek,&plotvy,&origo); } fclose(filpek); goto exit; /* ***Fel. */ error: errmes(); exit: gpswin(&tmpavy); return(0); } /********************************************************/ /*!******************************************************/ short vyindx(char vynamn[]) /* * In: Vynamn. * * Ut: Inget. * * FV: Noll eller större => Vyns plats i vytab. * -1 => Vyn finns ej. * * (C)microform ab 22/7/86 R. Svedin * ******************************************************!*/ { short i; for ( i = 0; i