IDL Programming (Book)

238
 Forschungszentrum Jülich GmbH Institut für Chemie und Dynamik der Geosphäre (ICG-I) Zentralinstitut für Angewandte Mathematik (ZAM) Zentrallabor für Elektronik (ZEL) P raxisbe zo gene I DL P rogr amm ie run g  Marlene Busch, Reimar Bauer, Heinz Heer, Michael Wagener Schriften des Forschungszen trums Jülich Reihe Informationstec hnik / Information Technology Band 2 ISSN 1433-5514 ISBN 3-89336-308-4

Transcript of IDL Programming (Book)

Page 1: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 1/238

Forschungszentrum Jülich GmbHInstitut für Chemie und Dynamik der Geosphäre (ICG-I)Zentralinstitut für Angewandte Mathematik (ZAM)Zentrallabor für Elektronik (ZEL)

Prax i sbezogene I DL Prog r am m ierun g  

Marlene Busch, Reimar Bauer, Heinz Heer, Michael Wagener

Schriften des Forschungszentrums JülichReihe Informationstechnik / Information Technology Band 2

ISSN 1433-5514 ISBN 3-89336-308-4

Page 2: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 2/238

 

Herausgeber und Forschungszentrum Jülich GmbHVertrieb: Zentralbibliothek, Verlag

D-52425 Jülich

Telefon (02461) 615368 - Telefax (02461) 61-6103e-mail: [email protected]: http://www.fz-juelich.de/zb/verlag/ 

Copyright: Forschungszentrum Jülich 2008

Schriften des Forschungszentrums JülichReihe Informationstechnik / Information Technology, Band / Volume 2

ISSN 1433-5514ISBN 3-89336-308-4

Vollständig veröffentlicht im InternetPersistent Identifier: urn:nbn:de:0001-00430Resolving URL: http://nbn-resolving.de/urn/resolver.pl?urn=urn:nbn:de:0001-00430

Alle Rechte vorbehalten. Kein Teil des Werks darf in irgendeiner Form ohne schriftlicheGenehmigung des Verlags reproduziert oder unter Verwendung elektronischer Systemeverarbeitet, vervielfältigt oder verbreitet werden.

Page 3: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 3/238

Abstract

This book contains an introduction to the programming language IDL, version 5.5. The IDL

scripting language itself, working within the IDL development environment, and important

visualisation routines are introduced. The book addresses novices to programming as wellas experienced IDL programmers.

The focus of this book is on nuts and bolts problems arising in the natural sciences, and

their solutions. The special characteristics and possibilities of array-oriented programming

are pointed out. Important language elements and hints are highlighted.

More than a hundred complete programming examples, of which several are described in

the book, are accessible at the URL

http://www.fz-juelich.de/vislab/idl-beispiele .

These examples encourage use as a playground for autodidactical IDL studies.

A clear organisation and the use of up-to-date, structured language elements render this

book suitable as a course companion as well as a reference in everyday work with IDL.

Page 4: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 4/238

2

Page 5: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 5/238

i

Vorwort

Im Jahre 1994 wurde seitens einiger Institute des Forschungszentrums Julich, darunter

ZEL, IME, ICG, IPP, der Wunsch geaußert, die Software IDL zentral bereitzustellen.

Das ZAM (Zentralinstitut fur Angewandte Mathematik) fuhrte dann die Verhandlungen

mit der Firma CREASO, dem Verteiber der Software in Deutschland. Ende 1994 konn-

ten dann einige Floating-Lizenzen installiert werden. Die Software-Pflege wurde uber

einen Wartungsvertrag mit der Firma CREASO gesichert. Die Betreuung der Software

einschließlich Installation wurde von Frau Busch im ZAM ubernommen.

Auf Initiative von Heinz Heer und Michael Wagener aus dem ZEL wurde der erste IDL

Kurs geplant. Frau Busch verfaßte ein Kurs-Script. Im Mai 1995 wurde der erste 3-tagige

IDL Kurs von Frau Marlene Busch, Herrn Heinz Heer und Herrn Michael Wagenergehalten. Die Herren Heer und Wagener aus dem ZEL waren bei uns die Pioniere der

IDL Programmierung und konnten ihre praktische Erfahrung in der Programmierung mit

IDL nutzen, um diese als Referenten an interessierte Mitarbeiter des Forschungszentrums

weiterzugeben. Wegen der starken Nachfrage fanden 1995 zwei IDL Kurse statt. Ab 1996

wurde dieser Kurs jahrlich gehalten. Das Kurs-Script wurde von Frau Busch gepflegt

und im Laufe der Jahre der sich entwickelnden IDL-Sprache angepaßt. Die vorliegende

Dokumentation basiert auf IDL 5.5. In der Dokumentation werden IDL spezifische

Befehle und Keywords in Großbuchstaben geschrieben, um diese hervorzuheben.

Herr Bauer aus dem ICG I ist seit dem Jahr 2000 an der Weiterentwicklung des Kurs-

Scripts beteiligt und seit 2001 als Referent beim IDL Kurs des Forschungszentrums tatig.Durch die bisher abgehaltenen Kurse haben etwa 120 Mitarbeiter diese plattformun-

abhangige interaktive Programmiersprache kennen und schatzen gelernt.

Ein Dank von uns gebuhrt der Firma CREASO, die uns Testlizenzen fur den Kurs

bereitstellen. Damit ist gewahrleistet, das wahrend der Kurszeit keine IDL-Lizenzen fur

den laufenden Betrieb verloren gehen.

Das Kursmaterial hat nun einen Umfang erreicht, den wir in dieser Form einem großeren

Kreis als Nachschlagewerk zur Verfugung stellen wollen. Daher wurde es von Frau

Marlene Busch und Herrn Reimar Bauer uberarbeitet, damit es als Buch erscheinen

konnte.

Die erarbeiteten Beispiele, die Sie unter der URL

http://www.fz-juelich.de/vislab/idl-beispiele

finden, stammen aus verschiedenen Kursen des Forschungszentrums (ICG, ZAM, ZEL)

und der Firma CREASO.

Marlene Busch (ZAM)

Reimar Bauer (ICG I)

Heinz Heer, Michael Wagener (ZEL)

Juni 2002

Version 1

Page 6: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 6/238

ii

Page 7: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 7/238

Inhaltsverzeichnis

1 Einleitung 1

2 Konfiguration 3

2.1 Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.1 Beispiel: Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . 42.1.2 Automatisches Starten eines Programms . . . . . . . . . . . . . . 5

3 Beschreibung der Applikationen 7

3.1 idlde (Unix, Windows) . . . . . . . . . . . . . . . . . . . . . . . . 7

3.1.1 Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.1.2 Editieren, Kompilieren und Fehlersuche in Programmen . . . . . 10

3.2 IDL (Unix) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2.1 Ausfuhrbare Kommandos, Kompilieren und Fehlersuche . . . . . 13

3.3 Runtime (Unix, Windows) . . . . . . . . . . . . . . . . . . . . . . 143.4 IDLHELP (Unix, Windows) . . . . . . . . . . . . . . . . . . . . . 15

3.4.1 Arbeiten mit der IDL Online Hilfe . . . . . . . . . . . . . . . . . 15

4 Grundlagen 17

4.1 Auffinden von Programmen . . . . . . . . . . . . . . . . . . . . . . 17

4.2 Syntax der Aufrufe von IDL Programmen . . . . . . . . . . . . . . 18

4.2.1 Positionale Parameter . . . . . . . . . . . . . . . . . . . . . . . . 19

4.2.2 Keyword Parameter . . . . . . . . . . . . . . . . . . . . . . . . . 19

4.3 Zeichen mit spezieller Bedeutung . . . . . . . . . . . . . . . . . . . 204.4 System-Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

4.4.1 Ubersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

4.4.2 Informationen uber Systemvariablen . . . . . . . . . . . . . . . . 21

5 Datenstrukturen 23

5.1 Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

5.1.1 Konversionsroutinen . . . . . . . . . . . . . . . . . . . . . . . . 25

5.2 Skalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

5.2.1 Information uber Skalare mit SIZE . . . . . . . . . . . . . . . . . 255.3 Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

iii

Page 8: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 8/238

iv INHALTSVERZEICHNIS

5.3.1 Anlegen von Vektoren und Arrays . . . . . . . . . . . . . . . . . 26

5.3.2 Information uber Felder mit SIZE . . . . . . . . . . . . . . . . . 28

5.3.3 Generierung von Arrays mit REPLICATE . . . . . . . . . . . . . 28

5.3.4 Arrayindizierung mit [ ] . . . . . . . . . . . . . . . . . . . . . . 28

5.3.5 Arbeiten mit Feldern - REFORM Befehl . . . . . . . . . . . . . . 295.3.6 Arbeiten mit Feldern - TRANSPOSE Befehl . . . . . . . . . . . 29

5.3.7 Verknupfung von Feldern . . . . . . . . . . . . . . . . . . . . . 29

5.3.8 Beispiele zum Arbeiten mit Feldern . . . . . . . . . . . . . . . . 30

5.4 Zeichenketten (Strings) . . . . . . . . . . . . . . . . . . . . . . . . 31

5.4.1 Operationen auf Zeichenketten . . . . . . . . . . . . . . . . . . . 31

5.4.2 Konversion von Strings in Zahlen . . . . . . . . . . . . . . . . . 32

5.4.3 Zeichenkette mit Leerzeichen anlegen . . . . . . . . . . . . . . . 32

5.5 Strukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

5.5.1 Definition einer unbenannten (anonymen) Struktur . . . . . . . . 34

5.5.2 Definition einer benannten Struktur . . . . . . . . . . . . . . . . 36

5.5.3 REPLICATE bei Strukturen . . . . . . . . . . . . . . . . . . . . 37

5.5.4 Informationen zum Strukturaufbau . . . . . . . . . . . . . . . . . 37

5.6 Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5.6.1 Anwendungen von Pointern . . . . . . . . . . . . . . . . . . . . 38

5.6.2 Funktionen zur Bearbeitung von Pointern . . . . . . . . . . . . . 39

5.6.3 Beispiele mit Pointern . . . . . . . . . . . . . . . . . . . . . . . 40

5.6.4 Empty Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.6.5 Gultige Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

5.6.6 Datenbereich mit Pointer belegen . . . . . . . . . . . . . . . . . 41

5.6.7 Pointer auf eine Struktur . . . . . . . . . . . . . . . . . . . . . . 42

5.6.8 Pointer in einer Struktur . . . . . . . . . . . . . . . . . . . . . . 42

5.6.9 Pointer auf eine Struktur und Pointer in der Struktur . . . . . . . 43

5.6.10 Pointer freigeben . . . . . . . . . . . . . . . . . . . . . . . . . . 44

5.6.11 HEAP GC Heap garbage collection . . . . . . . . . . . . . . . . 44

5.6.12 Beispiel mit Pointern . . . . . . . . . . . . . . . . . . . . . . . . 45

5.6.13 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

6 Arbeiten mit Datenstrukturen 49

6.1 IDL Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

6.2 Wertzuweisung bei Variablen . . . . . . . . . . . . . . . . . . . . . 50

6.2.1 Wertzuweisung bei mehrdimensionalen Feldern . . . . . . . . . . 50

6.3 Warnung vor Integer-Overflow . . . . . . . . . . . . . . . . . . . . 51

6.4 Speicherplatzverwaltung . . . . . . . . . . . . . . . . . . . . . . . 51

6.5 Loschen von Variablen . . . . . . . . . . . . . . . . . . . . . . . . 52

6.6 Effizientes Arbeiten mit Feldern . . . . . . . . . . . . . . . . . . . 536.6.1 Vorteil von Feld-Operationen . . . . . . . . . . . . . . . . . . . . 53

Page 9: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 9/238

INHALTSVERZEICHNIS v

6.6.2 Geschickte Klammerung . . . . . . . . . . . . . . . . . . . . . . 54

6.7 Einstellung von Compiler Optionen . . . . . . . . . . . . . . . . . 54

6.8 Filtern von Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

6.8.1 WHERE-Funktion . . . . . . . . . . . . . . . . . . . . . . . . . 55

6.8.2 Verwendung der Funktionen MIN, MAX, SORT und UNIQ . . . 556.8.2.1 SORT . . . . . . . . . . . . . . . . . . . . . . . . . . 55

6.8.2.2 MIN und MAX . . . . . . . . . . . . . . . . . . . . . 56

6.8.2.3 UNIQ . . . . . . . . . . . . . . . . . . . . . . . . . . 56

6.9 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

7 Einbettung ins Betriebssytem 59

7.1 Umgebungs-Variablen . . . . . . . . . . . . . . . . . . . . . . . . . 59

7.1.1 Umgebungs-Variablen des Betriebssystems . . . . . . . . . . . . 59

7.2 Wechsel zum Betriebssystem (Unix, Windows) . . . . . . . . . . . 60

8 Hilfe, Sicherung 61

8.1 Die Hilfe-Routine von IDL . . . . . . . . . . . . . . . . . . . . . . 61

8.2 Save und Restore einer IDL-Sitzung, IDL- Binary . . . . . . . . . . 62

9 Definitionen zur Datenausgabe 65

9.1 Koordinatensysteme . . . . . . . . . . . . . . . . . . . . . . . . . . 65

9.2 Zeichensatze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

9.2.1 Auswahl eines Fonts . . . . . . . . . . . . . . . . . . . . . . . . 679.3 Farbtabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

9.3.1 Laden von Farbtabellen . . . . . . . . . . . . . . . . . . . . . . . 68

9.3.2 Arbeiten mit Farben . . . . . . . . . . . . . . . . . . . . . . . . 69

9.4 Steuerung der Ausgabe und Ausgabegerate . . . . . . . . . . . . . . 70

9.4.1 Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

9.4.2 Ausgabe mehrerer Bilder . . . . . . . . . . . . . . . . . . . . . . 71

9.4.3 Positionieren von Bildern . . . . . . . . . . . . . . . . . . . . . 71

9.4.3.1 Aufteilung der Zeichenflache in gleich große Teile . . . 72

9.4.3.2 Keyword POSITION und System-Variable !P.POSITION 739.4.4 Bildschirm Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 74

9.4.5 Benutzung des Z-Buffers . . . . . . . . . . . . . . . . . . . . . . 75

9.4.6 Beispiel: Z-Buffer, SURFACE und CONTOUR . . . . . . . . . . 76

9.4.7 PostScript Ausgabe - Drucken . . . . . . . . . . . . . . . . . . . 77

9.4.8 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

10 Programme zur Anwendungs-Darstellung 81

10.1 Uberblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

10.1.1 Achsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8210.1.2 Steuerungen zur Zeichenflache . . . . . . . . . . . . . . . . . . . 83

Page 10: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 10/238

vi INHALTSVERZEICHNIS

10.1.3 Routinen zum Beschriften oder Markieren . . . . . . . . . . . . . 83

10.2 XY-Darstellungen mit PLOT . . . . . . . . . . . . . . . . . . . . . 84

10.2.1 Ausgabe von Daten als Linien-Plots . . . . . . . . . . . . . . . . 84

10.2.2 Plot bei einem Argument . . . . . . . . . . . . . . . . . . . . . . 84

10.2.3 Plot mit zweitem Argument (dependent data) . . . . . . . . . . . 84

10.2.4 Plot von Datenreihen . . . . . . . . . . . . . . . . . . . . . . . . 85

10.2.5 Beispiele mit PLOT . . . . . . . . . . . . . . . . . . . . . . . . 86

10.2.6 Plot mit logarithmischer Achseneinteilung . . . . . . . . . . . . . 90

10.2.7 Balkendiagramme . . . . . . . . . . . . . . . . . . . . . . . . . 90

10.2.8 Fehlerbalken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

10.2.9 Polarplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

10.2.10 Scatter-Plot mit Zufallszahlen . . . . . . . . . . . . . . . . . . . 92

10.2.11 Plot mit Text in unterschiedlichen Farben . . . . . . . . . . . . . 9310.3 Flachen- und Hohenlinien- Darstellungen . . . . . . . . . . . . . . 94

10.3.1 Netzlinien mit SURFACE . . . . . . . . . . . . . . . . . . . . . 94

10.3.2 Hohenlinien mit CONTOUR . . . . . . . . . . . . . . . . . . . . 97

10.3.3 Schattierte Oberflachendarstellung . . . . . . . . . . . . . . . . . 98

10.3.4 Oberflache mit beliebigem Datensatz uberlagern . . . . . . . . . 99

10.3.5 Hohenlinien-Plot im 3D-Raum . . . . . . . . . . . . . . . . . . . 100

10.4 3D Transformationen . . . . . . . . . . . . . . . . . . . . . . . . . 101

10.4.1 3D Transformationsmatrix mit SURFACE . . . . . . . . . . . . . 101

10.4.2 3D Transformationsmatrix mit SURFR . . . . . . . . . . . . . . 102

10.4.3 3D Transformationsmatrix mit SCALE3 und T3D . . . . . . . . . 103

10.5 Karten-Projektionen . . . . . . . . . . . . . . . . . . . . . . . . . . 104

10.5.1 MAP SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

10.5.2 Kombination von Karte mit Bilddatei . . . . . . . . . . . . . . . 105

10.5.3 Kombination von Karte und Hohenlinienplot . . . . . . . . . . . 106

10.5.4 Beschriftung der Karte mit Text und Symbolen . . . . . . . . . . 106

10.6 Glatten von zufalligen oder irregularen Daten . . . . . . . . . . . . 107

10.7 ISO Oberflachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

10.7.1 Das SLICER3 Tool . . . . . . . . . . . . . . . . . . . . . . . . . 109

10.8 Animation von Daten . . . . . . . . . . . . . . . . . . . . . . . . . 111

10.9 Arbeiten mit dem Cursor . . . . . . . . . . . . . . . . . . . . . . . 112

10.10 Zusammenfassung der Darstellungs-Routinen . . . . . . . . . . . . 113

10.10.1 allgemeine Routinen . . . . . . . . . . . . . . . . . . . . . . . . 113

10.10.2 eindimensionale Plotroutinen . . . . . . . . . . . . . . . . . . . 113

10.10.3 mehrdimensionale Plotroutinen . . . . . . . . . . . . . . . . . . 113

10.11 IDL-Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . 11410.11.1 Ubungen: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Page 11: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 11/238

INHALTSVERZEICHNIS vii

11 Bildverarbeitung 117

11.1 Lesen eines Bildes . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

11.2 Kontrastverscharfung . . . . . . . . . . . . . . . . . . . . . . . . . 118

11.3 Verandern der Bildgroße . . . . . . . . . . . . . . . . . . . . . . . 118

11.4 Darstellung eines Bildes . . . . . . . . . . . . . . . . . . . . . . . 11911.5 Positionieren des Bildes . . . . . . . . . . . . . . . . . . . . . . . . 120

11.6 Bildanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

11.6.1 Arbeiten mit Basisfiltern . . . . . . . . . . . . . . . . . . . . . . 121

11.6.2 Auswahlen und Verarbeiten einer Region . . . . . . . . . . . . . 123

12 Lesen und Schreiben von Daten 127

12.1 Offnen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . 127

12.2 Beispiele fur das Offnen und Schließen von Dateien . . . . . . . . . 128

12.3 Lesen und Schreiben von Daten . . . . . . . . . . . . . . . . . . . 129

12.3.1 Formale Vorschriften beim Lesen . . . . . . . . . . . . . . . . . 130

12.3.2 Lesen (explizit) formatierter Daten . . . . . . . . . . . . . . . . . 131

12.3.3 Lesen und Schreiben unformatierter Daten . . . . . . . . . . . . 132

12.3.4 Lesen von unformatierten Daten mit assozierten Variablen . . . . 132

12.4 Arbeiten mit Dateien . . . . . . . . . . . . . . . . . . . . . . . . . 133

12.5 Operationen auf Dateien/Verzeichnissen ohne Wechsel zum Betriebs-

sytem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

12.6 Automatisierte Eingabe eines ASCII-Datensatzes . . . . . . . . . . 135

12.6.1 Zusammenfassung gebrauchlicher Lese- uns Schreibroutinen . . . 136

12.7 Beispiel: Lesen und Schreiben . . . . . . . . . . . . . . . . . . . . 137

13 Programmierung und Kompilation 139

13.1 Batchverarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

13.2 Formales zu IDL-Programmen . . . . . . . . . . . . . . . . . . . . 140

13.3 Definition einer Prozedur oder Funktion . . . . . . . . . . . . . . . 140

13.4 Aufruf einer Prozedur oder Funktion . . . . . . . . . . . . . . . . . 141

13.5 Regeln fur die Namensgebung von IDL Programmen . . . . . . . . 141

13.6 Kompilieren/Ausfuhren einer Prozedur/Funktion . . . . . . . . . . 142

13.7 Beispiele fur IDL Programme . . . . . . . . . . . . . . . . . . . . . 143

13.8 Speicherverwaltung von Daten . . . . . . . . . . . . . . . . . . . . 144

13.8.1 Ubergabe von Parametern an Prozeduren und Funktionen . . . . . 144

13.8.2 Lokale Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

13.8.3 Regeln fur Parameter . . . . . . . . . . . . . . . . . . . . . . . . 145

13.9 Beispiele: Aufruf von Funktionen und Prozeduren . . . . . . . . . . 146

13.10 FORWARD FUNCTION Funktion . . . . . . . . . . . . . . . . . . 147

13.11 Kontroll-Statements . . . . . . . . . . . . . . . . . . . . . . . . . . 14913.12 Uberprufung der Argumente und Keywords . . . . . . . . . . . . . 152

Page 12: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 12/238

viii INHALTSVERZEICHNIS

13.13 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

13.14 Durchschleusen zusatzlicher Argumente . . . . . . . . . . . . . . . 154

13.15 COMMON Blocke . . . . . . . . . . . . . . . . . . . . . . . . . . 155

13.16 Dynamische Erweiterung von Programmen . . . . . . . . . . . . . 156

13.17 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

14 Fehlersuche 161

15 Programmanalyse 163

16 Error Handling 165

16.1 Abfrage des Fehlerzustandes . . . . . . . . . . . . . . . . . . . . . 166

16.2 Umleiten von Fehlern . . . . . . . . . . . . . . . . . . . . . . . . . 167

16.3 Beispiel zu CATCH . . . . . . . . . . . . . . . . . . . . . . . . . . 168

16.4 Ausgabe von Fehlernachrichten . . . . . . . . . . . . . . . . . . . . 169

17 Widgets 171

17.1 GUI Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

17.2 Typen von Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . 172

17.3 Erstellung von Menu Widgets . . . . . . . . . . . . . . . . . . . . . 172

17.4 Gestaltung des Layouts eines Widgets . . . . . . . . . . . . . . . . 173

17.5 Wie funktioniert eine Oberflache? . . . . . . . . . . . . . . . . . . 175

17.6 Kontrolle uber die Widgets . . . . . . . . . . . . . . . . . . . . . . 175

17.7 Registrierung der Widgets mit dem XMANAGER . . . . . . . . . . 176

17.8 Schreiben eines kleinen Widget Programms . . . . . . . . . . . . . 177

17.8.1 Initialisierung der Event-Loop . . . . . . . . . . . . . . . . . . . 177

17.8.2 Ubergabe der Event Struktur an den Event-Handler . . . . . . . . 178

17.8.3 Aufbau der Event Struktur fur WIDGET BUTTON . . . . . . . . 179

17.9 Ubergabe von Informationen zwischen Widgets . . . . . . . . . . . 179

17.10 Widgetprogrammierung im Wandel von IDL . . . . . . . . . . . . . 180

17.10.1 Beispiel: Widget 1 . . . . . . . . . . . . . . . . . . . . . . . . . 181

17.10.2 Beispiel: Widget 2 . . . . . . . . . . . . . . . . . . . . . . . . . 18217.10.3 Beispiel: Widget 3 . . . . . . . . . . . . . . . . . . . . . . . . . 183

17.10.4 Beispiel: Widget 4 . . . . . . . . . . . . . . . . . . . . . . . . . 184

17.10.5 Beispiel: Widget 5 . . . . . . . . . . . . . . . . . . . . . . . . . 185

17.11 Widget Programme fur Runtime-Laufe . . . . . . . . . . . . . . . . 186

17.12 Compound Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . 187

18 Verknupfung mit anderer Software 191

18.1 SPAWN Kommando . . . . . . . . . . . . . . . . . . . . . . . . . 191

18.2 SPAWN Kommando bei einem C Programm . . . . . . . . . . . . . 19218.3 Aufruf von Fortran aus IDL: CALL EXTERNAL . . . . . . . . . . 193

Page 13: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 13/238

INHALTSVERZEICHNIS ix

A Informationen 195

A.1 Informationen zu IDL . . . . . . . . . . . . . . . . . . . . . . . . . 195

A.2 Publikationen und Aktivitaten zu IDL im FZJ . . . . . . . . . . . . 197

A.3 Wichtige URL’s zu IDL . . . . . . . . . . . . . . . . . . . . . . . . 198

A.4 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

B L osungen 201

B.1 Losungen zu Kapitel: Datenstrukturen . . . . . . . . . . . . . . . . 201

B.2 Losungen zu Kapitel: Arbeiten mit Datenstrukturen . . . . . . . . . 203

B.3 Losungen zu Kapitel: Definitionen zur Datenausgabe . . . . . . . . 205

B.4 Losungen zu Kapitel: Programme zur Anwendungs-Darstellung . . 206

B.5 Losungen zu Kapitel: Programmierung und Kompi-

lation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

Page 14: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 14/238

x INHALTSVERZEICHNIS

Page 15: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 15/238

Verzeichnis der Abbildungen

3.1 idlde: Aufbau der Oberflache . . . . . . . . . . . . . . . . . . . . . 8

3.2 IDL Programm: Einfacher XY-Plot . . . . . . . . . . . . . . . . . . 11

3.3 IDL Programm: einfacher XY-Plot mit Text . . . . . . . . . . . . . 12

9.1 Definitionen zur Darstellung: Beispiel mit TEK COLOR . . . . . . 68

9.2 Definitionen zur Datenausgabe: !P.MULTI . . . . . . . . . . . . . . 729.3 Definitionen zur Datenanalyse: Keyword POSITION . . . . . . . . 73

9.4 Definitionen zur Datenausgabe: Z-Buffer . . . . . . . . . . . . . . . 76

9.5 Definitionen zur Datenausgabe: Beispiel mit Legende . . . . . . . . 79

10.1 Programme zur Darstellung: XY Plot . . . . . . . . . . . . . . . . . 86

10.2 Programme zur Darstellung: mehrere Y-Achsen . . . . . . . . . . . 87

10.3 Programme zur Darstellung: PLOT und zusatzlicher Text . . . . . . 89

10.4 Programme zur Darstellung: Beschriftung in der Mitte des Bildes . . 89

10.5 Programme zur Darstellung: Logarithmischer PLOT . . . . . . . . . 90

10.6 Programme zur Darstellung: Fehlerbalken . . . . . . . . . . . . . . 91

10.7 Programme zur Darstellung: Polarplot . . . . . . . . . . . . . . . . 91

10.8 Programme zur Darstellung: Scatter-Plot mit Zufallszahlen . . . . . 92

10.9 Programme zur Darstellung: XYOUTS in unterschiedlichen Farben 93

10.10 Programme zur Darstellung: SURFACE . . . . . . . . . . . . . . . 94

10.11 Programme zur Darstellung: Behandlung von missing value . . . . 96

10.12 Programme zur Darstellung: CONTOUR . . . . . . . . . . . . . . . 97

10.13 Programme zur Darstellung: C Keywords bei CONTOUR . . . . . 98

10.14 Programme zur Darstellung: SHADE SURF . . . . . . . . . . . . . 99

10.15 Programme zur Darstellung: CONTOUR im 3D Raum . . . . . . . 100

10.16 Programme zur Darstellung: Probleme ohne Z-Buffer . . . . . . . . 100

10.17 Programme zur Darstellung: SURFACE 3D Transformationen . . . 101

10.18 Programme zur darstellung: SURFR 3D Transformationen . . . . . 102

10.19 Programme zur Darstellung: SCALE3 3D Transformationen . . . . 103

10.20 Programme zur Darstellung: MAP SET . . . . . . . . . . . . . . . 105

10.21 Programme zur Darstellung: CONTOUR und MAP SET . . . . . . 106

10.22 Programme zur Darstellung: TRIGRID . . . . . . . . . . . . . . . . 10710.23 Programme zur Darstellung: ISO Oberflachen . . . . . . . . . . . . 108

xi

Page 16: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 16/238

xii VERZEICHNIS DER ABBILDUNGEN

10.24 Programme zur Darstellung: SLICER3-Tool im SLICE-Modus . . . 109

10.25 Programme zur Darstellung: SLICER3-Tool im Surface-Modus . . . 110

10.26 Programme zur Darstellung: SHOW3 . . . . . . . . . . . . . . . . 114

11.1 Bildverarbeitung: TVSCL . . . . . . . . . . . . . . . . . . . . . . . 119

11.2 Bildverarbeitung: TV . . . . . . . . . . . . . . . . . . . . . . . . . 120

11.3 Bildverarbeitung: Basisfilter . . . . . . . . . . . . . . . . . . . . . 122

11.4 Bildanalyse: Auswahlen einer Region . . . . . . . . . . . . . . . . 123

11.5 Bildanalyse: Auswahlen einer Region . . . . . . . . . . . . . . . . 125

16.1 Error Handling: CATCH . . . . . . . . . . . . . . . . . . . . . . . 168

17.1 Widgets: Compound Widgets, cw switch . . . . . . . . . . . . . . . 187

Page 17: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 17/238

Verzeichnis der Tabellen

4.1 Zeichen mit spezieller Bedeutung . . . . . . . . . . . . . . . . . . . . . 20

5.1 Datenstrukturen: Datentypen . . . . . . . . . . . . . . . . . . . . . . . . 24

5.2 Datenstrukturen: Operationen auf Zeichenketten . . . . . . . . . . . . . . 31

9.1 Definitionen zur Datenausgabe: Auswahl eines Fonts . . . . . . . . . . . 66

9.2 Definitionen zur Datenausgabe: Positionieren von Zeichen . . . . . . . . 66

10.1 Programme zur Darstellung: Keywords zur Achsneanpaßung . . . . . . . 82

10.2 Programme zur Darstellung: Steuerungen zur Zeichenflache . . . . . . . 83

10.3 Programme zur Darstellung: Routinen zum Beschriften oder Markieren . 83

10.4 Programme zur Darstellung: Zusammenfassung allgemeiner Routinen . . 113

10.5 Programme zur Darstellung: Zusammenfassung mehrdimensionaler Plot-

routinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

12.1 Lesen und Schreiben von Daten: Offnen . . . . . . . . . . . . . . . . . . 12712.2 Lesen und Schreiben von Daten: Lesen und Schreiben von Daten . . . . . 129

12.3 Lesen und Schreiben von Daten: Zusammenfassung von Lese- und Schrei-

broutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

xiii

Page 18: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 18/238

xiv VERZEICHNIS DER TABELLEN

Page 19: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 19/238

Verzeichnis der Beispiele

2.1 Konfiguration: Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . . 4

3.1 Beschreibung der Applikationen: Runtime . . . . . . . . . . . . . . . . . 14

6.1 Datenstrukturen: Vorteil von Feld-Operationen . . . . . . . . . . . . . . 53

9.1 Definitionen zur Datenausgabe: Z-Buffer . . . . . . . . . . . . . . . . . . 76

9.2 Definitionen zur Datenausgabe: PostScript-Ausgabe . . . . . . . . . . . . 77

9.3 Definitionen zur Darstellung: optionale Postscriptdatei . . . . . . . . . . 78

10.1 Programme zur Darstellung: Plot von Datenreihen . . . . . . . . . . . . . 85

10.2 Programme zur Darstellung: XYOUTS in unterschiedlichen Farben . . . 93

11.1 Bildanalyse: Verarbeiten einer Region . . . . . . . . . . . . . . . . . . . 124

12.1 Arbeiten mit Dateien: READ ASCII Template . . . . . . . . . . . . . . . 136

12.2 Lesen und Schreiben: Programm zum Lesen und Schreiben . . . . . . . . 137

13.1 Programmierung und Kompilation: ohne FORWARD FUNCTION . . . . 147

13.2 Programmierung und Kompilation: mit FORWARD FUNCTION . . . . . 147

13.3 Programmierung und Kompilation:¨

Uberprufung der Parameter . . . . . . 15313.4 Programmierung und Kompilation: COMMON-Blocke . . . . . . . . . . 155

16.1 Error Handling: CATCH . . . . . . . . . . . . . . . . . . . . . . . . . . 168

17.1 Widgets: Layout eines Widgets . . . . . . . . . . . . . . . . . . . . . . . 174

17.2 widgets: kleines widget Programm . . . . . . . . . . . . . . . . . . . . . 177

17.3 widgets: Event Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

17.4 Widgets: Dieses Widget wird in Beispiel 1 bis 5 bearbeitet . . . . . . . . 180

17.5 Widgets: wid1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

17.6 Widgets: wid2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

17.7 Widgets: wid3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18317.8 Widgets: wid4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

17.9 Widgets: wid5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

17.10Widgets: Compound Widgets, test cw . . . . . . . . . . . . . . . . . . . 187

17.11Widgets: Compound Widgets, cw switch . . . . . . . . . . . . . . . . . . 188

xv

Page 20: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 20/238

xvi VERZEICHNIS DER BEISPIELE

Page 21: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 21/238

Kapitel 1

Einleitung

IDL (Interactive Data Language) ist ein Lizenzprogramm der Firma RSI, Research

Systems Inc., Boulder, Colorado.

In den folgenden Kapiteln werden wichtige Merkmale der Datenverarbeitungs-Sprache

IDL aufgezeigt.

  Strukturierte Sprache

  Interaktives, interpretatives Arbeiten

  Applikationen: Programme mit Funktionen, Prozeduren

  Plattformunabhangig

IDL ist portabel: UNIX, VMS, Windows, LINUX, Macintosh

 

Arrayorientierte Sprache  Pointer

  Flexible Input/Output Moglichkeiten

  XY Plotting, 2D Plotting, mehrdimensionales Plotting, Volumen Visualisierung,

Bildverarbeitung und Bildanalyse, Animation

  IDL Widgets, Erstellung von Benutzeroberflachen

  Dynamisches Linken von FORTRAN mit CALL EXTERNAL.

Nachfolgende Themen werden in diesem Buch nicht behandelt.  SQL Datenbankanbindung  Wavelets  Numerical Recipes  Objekte und Objekt-orientierte Graphik   Dynamische Link-Module mit FORTRAN oder C.

1

Page 22: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 22/238

2 KAPITEL 1. EINLEITUNG

Page 23: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 23/238

Kapitel 2

Konfiguration

Die Einstellungen zur IDL Arbeitsumgebung konnen konfiguriert werden. Gemeint sind

Definitionen, die beim Starten von IDL durchgefuhrt werden.

Einige Beispiele sind: (Fettgedrucktes sehr wichtig!):  Der Suchpfad (!PATH), ein Beispiel zur Definition von !PATH folgt auf Seite 4.  Backingstore von IDL behandeln (DEVICE,RETAIN=2)  True Color in Direct Color (256 Farben) (DEVICE,DECOMPOSED=0)  IDL-Systemvariablen oder eigene Systemvariablen  Windowgroße

Diese Definitionen sind uber eine Start-Up Datei moglich. IDL sieht zwei Moglichkeiten

vor, eine Start-Up Datei zu definieren.

Man kann zum einen in der Entwicklungsumgebung idlde in dem dafur vorgesehenen

Menu Preferences Einstellungen vornehmen. Zum anderen werden Einstellungen automa-tisiert durchgefuhrt, wenn eine Start-Up Datei mittels einer Environment-Variablen ange-

boten wird. Diese Technik wird im nachfolgenden beschrieben. Ein Vorteil einer Start-Up

Datei ist, daß man diese auch zentral fur eine Arbeitsgruppe definieren kann.

2.1 Start-Up Datei

Die Datei, die als Start-Up Datei genommen werden soll, wird uber die Environment-

Variable IDL STARTUP definiert. Dabei ist eine volle Pfad-Angabe mit Angabe des

File-Namens der Start-Up Datei notwendig.

Korn Shell:

export IDL_STARTUP=$HOME/idldir/setup_file

Windows:

set IDL_STARTUP=C:\idldir\setup_file

Fur das Arbeiten unter einem Unix-Betriebssystem gilt folgendes.

Wenn man mit dem Command Line Interface arbeitet, setzt man die Environment-Variable

IDL STARTUP im .profile.

Wenn man mit idlde arbeitet, setzt man den Bezug zu der Startup-Datei uber

den Menupunkt Preferences oder uber die Environment Variable IDL STARTUP im.profile.

3

Page 24: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 24/238

4 KAPITEL 2. KONFIGURATION

Unter einem Windows-System setzt man Environment-Variablen z.B. in der Datei

autoexec.bat oder uber das Menu Systemeigenschaften.

2.1.1 Beispiel: Start-Up Datei

Das Beispiel gibt einen Uberblick uber mogliche Definitionen in einer Start-Up Datei.

Unterschiedliche Plattformen konnen dabei berucksichtigt werden. Die Pfadsetzung erfolgt

in Unix mit dem Separator ’:’ und unter Windows mit dem Separator ’;’. Das Zeichen ;

bedeutet in IDL, daß nachfolgende Zeichen als Kommentar behandelt werden.

; eigener Prompt

!PROMPT = ’myIDL>’

DEVICE,PSEUDO_COLOR=8 ; bits per pixel

DEVICE,DECOMPOSED=0

; Backingstore von IDL behandeln lassen

DEVICE, RETAIN=2;

; Hintergrund weiss, Vordergrund schwarz

!P.BACKGROUND=!D.TABLE_SIZE-1

!P.COLOR=0

IF !VERSION.OS_FAMILY EQ ’unix’ THEN sep=’:’ ELSE sep=’;’

; Pfad erweitern, damit Routinen von Ray Sterner verfuegbar

!PATH=’/usr/local/idl/JHUapl/idlusr’+sep + !PATH

!PATH=’/usr/local/idl/JHUapl/idlusr2’+sep + !PATH

!PATH=’/usr/local/idl/JHUapl/idldoc’+sep + !PATH

; Pfad fuer eigene Library erweitern

!PATH=’/home/zam/zdvnnn/ownlib’+sep + !PATH

; Systemvariablen fuer Umlaute (readonly)

; klein !ae,!oe,!ue

; gross (upper) !up_ae,!up_oe,!up_ue

DEFSYSV,’!ae’,STRING(228b),1

DEFSYSV,’!oe’,STRING(246b),1

DEFSYSV,’!ue’,STRING(252b),1

DEFSYSV,’!up_ae’,STRING(196b),1

DEFSYSV,’!up_oe’,STRING(214b),1

DEFSYSV,’!up_ue’,STRING(220b),1

; Voraussetung Umlaute: DEVICE,/ISOLATIN1 & xyouts,xp,yp,!ae

DELVAR,sep

Beispiel 2.1: Konfiguration: Start-Up Datei

Page 25: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 25/238

2.1. START-UP DATEI 5

2.1.2 Automatisches Starten eines Programms

Je nach Bedarf kann es erforderlich sein, ein vorkompiliertes Programm beim Starten von

IDL direkt auszufuhren. Die Vorgehensweise wird im folgenden erklart.

Das fertige Programm sollte in einer gerade neu gestarteten IDL-Sitzung komplett durch-laufen, so daß alle Module kompiliert sind. Dann sichert man dieses Programm mit SAVE.

Das kompilierte IDL-Programm hat z.B. den Datei-Namen my application.sav.

SAVE,/ROUTINES,FILENAME=’my_application.sav’

Die nachfolgenden Zeilen fugt man in die Start-Up Datei ein.

CD, ’directory_name’

RESTORE, FILENAME=’my_application.sav’

my_plot ; Hauptprogramm der Applikation starten

Mit dem Starten von IDL wird durch die Initialisierung uber die Start-Up Datei das Pro-

gramm my plot ausgefuhrt. Weitere Informationen zur Ausfuhrung kompilierter Pro-gramme als Runtime Version, siehe Seite 14.

Page 26: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 26/238

6 KAPITEL 2. KONFIGURATION

Page 27: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 27/238

Kapitel 3

Beschreibung der Applikationen

3.1 idlde (Unix, Windows)

idlde startet das IDL Developement Environment, das Graphische Benutzerinterface

von IDL. In einem Unix-System muß man diese Umgebung explizit mit idlde aufrufen,

in einem Windows-System wird diese graphische Benutzeroberflache automatisch gestar-

tet.

idlde ist eine Programmierumgebung zum Erstellen und Debuggen von IDL Program-

men, siehe Seite 161. In dieser Umgebung braucht man keinen weiteren Editor. Im

Document-Panel kann ein IDL Programm geladen und editiert werden. Das kann entwe-

der ein Hauptprogramm, eine Subroutine oder eine Funktion sein. Naheres zur Program-

mierung folgt ab Seite 139. Wichtig ist, daß mit idlde der IDL Prompt zu jeder Zeitvorhanden ist. Damit hat man die Moglichkeit, IDL Befehle zu testen.

7

Page 28: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 28/238

8 KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

Menu Bar

Tool Bars

Control Panel Buttons

Project Window

Multiple DocumentWindow

Output Log

Variable Watch

Window

Command InputLine

Status Bar

Abbildung 3.1: idlde: Aufbau der Oberflache

Auflisten der letzten Befehle  Mit der Richtungstaste

 

-Taste kann man die Befehle zuruckholen.  Die letzten 20 Befehle kann man mit folgenden Kommando listen.

HELP,/RECALL COMMANDS.

Es gibt einen Unterschied zwischen der Unix und Windows Version:

Unter Windows werden Syntax-Elemente in IDL-Programmen farbig hervorgehoben. Un-

ter Unix erfolgt keine farbliche Hervorhebung. Daher empfiehlt es sich, unter Unix den

emacs als Editor mit der Erweiterung IDL-Mode zu benutzen. Dieser Modus unterstutzt

eine farbige Hervorhebung der IDL Programme.

Dazu muß ein emacs.template fur IDL als .emacs unter $HOME abgelegt werden.

Page 29: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 29/238

3.1. IDLDE (UNIX, WINDOWS) 9

3.1.1 Preferences

Zur Grundeinstellung von IDL sollten folgende Anderungen vorgenommen werden.

Menu: File 

Preferences 

GeneralMenupunkt: change directory on open

(Interessant fur Windows Benutzer)

Wenn eine IDL-Bibliotheksroutine in den Editor geladen wird, zeigt der aktuelle

Pfad auf den Pfad dieser Routine. Wird die IDL-Routine mean.pro geladen, ver-

zweigt IDL automatisch in den Pfad /usr/local/idl/idl/lib

Der Unix Benutzer wird vor Aufruf von IDL generell in das Verzeichnis verzweigen,

in dem seine IDL Routinen liegen.  Layout

z.B. kann man das Projekt Window ausblenden, damit mehr Platz im Document Win-

dow ist.  Edit

Compiling:

Menupunkt: automatically save changes before compiling  Startup

Unter dem Menu kann der Name der Start-Up Datei angegeben werden.

Page 30: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 30/238

10 KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

3.1.2 Editieren, Kompilieren und Fehlersuche in Programmen

  File Menu, Search Menu und Edit Menu sind selbsterklarend.

– Im File Menu ist unter Preferences eine Voreinstellung moglich (Startup File,

Path,...).

– Uber das Search Menu hat man Editiermoglichkeiten (Find, Replace), aber

auch eine Debughilfe (Go To Line).  Run Menu

Die Befehle des Run Menus, die im folgenden erklart werden, sind auch uber ein

Icon der Oberflache idlde ansprechbar.

– Compile kompiliert das Programm, das unter dem Namen gespeichert ist.

– Compile from Memory kompiliert immer das, was im Fenster steht, also

auch nicht abgespeicherte Anderungen.

– Run ausfuhren

– Resolve Dependenciesalle Abhangigkeiten werden aufgelost, wichtig fur .sav Files bei Runtime.

– Debugging:

Set Breakpoint

Man muß zuvor den Cursor an die Stelle positionieren, wo der Breakpoint sein

soll. Mit Set Breakpoint wird der Breakpoint gesetzt. Das Programm halt

bei Ausfuhrung an dieser Stelle an!

Edit Breakpoints

Editieren der Breakpoints

Disable Breakpoint

Deaktivieren des Breakpoints. Dieser Breakpoint kann wieder aktiviert werden.Step Over

fuhrt eine Zeile aus. Falls diese einen Programmaufruf enthalt, wird dieser ohne

Interaktion ausgefuhrt.

Step Out

Das Programm wird bis Ende ausgefuhrt.

Run to Cursor

Das Programm lauft bis zu der Stelle, wo der Cursor steht.

Run to Return

Das aktuelle Programm wird bis zum Ende durchlaufen.

Resetmacht Verschiedenes: RETALL Befehl, alle Dateien schliessen, Loschen von

Breakpoints, Variablen, Pointer...

Hinweis:

Vor dem Setzen von Breakpoints muß kompiliert werden!

  Macro Menu

– Eine Variable, die mit dem Cursor markiert ist, wird mit Print Var gedruckt.

– Die Help-Funktion wird mit Help on Var aufgerufen, wenn die Variable

mit dem Cursor markiert ist. 

.edit idl programm von der Kommandozeile ladt diese Routine in das Docu-

ment Panel, falls diese noch nicht geladen ist.

Page 31: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 31/238

3.2. IDL (UNIX) 11

3.2 IDL (Unix)

Mit dem Befehl idl wird das traditionelle Command Line Interface gestartet.

Die Command Line Umgebung wird mit exit beendet.

Direkte Ausfuhrung interaktiver Kommandos!  Vektor als Beispieldatensatz

x=INDGEN(200,/FLOAT) Deklaration

HELP,x Information uber Variable x

PRINT,x Inhalt von Variable x drucken

PLOT,x Vektor x wird als Ordinate gezeichnet

y=SIN(x/20)ˆ2 Beim Rechnen mit Vektoren und Feldern sollen kei-

ne Schleifen programmiert werden!

PLOT,x,y Befehl (plot), Argumente (x,y)

Abbildung 3.2: IDL Programm: Einfacher XY-Plot

Page 32: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 32/238

12 KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

Beispiel:

Das Beispiel zeigt die interaktive interpretative Ausfuhrung von einem Befehl. XYOUTS

gibt einen Textstring an die Koordinaten x,y aus. x und y sind Vektoren.

x=INDGEN(200,/FLOAT)

y=SIN(x/20)ˆ2

PLOT,x,y

XYOUTS,x,y,’sin(x)’,CHARS=0.5

Abbildung 3.3: IDL Programm: einfacher XY-Plot mit Text

Page 33: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 33/238

3.2. IDL (UNIX) 13

3.2.1 Ausfuhrbare Kommandos, Kompilieren und Fehlersuche

Ausfuhrbare Kommandos konnen nur interaktiv als Kommando verwendet werden und

nicht in Programmen. Diese Befehle beginnen alle mit einem Punkt (.) und sind abkurzbar.

Anweisungen:.COMPILE kompilieren

.CONTINUE setzt Programm fort

.GO fuhrt zuvor ubersetztes Hauptprogramm aus

.RNEW Loschen von Hauptprogramm Variablen außer Common Block und .RUN

.RUN kompilieren

.SKIP n Kommandos uberpringen

.STEP n Kommandos schrittweise

.TRACE wie .CONT, zeigt aber jede Zeile vor Ausfuhrung an

Setzen von Breakpoints: Breakpoints werden fur die Suche nach Fehlern verwen-

det, siehe Seite 161.

BREAKPOINT,’file.pro’, 23,/SET

Breakpoint bei Zeile 23 im Programm file.pro

Informationen mit

HELP,/BREAKPOINT

Hinweis:

Die Fehlersuche ist uber das Command Line Interface zu IDL moglich, aber mit idlde

wesentlich einfacher.

Page 34: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 34/238

14 KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

3.3 Runtime (Unix, Windows)

Eine fertige Applikation kann als Runtime Version ablaufen. Bei einer Runtime Version

sind alle Programme komplett kompiliert und liegen als Binary vor. Dieses vorkompilierte

Programm kann ohne IDL-Entwicklungsumgebung ablaufen. Man benotigt lediglich eineRuntime-Lizenz. Ein Vorteil einer Runtime Version ist der schnelle Zugriff auf die bereits

in binarer Form vorliegenden Programme. Ein weiterer Vorteil ist, daß ein Endanwender,

ohne selbst IDL-Kenntnisse zu haben, mit einer Runtime Applikation arbeiten kann. Der

Nachteil einer Runtime Version ist die Abhangigkeit von einer IDL-Version. Das Binary

kann nur unter der IDL-Version ablaufen, mit der es erstellt wurde.

Der Quelltext des nachfolgenden Programms liegt als runtime.pro vor. Das WAIT-

Kommando hat den Zweck, die Ausfuhrung des Programms um 3 Sekunden zu verzogern.

Diese kleine Anwendung wurde sonst so schell ablaufen, daß man das dargestellte Bild

nicht wahrnimmt, siehe Seite 139.

;Polar Plots

PRO runtime

r=FINDGEN(100)

theta=r/5.

PLOT, r, theta, SUBTITLE=’Polar Plot’, $

XSTYLE=4, YSTYLE=4, /POLAR

AXIS, XAX=0,0,0

AXIS, YAX=0,0,0

WAIT,3

END

Beispiel 3.1: Beschreibung der Applikationen: Runtime

Vorgehen: Erstellung einer Runtime Version

Alle Programme, die verwendet werden, mussen kompiliert werden. Das RESOLVE ALL

dient dazu, alle offenen Referenzen aufzulosen. Mit dem SAVE-Befehl speichert man die

Applikation als Binary ab.

IDL starten

.COMPILE runtime

RESOLVE_ALL

SAVE,/ROUTINES,FILENAME=’runtime.sav’

IDL verlassen

Aufruf der Runtime Lizenz unter Unix idl -rt=’./runtime.sav’

In dem Beispiel liegt die Datei ’runtime.sav’ im aktuellen Verzeichnis. Ansonsten

muß statt des Punktes die volle Pfadangabe stehen.

Aufruf der Runtime Lizenz unter Windows erfolgt mittels eines Doppelklicks auf die kompilierte Datei.

Page 35: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 35/238

3.4. IDLHELP (UNIX, WINDOWS) 15

Hinweis:  Es kann nichts nachkompiliert werden. Die IDL Start-Up Datei wird nicht durchlau-

fen.  .sav-Files sind unabhangig von der Plattform. Egal wo erstellt, sind diese uberall

nutzbar (siehe Demo).  Die !PATH Variable gibt es in der Runtime Umgebung nicht.  .sav-Files sind abh angig von der IDL-Version und laufen jeweils nur unter der

IDL-Version, mit der sie erstellt wurden. Das hat zur Folge, das bei einem Versions-

Upgrade, Runtime Programme neu ubersetzt werden mussen.

3.4 IDLHELP (Unix, Windows)

Zu IDL gehort eine sehr gut organisierte Hypertext basierte Online Hilfe. Die gesamte

IDL-Literatur steht online zur Verfugung.Diese wird unter UNIX mit ? und unter Windows mit

 

F1¡ 

aufgerufen. Unter einem

Unix-Betriebsystem konnen einzelne Befehle auch direkt hinter dem ? angegeben werden,

wie im nachfolgenden Beispiel aufgezeigt wird. Unter Windows kann man entsprechend

den Befehl mit dem Cursor markieren und dann die Taste 

F1¡ 

drucken.

IDL ¡  ?

bzw.

IDL ¡  ? plot

Im idlde gibt es ein Menu Help und ein Icon in der Tool Area.

Ein kapitelweises Ausdrucken ist uber die Online Hilfe moglich. IDL-Anwender,die lieber mit einem Handbuch arbeiten, sollten mit dem IDL Dokumentationssatz

arbeiten. Die gesamte Literatur befindet sich als PDF-Datei im docs-Verzeichnis von IDL

und kann gedruckt werden.

3.4.1 Arbeiten mit der IDL Online Hilfe

Die Online Hilfe ist ein Hypertext Dokument mit den ublichen Abfragen und Steue-

rungsmoglichkeiten.

Mit dem Aufruf der Online Hilfe ist folgendes direkt verfugbar:  Alle Befehle alphabetisch geordnet.  Einen Uberblick uber die neuen Funktionen der aktuellen Version.  Eine funktionale Liste aller Funktionen.

Page 36: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 36/238

16 KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

Uber folgende Menu-Knopfe erhalt man weitere Informationen.  File Menu

Ein kapitelweises Ausdrucken ist moglich. Bei Printer Setup Auswahl von

Generic (File Only). Mit Print wird die Erstellung eines PostScript Files

veranlaßt.  Edit Menu

Mit Copy selektierten Text aufs Clipboard (Ablage) legen. Diese kann dann mit

Paste in idlde bzw. emacs kopiert werden. Sinnvoll fur Online dokumentierte

Beispiele.  Bookmark Menu

Mit Define Definition von Bookmarks zum schnelleren Auffinden bestimmter To-

pics.

Mit dem Online Help Button Index werden folgende Help Topics gelistet.

 

Contents MenuIDL Bucher, What’s new in IDL 5.x, Release Notes,...

  Index Menu

Suche nach Keywords. Nur die ersten Buchstaben des gesuchten Begriffs sind not-

wendig.  Find Menu

Suche nach beliebigem Text. ’Full text search’, daher beim ersten Aufruf langsam.

Wie bei Index nur die ersten Buchstaben des gesuchten Begriffs tippen.

Page 37: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 37/238

Kapitel 4

Grundlagen

Mit der Distribution zu IDL stehen die Routinen der Sprache in zwei verschiedenen Ar-

ten zur Verfugung. Viele Programme liegen in Binarcode, z.B. PLOT, oder in der Script-

Sprache (Quelltext) z.B. MEAN vor.

4.1 Auffinden von Programmen

Programme werden zuerst in dem aktuellen Arbeitsverzeichnis gesucht und dann ent-

lang des Suchpfades, der in der Environment Variablen IDL DIR bzw. der IDL-

Systemvariablen !PATH definiert ist.

Fur das praktische Arbeiten ist es sinnvoll, von dem Verzeichnis die IDL Arbeitsumgebung

aufzurufen, in dem die Programme liegen. Nach dem Verlassen von IDL ist man in dem

Verzeichnis, von dem man IDL gestartet hat.

Hinweis:  Man halt moglichst alle Programme in einem Verzeichnis, um ein schnelles Auffin-

den der IDL-Routinen zu erreichen.

Unix: Liegen Programme in anderen Verzeichnissen, kann man Links anlegen.

Windows: Bei einer Verknupfung wird der Name der Datei umbenannt und ist damit

nicht auffindbar.  In Dateinamen fur IDL-Programme sollten nur Kleinbuchstaben verwendet werden.

Unter dem Betriebssytem Unix werden keine Programme identifiziert, die im Da-

teinamen Großbuchstaben enthalten.Wechseln des Arbeitsverzeichnisses

IDL Befehl: CD

CD,’/home/idldir’,CURRENT=olddir

CD, CURRENT=olddir

Wechsel zu$HOME/idldirund optionales Sichern des aktuellen Verzeichnisses mit dem

Keyword CURRENT.

Unter einem Unix-Betriebssystem kann man mit CD,’’ in das Heimatverzeichnis ver-

zweigen. Dieser Befehl bewirkt unter Windows keine Anderung des Pfades.

17

Page 38: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 38/238

18 KAPITEL 4. GRUNDLAGEN

4.2 Syntax der Aufrufe von IDL Programmen

Am Beispiel einer Prozedur werden die verschiedenen Moglichkeiten der Parameteruber-

gabe aufgezeigt.

IDLprogramm, [positionale Parameter], Keyword=value,...

Beispiel: siehe Online Help zu PLOT

PLOT, [X,] Y [, MAX_VALUE=value] $

[, MIN_VALUE=value] [,NSUM=value] [, /POLAR] $

[, THICK=value] [, /XLOG] [, /YLOG] $

[, /YNOZERO]

Die Parameter, die in [ ] (eckige Klammern) gesetzt sind, sind nicht erforderlich.

Positionale Parameter sind X und Y.

Positionale Parameter sind nicht alle erforderlich. Deren Reihenfolge ist

wichtig!

Keyword Parameter sind die benannten Parameter z.B. MAX VALUE= bzw. /XLOG

Diese Keyword-Parameter sind nicht erforderlich.

Das Komma ist das Trennzeichen zwischen den Parametern.

Hinweis:

Groß- /Kleinschreibung fur Variablen bzw. Befehle irrelevant

Page 39: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 39/238

4.2. SYNTAX DER AUFRUFE VON IDL PROGRAMMEN 19

4.2.1 Positionale Parameter

Dabei handelt es sich um Parameter, die in einer vorgegebenen Reihenfolge definiert und

verwendet werden. Bezugnehmend auf das Beispiel Seite 18 sind die Variablen X und Y

positionale Parameter.

4.2.2 Keyword Parameter

Keyword Parameter werden auch als benannte Parameter bezeichnet. Die Reihenfolge ist

beliebig und ein Ausschreiben dieser Parameter ist oft nicht notig.

Es sind nicht immer alle Parameter erforderlich. Bezugnehmend auf das Beispiel Seite

18, sind z.B. die Variablen MAX VALUE=value und MIN VALUE=value Keyword

Parameter.

Schreibweisen mit gleicher Bedeutung fur das Keyword COLOR:

COLOR=1

/COLOR

/COL

COL=1

oder falls man dem Keyword einen bestimmten Wert zuweisen will:

COLOR=5

COL=5

Keywords beeinflussen den Ablauf eines IDL-Programms. Fur einen definierten Ablauf 

gibt es ein bestimmtes Keyword. Fur die Anderung einer Farbe gibt es das COLOR Key-

word. Dieses Keyword COLOR wird in den Programmen PLOT, XYOUTS, POLYFILL

usw. verwendet.

IDL-Routinen haben gemeinsame Keywords.

Hinweis:

Informationen und Erklarungen zu den Routinen und deren Keywords findet man in der

Online Hilfe bzw. im Reference Guide.

Page 40: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 40/238

20 KAPITEL 4. GRUNDLAGEN

4.3 Zeichen mit spezieller Bedeutung

Einige Zeichen sind reserviert.

[] Array

() Funktionen, Strukturtags ¡ 

Strukturen

! System- Variable

; Kommentar folgt

$ Fortsetzung des Kommandos in nachster Zeile

oder

Betriebssystemkommando, Beispiel: $ ls

. Start Ausfuhrungskommando

.run kompiliert eine Funktion

& mehrere Befehle in einer Zeile werden durch & getrennt

A=1 & B=10* Subscript bei Arrays oder Dereferenzierung

@ Ausfuhrung eines IDL Batch- Files, mit Namen datei enthalt

eine Folge von IDL Befehlen.

Beispiel: Journal Datei @datei

? online help

oder als Operator

c = ( a EQ b ) ? a : 0.0

Wenn die Bedingung (a EQ b) erfullt ist, gilt c=a, wenn nicht

gilt c=0.0

: definiert Label oder Subscript bei Array-BereichTabelle 4.1: Zeichen mit spezieller Bedeutung

4.4 System-Variablen

System-Variablen dienen dem Zweck, Statusinformationen aufzuzeichnen oder bestimmte

Prozesse zu steuern. Zur Steuerung von Prozessen gibt es z.B. !QUIET=1 (Unterdrucken

der MESSAGE,/INFO).

Alle System-Variablen beginnen mit !.

Hinweis:

Systemvariablen konnen sich von Version zu Version andern. Das bedeutet, daß sich der

Informationsgehalt andern kann.

Vorsicht ist daher bei Systemvariablen geboten, die geschrieben werden!

IDL Systemvariable sind als globale Variablen in allen Programmeinheiten bekannt!

Page 41: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 41/238

4.4. SYSTEM-VARIABLEN 21

4.4.1 Ubersicht

Haufig benutzte Konstanten, Einstellungen fur die Grafik, das Environment und Error-

Handling konnen uber Systemvariablen gesetzt werden.

Konstante !DPI, !PI, !RADEG, !DTOR, !VALUES

Graphik  !D current device

!ORDER

!ORDER=0 (Image bottom-up), !ORDER=1 (Image top-down)

!X, !Y, !Z Achsenstruktur

!P Plot- Prozedur

Environment !DIR, !PATH, !VERSION

PRINT, !DIR

Hauptdirectory von IDL

PRINT, !PATHSuchpfad fur Routinen

Pfaderweiterung unter Unix

!PATH=’/home/privat/’ + ’:’ + !PATH

Pfaderweiterung unter Windows

!PATH=’c:\home\privat\’ + ’;’ + !PATH

Bei der Pfadsetzung verwendet man unter Unix den Doppelpunkt

und unter Windows das Semikolon

PRINT, !VERSION

Architektur, Betriebssystem und Versionsnummer von IDL

Plattformabhangiges Programmieren!

PRINT, !VERSION.OS liefert z.B. AIX

PRINT, !VERSION.OS FAMILY liefert z.B. unix

Error Handling Die Beschreibung von !ERR STATE folgt auf Seite 166 .

4.4.2 Informationen uber Systemvariablen

  Welche Systemvariable gibt es?

HELP,/SYSTEM_VARIABLES

liefert u.a. folgende Ausgabe:

!DPI = 3.1415927

HELP,!D

<Expression> STRUCT = -> !DEVICE Array[1]

!DPI ist die Konstante PI mit dem Typ DOUBLE.

Die Information der HELP-Funktion gibt Auskunft daruber, daß !D eine Struktur ist,

d.h. !D ist eine Systemvariable mit verschiedenen Informationen.  Info uber die Struktur der Systemvariablen !D (Device)

HELP,/STRUCTURES,!D

liefert u.a. folgende Ausgabe (Unix):

Page 42: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 42/238

22 KAPITEL 4. GRUNDLAGEN

NAME STRING ’X’

X_SIZE LONG 640

Y_SIZE LONG 512

  Nur Ausdruck der Werte!

PRINT,!D

PRINT,!P.T

!P.T ist eine 4x4 Transformationsmatrix.

  Einige Systemvariablen sind readonly:

Konstanten, !D.TABLE SIZE,...

  Definition eigener Systemvariablen. Enthalt die DEFSYSV-Anweisung als dritten

Parameter die Option 1 ist die Systemvariable nur Readonly.

DEFSYSV,’!OWN’,4711DEFSYSV,’!OWN’,123,1

Page 43: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 43/238

Kapitel 5

Datenstrukturen

Eine Variable im IDL-Sinn hat einen Typ (Byte, Integer, Float,...) und besitzt eine Spe-

zifikation. In IDL stehen, wie auch in anderen Programmiersprachen, Skalare (einzelner

Wert), Felder (1 bis 8 Dimensionen) und Strukturen (Zusammenfassung von beliebigenVariablen, Felder und/oder Strukturen) zur Verfugung.

Fur die Namenskonvention der Variablen gilt:  Lange max. 255 Zeichen  1. Zeichen muß Buchstabe sein

(Ausnahme: Systemvariable fangt mit ! an)  erlaubt sind Buchstaben, Ziffern, $ und Underscore ’ ’  Nicht erlaubt sind reservierte Worter

z.B. AND, DO, FOR, FUNCTION, PRO, COMMON,...

Hinweis:  IDL unterscheidet bei Variablen keine Groß-/Kleinschreibung!

Beispiele:

A, A6, My variable, INIT STATE, ABC$def (=abc$def)  Der Variablen-Typ wird durch die Initialisierung festgelegt!  Es gibt keine Typendeklaration, wie z.B in FORTRAN mit INTEGER, REAL,. . .

23

Page 44: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 44/238

Page 45: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 45/238

5.2. SKALAR 25

5.1.1 Konversionsroutinen

Es gibt Funktionen zur Konversion des Typs z.B.: BYTE, DOUBLE, FLOAT, LONG,

STRING, siehe auch Tabelle auf Seite 24.

Beispiel:a=’15.3’

b=FLOAT(a)

c=FIX(b)

d=STRING(c)

HELP,a,b,c,d

A STRING = ’15.3’

B FLOAT = 15.3000

C INT = 15

D STRING = ’ 15’

Hinweis:

Zu jeder Zeit kann man den Typ andern, was in Sprachen wie C nicht so einfach ist.

Das vorherige Beispiel zeigt, wie einfach eine Konversion moglich ist.

5.2 Skalar

Ein Skalar ist ein einzelner Wert ohne Dimension.

Beispiele zur Initialisierung von Skalaren

Die HELP Anweisung zeigt die Definition der Variablen auf. Das Zeichen & trennt

die Befehle, die in einer Zeile stehen.

byte_var=64b & HELP,byte_var

long_int_var=5L & HELP,long_int_var

float_var=50.5E10 & HELP,float_var

dfloat_var=50.5D200 & HELP,dfloat_var

str=’Dies ist ein String’ & HELP,str

5.2.1 Information uber Skalare mit SIZE

Mit SIZE kann man uberprufen, ob ein Wert ein Skalar ist.

skalar=1

INFO=SIZE(skalar,/DIMENSION)

PRINT,INFO

Der SIZE-Befehl mit Definition des Keywords DIMENSION ermittelt die Dimension

eines Wertes. INFO hat den Wert 0, wenn ein Skalar mit dem Keyword DIMENSION

getestet wird. Ein Skalar hat keine Dimension.

Auf diese Weise sind Vektoren mit einem Element von Skalaren zu unterscheiden.

Page 46: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 46/238

26 KAPITEL 5. DATENSTRUKTUREN

5.3 Array

Ein Array hat ein bis acht Dimensionen. Die Feldindizierung wird ab Index 0 gezahlt.

Da IDL eine lebendige Sprache ist, finden laufend Erganzungen statt. In alteren

IDL Versionen hat es weniger Datentypen gegeben als heute. Aus heutiger Sicht gibt es inalteren Versionen Programme, die mit den heute zur Verfugung stehenden IDL-Routinen

redundant sind. Als Beispiel sei hier das Programm zur Generierung von Speicherplatz

genannt. In alten Versionen mußte man jeweils den Typ fest verdrahtet im Aufruf 

angeben (INTARR, FLTARR,.. usw.). Mit der Routine MAKE ARRAY hat man ein IDL

Programm, das man generell bei der Generierung von Speicherplatz aufrufen kann. Die

Typ-Spezifikation wird jeweils mit einem Keyword gesteuert.

5.3.1 Anlegen von Vektoren und Arrays

In diesem Abschnitt werden die alte und die aktuelle Methode zum Anlegen von Fel-dern beschrieben. Die alte Methode wird beschrieben, weil bereits existierende IDL

Programme diese Notation verwenden. Diese Methode ist recht unkomfortabel, da fur

  jeden Datentyp eine eigene Funktion aufgerufen werden muß. Die aktuelle Methode

ist einfacher und flexibler aufzurufen und sollte moglichst in neuen IDL-Entwicklungen

verwendet werden.

Vorgehen nach der alten Methode:

Es gibt zwei Methoden, Felder anzulegen, zum einen werden die Werte zu Null gesetzt

und zum anderen erhalten sie den Wert des Indices des Feldes.

Die folgenden Befehle legen jeweils einen Bereich an und fuhren eine Zu Null Setzungaller Elemente durch. Die Befehle enden alle mit ARR und man muß im Aufruf explizit

den Typ (BYTARR, INTARR, LONARR,.....) nennen.  Generierung eines Short Integer Vektors mit Nullsetzung:

a=INTARR(10)  Generierung eines Long Integer Vektors mit Nullsetzung:

b=LONGARR(10)

Die folgenden Befehle dienen dem Anlegen von Feldern nach der alten Methode und

fuhren eine Indexgenerierung durch:

Jedes Element bekommt den Wert seines Indices, beginnend mit 0. Die Befehle enden allemit INDGEN und hier ist ebenso wie bei oben erklarten Befehlen im Aufruf explizit der

Typ (INDGEN, BINDGEN, L64INDGEN, LINDGEN,...) erforderlich. Diese Befehle legen

 jeweils einen Bereich an und fuhren eine Indexgenerierung durch.

Beispiel: Generierung von Variablen mit Indexgenerierung.  Generierung eines Vektors vom Typ FLOAT mit Indexgenerierung

a=FINDGEN(10)  Generierung eines Vektors vom Typ LONG mit Indexgenerierung

b=LINDGEN(10)

Page 47: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 47/238

5.3. ARRAY 27

Vorgehen nach der aktuellen Methode:

Die aktuelle Methode sollte moglichst in neuen IDL-Entwicklungen verwendet

werden. Mit der aktuellen Methode kann die Generierung von Feldern mit dem Befehl

MAKE ARRAY bzw. INDGEN vereinheitlicht werden. Mit MAKE ARRAY kann man

sowohl alle Werte eines Feldes mit 0 besetzen als auch mit einem beliebigen Wertinitialisieren. Die zusatzliche Typangabe ist mit einem Keyword z.B. L64, UL64,

LONG, FLOAT, . . . moglich. Fur die Indexgenierung wurde der bisherige Befehl der alten

Methode zur Indexgenerierung von Integer Feldern INDGEN erweitert. Diese Funktion

kann durch Verwendung von Keywords zur Typangabe zum Anlegen von Feldern mit

Indexgenerierung aller beliebigen Datentypen verwendet werden. Die Indexgenerierung

ist auch mit MAKE ARRAY mit dem Keyword INDEX moglich.

Beispiel: Generierung von Feldern vom Typ FLOAT

  Generierung eines Feldes mit Wert- und Typangabe:

a=MAKE ARRAY(10, /FLOAT,VALUE=5.)  Generierung eines Feldes mit Indexgenerierung und Typangabe

(aquivalente Schreibweisen):

a=INDGEN(10, /FLOAT)

a=MAKE ARRAY(10, /FLOAT,/INDEX)

Folgende Schreibweisen sind aquivalent zum Anlegen eines Bereiches mit einem Typ und

einem Wert. FLTARR ist eine Funktion der alten Methode und sollte durch die aquivalente

Schreibweise mit MAKE ARRAY ersetzt werden.a=FLTARR(10,10) & a=MAKE_ARRAY(10,10,/FLOAT)

Der Vorteil von MAKE ARRAY liegt in der flexiblen Typ- und Wertangabe.

array=MAKE_ARRAY(3,4,/INT,VALUE=5)

Folgende Schreibweisen sind aquivalent zum Anlegen eines indizierten Feldes. FINDGEN

und SINDGEN sind Funktionen der alten Methode und sollten durch die aquivalente

Schreibweise mit INDGEN ersetzt werden.

a=FINDGEN(40) & a=INDGEN(40,/FLOAT)

str=SINDGEN(10) & str=INDGEN(10,/STRING)

Hinweis:

Die Funktionen MAKE ARRAY bzw. INDGEN sind flexibler als FLTARR, FINDGEN, ...  Bei MAKE ARRAY bzw. INDGENmuß man nur die Keywords fur den Datentyp ken-

nen, wahrend bei den Funktionen, die auf . . . ARR und .. . INDGEN enden, entspre-

chend des Datentyps je eine andere Funktion gewahlt werden muß.  Bei MAKE ARRAY gibt es eine flexible Indizierung (Wert, Typ und Indexgenerie-

rung,...).

Page 48: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 48/238

28 KAPITEL 5. DATENSTRUKTUREN

5.3.2 Information uber Felder mit SIZE

Mit SIZE kann man uberprufen, ob eine Variable ein Array ist.

ARR=MAKE_ARRAY(50,60,/FLOAT)

INFO=SIZE(ARR)

PRINT,INFO

2 50 60 4 3000

 

Anzahl Dimensionen (2), deklarierte Langen (50, 60), 4 ist der Typ (siehe Refe-

rence Guide), 3000 (50*60) ist die Gesamtzahl der Feldelemente.

5.3.3 Generierung von Arrays mit REPLICATE

Im folgenden Beispiel wird die Zahl 5.0 mit der Funktion REPLICATE in einem Array

der Große [10,10] angeordnet. Jedes Element des Arrays hat den Wert 5.0.

a=5.0

array=REPLICATE(a,10,10)

Aquivalent dazu ist der folgende Befehl.

a=5.0

array=MAKE_ARRAY(10,10,/FLOAT,VALUE=a)

REPLICATE wird auch fur die Erzeugung von Arrays von Strukturen verwendet, siehe

Seite 37 .

5.3.4 Arrayindizierung mit [ ]

Seit der Version IDL 5.0 gibt es eine Syntaxanderung bei der Arrayindizierung. Arrays

sollten mit eckigen Klammern indiziert werden. In alten IDL Versionen wurden Arrays

mit runden Klammern indiziert.

Die alte Schreibweise mit runden Klammern ist weiterhin erlaubt, sollte aber in neuen

Programmen durch eckige Klammern ersetzt werden.

Bei der Zuweisung wert=array[5] ist klar, daß es sich um das sechste Feldelement

handelt, wahrend wert=array(5) auch ein Funktionsaufruf sein konnte.

Mit dem Zeichen * werden alle Elemente der angegebenen Dimension angesprochen. Das

Zeichen : wird verwendet, um Teilbereiche einer Dimension anzusprechen.

Page 49: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 49/238

5.3. ARRAY 29

5.3.5 Arbeiten mit Feldern - REFORM Befehl

REFORM andert nur die Dimensionierung, alle Dimensionen der Lange 1 werden entfernt.

a=INDGEN(10,10,10,/LONG)

b=a[5,*,*]

HELP,b,REFORM(b)

B LONG = Array[1, 10, 10]

<Expression> LONG = Array[10, 10]

REFORM behalt die Reihenfolge der Indizierung bei.

5.3.6 Arbeiten mit Feldern - TRANSPOSE Befehl

Der Befehl TRANSPOSE bildet die Transponierte einer Matrix. Im Gegensatz zu dem

REFORM-Befehl werden die Werte der Matrix neu angeordnet.

5.3.7 Verknupfung von Feldern

Felder konnen erweitert werden, wenn deren Dimension ubereinstimmt.

Ein Array mit zehn Elementen wird um ein Element erweitert und hat dann elf Elemente.

A=FINDGEN(10)

A=[A,5]

Vektoren verknupfen

v1=[2,3,1]

v2=[2,1,4]

v3=[v1,v2]

PRINT,v3

ergibt: 2 3 1 2 1 4

Im Gegensatz dazu ist v4 = [ [v1],[v2 ]] ein zweidimensionales Feld

PRINT,v4

2 3 1

2 1 4

Page 50: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 50/238

30 KAPITEL 5. DATENSTRUKTUREN

5.3.8 Beispiele zum Arbeiten mit Feldern

arr=[2,4,6,8] arr[0]=2, Vektor mit 4 Elementen

arr=INDGEN(256,500,/FLOAT) 256*500 Floating Elemente, durchnummeriert

mit 0.,1.,2.,..

PRINT,arr[24,2] das 537. Element (2*256+25=537).

PRINT,arr[536] 1. Index schneller,eindimensionaler Index

moglich

PRINT,arr[2,*] 3. Spalte, 500 Elemente

HELP,arr[2,*] arr[2,*] hat die Dimension (1,500)

temp=arr[0:9,*] die ersten 10 Spalten uber alle Zeilen

HELP,temp zeigt Definition des Feldes

arr[80:220,200:300]=0.0 Subarray mit Doppelpunkt setzen, nie eine

Schleife programmieren!

A=[1,2,1]

ARRAY=[[A],[2*A],[3*A]]

 

¡ 

¡ 

¡ 

¢ 

£ ¤ £ 

¤ ¥ ¤ 

¦ § ¦  

 

© 

© 

© 

 

Page 51: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 51/238

5.4. ZEICHENKETTEN (STRINGS) 31

5.4 Zeichenketten (Strings)

Eine Zeichenkette besteht aus ein oder mehreren ASCII-Zeichen, die in Hochkommata

eingeschlossen sind. Man nimmt dazu die einfachen Hochkommata. Die Lange einer

Zeichenkette kann maximal 2 GByte betragen.

Wenn innerhalb einer Zeichenkette ein Hochkomma dargestellt werden soll, muß manzwei Hochkommata kodieren.

PRINT, ’ABC’’DEF’

ABC’DEF

PRINT, "ABC’DEF"

ABC’DEF

Bei Zeichenketten kann auch das doppelte Hochkomma verwendet werden. Bei Zahlen

werden durch Voranstellen des doppelten Hochkommas oktale Zahlen definiert.

PRINT, "10

8

5.4.1 Operationen auf Zeichenketten

Die Zeichenkettenvariablen werden haufig verwendet. Fur ihre Bearbeitung gibt es eine

Anzahl wichtiger Befehle.

+ Operator zum Verknupfen von Strings

STRLEN Ermittelt die Lange eines Strings

STRCOMPRESS,STRTRIM Entfernen von Leerzeichen und TabulatorenSTRPOS

STRJOIN

STRPUT

STRMID

Lokalisieren, Einfugen und Extrahieren von

Teilstrings

STRSPLIT Teilt einen String in einzelne Strings auf 

STRLOWCASE

STRUPCASE

Konvertieren von Strings in Klein- bzw.

Großbuchstaben

STRING Konvertiert numerische Daten zum Typ String

READS Liest Werte aus einem String in eine IDL-Variable

Tabelle 5.2: Datenstrukturen: Operationen auf Zeichenketten

Beispiele:

str=’IDL is fun’

PRINT,STRMID(str,7,3)

fun

str = ’Wort1,Wort2,Wort3’

teilstring = STRSPLIT(str,’,’,/EXTRACT)

HELP, teilstring

TEILSTRING STRING = Array[3]

Page 52: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 52/238

32 KAPITEL 5. DATENSTRUKTUREN

PRINT, teilstring[1]

Wort2

5.4.2 Konversion von Strings in Zahlen

Von einem String konnen Zahlen gelesen werden, z.B. in ein FLOAT-Array, wie das fol-

gende Beispiel zeigt.

str=’1 2 3’

val=FLTARR(3)

READS,str,val

PRINT,val

1.00000 2.00000 3.00000

5.4.3 Zeichenkette mit Leerzeichen anlegen

Fur die formatierte Ausgabe kann es erforderlich sein, Daten mit einer definierten

Anzahl von Leerzeichen voneinander zu trennen. Eine einfache Moglichkeit bildet das

nachfolgende Beispiel mit REPLICATE oder MAKE ARRRAY.

my_string=’ ’

bzw.

my_string1=STRING(REPLICATE(32b,11))

my_string2=STRING(MAKE_ARRAY(11,VALUE=32b))

Leerzeichen werden als Byte (ASCII Nummer 32) generiert.

REPLICATE vervielfacht den BYTE-Wert 32b elf mal. Das Ergebnis ist ein Vektor

der Lange elf und dem Typ BYTE. Mit MAKE ARRAY wird ein Vektor der Lange elf 

und dem Initialisierungswert 32b angelegt. Mit der Funktion STRING wird jeweils eine

Konvertierung in einen String durchgefuhrt.

Page 53: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 53/238

5.5. STRUKTUREN 33

5.5 Strukturen

Eine Struktur ist eine Zusammenfassung verschiedener Daten unterschiedlicher Definitio-

nen (Skalare oder Arrays von allen IDL Datentypen). Strukturen sind nutzlich, um Daten

zu einer anderen Programmeinheit zu transferieren.

Die Daten innerhalb der Struktur werden uber Tags definiert. Die Tags entsprechen

den Variablen Namen, daher gelten fur sie auch die gleichen Regeln zur Definition.

Das Zeichen . dient dazu, eine einzelne Variable der Struktur anzusprechen.

Man unterscheidet zwei Typen von Strukturen:  Named

Wird uber einen Namen definiert. Bei der ersten Referenz liegt die Struktur bezuglich

Typ und Dimension fest und kann nicht geandert werden. Die benannte Struktur kann

benannte Strukturen enthalten.  Anonymous

Es gibt keinen Namen und es wird keine permanente Definition innerhalb IDL ge-speichert. Die anonyme Struktur kann andere benannte und anonyme Strukturen ent-

halten.

Hinweis:

Grundsatzlicher Unterschied der beiden Strukturtypen:

Bei einer anonymen Struktur ist der Typ und die Dimensionierung der Struktur-Elemente

geschutzt. Die Anzahl der Struktur-Elemente kann erweitert werden. Die Reihenfolge

der Elemente ist nicht festgelegt. Dagegen ist bei einer benannten Struktur der Typ, die

Dimensionierung und die Reihenfolge festgelegt. Die Anzahl der Struktur-Elemente kann

nicht erweitert werden. Damit ist der Strukturaufbau duplizierbar.

Information uber Struktur Variable mit dem Keyword STRUCTURE.

HELP,!D,/STRUCTURE

HELP,!D.NAME

Page 54: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 54/238

34 KAPITEL 5. DATENSTRUKTUREN

5.5.1 Definition einer unbenannten (anonymen) Struktur

Die Definition ist entweder mit geschweiften Klammern ¡ 

oder mit CREATE STRUCT

moglich.

var={Tag1:Value1,Tag2:Value2,...,Tagn:Valuen}

var=CREATE_STRUCT(Tag1,Value1,Tag2,Value2,...,Tagn,Valuen)

Beispiel: Definition einer anonymen Struktur

V = [’Vname’, ’Name’, ’Alter’]

person=CREATE_STRUCT(V[0],’Emil’,V[1],’Graf’,V[2],20)

HELP,person

PERSON STRUCT = -> <Anonymous> Array[1]

HELP,person,/STRUCT** Structure <3007e210>, 3 tags, length=20, refs=1:

VNAME STRING ’Emil’

NAME STRING ’Graf’

ALTER INT 20

Erweiterung der anonymen Struktur um einen Tag

person=CREATE_STRUCT(person,’Gehalt’, 3100.50)

HELP,person

PERSON STRUCT = -> <Anonymous> Array[1]

HELP,person,/STRUCT

** Structure <3007ef90>, 4 tags, length=24, refs=1:

VNAME STRING ’Emil’

NAME STRING ’Graf’

ALTER INT 20

GEHALT FLOAT 3100.50

Zusammenfassung anonymer Strukturen zu einer neuen anonymen Struktur

neu=CREATE_STRUCT(’p1’,person,’p2’,person)

HELP,neu,/STR

P1 STRUCT -> <Anonymous> Array[1]

P2 STRUCT -> <Anonymous> Array[1]

HELP,neu.p1,/STR

** Structure <3007ef90>, 4 tags, length=24, refs=5:

VNAME STRING ’Emil’

NAME STRING ’Graf’

ALTER INT 20

GEHALT FLOAT 3100.50

Page 55: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 55/238

5.5. STRUKTUREN 35

Auf die Tags der Struktur zugreifen

neu.p2.vname=’Hugo’

HELP,neu.p2.vname,/STR

<Expression> STRING = ’Hugo’

Hinweis:

Datentyp und Dimension der Tags nicht mehr anderbar!

Die Tags kann man auch uber deren Index ansprechen

HELP,neu.(0),/STR

** Structure <3007f020>, 4 tags, length=24, refs=4:

VNAME STRING ’Emil’NAME STRING ’Graf’

ALTER INT 20

GEHALT FLOAT 3100.50

HELP,neu.(1),/STR

** Structure <304839e0>, 4 tags, length=24, refs=4:

VNAME STRING ’Hugo’

NAME STRING ’Graf’

ALTER INT 20

GEHALT FLOAT 3100.50

HELP,neu.(0)

Dabei ist (0) die Tag Position, und zwar von 0 gerechnet die 1. Position

HELP,neu.(1)

(1) ist die 2.Tag Position

Beispiel fur die Tag-Angabe bei tiefer geschachtelten Strukturen:

HELP,neu.(1).(0)

Page 56: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 56/238

36 KAPITEL 5. DATENSTRUKTUREN

5.5.2 Definition einer benannten Struktur

Die Definition ist entweder mit geschweiften Klammern ¡ 

oder mit CREATE STRUCT

moglich und enthalt die Angabe eines Namens.

var={struc_name,Tag1:Value1,Tag2:Value2,...,Tagn:Valuen}

var=CREATE_STRUCT(NAME=struc_name,Tag1,Value1,...,Tagn,Valuen)

Beispiel: Definition einer benannten Struktur

var1={data,date:’’,para1:0.0,pic:BYTARR(10,10)}

HELP,var1

VAR1 STRUCT = -> DATA Array[1]

HELP,var1,/STR

** Structure DATA, 3 tags, length=112:DATE STRING ’’

PARA1 FLOAT 0.00000

PIC BYTE Array[10, 10]

Der Strukturname ist data.

Achtung: Die Initialisierung bei date sind zwei einzelne Hochkommata.

Zugriff auf Tags

var1.date=’29.05.95’var1.para1=5.0

Andere Schreibweise der Definition

var3=CREATE_STRUCT( $

name=’neu’,’date’,’’, ’para’,0.0,’pic’,BYTARR(10,10))

Erweiterung einer zuvor benannten Struktur ’neu’ ergibt einen Fehlervar4=CREATE_STRUCT(name=’neu’, $

’date’,’’, ’para’,0.0,’pic’,BYTARR(10,10),’a’,0.)

% Wrong number of tags defined for structure: NEU.

Page 57: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 57/238

5.5. STRUKTUREN 37

5.5.3 REPLICATE bei Strukturen

Mit REPLICATE konnen auch Strukturen als Array generiert werden. var1 ist eine be-

nannte Struktur, die mit REPLICATE vervielfacht wird.

var1={data,date:’’,para1:0.0,pic:BYTARR(10,10)}

var1=REPLICATE(var1,5)

HELP,var1

VAR1 STRUCT = -> DATA Array[5]

HELP,var1[0].date

<Expression> STRING = ’29.05.95’

Duplizieren des Strukturaufbaus

var2={data}

Verknupfen von Strukturen analog zu Feldern mit []

var2=[var2, {data}]

Statt einer IDL Variablen, kann bei REPLICATE ein Strukturname stehen.

var2=REPLICATE( {data} , 3)

5.5.4 Informationen zum StrukturaufbauEs gibt Routinen, um den Aufbau einer Struktur auszugeben.

n=N TAGS(var1) Anzahl Tag-Namen

(nur von der obersten Ebene)

PRINT,n 3

tags=TAG NAMES(var1) Tag-Namen

Ruckgabe der Tag-Namen erfolgt in Groß-

buchstaben

PRINT,tags DATE PARA1 PIC

Page 58: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 58/238

38 KAPITEL 5. DATENSTRUKTUREN

5.6 Pointer

Pointer in IDL und Sprachen wie C/C++ sind nicht dasselbe. Ein Pointer in C zeigt auf 

einen bestimmten Bereich im Speicher. Ein Pointer in IDL zeigt dagegen auf eine spezielle

IDL Heap Variable. IDL stellt den Bereich fur die Pointer Daten bereit.

Der IDL Programmierer braucht sich keine Gedanken uber Speichermanagement zu ma-chen. Man verwaltet selbst keine absoluten Speicheradressen. Der Heap-Speicher wird von

IDL verwaltet. Es ist daher unmoglich, Speicherbereich im Heap zu uberschreiben. Man

kann lediglich die Referenz auf diese Variable verlieren.

Pointer werden in dem Heap-Speicher angelegt. Damit sind die Datenbereiche, die uber

Pointer angesprochen werden, global und damit in jeder Programmeinheit verfugbar.

Es gibt Funktionen zum Anlegen von Pointern, (PTR NEW und PTRARR), eine Funktion

zur Pointer-Freigabe (PTR FREE) und eine Funktion zur Gultigkeitsabfrage des Pointers

(PTR VALID). Diese Funktionen werden auf Seite 39 naher beschrieben. Die Funktionen

SAVE und RESTOREwerden bei Pointern voll unterstutzt. Wenn man die Referenz sichert,

sichert man damit auch den Zugriff auf den Heap-Bereich.Ein Pointer selbst ist eine einfache IDL Variable. Pointer sind uber den Dereferenzierungs-

operator ’*’ ansprechbar. Ein Beispiel steht auf Seite 39.

5.6.1 Anwendungen von Pointern

  Der Datentyp Pointer kann in statischen Datenelementen, wie Strukturen, als ein

Platzhalter fur einen dynamisch angelegten Speicherbereich verwendet werden.

  Der Datentyp Pointer ist fur die objektorientierte Programmierung, die Widget

Programmierung und die Programmierung mit Strukturen wichtig.

  Große Datenmengen konnen uber Pointer-Variablen definiert werden. Da Pointer

global bekannt sind, kann man uber Pointer-Variablen definierte Datenbereiche

ansprechen.

Ein Beispiel dazu steht auf Seite 109, wo nur die Pointer-Variable an das SLICER3-

Tool ubergeben wird.

  Verkettete Listen (Trees)

Hinweis:

In der Widget Programmierung, siehe Seite 171, ist WIDGET CONTROL mit

SET UVAULE mit großen Datenmengen sehr langsam. Definiert man den Datenbereich

uber eine Pointer-Variable, lauft die Anwendung viel schneller.

Nullpointer:

Der Nullpointer hat keinen bestimmten bekannten Wert und zeigt auf keine Heap Variable.

Der Nullpointer hat eine Bedeutung als Abschluß bei Datenstrukturen.

Page 59: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 59/238

5.6. POINTER 39

5.6.2 Funktionen zur Bearbeitung von Pointern

Die Befehle zum Arbeiten mit Pointern beginnen alle mit PTR. Die wichtigsten Befehle

zum Arbeiten mit Pointern werden beschrieben.  Pointer anlegen

pVar=PTR NEW([InitExpr])

– legt einen neuen IDL Pointer an

ohne Argument: Nullpointer ( p=PTR NEW() )

– InitExpr  wird benutzt, um Heap Variable zu initialisieren

– Keyword: ALLOCATE HEAP

undefinierte Heap Variable, aber kein Nullpointer.

( p=PTR NEW(/ALLOC) )  Pointer Array mit Nullpointern (nur Dimensionierung!) anlegen

pArr=PTRARR(D1,...,Dn)

– Di sind die Dimensionen des Ergebnisses und konnen skalare Ausdrucke sein.Es sind bis zu 8 Dimensionen moglich.

– Keyword: ALLOCATE HEAP

undefinierte Heap Variable, aber kein Nullpointer.  Pointer freigeben

PTR FREE,P1,...,Pn

– PTR FREE zerstort die Heap Variablen, auf die die Pointer Argumente zeigen.

Wenn der Pointer zerstort ist, dann ist die Pointer Variable eine ’dangling refe-

rence’.

a=PTR NEW(23)PRINT,a,*a

<PtrHeapVar1> 23

PTR_FREE,a

PRINT,a,*a

Invalid pointer: A

  Gultigkeit von Pointer Argumenten

– Result=PTR VALID(Arg)

Falls True, dann gultig.  Dereferenzierungsoperator *

– Anzeigen des Inhalts einer Heap Variablen, die von einer Pointer Variablen

referenziert wird

– Der *Operator muß der Variablen, die dereferenziert werden soll, vorangestellt

werden.  Erlaubte Operationen:

– Zuweisung, Dereferenzierung, Vergleich mit EQ oder NE

Page 60: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 60/238

40 KAPITEL 5. DATENSTRUKTUREN

5.6.3 Beispiele mit Pointern

Pointer auf Wert

pvar1=PTR_NEW(5)

HELP,pvar1

PVAR1 POINTER = <PtrHeapVar1>PRINT,*pvar1

5

Nullpointer - es wird keine Heap-Variable angelegt, kann nicht dereferenziert werden.

nptr=PTR_NEW()

HELP,nptr

NPTR POINTER = <NullPointer>

Pointer auf Arrays

vec=FINDGEN(10)

pa=PTR_NEW(vec) ; erstelle eine Pointer-Array

PRINT,*pa ; Ausgabe des Feldes

0 1 2 3 4 5 6 7 8 9

PRINT,TOTAL(*pa),(*pa)[3]

45.0000 3.0000

pb=pa

HELP,pa,pb

PA POINTER = <PtrHeapVar6>

PB POINTER = <PtrHeapVar6>

5.6.4 Empty Pointer

Empty Pointer sind keine Nullpointer. Man kann ein Pointer-Array bzw. eine Pointer-

Variable im Heap anlegen, ohne daß diese einen Wert hat. Die Zuweisung von Werten

kann spater erfolgen.

pa=PTR_NEW(/ALLOCATE_HEAP)

pc=PTRARR(3,/ALLOCATE_HEAP)

Hier erfolgt die Zuweisung von Werten.

*pa=’TEST’FOR i=0,N_ELEMENTS(pc)-1 DO *pc[i]=i

FOR i=0,N_ELEMENTS(pc)-1 DO PRINT,*pc[i]

Hinweis:

Mit ALLOCATE HEAP besteht die Moglichkeit, die entstehenden Pointer mit Werten zu

versehen.

Ohne die Angabe ALLOCATE HEAP entstehen Nullpointer.

Page 61: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 61/238

5.6. POINTER 41

5.6.5 Gultige Pointer

Falls der Pointer existiert, gibt die Funktion PTR VALID den Wert 1 zuruck, sonst 0 (Null-

pointer).

a=PTR_NEW(5)

b=PTR_NEW()c=PTR_NEW(/ALLOCATE_HEAP)

PRINT,PTR_VALID(a)

1

PRINT,PTR_VALID(b)

0

PRINT,PTR_VALID(c)

1

5.6.6 Datenbereich mit Pointer belegen

In dem Beispiel wird ein Bereich von 32 MB angelegt.

bigarray=MAKE_ARRAY(2000,2000,/DOUBLE)

Jeder definierten Variablen kann man einem Pointer zuweisen.

ptrval=PTR_NEW(bigarray)

Bei der Zuweisung wird eine Kopie des Bereiches angelegt und damit doppelt belegt, die

Variable bigarray und die Heap Variable, auf die der Pointer zeigt.

Das Keyword NO COPY verhindert das. Nach dem Anlegen des Pointers ist die Variable

bigarray undefiniert, so daß man den Speicherbereich nur einmal belegt hat.ptrval=PTR_NEW(bigarray,/NO_COPY)

HELP,bigarray

BIGARRAY UNDEFINED = <Undefined>

HELP,ptrval

PTRVAL POINTER = <PtrHeapVar1>

Mehrfache Pointer Referenz

Eine weitere Variable zeigt auf das Array.

ptrval2=ptrval

HELP,ptrval2

PTRVAL2 POINTER = <PtrHeapVar1>HELP,/MEMORY

Mit dem Befehl HELP,/MEMORY kann man uberprufen, wieviel Speicherplatz belegt ist.

Es sind nur 32 MB belegt. Zum Test kann kann man zuvor ein .RESET oder Reset uber

Menu ausfuhren.

Page 62: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 62/238

42 KAPITEL 5. DATENSTRUKTUREN

5.6.7 Pointer auf eine Struktur

Wird ein Pointer auf eine Struktur gelegt, muß man bei der Dereferenzierung darauf achten,

das man nur die Struktur-Variable dereferenziert, wenn man den Wert eines Tags benutzen

mochte.

s={name:’Joe’,age:40,height:177}sptr=PTR_NEW(s)

PRINT,(*sptr).age

40

5.6.8 Pointer in einer Struktur

Wenn man in einer benannten oder anonymen Struktur dynamisch Speicherplatz anlegen

will, muß man statt der Werte Pointer definieren.

Das Beispiel zeigt diese Moglichkeit mit einer benannten Struktur.

ud=’UNDEFINED’

data=CREATE_STRUCT(NAME=’S’, $

’p1’,PTR_NEW(ud),’p2’,PTR_NEW(ud),’p3’,PTR_NEW(ud))

HELP,data,/STR

** Structure S, 3 tags, length=12:

P1 POINTER <PtrHeapVar26>

P2 POINTER <PtrHeapVar27>

P3 POINTER <PtrHeapVar28>

Die Strukturvariable data enthalt drei Tags, deren Werte als Pointer definiert sind. Bei der

Dereferenzierung der Pointer-Variablen eines Tags, steht das Dereferenzierungs-Zeichen

vor dem Variablen Namen der Struktur.

*data.p1=MAKE_ARRAY(100,100,/FLOAT)

HELP,*data.p1

<PtrHeapVar26> FLOAT = Array[100, 100]

*data.p1=INDGEN(100,/FLOAT)

HELP,*data.p1

<PtrHeapVar26> FLOAT = Array[100]

Solange ein Tag nicht mit einem anderem Wert belegt ist, enthalt der Pointer den String

’UNDEFINED’. So kann man leicht herausfinden, ob ein Pointer mit einem anderem Wert

belegt ist oder nicht.

Hinweis:

Der Pointer in der Struktur ist ein Platzhalter, um dynamisch Speicherbereiche anzulegen!

Page 63: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 63/238

5.6. POINTER 43

5.6.9 Pointer auf eine Struktur und Pointer in der Struktur

Eine Struktur kann Pointer enthalten und die Struktur selbst kann auch ein Pointer sein.

ud=’UNDEFINED’

data=PTR_NEW(CREATE_STRUCT(NAME=’S’, $

’p1’,PTR_NEW(ud),’p2’,PTR_NEW(ud),’p3’,PTR_NEW(ud)))

HELP, data

DATA POINTER = <PtrHeapVar8>

HELP, *data

PtrHeapVar4> STRUCT = -> S Array[1]

HELP, *data, /STR

** Structure S, 3 tags, length=12, data length=12:

P1 POINTER <PtrHeapVar1>

P2 POINTER <PtrHeapVar2>

P3 POINTER <PtrHeapVar3>

Mit der Dereferenzierung der Variablen data sieht man, daß diese Variable eine Struktur

enthalt. Mit der zusatzlichen Angabe des Keywords /STR werden die Tags der Struktur

gelistet. Die Werte der Tags liegen als Pointer vor.

HELP,*(*data).p1

<PtrHeapVar1> STRING = ’UNDEFINED’

HELP,(*(*data).p2)

<PtrHeapVar2> STRING = ’UNDEFINED’

Die Dereferenzierung auf der Tag-Ebene muß durch zweifache Anwendung des

Dereferenzierungs-Operators geschehen. Eine Unterscheidung auf die verschiedenen Poin-

ter erreicht man durch die Klammerung der verschiedenen Variablen. Die beiden oben ste-

henden Schreibweisen sind aquivalent. Die zweite Schreibweise ist eine deutlichere Ver-

anschaulichung dieser Abhangigkeiten.

Page 64: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 64/238

44 KAPITEL 5. DATENSTRUKTUREN

5.6.10 Pointer freigeben

Pointer freigeben und Heap Bereich loschen

a=PTR_NEW(5)

PTR_FREE,a

HELP,aA POINTER = <PtrHeapVar7>

PRINT,PTR_VALID(a)

0

Der Heap-Bereich wird geloscht. Um das zu prufen, benutzt man die Funktion

PTR VALID. Der freigegebene Pointer wird zum Nullpointer.

Hinweis:

PTR VALID() listet alle Pointer

Ein PTR FREE, PTR VALID() loscht dann alle Pointer in einem Befehl.

5.6.11 HEAP GC Heap garbage collection

Der Zugriff auf einen Pointer kann schnell verloren sein. Wenn z.B. ein Pointer in einem

Unterprogramm angelegt, aber nicht an das aufrufende Programm weitergegeben wird oder

wenn eine Pointer-Variable auf einen anderen Wert gesetzt wird. Eine Variable konnte mit

DELVAR bzw. TEMPORARY geloscht werden.

a=PTR_NEW(5) & a=0

Der Zugriff auf den Heap-Bereich ist dann nur noch durch garbage collection oder durch

Verlassen von IDL moglich.

 

HEAP GC ist der Befehl fur Heap garbage collection.

Freigeben von Heap Memory, der nicht mehr ansprechbar ist. 

HEAP GC durchsucht alle IDL Variablen nach Pointer und Objekt Referenzen und

zerstort die Heap Variablen, die nicht mehr ansprechbar sind. Die Pointer Heap

Variable (bzw. Objekt Heap Variable) wird zerstort und der Speicherplatz, den sie

belegt, wird freigegeben.

Hinweis:

Man sollte Anwendungen so schreiben, daß man zuvor uberpruft, ob man einen gultigenPointer bearbeitet (PTR VALID). Am Ende der Anwendungen sollte der Speicher mit den

normalen Speicherfreigabe Routinen (PTR FREE) aufgeraumt werden.

Page 65: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 65/238

5.6. POINTER 45

5.6.12 Beispiel mit Pointern

Vorgegeben sind einige Datasets in Form von Strukturen

Diese und einige Datasets, die dynamisch zur Laufzeit erstellt werden, sollen zu-

sammengefugt werden in ein  Pointer Array  eine verkettete Pointer Liste (indem man einen Pointer Tag auf den nachsten Daten-

satz in der Struktur zufugt)

dataset1 = 

time : INDGEN(150,/FLOAT), $

data : COS(INDGEN(150,/FLOAT)/10.0) , $

attr : ’cosinus’¡ 

dataset2 = 

time : INDGEN(100,/FLOAT), $

data : SIN(INDGEN(100,/FLOAT)/20.0) , $

attr : 1000L¡ 

dataset3 = 

time : INDGEN(100,/FLOAT), $

data : TAN(INDGEN(100,/FLOAT)/20.0) , $

attr : ’tangens’¡ 

dataset4 = dataset3

Page 66: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 66/238

46 KAPITEL 5. DATENSTRUKTUREN

Es gibt zwei L osungen Die Losungen werden exemplarisch skizziert.  Pointer Array

Pointer auf Strukturen zuweisen

IDL nahe L osung siehe ptrvec.pro

arr_ptr= PTRARR(3, /ALLOCATE_HEAP)*arr_ptr[0] = dataset1

*arr_ptr[1] = dataset2

*arr_ptr[2] = dataset3

data_ptr = PTR_NEW(dataset4)

arr_ptr = [arr_ptr, data_ptr] ; Verketten

; Pointer Array erweitern

  Link List

Verknupfen, indem man einen Pointer in die Struktur schreibt. Dieser zeigt auf den

nachsten usw.Man braucht sich nur den ersten Pointer zu merken.

C nahe Losung siehe ptrlink.pro

dataset1 = 

time : INDGEN(150,/FLOAT), $

data : COS(INDGEN(150,/FLOAT)/10), $

attr : ’cosinus’, $

data_ptr: PTR_NEW()¡ 

ptr1 = PTR_NEW(dataset1)

dataset2 = ...

ptr2 = PTR_NEW(dataset2) ; Defreferenzieren bei

(*ptr1).data_ptr=ptr2 ; Strukturen mit *....

actualptr = ptr1

Page 67: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 67/238

5.6. POINTER 47

5.6.13 Ubungen

Die Losungen zu den Ubungen findet man im Anhang auf Seite 201.

1. Erstelle eine Struktur mit einer Farbzuordnung der ersten 9 Farben von TEK COLOR,

siehe Online Hilfe. Diese Struktur soll mit der Start-Up-Datei initialisiert werden.

Optional soll sie auf der System Variablen F definiert werden.

2. Vorgegeben sind:

data=[[’0.000000’,’0.841471’,’0.909297’,’0.141120’,$

’-0.756802’,’-0.958924’,’-0.279415’,’0.656987’,$

’0.989358’,’0.412118’],$

[’0.000000’,’1.00000’,’2.00000’,’3.00000’,$

’4.00000’,’6.00000’,’5.00000’,’7.00000’,$

’8.00000’,’9.00000’]]

Aus dem String-Array sollen zwei Vektoren gebildet werden. Die erste Datenzeile

soll als Float, die zweite Datenzeile soll als Integer wiedergegeben werden.

3. Zwei Datenfelder sollen verknupft werden

a=MAKE_ARRAY(10,/INDEX,/FLOAT)

b=MAKE_ARRAY(2,value=-40.0)

  Verknupfung in der Reihenfolge a,b  Nach dem funften Element von a soll der Vektor b eingefugt werden.

4. Bilde einen Vektor von Jahreszahlen von 1990 bis 2010, ohne arithmetische Ope-

rationen zu verwenden.

5. Speichere mindestens 3 Systemvariablen in einer Struktur.

6. Erstelle ein Pointer-Array mit den Variablen:a=’Dies ist ein Beispiel’

b=SYSTIME(1)

c={Farbe:’rot’}

7. Gegeben sind:

a=MAKE_ARRAY(20,2)

b=MAKE_ARRAY(/INDEX,20,2)

  Verknupfe a und b, so daß ein Feld der Große [40,2] entsteht.  Verknupfe a und b, so daß ein Feld der Große [20,4] entsteht.

8. Bilde die nachfolgenden Felder 1-dimensional ab.a=MAKE_ARRAY(10,10,3)

b=MAKE_ARRAY(1,10)

9. Bei dem vorgegebenen Feld sollen die Daten transponiert werden (Spiegelung ent-

lang der Diagonalen).

a=MAKE_ARRAY(/INDEX,10,2)

Page 68: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 68/238

48 KAPITEL 5. DATENSTRUKTUREN

Page 69: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 69/238

Kapitel 6

Arbeiten mit Datenstrukturen

6.1 IDL Operatoren

Daten werden durch Operatoren verknupft.

  Klammern (): bei Funktionsargumentlisten, Spezifizierung der Ordnung bei

Ausfuhrung  Alle IDL Operatoren konnen auf mehrdimensionale Felder angewendet werden:

arr=arr-100

arr=arr+(2*!PI)  Boolsche Ausdrucke

AND, OR, NOT, XOR  Vergleichsoperatoren

EQ, NE, LE, LT, GE, GT

Beispiel:

A=7

PRINT, A GT 3, A EQ 7

1 1  Mathematische Operatoren

=, +, - , *, /, ˆ(caret, Exponentiation), MOD (Divisionsrest)  Matrixmultiplikation

# (Spalte der ersten Matrix mit Zeile der zweiten Matrix)

## (echte Matrixmultiplikation! Zeilen der ersten Matrix mit Spalten der zweitenMatrix)

  Minimum ’ 

’ und Maximum ’¡ 

’ Operator:

Verwendung bei Bildern, Kontrast!

Beispiel:

x=[5,10,20] > [6,9,30] &

PRINT,x

ergibt: 6 10 30

49

Page 70: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 70/238

50 KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

6.2 Wertzuweisung bei Variablen

Wertzuweisungen werden mit dem mathematischen Operator = vorgenommen.

value=16/5 Integer-Division, value=3

value=16/5. 3.2vektor=[1,3,5] Vektor mit drei Elementen

array=INTARR(100,100) Integer-Feld mit 100*100 Werten mit dem Wert 0.

array=array+1 Jedes Element wird um 1 erhoht.

array=1. Achtung: Integer Feld der vorigen Anweisung bzgl.

Typ und Bedeutung dynamisch verandert! array ist

ein Skalar mit dem Typ FLOAT.

6.2.1 Wertzuweisung bei mehrdimensionalen Feldern

Bei der Zuweisung mehrdimensionaler Felder wird die letzte Dimension entfernt, wenndiese 1 ist.

Beispiel:

a=INDGEN(10,10,10,/LONG)

b=a[*,*,5]

HELP,b

B LONG = Array[10, 10]

c=REFORM(b,10,10,1)HELP,c

C LONG = Array[10, 10, 1]

d=c

HELP,d

D LONG = Array[10, 10]

Hinweis:

Mit REFORM kann man die letzte Dimension mit 1 erzwingen. Jedoch wird diese bei

einer weiteren Wertzuweisung geloscht.

a=INDGEN(10,10,10,/LONG)

b=REFORM(a,1000)

HELP,b

B LONG = Array[1000]

Hinweis:

Mit REFORM kann man mehrdimensionalen Arrays in einen Vektor andern.

Page 71: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 71/238

6.3. WARNUNG VOR INTEGER-OVERFLOW 51

6.3 Warnung vor Integer-Overflow

Beim Arbeiten mit Variablen muß man den Wertebereich der Zahlen berucksichtigen. Ein

Problem wird im nachfolgendem Beispiel beschrieben.

b=5000

PRINT,10*b

Das Ergebnis ist eine negative Zahl!

b=5000L

PRINT, 10*b

Wenn b als Long Integer definiert wird, ist das Ergebnis richtig.

Hinweis:

Prozessor fangt Integer-Overflow nicht ab (liegt nicht an IDL!)

6.4 Speicherplatzverwaltung

Bei der Arbeit mit großen Datenmengen, die gerade noch in das RAM des Rechners passen,

werden in IDL die Operationen langsam. Bezuglich des Speicherplatzes ist folgendes zu

beachten:

A=A+1 Speicherplatz doppelt notwendig, weil ein neues Feld fur

das Ergebnis der Addition angelegt wird.

A=TEMPORARY(A)+1 Wenn man statt A=A+1 im obigen Beispiel die

TEMPORARY-Funktion verwendet, erfordert dies kei-nen zusatzlichen Speicherplatz. Man arbeitet mit einer

temporaren Kopie, wahrend die Variable selbst”

undefined“

gesetzt wird.

Page 72: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 72/238

52 KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

6.5 L oschen von Variablen

Eine Variable bleibt solange gultig, bis sie neu definiert oder mit DELVAR oder

TEMPORARY geloscht wird.

Hinweis:

Einschr ankung: DELVAR funktioniert nur im MAIN! Die Erklarung zu MAIN-

Programmen folgt auf Seite 139.

Eine allgemeine Losung laßt sich mit der TEMPORARY-Funktion oder einer Wertzuwei-

sung realisieren.

Beispiel:

a=MAKE_ARRAY(2000,/LONG)

dummy=TEMPORARY(a)

dummy=0

HELP,dummy

DUMMY INT = 0

HELP,a

A UNDEFINED = <Undefined>

a ist undefined und dummy enthalt alle Werte von a. Wenn dummy dann auf den Wert 0

gesetzt wird, hat dummy nur noch diesen einen Wert.

Page 73: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 73/238

6.6. EFFIZIENTES ARBEITEN MIT FELDERN 53

6.6 Effizientes Arbeiten mit Feldern

6.6.1 Vorteil von Feld-Operationen

IDL ist eine Array-orientierte Sprache. Operationen auf Felder sind erheblich schneller als

Index-orientiertes Arbeiten. Daher sollte man die Programmierung von Schleifen vermei-den.

FOR j=0,n-1 DO $

IF b[j] GT 0 THEN a[j]=a[j] + b[j]

schneller: a = a + ( b GT 0 ) *b negative Werte maskieren!

noch schneller: a = a + ( b¡ 

0)”

GT“ Operator, weniger Feld-Operationen

Zum Vergleich der Laufzeiten wurden die oben stehenden Beispiele in IDL-Code umge-

setzt. Mit der IDL-Routine SYSTIME wird die Laufzeit gemessen.

PRO feld_op

n = 100000L

a = FLTARR(n)

b = FLTARR(n) - n/2.0

t1 = SYSTIME(1)

FOR j=0L, n-1 DO $IF b[j] GT 0 THEN a[j] = a[j] + b[j]

t1 = SYSTIME(1)-t1

PRINT, ’for=’, t1, FORMAT=’(a,f10.8)’ ; 0.325 sec

t2 = SYSTIME(1)

a = a + ( b GT 0 ) * b

t2 = SYSTIME(1)-t2

PRINT, ’gt =’, t2, FORMAT=’(a,f10.8)’ ; 0.045 sec

t1 = SYSTIME(1)a = a + ( b > 0 )

t1 = SYSTIME(1)-t1

PRINT, ’ > =’, t1, FORMAT=’(a,f10.8)’ ; 0.023 sec

END

Beispiel 6.1: Datenstrukturen: Vorteil von Feld-Operationen

Page 74: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 74/238

54 KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

6.6.2 Geschickte Klammerung

data=MAKE_ARRAY(50,20,/FLOAT)

data ist ein Array

new = data * SIN(1.12) / COS(3.0)

Schlecht, da fur jedes Element von data der Quotient gebildet werden muß.

new = data * (SIN(1.12) / COS(3.0))

Gut, da nur einmal der Quotient gebildet werden muß. Der Quotient wird mit jedem Ele-

ment von data multipliziert.

6.7 Einstellung von Compiler Optionen

Durch Compiler Optionen werden Voreinstellungen fur den Compiler getroffen.

COMPILE_OPT STRICTARR, DEFINT32

 

STRICTARR erlaubt nur eckige Klammern bei Arrays.

 

DEFINT32 nimmt Integer Konstanten defaultmaßig als 32 Bit statt als 16 Bit. IDL

hat als Default 16 Bit.

Page 75: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 75/238

6.8. FILTERN VON DATEN 55

6.8 Filtern von Daten

Zum Filtern von Daten gibt es eine Vielzahl von Funktionen. Alle diese Funktionen geben

ein Feld mit Indices zuruck.

6.8.1 WHERE-Funktion

Mit WHERE werden Daten in Abhangigkeit einer Bedingung gefiltert. Als Ergebnis erhalt

man die Indices der Daten, die die Bedingung erfullen.

arr=INDGEN(15,/BYTE)

ind = WHERE( arr LE 10b AND arr GE 5b )

arr[ind] =255b

PRINT,arr

0 1 2 3 4 255 255 255 255 255 255 11 12 13 14

oder kurzer!

arr[WHERE( arr LE 10b AND arr GE 5b)] = 255b

PRINT,arr

0 1 2 3 4 255 255 255 255 255 255 11 12 13 14

Hinweis:

WHERE ist eine sehr machtige Funktion, die auch bei der Bildverarbeitung wichtig ist!

Wichtig ist das Argument COUNT, womit man prufen kann, ob Indices gefunden wurden,

siehe Beispiel bei Bildverarbeitung, Seite 118.

6.8.2 Verwendung der Funktionen MIN, MAX, SORT und UNIQ

Die Funktionen MIN, MAX, SORT und UNIQ sind weitere Funktionen, um Daten zu filtern.

6.8.2.1 SORT

Die SORT-Funktion gibt einen Vektor mit Indices zuruck. Diesen Vektor kann man dazuverwenden, um ein Feld in aufsteigender Reihenfolge zu sortieren.

vec=[9,7,1,10,0]

idx=SORT(vec)

PRINT,idx

4 2 1 0 3

PRINT,vec[idx]

0 1 7 9 10

Page 76: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 76/238

56 KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

Jeder Typ von Daten kann sortiert werden, z.B auch Strings.

vec=[’b’,’ab’,’abc’,’ba’,’aaa’]

idx=SORT(vec)

PRINT,vec[idx]

aaa ab abc b ba

6.8.2.2 MIN und MAX

Die MIN-Funktion ermittelt den kleinsten Wert eines Feldes. Entsprechend ermittelt die

MAX Funktion den großten Wert.

Mittels der benannten Variablen der MIN- und MAX-Funktion MIN SUBSCRIPT und

MAX SUBSCRIPT kann man die Indices des Minimums oder Maximums eines Feldesbestimmen.

vec=[9,7,1,10,0]

mi=MIN(vec,MIN_SUBSCRIPT)

PRINT, mi

0

PRINT,MIN_SUBSCRIPT

4

Das Minimum hat den Wert 0 und den Index 4.

vec=[9,7,1,10,0]

ma=MAX(vec,MAX_SUBSCRIPT)

PRINT, ma

10

PRINT,MAX_SUBSCRIPT

3

Das Maximum hat den Wert 10 und den Index 3.

6.8.2.3 UNIQ

Die UNIQ-Funktion ermittelt die Indices von Werten eines Feldes. Mehrfach vorkommen-

de Werte werden nur einmal berucksichtigt. Dies kann an einem Beispiel einfach erklart

werden.

vec=[’Jan’,’Feb’,’Feb’,’Mar’]

idx=UNIQ(vec)

PRINT,idx

0 2 3

PRINT,vec[idx]Jan Feb Mar

Page 77: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 77/238

6.9. UBUNGEN 57

6.9 Ubungen

Die Losungen zu den Ubungen findet man im Anhang auf Seite 203.

1. Erstelle einen Vektor mit Integer-Zahlen von 2000 bis 2010

2. Feld als Index fur andere Feldera = [ 7 , 8 , 1 , 2 , 5 , 5 ]

b = [ 0 , 5 , 3 , 4 ]

was ergibt: PRINT, a[b]

3. Addiere folgende Strings zu einem neuen String str

str1=’Idl ist’

str2=’ eine starke Sprache’

4. Bilde alle alphabetischen Zeichen in einem STRING-Vektor ab. Das Ergebnis soll

ein String-Vektor der Lange 26 mit der Anordnung: Aa Bb bis Zz sein.

5. Gegeben sind zwei Vektoren.a=[-1,-1,-1,-999,-999,-1,-1,-999,-1]

b=[-999,-999,-999,-999,-1]

Bestimme die Indices der Werte -999 bei den beiden Vektoren und ersetze diese

durch den Wert +999.

6. Nachfolgendes Feld soll sortiert werden. Danach sollen alle doppelt vorkommenden

Werte durch einen Wert ersetzt werden.

a=[1,1,1,2,1,2]

7. Ein Array der Dimension [10,2] soll in ein Struktur-Array gespeichert werden.

Die Struktur hat 2 Tags: x und y mit dem Typ FLOAT. Das Struktur-Array hat die

Dimension 10.

x soll den ersten Vektor enthalten und y den zweiten Vektor. Danach sollen alle Werte

bei y kleiner 5 in eine andere Struktur umgespeichert werden.

data=[[’0.000000’,’0.841471’,’0.909297’,’0.141120’,$

’-0.756802’,’-0.958924’,’-0.279415’,’0.656987’,$

’0.989358’,’0.412118’],$

[’0.000000’,’1.00000’,’2.00000’,’3.00000’,$

’4.00000’,’6.00000’,’5.00000’,’7.00000’,$

’8.00000’,’9.00000’]]

Page 78: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 78/238

58 KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

Page 79: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 79/238

Kapitel 7

Einbettung ins Betriebssytem

7.1 Umgebungs-Variablen

Um beim Start von IDL bestimmte Einstellungen zu definieren, verwendet man die vom

Betriebssytem zur Verfugung gestellten Umgebungs-Variablen. Mit GETENV liest man

Umgebungs-Variablen und mit SETENV schreibt man in Umgebungs-Variablen.

7.1.1 Umgebungs-Variablen des Betriebssystems

IDL PATH aquivalent zu !PATH (IDL Libraries)

IDL DIR aquivalent zu !DIR (IDL Directory)

LM LICENSE FILE Pfad fur Lizenzfile

IDL STARTUP Startup File = Batch-Datei,

wird beim Aufruf von IDL durchlaufen

USER Username unter Unix

USERNAME Username unter Windows

Hinweis:

Die Abfrage des Usernamens kann dazu verwendet werden, um Daten in Benutzer spezi-fische Verzeichnisse zu speichern.

59

Page 80: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 80/238

60 KAPITEL 7. EINBETTUNG INS BETRIEBSSYTEM

7.2 Wechsel zum Betriebssystem (Unix, Windows)

Mit den im folgenden beschriebenen Befehlen kann man von IDL aus zum Betriebssystem

wechseln oder Informationen abfragen.

Mit vorangestelltem $ kann man ein Unix Kommando von der IDL-Command-Line

ausfuhren.

$ ls

oder

$ pwd

Im Command-Line Interface zu IDL kann man den SPAWN Befehl verwenden, um

in das Betriebssystem zu wechseln. Eine Shell wird als child process gestartet. Es konnen

dann Befehle abgesetzt werden. Mit dem Befehl EXIT gelangt man zuruck zu IDL.

Der SPAWN Befehl kann auch in einem IDL Programm aufgerufen werden. Bei dieser Artder Anwendung gibt man das auszufuhrende Kommando und eine Variable als Argument

an die SPAWN Funktion weiter. Das Ergebnis wird in dieser Variable zuruckgegeben.

Beispiel:

SPAWN ,command[,result]

SPAWN,’ls’,result

PRINT,result

Page 81: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 81/238

Kapitel 8

Hilfe, Sicherung

8.1 Die Hilfe-Routine von IDL

Um Variablen oder Eigenschaften der IDL Sitzung abfragen zu konnen, verwendet man

das HELP Kommando.

HELP Info uber Variablen und kompilierte Funktionen

HELP, data Info uber Variable mit Namen data

HELP, NAMES=’A*’ Info uber Variablen, die mit A anfangen

HELP, /ROUTINES Liste der kompilierten Funktionen

HELP, /FILES Info uber Dateien

HELP, /DEVICE Info uber das aktuelle graphische Device

HELP, /RECALL COMMANDS letzte 20 Kommandos

(oder 

Taste)

HELP, /SYSTEM VARIABLES Info uber Systemvariable

HELP, OUTPUT=result liefert String-Array result , mit allen bis zu dem

Zeitpunkt gesetzten Variablen. Information kann

weiter verarbeitet werden!

HELP, /MEMORY genutzter Hauptspeicher

HELP, /SOURCE bereits kompilierte Routinen werden gelistet

61

Page 82: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 82/238

62 KAPITEL 8. HILFE, SICHERUNG

8.2 Save und Restore einer IDL-Sitzung, IDL- Binary

Mit SAVE kann man Daten in IDL Sitzungen sichern. Das Datenformat ist unabhangig von

Plattform und Version.

SAVE [,var1,var2,...varn] ;Variablen sind optionalKeywords:

  FILENAME=’savename.dat’

Speichern oder Lesen unter dem angegebenem Namen  ALL

alle lokalen Variablen, System-Variablen, Common Blocke

Achtung: Versions Probleme System-Variable andern sich schon mal von Version

zu Version.  VARIABLES

Sinnvoller als das Keyword ALL ist es, alle Variablen zu sichern.  ROUTINES

alle ubersetzten Programme der aktuellen IDL-Sitzung in Binarform. Die

Ausfuhrung binarer Programme ist schneller! Die Nutzung von Runtime Lizenzen

ist auf Seite 14 beschrieben.  SYSTEM VARIABLES

Vorsicht: Bei Versions-Wechsel kann sich Struktur andern  XDR (entspricht Standard: Unix + Windows)

wichtig fur plattformunabhangiges Programmieren  COMPRESS

ZLIB KompressionHinweis:

Gibt man keinen File-Namen an, lautet der Default Save- bzw. Restore-Name: idlsave.dat.

Page 83: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 83/238

8.2. SAVE UND RESTORE EINER IDL-SITZUNG, IDL- BINARY 63

Beispiel: Alle Variablen sichern

SAVE,/VARIABLES,FILENAME=’daten.dat’

; reset IDL

.RESET_SESSION

; Restore der gesicherten Daten

RESTORE, FILENAME=’daten.dat’

Beispiel: zwei Variablen sichern

a=1

b=10.0

SAVE,a,b,FILENAME=’daten.dat’

.RESET_SESSION

; Restore der gesicherten Sitzung

RESTORE, FILENAME=’daten.dat’

Page 84: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 84/238

64 KAPITEL 8. HILFE, SICHERUNG

Page 85: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 85/238

Kapitel 9

Definitionen zur Datenausgabe

9.1 Koordinatensysteme

Es gibt drei definierte Koordinatensysteme (Normal-, Daten- und Device-Koordinaten).

Diese sind mit den Keywords: /NORMAL, /DATA und /DEVICE, zuordbar.

DATA Die Datenkoordinaten sind die Default-Koordinaten. Die Benutzerdaten

werden als Datenwerte interpretiert.

NORMAL Im normalisierten Koordinatensystem konnen Werte zwischen (0,0)

und (1,1) angegeben werden.

Die Verwendung von normalisierten Koordinaten wird fur die relative

Positionierung benotigt.

DEVICE Beim DEVICE-Koordinatensystem handelt es sich um die physikalische

Koordinaten des graphischen Gerates. Diese werden graphisch orientiert

in Pixeln angegeben. Das Minimum ist (0,0) und das Maximum ist

begrenzt durch die maximale Anzahl Pixel des graphischen Ausgabe-

gerates. Die System-Variablen: !D.X SIZE, !D.Y SIZE enthalten die

 jeweils maximale Anzahl Pixel.

Abhangigkeit: Bildschirm bzw. Drucker

Hinweis:

Alle Koordinatensysteme sind gleichzeitig vorhanden.

65

Page 86: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 86/238

66 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.2 Zeichens atze

Fur die Ausgabe von Zeichenketten gibt es Steuerzeichen, mit denen die Darstellung

z.B. mathematischer Zeichen erfolgt. Ein anderer Typ von Steuerzeichen gestattet die

Positionierung nachfolgender Zeichen (Subscripts, Superscripts).

Die Steuerzeichen werden in den Text eingefugt und beginnen mit ’!’. Zur Darstellung des! als Textzeichen wird ’!!’ im Text eingefugt.

Auswahl eines Fonts

Weitere Informationen hierzu im User’s Guide: Tabellen aller Fonts

Steuerzeichen Bechreibung

!3 Simplex Roman (Default)

!4 Griechisch

!12 Simplex Script

!9 oder !M Mathematisch

!X Kehre zum ursprunglichen Font zuruck 

Tabelle 9.1: Definitionen zur Datenausgabe: Auswahl eines Fonts

Positionieren von Zeichen

Steuerzeichen Beschreibung

!C Fugt einen Zeilenumbruch ein.

!E Die folgenden Zeichen werden auf Exponentenhohe geschrieben undum den Faktor 0.44 verkleinert.

!I Die folgenden Zeichen werden auf Indexhohe geschrieben und um

den Faktor 0.44 verkleinert.

!N Auf Normalhohe und ursprungliche Zeichengroße zuruckstellen.

!D Die folgenden Zeichen werden tiefgestellt und um den Faktor 0.62

verkleinert.

!U Die folgenden Zeichen werden hochgestellt und um den Faktor 0.62

verkleinert

!! Darstellen des Symbols !

!A Die folgenden Zeichen werden oberhalb des Bruchstrichs plaziert

!B Die folgenden Zeichen werden unterhalb des Bruchstrichs plaziert

Tabelle 9.2: Definitionen zur Datenausgabe: Positionieren von Zeichen

Page 87: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 87/238

9.2. ZEICHENSATZE 67

9.2.1 Auswahl eines Fonts

IDL kennt drei Typen von Fonts: Vektor-, Truetype- und Hardware-Fonts.  Vektor-Fonts (Hershey)

XYOUTS,400,300,’!12Simplex !4 Greek!X’,/DEVICE

Mit”

!Fontindex“ bekommt man die Hershey-Fonts. Mit einem erneuten”

!Fontin-dex“ mit einer anderen Fontnummer bewirkt man einen Fontwechsel. !X nimmt

den Font zuruck. Einige Formatierungsangaben wie Indices oder Subscripts sind

moglich, siehe vorstehende Tabelle.  Hardware Fonts

– Keyword Font=0 oder System-Variable!P.Font=0

– Auswahl auch uber Keywords bei DEVICE moglich

z.B. DEVICE,/TIMES  result=XFONT()

Oberflache, mit der man interaktiv alle X-Fonts ansehen und ausprobieren kann. 

PS SHOW FONTS

Eine PostScript Datei idl.ps wird erstellt. Dabei wird jeder Font auf einer Seite ge-

listet. Zusatzlich werden die Namen aller PostScript-Fonts, die IDL kennt, gelistet.

Beispiele:

str1=’Zeile1!CZeile2’

XYOUTS, 0.1, 0.2,str1, /NORMAL, CHARSIZE=2.5

Resultat:

str2=’A!EB !N* C!ID’

XYOUTS, 0.1, 0.4, str2, /NORMAL, CHARSIZE=2.5

Resultat:

str3=’!4abcde !9abcde !Xabcde’

XYOUTS, 0.1, 0.2, str3, /NORMAL, CHARSIZE=2.5

Resultat:

Griechische, mathematische und normale Schrift

Page 88: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 88/238

68 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.3 Farbtabellen

Zur Ausgabe farbiger Bilder werden Farbtabellen benotigt. Es gibt eine Reihe vordefinier-

ter Farbtabellen, die auf dem RGB-Modell basieren. Die Generierung eigener Farbtabellen

ist moglich.

9.3.1 Laden von Farbtabellen

DEVICE,DECOMPOSED=0 Um True Color Darstellungen in Direct Color umzudefi-

nieren

LOADCT,5 Laden einer vordefinierten Farbtabelle mit Index 5 (STD

GAMMA II)

XLOADCT Widget, das alle vordefinierten Farbtabellen anzeigt

XPALETTE Widget, das die Farb-Palette darstellt. Die Farb-Palette ist

modifizierbar.

TEK COLOR Die ersten 32 Farben der angezeigten Farbpalette sind in jedem Falle fur das Auge unterschiedlich und damit als

Index fur unterschiedliche Farben fur verschiedene Plot-

kurven zu gebrauchen.

TVLCT,r,g,b,/GET Lesen einer Farbtabelle.

liefert die Vektoren r,g,b der Lange 256 (bei 8 Bit Far-

ben und DEVICE, DECOMPOSED=0)

mit den aktuellen Werten der geladenden Farbtabelle.

TVLCT,r,g,b Schreiben einer Farbtabelle

Die Vektoren r,g,b, die je 256 Byte-Werte enthalten, re-

prasentieren die neue FarbtabelleMODIFYCT Speichern der Farbtabelle colors.tbl($HOME)

Die Standardtabelle liegt unter:

/usr/local/idl/idl/resources/colors

Beispiel mit TEK COLOR

TEK_COLOR

c = INDGEN(256,/BYTE)

d = BYTARR(20)+1b

TV, c#d

Abbildung 9.1: Definitionen zur Darstellung: Beispiel mit TEK COLOR

Die Verknupfung c#d generiert ein Array der Große [256, 20], welches in der er-

sten Spalte die Zahl 0, in der zweiten Spalte 1 usw. bis 255 enthalt. Da die Funktion

TEK COLOR aufgerufen wurde, sind die ersten 32 Farben in jedem Falle unterschiedlich.

Page 89: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 89/238

9.3. FARBTABELLEN 69

9.3.2 Arbeiten mit Farben

Folgende Hinweise sind zum Arbeiten mit Farben wichtig.

  RGB bezeichnet die Rot-Grun-Blau Farbtabelle. Jeder Anteil einer Farbe liegt

zwischen 0 und 255.

z.B. Farbe Rot = 255, 0, 0

  True Color Display

DEVICE,DECOMPOSED=0

  Begrenzung der Anzahl von Farben

– PRINT, !D.TABLE SIZE

– HELP, /DEVICE

– funktioniert nur in Start-Up Datei

WINDOW, COLORS = 128WINDOW, COLORS = -8

nutze alle Farben - davon 8 fur Shared Color Map

Page 90: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 90/238

70 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4 Steuerung der Ausgabe und Ausgabeger ate

Es werden verschiedene Ausgabegerate zum Darstellen von Bildern unterstutzt. Die

Bildschirmausgabe erfolgt unter einem Unix-System im X-Device, unter Windows im

WIN-Device. Eine vollstandige Liste aller Devices findet man in der Online-Hilfe unter

dem Stichwort Supported Devices.

Eine druckbare Ausgabe kann als PostScript-Datei angelegt werden. Zu dem Zweck wahlt

man das Device PostScript.

Alle genannten Devices (X, WIN, PS) werden mit dem Befehl SET PLOT angesteuert.

Normalerweise wird ein Bild pro Seite dargestellt und zwar unabhangig von der Art

des gewahlten Devices. Zur Darstellung mehrerer Bilder auf einer Seite gibt es mehrere

Moglichkeiten, die im folgenden Kapitel, siehe Seite 71, beschrieben werden.

9.4.1 Ausgabe  SET PLOT, Optionen:

Mit SET PLOT wird das Ausgabegerat festgelegt.

CGM Computer Graphic Metafile

HP HP- GL

LJ IDL unter VMS LJ250, LJ252 DEC Drucker

PCL HP-PCL

PS Postscript

Sun Sun Console

Tek Tektronix Terminal

X X Window System

Win PC

Mac Mac  DEVICE, Optionen:

Nach der Auswahl des Ausgabegerates mit dem SET PLOT kann man mit dem

DEVICE-Befehl weitere Einstellungen vornehmen.

– FILENAME

– LANDSCAPE oder PORTRAIT

– XOFFSET, YOFFSET, XSIZE, YSIZE

– FONTS

– COLOR

– ENCAPSULATED

Die Option sollte verwendet werden, wenn die PostScript-Datei in ein Doku-

ment eingebunden werden soll.

– CLOSE

Die Ausgabe auf das Ausgabegerat wird beendet. Bei Ausgabe in eine

PostScript-Datei wird diese abgespeichert.

  Information uber die Eigenschaften des Devices

– HELP, /DEVICE

Page 91: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 91/238

9.4. STEUERUNG DER AUSGABE UND AUSGABEGER ATE 71

9.4.2 Ausgabe mehrerer Bilder

Bei Bildschirmausgabe (X, WIN) wird mit dem ERASE-Befehl die Ausgabe des aktuellen

Fensters geloscht. Bei Postscript (PS) bedeutet der ERASE-Befehl einen Seiten Vorschub

(einfugen eines showage).

Die Bildschirmausgabe kann in mehreren Fenstern erfolgen, siehe Seite 74.

9.4.3 Positionieren von Bildern

Fur die Positionierung von Bildern gibt es mehrere Moglichkeiten:  Die Zeichenflache wird in gleichgroße Teile aufgeteilt (!P.MULTI)  Eine Positionsangabe

– selektiv beim jeweiligen Ausgabebefehl

(PLOT, CONTOUR, SURFACE,...).

Die Positionsangabe gilt dann nur fur diesen einen Befehl.

– global durch eine Systemvariable !P.POSITION

Die Positionsangabe gilt dann fur jede Ausgabe.  Images werden mit dem TV-Befehl dargestellt, siehe Seite 119. Beim TV-Befehl gibt

es einen Index, der fortlaufend von 0,1,2.. hochgezahlt wird. Die Bilder werden

dann von links nach rechts und von oben nach unten in den definierten Ausgabebe-

reich geschrieben.

Zusatzlich gibt es eine Positionsangabe mit zwei Parametern, die die Position fur

den Startpunkt des Bildes angeben. Die Positionierung von Bildern ist auf Seite 120

beschrieben.

Page 92: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 92/238

72 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4.3.1 Aufteilung der Zeichenfl ache in gleich große Teile

Durch Definition der Systemvariablen !P.MULTI ist es moglich, eine Bildflache in gleich

große Abschnitte aufzuteilen.

 

!P.MULTI[0]

0=nachster Plot beginnt auf neuer Seite 

!P.MULTI[1]

Anzahl Plots nebeneinander (Spalten) 

!P.MULTI[2]

Anzahl Plots untereinander (Zeilen)

!P.MULTI=[0,2,2]

Vier Plots auf einer Seite.

Reset auf Default: !P.MULTI=0

Abbildung 9.2: Definitionen zur Datenausgabe: !P.MULTI

Hinweis:

bei PLOT, CONTOUR, SURFACE,....

Jeder dieser Befehle loscht die Zeichenflache vor der Ausgabe und geht damit automatisch

in das nachste

Plotfeld“.

Page 93: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 93/238

9.4. STEUERUNG DER AUSGABE UND AUSGABEGER ATE 73

9.4.3.2 Keyword POSITION und System-Variable !P.POSITION

Eine beliebige Aufteilung der Zeichenflache definiert man entweder mit der Systemvaria-

blen !P.POSITION oder uber das POSITION Keyword.

Ein Setzen der System-Variablen !P.POSITION bleibt bis zu einer erneuten Definition

bzw. Reset gultig!!P.POSITION=[0.1,0.1,0.5,0.5]

; normalisierte Koordinaten

; Bereich im linken unteren Viertel

PLOT,x,y

!P.POSITION=0 ; reset

PLOT,x,y,POSITION=[0.1,0.1,0.5,0.5]

Hinweis:POSITION als Keyword-Variable gilt nur fur den Befehl!

Abbildung 9.3: Definitionen zur Datenanalyse: Keyword POSITION

Hinweis:

Mehrere Bilder pro Seite (PLOT, CONTOUR, SURFACE) durch Ausschalten des Loschens

der Zeichenflache mit dem Keyword /NOERASE.

Weitere Informationen zum Positionieren von Bildern siehe Seite 120

Page 94: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 94/238

74 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4.4 Bildschirm Ausgabe

Die Bildschirm Ausgabe erfolgt in Fenstern. Die Große eines Fensters (window) und die

Position wird in DEVICE Koordinaten angegeben.

Hinweis:

Bei einer Bildschirmauflosung von 1280x1024 Punkten ist (0,0) links unten und

(1279,1023) rechts oben.

Ein Ausgabe-Fenster wird mit der WINDOW-Routine erstellt. Die Standardgroße eines

Ausgabe-Fensters betragt 640x512 Pixel. 

WINDOW, 3

Ein Window bekommt die Nummer 3; maximal 128 graphische Windows mit den

Nummern (0 .. 127) sind moglich. Die Nummern 0-31 sind anwahlbar. Die Num-

mern ab 32 sind fur WIDGET DRAW reserviert.  Window mit der nachsten freien Nummer

WINDOW, /FREE

Mit Keyword FREE bekommt man die nachste unbenutzte Windownummer ab 32.  Große und Position des Windows

WINDOW, 0, XSIZE= 300, YSIZE = 400

WINDOW, 0, XPOS = 200, YPOS = 300

  Spezifizieren einer Uberschrift fur das Fenster

WINDOW, 0, TITLE = ’Surface’

  Erstellen eines Windows im Speicher (nicht sichtbar)

WINDOW, 0, /PIXMAP, XSIZE = 500, YSIZE = 500

Das Window wird wie jedes andere Window behandelt. PIXMAP bezeichnet einenZwischenspeicher, der vom Display Manager verwaltet wird.

  Reparieren von Window-Uberlagerungen

Der Backing store kann im Startup-File gesetzt werden, siehe Seite 14

DEVICE, RETAIN = 2  Verwaltung von Windows

– Setzen des aktuellen graphischen Windows 

WSET, 4

Window mit der Nummer 4 aktivieren. Es kann jeweils nur ein Window

aktiv sein. 

IF !D.WINDOW NE 4 THEN WSET, 4

!D.WINDOW: Index des aktuellen Windows

– Window mit der Nummer 5 in den Vordergrund bzw. in den Hintergrund stellen 

WSHOW, 5 ; Vordergrund 

WSHOW, 5, 0 ; Hintergrund 

WSHOW, 5, /ICONIC ; iconify

– Loschen des Windows mit der Nummer 5. 

WDELETE, 5

– Loschen aller Windows 

WHILE (!D.WINDOW GE 0) WDELETE,!D.WINDOW

Page 95: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 95/238

9.4. STEUERUNG DER AUSGABE UND AUSGABEGER ATE 75

9.4.5 Benutzung des Z-Buffers

Durch Verwendung des Z-Buffers konnen komplexe 3D Darstellungen definiert werden.

Verdeckte Linien und Flachen werden nicht angezeigt. Der Z-Buffer ist in IDL als Graphi-

sches Device implementiert.

Man benutzt den SET PLOT Befehl, um das graphische Device auf den Z-Buffer zu wech-seln.

SET_PLOT,’z’

SET_PLOT,’x’

Mit SET PLOT,’z’ wird der Z-Buffer eingeschaltet, mit SET PLOT,’x’ schaltet man

auf die Bildschirm-Darstellung um (Unix: X-Display, Windows: ’win’, Mac: ’mac’)

Die Eigenschaften des Z-Buffers werden mit dem DEVICE-Befehl gesteuert.

  Setzen der Auflosung mit SET RESOLUTION

DEVICE, SET_RESOLUTION=[500,300]  Setzen der Farbe mit SET COLORS

col = !D.TABLE_SIZE

SET_PLOT,’z’

DEVICE, SET_COLORS=col  Schließen des Devices mit CLOSE

DEVICE, /CLOSE

Page 96: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 96/238

76 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4.6 Beispiel: Z-Buffer, SURFACE und CONTOUR

Mit der Routine SHADE SURF wird ein 2D Datensatz (peak) als schattierte Oberflache

dargestellt. Das Keyword /SAVE stellt sicher, daß die 3D Transformationsmatrix gespei-

chert wird. Die Oberflache kann dann mit CONTOUR unter Verwendung der 3D Transfor-

mationsmatrix (/T3D) gezeichnet werden. Mit dem TVRD()-Kommando wird das Bildaus dem Z-Buffer in die Variable new kopiert. Nachdem das Ausgabegerat mit SET PLOT

auf den Bildschirm gewechselt wurde, kann das kopierte Bild mit dem TV Kommando

dargestellt werden.

PRO z buf

peak = EXP(-(SHIFT(DIST(40), 25, 15)/15)ˆ2)

olddev=!D.NAME

SET_PLOT, ’z’

DEVICE, SET_RESOLUTION=[400,400],SET_COLORS=!D.TABLE_SIZE

!P.BACKGROUND=255B

!P.COLOR=0BSHADE_SURF, peak, /SAVE

CONTOUR, peak, /T3D, ZVALUE=0.66, NLEVELS=10, /NOERASE

new = TVRD()

SET_PLOT,olddev

WINDOW, XSIZE=400, YSIZE=400, /FREE

TV, new

END

Beispiel 9.1: Definitionen zur Datenausgabe: Z-Buffer

Abbildung 9.4: Definitionen zur Datenausgabe: Z-Buffer

Page 97: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 97/238

9.4. STEUERUNG DER AUSGABE UND AUSGABEGER ATE 77

9.4.7 PostScript Ausgabe - Drucken

IDL Kommandos werden fur das jeweilige mit SET PLOT aktivierte Ausgabegerat abge-

arbeitet. Standardmaßig ist dies die Ausgabe im Fenster.

Ist das Ausgabegerat auf PS gesetzt, werden alle IDL Kommandos fur dieses Ausgabegerat

abgearbeitet. In dem Beispiel wird eine PostScript-Datei erstellt.

old_device = !D.NAME

SET_PLOT,’ps’ ; Hardcopy auf PS setzen

DEVICE, FILENAME=’new_plot.ps’

; Optionen als Kommentarzeilen

; XOFFSET=2,

; YOFFSET=1.5,

; XSIZE=18,

; YSIZE=29,

; /COLORDEVICE,/ISOLATIN1 ; Umlaute

my_data = SIN(MAKE_ARRAY(10,/INDEX))

plot, my_data, TITLE=’Test-Ausgabe’

XYOUTS,0.1,0.1,’Umlaute: ae,oe,ue ’+ $

STRING(228b)+STRING(246b)+STRING(252b),/DEVICE

DEVICE, /CLOSE ; close PostScript-Ausgabe

SET_PLOT, old_device ; Ausgabe wird auf old_device gesetzt

Beispiel 9.2: Definitionen zur Datenausgabe: PostScript-Ausgabe

Drucken

Die PostScript-Datei kann auf einem PostScript-Drucker gedruckt werden, z.B. mit

lpr

lpr -Ptia00c4 new plot.ps

Hinweis:

Wird im DEVICE kein FILENAME angegeben, lautet der Ausgabe Dateinameidl.ps.

Man kann Programme so schreiben, daß mittels eines Keywords gesteuert wird, ob die

Ausgabe auf dem Bildschirm oder in eine Datei geschrieben werden soll. Im nachfolgen-

den Beispiel wird dies durch das Keyword /PSFLAG erreicht. Die PostScript-Datei wird

mit dem Keyword ENCAPSULATED=1 erstellt und ist eine EPS-Datei mit Bounding Box.

Diese ist in ein Dokument einbettbar (ohne showpage).

Page 98: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 98/238

78 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

Beispiel: testct2.pro (verwendet legendfr.pro,ct fr.pro)

PRO testct2,psflag=psflag

;psflag=0 : Bildschirmausgabe

;psflag=1 : Ausgabe auf PostScript-File idl.eps

olddevice=!D.NAME

;**************************************************************

!P.FONT=-1 & !P.CHARSIZE=1

IF KEYWORD_SET(psflag) THEN BEGIN

SET_PLOT, ’ps’ & !P.FONT=0 & !P.CHARSIZE=2

psfile=’idl.eps’

DEVICE,FILENAME=psfile,ENCAPSULATED=1, PREVIEW=0,$

/COLOR, YOFFSET=27, YSIZE=16,XOFFSET=2,XSIZE=25,$

/LANDSCAPE

ENDIF

;*****************Setzen der Farbpalette************************

ct_fr & !P.BACKGROUND=0 & !P.COLOR=!D.TABLE_SIZE-1

;*****************Erzeugung eines Datenfeldes*******************

n=100.

f=DOUBLE(100./(n-1.)*100./(n-1.))

x=FLTARR(n,n)

FOR i=0,n-1 DO FOR j=0,n-1 DO x[i,j]=DOUBLE(i)*DOUBLE(j)*f

;*********************************Konturplot durchfuehren*******

lev=[0,10,50,100,500,1000,2000,5000]

colors =INDGEN(/FLOAT,N_ELEMENTS(lev))/ $

FIX(N_ELEMENTS(lev)-1)*(!D.TABLE_SIZE-2)

CONTOUR,x,LEVEL=lev,C_COLORS=colors,$

POSITION=[0.15,0.2,0.8,0.9],/FILL

legendfr,lev,/fill,colors=colors

;**************************************************************

IF KEYWORD_SET(psflag) THEN BEGIN

whoami,dir,filename

XYOUTS,0.9, 0.00,SYSTIME(0),CHARSIZE=0.5,/NORMAL

XYOUTS,0.9,-0.02,filename,CHARSIZE=0.5,/NORMAL

XYOUTS,0.9,-0.04,psfile,CHARSIZE=0.5,/NORMAL

DEVICE,/CLOSE

ENDIF

SET_PLOT,olddevice

!P.FONT=-1 & !P.CHARSIZE=1

!P.BACKGROUND=!D.TABLE_SIZE & !P.COLOR=0

IF KEYWORD_SET(psflag) THEN PRINT,$

’Ende - PostScript idl.eps erstellt’

END

Beispiel 9.3: Definitionen zur Darstellung: optionale Postscriptdatei

Page 99: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 99/238

9.4. STEUERUNG DER AUSGABE UND AUSGABEGER ATE 79

Aufruf: testct2,[/psflag] (optional PostScript)

0 20 40 60 80 100

0

20

40

60

80

1000

1050100500100020005000

Thu Sep 4 16:30:27 1997

testct2.pro

idl.eps

Abbildung 9.5: Definitionen zur Datenausgabe: Beispiel mit Legende

Das Beispiel enthalt folgendes:  Eigene Farbtabelle (mit TVLCT)  Bild auf weißem Hintergrund  Legende mit Namen des Programms, des PostScript Files und Datum wird erstellt

9.4.8 Ubungen

Die Losungen zu den Ubungen findet man im Anhang auf Seite 205.

1. Schreibe die Definition einer Farbtabelle als RGB Werte. Weise diese Farbtabelle

dem Grafikdevice zu. Es sollen die Farben Rot, Grun und Blau angelegt werden.

Uberprufe die Farbdefinition mit einem Farbbalken. Ein einzelner Farbton soll 15

Pixel breit sein.

2. IDL hat vordefinierte Farbtabellen. Wahle die Farbtabelle 6 aus. An deren Ende (256.

Farbe) soll definitiv die Farbe Weiß sein. Andere die Farbdefinition nach dem Laden

so ab, daß der letzte Wert Weiß ist. Uberpufe das Ergebnis mit einem Farbbalken.

3. Gib den Satz:

Heute lernen wir IDL!

auf dem Drucker aus!

Page 100: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 100/238

80 KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

Page 101: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 101/238

Kapitel 10

Programme zur

Anwendungs-Darstellung

10.1 Uberblick

In den folgenden Kapiteln werden die Routinen zu unterschiedlichen Darstellungsarten

beschrieben. Es gibt Routinen zur Darstellung von XY Plots, Oberflachen, Hohenlinien,

Bildverarbeitung, Kartenprojektion usw.

Keyword-Parameter und System-Variablen ermoglichen dem Benutzer, durch bestimmte

Spezifikationen das Aussehen der Graphik zu kontrollieren, wie z.B. Skalierung, Farbe,

Beschriftung, Achseneinteilung und vieles mehr. Falls keine Angaben erfolgen, verwendet

IDL eine Standardeinstellung. Die optionalen Keyword-Parameter, siehe Seite 82, werden

von allen Darstellungs-Routinen benutzt. Beispielsweise wird mit dem XRANGE-Keyword

der Wertebereich fur die X-Achse festgelegt, z.B. XRANGE=[5,101].

Im nachfolgenden Abschnitt wird eine Auswahl dieser Parameter vorgestellt. In den

Aufzahlungen wird auf eine Verwendung in den nachfolgenden Beispielen hingewiesen.

Dort findet man weitere Hinweise.

81

Page 102: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 102/238

82 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.1.1 Achsen

Das Layout von Achsen laßt sich mit nachfolgenden Keyword-Parametern steuern. Die

Spezifikationen konnen fur jede Achse gewahlt werden. Die Notation [XYZ]RANGE be-

deutet, daß die Option RANGE fur die X-, Y- und Z-Achse verfugbar ist und mit den

 jeweiligen Keywords XRANGE, YRANGE und ZRANGE angesprochen wird.

Anzahl Major-Tick-Intervalle [XYZ]TICKS Beispiel auf Seite 95

Anzahl Minor Tick Intervalle [XYZ]MINOR

Ticklange [XYZ]TICKLEN

Label eines Ticks [XYZ]TICKNAME

Format der Beschriftung [XYZ]TICKFORMAT

Werte fur Ticks [XYZ]TICKV

Bereich der Werte [XYZ]RANGE Beispiel auf Seite 85

Aussehen Achsen [XYZ]STYLE Beispiel auf Seite 87Titel der Achsen [XYZ]TITLE Beispiel auf Seite 92

Schriftgroße der Beschriftung [XYZ]CHARSIZE

Logarithmische Achsen [XYZ]LOG Beispiel auf Seite 90

Definition von Achsen [XYZ]AXIS Beispiel auf Seite 87

beliebige neue Achse mit Beschrif-

tung und Skalierung

AXIS Beispiel auf Seite 87

Tabelle 10.1: Programme zur Darstellung: Keywords zur Achsneanpaßung

Page 103: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 103/238

10.1. UBERBLICK 83

10.1.2 Steuerungen zur Zeichenfl ache

Generell muß man wissen, daß bei Aufruf bestimmter Routinen, wie PLOT, CONTOUR

oder SURFACE, das Bild im Fenster geloscht wird und ein neues Bild gezeichnet wird.

Will man aber in das gleiche Bild noch etwas zeichnen, muß man das bei dem nachfolgen-

dem Kommando, siehe Tabelle, berucksichtigen.Bei den Bild-Darstellungs-Routinen TV und TVSCL wird das Bild vor dem Zeichnen nicht

geloscht. Um die Zeichenflache zu loschen, wendet man vor dem TV bzw. TVSCL das

ERASE Kommando an.

NODATA Keine Daten zeichnen.

Das Koordinatensystem wird angelegt

und die Achsen werden gezeichnet.

Beispiel auf Seite 85, 88, 101

NOERASE Das vorherige Bild wird nicht geloscht. Beispiel auf Seite 100, 105,

106, 101, 103

OVERPLOT Uberzeichnen

Bewirkt, ahnlich wie NOERASE, daß das

vorherige Bild nicht geloscht wird.

Beispiel auf Seite 100, 106

Tabelle 10.2: Programme zur Darstellung: Steuerungen zur Zeichenflache

Mit dem Keyword TITLE erhalt man eine Beschriftung des Gesamtbildes, siehe Seite 95.

10.1.3 Routinen zum Beschriften oder Markieren

Haufig verwendet man noch eine Beschriftung im Bild oder farbige Linien oder Flachen,

um auf besonders wichtige Details hinzuweisen. Dafur stehen die Befehle XYOUTS,

PLOTS und POLYFILL zur Verfugung. Diese Befehle sind in allen Darstellungs-Routinen

verwendbar.

XYOUTS stellt Text an eine Position Beispiel auf Seite 89,89,95

PLOTS zum Zeichnen einer Linie Beispiel auf Seite 88, 107

POLYFILL zum Zeichnen einer gefullten Flache Beispiel auf Seite 88

Tabelle 10.3: Programme zur Darstellung: Routinen zum Beschriften oder Markieren

Page 104: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 104/238

84 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2 XY-Darstellungen mit PLOT

10.2.1 Ausgabe von Daten als Linien-Plots

Erst durch die Ausgabe werden Daten lesbar. Die Darstellung mittels Linien-Plot ist die

gebrauchlichste fur Vektoren.

10.2.2 Plot bei einem Argument

x=FINDGEN(37)*10 0 bis 360 in 10er Schritten

y=SIN(x*!DTOR) Systemvariable !DTOR=Konversionsfaktor (Grad- in Bo-

genmaß)

PLOT,y

Die X-Achse erhalt die Werte 0 bis 360. Als Ordinatenwerte wird Y aufgetragen.

10.2.3 Plot mit zweitem Argument (dependent data)

PLOT,x,y X-Achse jetzt 0 bis 360.

IDL legt die X-Achse von 0 bis 400 an. Eine exakte Begrenzung ist moglich, siehe Seite

87 .

Hinweis:PLOT loscht Zeichenflache vor der Ausgabe!

Das heißt, daß jeder PLOT-Befehl in ein neues Fenster zeichnet. Verwendet man das

Keyword/NOERASE in Verbindung mit PLOT (auch AXIS, CONTOUR, SURFACE) wird

das Bild bei Ausfuhrung des PLOT nicht geloscht.

Page 105: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 105/238

10.2. XY-DARSTELLUNGEN MIT PLOT 85

10.2.4 Plot von Datenreihen

In dem Beispiel sollen die Achsen des Plots in der Farbe Schwarz und die Daten in anderen

Farben und Linientypen dargestellt werden. Das Vorgehen ist dann wie folgt. Verwendet

man PLOT mit dem Keyword /NODATA werden keine Daten geplottet, es wird lediglich

das Koordinatensystem des Plotfensters mit Beschriftung angelegt.Mit OPLOT konnen dann alle Kurven in das definierte Fenster gezeichnet werden.

Variation der Linienart, Linienfarbe etc., ohne die Farbe der Achsen zu andern.

TEK_COLOR

kurve1 = FINDGEN(10)

kurve2 = FINDGEN(10)+5

kurve3 = kurve1 * 3

kurve4 = kurve2 * 3

allpts = [[kurve1],[kurve2],[kurve3],[kurve4]]N = SIZE(allpts,/DIM) ; Dimesnionierung der Elemente

x=INDGEN(10,/FLOAT)

PLOT,allpts,YRANGE=[MIN(allpts),MAX(allpts)], $

XRANGE=[MIN(x),MAX(x)],/NODATA

OPLOT,x,kurve1,LINE=0,COLOR=0

OPLOT,x,kurve2,LINE=1,COLOR=4

OPLOT,x,kurve3,LINE=2,COLOR=2

OPLOT,x,kurve4,LINE=3,COLOR=3

Beispiel 10.1: Programme zur Darstellung: Plot von Datenreihen

Page 106: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 106/238

86 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2.5 Beispiele mit PLOT

PLOT hat uber 50 Keywordparameter, einige sind im nachfolgendem mit Beispielen auf-

gefuhrt. Viele der Keywords gelten auch fur alle anderen Darstellungs-Routinen.

LOADCT,5

Mit LOADCT kann eine vordefinierten Farbtabelle geladen werden.Stattdessen kann auch TEK COLOR aufgerufen werden, siehe Seite 68.

  Linienarten und Symbole mit PSYM

PLOT,x,y,LINESTYLE=3,PSYM=-1

1,...7 nur Symbole

0 nur Linie, Default!

-1,-2,... Symbole mit Linien

8 Benutzer- definierte Symbole moglich mit USERSYM

-8 Benutzer- definierte Symbole mit Linie10 Histogramm Modus

Abbildung 10.1: Programme zur Darstellung: XY Plot

  Farbe mit COLOR

PLOT,x,y,COLOR=45,BACKGROUND=100  Weitere Kurven in einem Bild mit OPLOT

y1=y/EXP(x/60.)

OPLOT,x,y1,THICK=2

Kurvendicke mit dem Keyword THICK (zweifacher Default-Wert) 

Layout:[XYZ]TICKS: (Anzahl Major- Tick- Intervalle)

[XYZ]MINOR: (Anzahl Minor- Tick- Intervalle)

[XYZ]TICKLEN (Gitter!)

Die Notation [XYZ]TICKS bedeutet, daß die Keywords XTICKS, YTICKS,

ZTICKS verwendet werden konnen.

Page 107: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 107/238

10.2. XY-DARSTELLUNGEN MIT PLOT 87

  Arbeiten mit Achsen

Die Notation [XYZ]STYLE bedeutet, daß die Keywords XSTYLE, YSTYLE und

ZSTYLE verwendet werden konnen.

Die STYLE-Option ist bitweise kodiert

PLOT,x,y,XSTYLE=(1+8)

Exakte Begrenzung (=1) und keine X-Box Achsen (=8)PLOT,X,Y,YSTYLE=8

rechts keine Y-Box Achse  Mehrfache Achsen

AXIS,/YAXIS,YRANGE=[0,5],/SAVE,COLOR=180

– Y-Achse rechts bzw. links

/YAXIS aquivalent zu YAXIS=1 (rechts), YAXIS=0 (links)

– Y-Achse mit neuem Koordinatensystem mit YRANGE

– Neue Definition eines Koordinatensystems, d.h. Anderung des mitPLOT auf-

gestellten Koordinatensystems /SAVE  Achse an eine beliebige Position

– Die Y- Achse kann an beliebige Position geschrieben werden

Folgende Schreibweisen sind aquivalent:

AXIS,100,0,/YAXIS

oder

AXIS,100,0,YAXIS=1

– OPLOT im neuen Koordinatensystem

OPLOT,x,8*y1,LINESTYLE=2,COLOR=160

Beispiel: mehrfache Achsen

Abbildung 10.2: Programme zur Darstellung: mehrere Y-Achsen

Page 108: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 108/238

88 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

  Linien oder Punkte mit PLOTS

PLOT,INDGEN(200,/FLOAT),YRANGE=[0.,1.],/NODATA

xvec=[60,140,140,60,60]

yvec=[0.35,0.35,0.5,0.5,0.35]

PLOTS,xvec,yvec,COLOR=100

PLOTS zeichnet eine Box

Fullen mit Farbe

POLYFILL,xvec,yvec,COLOR=100

  Keywords zur Beschriftung

TITLE, [XYZ]TITLE, CHARSIZE, [XYZ]CHARSIZE

Beschriftung des Plots bzw. der verschiedenen Achsen und entsprechender Font-

große

  Explizite Labels fur Tickmarks

[XYZ]TICKNAME Feld mit Zeichen

[XYZ]TICKFORMATFormat der Beschriftung der Ticks

  Keywords fur logarithmische Achsen

[XYZ]LOG

  Keyword: CLIPPING

CLIP =[X0,Y0,X1,Y1]Das Keyword CLIPPING bewirkt ein Abschneiden an den Werten mit Minmum

(x0,y0) und dem Maximum (x1,y1).

Page 109: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 109/238

10.2. XY-DARSTELLUNGEN MIT PLOT 89

  Zus atzlichen Text an XY Plot mit XYOUTS

XYOUTS,150.,0.7,’Text’,CHARS=3

Abbildung 10.3: Programme zur Darstellung: PLOT und zusatzlicher Text

  Default: als Datenkoordinaten

PLOT,x,y 

XYOUTS mit normalisierten Koordinaten [0,1]

XYOUTS,0.5,0.5,’Mitte des Bildes’,/NORM,ALIGN=0.5  Das Standard X-Window ist 640x512 Pixel groß. Die Ausgabe erfolgt in Device-

Koordinaten.

XYOUTS,10,10,’links unten’,/DEVICE

Abbildung 10.4: Programme zur Darstellung: Beschriftung in der Mitte des Bildes

Page 110: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 110/238

90 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2.6 Plot mit logarithmischer Achseneinteilung

Eine logarithmische Einteilung der Achsen bei der PLOT-Funktion erhalt man mit dem

Keyword XLOG fur die X-Achse und mit dem Keyword YLOG fur die Y-Achse. Das Bei-

spiel zeigt linear-logarithmische Achsen.

x=INDGEN(200,/FLOAT)y=SIN(x/20)ˆ2

PLOT,x,x/5,YRANGE=[0.01,200],/YLOG

Abbildung 10.5: Programme zur Darstellung: Logarithmischer PLOT

10.2.7 BalkendiagrammeDas BAR PLOT-Programm zeichnet einfache Balken in den angegebenen Hohen.

BAR PLOT, [ 2, 5, 1, 3, 6, 4 ]

Page 111: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 111/238

10.2. XY-DARSTELLUNGEN MIT PLOT 91

10.2.8 Fehlerbalken

Fur das Beispiel werden 10 Zufallszahlen generiert.

data=RANDOMU(SEED,10)

x=INDGEN(10,/FLOAT)+0.5

PLOTERR,x,data,data-0.2

Die Daten werden mit Fehlerbalken dargestellt. Die Fehlerbalken zeigen einen symmetri-

schen Fehler.

Abbildung 10.6: Programme zur Darstellung: Fehlerbalken

10.2.9 Polarplotr=INDGEN(100,/FLOAT)

theta=r/5.

PLOT, r, theta, SUBTITLE=’Polar Plot’, $

XSTYLE=4, YSTYLE=4, /POLAR

AXIS, XAX=0,0

AXIS, YAX=0,0

Abbildung 10.7: Programme zur Darstellung: Polarplot

Page 112: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 112/238

92 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2.10 Scatter-Plot mit Zufallszahlen

Die Daten fur die PLOT-Funktion mussen nicht streng aufsteigend sortiert sein, sie konnen

auch willkurlich verteilt vorliegen. Als weiteres Beispiele wird ein Scatter-Plot vorgestellt.

Damit man sieht, daß die Punkte willkurlich verteilt vorliegen, wurden die Symbole mit

Zahlen markiert.

x=RANDOMU(SEED,10)

y=RANDOMU(SEED,10)

yrange=[MIN(y,MAX=mx),mx+0.1]

xrange=[MIN(x,MAX=mx)-0.1,mx+0.1]

PLOT,x,y,PSYM=2,YRANGE=yrange,XRANGE=xrange,$

XTITLE=’random x’,YTITLE=’random y’,TITLE=’Scattered Data’

XYOUTS,x,y+0.03,STRTRIM(INDGEN(10),2),ALIGN=0.5

Abbildung 10.8: Programme zur Darstellung: Scatter-Plot mit Zufallszahlen

Page 113: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 113/238

10.2. XY-DARSTELLUNGEN MIT PLOT 93

10.2.11 Plot mit Text in unterschiedlichen Farben

Das Programm zeichnet einen Text, der aus vier Worten besteht, in jeweils unterschiedli-

chen Farben. Der Text wird auf dem Vektor text abgelegt. Damit die Worte des Textes bei

dem XYOUTS-Kommandos nicht alle ab der Startpostion ubereinander gezeichnet werden,

muß man ab dem zweiten Wort fur alle Worte des Textes soviele Leerzeichen erzeugen,wie der bereits vorstehende Text lang ist. Die Leerzeichen werden mit MAKE ARRAY an-

gelegt. Das Beispiel setzt voraus, daß ein monospaced -Font verwendet wird.

Wenn man beim Aufruf des Programms das Keyword PS angibt, wird eine PostScript-

Datei erstellt.

TEK COLOR ladt eine Farbtabelle, siehe Beispiel auf Seite 68.

PRO colored_text,ps=ps

!P.COLOR=0

!P.BACKGROUND=!D.TABLE_SIZE-1

IF KEYWORD_SET(ps) THEN BEGIN

old_name=!D.NAMESET_PLOT,’PS’

DEVICE,FILE=’colored_text.ps’, /COLOR, BITS=8, /ISOLATIN1

!P.FONT=-1

ENDIF

TEK_COLOR

text=[’Dies’,’ist’,’ein’,’Test’]

length=STRLEN(text)

FOR i=1,3 DO BEGINblanks=STRING(MAKE_ARRAY(TOTAL(length[0:(i-1)])+1, $

VALUE=32b))

text[i]=blanks+text[i]

ENDFOR

ERASE

XYOUTS,0.5,0.5,text,COLOR=[0,5,2,3,4],CHARSIZE=3, $

/NORM,ALIGN=0.,CHARTHICK=10

IF KEYWORD_SET(PS) THEN BEGIN

DEVICE,/CLOSE

SET_PLOT,old_nameENDIF

END

Beispiel 10.2: Programme zur Darstellung: XYOUTS in unterschiedlichen Farben

Abbildung 10.9: Programme zur Darstellung: XYOUTS in unterschiedlichen Farben

Page 114: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 114/238

94 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.3 Fl achen- und H ohenlinien- Darstellungen

Mehrdimensionale Datensatze enthalten mehr Informationen als Vektoren. Die Daten

liegen auf einem regularen oder irregularen Gitter vor. Zu jedem Punkt ist dann noch

eine dritte Information, die Hohe bekannt, die auf der Z-Achse dargestellt werden kann.

Daten, konnen z.B. als Netzlinien mit SURFACE oder als Hohenlinienplot mit CONTOURdargestellt werden, wenn sie auf einem regularen Gitter vorliegen.

Wenn die Daten auf einem irregularen Gitter vorliegen, konnen sie auf ein regulares Gitter

umgerechnet werden. Dazu findet man im Kapitel Gl¨ atten von zuf   alligen oder irregul¨ aren

 Daten auf Seite 107 ein Beispiel.

Eine vierte Dimension, eine weitere Information zu den vorliegenden Daten, kann z.B. bei

Netzlinien als Farbe dargestellt werden.

10.3.1 Netzlinien mit SURFACESURFACE hat uber 70 Keywordparameter unter anderem: UPPER ONLY,

LOWER ONLY, BOTTOM (Farbe Unterseite), COLOR (Farbe Oberseite), BACKGROUND,

SKIRT, ZAXIS.

Hinweis:

Keywords oft analog zu PLOT

Beispieldatensatz: a=f(x,y):

Abbildung 10.10: Programme zur Darstellung: SURFACE

 

a=DIST(20)

2D-Float-Feld mit 20x20 Werten dient als Testdatensatz. 

SURFACE,a

Page 115: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 115/238

10.3. FL ACHEN- UND HOHENLINIEN- DARSTELLUNGEN 95

Werte von a als Gitter

SURFACE,a,/HORIZONTAL

Mit dem Keyword /HORIZONTAL nur horizontale Gitterlinien 

xgrid=INDGEN(20,/FLOAT)/10

ygrid=INDGEN(20,/FLOAT)+20

SURFACE,a,xgrid,ygrid

X-Gitter von 0 bis 1.9, Y-Gitter von 20 bis 39 durch die Angabe der Parameter

xgrid und ygrid.

 

SURFACE,a,AZ=10,AX=60,$

ZTICKS=2,TITLE=’Titel liegt in X-Z Ebene’

AX und AY sind Drehwinkel, (Default 30 

)

Zusatzliche Ausgabe von Text mit XYOUTS.

XYOUTS,0.3,0.9, $

’Parallel zu Schirm’,/NORM,CHARS=2. 

SURFACE,a,/LEGO3D- Balkengramm, Balken als Quader mit dem Keyword /LEGO.

 

SURFACE,a,SHADES=BYTSCL(a)

Farben: mit COLOR=... bzw. BOTTOM=... erhalt man jeweils ein einfarbiges

Bild.

Mit dem SHADES=Farbraster wird ein selbst definiertes Farbraster als vierte

Dimension auf die Netzlinien gelegt. BYTSCL transformiert Felder beliebigen Typs

auf den Typ BYTE mit einem Wertebereich 0B bis 255B. 

PRINT, BYTSCL(a)

BYTSCL: Streckung auf Wertebereich 0B bis 255B

Besser: BYTSCL(a,TOP=!D.TABLE SIZE-1) skaliert bis zur max. Anzahlverfugbarer Farben.

Page 116: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 116/238

96 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

Behandlung von “missing values” mit IDL

Zur Veranschaulichung der Behandlung von “missing values” wird ein Beispieldatensatz

konstruiert. Die Ausreißerwerte -999 und 500 werden kunstlich erzeugt.

a=DIST(40) Definition

a[8:15,3:5]=-999 Ausreißerwerte erzeugen! Mit ’:’ auf Teilbereich zugreifen.

Feldbereich auf -999 setzen

a[4:6,8:10]=500 Ausreißerwerte erzeugen! Feldbereich auf 500 setzen

SURFACE,a sinnvolle Werte sind durch”

missing values“ nicht unter-

scheidbar.

SURFACE,a,MAX VALUE=100,MIN VALUE=-100

Mit der Angabe von MAX VALUE und MIN VALUE sind die “missing values” verschwun-

den.

Abbildung 10.11: Programme zur Darstellung: Behandlung von missing value

Hinweis:

Keywords MAX VALUE und MIN VALUE sind erlaubt bei: PLOT, CONTOUR,

SHADE SURF, SURFACE

Gleicher Effekt mit !VALUES.F NANLinie wird unterbrochen

y = FINDGEN(100)

idx = [ 10,11,12,13 ]

y[idx] = !VALUES.F_NAN

PLOT,y,PSYM=0

Page 117: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 117/238

10.3. FL ACHEN- UND HOHENLINIEN- DARSTELLUNGEN 97

10.3.2 H ohenlinien mit CONTOUR

Haufig wird diese Darstellungsform bei Landkarten, Wetterkarten usw. verwendet. 

a = DIST(40)

CONTOUR,a 

CONTOUR,a,NLEVELS=10,/FOLLOW,C CHARSIZE=2,/DOWNHILL

Man beachte den Unterschied zu CHARSIZE=2.

Abbildung 10.12: Programme zur Darstellung: CONTOUR

Spezifische Keywords fur CONTOUR

FOLLOW=1 Hohenlinien-Verfahren mit Beschriftung

NLEVELS Anzahl Hohenlinien

LEVELS=[c1,c2,...] Hohenlinien bei c1,c2,... (NLEVELS=0)

/DOWNHILL Richtung durch Ticks ausgeben

/OVERPLOT Hohenlinien ohne neuen Rahmen

/FILL gefullte Flache, nicht bei Karten

/CELL FILL Bei den Anwendungen missing data oder bei Kartenpro-

 jektionen ist dieses Keyword oft besser.

Page 118: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 118/238

98 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

C Keywords fur CONTOUR sind oft Vektoren.

Die Vektoren werden zyklisch wiederholt, wenn die Anzahl der Hohenlinien großer sind

als die Anzahl der Vektorelemente. 

C LINESTYLE=INDGEN(4,/BYTE)

Vier verschiedene Linientypen 

C THICK=[1,3]

Zwei verschiedene Liniendicken 

C ANNOTATION=[’low’,’medium’,’high’],NLEVEL=3

Beschriftung der Label mit Text 

C COLOR=INDGEN(4,/BYTE)*50

Vier verschiedene Farben

Abbildung 10.13: Programme zur Darstellung: C Keywords bei CONTOUR

10.3.3 Schattierte Oberfl achendarstellung

 

a=DIST(40)

SHADE_SURF,a 

SHADE SURF,a,SHADES=BYTSCL(a)

Statt einer Lichtquelle wird Feld ’BYTSCL(a)’ als Farbraster auf die Oberflache

gelegt.

Page 119: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 119/238

10.3. FL ACHEN- UND HOHENLINIEN- DARSTELLUNGEN 99

10.3.4 Oberfl ache mit beliebigem Datensatz uberlagern

Abbildung 10.14: Programme zur Darstellung: SHADE SURF

 

a=DIST(40)

b=RANDOMU (SEED , 40, 40)

Fur das Beispiel wird ein Testdatensatz konstruiert. RANDOMU generiert Zufallszah-

len zwischen 0 und 1. 

SHADE_SURF,a,SHADES=BYTSCL(b,TOP=!D.TABLE_SIZE-1)

Die Zufallszahlen werden als Farbmuster mit dem Keyword SHADES auf die Ober-

flache gelegt. Dabei bedeutet BYTSCL, daß die Zufallszahlen auf den Bereich desZahlentyps BYTE, also 0B bis 255B bzw. bis zur maximal darstellbaren Zahl ver-

teilt werden. Die Darstellung bis zur maximal darstellbaren Zahl erfolgt dann, wenn

wie im Beispiel das Keyword TOP mit der maximal darstellbaren Zahl verwendet

wird.

Hinweis:

SURFACE und SHADE SURF sind Routinen zur automatischen Generierung einer 3D

Transformationsmatrix.

Page 120: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 120/238

100 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.3.5 H ohenlinien-Plot im 3D-Raum

 

a=DIST(40) 

SHADE SURF,a,/SAVE

/SAVE speichert die 3D Transformationsmatrix 

CONTOUR, a, NLEVELS=10, /T3D, ZVALUE=1.0, /NOERASE

Das Keyword /T3D bedeutet, daß die gespeicherte Transformationsmatrix fur pla-

naren CONTOUR-Plot bei ZVALUE=1.0 benutzt wird.

Abbildung 10.15: Programme zur Darstellung: CONTOUR im 3D Raum

oder

 

SHADE SURF,a,/SAVE

Das Ergebnis ist nicht zufriedenstellend! Man sollte besser mit dem Z-Buffer, sieheSeite 75, arbeiten.

 

CONTOUR,a,NLEVELS=10,THICK=2,/T3D,/OVERPLOT

Abbildung 10.16: Programme zur Darstellung: Probleme ohne Z-Buffer

Page 121: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 121/238

10.4. 3D TRANSFORMATIONEN 101

10.4 3D Transformationen

Es gibt mehrere IDL Funktionen, die lediglich eine Transformationsmatrix aufbauen, ohne

etwas zu zeichnen. Dazu gehoren: SURFACE, SURFR, SCALE3, T3D, SCALE3D, jeweils

mit dem Keyword /NODATA. Mit Hilfe der Transformationsmatrix kann man alle IDL

Darstellungs-Funktionen im Raum benutzen.

10.4.1 3D Transformationsmatrix mit SURFACE

Mit Hilfe des SURFACE Kommandos wird eine 3D Transformationsmatrix erstellt. Diese

wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinatensystem

zu plazieren. 

X=INDGEN(200,/FLOAT)

Y=SIN(x/20)ˆ2 

SURFACE,DIST(40),/NODATA,/SAVESURFACE erstellt automatisch eine Transformationsmatrix, die durch /SAVE ab-

gespeichert wird, siehe System-Variable !P. Mit HELP,!P,/STR bekommt man

Informationen zur System-Variablen !P, die den Plot beschreibt. !P.T ist ein 4x4

Array, welches die Transformationsmatrix enthalt.

/NODATA zeichnet keine Daten 

PLOT,x,y,/T3D,ZVALUE=1.0,/NOERASE

/T3D Anwendung der Transformationsmatrix !P.T

planarer Plot bei Z=1.0 in normalisierten Koordinaten

Abbildung 10.17: Programme zur Darstellung: SURFACE 3D Transformationen

Page 122: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 122/238

102 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.4.2 3D Transformationsmatrix mit SURFR

Mit Hilfe des SURFR Kommandos wird eine 3D Transformationsmatrix erstellt. Diese

wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinatensystem

zu plazieren. 

X=INDGEN(200,/FLOAT)Y=SIN(x/20)ˆ2

 

SURFR,AX=45

PLOT,x,y,/T3D,CHARSIZE=1.0

Der Befehl SURFR erstellt eine 3D Transformationsmatrix und speichert diese in

!P.T. Die Ausgabe bei ZVALUE=0.0 ist der Default.

Abbildung 10.18: Programme zur darstellung: SURFR 3D Transformationen

Page 123: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 123/238

10.4. 3D TRANSFORMATIONEN 103

10.4.3 3D Transformationsmatrix mit SCALE3 und T3D

Mit Hilfe des SCALE3 Kommandos wird eine 3D Transformationsmatrix erstellt. Diese

Matrix wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinaten-

system zu plazieren. 

X=INDGEN(200,/FLOAT)Y=SIN(x/20)ˆ2

Y1=y/EXP(x/60.) 

SCALE3,XRANGE=[0,200],ZRANGE=[0,1],YRANGE=[0,1]

Das SCALE3 arbeitet ahnlich SURFR, außer daß eine Achsenbegrenzung festgelegt

werden muß. Die Transformationsmatrix !P.T wird gesetzt. Eine Skalierung des

Bildes wird durch Drehungen nicht verandert. Das kann man sich bei einer Serie von

Bildern (Film) zunutze machen. Es entsteht kein Ruckeln.

PLOT,x,y,/T3D

Das 3D- Koordinatensystem kann auch mit der Routine T3D geandert werden.

Mit Hilfe des T3D Kommandos wird eine 3D Transformationsmatrix erstellt. Diese 3D

Matrix wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinaten-

system zu plazieren. 

T3D, /YZEXCH ; -> !P.T

Vertauschen der Y- und Z- Achse

PLOT,x,y1,/T3D,/NOERASE,ZVALUE=1

(Keywords: /XYEXCH, /XZEXCH)

Abbildung 10.19: Programme zur Darstellung: SCALE3 3D Transformationen

Hinweis:

POLYFILL und PLOTS kann auch im 3D verwendet werden, jeweils mit dem Keyword

/T3D.

Page 124: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 124/238

104 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.5 Karten-Projektionen

Sowohl niedrig als auch hoch aufgeloste Karten-Projektionen sind moglich. Die hoch auf-

gelosten Karten stammen aus dem CIA-World-Datensatz. Man kann die Karten sowohl

alleine darstellen als auch mit anderen Darstellungen (z.B. Text zur Beschriftung von

Stadten, CONTOUR fur Wetterkarte, Bevolkerungsdichte usw.) kombinieren. Hierbei wirddie Transformationsmatrix der entsprechenden Karten-Projektion verwendet.

10.5.1 MAP SET

Mehr als 10 verschiedene Karten-Projektionen sind mit MAP SET verfugbar, darunter

folgende:

zylindrische, Mercator, Molweide, Lambert, stereographische, Satelliten Projektionen 

MAP_SET,/MERCATOR ; erstelle Mercator ProjektionMAP_GRID ; Gitter dazu

MAP_CONTINENTS ; Kontinente dazu  Eine kurzere Schreibweise ist moglich:

MAP SET,/ORTHOGRAPHIC,/GRID,/LABEL,/CONT  Das Zentrum ist bei 50

 

Breite und 10 

Lange darstellbar.

MAP_SET,50,10,/ORTHO,/GRID,/LABEL,/CONT  Ausschnitt bei [min[lat]],min[long],max[..],max[..]]

MAP_SET,50,10,LIMIT=[30,-20,70,40],$

/ORTHO,/GRID,/LABEL,/CONT

High Resolution Continent Outlines mit Keyword /HIRES  CIA World Map Database 

MAP SET, /CONT, /HIRES 

MAP CONTINENTS, /HIRES

Folgende Keywords sind moglich:

/COASTS /COUNTRIES /FILL CONTINENTS /RIVERS

Hinweis:

IDL Demo: Mapping Demo

Page 125: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 125/238

10.5. KARTEN-PROJEKTIONEN 105

10.5.2 Kombination von Karte mit Bilddatei

Das Beispiel zeigt eine Uberlagerung einer Karte mit einer Bilddatei.

  Einlesen der Daten: worldelv.dat

OPENR,lun,FILEPATH(’examples/data/worldelv.dat’),$

/GET_LUN

im=BYTARR(360,360)

READU,lun,im

FREE_LUN,lun  Wichtig:

Mitte der Daten muß auf Mitte der dargestellten Karte liegen

TV,im

im=SHIFT(im,180) ; SHIFT notwendig

TV,im  ¨

Uberlagern des Bildes auf die Karte mit MAP IMAGEMAP_SET,/ORTHO,/GRID,/LABEL,/CONT

im=MAP_IMAGE(im,px,py,/BILIN,COMPRESS=1)

Man trifft die Annahme, daß Anfang des Bildes (Spalte 0) auf 180 

zeigt.

px, py sind Ausgabewerte und dienen zur Positionierung von im in der Karte.

Eine bilineare Interpolation wird durchgefuhrt, um Kanten zu glatten.

Das COMPRESS-Flag dient zur Kontrolle der Genauigkeit.

TV,im,px,py

MAP_SET,/ORTHO,/GRID,/LABEL,/CONT,/NOERASE

XLOADCT

Das Bild wird mit einem erneutem MAP SET uberlagert (/NOERASE), damit die

Kontourlinien sichtbar werden.

Abbildung 10.20: Programme zur Darstellung: MAP SET

Page 126: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 126/238

106 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.5.3 Kombination von Karte und H ohenlinienplot

Das Beispiel zeigt, wie man einen Hohenlinienplot auf eine Karte projiziert.

Definition von Vektoren fur Langen- und Breitengraden

 

lons=(FINDGEN(180)*2) - 180.0

lats=FINDGEN(180) -90.0

im1=REBIN(im,180,180) ; verkleinern

MAP_SET,50,10,/ORTHO,/CONT,/GRID

CONTOUR,im1,lons,lats,NLEVELS=16,$

C_COLOR=BINDGEN(16)*15,/OVERPLOT

MAP_SET,50,10,/ORTHO,/CONT,/GRID,/NOERASE

Abbildung 10.21: Programme zur Darstellung: CONTOUR und MAP SET

10.5.4 Beschriftung der Karte mit Text und Symbolen  Symbol mit PLOTS fur Breiten- und Langengrade und Text mit XYOUTS

Damit kann man eine Stadt oder ein Land markieren.  Interaktives Lesen von Breiten- und Langengraden

CURSOR,x,y

Page 127: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 127/238

10.6. GL ATTEN VON ZUFALLIGEN ODER IRREGUL AREN DATEN 107

10.6 Gl atten von zuf  alligen oder irregul aren Daten

Irregulare Daten sind darstellbar, aber diese Darstellung sagt nichts aus. Daher verwendet

man eine Triangulation, um irregulare Daten auf ein regulares Gitter abzubilden.

 

Ein Testdatensatz mit 200 Zufallszahlen in der XY-Ebene wird erstellt.X=RANDOMU(SEED,200)

Y=RANDOMU(SEED,200)

z=EXP(-3*((x-0.5)ˆ2+(y-0.5)ˆ2))

  Zeichnen der Punkte in der XY-Ebene (ungeordnet)

PLOT,x,y,PSYM=1,SYMSIZE=2.0  Triangulation (Delauny)

TRIANGULATE,x,y,tr

HELP,tr

Irregulare Daten werden trianguliert. Es werden Dreiecke berechnet, die fur eineInterpolation gunstig sind, (moglichst klein, nicht uberlappend). Siehe Online Help

zu Triangulate.  Dreiecke mit PLOTS (in der X-Y Ebene) darstellen.

PLOT,X,Y,PSYM=1,SYMSIZE=2

FOR i=0,381 DO BEGIN

index=[tr[*,i],tr[0,i]]

PLOTS,x[index],y[index]

ENDFOR

 

Erstellung des regularen Gitters (Interpolation) mit Glattung(interpolierte Z-Werte)

grid=TRIGRID(x,y,z,tr,/QUINTIC)

HELP,grid

Standardmaßig werden 51 Intervalle generiert.

SURFACE,grid

Abbildung 10.22: Programme zur Darstellung: TRIGRID

Page 128: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 128/238

108 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

  Regulares Gitter mit feinerem Intervall

(optionales Argument zu TRIGRID)

spacing=[0.01,0.01]

grid=TRIGRID(x,y,z,tr,spacing)

SHADE_SURF,grid

10.7 ISO Oberfl achen

Es wird eine Flache gezeichnet, in der alle Punkte den gleichen Wert haben.

  Einfaches Beispiel generieren:

vol_data=MAKE_ARRAY(50,50,50,VALUE=0B,/BYTE)

vol_data[10:30,5:25,10:30]=100

vol_data[15:45,30:45,25:40]=200 

3D Oberflache fur einen bestimmten Wert, hier 80Das Programm sucht Ubergange von 0 auf 100 und von 0 auf 200.

/LOW ist die untere Seite der Hohenlinien.

SHADE VOLUME,vol data,80,v,p,/LOW  Koordinatensystem aufspannen mit vom Benutzer definierten Daten (Dimension des

Volumens),

3D Transformation wird erstellt

SCALE3,XRANGE=[0,50],YRANGE=[0,50],ZRANGE=[0,50]  Schattierte Darstellung der Oberflache

WINDOW

TV,POLYSHADE(v,p,/T3D)

Render und Display der Polygone

Abbildung 10.23: Programme zur Darstellung: ISO Oberflachen

Hinweis:

IDL Tool SLICER3 fur ISO-Oberflachen

Page 129: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 129/238

10.7. ISO OBERFL ACHEN 109

10.7.1 Das SLICER3 Tool

Das SLICER3 Tool ist ein Werkzeug zum graphischen Bearbeiten eines Volumen

Datensatzes.

Beispiel: siehe ’Getting started with IDL’ aus der Online Help.

CD,’/usr/local/idl/idl/examples/data’,CURRENT=olddir

bindata=READ_BINARY(’head.dat’,data_dims=[80,100,57])

data=PTR_NEW(bindata,/NO_COPY)

SLICER3,data

PTR_FREE,data

CD,olddir

Der gelesene 3D-Datensatz besteht aus 57 Schnitten (Scans) der Große 80x100 Pixel.

Hinweis:

Daten werden mit Pointer-Argument bekannt gemacht!

Mit dem SLICER3-Tool kann man u.a. Schnitte durch die Oberflache legen, wie das erste

Beispiel zeigt.

Abbildung 10.24: Programme zur Darstellung: SLICER3-Tool im SLICE-Modus

Page 130: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 130/238

110 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

Ein zweites Beispiel zeigt die gerenderte Oberflache. Zu dieser Darstellung wurde ein

Threshold-Value eingegeben und die Oberflache gerendert.

Abbildung 10.25: Programme zur Darstellung: SLICER3-Tool im Surface-Modus

Hinweis:

Das SLICER3-Programm kann auch in eigene Programme eingebaut werden.

Informationen zur Benutzung des SLICER3-Programms erhalt man mit dem About-

Icon im SLICER3-Menu.

Page 131: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 131/238

10.8. ANIMATION VON DATEN 111

10.8 Animation von Daten

Anderungen an Daten konnen mit einer Animation wie ein ablaufender Film dargestellt

werden.  Animation durch erneutes Zeichnen

– zu jeder Zeit wird die Information nachgezeichnet 

IDL> demo

unter:

Visualization - Surface Objects - Style (Wire) - View (Animate)

– Benutzung der TV Prozedur

– Benutzung einer Pixmap  IDL> demo

unter:Medical - Beating Heart or Image Animation

Earth Science - Flythroug

Animation unter Benuztung eines Tools

Das Programm XINTERANIMATE erlaubt die Darstellung von Bildern als Animation

durch die Verwendung des Compound Widgets CW ANIMATE. Damit ist es moglich, die

Funktion von XINTERANIMATE in eigenen Programmen zu verwenden. 

XINTERANIMATE

– Aufruf von XINTERANIMATE mit unterschiedlichen Parametern zur Initiali-

sierung, Laden und Ausfuhrung.

XINTERANIMATE, SET=[ sizex, sizey, nframes ]

XINTERANIMATE, FRAME=i, IMAGE=data

XINTERANIMATE, 5

 

CW ANIMATE

– Aufruf von unterschiedlichen Routinen zur Initialisierung, Laden und

Ausfuhrung

cwbase = CW_ANIMATE( parent, sizex, sizey, nframe )

CW_ANIMATE_LOD, cwbase, FRAM=i, IMAGE=data

CW_ANIMATE_RUN, cwbase, 5

Weitere Informationen zu Compound Widgets, siehe Seite 187 .

Page 132: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 132/238

112 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.9 Arbeiten mit dem Cursor

Datenwerte konnen mit dem Cursor aus einer Darstellung ausgelesen werden.

Nachfolgende Befehle sollten nur mit Fenstern (WINDOW) benutzt werden. Im Zusamm-

hang mit Widgets sollte das nachfolgende nicht benutzt werden!

  Einschalten des Crosshair Cursor

– TVCRS, 1

– TVCRS, 0

Mit TVCRS,1 bekommt man einen Crosshair-Cursor, mit TVCRS,0 bekommt man

einen Arrow-Cursor.  Positionieren des Cursors

– TVCRS, 0.8, 0.5, /NORMAL  Verstecken des Cursors

– TVCRS, /HIDE CURSOR  Position des Cursors lesen

– CURSOR, x, y, /NORMAL

– PRINT, x, y

Das Keyword /NORMAL bewirkt, daß die Koordinaten im normalisierten Koordia-

tensystem zuruckgegeben werden.

  Button Events abwarten

– CURSOR, x, y, /DEVICE, /DOWN

/CHANGE

/DOWN /UP/WAIT /NOWAIT

Hinweis:

Nicht in Zusammenhang mit dem XMANAGER benutzen.

Besser ist es, das Keyword BUTTON EVENTS bei der WIDGET DRAW() Funkti-

on und in einer Event-Handler Routine zu benutzen.

  Feststellen, welcher Knopf gedruckt wurde

– CURSOR, x, y, /NORMAL, /DOWN  System-Variable !ERR

!ERR = 0 kein Button!ERR = 1 linker Button

!ERR = 2 mittlerer Button

!ERR = 4 rechter Button  System-Variable !MOUSE

HELP,!MOUSE,/STR

** Structure !MOUSE, 4 tags, length=16:

X LONG 0

Y LONG 0

BUTTON LONG 0

TIME LONG 0

Page 133: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 133/238

10.10. ZUSAMMENFASSUNG DER DARSTELLUNGS-ROUTINEN 113

10.10 Zusammenfassung der Darstellungs-Routinen

10.10.1 allgemeine Routinen

ERASE Loschen der Bildflache

PLOTS Zeichnen von Linien und Punkten

POLYFILL Fullen beliebiger 2D bzw. 3D Polygone (Farbe, Muster)

USERSYM Definition eines Symbols

XYOUTS Text an bestimmte Stelle

AXIS beliebige neue Achse mit Beschriftung und Skalierung

Tabelle 10.4: Programme zur Darstellung: Zusammenfassung allgemeiner Routinen

10.10.2 eindimensionale Plotroutinen

Plot Routine Beschreibung

PLOT Neues Bild

Plot mit neuer Achse

Setzen der Skalierung (linear, logarithmisch)

Mit den Keywords /XLOG und /YLOG

sind lin./log. bzw. log./log. Achsen moglich

OPLOT XY Plot, ohne Vorschub ohne Achse

benutzt Skalierung von PLOT oder AXIS

10.10.3 mehrdimensionale Plotroutinen

CONTOUR Hohenlinen (2D)

SHADE SURF Schattierter Surface Plot (3D und 4D)

SURFACE Gitterlinien Oberflache (3D und 4D)

Tabelle 10.5: Programme zur Darstellung: Zusammenfassung mehrdimensionaler Plotroutinen

Page 134: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 134/238

114 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.11 IDL-Anwendungen

Im folgenden werden IDL Anwendungen vorgestellt.

Diese IDL-Programme konnen fur eigene Applikationen benutzt und verandert wer-

den.

SHOW3,DIST(40) SHOW3 macht eine kombinierte Darstellung

2D Array wird als Kombination von Image-, Surface- und

Contour-Bild dargestellt

Abbildung 10.26: Programme zur Darstellung: SHOW3

XLOADCT Widget zum Laden einer vordefinierten Farbtabelle

XPALETTE Widget zum Laden, Andern und Erstellen einer Farbtabelle

DEMO IDL Demo

XFONT Funktionen zum Auswahlen eines Fonts, z.B. mit tmp=

XFONT()

ANNOTATE Beschriftung eines Bildes

XSURFACE Widget fur SURFACE

IMAGE CONT Uberlagerung eines Image-Bildes mit einem Contour-Bild

ZOOM Vergroßern und Verkleinern

SLICER3 Widget zur Darstellung eines 3D-Datensatzes (Schnitte, Iso

Oberflachen). Das SLICER3-Tool wird auf Seite 109 vorgestellt.

DECIMATE Windows: Polygonales Mesh Clipping

Page 135: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 135/238

10.11. IDL-ANWENDUNGEN 115

XVOLUME Anzeige und intervakive Manipulation von 3D-Datensatzen und

ISO-Surfaces.

XVAREDIT XVAREDIT startet ein Widget zur Anzeige einer Variablen. Diese

Variable kann z.B. ein Vektor, ein Array oder eine Struktur sein.

Die Werte der Variablen konnen in dem Widget editiert werden.

10.11.1 Ubungen:

Die Losungen zu den Ubungen findet man im Anhang auf Seite 206 .

1. Die Daten x,y sollen geplottet werden.

ang = 2*!PI*INDGEN(360,/FLOAT)/359.

x = COS(ang)

y = SIN(ang)

(a) ohne Achsen

(b) Achsen in Schwarz, Daten in Blau mit dem Kreuz als Symbol.

(c) Nur die positiven Y-Daten in Rot und die negativen in Blau zeichnen.

(d) Der Achsenursprung soll bei (0,0) liegen.

(e) Der Kreis soll als Kreis dargestellt werden. Der Durchmesser soll z.B. 10 cm

betragen.

2. (a) Zeichne gefullte Hohenlinien! Wie heißt das Keyword?

(b) Zeichne auf gefullte Flachen Hohenlinien.

(c) Zeichne Hohenlinien fur die Werte 6,12.5, 18.7,24 mit jeweils einer ande-

reren Farbe.

3. Die Daten x,y und ang sollen dargestellt werden.

(a) Werte sichtar.

(b) mit CONTOUR

(c) mit CONTOUR aber nur 10 Level gefullt.

(d) die Randlinie soll in verschiedenen Farben fur 10 gleichmaßig verteilte Level

gezeichnet werden.

ang = 2*!PI*INDGEN(360,/FLOAT)/359.

x = COS(ang)

y = SIN(ang)

Page 136: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 136/238

116 KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

Page 137: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 137/238

Kapitel 11

Bildverarbeitung

Bilddaten konnen mit IDL gelesen, analysiert und weiterverarbeitet werden.

11.1 Lesen eines Bildes

Ein Bild wird in einer Matrix, einem 2D Feld, mit Datentyp BYTE abgespeichert, d.h jeder

Pixelwert liegt zwischen 0 und 255.

Lesen der Datei galaxy.dat

OPENR,lun,FILEPATH(’examples/data/galaxy.dat’),/GET_LUN

im=MAKE_ARRAY(256,256,/BYTE)

READU,lun,im

FREE_LUN,lun

Das Kapitel ’Lesen und Schreiben von Dateien’ folgt auf Seite 127 .

117

Page 138: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 138/238

118 KAPITEL 11. BILDVERARBEITUNG

11.2 Kontrastversch arfung

Die Operatoren 

und¡ 

und die WHERE Funktion sind Hilfsmittel zur Kontrast-

verscharfung. 

 

und¡ 

Operator zur Kontrastverst arkung

ERASE

TV,im > 40B ; 40B ist das neue Minimum

TVSCL,im > 40B ; TVSCL benutzt gesamten Farbbereich

TVSCL,im > 40B < 200B ; Bereich von Werten  Anwendung der WHERE Funktion

a=[2B,4B,6B]

tmp=a < 0B

idx=WHERE (a < 0B, COUNT)

PRINT, idx

Der Vektor tmp hat nach der Zuweisung tmp=a<0B die Wertetmp=[0B,0B,0B]. Wenn das Keyword COUNT den Wert 0 hat, wurden

keine Elemente gefunden, die der Bedingung entsprechen. Wenn dies der Fall

ist, hat idx den Wert -1. Daher sollte man den Wert COUNT prufen, wie im

nachfolgenden Beispiel gezeigt wird, ehe man den Vektor idx als Index fur ein

Feld verwendet.

idx=WHERE ( (im GE 200B) OR (im LE 100B),COUNT)

IF COUNT GT 0 THEN im[idx]=0B

TVSCL,im

idx ist ein Vektor. Falls COUNT GT 0 kann man den Vektor idx als Index fur einFeld nutzen.

11.3 Ver andern der Bildgr oße

Zur Skalierung von Bildern stehen die Funktionen CONGRID und REBIN mit zwei unter-

schiedlichen Algorithmen zur Verfugung. Das Beispiel im ist ein Bild der Große 256x256 

new=REBIN(im,128,512) & TV,new

Halbieren in Breite und Verdoppeln in Hohe. Die Bildgroße kann nur mit ganzahli-

gen Faktoren verandert werden. Diese Funktion ist schneller als CONGRID. 

new=CONGRID(im,640,421,/INTER) & TV,new

Mit CONGRID ist eine beliebige Vergroßerung oder Verkleinerung moglich.

Die Default-Einstellung fur die Interpolation ist die nearest-neighbor Methode. Eine

bilineare Interpolation kann man mit dem Keyword INTER erreichen.

Page 139: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 139/238

11.4. DARSTELLUNG EINES BILDES 119

11.4 Darstellung eines Bildes

Bilder werden mit dem Befehl TV oder TVSCL dargestellt.

 

TV,im

Das Bild wird mit TV angezeigt.Die Defaultposition ist die linke untere Ecke des graphischen Ausgabegerates,

das Bild wird von unten nach oben dargestellt. 

TV,im,/ORDER

Verandern der Zeilenordnung, Bild von oben nach unten

/ORDER uberschreibt den Defaultwert temporar. 

ERASE

loscht die Zeichenflache 

TVSCL,im

TV zeigt die Farbwerte, die in der Bilddatei stehen, direkt an. Der TVSCL-Befehl

skaliert die vorhandenen Farbwerte auf den Bereich 0B bis 255B, d.h. es erfolgteine Streckung der Farben auf die gesamte Farbpalette.

besser

TVSCL,BYTSCL(im,TOP=!D.TABLE SIZE-1)

Streckung auf verfugbare Farben,

effektiv mit zusatzlichen Keywords: MIN, MAX

Abbildung 11.1: Bildverarbeitung: TVSCL

Page 140: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 140/238

120 KAPITEL 11. BILDVERARBEITUNG

11.5 Positionieren des Bildes

Es gibt zwei Moglichkeiten, Bilder zu positionieren. Zum einen, uber einen Index und zum

anderen mit einem Bildoffset in Pixeln.

Mit TV,im,0wird die erste Position oben links des Ausgabegerates verwendet. Bei meh-

reren Positionsangaben laufen die Bild-Positionen von links oben nach rechts unten,sieheauch Seite 121.

Der Befehl TV,im,300,200mit zwei Parametern 300,200 beinhaltet eine Positions-

angabe. Das Bild im wird ab der Device-Koordinaten-Position X=300 und Y=200 von

unten nach oben gezeichnet. Mit der Systemvariablen !ORDER=1 bzw. dem Keyword

ORDER kann man steuern, daß ein Bild von oben nach unten gezeichnet wird.

Beispiel:

Anzeige eines Farbbalkens links und ein Bild rechts daneben

bar=BYTARR(20,256)

FOR i=0,19 DO bar[i,*]=BINDGEN(256)

ERASE

TV,bar

TV,im,20,0

Abbildung 11.2: Bildverarbeitung: TV

Page 141: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 141/238

11.6. BILDANALYSE 121

11.6 Bildanalyse

IDL bietet verschiedene Filter. Einige dieser Filter werden auf dieser Seite beispielhaft

dargestellt. Durch die kombinierte Anwendung von Filter- und WHERE-Funktion ist IDL

ein machtiges Werkzeug zur Bildanalyse. Das Satelliten-Daten Auswerte-ProgrammENVI

ist in IDL geschrieben.

11.6.1 Arbeiten mit Basisfiltern

In diesem Beispiel werden die Basisfilter SMOOTH, MEDIAN, SOBEL und die Filterung

im Frequenzraum mit eingebautem FFT vorgestellt. Außerdem wird in diesem Beispiel

die Positionierung eines Bildes uber einen Index vorgestellt. Damit ist die Darstellung

mehrerer Bilder in einem Fenster moglich. Die Bilder werden in die Ausgabe geschrieben,

wie in der unten stehenden Graphik skizziert ist, und zwar von links nach rechts und von

oben nach unten.

Eventuell: LOADCT,5 zum Laden einer anderen Farbtabelle oder XLOADCT  Großes Window, damit mehrere Bilder reinpassen

WINDOW,XSIZE=800,YSIZE=600 

TV,im,0

Position 0, links oben

Ein Parameter = Position im Bild!

Schematische Anordnung der Bilder im Window

0 1 2

3 4 5 

TV,SMOOTH(im,3),1Mittelwertfilter uber 3 Nachbarn, Position 1

 

TVSCL,MEDIAN(im,3),2

Median- Filter, Unterdruckung einzelner Spitzen,

geringe Kantenverschmierung, Position 2 

TVSCL,SOBEL(im),3

Differentielle Kantenverstarkung, Position 3  Filterung im Frequenzraum mit eingebautem FFT

imf=FFT(im,-1); Daten im Frequ.Raum

filter=DIST(256) LT 50 ;ideales Tiefpassfilter

imf=filter*imf ; Filterung

TVSCL,FFT(imf,1),4 ; Ruecktranf., Darstellung

Mit dem TVRD()-Kommando kann man das Bild vom Bildschirm lesen. Die Zuweisung

new=TVRD()kopiert das Bild in die Variable. new enthalt ein Array vom Typ: BYTE und

kann als PostScript-Datei abgespeichert werden. Information zur Ausgabe, siehe Seite 77 .

Page 142: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 142/238

122 KAPITEL 11. BILDVERARBEITUNG

Abbildung 11.3: Bildverarbeitung: Basisfilter

Hinweis:

Zur weiteren Verarbeitung gibt es die Routinen: WRITE BMP,

WRITE JPEG, WRITE PNG, WRITE TIFF, (WRITE GIF)

Page 143: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 143/238

11.6. BILDANALYSE 123

11.6.2 Ausw ahlen und Verarbeiten einer Region

Haufig ist es wichtig, zusammenhangende Regionen eines Bildes z.B. gleicher Farbe zu

identifizieren. Dazu dient das Programm REGION GROW. Es filtert Daten, die einer be-

stimmten Bedingung entsprechen. Diese Bedingung kann als ein Bereich von einem mini-

malen und maximalen Wert vorliegen. Alle Indices, deren Werte in diesen Schwellenbe-reich fallen, werden zuruckgegeben. Damit kann man z.B. die Flache einer Region bestim-

men.

Das nachfolgende Beispiel zeigt eine Anwendung dieser Routine, um bestimmte Regionen

in einem Bild zu identifizieren. In unserem Beispiel ist dies ein Salatblatt.

Abbildung 11.4: Bildanalyse: Auswahlen einer Region

Das Beispiel verwendet eine BOX CURSOR Routine, damit man einen Bereich

auswahlen kann. Sobald der Bereich ausgewahlt wird, werden die Daten aus dem

Bild img dazu verwendet, einen Grenzbereich zu bestimmen. Durch diese SchwelleTHRESHOLD=[min,max] verhindert man, daß Ausreißer die Auswertung bestimmen.

Die Routine REGION GROW gibt ein Index-Feld zuruck. Die dazugehorigen Daten werden

in der Farbe Rot eingefarbt.

Page 144: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 144/238

124 KAPITEL 11. BILDVERARBEITUNG

PRO bild_analyse

DEVICE,DECOMPOSED=0

!P.color=255

!P.background=0

!ORDER=0area=20.98*29.72

img=TRANSPOSE(READ_PNG(’salat.png’))

test=QUERY_IMAGE(’salat.png’,info)

WINDOW,0,XSIZE=info.dimensions[1],YSIZE=info.dimensions[0]

LOADCT,0

TVLCT,r,g,b,/GET & r[5]=255b & g[5]=0b & b[5]=0b

TVLCT,r,g,b

TV,imgWHILE N_ELEMENTS(RESULT) EQ 0 DO BEGIN

XYOUTS,0.02,0.97,/NORM,COLOR=0,CHARSIZE=2,$

’Select region with cursor’

XYOUTS,0.1,0.1,/NORM,COLOR=0,CHARSIZE=2, $

’Drag Left button to move box!C’+ $

’Drag Middle button near a corner to resize box.!C’+$

’Right button when done.’

X0=100 & Y0=info.dimensions[0]-0.1*info.dimensions[0]

N0=10 & N1=10

BOX_CURSOR,x0,y0,N0,N1,/INIT

image_part=img[x0:x0+N0,y0:y0+N1]

threshold=[MIN(image_part,MAX=MAX),max]

x=INDGEN(N0)+X0

y=INDGEN(N1)+Y0

data=x#y

region = REGION_GROW(img, data,THRESHOLD=threshold)

IF region[0] NE -1 THEN BEGIN

img[region]=5b

TV,img

all_pixels= info.dimensions[0]*info.dimensions[1]

result=FLOAT(N_ELEMENTS(region))/FLOAT(all_pixels)*area

XYOUTS,0.02,0.97,/NORM,CHARSIZE=2.0 , COLOR=0, $

’Selected Area is ’+STRING(result,format=’(F6.2)’)+$

’cm!E2!B’

ENDIF

ENDWHILE

END

Beispiel 11.1: Bildanalyse: Verarbeiten einer Region

Page 145: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 145/238

11.6. BILDANALYSE 125

Falls das Beispiel beim ersten Mausklick kein Ergebnis liefert, erfolgt eine neue Cursor-

Abfrage. Ein mogliches Ergebnis zeigt das nachfolgende Bild.

Abbildung 11.5: Bildanalyse: Auswahlen einer Region

Page 146: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 146/238

126 KAPITEL 11. BILDVERARBEITUNG

Page 147: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 147/238

Kapitel 12

Lesen und Schreiben von Daten

IDL arbeitet in Anlehnung an FORTRAN so, daß man eine Datei zum Lesen und/oder

Schreiben zuerst offnen muß. Nachdem man die Datei gelesen und/oder geschrieben hat,

muß man diese schließen.

12.1 Offnen von Dateien

OPENR Offnen einer bereits existierenden Datei nur fur Eingabe

OPENW Offnen einer neuen Datei nur fur Ausgabe. Falls diese bereits existiert,

wird der bisherige Inhalt geloscht.

OPENU Offnen einer bereits existierenden Datei fur Ein- und Ausgabe

Tabelle 12.1: Lesen und Schreiben von Daten: Offnen

Syntax: OPENR,unit,’filename’

Zuordnung einer Unitnummer zu der angegebenen Datei.

Wird fur Ein- und Ausgaberoutinen benotigt.

Als unit sind die Unitnummern 1- 99 direkt wahlbar.

Keywords: 

GET LUN

Es wird automatisch eine freie Unitnummer ermittelt (100- 128)

 

APPEND

Mit der Option APPEND ist es moglich, eine Datei zu erweitern. Die Daten werden

an das Ende der bestehenden Datei angefugt.

 

F77 UNFORMATTED Fur unformatierte Fortran-Dateien

127

Page 148: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 148/238

128 KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.2 Beispiele fur das Offnen und Schließen von Dateien

Logische Unit Nummern (direkt)

OPENR,5,’maroo bells.dat’

CLOSE,5

Ermittlung einer Unitnummer mit GET LUN

OPENR,unit,’maroo bells.dat’,/GET LUN

FREE LUN,unit

Alle Dateien schliessen

CLOSE,/ALL

Auch mit GET LUN geoffnete Dateien werden geschlossen

Hinweis:

Bei mit GET LUN geoffneten Dateien wird die Datei mit CLOSE zwar geschlossen, aber

der Counter bleibt auf der letzten geoffneten Unitnummer stehen. Daher sollte man besser

FREE LUN zum Schließen von Dateien verwenden, die mit GET LUN geoffnet sind. Die

Datei wird geschlossen und die logische Unit Number (lun) wieder freigegeben.

Page 149: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 149/238

12.3. LESEN UND SCHREIBEN VON DATEN 129

12.3 Lesen und Schreiben von Daten

Die Programme fur formatierte bzw. unformatierte Eingabe und Ausgabe von Daten sind

in nachfolgender Tabelle gelistet.

READF Formatierte Eingabe von einer DateiPRINTF Formatierte Ausgabe auf eine Datei

READU Unformatierte Eingabe von einer Datei

WRITEU Unformatierte Ausgabe auf eine Datei

Tabelle 12.2: Lesen und Schreiben von Daten: Lesen und Schreiben von Daten

Syntax: READF,unit,var1,var2,...varn

(Fur die anderen Routinen entsprechend.)

Beispiel:

Freies Format (nicht formatiert!)

array=intarr(5)

READ,array ; liest vom Keyboard

var1=FLTARR(3,8)

var2=INTAR(10)

var3=’’

OPENR,lun,’datafile.dat’,/GET_LUN

READF,lun,var1,var2,var3

...

FREE_LUN,lun

Page 150: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 150/238

130 KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.3.1 Formale Vorschriften beim Lesen

Beim Einlesen ohne Formatangabe werden standardmaßig Werte vom Typ FLOAT

erwartet.

Variablen vom Typ INT bzw. LONG mussen entweder vor dem Lesen initialisiert werden

oder nach dem Einlesen in den entsprechenden Typ umgewandelt werden.

Hinweis:

Einlesen in indizierte Variablen ist nicht moglich!

Grund: READF ist ein IDL Programm. Ruft man dieses mit einem indizierten Feld

auf, so ist dies eine Ubergabe call by value. Das IDL Programm READF kann keinen Wert

zuruckgeben.

Nur eine Ubergabe call by reference kann einen Wert zuruckgeben, siehe auch Seite 144.

var1=FLTARR(10) & var2=var1 & var3=var1

temp1=0.0 & temp2=temp1 & temp3=temp1

OPENR,lun,’datafile.dat’,/GET_LUN

FOR j=0,9 BEGIN

READF,lun,temp1,temp2,temp3

var1[j]=temp1 & var2[j]=temp2 & var3[j]=temp3

ENDFOR

FREE_LUN,lun

Vorbesetzung mit FLOAT Werten, wenn man beim Lesen keinen Typ angibt!

Weitere Regeln:

  Eingabe durch Komma, Leerzeichen oder Tabulatoren trennen

  Jeder READ-Befehl greift auf eine neue Eingabezeile zu

  Wird auf eine Variable vom Typ STRING eingelesen, werden alle weiteren Zeichen

der Zeile auf diese Variable eingelesen

Hinweis:

ASCII Daten lassen sich nur dann schnell einlesen, wenn sie wie Arrays behandelt wer-

den.

Page 151: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 151/238

12.3. LESEN UND SCHREIBEN VON DATEN 131

12.3.2 Lesen (explizit) formatierter Daten

Das Lesen und Schreiben expliziter Format Daten funktioniert mit einer Formatangabe wie

in der Programmiersprache Fortran!

READF,lun,var,FORMAT= 

FORMAT=’(I3)’ 

FORMAT=’(6I2,4(I5,X))’ 

FORMAT=’(F10.2)’ 

FORMAT=’(6F5,4(I4,F10.3))’

D double precision

I Integer

E scientific notation

n X skip n character

A character data

F Float

Page 152: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 152/238

132 KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.3.3 Lesen und Schreiben unformatierter Daten

Daten vom Typ BYTARR (images) werden gewohnlich unformatiert gelesen und geschrie-

ben.

Die Große der Felder muß bekannt sein.

Lesen

var1=FLTARR(30,200)

var2=INTARR(30)

OPENR,lun,’datafile.dat’,/GET_LUN

READU,lun,var1,var2

FREE_LUN,lun

Schreiben

OPENW,lun,’datafile.dat’,/GET_LUNWRITEU,lun,var1,var2

FREE_LUN,lun

12.3.4 Lesen von unformatierten Daten mit assozierten Variablen

Mit dem Befehl ASSOC kann man mehrere gleichgroße Bilder in einer schnellen und kom-

fortablen Art und Weise verarbeiten. Die Bilder mussen hintereinander abgespeichert vor-liegen. Mit den OPENR-Befehl offnet man die Datei und ordnet dann mit dem ASSOC

Befehl die logische Unitnummer und die Bildgroße einer Variablen zu. Uber einen Index

greift man auf die einzelnen Bilder zu. Der Mechanismus funktioniert solange, wie die

Datei offen ist.

OPENR, lun, ’datafile.dat’,/GET_LUN

image = ASSOC ( lun, BYTARR(256,256) )

TVSCL, image[3]

; Verarbeitung von image[3]

FREE_LUN, lun

Hinweis:  Es wird immer nur ein Bild im Speicher gehalten.  Nach dem CLOSE bzw. FREE LUN kein Zugriff mehr auf die Variable image.

Page 153: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 153/238

12.4. ARBEITEN MIT DATEIEN 133

12.4 Arbeiten mit Dateien

In diesem Abschnitt werden einige Befehle beschrieben, die fur das Arbeiten mit Dateien

sehr hilfreich sind.

  Testen der End-Of-File Bedingung

WHILE NOT EOF(lun) DO BEGIN ...

  Hilfe und Informationen uber Dateien

HELP, /files

info = FSTAT(lun)

PRINT, info.size

PRINT, info.cur_ptr

HELP, info, /STRUCTURE

  Posititionieren des File Pointer

POINT LUN, lun, 0

  Suchen nach Dateien

files = FILE SEARCH(’$DATADIR/*.dat’, COUNT=c )

  Selektieren von Dateien

pick=DIALOG PICKFILE(path=’˜/idlkurs’,filter=’*.pro’)IF STRLEN(pick) EQ 0 THEN RETURN

OPENR, lun, pick, /GET LUN

Oberflache zur Selektion eines Files wird geoffnet

Page 154: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 154/238

134 KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.5 Operationen auf Dateien/Verzeichnissen ohne Wech-

sel zum Betriebssytem

Eigenschaften von Dateien oder Verzeichnissen kann man mit IDL Routinen abfragen. Es

ist kein Wechsel zum Betriebssytem notwendig.

FILE CHMOD Zugriffsrechte andern

FILE DELETE loscht ein oder mehrere leere Directories oder einen File

bzw. mehrere Files

FILE EXPAND PATH gibt zu einem File den voll qualizifierten Pfad mit Namen an

FILE MKDIR legt ein neues Directory oder mehrere Directories an (mit

Default-Zugriffsrechten)

FILE SEARCH sucht nach Dateien.

FILE TEST Uberprufen ob File existiert, ohne daß man diesen offnen

muß

FILE WHICH durchsucht einen angegebenen Pfad nach einem File, sonst

wird der IDL Pfad !PATH durchsucht

FSTAT z.B. Filegroße in Bytes und Modifikationsdatum

Page 155: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 155/238

12.6. AUTOMATISIERTE EINGABE EINES ASCII-DATENSATZES 135

12.6 Automatisierte Eingabe eines ASCII-Datensatzes

READ ASCII ist ein Programm zur automatisierten Eingabe von ASCII-Datensatzen, die

spaltenweise abgespeichert sind. 

READ ASCII erkennt ob Strings, Integerdaten oder Floatdaten eingelesen werden.  Es konnen wahlweise Zeilen zu Beginn uberlesen werden bzw. getrennt von den

Datenzeilen eingelesen werden.  Die Daten werden in einer Struktur gespeichert.  Das Programm ist bei großen Datenmengen recht langsam!

Mit idlde steht dieses Programm zur interaktiven Anwendung uber das Menu in der

Tool Area bereit.

Das Datenfile wird analysiert und gelesen. Dazu wird ein Widget gestartet, in dem der

Benutzer die Analyse der Daten beeinflußen kann.

Aufruf vom IDL-Programm

Das Programm READ ASCII benotigt ein Template, welches man interaktiv erstellen

kann. Dieses Template kann man sichern und in einer neuen IDL-Sitzung mit RESTORE

laden. Eine andere Moglichkeit ist, die mit ASCII TEMPLATE erstellte Struktur im Pro-

gramm zu deklarieren, siehe Beispiel lese ascii.pro. Das Programm und auch das

skizzierte Beispiel arbeitet mit der Datei ascii input.dat

filename=’ascii_input.dat’ ; sonst Widget zur Auswahl

template=ASCII_TEMPLATE(filename)

SAVE, template, FILE=’save.dat’

Hinweis:

READ ASCII lauft nicht in Run-Time (execute).

Das Einlesen großer Dateien mit READ ASCII ist sehr langsam, da mit Formatangabe

zeilenorientiert gelesen wird. Eine Array-orientierte Eingabe dagegen ist schneller.

Page 156: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 156/238

136 KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

READ ASCII Template und Anwendung

RESTORE,’save.dat’

filename=’ascii_input.dat’ ;sonst Widget zur Eingabe

data = READ_ASCII( filename,

TEMPLATE=template, HEADER=header, DATA_START=17)

help,template,/str

** Structure <300be730>, 10 tags, length=176, refs=1:

VERSION FLOAT 1.00000

DATASTART LONG 16

DELIMITER BYTE 32

MISSINGVALUE FLOAT NaN

COMMENTSYMBOL STRING ’’

FIELDCOUNT LONG 9

FIELDTYPES INT Array[9]

FIELDNAMES STRING Array[9]

FIELDLOCATIONS LONG Array[9]

FIELDGROUPS INT Array[9]

help,data,/str

** Structure <3046a500>, 9 tags, length=7160, refs=1:

FIELD1 LONG Array[179]

FIELD2 STRING Array[179]

FIELD3 LONG Array[179]

FIELD4 FLOAT Array[179]

FIELD5 FLOAT Array[179]

FIELD6 FLOAT Array[179]

FIELD7 FLOAT Array[179]

FIELD8 FLOAT Array[179]

FIELD9 FLOAT Array[179]

Beispiel 12.1: Arbeiten mit Dateien: READ ASCII Template

data.field1 enthalt die Daten der 1. Spalte,

data.field2 enthalt die Daten der 2. Spalte, usw.

Kopfzeilen der Datei kann man fur die Dateneingabe mit dem Keyword DATA START

ignorieren. Mit der Option HEADER kann man den uberlesenen Text in einer ASCII-Datei

abspeichern. Die Option HEADER funktioniert nur in Verbindung mit dem KeywordDATA START.

12.6.1 Zusammenfassung gebr auchlicher Lese- uns Schreibroutinen

READ ASCII Lesen von ASCII Daten

READ BINARY Lesen von binarer Daten

READ IMAGE Lesen von Image Daten

Tabelle 12.3: Lesen und Schreiben von Daten: Zusammenfassung von Lese- und Schreibroutinen

Page 157: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 157/238

12.7. BEISPIEL: LESEN UND SCHREIBEN 137

12.7 Beispiel: Lesen und Schreiben

PRO datei_op

;--------------------------------------------

; Oeffnen der Ein- und Ausgabedateien

;--------------------------------------------

OPENR, unit_in, ’datei_op.in’, /GET_LUN

OPENW, unit_out, ’datei_op.out’, /GET_LUN

;--------------------------------------------

; Einlesen

;--------------------------------------------

zeile = ’ ’

READF, unit_in, zeile

zeile = STRCOMPRESS(zeile)

params = STRSPLIT(zeile,’ ’,/EXTRACT)

maxwerte = 1000

nparams = N_ELEMENTS(params)

werte = FLTARR(nparams,maxwerte)

wertezeile = FLTARR(nparams)

nwerte = 0

WHILE NOT EOF(unit_in) DO BEGIN

READF, unit_in, wertezeile

werte[*,nwerte] = wertezeile

nwerte = nwerte + 1

ENDWHILE

werte = werte[*,0:nwerte-1]

;--------------------------------------------

; Verarbeitung der Werte

;--------------------------------------------

werte = werte * 10.

;--------------------------------------------

; Ausgabe der Ergebnisse

;--------------------------------------------

PRINTF, unit_out, params, FORMAT=’(’+STRING(nparams)+’A10)’

PRINTF, unit_out, werte, FORMAT=’(’+STRING(nparams)+’F10.2)’

;--------------------------------------------

; Schliessen der Ein- und Ausgabedateien

;--------------------------------------------

FREE_LUN, unit_in

FREE_LUN, unit_out

END

Beispiel 12.2: Lesen und Schreiben: Programm zum Lesen und Schreiben

Page 158: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 158/238

138 KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

Page 159: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 159/238

Kapitel 13

Programmierung und Kompilation

Main Programm Folge von Statements, die mit END beendet wird. Ein Main

Programm hat keine Argumente und ist nur explizit und nicht

von anderen Programmen aufrufbar.

Prozedur IDL-Programm ohne expliziten Ruckgabewert. Kommunikati-

on mit anderen Routinen uber Argumente.

Funktion Wie Prozedur, jedoch mit explizitem Ruckgabewert.

Eine Funktion kann in einem Ausdruck verwendet werden.

Textuelles Einfugen von IDL Statements ist moglich, siehe Batchverarbeitung auf Seite

140.

Hinweis:

Die Erstellung der Programme ist mit einem beliebigem Texteditor moglich.

139

Page 160: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 160/238

140 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.1 Batchverarbeitung

Eine Batch Datei (JOURNAL) enthalt ein oder mehrere IDL Befehle oder Statements. Bei

der Ausfuhrung einer Batch Datei wird diese zeilenweise gelesen und direkt interpretiert.

Beispiel: Protokoll einer interaktiven Sitzung

JOURNAL, ’Datei’ Start eines Protokolls

JOURNAL beenden

Die Textdatei mit Namen ’Datei’ enthalt alle eingegebenen Befehle.

Ein spateres Editieren dieser Datei ist moglich.

Mit dem Befehl @name kann man die Datei name interaktiv von der Kommandozeile als

Batchdatei ablaufen lassen.

Eine andere Moglichkeit ist, @name in einem IDL-Programm einzufugen.

13.2 Formales zu IDL-Programmen  IDL Programme ...

– 1. Statement beginnt mit ...

PRO Prozedur

FUNCTION Funktion

Main: beginnt mit beliebigem IDL Statement

– Routine endet auf ...

Main, Prozedur und Funktion enden mit END

Bei der Funktion wird zusatzlich der Ruckgabewert angegeben.

RETURN,wert– Namensgebung:

Main, Prozedur und Funktion haben die Extension .pro

13.3 Definition einer Prozedur oder Funktion

PRO pro name,p1,p2,...KEYWORD1=pk1,KEYWORD2=pk2 .....

FUNCTION func name,p1,p2,...KEYWORD=pk1,KEYWORD2=pk2....p1,p2,... Positionale Parameter, optional

pk1,pk2... Optionale Keywordvariable

Page 161: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 161/238

13.4. AUFRUF EINER PROZEDUR ODER FUNKTION 141

13.4 Aufruf einer Prozedur oder Funktion

(IDL Bibliotheksprogramm oder vom Benutzer geschriebenes Programm)

Prozedur-Name,p1,p2,... KEYWORD1=pk1,KEYWORD2=pk2 .....

result=Funktions-Name(p1,p2,... KEYWORD1=pk1,KEYWORD2=pk2 .....)

p1,p2,... Positionale Parameter

Reihenfolge muß eingehalten werden

pk1,pk2,... Keywordvariable

beliebige Reihenfolge!

Abkurzung moglich

KEYWORD1,KEYWORD2 ist die Bezeichnung selbst,

pk1, pk2 ist der Parameter

Beide Parametertypen konnen optional sein, siehe Online Help: mit [ ] gekennzeichnet

sind die optionalen Parameter.

13.5 Regeln fur die Namensgebung von IDL Programmen

Der Name einer Funktion oder Prozedur ist durch die Bezeichnung gegeben, die auf PRO

oder FUNCTION folgt. Daher Funktion/Prozedur mit diesem Namen und der Extension

.pro benennen. Dadurch werden die Routinen als IDL Programme erkannt.

In IDL kann man jede Prozedur oder Funktion als .pro abspeichern.

Eine Datei kann aber auch aus mehreren Programmeinheiten bestehen.

Page 162: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 162/238

142 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.6 Kompilieren/Ausfuhren einer Prozedur/Funktion

Ein IDL Programm muß vor dem Aufruf kompiliert werden. Dieses kann explizit mit einem

Befehl geschehen aber auch implizit durch einen Aufruf einer Routine.

Hinweis:Das IDL-Programm wird nur gefunden, wenn es im aktuellen Verzeichnis oder im IDL-

Suchpfad liegt.

Wenn die Datei mehrere Programmeinheiten enthalt, muß der Name der Datei gleich dem

Namen der letzten Prozedur/Funktion in dieser Datei gewahlt werden.

Grund:

IDL ubersetzt beim ersten Aufruf das Programm und zwar sequentiell bis zu der Routine,

die physikalisch als Filenamen vergeben wurde. Eventuell nachfolgende Routinen werden

ignoriert.

Beispiel: c.proPRO a

...

END

PRO b

...

END

PRO c

...

END

Hinweis:

Existiert eine weitere Routine b.pro (im aktuellen Suchpfad) zusatzlich zu oben auf-

gefuhrten Beispiel c.pro, so wird das Programm b.pro nicht neu ubersetzt, da dieses

Programm bereits bekannt ist.

Bei jedem weiteren Aufruf wird die Prozedur oder Funktion nur ausgefuhrt und nicht wie-

der kompiliert. Nach einer Anderung ist eine explizite Kompilation mit dem .COMPILE

Befehl erforderlich.

Meist wird man jedoch mit der idlde-Oberflache arbeiten und die Kompilation im RUN-

Menu mit dem COMPILE-Befehl erledigen. Dieser COMPILE-Befehl arbeitet wie der.COMPILE-Befehl, den man von der Command-Line absetzen kann und ubersetzt alle

Programme, die in der angegebenen Datei vorliegen. Die Ausfuhrung erfolgt mit demRUN-

Befehl des RUN-Menus.

Page 163: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 163/238

13.7. BEISPIELE F UR IDL PROGRAMME 143

13.7 Beispiele fur IDL Programme

  Hauptprogramm

Der Name kann willkurlich gewahlt werden.

Beispiel: sample_hauptprogramm.pro

a=1 & b=FINDGEN(100) & HELP,a,b

END

Aufruf: .run sample_hauptprogramm

  Prozedur

Den Namen so wahlen wie die Bezeichnung, die auf .pro endet

Beispiel: sample prozedur.pro

PRO sample prozedur,title=titlePLOT,FINDGEN(100),TITLE=title

END

Aufruf: sample prozedur,title=’test’

  Funktion

Den Namen so wahlen wie die Bezeichnung, die auf .pro endet

Beispiel: sample function.pro

FUNCTION sample function,faktor

a=RANDOMU(SEED,10) ; 10 ZufallszahlenRETURN,a*faktor

END

Aufruf: ergebnis=sample function(5.)

Page 164: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 164/238

144 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.8 Speicherverwaltung von Daten

13.8.1 Ubergabe von Parametern an Prozeduren und Funktionen

Bei der Ubergabe von Parametern an Prozeduren und Funktionen unterscheidet man zwi-

schen call by value und call by reference.  Ausdrucke, Konstanten, Systemvariablen und indizierte Variablen werden by value

ubergeben.

by value bedeutet: Diese Werte sind Eingabewerte. Uber diese Werte konnen keine

Ruckgaben erfolgen

ergebnis=sample func(5.)

ergebnis=sample func(a[6])

  Variablen werden by reference ubergeben.

by reference bedeutet: Diese Variablen sind Eingabewerte. Uber diese Werte konnen

Ruckgaben erfolgen. Wenn diese Variablen im Unterprogramm verandert werden,

muß man beachten, daß die veranderten Werte zuruckgegeben werden. Um das zu

verhindern, muß im Unterprogramm mit einer Kopie der Variablen gearbeitet wer-

den.

value=5.

ergebnis=sample func(value)

arr=MAKE ARRAY(5,5,/INT,VALUE=5)

ergebnis=sample func(arr)

Page 165: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 165/238

13.8. SPEICHERVERWALTUNG VON DATEN 145

13.8.2 Lokale Variable

Dynamische Verwaltung lokaler Daten in IDL

Nach dem Abarbeiten einer Prozedur/Funktion werden alle lokalen Variablen geloscht

und sind bei einem zweiten Aufruf derselben Routine unbekannt. Es gibt kein Gedachtnis!

Wird dies benotigt, mussen die Daten uber Parameterliste, Systemvariablen, COMMONoder Pointer ubergeben werden.

Hinweis:

Speicherplatz von lokalen Variablen nur innerhalb der Prozedur/Funktion belegt!

13.8.3 Regeln fur Parameter

Nur die Parameter, passed by reference, werden an das aufrufende Programm zuruckgege-

ben. Parameter, passed by value, sind im aufrufenden Programm unverandert.

Ausnahmen:

  Nach Abarbeitung eines Main Programms bleiben die Variablen erhalten.

MAIN Programme sind daher ideal zum Testen kleiner Programmsequenzen!

Beispiel: Main Programm als mainpro.pro

a=1 & b=1 ; .run mainpro

PRINT,a,b ; dannach bekannt: Variablen a,b

END 

IDL Systemvariablen !P, !PI, !D,... sind in jeder Programmeinheit bekannt.  Common Block   Pointer

Page 166: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 166/238

146 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.9 Beispiele: Aufruf von Funktionen und Prozeduren

1. FUNCTION multi,value,times

RETURN,value*times

END

PRINT, multi(6,2)

2. FUNCTION quad,x

RETURN,xˆ2+x+4

END

PRINT,quad(4)& PRINT,NR QROMB(’quad’,0.0,6.0)

Die Funktion NR QROMB (Numerical Recipes) liefert ein Integral uber ge-

schlossenes Intervalle. ’quad’ ist der Name der Funktion, die integriert werden

soll, 0.0 und 6.0 definieren die Intervallgrenzen

3. PRO ADD,a,b

a=a+b

END

a=5 & ADD,a,4 ; OK,Uebergabe von A by reference

ADD,4,a ; falsch,4 ist Konstante,Uebergabe by value

; Keine Fehlermeldung

arr=FINDGEN(10)ADD,arr[5],4 ; falsch, indizierte Variable

; Uebergabe by value

Hinweis:

Das Ergebnis einer Funktion kann ohne Zwischenspeichern auf eine neue Variable mit

dem PRINT-Befehl ausgegeben werden, siehe oben. Bei Prozeduren werden Ruckgabe-

werte nur uber Parameter ausgetauscht.

Page 167: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 167/238

13.10. FORWARD FUNCTION FUNKTION 147

13.10 FORWARD FUNCTION Funktion

Ein Problem tritt auf, sobald Argumente in der Deklaration einer Routine gleich lauten

wie Funktionsaufrufe. Ein Beispiel fur den Problemfall folgt im unteren Beispiel durch

die Deklaration des IDL-Programms MEAN.

Der Name der IDL-Routine MEANwird als Argument beim Aufruf der Funktion problembenutzt. Wenn man eine Variable mean als Argument benutzt, geht IDL davon aus, das

auch der zweite Aufruf eine Variable sein soll und uberpruft nicht mehr auf eine zu

ladende Funktion.

Dies kommt daher, weil bis IDL5.0 Array-Indizierung mit runden Klammern ublich

war. Daher wird x=MEAN(mean) in diesem Fall als Indizizierung von MEAN mit mean

verstanden.

;Problem Argumentname gleich lautend wie Funktionsname

;

;FUNCTION problem,mean

x=MEAN(mean)

RETURN,x

END

Beispiel 13.1: Programmierung und Kompilation: ohne FORWARD FUNCTION

Aufruf:

x=problem(INDGEN(10))

PRINT, x

0 1 2 3 4 5 6 7 8 9

Mit der Routine FORWARD FUNCTION hat man die Moglichkeit, diesen Konflikt zu

beheben. Dadurch wird in der Routine definiert, daß das Argument mit dem gleichlauten-

den Namen in einem Funktions-ahnlichem Aufruf auf jedem Fall als Funktion von IDL

interpretiert wird.

Syntax:

FORWARD FUNCTION Name1,Name2,....

; Anwendung von FORWARD_FUNCTION um den Konflikt; Argumentname gleich Funktionsaufruf zu beheben.

;

FUNCTION no_problem,mean

FORWARD_FUNCTION MEAN

x=MEAN(mean)

RETURN,x

END

Beispiel 13.2: Programmierung und Kompilation: mit FORWARD FUNCTION

Page 168: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 168/238

148 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

Aufruf:

x=no problem(INDGEN(10))

PRINT, x

4.50000

Hinweis:Man sollte darauf achten, Argumente niemals so zu nennen wie Funktions-Aufrufe in der

selben Routine.

Page 169: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 169/238

13.11. KONTROLL-STATEMENTS 149

13.11 Kontroll-Statements

Wie in jeder Script-Sprache gibt es auch in IDL Definitionen, die eine strukturierte Pro-

grammierung erlauben. Das Format solcher Anweisungen unterscheidet sich zwischen

Script-Sprachen.

IDL spezifisch ist, daß Blocke mit BEGIN, IF, CASE, FOR usw. beginnen. Die jewei-

ligen Endstatements spezifizieren den Typ des zu schliessenden Blocks (END, ENDIF,

ENDCASE, ENDFOR usw.).

Der BEGIN-Block ist eine Zusammenfassung von Statements, die dann wie ein Statement

behandelt werden. 

BEGIN

statement_1

......

statement_n

END

Mit IF wird eine Bedingung auf true/false gepruft. Falls die Bedingung erfullt ist, wird der

BEGIN-Block ausgefuhrt. Wahlweise kann ein Block fur die Behandlung erfolgen, sobald

die Bedingung nicht erfullt ist. 

IF (true) THEN BEGIN

......

ENDIF [ ELSE BEGIN

......

ENDELSE]

Falls nur ein Statement ausgefuhrt wird, kann man den IF-Fall auch in eine Zeile schrei-

ben. 

IF A THEN B=1 ELSE BEGIN

C=2 & D=4

ENDELSE

 

IF A NE 2 THEN PRINT,’A is not 2’

  Aquivalente Schreibweisen:

IF ( a EQ b ) THEN c=a ELSE c=0.0

c = ( a EQ b ) ? a : 0.0

In beiden Fallen wird gepruft, ob der Ausduck (a EQ b) Gultigkeit hat. Bei Gleichheit

wird c=a gesetzt, sonst c=0.

Page 170: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 170/238

150 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

Die Variable test wird getestet. Im Beispiel werden die Falle test=0, test=1,

test=2 behandelt. Fur test=0 wird ein PRINT ausgefuhrt und fur test=1 wird der

BEGIN-Block ausgefuhrt. Fur test=2werden andere beliebige Anweisungen ausgefuhrt.

Falls test keinen der Werte 0, 1 oder 2 hat, gilt das was bei der ELSE-Anweisung pro-

grammiert ist. 

test=0

CASE test OF

0: PRINT,’OK’

1: BEGIN

.... ; mehrere Statements als BEGIN Block

END

2: ....

ELSE: ; Crash ohne ELSE bei nicht abgeprueftem Wert

ENDCASE

SWITCH arbeitet anders als CASE. Wenn x den Wert 1 hat, wird ab der Stelle 1: abgear-

beitet bis zum ENDSWITCH

Wenn x=2 ist, wird ab der Stelle 2: abgearbeitet bis zum ENDSWITCH

 

x=2

SWITCH x OF

1: PRINT,’one’

2: PRINT,’two’

3: PRINT,’three’

4: PRINT,’four’

ENDSWITCH

Ausgabe:

two

three

four

Die FOR-Schleife wird fur die Werte I=1,... bis N durchlaufen. 

FOR I=1,N DO BEGIN

......ENDFOR

Die FOR-Schleife wird fur die Werte I=N,... bis -5 mit dem Inkrement -1 durchlaufen 

FOR I=N,-5,-1 DO BEGIN

......

ENDFOR

Page 171: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 171/238

13.11. KONTROLL-STATEMENTS 151

Wenn man FOR X=0,1.,0.1 kodiert, hat man eine Endlos-Schleife, da x=0 vom Typ

INT ist und eine Addition einer FLOAT Zahl 0.1 den Wert X nicht erhoht. 

FOR X=0.,1.,0.1 DO BEGIN

; Inkrement 0.1 ; ...

ENDFOR

Diese Schleife lauft ab 0. mit dem Inkrement 0.1, also fur die Werte

0.,0.1,0.2,...,1.0

Die WHILE-Schleife wird ausgefuhrt, solange die Bedingung (A LT B) erfullt ist. Die

Bedingung wird am Schleifenanfang getestet. 

A=1

B=10

WHILE ( A LT B ) DO A=A*2 ; Ergebnis: A=16

Diese WHILE-Schleife wird ausgefuhrt, solange die Bedingung (NOT EOF(1)) erfullt

ist. Beendet wird die Schleife, wenn das Dateiende gefunden wird. 

WHILE ( NOT EOF(1) ) DO BEGIN

readf,1,a

i=i+1

...

ENDWHILE

Die REPEAT-Schleife wird solange ausgefuhrt, bis die Bedingung (A GT B) erfullt ist.

Die Bedingung wird am Schleifenende getestet. 

A=1

B=10

REPEAT A=A*2 UNTIL ( A GT B) ; Ergebnis: A=16

GOTO ist eine Verzweigung zu einer Stelle, die im Programm mit einem Label ’ende:’

markiert ist. 

GOTO, ende

....

ende:

STOP

Page 172: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 172/238

152 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.12 Uberprufung der Argumente und Keywords

Der Aufruf einer Prozedur/Funktion kann mit weniger oder ohne Parameter/Keywords er-

folgen, als durch die jeweilige Definition festgelegt ist.

 

Anzahl der positionalen ParameterKeywordparameter nicht berucksichtigt

number=N_PARAMS()

  Ist ein Keywordparameter gesetzt?

defined=KEYWORD_SET(variable)

defined=1 (true) bzw. defined=0 (false)

Die Anzahl der Werte selbst ist nur mit N ELEMENTS zu ermitteln.

  Anzahl der Elemente

n=N_ELEMENTS(variable)

– Ein Skalar hat nur ein Element A=1

Im Gegensatz dazu ist A=[1] ein Vektor mit einem Element

(siehe SIZE-Funktion auf Seite 25).

– Bei Array: Produkt der Dimensionen

– falls undefiniert: 0

  Wie wurde das Argument ubergeben?

defined=ARG_PRESENT(variable)

defined=1 Ubergabe: by reference

defined=0 Ubergabe: by value

Hinweis:

KEYWORD SET, N ELEMENTS und ARG PRESENT

gelten fur Positional- und Keywordparameter

Page 173: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 173/238

13.13. BEISPIEL 153

13.13 Beispiel

Das Programm zeigt die Uberprufung der aktuellen Aufrufparameter einer Funktion. Mit

N PARAMS ermittelt man die Anzahl der positionalen Parameter. N ELEMENTS hat den

Wert 0, wenn kein Wert vorliegt. Mit KEYWORD SET uberpruft man, ob eine Keyword-

Variable TRUE oder FALSE definiert wurde.

PRO PLOT_IT,P1,P2,COLOR=color,SYMBOL=yes

ON_ERROR,1

CASE N_PARAMS() OF

0: Message,’Must Call Plot_it With One Parameter’

1: BEGIN

dep=P1

indep=INDGEN(N_ELEMENTS(P1),/FLOAT)

END

2: BEGIN

dep=P2indep=P1

END

ELSE: BEGIN

MESSAGE,’Must call Plot_it With one Parameter’,$

/INFO,/CONTINUE

RETURN

END

ENDCASE

IF (N_ELEMENTS(color) EQ 0) THEN color=0

IF KEYWORD_SET(yes) THEN psym=4 else psym=0

LOADCT,5PLOT,indep,dep,/Nodata

OPLOT,indep,dep,COLOR=color,PSYM=psym

END

Beispiel 13.3: Programmierung und Kompilation: Uberprufung der Parameter

M ogliche Aufrufe:

a=INDGEN(100,/FLOAT) & curve=SIN(a/5)/EXP(a/50)

time=INDGEN(100,/FLOAT)*6./99

PLOT_IT,curvePLOT_IT,time,curve

PLOT_IT,curve,COLOR=150

PLOT_IT,curve,/SYMBOL

PLOT_IT,time,curve,COLOR=100,SYMBOL=1

P1 und P2 sind positionale Parameter. SYMBOL ist die Bezeichnung der Keyword-

Variablen, wahrend yes der Wert der Keyword-Variablen ist.

Page 174: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 174/238

154 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.14 Durchschleusen zus atzlicher Argumente

Das EXTRA Keyword hat folgende Bedeutung:

IDL erlaubt die Vererbung von Keyword Parametern. Dadurch ist es moglich, Keywords,

die nicht in einer Prozedur oder Funktion deklariert sind, an darunter liegende Routinen

zu ubergeben. Damit hat man die Moglichkeit, sehr leicht sogenannte Wrapper-Routinenzu schreiben, da man nicht alle Keywords neu deklarieren muß.

PRO uebung,TITLE=title,_EXTRA=extra

HELP,extra,/STR

a=DIST(20)

SURFACE,a,_EXTRA=extra

HELP,extra,/STR ; Information! was steht in extra?

IF (N_ELEMENTS(TITLE) eq 1) then $

XYOUTS,0.5,0.5,/NORM,TITLE

END

Folgende Aufrufe sind moglich:

uebung

uebung,/LEGO,TITLE=’Surface Programm’

uebung,BACKGROUND=100,/SKIRT

Die Keywords LEGO, BACKGROUND und SKIRTwerden an die Routine SURFACEweiter

gereicht.

Hinweis:EXTRA ist eine Strukturvariable! Es konnen alle m oglichen Ubergaben auf diese Art

gemacht werden, auch Tippfehler!

Ein nicht gultiger Parameter/Keyword wird von der jeweiligen Funktion ignoriert.

Page 175: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 175/238

13.15. COMMON BLOCKE 155

13.15 COMMON Bl ocke

COMMON Blocke dienen dazu, Daten in verschiedenden Programmeinheiten bekannt zu

machen. Diese Art der Datenubergabe ist wohl die alteste. Man macht eine Initialisierung

der Daten im Programm und ist damit nicht sehr flexibel. Vorsicht ist auch geboten, wenn

sich die Lange des COMMON-Blocks andert.

Hinweis:

Es gibt eine andere Moglichkeit der Datenubergabe:

Daten in Strukturen, Pointer auf Strukturen

Einige IDL Routinen arbeiten mit COMMON Blocken.

Syntax:

COMMON commonblock_name,var1,var2,...varn

IDL belegt die Common-Block Variablen mit Werten (Gegensatz dazu: FORTRAN ein

Speicherbereich)

Beispiel:

PRO A

COMMON SHARE,E,F,G ; Deklaration

E=1 & F=2 & G=3 ; a muss einmal aufgerufen werden

END ; E, F, G dann ueberall bekannt

PRO B

COMMON SHARE ; beliebig referierbar

A=E*F ; Variablen E,F,G bekanntEND

PRO C

COMMON SHARE

PRINT,E,F,G

END

Beispiel 13.4: Programmierung und Kompilation: COMMON-Blocke

Hinweis:

Nur im ersten Programm PRO A einen Commonblock definieren, in allen weiteren Pro-

zeduren diesen Commonblock, wie unter PRO B referieren. Bei einer Anderung des

Commonblocks ist dieser nur an einer Stelle zu andern.

Bei einer Anderung des Commonblocks

IDL neu starten oder  Command Line Interface:

.reset session oder .full reset session  Umgebung idlde   Menu Run   Reset

(ohne idlde-Umgebung zu verlassen)

Page 176: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 176/238

156 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.16 Dynamische Erweiterung von Programmen

Das Kompilieren und die Ausfuhrung von Programmen wahrend der Programmausfuhrung

ist wichtig, wenn sich der Programmcode wahrend einer IDL-Sitzung andert!  Mit RESOLVE ROUTINE kann man wie mit .COMPILE kompilieren, jedoch ist die-

ser Aufruf auch innnerhalb einer Prozedur oder Funktion moglich. Dieser Befehl

erzwingt also eine Neu-Kompilation.

Anschließend muß die Prozedur oder Funktion aufgerufen werden.

PRO check

...

RESOLVE_ROUTINE,’test’

...

END

test.pro wird wahrend der Programmausfuhrung kompiliert.

  Mit EXECUTE(string ) kann man wahrend der Programmausfuhrung IDL-

Statements kompilieren und ausfuhren. Man kann z.B. wahrend der Laufzeit neue

Variablen generieren.

r=EXECUTE(’PLOT,[0,1]’)

r=EXECUTE(’vec=FINDGEN(100)’)

Der Return-Value r hat den Wert 1 falls der String z.B. ’PLOT,[0,1]’ richtig

kompiliert wurde.

Hinweis:

EXECUTE und RESOLVE ROUTINE sind bei RUNTIME nicht erlaubt!

  Mit CALL PROCEDURE bzw. CALL FUNCTION konnen Parameter an kompilierte

Routinen ubergeben werden.

result=CALL_PROCEDURE(’PLOT’,para1, para2,...)

Schneller als EXECUTE!

Page 177: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 177/238

13.17. UBUNGEN 157

13.17 Ubungen

Die Losungen zu den Ubungen findet man im Anhang auf Seite 208.

1. Ubung mit KEYWORD SET, ARG PRESENT und N ELEMENTS

 Ubung mit KEYWORDS

Die unten stehende Tabelle kann als Ubung ausgefullt werden!

FUNCTION test1,minimum=min_val

IF KEYWORD_SET(min_val) THEN RETURN,1 ELSE RETURN,0

END

FUNCTION test2,minimum=min_valIF ARG_PRESENT(min_val) THEN RETURN,1 ELSE RETURN,0

END

FUNCTION test3,minimum=min_val

IF N_ELEMENTS(min_val) GT 0 THEN RETURN,1 $

ELSE RETURN,0

END

CALL |test1 |test2 |test3

 _______________________________________________________

PRINT, testX( ) | | |

 _______________________________________________________

PRINT, testX(minimum=0) | | |

 _______________________________________________________

PRINT, testX(minimum=10) | | |

 _______________________________________________________

PRINT, testX(minimum=-10) | | |

 _______________________________________________________

mv=0 & PRINT, testX(minimum=mv) | | | _______________________________________________________

mv=10 & PRINT, testX(minimum=mv)| | |

 _______________________________________________________

PRINT, testX(minimum=mv2) | | |

 _______________________________________________________

Page 178: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 178/238

158 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

 Ubung mit positionalen Parametern

Die unten stehende Tabelle kann als Ubung ausgefullt werden!

FUNCTION test1,min_val

IF KEYWORD_SET(min_val) THEN RETURN,1 ELSE RETURN,0

END

FUNCTION test2,min_val

IF ARG_PRESENT(min_val) THEN RETURN,1 ELSE RETURN,0

END

FUNCTION test3,min_val

IF N_ELEMENTS(min_val) GT 0 THEN RETURN,1 $

ELSE RETURN,0

END

CALL | test1 | test2 |test3

 ___________________________________________________

PRINT, testX( ) | | |

 ____________________________________________________

PRINT, testX(0) | | |

 ____________________________________________________PRINT, testX(10) | | |

 ____________________________________________________

PRINT, testX(-10) | | |

 ____________________________________________________

mv=0 & PRINT, testX(mv) | | |

 ____________________________________________________

mv=10 & PRINT, testX(mv) | | |

 ____________________________________________________

PRINT, testX(mv2) | | |

 ____________________________________________________

2. Schreibe eine IDL-Prozedur, die eine schattierte Oberflache (SHADE SURF) zeich-

net und mit einer Gitterlinie (SURFACE) ubermalt (/ OVER).

Zeichne einen Hohenlinienplot ganz oben ins Bild (Z=1) und wahle einen Farbindex

fur die Gitterlinie und den Hohenlinienplot.

Folgende Definition der Prozedur mysurface soll gelten:

PRO mysurface,data,xgrid,ygrid,CONT=cont,COLOR=col

Page 179: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 179/238

13.17. UBUNGEN 159

3. Schreibe eine Funktion mit zwei Input Variablen. Der Typ der ersten Input Variablen

soll auf die zweite Variable ubertragen werden. Die zweite Variable soll im geander-

tem Typ zuruckgegeben werden.

result=my_type(var1,var2)

4. Schreibe eine Funktion, die ein Zeichen in einem Text ersetzen kann, z.B. das Zei-

chen E.

txt=’DiEs ist ein Test!’

5. Simulation einer SMS-Eingabe:

Schreibe eine Routine die z.B. den Satz ’DIES IST EIN TEST’ in den SMS Zahlen-

code ubersetzt. Ein Wort pro Zeile z.B.: DIES : 31 43 32 74.Das Ergebnis soll in einer Datei gesichert werden, z.B. sms.txt

Verwende hierzu lediglich die Tasten 2 bis 9. Diese entsprechen den Zeichen: A bis

Z. Achte beim Eingeben darauf, keine Worte mit anderen Zeichen zu verwenden.

Diese Eintragungen sollen sortiert und Dupletten entfernt werden.

Sobald ein Wortschatz von ca. 70 Worten besteht, entwickle eine Routine sms t9

die die t9-Logik verwendet. Nach Tastendruck von zwei Ziffern soll ein Wort aus

der vorher gespeicherten Datei das mit A, B usw. beginnt, vorgeschlagen werden.

Durch weitere Tastendrucke soll der Vorschlag verbessert werden. Mit der Taste 0

wird zwischen moglichen Worten ausgewahlt. Mit der Taste # wird der Vorschlag

akzeptiert.

Beispiel: Nach Eingabe von 2  

ENTER¡  6  

ENTER¡ 

wird AM vorgeschlagen

Mit 0   ENTER ¡  wird in den Auswahl Modus geschaltet Weitere 0   ENTER ¡ 

Eingaben werden solange betatigt, bis AN vorgeschlagen wird Die Eingabe wird mit

# beendet.

Kann kein passendes Wort vorgeschlagen werden, soll in den Eingabemodus des

ersten Programms gewechselt werden, um den Wortschatz zu vergroßern.

Page 180: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 180/238

160 KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

Page 181: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 181/238

Kapitel 14

Fehlersuche

Selten ist die Arbeit an einem Programm mit dessen Kompilation abgeschlossen. Meistens

beginnt mit dem Austesten auch die Fehlersuche. Hilfreich dazu ist ein Debugger. Dieser

erlaubt die schrittweise Ausfuhrung von Programmen. Wahrend der Laufzeit kann manden Programmablauf kontrollieren und Anderungen von Variablen anzeigen.

Die Ausfuhrung der Debug-Befehle sind im Kapitel Beschreibung der Applikationen

siehe Seite 10 beschrieben.

Vorgehen bei der Fehlersuche

In der Regel geht man bei der Fehlersuche in der Entwicklungsoberflache idldewie folgt

vor. In der Kommando-Umgebung zu IDL ist das Vorgehen ahnlich.

1. An eine geeignete Stelle, die vor einem moglichen Fehler liegen sollte, setzt man

einen Breakpoint. Ein Breakpoint wird durch Auswahlen einer Zeile mit dem Befehl

Set Breakpoint aus dem Menu RUN gesetzt.

2. Das Programm wird gestartet. Es halt am Breakpoint an. Alle in diesem Script defi-

nierten Variablen vor dem Breakpoint sind jetzt bekannt und werden im Variablen-

Watch-Window angezeigt.

3. Die Variablen werden auf ihre Richtigkeit uberpruft. Evtl. sieht man daran schon,

was falsch ist.

4. Mit dem Kommando Step aus dem RUN Menu ist eine schrittweise Ausfuhrung

weiterer Befehlszeilen moglich. Man sieht an Hand der Variablen, was das Pro-gramm macht. Durch das standige Uberprufen der Variablen und das Wiederholen

dieses Schrittes findet man schließlich den Fehler.

5. Die Anweisungen werden verbessert bzw. erganzt und der Fehlertest wird noch mal

wiederholt.

161

Page 182: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 182/238

162 KAPITEL 14. FEHLERSUCHE

Page 183: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 183/238

Kapitel 15

Programmanalyse

Wenn die Ausfuhrungszeit eines Programmes langsamer ist als man erwartet, kann man

dies mit dem Profiler analysieren. Er erlaubt eine Analyse eines Programmes und aller

aufgerufenen Unterprogramme.

PROFILER

Dieses Programm ermoglicht eine Performance-Analyse der Anwendung mittels Monito-

ring. Die Aufruf-Frequenz eigener und System-Programme kann gelistet werden.

; einschliesslich IDL System Prozeduren

PROFILER, /SYSTEM

; Bibliotheksfunktion DIST.; DIST wird direkt kompiliert

A= DIST(500)

TV, A

; Ergebnisse mit PROFILER, /REPORT

PROFILER, /REPORT

IDL listet:

Module Type Count Only(s) Avg.(s) Time(s)

FINDGEN (S) 1 0.000239 0.000239 0.000239

FLTARR (S) 1 0.010171 0.010171 0.010171

N_ELEMENTS (S) 1 0.000104 0.000104 0.000104

ON_ERROR (S) 1 0.000178 0.000178 0.000178

SQRT (S) 251 0.099001 0.000394 0.099001

TV (S) 1 2.030000 2.030000 2.030000

163

Page 184: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 184/238

164 KAPITEL 15. PROGRAMMANALYSE

Page 185: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 185/238

Kapitel 16

Error Handling

Um zu vermeiden, daß IDL bei unerwarteten Fehlern abbricht, hat man die Moglichkeit,

das Verhalten beim Auftreten von Fehlern zu steuern.

IDL bricht die Ausfuhrung standardmaßig in der Routine ab, die den Fehler erzeugt.

Innerhalb dieser Routine hat man Zugriff auf die lokal bekannten Variablen und keinen

Zugriff auf die Variablen der aufrufenden Routine.

  Bei einem Fehler im Unterprogramm bleibt das Programm stehen und kehrt nicht

in das aufrufende Programm zuruck. Damit ist der Zugriff auf die Variablen des

Unterprogramms beschrankt.

Der Befehl RETALL bewirkt, daß zur Aufruf-Ebene zuruck verzweigt wird (oberste

Ebene).

Der Befehl RETURN [, wert] bewirkt daß IDL einen Wert an das anrufendeProgramm zuruckgibt (eine Ebene).

  Reset bei idlde: STOP im Run-Menu

Als Befehl: .RESET SESSION, bzw. .FULL RESET SESSION

  Bei unerklarlichen Fehlern:

IDL mit exit verlassen und neu starten

In der System-Variablen !ERROR STATE sind Informationen zum Fehler gespeichert.

165

Page 186: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 186/238

166 KAPITEL 16. ERROR HANDLING

16.1 Abfrage des Fehlerzustandes

Wenn ein Fehler auftritt kann man uber die Systemvariable !ERROR STATE Informatio-

nen zu dem Fehler erhalten.

HELP,!ERROR_STATE

<Expression> STRUCT = -> !ERROR_STATE Array[1]

Struktur,Systemvariable mit

verschiedenen Informationen

HELP,!ERROR_STATE,/STRUCT

** Structure !ERROR_STATE, 7 tags, length=52:

NAME STRING ’IDL_M_SUCCESS’

BLOCK STRING ’IDL_MBLK_CORE’

CODE LONG 0SYS_CODE LONG Array[2]

MSG STRING ’’

SYS_MSG STRING ’’

MSG_PREFIX STRING ’% ’

Die System-Variablen !ERR, !ERROR, !ERR STRING sollten durch die neuen System-

Variablen !ERROR STATE.CODE, !ERROR STATE.NAME, !ERROR STATE.MSG

ersetzt werden. Der Informationsgehalt dieser Variablen ist großer.

Genaue Information siehe Reference Guide

Page 187: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 187/238

16.2. UMLEITEN VON FEHLERN 167

16.2 Umleiten von Fehlern

Man kann verhindern, daß ein Fehler zum Abbruch des Programms fuhrt. Dies erreicht

man mit den Routinen ON ERROR, ON IOERROR oder CATCH

 

ON IOERROR,label

Mit ON IOERROR kann ein IO-Error abgefangen werden. Das Prgramm verzweigt

zu dem angegebenen label. Dieser Befehl hat eine hohere Prioritat als CATCH.

 

ON ERROR,1

bei Fehler Rucksprung zum IDL-Main-Level (veraltet, besser CATCH)

 

CATCH,error status

– genereller Mechanismus zur Fehlerbehandlung

– Keine Behandlung mathematischer Fehler!

– CATCH Prozedur als Batch File einfugen (kein end!)

– Der Error-Status wird mit 0 initialisiert

– wenn ein Fehler auftritt, wird im Calling-Stack nach CATCH gesucht. Ist

CATCH vorhanden ist, wird das auf CATCH folgende Statement ausgefuhrt.

Falls kein CATCH vorhanden wird nach ON ERROR gesucht.

– mit CATCH,/CANCELwird der aktuelle CATCH-Mechanismus aufgehoben.

Damit ist es moglich, weitere Fehler mit diesem CATCH-Mechanismus zu be-

arbeiten.

Page 188: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 188/238

168 KAPITEL 16. ERROR HANDLING

16.3 Beispiel zu CATCH

PRO err_test

err_test1

err_test2

END

PRO err_test1

@catch_proc

PRINT,var1

END

PRO err_test2

@catch_proc

PRINT,var2

END

Listing von catch procerrornum = 0

CATCH, errornum

IF errornum NE 0 THEN BEGIN

CATCH,/CANCEL

HELP,/LAST_MESSAGE,OUTPUT=traceback

errarray = [’Error caught: ’, traceback]

a = DIALOG_MESSAGE(errarray,/ERROR)

RETURN

ENDIF

Beispiel 16.1: Error Handling: CATCH

Die Prozedur err test wird aufgerufen. Diese ruft err test1. In err test1 wird

catch proc als Folge von IDL-Statements eingezogen. In err test1 wird eine

unbekannte Variable gedruckt. Dieser Fehler wird mit CATCH,erronum abgefragt.

Wenn diese Error-Number ungleich Null ist, wird der Fehler in dem Widget, daß mit

DIALOG MESSAGE erstellt wurde, mit Traceback dokumentiert. Das Programm wartet,

bis der OK-Knopf in dem Widget quittiert wird. Voraussetzung dafur, daß ein weiterer

Fehler in der gleichen Art und Weise behandelt werden kann, ist das der CATCH-

Mechanismus mit dem Befehl CATCH,/CANCEL zuruckgesetzt wird. In err test2

passiert ein weiterer Fehler. Das Programm fangt diesen Fehler auch ab.

Abbildung 16.1: Error Handling: CATCH

Beispiel: err test.pro, err test1.pro, err test2.pro, catch proc

Page 189: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 189/238

16.4. AUSGABE VON FEHLERNACHRICHTEN 169

16.4 Ausgabe von Fehlernachrichten

Mit MESSAGE wird eine Meldung ausgegeben, z.B. MESSAGE,’error occured’.

Es gibt die Optionen /CONTINUE oder /INFORMATIONAL.

Mit CONTINUE wird der Fehler kommentiert und das Programm lauft weiter.

INFORMATIONAL ist mit !QUIET=1 abschaltbar (man sieht dann die Message nicht).

Ohne eines der beiden Keywords halt die Routine an dieser Stelle.

Page 190: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 190/238

170 KAPITEL 16. ERROR HANDLING

Page 191: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 191/238

Kapitel 17

Widgets

Ein Widget stellt eine graphische Bedienoberflache dar. Es dient damit der Kommunikation

zwischen einem Benutzer und einem Programm. Durch verschiedene Komponenten, wie

Schalter und Anzeigen kann der Benutzer mit dem darunter liegenden Programm kommu-nizieren und den Ablauf beeinflussen.

Im folgenden wird die Erstellung einer graphischen Bedienoberflache beschrieben.

17.1 GUI Builder

In der Windows Version von IDL gibt es seit Version 5.2 einen Widget Editor. Mit diesem

Widget Editor lassen sich sehr einfach positional angeordnete Widgets erstellen. Diese

formal erstellte Bedienoberflache kann, ohne daß man diese andern muß, auf andere

Plattformen portiert werden.

Der Widget Editor ist nur in der Microsoft Windows Version verfugbar und wird in diesem

Dokument nicht behandelt.

171

Page 192: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 192/238

172 KAPITEL 17. WIDGETS

17.2 Typen von Widgets

Eine Oberflache wird durch Aufrufe einzelner Widget Funktionen gestaltet. Eine Ubersicht

uber die verfugbaren Widget Funktionen gibt folgende Aufstellung.

WIDGET BASE Ein Widget, welches in hierarchischer Anordnung andere

Widgets enthalt

Zuordnungsbasis mit positionalen Eigenschaften

WIDGET BUTTON definiert Knopfe, Gruppen von Knopfen

WIDGET TEXT definiert editierbaren Text

WIDGET DRAW definiert Graphikfenster ahnlich Window

WIDGET TABLE definiert eine Tabelle

WIDGET SLIDER definiert einen Schieberegler

WIDGET LABEL definiert ein Beschriftung, kann nicht editiert werden

WIDGET LIST definiert eine Liste von Textzeilen, z.B. Menu

WIDGET DROPLIST definiert einen Knopf, der eine herunter-klappbare Liste von

Optionen enthalt.

17.3 Erstellung von Menu Widgets

Die Widgets werden in einer zentralen Einheit, der Main-Base, angeordnet. In dem Beispiel

wird ein Menubar erstellt, der mit dem Text Menu beschriftet ist. Wenn man auf diesen

Bar klickt, werden die Buttons mit den Beschriftungen ONE, TWO, THREE sichtbar.

base = WIDGET_BASE(MBAR=bar)

menu = WIDGET_BUTTON(bar, VALUE=’MENU’,$

/MENU)

button1 = WIDGET_BUTTON(menu, VALUE=’ONE’)button2 = WIDGET_BUTTON(menu, VALUE=’TWO’)

button3 = WIDGET_BUTTON(menu, VALUE=’THREE’)

Page 193: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 193/238

17.4. GESTALTUNG DES LAYOUTS EINES WIDGETS 173

17.4 Gestaltung des Layouts eines Widgets

Ein Widget kann positional oder durch Angabe einer zeilen- bzw. spaltenweisen Anord-

nung definiert werden.

Im folgenden Beispiel werden die Buttons in einfacher Art und Weise spaltenweiseangeordnet.

base = WIDGET_BASE(COLUMN=1)

but1 = WIDGET_BUTTON(base, VALUE=’Button 1’)

but2 = WIDGET_BUTTON(base, VALUE=’Button 2’)

Im folgenden Beispiel hat die Main-Base eine Zeile. In der Zeile wird eine neue Basecol1

mit einer Spalte und eine zweite Base col2 mit zwei Spalten angelegt.

base = WIDGET_BASE(ROW=1 )

col1 = WIDGET_BASE(base, COLUMN=1)

col2 = WIDGET_BASE(base, COLUMN=2)

Die Main-Base wird haufig auch als Top-Level-Base (TLB) bezeichnet.

Ein komplexeres Beispiel folgt. Es zeigt die hierarchische Anordnung von Zeilen und

Spalten.

Page 194: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 194/238

174 KAPITEL 17. WIDGETS

PRO buttons

base = WIDGET_BASE(ROW = 2)

baseo = WIDGET_BASE(base, ROW = 1, FRAME=6)

baseu = WIDGET_BASE(base, COLUMN = 1, FRAME=6)

base1 = WIDGET_BASE(baseo, COLUMN = 1, FRAME=1)

base2 = WIDGET_BASE(baseo, ROW = 1, FRAME=1)

base3 = WIDGET_BASE(baseu, ROW = 2, FRAME=1)

base4 = WIDGET_BASE(baseu, ROW = 4, FRAME=1)

but1 = WIDGET_BUTTON(base1, VALUE = ’B1 1’, UNAME=’B1 1’)

but2 = WIDGET_BUTTON(base1, VALUE = ’B1 2’, UNAME=’B1 2’)

but3 = WIDGET_BUTTON(base1, VALUE = ’B1 3’, UNAME=’B1 3’)

but4 = WIDGET_BUTTON(base1, VALUE = ’B1 4’, UNAME=’B1 4’)

but1 = WIDGET_BUTTON(base2, VALUE = ’B2 1’, UNAME=’B2 1’)

but2 = WIDGET_BUTTON(base2, VALUE = ’B2 2’, UNAME=’B2 2’)

but3 = WIDGET_BUTTON(base2, VALUE = ’B2 3’, UNAME=’B2 3’)

but4 = WIDGET_BUTTON(base2, VALUE = ’B2 4’, UNAME=’B2 4’)

but1 = WIDGET_BUTTON(base3, VALUE = ’B3 1’, UNAME=’B3 1’)

but2 = WIDGET_BUTTON(base3, VALUE = ’B3 2’, UNAME=’B3 2’)

but3 = WIDGET_BUTTON(base3, VALUE = ’B3 3’, UNAME=’B3 3’)

but4 = WIDGET_BUTTON(base3, VALUE = ’B3 4’, UNAME=’B3 4’)

but5 = WIDGET_BUTTON(base3, VALUE = ’B3 5’, UNAME=’B3 5’)

but6 = WIDGET_BUTTON(base3, VALUE = ’B3 6’, UNAME=’B3 6’)

but1 = WIDGET_BUTTON(base4, VALUE = ’B4 1’, UNAME=’B4 1’)

but2 = WIDGET_BUTTON(base4, VALUE = ’B4 2’, UNAME=’B4 2’)

but3 = WIDGET_BUTTON(base4, VALUE = ’B4 3’, UNAME=’B4 3’)

but4 = WIDGET_BUTTON(base4, VALUE = ’B4 4’, UNAME=’B4 4’)

WIDGET_CONTROL, base, /REALIZE

END

Beispiel 17.1: Widgets: Layout eines Widgets

Mit but1 = WIDGET BUTTON(base1, VALUE = ’B1 1’, UNAME=’B1 1’)

wird ein Button mit der Beschriftung B1 1 erstellt. Der UNAME beinhaltet einen Wert zur

eindeutigen Identifikation des Buttons.

Page 195: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 195/238

17.5. WIE FUNKTIONIERT EINE OBERFL ACHE? 175

17.5 Wie funktioniert eine Oberfl ache?

Der XMANAGER ist ein IDL-Programm, das standig abfragt, welche Knopfe auf der Ober-

flache gedruckt werden. Diese Information wird an den Event-Handler weitergegeben.

Der Event-Handler sorgt fur den Kommunikationsaustausch zwischen Oberflache und

XMANAGER. Der Event-Handler weiß genau, welche Knopfe oder Slider auf der Ober-flache bedient worden sind. Die Ereignisse, die eintreten konnen, mussen in der sogenann-

ten Event-Handler Routine programmiert werden. Eine wichtige Funktion hat dabei die im

nachsten Kapitel beschriebene WIDGET CONTROL und WIDGET INFO Funktion.

17.6 Kontrolle uber die Widgets

Es gibt Funktionen, die der Abfrage der Events dienen oder fur die Steuerung notig sind.

Abfrage von Events

x=WIDGET_INFO( w_id, /UNAME)

gibt den UNAME zuruck.

x=WIDGET_INFO( w_id, FIND_BY_UNAME=’TEST’)

findet die ID, wenn das Widget mit UNAME=’TEST’ definiert wurde.

Abfrage von Werten

WIDGET_CONTROL, w_id, GET_UVALUE=test

Mit GET UVALUE holt man den User Value

WIDGET_CONTROL, w_id, SET_UVALUE=’DONE’

Mit SET UVALUE setzt man den User Value

WIDGET_CONTROL, w_id, GET_VALUE=test

Mit GET VALUE holt man den Wert

WIDGET_CONTROL, w_id, SET_VALUE=50

Mit SET VALUE setzt man einen Wert

Steuerung der Widgets

WIDGET_CONTROL, w_id, /REALIZE

Mit dem Keyword /REALIZE wird das Widget als Oberflache gestartet

WIDGET_CONTROL, w_id, /DESTROY

Mit dem Keyword /DESTROY zerstort man das Widget-Element und alle abhangigen Ele-mente

Page 196: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 196/238

176 KAPITEL 17. WIDGETS

17.7 Registrierung der Widgets mit dem XMANAGER

Der XMANAGER ist ein komplexes Programm, das in der Regel ausreicht, um mittels

einer EVENT-Handler Routine mit der Oberflache zu kommunizieren. Die Funktion

XREGISTERED ermittelt, ob ein Widget Programm durch den XMANAGER verwaltet wird.

XMANAGER, ’Program Name’, base id

IF XREGISTERED(’Program Name’) THEN RETURN

Man benutzt die zweite Form IF XREGISTERED ..., wenn mehr als eine Kopie des

Programms zur gleichen Zeit lauft.

Page 197: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 197/238

17.8. SCHREIBEN EINES KLEINEN WIDGET PROGRAMMS 177

17.8 Schreiben eines kleinen Widget Programms

Zur Erklarung des Event Handlers wird nachfolgend ein kleines Beispiel definiert.

firstwid.pro

PRO firstwid

base = WIDGET_BASE( COLUMN=1 )

but1 = WIDGET_BUTTON( base, VALUE=’HELLO’, $

UNAME=’HELLO’)

but2 = WIDGET_BUTTON( base, VALUE=’GOODBY’, $

UNAME=’GOODBY’)

WIDGET_CONTROL, base, /REALIZE

XMANAGER, ’firstwid’, baseEND

Beispiel 17.2: widgets: kleines widget Programm

In dem Beispiel wird eine Main-Base eingerichtet. Die Widgets, die angelegt werden, sind

Knopfe mit den Beschriftungen HELLO und GOODBY. Die Ausrichtung der Knopfe

ist spaltenweise. Wie in den obigen Beispielen, wird keine Großenangabe gemacht. Man

uberlaßt es IDL, die Buttons anzulegen.

Diese definierte Anordnung der Widgets wird durch den WIDGET CONTROL Befehl

mit dem Keyword /REALIZE realisiert.

17.8.1 Initialisierung der Event-Loop

Das Beispiel zeigt die Definition der Event-Routine.

PRO firstwid

...

XMANAGER, ’firstwid’, base

END

Der XMANAGER-Befehl wird vor dem END eingefugt und startet die Event-Routine

zu dem angegebenen Programm ’firstwid’. Die Event-Routine heißt daher

firstwid event.

Wenn der XMANAGER gestartet ist, wartet er darauf, daß einer der beiden Knopfe ge-

druckt wird. Diese Aktionen werden in der sogenannten Event-Struktur abgespeichert.

Diese Event-Struktur kann in der Event-Handler Routine kontrolliert abgearbeitet werden.

Page 198: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 198/238

178 KAPITEL 17. WIDGETS

17.8.2 Ubergabe der Event Struktur an den Event-Handler

Das Beispiel zeigt, wie der Event-Handler auf einzelne Aktionen reagiert.

PRO firstwid_event, event

cmd=WIDGET_INFO(event.id,/UNAME)

CASE cmd OF

’HELLO’: PRINT, ’Hi, hello there !’

’GOODBY’: BEGIN

PRINT, ’See you later !’

WIDGET_CONTROL,event.top,/DESTROY

END

ELSE:

ENDCASE

END

PRO firstwid...

END

Beispiel 17.3: widgets: Event Handler

Fur die Event-Handler Routine gelten ein paar formale Regeln, die im folgenden beschrie-

ben werden.

Der Name der Prozedur, in der der XMANAGER aufgerufen wird (firstwid), bestimmt

den Namen der Event-Handler Prozedur (firstwid event).

Die Event-Struktur (in dem Beispiel event) hat Informationen, die fur die Abarbeitung

des Events erforderlich sind. Diese Struktur wird an die Event-Handler Routine ubergeben.

Wie eine solche Struktur aufgebaut ist, ist auf Seite 179 beschrieben.In dem Beispiel werden dann mit der Widget Kontrollfunktion WIDGET INFO die

Ereignisse abgefragt und verarbeitet. WIDGET INFO liefert den UNAME des gedruckten

Knopfes. Dadurch ist die eindeutige Identifikation gegeben. Dieser Name steht dann bei

der CASE-Anweisung vor dem Doppelpunkt und kann entsprechend verarbeitet werden.

Wird der Knopf mit der Beschriftung ’HELLO’ gedruckt, wird der String ’Hi, hello there

!’ ausgegeben. Wird dagegen der Knopf mit der Beschriftung ’GOODBY’ gedruckt, wird

der String ’See you later !’ ausgegeben und das Widget wird beendet.

Hinweis:

Der Befehl WIDGET CONTROL,event.top,/DESTROYzeigt, wie man in der Event-

Routine das Programm sauber verlasssen kann, indem man die ID des Top-Level Widgets

und das Keyword DESTROY angibt.

Page 199: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 199/238

17.9. UBERGABE VON INFORMATIONEN ZWISCHEN WIDGETS 179

17.8.3 Aufbau der Event Struktur fur WIDGET BUTTON

Der Aufbau der Event Struktur wird gelistet. Die Event Struktur steht zur Auswertung der

Event Handler Routine zur Verfugung.

HELP,event,/str

** Structure WIDGET_BUTTON, 4 tags, length=16:ID LONG 2

TOP LONG 1

HANDLER LONG 1

SELECT LONG 1

event.top Nummer des Top-Level-Widgets

event.id Nummer des Widgets, das den Event ausgel ost hat

event.handler Nummer des Widgets, das den Event-Handler aufgerufen hat

ID, TOP und HANDLER sind in allen Events enthalten. Die einzelnen Wigetfunktionen

geben zusatzliche Informationen zuruck, s.o Beispiel WIDGET BUTTON gibt SELECTzuruck.

17.9 Ubergabe von Informationen zwischen Widgets

Bei der Event-Handler Routine kann man keine Parameter-Ubergabe benutzen.

Zum Datenaustausch stehen folgende Moglichkeiten zur Verfugung:

1. Common Blocke: 

COMMON ids, w1, w2, w3 

COMMON ids (by reference)

2. Ubergabe von Daten (Strukturen) in dem User Value der Main-Base oder auch

Top-Level-Base (TLB).

3. Man kann IDL Pointer nutzen, um komplexe Datenstrukturen in die TLB als User

Value bekannt zu machen.

Page 200: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 200/238

180 KAPITEL 17. WIDGETS

17.10 Widgetprogrammierung im Wandel von IDL

Die Moglichkeit, Widgets zu schreiben, gibt es in IDL schon lange. Die Art, wie diese

Widgets geschrieben werden, hat sich mit der Entwicklung von IDL gewandelt. Anhand

der nachfolgenden kleinen Beispiele wird diese Entwicklung aufgezeigt.

Beispiel 17.4: Widgets: Dieses Widget wird in Beispiel 1 bis 5 bearbeitet

Der Datenaustausch im Widget Programm, d.h. was der Event-Handler braucht, kann in

folgender Weise geschehen (historisch geordnet)

1. Datenaustausch mit Event-Handler uber COMMON Block 

Selektion uber UVALUE, siehe wid1.pro

2. Datenaustausch mit Event-Handler uber UVALUE

Selektion uber UVALUE, siehe wid2.pro

3. Datenaustausch mit Event-Handler uber die Funktion

WIDGET INFO, damit Zugriff auf die Top-Level-Event-Handler Struktur

Selektion uber UNAME,siehe wid3.pro

4. wie 3, aber Information wird zuvor in Beispiel wid4 in eine Struktur geschrieben,

die mit SET UVALUE in der Main-Base an den Event-Handler ubergeben wird

Die Selektion erfolgt uber UNAME,

siehe wid4.pro

5. wie 4, aber die Struktur wird als Pointer auf die Main-Base ubergeben.

Die Selektion erfolgt uber UNAME,

siehe wid5.pro

Page 201: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 201/238

17.10. WIDGETPROGRAMMIERUNG IM WANDEL VON IDL 181

17.10.1 Beispiel: Widget 1

Dieses Beispiel verwendet einen COMMON Block, in dem die WIDGET ID des Text

Widgets gespeichert wird. In der Definition der Widget Funktionen wurde ein UVALUE

(User Value) verwendet und zwar mit einem Namen. Da im EVENT-Handler immer die

EVENT.ID des Widgets bekannt ist, das den EVENT ausgelost hat, kann man UVALUEmit GET UVALUE auslesen. Darauf aufbauend kann man in einer CASE Abfrage die ein-

zelnen Namen unterscheiden.

Sobald der Schalter ’PRINT’ gedruckt wird, wird die COMMONBlock Variable id text

verwendet, um den Text ’DONE’ in das Text Widget zu schreiben. Mit ’QUIT’ wird das

Widget beendet.

; Merkmale:

; Alles was im Event Handler benoetigt wird,

; wird im COMMON deklariert.

; Selektion ueber "uvalue"

PRO wid1_event,event

COMMON wid_co,id_text

WIDGET_CONTROL,EVENT.ID,GET_UVALUE=uv

CASE uv OF

’PRINT’:WIDGET_CONTROL,id_text, SET_VALUE=’DONE’

’QUIT’:WIDGET_CONTROL,event.top,/DESTROY

ELSE:

ENDCASE

END

PRO wid1

COMMON wid_co,id_text

id_base=WIDGET_BASE(row=3)

id_PRINT=WIDGET_BUTTON(id_base,VALUE=’PRINT’,UVALUE=’PRINT’)

id_quit=WIDGET_BUTTON(id_base,VALUE=’QUIT’, UVALUE=’QUIT’)

id_text=WIDGET_TEXT(id_base,VALUE=’’)

WIDGET_CONTROL,id_base,/REALIZE

XMANAGER,’wid1’,id_base

END

Beispiel 17.5: Widgets: wid1

Page 202: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 202/238

182 KAPITEL 17. WIDGETS

17.10.2 Beispiel: Widget 2

In diesem Beispiel wird die Variable id text mit SET UVALUE auf die Main-Base

geschrieben. Die Main-Base ist im EVENT HANDLER immer EVENT.TOP zugeordnet.

Daher kann man diesen Wert mit GET UVALUE dort auslesen und auf einer Variablen

id text speichern. Die Abfrage der betatigten Schalter ist gleich dem vorherigenBeispiel wid1.pro. Wenn nun der Schalter ’PRINT’ gedruckt wird, wird die Variable

id text verwendet, um den Text ’DONE’ in das Text Widget zu schreiben. Mit ’QUIT’

wird das Widget beendet.

; Merkmale:

; Alles was im event handler benoetigt wird

; ueber uvalue der Main-Base deklariert.

; Selektion ueber "uvalue"

PRO wid2_event,event

WIDGET_CONTROL,event.top,GET_UVALUE=id_text

WIDGET_CONTROL,event.id,GET_UVALUE=uv

CASE uv OF

’PRINT’:WIDGET_CONTROL,id_text,SET_VALUE=’DONE’

’QUIT’:WIDGET_CONTROL,event.top,/DESTROY

ELSE:

ENDCASE

END

PRO wid2id_base=WIDGET_BASE(row=3)

id_PRINT=WIDGET_BUTTON(id_base,VALUE=’PRINT’,UVALUE=’PRINT’)

id_quit=WIDGET_BUTTON(id_base,VALUE=’QUIT’,UVALUE=’QUIT’)

id_text=WIDGET_TEXT(id_base,VALUE=’’)

WIDGET_CONTROL,id_base,/REALIZE,SET_UVALUE=id_text

XMANAGER,’wid2’,id_base

END

Beispiel 17.6: Widgets: wid2

Page 203: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 203/238

17.10. WIDGETPROGRAMMIERUNG IM WANDEL VON IDL 183

17.10.3 Beispiel: Widget 3

Dieses Beispiel zeigt einige der Moglichkeiten durch die Verwendung von UNAME. Ein

Name, der mittels UNAME anstelle von UVALUE in der Definition der Widget Funktionen

verwendet wird, ist entlang der Widget ID Hierarchie zuordbar. Zunachst wird der

den EVENT auslosende Name durch WIDGET INFO erfragt. Dieser kann in der CASEAnweisung verglichen werden. Sobald der Schalter PRINT betatigt wurde, kann die

ID des WIDGET TEXT ausgelesen werden. Der große Unterschied zu den vorherigen

Beispielen ist, daß keine Information redundant zwischengespeichert werden muß.

; Merkmale:

; Selektion findet ueber ’uname’ statt. Alle von

; Main-Base abhaengigen widgets und deren uname ist

; mit WIDGET_INFO zu erreichen, daher kann man alle

; ids ermitteln, weitere Daten werden nicht benoetigt

PRO wid3_event,event

cmd=WIDGET_INFO(event.id,/UNAME)

CASE cmd OF

’QUIT’ : WIDGET_CONTROL,event.top,/DESTROY

’PRINT’: BEGIN

id=WIDGET_INFO(event.top,FIND_BY_UNAME=’TEXT’)

WIDGET_CONTROL,id,SET_VALUE=’DONE’

END

ELSE:

ENDCASEEND

PRO wid3

id_base=WIDGET_base(ROW=3)

id_PRINT=WIDGET_BUTTON(id_base,VALUE=’PRINT’,UNAME=’PRINT’)

id_quit=WIDGET_BUTTON(id_base,VALUE=’QUIT’, UNAME=’QUIT’)

id_text=WIDGET_text(id_base,VALUE=’’,UNAME=’TEXT’)

WIDGET_control,id_base,/REALIZE

XMANAGER,’wid3’,id_baseEND

Beispiel 17.7: Widgets: wid3

Page 204: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 204/238

184 KAPITEL 17. WIDGETS

17.10.4 Beispiel: Widget 4

In diesem Beispiel wird neben der Verwendung von UNAME gezeigt, wie man Daten

z.B. eine Struktur x, von der Definitions Prozedur in den Widget Handler bekommt

und dort bearbeiten kann. Damit man an die Variable im Event Handler kommt, wird

sie als UVALUE auf die Main-Base geschrieben. Daher kann sie im Event Handler mitGET UVALUE von EVENT.TOP gelesen werden. Sobald der Schalter betatigt wird, wird

zunachst der alte Text ’Hallo Du’ ausgegeben und dann der Text ’neuer Text’

der Struktur Variablen zugewiesen. Ausgegeben wird er erst nach dem nachsten Betatigen

des Schalters. Damit der Event Handler dann die Anderung noch kennt, muß die Struktur

wieder als UVALUE auf EVENT.TOP gespeichert werden.

; Merkmale:

; Selektion findet ueber ’uname’ statt. Alle von

; Main-Base abhaengigen widgets und deren uname ist mit

; WIDGET_INFO zu erreichen, daher kann man alle ids; ermitteln. Daten die schon waehrend des Ablaufs von

; wid4 vorliegen sollen in den Event-Handler uebergeben

; werden. Dies geschieht mit einer Struktur die auf die

; Main-Base mit uvalue gesetzt wird und dann mit

; WIDGET_CONTROL ausgelesen werden kann. Bei einem

; neu setzen der Werte muss die Struktur aber wieder

; auf event.top geschrieben werden.

PRO wid4_event,event

WIDGET_CONTROL,event.top,GET_UVALUE=x

cmd=WIDGET_INFO(event.id,/UNAME)CASE cmd OF

’QUIT’ : WIDGET_CONTROL,event.top,/DESTROY

’PRINT’: BEGIN

id=WIDGET_INFO(event.top,FIND_BY_UNAME=’TEXT’)

WIDGET_CONTROL,id,set_VALUE=x.value

x.value=’neuer Text’

WIDGET_CONTROL,event.top,SET_UVALUE=x

END

ELSE:

ENDCASE

END

PRO wid4

x={value:’Hallo Du’}

id_base=WIDGET_base(row=3)

id_PRINT=WIDGET_BUTTON(id_base,VALUE=’PRINT’,UNAME=’PRINT’)

id_quit=WIDGET_BUTTON(id_base,VALUE=’QUIT’,UNAME=’QUIT’)

id_text=WIDGET_TEXT(id_base,VALUE=’’,UNAME=’TEXT’)

WIDGET_CONTROL,id_base,/REALIZE,SET_UVALUE=x

XMANAGER,’wid4’,id_base

END

Beispiel 17.8: Widgets: wid4

Page 205: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 205/238

17.10. WIDGETPROGRAMMIERUNG IM WANDEL VON IDL 185

17.10.5 Beispiel: Widget 5

Dieses Beispiel ist identisch zu dem vorherigen mit dem Unterschied, daß das UVALUE,

welches auf die Main-Base geschrieben wird, zuvor in einen POINTER konvertiert wurde.

Dadurch muß man nicht nach Anderung des Wertes die Struktur wiederum als UVALUE

sichern.

; Merkmale:

; Selektion findet ueber ’uname’ statt. Alle von

; Main-Base abhaengigen Widgets und deren uname ist

; mit WIDGET_INFO zu erreichen, daher kann man alle

; ids ermitteln. Daten die schon waehrend des Ablaufs

; von wid5 vorliegen sollen in den Event-Handler

; uebergeben werden. Dies geschieht mit einer

; Struktur die als Pointer auf die Main-Base in uvalue

; gesetzt wird und dann mit WIDGET_CONTROL ausgelesen

; werden kann. Der Wert kann einfach geaendert werden.

PRO wid5_event,event

WIDGET_CONTROL,event.top,GET_UVALUE=x

cmd=WIDGET_INFO(event.id,/UNAME)

CASE cmd OF

’QUIT’ : WIDGET_CONTROL,event.top,/DESTROY

’PRINT’: BEGIN

id=WIDGET_INFO(event.top,FIND_BY_UNAME=’TEXT’)

WIDGET_CONTROL,id,set_VALUE=(*x).value

(*x).value=’neuer Text’

END

ELSE:

ENDCASE

END

PRO wid5

x={value:’Hallo Du’}

x=PTR_NEW(x,/NO_COPY)

id_base=WIDGET_base(ROW=3)

id_PRINT=WIDGET_BUTTON(id_base,VALUE=’PRINT’,UNAME=’PRINT’)

id_quit=WIDGET_BUTTON(id_base,VALUE=’QUIT’,UNAME=’QUIT’)

id_text=WIDGET_TEXT(id_base,VALUE=’’,UNAME=’TEXT’)

WIDGET_CONTROL,id_base,/realize,SET_UVALUE=x

XMANAGER,’wid5’,id_base

PTR_FREE,x

END

Beispiel 17.9: Widgets: wid5

Page 206: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 206/238

186 KAPITEL 17. WIDGETS

17.11 Widget Programme fur Runtime-L aufe

start IDL

.COMPILE runtime

RESOLVE_ALL,’runtime’

SAVE,/ROUTINES,FILENME=’runtime.sav’

Der XMANAGERmuß vor dem SAVE einmal aufgerufen worden sein.

Page 207: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 207/238

17.12. COMPOUND WIDGETS 187

17.12 Compound Widgets

Compound Widgets sind Kombinationen von Basis-Widget-Funktionen.

Der Name eines Compound Widgets beginnt mit CW .

An dem nachfolgendem Widget wird die Funktionsweise erklart.

Abbildung 17.1: Widgets: Compound Widgets, cw switch

Das Compound Widget ist in diesem Beispiel eine Kombination von WIDGET BUTTON,

WIDGET LABEL und WIDGET DRAW. Es stellt einen neuen Schalter-Typ mit einer An-

zeige des Schaltzustandes dar. Der Aufruf des Compound Widgets cw switch.pro ist

Anhand dem nachfolgendem Beispiel test cw zu sehen.

PRO test_cw_event,ev

cmd=WIDGET_INFO(ev.id,/UNAME)

CASE cmd OF

’DONE’: WIDGET_CONTROL,ev.top,/dest

’TEST_CW_EX’: BEGIN

WIDGET_CONTROL,ev.id,GET_UVALUE=v

CASE v.label[v.label_index] OF

’AN’: PRINT,’Schalter an’

’AUS’: PRINT,’Schalter aus’

ELSE:

ENDCASE

END

ELSE:

ENDCASE

END

PRO test_cw

base_0=WIDGET_BASE(row=2,TITLE=’TEST_CW_SWITCH’,XSIZE=250)

VALUE={button:’Schalter’,label:[’AN’,’AUS’],label_index:1,$

image:[’green.png’,’red.png’]}

id_ex=cw_switch(base_0,VALUE=VALUE,UNAME=’TEST_CW_EX’,$

COLUMN=2,FRAME=1)

id_button=WIDGET_BUTTON(base_0,VALUE=’done’,UNAME=’DONE’)

WIDGET_CONTROL,/realize,base_0

WIDGET_CONTROL,id_ex,set_VALUE=VALUE

XMANAGER,’test_cw’,base_0

END

Beispiel 17.10: Widgets: Compound Widgets, test cwDas nachfolgende Beispiel zeigt die Definition des Compound Widgets.

Page 208: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 208/238

188 KAPITEL 17. WIDGETS

FUNCTION cw_switch_event,ev

child=ev.handler

id_base_0 = WIDGET_INFO(child, /CHILD)

WIDGET_CONTROL, id_base_0, GET_UVALUE=VALUE

IF ev.id EQ $

WIDGET_INFO(ev.top,FIND_BY=’BUTTON’) THEN BEGINvalue.label_index=value.label_index+2

IF value.label_index/2.0 EQ value.label_index/2 THEN $

value.label_index=1 ELSE value.label_index=0

WIDGET_CONTROL,WIDGET_INFO(ev.top, FIND_BY=’LABEL’), $

SET_VALUE=value.label[value.label_index]

WIDGET_CONTROL,WIDGET_INFO(id_base_0, FIND_BY=’DRAW’),$

GET_VALUE=win

x=READ_PNG(value.image[value.label_index],r,g,b)

WSET,win & TVLCT,r,g,b & TV,x

WIDGET_CONTROL, id_base_0, SET_UVALUE=value

ENDIFRETURN, { ID:id_base_0, TOP:ev.top, HANDLER:0L}

END

FUNCTION cw_switch_get_value, id

id_base_0 = WIDGET_INFO(id, /CHILD)

WIDGET_CONTROL, id_base_0, GET_UVALUE=value

RETURN,value

END

PRO cw_switch_set_value, id,value

id_base_0 = WIDGET_INFO(id, /CHILD)

WIDGET_CONTROL,WIDGET_INFO(id_base_0,FIND_BY=’LABEL’),$

SET_VALUE=value.label[value.label_index]WIDGET_CONTROL,WIDGET_INFO(id_base_0,FIND_BY=’BUTTON’),$

SET_VALUE=value.button

WIDGET_CONTROL,WIDGET_INFO(id_base_0,FIND_BY=’DRAW’),$

GET_VALUE=win

x=READ_PNG(value.image[value.label_index],r,g,b)

WSET,win & TVLCT,r,g,b & TV,x

WIDGET_CONTROL, id_base_0, SET_UVALUE=value

END

FUNCTION cw_switch,parent_base,value=value,uvalue=uvalue,$

 _extra=extra

child_base=WIDGET_BASE(parent_base,group_leader=parent_base,$EVENT_FUNC = ’cw_switch_event’,$

FUNC_GET_VALUE = ’cw_switch_get_value’,$

PRO_SET_VALUE = ’cw_switch_set_value’ )

id_base_0=WIDGET_BASE(child_base,_EXTRA=extra)

id_button=WIDGET_BUTTON(id_base_0,$

VALUE=value.button,/NO_RELEASE,UNAME=’BUTTON’)

id_label=WIDGET_LABEL(id_base_0,$

VALUE=value.label[value.label_index],/ALIGN_CENTER,$

/DYNAMIC_RESIZE,UNAME=’LABEL’)

id_draw=WIDGET_DRAW(id_base_0,XSIZE=22,YSIZE=22,UNAME=’DRAW’)

WIDGET_CONTROL,id_base_0,SET_UVALUE=valueRETURN,child_base

END

Beispiel 17.11: Widgets: Compound Widgets, cw switch

Page 209: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 209/238

17.12. COMPOUND WIDGETS 189

Ein Compound Widget benotigt im Gegensatz zu einem normalen Widget drei Mechanis-

men

1. einen Event Handler fur sich selbst

2. eine Funktion zum Auslesen des Values innerhalb des Compound Widget

3. eine Prozedur zum Setzen des Values innerhalb des Compound WidgetDamit das Compound Widget auch selber Kenntnis von diesen zusatzlichen Routinen hat,

muß es dem Compound Widget in der Definition bekannt gegeben werden. Dies erfolgt in

der Definition der Compound Widget Base (child base).

child_base=WIDGET_BASE(parent_base,$

GROUP_LEADER=parent_base, $

EVENT_FUNC = ’cw_switch_event’, $

FUNC_GET_VALUE = ’cw_switch_get_value’, $

PRO_SET_VALUE = ’cw_switch_set_value’ )

Durch die Verwendung der Keywords: EVENT FUNC, FUNC GET VALUE undPRO SET VALUE werden Zugriffe auf die Widget Elemente des Compound Widget in

bestimmte Funktionen umgeleitet.

Der Event Handler ’cw switch event’ wird fur die Abarbeitung der events

die innerhalb des compound Widget entstehen verwendet. Wenn das VALUE auf 

das compound Widget mit SET VALUE gesetzt wird, erfolgt dies mit der Routine

’cw switch set value’ die durch PRO SET VALUE definiert ist. Sobald man

das VALUE von dem Widget liest (GET VALUE) wird ’cw switch get value’

verwendet, das durch FUNC GET VALUE definiert ist.

Hinweis:

In der IDL-Bibliothek gibt es eine Vorlage (cw tmpl.pro), die zur Erstellung von Com-

pound Widgets verwendet werden kann.

Page 210: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 210/238

190 KAPITEL 17. WIDGETS

Page 211: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 211/238

Kapitel 18

Verknupfung mit anderer Software

Im Kapitel Einbettung ins Betriebssystem auf Seite 60 wurde bereits auf den Aufruf von

externen Programmen hingewiesen. Der nachfolgende Abschnitt behandelt noch weitere

Moglichkeiten.

18.1 SPAWN Kommando

  Erzeugung eines Child Processes

– SPAWN, ’ls’, result (Blocking)

PRINT, result

– SPAWN, ’c_program’, unit=lun ; (nicht bei der PC Version)

WRITEU, lun, var1, var2

READU, lun, var3, var4

– Das Programm kann auf einem anderen Host laufen:

SPAWN, ’ssh benutzer@machine ls’, result

 

CALL EXTERNAL()

siehe Advanced Development Guide

 

Link Image

– siehe Advanced Development Guide– Literaturhinweis, siehe 199.

191

Page 212: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 212/238

192 KAPITEL 18. VERKN UPFUNG MIT ANDERER SOFTWARE

18.2 SPAWN Kommando bei einem C Programm

  Das C Programm muß fur die Kommunikation mit dem SPAWN Kommando

vorbereitet werden

– #include <stdio.h>

#include <stdio.h>

setbuf( stdout, NULL );

fread( &value1, sizeof(short), 1, stdin );

fread( feld, sizeof(float), len, stdin );

fwrite( result, sizeof(float), len, stdout );

  Bitte Vorsicht :

– unter Alpha und anderen Workstations mit demselben Programm  benutze nur SHORT INTEGER

– unter Sun und DEC Workstations  konvertiere Floatingpoint Zahlen mit dem BYTEORDERKommando

Page 213: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 213/238

18.3. AUFRUF VON FORTRAN AUS IDL: CALL EXTERNAL 193

18.3 Aufruf von Fortran aus IDL: CALL EXTERNAL

  abhangig vom Betriebssytem  Laden und Aufruf von Routinen in shared libraries 

schneller als SPAWN (overhead weil neue Shell)  Sharable library wird nur bei der ersten Referenzierung geladen

Nur Ubergabe der Adresse, kein Bewegen von Daten!

Syntax:

result=CALL_EXTERNAL(’./image’,’entry’,p1,...)

 result long integer (default) oder andere Typen

image Name der ’shared object library’,

volle Pfadangabe notwendig!entry entry point zu image (Name des Programms)

plattformspezifisch: fuhrende, abschließende Underscores

 p1 1. Parameter

Default: passed by reference

Prototyp der mit CALL EXTERNAL aufgerufenen Routine

SUBROUTINE ENTRY(argc,argv) ! C artgiger Aufruf

INTEGER argc,argv(*)

j=LOC(argc) ! number of arguments, Annahme j=3! Adresse der Argumente aus argv

CALL ENTRY1(%VAL(argv(1)),%VAL(argv(2)),%VAL(argv(3)))

...

! konvertiere IDL Parameter to standard Fortran

! by reference

! ENTRY1 hat keinen IDL spezifischen Code

SUBROUTINE ENTRY1(array,n,sum) ! ....

Eine Anwendung ware, daß das IDL Programm simultan die Ergebnisse eines Fortran Pro-

gramms zeigt, z.B. mit Zufallszahlen erzeugte Punkte.

Page 214: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 214/238

194 KAPITEL 18. VERKN UPFUNG MIT ANDERER SOFTWARE

Page 215: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 215/238

Anhang A

Informationen

A.1 Informationen zu IDL

Der Dokumentationssatz zu IDL umfaßt folgende Bucher:

  ’Getting started with IDL’

Ubersicht uber alle Anwendungsbereiche

fruher: ’IDL Basics:’ kurzes Tutorial

  ’Using IDL’

einschließlich Mathematics

 

’Building IDL Applications’IDL Sprache, Pointer, Widgets, GUI Builder

  ’IDL Reference Guide’ (3 Volumes)

IDL Reference Guide A-M

IDL Reference Guide N-Z

IDL Reference Guide (Objects & Appendices)

  ’IDL HandiGuide:’

Alphabetische Auflistung aller IDL-Funktionen

  IDL External Development Guide

callable IDL, Linkimage, Call External

  What’s new in IDL 5.1 ( 5.2 / 5.3 / 5.4 / 5.5)

195

Page 216: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 216/238

196 ANHANG A. INFORMATIONEN

Demoprogramm Ohne Lizenz lauffahig ist das Script idldemo.

Falls das Kommando-Interface zu IDL bzw. die Oberflache idlde gestartet ist,

Aufruf mit demo

IDL Library Im Verzeichnis /usr/local/idl/idl/lib

Beispiele /usr/local/idl/idl/examples

Verzeichnis doc (Demo!)

Verzeichnis demo/demosrc und misc

idlhelp Unix-Script ohne IDL zu starten

Newsgruppe comp.lang.idl-pvwave

Page 217: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 217/238

A.2. PUBLIKATIONEN UND AKTIVIT ATEN ZU IDL IM FZJ 197

A.2 Publikationen und Aktivit aten zu IDL im FZJ

TKI 341 IDL: Informationen, Lizenzen und Installation

Interner Bericht FZJ-ZEL-IB-500300

Gormet

Goniometer Measurement for Rutherford Backscattering

Spectronomy and ion Channeling Experiments on Wafers up to

150 mm Durchmesser

Autoren:

H. Heer, M. Wagener (ZEL)

Dr. B. Hollander (ISI/IT)

Jul-Bericht Beschreibung der IDL-Software zur Datenverarbeitung im ICG

Autor: Reimar Bauer, ICG I

Jul 3786

ISSN: 0944-2952

ICG Library http://www.fz-juelich.de/icg/icg-i/idl icglib/idl lib intro.html

Im ICG entwickelte Routinen

FZJ Infos Beispiele zu den IDL-Kursen unter /usr/local/idl/FZJ

IDL Newsgruppe FZJ interne Newsgruppe: kfa.forum.idl

WWW- Server ZAM-Graphics-Home Pagehttp://www.fz-juelich.de/vislab/software

Auf dieser Page liegen Informationen zu IDL, un-

ter anderem eine Beispielsammlung zu IDL. Die

Beispielsammlung findet man auch unter der URL

http://www.fz-juelich.de/vislab/idl-beispiele

zamsoft Software-Distributions-Server des ZAM :

Binaries fur AIX, IRIX, Solaris,

OSF4, HPUX, Linux

Page 218: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 218/238

198 ANHANG A. INFORMATIONEN

A.3 Wichtige URL’s zu IDL

Wichtige Informationenen zu IDL findet man unter folgenden URL’s.

http://www.rsinc.com

http://www.creaso.com

http://www.dfanning.com

http://www.fz-juelich.de/vislab/software

Page 219: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 219/238

A.4. LITERATUR 199

A.4 Literatur

IDL Programming Techniques, 2nd Ed.

Author: David W. Fanning, Ph.D.

Summary: Wisecracking author with misinformed notion of Native Ame-

rican religious iconography provides eclectic view of the es-

sentials of IDL. Strong on the use of color in plots.

ISBN/ISSN: 096623832X

Practical IDL Programming

Author: Liam E. Gumley

Summary: (From the amazon.com book description) In Practical IDL Pro-

gramming, Liam E. Gumley provides a solid foundation in the

fundamentals of procedural programming in IDL. He presents

concise information on how to develop IDL programmers that

are well structured, reliable, and efficient. The example pro-grams in the book demonstrate key concepts and provide func-

tionality that can be applied immediately. In addition, the book 

offers readers practical tips and advice on IDL programming,

which they would otherwise discover only after years of expe-

rience.

ISBN/ISSN: 1558607005

Application Development with IDL

Author: Ronn L. Kling

Summary: (From the amazon.com book description) This book is writtenfor scientists, engineers and programmers who want to com-

bine their analytical techniques with widget interfaces. In the

past we were restricted to writing procedural programs that

read namelists, files, or had data entered in from a prompt. This

book shows how to integrate widget interfaces with analysis

code resulting in an application that will increase your produc-

tivity and quality of your results. By using a widget interface,

input values can be changed and results displayed in real time

without having to endlessly execute the same procedures over

and over again.ISBN/ISSN: 0967127009

Page 220: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 220/238

200 ANHANG A. INFORMATIONEN

Calling C from IDL - Using DLM’s to extend your IDL code

Author: Ronn Kling

Summary: (from www.kilvarock.com)

This 74 page book is written for anyone that wants to be able to

call C programs from IDL. Using very simple examples written

in C the reader will be able to create and pass scalars, arrays,

strings and structures back and forth from IDL to C. The code

is written for IDL version 5.3 and later but can be made to

run on earlier versions with only minor modifications. Nearly

1000 lines of source code are provided on the accompanying

disk with a makefile for all UNIX platforms, com file for VMS,

Visual C++ 6.0 project for windows, and a Code Warrior 5

project for the Macintosh. This code can either be received on

a 3-1/2 inch floppy or CD

ISBN: 0967127025

Page 221: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 221/238

Anhang B

L osungen

B.1 L osungen zu Kapitel: Datenstrukturen

Die zugehorigen Ubungen findet man auf Seite 47.

1. f=CREATE_STRUCT(’black’ ,0, $

’white’ ,1, $

’red’ ,2, $

’green’ ,3, $

’blue’ ,4, $

’cyan’ ,5, $

’magenta’ ,6, $

’yellow’ ,7, $

’orange’ ,8)

DEFSYSV,’!F’,F

2. vector1=MAKE_ARRAY(/FLOAT,10)

READS,data[0:9],vector1

vector2=MAKE_ARRAY(/INT,10)

READS,data[10:19],vector2

vector1=FLOAT(data[0:9])vector2=FIX(data[10:*])

3. x=[a,b]

PRINT,x

x=[a[0:4],b,a[5:*]]

PRINT,x

4. x=MAKE_ARRAY(2011,/INDEX,/INT)

x=x[1990:2010]

201

Page 222: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 222/238

202 ANHANG B. LOSUNGEN

5. x=CREATE_STRUCT(’D’,!D,’P’,!P,’X’,!X,’Y’,!Y)

6. v=PTRARR(3,/ALLOC)

*v[0]=a

*v[1]=b

*v[2]=c

7. a=MAKE_ARRAY(20,2)

b=MAKE_ARRAY(/INDEX,20,2)

HELP,[a,b]

HELP,[[a],[b]]

8. a=MAKE_ARRAY(10,10,3)

HELP,REFORM(a,300)

b=MAKE_ARRAY(1,10)

HELP,REFORM(b)

9. a=MAKE_ARRAY(/INDEX,10,2)HELP,TRANSPOSE(a)

Page 223: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 223/238

B.2. LOSUNGEN ZU KAPITEL: ARBEITEN MIT DATENSTRUKTUREN 203

B.2 L osungen zu Kapitel: Arbeiten mit Datenstrukturen

Die zugehorigen Ubungen findet man auf Seite 57.

1. vek = INDGEN(11) + 2000

2. a = [ 7 , 8 , 1 , 2 , 5 , 5 ]

b = [ 0 , 5 , 3 , 4 ]

PRINT, a[b]

7 5 2 5

3. str1=’Idl ist’;

str2=’ eine starke Sprache’str = str1 + str2

print,str

Idl ist eine starke Sprache

4. upper=INDGEN(1,26,/BYTE)+65b

lower=upper+32b

result=STRING([upper,lower])

HELP,result

PRINT,result

upper=[’A’,’B’,’C’]

lower=[’a’,’b’,’c’]

result=upper+lower

HELP,result

PRINT,result

5. a=[-1,-1,-1,-999,-999,-1,-1,-999,-1]

idx=WHERE(a EQ -999)

a[idx]=999

b=[-999,-999,-999,-999,-1]

idx=WHERE(b EQ -999)

b[idx]=999

Page 224: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 224/238

204 ANHANG B. LOSUNGEN

6. a=[1,1,1,2,1,2]

idx=SORT(a)

PRINT,idx

PRINT,a[idx]

PRINT,a[UNIQ(a,SORT(a))]

7. s=REPLICATE(CREATE_STRUCT(NAME=’my_s’,’x’,0.0,$

’y’,0.0),10)

READS,TRANSPOSE(data),s

idx=WHERE(s.y LT 5)

result=s[idx]

PRINT,result.x,result.y

Page 225: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 225/238

B.3. LOSUNGEN ZU KAPITEL: DEFINITIONEN ZUR DATENAUSGABE 205

B.3 L osungen zu Kapitel: Definitionen zur Datenausgabe

Die zugehorigen Ubungen findet man auf Seite 79.

1. red= [255B, 0B, 0B]

green=[ 0B, 255B, 0B]

blue= [ 0B, 0B, 255B]

TVLCT,red,green,blue

a=MAKE_ARRAY(1,3,/INDEX,/BYTE) ; ????

a=REFORM([a,a,a,a,a],15)

b=MAKE_ARRAY(80,VALUE=1,/BYTE)

TV,a#b

2. LOADCT,6

ERASE

TVLCT,red,green,blue, /GET

HELP,red

red[!D.TABLE_SIZE-1]=255

green[!D.TABLE_SIZE-1]=255

blue[!D.TABLE_SIZE-1]=255

TVLCT,red,green,blue

a=MAKE_ARRAY(!D.TABLE_SIZE,/INDEX,/BYTE)

b=MAKE_ARRAY(80,VALUE=1,/BYTE)

TV,a#b

3. old_dev=!D.NAMESET_PLOT,’PS’

DEVICE,/ISOLATIN1,FILE=’my_plot.ps’

XYOUTS,0.2,0.5,’Heute lernen wir IDL!!’,CHARSIZE=2

DEVICE,/CLOSE

SET_PLOT,old_dev

; UNIX

SPAWN,’lpr -Pdrucker my_plot.ps’

; MICROSOFT

SPAWN,’lpr -Pdrucker -Sserver my_plot.ps’

Page 226: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 226/238

206 ANHANG B. LOSUNGEN

B.4 L osungen zu Kapitel: Programme zur Anwendungs-

Darstellung

Die zugehorigen Ubungen findet man auf Seite 115.

1. ang = 2*!PI*INDGEN(360,/FLOAT)/359.x = COS(ang)

y = SIN(ang)

(a) ohne Achsen

PLOT,x,y,xstyle=4,ystyle=4

(b) Achsen in Schwarz, Daten in Blau

TEK_COLOR

PLOT,x,y,/nodata

OPLOT,x,y,color=4,psym=1

(c) nur die positiven Y-daten in Rot und die negativen in BlauTEK_COLOR

PLOT,x,y,/nodata

OPLOT,x,y,color=2,min_value=0

OPLOT,x,y,color=4,max_value=0

(d) Die Achsen sollen zentrisch angeordnet werden

LOADCT,0

ERASE

TEK_COLOR

AXIS,0,/SAVEAXIS,0,/yaxis,/SAVE

OPLOT,x,y,color=2

(e) Der Kreis soll als Kreis dargestellt werden.  1. Losung

position=[0.1,0.1, 0.5,0.5]

WINDOW,xsize=480,ysize=480

PLOT,x,y,position=position  2.Losung, Papier ist nicht quadratisch.

WINDOW,xsize=500,ysize=710

paper_width =30.

paper_height =21.

plot_width =10.

plot_height =10.

xs=plot_height/paper_height

ys=plot_width/paper_width

position=[0.2,0.2,0.2+xs,0.2+ys]

PLOT,x,y,position=position

WSHOW,0

END

Page 227: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 227/238

B.4. LOSUNGEN ZU KAPITEL: PROGRAMME ZUR

ANWENDUNGS-DARSTELLUNG 207

2. CONTOUR, a, NLEVLES=15,/FILL}

CONTOUR, a, NLEVLES=15,/FOLLOW,/OVER}

VALUES=[6,12.5,18.7,24]

CONTOUR,a,LEVELS=values,/FOLLOW,C_Color=BINDGEN(4)*50+50}

Page 228: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 228/238

208 ANHANG B. LOSUNGEN

B.5 L osungen zu Kapitel: Programmierung und Kompi-

lation

Die zugehorigen Ubungen findet man ab Seite 157 .

1. CALL |test1 |test2 |test3 _______________________________________________________

PRINT, testX( ) | 0 | 0 | 0

 _______________________________________________________

PRINT, testX(minimum=0) | 0 | 0 | 1

 _______________________________________________________

PRINT, testX(minimum=10) | 1 | 0 | 1

 _______________________________________________________

PRINT, testX(minimum=-10) | 1 | 0 | 1

 _______________________________________________________

mv=0 & PRINT, testX(minimum=mv) | 0 | 1 | 0 _______________________________________________________

mv=10 & PRINT, testX(minimum=mv)| 1 | 1 | 1

 _______________________________________________________

PRINT, testX(minimum=mv2) | 0 | 1 | 0

 _______________________________________________________

 Ubung mit positionalen Parametern

CALL | test1 | test2 |test3

 ___________________________________________________

PRINT, testX( ) | 0 | 0 | 0

 ____________________________________________________

PRINT, testX(0) | 0 | 0 | 1

 ____________________________________________________

PRINT, testX(10) | 1 | 0 | 1

 ____________________________________________________

PRINT, testX(-10) | 1 | 0 | 1

 ____________________________________________________mv=0 & PRINT, testX(mv) | 0 | 1 | 0

 ____________________________________________________

mv=10 & PRINT, testX(mv) | 1 | 1 | 1

 ____________________________________________________

PRINT, testX(mv2) | 0 | 1 | 0

 ____________________________________________________

Page 229: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 229/238

B.5. LOSUNGEN ZU KAPITEL: PROGRAMMIERUNG UND KOMPI-

LATION 209

2. PRO mysurface,data,xgrid,ygrid,CONT=contour,COLOR=col

ON_ERROR,1

;return to main level and stop when error detected

!P.CHARSIZE=1.5

IF (N_ELEMENTS(col) EQ 0) THEN col=!D.TABLE_SIZE-1

CASE N_PARAMS() OF

0: MESSAGE,$

’mysurface must be called with one or three parameters’

1: BEGIN

SHADE_SURF,data,/SAVE

SURFACE,data,/NOERASE,COLOR=col

IF KEYWORD_SET(contour) THEN $

CONTOUR,data,/T3D,ZVALUE=1,NLEVELS=10,/NOERA

END

3: BEGINSHADE_SURF,data,xgrid,ygrid,/SAVE

SURFACE,data,xgrid,ygrid,/NOERASE,COLOR=col

IF KEYWORD_SET(contour) THEN $

CONTOUR,data,xgrid,ygrid,/T3D,ZVALUE=1,/NOERA

END

ELSE: PRINT,’wrong number of arguments’

ENDCASE

END

3. FUNCTION my_type,var1,var2

result=MAKE_ARRAY(TYPE=SIZE(var1,/TYPE),N_ELEMENTS(var2))

; Anzahl Elemente und Typ festgelegt

result[*]=var2

IF (SIZE(var2,/DIM))[0] EQ 0 THEN RETURN,result[0] $

ELSE RETURN,result

END

4. FUNCTION repstr,txt,char,new_char

b=BYTE(txt)

ix=WHERE(b EQ (BYTE(char))[0],count)

IF count EQ 1 THEN BEGIN

b[ix]=BYTE(new_char)

ENDIF

RETURN,STRING(b)

END

Page 230: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 230/238

210 ANHANG B. LOSUNGEN

5. PRO sms_t9

file=’sms.txt’

OPENR,lun,file,/GET_LUN

sz=(FSTAT(lun)).SIZE

data=MAKE_ARRAY(/BYTE,sz)

READU,lun,dataFREE_LUN,lun

IF !version.os_family EQ ’Windows’ THEN $

data=STRSPLIT(STRING(data),STRING(10b)+ $

STRING(13b),/EXTRACT) $

ELSE $

data=STRSPLIT(STRING(data),STRING(10b),/EXTRACT)

n=N_ELEMENTS(data)

FOR i=0,n-1 DO BEGIN

x=STRCOMPRESS(STRSPLIT(data[i],’:’,/EXTRACT),/REMOVE_ALL)IF N_ELEMENTS(worte) EQ 0 THEN worte=x[0] $

ELSE worte=[worte,x[0]]

IF N_ELEMENTS(code) EQ 0 THEN code=x[1] $

ELSE code=[code,x[1]]

ENDFOR

small=BYTE(code)

ix=INDGEN(13)*2

small=STRING(small[ix,*])

ix =SORT(LONG(small))

worte=worte[ix]

code=code[ix]small=small[ix]

key=’’

count_ix=0

z=1

PRINT,’Nur immer ein Zeichen 2 bis 9 eingeben.’

PRINT,’Mit 0 zwischen Worten whlen. # beendet die Eingabe’

WHILE key NE ’#’ DO BEGIN

IF key EQ ’0’ THEN key = ’SEARCH’

WHILE key EQ ’SEARCH’ DO BEGIN

PRINT,’Auswahl:’PRINT,result

IF key NE ’0’ THEN READ,key

IF key EQ ’0’ AND z LT count_ix THEN BEGIN

result=worte[ind[ix[z]]]

z=z+1

PRINT,result

IF key EQ ’0’ THEN key = ’SEARCH’

ENDIF

IF z GE count_ix THEN z=0

ENDWHILE

IF key NE ’#’ THEN BEGINREAD,key

Page 231: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 231/238

B.5. LOSUNGEN ZU KAPITEL: PROGRAMMIERUNG UND KOMPI-

LATION 211

IF key NE ’0’ THEN BEGIN

IF key NE ’#’ THEN $

IF N_ELEMENTS(test) EQ 0 THEN test=key $

ELSE test=test+key

IF STRLEN(test) GT 1 THEN BEGIN

ind=WHERE(STRLEN(STRMID(small,0, $STRLEN(test))) EQ STRLEN(test),count_ind)

ix=WHERE(STRPOS(small[ind],test) EQ 0 ,count_ix)

IF count_ix EQ 0 THEN BEGIN

key=’#’

PRINT,’Wort nicht bekannt’

PRINT,’Eingabe Modus:’

PRINT,’Bitte Wort mit den Zeichen A bis Z’+ $

’ in Datei speichern’

wort=’’

READ,wort

sms,wortRETURN

ENDIF ELSE BEGIN

IF count_ix NE 0 THEN result=worte[ind[ix[0]]]

ENDELSE

ENDIF

IF N_ELEMENTS(result) EQ 1 THEN PRINT, result

ENDIF

ENDIF

ENDWHILE

PRINT,’’

PRINT,’Ergebnis: ’,resultEND

PRO sms,input

IF N_ELEMENTS(input) EQ 1 THEN $

phrase = STRTRIM(STRUPCASE(input),2) $

ELSE $

phrase=’DIES IST EIN TEST’

arr=STRSPLIT(phrase,’ ’,/EXTRACT)

nn=N_ELEMENTS(arr)

FOR ii=0,nn-1 DO BEGINtext=arr[ii]

d={a0:’ ’,$

a1:’.’,$

a2:[’A’,’B’,’C’],$

a3:[’D’,’E’,’F’],$

a4:[’G’,’H’,’I’],$

a5:[’J’,’K’,’L’],$

a6:[’M’,’N’,’O’],$

a7:[’P’,’Q’,’R’,’S’],$

a8:[’T’,’U’,’V’],$a9:[’W’,’X’,’Y’,’Z’]}

Page 232: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 232/238

212 ANHANG B. LOSUNGEN

data=BYTE(text)

n=N_ELEMENTS(data)

FOR i=0,n-1 DO BEGIN

x=0count=0

WHILE count EQ 0 AND x LT 10 DO BEGIN

pos=WHERE(d.(x) EQ STRING(data[i]),count)

x=x+1

ENDWHILE

IF N_ELEMENTS(result) EQ 0 THEN $

result=STRTRIM(STRING(x-1),2)+$

STRTRIM(STRING(pos+1),2)+’ ’ $

ELSE $

result=result+STRTRIM(STRING(x-1),2)+ $STRTRIM(STRING(pos+1),2)+’ ’

ENDFOR

IF N_ELEMENTS(sms) EQ 0 THEN sms=text+’ : ’+ $

TEMPORARY(result) $

ELSE $

sms=[sms,text+’ : ’+TEMPORARY(result)]

ENDFOR

file=’sms.txt’

IF FILE_TEST(file) EQ 1 THEN append=1

OPENW,lun,file,/GET_LUN,APPEND=appendPRINTF,lun,TRANSPOSE(sms)

FREE_LUN,lun

OPENR,lun,file,/GET_LUN

sz=(FSTAT(lun)).SIZE

data=MAKE_ARRAY(/BYTE,sz)

READU,lun,data

FREE_LUN,lun

IF !version.os_family EQ ’Windows’ THEN $

data=STRSPLIT(STRING(data),STRING(10b)+ $STRING(13b),/EXTRACT) ELSE $

data=STRSPLIT(STRING(data),STRING(10b),/EXTRACT)

data=data[UNIQ(data,SORT(data))]

OPENW,lun,file,/GET_LUN

PRINTF,lun,TRANSPOSE(data)

FREE_LUN,lun

PRINT,TRANSPOSE(data)

END

Page 233: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 233/238

Index

EXTRA, 154

3D Transformationen, 101

64-bit Long, 24

64-bit unsigned Long, 24

ALLOCATE HEAP, 40

ANNOTATE, 114

APPEND, 127

ARG PRESENT, 152Array, 26

Arrayindizierung, 28

ASSOC, 132

Ausfuhrbare Kommandos

.COMPILE, 13, 186

.CONTINUE, 13

.EDIT, 13

.FULL RESET SESSION, 165

.GO, 13

.RESET SESSION, 165.RNEW, 13

.RUN, 13

.SKIP, 13

.STEP, 13

.TRACE, 13

Auswahl eines Fonts, 66

AXIS, 83, 87, 113

BAR PLOT, 90

Batch Verarbeitung, 140

BEGIN, 149BOX CURSOR, 123

BREAKPOINT, 13

by reference, 144

by value, 144

Byte, 24

BYTSCL, 119

CALL EXTERNAL, 191

CASE, 150

CATCH, 167, 168

CD, 17CLOSE, 128

Command Line Interface, 11

COMMON, 155, 179

COMPILE OPT, 54

compiling, 9

Complex, 24

CONGRID, 118

CONTOUR, 76, 94, 97, 98, 100, 113

CREATE STRUCT, 33

CURSOR, 106, 112CW Base, 189

CW ANIMATE, 111

cw tmpl, 189

DATA, 65

debug, 161

DECIMATE, 114

DEFINT32, 54

DEFSYSV, 22

DELVAR, 52DEMO, 114

DEVICE, 65, 69, 74, 77

DIALOG MESSAGE, 168

DIALOG PICKFILE, 133

Double Complex, 24

Doubleprecision, 24

Drucken, 77

Einstellungen, 3

ELSE, 149

emacs, 8EOF, 133

ERASE, 83, 113, 120

EVENT FUNC, 189

EXECUTE, 156

exit, 11

F77 UNFORMATTED, 127

Fehlerbalken, 91

Fehlersuche, 161

FFT, 121

FILE CHMOD, 134FILE DELETE, 134

213

Page 234: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 234/238

214 INDEX

FILE EXPAND PATH, 134

FILE MKDIR, 134

FILE SEARCH, 133, 134

FILE TEST, 134

FILE WHICH, 134

Floatingpoint, 24FLTARR, 26

FOR, 150

FORMAT, 131

FORWARD FUNCTION, 147

FREE LUN, 128, 132

FSTAT, 133, 134

FUNC GET VALUE, 189

FUNCTION, 146

Funktion, 143

GET LUN, 127, 128

GOTO, 151

Hardware Fonts, 67

Hauptprogramm, 143

HEAP GC, 44

HELP, 25, 33, 41, 61, 166

Hershey Fonts, 67

Hilfe zu IDL, 15

idl, 11idl -rt, 14

IDL STARTUP, 3

idlde, 7

idlhelp

 

F1¡ 

, 15

?, 15

IF, 149

IMAGE CONT, 114

INDGEN, 27, 50

Indizierung von Variablen, 24

INTARR, 26

Integer, 24

JOURNAL, 140

KEYWORD SET, 152

Konversionsroutinen, 25

FIX, 25

FLOAT, 25

STRING, 25

Link Image, 191LOADCT, 68

Long, 24

MAKE ARRAY, 26, 27, 41

MAKE ARRRAY, 32

MAP CONTINENTS, 104

MAP GRID, 104MAP IMAGE, 105

MAP SET, 104–106

MAX, 55

MEDIAN, 121

MESSAGE, 169

MIN, 55

missing values, 96

MODIFYCT, 68

N ELEMENTS, 152N PARAMS, 152

N TAGS, 37

Namenskonvention fur Variablen, 23

NODATA, 83

NOERASE, 83, 85

NORMAL, 65

Nullpointer, 38

ON ERROR, 167

ON IOERROR, 167Online Hilfe, 15

OPENR, 127, 128

OPENU, 127

OPENW, 127

Operatoren

 

, 118

 

, 49

¡ 

, 118

¡ 

, 49

# , 49

## , 49

AND, 49

EQ, 49

GE, 49

GT, 49

LE, 49

LT, 49

NE, 49

NOT, 49

OR, 49

XOR, 49OPLOT, 85, 86, 113

Page 235: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 235/238

INDEX 215

Optimierung der Laufzeit eines IDL-

Programmes, 53, 54

OVERPLLOT, 83

Parameter

Keyword, 19Positional, 19

PLOT, 18, 84–86, 113

PLOTS, 83, 88, 106, 113

POINT LUN, 133

Pointer, 38

Array, 45

verkettete Pointer Liste, 45

Polarplot, 91

POLYFILL, 83, 88, 113

POLYSHADE, 108

POSITION, 73

Positionieren von Zeichen, 66

PostScript, 70

Preferences, 9

PRO, 146

PRO SET VALUE, 189

PROFILER, 163

Prozedur, 143

PS SHOW FONTS, 67

PTR FREE, 39, 44

PTR NEW, 39, 40PTR VALID, 39, 41, 44

PTRARR, 39

RANDOMU, 99

READ ASCII, 135, 136

READ BINARY, 136

READ IMAGE, 136

READF, 129–131

READS, 31, 32

READU, 129, 132REBIN, 118

REFORM, 29, 50

REGION GROW, 123

REPEAT, 151

REPLICATE, 28, 32, 37

reservierte Worte, 23

RESOLVE ALL, 14, 186

RESOLVE ROUTINE, 156

RESTORE, 38, 62, 135

RETAIN, 74

RETALL, 165RGB, 69

Runtime, 14

SAVE, 14, 38, 62, 135, 186

SAVE,/ROUTINES, 14

SCALE3, 103, 108

Scatter-Plot mit Zufallszahlen, 92Set Breakpoint, 161

SET PLOT, 70, 77

SHADE SURF, 99, 100, 113

SHADE VOLUME, 108

SHOW3, 114

SIZE, 25, 28

Skalar, 25

SLICER3, 109, 114

SMOOTH, 121

SOBEL, 121SORT, 55

SPAWN, 60, 191, 192

Spezifikation, 23

SQL, 1

Start-Up, 3

Step, 161

STRCOMPRESS, 31

STRICTARR, 54

STRING, 31

String, 24Strings, 31

STRJOIN, 31

STRLEN, 31

STRLOWCASE, 31

STRMID, 31

STRPOS, 31

STRPUT, 31

STRSPLIT, 31

STRTRIM, 31

STRUPCASE, 31

Suchpfad, 17

Suchreihenfolge von IDL Programmen,

17

SURFACE, 76, 94, 101, 113

SURFR, 102

SWITCH, 150

System-Variablen

!DIR, 21

!DPI, 21

!DTOR, 21

!P.MULTI, 71, 72!P.POSITION, 71, 73

Page 236: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 236/238

216 INDEX

!PATH, 17, 21

!PI, 21

!QUIET, 20

!RADEG, 21

!VERSION, 21

T3D Keyword, 100–102

T3D Prozedur, 103

TAG NAMES, 37

TEK COLOR, 68, 69

TEMPORARY, 51, 52

TRANSPOSE, 29

TRIANGULATE, 107

TRIGRID, 107

TV, 105, 108, 119–121

TVCRS, 112TVLCT, 68

TVRD, 121

TVSCL, 118, 119, 121

Typ, 23

UNIQ, 56

Unsigned Integer, 24

Unsigned Long, 24

USERSYM, 113

Waveletts, 1WDELETE, 74

WHERE, 55, 118

WHILE, 151

WIDGET BASE, 172, 173

WIDGET BUTTON, 172, 173, 179

WIDGET CONTROL, 175, 178

WIDGET DRAW, 172

WIDGET DROPLIST, 172

WIDGET INFO, 175, 178, 180

WIDGET LABEL, 172WIDGET LIST, 172

WIDGET SLIDER, 172

WIDGET TABLE, 172

WIDGET TEXT, 172

WINDOW, 74, 121

WRITEF, 129

WRITEU, 129, 132

WSET, 74

WSHOW, 74

XFONT, 67, 114XINTERANIMATE, 111

XLOADCT, 68, 114

XMANAGER, 175, 176, 186

XPALETTE, 68, 114

XREGISTERED, 176

XSURFACE, 114

XVAREDIT, 114XVOLUME, 114

XYOUTS, 83, 89, 113

Z-Buffer, 75, 76

Zeichen

!, 20

( ), 20

*, 20, 38, 39

+, 31

., 20:, 20

;, 20

?, 20

[ ], 20, 28, 29

$, 20, 60

&, 20

@, 20 ¡ 

, 20, 33

Zeichenkettenvariablen, 31

ZOOM, 114

Page 237: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 237/238

Katalog der Benutzerhandbucher des ZAM (Stand: 08.08.2002)

Eine aktuelle und nach Sachgebieten eingeteilte Liste der Benutzerhandbucher und Tech-

nischen Kurzinformationen des ZAM erhalten Sie in der Technischen Kurzinformation

TKI-0000 und auf dem WWW-Server des Forschungszentrums unter der

URL: <http://www.fz-juelich.de/zam/docs/topic/topic d.html>.

BHB-0034 MTA-Kurs: PL/I Vorlesungsschrift

BHB-0063 MTA-Kurs: Einfuhrung in Datenverarbeitung - Materialien zum Kurs

BHB-0092 Quantum Chemistry Program Exchange

BHB-0095 Einfuhrung in die Programmiersprache C

BHB-0096 GR - Software

BHB-0097 GKS und CGM Anwendungen inklusive GR-Software auf den zentralen

Rechnern

BHB-0101 Einfuhrung in die Benutzung des zentralen AIX

BHB-0102 REDUCE User’s Manual

BHB-0105 Kurze Einfuhrung in die formale Logik BHB-0109 User’s Manual for MOLPRO

BHB-0110 XL-Fortran unter AIX auf einer RISC/6000 - Einfuhrung, Hilfsmittel, Erfah-

rungen

BHB-0111 Statistische Datenanalyse mit SAS und BMDP

BHB-0112 TEX im Forschungszentrum Julich

BHB-0114 GNUPLOT - An Interactive Plotting Program

BHB-0115 GNU Emacs Manual

BHB-0117 XV - Interactive Image Display for the X Window System

BHB-0118 ImageMagick - User’s Guide

BHB-0119 Das Grafiksystem XGraf BHB-0120 GLI - Graphics Language Interpreter - Reference Manual

BHB-0121 Free recode, version 3.5d - The character set converter, Edition 3.5d

BHB-0122 Tcl and the Tk Toolkit, Part 1 + 2

BHB-0123 Tcl and the Tk Toolkit, Part 3 + 4

BHB-0124 Programmieren in Fortran 90/95 - Vorlesungsskript

BHB-0125 Xhibition - Ein Werkzeug zur Erstellung eines Menu-Systems auf der Basis

von X-Window

BHB-0129 xmgr (ACE/gr) Users Manual

BHB-0130 Installationshinweise zur Datensicherung und Archivierung mit TSM/ADSM

fur Workstations und PCs im JuNetBHB-0133 Programmieren in Fortran 90/95 - Ubungsaufgaben

BHB-0134 LaTeX - eine Einfuhrung und ein bißchen mehr

BHB-0135 LaTeX - Fortgeschrittene Anwendungen oder: Neues von den Hobbits

BHB-0136 Forms Library - Toolkit zur Erstellung graphischer Benutzeroberflachen

BHB-0138 The Cray Systems at Research Centre Julich - Volume 1 - Handling of Jobs

and Data

BHB-0139 The Cray Systems at Research Centre Julich - Volume 2 - Programming En-

vironment and Application Software

BHB-0140 Programmierung in C - Vorlesungsskript

BHB-0141 Pretty Good Privacy (pgp) Bedienungsanleitung

BHB-0142 BALSAC - User’s Guide and ManualBHB-0144 Gsharp - Tutorial, User’s Guide, and Applications

Page 238: IDL Programming (Book)

7/11/2019 IDL Programming (Book)

http://slidepdf.com/reader/full/idl-programming-book 238/238

BHB-0145 Gsharp - Reference Guide, Part 1

BHB-0146 Gsharp - Reference Guide, Part 2

BHB-0147 GIMP - Das offizielle Benutzerhandbuch, Teil 1

BHB-0148 GIMP - Das offizielle Benutzerhandbuch, Teil 2

BHB-0149 GIMP - Das offizielle Benutzerhandbuch, Teil 3

BHB-0150 Windows NT V4.0 Workstation - ein InstallationsprotokollBHB-0152 Introduction To Scilab - User’s Guide

BHB-0153 Vampir 2.0 - User’s Manual

BHB-0154 Programming in C++ - Part I

BHB-0155 Programming in C++ - Part II

BHB 0156 NWCh U D t ti