Zum Inhalt springen

Marionette Create Locus


mamo

Frage

Geschrieben

Hallo,

 

ich habe mit Marionette und dem Node Create Locus einen 2d-Punkt an Stelle xy erzeugt und möchte gerne vom erzeugten Punkt wiederum die Koordinaten abfragen. Blöde Frage aber ist der auf dem Weg erstellte Punkt ein Pointer? Wenn ja kann man den dereferenzieren und/oder kann man die Koordinaten irgendwie abfragen?

 

Danke euch

- Vectorworks 2026 ARCH (aktuell) / Windows 11

- 10th Gen Intel i7-10750H @ 2.60GHz - 32GB RAM - RTX 2070 Laptop GPU

10 Antworten auf diese Frage

Empfohlene Beiträge

Geschrieben

Ich glaub ich mache einfach was falsch. Ich kann auf die Daten jedenfalls nicht zugreifen. Sicher nur eine Kleinigkeit, beschäftige mich aber nun schon eine Weile damit....

- Vectorworks 2026 ARCH (aktuell) / Windows 11

- 10th Gen Intel i7-10750H @ 2.60GHz - 32GB RAM - RTX 2070 Laptop GPU

Geschrieben

Hallo mamo

 

So wie im Anhang müsste es funktionieren. ich weiss aber nicht, ob du das so bei dir einbauen kannst.

 

LG, Marc

Bildschirmfoto 2023-10-20 um 22.43.09.jpg

Leiter BIM Consulting

ComputerWorks Schweiz

________________________________________

Vectorworks - Führende BIM-Spitzentechnologie und Flaggschiff der Nemetschek Gruppe

Weltweit verwirklichen über eine halbe Million Architekten und Designer grossartige Projekte mit Vectorworks!

Geschrieben

Hallo,

 

danke euch. Das funktioniert alles super. Ich möchte aber noch vom erstellen Punkt die Daten auslesen, welche sich beim verschieben des Punktes auch aktualisieren. Eine Möglichkeit wäre vermutlich den Punkt beim erstellen zu benennen und dann mit Node "Name" die Daten vom erstellten Punkt auszulesen.

 

- 1. wenn ich das so mache wird mir immer eine Adresse anstelle der Koordinaten ausgegeben. Was mache ich falsch?

- 2. gibt es eine andere Möglichkeit oder wäre der Weg grundsätzlich der Richtige?

 

- Vectorworks 2026 ARCH (aktuell) / Windows 11

- 10th Gen Intel i7-10750H @ 2.60GHz - 32GB RAM - RTX 2070 Laptop GPU

Geschrieben

1. Punkt Koordinaten
Also der Punkt wird ja mit den Daten nX und nY platziert. Diese Daten wären also schon vorhanden im Script. Werden die Daten extern benötigt, dann sollte man dem Punkt eine Datenbank anghängen und die Daten in diese Datenbank schreiben. 

Spontan würde ich sagen, dass man hier das PIO Koordinatenobjekt statt eines Punktes einsetzen sollte. Da hat man den Vorteil, dass die Daten schon dranhängen und dass diese dann auch ohne weitere Zutun bei einer manuellen Veränderung automatisch aktualisiert werden. Immer schwierig Tipps zu geben, ohne den Zusammenhang zu sehen. Angehängt ein relativ altes Beispiel, welches Vermessungspunkte auf Polygone setzt, vielleicht hilft es weiter.

stake objects v2023.vwx


image.thumb.png.9d23c74a88bb18cec70eee2f88f4fede.png


Andersrum, wenn man aus bestehenden Manuell gesetzten Punkte die Koordinaten im Script auslesen möchte, nimmt man dafür "Get Location"
image.png.b0f6e056164d2227f7bb165472867ede.png

Aber wie gesagt es ist nicht logisch zuerst mit info xy einen Punkt zu setzen. Dann zu schauen wo er liegt um die selben xy Information, die man ja schon von Anfang an hatte, zu erhalten.

Falls es nicht darum geht, würde tendentiell nicht mit Namen arbeiten (Ausser es sind ein paar wenige Punkte) um den Punkt später zu adressieren,  sondern mit einer Datenbank und mit Kriterien Arbeiten. SetRField, GetRField, Criteria Nodes.

Wie gesagt beim Vermessungspunkt sind die Daten schon dran, das macht es einfacher und eleganter. Um die Position eines Vermessungspunktes oder anderer intelligenter Objekte und Symbole auszulesen, sollte man das Node "Get Symbol Info" verwenden statt Get Location.
image.png.43529327873d23ceaa50121544f9e959.png


 

Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090

Geschrieben

Hallo @Dominique Corpataux,

 

danke vielmals. Genau das hatte ich gesucht in get location:

 

class Params(metaclass = Marionette.OrderedClass):
#APPEARANCE
    #Name
    this = Marionette.Node( "Get Location" )
    this.SetDescription( 'Returns the coordinates of a referenced locus' )

    #Input Ports
    locus = Marionette.PortIn( vs.Handle(0), 'hLocus' )
    locus.SetDescription( "A locus object" )

    #OIP Controls

    #Output Ports
    location = Marionette.PortOut('p')
    location.SetDescription( "The locus's location" )

 

 

Eine letzte Frage bitte. Wie kann ich außerhalb meines Netzwerkes auf den erzeugten Punkt zugreifen, wenn ich keine Datenbank erstelle? Der Punkt bekommt automatisch die Bezeichnung "Marionette Group Create_Locus_21". Das ist vermutlich die Adresse 5C581A10 aus meinem Screenshot. Darf und kann ich die Bezeichnung beim erstellen ändern und dann außerhalb des Netzwerkes darauf zugreifen? Und wenn ja mit einem String wie unterhalb eingefügt? Aber dann müsste ich ja erst wieder nach dem Namen des Punktes suchen oder gibt es eine Node wie z.b "gib Koordinaten von "Punkt mit Bezeichnung x___x" aus" ? Irgendwie bekomme ich das einfach nicht hin.

 

Unbenannt.thumb.PNG.6e9aa4e79be50339077665e708487bae.PNG

 

 

 

So hätte ich es dann gerne:

 

Unbenannt_01.thumb.PNG.48d0af03473fa4c6d3fd516a769b8915.PNG

 

 

 

Danke nochmals

- Vectorworks 2026 ARCH (aktuell) / Windows 11

- 10th Gen Intel i7-10750H @ 2.60GHz - 32GB RAM - RTX 2070 Laptop GPU

Geschrieben

Hallo,

 

der Name "Marionette Group Create_Locus_21" ist nicht der Name des erzeugten Punktes, sondern der Name einer Gruppe in der der erzeugte Punkt ist. Der Punkt selbst hat keinen Namen bekommen und ist deshalb auch nicht über einen Namen wieder aufrufbar.

 

Das mit der Gruppe wird deshalb so gemacht, da diese Gruppe bei wiederholtem Ausführen des Marionette Netzwerkes immer wieder gelöscht und neu erstellt wird. Wenn Marionette das nicht so machen würde (kann man machen), dann würde das Netzwerk jedes Mal wenn es ausgeführt wird einen neuen Punkt erzeugen und einen zuvor vom Netzwerk bereits erstellten Punkt NICHT überschreiben.

 

Den String "5C581A10" kann man sich meines Wissens nach vorstellen als der "Name" des Handles zum erstellten Punktobjekt.

 

Um einen Punkt, nachdem man ihn mit einem Marionette Netzwerk erstellt hat, mit einem anderen Marionette Netzwerk anhand seiner Koordinaten wieder zu erwischen gibt es mehrere Möglichkeiten.

 

  1. Den erstellten Punk benennen mittels der Node "Set Name". Dazu könnte man z.B. einen String erstellen der die Koordinaten des Punktes beinhaltet und den dann als Name des Punktes verwenden. Der GROSSE Nachteil hierbei ist, dass keine zwei Punkte denselben Namen haben können!
  2. Erstellen einer Datenbank mit den Koordinaten der Punkte wie von @Dominique Corpataux vorgeschlagen
  3. Man könnte aber auch die Punkte einfach erstellen und dann über die "Criteria" Node einfach alle Punkte suchen und diese dann darauf prüfen ob sie einen bestimmten x und y Wert haben.

 

Vielleicht ist aber auch keine der oben genannten "Lösungen" notwendig, oder nicht die "richtige" Lösung und das Problem liese sich ganz anders lösen. Ich fände es deshalb interessant, was denn insgesamt gemacht werden soll.

 

Mit freundlichen Grüßen,

Letti

  • Like 1
Geschrieben

Wenn es unbedingt ein Name sein muss und der Namen eindeutig sein muss, dann könnte man auch die UUID (der eindeutige Namen des Objektes) auslesen und als Namen (Verwendbar für Tabelle u.s.w.) verwenden. Allerdings ist dieser dann nicht für die einfache Lesbarkeit ausgelegt.
image.png.4c6b034cd39cfddbfcdb57018d492259.png

Der Tipp von Letti mit den Koordinaten scheint mir zweckmässiger zu sein, weil auch wenn ein Punkt gelöscht und neu angelegt wird erhält er an der selben Position im Plan wieder den selben Namen und nicht einen neuen Zufalls-Code.

image.thumb.png.9264e7212244962d416b982d2ffdde74.png

Das Handle muss man so verstehen wie das Ticket beim Arzt, beim Bäcker u.s.w. (Gibt es in der Schweiz ja eigentlich nicht mehr so häuffig). Es ist quasi eine Art Speicheradresse. Aber jedes mal, wenn ein Script neu läuft bekommt das Objekt eine neue Nummer (wie beim Bäcker am nächsten Tag).

Die Handles kann man also nur verwenden während ein Script läuft aber nicht als Erkennungsnummer beim nächsten Mal. 

Wobei es mir scheint, als müsste man wirklich die ganze Aufgabe sehen. Weil es sieht so aus, als möchte man einen Punkt per Script erzeugen, diesen Punkt dann manuell verschieben und wieder mit dem selben Script auslesen. Das würde aber mit dieser Strategie nicht funktionieren, egal ob mit Namen, UUID oder Datenbanken.





Name oder UUID.vwx

Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090

Geschrieben

Hallo,

 

erstmal danke euch für eure Bemühungen. Ich zeichne bzw. modelliere öfters mal ohne Ebenenbasishöhe und ohne Geschosse. Dafür wollte ich mir eine Marionette bauen, welche mir einen Punkt an Stelle x,y,z erstellt und dort in 3d verschiedene Daten ausgibt. Der Punkt soll dann im Raum verschiebbar sein und die Koordinaten sollen sich beim Bewegen automatisch anpassen. Und der Punkt sollte mit Daten speisbar sein. Das Textfeld der Koordinaten sollte in 3d-Ansicht immer lesbar sein. Es gibt vermutlich sinnvollere Möglichkeiten das zu machen aber irgendwann hatte ich mich damit so lange beschäftigt, bis ich unbedingt eine Lösung für genau den Weg haben wollte. Aber ich denke ich habe das Problem dank eurer Hilfe entdeckt. Ich wusste nicht, dass Handles ihre Kennung ändern. Also wird es doch ein anderer Weg. Naja immerhin lernt man immer dazu.


Danke euch und schönen Abend

- Vectorworks 2026 ARCH (aktuell) / Windows 11

- 10th Gen Intel i7-10750H @ 2.60GHz - 32GB RAM - RTX 2070 Laptop GPU

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
  • Forenstatistik

    • Themen insgesamt
      26,3Tsd
    • Beiträge insgesamt
      136,7Tsd
×
×
  • Neu erstellen...