Ankündigungen

Announcement: We’re aware of an issue affecting starting a new topic from category pages and creating new blog posts. New topics can still be started directly from the relevant board. Learn more here.

iLogic/VBA - (Unter-)Komponente versetzen

iLogic/VBA - (Unter-)Komponente versetzen

fullevent
Advisor Advisor
1.934Aufrufe
10Antworten
Nachricht 1 von 11

iLogic/VBA - (Unter-)Komponente versetzen

fullevent
Advisor
Advisor

Hallo zusammen,

ich stehe mal wieder vor einem -für mich- etwas komplizierten Problem und benötige bitte einen Experten-Tipp.

In meiner Hauptbaugruppe sind zwei Unterbaugruppen in denen sich irgendwo (2-4 Ebenen weiter unten) ein identisches Bauteil befindet.

Folglich besitzen die Bauteil einen identischen (Display-)Namen. Die sind im Bild markiert.

 

1.png1.png

 

Ich versuche eine Regel oder ein Makro zu erstellen welcher mir von dem ersten Bauteil die Position in der Hauptbaugruppe auslist und das zweite Bauteil mit der ausgelesenen Matrix umpositioniert.

 

Ich bin momentan soweit, dass ich die Matrix eines vorher selekierten Bauteils auslesen kann und in das Bauteil "TEST_ADAPTER" einsetze.
Sodass die beiden Bauteile aufeinander liegen.

Dazu folgender iLogic-Code:

Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition

Dim oTG As TransientGeometry
oTG = ThisApplication.TransientGeometry

Dim oMatrix As Matrix 
oMatrix = oTG.CreateMatrix

Dim compOcc as ComponentOccurrence
Try
  compOcc = ThisDoc.Document.SelectSet.Item(1)
  oMatrix = compOcc.Transformation
  
	oAsmCompDef.Occurrences.ItemByName("TEST_ADAPTER").Transformation = oMatrix
Catch
  MessageBox.Show("Bitte zuerst eine Komponente auswählen", "iLogic")
  Return
End Try

Mein Problem ist, dass ich das zweite Bauteil natürlich auch gerne bequem selektieren würde. 
Über die Eingabe eines Komponentennamen funktioniert das leider nicht, da ich meistens einige dieser Bauteile finden würde und das erstbeste genommen wird.

Perfekt wäre es wenn ich ein Makro starten würde.

Dieses fordert mich auf das erste Bauteil zu selektieren, anschließend soll ein Klick auf "weiter" oder so folgen

dann werde ich aufgefordert ein zweites Bauteil zu selektieren, anschließend wieder ein Klick auf "weiter"

und dann soll die Matrix von Selektion2 auf die Selektion1 übertragen werden.

Ich denke dies über eine iLogic-Regel zu realisieren wird schwierig werden oder?

 

Mir würde es schon helfen wenn ich die ausgelesene Matrix in eine globale Variable (Parameter) abspeichern könnte. Hier stehen mir allerdings nur "nummerische", "Text" oder "Wahr/Falsch" Parameter zur Verfügung.

@Juergen_Wagner vielleicht hast du einen Tipp für mich parat!?


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Akzeptierte Lösungen (1)
1.935Aufrufe
10Antworten
Antworten (10)
Nachricht 2 von 11

fullevent
Advisor
Advisor

Ich habe nun einen etwas umständlichen Workaround.. 

Ablauf:
Ich markiere die Komponente von der ich die Position auslesen will und führe folgenden Code aus:

Dim odoc as AssemblyDocument 
odoc = ThisDoc.Document

Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition

Dim oTG As TransientGeometry
oTG = ThisApplication.TransientGeometry

Dim oMatrix As Matrix
oMatrix = oTG.CreateMatrix

oPath = ThisDoc.Path & "\"
oFile = "C26312.00-1_Adapter.ipt"

Dim compOcc As ComponentOccurrence

Try
	compOcc = odoc.SelectSet.Item(1)
	oMatrix = compOcc.Transformation
	compOcc	= oAsmCompDef.Occurrences.Add(oPath & oFile, oMatrix)
	compOcc.Name = "TEST_ADAPTER"
	MessageBox.Show("Matrix erfolgreich ausgelesen.", "iLogic")
Catch
	MessageBox.Show("Bitte zuerst eine Komponente auswählen", "iLogic")
End Try

*Dadurch habe ich mir eine weitere Komponente eingefügt (sozusagen als Platzhalter), die ich mit der zweiten Regel wieder lösche*

Danach markiere ich die Komponente, die ich bewegen möchte und führe folgende Regel aus:

Dim odoc as AssemblyDocument 
odoc = ThisDoc.Document

Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition

Dim oTG As TransientGeometry
oTG = ThisApplication.TransientGeometry

Dim oMatrix As Matrix 
oMatrix = oTG.CreateMatrix

Dim oComp As ComponentOccurrence
Dim oComps As ComponentOccurrences
oComps = odoc.ComponentDefinition.Occurrences

oComp = oComps.ItemByName("TEST_ADAPTER")
oMatrix = oComp.Transformation

Try
	oComp = odoc.SelectSet.Item(1)
	oComp.SetTransformWithoutConstraints(oMatrix)
	
	oComp = oComps.ItemByName("TEST_ADAPTER")
	oComp.Delete
	MessageBox.Show("Komponente erfolgreich verschoben.", "iLogic")
Catch
	MessageBox.Show("Bitte zuerst eine Komponente auswählen", "iLogic")
End Try



Zugegeben.. das sind einige Klicks mehr.. aber immer noch deutlich schneller als das ganze per Hand zu drehen und zu verschieben.

Wäre schön wenn man das etwas optimieren könnte Frustrierte Smiley

 


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 3 von 11

fullevent
Advisor
Advisor

.. zu früh gefreut..

ich verschiebe ja nur die einzelne Komponente. Eigentlich möchte ich ja die gesamte übergeordnete (Haupt-)Baugruppe verschieben.


Nochmal der Versuch es anhand des Bildes zu erklären (ich bin echt nicht gut in sowas).

 

Die grün umringelte Komponente soll auf die rot umringelte Komponente positioniert werden. Hierbei soll der gesamte Träger (blau umkastelt)  entsprechend mit verschoben werden.
Ergebnis soll sein, dass ich auf den ersten Blick sehe ob der Träger mit dem Tisch anstößt wenn die beiden Komponenten aufeinender liegen.

1.png1.png




Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 4 von 11

fullevent
Advisor
Advisor

Der einzige Ansatz der mir einfällt wäre folgender.

Ich lese von den beiden Unterkomponenten die jeweilige Matrix aus und versuche den "Weg" von der Ersten zur Zweiten zu errechnen (absolut keine Ahnung wie Frustrierte Smiley)..
Also die notwendigen Drehungen und den Versatz um von Matrix1 auf Matrix2 zu kommen in einer neuen Matrix festhalten.

Dann muss ich die Matrix von der Ober-BG, in dem Fall vom Träger, mit der neuen Matrix transformieren..

Dann müsste ich zum gewünschten Ergebnis kommen denke ich.

Ich werde mich in der nächsten Woche weiter damit beschäftigen und berichten.


Schönes Wochenende euch allen!

 


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 5 von 11

Martin-Winkler-Consulting
Advisor
Advisor

Hallo Aleks

ich kann ehrlich gesagt nicht ganz verstehen warum du das so kompliziert über Matrix Verschiebung machen willst.

Ohne mich jetzt wirklich intensiv mit deinem Problem beschäftigt zu haben sollte das doch m.E. über eine Steuerung mittels Parametern zu lösen sein?

 

Baugruppe bzw. Bauteil mittels Parametern positionieren in den Abhängigkeiten und dann kannst du über entsprechende Berechnungen und Parameterübergaben das Teil hinschieben wohin du willst. Ich habe mir übrigens strikt angwöhnt das fixierte Bateile ein No Go sind. Jedes Bauteil wird bei mir "anständig" und vorzugsweise über die Grundebenen verbaut. Ich vermeide es auch Bauteil an Bauteil zu verbauen. Dadurch erreiche ich größere Unabhängigleit bei der Parametrisierung ohne das mir die Abhängigkeiten um die Ohren fliegen.

 

 

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

Nachricht 6 von 11

fullevent
Advisor
Advisor

So langsam fängt das Thema jetzt doch an zu nerven Smiley (wütend)

Ich bin soweit, dass ich die Eulerischen Winkel einer Komponente anhand ihrer Matrix errechnen kann.

Inventor arbeitet dabei mir der z,y',x'' - Konvention. Nun kann ich die errechneten Winkel nutzen um eine (Unter-)Komponente entsprechend der Rotationsmatrix drehen zu lassen. Dabei wird die Übergeordnete Baugruppe ebenfalls entsprechend rotiert.

Aber irgendwie scheint es nicht immer zu funktionieren oder aber irgendwas blockiert dieses verfahren und ich habe keine Ahnung was das sein könnte.

Zum Vorgehen:
Zu erst errechne ich die Eulerischen Winkel, dann wird eine Rotationsmatrix berechnet und diese in eine Komponente implementiert

Im Video versuche ich das zu veranschaulichen.
Ich errechne die Winkel der (Unter-)Komponente "Bauteilsegment Fertigteil:4" zum BG-Ursprung.

 

Dann wende ich die errechnete Rotationsmatrix auf die Komponente "C54858.00-1_Bauteildaten:1" an. Das funktioniert!


Dann wende ich die errechnete Rotationsmatrix auf die Unterkomponente "C54858.00-1_Bauteildaten:1" der BG "test:1" an. Das funktioniert ebenfalls. Die Gesamte BG "test:1" wird mit rotiert. Also im Prinzip genau das was ich möchte.

Wenn ich das nun aber auf die selbe Unterkomponente in der BG "Greifer_Dummy:1" anwende passiert nichts. Mittlerweile habe ich herausgefunden, dass das nicht an der Ebene der Unterkomponente "C54858.00-1_Bauteildaten:1" liegt (getestet mit "C54858.00-1_Bauteildaten:1" auf 4ter Ebene).

Ich erkenne allerdings nichts was die BG "Greifer_Dummy:1" daran hindern sollte es der BG "test:1" gleich zu tun Frustrierte Smiley
Einen Ansatz hätte ich noch, aber das verschiebe ich mal auf den Nachmittag.

Vielleicht weiß einer der Profis hier was stören könnte.

Sorry für den Roman..

 

 


Aleksandar Krstic
Produkt- und Projektmanager

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

fullevent
Advisor
Advisor

Hallo @Martin-Winkler-Consulting,

jetzt wo ich deinen Post gelesen habe frage ich mich wirklich warum ich das so kompliziert versuche zu lösen und ob es einfacher geht.
Am Nachmittag versuche ich das ganze nochmal aus einem anderen Blickwinkel zu betrachten.. im Moment fällt mir das eher schwer xD

Danke jedenfalls für deinen Hinweis 🙂

 


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 8 von 11

Martin-Winkler-Consulting
Advisor
Advisor

Hallo Aleks,

kann es sein das in BG "Greifer_Dummy:1 Abhängigkeiten gesetzt sind die die Rotation verhindern?

Ich würde mal sämtliche Abhängigkeiten auf allen Ebenen unterdrücken und gucken was passiert.

 

 

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

0 „Gefällt mir“-Angaben
Nachricht 9 von 11

fullevent
Advisor
Advisor

Hallo Martin,

 

also eigentlich dürfen mir Abhängigkeiten und Fixierungen überhaupt nichts ausmachen.

 

Also momentan (bezogen auf mein Beispiel im Video) wird die BG  "test2:1" gar nicht in der Hauptbaugruppe gedreht auch wenn es so aussieht.
Viel mehr werden alle Komponenten die sich in der BG "test2:1" befinden so rotiert, dass in der Hauptbaugruppe die BG "test2:1" so erscheint wie ich es gerne hätte.
Mit anderen Worten die BG "test2:1" hat in der Hauptbaugruppe immer die selben iPropertie-Werte (auch wenns anders drin liegt).
Hingegen haben die Komponenten innerhalb der BG "test2:1" zwischen vorher/nacher unterschiedliche iPropertie-Werte.

 

Nur klappt das eben bei den Testbaugruppen und bei dem Greifer-Dummy plötzlich nicht mehr

 


Aber du hast völlig recht Martin! Für das was ich ursprünglich wollte recht es ja völlig aus wenn ich von den beiden Komponenten die ich übereinander haben möchte einfach die 3 Ursprungsebenen übereinander zu werfen und fertig.
Ich weiß gar nicht warum ich es für wichtig gehalten habe die Rotation in der Hauptbaugruppe beizubehalten und stattdessen alle in den Ebenen darunter ändern zu müssen.. Frustrierte Smiley

Irgendwie ist mir das grad etwas unangenehm.. 

 


Aleksandar Krstic
Produkt- und Projektmanager

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

Martin-Winkler-Consulting
Advisor
Advisor

Hallo Aleks,

manchmal wird man halt was betriebsblind, geht mir auch schon mal so Smiley (zwinkernd)

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

0 „Gefällt mir“-Angaben
Nachricht 11 von 11

fullevent
Advisor
Advisor
Akzeptierte Lösung

Ja absolut ^^

jetzt hab ich ein Makro, welches im Prinzip genau macht was ich möchte.
Ein paar Fehlerquellen noch ausmerzen und gut ists Smiley (fröhlich)

Danke nochmal für den rettenden Hinweis ^^

 


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben