From: daid303 Date: Fri, 8 Feb 2013 10:56:56 +0000 (+0100) Subject: Add mirror tools. X-Git-Tag: 13.03~51 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e4411d9ec7d0b45947e92bb4a2650832c9f0d10f;p=cura.git Add mirror tools. --- diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index d40d5405..bbca2721 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -104,8 +104,10 @@ class previewPanel(wx.Panel): self.Bind(wx.EVT_TIMER, self.OnCheckReloadFile, self.checkReloadFileTimer) self.checkReloadFileTimer.Start(1000) - self.rotateToolButton = openglGui.glButton(self.glCanvas, 1, 'Rotate', (0,1), self.OnRotateSelect) - self.scaleToolButton = openglGui.glButton(self.glCanvas, 2, 'Scale', (0,2), self.OnScaleSelect) + group = [] + self.rotateToolButton = openglGui.glRadioButton(self.glCanvas, 1, 'Rotate', (0,1), group, self.OnToolSelect) + self.scaleToolButton = openglGui.glRadioButton(self.glCanvas, 2, 'Scale', (0,2), group, self.OnToolSelect) + self.mirrorToolButton = openglGui.glRadioButton(self.glCanvas, 12, 'Mirror', (0,3), group, self.OnToolSelect) self.resetRotationButton = openglGui.glButton(self.glCanvas, 4, 'Reset rotation', (1,1), self.OnRotateReset) self.layFlatButton = openglGui.glButton(self.glCanvas, 5, 'Lay flat', (1,2), self.OnLayFlat) @@ -113,6 +115,10 @@ class previewPanel(wx.Panel): self.resetScaleButton = openglGui.glButton(self.glCanvas, 8, 'Scale reset', (1,1), self.OnScaleReset) self.scaleMaxButton = openglGui.glButton(self.glCanvas, 9, 'Scale to machine size', (1,2), self.OnScaleMax) + self.mirrorXButton = openglGui.glButton(self.glCanvas, 12, 'Mirror X', (1,1), lambda : self.OnMirror(0)) + self.mirrorYButton = openglGui.glButton(self.glCanvas, 13, 'Mirror Y', (1,2), lambda : self.OnMirror(1)) + self.mirrorZButton = openglGui.glButton(self.glCanvas, 14, 'Mirror Z', (1,3), lambda : self.OnMirror(2)) + self.openFileButton = openglGui.glButton(self.glCanvas, 3, 'Load model', (0,0), lambda : self.GetParent().GetParent().GetParent()._showModelLoadDialog(1)) self.sliceButton = openglGui.glButton(self.glCanvas, 6, 'Prepare model', (0,-2), lambda : self.GetParent().GetParent().GetParent().OnSlice(None)) self.printButton = openglGui.glButton(self.glCanvas, 7, 'Print model', (0,-1), lambda : self.GetParent().GetParent().GetParent().OnPrint(None)) @@ -141,42 +147,35 @@ class previewPanel(wx.Panel): self.scaleZmmctrl = openglGui.glNumberCtrl(self.scaleForm, '0.0', (1,6), lambda value: self.OnScaleEntryMM(value, 2)) openglGui.glLabel(self.scaleForm, 'Uniform scale', (0,8)) self.scaleUniform = openglGui.glCheckbox(self.scaleForm, True, (1,8), None) - self.scaleForm.setHidden(True) self.OnViewChange() + self.OnToolSelect() self.returnToModelViewAndUpdateModel() self.matrix = numpy.matrix(numpy.array(profile.getObjectMatrix(), numpy.float64).reshape((3,3,))) - self.tool = previewTools.toolNone(self.glCanvas) def returnToModelViewAndUpdateModel(self): if self.glCanvas.viewMode == 'GCode' or self.glCanvas.viewMode == 'Mixed': self.setViewMode('Normal') - self.resetRotationButton.setHidden(not self.rotateToolButton.getSelected()) - self.layFlatButton.setHidden(not self.rotateToolButton.getSelected()) - self.resetScaleButton.setHidden(not self.scaleToolButton.getSelected()) - self.scaleMaxButton.setHidden(not self.scaleToolButton.getSelected()) - self.scaleForm.setHidden(not self.scaleToolButton.getSelected()) self.updateModelTransform() - def OnRotateSelect(self): + def OnToolSelect(self): if self.rotateToolButton.getSelected(): - self.rotateToolButton.setSelected(False) - self.tool = previewTools.toolNone(self.glCanvas) - else: - self.rotateToolButton.setSelected(True) self.tool = previewTools.toolRotate(self.glCanvas) - self.scaleToolButton.setSelected(False) - self.returnToModelViewAndUpdateModel() - - def OnScaleSelect(self): - self.rotateToolButton.setSelected(False) - if self.scaleToolButton.getSelected(): - self.scaleToolButton.setSelected(False) + elif self.scaleToolButton.getSelected(): + self.tool = previewTools.toolScale(self.glCanvas) + elif self.mirrorToolButton.getSelected(): self.tool = previewTools.toolNone(self.glCanvas) else: - self.scaleToolButton.setSelected(True) - self.tool = previewTools.toolScale(self.glCanvas) + self.tool = previewTools.toolNone(self.glCanvas) + self.resetRotationButton.setHidden(not self.rotateToolButton.getSelected()) + self.layFlatButton.setHidden(not self.rotateToolButton.getSelected()) + self.resetScaleButton.setHidden(not self.scaleToolButton.getSelected()) + self.scaleMaxButton.setHidden(not self.scaleToolButton.getSelected()) + self.scaleForm.setHidden(not self.scaleToolButton.getSelected()) + self.mirrorXButton.setHidden(not self.mirrorToolButton.getSelected()) + self.mirrorYButton.setHidden(not self.mirrorToolButton.getSelected()) + self.mirrorZButton.setHidden(not self.mirrorToolButton.getSelected()) self.returnToModelViewAndUpdateModel() def OnScaleEntry(self, value, axis): @@ -213,6 +212,15 @@ class previewPanel(wx.Panel): self.matrix *= numpy.matrix(matrix, numpy.float64) self.updateModelTransform() + def OnMirror(self, axis): + matrix = [[1,0,0], [0, 1, 0], [0, 0, 1]] + matrix[axis][axis] = -1 + self.matrix *= numpy.matrix(matrix, numpy.float64) + for obj in self.objectList: + obj.dirty = True + obj.steepDirty = True + self.updateModelTransform() + def OnMove(self, e = None): if e is not None: e.Skip() @@ -690,7 +698,7 @@ class PreviewGLCanvas(openglGui.glGuiPanel): if obj.dirty: obj.dirty = False glNewList(obj.displayList, GL_COMPILE) - opengl.DrawMesh(obj.mesh) + opengl.DrawMesh(obj.mesh, numpy.linalg.det(obj.mesh.matrix) < 0) glEndList() glNewList(obj.outlineDisplayList, GL_COMPILE) opengl.DrawMeshOutline(obj.mesh) diff --git a/Cura/gui/util/opengl.py b/Cura/gui/util/opengl.py index eea419d4..ef3a0db8 100644 --- a/Cura/gui/util/opengl.py +++ b/Cura/gui/util/opengl.py @@ -311,12 +311,15 @@ def DrawMeshOutline(mesh): glDisableClientState(GL_VERTEX_ARRAY) -def DrawMesh(mesh): +def DrawMesh(mesh, insideOut = False): glEnable(GL_CULL_FACE) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes) - glNormalPointer(GL_FLOAT, 0, mesh.normal) + if insideOut: + glNormalPointer(GL_FLOAT, 0, mesh.invNormal) + else: + glNormalPointer(GL_FLOAT, 0, mesh.normal) #Odd, drawing in batchs is a LOT faster then drawing it all at once. batchSize = 999 #Warning, batchSize needs to be dividable by 3 @@ -329,7 +332,10 @@ def DrawMesh(mesh): glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount) glCullFace(GL_FRONT) - glNormalPointer(GL_FLOAT, 0, mesh.invNormal) + if insideOut: + glNormalPointer(GL_FLOAT, 0, mesh.normal) + else: + glNormalPointer(GL_FLOAT, 0, mesh.invNormal) for i in xrange(0, int(mesh.vertexCount / batchSize)): glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize) extraStartPos = int(mesh.vertexCount / batchSize) * batchSize diff --git a/Cura/gui/util/openglGui.py b/Cura/gui/util/openglGui.py index a27289a6..710f56f9 100644 --- a/Cura/gui/util/openglGui.py +++ b/Cura/gui/util/openglGui.py @@ -342,6 +342,26 @@ class glButton(glGuiControl): return True return False +class glRadioButton(glButton): + def __init__(self, parent, imageID, tooltip, pos, group, callback): + super(glRadioButton, self).__init__(parent, imageID, tooltip, pos, self._onRadioSelect) + self._group = group + self._radioCallback = callback + self._group.append(self) + + def setSelected(self, value): + self._selected = value + + def _onRadioSelect(self): + for ctrl in self._group: + if ctrl != self: + ctrl.setSelected(False) + if self.getSelected(): + self.setSelected(False) + else: + self.setSelected(True) + self._radioCallback() + class glFrame(glGuiContainer): def __init__(self, parent, pos): super(glFrame, self).__init__(parent, pos)