NetCheck

Top  Previous  Next

Testet ein Netz von Knoten und Kanten auf Korrektheit.

Als Default wird aus den selektierten Objekten entsprechend der Knoten- und Kantenliste einer Selektionsdatei ein Netz von Knoten und Kanten aufgebaut.

Das Netz kann zum einen auf vorgegebene und zum anderen auf die vom Anwender in einer Datei spezifizierten Bedingungen geprüft werden. Zu den Objekten, die Bedingungen nicht einhalten, erfolgen Meldungen.

Netz, Knoten und Kanten

Die Funktion testet ein Netz von Knoten und Kanten. Knoten entstehen durch die Auswahl der Stützpunkte von Stringelementen, von Symbol- und Textelementen. Als Position erhalten sie die Koordinaten des Stützpunkts oder Elements, aus dem sie entstanden sind. Kanten entstehen durch die Auswahl von Stringelementen. Sie besitzen zwei Enden, jeweils entweder mit den Koordinaten des ersten und letzten Stützpunkts des Stringelements als Position oder, wenn sie an Bruchstellen (s. u.) zerfallen, mit den Koordinaten des Anfangs und Endes der Teilstücke als Position.

Eine Kante hängt mit einem Ende an einem Knoten, wenn das Ende die gleiche Position hat wie dieser. Sie kann auch ein oder zwei freie Enden haben, wenn es keine passenden Knoten gibt. An einem Knoten können beliebig viele – auch keine – Kanten hängen.

Ein spezieller Knotentyp ist der Multiknoten. Er entsteht entweder aus ein oder mehreren Stützpunkten eines Stringelements oder aus einer Auswahl der Symbole eines Objekts und erhält dementsprechend ein oder mehrere Positionen. Mit nur einer Position verhält er sich wie ein normaler Knoten. Bei mehreren Positionen hängt eine Kante mit einem Ende am Multiknoten, wenn die Position des Endes gleich einer der Positionen des Multiknotens ist.

Eine weiterer Spezialfall ist der Kombiknoten (s. u). Er macht es möglich, mehrere Knoten mit identischer Position zusammenzufassen, die dann als ein Knoten bearbeitet werden können.

Pseudoknoten können bei der Kantenselektion erzeugt werden. Beginnt oder endet ein Stringelement auf dem Blattrand (die Genauigkeit kann mit dem RANDEPSILON-Parameter eingestellt werden), dann kann für diese Position ein Pseudoknoten erzeugt werden, vorausgesetzt die Knotenliste enthält noch keinen entsprechenden Knoten. Ohne den Pseudoknoten würde bei der Prüfung der zugehörigen Kante die Meldung Kantenende ohne Knoten erfolgen. Der alleinige Zweck des Pseudoknotens ist es, in diesem Fall die Ausgabe der Meldung zu verhindern.

Aktive und passive Elemente

Als Default wird das Netz aus den Objekten der Selektionsmenge entsprechend der Knoten- und Kantenliste der Selektionsdatei erzeugt. Bei der Angabe des Parameters INCLUDE_UNSELECTED werden die nicht in der Selektionsmenge enthaltenen Objekte ebenfalls berücksichtigt. Auch zu ihnen werden Knoten und Kanten gemäß der Knoten- und Kantenliste der Selektionsdatei erzeugt. Die Knoten und Kanten aus Objekten der Selektionsmenge werden als aktive Elemente bezeichnet, die übrigen als passive Elemente. Wenn ohne die Angaben aktiv oder passiv von Knoten und Kanten die Rede ist, dann sind grundsätzlich nur die aktiven gemeint.

Die passiven Elemente werden im Unterschied zu den aktiven Elementen nicht auf die Einhaltung von Bedingungen (s. u.) getestet, deshalb erfolgen zu ihnen keine Meldungen. Beim Test der aktiven Elemente hingegen werden die passiven Elemente genauso bewertet wie die aktiven, d.h. passive Kanten zählen an Knoten genauso wie aktive Kanten, Kantenenden hängen an passiven Knoten ebenso korrekt wie an aktiven Knoten, und Kombiknoten (s. u.) werden aus einem aktiven und einem passiven Knoten genau so gebildet wie aus zwei aktiven Knoten.

Test

NetCheck testet die Einhaltung der folgenden Bedingungen und gibt bei Verstößen entsprechende Meldungen aus. Einige der Tests lassen sich über Parameter gezielt an- und abschalten. Innere Punkte bezeichnen im folgenden alle Stützpunkte eines Stringelements bis auf den ersten und den letzten.

Es darf keine Knoten mit gleichen Koordinaten geben.

Jedes Kantenende hängt an einem Knoten. Die Bedingung kann mit dem Parameter ALLEDGES an- oder abgeschaltet werden.

An jedem Knoten, der nicht von einer Anweisung der Bedingungsdatei getestet wird, hängt mindestens eine Kante. Die Bedingung kann mit dem Parameter ALLNODES an- oder abgeschaltet werden.

Die inneren Punkte von Stringelementen dürfen nur dann auf anderen Stützpunkten liegen, wenn sie eine Bruchstelle sind und ein Knoten die gleichen Koordinaten hat. Die Bedingung kann mit dem Parameter EQUALCOORDS an- oder abgeschaltet werden.

Die Knoten müssen die Testanweisungen der Bedingungsdatei erfüllen. Neben den explizit in der Anweisung getesteten Kanten dürfen keine weiteren am Knoten hängen.

Einzeltest

Beim Einzeltest – gesteuert durch den Parameter SingleTest (s. u.) – wird in der Regel nur eine Kante oder ein Knoten getestet. Trifft die Elementspezifikation allerdings auf mehrere Knoten oder Kanten zu, weil sie aus einem Stringelement entstanden sind, dann werden diese alle getestet. Die Spezifikation kann man aus einer Meldung eines vorhergehenden Testlaufs entnehmen. So ist z. B. in der Meldung

<Node MSP> : String 1 Objekt 1, Plan NC160, Blatttyp 42, ID 40000020000042da : Error 300 : Knoten gleicher Koordinaten.

die Spezifikation

         String 1 Objekt 1, Plan NC160, Blatttyp 42, ID 40000020000042da : Error 300

enthalten. Sie besteht aus einem der Elementtypen String, Symbol oder Text, gefolgt von der Elementnummer, und den Schlüsselwörtern Objekt, Plan, Blatttyp, ID und Error, jeweils gefolgt von ihrem Wert.

Parameter

Anstelle einiger der Parameter können entsprechend globale Variablen verwendet werden. Ist die globale Variable belegt und wird der Parameter trotzdem beim Funktionsaufruf angegeben, dann hat der Wert des Parameters Vorrang vor dem der globalen Variable.

die Parameter mit entsprechenden globalen Variablen

ALLEDGES

NetCheck.AllEdges

ALLNODES

NetCheck.AllNodes

EQUALCOORDS

NetCheck.EqualCoords

TESTREPORT

NetCheck.TestReport

/INCLUDE_UNSELECTED

Mit diesem Schalter wird das Netz aus allen Objekten aufgebaut, anstatt nur aus denen der Selektionsmenge. Zu der besonderen Bedeutung der aus nicht selektierten Objekten entstandenden Knoten und Kanten siehe oben unter dem Punkt Aktive und passive Elemente.

EPSILON/n

Koordinaten von Punkten werden als gleich betrachtet, wenn sie nicht mehr als den Betrag von Epsilon voneinander abweichen. Der Defaultwert ist 0.

RANDEPSILON/n

Kantenenden ohne Knoten, deren Koordinaten nicht mehr als den Betrag von Randepsilon vom Blattrand entfernt sind, sind potentielle Pseudoknoten. Der Defaultwert ist das 5-fache der Auflösung.

ALLEDGES/n

Bei n ungleich 0 erfolgen Meldungen bei Kanten mit freien Enden, als Default sind sie mit n gleich 1 eingeschaltet.

ALLNODES/n

Bei n ungleich 0 erfolgen Meldungen bei Knoten ohne Kanten, als Default sind sie mit n gleich 1 eingeschaltet.

EQUALCOORDS/n

n=0: Die Koordinaten von Stützpunkten sind beliebig.

n=1: Das ist der Defaultwert. Die Koordinaten von Stützpunkten, die selbst oder deren Nachfolger den Linktyp LINK_P besitzen, sind beliebig. Bei den Stützpunkten mit einem anderen Linktyp erfolgen unter bestimmten Bedingungen Meldungen:

Der erste Punkt oder der letzte Punkt oder eine Bruchstelle eines Stringelements liegt nicht auf einem Knoten, sondern auf einem anderen Stützpunkt.

Ein innerer Punkt eines Stringelement ist keine Bruchstelle und liegt auf einem Knoten.

n=2: Die Meldungen erfolgen wie bei n=1, aber auch bei Stützpunkten mit LINK_P.

"SINGLETEST/specification"

Einzeltest für die Kante oder den Knoten des spezifizierten Elements. Die Spezifikation kann man aus einer Meldung eines vorhergehenden Testlaufs entnehmen, und der vollständige Parameter lautet z. B.

 "SINGLETEST/String 1 Objekt 1, Plan NC160, Blatttyp 42, ID 40000020000042da : Error 300"

TESTREPORT/n

Bestimmt den Inhalt der Meldungen bei Knoten, die eine Testanweisung nicht einhalten oder ungetestete Kanten besitzen.

n=0: Dateiname und Zeilennummer in der Bedingungsdatei. Das ist Default.

n=1: Text der Testanweisung.

n=2: wie bei 0 und die Kanten am Knoten mit ihrer Anzahl.

n=3: Kombination von 1 und den Kanten von 2.

SELECTION/filename

Der Name der Selektionsdatei mit der Knoten- und Kantenselektion. Wenn sie die Standardendung .sel hat, dann muß die Endung nicht mit angegeben werden. Der Defaultname ist default.sel. Wenn der Name keinen Pfad enthält, dann wird sie in dem Verzeichnis gesucht, das durch die Environmentvariable GDS$TABLES_CHECK referenziert wird.

CONDITIONS/filename

Der Name der Bedingungsdatei mit den Testanweisungen. Wenn sie die Standardendung .cond hat, dann muß die Endung nicht mit angegeben werden. Der Defaultname ist default.cond. Wie beim Parameter SELECTION wird das durch GDS$TABLES_CHECK referenzierte Verzeichnis verwendet.

Meldungen

Vor den Fehlermeldungen steht die Fehlernummer. Die drei Punkte ... in den Meldungen stehen für Objekt-, Zeilen- und sonstige Nummern. Die drei Punkte in Kleiner- und Größerzeichen <...> stehen für die Namen von Kanten und Knoten. Bei namenlosen Kanten und Knoten steht zwischen dem Kleiner- und Größerzeichen nichts. Die drei Punkte in Hochkammata '...' stehen für die Namen von Selektions- und Bedingungsdateien.

Allgemeine Meldungen

----------------------------

NetCheck Gesamttest

----------------------------

Die normale Startmeldung.

--------------------------

NetCheck Einzeltest

--------------------------

Die Startmeldung beim Einzeltest.

-------------------------

NetCheck beendet.

-------------------------

Die Endmeldung.

100: Textelemente sind in der Kantenselektion unzulässig.

101: Symbolelemente sind in der Kantenselektion unzulässig.

In der Kantenselektion dürfen nur Stringelemente ausgewählt werden.

103: Der erste Punkt eines Stringelements darf keine Sollbruchstelle sein.

104: Der letzte Punkt eines Stringelements darf keine Sollbruchstelle sein.

105: Die Enden eines Stringelements dürfen keine Sollbruchstelle sein.

Sollbruchstellen dürfen nur an den inneren Punkte der Stringelemente definiert werden.

106: Die Definition von Randpunkten ist in der Knotenselektion unzulässig.

Randpunkte dürfen nur in der Kantenselektion definiert werden.

107: Fehler in Zeile ... der Selektionsdatei '...': parse error

Beim parsen der Selektion ist in der angegebenen Zeile ein Fehler aufgetreten.

108: Die Selektionsdatei '...' kann nicht geöffnet werden.

Die Datei existiert nicht oder der Pfad GDS$CHECK ist nicht korrekt gesetzt.

109: Unzulässige Bruchstelle in der Knotenselektion, Selektionsdatei '...' Zeile ...

Bruchstellen dürfen nur in der Kantenselektion definiert werden.

110: Basisknoten <...> des Kombiknotens <...> ist nicht definiert, Selektionsdatei '...' Zeile ...

Der Basisknoten muß in der Selektionsdatei vor dem Kombiknoten definiert werden.

111: Unzulässige Equalcoords-Angabe in der Knotenselektion, Selektionsdatei '...' Zeile ...

Die kantenspezifischen EqualCoords dürfen nur in der Kantenselektion definiert werden.

112: Ungültiger Equalcoords-Wert ..., Selektionsdatei '...' Zeile ...

Bei einer kantenspezifischen EqualCoords-Definition wurde keiner der erlaubten Werte angegeben.

200: Fehler in Zeile ... der Bedingungsdatei '...': parse error

Beim parsen der Bedingungen ist in der angegebenen Zeile ein Fehler aufgetreten.

201: Die Bedingungsdatei '...' kann nicht geöffnet werden.

Die Datei existiert nicht oder der Pfad GDS$CHECK ist nicht korrekt gesetzt.

203: Unbekannte Funktion '...' in Zeile ... der Bedingungsdatei '...'.

Eine Bedingung enthält einen Funktionsnamen, der keiner der bekannten Funktionen #END, #QTX etc. entspricht.

204: ... statt ... Argumente in Zeile ... der Bedingungsdatei '...'.

Eine Funktion wird mit einer falschen Anzahl von Argumenten aufgerufen.

205: ... statt mindestens ... Argumente in Zeile ... der Bedingungsdatei '...'.

Eine Funktion wird mit einer ungenügenden Anzahl von Argumenten aufgerufen.

 

LocateObject kann mit dem Inhalt der objektspezifischen Meldungen das entsprechende Objekt auffinden.

Wenn es zu einem Objekt mehrere Knoten gleichen Namens gibt, bei denen die gleiche Bedingung nicht erfüllt ist, dann wird die gleiche Meldung mehrfach ausgegeben.

Nicht abschaltbare objektspezifische Meldungen

Typ  ist entweder String, Symbol oder Text.

<...> Error 300: Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Knoten gleicher Koordinaten

Die Knotenliste enthält bereits einen Knoten mit der gleichen Position.

<...> : Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... Error 206: durchgefallen. Details.

Der Knoten hat den Test nicht bestanden. Abhängig vom Parameter TestReport werden Details ausgegeben. Das sind entweder der Name der Bedingungsdatei und die Nummer der Zeile mit dem zugehörigen Schlüsselwort TEST, z. B.:

Bedingungsdatei 'nc201' Zeile 1.

oder die Testanweisung selbst, z. B.:

Bedingung: TEST Station ( # ( MSP ) IN 1 , 2 ) AND ( #END ( NSP ) > = 1 )

Beim Einzeltest enthält die Bedingung nicht nur die Soll- sondern in Klammern auch die Istwerte:

                       Bedingung: TEST Mast ( # ( MSP ) (1) > = 1 ) OR ( # ( NSP ) (0) > = 1 )

Auch die Ausgabe der Namen der am Knoten hängenden Kanten mit ihrer Anzahl ist möglich, Beispiele:

Kanten:  1 "NSP" **  1 "Bel" **  1 <unbenannte Kante>

Kanten: <keine Kanten>

Die Kanten werden durch zwei Sternchen voneinander getrennt, Kanten ohne Namen werden unter der Bezeichnung <unbenannte Kante> geführt.

<...> : Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Error 207 : Knoten mit ungetesteten Kanten. Details.

An dem Knoten hängen Kanten, die nicht von einer Bedingung der Testanweisung erfaßt werden. Der Parameter TestReport bestimmt wie bei der vorherigen Meldung die Details.

Abschaltbare objektspezifische Meldungen

<...> 212: Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Knoten ohne Kanten

An dem Knoten hängt keine einzige Kante.

<...> 400: Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Kantenanfang ohne Knoten

Kein Knoten hat die gleiche Position wie der Kantenanfang.

<...> 401: Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Kantenende ohne Knoten

Kein Knoten hat die gleiche Position wie das Kantenende.

<...> 402: Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Stützpunkte gleicher Koordinaten

Stützpunkte verschiedener Stringelemente haben identische Koordinaten.

<...> 403: Typ ... Objekt ..., Plan ..., Blatttyp ..., ID ... : Stützpunkt auf Knoten <...>.

Ein Stützpunkt – keine Bruchstelle – besitzt die gleichen Koordinaten wie ein Knoten. Am Anfang der Meldung steht der Name der Kante, am Ende der Name des Knotens.

Beispiel

Das Beispiel veranschaulicht die Arbeitsweise des Netztests mit einem einfachen Satz von Elementen und Regeln. Es umfaßt eine Selektions- und eine Bedingungsdatei, einen Plan, das daraus resultierende Netz und die beim Netztest erfolgten Meldungen.

Elemente, Objektschlüssel und Symbolnummern

Abzweigmuffe NSP

1420

70

Endmuffe MSP

1223

53

Endmuffe NSP

1423

73

Leitung MSP

1200

 

Leitung NSP

1400

 

Station

2200

150

 

Die ersten und letzten Stützpunkte der Stringelemente werden als Enden bezeichnet, die übrigen als innere Punkte. MSP- und NSP-Leitungen werden mit MSP und NSP abgekürzt. Für die Elemente gelten die folgenden Regeln.

(1) Stationen liegen auf beliebigen Stützpunkten von MSP, aber nie mehr als eine pro Punkt. An jeder Station beginnt mindestens eine NSP.

(2) Auf einer Abzweigmuffe NSP liegen genau drei NSP Enden.

(3) Auf einer Endmuffe MSP liegt genau ein MSP Ende.

(4) Auf einer Endmuffe NSP liegt genau ein NSP Ende.

(5) MSP Enden liegen auf Stationen, auf MSP Endmuffen oder dem Blattrand.

(6) NSP Enden liegen auf Stationen, auf NSP Abzweig- oder NSP Endmuffen.

Als Knoten werden Stationen, Abzweig- und Endmuffen ausgewählt.

Elemente und ihre Knotennamen

Abzweigmuffe NSP

"Abzweigmuffe NSP"

Endmuffe MSP

"Endmuffe MSP"

Endmuffe NSP

"Endmuffe NSP"

Station

"Station"

Die MSP- und NSP-Leitungen werden zu Kanten.

Elemente und ihre Kantennamen

MSP

"MSP"

NSP

"NSP"

Laut Regel (1) dürfen Stationen auf allen Stützpunkten von MSP liegen. In der Kantenliste werden deshalb die inneren Punkte von MSP mit dem Schlüsselwort INNER als Sollbruchstellen definiert, damit die Kanten der MSP an Knoten geteilt werden. Sonst würde aus jeder MSP genau eine Kante entstehen, und bei inneren Punkten auf Stationen würde Stützpunkt auf Knoten gemeldet.

Die Regel (5) gestattet MSP Enden auf dem Blattrand. Die "MSP" Definition in der Kantenliste enthält deshalb das Schlüsselwort RAND, damit aus MSP Randpunkten Pseudoknoten generiert werden, wenn sie nicht bereits auf einem Knoten liegen. Die Pseudoknoten verhindern die Meldungen Kantenanfang ohne Knoten und Kantenende ohne Knoten.

Selektionsdatei nc201.sel

!-----------------------------------------------------------

KNOTENLISTE "Knotenselektion Plan NC201"

!-----------------------------------------------------------

KEY 1420 SYMBOL "Abzweigmuffe NSP"

     NUM 70      ! Symbolnummer

KEY 1223 SYMBOL "Endmuffe MSP"

     NUM 53

KEY 1423 SYMBOL "Endmuffe NSP"

     NUM 73

KEY 2200 SYMBOL "Station"

     NUM 160

!-----------------------------------------------------------

KANTENLISTE "Kantenselektion Plan NC201"

!-----------------------------------------------------------

KEY 1200 LINE "MSP"

     INNER    ! alle inneren Punkte sind Sollbruchstellen

     RAND     ! Randpunkte können Pseudoknoten werden

KEY 1400 LINE "NSP"

 

MSP dürfen mit beliebigen Stützpunkten auf Stationen liegen. Die Bedingung ( #("MSP") IN 1,2 ) der ersten Testanweisung zählt daher alle Kanten "MSP" am Knoten "Station". Beim Test der "Endmuffe MSP" hingegen werden in der Bedingung ( #END("MSP") = 1 ) nur die Kanten "MSP" am Knoten gezählt, bei denen das Kantenende am Knoten auf einem MSP Ende basiert. Die dritte und letzte Möglichkeit – #PASS("MSP") – würde nur die Kanten "MSP" an einem Knoten zählen, bei denen das Kantenende am Knoten auf einem inneren Punkt basiert.

Bei der "NSP" sind keine Sollbruchstellen definiert, anstelle von #END("NSP") könnte daher in den Testanweisungen auch #("NSP") verwendet werden, weil alle Kantenenden der "NSP" auf NSP Enden basieren. So wie es jetzt gemacht wird ist es aber sicherer gegenüber späteren Änderungen, falls z. B. die NSP doch einmal Sollbruchstellen erhalten würde.

Bedingungsdatei nc201.cond

TEST "Station"       ( #( "MSP" ) IN 1,2 )

     AND   ( #END("NSP" ) >= 1 )

 

TEST "Abzweigmuffe NSP" ( #END( "NSP" ) = 3 )

TEST "Endmuffe NSP"     ( #END( "NSP" ) = 1 )

TEST "Endmuffe MSP"     ( #END( "MSP" ) = 1 )

Die Skizze des Plans enthält eine MSP, vier NSP, zwei Stationen, eine NSP Abzweigmuffe und zwei NSP Endmuffen.

Zeichnerische Darstellung der Elemente

MSP

durchgezogene Linie, Pfeilspitzen an den Enden

NSP

gestrichelte Linie, Pfeilspitzen an den Enden

Sollbruchstelle

auf der Spitze stehendes ausgefülltes Quadrat

normaler Stützpunkt

ausgefüllter Kreis

Abzweigmuffe

Dreieck

Endmuffe

Halbkreis

Station

Quadrat

Plangrenze

das umfassendes Rechteck

 




image5_47

    Plan NC201

 

Beide Enden der MSP liegen auf dem Blattrand. Eine NSP liegt mit einem Ende auf dem Blattrand, mit einem inneren Punkt auf einem inneren Punkt der MSP und mit dem anderen Ende auf einer Station. Die andere NSP an der Station verläuft zur Abzweigmuffe, und die beiden übrigen liegen mit einem Ende auf der Abzweigmuffe und mit dem anderen Ende auf einer Endmuffe. Auf der anderen Station liegen weder MSP noch NSP.

Aus dem Plan und der Selektionsdatei resultiert ein Netz mit sieben Knoten und sechs Kanten. In der folgenden Abbildung entsprechen die Kreise den Knoten und die Linien den Kanten. Neben den Elementen stehen – soweit vorhanden – ihre Namen. Die beiden Pseudoknoten – entstanden aus den Randpunkten der MSP - sind gestrichelt gezeichnet. Sie tragen keine Namen, weil ihnen in der Selektionsdatei keiner zugewiesen wurde. Aus der MSP sind zwei Kanten "MSP" entstanden, weil sie mit einer Sollbruchstelle auf einem Knoten liegt. Eine der Kanten "NSP" hat ein offenes Ende, alle anderen Kanten hängen mit beiden Enden an Knoten. An dem unteren Knoten "Station" hängt keine einzige Kante.




image5_48

 

Der Netztest wird mit dem folgenden Befehl gestartet.

NetCheck sel/nc201 cond/nc201

Die Selektions- und die Bedingungsdatei haben die Standardendungen .sel und .cond, die Endungen müssen deshalb beim Aufruf der Netztests nicht mit angegeben werden.

Der Netztest ergibt die folgenden Meldungen.

 

-------------------

NetCheck Gesamttest

-------------------

Die Startmeldung.

<NSP> : String 1 Objekt 2, Plan NC201, Blatttyp 42, ID 4000002000002385 : Error 402 : Stützpunkte gleicher Koordinaten.

<MSP> : String 1 Objekt 1, Plan NC201, Blatttyp 42, ID 400000200000238c : Error 402 : Stützpunkte gleicher Koordinaten.

Eine NSP liegt mit einem Stützpunkt auf einem Stützpunkt der MSP, und an dieser Position liegt kein Knoten, sonst würde die Stützpunkt auf Knoten Meldung erfolgen.

<NSP> : String 1 Objekt 2, Plan NC201, Blatttyp 42, ID 4000002000002385 : Error 400 : Kantenanfang ohne Knoten.

Eine Kante <NSP> hängt mit ihrem Anfangspunkt nicht an einem Knoten.

<Station> : Symbol 1 Objekt 11, Plan NC201, Blatttyp 42, ID 4000002000002361 : Error 206 : durchgefallen. Bedingungsdatei 'nc201' Zeile 1.

An einem Knoten <Station> hängt keine einzige Kante. Damit verletzt er die in Zeile 1 der Bedingungsdatei 'nc201' beginnende Testanweisung, die ein oder zwei Kanten <MSP> und mindestens eine Kante <NSP> am Knoten <Station> fordert.

-----------------

NetCheck beendet.

-----------------

Die Endmeldung.

 

Die Selektionsdatei

Knoten und Kanten werden mit der Knoten- und Kantenliste der Selektionsdatei erzeugt. Die Listen bestehen aus Objekt- und Elementdefinitionen (s. u.). Bei der Erstellung der Listen muß man darauf achten, daß kein Element von mehreren Definitionen erfaßt wird, sonst erfolgen irreführende Meldungen wie z. B. „Knoten gleicher Koordinaten“, obwohl an den entsprechenden Koordinaten definitiv nur ein Element liegt. Andererseits ist es durchaus zulässig, daß zu einer Definition kein passendes Element existiert, in diesem Fall erfolgt keine Meldung.

Die Bezeichnung Zeichenkette steht für eine in Hochkommata eingeschlossene beliebige Anzahl von Zeichen, die auch Leerzeichen enthalten darf, z. B. “NSP-Station Typ X“.

Name bezeichnet eine Kombination von Zeichen ohne Leerzeichen, die nicht in Hochkommata eingeschlossen sind.

Eine Zahlenliste enthält ein oder mehrere beliebig kombinierbare Zahlen und Bereiche, die durch Kommata voneinander getrennt sind. Bereiche sind zwei Zahlen mit einem Bindestrich dazwischen. Es müssen ganze Zahlen sein, die positiv oder negativ sein dürfen. Bereiche negativer Zahlen werden z. B. bei der Definition von Objektschlüsseln verwendet. Drei Beispiele für Zahlenlisten sind

                  7

                  4-5

                  1, 3, -5, -7 - -8, 10, 20 - 22, 40

Bei der Beschreibung der Syntax sind optionale Bestandteile in geschweifte Klammern gesetzt. Z. B. entsprechen der Syntax KEY ALL {MULTIKNOTEN} die beiden Befehle KEY ALL und KEY ALL MULTIKNOTEN.

Syntax der Selektionsdatei

Die Selektionsdatei enthält eine Knotenliste (1) und eine Kantenliste (2) in dieser Reihenfolge, wobei eine oder auch beide Listen entfallen dürfen. Jede Liste enthält eine beliebige Anzahl von Objektdefinitionen, (1.1) bei der Knoten- und (2.1) bei der Kantenliste. Eine Objektdefinition enthält eine beliebige Anzahl von Elementdefinitionen (1.1.1), (1.1.2) etc. Eine Elementdefinition besteht aus einer beliebigen Kombination ihrer Auswahlkriterien, z. B. (1.1.1.1), (1.1.1.2) etc. bei einem LINE-Element.

Das Zeichen '|' steht für alternative Möglichkeiten. 'KEY ALL | KEY Zahlenliste' bedeutet daher, daß entweder 'KEY ALL' oder 'KEY Zahlenliste' verwendet werden kann. Die Nummern am Zeilenanfang sind nicht Bestandteil der Syntax, sondern dienen als Verweis bei der Beschreibung der Semantik.

 

(1) KNOTENLISTE Zeichenkette

         (1.1)   KEY ALL {QTX Zeichenkette Zeichenkette} {ON Zeichenkette | MULTIKNOTEN} {IGNORE Zeichenkette}

| KEY Zahlenliste {QTX Zeichenkette Zeichenkette} {ON Zeichenkette | MULTIKNOTEN} {IGNORE Zeichenkette}

                  (1.1.1) LINE {Zeichenkette}

                            (1.1.1.1) DKY Zahlenliste

                            (1.1.1.2) DKA Zahlenliste

                            (1.1.1.3) ART Name

                            (1.1.1.4) FIRST

                            (1.1.1.5) LAST

                            (1.1.1.6) ENDS

                            (1.1.1.7) INNER

                            (1.1.1.8) EVEN

                            (1.1.1.9) ODD

                            (1.1.1.10) NUM Zahlenliste

                            (1.1.1.11) PCL Zahlenliste

                            (1.1.1.12) PSY Zahlenliste

                            (1.1.1.13) CIRCLE

                  (1.1.2) SYMBOL {Zeichenkette}

                            (1.1.2.1) NUM Zahlenliste

                  (1.1.3) TEXT {Zeichenkette}

                            (1.1.3.1) DKY Zahlenliste

                            (1.1.3.2) DKA Zahlenliste

                            (1.1.3.3) ART Name

                            (1.1.3.4) SIZE Zahlenliste

                            (1.1.3.5) FACE Zahlenliste

(2) KANTENLISTE Zeichenkette

         (2.1) KEY ALL {QTX Zeichenkette Zeichenkette} | KEY Zahlenliste {QTX Zeichenkette Zeichenkette}

                  (2.1.1) LINE {Zeichenkette}

                            (2.1.1.1) DKY Zahlenliste

                            (2.1.1.2) DKA Zahlenliste

                            (2.1.1.3) ART Name

                            (2.1.1.4) INNER

                            (2.1.1.5) EVEN

                            (2.1.1.6) ODD

                            (2.1.1.7) NUM Zahlenliste

                            (2.1.1.8) PCL Zahlenliste

                            (2.1.1.9) PSY Zahlenliste

                            (2.1.1.10) RAND {Zeichenkette}

                            (2.1.1.11) FORCE_BREAKS

                            (2.1.1.12) EQUALCOORDS Zahl

                            (2.1.1.13) CIRCLE

Semantik der Selektionsdatei

(1) KNOTENLISTE Zeichenkette

Die Knotenliste beginnt mit dem Schlüsselwort KNOTENLISTE, gefolgt von einer Zeichenkette, die z. Z. noch nicht weiter verwendet wird.

Die Knotenliste wählt Stützpunkte von Stringelementen, Symbol- und Textelemente als Knoten aus. Die Knoten erhalten die Koordinaten des Punkts oder Elements, aus dem sie entstanden sind, als Position, und optional einen Namen. Die Stützpunkte eines Stringelements können zu einem Multiknoten zusammengefaßt werden.

Als nächstes folgt eine beliebige Anzahl von Objektdefinitionen, die jeweils mit dem Schlüsselwort KEY eingeleitet werden.

(1.1) KEY ALL {QTX Zeichenkette Zeichenkette} {ON Zeichenkette | MULTIKNOTEN} {IGNORE Zeichenkette} | KEY Zahlenliste {QTX Zeichenkette Zeichenkette} {ON Zeichenkette | MULTIKNOTEN} {IGNORE Zeichenkette}

Mit dem Schlüsselwort KEY beginnt eine Objektdefinition. Auf KEY folgt entweder ALL oder eine Zahlenliste mit Objektschlüsseln. Bei ALL werden alle Objekte ausgewählt. Bei der Zahlenliste werden nur diejenigen Objekte ausgewählt, deren Schlüssel denen der Liste entsprechen. Knoten können nur aus den Elementen der ausgewählten Objekte entstehen.

Die Zahlenliste kann positive und negative Zahlen und Bereiche enthalten. Die Schlüssel entsprechen der Liste, wenn sie die folgenden Bedingungen erfüllen.

(1) Jeder positiven Zahl und jedem positiven Bereich muß einer der Schlüssel zugeordnet werden können.

(2) Aus jeder negativen Zahl und jedem negativen Bereich werden deren Absolutwerte gebildet, denen sich einer der Schlüssel zuordnen lassen darf.

(3) Jeder Schlüssel kann einer eigenen Zahl oder einem eigenen Bereich zugeordnet werden.

Die Zahlenliste sei

100, 200-250, -6000- -6002, -7000

Entsprechende Schlüsselkombination sind u. a.

                  100, 201, 6000

                  100, 250

Nicht entsprechende Kombinationen sind

                  100, 201, 202, 7000  weil zwei Schlüssel im Bereich 200-250 liegen

                  200, 6001, 7000                 weil der Schlüssel 100 fehlt

                  100, 200, 300          weil der Schlüssel 300 nicht zugeordnet werden kann

Mit dem optionalen Schlüsselwort QTX kann die Objektauswahl über ihre Attribute eingeschränkt werden. Auf  QTX folgen ein Attributname und ein regulärer Ausdruck, jeweils in Hochkommata eingeschlossen. Nur die Objekte mit einem Attribut des angegebenen Namens werden ausgewählt, deren Wert dem regulären Ausdruck entspricht. Ein regulärer Ausdruck darf die folgenden Sonderzeichen enthalten:

*

Repräsentiert eine beliebige Zeichenkette. Auch die leere Zeichenkette ist erlaubt.

?

Repräsentiert genau ein beliebiges Zeichen.

\

Hebt die Bedeutung des folgenden Sonderzeichens auf. Das ermöglicht es dem Attributwert, Sonderzeichen zu enthalten.

[ ]

Genau eines der Zeichen in den eckigen Klammern muß auftreten. Zum Beispiel verlangt  [xyz] eines der Zeichen x, y oder z.

[! ] oder [^ ]

Steht für genau ein Zeichen, das nicht in denen zwischen den eckigen Klammern enthalten sein darf. Z. B. erlaubt [!0] alle Buchstaben und Ziffern bis auf die 0. ‚!‘ und ‚^‘ dürfen auch in Kombination mit Bereichen (s. u.) verwendet werden.

[ – ]

Ein Minuszeichen in eckigen Klammern definiert einen Bereich. Z. B. erlaubt [0–9] eine beliebige Ziffer. Zwischen zwei eckigen Klammern dürfen auch mehrere Bereiche definiert werden, so erlaubt [a–zA–Z] einen beliebigen kleinen oder großen Buchstaben.

Zum Beispiel:

         KEY ALL QTX “TYP“ “*20?“

Ausgewählt werden alle Objekte mit einem Attribut namens TYP, deren Inhalt auf “20“ mit einem beliebigen Zeichen dahinter endet, z.B. “Kupfer 200“ oder “Messing 20x“.

Die Schlüsselwörter ON und IGNORE sind optional und dienen zur Definition von Kombiknoten. Sie sind weiter unten beschrieben.

Das Schlüsselwort MULTIKNOTEN ist ebenfalls optional. Es ist nur bei Stringelementen und bei Symbolen von Bedeutung. Bei Stringelementen entsteht aus den ausgewählten Punkten jeweils eines Stringelements ein Multiknoten mit den Koordinaten der Punkte als Positionen. Bei Symbolen entsteht aus den ausgewählten Symbolen jeweils eines Objekts ein Multiknoten mit den Koordinaten der Symbole als Positionen. Wenn nur ein Punkt des Stringelements oder ein Symbol des Objekts ausgewählt ist, dann hat der Multiknoten nur eine Position und unterscheidet sich nicht von normalen Knoten.

Die weiteren Bestandteile der Objektdefinition sind Elementdefinitionen. Sie beginnen mit einem der Schlüsselwörter LINE, SYMBOL oder TEXT für String-, Symbol- oder Textelemente und erzeugen Knoten aus den Elementen.

(1.1.1) LINE {Zeichenkette}

LINE erzeugt Knoten mit den Koordinaten der Stützpunkte der Stringelemente der Objekte aus der Objektdefinition. Wenn eine Zeichenkette angegeben ist, dann erhalten die Knoten sie als Namen. Über ihn können sie in den Prüfbedingungen identifiziert und auf bestimmte Eigenschaften hin getestet werden. Der Name muß nicht eindeutig sein, sondern darf bei verschiedenen Elementdefinitionen verwendet werden.

Bei der Angabe der Auswahlkriterien DKY und/oder DKA werden nur diejenigen Stringelemente verwendet, die einen entsprechenden Schlüssel haben, sonst werden alle verwendet. Die übrigen Kriterien wählen die Stützpunkte aus, zu denen Knoten erzeugt werden. Wird kein weiteres Kriterium angegeben, so werden alle Stützpunkte ausgewählt. Sonst werden nur diejenigen verwendet, die allen angegebenen Kriterien entsprechen. Nicht angegebene Kriterien sind beliebig.

Somit wählt der Befehl KEY ALL LINE – ohne weitere Kriterien –die Stützpunkte aller Stringelemente aus, während KEY ALL LINE FIRST LAST nichts auswählt, weil diese Auswahl nicht etwa den ersten und den letzten Stützpunkt trifft, sondern diejenigen, die sowohl erster als auch letzter Stützpunkt sind, was aufgrund der Mindestanzahl von zwei Stützpunkten der Stringelemente auf keinen von ihnen zutreffen kann.

Die Kriterien EVEN, ODD und NUM beziehen sich auf die Indizes der Stützpunkte. Der erste Stützpunkt des Stringelements hat den Index 1, der zweite den Index 2 usw.

Eine Sonderrolle hat das Schlüsselwort CIRCLE inne. Ohne seine Definition wird zum mittleren Stützpunkt eines Kreisbogens (das ist der zweite der drei Stützpunkte die den Verlauf des Kreisbogens festlegen) auf gar keinen Fall ein Knoten erzeugt. Wenn CIRCLE definiert ist, dann werden auch zu den mittleren Kreisbogenstützpunkten Knoten entsprechend der Auswahlkriterien erzeugt. Bei der Numerierung der Stützpunkte zählen die mittleren Kreisbogenstützpunkte aber auf jeden Fall mit.

Auswahlkriterien von Stringelementen

(1.1.1.1) DKY Zahlenliste

Zeichenschlüssel

(1.1.1.2) DKA Zahlenliste

Flächenschlüssel

Auswahlkriterien von Stützpunkten als Knoten

(1.1.1.3) ART Name

Kombination der Buchstaben  C, L, P und R für die Linktypen LINK_C, LINK_L etc.

(1.1.1.4) FIRST

erster Punkt

(1.1.1.5) LAST

letzter Punkt

(1.1.1.6) ENDS

erster und letzter Punkt

(1.1.1.7) INNER

innere Punkte (alle bis auf den ersten und letzten)

(1.1.1.8) EVEN

Punkte mit geradem Index

(1.1.1.9) ODD

Punkte mit ungeradem Index

(1.1.1.10) NUM Zahlenliste

Punkte mit den angegebenen Indizes

(1.1.1.11) PCL Zahlenliste

Punkte mit den Punktklassen

(1.1.1.12) PSY Zahlenliste

Punkte mit den Punktsymbolen

Besonderheiten

(1.1.1.13) CIRCLE

erlaubt die Erzeugung von Knoten auch zu den mittleren Stützpunkten von Kreisbögen

Beispiele:

LINE DKY 1,2 ENDS

Auswahl der Anfangs- und Endpunkte aller Stringelemente mit den Zeichenschlüsseln 1 und 2.

LINE "Y1 A9" DKY 1 DKA 9 ART LP

Auswahl der Punkte mit den Linktypen L und P der Stringelemente mit dem Zeichenschlüssel 1 und dem Flächenschlüssel 9. Die entstandenen Knoten erhalten den Namen "Y1 A9".

LINE PSY 2-4,6-8

Auswahl der Punkte mit den Punktsymbolen 2 bis 4 und 6 bis 8 aller Stringelemente.

(1.1.2) SYMBOL {Zeichenkette}

SYMBOL erzeugt Knoten mit den Koordinaten der Symbolelemente der ausgewählten Objekte. Wenn die optionale Zeichenkette angegeben ist, dann erhalten die Knoten sie als Namen. Mit dem Kriterium NUM kann die Auswahl der Symbolelemente auf diejenigen mit bestimmten Symbolnummern eingeschränkt werden, ohne NUM werden alle verwendet.

(1.1.2.1) NUM Zahlenliste

Z. B.

SYMBOL NUM 8,9

Die Symbolelemente mit den Symbolnummern 8 und 9 werden zu Knoten.

(1.1.3) TEXT {Zeichenkette}

TEXT erzeugt Knoten mit den Koordinaten der Textelemente der ausgewählten Objekte. Wenn die optionale Zeichenkette angegeben ist, dann erhalten die Knoten sie als Namen. Bei der Angabe von Auswahlkriterien werden nur diejenigen Textelemente verwendet, die allen angegebenen Kriterien entsprechen, sonst werden alle verwendet.

Auswahlkriterien von Textelementen als Knoten

(1.1.3.1) DKY Zahlenliste

Zeichenschlüssel

(1.1.3.2) DKA Zahlenliste

Flächenschlüssel

(1.1.3.3) ART Name

Kombination der Ausrichtungen L, C und R für left, centered und right

(1.1.3.4) SIZE Zahlenliste

Textgröße

(1.1.3.5) FACE Zahlenliste

1, 2, 3 für normal, schmal, breit, 4 bis 6 dasselbe kursiv (rechtsgeneigt) und 7 bis 9 invers kursiv (linksgeneigt)

Beispiel:

TEXT DKY 1 ART LR SIZE 300

Die Textelemente mit dem Zeichenschlüssel 1 und am linken oder rechten Rand ausgerichteten Text der Größe 300 werden zu Knoten.

(2) KANTENLISTE Zeichenkette

Die Kantenliste beginnt mit dem Schlüsselwort KANTENLISTE, gefolgt von einer Zeichenkette, die z. Z. noch nicht weiter verwendet wird.

Die Kantenliste erzeugt Kanten zu den ausgewählten Stringelementen. Im Normalfall erzeugt ein Stringelement eine Kante. Wenn innere Punkte eines Stringelements als Sollbruchstellen definiert werden und auf einem Knoten liegen, dann zerfällt das Element an ihnen in mehrere Kanten, und beim Schlüsselwort FORCE_BREAKS zerfällt das Element an jedem inneren Punkt in Kanten.

Im Unterschied zur Knotendefinition, bei der alle Punkte eines Stringelements zu Knoten werden, wenn keine weitere Auswahl stattfindet, werden bei der Kantendefinition Punkte nur dann zu einer Sollbruchstelle, wenn sie explizit ausgewählt werden.

Die Kantenliste folgt im wesentlichen dem Aufbau der Knotenliste. Mit dem Schlüsselwort KEY beginnt eine Objektdefinition. Als Elementdefinitionen darf sie aber nur LINE-Definitionen enthalten, weil Kanten nur aus Stringelementen entstehen können.

(2.1) KEY ALL {QTX Zeichenkette Zeichenkette} | KEY Zahlenliste {QTX Zeichenkette Zeichenkette}

Wie bei der Knotenliste werden mit ALL alle Objekte ausgewählt und bei der Zahlenliste diejenigen, deren Schlüssel denen der Liste entsprechen. Die Handhabung der Zahlenliste und von QTX ist bei der Beschreibung der Knotenliste (s. o.) erklärt.

(2.1.1) LINE {Zeichenkette}

LINE erzeugt Kanten zu den Stringelementen der Objekte aus der Objektdefinition. Wenn eine Zeichenkette angegeben ist, dann erhalten die Kanten sie als Namen, mit ihm können sie in den Prüfbedingungen identifiziert werden. Der Name muß nicht eindeutig sein, sondern darf bei verschiedenen Elementdefinitionen verwendet werden.

Bei der Angabe der Auswahlkriterien DKY und/oder DKA werden nur diejenigen Stringelemente verwendet, die einen entsprechenden Schlüssel haben, sonst werden alle verwendet. Die übrigen Auswahlkriterien bestimmen die Sollbruchstellen der Kante. Die Anfangs- und Endpunkte der Stringelemente können nicht zu Sollbruchstellen werden. Wenn eine Auswahl sie trifft, dann wird das einfach ignoriert.

Liegt eine Sollbruchstelle auf einem Knoten, dann zerfällt die Kante an ihr in zwei Teile, und das Ende des ersten und der Anfang der zweiten Teils werden an den Knoten gehängt.

Wie bei der Knotenliste hat das Schlüsselwort CIRCLE eine Sonderfunktion. Nur dann wenn CIRCLE definiert ist, können auch die mittleren Kreisbogenstützpunkte zu Sollbruchstellen werden. Bei der Numerierung der Stützpunkte zählen sie aber auf jeden Fall mit.

Auswahlkriterien von Stringelementen als Kanten

(2.1.1.1) DKY Zahlenliste

Zeichenschlüssel der Stringelemente

(2.1.1.2) DKA Zahlenliste

Flächenschlüssel der Stringelemente

Auswahlkriterien von Stützpunkten als Sollbruchstellen

(2.1.1.3) ART Name

Kombination der Buchstaben  C, L, P und R für die Linktypen LINK_C, LINK_L etc.

(2.1.1.4) INNER

Alle inneren Punkte

(2.1.1.5) EVEN

Punkte mit geradem Index

(2.1.1.6) ODD

Punkte mit ungeradem Index

(2.1.1.7) NUM Zahlenliste

Punkte mit den Indizes

(2.1.1.8) PCL Zahlenliste

Punkte mit den Punktklassen

(2.1.1.9) PSY Zahlenliste

Punkte mit den Punktsymbolen

Besonderheiten

(2.1.1.10) CIRCLE

die mittleren Stützpunkte von Kreisbögen können zu Sollbruchstellen werden

(2.1.1.10) RAND {Zeichenkette}

Wenn ein Stringelement am Blattrand beginnt und/oder endet, dann wird, wenn an dieser Position noch kein Knoten existiert, für das Ende ein Pseudoknoten erzeugt, um die Meldung 'Kantenende ohne Knoten' zu unterdrücken. Der Pseudoknoten erhält die optionale Zeichenkette als Namen und kann wie die anderen Knoten getestet werden.

Beispiele:

LINE DKY 1 DKA 9 INNER

Die Stringelemente mit dem Zeichenschlüssel 1 und dem Flächenschlüssel 9 werden zu Kanten, alle inneren Punkte sind Sollbruchstellen.

LINE NUM 2 RAND "Randknoten"

Alle Stringelemente werden zu Kanten, jeweils ihr zweiter Stützpunkt ist eine Sollbruchstelle. Für jeden Anfangs- und Endpunkt der Stringelemente, der auf dem Blattrand und nicht auf einem Knoten liegen, wird ein Pseudoknoten mit dem Namen “Randknoten“ erzeugt.

(2.1.1.11) FORCE_BREAKS

Das Stringelement zerfällt an jedem inneren Punkt in Kanten. CIRCLE steuert auch in diesem Fall die Behandlung der mittleren Kreisbogenstützpunkte.

(2.1.1.12) EQUALCOORDS Zahl

Für die Kanten, die aus dieser Elementdefinition entstehen, gilt der angegebene EqualCoords-Wert anstelle des globalen. Wie letzterer kann er die Werte 0, 1 und 2 annehmen und sie besitzen die gleiche Bedeutung wie der globale Wert:

n=0: Die Koordinaten von Stützpunkten sind beliebig.

n=1: Die Koordinaten von Stützpunkten, die selbst oder deren Nachfolger den Linktyp LINK_P besitzen, sind beliebig. Bei den Stützpunkten mit einem anderen Linktyp erfolgen unter bestimmten Bedingungen Meldungen:

Der erste Punkt oder der letzte Punkt oder eine Bruchstelle eines Stringelements liegt nicht auf einem Knoten, sondern auf einem anderen Stützpunkt.

Ein innerer Punkt eines Stringelement ist keine Bruchstelle und liegt auf einem Knoten.

n=2: Die Meldungen erfolgen wie bei n=1, aber auch bei Stützpunkten mit LINK_P.

Die Wirkungsweise des kantenspezifischen EqualCoords-Wert läßt sich einfach so erklären, daß die Kanten für die obengenannten Tests sichtbar bzw. unsichtbar werden. Ist z. B. eine Kante mit einem EqualCoords-Wert von 0 unsichtbar und eine andere mit einem EqualCoords-Wert von 1 oder 2 sichtbar, so erfolgt keine Stützpunkte gleicher Koordinaten Meldung, weil die Kante mit dem Wert 0 für den Test unsichtbar ist.

Kombiknoten

Bei Knoten und/oder Multiknoten identischer Koordinaten erfolgen üblicherweise Meldungen. Um dies zu verhindern, kann ein Kombiknoten erzeugt werden, der Knoten an der gleichen Position zusammenfaßt, so daß keine Meldung erfolgt. Er kann wie die anderen Knoten in der Bedingungsdatei getestet werden.

Die Definition eines Kombiknotens in der Selektionsdatei unterscheidet sich von der eines normalen Knotens durch das zusätzliche Schlüsselwort ON, gefolgt vom Basisnamen. Der Basisname ist der Name eines vorher in der Knotenliste definierten Knotens, des sogenannten Basisknotens. Deshalb muß der Basisknoten bei seiner Definition einen Namen erhalten haben.

Syntax von normalen Knoten bzw. von Multiknoten:

           KEY <Schlüssel> { MULTIKNOTEN } <Elementspezifikation>

Syntax von Kombiknoten:

           KEY <Schlüssel> ON <Basisname> <Elementspezifikation des Zweitknotens>

Der Kombiknoten erhält den Namen aus der Elementspezifikation des Zweitknotens, dieser darf mit dem Basisnamen identisch sein. Das ist dann sinnvoll, wenn für den Kombiknoten die gleichen Bedingungen gelten wie für den Basisknoten. Ist in der Spezifikation kein Name angegeben, dann bleibt der Kombiknoten namenlos.

Ein Kombiknoten darf nicht als Multiknoten definiert werden, erbt diese Eigenschaft aber ggf. vom Basisknoten. Der Basisknoten darf ein Kombiknoten sein, dadurch können sukzessive beliebig viele Elemente zu einem Kombiknoten zusammengefaßt werden.

Wenn der Zweitknoten auch alleine auftreten darf, dann muß er noch einmal mit dem Namen des Kombiknoten als zu ignorierenden Knoten definiert werden.

Syntax der Ignore-Definition:

           KEY <Schlüssel> IGNORE <Kombiname> <Elementspezifikation>

Die Reihenfolge der Knotendefinitionen in der Selektionsdatei ist damit wie folgt festgelegt, Schritt drei ist optional:

1.  Definition des Basisknotens

2.  Definition des Kombiknotens

3.  Definition des Zweitknotens mit dem zu ignorierenden Kombiknoten

Beispiel

Das Symbolelement mit dem Objektschlüssel 800 und der Symbolnummer 17 definiert den Knoten "Mast", das Symbolelement mit dem Objektschlüssel 801 und der Symbolnummer 19 den Knoten "Muffe". Sie dürfen sowohl alleine auftreten als auch mit identischen Koordinaten als Kombiknoten "Muffenmast".

Der entsprechende Abschnitt aus der Selektionsdatei lautet:

  KEY 800                 SYMBOL   "Mast"                  NUM 17

  KEY 801 ON "Mast"          SYMBOL      "Muffenmast"      NUM 19

  KEY 801 IGNORE "Muffenmast"      SYMBOL      "Muffe"           NUM 19

Beispiel für eine Selektionsdatei

!-----------------------------------------------------------

KNOTENLISTE "Knotenselektion Plan NECLTG1"

!-----------------------------------------------------------

KEY 1523

  SYMBOL "Holzmast"

     NUM  79

KEY 2000                ! ÜWA-Kabelhausanschluss

  SYMBOL "ÜWA"

     NUM 140

KEY 2200

  SYMBOL "Gebäudestation"

     NUM 150

KEY 2250

  SYMBOL "KV"

     NUM 153

!

!-----------------------------------------------------------

KANTENLISTE "Kantenselektion Plan NECLTG1"

!-----------------------------------------------------------

!

KEY 1200 LINE "MSP"

KEY 1400

  LINE "NSP"

     INNER          ! alle Stützpunkte bis auf den ersten

                    ! und letzten sind Sollbruchstellen

Grammatik der Selektionsdatei

Die Grammatik enthält bereits einige zukünftige Erweiterungen, die mit noch nicht implementiert gekennzeichnet sind. Ab // ist alles bis zum Ende einer Zeile Kommentar. Die Nichtterminale der Grammatik beginnen mit einem kleinen Buchstaben.

Zur Vereinfachung werden Number, String und Word in der Grammatik nicht näher beschrieben, hier ihre Bedeutungen:

Number

eine ganze Zahl ohne Vorzeichen

String

eine in Hochkommata eingeschlossene Zeichenkette, die Leerzeichen enthalten darf

Word

eine Kombination von Buchstaben

Terminale der Grammatik

KNOTENLISTE KANTENLISTE KEY ALL ON IGNORE MULTIKNOTEN LINE SYMBOL TEXT NAME DKY DKA ART FIRST LAST ENDS INNER ODD EVEN CIRCLE NUM PCL PSY RAND FORCE_BREAKS EQUALCOORDS SIZE FACE , -

 

 

Produktionsregeln der Grammatik

all:        nodes edges |     // erst Knoten, dann Kanten

                 nodes       |     // nur Knoten

                 edges       |     // nur Kanten

                 ;                 // weder Knoten noch Kanten

nodes:            KNOTENLISTE String nodeList ;

edges:            KANTENLISTE String edgeList ;

nodeList:         objectEntry nodeList | ;

edgeList:         objectEntry edgeList | ;

 

objectEntry:      objDef optQtx options elements;

objDef:           CLASS String      |     // noch nicht implementiert

                 KEY ALL           |

                 KEY list          ;

optQtx:           QTX String String | ;   // der erste String ist der Attributname,

                                   // der zweite ein regulärer Ausdruck

options:          optOn | optRest | ;

optOn:            ON String ;

optRest:          optMulti | ignoreList | optMulti ignoreList ;

optMulti:         MULTIKNOTEN | ;

ignoreList:       ignoreNode | ignoreList ignoreNode ;

ignoreNode:       IGNORE String ;         // String ist der Knotenname

 

elements:         elementDef elements | ;

elementDef:       LINE   optName linedefs |

                 SYMBOL optName symdefs  |

                 TEXT   optName textdefs ;

 

linedefs:         lineDefi linedefs | ;

lineDefi:         NAME String |     // noch nicht implementiert

                 DKY list          |

                 DKA list          |

                 ART Word          |     // Kombination der Linktypen L, R, C, P

                 FIRST             |

                 LAST        |

                 ENDS        |

                 INNER       |

                 ODD         |

                 EVEN        |

                 NUM list          |     // die Punktnummern

                 PCL list          |

                 PSY list          |

                 RAND optName      |     // Randpunkte können zu Pseudoknoten werden

                 FORCE_BREAKS      |

EQUALCOORDS Number |     // 0, 1 oder 2

CIRCLE       ;

 

symdefs:          symdefi symdefs | ;

symdefi:          NAME String |     // noch nicht implementiert

                 NUM list    ;           // die Symbolnummern

 

textdefs:         textDefi textdefs | ;

textDefi:         NAME String |     // noch nicht implementiert

                 DKY list          |

                 DKA list          |

                 ART Word          |     // Kombination der Ausrichtungen L, C, R

                 SIZE list         |

                 FACE list         ;     // 1, 2, 3 für normal, schmal, breit

                                   // 4 bis 6 kursiv, 7 bis 9 invers kursiv

list:       listElem | list , listElem ;

listElem:         number | range ;

range:            number-number ;         // ein Bereich, z. B. 5-15

 

number:           Number | -Number ;

optName:          String | ;        // optionaler Name

 

Syntax der Bedingungsdatei

Allgemeine Regeln zur Syntax der Testanweisungen:

Trennzeichen sind Leerzeichen, Tabulatoren und der Zeilenwechsel.

Zwischen einem Schlüsselwort und einer darauffolgenden Zeichenkette muß mindestens ein Trennzeichen stehen.

Zwischen einem Schlüsselwort und einer darauffolgenden Zahl muß mindestens ein Trennzeichen stehen.

Die Bestandteile der Testanweisung – Schlüsselwörter, Zeichenketten, Zahlen, Klammern etc. – dürfen beliebig mit Trennzeichen voneinander abgesetzt werden. Daraus folgt u. a., daß sich Testanweisungen über mehrere Zeilen erstrecken dürfen.

Syntaktisch korrekt ist z. B.

         TEST "knoten xy"

                  (#("kante abc") IN 2 - 4      )

Falsch ist

         TEST"fehlende Trennzeichen" (#"kante abc" IN9 )

Die Bedingungsdatei enthält eine beliebige Anzahl Testanweisungen des Formats (1). Die kursiven Bezeichner sind so zu interpretieren, daß sie durch eines ihrer Formate zu ersetzen sind. So kann (1.1) – Ausdruck – durch (1.1.1) oder (1.1.2) etc. ersetzt werden. Diese Darstellungsform wurde so gewählt, um der verschachtelten Struktur der Ausdrücke gerecht zu werden. Optionale Bestandteile stehen in geschweiften Klammern. Die Funktion der Formate 1.1.1.1 bis 1.1.1.4 wird der Einfachheit halber nur einmal unter dem Punkt 1.1.1.x.1 beschrieben, da sie bei jedem dieser Formate durch einen der Formate 1.1.1.x.1.1 etc. ersetzt werden kann.

(1) TEST Zeichenkette Ausdruck

(1.1) Ausdruck

(1.1.1) Bedingung

(1.1.1.1) ( Funktion ( Argumente ) relOp Zahl )

(1.1.1.2) ( Funktion ( Argumente ) IN Zahlenlist )

(1.1.1.3) ( Funktion ( Argumente ) EVEN )

(1.1.1.4) ( Funktion ( Argumente ) ODD )

       (1.1.1.x.1) Funktion

(1.1.1.x.1.1) #

       (1.1.1.x.1.2) #END

       (1.1.1.x.1.3) #PASS

       (1.1.1.x.1.4) #QTX

       (1.1.1.x.1.5) #QTX_DIFF

       (1.1.1.x.1.6) #QTX_VAL

(1.1.2) ( Ausdruck )

(1.1.3) NOT Ausdruck

(1.1.4) Ausdruck AND Ausdruck

(1.1.5) Ausdruck OR Ausdruck

(1.1.6) Ausdruck EQUAL Ausdruck

(1.1.7) Ausdruck UNEQUAL Ausdruck

(1.1.8) Ausdruck IF_THEN Ausdruck

Durch den Punkt (1.1.2) können Ausdrücke mit Klammern verschachtelt werden. Das folgende einfache Beispiel gibt einen ersten Eindruck der sich daraus ergebenden Möglichkeiten zur Formulierung von Ausdrücken. Am Anfang der Zeilen stehen die Nummern der entsprechenden Formate.

(1.1) Ausdruck

(1.1.4) Ausdruck AND Ausdruck

(1.1.2) Ausdruck AND ( Ausdruck )

(1.1.5) Ausdruck AND ( Ausdruck OR Ausdruck )

Semantik der Bedingungsdatei

(1) TEST Zeichenkette Ausdruck

Die Testanweisungen beziehen sich auf die Knoten- und Kantennamen der Selektion. Die Zeichenkette ist ein Knotenname aus der Selektionsdatei. Der Ausdruck besteht aus ein oder mehreren Bedingungen, die mit Klammern verschachtelt und mit logischen Operationen verknüpft werden können.

logische Operationen

(1.1.3) NOT Ausdruck

Negation, wahr wenn der Ausdruck falsch ist

(1.1.4) Ausdruck AND Ausdruck

Und-Verknüpfung, wahr wenn beide Ausdrücke wahr sind

(1.1.5) Ausdruck OR Ausdruck

Oder-Verknüpfung, wahr wenn eine der beiden Ausdrücke wahr ist

(1.1.6) Ausdruck EQUAL Ausdruck

Gleichheit, wahr wenn beide Ausdrücke wahr oder beide Ausdrücke falsch sind

(1.1.7) Ausdruck UNEQUAL Ausdruck

Ungleichheit, wahr wenn eine Ausdruck wahr und der andere Ausdruck falsch ist

(1.1.8) Ausdruck IF_THEN Ausdruck

Bedingte Bewertung, wahr wenn beide Ausdrücke wahr sind oder der erste Ausdruck falsch ist

Bei der IF_THEN-Operation wird der zweite Ausdruck nur dann getestet, wenn der erste Ausdruck wahr ist. Ist der erste Ausdruck falsch, so ist das Ergebnis des Tests auf jeden Fall wahr, egal welchen Wert der zweite Ausdruck hat. Z. B.:

TEST "xy" ( #"msp_kabel" >= 1 ) IF_THEN ( #"nsp_kapel" = 0 )

Wenn msp_kabel am Knoten xy hängen, dann dürfen keine nsp_kabel am Knoten hängen. Hängt kein msp_kabel am Knoten, dann ist die Anzahl der nsp_kabel beliebig.

Die folgende Tabelle enthält eine Übersicht der zweistelligen logischen Operationen – denen mit zwei Parametern – mit ihren Ergebnissen. Par_1 ist dabei der erste und Par_2 der zweite Parameter der Operation.

Ergebnisse der zweistelligen logischen Operationen

Par_1

Par_2

AND

OR

EQUAL

UNEQUAL

IF_THEN

0

0

0

0

1

0

1

0

1

0

1

0

1

1

1

0

0

1

0

1

0

1

1

1

1

1

0

1

Die Ausdrücke werden von links nach rechts ausgewertet, die logischen Operationen haben alle die gleiche Priorität. Z. B. ergibt

         Ausdruck1 AND Ausdruck2 OR Ausdruck3

wahr wenn nur Ausdruck1 und Ausdruck2 wahr sind oder nur Ausdruck3 wahr ist oder wenn alle drei wahr sind, damit

         Ausdruck1 AND ( Ausdruck2 OR Ausdruck3 )

wahr ergibt, muß Ausdruck1 und mindestens eine der beiden übrigen Ausdrücke wahr sein.

(1.1.1) Bedingung

Eine Bedingung muß in runde Klammern eingeschlossen sein, sie hat eines der im folgenden beschriebenen Formate.

(1.1.1.1) ( Funktion ( Argumente ) relOp Zahl )

Die relOp ist eine der folgenden Relationen:

=

gleich

<>

ungleich

<

kleiner

>

größer

<=

kleiner gleich

>=

größer gleich

(1.1.1.2) ( Funktion ( Argumente ) IN Zahlenliste )

Die Bedingung ist wahr wenn das Funktionsergebnis in der Zahlenliste enthalten ist.

(1.1.1.3) ( Funktion ( Argumente ) EVEN )

Die Bedingung ist wahr, wenn das Funktionsergebnis gerade ist.

(1.1.1.4) ( Funktion ( Argumente ) ODD )

Die Bedingung ist wahr, wenn das Funktionsergebnis ungerade ist.

(1.1.1.x.1) Funktion

Eine Funktion besteht aus ihrem Namen und ihren in runden Klammern eingeschlossenen Argumenten. Die Argumente werden durch Kommata voneinander getrennt. Die Funktionsnamen sind #, #END, #PASS, #QTX, #QTX_DIFF und #QTX_VAL. Die Funktionen und ihre Argumente werden im folgenden genauer beschrieben.

(1.1.1.x.1.1) # ( Zeichenkette )

Das Ergebnis der Funktion # ist die Anzahl der Kanten namens der Zeichenkette am Knoten.

(1.1.1.x.1.2) #END ( Zeichenkette )

Das Ergebnis der Funktion #END ist die Anzahl der Kanten namens der Zeichenkette am Knoten, bei denen der Anfangs- oder Endpunkt ihres ursprünglichen Stringelements auf dem Knoten liegt.

(1.1.1.x.1.3) #PASS ( Zeichenkette )

Das Ergebnis der Funktion #PASS ist die Anzahl der Kanten namens der Zeichenkette am Knoten, bei denen ein innerer Punkt ihres ursprünglichen Stringelements auf dem Knoten liegt.

(1.1.1.x.1.4) #QTX ( Zeichenkette, Zeichenkette )

Betrachtet werden nur die Kanten namens der ersten Zeichenkette am Knoten. Das Ergebnis der Funktion #QTX ist die Anzahl derjenigen dieser Kanten, die ein Attribut namens der zweiten Zeichenkette besitzen.

Hängen z. B. die folgenden Kanten am Knoten:

         Kante "MSP"   Attribut "Querschnitt"

         Kante "NSP"   Attribut "Querschnitt"

         Kante "NSP"   Attribut "Querschnitt"

         Kante "NSP"   Attribut "Querschnitt"

         Kante "NSP"   Attribut         "Isolierung"

so liefert die Funktion #QTX( "NSP", "Querschnitt" ) als Ergebnis 3, weil drei der NSP-Kanten ein Querschnittattribut besitzen.

(1.1.1.x.1.5) #QTX_DIFF ( Zeichenkette, Zeichenkette )

Betrachtet werden nur die Kanten namens der ersten Zeichenkette am Knoten. Von deren ursprünglichen Stringelementen wiederum werden nur die Attribute namens der zweiten Zeichenkette betrachtet. Das Ergebnis der Funktion #QTX_DIFF ist die Anzahl verschiedener Werte, die von diesen Attributen angenommen werden.

Hängen z. B. die folgenden Kanten am Knoten:

         Kante "MSP"   Attribut "Querschnitt"          Wert 25

         Kante "NSP"   Attribut "Querschnitt"          Wert 10

         Kante "NSP"   Attribut "Querschnitt"          Wert 5

         Kante "NSP"   Attribut "Querschnitt"          Wert 5

         Kante "NSP"   Attribut         "Isolierung"     Wert 3

so liefert die Funktion #QTX_DIFF( "NSP", "Querschnitt" ) als Ergebnis 2, weil die Querschnittattribute der NSP-Kanten die zwei verschiedenen Werte 5 und 10 besitzen.

(1.1.1.x.1.6) #QTX_VAL ( Zeichenkette, Zeichenkette, Zeichenkette ... )

Betrachtet werden nur die Kanten namens der ersten Zeichenkette. Von deren ursprünglichen Stringelementen wiederum werden nur die Attribute namens der zweiten Zeichenkette betrachtet. Das Ergebnis der Funktion #QTX_VAL ist die Anzahl derjenigen dieser Attribute, die eine der darauffolgenden Zeichenketten als Wert besitzen. Es muß mindestens ein Wert angegeben werden, nach oben ist ihre Anzahl offen.

Hängen z. B. die folgenden Kanten am Knoten:

         Kante "MSP"   Attribut "Querschnitt"          Wert 25

         Kante "NSP"   Attribut "Querschnitt"          Wert 10

         Kante "NSP"   Attribut "Querschnitt"          Wert 5

         Kante "NSP"   Attribut "Querschnitt"          Wert 5

         Kante "NSP"   Attribut         "Isolierung"     Wert 3

so liefert die Funktion #QTX_VAL( "NSP", "Querschnitt", "5", "3" ) als Ergebnis 2, weil zwei Querschnittattribute der NSP-Kanten den Wert 5 besitzen und keines den Wert 3.

Beispiele für Testanweisungen

TEST "Knotentyp alpha" ( #("Kantentyp 10") = 2 )

AND ( #("Kantentyp 11") IN 2-4 )

Die Bedingung wird auf allen Knoten mit dem Namen "alpha“ geprüft. Sie ist jeweils wahr, wenn an dem Knoten genau zwei Kanten mit dem Namen "Kantentyp 10“ und zwei bis vier Kanten mit dem Namen "Kantentyp 11“ hängen.

TEST "msp_station" ( #("msp_kabel") = 2 )

Die Anzahl der Kanten "msp_kabel", die an den Knoten "msp_station" hängen, muß jeweils genau zwei betragen.

TEST "msp_station" ( #END("msp_kabel") = 2 )

Die Anzahl der Kanten "msp_kabel", die mit einem Ende, das dem ersten oder letzten Punkt eines Stringelements entspricht,  an den Knoten "msp_station" hängen, muß jeweils genau zwei betragen.

TEST "msp_station" ( #PASS("msp_kabel") = 2 )

Die Anzahl der Kanten "msp_kabel", die mit einem Ende, das einem der inneren Punkte eines Stringelements entspricht,  an den Knoten "msp_station" hängen, muß jeweils genau zwei betragen.

TEST "msp_multi"(#("msp_kabel")=1)AND(#("nsp_kapel")=2)AND(#("bel_kabel")>=0)

In diesem Beispiel sind alle nicht notwendigen Trennzeichen weggelassen worden.

TEST "msp_deka"               ( #PASS( "msp_kabel" ) IN 0-5,10,20 )

                             OR     ((#("bel_kabel") EVEN) AND (#("nsp_kabel") ODD))

Testanweisungen dürfen sich über mehrere Zeilen erstrecken.

Beispiel für eine Bedingungsdatei

TEST "Gebäudestation"

  ( #("MSP") >= 1 ) AND ( #("NSP") >= 1 )

TEST "KV":

  ( #("NSP") >= 2 )

Grammatik der Bedingungsdatei

Ab // ist in der Grammatikbeschreibung alles bis zum Ende einer Zeile Kommentar. Die Nichtterminale der Grammatik beginnen mit einem kleinen Buchstaben. Zur Vereinfachung werden Function, Number und String in der Grammatik nicht näher beschrieben, hier ihre Bedeutungen:

Function

eine der Funktionen #, #END, #PASS, #QTX, #QTX_DIFF, #QTX_VAL

Number

eine ganze Zahl ohne Vorzeichen

String

eine in Hochkommata eingeschlossene Zeichenkette, die Leerzeichen enthalten darf

Terminale der Grammatik

TEST ( ) NOT EVEN ODD IN = <> < > <= >= - , AND OR EQUAL UNEQUAL IF_THEN

Produktionsregeln der Grammatik

table:      entry table | ;

entry:      TEST String expression ;      // String ist der Knotenname

expression: condition         |

           ( expression )    |

           NOT expression    |

           expression logOp expression ;

 

condition:  ( Function ( args ) relOp number    ) |

           ( Function ( args ) IN list         ) |

           ( Function ( args ) EVEN            ) |

           ( Function ( args ) ODD       ) ;

 

args: String | args , String ;

 

list: elem rest ;

rest: , elem rest | ;

elem: number | range ;

range:      number-number ;         // ein Bereich, z. B. 5-15

 

logOp:      AND | OR | EQUAL | UNEQUAL | IF_THEN ;

relOp:      = | <> |  < | > | <= |  >= ;

number:     Number | -Number ;

 

Bemerkung

Die Funktion NetCheck ist ein eigenständiges Zusatzmodul und zählt somit nicht zu dem standardmäßigen Funktionsumfang von Moskito.