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_PROCEDURE
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
).
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_PROCEDURE
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 .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
:
I1
Liest die DXF-Objekte aus der Datei
OPT.input
.
I2
Liest die vom TOPO
Modul
aufbereiteten Polygone.
Der Verarbeitungsablauf der INOUT Map gliedert sich in zwei Teile:
I1
Die 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.
I2
Die 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.