diff --git a/.gitignore b/.gitignore
index 6769e21..abaf465 100644
--- a/.gitignore
+++ b/.gitignore
@@ -157,4 +157,6 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
-#.idea/
\ No newline at end of file
+#.idea/
+build
+dist
\ No newline at end of file
diff --git a/crystalfly/VTK Error Out.txt b/crystalfly/VTK Error Out.txt
index 68bf22d..6451fb6 100644
--- a/crystalfly/VTK Error Out.txt
+++ b/crystalfly/VTK Error Out.txt
@@ -1,244 +1,676 @@
ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+vtkCompositeDataPipeline (0000023A2CC93260): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (0000023A26C4E360) has 0 connections but is not optional.
ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+vtkCompositeDataPipeline (0000023A2CC93260): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (0000023A26C4E360) has 0 connections but is not optional.
ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+vtkCompositeDataPipeline (0000023A2CC93260): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (0000023A26C4E360) has 0 connections but is not optional.
ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+vtkCompositeDataPipeline (0000023A2CC93260): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (0000023A26C4E360) has 0 connections but is not optional.
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 諠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 蠐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 螰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 褰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 趀䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 謐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 諠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 蒀䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 衰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 諠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 蛰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 謐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 藐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 讠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 賰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 莐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 袠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 褀䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 蛀䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 袠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 訠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 蚐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 衰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48A90): wglMakeCurrent failed in MakeCurrent(), error: 莐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蘰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 謐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 薠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 賰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蔐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蒀䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蔐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 薠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 褰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 薠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 褰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 讠䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蛰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 菰䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蕀䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 莐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 詐䜅Ⱥ
-ERROR: In vtkDemandDrivenPipeline.cxx, line 677
-vtkCompositeDataPipeline (000002067CD9E5B0): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (000002067B2660B0) has 0 connections but is not optional.
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 覐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 豠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 趀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蘀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 衰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 蛀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 謐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 螀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 91
+vtkWin32OpenGLRenderWindow (0000023A26E4BA60): wglMakeCurrent failed in Clean(), error: 2004
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 衰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 賰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 讠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 螀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 袠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蝐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 衰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 賰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 讠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 螀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 褰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 薠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蒰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 衰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 薠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蚐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蕀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蒀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 諠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 藐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 謐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 莐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 莐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蓠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 豠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蝐䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 芠䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 螰䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in MakeCurrent(), error: 蒀䜅Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 91
+vtkWin32OpenGLRenderWindow (0000023A26E48760): wglMakeCurrent failed in Clean(), error: 2004
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 釰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 踀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 遀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 軀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 闠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 趠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 遀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 鑠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 軀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 鑠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 韰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 鑠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 闠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 踀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 醐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 軰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 舀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 芐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 褠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 豐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 萐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 覀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蔀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 莀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蓐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蝰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 莰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 膠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蔀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蛠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蠰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蘠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蓐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 诀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 螠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 詀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 膠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 螠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 螠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 葰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 覀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蟐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 芐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 裀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 訐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蔀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蜐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蒠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 薐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 腰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 腰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蔰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 苰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 藰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蒠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 藰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 觠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 膠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 蠰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 芐䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 譠䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 腀䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 256
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in MakeCurrent(), error: 腰䜼Ⱥ
+
+
+ERROR: In vtkWin32OpenGLRenderWindow.cxx, line 91
+vtkWin32OpenGLRenderWindow (0000023A26E4A410): wglMakeCurrent failed in Clean(), error: 2004
diff --git a/crystalfly/assets/raspberrypi.png b/crystalfly/assets/raspberrypi.png
new file mode 100644
index 0000000..0eebc02
Binary files /dev/null and b/crystalfly/assets/raspberrypi.png differ
diff --git a/crystalfly/main.py b/crystalfly/main.py
index 593d5e2..32f5285 100644
--- a/crystalfly/main.py
+++ b/crystalfly/main.py
@@ -1,6 +1,8 @@
import ctypes
import sys
+from pathlib import Path
+from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication
from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow
@@ -10,16 +12,17 @@ ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("crystalfly")
def main():
+ # pipe vtk output errors to file
+ err_out = vtkFileOutputWindow()
+ err_out.SetFileName("VTK Error Out.txt")
+ vtk_std_error = vtkOutputWindow()
+ vtk_std_error.SetInstance(err_out)
app = QApplication(sys.argv)
+ app.setWindowIcon(QIcon(str(Path(__file__).parent / "assets" / "raspberrypi.png")))
window = MainWindow()
window.show()
sys.exit(app.exec())
if __name__ == '__main__':
- # pipe vtk output errors to file
- errOut = vtkFileOutputWindow()
- errOut.SetFileName("VTK Error Out.txt")
- vtkStdErrOut = vtkOutputWindow()
- vtkStdErrOut.SetInstance(errOut)
main()
diff --git a/crystalfly/ui/__pycache__/import_file.cpython-311.pyc b/crystalfly/ui/__pycache__/import_file.cpython-311.pyc
index b626cef..0725d02 100644
Binary files a/crystalfly/ui/__pycache__/import_file.cpython-311.pyc and b/crystalfly/ui/__pycache__/import_file.cpython-311.pyc differ
diff --git a/crystalfly/ui/__pycache__/main_window.cpython-311.pyc b/crystalfly/ui/__pycache__/main_window.cpython-311.pyc
index 172eaa0..1c97cf3 100644
Binary files a/crystalfly/ui/__pycache__/main_window.cpython-311.pyc and b/crystalfly/ui/__pycache__/main_window.cpython-311.pyc differ
diff --git a/crystalfly/ui/__pycache__/volume_viewer.cpython-311.pyc b/crystalfly/ui/__pycache__/volume_viewer.cpython-311.pyc
index 32f042b..44fd933 100644
Binary files a/crystalfly/ui/__pycache__/volume_viewer.cpython-311.pyc and b/crystalfly/ui/__pycache__/volume_viewer.cpython-311.pyc differ
diff --git a/crystalfly/ui/__pycache__/vtk_viewer.cpython-311.pyc b/crystalfly/ui/__pycache__/vtk_viewer.cpython-311.pyc
index b124128..790369d 100644
Binary files a/crystalfly/ui/__pycache__/vtk_viewer.cpython-311.pyc and b/crystalfly/ui/__pycache__/vtk_viewer.cpython-311.pyc differ
diff --git a/crystalfly/ui/import_file.py b/crystalfly/ui/import_file.py
index e4d17ed..268005d 100644
--- a/crystalfly/ui/import_file.py
+++ b/crystalfly/ui/import_file.py
@@ -1,38 +1,38 @@
-from pathlib import Path
-
from PySide6.QtCore import Slot, QEvent
-from PySide6.QtUiTools import loadUiType
from PySide6.QtWidgets import QDialog, QFileDialog
from vtkmodules.vtkCommonCore import VTK_INT, VTK_SHORT, VTK_LONG, VTK_FLOAT, VTK_UNSIGNED_SHORT, VTK_UNSIGNED_INT, \
VTK_UNSIGNED_LONG
from crystalfly.thread.image_reader import ImageReaderThread
-
-ImportFileType, _ = loadUiType(str(Path(__file__).parent.joinpath("import_file.ui")))
+from crystalfly.ui.import_file_ui import Ui_Dialog
-class ImportFile(QDialog, ImportFileType):
+# ImportFileType, _ = loadUiType(str(Path(__file__).parent.joinpath("import_file.ui")))
+
+
+class ImportFile(QDialog):
def __init__(self):
super(ImportFile, self).__init__()
# self.image_read_thread = None
- self.setupUi(self)
+ self.ui = Ui_Dialog()
+ self.ui.setupUi(self)
- self.browse_file.clicked.connect(self.browse_file_handler)
+ self.ui.browse_file.clicked.connect(self.browse_file_handler)
self.accepted.connect(self.load_image_file)
def showEvent(self, event: QEvent) -> None:
self.clear_form()
def clear_form(self):
- self.file_path_input.clear()
- self.size_x_spin.clear()
- self.size_y_spin.clear()
- self.size_z_spin.clear()
- self.data_type_combobox.setCurrentIndex(0)
+ self.ui.file_path_input.clear()
+ self.ui.size_x_spin.clear()
+ self.ui.size_y_spin.clear()
+ self.ui.size_z_spin.clear()
+ self.ui.data_type_combobox.setCurrentIndex(0)
@Slot()
def load_image_file(self):
- data_type_text = self.data_type_combobox.currentText()
+ data_type_text = self.ui.data_type_combobox.currentText()
data_type = None
if data_type_text == "int 8":
data_type = VTK_INT
@@ -49,12 +49,12 @@ class ImportFile(QDialog, ImportFileType):
elif data_type_text == "float":
data_type = VTK_FLOAT
file_data = {
- "file_path": self.file_path_input.text(),
+ "file_path": self.ui.file_path_input.text(),
"data_type": data_type,
"size": {
- "x": self.size_x_spin.value(),
- "y": self.size_y_spin.value(),
- "z": self.size_z_spin.value(),
+ "x": self.ui.size_x_spin.value(),
+ "y": self.ui.size_y_spin.value(),
+ "z": self.ui.size_z_spin.value(),
}
}
image_read_thread = ImageReaderThread(file_data, self)
@@ -66,4 +66,4 @@ class ImportFile(QDialog, ImportFileType):
dialog = QFileDialog(self)
filepath = dialog.getOpenFileName()
if filepath[0]:
- self.file_path_input.setText(filepath[0])
+ self.ui.file_path_input.setText(filepath[0])
diff --git a/crystalfly/ui/import_file.ui b/crystalfly/ui/import_file.ui
index a6c5091..8194af7 100644
--- a/crystalfly/ui/import_file.ui
+++ b/crystalfly/ui/import_file.ui
@@ -50,7 +50,7 @@
-
- y
+ height
@@ -64,7 +64,7 @@
-
- x
+ width
@@ -78,7 +78,7 @@
-
- z
+ slices
diff --git a/crystalfly/ui/import_file_ui.py b/crystalfly/ui/import_file_ui.py
new file mode 100644
index 0000000..dea1daa
--- /dev/null
+++ b/crystalfly/ui/import_file_ui.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'import_file.ui'
+##
+## Created by: Qt User Interface Compiler version 6.7.0
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QAbstractButton, QApplication, QComboBox, QDialog,
+ QDialogButtonBox, QGridLayout, QGroupBox, QLabel,
+ QLineEdit, QPushButton, QSizePolicy, QSpacerItem,
+ QSpinBox, QVBoxLayout, QWidget)
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ if not Dialog.objectName():
+ Dialog.setObjectName(u"Dialog")
+ Dialog.resize(500, 259)
+ self.verticalLayout = QVBoxLayout(Dialog)
+ self.verticalLayout.setObjectName(u"verticalLayout")
+ self.gridLayout = QGridLayout()
+ self.gridLayout.setObjectName(u"gridLayout")
+ self.label = QLabel(Dialog)
+ self.label.setObjectName(u"label")
+
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+
+ self.file_path_input = QLineEdit(Dialog)
+ self.file_path_input.setObjectName(u"file_path_input")
+
+ self.gridLayout.addWidget(self.file_path_input, 0, 1, 1, 1)
+
+ self.browse_file = QPushButton(Dialog)
+ self.browse_file.setObjectName(u"browse_file")
+
+ self.gridLayout.addWidget(self.browse_file, 0, 2, 1, 1)
+
+ self.gridLayout.setColumnStretch(0, 1)
+ self.gridLayout.setColumnStretch(1, 5)
+ self.gridLayout.setColumnStretch(2, 1)
+
+ self.verticalLayout.addLayout(self.gridLayout)
+
+ self.groupBox = QGroupBox(Dialog)
+ self.groupBox.setObjectName(u"groupBox")
+ self.groupBox.setStyleSheet(u"")
+ self.gridLayout_2 = QGridLayout(self.groupBox)
+ self.gridLayout_2.setObjectName(u"gridLayout_2")
+ self.gridLayout_2.setHorizontalSpacing(32)
+ self.label_3 = QLabel(self.groupBox)
+ self.label_3.setObjectName(u"label_3")
+
+ self.gridLayout_2.addWidget(self.label_3, 0, 2, 1, 1)
+
+ self.size_x_spin = QSpinBox(self.groupBox)
+ self.size_x_spin.setObjectName(u"size_x_spin")
+ self.size_x_spin.setMaximum(100000)
+
+ self.gridLayout_2.addWidget(self.size_x_spin, 0, 1, 1, 1)
+
+ self.label_2 = QLabel(self.groupBox)
+ self.label_2.setObjectName(u"label_2")
+
+ self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
+
+ self.size_y_spin = QSpinBox(self.groupBox)
+ self.size_y_spin.setObjectName(u"size_y_spin")
+ self.size_y_spin.setMaximum(100000)
+
+ self.gridLayout_2.addWidget(self.size_y_spin, 0, 3, 1, 1)
+
+ self.label_4 = QLabel(self.groupBox)
+ self.label_4.setObjectName(u"label_4")
+
+ self.gridLayout_2.addWidget(self.label_4, 1, 0, 1, 1)
+
+ self.size_z_spin = QSpinBox(self.groupBox)
+ self.size_z_spin.setObjectName(u"size_z_spin")
+ self.size_z_spin.setMaximum(100000)
+
+ self.gridLayout_2.addWidget(self.size_z_spin, 1, 1, 1, 1)
+
+ self.gridLayout_2.setColumnStretch(0, 1)
+ self.gridLayout_2.setColumnStretch(1, 3)
+ self.gridLayout_2.setColumnStretch(2, 1)
+ self.gridLayout_2.setColumnStretch(3, 3)
+
+ self.verticalLayout.addWidget(self.groupBox)
+
+ self.gridLayout_3 = QGridLayout()
+ self.gridLayout_3.setObjectName(u"gridLayout_3")
+ self.label_5 = QLabel(Dialog)
+ self.label_5.setObjectName(u"label_5")
+
+ self.gridLayout_3.addWidget(self.label_5, 0, 0, 1, 1)
+
+ self.data_type_combobox = QComboBox(Dialog)
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.addItem("")
+ self.data_type_combobox.setObjectName(u"data_type_combobox")
+ self.data_type_combobox.setEditable(False)
+
+ self.gridLayout_3.addWidget(self.data_type_combobox, 0, 1, 1, 1)
+
+ self.gridLayout_3.setColumnStretch(0, 1)
+ self.gridLayout_3.setColumnStretch(1, 6)
+
+ self.verticalLayout.addLayout(self.gridLayout_3)
+
+ self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+
+ self.verticalLayout.addItem(self.verticalSpacer)
+
+ self.buttonBox = QDialogButtonBox(Dialog)
+ self.buttonBox.setObjectName(u"buttonBox")
+ self.buttonBox.setOrientation(Qt.Orientation.Horizontal)
+ self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Cancel|QDialogButtonBox.StandardButton.Ok)
+
+ self.verticalLayout.addWidget(self.buttonBox)
+
+
+ self.retranslateUi(Dialog)
+ self.buttonBox.accepted.connect(Dialog.accept)
+ self.buttonBox.rejected.connect(Dialog.reject)
+
+ QMetaObject.connectSlotsByName(Dialog)
+ # setupUi
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"\u6587\u4ef6\u5bfc\u5165", None))
+ self.label.setText(QCoreApplication.translate("Dialog", u"\u6587\u4ef6\u8def\u5f84", None))
+ self.browse_file.setText(QCoreApplication.translate("Dialog", u"\u6d4f\u89c8", None))
+ self.groupBox.setTitle(QCoreApplication.translate("Dialog", u"size", None))
+ self.label_3.setText(QCoreApplication.translate("Dialog", u"height", None))
+ self.label_2.setText(QCoreApplication.translate("Dialog", u"width", None))
+ self.label_4.setText(QCoreApplication.translate("Dialog", u"slices", None))
+ self.label_5.setText(QCoreApplication.translate("Dialog", u"\u6570\u636e\u7c7b\u578b", None))
+ self.data_type_combobox.setItemText(0, QCoreApplication.translate("Dialog", u"int 8", None))
+ self.data_type_combobox.setItemText(1, QCoreApplication.translate("Dialog", u"uint 8", None))
+ self.data_type_combobox.setItemText(2, QCoreApplication.translate("Dialog", u"int 16", None))
+ self.data_type_combobox.setItemText(3, QCoreApplication.translate("Dialog", u"uint 16", None))
+ self.data_type_combobox.setItemText(4, QCoreApplication.translate("Dialog", u"int 32", None))
+ self.data_type_combobox.setItemText(5, QCoreApplication.translate("Dialog", u"uint 32", None))
+ self.data_type_combobox.setItemText(6, QCoreApplication.translate("Dialog", u"float", None))
+
+ # retranslateUi
+
diff --git a/crystalfly/ui/main_window.py b/crystalfly/ui/main_window.py
index bfb2b6f..f698829 100644
--- a/crystalfly/ui/main_window.py
+++ b/crystalfly/ui/main_window.py
@@ -2,20 +2,23 @@ from pathlib import Path
from PySide6.QtCore import Slot, Qt
from PySide6.QtGui import QIcon, QAction
-from PySide6.QtUiTools import loadUiType
-from PySide6.QtWidgets import QMainWindow, QSlider
+from PySide6.QtWidgets import QSlider, QMainWindow
from vtkmodules.vtkRenderingOpenGL2 import vtkGenericOpenGLRenderWindow
from crystalfly.ui.import_file import ImportFile
+from crystalfly.ui.main_window_ui import Ui_MainWindow
from crystalfly.ui.volume_viewer import VolumeViewer
from crystalfly.ui.vtk_viewer import VTKImageViewer
-MainWindowType, _ = loadUiType(str(Path(__file__).parent.joinpath("main_window.ui")))
-
-class MainWindow(QMainWindow, MainWindowType):
+class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
+ self.ui = Ui_MainWindow()
+ self.ui.setupUi(self)
+ self.coronal_slider = None
+ self.transverse_slider = None
+ self.sagittal_slider = None
self.cross_action = None
self.file_action = None
self.volume = None
@@ -23,9 +26,8 @@ class MainWindow(QMainWindow, MainWindowType):
self.sagittal = None
self.coronal = None
self.vtk_render_window = vtkGenericOpenGLRenderWindow()
- self.setupUi(self)
self.file_open_dialog = ImportFile()
- self.file_open.triggered.connect(self.handle_file_open)
+ self.ui.file_open.triggered.connect(self.handle_file_open)
self.init_four_pane()
self.init_tool_bar()
self.is_pane_maximum = False
@@ -36,8 +38,8 @@ class MainWindow(QMainWindow, MainWindowType):
self.cross_action = QAction(icon=QIcon(str(Path(__file__).parent.parent / "assets" / "plus.png")), text="cross",
parent=self)
self.file_action.triggered.connect(self.handle_file_open)
- self.tool_bar.addAction(self.file_action)
- self.tool_bar.addAction(self.cross_action)
+ self.ui.tool_bar.addAction(self.file_action)
+ self.ui.tool_bar.addAction(self.cross_action)
def init_four_pane(self):
self.coronal = VTKImageViewer(1)
@@ -62,25 +64,35 @@ class MainWindow(QMainWindow, MainWindowType):
self.sagittal.range_changed.connect(self.set_slide_range)
self.transverse.range_changed.connect(self.set_slide_range)
- self.volume_grid_layout.addWidget(self.volume)
- self.coronal_grid_layout.addWidget(self.coronal, 0, 0, 8, 8)
- self.gridLayout_3.addWidget(self.sagittal, 0, 0, 8, 8)
- self.gridLayout_4.addWidget(self.transverse, 0, 0, 8, 8)
+ self.ui.volume_grid_layout.addWidget(self.volume)
+ self.ui.coronal_grid_layout.addWidget(self.coronal, 0, 0, 8, 8)
+ self.ui.sagittal_grid_layout.addWidget(self.sagittal, 0, 0, 8, 8)
+ self.ui.transverse_grid_layout.addWidget(self.transverse, 0, 0, 8, 8)
+
+ self.ui.widget_coronal.mousePressEvent = self.cell_active
+ self.ui.widget_sagittal.mousePressEvent = self.cell_active
+ self.ui.widget_transverse.mousePressEvent = self.cell_active
+ self.ui.widget_3d.mousePressEvent = self.cell_active
self.coronal_slider = QSlider(Qt.Orientation.Vertical)
self.sagittal_slider = QSlider(Qt.Orientation.Vertical)
self.transverse_slider = QSlider(Qt.Orientation.Vertical)
-
+ self.coronal_slider.hide()
+ self.sagittal_slider.hide()
+ self.transverse_slider.hide()
self.coronal_slider.valueChanged.connect(self.coronal.image_viewer.SetSlice)
self.sagittal_slider.valueChanged.connect(self.sagittal.image_viewer.SetSlice)
self.transverse_slider.valueChanged.connect(self.transverse.image_viewer.SetSlice)
- self.coronal_grid_layout.addWidget(self.coronal_slider, 0, 8, 8, 1)
- self.gridLayout_3.addWidget(self.sagittal_slider, 0, 8, 8, 1)
- self.gridLayout_4.addWidget(self.transverse_slider, 0, 8, 8, 1)
+ self.ui.coronal_grid_layout.addWidget(self.coronal_slider, 0, 8, 8, 1)
+ self.ui.sagittal_grid_layout.addWidget(self.sagittal_slider, 0, 8, 8, 1)
+ self.ui.transverse_grid_layout.addWidget(self.transverse_slider, 0, 8, 8, 1)
@Slot(int, int)
def set_slide_range(self, quadrant, value):
+ self.coronal_slider.show()
+ self.sagittal_slider.show()
+ self.transverse_slider.show()
if quadrant == 1:
self.coronal_slider.setRange(0, value)
elif quadrant == 3:
@@ -91,56 +103,62 @@ class MainWindow(QMainWindow, MainWindowType):
@Slot(int)
def cell_max(self, quadrant: int):
if self.is_pane_maximum:
- self.widget_3d.show()
- self.widget_coronal.show()
- self.widget_sagittal.show()
- self.widget_transverse.show()
+ for x in range(2):
+ self.ui.four_pane_grid.setRowStretch(x, 1)
+ self.ui.four_pane_grid.setColumnStretch(x, 1)
+ self.ui.widget_3d.show()
+ self.ui.widget_coronal.show()
+ self.ui.widget_sagittal.show()
+ self.ui.widget_transverse.show()
self.is_pane_maximum = False
else:
- self.widget_3d.hide()
- self.widget_coronal.hide()
- self.widget_sagittal.hide()
- self.widget_transverse.hide()
+ for x in range(2):
+ self.ui.four_pane_grid.setRowStretch(x, 0)
+ self.ui.four_pane_grid.setColumnStretch(x, 0)
+ self.ui.widget_3d.hide()
+ self.ui.widget_coronal.hide()
+ self.ui.widget_sagittal.hide()
+ self.ui.widget_transverse.hide()
if quadrant == 1:
- self.widget_coronal.show()
+ self.ui.widget_coronal.show()
elif quadrant == 2:
- self.widget_3d.show()
+ self.ui.widget_3d.show()
elif quadrant == 3:
- self.widget_sagittal.show()
+ self.ui.widget_sagittal.show()
elif quadrant == 4:
- self.widget_transverse.show()
+ self.ui.widget_transverse.show()
self.is_pane_maximum = True
@Slot(int)
def cell_active(self, quadrant: int):
- self.widget_3d.setStyleSheet(".QWidget {"
- "border: none;"
- "}")
- self.widget_coronal.setStyleSheet(".QWidget {"
- "border: none;"
- "}")
- self.widget_sagittal.setStyleSheet(".QWidget {"
- "border: none;"
- "}")
- self.widget_transverse.setStyleSheet(".QWidget {"
+ self.ui.widget_3d.setStyleSheet(".QWidget {"
+ "border: none;"
+ "}")
+ self.ui.widget_coronal.setStyleSheet(".QWidget {"
"border: none;"
"}")
- if quadrant == 1:
- self.widget_coronal.setStyleSheet(".QWidget {"
- "border: 1px solid tomato;"
+ self.ui.widget_sagittal.setStyleSheet(".QWidget {"
+ "border: none;"
"}")
- elif quadrant == 2:
- self.widget_3d.setStyleSheet(".QWidget {"
- "border: 1px solid tomato;"
- "}")
- elif quadrant == 3:
- self.widget_sagittal.setStyleSheet(".QWidget {"
- "border: 1px solid tomato;"
- "}")
- elif quadrant == 4:
- self.widget_transverse.setStyleSheet(".QWidget {"
+ self.ui.widget_transverse.setStyleSheet(".QWidget {"
+ "border: none;"
+ "}")
+ if quadrant == 1:
+ self.ui.widget_coronal.setStyleSheet(".QWidget {"
"border: 1px solid tomato;"
"}")
+ elif quadrant == 2:
+ self.ui.widget_3d.setStyleSheet(".QWidget {"
+ "border: 1px solid tomato;"
+ "}")
+ elif quadrant == 3:
+ self.ui.widget_sagittal.setStyleSheet(".QWidget {"
+ "border: 1px solid tomato;"
+ "}")
+ elif quadrant == 4:
+ self.ui.widget_transverse.setStyleSheet(".QWidget {"
+ "border: 1px solid tomato;"
+ "}")
@Slot()
def handle_file_open(self):
diff --git a/crystalfly/ui/main_window.ui b/crystalfly/ui/main_window.ui
index 360d969..b0da28f 100644
--- a/crystalfly/ui/main_window.ui
+++ b/crystalfly/ui/main_window.ui
@@ -6,8 +6,8 @@
0
0
- 800
- 600
+ 850
+ 628
@@ -19,37 +19,12 @@
-
-
+
0
-
-
-
- border: 1px solid rgb(195, 195, 195);
-
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
-
-
- -
-
- border: 1px solid rgb(195, 195, 195);
-margin-left: -1px;
-
1
@@ -66,14 +41,27 @@ margin-left: -1px;
- -
-
-
- border: 1px solid rgb(195, 195, 195);
-margin-left: -1px;
-margin-top: -1px;
-
-
+
-
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ -
+
+
1
@@ -90,12 +78,8 @@ margin-top: -1px;
-
-
-
- border: 1px solid rgb(195, 195, 195);
-margin-top: -1px;
-
-
+
+
1
diff --git a/crystalfly/ui/main_window_ui.py b/crystalfly/ui/main_window_ui.py
new file mode 100644
index 0000000..2ebe249
--- /dev/null
+++ b/crystalfly/ui/main_window_ui.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'main_window.ui'
+##
+## Created by: Qt User Interface Compiler version 6.7.0
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
+ QCursor, QFont, QFontDatabase, QGradient,
+ QIcon, QImage, QKeySequence, QLinearGradient,
+ QPainter, QPalette, QPixmap, QRadialGradient,
+ QTransform)
+from PySide6.QtWidgets import (QApplication, QGridLayout, QHBoxLayout, QMainWindow,
+ QSizePolicy, QStatusBar, QToolBar, QWidget)
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ if not MainWindow.objectName():
+ MainWindow.setObjectName(u"MainWindow")
+ MainWindow.resize(850, 628)
+ MainWindow.setStyleSheet(u"# background-color: rgb(50, 50, 50);")
+ self.file_open = QAction(MainWindow)
+ self.file_open.setObjectName(u"file_open")
+ self.centralwidget = QWidget(MainWindow)
+ self.centralwidget.setObjectName(u"centralwidget")
+ self.horizontalLayout = QHBoxLayout(self.centralwidget)
+ self.horizontalLayout.setObjectName(u"horizontalLayout")
+ self.four_pane_grid = QGridLayout()
+ self.four_pane_grid.setSpacing(0)
+ self.four_pane_grid.setObjectName(u"four_pane_grid")
+ self.widget_coronal = QWidget(self.centralwidget)
+ self.widget_coronal.setObjectName(u"widget_coronal")
+ self.coronal_grid_layout = QGridLayout(self.widget_coronal)
+ self.coronal_grid_layout.setObjectName(u"coronal_grid_layout")
+ self.coronal_grid_layout.setContentsMargins(1, 1, 1, 1)
+
+ self.four_pane_grid.addWidget(self.widget_coronal, 0, 1, 1, 1)
+
+ self.widget_3d = QWidget(self.centralwidget)
+ self.widget_3d.setObjectName(u"widget_3d")
+ self.volume_grid_layout = QGridLayout(self.widget_3d)
+ self.volume_grid_layout.setObjectName(u"volume_grid_layout")
+ self.volume_grid_layout.setContentsMargins(1, 1, 1, 1)
+
+ self.four_pane_grid.addWidget(self.widget_3d, 0, 0, 1, 1)
+
+ self.widget_sagittal = QWidget(self.centralwidget)
+ self.widget_sagittal.setObjectName(u"widget_sagittal")
+ self.sagittal_grid_layout = QGridLayout(self.widget_sagittal)
+ self.sagittal_grid_layout.setObjectName(u"sagittal_grid_layout")
+ self.sagittal_grid_layout.setContentsMargins(1, 1, 1, 1)
+
+ self.four_pane_grid.addWidget(self.widget_sagittal, 1, 0, 1, 1)
+
+ self.widget_transverse = QWidget(self.centralwidget)
+ self.widget_transverse.setObjectName(u"widget_transverse")
+ self.transverse_grid_layout = QGridLayout(self.widget_transverse)
+ self.transverse_grid_layout.setObjectName(u"transverse_grid_layout")
+ self.transverse_grid_layout.setContentsMargins(1, 1, 1, 1)
+
+ self.four_pane_grid.addWidget(self.widget_transverse, 1, 1, 1, 1)
+
+ self.four_pane_grid.setRowStretch(0, 1)
+ self.four_pane_grid.setRowStretch(1, 1)
+ self.four_pane_grid.setColumnStretch(0, 1)
+ self.four_pane_grid.setColumnStretch(1, 1)
+
+ self.horizontalLayout.addLayout(self.four_pane_grid)
+
+ self.horizontalLayout.setStretch(0, 16)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.statusbar = QStatusBar(MainWindow)
+ self.statusbar.setObjectName(u"statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+ self.tool_bar = QToolBar(MainWindow)
+ self.tool_bar.setObjectName(u"tool_bar")
+ MainWindow.addToolBar(Qt.ToolBarArea.LeftToolBarArea, self.tool_bar)
+
+ self.retranslateUi(MainWindow)
+
+ QMetaObject.connectSlotsByName(MainWindow)
+ # setupUi
+
+ def retranslateUi(self, MainWindow):
+ MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"Crystalfly", None))
+ self.file_open.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00", None))
+ self.tool_bar.setWindowTitle(QCoreApplication.translate("MainWindow", u"toolBar_2", None))
+ # retranslateUi
+
diff --git a/crystalfly/ui/volume_viewer.py b/crystalfly/ui/volume_viewer.py
index 18a8a84..17ca742 100644
--- a/crystalfly/ui/volume_viewer.py
+++ b/crystalfly/ui/volume_viewer.py
@@ -1,10 +1,14 @@
# noinspection PyUnresolvedReferences
-import vtkmodules.vtkRenderingContextOpenGL2
+# noinspection PyUnresolvedReferences
+import vtkmodules.all
from PySide6.QtCore import Signal
from PySide6.QtGui import QMouseEvent
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
+from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonDataModel import vtkPiecewiseFunction
+from vtkmodules.vtkCommonTransforms import vtkTransform
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
+from vtkmodules.vtkRenderingAnnotation import vtkAxesActor
from vtkmodules.vtkRenderingCore import vtkVolume, vtkVolumeProperty, vtkRenderer, vtkColorTransferFunction
from vtkmodules.vtkRenderingVolume import vtkGPUVolumeRayCastMapper
# noinspection PyUnresolvedReferences
@@ -28,6 +32,13 @@ class VolumeViewer(QVTKRenderWindowInteractor):
# self.iren = vtkRenderWindowInteractor()
# self.iren.SetRenderWindow(self.render_window)
+ transform = vtkTransform()
+ transform.Translate(1.0, 0, 0)
+ colors = vtkNamedColors()
+ self.axes = vtkAxesActor()
+ self.axes.SetUserTransform(transform)
+ self.axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetColor(colors.GetColor3d("red"))
+ self.axes.SetPosition(0, 0, 0)
self.volume_mapper = vtkGPUVolumeRayCastMapper()
self.volume_mapper.SetBlendModeToComposite()
self.volume_mapper.SetUseJittering(1)
@@ -76,6 +87,8 @@ class VolumeViewer(QVTKRenderWindowInteractor):
self.render_window.Render()
self.renderer.ResetCamera()
self.renderer.GetActiveCamera().Zoom(1.3)
+ # self.axes.Zoom(1.3)
+ self.renderer.AddActor(self.axes)
self.volume.Update()
# self.volume_mapper.Render()
diff --git a/crystalfly/ui/vtk_viewer.py b/crystalfly/ui/vtk_viewer.py
index 9732e1e..8bb4bbd 100644
--- a/crystalfly/ui/vtk_viewer.py
+++ b/crystalfly/ui/vtk_viewer.py
@@ -3,8 +3,9 @@ import vtkmodules.vtkRenderingContextOpenGL2
from PySide6.QtCore import Signal
from PySide6.QtGui import QCloseEvent, QMouseEvent
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
-from vtkmodules.vtkInteractionImage import vtkImageViewer2
+from vtkmodules.vtkInteractionImage import vtkResliceImageViewer
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage
+from vtkmodules.vtkInteractionWidgets import vtkResliceCursorLineRepresentation
from crystalfly.model.image_reader import image_reader_model
@@ -21,8 +22,8 @@ class VTKImageViewer(QVTKRenderWindowInteractor):
self.render_window = self.GetRenderWindow()
# image viewer
- # self.image_viewer = vtkResliceImageViewer()
- self.image_viewer = vtkImageViewer2()
+ self.image_viewer = vtkResliceImageViewer()
+ # self.image_viewer = vtkImageViewer2()
# 交互
self.interactor_style = vtkInteractorStyleImage()
@@ -32,8 +33,10 @@ class VTKImageViewer(QVTKRenderWindowInteractor):
self.interactor_style.AddObserver("MouseWheelBackwardEvent", self.mouse_wheel_backward_event)
self.iren.Initialize()
- # rep = vtkResliceCursorLineRepresentation.SafeDownCast(
- # self.image_viewer.GetResliceCursorWidget().GetRepresentation())
+ rep = vtkResliceCursorLineRepresentation.SafeDownCast(
+ self.image_viewer.GetResliceCursorWidget().GetRepresentation())
+ rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormal(self.quadrant)
+ self.image_viewer.SetResliceModeToAxisAligned()
# # self.image_viewer.
# rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormal(0)
#
diff --git a/poetry.lock b/poetry.lock
index 94a33ce..da55f14 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,5 +1,16 @@
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+[[package]]
+name = "altgraph"
+version = "0.17.4"
+description = "Python graph (network) package"
+optional = false
+python-versions = "*"
+files = [
+ {file = "altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff"},
+ {file = "altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406"},
+]
+
[[package]]
name = "contourpy"
version = "1.2.1"
@@ -143,6 +154,25 @@ ufo = ["fs (>=2.2.0,<3)"]
unicode = ["unicodedata2 (>=15.1.0)"]
woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
+[[package]]
+name = "importlib-metadata"
+version = "7.1.0"
+description = "Read metadata from Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"},
+ {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"},
+]
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+perf = ["ipython"]
+testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
+
[[package]]
name = "importlib-resources"
version = "6.4.0"
@@ -274,6 +304,20 @@ files = [
{file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"},
]
+[[package]]
+name = "macholib"
+version = "1.16.3"
+description = "Mach-O header analysis and editing"
+optional = false
+python-versions = "*"
+files = [
+ {file = "macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c"},
+ {file = "macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30"},
+]
+
+[package.dependencies]
+altgraph = ">=0.17"
+
[[package]]
name = "matplotlib"
version = "3.8.4"
@@ -379,6 +423,17 @@ files = [
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
]
+[[package]]
+name = "pefile"
+version = "2023.2.7"
+description = "Python PE parsing module"
+optional = false
+python-versions = ">=3.6.0"
+files = [
+ {file = "pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6"},
+ {file = "pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc"},
+]
+
[[package]]
name = "pillow"
version = "10.3.0"
@@ -465,6 +520,57 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
typing = ["typing-extensions"]
xmp = ["defusedxml"]
+[[package]]
+name = "pyinstaller"
+version = "6.6.0"
+description = "PyInstaller bundles a Python application and all its dependencies into a single package."
+optional = false
+python-versions = "<3.13,>=3.8"
+files = [
+ {file = "pyinstaller-6.6.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:d2705efe79f8749526f65c4bce70ae88eea8b6adfb051f123122e86542fe3802"},
+ {file = "pyinstaller-6.6.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:2aa771693ee3e0a899be3e9d946a24eab9896a98d0d4035f05a22f1193004cfb"},
+ {file = "pyinstaller-6.6.0-py3-none-manylinux2014_i686.whl", hash = "sha256:1fc15e8cebf76361568359a40926aa5746fc0a84ca365fb2ac6caeea014a2cd3"},
+ {file = "pyinstaller-6.6.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:7c4a55a5d872c118bc7a5e641c2df46ad18585c002d96adad129b4ee8c104463"},
+ {file = "pyinstaller-6.6.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:97197593344f11f3dd2bdadbab14c61fbc4cdf9cc692a89b047cb671764c1824"},
+ {file = "pyinstaller-6.6.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:00d81ddeee97710245a7ed03b0f9d5a4daf6c3a07adf978487b10991e1e20470"},
+ {file = "pyinstaller-6.6.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:b7cab21db6fcfbdab47ee960239d1b44cd95383a4463177bd592613941d67959"},
+ {file = "pyinstaller-6.6.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:00996d2090734d9ae4a1e53ed40351b07d593c37118d3e0d435bbcfa8db9edee"},
+ {file = "pyinstaller-6.6.0-py3-none-win32.whl", hash = "sha256:cfe3ed214601de0723cb660994b44934efacb77a1cf0e4cc5133da996bcf36ce"},
+ {file = "pyinstaller-6.6.0-py3-none-win_amd64.whl", hash = "sha256:e2f55fbbdf8a99ea84b39bc5669a68624473c303486d7eb2cd9063b339f0aa28"},
+ {file = "pyinstaller-6.6.0-py3-none-win_arm64.whl", hash = "sha256:abbd591967593dab264bcc3bcb2466c0a1582f19a112e37e916c4212069c7933"},
+ {file = "pyinstaller-6.6.0.tar.gz", hash = "sha256:be6bc2c3073d3e84fb7148d3af33ce9b6a7f01cfb154e06314cd1d4c05798a32"},
+]
+
+[package.dependencies]
+altgraph = "*"
+importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
+macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""}
+packaging = ">=22.0"
+pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""}
+pyinstaller-hooks-contrib = ">=2024.3"
+pywin32-ctypes = {version = ">=0.2.1", markers = "sys_platform == \"win32\""}
+setuptools = ">=42.0.0"
+
+[package.extras]
+completion = ["argcomplete"]
+hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"]
+
+[[package]]
+name = "pyinstaller-hooks-contrib"
+version = "2024.5"
+description = "Community maintained hooks for PyInstaller"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pyinstaller_hooks_contrib-2024.5-py2.py3-none-any.whl", hash = "sha256:0852249b7fb1e9394f8f22af2c22fa5294c2c0366157969f98c96df62410c4c6"},
+ {file = "pyinstaller_hooks_contrib-2024.5.tar.gz", hash = "sha256:aa5dee25ea7ca317ad46fa16b5afc8dba3b0e43f2847e498930138885efd3cab"},
+]
+
+[package.dependencies]
+importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
+packaging = ">=22.0"
+setuptools = ">=42.0.0"
+
[[package]]
name = "pyparsing"
version = "3.1.2"
@@ -544,6 +650,33 @@ files = [
[package.dependencies]
six = ">=1.5"
+[[package]]
+name = "pywin32-ctypes"
+version = "0.2.2"
+description = "A (partial) reimplementation of pywin32 using ctypes/cffi"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"},
+ {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"},
+]
+
+[[package]]
+name = "setuptools"
+version = "69.5.1"
+description = "Easily download, build, install, upgrade, and uninstall Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"},
+ {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"},
+]
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
+
[[package]]
name = "shiboken6"
version = "6.7.0"
@@ -627,4 +760,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
[metadata]
lock-version = "2.0"
python-versions = "<3.13,>=3.9"
-content-hash = "6c724ee2023b791644f31d73b59fa6fa3cd74d1fe020626be9d592f4a5d49662"
+content-hash = "552e3693360108125425bea4f6a919cf793ff3ddd4bb7850609280139f3057cd"
diff --git a/pyproject.toml b/pyproject.toml
index 912f4a7..9aed264 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,6 +9,7 @@ readme = "README.md"
python = "<3.13,>=3.9"
pyside6 = "^6.7.0"
vtk = "^9.3.0"
+pyinstaller = "^6.6.0"
[build-system]