Zugriff auf aktuellen Versatz mit ilogoc

Zugriff auf aktuellen Versatz mit ilogoc

Gajus61
Enthusiast Enthusiast
1.447Aufrufe
14Antworten
Nachricht 1 von 15

Zugriff auf aktuellen Versatz mit ilogoc

Gajus61
Enthusiast
Enthusiast

Hallo Inventorgemeinde,

 

ich suche einen Weg, mit dem ich die x-y-z-Werte für den Versatz vom Ursprung auslesen bzw. ändern kann.

 

Gajus61_0-1598609178640.png

Am einfachsten wäre es, wenn man einen Parameter

Gajus61_1-1598609381509.png

angeben kann, der als Parameter im Feld verknüpft bleibt. Leider wird der nach Bestätigung nur der Wert des Parameters übernommen.

 

Es gibt über

iProperties.Value ( "part", "Name des Reiters", "Variable")

die Möglichkeit, Parameter aus den iProperties auszulesen. Man muss aber die Englischen Bezeichner der Reiternamen kennen, und auch die Variablennamen.

 

Meine Frage:

Wo finde ich diese Informationen bzw. wer kennt die Parameternamen für mein spezielles Problem.

 

Für die Hilfestellung danke ich im Voraus.

 

LG

0 „Gefällt mir“-Angaben
Akzeptierte Lösungen (1)
1.448Aufrufe
14Antworten
Antworten (14)
Nachricht 2 von 15

Peter.C.Schulz
Autodesk Support
Autodesk Support

Hallo @Gajus61,

 

die Informationen die Du suchst sind Baugruppen-Informationen. Sie werden zwar im iProperty-Dialog angezeigt, sind aber keine Bauteil-Properties, die Du mit iProperties.Value() ansprechen kannst. Es sind Eigenschaften der Occurrence, also der jeweiligen platzierten Komponente in der Baugruppe.

 

Mit dem folgenden Code, kommst du an die gewünschten Eigenschaften deiner Komponente. Aber Achtung: die Einheiten sind immer Zentimeter und müssen ggf. noch entsprechend formatiert/umgerechnet werden.

 

Im Beispiel Code wird nach der Komponente mit dem Namen "ENG-DOC-00048" auf der obersten Baugruppenebene gesucht und die Werte in die Variablen dX, dY und dZ gespeichert. Ich habe zur Kontrolle die Ausgabe in einer Dialogbox hinzugefügt.

 

Dim oAsm As AssemblyDocument
oAsm = ThisApplication.ActiveDocument

Dim oOcc As ComponentOccurrence
Dim dX, dY, dZ As Double
For Each oOcc In oAsm.ComponentDefinition.Occurrences
    If oOcc.Name = "ENG-MUC-000048" Then
        dX = oOcc.Transformation.Translation.X ' X-Wert
        dY = oOcc.Transformation.Translation.Y ' Y-Wert
        dZ = oOcc.Transformation.Translation.Z ' Z-Wert
    End If
Next

MessageBox.Show("X=" & Round(dX, 3) & " Y=" & Round(dY,3) & " Z=" & Round(dZ,3), "Title")

Gruß, Peter



Peter Schulz

Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 3 von 15

Gajus61
Enthusiast
Enthusiast
Hallo Peter,
Vielen Dank für die schnelle und klar verständliche Rückmeldung. Soweit so klar, jetzt kann ich die Parameter auslesen. Ich kann den/die Translationsparameter aber nicht direkt beschreiben. In den Objektbeschreibungen wird "Translation" als Vektorobjekt angegeben. Um die Versatzparameter neu zu setzen, muss man scheinbar eine Vektormethode anwenden. Ich bin leider kein VBA-Spezialist und auch mit Vektoren hab ichs nicht. Deshalb die Frage: Wie schreibe ich neue Werte für die Versatzparameter.
Für Deine Antwort bedanke ich mich im Voraus.
LG Erwin
0 „Gefällt mir“-Angaben
Nachricht 4 von 15

Peter.C.Schulz
Autodesk Support
Autodesk Support

Hallo Erwin,

 

ich habe mal ein wenig weiter nachgeforscht und im Inventor Customization Forum Code gefunden, der dir weiterhelfen könnte.

 

Im Artikel Place components using coordinates wird die Verwendung der Matrix und Vektoren gezeigt.

 

Hoffe dies hilft Dir weiter.

 

Grüße,

Peter



Peter Schulz

Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 5 von 15

Gajus61
Enthusiast
Enthusiast
Akzeptierte Lösung
Hallo Peter,
Vielen Dank für Deine Bemühungen. In dem Beitrag wird ein neues Teil eingefügt und positioniert. Ich habe das Teil bereits in der iam und will es nachträglich verschieben. Im Deutschen Forum bin ich schließlich fündig geworden und habe mir ein Programmzeilen ableiten können; verstehen tu ichs nicht wirklich, aber Hauptsache es funktioniert.
evx = evx

Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition

Dim oTG As TransientGeometry
oTG = ThisApplication.TransientGeometry

Dim oMatrix As Matrix
oMatrix = oTG.CreateMatrix

oMatrix.SetTranslation(oTG.CreateVector(0, 0, evx/10))
oAsmCompDef.Occurrences.ItemByName("OberteilGesamt:1").Transformation = oMatrix

evx ist der Wert den der Bauteil absolut vom Koordinatenursprung in einer Richtung versetzt angeordnet werden soll. Der ist als Benutzerparameter definiert. Die erste Zeile dient nur dazu, dass die Regel automatisch bei einer Änderung des Wertes aufgerufen wird. Die vorletzte Zeile definiert die Verschiebematrix, die ich in das Bauteil übergebe.
LG Erwin
0 „Gefällt mir“-Angaben
Nachricht 6 von 15

fullevent
Advisor
Advisor

Hallo @Gajus61,

 

ich habe mich Anfang des Jahres mit dieser Thematik beschäftigt und mir ein paar kleinere Tools gemacht.
Möchtest du eine neue Position für das Teil vergeben oder einen Wert um den Verschoben werden soll?

Screencast Verschiebung (selektierte Komponenten werden um eingegebene Werte verschoben)


Möchtest du auch Drehungen umsetzen?

Screencast Drehung (selektierte Komponente wird auf eingegebene Winkel gedreht)

 

Grüße,


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 7 von 15

Gajus61
Enthusiast
Enthusiast
Hallo,
Ich will (momentan) nur Verschieben. Dazu habe ich auch schon eine Lösung gefunden.
Rotieren wäre ev. für andere Bauteile ev. Interessant. Kannst du Deine Tools übermitteln, oder sind die "geheim".
Grüße
0 „Gefällt mir“-Angaben
Nachricht 8 von 15

Peter.C.Schulz
Autodesk Support
Autodesk Support

Hallo @Gajus61 ,


vielleicht kannst Du ja deine eigene Lösung als solche markieren, dann können andere im Forum sehen, dass eine Lösung gefunden wurde.

 

LG

Peter



Peter Schulz

Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 9 von 15

fullevent
Advisor
Advisor

Hallo @Gajus61,

geheim ist da nichts. Das meiste wäre ohne die Hilfe der Mitglieder hier nicht zustande gekommen.

 

Sobald ich wieder am Arbeitsplatz bin werde ich den Code posten bzw. hochladen.

Wird allerdings 2-3 Wochen dauern.

Wäre schön wenn du deine Lösung ebenfalls postest und, wie @Peter.C.Schulz  schon geschrieben hat, als Lösung markierst.

 

Viel Erfolg weiterhin.

Grüße


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 10 von 15

Gajus61
Enthusiast
Enthusiast
Hallo fullevent,
"meine" paar Codezeilen sind schon im Post. Da ich so gut wie keine Erfahrung mit dem Forum habe, weiß ich leider nicht, wie man die farblich markiert. Den "Als Lösung markieren"-Button habe ich bereits gedrückt.
Danke für Deine Unterstützung
LG
0 „Gefällt mir“-Angaben
Nachricht 11 von 15

Anonymous
Nicht anwendbar

Entschuldigung wenn ich mich jetzt einfach mal einklinke aber ich bräuchte so etwas ähnliches. Ich suche einen Code, der mir den Aktuellen Versatz (Translation und Rotation) in Excel ausgeben kann. 

 

Sub Export_xyz_excel()

Dim oAsmDoc As AssemblyDocument
Set oAsmDoc = ThisApplication.ActiveDocument

Dim sDocName As String
Dim i As Long
Dim iRow As Long

Dim XL As Object
Dim xlWB As Object
Dim xlWS As Object

If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject And ThisApplication.ActiveDocumentType <> kPartDocumentObject Then
MsgBox "Only Part or Assymbly document ", vbCritical
Exit Sub
End If

Set XL = CreateObject("Excel.Application")
Set xlWB = XL.Workbooks.Add
Set xlWS = xlWB.ActiveSheet
XL.Visible = True

iRow = 1
xlWS.Cells(iRow, 1).value = "Name"
xlWS.Cells(iRow, 2).value = "Type"
xlWS.Cells(iRow, 3).value = "Child"
xlWS.Cells(iRow, 4).value = "Length"
xlWS.Cells(iRow, 5).value = "Width"
xlWS.Cells(iRow, 6).value = "WidthOfLift"
xlWS.Cells(iRow, 7).value = "LiftRelPosX"
xlWS.Cells(iRow, 8).value = "Height"
xlWS.Cells(iRow, 9).value = "PosX"
xlWS.Cells(iRow, 10).value = "PosY"
xlWS.Cells(iRow, 11).value = "PosZ"
xlWS.Cells(iRow, 12).value = "RotX "
xlWS.Cells(iRow, 13).value = "RotY "
xlWS.Cells(iRow, 14).value = "RotZ "

 

xlWS.Rows("1:1").Select
XL.Selection.Font.Bold = True

With XL.Selection.Font
.name = " Arial"
.Size = 11
.Bold = False
End With

On Error Resume Next

For i = 1 To ThisApplication.ActiveDocument.ComponentDefinition.Occurrences.Count


Dim oOcc As ComponentOccurrence
Set oOcc = ThisApplication.ActiveDocument.ComponentDefinition.Occurrences(i)

Dim oOL As Vector
Dim oT As Matrix

Set oT = oOcc.Transformation
Set oOL = oT.Translation

Dim oMatrix1 As Matrix
Set oMatrix1 = oOcc.Transformation

Dim oOrigin1 As Point
Dim oX1 As Vector
Dim oY1 As Vector
Dim oZ1 As Vector

Call oMatrix1.GetCoordinateSystem(oOrigin1, oX1, oY1, oZ1)

Dim oMatrix2 As Matrix
Set oMatrix2 = ThisApplication.TransientGeometry.CreateMatrix

Dim oOrigin2 As Point
Dim oX2 As Vector
Dim oY2 As Vector
Dim oZ2 As Vector

Call oMatrix2.GetCoordinateSystem(oOrigin2, oX2, oY2, oZ2)

 

Dim paraLänge As Object
Dim paraAbstand As Object
Dim paraQuer As Object
Dim paraFuss As Object
Dim paraHöhe As Object
Dim oParameter As Object
Dim paraType As Object
Dim k As Long


Set paraLänge = oAsmDoc.ComponentDefinition.Occurrences.Item(i).Definition.Parameters.Item("Segmentlänge")
Set paraQuer = oAsmDoc.ComponentDefinition.Occurrences.Item(i).Definition.Parameters.Item("Anzahl_Querstreben")
Set paraFuss = oAsmDoc.ComponentDefinition.Occurrences.Item(i).Definition.Parameters.Item("Anzahl_Standfüße")
Set paraHöhe = oAsmDoc.ComponentDefinition.Occurrences.Item(i).Definition.Parameters.Item("Eingabe_Höhe")
Set paraAbstand = oAsmDoc.ComponentDefinition.Occurrences.Item(i).Definition.Parameters.Item("Abstand_Kettenmitte")

iRow = iRow + 1


Debug.Print

xlWS.Cells(iRow, 1).value = oOcc.name

xlWS.Cells(iRow, 3).value = 0

xlWS.Cells(iRow, 4).value = paraLänge.value
xlWS.Cells(iRow, 4).value = Round(xlWS.Cells(iRow, 4).value / 100, 3)

xlWS.Cells(iRow, 5).value = paraAbstand.value
xlWS.Cells(iRow, 5).value = Round(xlWS.Cells(iRow, 5).value / 100, 3)

xlWS.Cells(iRow, 6).value = 0

xlWS.Cells(iRow, 7).value = 0

xlWS.Cells(iRow, 8).value = paraHöhe.value
xlWS.Cells(iRow, 8).value = Round(xlWS.Cells(iRow, 8).value / 100, 3)

xlWS.Cells(iRow, 9).value = oOL.x
xlWS.Cells(iRow, 9).value = Round(xlWS.Cells(iRow, 9).value / 100 * -1, 3)

xlWS.Cells(iRow, 10).value = paraHöhe.value
xlWS.Cells(iRow, 10).value = Round(xlWS.Cells(iRow, 10).value / 100, 3)

xlWS.Cells(iRow, 11).value = oOL.y
xlWS.Cells(iRow, 11).value = Round(xlWS.Cells(iRow, 11).value / 100, 3)

xlWS.Cells(iRow, 13).value = Round((oY1.AngleTo(oY2) * 180) / 3.14159265 - 90, 0)

Next

XL.Cells.Select
XL.Cells.EntireColumn.AutoFit
xlWS.Range("A1").Select

sDocName = ThisApplication.ActiveDocument.FullFileName
If sDocName = "" Then
sDocName = "c:\temp\x"
Else
sDocName = Mid(sDocName, 1, Len(sDocName) - 4)
End If

If Dir(sDocName & ".xls") <> "" Then
i = 1
Do While Dir(sDocName & "_" & i & ".xls") <> ""
i = i + 1
Loop
sDocName = sDocName & "_" & i
End If

xlWB.SaveAs FileName:=sDocName

Set xlWS = Nothing
Set xlWB = Nothing
Set XL = Nothing


End Sub

 

Das habe ich mir mal so zusammenkopiert. Es funktioniert auch Teilweise aber noch nicht komplett. Hier wird sozusagen der Winkel zwischen zwei Vektoren bestimmt. Hätte da jemand eine "schönere" Idee also ich weiß, dass Inventor mit Matrixen arbeitet aber leider weiß ich nicht wie ich mir diese ausgeben lassen kann.

Vielen Dank und freundliche Grüße 

Valentin

0 „Gefällt mir“-Angaben
Nachricht 12 von 15

fullevent
Advisor
Advisor

Hallo @Anonymous,

 

kurz vorab.. wäre gut wenn du hierfür einen neuen Beitrag erstellst.

Zum einen wird ein bereits "gelöster" Betrag nicht mehr so oft angeschaut, was weniger potentielle Helfer bedeutet. Zum anderen ist die neue Frage zwar oft ähnlich, aber nie gleich (sonst wäre die Lösung ja bereits gepostet worden). So bleibt das Forum auch für die anderen Mitglieder übersichtlicher/transparenter. Vielleicht möchtest du das ja noch machen.

 

Zu deinem Vorhaben.. Wenn ich dich richtig verstanden habe möchtest du diese 6 Werte auslesen oder?

2021-05-07 10_00_14-AHAA-000-AA_2 iProperties.png


Aleksandar Krstic
Produkt- und Projektmanager

Nachricht 13 von 15

Anonymous
Nicht anwendbar

Danke für den Tipp habe ich gemacht. Ja genau.

Gruß

Valentin

Nachricht 14 von 15

fullevent
Advisor
Advisor

Hallo @Anonymous,

 

vor ein paar Jahren stand ich vor der gleichen Aufgabe. Ich musste herausfinden, dass die Winkel-Werte nicht ausgelesen werden können. Zumindest sind sie in der Form nirgends hinterlegt. Jede Komponente hat eine Transformationsmatrix (4x4). In dieser ist die genaue Lage (Rotation und Versatz) der Instanz beschrieben. Nur eben in einer anderen Form

 

Natürlich kann man diese auch in die Form der drei Winkelangaben umrechnen. Hier der Code dafür..

Die Funktion ArcCos wird nicht benötigt und ist nur der Vollständigkeit halber dabei.

 

Private Sub all_angle_of_comp() 'Alle Winkel in Grad
    dPi = Atn(1) * 4
    Dim oOcc As ComponentOccurrence
    Set oOcc = ThisApplication.CommandManager.Pick(SelectionFilterEnum.kAssemblyOccurrenceFilter, "Komponente auswählen..")
    Set oRotMat = oOcc.Transformation
    Dim v1 As String, v2 As String, v3 As String, w1 As String, w2 As String, w3 As String
    dPi = Atn(1) * 4
    
    v1 = "X-Versatz = " & Round(oRotMat.Cell(1, 4) * 10, 3)
    v2 = "Y-Versatz = " & Round(oRotMat.Cell(2, 4) * 10, 3)
    v3 = "Z-Versatz = " & Round(oRotMat.Cell(3, 4) * 10, 3)
    w1 = "X-Winkel = " & Round(ArcTan2(oRotMat.Cell(2, 3), oRotMat.Cell(3, 3)) * 180 / dPi, 3)
    w2 = "Y-Winkel = " & Round(-ArcSin(oRotMat.Cell(1, 3)) * 180 / dPi, 3)
    w3 = "Z-Winkel = " & Round(ArcTan2(oRotMat.Cell(1, 2), oRotMat.Cell(1, 1)) * 180 / dPi, 3)
    
    MsgBox oOcc.Name & vbCr & vbCr & v1 & vbCr & v2 & vbCr & v3 & vbCr & vbCr & w1 & vbCr & w2 & vbCr & w3, , "KrA"
End Sub

Private Function ArcSin(x As Double) As Double
    dPi = Atn(1) * 4
    If Abs(x) = 1 Then
        ArcSin = (Sgn(x) * dPi / 2)
    Else
        ArcSin = (Atn(x / Sqr(1 - x ^ 2)))
    End If
End Function

Private Function ArcCos(x As Double) As Double
    dPi = Atn(1) * 4
    If Abs(x) = 1 Then
        ArcCos = (dPi / 2 - (Sgn(x) * dPi / 2))
    Else
        ArcCos = (dPi / 2 - Atn(x / Sqr(1 - x ^ 2)))
    End If
End Function

Public Function ArcTan2(y As Double, x As Double) As Double
    If x > 0 Then
        ArcTan2 = Atn(y / x)
    ElseIf x < 0 Then
        ArcTan2 = Sgn(y) * (Pi - Atn(Abs(y / x)))
    ElseIf y = 0 Then
        ArcTan2 = 0
    Else
        ArcTan2 = Sgn(y) * Pi / 2
    End If
End Function

 

Die Ausgabe habe ich dir in eine Msgbox gepackt.

2021-05-10 08_28_15-Window.png2021-05-10 08_28_39-Window.png

 

Makro starten, dann die gewünschte Komponente auswählen und schon erscheint die Msgbox.

 

Hoffe das hilft dir weiter.

Viel Erfolg und einen guten Start in die Woche.

 

Viele Grüße,


Aleksandar Krstic
Produkt- und Projektmanager

Nachricht 15 von 15

Anonymous
Nicht anwendbar

Vielen Dank Für deine Hilfe.

Gruß Valentin

0 „Gefällt mir“-Angaben