Bezugspunkt im Fertigen PythonPart anpassen [Gelöst]

Schlagworte:
  • VisualScripting
  • Makro
  • [AIDP-165441]
  • [AIDP-163892]

Hallo!

Wir verwenden VisualScripting um parametrisierte und attribuierte Kleinteile zu generieren, die wir dann im Gebäudemodell an verschiedenen Stellen verlegen. Die Programmierung damit ist super schnell und auch für nicht-Programmierer leicht nachvollziehbar. Diese Kleinteile müssen jedoch austauschbar sein und das hat mit SmartParts bisher mit der Funktion "Makro/SmartPart tauschen" immer problemlos funktioniert. Bei PythonParts, die mit VisualScripting generiert werden, klappt das jedoch nicht ganz, weil wir keine Kontrolle darüber haben, wo der Basispunkt des fertig generierten Makro sich befindet.

Mal angenommen dass ich irgendwo im Modell einen Cylinder generieren will. Der Benutzer soll die Abmessungen und den Absetzpunkt definieren. Für die Definition des Basispunkts verwende ich den Node Point3DInput. Die Koordinaten übergebe ich an den Node Cylinder (sh. Bild #1). So generierter PythonPart befindet sich dann im Raum dort, wo sich der Benutzer das wünscht, hat aber sein Bezugspunkt bei 0,0,0 (sh. Bild #2). Das führt dazu, dass wenn er woanders im Raum ein zweites Cylinder mit gleichen Abmessungen absetzt, hat er dann auch den Basispunkt bei 0,0,0. Dadurch dass er sich aber woanders im Raum befindet, ist es ein anderes Objekt, der sein Basispunkt in Relation zu der Geometrie woanders hat. Würde man die beiden Zylinder jetzt gegeneinander austauschen, springt der eine auf die Stelle des anderen. So habe ich zwei Zylinder übereinander. Ist es möglich, diesen Basispunkt zu "überdefinieren"?

Auch der Min-Max-Box wird in den X-Y-Koordinaten richtig definiert, aber die Z-Koordinate immer auf 0 gesetzt. Hier wäre auch Wünschenswert, den Box anpassen zu können. Sonst lassen sich die so generierten PythonParts schlecht über Rechteck markieren. Vielleicht geht das mit einer funktion aus der AllplanPythonAPI? So könnte man sich selbst einen Node basteln (mit ExecPythonScript z.B.)

Noch besser wäre diese Lösung:
Bei PythonParts oder SmartParts wird zuerst die Geometrie generiert und "hängt" am Mauszeiger gleich nach dem Aufruf des Scripts. Sh. [EtcPath]\Examples\PythonParts\BasisExamples\MacroColumn.pyp. Ist es möglich, den gleichen Ablauf mit VisualScripting zu erreichen? Z.B. durch einen Node, der die Position und Ausrichtung (einer Art Placement Vektor) wiedergibt?

Anhänge (2)

Typ: image/png
100-mal heruntergeladen
Größe: 45,88 KiB
Typ: image/png
59-mal heruntergeladen
Größe: 26,12 KiB

Lösung anzeigen Lösung verbergen

Hallo,

leider konnten wir aus Zeitgründen die komplette Programmierung der benötigten Funktionalität zur Version 2022-1 nicht durchführen. Zum Testen, ob die von uns angestrebte Lösung für Dich passend ist, kannst Du folgende Tags in die pyp-Datei einbauen:

<Script>
<Name>NodeScript.py</Name>
<Title>NodeScript</Title>
<Version>1.3</Version>
<Interactor>True</Interactor>
<ReadLastInput>True</ReadLastInput>
<VSPlacementPointInput>True</VSPlacementPointInput>
<VSMultiPlacement>True</VSMultiPlacement>

<SubElements>Bohrpfahlbewehrung.pyp</SubElements>
</Script>

VSPlacementPointInput: mit True kann das erzeugte Objekt frei platziert werden
VSMultiPlacement: die Platzierung kann mehrfach durchgeführt werden.

Bisher können diese Werte noch nicht im VisualEditor gesetzt werden, und sie gehen auch beim nächsten Abspeichern des Skripts wieder verloren. Unsere Idee ist, dass wir das Setzen dieser Werte im VisualEditor über Checkboxen zugänglich machen.

Viele Grüße
Horst

11 - 14 (14)

Ein PythonPart/Visualscript ist zunächst mal ein Makro, mit einem Einfügepunkt.
Dieser Einfügepunkt bestimmt die Lage das Makros/PythonParts.

Wenn man ein PythonPart aus der Bibliothek einfügt, hangt es am Fadenkreuz, und kann auf dem Teilbild platziert werden.

Wenn man ein Visual-Script aus der Bibliothek eingfügt, passiert das nicht!
Dort wird das Visual-Script "ausgeführt", welches immer am Koordinaten Ursprung "operiert".

Es braucht in jedem Eingabenode eine Eigenschaft, die angibt, ob die Eingabe bei der "Erzeugung" abgefragt werden soll,
und in welcher Reihenfolge diese bezogen auf die anderen "Initialen Eingabe-Nodes" hat.

Bei der initialen Ausführung des Scriptes würden dann für die Nodes in dieser Reihenfolge die entspr. Eingabefunktionen gestartet, und beim ersten initialen Node die Lage/der Einfügepunkt des Visual-Script-Makros bestimmt. Alle folgenden Eingaben müßten dann auf diesen Einfüge-Punkt als Nullpunkt "normalisiert" werden.

In dieser Art und Weise habe ich das in meiner Visual-Script-Implementierung gelöst. (s. vs_insertpoint.mp4)
Im Preview wird ein kleines (min Punktfang versehenes) Achsenkreuz angezeigt, welches den Einfügepunkt des Visual-Scripts darstellt.
Damit weiss man immer , wo das Visual-Scirpt seinen lokalen Ursprung hat.

Anhänge (1)

Typ: video/mp4
616-mal heruntergeladen
Größe: 3,07 MiB

Zitiert von: Nemo
Es braucht in jedem Eingabenode eine Eigenschaft, die angibt, ob die Eingabe bei der "Erzeugung" abgefragt werden soll,
und in welcher Reihenfolge diese bezogen auf die anderen "Initialen Eingabe-Nodes" hat.

Diese Eigenschaft in dem von Allplan geliefertem VisualScripting-Tool entweder fehlt komplett, oder ich kann sie schlichtweg nicht finden. Das von dir im Video gezeigte Toll zum Visual-Scripting kenne ich leider nicht.

Hallo,

leider konnten wir aus Zeitgründen die komplette Programmierung der benötigten Funktionalität zur Version 2022-1 nicht durchführen. Zum Testen, ob die von uns angestrebte Lösung für Dich passend ist, kannst Du folgende Tags in die pyp-Datei einbauen:

<Script>
<Name>NodeScript.py</Name>
<Title>NodeScript</Title>
<Version>1.3</Version>
<Interactor>True</Interactor>
<ReadLastInput>True</ReadLastInput>
<VSPlacementPointInput>True</VSPlacementPointInput>
<VSMultiPlacement>True</VSMultiPlacement>

<SubElements>Bohrpfahlbewehrung.pyp</SubElements>
</Script>

VSPlacementPointInput: mit True kann das erzeugte Objekt frei platziert werden
VSMultiPlacement: die Platzierung kann mehrfach durchgeführt werden.

Bisher können diese Werte noch nicht im VisualEditor gesetzt werden, und sie gehen auch beim nächsten Abspeichern des Skripts wieder verloren. Unsere Idee ist, dass wir das Setzen dieser Werte im VisualEditor über Checkboxen zugänglich machen.

Viele Grüße
Horst

So genau haben wir uns das vorgestellt! Das ist die perfekte Lösung zum Generieren von Kleinteilen. Auch mit dem MultiPlacement ist es eine super Lösung!

Eine Anmerkung hätte ich noch, aber das ist dann schon Meckern auf hohem Niveau: es wäre gut, wenn die Palette bereits nach dem ersten Skriptaufruf, wenn das generierte Objekt noch am Maus hängt, schon aktiv wäre, so dass man die Objektparameter einstellen kann, bevor man das Objekt noch platziert hat. Man kann das natürlich nach dem Absetzen machen. Wenn das MultiPlacement aktiviert ist, dann steht die Palette für das zweite und weitere Objekte zur Verfügung, noch bevor man sie Abgesetzt hat, also von daher müsste das auch für das erste Objekt machbar sein. Wenn wir dadurch natürlich nicht mehr Probleme verursachen.

Vielen Dank für den Hinweis, so können wir unsere bereits programmierten Objekte verwenden!

11 - 14 (14)