Jump to content

Empfohlene Beiträge

Geschrieben

Hallo,
Wie kann ich auf einfache weise ALLE objekt schlagworte/variablen loeschen 
$("").variables[""] = nil
$("").variables[""] = keyword
oder aehnlich ?? 
gruss
Gmd
 

Geschrieben

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


 

Geschrieben

Hallo @gmd,

du kannst eine callback-Funktion namens layout:enumEntities aufrufen.
callback-Function-layout_enumEntities.jpg.44a5f5a509f92f86d61cdfa7ddf63c15.jpg
 

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

Geschrieben

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



 

Geschrieben
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
 

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...