Hallo,
ich habe mir mal ein Tool gebaut um eine Schweißzange an die entsprechenden Schweißpunkte zu setzen.
Wobei in der Zange eine Achse vorhanden ist (nicht auf 0), die als Werkzeug-Mittelpunkt gilt, und die Punkte auch in einem Part verteilt sind.
Die Punkte sowie die Zange liegen dabei irgendwo in einem Produkt mit beliebiger "Tiefe".
Es ging dann darum die Instanz der Zange so zu positionieren dass die Werkzeug-Achse der Zange mit dem entsprechendem Punkt übereinkommt.
Lange Rede, kurzer...
Ich musste mir die Lage der einzelnen Parts, im Produkt ermitteln.
Wenn ich es noch richtig weiß hatte ich damals auch das so ein Problem, da ich nicht die Instanz alos nicht das "Produkt" der Instanz genommen habe.
Das Part selbst (im Symbol mit Weißem Blatt und Zahnrad) ist ja nicht direkt im Produkt angehängt, sonder es ist ja immer noch die Instanz oder "Komponente" dazwischen. Und um die geht es.
hier mal mein Code in Auszügen:
1. Auswahl der Achse und ermitteln des Zangparts, sowie der Instanz.
Code:
SelFilter(0) = "AxisSystem"
Me.Hide
sStatus = sel.SelectElement2(SelFilter, "Bitte die Achse einer Zange auswählen. ESC=Abbrechen", False)
If sStatus <> "Cancel" Then ' Wenn Auswahl nicht abgebrochen
Set ZangenProdukt = sel.Item(1).LeafProduct ' dazugehörige Instanz der Zange um diese Zange wieder zu finden
Set oZangenAchse = sel.Item(1).Value
Set ZangenPart = oZangenAchse.Parent.Parent
2. das oberste Produkt ermitteln
Code:
Set oDoc = CATIA.ActiveDocument
Set RootProdukt = oDoc.Product
3. und dann rekrusiv die Position der Instanz ermitteln
Code:
GetAbsPosition ZangenProdukt.Parent.Parent, RootProdukt, ZangenParentAbsolutPosition ' absolute Position der ZangePublic Sub GetAbsPosition(ByRef oProduct, ByRef oRoot, ByRef position)
'On Error Resume Next
If (oProduct.Name = oRoot.Name) Then
position(0) = 1#
position(1) = 0#
position(2) = 0#
position(3) = 0#
position(4) = 1#
position(5) = 0#
position(6) = 0#
position(7) = 0#
position(8) = 1#
position(9) = 0#
position(10) = 0#
position(11) = 0#
Else
Dim positionToFather(11)
Dim fatherAbsolutePosition(11)
oProduct.position.GetComponents positionToFather
GetAbsPosition oProduct.Parent.Parent, oRoot, fatherAbsolutePosition
MatrixProduct positionToFather, fatherAbsolutePosition, position
End If
End Sub
Public Sub MatrixProduct(ByVal matrix1, ByVal matrix2, ByRef res)
Dim a(11)
Dim b(11)
Dim i As Integer
For i = 0 To 11
a(i) = matrix1(i)
b(i) = matrix2(i)
Next
res(0) = a(0) * b(0) + a(1) * b(3) + a(2) * b(6)
res(3) = a(3) * b(0) + a(4) * b(3) + a(5) * b(6)
res(6) = a(6) * b(0) + a(7) * b(3) + a(8) * b(6)
res(1) = a(0) * b(1) + a(1) * b(4) + a(2) * b(7)
res(4) = a(3) * b(1) + a(4) * b(4) + a(5) * b(7)
res(7) = a(6) * b(1) + a(7) * b(4) + a(8) * b(7)
res(2) = a(0) * b(2) + a(1) * b(5) + a(2) * b(8)
res(5) = a(3) * b(2) + a(4) * b(5) + a(5) * b(8)
res(8) = a(6) * b(2) + a(7) * b(5) + a(8) * b(8)
res(9) = a(9) * b(0) + a(10) * b(3) + a(11) * b(6) + b(9)
res(10) = a(9) * b(1) + a(10) * b(4) + a(11) * b(7) + b(10)
res(11) = a(9) * b(2) + a(10) * b(5) + a(11) * b(8) + b(11)
End Sub
------------------
Gruss Markus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP