Deine Bremse ist das wohl das ständige Suchen nach den Kettengliedern.
Das brauchst Du aber eigentlich nur ein einziges Mal, beim ersten Aufruf von MoveChain, zu machen. Das machr MoveChain jetzt aufgrund der statischen InitMe, die, falls der Compiler richtig arbeitet, nicht TRUE ist.
In der 'IF Not InitMe' werden für max. 200 Kettenglieder, die stehen bestimmt unsortiert in der Liste, die zugehörigen Indizes ermittelt:
KGIdxUsed[n] bestimmt, ob es ein n-tes Kettenglied gibt.
oCompOcc[n] ist das Objekt des n-ten Kettengliedes.
minIdx das kleinste n
MaxIdx das größte n
(n sollte natürlich im Bereich von 1 bis 200 liegen!)
Jetzt nur noch KG[n].x, .y und .z berechnen und MoveChain nach jeder Neuberechnung aufrufen.
Code:
Public Sub MoveChain()
Static InitMe as Boolean
Static KGIdxUsed[1 .. 200] as Boolean
Dim idx as integer
Static maxIdx as integer
Static minIdx as integer Dim oDoc As Inventor.AssemblyDocument
Set oDoc = ThisApplication.ActiveDocument
Dim oCompDef As Inventor.ComponentDefinition
Set oCompDef = oDoc.ComponentDefinition
Dim oTransform As Matrix
Set oTransform = oOccurrence.Transformation
Dim oCompOccTemp As ComponentOccurrence
Static oCompOcc[1 .. 200] As ComponentOccurrence
Dim n AS Integer
IF Not InitMe THEN
maxIdx = 0
minIdx = 9999
For n = 1 To 200
KGIdxUsed[n] = FALSE
NEXT n
For Each oCompOccTemp In oCompDef.Occurrences
If Left$(oCompOccTemp.Name,11) = "Kettenglied" Then
idx = CInt(Mid$(oCompOccTemp.Name,11))
Set oCompOcc[idx] = oCompOccTemp
KGIdxUsed[idx] = TRUE
IF idx > maxIdx THEN
maxIdx = idx
ELSE
IF idx < minIdx THEN
minIdx = idx
ENDIF
ENDIF
ENDIF
NEXT
InitMe = TRUE
ENDIF
For n = minIdx To maxIdx
IF KGIdxUsed[n] THEN
Debug.Print oCompOcc[KGIdx[n]].Name
oTransform.SetTranslation ThisApplication.TransientGeometry.CreateVector(KG(n).x, KG(n).y, KG(n).z)
oOccurrence.Transformation = oTransform
ENDIF
Next n
End Sub
Was ich allerdings nicht begriffen habe ist, wie oOccurrence.Transformation = oTransform sich auf das Listenelement oCompOcc beziehen kann. Hoffentlich nicht, weil vorher mit Debug.Print die 'Name'-Property ausgegeben wurde
Wie auch immer, es bleibt für jeden weiteren Aufruf von MoveChain nur die Schleife i = minIdx TO maxIdx übrig. Ohne Suche nach den Kettengliedern.
Tipp: In den Modulen immer die Option für explizite Variablen-Deklaration verwenden!!!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP