| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX | | |  | Solid Edge 2025 First Look Online-Event 14.11.2025, eine Pressemitteilung
|
Autor
|
Thema: NxOpen Renderzeit festlegen (632 / mal gelesen)
|
Eonwe Mitglied

 Beiträge: 88 Registriert: 10.11.2014 NX 12 mit ECTR
|
erstellt am: 09. Dez. 2021 15:28 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich möchte im RayTraced Studio Bilder von Baugruppen erstellen und habe dazu ein Programm geschrieben um möglichst viel der Aufbereitung zu automatisieren. Die dll öffnet einen selbst kreierten UIBlock der den Benutzer durch ein paar Eingaben führt und schließlich den Knopf zum "Bild rendern" drücken lässt. Jetzt möchte ich gerne die Renderzeit über den Programmcode steuern. Die aktuelle Sub sieht wie folgt aus: Code: Public Async Sub Render_Picture(st_folder As String, st_picturename As String) Dim NXStudio As Display.RayTracedStudioBuilder = workPart.Views.CreateRayTracedStudioBuilder() NXStudio.RayTracedEditor() Dim NXStudioEditor As Display.IRayPlusStudioEditorBuilder NXStudioEditor = workPart.Views.CreateIrayPlusStudioEditorBuilder() NXStudioEditor.IRayPlusStudioStaticImageUnits = Display.RayTracedStudioEditorBuilder.RayTracedStudioStaticImageUnitsType.Pixels NXStudioEditor.IRayPlusStudioStaticImageSize = Display.IRayPlusStudioEditorBuilder.IRayPlusStudioStaticImageSizeType.UserDefined NXStudioEditor.IRayPlusStudioStaticImagePixelHeight = 3000 NXStudioEditor.IRayPlusStudioStaticImagePixelWidth = 4000 NXStudioEditor.IRayPlusStudioStaticImageFileFormat = Display.IRayPlusStudioEditorBuilder.IRayPlusStudioStaticImageFileFormatType.Tif NXStudioEditor.Commit() NXStudio.Brightness = 1.0 NXStudio.Commit()
NXStudio.StartRayTracedDisplay() Dim t1 = Tasks.Task.Factory.StartNew(Sub() render_picture_start(NXStudio)) Dim t2 = Tasks.Task.Factory.StartNew(Sub() Thread.Sleep(60000)) Dim theTasks() As Tasks.Task = {t1, t2} Tasks.Task.WaitAll(theTasks) render_Picture_stop(NXStudio)
NXStudio.RayTracedRenderingSave() Dim saveImageFileBrowserBuilder1 As Display.SaveImageFileBrowserBuilder = workPart.Views.CreateSaveImageFileBrowserBuilder()
saveImageFileBrowserBuilder1.FileFormat = Display.SaveImageFileBrowserBuilder.FileFormats.Tif saveImageFileBrowserBuilder1.NativeImageFileBrowser = st_folder & st_picturename & "_unc.tif" saveImageFileBrowserBuilder1.UseTransparentBackground = True saveImageFileBrowserBuilder1.Commit() saveImageFileBrowserBuilder1.Destroy() NXStudio.Destroy() End Sub Public Sub render_Picture_stop(NXStudio As Display.RayTracedStudioBuilder) NXStudio.StopRayTracedDisplay() End Sub Public Async Sub render_picture_start(NXStudio As Display.RayTracedStudioBuilder) NXStudio.UpdateRayTracedDisplay() NXStudio.RayTracedRenderingStart() End Sub
Es gelingt mir nicht zwischen RayTracedRenderingStart() und RayTracedRenderingStop() NX zum rendern zu bewegen. Solange Code ausgeführt wird steht das Raytrace-Fenster still. Der dargestellte Versuch soll einen Timer in einem weiteren Thread öffnen und auf den Abschluss warten. Das Programm wartet auch, gerendert wird aber nix. Das kann aber auch an meinen Programmierkenntnissen liegen und muss nicht unbedingt mit NX zusammen hängen. Die einzige Möglichkeit die ich bisher gefunden habe, ist es eine Messagebox anzuzeigen und bei Erreichen einer festgelegten Anzahl an Iterationen auf OK zu klicken. Das ist für die Automatisierung aber nix. Was gibt es sonst noch für Möglichkeiten die Codeausführung so zu unterbrechen, dass NX nebenher zum rendern kommt? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
      
 Beiträge: 2723 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 10. Dez. 2021 13:38 <-- editieren / zitieren --> Unities abgeben:          Nur für Eonwe
Hallo Eonwe, wenn's darum geht, einen zeitlichen Ablauf zu steuern, können Threads und sog. ResetEvents helfen. NX hat da allerdings seine Eigenheiten, um nicht zu sagen, es sei stur. Nur der Versuch macht kluch. Ggfs. hilft auch eine Remote-Session, da läuft NX weiter, solange kein externes Kommando ausgeführt wird. Aber: Was willst du damit bezwecken, warum das Ganze ? Um zu warten, bis das Bild fertig ist und es dann weiter zu bearbeiten ? Gruß, Michael
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Eonwe Mitglied

 Beiträge: 88 Registriert: 10.11.2014 NX 12 mit ECTR
|
erstellt am: 10. Dez. 2021 14:28 <-- editieren / zitieren --> Unities abgeben:         
Hallo Michael, vielen Dank erstmal für den Input. Ich bin gerade dabei mir das Thema Multithreading zu erarbeiten, bin da noch absoluter Laie. Und gefühlt verhält sich NX nicht immer so wie es sollte, oder einfach nicht so wie ich es erwartet hätte. Genau richtig erkannt, ich will warten bis das Bild fertig gerendert ist, bzw. bis ausreichend Iterationen stattgefunden haben. Die exakte Dauer muss noch ermittelt werden, vermutlich irgendwo im Bereich von 20-60 Minuten, hängt auch von der Rechenleistung und den Anwendungen im Hintergrund etwas ab. Leider gibt es eine Methode die Iterationen bzw. die Bildqualität abzufragen erst ab NX1980. Danach wird das Bild abgespeichert und weiter bearbeitet zum Beispiel mit Exiftools. Langfristig soll das ganze Remote gerendert werden und möglichst als Stapelverarbeitung stattfinden. Bis dahin ist es aber noch ein weiter Weg.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Eonwe Mitglied

 Beiträge: 88 Registriert: 10.11.2014 NX 12 mit ECTR
|
erstellt am: 10. Dez. 2021 17:26 <-- editieren / zitieren --> Unities abgeben:         
ich hab's gelöst. Es ist nicht übermäßig schön, aber es funktioniert. Ich öffne im Mainthread eine Messagebox, die die weitere Codeausführung verhindert. In einem vorher gestarteten 2. Thread warte ich die gewünschte Zeit und hole dann die MsgBox in den Vordergrund um sie mit SendKeys.Sendwait zu schließen. Dann geht's im Mainthread weiter. Die nötigen Funktionen dazu stehen in der Windows API user32.dll. Danke nochmal Michael für den Denkanstoß in die richtige Richtung. Code: Public Sub Render_Picture(st_folder As String, st_picturename As String) Dim NXStudio As Display.RayTracedStudioBuilder = workPart.Views.CreateRayTracedStudioBuilder() NXStudio.RayTracedEditor() Dim NXStudioEditor As Display.IRayPlusStudioEditorBuilder = workPart.Views.CreateIrayPlusStudioEditorBuilder() NXStudioEditor.IRayPlusStudioStaticImageUnits = Display.RayTracedStudioEditorBuilder.RayTracedStudioStaticImageUnitsType.Pixels NXStudioEditor.IRayPlusStudioStaticImageSize = Display.IRayPlusStudioEditorBuilder.IRayPlusStudioStaticImageSizeType.UserDefined NXStudioEditor.IRayPlusStudioStaticImagePixelHeight = 3000 NXStudioEditor.IRayPlusStudioStaticImagePixelWidth = 4000 NXStudioEditor.IRayPlusStudioStaticImageFileFormat = Display.IRayPlusStudioEditorBuilder.IRayPlusStudioStaticImageFileFormatType.Tif NXStudioEditor.Commit() NXStudio.Brightness = 1.0 NXStudio.Commit() NXStudio.StartRayTracedDisplay() NXStudio.UpdateRayTracedDisplay() NXStudio.RayTracedRenderingStart() Dim theThread As New Thread(AddressOf threaded_timer) theThread.IsBackground = True theThread.Start() theUI.NXMessageBox.Show("Render in Progress", NXMessageBox.DialogType.Information, "Bild wird gerendert, dieses Fenster schließt automatisch") NXStudio.StopRayTracedDisplay() NXStudio.RayTracedRenderingSave() Dim saveImageFileBrowserBuilder1 As Display.SaveImageFileBrowserBuilder = workPart.Views.CreateSaveImageFileBrowserBuilder()
saveImageFileBrowserBuilder1.FileFormat = Display.SaveImageFileBrowserBuilder.FileFormats.Tif saveImageFileBrowserBuilder1.NativeImageFileBrowser = st_folder & st_picturename & "_unc.tif" saveImageFileBrowserBuilder1.UseTransparentBackground = True saveImageFileBrowserBuilder1.Commit() saveImageFileBrowserBuilder1.Destroy() NXStudio.Destroy() End Sub Public Sub threaded_timer() Thread.Sleep(60000) Dim theMsgBox As IntPtr = FindWindow(vbNullString, "Render in Progress") SetForegroundWindow(theMsgBox) Windows.Forms.SendKeys.SendWait("{TAB}") Windows.Forms.SendKeys.SendWait("{enter}") End Sub <Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Auto)> Private Shared Function FindWindow( ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr End Function <Runtime.InteropServices.DllImport("user32.dll")> Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Bool)> Boolean End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| Technische Projektleitung und Bauherrenvertretung (m/w/d) | Wir suchen ab sofort für unser Team: Techn. Projektleitung und Bauherrenvertretung (m/w/d) Mit unserem über 50-köpfigen engagierten Team bringen wir den Wohn- und Wirtschaftsstandort Mönchengladbach zukunftsweisend nach vorne. Wir sind der kompetente Partner für die Erschließung von Wohn- und Gewerbeflächen im Stadtgebiet. Eigene Hochbauprojekte ... | Anzeige ansehen | Befristeter Vertrag |
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
      
 Beiträge: 2723 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 11. Dez. 2021 14:44 <-- editieren / zitieren --> Unities abgeben:          Nur für Eonwe
Zitat: Original erstellt von Eonwe: Danke nochmal Michael für den Denkanstoß in die richtige Richtung.
Keine Ursache ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |