Hallo zusammen,
ich versuche, ein Bauteil in CATIA mithilfe des untenstehenden VBA-Codes zu rotieren. Das Bauteil ist bereits in einer Produktstruktur positioniert. Die Rotation soll jedoch um die X-Achse des lokalen Koordinatensystems des Bauteils erfolgen – nicht um das globale Koordinatensystem.
- Die neue XOrientierung der rotierten Bauteil ist gegebem (die RotationsAchse)
- Die YOrientierung der rotierten Bauteil rechne ich mithilfe der folgenen Funktion aus:
Function RotateVector(V As Variant, axis As Variant, angleDeg As Double) As Variant
Dim k(0 To 2) As Double
Dim length As Double
Dim angleRad As Double
Dim i As Integer
' 1. Achse normalisieren
length = Sqr(axis(0) ^ 2 + axis(1) ^ 2 + axis(2) ^ 2)
If length = 0 Then
MsgBox "Fehler: Rotationsachse darf kein Nullvektor sein"
Exit Function
End If
For i = 0 To 2
k(i) = axis(i) / length
Next i
' 2. Winkel in Radiant
angleRad = angleDeg * PI / 180
' 3. Berechne Kreuzprodukt k × v
Dim cross(0 To 2) As Double
cross(0) = k(1) * V(2) - k(2) * V(1)
cross(1) = k(2) * V(0) - k(0) * V(2)
cross(2) = k(0) * V(1) - k(1) * V(0)
' 4. Skalarprodukt k · v
Dim dot As Double
dot = k(0) * V(0) + k(1) * V(1) + k(2) * V(2)
' 5. Berechne die drei Terme der Rodrigues-Formel
Dim term1(0 To 2) As Double
Dim term2(0 To 2) As Double
Dim term3(0 To 2) As Double
Dim Result(0 To 2) As Double
For i = 0 To 2
term1(i) = V(i) * Cos(angleRad)
term2(i) = cross(i) * Sin(angleRad)
term3(i) = k(i) * dot * (1 - Cos(angleRad))
Result(i) = term1(i) + term2(i) + term3(i)
Next i
RotateVector = Result
End Function
- Die ZOrientierung wird mithilfe des Crossproducts berechnet. Das Crossproduct gibt die Normale zwischen den XOrientierung und YOrientierung aus
Sub CrossProduct(v1() As Double, v2() As Double, v3() As Double)
Den Normalenvektor kann man mit dem Kreuzprodukt berechnen.
'Dim f(2), s(2), n(2)
'oPL.GetFirstAxis f
'oPL.GetSecondAxis s
'n(0) = f(1) * s(2) - f(2) * s(1)
'n(1) = f(2) * s(0) - f(0) * s(2)
'n(2) = f(0) * s(1) - f(1) * s(0)
v3(0) = (v1(1) * v2(2) - v1(2) * v2(1))
v3(1) = (v1(2) * v2(0) - v1(0) * v2(2))
v3(2) = (v1(0) * v2(1) - v1(1) * v2(0))
End Sub
Zwar berechne ich die Transformationsmatrix basierend auf einer Drehung um die lokale Achse, aber beim Anwenden in CATIA wird die Rotation dennoch relativ zum globalen Achsensystem durchgeführt.
Hier ist der Code damit man einen Bauteil in Produkt cotext verschiebt/positioniert:
Set move1 = productToMove.Move
Set move1 = move1.MovableObject
Dim arrayOfVariantOfDouble1(11)
arrayOfVariantOfDouble1(0) = XCoord(0)
arrayOfVariantOfDouble1(1) = XCoord(1)
arrayOfVariantOfDouble1(2) = XCoord(2)
arrayOfVariantOfDouble1(3) = YCoord(0)
arrayOfVariantOfDouble1(4) = YCoord(1)
arrayOfVariantOfDouble1(5) = YCoord(2)
arrayOfVariantOfDouble1(6) = ZCoord(0)
arrayOfVariantOfDouble1(7) = ZCoord(1)
arrayOfVariantOfDouble1(8) = ZCoord(2)
arrayOfVariantOfDouble1(9) = Position(0)
arrayOfVariantOfDouble1(10) = Position(1)
arrayOfVariantOfDouble1(11) = Position(2)
Set move1Variant = move1
move1Variant.Apply arrayOfVariantOfDouble1
Problem:
Die Rotation wird aktuell in Bezug auf das globale Koordinatensystem ausgeführt, anstatt sich auf das lokale Koordinatensystem des Bauteils zu beziehen.
Frage:
Wie kann ich eine Rotation so anwenden, dass das Bauteil sich tatsächlich um sein eigenes lokales Koordinatensystem dreht – speziell um dessen X-Achse – und nicht um das globale Koordinatensystem?
Für jeden Hinweis wäre ich sehr dankbar!
[Diese Nachricht wurde von ballazolo am 16. Mai. 2025 editiert.]
[Diese Nachricht wurde von ballazolo am 19. Mai. 2025 editiert.]
Von Ralf Tide am 10.06. aus dem Dokumente-Forum hierher verschoben...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP