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
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
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
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
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