In diesem Kapitel sind einige typische ICS Konfigurationsbeispiele enthalten. Die Beispiele sollen die im letzten Kapitel vorgestellten Konzepte an einigen konkreten Problemstellungen veranschaulichen. Die Beispiele sind nach aufsteigender Komplexität geordnet und der Skriptcode ist jeweils vollständig und direkt mit ICS ausführbar.
Die einfachsten ICS Konfigurationen benutzen nur einen Inputmodul, sind also gar keine Schnittstellen (mit Input- und Outputmodul) im eigentlichen Sinn. Trotzdem können solche Konfigurationen sehr nützlich sein. Beispiele für Konfigurationen mit nur einem Inputmodul sind:
Anzeigekonfigurationen, welche alle Daten (oder einen Teil der Daten) eines Inputmoduls anzeigen.
Statistikkonfigurationen, welche eine Statistik aus den Daten des Inputmoduls erzeugen.
Checkerkonfigurationen, welche Fehler in dem Datensatz anzeigen.
Der nachfolgende Skript kann den Inhalt einer beliebigen INTERLIS 1 .itf Datei in der .log Datei ausgeben. Das kann z.B. nützlich sein, um zu verstehen, welche Objekte vom ILIN Modul von einem konkreten Datensatz geliefert werden.
!============================================================================! ! ! ! INTERLIS 1 Display Configuration Vers. 1.5 ! ! ! !============================================================================! !<1> |LICENSE \license\iltoolspro.lic |LICENSE \license\iltools.lic |LICENSE \license\il2il.lic !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! user input ! !<2> MAP USER_INPUT1 DIALOG => FILE ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .itf input file' FILE_EXISTS => TRUE FILE_FILTER => itf OPT => input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for intput modules ! !<3> MAP ILIN_PARAM INTERLIS_DEF => '' ! will be set from .itf file LOG_TABLE => OFF TRACE => OFF DEBUG => OFF ENUM_TO_TEXT => ON STATISTICS => ON END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! input sources ! !<4> MAP INPUT_SOURCES I1 => ILIN,OPT.input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! classification ! !<5> MAP INOUT I1 => DISPLAY_OBJECT1,IN END_MAP !<6> |INCL \script\util.lib |INCL \script\ilin.mod |INCL \script\run1.prg
Erläuterungen zum Beispiel:
Mit der Direktive |LICENSE werden die
möglichen Lizenzdateien angegeben, mit welchen der Skript
ausgeführt werden kann. Werden diese Einträge vergessen, wird
der Skript zur Laufzeit mit einer entsprechenden Fehlermeldung
abgebrochen (no license found for
...).
Der Skript fragt vom Benutzer den Dateinamen der
Inputdatei ab. Damit nur bestehende .itf Dateien ausgewählt
werden können wird FILE_EXISTS => TRUE
und FILE_FILTER => itf gesetzt. Der
abgefragte Wert wird in OPT.input
gespeichert (wegen OPT => input).
Für das Lesen der .itf Datei wird der Modul
ILIN benötigt. Dieser verlangt die Übergabe
der notwendigen Parameter in der Map
ILIN_PARAM. Mit der Angabe
INTERLIS_DEF => '' wird z.B. verlangt,
dass das INTERLIS 1 Modell aus der .itf Inputdatei bestimmt
werden soll.
In der Map INPUT_SOURCES werden die
Inputquellen festgelegt. Im Fall der Anzeigekonfiguration gibt
es nur eine Inputquelle I1 welche ihre Daten
vom Inputmodul ILIN aus der Datei
OPT.input bezieht.
Der Verarbeitungsablauf wird schliesslich in der Map
INOUT festgelegt. In diesem Beispiel werden
alle von der Inputquelle I1 gelesenen
Objekte über die Prozedur DISPLAY_OBJECT1
aus util.lib in die Logdatei
(normalerweise \data\temp\ics.log)
ausgegeben.
Alle benutzten Module und Bibliotheken müssen über
|INCL Direktiven eingebunden werden. In
diesem Fall sind das \script\util.lib (wegen
DISPLAY_OBJECT1),
\script\ilin.mod (wegen INTERLIS 1 Input)
und \script\run1.prg welches in jede
RUN1 Konfiguration direkt oder indirekt
eingebunden werden muss.
Das folgende Script gibt eine Statistik über alle Layer einer .dxf Datei aus. Pro Layer werden die Anzahl Objekte gezählt und am Schluss der .log Datei ausgegeben.
!============================================================================! ! ! ! DXF Statistic Configuration Vers. 1.0 ! ! ! !============================================================================! !<1> |LICENSE \license\iltoolspro.lic |LICENSE \license\iltools.lic |LICENSE \license\dxf2il.lic !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! user input ! !<2> MAP USER_INPUT1 DIALOG => FILE ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .dxf input file' FILE_EXISTS => TRUE FILE_FILTER => dxf OPT => input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for intput modules ! !<3> MAP DXFIN_PARAM END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! input sources ! !<4> MAP INPUT_SOURCES I1 => DXFIN,OPT.input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! classification ! !<5> MAP INOUT I1 => SAVE_LAYER0 END_MAP !<6> |INCL \script\util.lib |INCL \script\dxfin.mod |INCL \script\dxf2il\stat.out |INCL \script\run1.prg
!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
! user defined procedures
!
MAP LAYER_OBJECTS
END_MAP
!<7>
PROCEDURE SAVE_LAYER0
IF IN.LAYER LAYER_OBJECTS IS_NULL THEN
&LAYER_OBJECTS IN.LAYER 1 MAPINS
ELSE
&LAYER_OBJECTS IN.LAYER IN.LAYER LAYER_OBJECTS INC MAPINS
END_IF
END_PROCEDURE
!<8>
PROCEDURE PRE_SOURCE_I1
0 SET_NULL => LAYER_OBJECTS.DEFAULT
END_PROCEDURE
!<9>
PROCEDURE POST_SOURCE_I1
DISPLAY ''
DISPLAY 'number of objects per layer'
DISPLAY '==========================='
DISPLAY ''
&LAYER_OBJECTS MAPRESET
WHILE &LAYER_OBJECTS MAPSCAN DO
DISPLAY $,' ',$
END_WHILE
END_PROCEDUREErläuterungen zum Beispiel:
Mit der Direktive |LICENSE werden die
möglichen Lizenzdateien angegeben, mit welchen der Skript
ausgeführt werden kann. Werden diese Einträge vergessen, wird
der Skript zur Laufzeit mit einer entsprechenden Fehlermeldung
abgebrochen (no license found for
...).
Der Skript fragt vom Benutzer den Dateinamen der
Inputdatei ab. Damit nur bestehenden .dxf Dateien ausgewählt
werden können wird FILE_EXISTS => TRUE
und FILE_FILTER => dxf gesetzt. Der
abgefragte Wert wird in OPT.input abgelegt
(wegen OPT => input).
Für das Lesen der .dxf Datei wird der
Modul DXFIN benötigt. Dieser verlangt die
Übergabe der notwendigen Parameter in der Map
DXFIN_PARAM. In diesem Beispiel müssen zwar
keine konkreten Parameter gesetzt werden, die Map muss aber
trotzdem vorhanden sein.
In der Map INPUT_SOURCES werden die
Inputquellen festgelegt. Im Fall der Checkerkonfiguration gibt
es nur eine Inputquelle I1 welche ihre Daten
vom Inputmodul DXFIN aus der Datei
OPT.input bezieht.
Der Verarbeitungsablauf wird schliesslich in der Map
INOUT festgelegt. In diesem Beispiel werden
alle von der Inputquelle I1 gelesenen
Objekte über die Benutzerprozedur
SAVE_LAYER0 aus stat.out
in einer Benutzermap zwischengespeichert.
Alle benutzten Module und Bibliotheken müssen über
|INCL Direktiven eingebunden werden. In
diesem Fall sind das \script\util.lib (wegen
DISPLAY_OBJECT1),
\script\dxfin.mod (wegen DXF Input), die
Benutzerdefinierte .out Datei
\script\dxf2il\stat.out (wegen der
Benutzerprozedur SAVE_LAYER0) und
\script\run1.prg welches in jede
RUN1 Konfiguration direkt oder indirekt
eingebunden werden muss.
Die Prozedur SAVE_LAYER0 speichert die
Anzahl Objekte pro Layer in der Map
LAYER_OBJECTS.
Die Map LAYER_OBJECTS wird durch die
Triggerprozedur PRE_SOURCE_I1 am Anfang des
Skripts initialisiert.
Am Schluss des Skripts wird der Inhalt der Map
LAYER_OBJECTS durch die Triggerprozedur
POST_SOURCE_I1 in die
.log Datei ausgegeben.
Das folgende Beispiel prüft, ob in einer DXF Datei nur
bestimmte Layer vorkommen. Layer welche nicht in der Map
KNOWN_LAYERS eingetragen sind, werden als Fehler
gemeldet. Nachfolgend ist die .cfg und die .out Datei
dargestellt:
!============================================================================! ! ! ! DXF Check Configuration Vers. 1.0 ! ! ! !============================================================================! !<1> |LICENSE \license\iltoolspro.lic |LICENSE \license\iltools.lic |LICENSE \license\dxf2il.lic !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! user input ! !<2> MAP USER_INPUT1 DIALOG => FILE ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .dxf input file' FILE_EXISTS => TRUE FILE_FILTER => dxf OPT => input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for intput modules ! !<3> MAP DXFIN_PARAM END_MAP !<4> MAP KNOWN_LAYERS ! layer => KNOWN | UNKNOWN 01121 => KNOWN DEFAULT => UNKNOWN END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! input sources ! !<5> MAP INPUT_SOURCES I1 => DXFIN,OPT.input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! classification ! !<6> MAP INOUT I1 => CHECK_LAYER0 END_MAP |INCL \script\dxfin.mod |INCL \script\dxf2il\check.out |INCL \script\run1.prg
!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
! user defined procedures
!
!<7>
PROCEDURE CHECK_LAYER0
IF IN.LAYER KNOWN_LAYERS = 'UNKNOWN' THEN
ERROR 'unknown DXF layer ',IN.LAYER
END_IF
END_PROCEDUREErläuterungen zum Beispiel:
Mit der Direktive |LICENSE werden die
möglichen Lizenzdateien angegeben, mit welchen der Skript
ausgeführt werden kann. Werden diese Einträge vergessen, wird
der Skript zur Laufzeit mit einer entsprechenden Fehlermeldung
abgebrochen (no license found for
...).
Der Skript fragt vom Benutzer den Dateinamen der
Inputdatei ab. Damit nur bestehende .dxf Dateien ausgewählt
werden können wird FILE_EXISTS => TRUE
und FILE_FILTER => dxf gesetzt. Der
abgefragte Wert wird in OPT.input abgelegt
(wegen OPT => input).
Für das Lesen der .dxf Datei wird der
Modul DXFIN benötigt. Dieser verlangt die
Übergabe der notwendigen Parameter in der Map
DXFIN_PARAM. In diesem Beispiel müssen zwar
keine konkreten Parameter gesetzt werden, die Map muss aber
trotzdem vorhanden sein.
In der Map INPUT_SOURCES werden die
Inputquellen festgelegt. Im Fall der Checkerkonfiguration gibt
es nur eine Inputquelle I1 welche ihre Daten
vom Inputmodul DXFIN aus der Datei
OPT.input bezieht.
Der Verarbeitungsablauf wird schliesslich in der Map
INOUT festgelegt. In diesem Beispiel werden
alle von der Inputquelle I1 gelesenen
Objekte über die Benutzerprozedur
CHECK_LAYER0 aus
check.out in die Logdatei ausgegeben.
Alle benutzten Module und Bibliotheken müssen über
|INCL Direktiven eingebunden werden. In
diesem Fall sind das \script\dxfin.lib
(wegen DXF Input), \script\dxf2il\check.out
(wegen Benutzerprozedur) und
\script\run1.prg welches in jede
RUN1 Konfiguration direkt oder indirekt
eingebunden werden muss.
Der eigentliche Layer-Test wird in der Benutzerprozedur
CHECK_LAYER0 durchgeführt. Die Prozedur wir
auf jedem von der Inputquelle I1 gelesenen
DXF Objekt aufgerufen (wegen I1 =>
CHECK_LAYER0). Weil die Prozedur keine Argumente
benötigt, endet der Name der Prozedur mit der Ziffer
0.
ICS Konfigurationen mit einem Input- und einem Outputmodul sind die häufigsten ICS Konfigurationen und werden häufig einfach als Schnittstellen bezeichnet. Nachfolgend ist eine DXF => SHP Schnittstelle dargestellt, welche DXF-Block Objekte (DXF = AutoCAD DXF Format) in SHP-Point Objekte (SHP = ESRI Shape File Format) übersetzt:
!============================================================================! ! ! ! DXF => SHP Configuration Vers. 1.0 ! ! ! !============================================================================! !<1> |LICENSE \license\iltoolspro.lic |LICENSE \license\iltools.lic !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! user input ! !<2> MAP USER_INPUT1 DIALOG => FILE ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .dxf input file' FILE_EXISTS => TRUE FILE_FILTER => dxf OPT => input END_MAP !<3> MAP USER_INPUT2 DIALOG => DIRECTORY ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .shp output directory' OPT => output END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for intput modules ! !<4> MAP DXFIN_PARAM END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for output modules ! !<5> MAP SHPOUT_PARAM END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! input sources ! !<6> MAP INPUT_SOURCES I1 => DXFIN,OPT.input END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! classification ! !<7> MAP INOUT I1 => IN.TYPE I1,BLOCK => SHPOUT_WRITE_POINT3,IN.GEOM,2D,point I1,* => OFF END_MAP !<8> |INCL \script\dxfin.mod |INCL \script\shpout.mod |INCL \script\run1.prg
Erläuterungen zum Beispiel:
Mit der Direktive |LICENSE werden die
möglichen Lizenzdateien angegeben, mit welchen der Skript
ausgeführt werden kann. Werden diese Einträge vergessen, wird der
Skript zur Laufzeit mit einer entsprechenden Fehlermeldung
abgebrochen (no license found for ...).
Der Skript fragt vom Benutzer den Dateinamen der Inputdatei
ab. Damit nur bestehenden .dxf Dateien ausgewählt werden können
wird FILE_EXISTS => TRUE und
FILE_FILTER => dxf gesetzt. Der abgefragte
Wert wird in OPT.input abgelegt (wegen
OPT => input).
Der Skript fragt vom Benutzer das Outputverzeichnis ab. Der
abgefragte Wert wird in OPT.output abgelegt
(wegen OPT => output).
Für das Lesen der .dxf Datei wird der Modul
DXFIN benötigt. Dieser verlangt die Übergabe
der notwendigen Parameter in der Map
DXFIN_PARAM. Im Fall der DXF => SHP
Schnittstelle müssen keine speziellen Parameter gesetzt werden,
die Map DXFIN_PARAM muss aber trotzdem
definiert werden.
Für das Schreiben der .shp Datei wird der Modul
SHPOUT benötigt. Dieser verlangt die Übergabe
der notwendigen Parameter in der Map
SHPOUT_PARAM. Im Fall der DXF => SHP
Schnittstelle müssen keine speziellen Parameter gesetzt werden,
die Map SHPOUT_PARAM muss aber trotzdem
definiert werden.
In der Map INPUT_SOURCES werden die
Inputquellen festgelegt. Im Fall der SHP => DXF Schnittstelle
gibt es nur eine Inputquelle I1 welche ihre
Daten vom Inputmodul DXFIN aus der Datei
OPT.input bezieht.
Der Verarbeitungsablauf wird schliesslich in der Map
INOUT festgelegt. In diesem Beispiel werden
alle von der Inputquelle I1 gelesenen Objekte
zunächst über die Komponente TYPE des
IN Objekts klassifiziert. Objekte mit
IN.TYPE = 'BLOCK' werden über die Prozedur
SHPOUT_WRITE_POINT3 des
SHPOUT Moduls in die SHP Punktdatei
point geschrieben.
Alle benutzten Module und Bibliotheken müssen über
|INCL Direktiven eingebunden werden. Es sind
dies: \script\dxfin.mod (wegen DXF Input),
\script\shpout.mod (wegen SHP Output) und
\script\run1.prg,welches in jede
RUN1 Konfiguration direkt oder indirekt
eingebunden werden muss.
Das nächste Konfigurationsbeispiel ist eine Erweiterung des
Beispiels aus ???. In diesem Beispiel sind Flächen
in der DXF Datei nur in Form von Begrenzungslinien aber nicht als
geschlossene Polygone gespeichert. In der SHP Outputdatei sollen aber
geschlossene Polygone ausgegeben werden. Es ist also eine Umrechnung der
Begrenzungslinien in Polygone notwendig. Für diese Umrechung ist der
Verarbeitungsmodul TOPO vorgesehen. Nachfolgend ist
die vollständige Konfiguration inkl. Aufruf des Verarbeitungsmodul
TOPO dargestellt:
!============================================================================! ! ! ! DXF => SHP Configuration Vers. 1.0 ! ! ! !============================================================================! !<1> |LICENSE \license\iltoolspro.lic |LICENSE \license\iltools.lic !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! user input ! !<2> MAP USER_INPUT1 DIALOG => FILE ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .dxf input file' FILE_EXISTS => TRUE FILE_FILTER => dxf OPT => input END_MAP !<3> MAP USER_INPUT2 DIALOG => DIRECTORY ! FILE | FILES | DIRECTORY | STRING | ODBC MESSAGE => 'select .shp output directory' OPT => output END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for intput modules ! !<4> MAP DXFIN_PARAM END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for output modules ! !<5> MAP SHPOUT_PARAM STROKE_TOL => 0.01 END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! parameter maps for processing modules ! !<6> MAP TOPO_PARAM RESOLUTION => 0.001 OVERLAP => 0.2 END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! input sources ! !<7> MAP INPUT_SOURCES I1 => DXFIN,OPT.input I2 => TOPO,AREA END_MAP !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! classification ! !<8> MAP INOUT I1 => IN.TYPE I1,BLOCK => SHPOUT_WRITE_POINT3,IN.GEOM,2D,point I1,POLYLINE => TOPO_WRITE_BOUNDARY1,IN.GEOM I1,* => OFF I2 => SHPOUT_WRITE_POLYGON4,IN.GEOM,2D,0.01,polygon END_MAP !<9> |INCL \script\util.lib |INCL \script\topo.mod |INCL \script\dxfin.mod |INCL \script\shpout.mod |INCL \script\run1.prg
Mit der Direktive |LICENSE werden die
möglichen Lizenzdateien angegeben, mit welchen der Skript
ausgeführt werden kann. Werden diese Einträge vergessen, wird der
Skript zur Laufzeit mit einer entsprechenden Fehlermeldung
abgebrochen (no license found for ...).
Der Skript fragt vom Benutzer den Dateinamen der Inputdatei
ab. Damit nur bestehende .dxf Dateien
ausgewählt werden können wird FILE_EXISTS =>
TRUE und FILE_FILTER => dxf
gesetzt. Der abgefragte Wert wird in OPT.input
abgelegt (wegen OPT => input).
Der Skript fragt vom Benutzer das Outputverzeichnis ab. Der
abgefragte Wert wird in OPT.output abgelegt
(wegen OPT => output).
Für das Lesen der .dxf Datei wird der Modul
DXFIN benötigt. Dieser verlangt die Übergabe
der notwendigen Parameter in der Map
DXFIN_PARAM. Im Fall der DXF => SHP
Schnittstelle müssen keine speziellen Parameter gesetzt werden,
die Map DXFIN_PARAM muss aber trotzdem
definiert werden.
Für das Schreiben der .shp Datei wird der Modul
SHPOUT benötigt. Dieser verlangt die Übergabe
der notwendigen Parameter in der Map
SHPOUT_PARAM.
Für den Verarbeitungsmodul TOPO müssen
die Parameter in der Map TOPO_PARAM gesetzt
werden.
In der Map INPUT_SOURCES werden die
Inputquellen festgelegt. Im Fall der SHP => DXF Schnittstelle
gibt es nun zwei Inputquellen I1 und
I2:
I1Liest die DXF-Objekte aus der Datei
OPT.input.
I2Liest die vom TOPO Modul
aufbereiteten Polygone.
Der Verarbeitungsablauf der INOUT Map gliedert sich in zwei Teile:
I1Die Daten der Inputquelle I1
werden einerseits als SHP-Point Objekte ausgegeben
andererseits werden Polylinien im Topologiemodul
TOPO für die weitere Verarbeitung mit
I2 gespeichert.
I2Die vom Topologiemodul gelieferten geschlossenen Polygone werden als SHP-Polygon Objekte ausgegeben.
Alle benutzten Module und Bibliotheken müssen über
|INCL Direktiven eingebunden werden.
\script\dxfin.mod (wegen DXF Input),
\script\shpout.mod (wegen SHP Ouput) und
\script\run1.prg, welches in jede
RUN1 Konfiguration direkt oder indirekt
eingebunden werden muss.