Jump to content

Empfohlene Beiträge

Geschrieben (bearbeitet)

Hallo @Neo,

wenn ich z.B. über die JSON Schnittstelle die Position eines Objektes auslesen möchte, dann geht das ja nur über das Senden eines lua Skriptes...
 

Dim script As String = String.Join("", "a=layout:getEntityByName('", name, "') return a.transformation.position")

.. dabei bin ich darauf angewiesen, daß der Name im MBS einmalig ist.

Wenn nun ein Name mehrfach vorkommt, muß ich zuerst alle gleichnamigen Objekte umbenennen und z.B. mit einem Index versehen.
Wenn ich das JSON Kommando...

{"jsonrpc": "2.0", "method": "editor.cloneEntity", "params": {"_class": "entity", "name": "Quader"}, "id": 1}

... versende, dann wird das so erzeugte Objekt der Namen vom MBS automatisch mit einen Index versehen. "Quader (2)" und wenn "Quader (2)" schon existiert mit "Quader (3)"....

Dies führt mich zu der Annahme, daß es bei Dir im Programm eine Routine geben müßte, die den nächsten freien Index sucht. Mich würde hierzu interessieren, wie bei Dir dieser Index gefunden wird. 

Momentan habe ich 2 Methoden um den nächsten freien indes zu finden...
Entweder lasse ich das Objekt klonen und lese mir den Index aus dem zurückgegebenen Namen aus, lösche den Klon, um dann dem doppelten Objekt den Namen mit dem Index zuzuweisen. (Nur mit dem Klon arbeiten und das "Original" löschen geht nicht, da ich nicht weiß ob das Objekt in der EV schon einen Bezug hat.)
Oder ich erzeuge den neuen Namen mit dem Index, sehen nach, ob es schon ein Objekt mit diesem Namen gibt...

Dim script As String = String.Join("", "return #layout:getEntitiesByName('", name, "')")

und wenn ja, erhöhe ich den Index um 1 und spiele es so lange durch, bis ich einen freien Index finde.
Beide Methoden haben den Nachteil, daß sie aus mehreren Kommandos bestehen um ein Resultat zu erhalten (Objekt mit eindeutigem Namen) und entsprechend langsam sind.

Anmerkung: natürlich könnte ich auch stur alle gleichen Objekte mit einen Index versehen, hat aber den Nachteil, daß ich nie sicher sein kann, ob aus der Vergangenheit der Index nicht schon einmal vergeben wurde.

Nun wären  meine Fragen:
Wäre es möglich auf Deine Routine über die Schnittstelle zuzugreifen?
Siehst Du eine Möglichkeit, daß es so etwas wie ein Kommando "Object_ReanmeEqual" geben könnte?
oder hast Du noch eine Alternative?

Gruß
EASY
 

Bearbeitet von EASY
Geschrieben

Easy,
warum willst du unbedingt ueber den index zugreifen ?
Eine funktion die alle namen (auch doppelte) sendet und als original oder variation markiert,  fuer eine gegebene Guid, ware viel praktischer, dann kannst du tun damit was du willst.
Du findest doppelte, vergebene indices, erkennst variationen, usw.
Damit braucht Neo nur wenige fuer ihn simple selektionen zu machen und wir gewinnen jede menge moeglichkeiten. Du bist dann auch nicht auf den Mbs index angewiesen.
Das waere jedenfalls mein wunsch. Unda da wir gerade dabei sind .. Erzeugen eines objektes in variation, als Guid + Variation waere gut.
Gruss
Gmd


 

Geschrieben

Hallo,

vor 12 Stunden schrieb gmd:

warum willst du unbedingt ueber den index zugreifen ?
Eine funktion die alle namen (auch doppelte) sendet und als original oder variation markiert,  fuer eine gegebene Guid, ware viel praktischer, dann kannst du tun damit was du willst.
Du findest doppelte, vergebene indices, erkennst variationen, usw.
Damit braucht Neo nur wenige fuer ihn simple selektionen zu machen und wir gewinnen jede menge moeglichkeiten. Du bist dann auch nicht auf den Mbs index angewiesen.

Es geht mir hauptsächlich darum einen "einfachen" Weg zu finden Objekte für die Schnittstelle eindeutig zu machen. Die Schnittstelle arbeitet ausschließlich mit Namen,  ich bin also immer darauf angewiesen, daß die Namen eindeutig sind, damit ich ein Objekt ansprechen kann. Dein Vorschlag so etwas wie eine Vorselektion über die Guid zu machen, um nur die Objekte, die dieser Guid zugeordnet sind, eindeutig umzubenennen, bedingt, daß ich zusätzlich zu jedem einzelnen Namen, der zurückgegeben wurde, überprüfen muß ob dieser nur dieser einen Guid zugeordnet ist, was derzeit nicht möglich ist, "editor.getEntityContentID" liefert nur einen Wert zurück, auch wenn der Name in zwei unterschiedlichen Guids vorkommt. Natürlich kann man es als  Haarspalterei betrachten (wer eine eine Pyramide in "Quader" umbenennt, ist selbst schuld, wenn es Probleme verursacht), aber das Prinzip der Uneindeutigkeit ist trotzdem gegeben und es ist ein Beispiel dafür, daß ich zuerst eindeutige Namen haben muß um (wie in diesem Fall) die Guid bestimmen zu können, oder allgemein um ein Objekt über die Schnittstelle anzusprechen... womit wir uns einmal im Kreis gedreht haben.
Über einen Index bei der Vergabe von Namen von doppelt vorkommenden Objekten so zu vergeben, wie es den "Regeln" des MBS entspricht (Zusatz " (zahl)") erscheint mir deshalb sinnvoll, da das Programm (anscheinend) in der Lage ist, die nächste freie Zahl zu finden (so wie ich bisher gesehen habe machst Du es über "@Zahl")...

P.S. wir verfolgen etwas unterschiedliche Ziele. Dein Projekt ist mehr darauf angelegt ein bestehendes Layout zu analysieren und mit bestimmten Funktionen zu belegen (also mehr ein statischer Zustand des Layout), mein Ziel ist es ein (wenn auch im Vergleich bescheidenes) Plugin zu machen, das zu jedem Zeitpunkt eingesetzt werden kann um z.B. eine Objektstapel zu erzeugen (dynamischer Zustand des Layout).

Gruß
EASY
 

Geschrieben (bearbeitet)
11 hours ago, EASY said:

mein Ziel ist es ein (wenn auch im Vergleich bescheidenes) Plugin zu machen, das zu jedem Zeitpunkt eingesetzt werden kann um z.B. eine Objektstapel zu erzeugen (dynamischer Zustand des Layout).

Ja da hast du recht, auch wenn ich erweiterungen an einer bestehenden anlage mache (Kontakte,Signale, Zuege etc), ich habe einfach mehr vorarbeit zu leisten fuer meine funktionen, was ueber ein plugin hinausgeht und der erste schritt is einfach ALLES eindeutig zu benennen. das @-# ist nur ein temporaerer name, bevor ich die entscheidenden elemente umbenenne in ihre entgueltigen funktionalen namen. Das hat natuerlich den nachteil dass es da kein zurueck gibt ohne meine datenbank, die die temporareren namen und die fertigen namen kennt. 

Du hast voellig recht mit dem ziel an den standards des Mbs zu bleiben fuer ein Plugin. Ich nehme mir da mehr freiheiten.
Gruss
Gmd




 

Bearbeitet von gmd
Geschrieben
Am 28.2.2025 um 16:46 schrieb EASY:

wenn ja, erhöhe ich den Index um 1 und spiele es so lange durch, bis ich einen freien Index finde.

So läuft auch die Namensvergabe im Studio, es wird einfach so lange ein freier Name gesucht, bis einer gefunden wurde.

An welcher Stelle genau bekommst du Probleme mit doppelten Namen?

Viele Grüße,

Neo

Geschrieben

Hallo,

vor 4 Stunden schrieb Neo:

An welcher Stelle genau bekommst du Probleme mit doppelten Namen?

... wenn es um das Auslesen / Setzen einer Objekteigenschaft geht, wie z.B. [momentan] Position, Rotation, Größe, Skalierung, das Setzen oder Auslesen von Objektvariablen. [weitere Beispiele] Schaltzustand, Geschwindigkeit... Das geht nur indem man über die Schnittstelle als lua-Skript das Objekt über den Namen anspricht "a=layout:getEntityByName('name') return a.Eigenschaft" bzw. "a=layout:getEntityByName('name')  a.Eigenschaft=".

Das große "Problem" beim Ansprechen von Objekten über die Schnittstelle gegenüber der EV ist, daß man nicht über die "Interne-ID" arbeiten kann. In der EV kann ich mit "$" und der Auswahl eines Objektes dieses eindeutig zuordnen, da dann der Name nur noch so etwas wie ein Pseudonym ist und sich dahinter die intern zugewiesene ID "versteckt" (ich hoffe ich habe dies richtig verstanden) und mit ($ "Quader").Eigenschaft kann es eben noch viele andere "Quader" geben.

Ungünstiger würde es, wenn man über die Schnittstelle Ereignisse auswerten wollte... Bei z.B. "Gleiskontakt wird ausgelöst" kann man in der EV über "contact" und "vehicle" unabhängig vom Namen auf den richtigen Gleiskontakt und das auslösende Fahrzeug zugreifen. Die Schnittstelle liefert nur die beiden Namen zurück und man verliert somit den (absoluten) Bezug, der den eigentlichen Vorzug dieser Möglichkeit zunichte macht (was allerdings durch die Übermittlung der internen ID und der Möglichkeit derer weiteren Verarbeitung (theoretisch) ausgeglichen werden könnte (?)...)

Soweit einmal meine ersten Gedanken zur Beantwortung Deiner Frage (ich sehe es einmal als Grundlage für eine weiterführende Diskussion...)

Gruß
EASY

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...