Autor
|
Thema: Screenshots mit unterschiedlichen Auflösungen -> Laufzeitfehler?!?! (3359 mal gelesen)
|
crob08 Mitglied
Beiträge: 43 Registriert: 17.07.2005
|
erstellt am: 22. Jul. 2010 10:40 <-- editieren / zitieren --> Unities abgeben:
Hallo CATIA-Freunde, ich habe folgendes Problem: In einem CATVBA-Makro möchte ich mehrere Bilder automatisiert erstellen lassen. Mit einer vorherigen Festlegung des RenderingModes, Pfades etc. lässt sich ja über folgende Befehlszeile relativ einfach ein Bild des aktuellen Viewers erzeugen.
Code: CATIA.ActiveWindow.ActiveViewer.CaptureToFile catCaptureFormatBMP, oFileName & ".bmp"
So weit so gut. Nun zum schwierigeren Part! Um die Qualität der aufgenommenen Bilder zu erhöhen, möchte ich die Auflösung bzw. die Größe des aktiven CATIA-Fensters anpassen. Ohne Makro lässt sich das ja auch sehr schnell über Tools -> Bild -> Erfassen -> Optionen -> Pixel -> Wiedergabequalität=angepasst -> mehr realisieren. In Form eines Makros habe ich bereits auch einen Weg gefunden:
Code: For I = 1 To Cntr CATIA.ActiveWindow.Width = WindowWidth(I) CATIA.ActiveWindow.Height = WindowHeight(I) CATIA.ActiveWindow.ActiveViewer.CaptureToFile catCaptureFormatBMP, oFileName & ".bmp" oPart.Update CATIA.ActiveWindow.ActiveViewer.Update CATIA.ActiveWindow.ActiveViewer.Reframe Next
Wie ihr seht, habe ich 2 1-dim-Arrays "WindowWidth" und "WindowHeight", in denen ich unterschiedliche Auflösungskonfigurationen abgespeichert habe. Wenn ich nun das Makro normal ausführe, werden die einzelnen Konfigurationen nicht berücksichtigt, sondern Cntr-mal Bilder mit gleicher Auflösung erstellt. Lasse ich das Makro allerdings im Einzelschritt-Modus (F8) durchlaufen, dann wird das aktive Fenster auch mit den unterschiedlichen Konfigurationen angepasst und alles funktioniert! -> Fragen!!! Ist das ein Problem mit der Laufzeit? Wenn ja, wie kann ich das umgehen? Gibt es eventuell eine Delay-Funktion, die eine kurze Pause erzeugt, so dass die Laufzeit wieder passt? Oder habe ich einen prinzipiellen Fehler im Code? Oder? Oder? Oder? Würde mich freuen, wenn ihr mir helfen könntet. Schöne Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
crob08 Mitglied
Beiträge: 43 Registriert: 17.07.2005
|
erstellt am: 22. Jul. 2010 12:42 <-- editieren / zitieren --> Unities abgeben:
Nachtrag: konkret scheint es an Änderung des ActiveViewers zu liegen. Die Windows-Größe wird korrekt wiedergegeben, jedoch die Größe des ActiveViewers nicht! Erst nach Beendigung des Makros aktualisiert sich letzterer auf den letzten Wert der jeweiligen Arrays. In der Zwischenzeit habe ich auch mit einem "Timer" eine Wartezeit eingebaut. Leider ebenfalls ohne Erfolg. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 26. Jul. 2010 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für crob08
Also ja, es gibt eine Delay-Funktion, siogar mehrere. Google dafür einfach nach Sleep. Ich baue aber auch gern eine Schleife, die einfach mehrfach DoEvents macht. Dann zu deinem Problem: CATIA muss manchmal die Grafiksachen neu berechnen, dazu kannst Du es mit der Funktion RefreshDisplay, oder so, auffordern. Habe aktuell kein CATIA hier, daher muss ich eben raten. Es gibt jedenfalls so eine Funtkion, die Du mal ausprobieren solltest. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
crob08 Mitglied
Beiträge: 43 Registriert: 17.07.2005
|
erstellt am: 27. Jul. 2010 11:33 <-- editieren / zitieren --> Unities abgeben:
Hi Henry, Danke für den Tipp "RefreshDisplay"!!! durch die Zeile
Code: CATIA.Application.RefreshDisplay = True
wird anscheinend die Auflösung des aktuellen Viewers an die des aktuellen Windows angepasst. Danke nochmal!!!Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 07. Nov. 2013 11:31 <-- editieren / zitieren --> Unities abgeben: Nur für crob08
ich habe gerade das gleiche Problem wie in dem alten Thread beschrieben. Teilweise funktioniert die Funktion einwandfrei (manuell mit F8 und im normalen Aufruf). Aber eben nur teilweise. Das Problem tritt immer auf wenn ich die Auflösung des ActiveWindow erhöhen möchte. Statt zu vierviefachern stehen dann nur minimal größere Werte drinnen. Hat jemand eine Idee?
Code: Function Screenshot(destination_name As String, file_name As String) Set aktiwin = CATIA.ActiveWindow Set oViewer = aktiwin.ActiveViewer aktiwin.Layout = catWindowGeomOnly Dim color(2) oViewer.GetBackgroundColor color oViewer.PutBackgroundColor Array(1, 1, 1) 'Qualität erhöhen, 100% --> 400% Dim height1 As Long Dim width1 As Long height1 = oViewer.Height width1 = oViewer.Width aktiwin.Height = height1 * 4 aktiwin.Width = width1 * 4 CATIA.Application.RefreshDisplay = True CATIA.StartCommand "CompassDisplayOff" oViewer.Activate oViewer.CaptureToFile 5, destination_name & file_name & ".jpeg" 'Ausgangszustand wiederherstellen oViewer.PutBackgroundColor color aktiwin.Layout = catWindowSpecsAndGeom CATIA.StartCommand "CompassDisplayOn" aktiwin.Height = height1 aktiwin.Width = width1 CATIA.Application.RefreshDisplay = True End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Nov. 2013 12:32 <-- editieren / zitieren --> Unities abgeben: Nur für crob08
Servus Gemäß Doku lässt sich der Wert Height bzw Width des Viewers gar nicht per Makro ändern. Wundert mich warum du keine Fehlermeldung erhältst. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 07. Nov. 2013 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für crob08
das ist korrekt. Darum ändere ich auch Height und Wight des Objekt Window. ich habe mittlerweile eine Lösung gefunden: Mittels einer nichtabweisenden Schleife ändere ich Height und Wight so oft bis es passt. Interessant dabei ist. Beim ersten setzten (also bei i) läuft die Schleife immer zweimal durch, beim zweiten setzten (j) nur einmal Code: Function Screenshot(destination_name As String, file_name As String) Set aktiwin = CATIA.ActiveWindow Set oViewer = aktiwin.ActiveViewer aktiwin.Layout = catWindowGeomOnly Dim color(2) oViewer.GetBackgroundColor color oViewer.PutBackgroundColor Array(1, 1, 1) 'Qualität erhöhen, 100% --> 400% Dim height1 As Long Dim width1 As Long height1 = oViewer.Height width1 = oViewer.Width Dim i As Integer i = 0 Do aktiwin.Height = height1 * 4 aktiwin.Width = width1 * 4 CATIA.Application.RefreshDisplay = True i = i + 1 Loop While aktiwin.Height <> height1 * 4 Debug.Print "i= " & i & " " & file_name CATIA.StartCommand "CompassDisplayOff" oViewer.Activate oViewer.CaptureToFile 5, destination_name & file_name & ".jpeg" 'Ausgangszustand wiederherstellen oViewer.PutBackgroundColor color aktiwin.Layout = catWindowSpecsAndGeom CATIA.StartCommand "CompassDisplayOn" Dim j As Integer j = 0 Do aktiwin.Height = height1 aktiwin.Width = width1 CATIA.Application.RefreshDisplay = True j = j + 1 Loop While aktiwin.Height <> height1 Debug.Print "j= " & j & " " & file_name End Function
[Diese Nachricht wurde von N2high am 07. Nov. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 07. Nov. 2013 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für crob08
Ich glaube Du gibst ihm nach CATIA.Application.RefreshDisplay = True nicht genug Zeit. mach mal ein Code:
For iIterator = 0 to 1000 DoEvents Next iIterator
danach. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 13. Nov. 2013 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für crob08
|