Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:traffic:timetable:macros

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
de:traffic:timetable:macros [2018/12/16 14:07]
marting Link noch einmal korrigiert
de:traffic:timetable:macros [2020/12/29 13:17] (aktuell)
marting Parameter und Präprozessormakros ergänzt
Zeile 1: Zeile 1:
 ====== Makros ====== ====== Makros ======
  
-Makros gibt es in Traffic sowohl in der [[de:​traffic:​vehicle_list:​start|Fahrzeugliste]] ([[de:​traffic:​vehicle_list:​vehicle_macro:​start|siehe auch dort]]) als auch im [[de:​traffic:​timetable:​start|Fahrplan]]. Sie haben allerdings jeweils etwas unterschiedliche Bedeutungen und werden noch unterschiedlicher gehandhabt.+Makros gibt es in Traffic sowohl in der [[de:​traffic:​vehicle_list:​start|Fahrzeugliste]] ([[de:​traffic:​vehicle_list:​macro:​start|siehe auch dort]]) als auch im [[de:​traffic:​timetable:​start|Fahrplan]]. Sie haben allerdings jeweils etwas unterschiedliche Bedeutungen und werden noch unterschiedlicher gehandhabt.
  
 ===== Verwendung ===== ===== Verwendung =====
  
-Im Fahrplan erleichtern sie z. B. die Zugbildung erheblich, wenn bestimmte Fahrzeuge oder Fahrzeuggruppen sich wiederholen. Was auch immer in der [[de:​traffic:​timetable:​motion:​start|Fahrzeugbewegung]] hinter [[de:​traffic:​timetable:​motion:​consist:​start|C=]] eingetragen werden kann, kann auch in einem Makro verwendet werden.+Im Fahrplan erleichtern sie z. B. die Zugbildung erheblich, wenn bestimmte Fahrzeuge oder Fahrzeuggruppen sich wiederholen. Was auch immer in der [[de:​traffic:​timetable:​motion:​start|Fahrzeugbewegung]] hinter ​''​[[de:​traffic:​timetable:​motion:​consist:​start|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. Ein einmal definiertes Makro kann beliebig oft in einem Fahrplan eingesetzt werden, aber natürlich nur in Zeilen hinter seiner Definition.
  
-===== Definition ​=====+===== Laufzeitmakros ​=====
  
-Die Definiton eines Makros erfolgt auf einer dieser Weisen:+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.
  
-<​code>​$DEF <Name des Makros>=<Inhalt des Makros></​code>​+==== Definition ohne Parameter ====
  
-<​code>​$DEFINE <Name des Makros>​=<​Inhalt des Makros></​code>​+Die Definiton eines Laufzeitmakros erfolgt auf einer dieser Weisen:
  
-<​code>​$DEFINE_MACRO <Name des Makros>=<Inhalt des Makros></​code>​+<​code>​$DEF Name des Makros=Inhalt des Makros</​code>​
  
-In der Praxis dürfte sich die erste, kürzeste Schreibweise durchsetzen,​ die Funktionsweisen sind aber gleich.+<​code>​$DEFINE Name des Makros=Inhalt des Makros</​code>​ 
 + 
 +<​code>​$DEFINE_MACRO Name des Makros=Inhalt des Makros</​code>​ 
 + 
 +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: Konkret sähe es beispielsweise so aus:
Zeile 47: Zeile 51:
 $DEF Schuerzenwagenzug=DRG_PW4U37,​(<​Schuerzenwagenzug)|(>​Schuerzenwagenzug)</​code>​ $DEF Schuerzenwagenzug=DRG_PW4U37,​(<​Schuerzenwagenzug)|(>​Schuerzenwagenzug)</​code>​
  
-Makros ​dürfen an beliebiger Stelle des Fahrplans definiert werden, aber immer vor ihrer Verwendung.+Laufzeitmakros ​dürfen an beliebiger Stelle des Fahrplans definiert werden, aber immer vor ihrer Verwendung.
  
-===== Zu beachten =====+==== Aufruf ohne Parameter ​====
  
-Bestimmte Zeichen sollten ​in Makronamen ​nicht verwendet werden. Sie dürfen zwar mit Ziffern anfangen ​und komplett ​aus Ziffern bestehenUmlaute sind aber beispielsweise ​nach Möglichkeit ​zu vermeiden.+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 [[de:​traffic:​timetable:​foreground_background|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. 
 + 
 +<​code>​$DEF SJ_Y2_Multi=$1*SJ_Y2</​code>​ 
 + 
 +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: 
 + 
 +<​code>​C=$SJ_Y2_Multi(3)</​code>​ 
 + 
 +Gibt es mehrere Parameter, werden diese mittels Komma getrennt. 
 + 
 +<​code>​$Makroname(Wert1,​Wert2,​Wert3,​Wert4)</​code>​ 
 + 
 +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. 
 + 
 +<​code>​$Makroname(Wert1,​Wert2,,​Wert4)</​code>​ 
 + 
 +==== 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: 
 + 
 +<​code>​%DEF(Name des Makros=Inhalt des Makros)</​code>​ 
 + 
 +ist die einfachere Form und wirkt sich in größeren Mengen weniger auf die Performance ​aus. Diese Form ist aber reihenfolgenabhängigkann also nicht hinter seinen eigenen Aufrufen stehen. 
 + 
 +<​code>​%*DEF(Name des Makros=Inhalt des Makros)</​code>​ 
 + 
 +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: 
 + 
 +<​code>​%*DEF(Name des Makros= 
 +Inhalt 
 +Mehr Inhalt 
 +Noch mehr Inhalt 
 +)</​code>​ 
 + 
 +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. 
 + 
 +<​code>​%*DEF(Name des Makros(Erster Parameter,​Zweiter Parameter,​Dritter Parameter)=Inhalt des Makros)</​code>​ 
 + 
 +Die Parameter werden im Inhalt des Makros anders eingetragen als bei Laufzeitmakros:​ ''​%Parametername;''​. 
 + 
 +<​code>​%*DEF(SJ_Y2_Multi(Anzahl)=%Anzahl;​*SJ_Y2)</​code>​ 
 + 
 +Ein Verwendungsbeispiel in der Praxis wäre, um die in der Fahrzeugliste eingebaute Fahrtrichtungsabhängigkeit von Tenderloks aufzubrechen. 
 + 
 +<​code>​%*DEF(BeliebigeRichtung(Lok)= 
 +$DEF %Lok;​=$DIR(%Lok;,​%Lok;​) 
 +)</​code>​ 
 + 
 +==== 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: 
 + 
 +<​code>​%BeliebigeRichtung(BR64) 
 +%BeliebigeRichtung(BR78) 
 +%BeliebigeRichtung(BR86)</​code>​ 
 + 
 +==== 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 ===== ===== Besondere Verwendungszwecke =====
  
-Makros ​können nicht nur Fahrzeuge enthalten, sondern auch [[de:​traffic:​timetable:​foreground_background|Vorder- und Hintergrundbilder]] oder [[de:​traffic:​timetable:​additional_parameters|Zusätzliche ​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 Zusätzlichen ​Parameter.+Laufzeitmakros ​können nicht nur Fahrzeuge enthalten, sondern auch [[de:​traffic:​timetable:​foreground_background|Vorder- und Hintergrundbilder]] oder [[de:​traffic:​timetable:​additional_parameters|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 Makros ​können sogar [[de:​traffic:​timetable:​pool|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 Laufzeitmakros ​können sogar ''​[[de:​traffic:​timetable:​pool|POOL]]''​s ​eingetragen werden. Hierbei ist aber darauf zu achten, daß in allen eingetragenen ​''​POOL''​s ​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 [[de:​traffic:​timetable:​include_require|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 =====
  
-Zu erwähnen wäre hier noch die [[de:​traffic:​timetable:​include_require|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 nutzenals stünden sie im aktuellen Fahrplan.+Bestimmte Zeichen sollten in Makronamen nicht verwendet werdenSie dürfen zwar mit Ziffern anfangen ​und komplett aus Ziffern bestehenUmlaute sind aber beispielsweise nach Möglichkeit zu vermeiden. Sonderzeichen sollte man beschränken auf den Unterstrich. Leerzeichen sind auch nicht erlaubt.
  
de/traffic/timetable/macros.1544965628.txt.gz · Zuletzt geändert: 2018/12/16 14:07 von marting