From bb7e453bc4f9ea115fdc9b657e614a23e8b73a0f Mon Sep 17 00:00:00 2001 From: daid Date: Mon, 20 Feb 2012 16:44:43 +0100 Subject: [PATCH] Some more new UI updates. Not functional yet. UI no longer crashes if you don't have PyOpenGL. Start of UI using skeinforge settings. --- .../fabmetheus_utilities/settings.py | 9 ++-- SkeinPyPy_NewUI/newui/mainWindow.py | 53 +++++++++++++++++-- SkeinPyPy_NewUI/newui/preview3d.py | 46 ++++++++++------ .../skeinforge_profile.py | 2 +- 4 files changed, 84 insertions(+), 26 deletions(-) diff --git a/SkeinPyPy_NewUI/fabmetheus_utilities/settings.py b/SkeinPyPy_NewUI/fabmetheus_utilities/settings.py index 802994b..ab7fb5b 100644 --- a/SkeinPyPy_NewUI/fabmetheus_utilities/settings.py +++ b/SkeinPyPy_NewUI/fabmetheus_utilities/settings.py @@ -14,7 +14,7 @@ def loadGlobalConfig(filename): "Read a configuration file as global config" global globalConfigParser globalConfigParser = ConfigParser.ConfigParser() - print globalConfigParser.read(filename) + globalConfigParser.read(filename) def getDefaultConfigPath(): return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../current_config.ini")) @@ -29,7 +29,7 @@ def getReadRepository(repository): if not globals().has_key('globalConfigParser'): loadGlobalConfig(getDefaultConfigPath()) - print('getReadRepository:', repository.name) + #print('getReadRepository:', repository.name) for p in repository.preferences: try: p.setValueToString(globalConfigParser.get(repository.name, safeConfigName(p.name))) @@ -102,7 +102,7 @@ class RadioCapitalizedButton( Radio ): "Only used for the extra export options, which we are not using, so ignore the path for now" def getFromPath( self, latentStringVar, name, path, repository, value ): "Initialize." - print('RadioCapitalizedButton->getFromPath:', latentStringVar, name, path, repository, value ) + #print('RadioCapitalizedButton->getFromPath:', latentStringVar, name, path, repository, value ) self.name = name self.value = value repository.preferences.append(self) @@ -112,7 +112,6 @@ class FileNameInput(StringSetting ): "A class to display, read & write a fileName." def getFromFileName( self, fileTypes, name, repository, value ): #print('FileNameInput:getFromFileName:', self, fileTypes, name, repository, value ) - repository.preferences.append(self) self.name = name self.value = value return self @@ -151,7 +150,7 @@ class MenuRadio( BooleanSetting ): "A class to display, read & write a boolean with associated combo box selection." def getFromMenuButtonDisplay( self, menuButtonDisplay, name, repository, value ): "Initialize." - print('MenuRadio->getFromMenuButtonDisplay:', menuButtonDisplay, name, repository, value ) + #print('MenuRadio->getFromMenuButtonDisplay:', menuButtonDisplay, name, repository, value ) self.name = name self.value = value menuButtonDisplay.addRadio(self, value) diff --git a/SkeinPyPy_NewUI/newui/mainWindow.py b/SkeinPyPy_NewUI/newui/mainWindow.py index fa47d24..a74d7fe 100644 --- a/SkeinPyPy_NewUI/newui/mainWindow.py +++ b/SkeinPyPy_NewUI/newui/mainWindow.py @@ -4,6 +4,9 @@ import __init__ import wx from newui import preview3d +from fabmetheus_utilities import archive +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile def main(): app = wx.App(False) @@ -21,13 +24,38 @@ class mainWindow(wx.Frame): menubar.Append(wx.Menu(), 'Expert') self.SetMenuBar(menubar) + plugins = {} + for m in skeinforge_profile.getCraftTypePluginModule().getCraftSequence(): + plugins[m] = archive.getModuleWithDirectoryPath(archive.getCraftPluginsDirectoryPath(), m).getNewRepository() + settings.getReadRepository(plugins[m]) + p = wx.Panel(self) - nb = wx.Notebook(p, size=(400,10)) + nb = wx.Notebook(p, size=(500,10)) printConfig = wx.Panel(nb); - wx.StaticText(printConfig, -1, "Test", (20,20)) + + sizer = wx.GridBagSizer(2, 2) + printConfig.SetSizer(sizer) + + for pluginName in plugins.keys(): + box, configPanel = self.CreateGroup(printConfig, pluginName) + sizer.Add(box, (sizer.GetRows(),0)) + sizer.SetRows(sizer.GetRows()+1) + + for pref in plugins[pluginName].preferences: + self.AddSetting(configPanel, pref.name, wx.TextCtrl(configPanel, -1, str(pref))) + + #self.AddSetting(generalConfig, "Speed (mm/s)", wx.TextCtrl(generalConfig, -1, "50.0")) + + machineConfig = wx.Panel(nb); + sizer = wx.GridBagSizer(2, 2) + machineConfig.SetSizer(sizer) + box, dimensionsConfig = self.CreateGroup(machineConfig, "Dimensions") + self.AddSetting(dimensionsConfig, "Printer size (mm)", wx.TextCtrl(dimensionsConfig, -1, "205,205,200")) + sizer.Add(box, (0,0)) + nb.AddPage(printConfig, "Print") - nb.AddPage(wx.Panel(nb), "Machine") + nb.AddPage(machineConfig, "Machine") nb.AddPage(wx.Panel(nb), "Start/End-GCode") p3d = preview3d.myGLCanvas(p) @@ -36,7 +64,7 @@ class mainWindow(wx.Frame): sizer = wx.GridBagSizer() sizer.Add(nb, (0,0), span=(2,1), flag=wx.EXPAND) - sizer.Add(p3d, (0,1), flag=wx.EXPAND) + sizer.Add(p3d, (0,1), span=(1,1), flag=wx.EXPAND) sizer.Add(loadButton, (1,1)) sizer.AddGrowableCol(1) sizer.AddGrowableRow(0) @@ -48,6 +76,23 @@ class mainWindow(wx.Frame): self.Centre() self.Show(True) + def CreateGroup(self, panel, name): + retPanel = wx.Panel(panel) + sizer = wx.GridBagSizer(2, 2) + retPanel.SetSizer(sizer) + + box = wx.StaticBox(panel, -1, name) + sizer = wx.StaticBoxSizer(box, wx.VERTICAL) + sizer.Add(retPanel) + + return (sizer, retPanel) + + def AddSetting(self, panel, name, ctrl): + sizer = panel.GetSizer() + sizer.Add(wx.StaticText(panel, -1, name), (sizer.GetRows(),0), flag=wx.ALIGN_BOTTOM) + sizer.Add(ctrl, (sizer.GetRows(),1), flag=wx.ALIGN_BOTTOM|wx.EXPAND) + sizer.SetRows(sizer.GetRows()+1) + def OnQuit(self, e): self.Close() diff --git a/SkeinPyPy_NewUI/newui/preview3d.py b/SkeinPyPy_NewUI/newui/preview3d.py index c8f50aa..33ebb64 100644 --- a/SkeinPyPy_NewUI/newui/preview3d.py +++ b/SkeinPyPy_NewUI/newui/preview3d.py @@ -1,35 +1,45 @@ -from wxPython.glcanvas import wxGLCanvas -from wxPython.wx import * -from OpenGL.GLUT import * -from OpenGL.GLU import * -from OpenGL.GL import * +#from wxPython.glcanvas import wxGLCanvas +import wx import sys,math +from wx.glcanvas import GLCanvas +try: + from OpenGL.GLUT import * + from OpenGL.GLU import * + from OpenGL.GL import * + hasOpenGLlibs = True +except: + print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/" + hasOpenGLlibs = False + from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret from fabmetheus_utilities.vector3 import Vector3 -class myGLCanvas(wxGLCanvas): +class myGLCanvas(GLCanvas): def __init__(self, parent): - wxGLCanvas.__init__(self, parent,-1) - EVT_PAINT(self, self.OnPaint) - EVT_SIZE(self, self.OnSize) - EVT_ERASE_BACKGROUND(self, self.OnEraseBackground) - EVT_MOTION(self, self.OnMouseMotion) + GLCanvas.__init__(self, parent,-1) + wx.EVT_PAINT(self, self.OnPaint) + wx.EVT_SIZE(self, self.OnSize) + wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground) + wx.EVT_MOTION(self, self.OnMouseMotion) self.init = 0 self.triangleMesh = None - self.yaw = 0 - self.pitch = 80 + self.yaw = 30 + self.pitch = 60 self.zoom = 150 self.machineSize = Vector3(210, 210, 200) self.machineCenter = Vector3(100, 100, 0) - return def loadFile(self, filename): self.triangleMesh = fabmetheus_interpret.getCarving(filename) minZ = self.triangleMesh.getMinimumZ() min = self.triangleMesh.getCarveCornerMinimum() max = self.triangleMesh.getCarveCornerMaximum() + self.moveModel() + def moveModel(): + if self.triangleMesh == None: + return for v in self.triangleMesh.vertexes: v.z -= minZ v.x -= min.x + (max.x - min.x) / 2 @@ -40,7 +50,7 @@ class myGLCanvas(wxGLCanvas): def OnMouseMotion(self,e): if e.Dragging() and e.LeftIsDown(): self.yaw += e.GetX() - self.oldX - self.pitch += e.GetY() - self.oldY + self.pitch -= e.GetY() - self.oldY if self.pitch > 170: self.pitch = 170 if self.pitch < 10: @@ -59,7 +69,11 @@ class myGLCanvas(wxGLCanvas): return def OnPaint(self,event): - dc = wxPaintDC(self) + dc = wx.PaintDC(self) + if not hasOpenGLlibs: + dc.Clear() + dc.DrawText("No PyOpenGL installation found.\nNo preview window available.", 10, 10) + return self.SetCurrent() self.InitGL() self.OnDraw() diff --git a/SkeinPyPy_NewUI/skeinforge_application/skeinforge_utilities/skeinforge_profile.py b/SkeinPyPy_NewUI/skeinforge_application/skeinforge_utilities/skeinforge_profile.py index b26a208..fbdc972 100644 --- a/SkeinPyPy_NewUI/skeinforge_application/skeinforge_utilities/skeinforge_profile.py +++ b/SkeinPyPy_NewUI/skeinforge_application/skeinforge_utilities/skeinforge_profile.py @@ -18,7 +18,7 @@ def getProfileName(craftTypeName): return 'SkeinPyPy profile:' + craftTypeName def addListsToCraftTypeRepository(fileNameHelp, repository): - print('addListsToCraftTypeRepository:', fileNameHelp, repository) + #print('addListsToCraftTypeRepository:', fileNameHelp, repository) repository.name = fileNameHelp.split('.')[-2] repository.preferences = []