chiark / gitweb /
Add autoplace button to project planner
authorDaid <daid303@gmail.com>
Sat, 21 Apr 2012 18:45:53 +0000 (20:45 +0200)
committerDaid <daid303@gmail.com>
Sat, 21 Apr 2012 18:45:53 +0000 (20:45 +0200)
Cura/alterations/nextobject.gcode
Cura/gui/projectPlanner.py
Cura/util/stl.py

index b8c55e0e506446dafd737481e664e3d284c5419d..e977dc64542a99d698b16fe76cde55575cf0d4fa 100644 (file)
@@ -3,7 +3,7 @@ G92 E0
 G1 Z{clear_z} E-5 F{max_z_speed}
 G92 E0
 G1 X{machine_center_x} Y{machine_center_y} F{travel_speed}
-G1 F200 E7.5
+G1 F200 E6.5
 G92 E0
 G1 Z0 F{max_z_speed}
 
index 4de8b7782b40d70117f4a9d5fbc99f188fab29e5..e89ff36e106901936ea79e0cfb5870d3772bd8f9 100644 (file)
@@ -70,6 +70,7 @@ class projectPlanner(wx.Frame):
                self.addButton = wx.Button(self, -1, "Add")\r
                self.remButton = wx.Button(self, -1, "Remove")\r
                self.sliceButton = wx.Button(self, -1, "Slice")\r
+               self.autoPlaceButton = wx.Button(self, -1, "Auto Place")\r
                \r
                sizer.Add(self.toolbar, (0,0), span=(1,3), flag=wx.EXPAND)\r
                sizer.Add(self.preview, (1,0), span=(4,1), flag=wx.EXPAND)\r
@@ -77,12 +78,14 @@ class projectPlanner(wx.Frame):
                sizer.Add(self.addButton, (2,1), span=(1,1))\r
                sizer.Add(self.remButton, (2,2), span=(1,1))\r
                sizer.Add(self.sliceButton, (3,1), span=(1,1))\r
+               sizer.Add(self.autoPlaceButton, (3,2), span=(1,1))\r
                sizer.AddGrowableCol(0)\r
                sizer.AddGrowableRow(1)\r
                \r
                self.addButton.Bind(wx.EVT_BUTTON, self.OnAddModel)\r
                self.remButton.Bind(wx.EVT_BUTTON, self.OnRemModel)\r
                self.sliceButton.Bind(wx.EVT_BUTTON, self.OnSlice)\r
+               self.autoPlaceButton.Bind(wx.EVT_BUTTON, self.OnAutoPlace)\r
                self.listbox.Bind(wx.EVT_LISTBOX, self.OnListSelect)\r
 \r
                panel = wx.Panel(self, -1)\r
@@ -191,28 +194,78 @@ class projectPlanner(wx.Frame):
                self.preview.Refresh()\r
 \r
        def OnAddModel(self, e):\r
-               dlg=wx.FileDialog(self, "Open file to print", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)\r
+               dlg=wx.FileDialog(self, "Open file to print", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_MULTIPLE)\r
                dlg.SetWildcard("STL files (*.stl)|*.stl;*.STL")\r
                if dlg.ShowModal() == wx.ID_OK:\r
-                       item = stl.stlModel()\r
-                       item.filename=dlg.GetPath()\r
-                       profile.putPreference('lastFile', item.filename)\r
-                       if not(os.path.exists(item.filename)):\r
-                               return\r
-                       self.loadModelFile(item)\r
-                       self.list.append(item)\r
-                       self.listbox.AppendAndEnsureVisible(os.path.split(item.filename)[1])\r
-                       self.listbox.SetSelection(len(self.list)-1)\r
-                       self.OnListSelect(None)\r
+                       for filename in dlg.GetPaths():\r
+                               item = stl.stlModel()\r
+                               item.filename=filename\r
+                               profile.putPreference('lastFile', item.filename)\r
+                               if not(os.path.exists(item.filename)):\r
+                                       return\r
+                               self.loadModelFile(item)\r
+                               self.list.append(item)\r
+                               self.listbox.AppendAndEnsureVisible(os.path.split(item.filename)[1])\r
+                               self.listbox.SetSelection(len(self.list)-1)\r
+                               self.OnListSelect(None)\r
                dlg.Destroy()\r
        \r
        def OnRemModel(self, e):\r
                if self.selection == None:\r
                        return\r
                self.list.remove(self.selection)\r
-               self.listbox.Delete(self.listbox.GetSelection())\r
+               i = self.listbox.GetSelection()\r
+               self.listbox.Delete(i)\r
+               if len(self.list) > i:\r
+                       self.listbox.SetSelection(i)\r
+               elif len(self.list) > 0:\r
+                       self.listbox.SetSelection(len(self.list) - 1)\r
                self.selection = None\r
+               self.OnListSelect(None)\r
+               self.preview.Refresh()\r
+       \r
+       def OnAutoPlace(self, e):\r
+               bestAllowedSize = int(self.machineSize.y)\r
+               bestArea = self._doAutoPlace(bestAllowedSize)\r
+               for i in xrange(10, int(self.machineSize.y), 10):\r
+                       area = self._doAutoPlace(i)\r
+                       if area < bestArea:\r
+                               bestAllowedSize = i\r
+                               bestArea = area\r
+               self._doAutoPlace(bestAllowedSize)\r
                self.preview.Refresh()\r
+       \r
+       def _doAutoPlace(self, allowedSizeY):\r
+               posX = self.machineSize.x\r
+               posY = 0\r
+               minX = self.machineSize.x\r
+               minY = self.machineSize.y\r
+               maxX = 0\r
+               maxY = 0\r
+               dirX = -1\r
+               dirY = 1\r
+               for item in self.list:\r
+                       item.centerX = posX + item.getMaximum().x * item.scale * dirX\r
+                       item.centerY = posY + item.getMaximum().y * item.scale * dirY\r
+                       if item.centerY + item.getSize().y >= allowedSizeY:\r
+                               posX = minX - self.headSizeMax.x - 1\r
+                               posY = 0\r
+                               item.centerX = posX + item.getMaximum().x * item.scale * dirX\r
+                               item.centerY = posY + item.getMaximum().y * item.scale * dirY\r
+                       posY += item.getSize().y  * item.scale * dirY + self.headSizeMin.y + 1\r
+                       minX = min(minX, item.centerX - item.getSize().x * item.scale / 2)\r
+                       minY = min(minY, item.centerY - item.getSize().y * item.scale / 2)\r
+                       maxX = max(maxX, item.centerX + item.getSize().x * item.scale / 2)\r
+                       maxY = max(maxY, item.centerY + item.getSize().y * item.scale / 2)\r
+               \r
+               for item in self.list:\r
+                       item.centerX -= minX / 2\r
+                       item.centerY += (self.machineSize.y - maxY) / 2\r
+               \r
+               if minX < 0:\r
+                       return ((maxX - minX) + (maxY - minY)) * 100\r
+               \r
+               return (maxX - minX) + (maxY - minY)\r
 \r
        def OnSlice(self, e):\r
                oldProfile = profile.getGlobalProfileString()\r
@@ -544,6 +597,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
 class ProjectSliceProgressWindow(wx.Frame):\r
        def __init__(self, actionList, resultFilename):\r
                super(ProjectSliceProgressWindow, self).__init__(None, title='Cura')\r
+               self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))\r
+               \r
                self.actionList = actionList\r
                self.resultFilename = resultFilename\r
                self.abort = False\r
@@ -584,6 +639,8 @@ class ProjectSliceProgressWindow(wx.Frame):
                self.sizer.Add(self.progressGauge, (1, 0), flag=wx.EXPAND)\r
                self.sizer.Add(self.progressGauge2, (2, 0), flag=wx.EXPAND)\r
                self.sizer.Add(self.abortButton, (3,0), flag=wx.ALIGN_CENTER)\r
+               self.sizer.AddGrowableCol(0)\r
+               self.sizer.AddGrowableRow(0)\r
 \r
                self.Bind(wx.EVT_BUTTON, self.OnAbort, self.abortButton)\r
                self.SetSizer(self.sizer)\r
index 05e759ea22ef951e421dc319bdb7b725b0683e02..2a01adec878a2d0308cad7d2368031790dcb129b 100644 (file)
@@ -74,12 +74,15 @@ class stlModel():
                        maxv.z = max(maxv.z, v.z)
                self.min = minv
                self.max = maxv
+               self.size = maxv - minv
                return self.min.z
        
        def getMaximum(self):
                return self.max
        def getMinimum(self):
                return self.min
+       def getSize(self):
+               return self.size
 
 if __name__ == '__main__':
        for filename in sys.argv[1:]: