chiark / gitweb /
Add mirror tools.
authordaid303 <daid303@gmail.com>
Fri, 8 Feb 2013 10:56:56 +0000 (11:56 +0100)
committerdaid303 <daid303@gmail.com>
Fri, 8 Feb 2013 10:56:56 +0000 (11:56 +0100)
Cura/gui/preview3d.py
Cura/gui/util/opengl.py
Cura/gui/util/openglGui.py

index d40d54053ca69889c6b31f4f6be9c23181558d15..bbca27215859b02e500bcaeb57aeb7afc1d88038 100644 (file)
@@ -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)
index eea419d4135f5fc2374c14bd81f3d39e19b71c1e..ef3a0db8d6510dec344ae61fdaa03beb6c9e6be2 100644 (file)
@@ -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
index a27289a6e0c0d97641daa2d885ff7d2832971881..710f56f90d6b381351df40c2a4efd88ddd764342 100644 (file)
@@ -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)