| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Bauteile rotieren mit VBA - aber wie geht das? (3353 mal gelesen)
|
murph Mitglied Inventor-Klixer
Beiträge: 36 Registriert: 06.12.2011
|
erstellt am: 22. Okt. 2014 12:15 <-- editieren / zitieren --> Unities abgeben:
Servus cad.de-Community, ich möchte bei Inventor Bauteile in einer Baugruppe mit Winkelwerten (welche ich aus einer Excel-Tabelle importiert habe) um die eigenen Koordinatenachsen des jeweiligen Bauteile rotieren. Mit den "normalen" Features zum Zusammenbau von Inventor scheint das nicht zu gehen, in den iProperties sind die Winkel grau und nicht editierbar. Ich bin auf den Hinweis gestoßen, dass das mit VBA gehen soll. Ich habe zwar schon mal programmiert, aber von der Skriptsprache VBA keine Ahnung. Ich habe die Forenbeiträge für VBA-Tipps hier gefunden, allerdings haben diese gut 10 Jahre auf dem Buckel und die Links funktionieren zum Teil auch nicht mehr. Youtube-Videos fand ich auch nicht wirklich einsteigerfreundlich. Kann mir jemand Tipps geben, Tutorials nennen oder Ähnliches, um erstmal einen prinzipiellen Einstieg zu finden? Sogesehen dürfte das ja kein langes VBA-Skript sein für das was ich erreichen will... oder sind grundsätzlich andere Ansätze sinnvoller? Danke schon mal murph Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 200x, Civil, LDD, MDT, ARD, ACA(ADT) Inventor AIP 4-11,200x WinXP, W2K
|
erstellt am: 22. Okt. 2014 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für murph
|
murph Mitglied Inventor-Klixer
Beiträge: 36 Registriert: 06.12.2011
|
erstellt am: 22. Okt. 2014 13:56 <-- editieren / zitieren --> Unities abgeben:
Jo, auf den ersten Blick erscheint mir das so, als würde man da etwas in die Grundlagen der Computergrafik eintauchen müssen. Aber ich versuche mich mal da reinzufuchsen. Danke für den Tipp! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
murph Mitglied Inventor-Klixer
Beiträge: 36 Registriert: 06.12.2011
|
erstellt am: 12. Nov. 2014 14:58 <-- editieren / zitieren --> Unities abgeben:
Ich hatte jetzt endlich mal die Gelegenheit, mich mit dem Paper auseinanderzusetzen. Also die Logik dahinter habe ich verstanden, aber die Code-Beispiele kann ich nicht 1:1 als iLogic-Regel reinkopieren. Ich habe auch keine Erfahrung mit VBA, sieht aber aus wie Python oder Java, von daher im Groben nachvollziehbar. Weiß da jemand, wie man beispielhaft so ein VBA-Skript in Inventor umsetzt oder kann mir sonst ein paar Beispiele geben? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 12. Nov. 2014 18:48 <-- editieren / zitieren --> Unities abgeben: Nur für murph
Hallo Man drückt im Inventor Alt+F11 und dann öffnet sich der VBA-Editor. Den Beispielcode kopiert man über die Zwischenablage in ein Modul und drückt auf den Play-Knopf in der Symbolleiste. Wenn was falsch ist, meckert VBA schon. VBA-Code wird niemals 1:1 in iLogic laufen, die Syntax ist unterschiedlich. Beispiel zum Verschieben einer Occurrence, rotieren ist im Grunde das gleiche nur die Transformation der Matrix wird mit SetToRotation definiert. Code: Public Sub MoveOccurrence() ' Set a reference to the assembly component definintion. Dim oAsmCompDef As AssemblyComponentDefinition Set oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition ' Get an occurrence from the select set. On Error Resume Next Dim oOccurrence As ComponentOccurrence Set oOccurrence = ThisApplication.ActiveDocument.SelectSet.Item(1) If Err Then MsgBox "An occurrence must be selected." Exit Sub End If On Error GoTo 0 ' Get the current transformation matrix from the occurrence. Dim oTransform As Matrix Set oTransform = oOccurrence.Transformation ' Move the occurrence honoring any existing constraints. oTransform.SetTranslation ThisApplication.TransientGeometry.CreateVector(2, 2, 3) oOccurrence.Transformation = oTransform ' Move the occurrence ignoring any constraints. ' Anything that causes the assembly to recompute will cause the ' occurrence to reposition itself to honor the constraints. oTransform.SetTranslation ThisApplication.TransientGeometry.CreateVector(3, 4, 5) Call oOccurrence.SetTransformWithoutConstraints(oTransform) End Sub
Der Spaß beginnt erst richtig, wenn die Bauteile mit Abhängigkeiten aneinander haften und die Rotation diesen widerspricht oder wenn man durch mehrere Unterbaugruppenebenen greift.
Was ist denn das Ziel der Rotation? Ich hoffe kein simulierter Bewegungsablauf, denn das wird meiner Meinung frustrierend langsam. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
murph Mitglied Inventor-Klixer
Beiträge: 36 Registriert: 06.12.2011
|
erstellt am: 19. Nov. 2014 10:32 <-- editieren / zitieren --> Unities abgeben:
Achso. Die grundlengende Info, dass ich da in einen extra VBA-Editor rein muss und es nicht mit iLogic geht, ist mir neu - das erklärt auch, warum ich mit VBA-Code im iLogic-Menü irgendwie nix gebacken bekam... Also was ich mit Rotation machen will, ist "im Prinzip ganz einfach": Ich arbeite mit Leuten zusammen, die die Objekte mit ihrem 3D-Tool nur anhand von Translation und Rotation im Raum ausrichten. Basierend auf deren Entwürfen soll ich dann eine konkrete Konstruktion daraus machen. Export der Geometriemodelle aus deren 3D-Tools haben wir auch schon probiert, aber Dateiformate zwischen verschiedenen Programmen hin- und herzuschieben ist m.E. oft mit Komplikationen verbunden. Da kam die Idee auf, dass ja die Eigenschaften (Lage/Ausrichtung im Raum, Abmaße etc.) nur eine Hand voll Zahlenwerte sind. Diese Zahlenwerte können in eine Excel-Tabelle gepackt werden, die Inventor wiederum einliest. Teil dieser Zahlen sind natürlich auch die Rotationen um die eigenen Achsen der Objekte jeweils, weshalb ich dies in Inventor nachbilden will. Ich hoffe, das war soweit nachvollziehbar erklärt von mir Simulierte Bewegungsabläufe sollen das aber nicht werden. Das ist eine statische Konstruktion, bei der ich die Objekte mittels Rotation und Translatation ausrichten will (und die Ausrichtung bei Bedarf schnell ändern will) Die x,y,z-Koordinaten lassen sich ja per Hand recht leicht in den iProperties ändern, aber für die Rotation will ich das wie gesagt mit VBA machen. (Der Idealfall wäre z.B., dass ich die Excel-Tabelle mit geänderten neu einlese und dann die Objekte entsprechend neu positioniert und ausgerichtet sind) So, und jetzt probiere ich mich mal an deinem Code-Beispiel. Danke schon mal dafür! Edit: Habe jetzt den Code im Editor eingefügt und gestartet mit Play (vorher natürlich mein Bauteil ausgewählt in der Baugruppe). Anscheinend wird der Code ausgeführt und das Bauteil ist dann nicht mehr angewählt. Aber ich sehe keine Veränderung der Lage, auch laut iProperties hat sich die Lage im Raum nicht geändert. Edit 2: Die Translation funktioniert schon, allerdings nur zu einer festen Position mit x=30, y=40 und z=50; was anscheinend dem Vektor (3,4,5) aus dem Teil des Skriptes entspricht, in dem die Constraints ignoriert werden. Aber es gibt ja darüber noch den Abschnitt, in dem die Constraints berücksichtigt werden. Werden beide Abschnitte ausgeführt oder nur einer, je nach gegebenen Constraints? Weil mein Bauteil hat keine Zwangsbedingungen in der Baugruppe. Ich bin jetzt auch nach und nach dabei, den Code Schritt für Schritt zu verstehen. Also nicht wundern, wenn noch weitere Fragen dazu kommen Danach mache ich mir Gedanken, wie ich das zu einem Rotations-Skript umbaue. [Diese Nachricht wurde von murph am 19. Nov. 2014 editiert.] [Diese Nachricht wurde von murph am 19. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
murph Mitglied Inventor-Klixer
Beiträge: 36 Registriert: 06.12.2011
|
erstellt am: 19. Nov. 2014 15:43 <-- editieren / zitieren --> Unities abgeben:
So, ich bin zu einer ersten praktikablen Lösung gekommen (Code siehe unten), die vielleicht auch anderen Leuten hier im Forum weiterhelfen kann. Es handelt sich dabei im Wesentlichen um das Code-Beispiel von Seite 23/24 aus dem von CAD-Huebner verlinkten "mathgeometry"-Dokument von Autodesk. Allerdings muss ich das Skript für meine Anforderungen noch erweitern. Die nächsten Schritte wären folgende: - Drehung für jedes Objekt unterschiedlich definieren, z.B. durch vorheriges Anwählen (wie im Beispiel von rkaushk) oder dass das Skript zum Anklicken auffordert (durch die For-Schleife werden ja alle Teile bewegt) --> Erledigt! - Bequemere Eingabe der Transformationsparameter (GUI?) oder vielleicht automatisches Einlesen aus der importieren Excel-Tabelle - Nutzung von Zielwerten bzw. Absolutwerten anstelle von relativen Werten zur derzeitgen Position und Ausrichtung Edit: Einzelne Bauteile können jetzt angewählt werden. Aktualisierter Code siehe unten. Code:
'Code-Beispiel aus Autodesk Paper für Rotation und Translation von Seite 23f. 'Skript funktioniert! todo: '1. Einzelne Parts gezielt rotieren lassen (durch Anklicken z.B.) '2. Bequemere Eingabe von WertenPublic Sub TransRot() Dim dPi As Double dPi = Atn(1) * 4 Dim oTG As TransientGeometry Set oTG = ThisApplication.TransientGeometry ' Set a reference ' (diese beiden Zeilen sind von anderen Code-Beispielen ' abgewandelt übernommen worden) Dim oAsmDoc As AssemblyDocument Set oAsmDoc = ThisApplication.ActiveDocument ' Create a matrix that defines a 45° rotation around the x-axis. Dim oTransMatrix As Matrix Set oTransMatrix = oTG.CreateMatrix Call oTransMatrix.SetToRotation(dPi / 4, oTG.CreateVector(1, 0, 0), _ oTG.CreatePoint(0, 0, 0)) ' Create a matrix that defines a 30° rotation around the y-axis and apply it. Dim oTempMatrix As Matrix Set oTempMatrix = oTG.CreateMatrix Call oTempMatrix.SetToRotation(dPi / 6, oTG.CreateVector(0, 1, 0), _ oTG.CreatePoint(0, 0, 0)) Call oTransMatrix.TransformBy(oTempMatrix) ' Create a matrix that defines a 5 cm X and 3 cm Z move and applies it. oTempMatrix.SetToIdentity Call oTempMatrix.SetTranslation(oTG.CreateVector(5, 0, 3)) Call oTransMatrix.TransformBy(oTempMatrix) ' Get an occurrence from the select set. On Error Resume Next Dim oOcc As ComponentOccurrence Set oOcc = ThisApplication.ActiveDocument.SelectSet.Item(1) If Err Then MsgBox "An occurrence must be selected." Exit Sub End If On Error GoTo 0 ' Get the matrix from the current occurrence. Dim oMatrix As Matrix Set oMatrix = oOcc.Transformation ' Apply the transform to the matrix. Call oMatrix.TransformBy(oTransMatrix) ' Set the transformation of the occurrence using the modified matrix. oOcc.Transformation = oMatrix End Sub
[Diese Nachricht wurde von murph am 19. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
murph Mitglied Inventor-Klixer
Beiträge: 36 Registriert: 06.12.2011
|
erstellt am: 26. Nov. 2014 14:16 <-- editieren / zitieren --> Unities abgeben:
Ich merke gerade, dass ich die Objekte ja eigentlich um die eigenen Achsen jeweils rotieren lassen muss. Weiß jemand, wie ich mit VBA die Achsen des jeweils angewählten Bauteils erhalten kann, damit ich diese als Rotationsachse definieren kann? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GeorgK Mitglied
Beiträge: 619 Registriert: 06.06.2001 Inventor 2017 Siemens NX 8.5 - 12.0 Autocad Mechanical 2017 Catia V5R19 3,4 GHz; 64 GB RAM Windows 10 openSUSE Leap 42.3 Visual Studio 2010 - 2017 Windows 2012 R2 Vault 2017
|
erstellt am: 21. Sep. 2015 10:36 <-- editieren / zitieren --> Unities abgeben: Nur für murph
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 21. Sep. 2015 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für murph
Servus Georg, du musst die Achse in Transient Geometrie definieren und kannst sie dann als Rotationsachse bestimmen: Code:
Dim oTG As TransientGeometry Set oTG = ThisApplication.TransientGeometry Dim xAchse As Vector Dim yAchse As Vector Dim zAchse As Vector Dim Matrix As Matrix Set Matrix = oTG.CreateMatrixSet xAchse = oTG.CreateVector(1, 0, 0) Set yAchse = oTG.CreateVector(0, 1, 0) Set zAchse = oTG.CreateVector(0, 0, 1) Call Matrix.SetToRotation((3 * 3.14159265358979) / 2, zAchse, oTG.CreatePoint(0, 0, 0))
------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GeorgK Mitglied
Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 23. Sep. 2015 12:46 <-- editieren / zitieren --> Unities abgeben: Nur für murph
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 23. Sep. 2015 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für murph
|
GeorgK Mitglied
Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 24. Sep. 2015 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für murph
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 25. Sep. 2015 07:14 <-- editieren / zitieren --> Unities abgeben: Nur für murph
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|