[Frage] PythonParts Angle Handle [Gelöst]

Schlagworte:
  • Python
  • Handle
  • Angle

Hallo liebes Forum.

Ich hätte zwei Fragen zu PythonParts:

  • Wie ist es Möglich einen Angle Handle zu definieren? Bei SmartParts funktioniert das ja so: Link
  • Kann ich bei Pythonparts meinen ganzen Part um die X-Achse drehen? Ich habe bis jetzt nur die Methode AllplanGeo.Rotate gefunden, jedoch muss ich diese auf jedes generierte Element anwenden - gibt es da auch einen überderfinierten Befehl? Bei SmartParts ging das mit ROTX.

Vielen Dank schon im Voraus!

Lösung anzeigen Lösung verbergen

Angle-Handle: Schnipsel aus Column_Geo_Body.py (leider ohne Erläuterung der Bedeutung der Ref-Punkte)

# handle: rotation-gamma              
        handle_column_gamma  =  HandleProperties("Handle_rot",
                                                 AllplanGeo.Point3D(ref_point_handel_x, ref_point_handel_y, ref_point_handel_z),                                           
                                                 AllplanGeo.Point3D(ref_point_handel_x_dir,ref_point_handel_y_dir, ref_point_handel_z_dir),                                                                               
                                                 [("Angle_z", HandleDirection.angle)], 
                                                 HandleDirection.angle)

@Allplan
Hier fehlt wieder mal eine vollständige Dokumentation bzw. ein Beispiel!

Alles um X-Achse drehen:
Im SmartPArt gibt es einen Transformations-Stack, der mit TRANS-,ROT- oder SCALE-Befehlen additiv befüllt wird,
sozusagen ein 3D-Cursor. Jedes generiert Objekt wird an der Stelle des Cursors mit dessen Drehung eingefügt.
Letztlich ist es nur eine Transformation mit einer Matrix! Aber Obacht:
Spiegeln ist eine nichtaffine Transformation, die den Richtungssinn umkehrt. Danach muss man also z.B. ein Polyhedron "umdrehen", sonst zeigen die Innenseiten nach aussen! Das macht der Transformations-Stack des SmartParts alles im Hintergrund!

Wenn man so etwas Tolles im Pythonpart haben will, muss man sich das "zu Fuss" bauen. Einfach eine Matrix3D definieren, die Rotationen, Translationen und Skalierungen hinzufügen, und dann jedes Element mit dieser Matrix multiplizieren. Und den Sonderfall "Spiegelung" behandeln. Leider gibt es keine in den PythonParts keine Funktion, mit der man die richtungsändernde Eigenschaft einer Matrix3D feststellen kann.

Angle-Handle: Schnipsel aus Column_Geo_Body.py (leider ohne Erläuterung der Bedeutung der Ref-Punkte)

# handle: rotation-gamma              
        handle_column_gamma  =  HandleProperties("Handle_rot",
                                                 AllplanGeo.Point3D(ref_point_handel_x, ref_point_handel_y, ref_point_handel_z),                                           
                                                 AllplanGeo.Point3D(ref_point_handel_x_dir,ref_point_handel_y_dir, ref_point_handel_z_dir),                                                                               
                                                 [("Angle_z", HandleDirection.angle)], 
                                                 HandleDirection.angle)

@Allplan
Hier fehlt wieder mal eine vollständige Dokumentation bzw. ein Beispiel!

Alles um X-Achse drehen:
Im SmartPArt gibt es einen Transformations-Stack, der mit TRANS-,ROT- oder SCALE-Befehlen additiv befüllt wird,
sozusagen ein 3D-Cursor. Jedes generiert Objekt wird an der Stelle des Cursors mit dessen Drehung eingefügt.
Letztlich ist es nur eine Transformation mit einer Matrix! Aber Obacht:
Spiegeln ist eine nichtaffine Transformation, die den Richtungssinn umkehrt. Danach muss man also z.B. ein Polyhedron "umdrehen", sonst zeigen die Innenseiten nach aussen! Das macht der Transformations-Stack des SmartParts alles im Hintergrund!

Wenn man so etwas Tolles im Pythonpart haben will, muss man sich das "zu Fuss" bauen. Einfach eine Matrix3D definieren, die Rotationen, Translationen und Skalierungen hinzufügen, und dann jedes Element mit dieser Matrix multiplizieren. Und den Sonderfall "Spiegelung" behandeln. Leider gibt es keine in den PythonParts keine Funktion, mit der man die richtungsändernde Eigenschaft einer Matrix3D feststellen kann.

Danke für die Hilfe! Der Handle ist ja wirklich einfach zu erstellen...

Gibt es für das Verwenden und definieren einer solchen Matrix auch ein Beispiel/eine Referenz? Ich hab hier nur die Datei "TestMatrix3D.py" in den UnitTests gefunden jedoch ist mir die Funktionsweise noch nicht ganz klar.

1. Matrix erstellen: matrix = Geo.Matrix3D()
2. Translation hinzufügen: matrix.Translate(Geo.Vector3D(x,y,z))
Es wird eine Translationsmatrix erzeugt, und diese mit der vorhandenen Matrix mulitpliziert.
3. Z-Drehung hinzufügen: matrix.Rotation(Geo.Line3D(Geo.Point3D(0,0,0),Geo.Point3D(0,0,1)),angle)
Es wird eine Rotationsmatrix erzeugt, und diese mit der vorhandenen Matrix mulitpliziert.
4. Polyhedron transformieren: Geo.Transform(polyhedron,matrix)

Dabei ist die Reihenfolge wichtig, die Matrizenmultiplikation ist nicht kommutativ:
Zuerst Translation und dann Rotation ergibt nicht dasselbe wie erst Rotation und dann Translation.

Alles klar. Das werd ich mir mal anschauen.
Danke für die Hilfe!

Hallo Nemo - einmal brauche ich deine Hilfe noch!

Ich wollte mir eine Klasse definieren in der ich gewisse Transformationen und Rotationen schon fix als Methoden definieret habe.
Die Definition der Klasse samt Methode "Rot_X" findest du hier:

class Rotation():
def Rot_X(self, angle):
_angle = AllplanGeo.Angle()
_angle.Deg = angle
matrix = AllplanGeo.Matrix3D()
matrix.Rotation(AllplanGeo.Line3D(AllplanGeo.Point3D(0,0,0),AllplanGeo.Point3D(0,0,1000)),_angle)
return matrix

Und hier siehst du wie ich die Klasse instanziiere:

test = AllplanGeo.Transform(drilling_cyl, Rotation.Rot_X(self, 45.0))
self.model_ele_list.append(AllplanBasisElements.ModelElement3D(common_props, test))

Mein Ziel wäre es einen Zylinder zu drehen. Wenn ich das Skript laufen lasse, ändert sich jedoch nichts - die Drehung wird nicht übernommen. Fehlermeldung bekomme ich jedoch keine. Was hab ich hier falsch gemacht?

Die Klasse für die Rotation sollte so aussehen:

class Rotation():
    @staticmethod
    def Rot_X(angle):
        _angle = AllplanGeo.Angle()
        _angle.Deg = angle
        matrix = AllplanGeo.Matrix3D()
        matrix.Rotation(AllplanGeo.Line3D(AllplanGeo.Point3D(0,0,0),AllplanGeo.Point3D(0,0,1000)),_angle)
        return matrix

Folende Änderungen:
@staticmethod ... definiert Rot_X als statische Funktion. D.h. die Klasse muss zum Aufrufen der Funktion nicht instanziert werden.

Bei Deinem Aufruf
test = AllplanGeo.Transform(drilling_cyl, Rotation.Rot_X(self, 45.0))
kommt self vor. self wird eigentlich nur in der Klassedefinition benutzt, um die eigene Klasse an eine Funktion zu übergeben. In Python ist das leider so dämlich gelöst, in allen anderen Sprachen gibts dafür implizit "this". Beim Aufrufen/Benutzen der Funktion brauchst Du aber kein self mehr angeben, denn dort holt sich der Compiler die Klasseninstanz automatisch (steht vor dem Punkt). Merke: self ausserhalb der Klassendefinition ist falsch!

Danke für die Hilfe jetzt funktioniert es!

Wenn Du mit "Rot_X" um die X-Achse drehen willst, sollte es heißen:
matrix.Rotation(AllplanGeo.Line3D(AllplanGeo.Point3D(0,0,0),AllplanGeo.Point3D(1000,0,0)),_angle)

Ist mir dann auch aufgefallen, danke