[Yt-svn] yt-commit r512 - in trunk/yt: lagos reason

mturk at wrangler.dreamhost.com mturk at wrangler.dreamhost.com
Sat May 31 00:59:58 PDT 2008


Author: mturk
Date: Sat May 31 00:59:57 2008
New Revision: 512
URL: http://yt.spacepope.org/changeset/512

Log:
 * Added one-dprofiles to reason
 * Added write_out method to most/all 3D data objects (and reason)
 * Generalized subscriber method location
 * Fixed bug with subscribers being left active after termination
 * Started cleaning up the data-hierarchy a bit more.
 * Fixed projections with conversion factors for multiple projected fields

so much of this would be so much easier with traitsui...

closed #78



Modified:
   trunk/yt/lagos/BaseDataTypes.py
   trunk/yt/lagos/Profiles.py
   trunk/yt/reason/App.py
   trunk/yt/reason/Functions.py
   trunk/yt/reason/Notebook.py
   trunk/yt/reason/Windows.py

Modified: trunk/yt/lagos/BaseDataTypes.py
==============================================================================
--- trunk/yt/lagos/BaseDataTypes.py	(original)
+++ trunk/yt/lagos/BaseDataTypes.py	Sat May 31 00:59:57 2008
@@ -192,6 +192,21 @@
     def _generate_field_in_grids(self, fieldName):
         pass
 
+    _key_fields = None
+    def write_out(self, filename, fields=None, format="%0.16e"):
+        if fields is None: fields=sorted(self.data.keys())
+        if self._key_fields is None: raise ValueError
+        field_order = self._key_fields[:]
+        for field in field_order: self[field]
+        field_order += [field for field in fields if field not in field_order]
+        fid = open(filename,"w")
+        fid.write("\t".join(["#"] + field_order + ["\n"]))
+        field_data = na.array([self.data[field] for field in field_order])
+        for line in range(field_data.shape[1]):
+            field_data[:,line].tofile(fid, sep="\t", format=format)
+            fid.write("\n")
+        fid.close()
+
 class GridPropertiesMixin(object):
 
     def select_grids(self, level):
@@ -320,6 +335,7 @@
                  for grid in self._grids])
 
 class EnzoOrthoRayBase(Enzo1DData):
+    _key_fields = ['x','y','z','dx','dy','dz']
     def __init__(self, axis, coords, fields=None, pf=None, **kwargs):
         """
         Dimensionality is reduced to one, and an ordered list of points at an
@@ -359,6 +375,7 @@
         return gf[na.where(grid.child_mask[sl])]
 
 class Enzo2DData(EnzoData, GridPropertiesMixin):
+    _key_fields = ['x','y','z','dx','dy','dz']
     """
     Class to represent a set of :class:`EnzoData` that's 2-D in nature, and
     thus does not have as many actions as the 3-D data types.
@@ -665,6 +682,7 @@
         return na.where(k)
 
 class EnzoProjBase(Enzo2DData):
+    _key_fields = ['px','py','pdx','pdy']
     def __init__(self, axis, field, weight_field = None,
                  max_level = None, center = None, pf = None,
                  source=None, **kwargs):
@@ -801,7 +819,7 @@
         if self._weight is not None:
             field_data = field_data / coord_data[3,:].reshape((1,coord_data.shape[1]))
         else:
-            field_data *= convs
+            field_data *= convs[...,na.newaxis]
         mylog.info("Level %s done: %s final", \
                    level, coord_data.shape[1])
         dx = grids_to_project[0].dx# * na.ones(coord_data.shape[0], dtype='float64')
@@ -958,6 +976,7 @@
         return d
 
 class Enzo3DData(EnzoData, GridPropertiesMixin):
+    _key_fields = ['x','y','z','dx','dy','dz']
     """
     Class describing a cluster of data points, not necessarily sharing any
     particular attribute.

Modified: trunk/yt/lagos/Profiles.py
==============================================================================
--- trunk/yt/lagos/Profiles.py	(original)
+++ trunk/yt/lagos/Profiles.py	Sat May 31 00:59:57 2008
@@ -169,6 +169,15 @@
             inv_bin_indices[bin] = na.where(bin_indices == bin)
         return (mi, inv_bin_indices)
 
+    def write_out(self, filename, format="%0.16e"):
+        fid = open(filename,"w")
+        fields = [field for field in sorted(self._data.keys()) if field != "UsedBins"]
+        fid.write("\t".join(["#"] + fields + ["\n"]))
+        field_data = na.array([self._data[field] for field in fields])
+        for line in range(field_data.shape[1]):
+            field_data[:,line].tofile(fid, sep="\t", format=format)
+            fid.write("\n")
+        fid.close()
 
 class BinnedProfile2D(BinnedProfile):
     def __init__(self, data_source,
@@ -266,3 +275,19 @@
         bin_indices_y = na.digitize(sd_y, self[self.y_bin_field])
         # Now we set up our inverse bin indices
         return (mi, bin_indices_x, bin_indices_y)
+
+    def write_out(self, filename, format="%0.16e"):
+        fid = open(filename,"w")
+        fields = [field for field in sorted(self._data.keys()) if field != "UsedBins"]
+        fid.write("\t".join(["#"] + [self.x_bin_field, self.y_bin_field]
+                          + fields + ["\n"]))
+        x,y = na.meshgrid(self._data[self.y_bin_field],
+                          self._data[self.y_bin_field])
+        field_data = [x.ravel(), y.ravel()]
+        field_data += [self._data[field].ravel() for field in fields
+                       if field not in [self.x_bin_field, self.y_bin_field]]
+        field_data = na.array(field_data)
+        for line in range(field_data.shape[1]):
+            field_data[:,line].tofile(fid, sep="\t", format=format)
+            fid.write("\n")
+        fid.close()

Modified: trunk/yt/reason/App.py
==============================================================================
--- trunk/yt/reason/App.py	(original)
+++ trunk/yt/reason/App.py	Sat May 31 00:59:57 2008
@@ -26,11 +26,12 @@
 
 from yt.reason import *
 
-_StaticOutputMenuItems = ["proj","slice"]
-_SphereObjectMenuItems = ["phase","cutting"]
-_ProjObjectMenuItems = []
+_StaticOutputMenuItems = ["proj","slice","export",]
+_SphereObjectMenuItems = ["phase","profile","cutting","export",]
+_ProjObjectMenuItems = ["export",]
 _SliceObjectMenuItems = []
-_CuttingPlaneObjectMenuItems = []
+_CuttingPlaneObjectMenuItems = ["export",]
+_ProfileObjectMenuItems = ["export",]
 
 class ReasonMainWindow(wx.Frame):
     def __init__(self, *args, **kwds):
@@ -54,6 +55,7 @@
         self.__do_layout()
 
         Publisher().subscribe(self.MessagePageDeleted, ('page_deleted'))
+        self.Bind(wx.EVT_CLOSE, self.OnClose)
 
     def __setup_controls(self):
 
@@ -83,6 +85,7 @@
                        'mainwindow':self,
                        'data_objects':self.data_objects,
                        'pylab':pylab,
+                       'add_profile':self.__add_profile_wrapper,
                        'add_phase':self.__add_phase_wrapper}
         wx.py.buffer.Buffer.updateNamespace = \
                 get_new_updateNamespace(self.locals)
@@ -120,13 +123,20 @@
         self.PopupMenuIds["slice"] = self.PopupMenu.Append(-1, "Slice")
         self.PopupMenuIds["proj"] = self.PopupMenu.Append(-1, "Project")
         self.PopupMenuIds["phase"] = self.PopupMenu.Append(-1, "Phase Plot")
+        self.PopupMenuIds["profile"] = self.PopupMenu.Append(-1, "Profile Plot")
         self.PopupMenuIds["cutting"] = self.PopupMenu.Append(-1, "Cutting Plane")
         self.PopupMenuIds["extract"] = self.PopupMenu.Append(-1, "Extract Set")
+        self.PopupMenuIds["cube"] = self.PopupMenu.Append(-1, "Extract Cube")
+        self.PopupMenuIds["export"] = self.PopupMenu.Append(-1, "Export Data")
 
         self.Bind(wx.EVT_MENU, self._add_slice, self.PopupMenuIds["slice"])
         self.Bind(wx.EVT_MENU, self._add_proj, self.PopupMenuIds["proj"])
         self.Bind(wx.EVT_MENU, self._add_phase, self.PopupMenuIds["phase"])
+        self.Bind(wx.EVT_MENU, self._add_profile, self.PopupMenuIds["profile"])
         self.Bind(wx.EVT_MENU, self._add_cutting, self.PopupMenuIds["cutting"])
+        #self.Bind(wx.EVT_MENU, self._extract_set, self.PopupMenuIds["extract"])
+        #self.Bind(wx.EVT_MENU, self._extract_cube, self.PopupMenuIds["cube"])
+        self.Bind(wx.EVT_MENU, self._export_data_object, self.PopupMenuIds["export"])
 
     def __setup_data_tree(self):
 
@@ -253,6 +263,7 @@
             z = str(eso["CosmologyCurrentRedshift"])
         except:
             z = "N/A"
+        mylog.info("Adding output %s", fn)
         tid = wx.TreeItemData((eso, str(eso["InitialTime"]), z, _StaticOutputMenuItems))
         self.outputs.append(eso)
         ni = self.data_tree.AppendItem(self.output_root, "%s" % (eso.basename), data=tid)
@@ -269,6 +280,12 @@
         # These all get passed in
         self._add_data_object(title, sphere, _SphereObjectMenuItems)
 
+    def __add_profile_wrapper(self, obj):
+        """
+        Add a profile plot from an arbitrary object.
+        """
+        pass
+
     def __add_phase_wrapper(self, obj):
         """
         Add a phase plot from an arbitrary object.
@@ -282,8 +299,40 @@
         wx.SafeYield(onlyIfNeeded = True)
         self.plot_panel.UpdateSubscriptions(page)
 
+    def _add_profile(self, event=None, data_object = None):
+        MyID = wx.NewId()
+        parent_id = None
+        if data_object is None: parent_id, data_object = self.get_output()
+        p1ds = Profile1DSetup(data_object, self)
+        if not p1ds.ShowModal() == wx.ID_OK:
+            p1ds.Destroy()
+            return
+        argdict = p1ds.return_argdict()
+        if argdict is None:
+            p1ds.Destroy()
+            return
+        if argdict['lower_bound']is None:
+           argdict['lower_bound']= \
+                self.__find_min(data_object, argdict['bin_field'])
+        if argdict['upper_bound'] is None:
+           argdict['upper_bound'] = \
+                self.__find_max(data_object, argdict['bin_field'])
+        self._add_page_to_notebook(
+            Profile1DPlotPage(parent=self.plot_panel.nb,
+                            status_bar=self.status_bar,
+                            data_object = data_object,
+                            argdict = argdict, CreationID = MyID,
+                            mw = self),
+            "Profile Plot %s" % MyID, MyID)
+        if parent_id is not None:
+            self._add_data_object("Profile: %s" % (argdict['bin_field']),
+                               self.windows[-1].plot.data,
+                               _ProfileObjectMenuItems, parent_id)
+
+
     def _add_phase(self, event=None, data_object = None):
         MyID = wx.NewId()
+        parent_id = None
         if data_object is None: parent_id, data_object = self.get_output()
         p2ds = Profile2DSetup(data_object, self)
         if not p2ds.ShowModal() == wx.ID_OK:
@@ -307,6 +356,12 @@
                           argdict = argdict, CreationID = MyID,
                           mw = self),
             "Phase Plot %s" % MyID, MyID)
+        if parent_id is not None:
+            self.pid = parent_id
+            self._add_data_object("Phase: %s, %s" % (argdict['x_bin_field'],
+                                                 argdict['y_bin_field']),
+                               self.windows[-1].plot.data,
+                               _ProfileObjectMenuItems, parent_id)
 
     def __find_min(self, data_object, field):
         return data_object[field].min()
@@ -340,7 +395,7 @@
                               mw = self, CreationID=MyID),
                 "%s - Projection - %s" % (data_object.basename, ax),
                 MyID)
-            self._add_data_object("Proj: %s %s" % (data_object, ax),
+            self._add_data_object("Proj: %s %s" % (data_object.parameter_file, ax),
                                self.windows[-1].plot.data,
                                _ProjObjectMenuItems, parent_id)
             print "Adding with ID:", MyID
@@ -367,6 +422,25 @@
                                _SliceObjectMenuItems, parent_id)
         for w in self.windows[-3:]: w.ChangeWidth(1,'1')
 
+    def _export_data_object(self, event):
+        parent_id, data_object = self.get_output()
+        # Get a file name and then attempt to export.
+        dlg = wx.FileDialog( \
+            self, message="Save Data As ...", defaultDir=os.getcwd(), \
+            defaultFile="exported.dat", wildcard="dat (*.dat)|*.dat", style=wx.SAVE)
+        if dlg.ShowModal() == wx.ID_OK:
+            try:
+                path = dlg.GetPath()
+                data_object.write_out(path)
+            except (ValueError, AttributeError), exc:
+                print exc, dir(exc)
+                err = wx.MessageDialog(None, "Error",
+                                "The writing out has failed.\n\n" + \
+                                "See the console for more information.")
+                err.ShowModal()
+                err.Destroy()
+        dlg.Destroy()
+
     def __add_cutting_wrapper(self, parameter_file, normal):
         self._add_cutting(parameter_file=parameter_file, normal=normal)
 
@@ -425,6 +499,10 @@
     def OnExit(self, event):
         self.Close()
 
+    def OnClose(self, event):
+        Publisher().unsubAll()
+        self.Destroy()
+
     def OnInspectFields(self, event):
         p = FieldFunctionInspector(self, -1)
         p.Show()
@@ -436,10 +514,7 @@
                                "", wildcard, wx.OPEN)
         if dialog.ShowModal() == wx.ID_OK:
             file = dialog.GetPath()
-            print file
             self._add_static_output(file)
-            #self.RefreshOutputs()
-            #print ChooseField(self.outputs[-1])
         dialog.Destroy()
 
     def OnOpenEditor(self, event):

Modified: trunk/yt/reason/Functions.py
==============================================================================
--- trunk/yt/reason/Functions.py	(original)
+++ trunk/yt/reason/Functions.py	Sat May 31 00:59:57 2008
@@ -26,6 +26,14 @@
 
 from yt.reason import *
 
+subscription_pairs = [("width","ChangeWidthFromMessage"),
+                      ("field","ChangeFieldFromMessage"),
+                      ("limits","ChangeLimitsFromMessage"),
+                      ("center","ChangeCenterFromMessage"),
+                      ("field_param","ChangeFieldParamFromMessage"),
+                      ("wipe","WipePlotDataFromMessage"),
+                      ("cmap","ChangeColorMapFromMessage")]
+
 def QueryFields(outputfile, only_display_fields = False):
     fields = []
     for f in outputfile.hierarchy.derived_field_list:

Modified: trunk/yt/reason/Notebook.py
==============================================================================
--- trunk/yt/reason/Notebook.py	(original)
+++ trunk/yt/reason/Notebook.py	Sat May 31 00:59:57 2008
@@ -68,14 +68,7 @@
         Publisher().sendMessage("page_changed",page)
 
     def UpdateSubscriptions(self, page):
-        pairs = [("width","ChangeWidthFromMessage"),
-                 ("field","ChangeFieldFromMessage"),
-                 ("limits","ChangeLimitsFromMessage"),
-                 ("center","ChangeCenterFromMessage"),
-                 ("field_param","ChangeFieldParamFromMessage"),
-                 ("wipe","WipePlotDataFromMessage"),
-                 ("cmap","ChangeColorMapFromMessage")]
-        for m,f in pairs:
+        for m,f in subscription_pairs:
             Publisher().unsubAll(("viewchange",m))
         if not hasattr(page,'CreationID'): return
         cti = page.CreationID
@@ -90,7 +83,7 @@
         else: toSubscribe.append(page)
         for p in toSubscribe:
             Publisher().subscribe(self.MessageLogger)
-            for m, f in pairs:
+            for m, f in subscription_pairs:
                 ff = getattr(p,f)
                 if ff is None: continue
                 Publisher().subscribe(ff, ('viewchange',m))
@@ -723,8 +716,9 @@
         self.velocities.Enable(False)
         self.particles.Enable(False)
 
-class PhasePlotPage(PlotPage):
-    def __init__(self, parent, status_bar, data_object, argdict, mw=None, CreationID = -1):
+class ProfilePlotPage(PlotPage):
+    def __init__(self, parent, status_bar, data_object, argdict, mw=None,
+                 CreationID = -1):
         self.data_object = data_object
         self.argdict = argdict
 
@@ -743,7 +737,6 @@
         PlotPage.SetupMenu(self)
         self.popupmenu.AppendSeparator()
         self.take_log_menu = self.popupmenu.AppendCheckItem(-1, "Take Log")
-        self.take_log_menu.Check(self.plot._log_z)
 
         self.Bind(wx.EVT_MENU, self.take_log, self.take_log_menu)
 
@@ -761,6 +754,66 @@
         self.SetSizer(self.MainSizer)
         self.Layout()
 
+    def UpdateAvailableFields(self):
+        self.z_field.SetItems(sorted(self.QueryAvailableFields()))
+
+    def switch_z(self, event=None):
+        if self.plot is None: return
+        self.plot.switch_z(self.z_field.GetStringSelection())
+        self.UpdateCanvas()
+
+    def UpdateCanvas(self, only_fig=False):
+        if self.IsShown():
+            if not only_fig: self.plot._redraw_image()
+            self.figure_canvas.draw()
+
+    def take_log(self, event):
+        self.plot.set_log_field(self.take_log_menu.IsChecked())
+        self.UpdateCanvas()
+
+class Profile1DPlotPage(ProfilePlotPage):
+    def AddField(self, event=None):
+        pf1daf = Profile1DAddField(self.data_object, self)
+        if pf1daf.ShowModal() == wx.ID_OK:
+            argdict = pf1daf.return_argdict()
+            if argdict is None:
+                pf1daf.Destroy()
+                self.UpdateAvailableFields()
+                return
+            self.data.add_fields(**argdict)
+            self.UpdateAvailableFields()
+            self.z_field.SetSelection(
+                    self.z_field.GetItems().index(argdict['fields']))
+            self.switch_z()
+        pf1daf.Destroy()
+
+    def SetupMenu(self):
+        ProfilePlotPage.SetupMenu(self)
+        self.take_log_menu.Check(self.plot._log_y)
+
+    def QueryAvailableFields(self):
+        fields = []
+        for field in self.data.keys():
+            if field != self.data.bin_field:
+                fields.append(field)
+        return fields
+
+    def makePlot(self, event=None):
+        self.data = lagos.BinnedProfile1D(self.data_object, **self.argdict)
+        self.data.pf = self.data_object.pf
+        self.data.hierarchy = self.data_object.pf.h
+        # Now, unfortunately, we prompt for the field
+        self.AddField(None)
+        self.plot = be.Profile1DPlot(self.data, 
+                                [self.argdict['bin_field'],
+                                 self.z_field.GetStringSelection()],
+                                 id = wx.NewId(),
+                                 figure=self.figure, axes=self.axes)
+
+    def UpdateStatusBar(self, event):
+        pass
+
+class PhasePlotPage(ProfilePlotPage):
     def AddField(self, event=None):
         pf2daf = Profile2DAddField(self.data_object, self)
         if pf2daf.ShowModal() == wx.ID_OK:
@@ -776,6 +829,10 @@
             self.switch_z()
         pf2daf.Destroy()
 
+    def SetupMenu(self):
+        ProfilePlotPage.SetupMenu(self)
+        self.take_log_menu.Check(self.plot._log_z)
+
     def makePlot(self, event=None):
         self.data = lagos.BinnedProfile2D(self.data_object, **self.argdict)
         self.data.pf = self.data_object.pf
@@ -806,9 +863,6 @@
         yi = na.digitize(na.array([y]), self.plot.y_bins)-1
         return self.plot.vals[yi, xi]
 
-    def UpdateAvailableFields(self):
-        self.z_field.SetItems(sorted(self.QueryAvailableFields()))
-
     def QueryAvailableFields(self):
         fields = []
         for field in self.data.keys():
@@ -817,20 +871,6 @@
                 fields.append(field)
         return fields
 
-    def take_log(self, event):
-        self.plot.set_log_field(self.take_log_menu.IsChecked())
-        self.UpdateCanvas()
-
-    def switch_z(self, event=None):
-        if self.plot is None: return
-        self.plot.switch_z(self.z_field.GetStringSelection())
-        self.UpdateCanvas()
-
-    def UpdateCanvas(self, only_fig=False):
-        if self.IsShown():
-            if not only_fig: self.plot._redraw_image()
-            self.figure_canvas.draw()
-
     def ChangeLimits(self, zmin, zmax):
         self.plot.set_zlim(zmin,zmax)
         self.figure_canvas.draw()

Modified: trunk/yt/reason/Windows.py
==============================================================================
--- trunk/yt/reason/Windows.py	(original)
+++ trunk/yt/reason/Windows.py	Sat May 31 00:59:57 2008
@@ -26,6 +26,148 @@
 
 from yt.reason import *
 
+class Profile1DAddField(wx.Dialog):
+    def __init__(self, data_object, parent):
+        wx.Dialog.__init__(self, parent, -1, title="Add Field to 1D Profile")
+
+        fields = [field for field in QueryFields(data_object)
+                  if field not in [parent.data.bin_field,
+                        parent.data.keys()]]
+        
+        border = wx.BoxSizer(wx.VERTICAL)
+        inner_border = wx.BoxSizer(wx.VERTICAL)
+
+        sbox = wx.StaticBox(self, -1, "Y Field Specifications")
+        box = wx.StaticBoxSizer(sbox, wx.VERTICAL)
+        gbs = wx.GridBagSizer(5, 5)
+        self.y_field = wx.Choice(self, -1, choices=fields, name="Y")
+        text = wx.StaticText(self, -1, "Weighting Field")
+        self.y_weight = wx.Choice(self, -1, choices=[''] + fields, name="Weight")
+        if "CellMassMsun" in fields: self.y_weight.Select(fields.index("CellMassMsun")+1)
+        self.y_accx = wx.CheckBox(self, -1, "X Accumulation")
+        self.y_accx.SetValue(False)
+
+        gbs.Add(self.y_field, (0,0), (1,2))
+        gbs.Add(text, (1,0))
+        gbs.Add(self.y_weight, (2,0), (1,2))
+        gbs.Add(self.y_accx, (3,0), (1,2))
+        box.Add(gbs, 1, wx.EXPAND | wx.ALL)
+        inner_border.Add(box, 1, wx.EXPAND)
+        inner_border.AddSpacer(15)
+
+        gbs = wx.GridBagSizer(5,5)
+        ok_button = wx.Button(self, wx.ID_OK, "OK")
+        ok_button.SetDefault()
+        cancel_button = wx.Button(self, wx.ID_CANCEL, "Cancel")
+        gbs.Add(ok_button, (1,0), flag=wx.EXPAND)
+        gbs.Add(cancel_button, (1,1), flag=wx.EXPAND)
+        inner_border.Add(gbs, 0, wx.EXPAND)
+        
+        border.Add(inner_border, 1, wx.EXPAND|wx.ALL, 25)
+        self.SetSizer(border)
+        self.Fit()
+
+    def return_argdict(self):
+        argdict = {}
+        try:
+            argdict['fields'] = str(self.y_field.GetStringSelection())
+            argdict['weight'] = str(self.y_weight.GetStringSelection())
+            argdict['accumulation'] = self.y_accx.GetValue()
+            if argdict['weight'] == '': argdict['weight'] = None
+        except ValueError:  
+            return None
+        return argdict
+
+class Profile1DSetup(wx.Dialog):
+    def __init__(self, data_object, parent):
+        wx.Dialog.__init__(self, parent, -1, title="Setup 1D Profile")
+
+        fields = QueryFields(data_object)
+        
+        border = wx.BoxSizer(wx.VERTICAL)
+        inner_border = wx.BoxSizer(wx.VERTICAL)
+
+        sbox = wx.StaticBox(self, -1, "X Field Specifications")
+        box = wx.StaticBoxSizer(sbox, wx.VERTICAL)
+        gbs = wx.GridBagSizer(5, 5)
+        self.x_field = wx.Choice(self, -1, choices=fields, name="X")
+        text = wx.StaticText(self, -1, "Bin Count")
+        self.x_bins = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
+        self.x_bins.SetValue('16')
+        self.x_bc = wx.CheckBox(self, -1, "Auto-bounds")
+        self.x_bc.SetValue(True)
+        self.Bind(wx.EVT_CHECKBOX, self.OnToggleXBounds, self.x_bc)
+        self.x_min = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
+        self.x_max = wx.TextCtrl(self, -1, style=wx.TE_PROCESS_ENTER)
+        self.x_log = wx.CheckBox(self, -1, "Take Log")
+        self.x_log.SetValue(True)
+
+        gbs.Add(self.x_field, (0,0), (1,2))
+        gbs.Add(text, (1,0))
+        gbs.Add(self.x_bins, (1,1))
+        gbs.Add(self.x_bc, (2,0))
+        gbs.Add(self.x_min, (2,1))
+        gbs.Add(self.x_max, (3,1))
+        gbs.Add(self.x_log, (4,0))
+        box.Add(gbs, 1, wx.EXPAND | wx.ALL)
+        inner_border.Add(box, 1, wx.EXPAND)
+        inner_border.AddSpacer(15)
+        
+        gbs = wx.GridBagSizer(5,5)
+        self.lazy_reader = wx.CheckBox(self, -1, "Memory Conservative")
+        self.Bind(wx.EVT_CHECKBOX, self.OnToggleLaziness, self.lazy_reader)
+        ok_button = wx.Button(self, wx.ID_OK, "OK")
+        ok_button.SetDefault()
+        cancel_button = wx.Button(self, wx.ID_CANCEL, "Cancel")
+        gbs.Add(self.lazy_reader, (0,0), (1,2), flag=wx.ALIGN_LEFT)
+        gbs.Add(ok_button, (1,0), flag=wx.EXPAND)
+        gbs.Add(cancel_button, (1,1), flag=wx.EXPAND)
+        inner_border.Add(gbs, 0, wx.EXPAND)
+        
+        self.OnToggleXBounds(None)
+
+        border.Add(inner_border, 1, wx.EXPAND|wx.ALL, 25)
+        self.SetSizer(border)
+        self.Fit()
+
+    def __toggle(self, b,mi,ma):
+        en = b.GetValue()
+        mi.Enable(not en)
+        ma.Enable(not en)
+        if en:
+            mi.SetValue("Min")
+            ma.SetValue("Max")
+        else:
+            mi.SetValue("")
+            ma.SetValue("")
+
+    def OnToggleLaziness(self, event):
+        if self.lazy_reader.GetValue():
+            if self.x_bc.GetValue():
+                self.x_bc.SetValue(False)
+                self.OnToggleXBounds(None)
+
+    def OnToggleXBounds(self, event):
+        self.__toggle(self.x_bc, self.x_min, self.x_max)
+
+    def return_argdict(self):
+        argdict = {}
+        try:
+            if self.lazy_reader.GetValue():
+                argdict['lazy_reader'] = True
+                argdict['lower_bound'] = float(self.x_min.GetValue())
+                argdict['upper_bound'] = float(self.x_max.GetValue())
+            else:
+                argdict['lazy_reader'] = False
+                argdict['lower_bound'] = None
+                argdict['upper_bound'] = None
+            argdict['log_space'] = self.x_log.GetValue()
+            argdict['n_bins'] = int(self.x_bins.GetValue())
+            argdict['bin_field'] = str(self.x_field.GetStringSelection())
+        except ValueError:  
+            return None
+        return argdict
+
 class Profile2DAddField(wx.Dialog):
     def __init__(self, data_object, parent):
         wx.Dialog.__init__(self, parent, -1, title="Add Field to 2D Profile")
@@ -212,6 +354,12 @@
             return None
         return argdict
 
+class ExtractSetSetup(wx.Dialog):
+    pass
+
+class ExtractCubeSetup(wx.Dialog):
+    pass
+
 class ProjectionSetup(wx.Dialog):
     def __init__(self, data_object, parent):
         wx.Dialog.__init__(self, parent, -1, title="Setup Projection")



More information about the yt-svn mailing list