#ifndef PLOT_H
#define PLOT_H

/****************************************************************
*																																*
* Filename : Plot.h																							*
*																																*
*****************************************************************
*																																*
*	Comment : Diese File enthält alle Strukturdefinitionen				*
*						für die Plotlibrary.																*
*						Allgemeine Definitionen werden ebenfalls hier				*
*						deklariert. Diese Includedatei sollte in jeden			*
*						Teil der Library geladen werden. Allgemeine					*
*						Includefiles werden hier nachgeladen wenn sie noch	*
*						nicht definiert sind.																*
*																																*
*												Strukturen															*
*												----------															*
*																																*
*						- Plot	-> Initialisierungsstruktur									*
*						- Kurve -> Kurvenstruktur														*
*																																*
*			Rev : V1.0																								*
*																																*
*	History : V1.0 erstellen dieses Files								14/11/89	*
*																																*
*			Doc :	Plotlibrary User's Guide														*
*																																*
*		 Bugs : keine bekannten																			*
*																																*
*		Autor : Oesch Silvano																				*
*																																*
*		Datum :	14/11/89																						*
*																																*
****************************************************************/

/****************************************************************
*																																*
*	allgemeine Includefiles																				*
*																																*
****************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>


/****************************************************************
*																																*
*	Plotlibrary Includefiles																			*
*																																*
****************************************************************/

#define _PLOT_

#ifndef PLOTLIB_H
#include "PlotLib.h"
#endif

#ifndef LISTL2_H
#include "ListL2.h"
#endif

#ifndef PLERROR_H
#include "Plerror.h"
#endif

/****************************************************************
*																																*
*	Globale Macros																								*
*																																*
****************************************************************/

#ifndef or
#define or ||
#endif

#ifndef and
#define and &&
#endif

#ifndef EOS
#define EOS '\0'
#endif

#ifndef forever
#define forever for(;;)
#endif

#define swap(a,b,c) (c=a,a=b,b=c)


/****************************************************************
*																																*
*	Globale Defines																								*
*																																*
****************************************************************/

#define DEFCOUNT		800							/* Def.grösse eines arrays	*/
#define COUNTSTEP		400							/* Step zum nachladen				*/
#define BUFFERSIZE	80							/* Zeichenbuffergrösse			*/

#define TITELLEN		40							/* längen der verschiedenen	*/
#define AXNAMLEN		20							/* Texte welche für die			*/
#define UNITLEN			10							/* Beschriftung gesetzt			*/
#define CURNAMLEN		20							/* werden können						*/

#define D2MULT			2								/* Anzahl Punkte für die		*/
#define NIVMULT			2								/* verschiedenen						*/
#define D3MULT			3								/* Darstellungen						*/

#define VALSIZE 		9								/* Beschriftungslänge des		*/
																		/* Zahlenwertes							*/
#define RECTSIZE		VALSIZE+3				/* Rechteckgrösse für Niv.	*/

#define STARTCOL		1								/* Startfarbe für Kurven		*/
#define TEXTCOL			1								/* Textfarbe ( weiss )			*/
#define BACKCOL			0								/* Hintergrundfarbe					*/

#define XSIZE				1								/* Textgrösse für X					*/
#define YSIZE				2								/* Textgrösse für Y					*/

#define XTRANS			2								/* Translationsrückgabewert	*/
#define YTRANS			4								/* für ungültige transf.		*/
#define ZTRANS			8

#define STEPNBR			5								/* Anzahl möglicher steps		*/
																		/* für lin. Darstellung			*/
#define STEPVAL			12							/* Anzahl def. Steps für 		*/
																		/* auto. Skalierung					*/

#define TOP_LEFT		0x1							/* Eckdefinitionen für			*/
#define BOT_LEFT		0x2							/* Flächenclipping					*/
#define TOP_RIGHT		0x4
#define BOT_RIGHT		0x8

#define T_T					0x1							/* Text Top									*/
#define T_CY				0x2							/* Text Center							*/
#define T_B					0x4							/* Text Bottom							*/

#define T_L					0x10						/* Text Left								*/
#define T_CX				0x20						/* Text Center							*/
#define T_R					0x40						/* Text Right								*/

#define	C_L					0x1							/* Clipping Line Left				*/
#define	C_R					0x2							/* Clipping Line Right			*/
#define	C_T					0x4							/* Clipping Line Top				*/
#define	C_B					0x8							/* Clipping Line Bottom			*/

#define X_MN				0x01						/* Clipping XMin						*/
#define X_MX				0x02						/* Clipping XMax						*/
#define Y_MN				0x04						/* Clipping YMin						*/
#define Y_MX				0x08						/* Clipping YMax						*/
#define Z_MN				0x10						/* Clipping ZMin						*/
#define Z_MX				0x20						/* Clipping ZMax						*/

#define MAXLST			5								/* Max. Linienmuster				*/
#define SOL_LINE		0								/* volle Linie							*/
#define DOT_LINE		1								/* gepunktete Linie					*/
#define DAS_LINE		2								/* gestrichelte Linie				*/

#define STEPLSIZE		50							/* Länge in % der Stepline	*/
#define GRIDLSIZE		25							/* Länge in % der Gridline	*/
#define BSTEPSIZE		2								/* Länge in % der Stepline	*/
#define BGRIDSIZE		4								/* Länge in % der Gridline	*/
#define CURLSIZE		3*plot->xtext		/* Länge in Punkten der Bes	*/

#define LINSLSTEP		5								/* lineare Unterteilung			*/
#define LOGSLSTEP		9								/* log Unterteilung					*/

#define CROSH				0x01						/* Croshatching							*/
#define HIDDEN			0x02						/* Hiddenline								*/

#define MAXNAMES		8								/* Anzahl *char in plot			*/

/****************************************************************
*																																*
* Plotstruktur																									*
*																																*
****************************************************************/


struct Plot
	{
		int						typ,							/* Darstellung 2D,Niveau,3D	*/
									grid,							/* Spezifikation oben				*/
									clipp,						/* clipping indikator				*/
									autoval,					/* auto. minmax-Anpassung		*/
									xmes,							/* Masstab x-Achse					*/
									ymes,							/* Masstab y-Achse					*/
									zmes,							/* Masstab z-Achse					*/
									phix,							/* Rotationswinkel der			*/
									phiy,							/* Achsen in Grad für				*/
									phiz,							/* 3D Darstellung						*/
									count,						/* Anzahl Kurven						*/
									disp,							/* Displayindikator					*/
									xpic1,						/* linker Bildrand					*/
									xpic2,						/* rechter Bildrand					*/
									xsize,						/* max. horiz. Auflösung		*/
									ypic1,						/* oberer Bildrand					*/
									ypic2,						/* unterer Bildrand					*/
									ysize,						/* max. vert. Auflösung			*/
									maxcol,						/* max. Anzahl Farben				*/
									xtext,						/* Breite eines Zeichens		*/
									ytext,						/* Höhe eines Zeichens			*/
									xout,							/* Start x von Output	in cm	*/
									yout,							/* Start y von Output	in cm	*/
									xlength,					/* Outputlänge x in cm			*/
									ylength,					/* Outputlänge y in cm			*/
									pldisp,						/* Plotter Indikator				*/
									currid,						/* current ID								*/
									xht,							/* horiz. halbe Textgrösse	*/
									xlt,							/* horiz. ganze Textgrösse	*/
									xle,							/* horiz. exp. Textgrösse		*/
									yht,							/* vert. halbe Textgrösse		*/
									ylt,							/* vert. ganze Textgrösse		*/
									yle,							/* vert. exp. Textgrösse		*/
									style,						/* nächstes Füllmuster			*/
									col,							/* nächste Farbe						*/
									cpt,							/* Beschriftungsstart				*/
									d3opt,						/* 3d Displayoptions				*/
									ispare1,
									ispare2,
									ispare3,
									ispare4;

		struct Curve	*first,						/* erste Kurvenstruktur			*/
									*last;						/* letzte Kurvenstruktur		*/

/****************************************************************
*																																*
*	Achtung : Die nächsten Zeilen innerhalb eines Elementes nicht	*
*						verändert werden. Verschiedene Funktionen benötigen	*
*						nur die Startadresse des Elementes und die anderen	*
*						Werte werden dann in der Funktion zugewiesen.				*
*						Als Element wird immer eine Achse bezeichnet.				*
*																																*
****************************************************************/

		DATA					xmin,							/* abs. min. X-Wert					*/
									xmax,							/* abs. max. X-Wert					*/
									xstep,						/* Beschriftungsschritte		*/
									xgridmin,					/* Gitterstart X						*/
									xgridmax,					/* Gitterend X							*/
									xcenter,
									xspare,
									ymin,							/* abs. min. Y-Wert					*/
									ymax,							/* abs. max. Y-Wert					*/
									ystep,						/* Beschriftungsschritte		*/
									ygridmin,					/* Gitterstart Y						*/
									ygridmax,					/* Gitterend Y							*/
									ycenter,
									yspare,
									zmin,							/* abs. min. Z-Wert					*/
									zmax,							/* abs. max. Z-Wert					*/
									zstep,						/* Beschriftungsschritte		*/
									zgridmin,					/* Gitterstart Z						*/
									zgridmax,					/* Gitterend Z							*/
									zcenter,
									zspare;

/****************************************************************
*																																*
*	Achtung : In den nächsten Zeilen dürfen keine anderen Typen		*
*						als char * vorkommen, da in closeplot() alle Werte	*
*						ab titel wenn sie gesetzt sind, freigibt. Die				*
*						Anzahl der Namen ist in MAXNAMES definiert.					*
*																																*
****************************************************************/

		char					*titel,						/* Titel der Graphik				*/
									*xname,						/* x-Achsen Name						*/
									*xunit,						/* xeinheits Titel					*/
									*yname,						/* y-Achsen Name						*/
									*yunit,						/* yeinheits Titel					*/
									*zname,						/* z-Achsen Name						*/
									*zunit,						/* zeinheits Titel					*/
									*outname,					/* Plotterfilename					*/
									*tspare;
	};

/****************************************************************
*																																*
* Kurvenstruktur																								*
*																																*
****************************************************************/

struct Curve
	{
		struct Curve	*next;						/* Zeiger auf nächste Kurve	*/
		char					*titel;						/* Zeiger auf Kurvennamen		*/
		int						id,								/* Kurvennummer							*/
									color,						/* Farb- oder Musterwert		*/
									count,						/* Anzahl Datenelemente			*/
									maxcount;					/* max. Datenelemente				*/
		DATA					xmin,							/* xmin dieser Kurve				*/
									xmax,							/* xmax dieser Kurve				*/
									ymin,							/* ymin dieser Kurve				*/
									ymax,							/* ymax dieser Kurve				*/
									zmin,							/* zmin dieser Kurve				*/
									zmax,							/* zmax dieser Kurve				*/
									*val;							/* Zeiger auf Datenfeld			*/
	};


#endif
