Posts by frank.buchholz

    Hallo Tufftuff ,


    ach ja, Zahlen sind in Lua immer Fließkommawerte, deren Umwandlung in Text auch Nachkommastellen liefert.


    Statt string.sub(zahl, 1, 1), was das erste Zeichen liefert (und bei einstelligen Zahlen völlig ok ist), kann man auch string.format("%d", zahl) verwenden und damit die Zahl explizit über den Formatierungscode %d als Integer formatieren.


    Wenn man die Anzeige abhängig von der Stellung eines bestimmten Signal haben möchte, verwendet man folgenden Aufruf in EEPMain:

    Library_ID_Zeigen(EEPGetSignal(39) == 1)


    Hier die oben angesprochene Lua-Übung:


    Hallo cetz ,


    Mit den Aufrufen von EEPGetSignal und EEPGetSwitch wird die jeweils aktuelle Stellung der Signale und der Weichen gelesen und über EEPChangeInfoSignal und EEPChangeInfoSwitch angezeigt.


    Wenn man diesen sich verändernden Zustand in den Info-Texten sehen will, dann muss der Aufruf Library_ID_Zeigen innerhalb der EEPMain bleiben.


    --


    Als Fingerübung für Lua-Freunde:


    Natürlich könnte man die Performance optimieren, indem man z.B. beim ersten Aufruf in einer Tabelle speichert welche Signale und Weichen es gibt, und später nur noch genau diese abfragt. Das sieht für mich auch irgendwie sinnvoll aus und dürfte ein paar Millisekunden einsparen (schließlich sollten alle Lua-Aufrufe zusammengenommen innerhalb von deutlich unter 1/5 Sec = 250 ms fertig werden).


    Wenn man die bisherigen Stellungen ebenfalls speichert bräuchte man EEPChangeInfoSignalund EEPChangeInfoSwitch nur dann aufrufen wenn sich etwas ändert.


    Ebenso kann der Stand von _Status zwischen den Aufrufen gespeichert werden und so überflüssige Aufrufe von EEPShowInfoSignal und EEPShowInfoSwitch vermieden werden. Diese beiden letztgenannten Optimierungen lohnen sich etwas weniger und blähen das Programm auch etwas auf: Hier kann man gerne sagen: Einfachheit sticht Optimalität.


    [Was mir - ohne es auszuprobieren - dagegen nicht klar ist, ist die Verwendung von string.sub, mit dem nur das erste Zeichen verwendet wird.]


    Schönen Gruß

    Frank

    Du verwendet ja bereits eine geschachtelte Tabelle nach diesem Muster:

    LUA Source Code
    1. fs_str = { -- Liste der fs
    2. {
    3. ... -- Liste der Werte einer fs
    4. },
    5. {
    6. ... -- Liste der Werte einer fs
    7. },
    8. ..., -- weitere fs
    9. }


    Nach diesem Muster kannst du einfach weiter Ebenen hinzufügen, um die Ausnahmen zu beschreiben:



    "Tabellen" wie oben, also einfache Listen, deren Einträge man über die Indexnummer ansprechen kann, verwende ich nur wenn die darin vorkommenden Werte eine einheitliche Bedeutung haben. Das ist hier allerdings nicht der Fall.

    Ansonsten ziehe ich "Objekte" vor, bei denen jeweils Name-Wert-Paare verwendet werden. Das sieht dann z.B. so aus:


    Das EEP-Entwickler-Team könnte vermutlich besser als wir Nutzer feststellen, welche Änderungen an belegten Splines sicher sind (dazu gehört vermutlich die Gleisüberhöhung) und welche nicht (bei einer Verkürzung der Länge müsste man z.B. manche Objekte am Ende zusammenschieben) und dann nur die sicheren Felder freischalten.

    Wie das in EEP geht weiß ich auch nicht, statt Notepad++ empfehle ich dir allerdings foxe, nicht nur weil das Programm viel schneller ist, sondern auch weil man auf der linken Seite zuverlässiger einzelne Werte verändern kann, ohne dass man aus Versehen die XML-Struktur beschädigt, siehe #5.


    In dem Skript oben wird initial genau eine einzige (Dauer)-Aufgabe eingeplant: Das geschieht in diesem Beispiel über den Aufruf von Aufgabe_einplanen außerhalb der EEPMain in Zeile 177.

    Dieses spezielle Beispiel ist eine Dauer-Aufgabe, da jede der daran beteiligten 4 Aufgaben auch wiederum reihum die nächste Aufgabe erneut einplant.


    In ähnlicher Weise könnte man irgendwelche anderen Aufgaben einplanen, egal ob in außerhalb oder innerhalb von EEPMain oder innerhalb irgendeiner anderen Funktion. Insbesondere kann man auch solche Aufrufe von Aufgabe_einplanen auch in EEPOnSignal_x(), EEPOnSwitch_x() oder jeder von einem KP aufgerufenen Funktion geschehen.


    1. Zuerst definiert man eine Funktion Aufgabe_XX ähnlich zu function Aufgabe_01( Parameter ), die das tut, was die Aufgabe machen soll.


    2. Dann ruft man dort wo es geschehen soll Aufgabe_einplanen({ ... }) auf und plant damit die Aufgabe ein. In eigenen Funktionen, EEPOnSignal_x() oder EEPOnSwitch_x() kann man das direkt hinschreiben während es für einem Kontaktpunkt wohl übersichtlicher ist, eine weitere Funktion zu definieren. Das sieht dann z.B. etwa so aus wobei man in den Kontaktpunkt dann Aufgabe_KP01 einträgt:



    Hallo Jens,

    zum eigentlichen Thema kann ich zwar nichts beitragen, aber es würde mich interessieren wie deine GBS (die ja anscheinend recht umfangreich sind) in meinem Inventarprogramm aussehen. Die Spezialsignale werden darin allerdings noch nicht mit Details angezeigt. Daher würden mich Vorschläge interessieren wie diese Anzeige optimiert werden könnte (per PN oder im anderen Thread).

    Regel 1 bei der Programmierung: Nie und niemals aktive Warteschleifen verwenden.


    Bei Lua in EEP braucht man das auch nicht, da es ja bereits eine Nicht-Wartende Schleife EEPMain gibt für die man zukünftige Aufträge in einer Tabelle verwalten kann - man trägt dazu in einer Lua-Tabelle den geplanten Zeitpunkt os.clock() + x und die auszuführende Funktion ein. In EPMain werden die Einträge diese Tabelle dann in jeden Durchlauf, also alle 0.2 Sekunden, gegen die dann aktuelle Zeit von os.clock() geprüft und dann die inzwischen anstehenden Aufträge ausgeführt.


    Das Thema gab es bereits von ein paar Monaten -> Suche im Forum nach "Zeitsteuerung". Hier eine der Implementierungsvorschläge:
    Frage zu Lua

    Hallo Andreas_Kreuz


    im svg (also das man mit Option b) bekommt) ist immer die komplette Anlage enthalten also auch die versteckten Elemente (die sich leicht über javascript identifizieren und aus dem DOM entfernen ließen) wie auch die Elemente außerhalb des sichtbaren Ausschnittes. Hier hatte ich keine direkte Methode gefunden, um zu einem Ausschnitt alle enthaltenen bzw. enthaltenen Elemente zu finden. Was möglich ist, ist zu allen Elementen (insbesondere den <g>-Elementen) mit SVGGraphicsElement.getBBox() SVGGraphicsElement.getBoundingClientRect() die "bounding box", also das kleinste Rechteck in das das Element passt, zu berechnen und dann zu schauen, ob diese Box ganz oder teilweise im Ausschnitt liegt.


    Das ist jetzt bei der svg-Export Funktion (also Option a) eingebaut: nun werden die versteckten sowie die nicht im Blickfeld liegenden Elemente weggelassen.

    Hallo Andreas_Kreuz ,


    einer erste Teilantwort:


    In einer ersten Runde kannst du einfach des gesamte svg-verwenden ohne die unsichtbaren Teile zu entfernen (siehe #96) - das kostet zwar Performance, scheint jedoch keine große Rolle zu spielen:


    a)

    1. Gleisplan öffnen und den Ausschnitt zu positionieren wie du es haben willst.
    2. Die Drucktaste "Export JPG/PNG/SVG" verwenden

    oder


    b)

    1. Gleisplan öffnen und den Ausschnitt zu positionieren wie du es haben willst.
    2. Irgendwo im Bild das rechte-Mausklick Menü öffnen und die Funktionen "Untersuchen" aufrufen.
    3. Das Entwickler-Tool- Fenster öffnet sich und du müsstest eine Zeile sehen, die das svg-Element darstellt (wenn nicht, dann nach oben blättern).
    4. Auf diesem svg-Element das rechte-Mausklick Menü öffnen und die Funktionen "Kopieren -> Element kopieren" aufrufen.
    5. Nun kannst du das gesamte svg in Notepad++ pasten und als Datei abspeichern, z.b. als EEP.svg

    Diese Datei lässt sich nun z.B. separat im Browser aufrufen und zeigt genau die gewählte Ansicht.

    (Davon bin ich jetzt selber etwas überrascht, denn das klappt ohne dass es eine viewPort-Angabe in der Datei gibt.)

    Im Inventarprogramm steht jetzt für das GBS auch die Navigation im Gleisplanprogramm zu Verfügung:


    Wenn man in einem weiteren Fenster oder einer weiteren Karteikarte des Browsers den Gleisplan für die gleiche EEP-Anlage-Datei öffnet, dann kann man über die Links auf den IDs von Weichen, Signalen oder Kameras den Gleisplan auf das gewählte Objekt positionieren und das Info-Popup dort öffnen (wenn zusammen mit ⇧ Shift, dann wird jeweils ein neues Popup geöffnet; wenn zusammen mit alt, dann wird zusätzlich der Code aus der Anlage-Datei für dieses Objekt angezeigt).


    Ich wünsche allen eine schöne Adventszeit!

    Statt Kerzen habe ich euch dazu eine Erweiterung des Inventarprogramms mitgebracht: Es werden nun auch die Gleisbildstellpulte angezeigt wobei ich mich fürs Erste am Design des vorhandenen GBS orientiert habe:



    Die Beschriftungen zu den Weichen und Signalen ist sehr klein - so recht sehe ich noch nicht die zündende Idee zur Platzierung dieser Informationen, denn es könnte ja sein, dass neben einem Gleis auch mehrere Signale auf einer Kachel liegen.

    Ich würde mich über Vorschläge und Skizzen freuen, wie man das am Besten lösen könnte (vielleicht ja in ganz anderem Design).


    Dieser erste Entwurf zeigt noch nicht die Weichenstellung oder die Besetztmeldung aus der Anlagedatei, ganz zu schweigen von einer dynamischen Anzeige oder gar einem interaktiven Modus. Vielleicht wären andere Aspekte (Export nach PNG, Verarbeiten von .gbs-Dateien statt .anl3-Dateien, Fehlerbehebungen, ...) aber sowieso wichtiger für eine Weiterentwicklung. Was meint ihr?

    ... und raus zoomen geht ebenfalls:

    Strg + linke Maustaste Die Ansicht der Gleiszuordnung an der ausgewählten Stelle vergrößern (hinein zoomen)

    Strg + Shift + linke Maustaste Die Ansicht der Gleiszuordnung an der ausgewählten Stelle verkleinern (heraus zoomen)

    Zu 14.6 Stellpult-Editor


    a) Neben der beschriebenen Funktion von Shift + linke Maustaste gibt es folgende sehr nützliche Funktionen, die nicht im PDF-Handbuch, wohl aber in der Hilfe des Stellpult-Editors stehen:


    Strg + linke Maustaste Die Ansicht der Gleiszuordnung an der ausgewählten Stelle vergrößern (hinein zoomen)

    Strg + Shift + linke Maustaste Die Ansicht der Gleiszuordnung an der ausgewählten Stelle verkleinern (heraus zoomen)


    In der Hilfe des Stellpult-Editors wird das folgendermaßen beschrieben:

    Quote

    Sie können mit den gezeigten Buttons die Anzeige des Gleisbildes vergrößern oder eben auch verkleinern. Gegebenenfalls müssen Sie dann mit den Leisten am rechten, bzw. unteren Teil des Fensters scrollen.


    Eine bessere Möglichkeit sei Ihnen hier noch gezeigt.

    Sie klicken bei gedrückter "STRG" Taste auf den Punkt im Gleisbild, an dem Sie vergrößern möchten. Nun wird an dieser Stelle ein Zoom durchgeführt. Zum verkleinern drücken sie die "STRG" gemeinsam mit der "SHIFT" Taste. Ein Klick an die gewünschte Stelle verkleinert nun Ihre Ansicht entsprechend.


    b) Das Bild mit dem Zug ist zwar auch im PDF-Handbuch zu finden, wird meiner Meinung nach in der Online-Version nicht benötigt