Zum Inhalt springen

OIP mit Python ausfüllen


ChristianETG

Frage

Geschrieben

Hallo,

 

ich bin wieder mal auf der Suche nach einer Lösung. Ich möchte mit einem Script bei einem Objekt die Werte der OIP verändern. Das Objekt ist eine Marionette Objekt und das Feld in der OIP ein String-Input.

Hintergrund:
Das Marionette Objekt wird mit einem Werkzeug-Script eingefügt und voreingestellt, je nach Situation und Inputs vom Benutzer. Nachträglich soll der Benutzer aber noch Werte verändern können daher über die OIP.

Über Ideen dazu würde ich mich sehr freuen, ich steh auf dem Schlauch.

6 Antworten auf diese Frage

Empfohlene Beiträge

Geschrieben



Hi

Die Eingabeparameter sind bei einer Marionette keine Datenfelder sondern sogenannte Widgets. Dieser werden alle aus ein und dem selben Datenfeld "Marionette_OIPControls" dynamisch gebildet. Du must also dieses Datenfeld manipulieren. In der Tabelle gibt es zwar eine FunctionOption um das auszulesen und zu schreiben aber nicht in der Scriptsprache. Dort muss man es manuell machen. 

Schau mal, so sieht es in der Tabelle aus, dieses Datenfeld "Marionette_OIPControls"

image.png.590bd448d78ac8320736c32ea7dac840.png


Der Script-Workflow ist so, dass Du den OIP Parameter als json Objekt ausliesst. im json suchst du den key mit dem Wert des Parameter Namens und dann änderst Du den Wert dazu und schreibst das json wieder zurück und fertig.


Script technisch so. Ich verwende diese Funktion. Ich halte sie für sicher. Bzw. ich selber hatte damit noch nie einen crash.
 

def SetMarioParm(h, OIP_Name, OIP_value):
  # functions
  inObj = h
  recName = 'MarionetteObject2D'
  fldName = 'NodeDef_OIPControls'
  sOld = vs.GetRField(inObj, recName, fldName)

  j = json.loads(sOld)


  for OIP_field in j['data']:
    name = OIP_field['text']

    if OIP_Name in name:
      #vs.AlrtDialog(name)
      value = OIP_field['value']
      OIP_field['value'] = OIP_value

      vs.SetRField(inObj, recName, fldName, json.dumps(j))



#aufrufen der Funktion dann z.B. so:

SetMarioParm(pio_handle, 'Breite', 1000)



Und dann vielleicht hier oder nachher ein vs.ResetObject(pio_handle) wäre noch nötig.
 

  • Like 2

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

Geschrieben

Grundsätzlich ist dieses Thema wirklich mit Vorsicht zu genießen, weil die falschen Werte zu manipulieren schnell zum Absturz führen kann.

Umgesetzt habe ich eine solche OIP-Feld-Änderung hier:
https://forum.vectorworks.net/index.php?/files/file/270-story-replicator-geschosskopierer/

Siehe Zeilen 114, 119, 140, 187, 214, 406.

Jedoch sind das reine nicht beschreibbare Felder. Ich vermute, es geht auch mit frei beschreibbaren Feldern.

 

Bildschirmfoto2025-07-01um11_20_41.png.7aa020af8d21e7b769f92d17a5ac1c94.png

Gruß


Antonio Landsberger

Vectorworks Germany GmbH

https://www.vectorworks.de/

Geschrieben

Guter Ansatz schonmal. Ich bin leider nicht der Profi mit Python und die Problematik ist, dass ich 2 Scripte habe. Das Marionette Object mit den OIP Parametern welche der Benutzer bedarf anpassen kann. Auf der anderen Seite ein Plugin-Tool welches das Marionette Object aus dem Zubehör-Manager heraus einfügt und mit gewissen Einstellungen versorgt.

mit "self.Parms.<variable>.SetValue" kann ich nach meine Verständnis ja nicht vom Plugin-Tool aus in die OIP der Marionette eingreifen.

 

Meine Marionette hat eine modifizierte Input-Node Type 'Name' welche auf einen Nullpunkt verweist. Der Nullpunkt soll ansich vom Script-Tool gewählt werden abhängig von ein paar anderen Faktoren. Relativ komplexe Sache. Im Nachgang soll aber der Benutzer die Möglichkeit haben den Nullpunkt zu wechseln. Hinter der Name-Node habe ich eine Fehlerüberprüfung falls der Wert keinen Nullpunkt bestimmt.

Wenn ich den Nullpunkt in eine Datenbank schreibe könnte ich diese natürlich mit vs.SetRField beschreiben beim Einfügen über mein Plugin-Tool. Allerdings würde dies nicht die OIP überschreiben oder?

Geschrieben

Danke schonmal für die Hilfe.

Ich hab das mal in meinen Code "umgewurstet" und das sieht jetzt so aus:

def SetMarioParm(h, OIP_Name, OIP_value):
	inObj = h
	recName = 'MarionetteObject2D'
	fldName = 'NodeDef_OIPControls'
	sOld = vs.GetRField(inObj, recName, fldName)

	#Fehlerüberprüfung
	if not sOld:
		vs.AlrtDialog(f"Fehler beim Aufrufen der OIP-Daten. Feldinhalt: {sOld}")
		return


	j = json.loads(sOld)


	for OIP_field in j['data']:
		name = OIP_field['text']

	if OIP_Name in name:
		#vs.AlrtDialog(name)
		value = OIP_field['value']
		OIP_field['value'] = OIP_value

		vs.SetRField(inObj, recName, fldName, json.dumps(j))

 

und der Aufruf in _main_: 

SetMarioParm(handle, POINT_ZERO, prefix)

direkt nach dem 'prefix' definiert wurde. 'POINT_ZERO' ist definiert als der Name meiner Input-Node also in meinem Fall '02 Referenzpunkt'

Resultat des Codes ist: Marionette Object wird ohne Referenzpunkt-Wert eingefügt. (also so wie im Marionwette Netzwerk festgelegt) Kann es sein, dass die Marionette nach dem Einfügen nochmals den Wert überschreibt da sie ausgeführt wird? Ich erhalte nicht den Fehler meiner Überprüfung also scheint das Script ansich ja durchzulaufen.

Geschrieben

also der Loop stimmt nicht. if OIP_Name .... muss eingerückt werden unter name =
Wobei so wie Dein Script ist wird es vermutlich gar nichts tun. Weil OIP_Name ist '02 Referenzpunkt'

Da ist natürlich die Frage. nimm mal Referenzpunkt statt '02 Referenzpunkt'. oder guck in der Tabelle, wie der Schlüssen heisst. Vermutlich zählt die Zahl nicht zum Parameter sondern ist nur für die Sortierung da.

Also mal vielleicht mit einem einfacheren Beispiel probieren. 






 

  • Like 1

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

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,8Tsd
    • Beiträge insgesamt
      139,3Tsd
×
×
  • Neu erstellen...