Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
fr Elektronik (ZEL)
Schriften des Forschungszentrums Jlich Reihe Informationstechnik / Information Technology Band 2 ISSN 1433-5514 ISBN 3-89336-308-4
Forschungszentrum Jlich GmbH Zentralbibliothek, Verlag D-52425 Jlich Telefon (02461) 615368 - Telefax (02461) 61-6103 e-mail: zb-publikation@fz-juelich.de Internet: http://www.fz-juelich.de/zb/verlag/ Forschungszentrum Jlich 2008
Copyright:
Schriften des Forschungszentrums Jlich Reihe Informationstechnik / Information Technology, Band / Volume 2 ISSN 1433-5514 ISBN 3-89336-308-4 Vollstndig verffentlicht im Internet Persistent Identifier: urn:nbn:de:0001-00430 Resolving 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 schriftliche Genehmigung des Verlags reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfltigt oder verbreitet werden.
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 well as 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.
Vorwort
Im Jahre 1994 wurde seitens einiger Institute des Forschungszentrums J lich, darunter u ZEL, IME, ICG, IPP, der Wunsch ge uert, die Software IDL zentral bereitzustellen. a Das ZAM (Zentralinstitut f r Angewandte Mathematik) f hrte dann die Verhandlungen u u mit der Firma CREASO, dem Verteiber der Software in Deutschland. Ende 1994 konnten dann einige Floating-Lizenzen installiert werden. Die Software-Pege wurde uber einen Wartungsvertrag mit der Firma CREASO gesichert. Die Betreuung der Software einschlielich 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 verfate ein Kurs-Script. Im Mai 1995 wurde der erste 3-t gige a IDL Kurs von Frau Marlene Busch, Herrn Heinz Heer und Herrn Michael Wagener gehalten. 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 j hrlich gehalten. Das Kurs-Script wurde von Frau Busch gepegt a und im Laufe der Jahre der sich entwickelnden IDL-Sprache angepat. Die vorliegende Dokumentation basiert auf IDL 5.5. In der Dokumentation werden IDL spezische Befehle und Keywords in Grobuchstaben geschrieben, um diese hervorzuheben. Herr Bauer aus dem ICG I ist seit dem Jahr 2000 an der Weiterentwicklung des KursScripts beteiligt und seit 2001 als Referent beim IDL Kurs des Forschungszentrums t tig. a Durch die bisher abgehaltenen Kurse haben etwa 120 Mitarbeiter diese plattformunabh ngige interaktive Programmiersprache kennen und sch tzen gelernt. a a Ein Dank von uns geb hrt der Firma CREASO, die uns Testlizenzen f r den Kurs u u bereitstellen. Damit ist gew hrleistet, das w hrend der Kurszeit keine IDL-Lizenzen f r a a u den laufenden Betrieb verloren gehen. Das Kursmaterial hat nun einen Umfang erreicht, den wir in dieser Form einem gr eren o Kreis als Nachschlagewerk zur Verf gung stellen wollen. Daher wurde es von Frau u 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 nden, 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
ii
Inhaltsverzeichnis
1 Einleitung 2 Konguration 2.1 Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Beispiel: Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Automatisches Starten eines Programms . . . . . . . . . . . . . . 3 Beschreibung der Applikationen 3.1 idlde (Unix, Windows) . . . . . . . . . . . . . . . . . . . 3.1.1 Preferences . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 Editieren, Kompilieren und Fehlersuche in Programmen 3.2 IDL (Unix) . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Ausf hrbare Kommandos, Kompilieren und Fehlersuche u 3.3 Runtime (Unix, Windows) . . . . . . . . . . . . . . . . . 3.4 IDLHELP (Unix, Windows) . . . . . . . . . . . . . . . . 3.4.1 Arbeiten mit der IDL Online Hilfe . . . . . . . . . . . . 4 Grundlagen 4.1 Aufnden von Programmen . . . . . . . . 4.2 Syntax der Aufrufe von IDL Programmen 4.2.1 Positionale Parameter . . . . . . . . . . 4.2.2 Keyword Parameter . . . . . . . . . . . 4.3 Zeichen mit spezieller Bedeutung . . . . . 4.4 System-Variablen . . . . . . . . . . . . . 4.4.1 Ubersicht . . . . . . . . . . . . . . . . 4.4.2 Informationen uber Systemvariablen . . 5 Datenstrukturen 5.1 Datentypen . . . . . . . . . . . . . . 5.1.1 Konversionsroutinen . . . . . . . . 5.2 Skalar . . . . . . . . . . . . . . . . . 5.2.1 Information uber Skalare mit SIZE . 5.3 Array . . . . . . . . . . . . . . . . . iii 1 3 3 4 5 7 7 9 10 11 13 14 15 15 17 17 18 19 19 20 20 21 21 23 24 25 25 25 26
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
INHALTSVERZEICHNIS Anlegen von Vektoren und Arrays . . . . . . . . . . Information uber Felder mit SIZE . . . . . . . . . . Generierung von Arrays mit REPLICATE . . . . . . Arrayindizierung mit [ ] . . . . . . . . . . . . . . . Arbeiten mit Feldern - REFORM Befehl . . . . . . . Arbeiten mit Feldern - TRANSPOSE Befehl . . . . Verkn pfung von Feldern . . . . . . . . . . . . . . u Beispiele zum Arbeiten mit Feldern . . . . . . . . . 5.4 Zeichenketten (Strings) . . . . . . . . . . . . . . . . . 5.4.1 Operationen auf Zeichenketten . . . . . . . . . . . . 5.4.2 Konversion von Strings in Zahlen . . . . . . . . . . 5.4.3 Zeichenkette mit Leerzeichen anlegen . . . . . . . . 5.5 Strukturen . . . . . . . . . . . . . . . . . . . . . . . . 5.5.1 Denition einer unbenannten (anonymen) Struktur . 5.5.2 Denition einer benannten Struktur . . . . . . . . . 5.5.3 REPLICATE bei Strukturen . . . . . . . . . . . . . 5.5.4 Informationen zum Strukturaufbau . . . . . . . . . . 5.6 Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 Anwendungen von Pointern . . . . . . . . . . . . . 5.6.2 Funktionen zur Bearbeitung von Pointern . . . . . . 5.6.3 Beispiele mit Pointern . . . . . . . . . . . . . . . . 5.6.4 Empty Pointer . . . . . . . . . . . . . . . . . . . . 5.6.5 G ltige Pointer . . . . . . . . . . . . . . . . . . . . u 5.6.6 Datenbereich mit Pointer belegen . . . . . . . . . . 5.6.7 Pointer auf eine Struktur . . . . . . . . . . . . . . . 5.6.8 Pointer in einer Struktur . . . . . . . . . . . . . . . 5.6.9 Pointer auf eine Struktur und Pointer in der Struktur 5.6.10 Pointer freigeben . . . . . . . . . . . . . . . . . . . 5.6.11 HEAP GC Heap garbage collection . . . . . . . . . 5.6.12 Beispiel mit Pointern . . . . . . . . . . . . . . . . . 5.6.13 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 28 28 28 29 29 29 30 31 31 32 32 33 34 36 37 37 38 38 39 40 40 41 41 42 42 43 44 44 45 47 49 49 50 50 51 51 52 53 53
6 Arbeiten mit Datenstrukturen 6.1 IDL Operatoren . . . . . . . . . . . . . . . . . . 6.2 Wertzuweisung bei Variablen . . . . . . . . . . . 6.2.1 Wertzuweisung bei mehrdimensionalen Feldern 6.3 Warnung vor Integer-Overow . . . . . . . . . . 6.4 Speicherplatzverwaltung . . . . . . . . . . . . . 6.5 L schen von Variablen . . . . . . . . . . . . . . o 6.6 Efzientes Arbeiten mit Feldern . . . . . . . . . 6.6.1 Vorteil von Feld-Operationen . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
INHALTSVERZEICHNIS Geschickte Klammerung . . . . . . . . . . . . . . . . . . . 6.7 Einstellung von Compiler Optionen . . . . . . . . . . . . . . 6.8 Filtern von Daten . . . . . . . . . . . . . . . . . . . . . . . . 6.8.1 WHERE-Funktion . . . . . . . . . . . . . . . . . . . . . . 6.8.2 Verwendung der Funktionen MIN, MAX, SORT und UNIQ 6.8.2.1 SORT . . . . . . . . . . . . . . . . . . . . . . . 6.8.2.2 MIN und MAX . . . . . . . . . . . . . . . . . . 6.8.2.3 UNIQ . . . . . . . . . . . . . . . . . . . . . . . 6.9 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . .
v 54 54 55 55 55 55 56 56 57 59 59 59 60 61 61 62 65 65 66 67 68 68 69 70 70 71 71 72 73 74 75 76 77 79 81 81 82 83
7 Einbettung ins Betriebssytem 7.1 Umgebungs-Variablen . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Umgebungs-Variablen des Betriebssystems . . . . . . . . . . . . 7.2 Wechsel zum Betriebssystem (Unix, Windows) . . . . . . . . . . . 8 Hilfe, Sicherung 8.1 Die Hilfe-Routine von IDL . . . . . . . . . . . . . . . . . . . . . . 8.2 Save und Restore einer IDL-Sitzung, IDL- Binary . . . . . . . . . . 9 Denitionen zur Datenausgabe 9.1 Koordinatensysteme . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Zeichens tze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 9.2.1 Auswahl eines Fonts . . . . . . . . . . . . . . . . . . . . . . . . 9.3 Farbtabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.1 Laden von Farbtabellen . . . . . . . . . . . . . . . . . . . . . . . 9.3.2 Arbeiten mit Farben . . . . . . . . . . . . . . . . . . . . . . . . 9.4 Steuerung der Ausgabe und Ausgabeger te . . . . . . . . . . . . . . a 9.4.1 Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.2 Ausgabe mehrerer Bilder . . . . . . . . . . . . . . . . . . . . . . 9.4.3 Positionieren von Bildern . . . . . . . . . . . . . . . . . . . . . 9.4.3.1 Aufteilung der Zeichen che in gleich groe Teile . . . a 9.4.3.2 Keyword POSITION und System-Variable !P.POSITION 9.4.4 Bildschirm Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 9.4.5 Benutzung des Z-Buffers . . . . . . . . . . . . . . . . . . . . . . 9.4.6 Beispiel: Z-Buffer, SURFACE und CONTOUR . . . . . . . . . . 9.4.7 PostScript Ausgabe - Drucken . . . . . . . . . . . . . . . . . . . 9.4.8 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Programme zur Anwendungs-Darstellung 10.1 Uberblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1.1 Achsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1.2 Steuerungen zur Zeichen che . . . . . . . . . . . . . . . . . . . a
vi
INHALTSVERZEICHNIS 10.1.3 Routinen zum Beschriften oder Markieren . . . . . . . . . . . . . 10.2 XY-Darstellungen mit PLOT . . . . . . . . . . . . . . . . . . . . . 10.2.1 Ausgabe von Daten als Linien-Plots . . . . . . . . . . . . . . . . 10.2.2 Plot bei einem Argument . . . . . . . . . . . . . . . . . . . . . . 10.2.3 Plot mit zweitem Argument (dependent data) . . . . . . . . . . . 10.2.4 Plot von Datenreihen . . . . . . . . . . . . . . . . . . . . . . . . 10.2.5 Beispiele mit PLOT . . . . . . . . . . . . . . . . . . . . . . . . 10.2.6 Plot mit logarithmischer Achseneinteilung . . . . . . . . . . . . . 10.2.7 Balkendiagramme . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.8 Fehlerbalken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.9 Polarplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.10 Scatter-Plot mit Zufallszahlen . . . . . . . . . . . . . . . . . . . 10.2.11 Plot mit Text in unterschiedlichen Farben . . . . . . . . . . . . . 10.3 Fl chen- und H henlinien- Darstellungen . . . . . . . . . . . . . . a o 10.3.1 Netzlinien mit SURFACE . . . . . . . . . . . . . . . . . . . . . 10.3.2 H henlinien mit CONTOUR . . . . . . . . . . . . . . . . . . . . o 10.3.3 Schattierte Ober chendarstellung . . . . . . . . . . . . . . . . . a 10.3.4 Ober che mit beliebigem Datensatz uberlagern . . . . . . . . . a 10.3.5 H henlinien-Plot im 3D-Raum . . . . . . . . . . . . . . . . . . . o 10.4 3D Transformationen . . . . . . . . . . . . . . . . . . . . . . . . . 10.4.1 3D Transformationsmatrix mit SURFACE . . . . . . . . . . . . . 10.4.2 3D Transformationsmatrix mit SURFR . . . . . . . . . . . . . . 10.4.3 3D Transformationsmatrix mit SCALE3 und T3D . . . . . . . . . 10.5 Karten-Projektionen . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5.1 MAP SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5.2 Kombination von Karte mit Bilddatei . . . . . . . . . . . . . . . 10.5.3 Kombination von Karte und H henlinienplot . . . . . . . . . . . o 10.5.4 Beschriftung der Karte mit Text und Symbolen . . . . . . . . . . 10.6 10.7 Gl tten von zuf lligen oder irregul ren Daten . . . . . . . . . . . . a a a ISO Ober chen . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 83 84 84 84 84 85 86 90 90 91 91 92 93 94 94 97 98 99 100 101 101 102 103 104 104 105 106 106 107 108 109 111 112 113 113 113 113 114 115
10.7.1 Das SLICER3 Tool . . . . . . . . . . . . . . . . . . . . . . . . . 10.8 Animation von Daten . . . . . . . . . . . . . . . . . . . . . . . . . 10.9 Arbeiten mit dem Cursor . . . . . . . . . . . . . . . . . . . . . . . 10.10 Zusammenfassung der Darstellungs-Routinen . . . . . . . . . . . . 10.10.1 allgemeine Routinen . . . . . . . . . . . . . . . . . . . . . . . . 10.10.2 eindimensionale Plotroutinen . . . . . . . . . . . . . . . . . . . 10.10.3 mehrdimensionale Plotroutinen . . . . . . . . . . . . . . . . . . 10.11 IDL-Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . 10.11.1 Ubungen: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INHALTSVERZEICHNIS 11 Bildverarbeitung 11.1 Lesen eines Bildes . . . . . . . . . . . . . . 11.2 Kontrastversch rfung . . . . . . . . . . . . a 11.3 Ver ndern der Bildgr e . . . . . . . . . . a o 11.4 Darstellung eines Bildes . . . . . . . . . . 11.5 Positionieren des Bildes . . . . . . . . . . . 11.6 Bildanalyse . . . . . . . . . . . . . . . . . 11.6.1 Arbeiten mit Basisltern . . . . . . . . . 11.6.2 Ausw hlen und Verarbeiten einer Region a
vii 117 117 118 118 119 120 121 121 123 127 127 128 129 130 131 132 132 133 134 135 136 137 139 140 140 140 141 141 142 143 144 144 145 145 146 147 149 152
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
12 Lesen und Schreiben von Daten 12.1 Offnen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Beispiele f r das Offnen und Schlieen von Dateien . . . . . . . . . u 12.3 Lesen und Schreiben von Daten . . . . . . . . . . . . . . . . . . . 12.3.1 Formale Vorschriften beim Lesen . . . . . . . . . . . . . . . . . 12.3.2 Lesen (explizit) formatierter Daten . . . . . . . . . . . . . . . . . 12.3.3 Lesen und Schreiben unformatierter Daten . . . . . . . . . . . . 12.3.4 Lesen von unformatierten Daten mit assozierten Variablen . . . . 12.4 Arbeiten mit Dateien . . . . . . . . . . . . . . . . . . . . . . . . . 12.5 Operationen auf Dateien/Verzeichnissen ohne Wechsel zum Betriebssytem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 Automatisierte Eingabe eines ASCII-Datensatzes . . . . . . . . . . 12.6.1 Zusammenfassung gebr uchlicher Lese- uns Schreibroutinen . . . a 12.7 Beispiel: Lesen und Schreiben . . . . . . . . . . . . . . . . . . . . 13 Programmierung und Kompilation 13.1 Batchverarbeitung . . . . . . . . . . . . . . . . . . . . . . 13.2 Formales zu IDL-Programmen . . . . . . . . . . . . . . . 13.3 Denition einer Prozedur oder Funktion . . . . . . . . . . 13.4 Aufruf einer Prozedur oder Funktion . . . . . . . . . . . . 13.5 Regeln f r die Namensgebung von IDL Programmen . . . u 13.6 Kompilieren/Ausf hren einer Prozedur/Funktion . . . . . u 13.7 Beispiele f r IDL Programme . . . . . . . . . . . . . . . . u 13.8 Speicherverwaltung von Daten . . . . . . . . . . . . . . . 13.8.1 Ubergabe von Parametern an Prozeduren und Funktionen 13.8.2 Lokale Variable . . . . . . . . . . . . . . . . . . . . . . 13.8.3 Regeln f r Parameter . . . . . . . . . . . . . . . . . . . u 13.9 Beispiele: Aufruf von Funktionen und Prozeduren . . . . . 13.10 FORWARD FUNCTION Funktion . . . . . . . . . . . . . 13.11 Kontroll-Statements . . . . . . . . . . . . . . . . . . . . . 13.12 Uberpr fung der Argumente und Keywords . . . . . . . . u
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
viii 13.13 13.14 13.15 13.16 13.17 Beispiel . . . . . . . . . . . . . . . . . . . Durchschleusen zus tzlicher Argumente . . a COMMON Bl cke . . . . . . . . . . . . . o Dynamische Erweiterung von Programmen Ubungen . . . . . . . . . . . . . . . . . . . . . . . .
INHALTSVERZEICHNIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 154 155 156 157 161 163 165 166 167 168 169 171 171 172 172 173 175 175 176 177 177 178 179 179 180 181 182 183 184 185 186 187 191 191 192 193
14 Fehlersuche 15 Programmanalyse 16 Error Handling 16.1 Abfrage des Fehlerzustandes . 16.2 Umleiten von Fehlern . . . . . 16.3 Beispiel zu CATCH . . . . . . 16.4 Ausgabe von Fehlernachrichten
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
17 Widgets 17.1 GUI Builder . . . . . . . . . . . . . . . . . . . . . . 17.2 Typen von Widgets . . . . . . . . . . . . . . . . . . 17.3 Erstellung von Men Widgets . . . . . . . . . . . . . u 17.4 Gestaltung des Layouts eines Widgets . . . . . . . . 17.5 Wie funktioniert eine Ober che? . . . . . . . . . . a 17.6 Kontrolle uber die Widgets . . . . . . . . . . . . . . 17.7 Registrierung der Widgets mit dem XMANAGER . . 17.8 Schreiben eines kleinen Widget Programms . . . . . 17.8.1 Initialisierung der Event-Loop . . . . . . . . . . . 17.8.2 Ubergabe der Event Struktur an den Event-Handler 17.8.3 Aufbau der Event Struktur f r WIDGET BUTTON u 17.9 Ubergabe von Informationen zwischen Widgets . . . 17.10 Widgetprogrammierung im Wandel von IDL . . . . . 17.10.1 Beispiel: Widget 1 . . . . . . . . . . . . . . . . . 17.10.2 Beispiel: Widget 2 . . . . . . . . . . . . . . . . . 17.10.3 Beispiel: Widget 3 . . . . . . . . . . . . . . . . . 17.10.4 Beispiel: Widget 4 . . . . . . . . . . . . . . . . . 17.10.5 Beispiel: Widget 5 . . . . . . . . . . . . . . . . . 17.11 Widget Programme f r Runtime-L ufe . . . . . . . . u a 17.12 Compound Widgets . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
18 Verknupfung mit anderer Software 18.1 SPAWN Kommando . . . . . . . . . . . . . . . . . . . . . . . . . 18.2 SPAWN Kommando bei einem C Programm . . . . . . . . . . . . . 18.3 Aufruf von Fortran aus IDL: CALL EXTERNAL . . . . . . . . . .
INHALTSVERZEICHNIS A Informationen A.1 Informationen zu IDL . . . . . . . . . . . . . A.2 Publikationen und Aktivit ten zu IDL im FZJ a A.3 Wichtige URLs zu IDL . . . . . . . . . . . . A.4 Literatur . . . . . . . . . . . . . . . . . . . . B L sungen o B.1 B.2 B.3 B.4 B.5
ix 195 195 197 198 199 201 201 203 205 206 208
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
L sungen zu Kapitel: Datenstrukturen . . . . . . . . . . . . . . o L sungen zu Kapitel: Arbeiten mit Datenstrukturen . . . . . . . o L sungen zu Kapitel: Denitionen zur Datenausgabe . . . . . . o L sungen zu Kapitel: Programme zur Anwendungs-Darstellung o L sungen zu Kapitel: Programmierung und Kompio lation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
. . . .
. .
INHALTSVERZEICHNIS
Programme zur Darstellung: XY Plot . . . . . . . . . . . . . . . . . Programme zur Darstellung: mehrere Y-Achsen . . . . . . . . . . . Programme zur Darstellung: PLOT und zus tzlicher Text . . . . . . a Programme zur Darstellung: Beschriftung in der Mitte des Bildes . . Programme zur Darstellung: Logarithmischer PLOT . . . . . . . . . Programme zur Darstellung: Fehlerbalken . . . . . . . . . . . . . . Programme zur Darstellung: Polarplot . . . . . . . . . . . . . . . . Programme zur Darstellung: Scatter-Plot mit Zufallszahlen . . . . . Programme zur Darstellung: XYOUTS in unterschiedlichen Farben Programme zur Darstellung: SURFACE . . . . . . . . . . . . . . . Programme zur Darstellung: Behandlung von missing value . . . . Programme zur Darstellung: CONTOUR . . . . . . . . . . . . . . . Programme zur Darstellung: C Keywords bei CONTOUR . . . . . Programme zur Darstellung: SHADE SURF . . . . . . . . . . . . . Programme zur Darstellung: CONTOUR im 3D Raum . . . . . . . Programme zur Darstellung: Probleme ohne Z-Buffer . . . . . . . . Programme zur Darstellung: SURFACE 3D Transformationen . . . Programme zur darstellung: SURFR 3D Transformationen . . . . . Programme zur Darstellung: SCALE3 3D Transformationen . . . . Programme zur Darstellung: MAP SET . . . . . . . . . . . . . . . Programme zur Darstellung: CONTOUR und MAP SET . . . . . . Programme zur Darstellung: TRIGRID . . . . . . . . . . . . . . . . Programme zur Darstellung: ISO Ober chen . . . . . . . . . . . . a xi
xii 10.24 10.25 10.26 11.1 11.2 11.3 11.4 11.5 16.1 17.1
VERZEICHNIS DER ABBILDUNGEN Programme zur Darstellung: SLICER3-Tool im SLICE-Modus . . . Programme zur Darstellung: SLICER3-Tool im Surface-Modus . . . Programme zur Darstellung: SHOW3 . . . . . . . . . . . . . . . . Bildverarbeitung: TVSCL . . . . . . . Bildverarbeitung: TV . . . . . . . . . Bildverarbeitung: Basislter . . . . . Bildanalyse: Ausw hlen einer Region a Bildanalyse: Ausw hlen einer Region a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 110 114 119 120 122 123 125 168 187
12.1 Lesen und Schreiben von Daten: Offnen . . . . . . . . . . . . . . . . . . 12.2 Lesen und Schreiben von Daten: Lesen und Schreiben von Daten . . . . . 12.3 Lesen und Schreiben von Daten: Zusammenfassung von Lese- und Schreibroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xiii
xiv
xv
xvi
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 Plattformunabh ngig a IDL ist portabel: UNIX, VMS, Windows, LINUX, Macintosh Arrayorientierte Sprache Pointer Flexible Input/Output M glichkeiten o XY Plotting, 2D Plotting, mehrdimensionales Plotting, Volumen Visualisierung, Bildverarbeitung und Bildanalyse, Animation IDL Widgets, Erstellung von Benutzerober chen a 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.
KAPITEL 1. EINLEITUNG
Kapitel 2 Konguration
Die Einstellungen zur IDL Arbeitsumgebung k nnen konguriert werden. Gemeint sind o Denitionen, die beim Starten von IDL durchgef hrt werden. u Einige Beispiele sind: (Fettgedrucktes sehr wichtig!): Der Suchpfad (!PATH), ein Beispiel zur Denition 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 Windowgr e o Diese Denitionen sind uber eine Start-Up Datei m glich. IDL sieht zwei M glichkeiten o o vor, eine Start-Up Datei zu denieren. Man kann zum einen in der Entwicklungsumgebung idlde in dem daf r vorgesehenen u Men Preferences Einstellungen vornehmen. Zum anderen werden Einstellungen automau tisiert durchgef hrt, wenn eine Start-Up Datei mittels einer Environment-Variablen angeu boten wird. Diese Technik wird im nachfolgenden beschrieben. Ein Vorteil einer Start-Up Datei ist, da man diese auch zentral f r eine Arbeitsgruppe denieren kann. u
KAPITEL 2. KONFIGURATION
Unter einem Windows-System setzt man Environment-Variablen z.B. in der Datei autoexec.bat oder uber das Men Systemeigenschaften. u
; 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: Konguration: Start-Up Datei
KAPITEL 2. KONFIGURATION
8
Menu Bar Tool Bars Project Window
Output Log
Auisten der letzten Befehle Mit der Richtungstaste -Taste kann man die Befehle zur ckholen. u 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. Unter Unix erfolgt keine farbliche Hervorhebung. Daher empehlt es sich, unter Unix den emacs als Editor mit der Erweiterung IDL-Mode zu benutzen. Dieser Modus unterst tzt u eine farbige Hervorhebung der IDL Programme. Dazu mu ein emacs.template f r IDL als .emacs unter $HOME abgelegt werden. u
3.1.1 Preferences
Zur Grundeinstellung von IDL sollten folgende Anderungen vorgenommen werden. Men : File u Preferences General Men punkt: change directory on open u (Interessant f r Windows Benutzer) u 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, verzweigt 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 Window ist. Edit Compiling: Men punkt: automatically save changes before compiling u Startup Unter dem Men kann der Name der Start-Up Datei angegeben werden. u
10
File Men , Search Men und Edit Men sind selbsterkl rend. u u u a Im File Men ist unter Preferences eine Voreinstellung m glich (Startup File, u o Path,...). Uber das Search Men hat man Editierm glichkeiten (Find, Replace), aber u o auch eine Debughilfe (Go To Line). Run Men u Die Befehle des Run Men s, die im folgenden erkl rt werden, sind auch uber ein u a Icon der Ober che idlde ansprechbar. a 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 ausf hren u Resolve Dependencies alle Abh ngigkeiten werden aufgel st, wichtig f r .sav Files bei Runtime. a o u 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 h lt a bei Ausf hrung an dieser Stelle an! u Edit Breakpoints Editieren der Breakpoints Disable Breakpoint Deaktivieren des Breakpoints. Dieser Breakpoint kann wieder aktiviert werden. Step Over f hrt eine Zeile aus. Falls diese einen Programmaufruf enth lt, wird dieser ohne u a Interaktion ausgef hrt. u Step Out Das Programm wird bis Ende ausgef hrt. u Run to Cursor Das Programm l uft bis zu der Stelle, wo der Cursor steht. a Run to Return Das aktuelle Programm wird bis zum Ende durchlaufen. Reset macht Verschiedenes: RETALL Befehl, alle Dateien schliessen, L schen von o Breakpoints, Variablen, Pointer... Hinweis: Vor dem Setzen von Breakpoints mu kompiliert werden! Macro Men u 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 l dt diese Routine in das Docua ment Panel, falls diese noch nicht geladen ist.
11
12 Beispiel:
Das Beispiel zeigt die interaktive interpretative Ausf hrung von einem Befehl. XYOUTS u 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
13
kompilieren setzt Programm fort f hrt zuvor ubersetztes Hauptprogramm aus u L schen von Hauptprogramm Variablen auer Common Block und .RUN o kompilieren n Kommandos uberpringen n Kommandos schrittweise wie .CONT, zeigt aber jede Zeile vor Ausf hrung an u
Setzen von Breakpoints: Breakpoints werden f r die Suche nach Fehlern verwenu 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 m glich, aber mit idlde o wesentlich einfacher.
14
;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, m ssen kompiliert werden. Das RESOLVE ALL u dient dazu, alle offenen Referenzen aufzul sen. Mit dem SAVE-Befehl speichert man die o 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.
15
Hinweis: Es kann nichts nachkompiliert werden. Die IDL Start-Up Datei wird nicht durchlaufen. .sav-Files sind unabh ngig von der Plattform. Egal wo erstellt, sind diese uberall a nutzbar (siehe Demo). Die !PATH Variable gibt es in der Runtime Umgebung nicht. .sav-Files sind abh ngig von der IDL-Version und laufen jeweils nur unter der a IDL-Version, mit der sie erstellt wurden. Das hat zur Folge, das bei einem VersionsUpgrade, Runtime Programme neu ubersetzt werden m ssen. u
16
Uber folgende Men -Kn pfe erh lt man weitere Informationen. u o a File Men u Ein kapitelweises Ausdrucken ist m glich. Bei Printer Setup Auswahl von o Generic (File Only). Mit Print wird die Erstellung eines PostScript Files veranlat. Edit Men u Mit Copy selektierten Text aufs Clipboard (Ablage) legen. Diese kann dann mit Paste in idlde bzw. emacs kopiert werden. Sinnvoll f r Online dokumentierte u Beispiele. Bookmark Men u Mit Define Denition von Bookmarks zum schnelleren Aufnden bestimmter Topics. Mit dem Online Help Button Index werden folgende Help Topics gelistet.
Contents Men u IDL B cher, Whats new in IDL 5.x, Release Notes,... u Index Men u Suche nach Keywords. Nur die ersten Buchstaben des gesuchten Begriffs sind notwendig. Find Men u Suche nach beliebigem Text. Full text search, daher beim ersten Aufruf langsam. Wie bei Index nur die ersten Buchstaben des gesuchten Begriffs tippen.
Kapitel 4 Grundlagen
Mit der Distribution zu IDL stehen die Routinen der Sprache in zwei verschiedenen Arten zur Verf gung. Viele Programme liegen in Bin rcode, z.B. PLOT, oder in der Scriptu a Sprache (Quelltext) z.B. MEAN vor.
17
18
KAPITEL 4. GRUNDLAGEN
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
Keyword
Parameter sind X und Y. Positionale Parameter sind nicht alle erforderlich. Deren Reihenfolge ist wichtig! 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 f r Variablen bzw. Befehle irrelevant u
19
Hinweis: Informationen und Erkl rungen zu den Routinen und deren Keywords ndet man in der a Online Hilfe bzw. im Reference Guide.
20
KAPITEL 4. GRUNDLAGEN
. & * @
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 (Unterdr cken u der MESSAGE,/INFO). Alle System-Variablen beginnen mit !. Hinweis: Systemvariablen k nnen sich von Version zu Version andern. Das bedeutet, da sich der o Informationsgehalt andern kann. Vorsicht ist daher bei Systemvariablen geboten, die geschrieben werden! IDL Systemvariable sind als globale Variablen in allen Programmeinheiten bekannt!
4.4. SYSTEM-VARIABLEN
21
4.4.1 Ubersicht
H ug benutzte Konstanten, Einstellungen f r die Grak, das Environment und Errora u Handling k nnen uber Systemvariablen gesetzt werden. o 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, !PATH Suchpfad f r Routinen u 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 Plattformabh ngiges Programmieren! a PRINT, !VERSION.OS liefert z.B. AIX PRINT, !VERSION.OS FAMILY liefert z.B. unix Die Beschreibung von !ERR STATE folgt auf Seite 166.
Error Handling
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 dar ber, da !D eine Struktur ist, u 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):
Nur Ausdruck der Werte! PRINT,!D PRINT,!P.T !P.T ist eine 4x4 Transformationsmatrix. Einige Systemvariablen sind readonly: Konstanten, !D.TABLE SIZE,... Denition eigener Systemvariablen. Enth lt die DEFSYSV-Anweisung als dritten a Parameter die Option 1 ist die Systemvariable nur Readonly. DEFSYSV,!OWN,4711 DEFSYSV,!OWN,123,1
Kapitel 5 Datenstrukturen
Eine Variable im IDL-Sinn hat einen Typ (Byte, Integer, Float,...) und besitzt eine Spezikation. In IDL stehen, wie auch in anderen Programmiersprachen, Skalare (einzelner Wert), Felder (1 bis 8 Dimensionen) und Strukturen (Zusammenfassung von beliebigen Variablen, Felder und/oder Strukturen) zur Verf gung. u F r die Namenskonvention der Variablen gilt: u L nge max. 255 Zeichen a 1. Zeichen mu Buchstabe sein (Ausnahme: Systemvariable f ngt mit ! an) a erlaubt sind Buchstaben, Ziffern, $ und Underscore Nicht erlaubt sind reservierte W rter o 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
24
KAPITEL 5. DATENSTRUKTUREN
5.1 Datentypen
Die Datentypen unterscheiden sich in der Art der Zahl (Integer, Float, Complex,...) und in dem darstellbaren Zahlenraum. Strings stellen einen besonderen Datentyp dar. Bei der Indizierung einer Zahl mu man gem der Tabelle aufpassen, da man durch eine Zua weisung auch den richtigen Typ initialisiert. Je nach Typ, kostet es mehr oder weniger Speicherplatz. Da Speicherplatz aber heute nicht mehr eine so groe Rolle spielt, sollte man z.B. bei Integer Zahlen grunds tzlich mit LONG arbeiten, da standardm ig bei INT a a der Wertebereich nur 16 Bit umfat. Das bedeutet, da die Initialisierung einer Variablen a mit dem Wert 5 folgendermaen erfolgt: a = 5L Typ Bedeutung (Absoluter Wertebereich) 8-bit unsigned integer, 0 bis 255 f r pixel u images 16-bit signed integer, -32767 bis 32767 16-bit unsigned integer, 0 bis 65535 32-bit signed integer, -2 31 bis 2 31- 1 32-bit unsigned integer, 0 bis 2 32 - 1 64-bit signed integer, -2 63 bis 2 63 - 1 64-bit unsigned integer, 0 bis 2 64 - 1 32-bit single precision, oating point 64-bit double precision, oating point real and imaginary in single precision oat real and imaginary in double precision oat 64-bit, L nge 0 bis a 2147483647 (2.1 GB)
Initialisierung
Byte
var=0B
BYTE
BYTE
Integer Unsigned Integer Long Unsigned Long 64-bit Long 64-bit unsigned Long Floatingpoint Doubleprecision Complex Double Complex String
var=0.0 var=0.0D
FLOAT DOUBLE
TypKonvertierung
Keywords fur
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 B C D
= 15.3 = 15.3000 = 15 = 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 m glich ist. o
5.2 Skalar
Ein Skalar ist ein einzelner Wert ohne Dimension. Beispiele zur Initialisierung von Skalaren Die HELP Anweisung zeigt die Denition 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
26
KAPITEL 5. DATENSTRUKTUREN
5.3 Array
Ein Array hat ein bis acht Dimensionen. Die Feldindizierung wird ab Index 0 gez hlt. a Da IDL eine lebendige Sprache ist, nden laufend Erg nzungen statt. In alteren a IDL Versionen hat es weniger Datentypen gegeben als heute. Aus heutiger Sicht gibt es in alteren Versionen Programme, die mit den heute zur Verf gung stehenden IDL-Routinen u redundant sind. Als Beispiel sei hier das Programm zur Generierung von Speicherplatz genannt. In alten Versionen mute 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-Spezikation wird jeweils mit einem Keyword gesteuert.
27
Die aktuelle Methode sollte m glichst in neuen IDL-Entwicklungen verwendet o 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 Wert initialisieren. Die zus tzliche Typangabe ist mit einem Keyword z.B. L64, UL64, a LONG, FLOAT,. . . m glich. F r die Indexgenierung wurde der bisherige Befehl der alten o u 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 m glich. o 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 ( quivalente Schreibweisen): a 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 exiblen 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 exibler als FLTARR, FINDGEN, ... Bei MAKE ARRAY bzw. INDGEN mu man nur die Keywords f r den Datentyp kenu nen, w hrend bei den Funktionen, die auf . . . ARR und . . . INDGEN enden, entsprea chend des Datentyps je eine andere Funktion gew hlt werden mu. a Bei MAKE ARRAY gibt es eine exible Indizierung (Wert, Typ und Indexgenerierung,...).
28
KAPITEL 5. DATENSTRUKTUREN
5.3. ARRAY
29
30
KAPITEL 5. DATENSTRUKTUREN
A=[1,2,1] ARRAY=[[A],[2*A],[3*A]]
31
Teilt einen String in einzelne Strings auf Konvertieren von Strings in Klein- bzw. Grobuchstaben Konvertiert numerische Daten zum Typ String Liest Werte aus einem String in eine IDL-Variable
KAPITEL 5. DATENSTRUKTUREN
2.00000
3.00000
REPLICATE vervielfacht den BYTE-Wert 32b elf mal. Das Ergebnis ist ein Vektor der L nge elf und dem Typ BYTE. Mit MAKE ARRAY wird ein Vektor der L nge elf a a und dem Initialisierungswert 32b angelegt. Mit der Funktion STRING wird jeweils eine Konvertierung in einen String durchgef hrt. u
5.5. STRUKTUREN
33
5.5 Strukturen
Eine Struktur ist eine Zusammenfassung verschiedener Daten unterschiedlicher Denitionen (Skalare oder Arrays von allen IDL Datentypen). Strukturen sind n tzlich, um Daten u zu einer anderen Programmeinheit zu transferieren. Die Daten innerhalb der Struktur werden uber Tags deniert. Die Tags entsprechen den Variablen Namen, daher gelten f r sie auch die gleichen Regeln zur Denition. u Das Zeichen . dient dazu, eine einzelne Variable der Struktur anzusprechen. Man unterscheidet zwei Typen von Strukturen: Named Wird uber einen Namen deniert. Bei der ersten Referenz liegt die Struktur bez glich u Typ und Dimension fest und kann nicht ge ndert werden. Die benannte Struktur kann a benannte Strukturen enthalten. Anonymous Es gibt keinen Namen und es wird keine permanente Denition innerhalb IDL gespeichert. Die anonyme Struktur kann andere benannte und anonyme Strukturen enthalten. Hinweis: Grunds tzlicher Unterschied der beiden Strukturtypen: a Bei einer anonymen Struktur ist der Typ und die Dimensionierung der Struktur-Elemente gesch tzt. Die Anzahl der Struktur-Elemente kann erweitert werden. Die Reihenfolge u 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
34
KAPITEL 5. DATENSTRUKTUREN
STRUCT
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
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 P2 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
STRUCT STRUCT
5.5. STRUKTUREN Auf die Tags der Struktur zugreifen neu.p2.vname=Hugo HELP,neu.p2.vname,/STR <Expression> STRING
35
= Hugo
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 f r die Tag-Angabe bei tiefer geschachtelten Strukturen: u HELP,neu.(1).(0)
36
KAPITEL 5. DATENSTRUKTUREN
var={struc_name,Tag1:Value1,Tag2:Value2,...,Tagn:Valuen} var=CREATE_STRUCT(NAME=struc_name,Tag1,Value1,...,Tagn,Valuen) Beispiel: Denition einer benannten Struktur var1={data,date:,para1:0.0,pic:BYTARR(10,10)} HELP,var1 VAR1
STRUCT
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
Erweiterung einer zuvor benannten Struktur neu ergibt einen Fehler var4=CREATE_STRUCT(name=neu, $ date,, para,0.0,pic,BYTARR(10,10),a,0.) % Wrong number of tags defined for structure: NEU.
5.5. STRUKTUREN
37
STRUCT
= 29.05.95
Verknupfen von Strukturen analog zu Feldern mit [] var2=[var2, {data}] Statt einer IDL Variablen, kann bei REPLICATE ein Strukturname stehen. var2=REPLICATE( {data} , 3)
PRINT,tags
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 f r die Pointer Daten bereit. u 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 unm glich, Speicherbereich im Heap zu uberschreiben. Man o 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 verf gbar. u Es gibt Funktionen zum Anlegen von Pointern, (PTR NEW und PTRARR), eine Funktion zur Pointer-Freigabe (PTR FREE) und eine Funktion zur G ltigkeitsabfrage des Pointers u (PTR VALID). Diese Funktionen werden auf Seite 39 n her beschrieben. Die Funktionen a SAVE und RESTORE werden bei Pointern voll unterst tzt. Wenn man die Referenz sichert, u 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.
Der Datentyp Pointer kann in statischen Datenelementen, wie Strukturen, als ein Platzhalter f r einen dynamisch angelegten Speicherbereich verwendet werden. u Der Datentyp Pointer ist f r die objektorientierte Programmierung, die Widget u Programmierung und die Programmierung mit Strukturen wichtig. Groe Datenmengen k nnen uber Pointer-Variablen deniert werden. Da Pointer o global bekannt sind, kann man uber Pointer-Variablen denierte Datenbereiche ansprechen. Ein Beispiel dazu steht auf Seite 109, wo nur die Pointer-Variable an das SLICER3Tool ubergeben wird. Verkettete Listen (Trees)
Hinweis: In der Widget Programmierung, siehe Seite 171, ist WIDGET CONTROL mit SET UVAULE mit groen Datenmengen sehr langsam. Deniert man den Datenbereich uber eine Pointer-Variable, l uft die Anwendung viel schneller. a Nullpointer: Der Nullpointer hat keinen bestimmten bekannten Wert und zeigt auf keine Heap Variable. Der Nullpointer hat eine Bedeutung als Abschlu bei Datenstrukturen.
5.6. POINTER
39
o PTR FREE zerst rt die Heap Variablen, auf die die Pointer Argumente zeigen. Wenn der Pointer zerst rt ist, dann ist die Pointer Variable eine dangling refeo 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 g ltig. u 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
40
KAPITEL 5. DATENSTRUKTUREN
Hinweis: Mit ALLOCATE HEAP besteht die M glichkeit, die entstehenden Pointer mit Werten zu o versehen. Ohne die Angabe ALLOCATE HEAP entstehen Nullpointer.
5.6. POINTER
41
42
KAPITEL 5. DATENSTRUKTUREN
FLOAT
= Array[100, 100]
FLOAT
= Array[100]
Solange ein Tag nicht mit einem anderem Wert belegt ist, enth lt der Pointer den String a UNDEFINED. So kann man leicht herausnden, ob ein Pointer mit einem anderem Wert belegt ist oder nicht. Hinweis: Der Pointer in der Struktur ist ein Platzhalter, um dynamisch Speicherbereiche anzulegen!
5.6. POINTER
43
POINTER
= <PtrHeapVar8>
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 enth lt. Mit der zus tzlichen Angabe des Keywords /STR werden die Tags der Struktur a a 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 Pointer erreicht man durch die Klammerung der verschiedenen Variablen. Die beiden oben stehenden Schreibweisen sind aquivalent. Die zweite Schreibweise ist eine deutlichere Ver anschaulichung dieser Abh ngigkeiten. a
44
KAPITEL 5. DATENSTRUKTUREN
HEAP GC ist der Befehl f r Heap garbage collection. u Freigeben von Heap Memory, der nicht mehr ansprechbar ist. HEAP GC durchsucht alle IDL Variablen nach Pointer und Objekt Referenzen und zerst rt die Heap Variablen, die nicht mehr ansprechbar sind. Die Pointer Heap o Variable (bzw. Objekt Heap Variable) wird zerst rt und der Speicherplatz, den sie o belegt, wird freigegeben.
Hinweis: Man sollte Anwendungen so schreiben, da man zuvor uberpr ft, ob man einen g ltigen u u Pointer bearbeitet (PTR VALID). Am Ende der Anwendungen sollte der Speicher mit den normalen Speicherfreigabe Routinen (PTR FREE) aufger umt werden. a
5.6. POINTER
45
dataset2 =
dataset3 =
dataset4 = dataset3
46
KAPITEL 5. DATENSTRUKTUREN
Es gibt zwei L sungen Die L sungen werden exemplarisch skizziert. o o Pointer Array Pointer auf Strukturen zuweisen IDL nahe L sung siehe ptrvec.pro o
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 Verkn pfen, indem man einen Pointer in die Struktur schreibt. Dieser zeigt auf den u n chsten usw. a Man braucht sich nur den ersten Pointer zu merken. C nahe L sung siehe ptrlink.pro o 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
5.6. POINTER
47
5.6.13 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 201. o 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 deniert 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 verkn pft werden u a=MAKE_ARRAY(10,/INDEX,/FLOAT) b=MAKE_ARRAY(2,value=-40.0)
Verkn pfung in der Reihenfolge a,b u Nach dem f nften Element von a soll der Vektor b eingef gt werden. u u
4. Bilde einen Vektor von Jahreszahlen von 1990 bis 2010, ohne arithmetische Operationen 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) Verkn pfe a und b, so da ein Feld der Gr e [40,2] entsteht. u o Verkn pfe a und b, so da ein Feld der Gr e [20,4] entsteht. u o
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 entlang der Diagonalen). a=MAKE_ARRAY(/INDEX,10,2)
48
KAPITEL 5. DATENSTRUKTUREN
Klammern (): bei Funktionsargumentlisten, Spezizierung der Ordnung bei Ausf hrung u Alle IDL Operatoren k nnen auf mehrdimensionale Felder angewendet werden: o arr=arr-100 arr=arr+(2*!PI) Boolsche Ausdr cke u 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 zweiten Matrix) Minimum und Maximum Operator: Verwendung bei Bildern, Kontrast! Beispiel: x=[5,10,20] > [6,9,30] & PRINT,x ergibt: 6 10 30
49
50
LONG
= Array[10, 10]
= Array[10, 10, 1]
LONG
= Array[10, 10]
Hinweis: Mit REFORM kann man die letzte Dimension mit 1 erzwingen. Jedoch wird diese bei einer weiteren Wertzuweisung gel scht. o
LONG
= Array[1000]
Hinweis: Mit REFORM kann man mehrdimensionalen Arrays in einen Vektor andern.
51
6.4 Speicherplatzverwaltung
Bei der Arbeit mit groen Datenmengen, die gerade noch in das RAM des Rechners passen, werden in IDL die Operationen langsam. Bez glich des Speicherplatzes ist folgendes zu u beachten: A=A+1 Speicherplatz doppelt notwendig, weil ein neues Feld f r u das Ergebnis der Addition angelegt wird. Wenn man statt A=A+1 im obigen Beispiel die TEMPORARY-Funktion verwendet, erfordert dies keinen zus tzlichen Speicherplatz. Man arbeitet mit einer a tempor ren Kopie, w hrend die Variable selbst undened a a gesetzt wird.
A=TEMPORARY(A)+1
52
53
Zum Vergleich der Laufzeiten wurden die oben stehenden Beispiele in IDL-Code umgesetzt. 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) t2 = SYSTIME(1) a = a + ( b GT 0 ) * b t2 = SYSTIME(1)-t2 PRINT, gt =, t2, FORMAT=(a,f10.8) t1 = SYSTIME(1) a = a + ( b > 0 ) t1 = SYSTIME(1)-t1 PRINT, > =, t1, FORMAT=(a,f10.8) END Beispiel 6.1: Datenstrukturen: Vorteil von Feld-Operationen
; 0.325 sec
; 0.045 sec
; 0.023 sec
54
new = data * SIN(1.12) / COS(3.0) Schlecht, da f r jedes Element von data der Quotient gebildet werden mu. u
new = data * (SIN(1.12) / COS(3.0)) Gut, da nur einmal der Quotient gebildet werden mu. Der Quotient wird mit jedem Element von data multipliziert.
STRICTARR erlaubt nur eckige Klammern bei Arrays. DEFINT32 nimmt Integer Konstanten defaultm ig als 32 Bit statt als 16 Bit. IDL a hat als Default 16 Bit.
55
6.8.1 WHERE-Funktion
Mit WHERE werden Daten in Abh ngigkeit einer Bedingung geltert. Als Ergebnis erh lt a a man die Indices der Daten, die die Bedingung erf llen. u arr=INDGEN(15,/BYTE) ind = WHERE( arr LE 10b AND arr GE 5b ) arr[ind] =255b PRINT,arr 0 1 oder k rzer! u
11
12
13
14
11
12
13
14
Hinweis: WHERE ist eine sehr m chtige Funktion, die auch bei der Bildverarbeitung wichtig ist! a Wichtig ist das Argument COUNT, womit man pr fen kann, ob Indices gefunden wurden, u siehe Beispiel bei Bildverarbeitung, Seite 118.
6.8.2.1 SORT
Die SORT-Funktion gibt einen Vektor mit Indices zur ck. Diesen Vektor kann man dazu u verwenden, 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
56
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.3 UNIQ
Die UNIQ-Funktion ermittelt die Indices von Werten eines Feldes. Mehrfach vorkommende Werte werden nur einmal ber cksichtigt. Dies kann an einem Beispiel einfach erkl rt u a werden. vec=[Jan,Feb,Feb,Mar] idx=UNIQ(vec) PRINT,idx 0 2 PRINT,vec[idx] Jan Feb Mar
6.9. UBUNGEN
57
6.9 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 203. o 1. Erstelle einen Vektor mit Integer-Zahlen von 2000 bis 2010 2. Feld als Index f r andere Felder u a = [ 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 L nge 26 mit der Anordnung: Aa Bb bis Zz sein. a 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]]
58
USER USERNAME
Hinweis: Die Abfrage des Usernamens kann dazu verwendet werden, um Daten in Benutzer spezische Verzeichnisse zu speichern.
59
60
61
62
8.2. SAVE UND RESTORE EINER IDL-SITZUNG, IDL- BINARY 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
63
64
NORMAL
DEVICE
65
66
Positionieren von Zeichen Steuerzeichen !C !E !I !N !D !U !! !A !B Beschreibung F gt einen Zeilenumbruch ein. u Die folgenden Zeichen werden auf Exponentenh he geschrieben und o um den Faktor 0.44 verkleinert. Die folgenden Zeichen werden auf Indexh he geschrieben und um o den Faktor 0.44 verkleinert. Auf Normalh he und urspr ngliche Zeichengr e zur ckstellen. o u o u Die folgenden Zeichen werden tiefgestellt und um den Faktor 0.62 verkleinert. Die folgenden Zeichen werden hochgestellt und um den Faktor 0.62 verkleinert Darstellen des Symbols ! Die folgenden Zeichen werden oberhalb des Bruchstrichs plaziert Die folgenden Zeichen werden unterhalb des Bruchstrichs plaziert
9.2. ZEICHENSATZE
67
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:
68
9.3 Farbtabellen
Zur Ausgabe farbiger Bilder werden Farbtabellen ben tigt. Es gibt eine Reihe vordeniero ter Farbtabellen, die auf dem RGB-Modell basieren. Die Generierung eigener Farbtabellen ist m glich. o
TVLCT,r,g,b,/GET
TVLCT,r,g,b
MODIFYCT
Die Verkn pfung c#d generiert ein Array der Gr e [256, 20], welches in der eru o sten Spalte die Zahl 0, in der zweiten Spalte 1 usw. bis 255 enth lt. Da die Funktion a TEK COLOR aufgerufen wurde, sind die ersten 32 Farben in jedem Falle unterschiedlich.
9.3. FARBTABELLEN
69
RGB bezeichnet die Rot-Gr n-Blau Farbtabelle. Jeder Anteil einer Farbe liegt u 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 = 128 WINDOW, COLORS = -8 nutze alle Farben - davon 8 f r Shared Color Map u
70
9.4.1 Ausgabe
SET PLOT, Optionen: Mit SET PLOT wird das Ausgabeger t festgelegt. a CGM Computer Graphic Metale 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 Ausgabeger tes mit dem SET PLOT kann man mit dem a 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 Dokument eingebunden werden soll. CLOSE Die Ausgabe auf das Ausgabeger t wird beendet. Bei Ausgabe in eine a PostScript-Datei wird diese abgespeichert. Information uber die Eigenschaften des Devices HELP, /DEVICE
71
72
!P.MULTI[0] 0=n chster Plot beginnt auf neuer Seite a !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
Hinweis: bei PLOT, CONTOUR, SURFACE,.... Jeder dieser Befehle l scht die Zeichen che vor der Ausgabe und geht damit automatisch o a in das n chste Plotfeld. a
73
Hinweis: Mehrere Bilder pro Seite (PLOT, CONTOUR, SURFACE) durch Ausschalten des L schens o der Zeichen che mit dem Keyword /NOERASE. a Weitere Informationen zum Positionieren von Bildern siehe Seite 120
74
Erstellen eines Windows im Speicher (nicht sichtbar) WINDOW, 0, /PIXMAP, XSIZE = 500, YSIZE = 500 Das Window wird wie jedes andere Window behandelt. PIXMAP bezeichnet einen Zwischenspeicher, 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 L schen des Windows mit der Nummer 5. o WDELETE, 5 L schen aller Windows o WHILE (!D.WINDOW GE 0) WDELETE,!D.WINDOW
75
Setzen der Au sung mit SET RESOLUTION o DEVICE, SET_RESOLUTION=[500,300] Setzen der Farbe mit SET COLORS col = !D.TABLE_SIZE SET_PLOT,z DEVICE, SET_COLORS=col Schlieen des Devices mit CLOSE DEVICE, /CLOSE
76
77
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 Dateiname idl.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 nachfolgenden 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).
78
9.4. STEUERUNG DER AUSGABE UND AUSGABEGERATE Aufruf: testct2,[/psag] (optional PostScript)
79
20
40
60
80
100
Thu Sep 4 16:30:27 1997 testct2.pro idl.eps
Das Beispiel enth lt folgendes: a Eigene Farbtabelle (mit TVLCT) Bild auf weiem Hintergrund Legende mit Namen des Programms, des PostScript Files und Datum wird erstellt
9.4.8 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 205. o 1. Schreibe die Denition einer Farbtabelle als RGB Werte. Weise diese Farbtabelle dem Grakdevice zu. Es sollen die Farben Rot, Gr n und Blau angelegt werden. u Uberpr fe die Farbdenition mit einem Farbbalken. Ein einzelner Farbton soll 15 u Pixel breit sein. 2. IDL hat vordenierte Farbtabellen. W hle die Farbtabelle 6 aus. An deren Ende (256. a Farbe) soll denitiv die Farbe Wei sein. Andere die Farbdenition nach dem Laden so ab, da der letzte Wert Wei ist. Uberp fe das Ergebnis mit einem Farbbalken. u 3. Gib den Satz: Heute lernen wir IDL! auf dem Drucker aus!
80
81
82
10.1.1 Achsen
Das Layout von Achsen l t sich mit nachfolgenden Keyword-Parametern steuern. Die a Spezikationen k nnen f r jede Achse gew hlt werden. Die Notation [XYZ]RANGE beo u a deutet, da die Option RANGE f r die X-, Y- und Z-Achse verf gbar ist und mit den u u jeweiligen Keywords XRANGE, YRANGE und ZRANGE angesprochen wird. Anzahl Major-Tick-Intervalle Anzahl Minor Tick Intervalle Tickl nge a Label eines Ticks Format der Beschriftung Werte f r Ticks u Bereich der Werte Aussehen Achsen Titel der Achsen Schriftgr e der Beschriftung o Logarithmische Achsen Denition von Achsen beliebige neue Achse mit Beschriftung und Skalierung [XYZ]TICKS [XYZ]MINOR [XYZ]TICKLEN [XYZ]TICKNAME [XYZ]TICKFORMAT [XYZ]TICKV [XYZ]RANGE [XYZ]STYLE [XYZ]TITLE [XYZ]CHARSIZE [XYZ]LOG [XYZ]AXIS AXIS Beispiel auf Seite 95
Beispiel auf Seite 85 Beispiel auf Seite 87 Beispiel auf Seite 92 Beispiel auf Seite 90 Beispiel auf Seite 87 Beispiel auf Seite 87
10.1. UBERBLICK
83
NOERASE OVERPLOT
Beispiel auf Seite 100, 105, 106, 101, 103 Beispiel auf Seite 100, 106
Mit dem Keyword TITLE erh lt man eine Beschriftung des Gesamtbildes, siehe Seite 95. a
Tabelle 10.3: Programme zur Darstellung: Routinen zum Beschriften oder Markieren
84
IDL legt die X-Achse von 0 bis 400 an. Eine exakte Begrenzung ist m glich, siehe Seite o 87. Hinweis: PLOT l scht Zeichen che vor der Ausgabe! o a Das heit, 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 Ausf hrung des PLOT nicht gel scht. u o
85
86
1,...7 0 -1,-2,... 8 -8 10
nur Symbole nur Linie, Default! Symbole mit Linien Benutzer- denierte Symbole m glich mit USERSYM o Benutzer- denierte Symbole mit Linie Histogramm Modus
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 k nnen. o
87
Arbeiten mit Achsen Die Notation [XYZ]STYLE bedeutet, da die Keywords XSTYLE, YSTYLE und ZSTYLE verwendet werden k nnen. o 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 Denition eines Koordinatensystems, d.h. Anderung des mit PLOT aufgestellten 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
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 Fontgr e o Explizite Labels f r Tickmarks u [XYZ]TICKNAME Feld mit Zeichen [XYZ]TICKFORMAT Format der Beschriftung der Ticks Keywords f r logarithmische Achsen u [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).
89
Abbildung 10.3: Programme zur Darstellung: PLOT und zus tzlicher Text a
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 DeviceKoordinaten. XYOUTS,10,10,links unten,/DEVICE
Abbildung 10.4: Programme zur Darstellung: Beschriftung in der Mitte des Bildes
90
10.2.7 Balkendiagramme
Das BAR PLOT-Programm zeichnet einfache Balken in den angegebenen H hen. o BAR PLOT, [ 2, 5, 1, 3, 6, 4 ]
91
10.2.8 Fehlerbalken
F r das Beispiel werden 10 Zufallszahlen generiert. u 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 symmetrischen Fehler.
10.2.9 Polarplot
r=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
92
93
94
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 ) Zus tzliche Ausgabe von Text mit XYOUTS. a XYOUTS,0.3,0.9, $ Parallel zu Schirm,/NORM,CHARS=2. SURFACE,a,/LEGO 3D- Balkengramm, Balken als Quader mit dem Keyword /LEGO. SURFACE,a,SHADES=BYTSCL(a) Farben: mit COLOR=... bzw. BOTTOM=... erh lt man jeweils ein einfarbiges a Bild. Mit dem SHADES=Farbraster wird ein selbst deniertes 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. Anzahl verf gbarer Farben. u
96
Behandlung von missing values mit IDL Zur Veranschaulichung der Behandlung von missing values wird ein Beispieldatensatz konstruiert. Die Ausreierwerte -999 und 500 werden k nstlich erzeugt. u a=DIST(40) Denition a[8:15,3:5]=-999 Ausreierwerte erzeugen! Mit : auf Teilbereich zugreifen. Feldbereich auf -999 setzen a[4:6,8:10]=500 Ausreierwerte 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 verschwunden.
Hinweis: Keywords MAX VALUE und MIN VALUE sind erlaubt bei: PLOT, CONTOUR, SHADE SURF, SURFACE
Gleicher Effekt mit !VALUES.F NAN Linie wird unterbrochen y = FINDGEN(100) idx = [ 10,11,12,13 ] y[idx] = !VALUES.F_NAN PLOT,y,PSYM=0
97
Spezische Keywords fur CONTOUR FOLLOW=1 H henlinien-Verfahren mit Beschriftung o NLEVELS Anzahl H henlinien o LEVELS=[c1,c2,...] H henlinien bei c1,c2,... (NLEVELS=0) o /DOWNHILL Richtung durch Ticks ausgeben /OVERPLOT H henlinien ohne neuen Rahmen o /FILL gef llte Fl che, nicht bei Karten u a /CELL FILL Bei den Anwendungen missing data oder bei Kartenprojektionen ist dieses Keyword oft besser.
98
C Keywords fur CONTOUR sind oft Vektoren. Die Vektoren werden zyklisch wiederholt, wenn die Anzahl der H henlinien gr er sind o o 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
99
a=DIST(40) b=RANDOMU (SEED , 40, 40) F r das Beispiel wird ein Testdatensatz konstruiert. RANDOMU generiert Zufallszahu 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 che gelegt. Dabei bedeutet BYTSCL, da die Zufallszahlen auf den Bereich des a Zahlentyps BYTE, also 0B bis 255B bzw. bis zur maximal darstellbaren Zahl verteilt 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.
100
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 f r plau naren CONTOUR-Plot bei ZVALUE=1.0 benutzt wird.
oder
SHADE SURF,a,/SAVE Das Ergebnis ist nicht zufriedenstellend! Man sollte besser mit dem Z-Buffer, siehe Seite 75, arbeiten. CONTOUR,a,NLEVELS=10,THICK=2,/T3D,/OVERPLOT
10.4. 3D TRANSFORMATIONEN
101
10.4 3D Transformationen
Es gibt mehrere IDL Funktionen, die lediglich eine Transformationsmatrix aufbauen, ohne etwas zu zeichnen. Dazu geh ren: SURFACE, SURFR, SCALE3, T3D, SCALE3D, jeweils o mit dem Keyword /NODATA. Mit Hilfe der Transformationsmatrix kann man alle IDL Darstellungs-Funktionen im Raum benutzen.
102
10.4. 3D TRANSFORMATIONEN
103
Hinweis: POLYFILL und PLOTS kann auch im 3D verwendet werden, jeweils mit dem Keyword /T3D.
104
10.5 Karten-Projektionen
Sowohl niedrig als auch hoch aufgel ste Karten-Projektionen sind m glich. Die hoch aufo o gel sten Karten stammen aus dem CIA-World-Datensatz. Man kann die Karten sowohl o alleine darstellen als auch mit anderen Darstellungen (z.B. Text zur Beschriftung von St dten, CONTOUR f r Wetterkarte, Bev lkerungsdichte usw.) kombinieren. Hierbei wird a u o die Transformationsmatrix der entsprechenden Karten-Projektion verwendet.
10.5. KARTEN-PROJEKTIONEN
105
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 IMAGE MAP_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 durchgef hrt, um Kanten zu gl tten. u a 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.
106
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
107
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 Irregul re Daten werden trianguliert. Es werden Dreiecke berechnet, die f r eine a u Interpolation g nstig sind, (m glichst klein, nicht uberlappend). Siehe Online Help u o 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 regul ren Gitters (Interpolation) mit Gl ttung a a (interpolierte Z-Werte) grid=TRIGRID(x,y,z,tr,/QUINTIC) HELP,grid Standardm ig werden 51 Intervalle generiert. a SURFACE,grid
108
KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG Regul res Gitter mit feinerem Intervall a (optionales Argument zu TRIGRID) spacing=[0.01,0.01] grid=TRIGRID(x,y,z,tr,spacing) SHADE_SURF,grid
109
110
Ein zweites Beispiel zeigt die gerenderte Ober che. Zu dieser Darstellung wurde ein a Threshold-Value eingegeben und die Ober che gerendert. a
Hinweis: Das SLICER3-Programm kann auch in eigene Programme eingebaut werden. Informationen zur Benutzung des SLICER3-Programms erh lt man mit dem Abouta Icon im SLICER3-Men . u
111
CW ANIMATE Aufruf von unterschiedlichen Routinen zur Initialisierung, Laden und Ausf hrung u 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.
112
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 Koordiatensystem zur ckgegeben werden. u 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() Funktion und in einer Event-Handler Routine zu benutzen. Feststellen, welcher Knopf gedr ckt wurde u 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
113
OPLOT
114
10.11 IDL-Anwendungen
Im folgenden werden IDL Anwendungen vorgestellt. Diese IDL-Programme k nnen f r eigene Applikationen benutzt und ver ndert wero u a den. SHOW3,DIST(40) SHOW3 macht eine kombinierte Darstellung 2D Array wird als Kombination von Image-, Surface- und Contour-Bild dargestellt
Widget zum Laden einer vordenierten Farbtabelle Widget zum Laden, Andern und Erstellen einer Farbtabelle IDL Demo Funktionen zum Ausw hlen eines Fonts, z.B. mit tmp= a XFONT() Beschriftung eines Bildes Widget f r SURFACE u Uberlagerung eines Image-Bildes mit einem Contour-Bild Vergr ern und Verkleinern o Widget zur Darstellung eines 3D-Datensatzes (Schnitte, Iso Ober chen). Das SLICER3-Tool wird auf Seite 109 vorgestellt. a Windows: Polygonales Mesh Clipping
DECIMATE
115
Anzeige und intervakive Manipulation von 3D-Datens tzen und a ISO-Surfaces. 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 k nnen in dem Widget editiert werden. o
XVAREDIT
10.11.1 Ubungen:
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 206. o 1. Die Daten x,y sollen geplottet werden. ang = 2*!PI*INDGEN(360,/FLOAT)/359. x = COS(ang) y = SIN(ang) (a) (b) (c) (d) (e) ohne Achsen Achsen in Schwarz, Daten in Blau mit dem Kreuz als Symbol. Nur die positiven Y-Daten in Rot und die negativen in Blau zeichnen. Der Achsenursprung soll bei (0,0) liegen. Der Kreis soll als Kreis dargestellt werden. Der Durchmesser soll z.B. 10 cm betragen.
2.
(a) Zeichne gef llte H henlinien! Wie heit das Keyword? u o (b) Zeichne auf gef llte Fl chen H henlinien. u a o (c) Zeichne H henlinien f r die Werte 6,12.5, 18.7,24 mit jeweils einer andeo u 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 gef llt. u (d) die Randlinie soll in verschiedenen Farben f r 10 gleichm ig verteilte Level u a gezeichnet werden. ang = 2*!PI*INDGEN(360,/FLOAT)/359. x = COS(ang) y = SIN(ang)
116
Kapitel 11 Bildverarbeitung
Bilddaten k nnen mit IDL gelesen, analysiert und weiterverarbeitet werden. o
Das Kapitel Lesen und Schreiben von Dateien folgt auf Seite 127.
117
118
119
TV,im Das Bild wird mit TV angezeigt. Die Defaultposition ist die linke untere Ecke des graphischen Ausgabeger tes, a das Bild wird von unten nach oben dargestellt. TV,im,/ORDER Ver ndern der Zeilenordnung, Bild von oben nach unten a /ORDER uberschreibt den Defaultwert tempor r. a ERASE l scht die Zeichen che o a 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 erfolgt eine Streckung der Farben auf die gesamte Farbpalette. besser TVSCL,BYTSCL(im,TOP=!D.TABLE SIZE-1) Streckung auf verf gbare Farben, u effektiv mit zus tzlichen Keywords: MIN, MAX a
120
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
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 m chtiges Werkzeug zur Bildanalyse. Das Satelliten-Daten Auswerte-Programm ENVI a ist in IDL geschrieben.
122
Hinweis: Zur weiteren Verarbeitung gibt es die Routinen: WRITE BMP, WRITE JPEG, WRITE PNG, WRITE TIFF, (WRITE GIF)
11.6. BILDANALYSE
123
Das Beispiel verwendet eine BOX CURSOR Routine, damit man einen Bereich ausw hlen kann. Sobald der Bereich ausgew hlt wird, werden die Daten aus dem a a Bild img dazu verwendet, einen Grenzbereich zu bestimmen. Durch diese Schwelle THRESHOLD=[min,max] verhindert man, da Ausreier die Auswertung bestimmen. Die Routine REGION GROW gibt ein Index-Feld zur ck. Die dazugeh rigen Daten werden u o in der Farbe Rot eingef rbt. a
124
PRO bild_analyse DEVICE,DECOMPOSED=0 !P.color=255 !P.background=0 !ORDER=0 area=20.98*29.72
&
r[5]=255b &
g[5]=0b &
b[5]=0b
TV,img WHILE 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
11.6. BILDANALYSE
125
Falls das Beispiel beim ersten Mausklick kein Ergebnis liefert, erfolgt eine neue CursorAbfrage. Ein m gliches Ergebnis zeigt das nachfolgende Bild. o
126
Syntax:
OPENR,unit,filename Zuordnung einer Unitnummer zu der angegebenen Datei. Wird f r Ein- und Ausgaberoutinen ben tigt. u o Als unit sind die Unitnummern 1- 99 direkt w hlbar. a
Keywords: GET LUN Es wird automatisch eine freie Unitnummer ermittelt (100- 128)
APPEND Mit der Option APPEND ist es m glich, eine Datei zu erweitern. Die Daten werden o an das Ende der bestehenden Datei angef gt. u F77 UNFORMATTED F r unformatierte Fortran-Dateien u
127
128
Ermittlung einer Unitnummer mit GET LUN OPENR,unit,maroo bells.dat,/GET LUN FREE LUN,unit Alle Dateien schliessen CLOSE,/ALL o Auch mit GET LUN ge ffnete Dateien werden geschlossen
Hinweis: Bei mit GET LUN ge ffneten Dateien wird die Datei mit CLOSE zwar geschlossen, aber o der Counter bleibt auf der letzten ge ffneten Unitnummer stehen. Daher sollte man besser o FREE LUN zum Schlieen von Dateien verwenden, die mit GET LUN ge ffnet sind. Die o Datei wird geschlossen und die logische Unit Number (lun) wieder freigegeben.
129
Tabelle 12.2: Lesen und Schreiben von Daten: Lesen und Schreiben von Daten
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
130
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 zur ckgeben. u Nur eine Ubergabe call by reference kann einen Wert zur ckgeben, siehe auch Seite 144. u 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 werden.
131
double precision Integer scientic notation skip n character character data Float
132
133
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 Ober che zur Selektion eines Files wird ge ffnet a o
134
FILE WHICH
FSTAT
135
Aufruf vom IDL-Programm Das Programm READ ASCII ben tigt ein Template, welches man interaktiv erstellen o kann. Dieses Template kann man sichern und in einer neuen IDL-Sitzung mit RESTORE laden. Eine andere M glichkeit ist, die mit ASCII TEMPLATE erstellte Struktur im Proo 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 l uft nicht in Run-Time (execute). a Das Einlesen groer Dateien mit READ ASCII ist sehr langsam, da mit Formatangabe zeilenorientiert gelesen wird. Eine Array-orientierte Eingabe dagegen ist schneller.
136
data.field1 enth lt die Daten der 1. Spalte, a data.field2 enth lt die Daten der 2. Spalte, usw. a Kopfzeilen der Datei kann man f r die Dateneingabe mit dem Keyword DATA START u ignorieren. Mit der Option HEADER kann man den uberlesenen Text in einer ASCII-Datei abspeichern. Die Option HEADER funktioniert nur in Verbindung mit dem Keyword DATA START.
Tabelle 12.3: Lesen und Schreiben von Daten: Zusammenfassung von Lese- und Schreibroutinen
137
138
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. IDL-Programm ohne expliziten R ckgabewert. Kommunikatiu on mit anderen Routinen uber Argumente. Wie Prozedur, jedoch mit explizitem R ckgabewert. u Eine Funktion kann in einem Ausdruck verwendet werden.
Prozedur
Funktion
Textuelles Einf gen von IDL Statements ist m glich, siehe Batchverarbeitung auf Seite u o 140. Hinweis: Die Erstellung der Programme ist mit einem beliebigem Texteditor m glich. o
139
140
13.1 Batchverarbeitung
Eine Batch Datei (JOURNAL) enth lt ein oder mehrere IDL Befehle oder Statements. Bei a der Ausf hrung einer Batch Datei wird diese zeilenweise gelesen und direkt interpretiert. u Beispiel: Protokoll einer interaktiven Sitzung JOURNAL, Datei Start eines Protokolls JOURNAL beenden Die Textdatei mit Namen Datei enth lt alle eingegebenen Befehle. a Ein sp teres Editieren dieser Datei ist m glich. a o Mit dem Befehl @name kann man die Datei name interaktiv von der Kommandozeile als Batchdatei ablaufen lassen. Eine andere M glichkeit ist, @name in einem IDL-Programm einzuf gen. o u
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 zus tzlich der R ckgabewert angegeben. a u RETURN,wert Namensgebung: Main, Prozedur und Funktion haben die Extension .pro
141
Beide Parametertypen k nnen optional sein, siehe Online Help: mit [ ] gekennzeichnet o sind die optionalen Parameter.
142
143
Hauptprogramm Der Name kann willk rlich gew hlt werden. u a Beispiel: sample_hauptprogramm.pro a=1 & b=FINDGEN(100) & HELP,a,b END Aufruf: .run sample_hauptprogramm Prozedur Den Namen so w hlen wie die Bezeichnung, die auf .pro endet a Beispiel: sample prozedur.pro PRO sample prozedur,title=title PLOT,FINDGEN(100),TITLE=title END Aufruf: sample prozedur,title=test Funktion Den Namen so w hlen wie die Bezeichnung, die auf .pro endet a Beispiel: sample function.pro FUNCTION sample function,faktor a=RANDOMU(SEED,10) ; 10 Zufallszahlen RETURN,a*faktor END Aufruf: ergebnis=sample function(5.)
144
by value bedeutet: Diese Werte sind Eingabewerte. Uber diese Werte k nnen keine o R ckgaben erfolgen u ergebnis=sample func(5.) ergebnis=sample func(a[6])
Variablen werden by reference ubergeben. by reference bedeutet: Diese Variablen sind Eingabewerte. Uber diese Werte k nnen o R ckgaben erfolgen. Wenn diese Variablen im Unterprogramm ver ndert werden, u a mu man beachten, da die ver nderten Werte zur ckgegeben werden. Um das zu a u verhindern, mu im Unterprogramm mit einer Kopie der Variablen gearbeitet werden. value=5. ergebnis=sample func(value) arr=MAKE ARRAY(5,5,/INT,VALUE=5) ergebnis=sample func(arr)
145
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
146
147
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 M glichkeit, diesen Konikt zu o beheben. Dadurch wird in der Routine deniert, da das Argument mit dem gleichlautenden Namen in einem Funktions- hnlichem Aufruf auf jedem Fall als Funktion von IDL a 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
148
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.
13.11. KONTROLL-STATEMENTS
149
13.11 Kontroll-Statements
Wie in jeder Script-Sprache gibt es auch in IDL Denitionen, die eine strukturierte Programmierung erlauben. Das Format solcher Anweisungen unterscheidet sich zwischen Script-Sprachen. IDL spezisch ist, da Bl cke mit BEGIN, IF, CASE, FOR usw. beginnen. Die jeweio ligen Endstatements spezizieren 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 gepr ft. Falls die Bedingung erf llt ist, wird der u u BEGIN-Block ausgef hrt. Wahlweise kann ein Block f r die Behandlung erfolgen, sobald u u die Bedingung nicht erf llt ist. u IF (true) THEN BEGIN ...... ENDIF [ ELSE BEGIN ...... ENDELSE] Falls nur ein Statement ausgef hrt wird, kann man den IF-Fall auch in eine Zeile schreiu ben. IF A THEN B=1 ELSE BEGIN C=2 & D=4 ENDELSE
In beiden F llen wird gepr ft, ob der Ausduck (a EQ b) G ltigkeit hat. Bei Gleichheit a u u wird c=a gesetzt, sonst c=0.
150
Die Variable test wird getestet. Im Beispiel werden die F lle test=0, test=1, a test=2 behandelt. F r test=0 wird ein PRINT ausgef hrt und f r test=1 wird der u u u BEGIN-Block ausgef hrt. F r test=2 werden andere beliebige Anweisungen ausgef hrt. u u u Falls test keinen der Werte 0, 1 oder 2 hat, gilt das was bei der ELSE-Anweisung programmiert 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: abgearbeitet 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
Die FOR-Schleife wird f r die Werte I=1,... bis N durchlaufen. u FOR I=1,N DO BEGIN ...... ENDFOR Die FOR-Schleife wird f r die Werte I=N,... bis -5 mit dem Inkrement -1 durchlaufen u FOR I=N,-5,-1 DO BEGIN ...... ENDFOR
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 erh ht. o FOR X=0.,1.,0.1 DO BEGIN ; Inkrement 0.1 ; ... ENDFOR Diese Schleife l uft ab 0. mit dem Inkrement 0.1, also f r die Werte a u 0.,0.1,0.2,...,1.0
Die WHILE-Schleife wird ausgef hrt, solange die Bedingung (A LT B) erf llt ist. Die u u Bedingung wird am Schleifenanfang getestet. A=1 B=10 WHILE ( A LT B ) DO A=A*2 ; Ergebnis: A=16 Diese WHILE-Schleife wird ausgef hrt, solange die Bedingung (NOT EOF(1)) erf llt u u 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 ausgef hrt, bis die Bedingung (A GT B) erf llt ist. u u 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
152
Anzahl der positionalen Parameter Keywordparameter nicht ber cksichtigt u number=N_PARAMS() Ist ein Keywordparameter gesetzt? defined=KEYWORD_SET(variable) dened=1 (true) bzw. dened=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 undeniert: 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 f r Positional- und Keywordparameter u
13.13. BEISPIEL
153
13.13 Beispiel
Das Programm zeigt die Uberpr fung der aktuellen Aufrufparameter einer Funktion. Mit u N PARAMS ermittelt man die Anzahl der positionalen Parameter. N ELEMENTS hat den Wert 0, wenn kein Wert vorliegt. Mit KEYWORD SET uberpr ft man, ob eine Keyword u Variable TRUE oder FALSE deniert 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=P2 indep=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,5 PLOT,indep,dep,/Nodata OPLOT,indep,dep,COLOR=color,PSYM=psym END Beispiel 13.3: Programmierung und Kompilation: Uberpr fung der Parameter u
M gliche Aufrufe: o a=INDGEN(100,/FLOAT) & curve=SIN(a/5)/EXP(a/50) time=INDGEN(100,/FLOAT)*6./99 PLOT_IT,curve PLOT_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 KeywordVariablen, w hrend yes der Wert der Keyword-Variablen ist. a
154
155
Hinweis: Nur im ersten Programm PRO A einen Commonblock denieren, 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 Men Run u Reset (ohne idlde-Umgebung zu verlassen)
156
Mit EXECUTE(string) kann man w hrend der Programmausf hrung IDLa u Statements kompilieren und ausf hren. Man kann z.B. w hrend der Laufzeit neue u a 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 k nnen Parameter an kompilierte o Routinen ubergeben werden. result=CALL_PROCEDURE(PLOT,para1, para2,...) Schneller als EXECUTE!
13.17. UBUNGEN
157
13.17 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 208. o 1. Ubung mit KEYWORD SET, ARG PRESENT und N ELEMENTS
Ubung mit KEYWORDS Die unten stehende Tabelle kann als Ubung ausgef llt werden! u FUNCTION test1,minimum=min_val IF KEYWORD_SET(min_val) THEN RETURN,1 ELSE RETURN,0 END FUNCTION test2,minimum=min_val IF 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) | | | _______________________________________________________
158
KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION Ubung mit positionalen Parametern Die unten stehende Tabelle kann als Ubung ausgef llt werden! u
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 Ober che (SHADE SURF) zeicha net und mit einer Gitterlinie (SURFACE) ubermalt (/OVER). Zeichne einen H henlinienplot ganz oben ins Bild (Z=1) und w hle einen Farbindex o a f r die Gitterlinie und den H henlinienplot. u o Folgende Denition der Prozedur mysurface soll gelten: PRO mysurface,data,xgrid,ygrid,CONT=cont,COLOR=col
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 ge nder a tem Typ zur ckgegeben werden. u result=my_type(var1,var2)
4. Schreibe eine Funktion, die ein Zeichen in einem Text ersetzen kann, z.B. das Zeichen 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 Zahlencode 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 Tastendr cke soll der Vorschlag verbessert werden. Mit der Taste 0 u wird zwischen m glichen Worten ausgew hlt. Mit der Taste # wird der Vorschlag o a 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 bet tigt, bis AN vorgeschlagen wird Die Eingabe wird mit a # beendet. Kann kein passendes Wort vorgeschlagen werden, soll in den Eingabemodus des ersten Programms gewechselt werden, um den Wortschatz zu vergr ern. o
160
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 Ausf hrung von Programmen. W hrend der Laufzeit kann man u a den Programmablauf kontrollieren und Anderungen von Variablen anzeigen. Die Ausf hrung der Debug-Befehle sind im Kapitel Beschreibung der Applikationen u siehe Seite 10 beschrieben.
Vorgehen bei der Fehlersuche In der Regel geht man bei der Fehlersuche in der Entwicklungsober che idlde wie folgt a vor. In der Kommando-Umgebung zu IDL ist das Vorgehen ahnlich. 1. An eine geeignete Stelle, die vor einem m glichen Fehler liegen sollte, setzt man o einen Breakpoint. Ein Breakpoint wird durch Ausw hlen einer Zeile mit dem Befehl a Set Breakpoint aus dem Men RUN gesetzt. u 2. Das Programm wird gestartet. Es h lt am Breakpoint an. Alle in diesem Script dea nierten Variablen vor dem Breakpoint sind jetzt bekannt und werden im VariablenWatch-Window angezeigt. 3. Die Variablen werden auf ihre Richtigkeit uberpr ft. Evtl. sieht man daran schon, u was falsch ist. 4. Mit dem Kommando Step aus dem RUN Men ist eine schrittweise Ausf hrung u u weiterer Befehlszeilen m glich. Man sieht an Hand der Variablen, was das Proo gramm macht. Durch das st ndige Uberpr fen der Variablen und das Wiederholen a u dieses Schrittes ndet man schlielich den Fehler. 5. Die Anweisungen werden verbessert bzw. erg nzt und der Fehlertest wird noch mal a wiederholt.
161
162
Kapitel 15 Programmanalyse
Wenn die Ausf hrungszeit eines Programmes langsamer ist als man erwartet, kann man u dies mit dem Proler analysieren. Er erlaubt eine Analyse eines Programmes und aller aufgerufenen Unterprogramme. PROFILER Dieses Programm erm glicht eine Performance-Analyse der Anwendung mittels Monitoo 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 FINDGEN FLTARR N_ELEMENTS ON_ERROR SQRT TV Type Count (S) 1 (S) 1 (S) 1 (S) 1 (S) 251 (S) 1 Only(s) 0.000239 0.010171 0.000104 0.000178 0.099001 2.030000 Avg.(s) 0.000239 0.010171 0.000104 0.000178 0.000394 2.030000 Time(s) 0.000239 0.010171 0.000104 0.000178 0.099001 2.030000
163
164
Bei einem Fehler im Unterprogramm bleibt das Programm stehen und kehrt nicht in das aufrufende Programm zur ck. Damit ist der Zugriff auf die Variablen des u Unterprogramms beschr nkt. a Der Befehl RETALL bewirkt, da zur Aufruf-Ebene zur ck verzweigt wird (oberste u Ebene). Der Befehl RETURN [, wert] bewirkt da IDL einen Wert an das anrufende Programm zur ckgibt (eine Ebene). u Reset bei idlde: STOP im Run-Men u Als Befehl: .RESET SESSION, bzw. .FULL RESET SESSION Bei unerkl rlichen Fehlern: a IDL mit exit verlassen und neu starten
165
166
167
ON IOERROR,label Mit ON IOERROR kann ein IO-Error abgefangen werden. Das Prgramm verzweigt zu dem angegebenen label. Dieser Befehl hat eine h here Priorit t als CATCH. o a ON ERROR,1 bei Fehler R cksprung zum IDL-Main-Level (veraltet, besser CATCH) u CATCH,error status genereller Mechanismus zur Fehlerbehandlung Keine Behandlung mathematischer Fehler! CATCH Prozedur als Batch File einf gen (kein end!) u 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 ausgef hrt. u Falls kein CATCH vorhanden wird nach ON ERROR gesucht. mit CATCH,/CANCEL wird der aktuelle CATCH-Mechanismus aufgehoben. Damit ist es m glich, weitere Fehler mit diesem CATCH-Mechanismus zu beo arbeiten.
168
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 daf r, da ein weiterer u Fehler in der gleichen Art und Weise behandelt werden kann, ist das der CATCHMechanismus mit dem Befehl CATCH,/CANCEL zur ckgesetzt wird. In err test2 u passiert ein weiterer Fehler. Das Programm f ngt diesen Fehler auch ab. a
169
170
Kapitel 17 Widgets
Ein Widget stellt eine graphische Bedienober che dar. Es dient damit der Kommunikation a zwischen einem Benutzer und einem Programm. Durch verschiedene Komponenten, wie Schalter und Anzeigen kann der Benutzer mit dem darunter liegenden Programm kommunizieren und den Ablauf beeinussen. Im folgenden wird die Erstellung einer graphischen Bedienober che beschrieben. a
171
172
WIDGET BUTTON WIDGET TEXT WIDGET DRAW WIDGET TABLE WIDGET SLIDER WIDGET LABEL WIDGET LIST WIDGET DROPLIST
173
174
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 but2 but3 but4 but1 but2 but3 but4 but1 but2 but3 but4 but5 but6 but1 but2 but3 but4 = = = = = = = = = = = = = = = = = = WIDGET_BUTTON(base1, WIDGET_BUTTON(base1, WIDGET_BUTTON(base1, WIDGET_BUTTON(base1, WIDGET_BUTTON(base2, WIDGET_BUTTON(base2, WIDGET_BUTTON(base2, WIDGET_BUTTON(base2, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base4, WIDGET_BUTTON(base4, WIDGET_BUTTON(base4, WIDGET_BUTTON(base4, VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE = = = = = = = = = = = = = = = = = = B1 B1 B1 B1 B2 B2 B2 B2 B3 B3 B3 B3 B3 B3 B4 B4 B4 B4 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, UNAME=B1 UNAME=B1 UNAME=B1 UNAME=B1 UNAME=B2 UNAME=B2 UNAME=B2 UNAME=B2 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B4 UNAME=B4 UNAME=B4 UNAME=B4 1) 2) 3) 4) 1) 2) 3) 4) 1) 2) 3) 4) 5) 6) 1) 2) 3) 4)
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 Identikation des Buttons.
175
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 Ober che gestartet a WIDGET_CONTROL, w_id, /DESTROY Mit dem Keyword /DESTROY zerst rt man das Widget-Element und alle abh ngigen Eleo a mente
176
177
In dem Beispiel wird eine Main-Base eingerichtet. Die Widgets, die angelegt werden, sind Kn pfe mit den Beschriftungen HELLO und GOODBY. Die Ausrichtung der Kn pfe o o ist spaltenweise. Wie in den obigen Beispielen, wird keine Gr enangabe gemacht. Man o uberl t es IDL, die Buttons anzulegen. a Diese denierte Anordnung der Widgets wird durch den WIDGET CONTROL Befehl mit dem Keyword /REALIZE realisiert.
178
F r die Event-Handler Routine gelten ein paar formale Regeln, die im folgenden beschrieu 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 f r die Abarbeitung u 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 gedr ckten u Knopfes. Dadurch ist die eindeutige Identikation gegeben. Dieser Name steht dann bei der CASE-Anweisung vor dem Doppelpunkt und kann entsprechend verarbeitet werden. Wird der Knopf mit der Beschriftung HELLO gedr ckt, wird der String Hi, hello there u ! ausgegeben. Wird dagegen der Knopf mit der Beschriftung GOODBY gedr ckt, wird u der String See you later ! ausgegeben und das Widget wird beendet.
Hinweis: Der Befehl WIDGET CONTROL,event.top,/DESTROY zeigt, wie man in der EventRoutine das Programm sauber verlasssen kann, indem man die ID des Top-Level Widgets und das Keyword DESTROY angibt.
179
ID, TOP und HANDLER sind in allen Events enthalten. Die einzelnen Wigetfunktionen geben zus tzliche Informationen zur ck, s.o Beispiel WIDGET BUTTON gibt SELECT a u zur ck. u
180
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
181
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
182
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 wid2 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,SET_UVALUE=id_text XMANAGER,wid2,id_base END Beispiel 17.6: Widgets: wid2
183
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: ENDCASE END 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_base END Beispiel 17.7: Widgets: wid3
184
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
185
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
186
187
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 Anzeige 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 cw
188
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 BEGIN value.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 ENDIF RETURN, { 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=value RETURN,child_base END Beispiel 17.11: Widgets: Compound Widgets, cw switch
189
Ein Compound Widget ben tigt im Gegensatz zu einem normalen Widget drei Mechaniso men 1. einen Event Handler f r sich selbst u 2. eine Funktion zum Auslesen des Values innerhalb des Compound Widget 3. eine Prozedur zum Setzen des Values innerhalb des Compound Widget Damit das Compound Widget auch selber Kenntnis von diesen zus tzlichen Routinen hat, a mu es dem Compound Widget in der Denition bekannt gegeben werden. Dies erfolgt in der Denition 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 und PRO SET VALUE werden Zugriffe auf die Widget Elemente des Compound Widget in bestimmte Funktionen umgeleitet. Der Event Handler cw switch event wird f r die Abarbeitung der events u 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 deniert ist. Sobald man das VALUE von dem Widget liest (GET VALUE) wird cw switch get value verwendet, das durch FUNC GET VALUE deniert ist.
Hinweis: In der IDL-Bibliothek gibt es eine Vorlage (cw tmpl.pro), die zur Erstellung von Compound Widgets verwendet werden kann.
190
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
192
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 BYTEORDER Kommando
193
abh ngig vom Betriebssytem a 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 image entry p1 long integer (default) oder andere Typen Name der shared object library, volle Pfadangabe notwendig! entry point zu image (Name des Programms) plattformspezisch: f hrende, abschlieende Underscores u 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 w re, da das IDL Programm simultan die Ergebnisse eines Fortran Proa gramms zeigt, z.B. mit Zufallszahlen erzeugte Punkte.
194
Anhang A Informationen
A.1 Informationen zu IDL
Der Dokumentationssatz zu IDL umfat folgende B cher: u
Getting started with IDL Ubersicht uber alle Anwendungsbereiche fr her: IDL Basics: kurzes Tutorial u Using IDL einschlielich 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 Auistung aller IDL-Funktionen IDL External Development Guide callable IDL, Linkimage, Call External Whats new in IDL 5.1 ( 5.2 / 5.3 / 5.4 / 5.5)
195
196
ANHANG A. INFORMATIONEN
Demoprogramm Ohne Lizenz lauff hig ist das Script idldemo. a Falls das Kommando-Interface zu IDL bzw. die Ober che idlde gestartet ist, a 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
197
Jul-Bericht
ICG Library
zamsoft
198
ANHANG A. INFORMATIONEN
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 American religious iconography provides eclectic view of the essentials 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 Programming, 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 efcient. The example programs in the book demonstrate key concepts and provide functionality 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 experience. ISBN/ISSN: 1558607005 Application Development with IDL Author: Ronn L. Kling Summary: (From the amazon.com book description) This book is written for scientists, engineers and programmers who want to combine their analytical techniques with widget interfaces. In the past we were restricted to writing procedural programs that read namelists, les, 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 productivity 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
200
ANHANG A. INFORMATIONEN
Calling C from IDL - Using DLMs 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 modications. Nearly 1000 lines of source code are provided on the accompanying disk with a makele for all UNIX platforms, com le 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 oppy or CD ISBN: 0967127025
Anhang B L sungen o
B.1 L sungen zu Kapitel: Datenstrukturen o
Die zugeh rigen Ubungen ndet man auf Seite 47. o 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
202
ANHANG B. LOSUNGEN
5. x=CREATE_STRUCT(D,!D,P,!P,X,!X,Y,!Y)
9. a=MAKE_ARRAY(/INDEX,10,2) HELP,TRANSPOSE(a)
203
2. a = [ 7 , 8 , 1 , 2 , 5 , 5 ] b = [ 0 , 5 , 3 , 4 ] PRINT, a[b] 7 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
ANHANG B. LOSUNGEN
205
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.NAME SET_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
206
ANHANG B. LOSUNGEN
1. L sung o position=[0.1,0.1, 0.5,0.5] WINDOW,xsize=480,ysize=480 PLOT,x,y,position=position 2.L sung, Papier ist nicht quadratisch. o 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
B.4. LOSUNGEN ZU KAPITEL: PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG 2. CONTOUR, a, NLEVLES=15,/FILL} CONTOUR, a, NLEVLES=15,/FOLLOW,/OVER}
207
VALUES=[6,12.5,18.7,24] CONTOUR,a,LEVELS=values,/FOLLOW,C_Color=BINDGEN(4)*50+50}
208
ANHANG B. LOSUNGEN
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 ____________________________________________________
B.5. LOSUNGEN ZU KAPITEL: PROGRAMMIERUNG UND KOMPILATION 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
209
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: BEGIN SHADE_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
ANHANG B. LOSUNGEN
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 BEGIN READ,key
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,wort RETURN 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: ,result END 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 BEGIN text=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]}
212
data=BYTE(text)
ANHANG B. LOSUNGEN
n=N_ELEMENTS(data) FOR i=0,n-1 DO BEGIN x=0 count=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=append PRINTF,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
Index
EXTRA, 154 3D Transformationen, 101 64-bit Long, 24 64-bit unsigned Long, 24 ALLOCATE HEAP, 40 ANNOTATE, 114 APPEND, 127 ARG PRESENT, 152 Array, 26 Arrayindizierung, 28 ASSOC, 132 Ausf hrbare Kommandos u .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, 149 BOX CURSOR, 123 BREAKPOINT, 13 by reference, 144 by value, 144 Byte, 24 BYTSCL, 119 CALL EXTERNAL, 191 CASE, 150 CATCH, 167, 168 CD, 17 CLOSE, 128 213 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, 112 CW Base, 189 CW ANIMATE, 111 cw tmpl, 189 DATA, 65 debug, 161 DECIMATE, 114 DEFINT32, 54 DEFSYSV, 22 DELVAR, 52 DEMO, 114 DEVICE, 65, 69, 74, 77 DIALOG MESSAGE, 168 DIALOG PICKFILE, 133 Double Complex, 24 Doubleprecision, 24 Drucken, 77 Einstellungen, 3 ELSE, 149 emacs, 8 EOF, 133 ERASE, 83, 113, 120 EVENT FUNC, 189 EXECUTE, 156 exit, 11 F77 UNFORMATTED, 127 Fehlerbalken, 91 Fehlersuche, 161 FFT, 121 FILE CHMOD, 134 FILE DELETE, 134
214 FILE EXPAND PATH, 134 FILE MKDIR, 134 FILE SEARCH, 133, 134 FILE TEST, 134 FILE WHICH, 134 Floatingpoint, 24 FLTARR, 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, 11 idl -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, 191 LOADCT, 68 Long, 24 MAKE ARRAY, 26, 27, 41 MAKE ARRRAY, 32 MAP CONTINENTS, 104 MAP GRID, 104 MAP IMAGE, 105 MAP SET, 104106 MAX, 55 MEDIAN, 121 MESSAGE, 169 MIN, 55 missing values, 96 MODIFYCT, 68
INDEX
N ELEMENTS, 152 N PARAMS, 152 N TAGS, 37 Namenskonvention fur Variablen, 23 NODATA, 83 NOERASE, 83, 85 NORMAL, 65 Nullpointer, 38 ON ERROR, 167 ON IOERROR, 167 Online 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, 49 OPLOT, 85, 86, 113
INDEX Optimierung der Laufzeit eines IDLProgrammes, 53, 54 OVERPLLOT, 83 Parameter Keyword, 19 Positional, 19 PLOT, 18, 8486, 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, 40 PTR VALID, 39, 41, 44 PTRARR, 39 RANDOMU, 99 READ ASCII, 135, 136 READ BINARY, 136 READ IMAGE, 136 READF, 129131 READS, 31, 32 READU, 129, 132 REBIN, 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, 165 RGB, 69 Runtime, 14
215
SAVE, 14, 38, 62, 135, 186 SAVE,/ROUTINES, 14 SCALE3, 103, 108 Scatter-Plot mit Zufallszahlen, 92 Set 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, 121 SORT, 55 SPAWN, 60, 191, 192 Spezikation, 23 SQL, 1 Start-Up, 3 Step, 161 STRCOMPRESS, 31 STRICTARR, 54 STRING, 31 String, 24 Strings, 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
216 !PATH, 17, 21 !PI, 21 !QUIET, 20 !RADEG, 21 !VERSION, 21 T3D Keyword, 100102 T3D Prozedur, 103 TAG NAMES, 37 TEK COLOR, 68, 69 TEMPORARY, 51, 52 TRANSPOSE, 29 TRIANGULATE, 107 TRIGRID, 107 TV, 105, 108, 119121 TVCRS, 112 TVLCT, 68 TVRD, 121 TVSCL, 118, 119, 121 Typ, 23 UNIQ, 56 Unsigned Integer, 24 Unsigned Long, 24 USERSYM, 113 Waveletts, 1 WDELETE, 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, 172 WIDGET 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, 114 XINTERANIMATE, 111 XLOADCT, 68, 114 XMANAGER, 175, 176, 186 XPALETTE, 68, 114 XREGISTERED, 176 XSURFACE, 114 XVAREDIT, 114 XVOLUME, 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
INDEX
BHB-0145 BHB-0146 BHB-0147 BHB-0148 BHB-0149 BHB-0150 BHB-0152 BHB-0153 BHB-0154 BHB-0155 BHB-0156 BHB-0157 BHB-0158 BHB-0159 BHB-0160 BHB-0161 BHB-0162 BHB-0167
Gsharp - Reference Guide, Part 1 Gsharp - Reference Guide, Part 2 GIMP - Das ofzielle Benutzerhandbuch, Teil 1 GIMP - Das ofzielle Benutzerhandbuch, Teil 2 GIMP - Das ofzielle Benutzerhandbuch, Teil 3 Windows NT V4.0 Workstation - ein Installationsprotokoll Introduction To Scilab - Users Guide Vampir 2.0 - Users Manual Programming in C++ - Part I Programming in C++ - Part II NWChem User Documentation Perl5.005 Handbuch (Teil I) Perl5.005 Handbuch (Teil II) DDD - Data Display Debugger SSH-WIN PC-Benutzerhandbuch Grace - ein graphisches Analyse-Tool f r 2D Daten u MOLMOL Manual Eine Einf hrung in Scilab u