Showit ****** Kurzbeschreibung: ---------------- Mit diesem Programm lassen sich Spektren anschauen. Mit einem Fadenkreuz kann man Teile davon vergrössert 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. Schriftgrösse und einige andere Kleinigkeiten können 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 enthält 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 vollständiges Programmbeispiel ist in [PFISTER.SHOWIT]MINI.CC zu finden, und kann als Vorlage für 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 enthält n weitere Spektren dies waren die unteren 8 Bits, weitere Bits von modus werden für 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 enthält 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) ! für 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 Menüpunkt '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 ausführliches 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.Grösse 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 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 unveränderten y-Werten y-Zoom definiere Ausschnitt mit unveränderten x-Werten go back zeige grösseren 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 zurücknehmen On/Off Punkte des Spektrums ändern Save Points ganzes Spektrum sichern Last Saved letztes gesichertes Spektrum zurücklesen SmoothNr Anzahl Punkte für Glättung mit oder ohne Gewichtung Smooth Glättung ü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 zurücknehmen 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 für Spektrum A einstellen (Voreinstellung: 0) Spektrum B Nummer für 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 chelungslängen und Beschriftungshäufigkeit gefragt. Die Werte in Klammern sind jeweils die momentan eingestellten. Wenn die 'automatische' Einteilung gewählt wird, sucht der Algorythmus nach möglichst runden Zahlen für die Markierungen (auch wenn Anfangs- und Endwerte völlig krumm sind). Buchstabengr. Einstellen der Höhe 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 Grösse 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