Announcements
Attention for Customers without Multi-Factor Authentication or Single Sign-On - OTP Verification rolls out April 2025. Read all about it here.

Inventor ILogic - Problem mit PutMatrixData

Anonymous

Inventor ILogic - Problem mit PutMatrixData

Anonymous
Not applicable

Guten Morgen,

 

ich habe in Problem mit dem Ausrichten eines Bauteils in eine Baugruppe.

Prinzipiell gehe ich wie folgt vor (Auszug aus dem Code).

...

Dim Eintrag(15) As Double

...

oMatrix.GetMatrixData Eintrag

...

Set xAchse = otransgeom.CreateVector(1, 0, 0)

...

Set opunktneu = otransgeom.CreatePoint(0, 0, 0)
Call oMatrix.SetToRotation(meinWinkelWert * PI / 180 * (-1), xAchse, opunkt)
Call oMatrix.SetTranslation(otransgeom.CreateVector(Eintrag(3), Eintrag(7), Eintrag(11)))

...

oFace.Transformation = oMatrix

 

Das habe ich jeweils für die X Y Z- Achse geschrieben und funktioniert auch einwandfrei.

Aber, wenn ich eine Drehung in X ausführe, werden die Werte für Y und Z auf 0 gesetzt.

Das selbe passiert bei Y oder Z, d.h. die vorhergehenden Winkelwerte gehen verloren.

 

Nun hab ich mir gedacht, ich speichere mir die Winkelwerte in einer 2. Matrix zwischen und kopiere dann dort die geänderten Winkelwerte  rein. Danach benutze ich  "PutMatrixData()".

 

Hier dazu mal ein Testcode:

oMatrix.GetMatrixData Eintrag
Eintrag1(5) = Eintrag(5)
Eintrag1(6) = Eintrag(6)
Eintrag1(9) = Eintrag(9)
Eintrag1(10) = Eintrag(10)
Call oMatrix.PutMatrixData(Eintrag1)
oFace.Transformation = oMatrix

Dies wird mir mit Run-time error '5': Invalid procedure call or argument quittiert.

Wenn ich aber die Drehung ausführe und dann die alten werte zurück spiele, wird die Drehung rückgängig gemacht und es gibt keinen Fehler.

Also so:

oFace.Transformation = oMatrix
Call oMatrix.PutMatrixData(Eintrag1)
oFace.Transformation = oMatrix

Gibt es hierfür eine Lösung?

 

gruß

 

Andre

 

 

 

 

@Anonymous Der Beitragstitel wurde von @michele.mk zur besseren Auffindbarkeit bearbeitet. Originaltitel: Problem mit PutMatrixData

 

0 Likes
Reply
Accepted solutions (1)
1,006 Views
6 Replies
Replies (6)

fullevent
Advisor
Advisor

Hallo @Anonymous,

 

versuch mal wenn ich das richtig verstehe überschreibst du die Matrix anstatt diese zu "verrechnen".

Versuch mal bitte sowas in dieser Richtung und sag Bescheid ob es besser klappt. (ungetestet.. Rechner braucht noch etwas)

 

Dim Eintrag(15) As Double

...

oMatrix.GetMatrixData Eintrag

Dim oMatrix1 As Matrix
Set oMatrix1 = otransgeom.CreateMatrix

...

Set xAchse = otransgeom.CreateVector(1, 0, 0)

...

Set opunktneu = otransgeom.CreatePoint(0, 0, 0)
Call oMatrix1.SetToRotation(meinWinkelWert * PI / 180 * (-1), xAchse, opunkt)
Call oMatrix.SetTranslation(otransgeom.CreateVector(Eintrag(3), Eintrag(7), Eintrag(11)))

Call oMatrix.TransformBy(oMatrix1)

...

oFace.Transformation = oMatrix

 

Gruß,

Aleks


Aleksandar Krstic
Produkt- und Projektmanager

Anonymous
Not applicable

Das hatte ich auch schon.

Aber bei oMatrix.TransformBy(oMatrix1) werden die Werte mit den Ausgangswerten multipliziert.

Wenn der Ausgangswinkel 10° ist und der neue 45° , dann ist das Ergebnis 450° = 90°.

Nur bei einem Ausgangswinkel von 0° würde es funktionieren.

 

Gruß

 

Andre

0 Likes

fullevent
Advisor
Advisor

Hi @Anonymous,

 

ok das heißt du möchtest die Ausrichtung nicht ändern sondern festlegen.

Dazu muss ich sagen, dass das etwas komplizierter ist. Zumindest war ich etwas überrascht als ich damit zu tun hatte.

 

Angenommen du hast ein BT in der BG auf dem Ursprung platziert und keine Rotation. Dann hat das BT die folgende Matrix.

2020-02-13 11_29_33-Window.png

wenn du das Bauteil wie auf dem folgenden Bild verschieben und ausrichten möchtest

2020-02-13 11_29_47-Window.png

dann muss die Matrix folgende Werte enthalten:

2020-02-13 11_29_57-Window.png

 

Schau dir Seite 19 von dem PDF an: https://modthemachine.typepad.com/files/mathgeometry.pdf 

Das ist auch gleichzeitig die Quelle der Bilder.

 

Das Dokument ist klasse und hat mir sehr geholfen die "Matrix-Thematik" zu verstehen.

Vielleicht hilft es dir auch.


Aleksandar Krstic
Produkt- und Projektmanager

Anonymous
Not applicable

Ja nach dem Dokument arbeite ich, die Werte in der Matrix sind mir auch klar.

Wie gesagt, eine Drehung um die x-Achse ist problemlos möglich, allerdings werden dann Drehungen  von Y u. Z auf 0 gesetzt.

Ich würde gerne die Matrix auslesen, die neuen berechneten Werte reinschreiben und dann die Matrix zurückschreiben.

Das funktioniert aber nicht. Ich bekomme hier den oben beschriebenen Fehler.

Ich hab mir auch die koordinaten der neuen Matrix mal zwischengespeichert und dann versucht diese zu übergeben.

Mit dem selben Ergebnis (Fehlermeldung). Interesanterweise schreibt modthemachine in einem anderen Beitrag, das dies möglich sei.

https://modthemachine.typepad.com/my_weblog/2017/01/store-and-restore-occurrence-position.html

Als entweder mach ich generell was falsch, hab nen Denkfehler oder was überlesen.

Notfalls muss ich auf die Mehrfachtransformation zurückgreifen, indem ich immer alle Achsen nacheinander transformiere. Wäre aber nicht die optimale Lösung.

 

Gruß

 

Andre

 

 

 

0 Likes

fullevent
Advisor
Advisor
Accepted solution

Hallo Andre,

 

ich habe vor zwei Jahren mal eine Regel erstellt, welche mir erlaubt die Werte im Bild zu ändern.2020-02-13 12_44_02-Window.png

Wenn man nicht ganz versteht was da passiert, führt es zu einem anderen Ergebnis als erwartet wird. Ich vermute das ist der Grund weshalb die Felder ausgegraut sind.

 

Hier der iLogic-Code, der das Bearbeiten dieser Felder übernimmt:

Dim oTG As TransientGeometry
oTG = ThisApplication.TransientGeometry
Dim oMatrix1 As Matrix
oMatrix1 = oTG.CreateMatrix
Dim oAsm As AssemblyDocument
oAsm = ThisApplication.ActiveDocument
Dim oOcc As ComponentOccurrence
'oOcc = oAsm.SelectSet(1)
oOcc = ThisApplication.CommandManager.Pick(SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Komponente auswählen..")
Dim oMatrix As Matrix
oMatrix = oOcc.Transformation
Dim dCells(15) As Double
oMatrix.GetMatrixData(dCells)
dPi = Atan(1)*4

Dim dPhi As Double		' x-Winkel
dPhi = InputBox("Phi (X)", "iLogic", "Grad")
Dim dTheta As Double	' y-Winkel
dTheta = InputBox("Theta (Y)", "iLogic", "Grad")
Dim dPsi As Double		' z-Winkel
dPsi = InputBox("Psi (Z)", "iLogic", "Grad")

dPhi_b = dPhi/180*dPi
dTheta_b = dTheta/180*dPi
dPsi_b = dPsi/180*dPi

oMatrix1 = oOcc.Transformation

oMatrix1.Cell(1,1) = Cos(dTheta_b)*Cos(dPsi_b)
oMatrix1.Cell(1,2) = Cos(dTheta_b)*Sin(dPsi_b)
oMatrix1.Cell(1,3) = -Sin(dTheta_b)
oMatrix1.Cell(2,1) = Sin(dPhi_b)*Sin(dTheta_b)*Cos(dPsi_b)-Cos(dPhi_b)*Sin(dPsi_b)
oMatrix1.Cell(2,2) = Sin(dPhi_b)*Sin(dTheta_b)*Sin(dPsi_b)+Cos(dPhi_b)*Cos(dPsi_b)
oMatrix1.Cell(2,3) = Sin(dPhi_b)*Cos(dTheta_b)
oMatrix1.Cell(3,1) = Cos(dPhi_b)*Sin(dTheta_b)*Cos(dPsi_b)+Sin(dPhi_b)*Sin(dPsi_b)
oMatrix1.Cell(3,2) = Cos(dPhi_b)*Sin(dTheta_b)*Sin(dPsi_b)-Sin(dPhi_b)*Cos(dPsi_b)
oMatrix1.Cell(3,3) = Cos(dPhi_b)*Cos(dTheta_b)

oOcc.Transformation = oMatrix1


Ich hoffe das hilft dir weiter.

Einfach mal die Regel ausführen, dann eine Komponente anklicken, die drei Winkel eingeben und fertig.

 

Gruß,

Aleks


Aleksandar Krstic
Produkt- und Projektmanager

0 Likes

Anonymous
Not applicable

Ok, ich sehe du führst auch die Transformation für alle Achsen nacheinader durch.

Ansonsten werde ich wohl mein Code so umschreiben das ich immer die Transformation für alle Achsen durchführe auch wenn sich der Wert nicht ändert.

 

Gruß

 

Andre

0 Likes