--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/printrun-src/printrun/gui/viz.py Fri Jun 03 09:16:07 2016 +0200 @@ -0,0 +1,109 @@ +# This file is part of the Printrun suite. +# +# Printrun is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Printrun is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Printrun. If not, see <http://www.gnu.org/licenses/>. + +import traceback +import logging + +import wx + +class NoViz(object): + + showall = False + + def clear(self, *a): + pass + + def addfile_perlayer(self, gcode, showall = False): + layer_idx = 0 + while layer_idx < len(gcode.all_layers): + yield layer_idx + layer_idx += 1 + yield None + + def addfile(self, *a, **kw): + pass + + def addgcode(self, *a, **kw): + pass + + def addgcodehighlight(self, *a, **kw): + pass + + def Refresh(self, *a): + pass + + def setlayer(self, *a): + pass + +class NoVizWindow(object): + + def __init__(self): + self.p = NoViz() + + def Destroy(self): + pass + +class VizPane(wx.BoxSizer): + + def __init__(self, root, parentpanel = None): + super(VizPane, self).__init__(wx.VERTICAL) + if not parentpanel: parentpanel = root.panel + if root.settings.mainviz == "None": + root.gviz = NoViz() + root.gwindow = NoVizWindow() + return + use2dview = root.settings.mainviz == "2D" + if root.settings.mainviz == "3D": + try: + import printrun.gcview + root.gviz = printrun.gcview.GcodeViewMainWrapper(parentpanel, root.build_dimensions_list, root = root, circular = root.settings.circular_bed, antialias_samples = int(root.settings.antialias3dsamples)) + root.gviz.clickcb = root.show_viz_window + except: + use2dview = True + logging.error("3D view mode requested, but we failed to initialize it.\n" + + "Falling back to 2D view, and here is the backtrace:\n" + + traceback.format_exc()) + if use2dview: + from printrun import gviz + root.gviz = gviz.Gviz(parentpanel, (300, 300), + build_dimensions = root.build_dimensions_list, + grid = (root.settings.preview_grid_step1, root.settings.preview_grid_step2), + extrusion_width = root.settings.preview_extrusion_width, + bgcolor = root.bgcolor) + root.gviz.SetToolTip(wx.ToolTip(_("Click to examine / edit\n layers of loaded file"))) + root.gviz.showall = 1 + root.gviz.Bind(wx.EVT_LEFT_DOWN, root.show_viz_window) + use3dview = root.settings.viz3d + if use3dview: + try: + import printrun.gcview + objects = None + if isinstance(root.gviz, printrun.gcview.GcodeViewMainWrapper): + objects = root.gviz.objects + root.gwindow = printrun.gcview.GcodeViewFrame(None, wx.ID_ANY, 'Gcode view, shift to move view, mousewheel to set layer', size = (600, 600), build_dimensions = root.build_dimensions_list, objects = objects, root = root, circular = root.settings.circular_bed, antialias_samples = int(root.settings.antialias3dsamples)) + except: + use3dview = False + logging.error("3D view mode requested, but we failed to initialize it.\n" + + "Falling back to 2D view, and here is the backtrace:\n" + + traceback.format_exc()) + if not use3dview: + from printrun import gviz + root.gwindow = gviz.GvizWindow(build_dimensions = root.build_dimensions_list, + grid = (root.settings.preview_grid_step1, root.settings.preview_grid_step2), + extrusion_width = root.settings.preview_extrusion_width, + bgcolor = root.bgcolor) + root.gwindow.Bind(wx.EVT_CLOSE, lambda x: root.gwindow.Hide()) + if not isinstance(root.gviz, NoViz): + self.Add(root.gviz.widget, 1, flag = wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL)