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 Abschnitt 3.3, „Konfiguration mit Input- und Outputmodul“. 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.