-
Gesamte Inhalte
5753 -
Benutzer seit
-
Letzter Besuch
Alle erstellten Inhalte von Goetz
-
@Andy Alle Skripte, die direkt im Hauptmodul oder einem der Untermodule angelegt sind, werden gleich nach dem Start der EV einmal komplett abgearbeitet. @Neo Zu diesem Zeitpunkt stehen die Library Funktionen von Lua noch nicht zur Verfügung. Beispielsweise führt ein print() oder ein layout:getEntityByName() im Skript zu der Fehlermeldung, dass diese globale Funktion nicht definiert sei. Somit akzeptieren diese Skripte auch noch keine Objekte. Ein $("Dingsbums") liefert nil zurück. Ich kann also eine Tabelle Dinge = { "Dings 1", "Dings 2", "Dings 3", "Dings 4" } im Hauptskript anlegen und sie steht mir anschließend zur Verfügung. Aber eine Tabelle Dinge = { $("Dings 1"), $("Dings 2"), $("Dings 3"), $("Dings 4") } bleibt leer, weil die Funktion $() zu diesem Zeitpunkt noch nichts zurück gibt.
-
Das halte ich - anders als Tom - für den besseren Weg. Es ist wie beim Erlernen von Sprachen. Die ständige Übersetzerei wird schnell zum Hindernis. Die Muttersprache hat man auch nicht mit einem Vokabelheft gelernt sondern dadurch, dass man sie unvoreingenommen benutzt hat. Erst im Kleinen und dann in zunehmend komplexeren Zusammenhängen. Durch Probieren, Aufnahme von Hinweise zu Verbesserungsmöglichkeiten, Mut zur Lücke und vor allen Dingen viel Freude an jedem kleinen Erfolg! Das ist die Methode, mit der Kinder so bewundernswert schnell und gut lernen.
-
Ich weiß es ehrlich nicht, aber meine Vermutung ist, dass es keinen Unterschied macht. Weil eben in einer Tabelle nur Adressen liegen. Da dürfte auch eine Schnitzeljagd über mehrere gestaffelte Adressen keine Belastung darstellen. Auch dann nicht, wenn diese Adressen während des Programmablaufs dynamisch gebildet werden.
-
Der Doppelpunkt gibt den Teil links davon als erstes Argument an den Funktionsaufruf, der rechts vom Doppelpunkt steht. Diese Schreibweise ist dann sinnvoll, wenn die Funktion in derselben Tabelle steht wie die Daten, welche die Funktion nutzen soll. Im MBS sind viele Funktionen Teil der jeweiligen Modelle. Ein Riesenrad enthält je eine Funktion play und eine Funktion stop für jede darin verbaute Achse. Deshalb wandelt das MBS diesen Eintrag in der EV in diesen Lua Code um: $("Riesenrad").animations["Rad drehen"]:play(0, 1) Ich habe lediglich in meinem Beispiel den langen Adressteil links vom Doppelpunkt zuerst in einem kurzen Namen zusammengefasst und dann die Funktion aufgerufen. Sonst werden mir die Zeilen zu lang und unleserlich. Die Funktionen play und stop sind im MBS Teil einer Klassendefinition. Deshalb muss man beim Aufruf der Funktionen die Adresse des Objekts und seiner Achse als Argument mit übergeben. Neo hat sich bei solchen Funktionsaufrufen an die in Lua übliche Schreibweise gehalten. Lua kennt zwar keine Klassen, aber die Tabellen kommen dem schon recht nahe.
-
Ich würde dir gerne helfen, es zu verstehen. Denn das ist der Zweck, den ich damit verfolge. Ich mag keine langen if-Konstrukte. Ein if ist gut, wenn ich einen ja/nein Fall habe. Aber wenn ich viele mögliche Werte habe, auf die ich unterschiedlich reagieren will, dann klappere ich die nicht gerne mit if-Ketten ab. Insbesondere die Tabellen, die Lua bietet, sind da ein bequemerer Weg. Wenn ich die möglichen Werte, die ich zur Auswahl bekomme, als Tabellenindexe (Indizes?) nutze und unter diesen Adressen das ablege, was ich im Falle des jeweiligen Wertes brauche, dann kann ich den entstandenen Wert direkt nutzen, um aus der Tabelle das passende rauszupicken. Anhand eines Beispiels kann ich es vielleicht besser verdeutlichen. Nehmen wir ein Signal mit vier Stellungen und die Geschwindigkeiten, die der Zug fahren darf: Stellung 0 - HP0 - Geschwindigkeit 0 Stellung 1 - HP1 - Geschwindigkeit 120 (nur für dieses Beispiel. HP1 bedeutet "Fahrt") Stellung 2 - HP2 - Geschwindigkeit 40 Stellung 3 - SH1 - Geschwindigkeit 25 Ich kann jetzt die Stellung auslesen und dann alle Möglichkeiten durchtesten: Stellung = signal.state if Stellung == 0 then vehicle.targetSpeed = 0 elseif Stellung = 1 then vehicle.targetSpeed = 120 elseif Stellung = 2 then vehicle.targetSpeed = 40 elseif Stellung = 3 then vehicle.targetSpeed = 25 end Oder ich weise die Geschwindigkeiten in einer Tabelle den Signalstellungen zu: Stellung = signal.state SpeedTable = { [0] = 0, [1] = 120, [2] = 40, [3] = 25 } vehicle.targetSpeed = SpeedTable[Stellung] Ich benutze hier die Signalstellung als Index, um mir aus der Tabelle den passenden Wert rauszupicken. Die Nummern vorne in den eckigen Klammern wären nicht nötig. Bis auf eine: die Null. Wenn man keinen Index vergibt, dann bekommt das erste Element in einer Tabelle die Nummer 1. Deshalb habe ich die Null in eckige Klammern als Index vorgeben müssen. Und dann habe ich das Prinzip für die übrigen Werte beibehalten. Alternativ ginge es auch so: Stellung = signal.state SpeedTable = {0, 120, 40, 25} vehicle.targetSpeed = SpeedTable[Stellung + 1] aber die erste Form macht deutlicher, was wozu gehört. Man kann dieses Prinzip auf die Spitze treiben, indem man an passenden Stellen keine Werte in der Tabelle ablegt, sondern ganze Funktionen. Lua macht da keinen Unterschied, weil es eigentlich immer nur Pointer sind, die an diesen Stellen liegen. Also Adressen. Ob dann an dieser Adresse eine Zahl, ein Text, eine weitere Tabelle oder eine Funktionsdefinition hinterlegt ist, spielt für den Tabelleneintrag keine Rolle.
-
Es ist zwar sicher nicht ganz das, was du damit gemeint hast, aber ich habe eine alternative Version deiner Demo gebaut. Animationstabelle Version Goetz.mbp
-
Die Anlage aus der gestrigen Sendung (die ich als sogenanntes Highlight dauerhaft bei Twitch gespeichert habe) hänge ich mal hier an. Dann ist sie in diesem Stadium konserviert, auch wenn ich sie demnächst weiterbaue. MaerklinMagazin 2015 5 Bahnhof Trossingen.mbp
-
Genau - das ist der Fehler, der da bemängelt wird. Eine schließende Klammer fehlt noch. Sehr gut erkannt. Die Anlage, auf die du dich in den Screenshots beziehst, ist schon im Bereich "Entwurf" hochgeladen. Hier ist die Content-ID: 9967751A-FA43-45BE-88AF-B9A0E28E00F9 Die Funktionsweise hast du im Übrigen genau richtig verstanden. Ich habe eine Idee, wie das gehen könnte. Aber ich möchte es erst selbst ausprobieren, bevor ich es hier erläutere.
-
Yes, it does. The translation is literal, to be safe that it stays true to the original. The resulting code cannot be reproduced 1:1 from scratch in V5. And there is no reason why anyone should write new code in this old, cumbersome way when generating a new bit of EV. The effect that the code has can be reproduced perfectly and in a much better (= simpler) form, as Andy has shown. Andy and others are giving their best to achieve just that. You may want to be a bit more grateful for that, even if you don't immediately understand all the answers. Also, please note that we're all still learning. And that this is early on in the beta phase. So nothing's "urgent" yet. Take it easy, André.
-
Try the cog wheel next to the field. If the triggering object can be referenced, you'll find "Trigger" in the context menu attached to that cog.
-
und eine variable Schriftgröße (Strg + Mausrad)
-
Ich zumindest würde mich auch freuen, wenn das Verhalten des Editors an andere angeglichen werden könnte.
-
Hallo, liebe MBS Freunde! Heute Mittag ab ca. 12 Uhr zeige ich wieder auf Twitch für ein bis zwei Stunden meine Experimente mit dem 3D Modellbahn Studio. Ich weiß, dass die Mittagszeit für viele nicht besonders günstig ist. Aber ich muss die Zeiten nutzen, in denen ich hier die nötige Ruhe für eine Sendung habe. Viele Grüße Götz
-
kannst du auch mit V5 weiter betreiben. Probiere es aus. Du kannst ja die V5 in der kostenlosen Standard-Version runterladen und damit deine V4 Anlage öffnen und bespielen.
-
You can switch back and forth as long as you don't alter the script. Once you've changed it, it's not possible to convert it back because Lua offers many commands for which there is no equivalent in the graphical EV. Because you've placed the last command in the lower box of your condition. The upper box (above the thin black line) is for all "condition is met" cases. The lower box (below the thin black line) is for the "condition is not met" case.
-
Das wäre im Ernstfall wirklich fatal. Das Gleis muss als "besetzt" gelten, sobald es einem einfahrenden Zug zugewiesen wurde. Keine Frage! Aber der Zweck der Übung war doch eine kompakte Routine für die "Besetzt"-Prüfung. Das drumherum hatte ich deshalb bewusst einfach gehalten, weil es dafür irrelevant war.
-
Das ahnte ich, weil du es an anderen Stellen nutzt. Ich hatte mich entschlossen es trotzdem zu schreiben, weil es dann vielleicht ein oder zwei stillen Mitlesern zu einem besseren Verständnis hilft.
-
Hallo @fzonk, wenn ich darf, dann würde ich gerne zwei kleine Anregungen zu deiner EV beisteuern. Wenn sich die Besetzt-Variable ändert, dann reagierst du darauf und schaltest die Signallampen entsprechend um. Für diesen Zweck machst du zwei Prüfungen: Erst prüfst du, ob die Variable auf "True" gesetzt wurde. Und schaltest in dem Fall die Lampe auf Rot. Und dann prüfst du erneut, ob die Variable auf "False" gesetzt wurde (um in diesem Fall die Lampe auf Grün zu setzen) Die zweite Prüfung ist eigentlich redundant, denn wenn das Ergebnis der ersten Prüfung ergab, dass die Bedingung nicht erfüllt war, dann kann die Variable nur noch "False" sein. Für diesen Fall (Bedingung nicht erfüllt) gibt es im gelben Prüfungsblock ein zweites Fach. Das ist zwischen der schwarzen Trennlinie und dem unteren gelben Balken. Dort kannst du die alternative Aktion "Lampe auf Grün setzen" hineinlegen: Das kann die EV schneller verarbeiten und lesbarer ist es auch. Der gleiche Trick funktioniert auch für den umgekehrten Fall "Lampe wurde umgeschaltet, Variable muss gesetzt werden" Viele Grüße Götz
-
V5 Achsenzählung über Kamera ( EV / LUA )
Goetz antwortete auf h.w.stein-infos Thema in Fragen zur Steuerung
Das wäre fantastisch. Ich würde mich freuen, wenn ich alle Objekte ermitteln könnte, die einen Zugverband ausmachen. Damit hätte ich wiederum Zugriff auf die Eigenschaften dieser Objekte und auf ihre Gesamtzahl. Alternativ würde auch ein "wer hängt an dieser Kupplung" funktionieren. Damit kann man die Kette selbst aufbauen und auch herausfinden, wer im Verband welche Ausrichtung hat (was zum Beispiel von Bedeutung ist, wenn man eine Tür öffnen möchte.) -
Ernsthaft: Das MBS wäre - insbesondere jetzt in der Version 5 - eine fantastische Lernhilfe für alle, die in die Programmierung einsteigen wollen. Egal, ob Schüler, Studenten, Lehrer oder Profs. Weil ein Zug, der das richtige Gleis findet eine viel schönere Belohnung ist als ein "Hallo Welt" auf dem Bildschirm.
-
Die ist köstlich, Easy! Und sie ist ein ideales Übungsobjekt für die Rekursion, die in diesem Video besonders schön erklärt wird.
-
V5 Achsenzählung über Kamera ( EV / LUA )
Goetz antwortete auf h.w.stein-infos Thema in Fragen zur Steuerung
Leider nicht, Hans. Die Kameras in Programmen wie dem MBS "sehen" nicht. Sie bestimmen nur, von welchem Standpunkt aus das Ausgabebild berechnet wird. Sie können also nichts erkennen. Weder Rad noch Zug, Schiene oder Himmel. -
Hallo @fzonk Ich habe @Neos Vorschlag aufgegriffen und einen rekursiven Weg probiert. Das macht wirklich 'nen schlanken Fuß. In dieser Version der Testanlage habe ich alle alten Funktionen (auch die sonstigen) gelöscht und neu gebaut. Außerdem enthält sie nur die Variablen, die für diese variante benötigt werden. Ich denke, so wird es leichter sein, die Zusammenhänge alle nachzuvollziehen. Viel Spaß damit Götz P.S.: Deine Version schaue ich mir gleich an und schreibe dir dann noch ein oder zwei Dinge dazu. benutzerdefinierte Aktion - rekursiv.mbp
-
Hallo @fzonk Ich weiß. Ich habe sie ja alle drei getestet (und laaange gebraucht, bis ich alle Fehler rausgebügelt hatte) Viel interessanter ist daher, ob du die Varianten durchschaust. Das stimmt nicht ganz. Denn die EV ist auch eine Programmiersprache. Nicht erst in V5, sondern auch in den Vorgängerversionen. Du bist also geübt in der Anwendung. Ob die einzelnen Befehle dabei direkt als text untereinander stehen oder in kleinen, farbigen Feldern, macht keinen sooo großen Unterschied. Die Version 5 bekommst du, wenn du bei Version 4 auf das <> Symbol klickst. Das ist die automatische Übersetzung in Lua (bitte, schreib das nicht in Großbuchstaben. Das sieht immer so laut aus und ist obendrein auch von den Entwicklern dieser Sprache nicht gewünscht.) Diese automatischen Übersetzungen helfen anfangs enorm dabei, die richtigen Schreibweisen von z.B. Objektnamen zu lernen. Genau das wollte ich damit bezwecken. Deshalb habe ich dir alle drei Versionen zum Vergleich angeboten. Viel Spaß bei deinen weiteren Experimenten Götz
-
@fzonk Schau mal bitte, ob dir diese groben Beispiele weiterhelfen: benutzerdefinierte Aktion - drei Alternativen.mbp