		Showit
		******

	Kurzbeschreibung:
	----------------
Mit diesem Programm lassen sich Spektren anschauen. Mit einem Fadenkreuz kann
man Teile davon vergrssert darstellen.  Die Mausposition wird in der
Titelzeile dargestellt, so lassen sich Peaks ausmessen.
Das Bild kann auch durch Menuauswahl ausgedruckt, oder als Postscriptdatei
gespeichert werden. Dabei werden auch die Achsen beschriftet. Schriftgrsse
und einige andere Kleinigkeiten knnen auch eingestellt werden.

	ANWENDUNG:
	---------
C oder C++:
/*
@ BLINK Name,[PFISTER.OBJ]SHOWIT,XMENU
*/
	#include "h:showit.h"
	float xmin,ymin,xmax,ymax,feld[],hilfsfeld[],faktor;
	int npoints,modus;
	showit_voreinst="meinshowit.voreinst";
	yskalierung(&faktor); /* alle y-Werte werden durch faktor geteilt * /
	/* feld enthlt 1.Spektrum, hilfsfeld weitere Spektren bei modus>=4 * /
        showit(&xmin,&ymin,&xmax,&ymax,&npoints,&modus,feld,hilfsfeld);
        /* diese Stelle wird nie erreicht * /
        file_exit() {exit(0);}
        file_load() {}
        file_save() {}
	void user_prog(int *fun,POINTER p1,POINTER p2,POINTER p3,POINTER p4)
	{switch(*fun)	{ case 1: case 2: int_save(p1,p2,p3,p4); break;
			  case 3: case 4: get_punkt(p1,p2); break;
			  case 5: texte_laden(p1,p2,p3); break;
			  case 6: get_delta(p1,p2); break;
			}
	}
	int_save(z,xspitz,yspitz,grenz) float *z,*xspitz,*yspitz,grenz[4]; {}
	get_punkt(x,y) float *x,*y; {}
	texte_laden(titel,xachse,yachse) char **titel,**xachse,**yachse;
		{*titel="Titel"; *xachse="x-Achse"; *yachse="y-Achse";}
	get_delta(z,grenz) float *z,grenz[4]; {}

Ein vollstndiges Programmbeispiel ist in [PFISTER.SHOWIT]MINI.CC zu finden,
und kann als Vorlage fr ein neues Programm verwendet werden.

Bedeutung von modus in Aufruf von showit():
	modus=1		!hfeld wird nicht gebraucht
	modus=2		!hfeld wird fuer Integralmarkierung verwendet
	modus=3		!hfeld fuer Integralmarkierung, mit Autoinitialisierung
	modus=4		!hfeld ist ein zweites Spektrum (falls gesetzt)
	modus=5+n	!hfeld enthlt n weitere Spektren
dies waren die unteren 8 Bits, weitere Bits von modus werden fr folgende
Zusatzfunktionene benutzt:
	0x0100	AUTOPLOTEXIT	das Spektrum wird als Postscriptdatei
				gespeichert, dann file_exit() aufgerufen.


 Benutzung weiterer Unterprogramme:
	lower_window();		//Grafikfenster in Hintergrund legen
	raise_window();		//Grafikfenster wieder in Vordergrund
	new_hfeld(hfeld,&modus);//HFELD und MODUS neu setzen
	refresh();		//neu zeichnen
	float faktor;
	yskalierung(&faktor);	//Daten durch FAKTOR teilen


FORTRAN:
C;AVAX> FOR Name
C;AVAX> BLINK Name,[PFISTER.OBJ]SHOWIT,XMENU
        REAL*4 XMIN,YMIN,XMAX,YMAX,FELD(N),HFELD(N)
        INTEGER*4 NPOINTS,MODUS
	COMMON FELD
	MODUS=1		!HFELD wird nicht gebraucht
	MODUS=2		!HFELD wird fuer Integralmarkierung verwendet
	MODUS=3		!HFELD fuer Integralmarkierung, mit Autoinitialisierung
	MODUS=4		!HFELD ist ein zweites Spektrum (falls gesetzt)
	MODUS=5+n	!HFELD enthlt n weitere Spektren
        CALL SHOWIT(XMIN,YMIN,XMAX,YMAX,NPOINTS,MODUS,FELD,HFELD)
C	diese Stelle wird nie erreicht
        END
        SUBROUTINE FILE_EXIT
C       hier wird weitergefahren wenn SHOWIT fertig ist
        STOP
        SUBROUTINE FILE_LOAD
	COMMON FELD
	...
	CALL SHOW_TOTAL		!ganzes neues Spektrum zeichnen
	RETURN
	END
        SUBROUTINE FILE_SAVE
	COMMON FELD
	...
	SUBROUTINE USER_PROG(FUN,P1,P2,P3,P4)
	INTEGER*4 FUN,P1,P2,P3,P4
	IF(FUN.EQ.1.OR.FUN.EQ.2) THEN
	  CALL INT_SAVE(P1,P2,P3,P4)
	ELSE IF(FUN.EQ.3.OR.FUN.EQ.4) THEN
	  CALL GET_PUNKT(P1,P2)
	ELSE IF(FUN.EQ.5) THEN
	  CALL TEXTE_LADEN(P1,P2,P3)   ! fr Beschriftung beim Ausdrucken
	ELSE IF(FUN.EQ.6) THEN
	  CALL GET_DELTA(P1,P2)
	ENDIF
	RETURN
	END

	SUBROUTINE INT_SAVE(INTEGRALWERT,XSPITZ,YSPITZ,GRENZ)
	REAL*4 INTEGRALWERT,XSPITZ,YSPITZ,GRENZ(4)	!GRENZ={X1,Y1,X2,Y2}
	...
	SUBROUTINE GET_PUNKT(X,Y)
	REAL*4 X,Y
	...
	SUBROUTINE GET_DELTA(DELTAWERT,GRENZ)
	REAL*4 DELTAWERT,GRENZ(4)	!GRENZ={X1,Y1,X2,Y2}
	...
	SUBROUTINE TEXTE_LADEN(TITEL,XACHSE,YACHSE)
	!  Fortran-Version noch unbekannt !

 Bei modus=2, 3 oder 4 kann fuer HFELD auch %VAL(0) eingesetzt werden.
 SHOWIT.UID sollte sich im aktuellen Verzeichnis befinden, andernfalls
 wird '[PFISTER.UID]SHOWIT.UID' verwendet.
 Wenn der Menpunkt 'Plot' verwendet werden soll, sollte vor dem Start die
 Komandodatei '@[PFISTER.IFF]IFF.COM' aufgerufen werden.(z.B. in LOGIN.COM)

 Benutzung weiterer Unterprogramme:
	CALL	LOWER_WINDOW		!Grafikfenster in Hintergrund legen
	CALL	RAISE_WINDOW		!Grafikfenster wieder in Vordergrund
	CALL	NEW_HFELD(HFELD,MODUS)	!HFELD und MODUS neu setzen
	CALL	REFRESH			!neu zeichnen
	CALL	YSKALIERUNG(FAKTOR)	!Daten durch FAKTOR teilen


PASCAL:
(** Uebersetzen mit PK  (neue Version noch nicht getestet)
@ LINK Name,[PFISTER.OBJ]SHOWIT,XMENU,SYS$INPUT/OPT
sys$share:decw$dwtlibshr/share
**)
	TYPE	POINTER = ^INTEGER;
		REALFELD = ARRAY[0..1000] OF REAL;
	PROCEDURE showit(VAR xmin,ymin,xmax,ymax : REAL;
			 VAR npoints,modus : INTEGER;
			 VAR feld,hilfsfeld : REALFELD); EXTERN;
	VAR	xmin,ymin,xmax,ymax : REAL;
		feld,hilfsfeld : REALFELD;
		npoints,modus : INTEGER;
	[GLOBAL] PROCEDURE	file_exit; begin exit(0); end;
	[GLOBAL] PROCEDURE	file_load; begin ; end;
	[GLOBAL] PROCEDURE	file_save; begin ; end;
	[GLOBAL] PROCEDURE	user_prog(fun:INTEGER;p1,p2,p3,p4:POINTER)
	...
        showit(xmin,ymin,xmax,ymax,npoints,modus,feld,hilfsfeld);
        (* diese Stelle wird nie erreicht *)

 Ein ausfhrliches Beispiel ist in [PFISTER.PAS]MINI.PAS zu finden.

 Benutzung weiterer Unterprogramme:
	PROCEDURE LOWER_WINDOW; EXTERN;	{Grafikfenster in Hintergrund legen}
	PROCEDURE RAISE_WINDOW; EXTERN;	{Grafikfenster wieder in Vordergrund}
	PROCEDURE NEW_HFELD(VAR hfeld:REAL; VAR modus:INTEGER); EXTERN;
					{HFELD und MODUS neu setzen}
	PROCEDURE REFRESH; EXTERN;	{neu zeichnen}
	PROCEDURE YSKALIERUNG(faktor:REAL); EXTERN;


	MENUPUNKTE:
	----------

File	 Show	     Edit	  Peak		  Subtra	Diverses
--------------------------------------------------------------------------------
Load	 Total	     undo	  Off		   undo		Packer
Save	 Previous    On/Off	  Integral	   position	x-Achse
Plot ->	 Zoom	     Save Points  Int-Save	   stretch	y-Achse
Exit	 x-Zoom	     Last Saved	  Integrals	   Subtract	Buchst.Grsse
	 y-Zoom      SmoothNr ->  Get Point	   swap		Randbreite
	 go back     Smooth	  Get Points	   exchange	y-Skalierung
	 Frame ->    BlowupFaktor Get Deltas	   subramp	Integ_Methode
	 Text  ->    BlowupShift  Points & Intgs   Spektrum A	Load_Voreinst.
	 Axis Txt->  Blow Up	  Points & Deltas  Spektrum B	Save_Voreinst.
				  Points Search ->
				  Delta Search  ->

SUBMENUS:
Plot: DEC Laser	 zeichnet aktuelles Bild auf Laserdrucker LN03 (neu: PostScript)
      IBM Laser	 auf Postscriptlaserdrucker
      HP PaintJ  auf Farb-Tintenstrahldrucker
      HPGL Datei speichert aktuelles Bild als HPGL-Datei
      IFF Datei	 speichert aktuelles Bild als IFF-Datei
      TELLAGRAF  als TELLAGRAF-Datei   (Verwendet 'TEXTE_LADEN'. Dateiname ist
      EPS Datei	 als POSTSCRIPT-Datei   'BILD.TMP' oder was mit 'DEF PLOTSAVE'
				        angegeben wurde.)
      SETLINEWI  setzt Liniendicke des Spektrums
      SETCOLORS  setzt Farben der Spektren

Show:
Total		zeichnet das ganze Spektrum
Previous	zeichnet vorherigen Ausschnitt
Zoom		definiere Ausschnitt (mit Fadenkreuz)
x-Zoom		definiere Ausschnitt mit unvernderten y-Werten
y-Zoom		definiere Ausschnitt mit unvernderten x-Werten
go back		zeige grsseren Ausschnitt
Frame		Rahmen und x-Achsen-Markierung
Text		Position des Titeltextes bei Postscript-Ausgaben
Axis Text	nderung der Achsenbeschriftung (Voreinst: user_prog(5))
Edit:
undo		letzte nderung zurcknehmen
On/Off		Punkte des Spektrums ndern
Save Points	ganzes Spektrum sichern
Last Saved	letztes gesichertes Spektrum zurcklesen
SmoothNr	Anzahl Punkte fr Glttung mit oder ohne Gewichtung
Smooth		Glttung ber soviele Punkte wie oben eingestellt
BlowupFaktor	Aufblasefaktor
BlowupShift	Verschiebung nach Aufblasen
Blow up		Bereich Aufblasen (Bereichsmarkierung wie mit x-Zoom)
Peak:
Integral	Integrieren, das Ergebnis wird in der Titelzeile gezeigt
Int-Save	Integral-Ergebnis speichern  USER_PROG(1,Ergebnis)
Integrals	Mehrmals integrieren  USER_PROG(2...
Get Point	Angeklickter Punkt speichern  USER_PROG(3...
Get Points	Mehrere Punkte speichern  USER_PROG(4...
Get Deltas	Differenzen ausmessen     USER_PROG(6...
Points & Intgs	linke Maustaste = Zoom, mittlere=GetPoints, rechte=Integrals
Points & Deltas	linke Maustaste = Zoom, mittlere=GetPoints, rechte=GetDeltas
Subtra:
undo		letzte nderung zurcknehmen
position	Position des zweiten Spektrums ndern
stretch		zweites Spektrum in y-Richtung strecken
Subtract	zweites Spektrum vom ersten subtrahieren
swap		Oben-Unten Umkehrung des zweiten Spektrums
exchange	Vertauschen der beiden Spektren
subramp		Subtrahiere Rampe vom ersten Spektrum
Spektrum A	Nummer fr Spektrum A einstellen (Voreinstellung: 0)
Spektrum B	Nummer fr Spektrum B (Voreinstellung: Anzahl Spektren - 1)
Modus:
1...5		gleiche Bedeutung wie Variable MODUS im  SHOWIT()-Aufruf
Diverses:
Packmethode	0=ungepackt  1=6Bits/Byte  2=8Bits/Byte  3=18Bits/3Bytes
		Voreinstellung ist Packmethode 1
x-Achse		Es wird interaktiv nach Einteilung, Anzahl Markierungen, Stri-
y-Achse		chelungslngen und Beschriftungshufigkeit gefragt. Die Werte
		in Klammern sind jeweils die momentan eingestellten. Wenn die
		'automatische' Einteilung gewhlt wird, sucht der Algorythmus
		nach mglichst runden Zahlen fr die Markierungen (auch wenn
		Anfangs- und Endwerte vllig krumm sind).
Buchstabengr.	Einstellen der Hhe der Buchstaben bei Achsenbeschriftung
Randbreite	Ein leerer Rand rings um die Zeichnung. Wird erst beim Aus-
		drucken verwendet.
y-Skalierung	alle y-Werte durch einen Faktor dividieren
		(Der Faktor bezieht sich immer auf die Orginaldaten)
Integral_Meth.	Integralmethode einstellen
Load_Voreinst.	Voreinstellungen von anderer Datei als showit_voreinst laden.
		(Beim Start wird showit_voreinst automatisch geladen)
Save_Voreinst.	Voreinstellungen werden in showit_voreinst gespeichert
		(z.B. xachse yachse randbreite packmethode setlinewidth ...).
		(showit_voreinst ist eine Variable vom Typ (char *), und
		 ist mit "SHOWIT.VOREINSTELLUNGEN" vorbelegt.)
PointsSearch:
DeltaSearch:
Norm		angeklickter Punkt verwenden
Maxima		Maximum in der Umgebung suchen
Minima		Minimum in der Umgebung suchen
SuchRadius	Radius des Bereichs in dem gesucht werden soll
		Die Grsse des Cursors wird entsprechend angepasst


	LOGIN-DEFINITIONEN:
	------------------
Zur Verwendung von Showit sollten in 'LOGIN.COM' folgende Zeilen
eingefuegt werden:
$ @[PFISTER.POST]POST.COM


	Bugs
	----
- Wenn xmin 0 ist und die Schrittweite gleich 1 stimmt die Strichelung auf
  der x-Achse nicht.

- Fehler beim Linken eines alten Fortranprogramms:
	versuche: BLINK Name,[PFISTER.OBJ]SHOWIT,XMENU,XTEKPLOT_FOR
	oder:     BLINK Name,[PFISTER.OBJ]SHOWIT,XMENU,KEYBOARD

