[Yt-svn] yt-commit r490 - trunk/yt/reason

mturk at wrangler.dreamhost.com mturk at wrangler.dreamhost.com
Sun May 18 10:26:11 PDT 2008


Author: mturk
Date: Sun May 18 10:26:10 2008
New Revision: 490
URL: http://yt.spacepope.org/changeset/490

Log:
Changed the projections to ask you for some simple projection information.

Started the work of doing a 2D profile setup, which will be constant across a
given profile.  (Although you can 'fire' new fields to be added.)

Shuffled around some functions.

Right now the profile setup is pretty poor with respect to code reuse...  I'm
going to take a look at this again later.

Give a shot at the projection dialog...



Added:
   trunk/yt/reason/Functions.py
Modified:
   trunk/yt/reason/App.py
   trunk/yt/reason/Notebook.py
   trunk/yt/reason/Windows.py
   trunk/yt/reason/__init__.py

Modified: trunk/yt/reason/App.py
==============================================================================
--- trunk/yt/reason/App.py	(original)
+++ trunk/yt/reason/App.py	Sun May 18 10:26:10 2008
@@ -266,71 +266,74 @@
 
     def _add_phase(self, event=None):
         MyID = wx.NewId()
-#        self.interpreter.shell.writeOut("\n")
-        o = self.get_output()
+        data_object = self.get_output()
         t = "Phase Plot"
         self.windows.append( \
             PhasePlotPage(parent=self.plot_panel.nb,
                           status_bar=self.status_bar,
-                          dataObject = o,
+                          data_object = data_object,
                           CreationID = MyID,
                           mw = self))
-#        self.interpreter.shell.writeOut("Adding phase plot\n")
         self.plot_panel.AddPlot(self.windows[-1], t, MyID)
         mylog.debug("Adding with ID: %s", MyID)
-#        self.interpreter.shell.push("\n")
 
     def _add_proj(self, event=None):
         MyID = wx.NewId()
-#        self.interpreter.shell.writeOut("\n")
-        o = self.get_output()
-        field = "Density"
+        data_object = self.get_output()
         width = 1.0
         unit = "1"
-        for i, ax in zip(range(3), 'xyz'):
-            t = "%s - Projection - %s" % (o.basename, ax)
-#            self.interpreter.shell.writeOut("Adding %s projection of %s\n" % (ax, o))
+        proj_setup = ProjectionSetup(data_object, self)
+        if not proj_setup.ShowModal() == wx.ID_OK:
+            proj_setup.Destroy()
+            return
+        field = proj_setup.field.GetStringSelection()
+        weight_field = proj_setup.weight_field.GetStringSelection()
+        if weight_field == "": weight_field = None
+        axes = []
+        for i, ax in enumerate('xyz'):
+            if not getattr(proj_setup,'%s_ax' % ax).GetValue(): continue
+            t = "%s - Projection - %s" % (data_object.basename, ax)
+            mylog.info("Adding %s projection of %s\n" % (ax, data_object))
             self.windows.append( \
                 ProjPlotPage(parent=self.plot_panel.nb,
                               status_bar=self.status_bar,
-                              outputfile = o,
+                              outputfile = data_object,
                               axis=i,
                               field = field,
+                              weight_field = weight_field,
                               mw = self, CreationID=MyID))
             self.plot_panel.AddPlot(self.windows[-1], t, MyID)
-            self._add_data_object("Proj: %s %s" % (o, ax),
+            wx.SafeYield(onlyIfNeeded = True)
+            self._add_data_object("Proj: %s %s" % (data_object, ax),
                                self.windows[-1].plot.data,
                                _ProjObjectMenuItems)
             print "Adding with ID:", MyID
         for w in self.windows[-3:]: w.ChangeWidth(1,'1')
-#        self.interpreter.shell.push("\n")
+        proj_setup.Destroy()
 
     def _add_slice(self, event=None):
-        wx.SafeYield()
         MyID = wx.NewId()
-#        self.interpreter.shell.writeOut("\n")
-        o = self.get_output()
+        data_object = self.get_output()
         field = "Density"
         width = 1.0
         unit = "1"
-        for i, ax in zip(range(3), 'xyz'):
-            wx.Yield()
-            t = "%s - Slice - %s" % (o.basename, ax)
-#            self.interpreter.shell.writeOut("Adding %s slice of %s\n" % (ax, o))
+        for i, ax in enumerate('xyz'):
+            t = "%s - Slice - %s" % (data_object.basename, ax)
+            mylog.info("Adding %s projection of %s\n" % (ax, data_object))
             self.windows.append( \
                 SlicePlotPage(parent=self.plot_panel.nb,
                               status_bar=self.status_bar,
-                              outputfile = o,
+                              outputfile = data_object,
                               axis=i,
                               field = field,
                               mw = self, CreationID=MyID))
             self.plot_panel.AddPlot(self.windows[-1], t, MyID)
-            self._add_data_object("Slice: %s %s" % (o, ax),
+            wx.SafeYield(onlyIfNeeded = True)
+            self._add_data_object("Slice: %s %s" % (data_object, ax),
                                self.windows[-1].plot.data,
                                _SliceObjectMenuItems)
             print "Adding with ID:", MyID
         for w in self.windows[-3:]: w.ChangeWidth(1,'1')
-#        self.interpreter.shell.push("\n")
 
     def get_output(self, event=None):
         # Figure out which outputs are selected
@@ -375,6 +378,7 @@
             print file
             self._add_static_output(file)
             #self.RefreshOutputs()
+            #print ChooseField(self.outputs[-1])
         dialog.Destroy()
 
     def OnOpenEditor(self, event):

Added: trunk/yt/reason/Functions.py
==============================================================================
--- (empty file)
+++ trunk/yt/reason/Functions.py	Sun May 18 10:26:10 2008
@@ -0,0 +1,84 @@
+"""
+Standalone functions which may or may not create and interact with windows,
+but not any subclassing of window objects.
+
+ at author: U{Matthew Turk<http://www.stanford.edu/~mturk/>}
+ at organization: U{KIPAC<http://www-group.slac.stanford.edu/KIPAC/>}
+ at contact: U{mturk at slac.stanford.edu<mailto:mturk at slac.stanford.edu>}
+ at license:
+  Copyright (C) 2007 Matthew Turk.  All Rights Reserved.
+
+  This file is part of yt.
+
+  yt 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.
+
+  This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from yt.reason import *
+
+def QueryFields(outputfile):
+    fields = []
+    for f in outputfile.hierarchy.derived_field_list:
+        if f in lagos.fieldInfo and lagos.fieldInfo[f].particle_type: continue
+        fields.append(f)
+    return sorted(fields)
+
+def ChooseField(data_object):
+    fields = QueryFields(data_object)
+    dlg = wx.SingleChoiceDialog(None,
+             'Which field?',
+             'Field Chooser (%s)' % data_object,
+             fields)
+    response = None
+    if dlg.ShowModal() == wx.ID_OK:
+        response = dlg.GetStringSelection()
+    if response == "":
+        response = None
+    return response
+
+def ChooseLimits(plot):
+    dlg = ReasonLimitInput(plot)
+    resp = dlg.ShowModal()
+    zmin, zmax = dlg.GetData()
+    dlg.Destroy()
+    return zmin, zmax
+
+def get_new_updateNamespace(my_locals):
+    def updateNamespace(self):
+        """Update the namespace for autocompletion and calltips.
+
+        Return True if updated, False if there was an error."""
+        if not self.interp or not hasattr(self.editor, 'getText'):
+            return False
+        syspath = sys.path
+        sys.path = self.syspath
+        text = self.editor.getText()
+        text = text.replace('\r\n', '\n')
+        text = text.replace('\r', '\n')
+        name = self.modulename or self.name
+        try:
+            try:
+                code = compile(text, name, 'exec')
+            except:
+                raise
+            try:
+                exec code in my_locals
+            except:
+                raise
+        finally:
+            sys.path = syspath
+            for m in sys.modules.keys():
+                if m not in self.modules:
+                    del sys.modules[m]
+    return updateNamespace
+

Modified: trunk/yt/reason/Notebook.py
==============================================================================
--- trunk/yt/reason/Notebook.py	(original)
+++ trunk/yt/reason/Notebook.py	Sun May 18 10:26:10 2008
@@ -323,9 +323,11 @@
         self.figure_canvas.Bind(wx.EVT_CONTEXT_MENU, self.OnShowContextMenu)
 
 class VMPlotPage(PlotPage):
-    def __init__(self, parent, status_bar, outputfile, axis, field="Density", mw=None, CreationID = -1):
+    def __init__(self, parent, status_bar, outputfile, axis, field="Density",
+                 weight_field = None, mw=None, CreationID = -1):
         self.outputfile = outputfile
         self.field = field
+        self.weight_field = weight_field
         self.axis = axis
         self.center = [0.5, 0.5, 0.5]
         self.AmDrawingCircle = False
@@ -623,23 +625,19 @@
             self.figure_canvas.draw()
         #else: print "Opting not to update canvas"
 
+    def QueryFields(self):
+        return QueryFields(self.outputfile)
+
 class SlicePlotPage(VMPlotPage):
     def makePlot(self):
         self.data = self.outputfile.hierarchy.slice(self.axis,
                                     self.center[self.axis], self.field, self.center)
         self.plot = be.SlicePlot(self.data, self.field, figure=self.figure, axes=self.axes)
 
-    def QueryFields(self):
-        fields = []
-        for f in self.outputfile.hierarchy.derived_field_list:
-            if f in lagos.fieldInfo and lagos.fieldInfo[f].particle_type: continue
-            fields.append(f)
-        return sorted(fields)
-
 class ProjPlotPage(VMPlotPage):
     def makePlot(self):
         self.data = self.outputfile.hierarchy.proj(self.axis,
-                                   self.field, weight_field=None,
+                                   self.field, weight_field=self.weight_field,
                                    center=self.center)
         self.plot = be.ProjectionPlot(self.data, self.field, figure=self.figure,
                                       axes=self.axes)
@@ -655,15 +653,24 @@
     def QueryFields(self):
         return [self.field]
 
+class NewPhasePlotPage(PlotPage):
+    def __init__(self, parent, status_bar, data_object, mw=None, CreationID = -1):
+        self.data_object = data_object
+
+        PlotPage.__init__(self, parent, status_bar, mw, CreationID)
+
+    def SetupControls(self):
+        self.ButtonPanel = wx.Panel(self, -1)
+
 class PhasePlotPage(PlotPage):
-    def __init__(self, parent, status_bar, dataObject, mw=None, CreationID = -1):
-        self.dataObject = dataObject
+    def __init__(self, parent, status_bar, data_object, mw=None, CreationID = -1):
+        self.data_object = data_object
 
         PlotPage.__init__(self, parent, status_bar, mw, CreationID)
 
     def SetupControls(self):
         self.ButtonPanel = wx.Panel(self, -1)
-        fs = self.GetFieldSelectors()
+        fs = self.QueryFields()
         self.FieldX = wx.Choice(self.ButtonPanel, -1, choices=fs, name="X")
         self.FieldX.SetSelection(0)
         self.FieldY = wx.Choice(self.ButtonPanel, -1, choices=fs, name="Y")
@@ -722,14 +729,9 @@
         self.SetSizer(self.MainSizer)
         self.Layout()
 
-    def QueryFields(self, *args, **kwargs):
-        return None
 
-    def GetFieldSelectors(self):
-        nativeFields = sorted(self.dataObject.hierarchy.field_list)
-        derivedFields = sorted([fk for fk in lagos.fieldInfo
-                                if not lagos.fieldInfo[fk].particle_type])
-        return nativeFields + [""] + derivedFields
+    def QueryFields(self):
+        return QueryFields(self.data_object)
 
     def makePlot(self, event=None):
         pass
@@ -749,7 +751,7 @@
         Z = self.FieldZ.GetStringSelection()
         W = self.FieldW.GetStringSelection()
         if len(W) == 0: W=None
-        self.plot = be.PhasePlot(self.dataObject, [X,Y,Z], weight = W,
+        self.plot = be.PhasePlot(self.data_object, [X,Y,Z], weight = W,
                                  figure = self.figure, axes = self.axes)
         self.UpdateCanvas()
 

Modified: trunk/yt/reason/Windows.py
==============================================================================
--- trunk/yt/reason/Windows.py	(original)
+++ trunk/yt/reason/Windows.py	Sun May 18 10:26:10 2008
@@ -26,38 +26,200 @@
 
 from yt.reason import *
 
-class ReasonInterpreterPanel(wx.Panel):
-    def __init__(self, parent, id, locals):
-        wx.Panel.__init__(self, parent, id)
-        self.shell = wx.py.shell.Shell(
-                           parent=self, id=-1, introText="Welcome to Reason.",
-                           locals=locals)
-        self.sizer = wx.BoxSizer(wx.VERTICAL)
-        self.sizer.Add(self.shell, 1, wx.EXPAND)
-        self.SetSizer(self.sizer)
+class Profile2DSetup(wx.Dialog):
+    def __init__(self, data_object, parent):
+        wx.Dialog.__init__(self, parent, -1, title="Setup 2D 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('64')
+        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)
+        
+        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, "Bin Count")
+        self.y_bins = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
+        self.y_bins.SetValue('64')
+        self.y_bc = wx.CheckBox(self, -1, "Auto-bounds")
+        self.y_bc.SetValue(True)
+        self.Bind(wx.EVT_CHECKBOX, self.OnToggleYBounds, self.y_bc)
+        self.y_min = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
+        self.y_max = wx.TextCtrl(self, -1, style=wx.TE_PROCESS_ENTER)
+        self.y_log = wx.CheckBox(self, -1, "Take Log")
+        self.y_log.SetValue(True)
+
+        gbs.Add(self.y_field, (0,0), (1,2))
+        gbs.Add(text, (1,0))
+        gbs.Add(self.y_bins, (1,1))
+        gbs.Add(self.y_bc, (2,0))
+        gbs.Add(self.y_min, (2,1))
+        gbs.Add(self.y_max, (3,1))
+        gbs.Add(self.y_log, (4,0))
+        box.Add(gbs, 1, wx.EXPAND | wx.ALL)
+        inner_border.Add(box, 1, wx.EXPAND)
+        inner_border.AddSpacer(15)
+
+        sbox = wx.StaticBox(self, -1, "Z Field Specifications")
+        box = wx.StaticBoxSizer(sbox, wx.VERTICAL)
+        gbs = wx.GridBagSizer(5, 5)
+        self.z_field = wx.Choice(self, -1, choices=fields, name="Y")
+        text = wx.StaticText(self, -1, "Weighting Field")
+        self.z_weight = wx.Choice(self, -1, choices=[''] + fields, name="Weight")
+        if "CellMassMsun" in fields: self.z_weight.Select(fields.index("CellMassMsun")+1)
+        self.z_accx = wx.CheckBox(self, -1, "X Accumulation")
+        self.z_accx.SetValue(False)
+        self.z_accy = wx.CheckBox(self, -1, "Y Accumulation")
+        self.z_accy.SetValue(False)
+
+        gbs.Add(self.z_field, (0,0), (1,2))
+        gbs.Add(text, (1,0))
+        gbs.Add(self.z_weight, (2,0), (1,2))
+        gbs.Add(self.z_accx, (3,0), (1,2))
+        gbs.Add(self.z_accy, (4,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)
+        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)
+        self.OnToggleYBounds(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)
+            if self.y_bc.GetValue():
+                self.y_bc.SetValue(False)
+                self.OnToggleYBounds(None)
+
+    def OnToggleXBounds(self, event):
+        self.__toggle(self.x_bc, self.x_min, self.x_max)
 
-def ChooseField(page):
-    allFields = page.QueryFields()
-    toChoose = nativeFields + [''] + derivedFields
-    dlg = wx.SingleChoiceDialog(None,
-             'Which field?',
-             'Field Chooser (%s)' % outputfile.basename,
-             toChoose)
-    response = None
-    if dlg.ShowModal() == wx.ID_OK:
-        response = dlg.GetStringSelection()
-    if response == "":
-        response = None
-    return response
-
-def ChooseLimits(plot):
-    dlg = ReasonLimitInput(plot)
-    resp = dlg.ShowModal()
-    zmin, zmax = dlg.GetData()
-    dlg.Destroy()
-    return zmin, zmax
+    def OnToggleYBounds(self, event):
+        self.__toggle(self.y_bc, self.y_min, self.y_max)
+
+    def return_argdict(self):
+        argdict = {}
+        try:
+            if self.lazy_reader.GetValue():
+                argdict['lazy_reader'] = True
+                argdict['x_bounds'] = (float(self.x_min.GetValue()),
+                                       float(self.x_max.GetValue()))
+                argdict['y_bounds'] = (float(self.y_min.GetValue()),
+                                       float(self.y_max.GetValue()))
+            else:
+                argdict['lazy_reader'] = False
+                argdict['x_bounds'] = None
+                argdict['y_bounds'] = None
+            argdict['x_log'] = self.x_log.GetValue()
+            argdict['y_log'] = self.y_log.GetValue()
+            argdict['x_bins'] = int(self.x_bins.GetValue())
+            argdict['y_bins'] = int(self.y_bins.GetValue())
+            argdict['fields'] = [str(x.GetStringSelection()) for x in 
+                                  [self.x_field, self.y_field, self.z_field]]
+            argdict['weight'] = str(self.z_weight.GetStringSelection())
+            if argdict['weight'] == '': argdict['weight'] = None
+        except ValueError:  
+            return None
+        return argdict
+
+class ProjectionSetup(wx.Dialog):
+    def __init__(self, data_object, parent):
+        wx.Dialog.__init__(self, parent, -1, title="Setup Projection")
+
+        fields = QueryFields(data_object)
+        
+        border = wx.BoxSizer(wx.VERTICAL)
+        gbs = wx.GridBagSizer(5, 5)
+        text = wx.StaticText(self, -1, "Projected Field")
+        self.field = wx.Choice(self, -1, choices=fields, name="Field")
+        if "Density" in fields: self.field.Select(fields.index("Density"))
+        gbs.Add(text, (0,0))
+        gbs.Add(self.field, (0,1))
+
+        text = wx.StaticText(self, -1, "Weighting Field")
+        self.weight_field = wx.Choice(self, -1, choices=[""]+fields,
+                                      name="Weight field")
+        gbs.Add(text, (1,0))
+        gbs.Add(self.weight_field, (1,1))
+
+        gbs.Add(wx.StaticText(self, -1, "Axes to Project"), (2,0),
+                flag = wx.ALIGN_CENTER | wx.ALL)
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        self.x_ax = wx.CheckBox(self, -1, "X")
+        self.y_ax = wx.CheckBox(self, -1, "Y")
+        self.z_ax = wx.CheckBox(self, -1, "Z")
+        for i in [self.x_ax, self.y_ax, self.z_ax]:
+            box.Add(i, 1, wx.EXPAND, border=5)
+            i.SetValue(True)
+        gbs.Add(box, (2,1), flag = wx.ALL | wx.EXPAND)
+
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        ok_button = wx.Button(self, wx.ID_OK, "OK")
+        ok_button.SetDefault()
+        cancel_button = wx.Button(self, wx.ID_CANCEL, "Cancel")
+        box.Add(ok_button, 1, wx.EXPAND)
+        box.Add(cancel_button, 1, wx.EXPAND)
+        gbs.Add(box, (3,1), flag=wx.EXPAND)
+
+        border.Add(gbs, 1, wx.EXPAND|wx.ALL, 25)
+        self.SetSizer(border)
+        self.Fit()
+        
 
 class ReasonParameterFileViewer(wx.Frame):
     def __init__(self, *args, **kwds):
@@ -186,35 +348,6 @@
         self.SetSizer(self.MainSizer)
         self.Layout()
 
-def get_new_updateNamespace(my_locals):
-    def updateNamespace(self):
-        """Update the namespace for autocompletion and calltips.
-
-        Return True if updated, False if there was an error."""
-        if not self.interp or not hasattr(self.editor, 'getText'):
-            return False
-        syspath = sys.path
-        sys.path = self.syspath
-        text = self.editor.getText()
-        text = text.replace('\r\n', '\n')
-        text = text.replace('\r', '\n')
-        name = self.modulename or self.name
-        try:
-            try:
-                code = compile(text, name, 'exec')
-            except:
-                raise
-            try:
-                exec code in my_locals
-            except:
-                raise
-        finally:
-            sys.path = syspath
-            for m in sys.modules.keys():
-                if m not in self.modules:
-                    del sys.modules[m]
-    return updateNamespace
-
 
 class ReasonEditorNotebookFrame(wx.py.editor.EditorNotebookFrame):
 

Modified: trunk/yt/reason/__init__.py
==============================================================================
--- trunk/yt/reason/__init__.py	(original)
+++ trunk/yt/reason/__init__.py	Sun May 18 10:26:10 2008
@@ -56,6 +56,7 @@
 import matplotlib.figure
 
 from LoggingSetup import *
+from Functions import *
 from Windows import *
 from Notebook import *
 from App import *



More information about the yt-svn mailing list