'Support_Material_Choice_': 'save',
'Support_Minimum_Angle_degrees': 'save',
},'skirt': {
- 'Activate_Skirt': 'save',
+ 'Skirt_line_count': 'save',
'Convex': 'ignore',
'Gap_Width_mm': 'save',
'Layers_To_index': 'ignore',
import wx\r
-import sys,math,threading\r
+import sys,math,threading,os\r
\r
from fabmetheus_utilities import settings\r
+from fabmetheus_utilities import archive\r
\r
class alterationPanel(wx.Panel):\r
def __init__(self, parent):\r
\r
self.alterationFileList = ['start.gcode', 'end.gcode', 'cool_start.gcode', 'cool_end.gcode']\r
\r
- self.textArea = wx.TextCtrl(self, style=wx.TE_MULTILINE)\r
+ self.textArea = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.TE_DONTWRAP|wx.TE_PROCESS_TAB)\r
+ self.textArea.SetFont(wx.Font(8, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))\r
self.list = wx.ListBox(self, choices=self.alterationFileList, style=wx.LB_SINGLE)\r
self.list.SetSelection(0)\r
self.Bind(wx.EVT_LISTBOX, self.OnSelect, self.list)\r
- self.OnSelect(None)\r
+ self.textArea.Bind(wx.EVT_KILL_FOCUS, self.OnFocusLost, self.textArea)\r
\r
sizer = wx.GridBagSizer()\r
sizer.Add(self.list, (0,0), span=(1,1), flag=wx.EXPAND)\r
sizer.AddGrowableCol(1)\r
sizer.AddGrowableRow(0)\r
self.SetSizer(sizer)\r
+ \r
+ self.loadFile(self.alterationFileList[self.list.GetSelection()])\r
\r
def OnSelect(self, e):\r
self.loadFile(self.alterationFileList[self.list.GetSelection()])\r
\r
def loadFile(self, filename):\r
self.textArea.SetValue(settings.getAlterationFile(filename))\r
+\r
+ def OnFocusLost(self, e):\r
+ filename = os.path.join(archive.getSkeinforgePath('alterations'), self.alterationFileList[self.list.GetSelection()])\r
+ f = open(filename, "w")\r
+ f.write(self.textArea.GetValue())\r
+ f.close()\r
self.AddTitle(configPanel, "Accuracy")
self.AddSetting(configPanel, "Layer height (mm)", self.plugins['carve'].preferencesDict['Layer_Height_mm'], 'Layer height in millimeters.\n0.2 is a good value for quick prints.\n0.1 gives high quality prints.')
- self.AddTitle(configPanel, "Skirt")
- self.AddSetting(configPanel, "Enable skirt", self.plugins['skirt'].preferencesDict['Activate_Skirt'])
- self.AddSetting(configPanel, "Skirt distance (mm)", self.plugins['skirt'].preferencesDict['Gap_Width_mm'])
self.AddTitle(configPanel, "Fill")
self.AddSetting(configPanel, "Solid layers", self.plugins['fill'].preferencesDict['Solid_Surface_Thickness_layers'])
self.AddSetting(configPanel, "Fill Density", self.plugins['fill'].preferencesDict['Infill_Solidity_ratio'])
+ self.AddTitle(configPanel, "Skirt")
+ self.AddSetting(configPanel, "Line count", self.plugins['skirt'].preferencesDict['Skirt_line_count'])
+ self.AddSetting(configPanel, "Start distance (mm)", self.plugins['skirt'].preferencesDict['Gap_Width_mm'])
self.AddTitle(configPanel, "Retraction")
self.AddSetting(configPanel, "Speed (mm/s)", self.plugins['dimension'].preferencesDict['Extruder_Retraction_Speed_mm/s'])
self.AddSetting(configPanel, "Distance (mm)", self.plugins['dimension'].preferencesDict['Retraction_Distance_millimeters'])
self.AddSetting(configPanel, "Minimal travel (mm)", self.plugins['dimension'].preferencesDict['Minimum_Travel_for_Retraction_millimeters'])
configPanel = wx.Panel(nb);
- nb.AddPage(configPanel, "Machine config")
+ nb.AddPage(configPanel, "Machine && Filament")
sizer = wx.GridBagSizer(2, 2)
configPanel.SetSizer(sizer)
sizer.Add(wx.StaticLine(panel), (sizer.GetRows()+1,1), (1,3), flag=wx.EXPAND)
sizer.SetRows(sizer.GetRows() + 2)
- def AddSetting(self, panel, name, setting, help = 'TODO'):
+ def AddSetting(self, panel, name, setting, help = 'Help: TODO'):
"Add a setting to the configuration panel"
sizer = panel.GetSizer()
sizer.Add(wx.StaticText(panel, -1, name), (sizer.GetRows(),1), flag=wx.ALIGN_CENTER_VERTICAL)
import wx\r
-import sys,math,threading\r
+import sys\r
+import math\r
+import threading\r
+import re\r
\r
from wx.glcanvas import GLCanvas\r
try:\r
self.moveModel()\r
self.Refresh()\r
\r
- def getCode(self, str, id):\r
- pos = str.find(id)\r
- if pos < 0:\r
- return '';\r
- posEnd = str.find(' ', pos)\r
- if posEnd < 0:\r
- return str[pos+1:]\r
- return str[pos+1:posEnd]\r
+ def getCodeInt(self, str, id):\r
+ m = re.search(id + '([^\s]+)', str)\r
+ if m == None:\r
+ return None\r
+ try:\r
+ return int(m.group(1))\r
+ except:\r
+ return None\r
+\r
+ def getCodeFloat(self, str, id):\r
+ m = re.search(id + '([^\s]+)', str)\r
+ if m == None:\r
+ return None\r
+ try:\r
+ return float(m.group(1))\r
+ except:\r
+ return None\r
\r
def DoGCodeLoad(self):\r
f = open(self.gcodeFilename, 'r')\r
pos = Vector3()\r
+ posOffset = Vector3()\r
currentE = 0\r
pathList = []\r
currentPath = {'type': 'move', 'list': [pos.copy()]}\r
+ scale = 1.0\r
+ posAbs = True\r
for line in f:\r
- G = self.getCode(line, 'G')\r
- if G != '':\r
- if G == '0' or G == '1':\r
- X = self.getCode(line, 'X')\r
- Y = self.getCode(line, 'Y')\r
- Z = self.getCode(line, 'Z')\r
- E = self.getCode(line, 'E')\r
- if X != '':\r
- pos.x = float(X)\r
- if X != '':\r
- pos.y = float(Y)\r
- if Z != '':\r
- pos.z = float(Z)\r
+ G = self.getCodeInt(line, 'G')\r
+ if G is not None:\r
+ if G == 0 or G == 1: #Move\r
+ x = self.getCodeFloat(line, 'X')\r
+ y = self.getCodeFloat(line, 'Y')\r
+ z = self.getCodeFloat(line, 'Z')\r
+ e = self.getCodeFloat(line, 'E')\r
+ if x is not None:\r
+ if posAbs:\r
+ pos.x = x * scale\r
+ else:\r
+ pos.x += x * scale\r
+ if y is not None:\r
+ if posAbs:\r
+ pos.y = y * scale\r
+ else:\r
+ pos.y += y * scale\r
+ if z is not None:\r
+ if posAbs:\r
+ pos.z = z * scale\r
+ else:\r
+ pos.z += z * scale\r
newPoint = pos.copy()\r
type = 'move'\r
- if E != '':\r
- newEvalue = float(E)\r
- if newEvalue > currentE:\r
+ if e is not None:\r
+ if e > currentE:\r
type = 'extrude'\r
- if newEvalue < currentE:\r
+ if e < currentE:\r
type = 'retract'\r
+ currentE = e\r
if currentPath['type'] != type:\r
pathList.append(currentPath)\r
currentPath = {'type': type, 'list': [currentPath['list'][-1]]}\r
currentPath['list'].append(newPoint)\r
+ elif G == 20: #Units are inches\r
+ scale = 25.4\r
+ elif G == 21: #Units are mm\r
+ scale = 1.0\r
+ elif G == 28: #Home\r
+ x = self.getCodeFloat(line, 'X')\r
+ y = self.getCodeFloat(line, 'Y')\r
+ z = self.getCodeFloat(line, 'Z')\r
+ if x is None and y is None and z is None:\r
+ pos = Vector3()\r
+ else:\r
+ if x is not None:\r
+ pos.x = 0.0\r
+ if y is not None:\r
+ pos.y = 0.0\r
+ if z is not None:\r
+ pos.z = 0.0\r
+ elif G == 90: #Absolute position\r
+ posAbs = True\r
+ elif G == 91: #Relative position\r
+ posAbs = False\r
+ elif G == 92:\r
+ x = self.getCodeFloat(line, 'X')\r
+ y = self.getCodeFloat(line, 'Y')\r
+ z = self.getCodeFloat(line, 'Z')\r
+ e = self.getCodeFloat(line, 'E')\r
+ if e is not None:\r
+ currentE = e\r
+ if x is not None:\r
+ posOffset.x = pos.x + x\r
+ if y is not None:\r
+ posOffset.y = pos.y + y\r
+ if z is not None:\r
+ posOffset.z = pos.z + z\r
else:\r
- print "Unknown G code:" + G\r
+ print "Unknown G code:" + str(G)\r
self.pathList = pathList\r
self.triangleMesh = None\r
self.Refresh()\r