Goetz Geschrieben 25. Juni 2022 Geschrieben 25. Juni 2022 (bearbeitet) vor einer Stunde schrieb Magnetilo: Ich wollte mir vorher noch die Fahrstraßen anschauen Hallo Magnetilo, diese beiden Videos geben dir einen ersten Einblick in ihre Funktionsweise: Fahrstraßen undFahrstraße am Beispiel "Kehrschleife" Du wirst feststellen, dass diese Fahrstraßen einiges besser machen als ihr EEP Pendant. Viele Grüße Götz Bearbeitet 25. Juni 2022 von Goetz Links getauscht
Magnetilo Geschrieben 25. Juni 2022 Geschrieben 25. Juni 2022 Hallo @Goetz, vielen Dank für die Links. Ich brauche jetzt mal ein bisschen Pause nachdem ich ewig über einer Steuerung gesessen habe, die nicht funktioniert hat. Ursache war dann die fälschliche Benamung der Geraden, statt der Weiche daneben. Liebe Grüße Magnetilo
Magnetilo Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 Hallo @Goetz, durch die Fahrstraßen vereinfacht sich mein Problem drastisch. Das Ganze lässt sich nun mit ein paar Zeilen Code realisieren. Unschlüssig bin ich noch beim Aktivieren von Fahrstraßen. Ist dies so guter Code? function setRouteActive(name) local fs=layout:getRoutesByKeyword("Route")-- Fahrstraßen mit Schlagwort "Route" einlesen for k,f in ipairs(fs) do -- Für alle Fahrstraßen... if f.name==name then f.active = true end end end Ich spreche die Fahrstraßen über den Namen an. Wann würde man ein Schlagwort und wann eine Kategorie setzen?
Goetz Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 Hallo @Magnetilo, Schlagworte nutzt du am Besten dann, wenn du auf mehrere Objekte denselben Code anwenden willst. Über das Schlagwort kannst du diese Objekte generisch ansprechen. Das heißt, dass Schlagworte vor allem in der Definition deiner Auslöser hilfreich sind. Beispiel: ein Kontakt mit dem Schlagwort "Einfahrt" wird betreten eine Fahrstraße mit dem Schlagwort "Blockabschnitt" schaltet Ein Fahrzeug mit dem Schlagwort "LKW" verlässt ein Depot ... Darüber hinaus kannst du Schlagworte in Wiederholungen verwenden. Damit kannst du innerhalb dieser Wiederholung alle Objekte mit dem angegebenen Schlagwort ansprechen, als stünden sie in einer Liste. Die Kategorien bei den Fahrstraßen sind für deine Organisation hilfreich. Sie sollen dir helfen, dich ein einer Liste mit sehr vielen Fahrstraßen schneller zurecht zu finden. Viele Grüße Götz
Goetz Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 (bearbeitet) vor einer Stunde schrieb Magnetilo: Ist dies so guter Code? Nein, leider nicht. Viel zu umständlich. Wenn du den Namen der Fahrstraße doch schon weißt, dann musst du nur noch prüfen, ob diese Fahrstraße das Schlagwort enthält. Du durchsuchst unnötig alle Fahrstraßen mit einem bestimmten Schlagwort und vergleichst, ob der Name übereinstimmt. Um zu überprüfen, ob die FS das erforderliche Schlagwort hat, schreib es zunächst mit der grafischen EV und lass es dann übersetzen. Das erspart dir viel Rätselraten: if $("meinTest").variables["Blockstrecke"] == keyword then -- tu hier, was zu tun ist end Viele Grüße Götz Nachtrag: in deinem Fall sähe das so aus function setRouteActive(name) local f = $(name) if f.variables["Blockstrecke"] == keyword then f.active = true end end aber besser wäre es, wenn du nicht den Namen, sondern das Objekt (= die Fahrstraße) an die Funktion übergibst: function setRouteActive(f) if f.variables["Blockstrecke"] == keyword then f.active = true end end Bearbeitet 30. Juni 2022 von Goetz Ergänzungen
Magnetilo Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 (bearbeitet) Hallo @Goetz, vielen Dank für Deine Hilfe. Dein erstes Skript würde gut passen, erzeugt aber leider eine Fehlermeldung: unexpected symbol near "$" Soweit ich verstehe, funktioniert $ nicht mit Variablen. PS: Das Schlagwort benutze ich momentan nur, weil es anders nicht geht. Brauche ich aber eigentlich nicht. Bearbeitet 30. Juni 2022 von Magnetilo
Goetz Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 vor einer Stunde schrieb Magnetilo: Soweit ich verstehe, funktioniert $ nicht mit Variablen. Doch, tut es. Das Dollarzeichen bewirkt, dass ein Objekt mit dem Namen gesucht wird, der in den Klammern angegeben ist. Ich hatte in meinem Versuchsaufbau der Fahrstraße fest den Namen "meinTest" gegeben. Drum steht der so explizit in der Klammer. Im ersten Beispiel für dich habe ich dann den Inhalt der Variablen name in die Klammern gesetzt, weil du schriebst, dass du den Namen der Fahrstraße an diese Variable übergibst. Wenn du da etwas anderes an die Variable übergibst als den Namen, dann meldet die Prozedur einen Fehler. Leider kann ich nicht sehen, was du tust. Warum halten alle ständig mit ihrem Zeug hinter'm Berg und lassen mich rätseln??? Zeig mir, was du tust und ich kann dir sagen, warum es nicht klappt!!!
EASY Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 Hallo @Goetz, ... wenn ich versuche... function setRouteActive(name) local f = $(name) if f.variables["Blockstrecke"] == keyword then f.active = true end end ... per copy & paste im MBS einzugeben ergibt sich folgendes... ...worin liegt dein Trick, daß es funktioniert? Gruß EASY
Goetz Geschrieben 30. Juni 2022 Geschrieben 30. Juni 2022 (bearbeitet) Aaahhh - danke EASY Jetzt erkenne ich das Problem. vor 1 Stunde schrieb EASY: ...worin liegt dein Trick ..? Der war einfach: Ich habe geschummelt Will sagen: Ich habe es mir zu einfach gemacht und nicht ausprobiert, ob es so geht. Sorry! Jetzt verstehe ich auch @Magnetilos Einwand: vor 3 Stunden schrieb Magnetilo: Soweit ich verstehe, funktioniert $ nicht mit Variablen. Den hatte ich falsch interpretiert. Sorry! @Magnetilo Und jetzt kapier ich auch eeendlich den ganzen Umstand, den du treibst um letztlich eine Fahrstraße per Namen anzusprechen. Erklär mir bitte, warum du sie namentlich ansprechen willst? Kannst du sie nicht als Objekt an die Funktion übergeben? Das würde die Sache viel einfacher machen. Zumal Namen eine sehr unzuverlässige Art der Adressierung sind. Wo bekommst du den Namen der Fahrstraße? Bearbeitet 30. Juni 2022 von Goetz
Magnetilo Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 Hallo @Goetz, das Ansprechen der Fahrstraße mit ihrem Namen war für mich einfach der intuitive Ansatz. Genauso mache ich das ja auch mit Gleisen, Signalen, Gleiskontakten usw. Das konkrete Problem war: Ausfahrt von einem Schattenbahnhof von einem zufälligem Gleis 1. Definiere Fahrstraßen mit Schlagwort "Route" von jedem Gleis im Schattenbahnhof bis zum ersten Signal 2. Aktionen im Trigger (hier für 3 Gleise) local items = { {["gleis"]="2_Sgl_lks_1", ["route"]="N1-S1" }, {["gleis"]="2_Sgl_lks_2", ["route"]="N2-S1" }, {["gleis"]="2_Sgl_lks_3", ["route"]="N3-S1" }, } ausfahrt(items) 3. Code im Modul function ausfahrt(arr) local routes = { } for k,v in pairs(arr) do if #layout:getVehiclesOn(layout:getEntityByName(v.gleis)) > 0 then table.insert(routes, v.route) end -- Gleis belegt? end local random_number = math.random(#routes) local random_route = routes[random_number] setRouteActive(random_route) print("Funktion Ausfahrt hat Fahrstraße "..random_route.." aktiviert") end function setRouteActive(name) local fs=layout:getRoutesByKeyword("Route")-- Fahrstraßen mit Schlagwort "Route" einlesen for k,f in ipairs(fs) do -- Für alle Fahrstraßen... if f.name==name then f.active = true end end end
Magnetilo Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 Und noch eine zweite Lösung mit einem etwas anderem Ansatz: 1. Definiere Fahrstraßen mit Schlagwort "2_Ausf_lks" von jedem Gleis im Schattenbahnhof bis zum ersten Signal 2. Aktionen im Trigger (hier für 3 Gleise) ausfahrt("2_Ausf_lks") 3. Code im Modul function ausfahrt(fskeyword) local routes = { } local fs=layout:getRoutesByKeyword(fskeyword) for k,f in ipairs(fs) do print("Fahrstraße "..f.name.." gefunden!") print("Erstes Gleis: "..f.tracks[1].name) if #layout:getVehiclesOn(f.tracks[1]) > 0 then table.insert(routes, f) end -- Gleis belegt? end local random_number = math.random(#routes) local random_route = routes[random_number] random_route.active = true print("Funktion Ausfahrt hat Fahrstraße "..random_route.name.." aktiviert") end Vielleicht sogar einfacher und eleganter?! Trotzdem komisch, dass man Fahrstraßen nicht mit dem Namen ansprechen kann. Und warum über Schlagwort und nicht über Kategorie?
Goetz Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 Hallo @Magnetilo, vor 24 Minuten schrieb Magnetilo: Genauso mache ich das ja auch mit Gleisen, Signalen, Gleiskontakten usw. Eigentlich nicht. Eigentlich sprichst du Objekte über ihre Objektadressen an. Weil diese kryptisch und unleserlich sind, hat Neo diese spezielle Schreibweise mit dem vorangestellten $ Zeichen entworfen. Ändere mal bei einem Objekt, welches du so in der EV ansprichst, anschließend den Namen. Du wirst sehen, dass sich dieser Name dann automatisch auch in der EV ändert. In deinem Beispiel enthält deine Liste f.tracks die Objektadressen der Gleise, über die diese Fahrstraße führt. Deshalb kannst du mit f.tracks[1] direkt das erste Gleis aus dieser Liste ansprechen. Den Namen des Gleises benötigst du nur für deine print Ausgabe vor 24 Minuten schrieb Magnetilo: warum über Schlagwort und nicht über Kategorie? Weil beides für unterschiedliche Zwecke gedacht ist. Schlagworte kannst du bei allen Dingen benutzen, die du generisch ansprechen möchtest. Dieses System war schon gut etabliert, bevor die Fahrstraßen hinzu kamen. Kategorien sind hingegen nur eine optische Sortierhilfe für die Fahrstraßen. Viele Grüße Götz
EASY Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 (bearbeitet) Hallo, vor 33 Minuten schrieb Magnetilo: Und warum über Schlagwort und nicht über Kategorie ... das habe ich mich auch schon gefragt. Noch als Fragestellung hinterhergeschoben: Hat die Kategorie noch eine andere Funktion als die farbliche Differenzierung? Gruß EASY @Goetz hat mich überholt... Bearbeitet 1. Juli 2022 von EASY
Goetz Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 (bearbeitet) vor 7 Stunden schrieb Magnetilo: Das konkrete Problem war: Ausfahrt von einem Schattenbahnhof von einem zufälligem Gleis Probiere mal bitte, ob das hier funktioniert: local liste = layout:getRoutesByKeyword("SBF Ausfahrt") local freie = {} for i, FS in ipairs(liste) do if FS:canActivate() then table.insert(freie, FS) end end if #freie > 0 then local zufall = math.random(#freie) freie[zufall].active = true end Ich habe jetzt gesehen, dass du prüfst, ob im Sbf an dieser Stelle überhaupt ein Zug wartet. Diese Prüfung hatte ich missverstanden als "ist der Weg frei?" und deshalb (nur) geprüft, ob die FS aktiviert werden kann. Mein Skript ist also (bis auf das Missverständnis) mit deinem identisch. Ich war wohl noch nicht richtig wach ... Hier ist eine Beispielanlage nach dem oben beschriebenen Prinzip: Sbf with random exit.mbp In diesem Beispiel nutze ich Magnetilos Prinzip um zu schauen, ob ein Zug für die Ausfahrt bereit steht. Bearbeitet 1. Juli 2022 von Goetz Ergänzungen
Neo Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 Hallo, vor 6 Stunden schrieb Magnetilo: Trotzdem komisch, dass man Fahrstraßen nicht mit dem Namen ansprechen kann. technisch spricht nichts gegen eine Adressierung über den Namen oder auch sogar über die Kategorie, aber wenn immer ein Textbezeichner zum Einsatz kommt, muss sich der Nutzer mit den immer gleichen Problemen auseinandersetzen: Was passiert, wenn es mehr als eine Fahrstraße mit dem gleichen Namen gibt? Was passiert, wenn nachträglich neue Fahrstraßen mit identischem Namen dazukommen? Was passiert, wenn der Name nachträglich geändert wird? Um diese Probleme zu umgehen gibt es im Studio den eigens entwickelten $-Operator, um ein Objekt unabhängig seines Namens eindeutig zu adressieren (Objekte besitzen intern eindeutige IDs, die sich nicht mehr ändern). Dadurch wird es auch möglich, Objektreferenzen direkt in Variablen zu speichern. Will man nicht mit einer konkreten Fahrstraße, sondern mit beliebig vielen Fahrstraßen arbeiten, die alle der selben Logik folgen, kommen die Schlagworte ins Spiel. Zwar könnte man hier auch über den Namen oder die Kategorie geben, aber da die Schlagworte ein sehr zentrales Element der Ereignisverwaltung sind und z.B. auch nativ als Auslöser für Ereignisse dienen können, ist es für den Nutzer nicht vom Vorteil, mehrere Möglichkeiten zu besitzen, um letztendlich das gleiche zu erreichen. So viel als kleine Hintergrundinformation, warum die namensbasierte Adressierung im Studio keine hohe Priorität besitzt. Viele Grüße, Neo
EASY Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 Hallo @Neo, Warum ergibt dieses Ereignis in dem Beispiel von Götz in der grafischen EV... ... bei "Zu Skript konvertieren" eine doppelte "if" Abfrage für <$("Hotel").count> ? Gruß EASY
Goetz Geschrieben 1. Juli 2022 Geschrieben 1. Juli 2022 vor 8 Minuten schrieb EASY: Warum ergibt dieses Ereignis [...] eine doppelte "if" Abfrage ..? Weil (wie ich durch deine Frage gerade selbst entdeckt habe), die Aktion "Zug von einem virtuellen Depot starten" schon die Prüfung enthält, ob das Depot überhaupt besetzt ist. Das wusste ich nicht. Meine eigene Prüfung ist damit überflüssig.
EASY Geschrieben 2. Juli 2022 Geschrieben 2. Juli 2022 Hallo, In der Beispielanlage von Götz wird für die Ausfahrt geprüft ob sich ein Fahrzeug auf dem ersten Gleis der Fahrstraße befindet... local routeList = layout:getRoutesByKeyword("Sbf Ausfahrt") local candidateList = {} for _, route in ipairs(routeList) do local track = route.tracks[1] -- erstes Gleis der Fahrstraße... local waitList = layout:getVehiclesOn(track) if #waitList > 0 then -- ... mit einem Fahrzeug belegt? table.insert(candidateList, route) end end ... wenn ich nun für die Einfahrt wissen möchte ob sich schon ein Fahrzeug am Ende der Fahrstraße befindet würde sich dei Abfrage auf das letze Gleis beziehen... local track = route.tracks[#route.tracks] ... nun stellt sich mir die Frage ob die Gleise bei route.tracks immer in der "richtigen" Reihenfolge (route.tracks[1]=Anfang FS, route.tracks[#route.tracks] = Ende FS) eingelesen werden oder ob die Liste auch "wild durcheinander" sein kann? (Gleiche Fragestellung für route.waypoints) Gruß EASY
Neo Geschrieben 2. Juli 2022 Geschrieben 2. Juli 2022 Hallo EASY, die Wegpunkte und Gleise der Fahrstraßen werden nicht wild durcheinander aufgelistet, sondern in der Reihenfolge, die der Nutzer bei der Erstellung der Fahrstraße angibt (bzw. die der Wegfindealgorithmus vorgibt). Das erste Gleise ist daher immer der Anfang der Fahrstraße und das letzte Gleis immer das Ende. Viele Grüße, Neo
EASY Geschrieben 2. Juli 2022 Geschrieben 2. Juli 2022 Hallo, Bei der Beispielanlage von Götz gibt es noch etwas was ich noch nicht so ganz verstehe... Ausgangssituation... ... ich betätige den blauen Taster, das Signal schaltet auf "1" und der Zug fährt los... ... hier schaltet das Signal wieder auf "0"... ... nach dieser Definition soll das Signal auf "0" schalten, wenn die Fahrstraße aufgelöst wird... ... die Fahrstraße ist aber noch gar nicht aufgelöst... Verstehe ich etwas falsch oder habe ich etwas übersehen oder...? Gruß EASY
Goetz Geschrieben 2. Juli 2022 Geschrieben 2. Juli 2022 vor einer Stunde schrieb EASY: ... die Fahrstraße ist aber noch gar nicht aufgelöst... Sie ist in Teilen aufgelöst, EASY, aber nicht vollständig. Die Auflösung am Signal findet schon in dem Augenblick statt, wenn die Zugmitte das Signal passiert. Jede Weiche innerhalb der Fahrstraße wird befreit, wenn der Zug sie verlässt. Du musst erstens die Tür gleich hinter dem Zug zumachen und ihn so vor Nachfolgern schützen. Und du willst zweitens zurückgelegte Abschnitte nicht länger reservieren. Aber den Restabschnitt vor dem Zug musst du unbedingt weiterhin beanspruchen, bis er am Ziel ist. Viele Grüße Götz
Magnetilo Geschrieben 12. Juli 2022 Geschrieben 12. Juli 2022 Vielen Dank an alle. Ich habe nun den finalen Code mit einer kleinen Änderung, die sich beim Testen ergab (Autoaktivierung) in einen separaten Eintrag geposted.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen.
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden