From 79ef4ac2b6742d8600259bced3c38c7e9f202725 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 4 May 2012 11:47:55 +0200 Subject: [PATCH 1/5] There is no perfect solution for #90, but this makes it a bit better. --- Cura/gui/gcodeTextArea.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cura/gui/gcodeTextArea.py b/Cura/gui/gcodeTextArea.py index 3c023325..68d05249 100644 --- a/Cura/gui/gcodeTextArea.py +++ b/Cura/gui/gcodeTextArea.py @@ -19,6 +19,8 @@ class GcodeTextArea(wx.stc.StyledTextCtrl): self.IndicatorSetForeground(0, "#0000FF") self.IndicatorSetStyle(1, wx.stc.STC_INDIC_SQUIGGLE) self.IndicatorSetForeground(1, "#FF0000") + self.SetWrapMode(wx.stc.STC_WRAP_NONE) + self.SetScrollWidth(1000) #GCodes and MCodes as supported by Marlin #GCode 21 is not really supported by Marlin, but we still do not report it as error as it's often used. From f437bc38eb143a86bb2d7a44d957da34d2188106 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 4 May 2012 12:03:08 +0200 Subject: [PATCH 2/5] Remove duplicate code. --- Cura/gui/projectPlanner.py | 26 ++------------------------ Cura/gui/sliceProgessPanel.py | 25 ++----------------------- Cura/util/sliceRun.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 47 deletions(-) diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py index a198a76d..97b9bbc8 100644 --- a/Cura/gui/projectPlanner.py +++ b/Cura/gui/projectPlanner.py @@ -636,28 +636,6 @@ class ProjectSliceProgressWindow(wx.Frame): self.startTime = time.time() self.sliceStartTime = time.time() - #How long does each step take compared to the others. This is used to make a better scaled progress bar, and guess time left. - # TODO: Duplicate with sliceProgressPanel, move to sliceRun. - self.sliceStepTimeFactor = { - 'start': 3.3713991642, - 'slice': 15.4984838963, - 'preface': 5.17178297043, - 'inset': 116.362634182, - 'fill': 215.702672005, - 'multiply': 21.9536788464, - 'speed': 12.759510994, - 'raft': 31.4580039978, - 'skirt': 19.3436040878, - 'skin': 1.0, - 'joris': 1.0, - 'comb': 23.7805759907, - 'cool': 27.148763895, - 'dimension': 90.4914340973 - } - self.totalRunTimeFactor = 0 - for v in self.sliceStepTimeFactor.itervalues(): - self.totalRunTimeFactor += v - self.sizer = wx.GridBagSizer(2, 2) self.statusText = wx.StaticText(self, -1, "Building: %s" % (resultFilename)) self.progressGauge = wx.Gauge(self, -1) @@ -689,13 +667,13 @@ class ProjectSliceProgressWindow(wx.Frame): def SetProgress(self, stepName, layer, maxLayer): if self.prevStep != stepName: - self.totalDoneFactor += self.sliceStepTimeFactor[self.prevStep] + self.totalDoneFactor += sliceRun.sliceStepTimeFactor[self.prevStep] newTime = time.time() #print "#####" + str(newTime-self.startTime) + " " + self.prevStep + " -> " + stepName self.startTime = newTime self.prevStep = stepName - progresValue = ((self.totalDoneFactor + self.sliceStepTimeFactor[stepName] * layer / maxLayer) / self.totalRunTimeFactor) * 10000 + progresValue = ((self.totalDoneFactor + sliceRun.sliceStepTimeFactor[stepName] * layer / maxLayer) / sliceRun.totalRunTimeFactor) * 10000 self.progressGauge.SetValue(int(progresValue)) self.statusText.SetLabel(stepName + " [" + str(layer) + "/" + str(maxLayer) + "]") diff --git a/Cura/gui/sliceProgessPanel.py b/Cura/gui/sliceProgessPanel.py index 4eed4712..9e49e5b3 100644 --- a/Cura/gui/sliceProgessPanel.py +++ b/Cura/gui/sliceProgessPanel.py @@ -15,27 +15,6 @@ class sliceProgessPanel(wx.Panel): self.filelist = filelist self.abort = False - #How long does each step take compared to the others. This is used to make a better scaled progress bar, and guess time left. - self.sliceStepTimeFactor = { - 'start': 3.3713991642, - 'slice': 15.4984838963, - 'preface': 5.17178297043, - 'inset': 116.362634182, - 'fill': 215.702672005, - 'multiply': 21.9536788464, - 'speed': 12.759510994, - 'raft': 31.4580039978, - 'skirt': 19.3436040878, - 'skin': 1.0, - 'joris': 1.0, - 'comb': 23.7805759907, - 'cool': 27.148763895, - 'dimension': 90.4914340973 - } - self.totalRunTimeFactor = 0 - for v in self.sliceStepTimeFactor.itervalues(): - self.totalRunTimeFactor += v - box = wx.StaticBox(self, -1, filelist[0]) self.sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL) @@ -125,13 +104,13 @@ class sliceProgessPanel(wx.Panel): def SetProgress(self, stepName, layer, maxLayer): if self.prevStep != stepName: - self.totalDoneFactor += self.sliceStepTimeFactor[self.prevStep] + self.totalDoneFactor += sliceRun.sliceStepTimeFactor[self.prevStep] newTime = time.time() #print "#####" + str(newTime-self.startTime) + " " + self.prevStep + " -> " + stepName self.startTime = newTime self.prevStep = stepName - progresValue = ((self.totalDoneFactor + self.sliceStepTimeFactor[stepName] * layer / maxLayer) / self.totalRunTimeFactor) * 10000 + progresValue = ((self.totalDoneFactor + sliceRun.sliceStepTimeFactor[stepName] * layer / maxLayer) / sliceRun.totalRunTimeFactor) * 10000 self.progressGauge.SetValue(int(progresValue)) self.statusText.SetLabel(stepName + " [" + str(layer) + "/" + str(maxLayer) + "]") diff --git a/Cura/util/sliceRun.py b/Cura/util/sliceRun.py index edc304d3..4bc302a0 100644 --- a/Cura/util/sliceRun.py +++ b/Cura/util/sliceRun.py @@ -5,6 +5,28 @@ import platform, os, subprocess, sys from cura_sf.skeinforge_application.skeinforge_utilities import skeinforge_craft from util import profile +#How long does each step take compared to the others. This is used to make a better scaled progress bar, and guess time left. +sliceStepTimeFactor = { + 'start': 3.3713991642, + 'slice': 15.4984838963, + 'preface': 5.17178297043, + 'inset': 116.362634182, + 'fill': 215.702672005, + 'multiply': 21.9536788464, + 'speed': 12.759510994, + 'raft': 31.4580039978, + 'skirt': 19.3436040878, + 'skin': 1.0, + 'joris': 1.0, + 'comb': 23.7805759907, + 'cool': 27.148763895, + 'dimension': 90.4914340973 +} + +totalRunTimeFactor = 0 +for v in sliceStepTimeFactor.itervalues(): + totalRunTimeFactor += v + def getPyPyExe(): "Return the path to the pypy executable if we can find it. Else return False" if platform.system() == "Windows": From dc54135db5534c8b84b428a500ab4ce57bc9fc75 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 4 May 2012 12:39:23 +0200 Subject: [PATCH 3/5] Fixed bug where tooltip was still shown when pressing open/save button on project planner. Added toolbar buttons for add/remove object in project planner. Added move up/down buttons to project planner. --- Cura/gui/projectPlanner.py | 40 ++++++++++++++++++++++++++++++++-- Cura/gui/toolbarUtil.py | 7 +++++- Cura/images/move-down.png | Bin 0 -> 623 bytes Cura/images/move-up.png | Bin 0 -> 672 bytes Cura/images/object-add.png | Bin 0 -> 926 bytes Cura/images/object-remove.png | Bin 0 -> 941 bytes 6 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 Cura/images/move-down.png create mode 100644 Cura/images/move-up.png create mode 100644 Cura/images/object-add.png create mode 100644 Cura/images/object-remove.png diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py index 97b9bbc8..2095042f 100644 --- a/Cura/gui/projectPlanner.py +++ b/Cura/gui/projectPlanner.py @@ -61,6 +61,13 @@ class projectPlanner(wx.Frame): toolbarUtil.NormalButton(self.toolbar, self.OnQuit, 'exit.png', 'Close project planner') self.toolbar.Realize() + + self.toolbar2 = toolbarUtil.Toolbar(self) + toolbarUtil.NormalButton(self.toolbar2, self.OnAddModel, 'object-add.png', 'Add model') + toolbarUtil.NormalButton(self.toolbar2, self.OnRemModel, 'object-remove.png', 'Remove model') + toolbarUtil.NormalButton(self.toolbar2, self.OnMoveUp, 'move-up.png', 'Move model up in print list') + toolbarUtil.NormalButton(self.toolbar2, self.OnMoveDown, 'move-down.png', 'Move model down in print list') + self.toolbar2.Realize() sizer = wx.GridBagSizer(2,2) self.SetSizer(sizer) @@ -71,7 +78,8 @@ class projectPlanner(wx.Frame): self.sliceButton = wx.Button(self, -1, "Slice") self.autoPlaceButton = wx.Button(self, -1, "Auto Place") - sizer.Add(self.toolbar, (0,0), span=(1,3), flag=wx.EXPAND) + sizer.Add(self.toolbar, (0,0), span=(1,1), flag=wx.EXPAND) + sizer.Add(self.toolbar2, (0,1), span=(1,2), flag=wx.EXPAND) sizer.Add(self.preview, (1,0), span=(4,1), flag=wx.EXPAND) sizer.Add(self.listbox, (1,1), span=(1,2), flag=wx.EXPAND) sizer.Add(self.addButton, (2,1), span=(1,1)) @@ -169,6 +177,7 @@ class projectPlanner(wx.Frame): item.swapYZ = cp.get(section, 'swapYZ') == 'True' if cp.has_option(section, 'extruder'): item.extuder = int(cp.get(section, 'extruder'))-1 + self.updateModelTransform(item) i += 1 self.list.append(item) @@ -231,9 +240,36 @@ class projectPlanner(wx.Frame): elif len(self.list) > 0: self.listbox.SetSelection(len(self.list) - 1) self.selection = None - self.OnListSelect(None) self.preview.Refresh() + def OnMoveUp(self, e): + if self.selection == None: + return + i = self.listbox.GetSelection() + if i == 0: + return + self.list.remove(self.selection) + self.list.insert(i-1, self.selection) + self._updateListbox() + self.preview.Refresh() + + def OnMoveDown(self, e): + if self.selection == None: + return + i = self.listbox.GetSelection() + if i == len(self.list) - 1: + return + self.list.remove(self.selection) + self.list.insert(i+1, self.selection) + self._updateListbox() + self.preview.Refresh() + + def _updateListbox(self): + self.listbox.Clear() + for item in self.list: + self.listbox.AppendAndEnsureVisible(os.path.split(item.filename)[1]) + self.listbox.SetSelection(self.list.index(self.selection)) + def OnAutoPlace(self, e): bestAllowedSize = int(self.machineSize.y) bestArea = self._doAutoPlace(bestAllowedSize) diff --git a/Cura/gui/toolbarUtil.py b/Cura/gui/toolbarUtil.py index eba0a0b0..1ec088ef 100644 --- a/Cura/gui/toolbarUtil.py +++ b/Cura/gui/toolbarUtil.py @@ -180,6 +180,7 @@ class NormalButton(buttons.GenBitmapButton): super(NormalButton, self).__init__(parent, id, self.bitmap, size=size) self.helpText = helpText + self.callback = callback self.SetBezelWidth(1) self.SetUseFocusIndicator(False) @@ -187,10 +188,14 @@ class NormalButton(buttons.GenBitmapButton): self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) - self.Bind(wx.EVT_BUTTON, callback) + self.Bind(wx.EVT_BUTTON, self.OnButton) parent.AddControl(self) + def OnButton(self, event): + self.GetParent().OnPopupHide(event) + self.callback(event) + def OnMouseEnter(self, event): self.GetParent().OnPopupDisplay(event) event.Skip() diff --git a/Cura/images/move-down.png b/Cura/images/move-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5891219e49603b6409d5479247ef1fa8a8cf71c2 GIT binary patch literal 623 zcmV-#0+9WQP)9KeakxIdTpje7cQjq<2c!^ z`Zm_SltDZPAt&#frRYyLt2KB&-G(%{q(iVQLTLEmE7;x%Q2E-zMx_cKcr*5=`6qt_ zJ8$Qx>E38HYSm`*8wpg%DHAF6Ak@qu=tdr9ZV&@0hK{|pLTM+EAS1zES!j~^>gMV) zSJgD~g*+^)fTA^sp+W%}T|?#b>p<{m+*@08kigJI_+;7}FTlfl=m%yDpG=!Ydu;Nd zxN@f?(x%l?jNxPW8<>{Ae&FyaVOl4ItmVe>FR)CpL^X>&_z8O)@9BsigdhL_002ov JPDHLkV1jC@76SkP literal 0 HcmV?d00001 diff --git a/Cura/images/move-up.png b/Cura/images/move-up.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d9cef97e16ca46909765c0a67091c97908660b GIT binary patch literal 672 zcmV;R0$=@!P)0b000McNliru*9;vE5edJ)+6{olpPkPT$sbOg93kgUk5S3}N14Mj zJ9`2QPnU^Q!($^(CTVNfnvCJd_^zB_{%mUB`TqliV3)SpD2)!M;I1`LS5+JxL^j zO~OgoFbrKmJg8}SpP#!u{Y2f#ZY)Tn8ycjY)X_29v1zB_c}-ACQP&!9y++%+cK|hQ zcVTYU5iEd=eDJ6R!6Ub4fC}%BEHs50WXy+95J(Yr%Kip{H}1g9jtZOr0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iye& z3Kj{5dFFNi00SOLL_t(I%XO1WXk2v|#ea8Z?#$d|CYeqjd6+al+DHthjm4D)1u;@= zVrwl}5vo=wv7oq6M7nShDHIhcK3am-owzI|kopRQHjo4t%HWhtSMUHRYaUfy} zN!AyB$g1dBHS)>BFOA&1BVcBz*H+b6ROH=oQ}>R#wnKQtkd0r(4tQCe{gGRLO)RR& zM=J7F=c}WIe*v+f-fl!s1UBvNs%v|J;HI6RW!%&(3nTqBw?Brbs)bT6!OH9enZ)#% z8uQ_vV^=R&v7z2`h#c9n^F=Ed?Vy-Ru#uR?l(JNEaROF}`j!Wwn8F*{jwcu<9iL%k zc7l9r@mrr7dAarJ&#g)(Nj5%$l+y%q3G(SU>7`{JIs6&6Qw_NVG&hHpo?&xi2ena{ z9K3PJry@DUs`Up0grnOjB(6~vjSz`CIOL(Y2*wY^Whg9>kB^aE7$tb$LDWdjry?ML z<;SjV#SVliu8t$wRctR<`FZdt<@hBs>07u?1pEQC;-Vt>)CdZI0WE&Yw!yjc zORT3{p6_a;r$iLv?dkrd5 z^7b8Qc_O>EbiWhYiXCdYT`s3UE1+dYuZ+>xKgCazDXRCvdiifg2j=8+TmCPDdjzyv3XMXi2fudJk zgZsZT{d#&=yBc|4MGimk+oB`O2xb zZWVbCkv%GMy6ePzL(AKt*UCYM_{qfA!0Q120HrdU_LO0@pa1{>07*qoM6N<$f`@9d ADF6Tf literal 0 HcmV?d00001 diff --git a/Cura/images/object-remove.png b/Cura/images/object-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..064e523caa1f55d66615dd4f4237f49790697909 GIT binary patch literal 941 zcmV;e15*5nP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iye& z3KtQK4o_hK00S*aL_t(I%XO1)OwVlwjFIu$*nB5#yd z?<#hd7x_E-ZAwLZ)R7N2y*zOJjsa7B&8Dipq9TU_6%Ey8q1_aSLn=0c>2a}Oeb3En zqcbYy7yyD-#uVQQTum{HLm*hma{MxDg2faEefUU2W(J%>$jrg=Ea}(H0vLsuMH?|a0Wu3eBdG;0M{jZHlVe0@7irw?<3M8x-;L)v-eWO+eTY3fgI>nJ zY`B?EUsX*_s3tF|CVoD)Qp7B14VV4_M!qF3eB}>(nVUpT`vrlQ?~vj_7addTm!#ed@2-2Ymi}G5r;* z=9L6!j&MyW2amo*=&60IL?Re|KVldxj9lc?=`red_{ZJiIE_oQLv2^4e>fa`@agJ` zx<*`qhaqiYU~uimGLGYr85_f6nn)%?I+5Uy0!d5QmbuSc` zZ)xPC&M#->uCIzaMI7d$QE3bQ^LEq!!NndupnLnfD;K3A+CQIhmX1i?i{L P00000NkvXXu0mjfo5Z`6 literal 0 HcmV?d00001 From 8b24d77aea8845c88590311310400a767a2372a1 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 4 May 2012 17:57:24 +0200 Subject: [PATCH 4/5] Added copy button to project planner, and cleaned up project planner code a bit. --- Cura/gui/projectPlanner.py | 229 +++++++++++++++++++--------------- Cura/gui/validators.py | 10 +- Cura/util/gcodeInterpreter.py | 4 +- Cura/util/stl.py | 4 +- Cura/util/util3d.py | 2 +- 5 files changed, 140 insertions(+), 109 deletions(-) diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py index 2095042f..5d4bd80b 100644 --- a/Cura/gui/projectPlanner.py +++ b/Cura/gui/projectPlanner.py @@ -24,9 +24,108 @@ from util import util3d from util import stl from util import sliceRun -class Action(): +class Action(object): pass +class ProjectObject(stl.stlModel): + def __init__(self, filename): + super(ProjectObject, self).__init__() + + self.load(filename) + + self.filename = filename + self.scale = 1.0 + self.rotate = 0.0 + self.flipX = False + self.flipY = False + self.flipZ = False + self.swapXZ = False + self.swapYZ = False + self.extruder = 0 + + self.modelDisplayList = None + self.modelDirty = False + + self.origonalVertexes = list(self.vertexes) + for i in xrange(0, len(self.origonalVertexes)): + self.origonalVertexes[i] = self.origonalVertexes[i].copy() + self.getMinimumZ() + + self.centerX = -self.getMinimum().x + 5 + self.centerY = -self.getMinimum().y + 5 + + self.updateModelTransform() + + self.centerX = -self.getMinimum().x + 5 + self.centerY = -self.getMinimum().y + 5 + + def updateModelTransform(self): + rotate = self.rotate / 180.0 * math.pi + scaleX = 1.0 + scaleY = 1.0 + scaleZ = 1.0 + if self.flipX: + scaleX = -scaleX + if self.flipY: + scaleY = -scaleY + if self.flipZ: + scaleZ = -scaleZ + swapXZ = self.swapXZ + swapYZ = self.swapYZ + mat00 = math.cos(rotate) * scaleX + mat01 =-math.sin(rotate) * scaleY + mat10 = math.sin(rotate) * scaleX + mat11 = math.cos(rotate) * scaleY + + for i in xrange(0, len(self.origonalVertexes)): + x = self.origonalVertexes[i].x + y = self.origonalVertexes[i].y + z = self.origonalVertexes[i].z + if swapXZ: + x, z = z, x + if swapYZ: + y, z = z, y + self.vertexes[i].x = x * mat00 + y * mat01 + self.vertexes[i].y = x * mat10 + y * mat11 + self.vertexes[i].z = z * scaleZ + + for face in self.faces: + v1 = face.v[0] + v2 = face.v[1] + v3 = face.v[2] + face.normal = (v2 - v1).cross(v3 - v1) + face.normal.normalize() + + minZ = self.getMinimumZ() + minV = self.getMinimum() + maxV = self.getMaximum() + for v in self.vertexes: + v.z -= minZ + v.x -= minV.x + (maxV.x - minV.x) / 2 + v.y -= minV.y + (maxV.y - minV.y) / 2 + self.getMinimumZ() + self.modelDirty = True + + def clone(self): + p = ProjectObject(self.filename) + + p.centerX = self.centerX + 5 + p.centerY = self.centerY + 5 + + p.filename = self.filename + p.scale = self.scale + p.rotate = self.rotate + p.flipX = self.flipX + p.flipY = self.flipY + p.flipZ = self.flipZ + p.swapXZ = self.swapXZ + p.swapYZ = self.swapYZ + p.extruder = self.extruder + + p.updateModelTransform() + + return p + class projectPlanner(wx.Frame): "Main user interface window" def __init__(self): @@ -67,6 +166,7 @@ class projectPlanner(wx.Frame): toolbarUtil.NormalButton(self.toolbar2, self.OnRemModel, 'object-remove.png', 'Remove model') toolbarUtil.NormalButton(self.toolbar2, self.OnMoveUp, 'move-up.png', 'Move model up in print list') toolbarUtil.NormalButton(self.toolbar2, self.OnMoveDown, 'move-down.png', 'Move model down in print list') + toolbarUtil.NormalButton(self.toolbar2, self.OnCopy, 'copy.png', 'Make a copy of the current selected object') self.toolbar2.Realize() sizer = wx.GridBagSizer(2,2) @@ -163,9 +263,7 @@ class projectPlanner(wx.Frame): while cp.has_section('model_%d' % (i)): section = 'model_%d' % (i) - item = stl.stlModel() - item.filename = unicode(cp.get(section, 'filename'), "utf-8") - self.loadModelFile(item) + item = ProjectObject(unicode(cp.get(section, 'filename'), "utf-8")) item.centerX = float(cp.get(section, 'centerX')) item.centerY = float(cp.get(section, 'centerY')) item.scale = float(cp.get(section, 'scale')) @@ -177,7 +275,7 @@ class projectPlanner(wx.Frame): item.swapYZ = cp.get(section, 'swapYZ') == 'True' if cp.has_option(section, 'extruder'): item.extuder = int(cp.get(section, 'extruder'))-1 - self.updateModelTransform(item) + item.updateModelTransform() i += 1 self.list.append(item) @@ -185,6 +283,7 @@ class projectPlanner(wx.Frame): self.listbox.SetSelection(len(self.list)-1) self.OnListSelect(None) + self.preview.Refresh() dlg.Destroy() @@ -217,29 +316,19 @@ class projectPlanner(wx.Frame): dlg.SetWildcard("STL files (*.stl)|*.stl;*.STL") if dlg.ShowModal() == wx.ID_OK: for filename in dlg.GetPaths(): - item = stl.stlModel() - item.filename=filename + item = ProjectObject(filename) profile.putPreference('lastFile', item.filename) - if not(os.path.exists(item.filename)): - return - self.loadModelFile(item) self.list.append(item) - self.listbox.AppendAndEnsureVisible(os.path.split(item.filename)[1]) - self.listbox.SetSelection(len(self.list)-1) - self.OnListSelect(None) + self.selection = item + self._updateListbox() + self.preview.Refresh() dlg.Destroy() def OnRemModel(self, e): if self.selection == None: return self.list.remove(self.selection) - i = self.listbox.GetSelection() - self.listbox.Delete(i) - if len(self.list) > i: - self.listbox.SetSelection(i) - elif len(self.list) > 0: - self.listbox.SetSelection(len(self.list) - 1) - self.selection = None + self._updateListbox() self.preview.Refresh() def OnMoveUp(self, e): @@ -264,11 +353,29 @@ class projectPlanner(wx.Frame): self._updateListbox() self.preview.Refresh() + def OnCopy(self, e): + if self.selection == None: + return + + item = self.selection.clone() + self.list.append(item) + self.selection = item + + self._updateListbox() + self.preview.Refresh() + def _updateListbox(self): self.listbox.Clear() for item in self.list: self.listbox.AppendAndEnsureVisible(os.path.split(item.filename)[1]) - self.listbox.SetSelection(self.list.index(self.selection)) + if self.selection in self.list: + self.listbox.SetSelection(self.list.index(self.selection)) + elif len(self.list) > 0: + self.selection = self.list[0] + self.listbox.SetSelection(0) + else: + self.selection = None + self.listbox.SetSelection(-1) def OnAutoPlace(self, e): bestAllowedSize = int(self.machineSize.y) @@ -368,32 +475,6 @@ class projectPlanner(wx.Frame): pspw.Centre() pspw.Show(True) - def loadModelFile(self, item): - item.load(item.filename) - item.origonalVertexes = list(item.vertexes) - for i in xrange(0, len(item.origonalVertexes)): - item.origonalVertexes[i] = item.origonalVertexes[i].copy() - item.getMinimumZ() - - item.centerX = -item.getMinimum().x + 5 - item.centerY = -item.getMinimum().y + 5 - item.scale = 1.0 - item.rotate = 0.0 - item.flipX = False - item.flipY = False - item.flipZ = False - item.swapXZ = False - item.swapYZ = False - item.extruder = 0 - - item.modelDisplayList = None - item.modelDirty = False - - self.updateModelTransform(item) - - item.centerX = -item.getMinimum().x + 5 - item.centerY = -item.getMinimum().y + 5 - def OnScaleChange(self, e): if self.selection == None: return @@ -407,7 +488,8 @@ class projectPlanner(wx.Frame): if self.selection == None: return self.selection.rotate = float(self.rotateCtrl.GetValue()) - self.updateModelTransform(self.selection) + self.selection.updateModelTransform() + self.preview.Refresh() def OnExtruderChange(self, e): if self.selection == None: @@ -415,57 +497,6 @@ class projectPlanner(wx.Frame): self.selection.extruder = int(self.extruderCtrl.GetValue()) - 1 self.preview.Refresh() - def updateModelTransform(self, item): - rotate = item.rotate / 180.0 * math.pi - scaleX = 1.0 - scaleY = 1.0 - scaleZ = 1.0 - if item.flipX: - scaleX = -scaleX - if item.flipY: - scaleY = -scaleY - if item.flipZ: - scaleZ = -scaleZ - swapXZ = item.swapXZ - swapYZ = item.swapYZ - mat00 = math.cos(rotate) * scaleX - mat01 =-math.sin(rotate) * scaleY - mat10 = math.sin(rotate) * scaleX - mat11 = math.cos(rotate) * scaleY - - for i in xrange(0, len(item.origonalVertexes)): - x = item.origonalVertexes[i].x - y = item.origonalVertexes[i].y - z = item.origonalVertexes[i].z - if swapXZ: - x, z = z, x - if swapYZ: - y, z = z, y - item.vertexes[i].x = x * mat00 + y * mat01 - item.vertexes[i].y = x * mat10 + y * mat11 - item.vertexes[i].z = z * scaleZ - - for face in item.faces: - v1 = face.v[0] - v2 = face.v[1] - v3 = face.v[2] - face.normal = (v2 - v1).cross(v3 - v1) - face.normal.normalize() - - self.moveModel(item) - - def moveModel(self, item): - minZ = item.getMinimumZ() - min = item.getMinimum() - max = item.getMaximum() - for v in item.vertexes: - v.z -= minZ - v.x -= min.x + (max.x - min.x) / 2 - v.y -= min.y + (max.y - min.y) / 2 - item.getMinimumZ() - item.modelDirty = True - self.preview.Refresh() - class PreviewGLCanvas(glcanvas.GLCanvas): def __init__(self, parent): attribList = (glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 24, glcanvas.WX_GL_STENCIL_SIZE, 8) diff --git a/Cura/gui/validators.py b/Cura/gui/validators.py index b1da7783..f29e8d1e 100644 --- a/Cura/gui/validators.py +++ b/Cura/gui/validators.py @@ -11,7 +11,7 @@ SUCCESS = 0 WARNING = 1 ERROR = 2 -class validFloat(): +class validFloat(object): def __init__(self, setting, minValue = None, maxValue = None): self.setting = setting self.setting.validators.append(self) @@ -29,7 +29,7 @@ class validFloat(): except (ValueError, SyntaxError): return ERROR, '"' + str(self.setting.GetValue()) + '" is not a valid number or expression' -class validInt(): +class validInt(object): def __init__(self, setting, minValue = None, maxValue = None): self.setting = setting self.setting.validators.append(self) @@ -47,7 +47,7 @@ class validInt(): except (ValueError, SyntaxError): return ERROR, '"' + str(self.setting.GetValue()) + '" is not a valid whole number or expression' -class warningAbove(): +class warningAbove(object): def __init__(self, setting, minValueForWarning, warningMessage): self.setting = setting self.setting.validators.append(self) @@ -68,7 +68,7 @@ class warningAbove(): #We already have an error by the int/float validator in this case. return SUCCESS, '' -class wallThicknessValidator(): +class wallThicknessValidator(object): def __init__(self, setting): self.setting = setting self.setting.validators.append(self) @@ -94,7 +94,7 @@ class wallThicknessValidator(): #We already have an error by the int/float validator in this case. return SUCCESS, '' -class printSpeedValidator(): +class printSpeedValidator(object): def __init__(self, setting): self.setting = setting self.setting.validators.append(self) diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index 3af69bb4..5714972c 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -9,13 +9,13 @@ import os from util import util3d from util import profile -class gcodePath(): +class gcodePath(object): def __init__(self, newType, pathType, startPoint): self.type = newType self.pathType = pathType self.list = [startPoint] -class gcode(): +class gcode(object): def __init__(self): self.regMatch = {} self.layerList = [] diff --git a/Cura/util/stl.py b/Cura/util/stl.py index 9b1323a2..bf7558b4 100644 --- a/Cura/util/stl.py +++ b/Cura/util/stl.py @@ -9,11 +9,11 @@ import struct from util import util3d -class stlFace(): +class stlFace(object): def __init__(self, v0, v1, v2): self.v = [v0, v1, v2] -class stlModel(): +class stlModel(object): def __init__(self): self.faces = [] self.vertexes = [] diff --git a/Cura/util/util3d.py b/Cura/util/util3d.py index 30b25159..d5411fc9 100644 --- a/Cura/util/util3d.py +++ b/Cura/util/util3d.py @@ -1,7 +1,7 @@ import math -class Vector3(): +class Vector3(object): def __init__(self, x=0.0, y=0.0, z=0.0): self.x = x self.y = y From 9a5508d0772fbcb3b18664c6796e920d6b6ead34 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 4 May 2012 18:10:39 +0200 Subject: [PATCH 5/5] Added the copy button image. (forgot that in my last commit) --- Cura/images/copy.png | Bin 0 -> 485 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Cura/images/copy.png diff --git a/Cura/images/copy.png b/Cura/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdeb5fc73897c0b2b7fdb24a082a993cb2294c8 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=ff8>(m{G3O!W1aTUgGKN%6@}cL`d0sS5o>yped=IE{-7;x28@w z?{(Ng;8?o(vZal2UCV9SDn2q^kz14h;ArvQ8^O9iIQDs;w`*7+VDp{f_ZlWKjr z)#jWRvnDK(uc_Jn=1hKh7{h^v8aJ_m2#-3&dS~D8ALfP$ET*!d=Iaj$ESaLv%HXJJ zadX**`|pc8)DD~|l;Q1I%+aL4pv!&XZJDLtiIt|8wDsLQZsnLs95p=my!g*?kHg2f ze}skYh-*HqEXlpecGB}onN3VDlz0sp?)p^E4K+@`E$^}V!kg~`uY(tgCWzj2SkAUA zhv5~wSpvTuPll7r+MOC)9ESz0WW}p&`9(OEY-(cc;=5QH8+dok<}z*b-~0I2y#2;5 zm%ceYifxa*+WiUnz4IqbQQ=IBY~#^CEhHY#9paTJbKGK|^!~uRnp-kXG?@4ro-by5 zaqMZ<%Gv6Zf0wV?sdn1z0IR9imMNmDb$a0zwKG0V)~~O%Gci?|KU*m}BkiApw!tmN Y4DJ^lh1J@%z&K#=boFyt=akR{0F^SkGXMYp literal 0 HcmV?d00001