diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e9a867c..f7795d1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +# vx.x.x +- Use headless render window for viewer via trame (#429) + ## v24.1.0 Enhancements: diff --git a/Wrappers/Python/ccpi/web_viewer/trame_viewer.py b/Wrappers/Python/ccpi/web_viewer/trame_viewer.py index 84e141a7..8664a7af 100644 --- a/Wrappers/Python/ccpi/web_viewer/trame_viewer.py +++ b/Wrappers/Python/ccpi/web_viewer/trame_viewer.py @@ -35,7 +35,7 @@ class TrameViewer: """ This class is intended as a base class and not to be used outside of one of the TrameViewer2D and TrameViewer3D classes. """ - + def __init__(self, viewer, list_of_files: list = None): # Load files and setup the CILViewer if list_of_files is None: diff --git a/Wrappers/Python/ccpi/web_viewer/trame_viewer2D.py b/Wrappers/Python/ccpi/web_viewer/trame_viewer2D.py index f4819671..1cc2d701 100644 --- a/Wrappers/Python/ccpi/web_viewer/trame_viewer2D.py +++ b/Wrappers/Python/ccpi/web_viewer/trame_viewer2D.py @@ -27,9 +27,9 @@ class TrameViewer2D(TrameViewer): - def __init__(self, list_of_files: list = None): + def __init__(self, list_of_files: list = None, viewer=CILViewer2D): self.first_load = True - super().__init__(list_of_files=list_of_files, viewer=CILViewer2D) + super().__init__(list_of_files=list_of_files, viewer=viewer) self.model_choice = None self.background_choice = None diff --git a/Wrappers/Python/ccpi/web_viewer/trame_viewer3D.py b/Wrappers/Python/ccpi/web_viewer/trame_viewer3D.py index 5361ef61..445041a7 100644 --- a/Wrappers/Python/ccpi/web_viewer/trame_viewer3D.py +++ b/Wrappers/Python/ccpi/web_viewer/trame_viewer3D.py @@ -47,8 +47,8 @@ def colormaps(): class TrameViewer3D(TrameViewer): - def __init__(self, list_of_files=None): - super().__init__(list_of_files=list_of_files, viewer=CILViewer) + def __init__(self, list_of_files=None, viewer=CILViewer): + super().__init__(list_of_files=list_of_files, viewer=viewer) # Define attributes that will be constructed in methods outside of __init__ diff --git a/Wrappers/Python/ccpi/web_viewer/web_app.py b/Wrappers/Python/ccpi/web_viewer/web_app.py index a45f03c0..d093d2c1 100644 --- a/Wrappers/Python/ccpi/web_viewer/web_app.py +++ b/Wrappers/Python/ccpi/web_viewer/web_app.py @@ -21,10 +21,12 @@ from trame.app import get_server +from ccpi.viewer import CILViewer, CILViewer2D from ccpi.web_viewer.trame_viewer2D import TrameViewer2D from ccpi.web_viewer.trame_viewer3D import TrameViewer3D +import vtk -server = get_server() +server = get_server(client_type="vue2") state, ctrl = server.state, server.controller TRAME_VIEWER = None @@ -45,22 +47,26 @@ def arg_parser(): Parse the passed arguments to the current :return: """ - help_string = "web_app.py [optional args: -h, -d] \n" \ + help_string = "web_app.py [optional args: -h, -d, --headless] \n" \ "Args:\n" \ "-h: Show this help and exit the program\n" \ - "-d, --2D: Use the 2D viewer instead of the 3D viewer, the default is to just use the 3D viewer." + "-d, --2D: Use the 2D viewer instead of the 3D viewer, the default is to just use the 3D viewer.\n" \ + "--headless: Run the program in headless mode, this is useful for remote rendering." try: - opts, args = getopt.getopt(sys.argv[1:], "hd", ["2D"]) + opts, args = getopt.getopt(sys.argv[1:], "hd", ["2D", "headless"]) except getopt.GetoptError: print(help_string) sys.exit(2) + headless = False for opt, arg in opts: if opt == '-h': print(help_string) elif opt in ("-d", "--2D"): global VIEWER_2D VIEWER_2D = True - return data_finder() + elif opt == '--headless': + headless = True + return data_finder(), headless def data_finder(): @@ -89,13 +95,24 @@ def main() -> int: Create the main class and run the TrameViewer :return: int, exit code for the program """ - data_files = arg_parser() + data_files, headless = arg_parser() + if headless: + renderWindow = vtk.vtkRenderWindow() + renderWindow.OffScreenRenderingOn() global TRAME_VIEWER if not VIEWER_2D: - TRAME_VIEWER = TrameViewer3D(data_files) + if headless: + viewer = CILViewer.CILViewer(renWin=renderWindow) + TRAME_VIEWER = TrameViewer3D(data_files, viewer=viewer) + else: + TRAME_VIEWER = TrameViewer3D(data_files) TRAME_VIEWER.start() else: - TRAME_VIEWER = TrameViewer2D(data_files) + if headless: + viewer = CILViewer2D.CILViewer2D(renWin=renderWindow) + TRAME_VIEWER = TrameViewer2D(data_files, viewer=viewer) + else: + TRAME_VIEWER = TrameViewer2D(data_files) TRAME_VIEWER.start() return 0