gmd Geschrieben Freitag um 11:44 Uhr Geschrieben Freitag um 11:44 Uhr Hallo, Wie kann ich auf einfache weise ALLE objekt schlagworte/variablen loeschen $("").variables[""] = nil $("").variables[""] = keyword oder aehnlich ?? gruss Gmd
EASY Geschrieben Freitag um 13:26 Uhr Geschrieben Freitag um 13:26 Uhr Hallo, vor einer Stunde schrieb gmd: Wie kann ich auf einfache weise ALLE objekt schlagworte/variablen loeschen einfach gar nicht ... die Variablen gehen über (eindeutige) Namen. Wildcards sind im MBS nicht vorgesehen. Prinzipiell geht es nur über eine Referenzliste als Variable z.B. "Variablennamen" mit allen Variablennamen, die in einer Schleife durchlaufen wird. Um auf alle Objekte zuzugreifen gibt es ... layout:enumEntities() Und so würde ein Listendurchlauf beispielsweise aussehen... local t = $("Ereignisse").variables["Variablennamen"] for _,v in ipairs(t) do layout:enumEntities(function (entity) entity.variables[v]=nil end) end ... dabei muß man allerdings bedenken, daß bei jedem Durchlauf allen Objekten die Variable zugewiesen wird und da "nil", diese jedoch nicht als solche gespeichert bzw. [wenn vorhanden] gelöscht wird (also nicht erschrecken beim Verfolgen in Ereignisprotokoll...). Für Schlagwörter gäbe es noch als Alternative eine Liste z.B. "SwNamen" mit den Namen aller Schlagwörter, die durchlaufen wird... t = $("Ereignisse").variables["SwNamen"] for _,v in ipairs(t) do local s=layout:getEntitiesByKeyword(v) for _,sw in ipairs(s) do sw.variables[v] = nil end end ... so werden beim Listendurchlauf nicht immer alle Objekte angesprochen sondern nur die, mit dem entsprechenden Schlagwort... ... etwas "einfacheres" ist mir [leider] nicht eingefallen... wäre aber vielleicht etwas für die "Wunschliste" Gruß EASY
tim-fischertechnik Geschrieben Freitag um 13:29 Uhr Geschrieben Freitag um 13:29 Uhr Hallo @gmd, du kannst eine callback-Funktion namens layout:enumEntities aufrufen. if controller.state == 1 then layout:enumEntities( function (entity) -- Variable setzen entity.variables["test"] = keyword end ) else layout:enumEntities( function (entity) -- Variable löschen entity.variables["test"] = nil end ) end In diesem Beispiel wird die Variable test gesetzt, wenn der Taster eingeschaltet ist und gelöscht, wenn der Taster ausgeschaltet ist. Die Funktion enumEntities spricht alle Objekte auf der Anlage an. In der angefügten Anlage habe ich auch noch die Fälle abgedeckt, wie du im Zugverbund Variablen löschen kannst und natürlich auch einzelne Variablen. local t, t2 = layout:getVehicleGroup(vehicle) for i, Wdh in ipairs(t) do --local Ori = t2[i] -- Löschen einer Variable innerhalb einer Wiederholung Wdh.variables["Bahnhofsname"] = nil end -- Löschen einer Einzelvariable contact.variables["Lok"] = nil Anlage: Löschen von Variablen.mbp PS: Jetzt hat mich Easy überholt ;-) Viele Grüße Tim
gmd Geschrieben Samstag um 01:01 Uhr Autor Geschrieben Samstag um 01:01 Uhr Danke an euch beide. Ich dachte mir so etwas. Ich habe eine funktion mit der ich alle aktuell verwendeten modul keywords loesche bevor ich ein neues setze. Ich vergebe keywords grundsaetzlich durch code in einer initphase und dann auch waehrend des betriebs. Die meisten keywords habe ich in einer tabelle, aber beim erstellen einse scriptes kommt es vor dass man keywords aendert und dann bleiben die alten "haengen". Die muss ich dann halt alle manuell pflegen. Insbesondere fuer objektvariablen. Da werde ich dann eure vorschlaege nutzen. Tabellen habe ich derzeit fuer "statische" Modulvariablen. Ich poste mein beispiel hier fuer andere als beispiel. Dann hatte der thread wenigstens einen sinn mit euren beitraegen. Zunaechst ein Beispiel einer definitionstabelle. Der erste eintrag is das keyword, danach folgen listen von kontakten. RouteIdentifikation = { { "RolaZufahrt", { ["RolaEntryRoute"] = 1 } }, { "RolaExit", { ["RolaExitRoute"] = 2 } }, { "RolaEinfahrt", { ["RolaEinfahrRouten"] = 3 } }, { "RolaAusfahrt", { ["RolaAusfahrRouten"] = 4 } }, { "RolaLoading", { ["RolaLadeRouten"] = 5 } }, { "RolaUnLoading", { ["RolaAlternativAusfahrt"] = 6 } }, { "RolaAltExit", { ["RolaAlternativAusfahrt"] = 7 } }, { "RolaWagenLaden", { ["RolaWagengruppe1Lkw"] = 8, ["RolaWagengruppe2Lkw"] = 9 } }, { "RolaWagenEntLaden", { ["RolaWagengruppe3Lkw"] = 10 } } } Hier die funktion, die bei der initialisierung den kontakten ein statisches keyword zuweist. Wird ueberall fuer alle module verwendet. function InitialiseAllKeywords(Modul, RouteIdentifikation, clearExisting) for i, entry in ipairs(RouteIdentifikation) do local keywordText = entry[1] -- Extract keyword (e.g., "RolaZufahrt") local routeGroups = entry[2] -- Extract table of route lists for groupName, _ in pairs(routeGroups) do local KontaktListe = _G[groupName] -- Dynamically fetch global table by name if isListOfLists(KontaktListe) then for _, sublist in ipairs(KontaktListe) do ProcessKontaktListe(sublist, keywordText, clearExisting) end else ProcessKontaktListe(KontaktListe, keywordText, clearExisting) end end end end Hier die funktion die einzelne listen verarbeitet function ProcessKontaktListe(KontaktListe, keywordText, clearExisting) local lastIndex = #KontaktListe for i, entryName in ipairs(KontaktListe) do local entryObject = layout:getEntityByName(entryName) if entryObject ~= nil then if clearExisting then ClearKeywords(entryObject, RouteIdentifikation) -- Clear previous keywords before assigning end entryObject.variables[keywordText] = keyword -- Extra keyword for the first and last entry if i == 1 then entryObject.variables[keywordText.."_Start"] = keyword elseif i == lastIndex then entryObject.variables[keywordText .. "_End"] = keyword end end end end und hier die funktion, die alle keywords loescht bevor eines gesetzt wird, manuell ergaenzt, damit keine leichen entstehen. Wird aufgerufen wenn clearExisting == true ist. function ClearKeywords(entryObject, RouteIdentifikation) -- Loop through all possible keywords in RouteIdentifikation and clear them for _, eventData in pairs(RouteIdentifikation) do local oldKeyword = eventData[1] -- Extract stored keyword entryObject.variables[oldKeyword] = nil -- Clear the keyword if it exists entryObject.variables[oldKeyword.."_Start"] = nil entryObject.variables[oldKeyword.."_End"] = nil end entryObject.variables["Rola"] = nil entryObject.variables["Start"] = nil end Ich dachte halt dass ich das einfacher haben kann, insbesondere fuer objektvariablen, die ich noch nicht erschlagen habe. Nochmals vielen dank fuer eure muehe. Manchmal kann einem Lua schon auf den nerv gehen, wenn man eine "richtige" Entwicklungsumgebung gewohnt ist. Gruss Gmd
gmd Geschrieben Samstag um 01:31 Uhr Autor Geschrieben Samstag um 01:31 Uhr 12 hours ago, EASY said: t = $("Ereignisse").variables["SwNamen"] for _,v in ipairs(t) do local s=layout:getEntitiesByKeyword(v) for _,sw in ipairs(s) do sw.variables[v] = nil end end ... so werden beim Listendurchlauf nicht immer alle Objekte angesprochen sondern nur die, mit dem entsprechenden Schlagwort... ... etwas "einfacheres" ist mir [leider] nicht eingefallen... wäre aber vielleicht etwas für die "Wunschliste" Gruß EASY Diesen gedanken werde ich verwenden.. Immer wenn ich ein objekt keyword setze, werde ich das keyword "marked" setzen. Dann bekomme ich alle objekte mit keywords und vermeide alle objekte abzurufen. Das erscheint mir am besten, mit den gegebenen moeglichkeiten. Gruss Gmd
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