Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:traffic:timetable:macros

Makros

Makros gibt es in Traffic sowohl in der Fahrzeugliste (siehe auch dort) als auch im Fahrplan. Sie haben allerdings jeweils etwas unterschiedliche Bedeutungen und werden noch unterschiedlicher gehandhabt.

Verwendung

Im Fahrplan erleichtern sie z. B. die Zugbildung erheblich, wenn bestimmte Fahrzeuge oder Fahrzeuggruppen sich wiederholen. Was auch immer in der Fahrzeugbewegung hinter C= eingetragen werden kann, kann auch in einem Makro verwendet werden.

Ein einmal definiertes Makro kann beliebig oft in einem Fahrplan eingesetzt werden, aber natürlich nur in Zeilen hinter seiner Definition.

Laufzeitmakros

Laufzeitmakros sind der gängige Typ von Fahrplanmakros in Traffic. Im allgemeinen wird man nur diese benötigen. Sie sind auch am einfachsten zu handhaben.

Definition ohne Parameter

Die Definiton eines Laufzeitmakros erfolgt auf einer dieser Weisen:

$DEF Name des Makros=Inhalt des Makros
$DEFINE Name des Makros=Inhalt des Makros
$DEFINE_MACRO Name des Makros=Inhalt des Makros

In der Praxis dürfte sich die erste, kürzeste Schreibweise $DEF durchsetzen, die Funktionsweisen sind aber gleich.

Konkret sähe es beispielsweise so aus:

$DEF V188=DB_V188R|V188~SO

Wann immer nun in einer Fahrzeugreihung oder einem anderen Makro V188 eingetragen wird, löst Traffic es zu seinem eigentlichen Inhalt auf, also zu einer der beiden aus der Fahrzeugliste übernommenen V188ern.

Wenn ein Makro eine Reihe von Fahrzeugen enthält, kann diese von der Fahrtrichtung unabhängig gemacht werden, indem hinter dem Gleichzeichen entweder ein Kleiner- oder ein Größer-Zeichen eingesetzt wird. Zum Beispiel:

$DEF DB_624=<BR624OL~LIP,BR924O~LIP,BR624O~LIP

Soll nur ein Teil des Makros fahrtrichtungsunabhängig sein, wird dieser in Klammern gesetzt und das Kleiner- bzw. Größerzeichen mit in die Klammer übernommen.

$DEF TEE_WR=(<ARDUMH105L,WRUMH132_TEEL)|(>ARDUMH105,WRUMH132_TEE)|ARUMZ217BL|ARUMZ217B

Makros können, wie gesagt, alles enthalten, was auch eine Fahrzeugreihung in einer Bewegungszeile enthalten kann, seien es zufällige Fahrzeugauswahlen, seien es Fahrzeuggruppen, seien es Makros oder beliebige Kombinationen. Man kann z. B. bestimmte Wagenbauarten in einem Makro zusammenfassen, dieses Makro in einem Makro einsetzen, das einen Zug definiert, das Zugmakro wiederum in ein anderes Makro eintragen, das andere ähnliche Zugreihungen enthält usw.

Man kann aber auch Makros überschreiben, ihnen also einen neuen Inhalt geben, wenn der alte Inhalt im Laufe des Fahrplans nicht mehr gebraucht wird – und man kann Makros sogar in sich selbst verwenden.

$DEF Schuerzenwagenzug=DRG_AB4U38_2C,(3-5)*DRG_C4U38_2CL|DRG_C4U38_2C
$DEF Schuerzenwagenzug=DRG_PW4U37,Schuerzenwagenzug

Oder auch mit nachträglicher Richtungsunabhängigkeit:

$DEF Schuerzenwagenzug=DRG_AB4U38_2C,(3-5)*DRG_C4U38_2CL|DRG_C4U38_2C
$DEF Schuerzenwagenzug=DRG_PW4U37,(<Schuerzenwagenzug)|(>Schuerzenwagenzug)

Laufzeitmakros dürfen an beliebiger Stelle des Fahrplans definiert werden, aber immer vor ihrer Verwendung.

Aufruf ohne Parameter

Ansonsten werden Laufzeitmakros ohne Parameter genau wie Bilder bzw. Makros aus der Fahrzeugliste gehandhabt. Man kann sie z. B. in Bewegungen in Zugzusammenstellungen oder in Vorder- und Hintergründen eintragen oder in anderen Makros verwenden. Die Nomenklatur ist dabei dieselbe.

Definition mit Parametern

Parameter machen Makros noch flexibler. Sie erlauben es, den Inhalt eines Makros bei seinem Aufruf zu manipulieren. Unter Umständen läßt sich dadurch die Zahl der zu definierenden Makros reduzieren, weil dasselbe Makro universeller einsetzbar wird.

Laufzeitmakros können über bis zu neun Parameter gesteuert werden, die mit $1 bis $9 durchnumeriert sind. Die Parameter werden bei der Definition nur im Inhalt des Makros angegeben.

$DEF SJ_Y2_Multi=$1*SJ_Y2

Wenn ein Parameter einen Teil eines Bild- oder Makronamens ersetzen soll, muß er in Klammern gesetzt werden.

Aufruf mit Parametern

Laufzeitmakros mit Parametern werden etwas anders aufgerufen als solche ohne Parameter. An den Anfang des Aufrufs wird ein $ gesetzt, ans Ende in Klammern die Werte, die dem Makro übergeben werden sollen. Passend zum obigen Beispiel sähe das etwa so aus:

C=$SJ_Y2_Multi(3)

Gibt es mehrere Parameter, werden diese mittels Komma getrennt.

$Makroname(Wert1,Wert2,Wert3,Wert4)

Es müssen nicht immer alle Parameter beim Aufruf verwendet werden. Parameter am Ende, die beim Aufruf nicht verwendet werden, werden als leer übergeben.

Wenn einen Parameter zwischen zwei Parametern mit Inhalt kein Inhalt mitgegeben werden soll, wird er einfach ausgelassen und gleich das nächste Komma gesetzt.

$Makroname(Wert1,Wert2,,Wert4)

Verschachtelung

Achtung: Laufzeitmakros mit Parametern lassen sich nicht mit Übergabe von Parametern aneinander verschachteln.

Generell können Laufzeitmakros beliebig tief verschachtelt werden.

Präprozessormakros

Präprozessormakros sind im Vergleich zu Laufzeitmakros mächtiger und flexibler, aber auch schwieriger zu handhaben. Traffic hat auch noch kein gutes Handling für Fehler in Präprozessormakros.

Was Präprozessormakros zunächst einmal auszeichnet, ist, daß sie nach Start des Fahrplans allesamt eingelesen werden, bevor der Fahrplan der Reihe nach abgearbeitet wird. Daher können sie an praktisch beliebiger Stelle des Fahrplans definiert werden.

Ein zweiter Vorteil ist, daß es sehr viel mehr gibt, was Präprozessormakros enthalten können. Sie können praktisch beliebige Teile von Zeilen enthalten, ganze Zeilen oder auch mehrere Zeilen. Sogar die Definition von Laufzeit- oder Präprozessormakros kann in Präprozessormakros geschehen. Sehr große Fahrpläne, in denen sich bestimmte mehrzeilige Formulierungen normalerweise mit nur geringen Variationen wiederholen würden, lassen sich dadurch verkleinern und in der weiteren Bearbeitung vereinfachen.

Weitere Vorteile liegen in den Parametern: Präprozessormakros können im Grunde beliebig viele Parameter haben, und die Parameter haben Namen.

Trotzdem sollten Präprozessormakros nur in Situationen verwendet werden, die nicht auch mit Laufzeitmakros lösbar wären.

Definition ohne Parameter

Ohne Parameter können Präprozessormakros auf zwei Arten definiert werden:

%DEF(Name des Makros=Inhalt des Makros)

ist die einfachere Form und wirkt sich in größeren Mengen weniger auf die Performance aus. Diese Form ist aber reihenfolgenabhängig, kann also nicht hinter seinen eigenen Aufrufen stehen.

%*DEF(Name des Makros=Inhalt des Makros)

kann an beliebiger Stelle stehen, wirkt sich aber in größeren Mengen stärker auf die Performance aus.

Mehrzeilige Konstruktionen können in etwa so aussehen:

%*DEF(Name des Makros=
Inhalt
Mehr Inhalt
Noch mehr Inhalt
)

Es ist jeweils darauf zu achten, daß das gesamte Konstrukt nach %DEF bzw. %*DEF in runden Klammern steht.

Definition mit Parametern

Mit Parametern gibt es nur die komplexere Form. Im Unterschied zu Laufzeitmakros müssen die Parameter schon hinter dem Namen des Makros genannt werden; hier bekommen sie ihre Namen.

%*DEF(Name des Makros(Erster Parameter,Zweiter Parameter,Dritter Parameter)=Inhalt des Makros)

Die Parameter werden im Inhalt des Makros anders eingetragen als bei Laufzeitmakros: %Parametername;.

%*DEF(SJ_Y2_Multi(Anzahl)=%Anzahl;*SJ_Y2)

Ein Verwendungsbeispiel in der Praxis wäre, um die in der Fahrzeugliste eingebaute Fahrtrichtungsabhängigkeit von Tenderloks aufzubrechen.

%*DEF(BeliebigeRichtung(Lok)=
$DEF %Lok;=$DIR(%Lok;,%Lok;)
)

Aufruf

Präprozessormakros werden immer mit einem Prozentzeichen (%) am Anfang aufgerufen. Weil sie sehr viel flexibler sind als Laufzeitmakros, können sie jeweils so eingesetzt werden wie das, was sie enthalten. Der aufgerufene Name eines Präprozessormakros kann also für sich alleine stehen, wenn das Makro eine oder mehrere ganze Zeilen enthält.

Das obige Beispiel mit fahrtrichtungsunabhängigen Tenderloks könnte in etwa so aufgerufen werden:

%BeliebigeRichtung(BR64)
%BeliebigeRichtung(BR78)
%BeliebigeRichtung(BR86)

Verschachtelung

Präprozessormakros können im Gegensatz zu Laufzeitmakros auch mit Parametern verschachtelt werden und ihre Parameter aneinander weitergeben, wobei die Parameter nicht dieselben Namen behalten müssen. Allerdings löst Traffic beim Einlesen eines Präprozessormakros dessen Inhalt nebst Parametern noch vor eigentlichem Fahrplanstart in Klartext um, so daß durch Verschachteln größerer Präprozessormakros sehr lange Formulierungen entstehen können. Unter Umständen können diese zu lang werden.

Präprozessor- und Laufzeitmakros können auch ineinander verschachtelt werden, was, sofern möglich, das Problem extrem langer Formulierungen aus verketteten Makros beseitigen kann.

Besondere Verwendungszwecke

Laufzeitmakros können nicht nur Fahrzeuge enthalten, sondern auch Vorder- und Hintergrundbilder oder hinzuzufügende Parameter. Auch diese können verschachtelt werden, so kann in einem Makro eine Vordergrundsequenz definiert werden, in einem zweiten eine Hintergrundsequenz, und ein drittes vereint die beiden zu einem hinzuzufügenden Parameter.

In Laufzeitmakros können sogar POOLs eingetragen werden. Hierbei ist aber darauf zu achten, daß in allen eingetragenen POOLs tatsächlich Bewegungen stattfinden. Andernfalls gibt Traffic eine Fehlermeldung aus, daß ein POOL nicht gefunden wurde. (In Präprozessormakros kann ohnehin alles Mögliche eingetragen werden.)

Zu erwähnen wäre hier noch die Einbindung externer Fahrpläne mittels $INCLUDE oder $REQUIRE. Man kann in solchen Fahrplänen Makros definieren, diese Fahrpläne dann in dem Fahrplan einbinden, der aktuell in Traffic laufen soll, und die Makros nutzen, als stünden sie im aktuellen Fahrplan.

Zu beachten

Bestimmte Zeichen sollten in Makronamen nicht verwendet werden. Sie dürfen zwar mit Ziffern anfangen und komplett aus Ziffern bestehen, Umlaute sind aber beispielsweise nach Möglichkeit zu vermeiden. Sonderzeichen sollte man beschränken auf den Unterstrich. Leerzeichen sind auch nicht erlaubt.

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden.
Weitere Information
de/traffic/timetable/macros.txt · Zuletzt geändert: 2020/12/29 13:17 von marting