| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Ändern der Bauteile/Bauteilfarbe durch iLogic oder VBA (3605 / mal gelesen)
|
DaioD Mitglied Student
Beiträge: 10 Registriert: 04.02.2019
|
erstellt am: 04. Feb. 2019 17:24 <-- editieren / zitieren --> Unities abgeben:
Moin zusammen! Schon lange durchforste ich das Forum und poste nun zum ersten mal hier. Ich habe ein kleines Problem mit Inventor: Ich habe eine Baugruppe aus 4-5 Bauteilen erstellt und möchte die Farbe der Bauteile über VBA oder iLogic ansteuern und verändern. Ist dies irgendwie in Inventor möglich? Ich bin neu auf diesem Gebiet und würde mich jede Hilfe freuen! Beste Grüße Daio [Diese Nachricht wurde von DaioD am 31. Mrz. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 05. Feb. 2019 09:04 <-- editieren / zitieren --> Unities abgeben: Nur für DaioD
Farbdarstellung ändern, Komponenten einfügen/ersetzen, Screenshot abspeichern,... alles möglich sowohl per VBA als auch iLogic. Ob jetzt VBA oder iLogic besser geeignet ist, hängt davon ab, wie das Programm ausgelöst werden soll. Button auf der Benutzeroberfläche -> VBA automatisch durch Ereignisauslöser -> iLogic Auch die Frage, ob der Code in einer Bgr/Prt liegen soll spielt evtl. eine Rolle (wäre dann ein Fall für iLogic). Aber keine Sorge, das ließe sich auch alles noch vermischen (VBA per iLogic aufrufen oder umgekehrt). Liste der Befehle... naja das ist dann wohl die API-Hilfe hier wird die Farbe einer Komponente innerhalb einer Baugruppe geändert: http://ww3.cad.de/foren/ubb/Forum50/HTML/037829.shtml
Bild abspeichern: https://ww3.cad.de/foren/ubb/Forum258/HTML/001630.shtml#000010 ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DaioD Mitglied Student
Beiträge: 10 Registriert: 04.02.2019
|
erstellt am: 05. Feb. 2019 14:35 <-- editieren / zitieren --> Unities abgeben:
Hallo KraBBy, vielen Dank für deine Links! Das mit dem abspeichern hat super geklappt, habe noch eine "For"-Schleife eingefügt, um das Bild x mal abzuspeichern. Gibt es eine Möglichkeit auch den "Kamerawinkel" jedes mal um x grad oder zufällig zu rotieren? Dafür habe ich diesen Code gefunden im Forum: Code: Public Sub test_camera_2() Dim oView As View Dim oCamera As Camera Set oView = ThisApplication.ActiveView Set oCamera = oView.Camera oCamera.ViewOrientationType = kBottomViewOrientation oCamera.Apply oCamera.ViewOrientationType = kLeftViewOrientation oCamera.Apply oCamera.ViewOrientationType = kFrontViewOrientation oCamera.Apply oCamera.ViewOrientationType = kBackViewOrientation oCamera.Apply End Sub
http://ww3.cad.de/foren/ubb/Forum258/HTML/000037.shtmlDieser richtet sich nach den vorhandenen Ebenen aus. Wäre sowas möglich in die obere Schleife miteinzubauen? Also Ansicht 1 - Abspeichern, Ansicht 2 - Abspeichern etc. Irgendwie müsste es doch gehen diese Ansichten als Fälle zu speichern und ebenfalls mit einer For-Schleife diese Fälle zu varrieren. Oder bin ich da auf dem falschen Weg? Viele Grüße Daio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DaioD Mitglied Student
Beiträge: 10 Registriert: 04.02.2019
|
erstellt am: 05. Feb. 2019 16:28 <-- editieren / zitieren --> Unities abgeben:
Hier mal der aktuelle Code. Vielleicht nicht der sauberste, aber so kann ich eine gewisse Anzahl an Bilder in einem bestimmten Winkel abspeichern. Das reicht mir soweit. Schön wäre es, wenn es noch möglich wäre die Farben der einzelnen Bauteile in einem bestimmten RGB Wert zu ändern. Z.B. "Bauteilbeispiel 1" in RGB (200, 100, 200) Ich kenne zwar den Befehl Component.Color("Bauteil") = "Blue" , aber da fehlt mir etwas die Variation. Ist es möglich die Farben in einer Schleife zu ändern? Code: Sub variation() Dim oDoc As Document Set oDoc = ThisApplication.ActiveDocument Dim oView As View Set oView = oDoc.Views(1) Set oCamera = oView.Camera oCamera.Apply Dim oTO As TransientObjects Set oTO = ThisApplication.TransientObjects Dim oTop As Color Set oTop = oTO.CreateColor(255, 255, 255) Dim oBottom As Color Set oBottom = oTO.CreateColor(255, 255, 255) Dim dsplmode As String Dim i As Integer Dim i2 As String Dim filename As String Dim User As String dsplmode = 0 Dim k As Integer'Starten der Schleife For k = 1 To 19 If ThisApplication.ActiveView.DisplayMode = kShadedRendering Then dsplmode = 1 ThisApplication.ActiveView.DisplayMode = kShadedWithEdgesRendering End If i = 0 'For i = 1 To 99 Step 1 For i = 1 To 17 Step 1 If i < 10 Then i2 = "0" + CStr(i) End If If i > 9 Then i2 = "" + CStr(i) End If User = Environ(" USERNAME ") filename = "C:\Users\" + User + "\Desktop\Bild_" + i2 + ".png" If Dir(filename) = "" Then Exit For Next If k < 10 And k > 0 Then oCamera.SaveAsBitmap filename, 3840, 2160, oTop, oBottom ElseIf k > 10 And k < 20 Then oCamera.ViewOrientationType = kIsoBottomLeftViewOrientation oCamera.Apply oCamera.SaveAsBitmap filename, 3840, 2160, oTop, oBottom End If If dsplmode = 1 Then ThisApplication.ActiveView.DisplayMode = kShadedRendering End If Next k End Sub
Gruß Daio
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 05. Feb. 2019 16:53 <-- editieren / zitieren --> Unities abgeben: Nur für DaioD
|
DaioD Mitglied Student
Beiträge: 10 Registriert: 04.02.2019
|
erstellt am: 05. Feb. 2019 20:45 <-- editieren / zitieren --> Unities abgeben:
Nochmals vielen Dank. Ich schaue mir das an. Könntest du mir vielleicht erklären, wieso die Zeile: Code: Component.Color("Container_Rot") = "Blue"
nicht funktioniert bzw. eine Fehlermeldung erzeugt? Eventuell würde es schon reichen die Farben der einzelnen Bauteile so zu ändern, jedoch gelingt mir das auch nicht. Dein Link und deine Lösung führen zur Bibliothek, welche ich nicht ganz verstehe. Ist dies notwendig, um eine Farbe in einem Bauteil auf Baugruppenebene zu verändern? Gruß Daio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 05. Feb. 2019 20:57 <-- editieren / zitieren --> Unities abgeben: Nur für DaioD
Steht doch alles als Kommentar im Code Das Zuweisen der Farbe (genauer der FarbDarstellung) klappt nur, wenn sie bereits im document enthalten ist. Falls nicht, muss sie erst ins document eingefügt werden. Das merkt man als Benutzer nur nicht, weil es da automatisch passiert. Über die API aber eben nicht. Edit: das mit component.Color("...")=... Liest sich nicht wie vba. Ist das ein i logic-Befehl? Ich schlage vor, das über den verlinkten Code zu lösen (mit dem asset-Objekt). Das mit der "variation" der Farben könnte ich mir über ein array mit den Namen von verschiedenen FarbDarst vorstellen. Und das einzelne Element mit dem Zähler deiner Schleife zu wählen. Ob das nun zu deiner Anwendung passt, kann ich natürlich nicht sagen. ------------------ Gruß KraBBy [Diese Nachricht wurde von KraBBy am 05. Feb. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 06. Feb. 2019 12:49 <-- editieren / zitieren --> Unities abgeben: Nur für DaioD
hab mich mal an dem Teil-Problem versucht, die Ansicht um einen bestimmten Winkel zu drehen. Das Sub Test_CameraKpl enthält auch eine Schleife in der die Ansicht jeweils ein Stück weiter gedreht wird. Code:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'http://dbwiki.net/wiki/VBA_Tipp:_Programmausf%C3%BChrung_f%C3%BCr_einen_Zeitraum_unterbrechenPrivate Sub Test_CameraInit() ' Ansicht initialisieren ' Zoom Alles - Standardansicht ' ' Get the active camera. Dim cam As Camera Set cam = ThisApplication.ActiveView.Camera ThisApplication.ActiveView.GoHome 'entspricht dem Befehl Ausgansansicht 'die Ausgangsansicht ließe sich für jedes Modell anpassen... 'Alternativ - unabhängig von der Einstellung im Modell cam.ViewOrientationType = kIsoTopRightViewOrientation 'entspricht per Default der "Ausgangsansicht", zumindest bei mir - abhängig von der Vorlage cam.Fit '"Zoom Alles" ' Apply the current camera definition to the view. cam.ApplyWithoutTransition 'cam.Apply 'hierbei werden "Zwischenpositionen gerechnet, Drehung erfolgt nicht abrupt End Sub Private Sub Test_CameraRotateZ(AngleDeg As Single) ' basierte mal auf dem "Drive the camera API Sample" ' Drehung erfolgt um die Z-Achse bzw. um eine Achse parallel dazu ' die Ausrichtung(Target) wird nicht verändert ' Get the active camera. Dim cam As Camera Set cam = ThisApplication.ActiveView.Camera Dim tg As TransientGeometry Set tg = ThisApplication.TransientGeometry ' Calculate pi. Dim pi As Double pi = Atn(1) * 4 'Winkel von Grad in Bogenmaß umrechnen Dim angRad As Double angRad = AngleDeg * pi / 180 'Werte der Winkelfkt berechnen Dim c As Double, s As Double c = Cos(angRad) s = Sin(angRad) 'Vektor von Target zu Eye ' es gäbe auch die VectorTo Method, aber hier mal von Hand Dim vX As Double Dim vY As Double vX = cam.Eye.x - cam.Target.x vY = cam.Eye.y - cam.Target.y ' Calculate the x and y coordinates of the eye. ' X / Y Koordinaten des Vektors gedreht um Z-Achse Dim x As Double, y As Double x = c * vX - s * vY y = s * vX + c * vY 'jetzt noch Verschieben (Vektor_gedreht + Target = neue EyePosition) x = x + cam.Target.x y = y + cam.Target.y ' Set the eye ' Z-Koord. bleibt wie bisher cam.Eye = tg.CreatePoint(x, y, cam.Eye.Z) ' Define the up vector as positive z. ' ggf. anzupassen, falls das nicht zur Ausgansansicht passt cam.UpVector = tg.CreateUnitVector(0, 0, 1) 'Ansicht noch anpassen? 'abhängig von der BauteilForm/Außenkontur, kann es sein, dass bei gedrehter Ansicht nicht mehr alles in die Anzeige passt ' (z.b. langes Flacheisen...) cam.Fit 'ggf. diese Zeile auskommentieren ' Apply the current camera definition to the view. cam.ApplyWithoutTransition 'Ansicht aktualisieren, kann nicht schaden ThisApplication.ActiveView.Update End Sub Sub Test_CameraKpl() 'Aufruf der beiden obigen Subs Call Test_CameraInit Dim i As Integer For i = 0 To 50 Call Test_CameraRotateZ(5) Call Sleep(100) 'für Test - kurze Pause, damit man auch "was sieht" Next End Sub
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DaioD Mitglied Student
Beiträge: 10 Registriert: 04.02.2019
|
erstellt am: 07. Feb. 2019 20:23 <-- editieren / zitieren --> Unities abgeben:
Hi Krabby, vielen Dank für deinen Code. Hab den noch etwas angepasst, sodass auch die Bilder entstehen nach jedem "Durchlauf" entstehen. Tolle Hilfe! Bin immer noch an der Farbe und überlege, wie ich das noch irgendwie umsetzen kann. Denke da hilft alles nicht und ich muss mich an die Library wagen... Gruß Daio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GeorgK Mitglied
Beiträge: 619 Registriert: 06.06.2001 Inventor 2020 Siemens NX 8.5 - 12.0 Autocad Mechanical 2020 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: 08. Feb. 2019 08:47 <-- editieren / zitieren --> Unities abgeben: Nur für DaioD
|
DaioD Mitglied Student
Beiträge: 10 Registriert: 04.02.2019
|
erstellt am: 08. Feb. 2019 09:06 <-- editieren / zitieren --> Unities abgeben:
|
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 11. Feb. 2019 08:26 <-- editieren / zitieren --> Unities abgeben: Nur für DaioD
kleine Bemerkung am Rande: mE wäre es schöner, wenn der Code für das Speichern des Bildes in ein eigenes Sub wandern würde. Dann wäre das aufrufende Sub (mit der Schleife) auch deutlich kompakter und leichter zu lesen/verstehen. Man könnte es auch deutlich einfacher wieder verwenden. Sieht dann etwa so aus: Sub ..._Main() Camera_init() For ... Camera_rotate() Save_image() Next End Sub Das ist sogar ohne Kommentare zu verstehen... ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |