volume rotation center, slice slide
This commit is contained in:
8
crystalfly/VTK Error Out.txt
Normal file
8
crystalfly/VTK Error Out.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
ERROR: In vtkDemandDrivenPipeline.cxx, line 677
|
||||||
|
vtkCompositeDataPipeline (00000233450F5040): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (0000023343594B20) has 0 connections but is not optional.
|
||||||
|
|
||||||
|
|
||||||
|
ERROR: In vtkDemandDrivenPipeline.cxx, line 677
|
||||||
|
vtkCompositeDataPipeline (00000233450F5040): Input port 0 of algorithm vtkOpenGLGPUVolumeRayCastMapper (0000023343594B20) has 0 connections but is not optional.
|
||||||
|
|
||||||
|
|
@ -2,6 +2,7 @@ import ctypes
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication
|
||||||
|
from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow
|
||||||
|
|
||||||
from crystalfly.ui.main_window import MainWindow
|
from crystalfly.ui.main_window import MainWindow
|
||||||
|
|
||||||
@ -16,4 +17,9 @@ def main():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
# pipe vtk output errors to file
|
||||||
|
errOut = vtkFileOutputWindow()
|
||||||
|
errOut.SetFileName("VTK Error Out.txt")
|
||||||
|
vtkStdErrOut = vtkOutputWindow()
|
||||||
|
vtkStdErrOut.SetInstance(errOut)
|
||||||
main()
|
main()
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,8 +1,8 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from PySide6.QtCore import Slot
|
from PySide6.QtCore import Slot, Qt
|
||||||
from PySide6.QtUiTools import loadUiType
|
from PySide6.QtUiTools import loadUiType
|
||||||
from PySide6.QtWidgets import QMainWindow
|
from PySide6.QtWidgets import QMainWindow, QSlider
|
||||||
from vtkmodules.vtkRenderingOpenGL2 import vtkGenericOpenGLRenderWindow
|
from vtkmodules.vtkRenderingOpenGL2 import vtkGenericOpenGLRenderWindow
|
||||||
|
|
||||||
from crystalfly.ui.import_file import ImportFile
|
from crystalfly.ui.import_file import ImportFile
|
||||||
@ -39,15 +39,44 @@ class MainWindow(QMainWindow, MainWindowType):
|
|||||||
self.coronal.doubleClicked.connect(self.cell_max)
|
self.coronal.doubleClicked.connect(self.cell_max)
|
||||||
self.sagittal.doubleClicked.connect(self.cell_max)
|
self.sagittal.doubleClicked.connect(self.cell_max)
|
||||||
self.transverse.doubleClicked.connect(self.cell_max)
|
self.transverse.doubleClicked.connect(self.cell_max)
|
||||||
# self.gridLayout.addWidget()
|
|
||||||
|
self.volume.clicked.connect(self.cell_active)
|
||||||
|
self.coronal.clicked.connect(self.cell_active)
|
||||||
|
self.sagittal.clicked.connect(self.cell_active)
|
||||||
|
self.transverse.clicked.connect(self.cell_active)
|
||||||
|
|
||||||
|
self.coronal.range_changed.connect(self.set_slide_range)
|
||||||
|
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.volume_grid_layout.addWidget(self.volume)
|
||||||
self.coronal_grid_layout.addWidget(self.coronal)
|
self.coronal_grid_layout.addWidget(self.coronal, 0, 0, 8, 8)
|
||||||
self.gridLayout_3.addWidget(self.sagittal)
|
self.gridLayout_3.addWidget(self.sagittal, 0, 0, 8, 8)
|
||||||
self.gridLayout_4.addWidget(self.transverse)
|
self.gridLayout_4.addWidget(self.transverse, 0, 0, 8, 8)
|
||||||
|
|
||||||
|
self.coronal_slider = QSlider(Qt.Orientation.Vertical)
|
||||||
|
self.sagittal_slider = QSlider(Qt.Orientation.Vertical)
|
||||||
|
self.transverse_slider = QSlider(Qt.Orientation.Vertical)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
@Slot(int, int)
|
||||||
|
def set_slide_range(self, quadrant, value):
|
||||||
|
if quadrant == 1:
|
||||||
|
self.coronal_slider.setRange(0, value)
|
||||||
|
elif quadrant == 3:
|
||||||
|
self.sagittal_slider.setRange(0, value)
|
||||||
|
elif quadrant == 4:
|
||||||
|
self.transverse_slider.setRange(0, value)
|
||||||
|
|
||||||
@Slot(int)
|
@Slot(int)
|
||||||
def cell_max(self, quadrant: int):
|
def cell_max(self, quadrant: int):
|
||||||
print(quadrant)
|
|
||||||
if self.is_pane_maximum:
|
if self.is_pane_maximum:
|
||||||
self.widget_3d.show()
|
self.widget_3d.show()
|
||||||
self.widget_coronal.show()
|
self.widget_coronal.show()
|
||||||
@ -59,7 +88,6 @@ class MainWindow(QMainWindow, MainWindowType):
|
|||||||
self.widget_coronal.hide()
|
self.widget_coronal.hide()
|
||||||
self.widget_sagittal.hide()
|
self.widget_sagittal.hide()
|
||||||
self.widget_transverse.hide()
|
self.widget_transverse.hide()
|
||||||
print(quadrant)
|
|
||||||
if quadrant == 1:
|
if quadrant == 1:
|
||||||
self.widget_coronal.show()
|
self.widget_coronal.show()
|
||||||
elif quadrant == 2:
|
elif quadrant == 2:
|
||||||
@ -70,9 +98,36 @@ class MainWindow(QMainWindow, MainWindowType):
|
|||||||
self.widget_transverse.show()
|
self.widget_transverse.show()
|
||||||
self.is_pane_maximum = True
|
self.is_pane_maximum = True
|
||||||
|
|
||||||
@Slot()
|
@Slot(int)
|
||||||
def cell_click(self):
|
def cell_active(self, quadrant: int):
|
||||||
print("clicked")
|
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 {"
|
||||||
|
"border: none;"
|
||||||
|
"}")
|
||||||
|
if quadrant == 1:
|
||||||
|
self.widget_coronal.setStyleSheet(".QWidget {"
|
||||||
|
"border: 1px solid tomato;"
|
||||||
|
"}")
|
||||||
|
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 {"
|
||||||
|
"border: 1px solid tomato;"
|
||||||
|
"}")
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def handle_file_open(self):
|
def handle_file_open(self):
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="four_pane_grid">
|
<layout class="QGridLayout" name="four_pane_grid" rowstretch="0,0" columnstretch="0,0,0">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
|
@ -15,6 +15,7 @@ from crystalfly.model.image_reader import image_reader_model
|
|||||||
|
|
||||||
class VolumeViewer(QVTKRenderWindowInteractor):
|
class VolumeViewer(QVTKRenderWindowInteractor):
|
||||||
doubleClicked = Signal(int)
|
doubleClicked = Signal(int)
|
||||||
|
clicked = Signal(int)
|
||||||
|
|
||||||
def __init__(self, quadrant: int):
|
def __init__(self, quadrant: int):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -73,9 +74,13 @@ class VolumeViewer(QVTKRenderWindowInteractor):
|
|||||||
self.volume_mapper.SetInputData(image)
|
self.volume_mapper.SetInputData(image)
|
||||||
self.iren.SetRenderWindow(self.render_window)
|
self.iren.SetRenderWindow(self.render_window)
|
||||||
self.render_window.Render()
|
self.render_window.Render()
|
||||||
|
self.renderer.ResetCamera()
|
||||||
|
self.renderer.GetActiveCamera().Zoom(1.3)
|
||||||
self.volume.Update()
|
self.volume.Update()
|
||||||
# self.volume_mapper.Render()
|
# self.volume_mapper.Render()
|
||||||
|
|
||||||
def mouseDoubleClickEvent(self, evt: QMouseEvent):
|
def mouseDoubleClickEvent(self, evt: QMouseEvent):
|
||||||
print(evt, self.quadrant)
|
|
||||||
self.doubleClicked.emit(self.quadrant)
|
self.doubleClicked.emit(self.quadrant)
|
||||||
|
|
||||||
|
# def mousePressEvent(self, ev: QMouseEvent):
|
||||||
|
# self.clicked.emit(self.quadrant)
|
||||||
|
@ -3,15 +3,16 @@ import vtkmodules.vtkRenderingContextOpenGL2
|
|||||||
from PySide6.QtCore import Signal
|
from PySide6.QtCore import Signal
|
||||||
from PySide6.QtGui import QCloseEvent, QMouseEvent
|
from PySide6.QtGui import QCloseEvent, QMouseEvent
|
||||||
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
|
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
|
||||||
from vtkmodules.vtkInteractionImage import vtkResliceImageViewer, vtkImageViewer2
|
from vtkmodules.vtkInteractionImage import vtkImageViewer2
|
||||||
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage
|
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage
|
||||||
from vtkmodules.vtkInteractionWidgets import vtkResliceCursorLineRepresentation, vtkImagePlaneWidget
|
|
||||||
|
|
||||||
from crystalfly.model.image_reader import image_reader_model
|
from crystalfly.model.image_reader import image_reader_model
|
||||||
|
|
||||||
|
|
||||||
class VTKImageViewer(QVTKRenderWindowInteractor):
|
class VTKImageViewer(QVTKRenderWindowInteractor):
|
||||||
doubleClicked = Signal(int)
|
doubleClicked = Signal(int)
|
||||||
|
clicked = Signal(int)
|
||||||
|
range_changed = Signal(int, int)
|
||||||
|
|
||||||
def __init__(self, quadrant: int):
|
def __init__(self, quadrant: int):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -46,6 +47,8 @@ class VTKImageViewer(QVTKRenderWindowInteractor):
|
|||||||
self.image_viewer.SetRenderWindow(self.render_window)
|
self.image_viewer.SetRenderWindow(self.render_window)
|
||||||
self.image_viewer.SetInputData(image)
|
self.image_viewer.SetInputData(image)
|
||||||
self.image_viewer.Render()
|
self.image_viewer.Render()
|
||||||
|
max_slice = self.image_viewer.GetSliceMax()
|
||||||
|
self.range_changed.emit(self.quadrant, max_slice)
|
||||||
print("setImage")
|
print("setImage")
|
||||||
|
|
||||||
def mouse_wheel_forward_event(self, a, b):
|
def mouse_wheel_forward_event(self, a, b):
|
||||||
@ -66,3 +69,6 @@ class VTKImageViewer(QVTKRenderWindowInteractor):
|
|||||||
|
|
||||||
def mouseDoubleClickEvent(self, evt: QMouseEvent):
|
def mouseDoubleClickEvent(self, evt: QMouseEvent):
|
||||||
self.doubleClicked.emit(self.quadrant)
|
self.doubleClicked.emit(self.quadrant)
|
||||||
|
|
||||||
|
# def mousePressEvent(self, ev: QMouseEvent):
|
||||||
|
# self.clicked.emit(self.quadrant)
|
||||||
|
Reference in New Issue
Block a user