Skip to content

Commit

Permalink
Merge pull request #6 from Carifio24/volume-ui
Browse files Browse the repository at this point in the history
Add basic UI for volume exporter
  • Loading branch information
Carifio24 authored Dec 18, 2023
2 parents 1d589c0 + 84cd81c commit f0fe113
Show file tree
Hide file tree
Showing 4 changed files with 207 additions and 134 deletions.
172 changes: 60 additions & 112 deletions glue_ar/export_scatter.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,76 @@
<x>0</x>
<y>0</y>
<width>327</width>
<height>414</height>
<height>416</height>
</rect>
</property>
<property name="windowTitle">
<string>Export 3D Scatter</string>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0,0">
<item row="0" column="1">
<widget class="QLabel" name="label">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_filetype_message">
<property name="text">
<string>Select the export filetype</string>
</property>
</widget>
</item>
<item row="7" column="1">
<item row="1" column="0">
<widget class="QComboBox" name="combosel_filetype"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_settings_message">
<property name="text">
<string>Select the export settings for each layer</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QListWidget" name="listsel_layer"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_resolution_message">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;The resolution values affect how many points are used to draw each sphere. Higher values mean better resolution, but a larger exported file. The total number of points per sphere is &lt;div&gt;2 + (phi_resolution - 2) * theta_resolution&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_theta_resolution">
<property name="text">
<string>Theta resolution:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_phi_resolution">
<property name="text">
<string>Phi resolution:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="valuetext_theta_resolution"/>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="valuetext_phi_resolution"/>
</item>
</layout>
</widget>
</item>
<item row="6" column="0">
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
Expand Down Expand Up @@ -54,113 +109,6 @@
</layout>
</widget>
</item>
<item row="6" column="1">
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_theta_resolution">
<property name="text">
<string>Theta resolution:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_phi_resolution">
<property name="text">
<string>Phi resolution:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="valuetext_theta_resolution"/>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="valuetext_phi_resolution"/>
</item>
</layout>
</widget>
</item>
<item row="2" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>33</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="1">
<widget class="QListWidget" name="listsel_layer"/>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>38</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="combosel_filetype"/>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_message">
<property name="text">
<string>Select the export settings for each layer</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;The resolution values affect how many points are used to draw each sphere. Higher values mean better resolution, but a larger exported file. The total number of points per sphere is &lt;div&gt;2 + (phi_resolution - 2) * theta_resolution&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="2">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
Expand Down
103 changes: 103 additions & 0 deletions glue_ar/export_volume.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>321</width>
<height>414</height>
</rect>
</property>
<property name="windowTitle">
<string>Export 3D Volume</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_filetype_message">
<property name="text">
<string>Select the export filetype</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="combosel_filetype"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_settings_message">
<property name="text">
<string>Set the export settings for each layer</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QListWidget" name="listsel_layer"/>
</item>
<item row="4" column="0">
<widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="bool_gaussian_filter">
<property name="text">
<string>Use Gaussian filter</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_3" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_smoothing_iterations">
<property name="text">
<string>Smoothing iterations</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="valuetext_smoothing_iterations"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0">
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>110</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="button_cancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="button_ok">
<property name="text">
<string>Export</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
43 changes: 32 additions & 11 deletions glue_ar/tools.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
from os.path import basename, splitext
from os.path import join, split, splitext

import pyvista as pv

Expand All @@ -10,6 +10,7 @@
from glue.viewers.common.tool import Tool

from glue_ar.export_scatter import ExportScatterDialog
from glue_ar.export_volume import ExportVolumeDialog
from glue_ar.scatter import scatter_layer_as_multiblock
from glue_ar.export import export_gl, export_modelviewer
from glue_ar.volume import create_meshes
Expand All @@ -36,7 +37,7 @@ def activate(self):
if result == QDialog.Rejected:
return

export_path, _ = compat.getsavefilename(parent=self.viewer, basedir=f"scatter.{dialog.state.filetype}".lower())
export_path, _ = compat.getsavefilename(parent=self.viewer, basedir=f"scatter.{dialog.state.filetype.lower()}")
if not export_path:
return

Expand All @@ -48,12 +49,14 @@ def activate(self):
data = mesh_info.pop("data")
plotter.add_mesh(data, **mesh_info)

base = basename(export_path)
name, _ = splitext(base)
html_path = f"{name}.html"
export_gl(plotter, export_path, with_alpha=True)

export_modelviewer(html_path, base, "Testing visualization")
dir, base = split(export_path)
name, ext = splitext(base)
html_path = join(dir, f"{name}.html")
if ext:
export_gl(plotter, export_path, with_alpha=True)
export_modelviewer(html_path, base, "Testing visualization")
else:
plotter.export_obj(export_path)


@viewer_tool
Expand All @@ -64,10 +67,28 @@ class GLVolumeExportTool(Tool):
tool_tip = "Export the current view to a glB file"

def activate(self):

dialog = ExportVolumeDialog(parent=self.viewer, viewer_state=self.viewer.state)
result = dialog.exec_()
if result == QDialog.Rejected:
return

export_path, _ = compat.getsavefilename(parent=self.viewer, basedir=f"volume.{dialog.state.filetype.lower()}")
if not export_path:
return

plotter = pv.Plotter()
meshes = create_meshes(self.viewer.state, use_gaussian_filter=True, smoothing_iteration_count=10)
layer_states = [state for state in self.viewer.state.layers if state.visible]
meshes = create_meshes(self.viewer.state, layer_states, dialog.info_dictionary)
for data in meshes.values():
mesh = data.pop("mesh")
plotter.add_mesh(mesh, color=data["color"], opacity=data["opacity"])
export_gl(plotter, "volume.gltf", with_alpha=True) # Do we want alpha for volume renderings?
export_modelviewer("volume.html", "volume.gltf", "Testing visualization")

dir, base = split(export_path)
name, ext = splitext(base)
html_path = join(dir, f"{name}.html")
if ext == 'glTF':
export_gl(plotter, export_path, with_alpha=True) # Do we want alpha for volume renderings?
export_modelviewer(html_path, base, "Testing visualization")
else:
plotter.export_obj(export_path)
Loading

0 comments on commit f0fe113

Please sign in to comment.