home *** CD-ROM | disk | FTP | other *** search
- /*----- PROGRAM INCLUDE FILES -----*/
-
- #include "common.h"
-
- /*-------- DEFINES ----------*/
-
- #define NO_OUTPUT_FILE 1L
- #define NO_ICON_FILE 2L
- #define NO_INPUT_FILE 3L
-
- #define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);}
-
- /*-------- GLOBAL STRUCTURES --------*/
-
- extern struct ILBMBase *ILBMBase;
- extern struct IFFBase *IFFBase;
-
- extern struct Window *setwin;
- extern struct Gadget EquationD;
- extern struct Gadget RotationX;
- extern struct Gadget RotationY;
- extern struct Gadget RotationZ;
-
-
- /*------- INTERNAL FUNCTIONS --------*/
-
- AllPlotData *AllocAllPlotData(VOID)
- {
- return ( AllocMem(sizeof(AllPlotData), MEMF_CLEAR) );
- }
-
-
- VOID FreeAllPlotData(AllPlotData *apd)
- {
- FreeMem( (void *)apd, sizeof(AllPlotData) );
- }
-
-
- VOID Init3DPL(AllPlotData *pd)
- {
- pd->dd.RotationX = 45.;
- pd->dd.RotationY = -60.;
- pd->dd.RotationZ = -135.;
- pd->dd.OriginX = 160;
- pd->dd.OriginY = 100;
- pd->dd.ProjPlane = 0.;
- pd->dd.ViewDist = 20.;
- pd->dd.Scale = 30.;
- pd->dd.LineSpacingX = 0.25;
- pd->dd.LineSpacingY = 0.25;
- pd->dd.PlotXmin = -3.;
- pd->dd.PlotXmax = 3.;
- pd->dd.PlotYmin = -3.;
- pd->dd.PlotYmax = 3.;
- pd->dd.PlotPrecisionX = 0.1;
- pd->dd.PlotPrecisionY = 0.1;
-
- pd->ad.AxesXmin = -3.;
- pd->ad.AxesXmax = 3.;
- pd->ad.AxesYmin = -3.;
- pd->ad.AxesYmax = 3.;
- pd->ad.AxesZmin = -1.;
- pd->ad.AxesZmax = 1.;
- pd->ad.AxesPrecision = 0.1;
-
- pd->td.TicX = 1.;
- pd->td.TicY = 1.;
- pd->td.TicZ = 1.;
- pd->td.NumTicX = 1;
- pd->td.NumTicY = 1;
- pd->td.NumTicZ = 1;
-
- pd->ei.DependVar = 'Z';
- strcpy(pd->ei.IndependVar,"XY");
- strcpy(&(pd->ei.Equation[0]),"SIN(X*Y)");
-
- pd->pi.Surface = XANDY;
- pd->pi.AxesType = AXESTYPENONE;
- pd->pi.RotationOrder = ROTATEZYX;
-
- strcpy(pd->nt,"This is a sample note");
-
- } /* Init3DPL */
-
-
- IFFP Save3DPL(char *filename, AllPlotData *pd)
- {
- LONG file;
- IFFP ifferr = IFF_OKAY;
- GroupContext fileContext, formContext;
-
- if (!(file = Open(filename, MODE_NEWFILE))) {
- printf("Can't open output file\n");
- return (NO_OUTPUT_FILE);
- }
-
- Write(file,"x",1); /* 1.1 so Seek to beginning works ? */
-
- #if DEBUG
- printf("\nSaving...\n");
- #endif
-
- CkErr( OpenWIFF(szNotYetKnown, file, &fileContext) );
- CkErr( StartWGroup(FORM,szNotYetKnown,ID_3DPL,&fileContext,&formContext) );
- CkErr( PutEQUN(&formContext, &(pd->ei)) );
- CkErr( PutDRAW(&formContext, &(pd->dd)) );
- CkErr( PutAXES(&formContext, &(pd->ad)) );
- CkErr( PutTICS(&formContext, &(pd->td)) );
- CkErr( PutTYPE(&formContext, &(pd->pi)) );
- CkErr( PutNOTE(&formContext, pd->nt) );
- CkErr( EndWGroup(&formContext) );
- CkErr( CloseWGroup(&fileContext) );
-
- Close(file);
-
- #if DEBUG
- if (ifferr == IFF_OKAY) {
- printf("3DPL IFF saved\n");
- }
- else {
- printf("Error on save\n");
- }
- #endif
-
- return(ifferr);
-
- } /* Save3DPL */
-
-
- /*
- IFFP Read3DPL(char *filename, AllPlotData *pd)
- {
- LONG file;
- IFFP ifferr = IFF_OKAY;
- ID CkHdr;
- GroupContext fileContext, formContext;
-
- if (!(file = Open(filename, MODE_OLDFILE))) {
- printf("Can't open input file\n");
- return (NO_INPUT_FILE);
- }
-
- #if DEBUG
- printf("\nReading...\n");
- #endif
-
- CkErr( OpenRIFF(file, &fileContext, NULL) );
- CkErr( OpenRGroup(&fileContext,&formContext) );
-
- CkHdr = GetFChunkHdr(&formContext);
-
- while( (CkHdr != END_MARK) && (CkHdr != BAD_IFF) && (ifferr == IFF_OKAY) ) {
-
- switch(CkHdr) {
-
- case ID_EQUN:
- ifferr = IFFReadBytes(sizeof(EqInfo),&formContext,&(pd->ei));
- break;
-
- case ID_DRAW:
- ifferr = IFFReadBytes(sizeof(DrawData),&formContext,&(pd->dd));
- break;
-
- case ID_AXES:
- ifferr = IFFReadBytes(sizeof(AxesData),&formContext,&(pd->ad));
- break;
-
- case ID_TICS:
- ifferr = IFFReadBytes(sizeof(TicData),&formContext,&(pd->td));
- break;
-
- case ID_TYPE:
- ifferr = IFFReadBytes(sizeof(PlotInfo),&formContext,&(pd->pi));
- break;
-
- case ID_NOTE:
- ifferr = IFFReadBytes(NOTELEN,&formContext,pd->nt);
- break;
-
- } /* switch */
-
- CkHdr = GetChunkHdr(&formContext);
-
- } /* while */
-
- CkErr( CloseRGroup(&formContext) );
- CkErr( CloseRGroup(&fileContext) );
-
- Close(file);
-
- #if DEBUG
- if (ifferr == IFF_OKAY) {
- printf("3DPL IFF read\n");
- }
- else {
- printf("Error on read\n");
- }
- #endif
-
- return(ifferr);
-
- } /* Read3DPL */
- */
-
- LONG Read3DPL(STRPTR filename, AllPlotData *pd)
- {
- APTR ifffile;
- ULONG *chunk;
-
- if( !(ifffile = OldOpenIFF(filename)) ) return IffError();
-
- if( !(chunk = (ULONG *)FindChunk(ifffile, ID_EQUN)) ) goto endread;
- memcpy( &(pd->ei), (chunk+2), sizeof(EqInfo) );
-
- if( !(chunk = (ULONG *)FindChunk(ifffile, ID_DRAW)) ) goto endread;
- memcpy( &(pd->dd), (chunk+2), sizeof(DrawData) );
-
- if( !(chunk = (ULONG *)FindChunk(ifffile, ID_AXES)) ) goto endread;
- memcpy( &(pd->ad), (chunk+2), sizeof(AxesData) );
-
- if( !(chunk = (ULONG *)FindChunk(ifffile, ID_TICS)) ) goto endread;
- memcpy( &(pd->td), (chunk+2), sizeof(TicData) );
-
- if( !(chunk = (ULONG *)FindChunk(ifffile, ID_TYPE)) ) goto endread;
- memcpy( &(pd->pi), (chunk+2), sizeof(PlotInfo) );
-
- if( !(chunk = (ULONG *)FindChunk(ifffile, ID_NOTE)) ) goto endread;
- memcpy( &(pd->nt), (chunk+2), NOTELEN );
-
-
- endread:
-
- CloseIFF(ifffile);
- return IffError();
-
- } /* Read3DPL */
-
-
- VOID PrintData(AllPlotData *pd)
- {
- printf("pd->dd.RotationX = %f\n", pd->dd.RotationX);
- printf("pd->dd.RotationY = %f\n", pd->dd.RotationY);
- printf("pd->dd.RotationZ = %f\n", pd->dd.RotationZ);
- printf("pd->dd.OriginX = %d\n", pd->dd.OriginX);
- printf("pd->dd.OriginY = %d\n", pd->dd.OriginY);
- printf("pd->dd.ProjPlane = %f\n", pd->dd.ProjPlane);
- printf("pd->dd.ViewDist = %f\n", pd->dd.ViewDist);
- printf("pd->dd.Scale = %f\n", pd->dd.Scale);
- printf("pd->dd.LineSpacingX = %f\n", pd->dd.LineSpacingX);
- printf("pd->dd.LineSpacingY = %f\n", pd->dd.LineSpacingY);
- printf("pd->dd.PlotXmin = %f\n", pd->dd.PlotXmin);
- printf("pd->dd.PlotXmax = %f\n", pd->dd.PlotXmax);
- printf("pd->dd.PlotYmin = %f\n", pd->dd.PlotYmin);
- printf("pd->dd.PlotYmax = %f\n", pd->dd.PlotYmax);
- printf("pd->dd.PlotPrecisionX = %f\n", pd->dd.PlotPrecisionX);
- printf("pd->dd.PlotPrecisionY = %f\n", pd->dd.PlotPrecisionY);
-
- printf("pd->ad.AxesXmin = %f\n", pd->ad.AxesXmin);
- printf("pd->ad.AxesXmax = %f\n", pd->ad.AxesXmax);
- printf("pd->ad.AxesYmin = %f\n", pd->ad.AxesYmin);
- printf("pd->ad.AxesYmax = %f\n", pd->ad.AxesYmax);
- printf("pd->ad.AxesZmin = %f\n", pd->ad.AxesZmin);
- printf("pd->ad.AxesZmax = %f\n", pd->ad.AxesZmax);
- printf("pd->ad.AxesPrecision = %f\n", pd->ad.AxesPrecision);
-
- printf("pd->td.TicX = %f\n", pd->td.TicX);
- printf("pd->td.TicY = %f\n", pd->td.TicY);
- printf("pd->td.TicZ = %f\n", pd->td.TicZ);
- printf("pd->td.NumTicX = %d\n", pd->td.NumTicX);
- printf("pd->td.NumTicY = %d\n", pd->td.NumTicY);
- printf("pd->td.NumTicZ = %d\n", pd->td.NumTicZ);
-
- printf("pd->ei.DependVar = %c\n", pd->ei.DependVar);
- printf("pd->ei.IndependVar = %s\n", pd->ei.IndependVar);
- printf("pd->ei.Equation = %s\n", pd->ei.Equation);
-
- printf("pd->pi.Surface = %d\n", pd->pi.Surface);
- printf("pd->pi.AxesType = %d\n", pd->pi.AxesType);
- printf("pd->pi.RotationOrder = %d\n", pd->pi.RotationOrder);
-
- printf("pd->nt = %s\n", pd->nt);
-
- } /* PrintData */
-
-
- VOID SetGadgets(struct Gadget *gadget, AllPlotData *pd)
- /* gadget is the Gadget to begin with
- pd is the data to insert */
- {
- struct Gadget *fgadget; /* Copy of first gadget */
- STRPTR gtext;
- STRPTR string;
- LONG *longint;
-
- fgadget = gadget;
-
- while(gadget) { /* loop until no more gadgets */
-
- string = ((struct StringInfo *)(gadget->SpecialInfo))->Buffer;
- longint = &(((struct StringInfo *)(gadget->SpecialInfo))->LongInt);
-
- switch(gadget->GadgetID) {
-
- case SURFACE:
- gtext = gadget->GadgetText->NextText->IText;
- switch(pd->pi.Surface) {
- case XONLY:
- strcpy(gtext, "X Only ");
- break;
- case YONLY:
- strcpy(gtext, "Y Only ");
- break;
- case XANDY:
- strcpy(gtext, "X and Y");
- break;
- default:
- break;
- } /* switch */
- break;
-
- case AXESTYPE:
- gtext = gadget->GadgetText->NextText->IText;
- switch(pd->pi.AxesType) {
- case AXESTYPENONE:
- strcpy(gtext, "None");
- break;
- case AXESTYPESTAR:
- strcpy(gtext, "Star");
- break;
- case AXESTYPEBOX:
- strcpy(gtext, "Box ");
- break;
- default:
- break;
- } /* switch */
- break;
-
- case SWAPXYZ:
- { /* begin block */
- WORD tempTopEdge[3];
- struct Gadget *tempGadget;
-
- /* Obtain three top edges for X, Y, and Z gadgets in order */
- tempTopEdge[0] = RotationX.TopEdge;
- tempTopEdge[1] = RotationY.TopEdge;
- tempTopEdge[2] = RotationZ.TopEdge;
- sqsort(&tempTopEdge[0], 3); /* Sort short integers, ascending */
-
- /* Obtain gadget after X, Y, and Z gadgets */
- tempGadget = RotationX.NextGadget;
- while( (tempGadget == &RotationY) || (tempGadget == &RotationZ) ) {
- tempGadget = tempGadget->NextGadget;
- }
-
- switch(pd->pi.RotationOrder) {
- case ROTATEXYZ:
- /* New positions */
- RotationX.TopEdge = tempTopEdge[0];
- RotationY.TopEdge = tempTopEdge[1];
- RotationZ.TopEdge = tempTopEdge[2];
- /* Order gadgets in list */
- EquationD.NextGadget = &RotationX;
- RotationX.NextGadget = &RotationY;
- RotationY.NextGadget = &RotationZ;
- RotationZ.NextGadget = tempGadget;
- break;
- case ROTATEXZY:
- /* New positions */
- RotationX.TopEdge = tempTopEdge[0];
- RotationZ.TopEdge = tempTopEdge[1];
- RotationY.TopEdge = tempTopEdge[2];
- /* Order gadgets in list */
- EquationD.NextGadget = &RotationX;
- RotationX.NextGadget = &RotationZ;
- RotationZ.NextGadget = &RotationY;
- RotationY.NextGadget = tempGadget;
- break;
- case ROTATEYXZ:
- /* New positions */
- RotationY.TopEdge = tempTopEdge[0];
- RotationX.TopEdge = tempTopEdge[1];
- RotationZ.TopEdge = tempTopEdge[2];
- /* Order gadgets in list */
- EquationD.NextGadget = &RotationY;
- RotationY.NextGadget = &RotationX;
- RotationX.NextGadget = &RotationZ;
- RotationZ.NextGadget = tempGadget;
- break;
- case ROTATEYZX:
- /* New positions */
- RotationY.TopEdge = tempTopEdge[0];
- RotationZ.TopEdge = tempTopEdge[1];
- RotationX.TopEdge = tempTopEdge[2];
- /* Order gadgets in list */
- EquationD.NextGadget = &RotationY;
- RotationY.NextGadget = &RotationZ;
- RotationZ.NextGadget = &RotationX;
- RotationX.NextGadget = tempGadget;
- break;
- case ROTATEZXY:
- /* New positions */
- RotationZ.TopEdge = tempTopEdge[0];
- RotationX.TopEdge = tempTopEdge[1];
- RotationY.TopEdge = tempTopEdge[2];
- /* Order gadgets in list */
- EquationD.NextGadget = &RotationZ;
- RotationZ.NextGadget = &RotationX;
- RotationX.NextGadget = &RotationY;
- RotationY.NextGadget = tempGadget;
- break;
- case ROTATEZYX:
- /* New positions */
- RotationZ.TopEdge = tempTopEdge[0];
- RotationY.TopEdge = tempTopEdge[1];
- RotationX.TopEdge = tempTopEdge[2];
- /* Order gadgets in list */
- EquationD.NextGadget = &RotationZ;
- RotationZ.NextGadget = &RotationY;
- RotationY.NextGadget = &RotationX;
- RotationX.NextGadget = tempGadget;
- break;
- default:
- break;
- } /* switch */
- } /* end block */
- break;
-
- case ROTATIONX:
- *longint = (LONG)(pd->dd.RotationX);
- sprintf(string, "%d", *longint);
- break;
-
- case ROTATIONY:
- *longint = (LONG)(pd->dd.RotationY);
- sprintf(string, "%d", *longint);
- break;
-
- case ROTATIONZ:
- *longint = (LONG)(pd->dd.RotationZ);
- sprintf(string, "%d", *longint);
- break;
-
- case ORIGINX:
- *longint = pd->dd.OriginX;
- sprintf(string, "%d", *longint);
- break;
-
- case ORIGINY:
- *longint = pd->dd.OriginY;
- sprintf(string, "%d", *longint);
- break;
-
- case SIZINGPROJPLANE:
- gcvt(pd->dd.ProjPlane, 10, string);
- break;
-
- case SIZINGVIEWDIST:
- gcvt(pd->dd.ViewDist, 10, string);
- break;
-
- case SIZINGSCALE:
- gcvt(pd->dd.Scale, 10, string);
- break;
-
- case LINESPACINGX:
- gcvt(pd->dd.LineSpacingX, 10, string);
- break;
-
- case LINESPACINGY:
- gcvt(pd->dd.LineSpacingY, 10, string);
- break;
-
- case PLOTSPANXMIN:
- gcvt(pd->dd.PlotXmin, 10, string);
- break;
-
- case PLOTSPANXMAX:
- gcvt(pd->dd.PlotXmax, 10, string);
- break;
-
- case PLOTSPANYMIN:
- gcvt(pd->dd.PlotYmin, 10, string);
- break;
-
- case PLOTSPANYMAX:
- gcvt(pd->dd.PlotYmax, 10, string);
- break;
-
- case PLOTPRECISIONX:
- gcvt(pd->dd.PlotPrecisionX, 10, string);
- break;
-
- case PLOTPRECISIONY:
- gcvt(pd->dd.PlotPrecisionY, 10, string);
- break;
-
- case AXESSPANXMIN:
- gcvt(pd->ad.AxesXmin, 10, string);
- break;
-
- case AXESSPANXMAX:
- gcvt(pd->ad.AxesXmax, 10, string);
- break;
-
- case AXESSPANYMIN:
- gcvt(pd->ad.AxesYmin, 10, string);
- break;
-
- case AXESSPANYMAX:
- gcvt(pd->ad.AxesYmax, 10, string);
- break;
-
- case AXESSPANZMIN:
- gcvt(pd->ad.AxesZmin, 10, string);
- break;
-
- case AXESSPANZMAX:
- gcvt(pd->ad.AxesZmax, 10, string);
- break;
-
- case AXESPRECISION:
- gcvt(pd->ad.AxesPrecision, 10, string);
- break;
-
- case EQUATIONZ:
- strcpy(string, pd->ei.Equation);
- break;
-
- case SETTINGSNOTE:
- strcpy(string, pd->nt);
- break;
-
- } /* switch */
-
- gadget = gadget->NextGadget;
-
- } /* while */
-
- RefreshGadgets(fgadget, setwin, NULL);
-
- } /* SetGadgets */
-