chiark / gitweb /
Add working scale entry tools.
authordaid303 <daid303@gmail.com>
Wed, 6 Feb 2013 09:33:51 +0000 (10:33 +0100)
committerdaid303 <daid303@gmail.com>
Wed, 6 Feb 2013 09:33:51 +0000 (10:33 +0100)
Cura/gui/preview3d.py
Cura/gui/util/openglGui.py
Cura/gui/util/previewTools.py
Cura/resources/images/splash.png

index 9d95a8b3824ff4799abedc2ded2d196a3bd2a848..f51b2cabab8c07ad7f3ad38d602ba151b9f69d23 100644 (file)
@@ -119,10 +119,22 @@ class previewPanel(wx.Panel):
                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))
 
-               self.scaleForm = openglGui.glFrame(self.glCanvas, (1, 1))
+               self.scaleForm = openglGui.glFrame(self.glCanvas, (1, 3))
                openglGui.glGuiLayoutGrid(self.scaleForm)
-               openglGui.glLabel(self.scaleForm, 'Test', (0,0))
-               openglGui.glLabel(self.scaleForm, 'Test', (1,1))
+               openglGui.glLabel(self.scaleForm, 'Scale X', (0,0))
+               self.scaleXctrl = openglGui.glTextCtrl(self.scaleForm, '1.0', (1,0), lambda value: self.OnScaleEntry(value, 0))
+               openglGui.glLabel(self.scaleForm, 'Scale Y', (0,1))
+               self.scaleYctrl = openglGui.glTextCtrl(self.scaleForm, '1.0', (1,1), lambda value: self.OnScaleEntry(value, 1))
+               openglGui.glLabel(self.scaleForm, 'Scale Z', (0,2))
+               self.scaleZctrl = openglGui.glTextCtrl(self.scaleForm, '1.0', (1,2), lambda value: self.OnScaleEntry(value, 2))
+               openglGui.glLabel(self.scaleForm, 'Size X (mm)', (0,4))
+               self.scaleXmmctrl = openglGui.glTextCtrl(self.scaleForm, '0.0', (1,4), lambda value: self.OnScaleEntryMM(value, 0))
+               openglGui.glLabel(self.scaleForm, 'Size Y (mm)', (0,5))
+               self.scaleYmmctrl = openglGui.glTextCtrl(self.scaleForm, '0.0', (1,5), lambda value: self.OnScaleEntryMM(value, 1))
+               openglGui.glLabel(self.scaleForm, 'Size Z (mm)', (0,6))
+               self.scaleZmmctrl = openglGui.glTextCtrl(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.returnToModelViewAndUpdateModel()
@@ -137,6 +149,7 @@ class previewPanel(wx.Panel):
                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):
@@ -159,6 +172,40 @@ class previewPanel(wx.Panel):
                        self.tool = previewTools.toolScale(self.glCanvas)
                self.returnToModelViewAndUpdateModel()
 
+       def OnScaleEntry(self, value, axis):
+               try:
+                       value = float(value)
+               except:
+                       return
+               scale = numpy.linalg.norm(self.matrix[axis].getA().flatten())
+               scale = value / scale
+               if scale == 0:
+                       return
+               if self.scaleUniform.getValue():
+                       matrix = [[scale,0,0], [0, scale, 0], [0, 0, scale]]
+               else:
+                       matrix = [[1,0,0], [0, 1, 0], [0, 0, 1]]
+                       matrix[axis][axis] = scale
+               self.matrix *= numpy.matrix(matrix, numpy.float64)
+               self.updateModelTransform()
+
+       def OnScaleEntryMM(self, value, axis):
+               try:
+                       value = float(value)
+               except:
+                       return
+               scale = self.objectsSize[axis]
+               scale = value / scale
+               if scale == 0:
+                       return
+               if self.scaleUniform.getValue():
+                       matrix = [[scale,0,0], [0, scale, 0], [0, 0, scale]]
+               else:
+                       matrix = [[1,0,0], [0, 1, 0], [0, 0, 1]]
+                       matrix[axis][axis] = scale
+               self.matrix *= numpy.matrix(matrix, numpy.float64)
+               self.updateModelTransform()
+
        def OnMove(self, e = None):
                if e is not None:
                        e.Skip()
@@ -449,6 +496,16 @@ class previewPanel(wx.Panel):
                self.objectsSize = self.objectsMaxV - self.objectsMinV
                self.objectsBoundaryCircleSize = objectsBoundaryCircleSize
 
+               scaleX = numpy.linalg.norm(self.matrix[0].getA().flatten())
+               scaleY = numpy.linalg.norm(self.matrix[1].getA().flatten())
+               scaleZ = numpy.linalg.norm(self.matrix[2].getA().flatten())
+               self.scaleXctrl.setValue(round(scaleX, 2))
+               self.scaleYctrl.setValue(round(scaleY, 2))
+               self.scaleZctrl.setValue(round(scaleZ, 2))
+               self.scaleXmmctrl.setValue(round(self.objectsSize[0], 2))
+               self.scaleYmmctrl.setValue(round(self.objectsSize[1], 2))
+               self.scaleZmmctrl.setValue(round(self.objectsSize[2], 2))
+
                self.glCanvas.Refresh()
        
        def updateProfileToControls(self):
index a008d8846a1a836073a8400347e798e2134ec6c1..5bdcf08cf897cf4874a2e165d28750771c9f85da 100644 (file)
@@ -42,7 +42,8 @@ class glGuiContainer(glGuiControl):
        def OnMouseDown(self, x, y):
                for ctrl in self._glGuiControlList:
                        if ctrl.OnMouseDown(x, y):
-                               return
+                               return True
+               return False
 
        def OnMouseMotion(self, x, y):
                handled = False
@@ -82,7 +83,9 @@ class glGuiPanel(glcanvas.GLCanvas):
                wx.EVT_KILL_FOCUS(self, self.OnFocusLost)
 
        def OnKeyChar(self, e):
-               pass
+               if self._focus is not None:
+                       self._focus.OnKeyChar(e.GetKeyCode())
+                       self.Refresh()
 
        def OnFocusLost(self, e):
                self._focus = None
@@ -91,6 +94,7 @@ class glGuiPanel(glcanvas.GLCanvas):
        def _OnGuiMouseLeftDown(self,e):
                self.SetFocus()
                if self._container.OnMouseDown(e.GetX(), e.GetY()):
+                       self.Refresh()
                        return
                self.OnMouseLeftDown(e)
 
@@ -216,11 +220,11 @@ class glGuiLayoutGrid(object):
                        y1 = y0
                        for n in xrange(0, x):
                                if not n in widths:
-                                       widths[n] = 0
+                                       widths[n] = 3
                                x1 += widths[n]
                        for n in xrange(0, y):
-                               if not n in widths:
-                                       heights[n] = 0
+                               if not n in heights:
+                                       heights[n] = 3
                                y1 += heights[n]
                        ctrl.setSize(x1, y1, widths[x], heights[y])
                self._size = sum(widths.values()) + borderSize * 2, sum(heights.values()) + borderSize * 2
@@ -345,7 +349,7 @@ class glFrame(glGuiContainer):
                glPushMatrix()
                glTranslatef(pos[0], pos[1], 0)
                glBindTexture(GL_TEXTURE_2D, self._parent._glButtonsTexture)
-               glDisable(GL_TEXTURE_2D)
+               glEnable(GL_TEXTURE_2D)
 
                size = self._layout.getLayoutSize()
                glColor4ub(255,255,255,128)
@@ -399,25 +403,24 @@ class glLabel(glGuiControl):
                return x0, y0
 
        def draw(self):
-               pos = self._getPixelPos()
+               x, y, w, h = self.getSize()
 
                glPushMatrix()
-               glTranslatef(pos[0], pos[1], 0)
+               glTranslatef(x, y, 0)
 
-               size = self.getMinSize()
                glColor4ub(255,255,255,128)
                glBegin(GL_QUADS)
                glTexCoord2f(1, 0)
-               glVertex2f( size[0], 0)
+               glVertex2f( w, 0)
                glTexCoord2f(0, 0)
                glVertex2f( 0, 0)
                glTexCoord2f(0, 1)
-               glVertex2f( 0, size[1])
+               glVertex2f( 0, h)
                glTexCoord2f(1, 1)
-               glVertex2f( size[0], size[1])
+               glVertex2f( w, h)
                glEnd()
 
-               glTranslate(5, size[1] - 5, 0)
+               glTranslate(5, h - 5, 0)
                glColor4ub(0,0,0,255)
                opengl.glDrawStringLeft(self._label)
                glPopMatrix()
@@ -430,3 +433,149 @@ class glLabel(glGuiControl):
 
        def OnMouseDown(self, x, y):
                return False
+
+class glTextCtrl(glGuiControl):
+       def __init__(self, parent, value, pos, callback):
+               self._callback = callback
+               self._value = str(value)
+               self._selectPos = 0
+               self._maxLen = 6
+               self._inCallback = False
+               super(glTextCtrl, self).__init__(parent, pos)
+
+       def setValue(self, value):
+               if self._inCallback:
+                       return
+               self._value = str(value)
+
+       def getMinSize(self):
+               w, h = opengl.glGetStringSize("VALUES")
+               return w + 10, h + 4
+
+       def _getPixelPos(self):
+               x0, y0, w, h = self.getSize()
+               return x0, y0
+
+       def draw(self):
+               x, y, w, h = self.getSize()
+
+               glPushMatrix()
+               glTranslatef(x, y, 0)
+
+               if self._base._focus == self:
+                       glColor4ub(255,255,255,255)
+               else:
+                       glColor4ub(255,255,255,192)
+               glBegin(GL_QUADS)
+               glTexCoord2f(1, 0)
+               glVertex2f( w, 0)
+               glTexCoord2f(0, 0)
+               glVertex2f( 0, 0)
+               glTexCoord2f(0, 1)
+               glVertex2f( 0, h)
+               glTexCoord2f(1, 1)
+               glVertex2f( w, h)
+               glEnd()
+
+               glTranslate(5, h - 5, 0)
+               glColor4ub(0,0,0,255)
+               opengl.glDrawStringLeft(self._value)
+               if self._base._focus == self:
+                       glTranslate(opengl.glGetStringSize(self._value[0:self._selectPos])[0] - 2, -1, 0)
+                       opengl.glDrawStringLeft('|')
+               glPopMatrix()
+
+       def _checkHit(self, x, y):
+               x1, y1, w, h = self.getSize()
+               return 0 <= x - x1 <= w and 0 <= y - y1 <= h
+
+       def OnMouseMotion(self, x, y):
+               return False
+
+       def OnMouseDown(self, x, y):
+               if self._checkHit(x, y):
+                       self._base._focus = self
+                       self._selectPos = len(self._value)
+                       return True
+               return False
+
+       def OnKeyChar(self, c):
+               self._inCallback = True
+               if c == wx.WXK_LEFT:
+                       self._selectPos -= 1
+                       self._selectPos = max(0, self._selectPos)
+               if c == wx.WXK_RIGHT:
+                       self._selectPos += 1
+                       self._selectPos = min(self._selectPos, len(self._value))
+               if c == wx.WXK_BACK and self._selectPos > 0:
+                       self._value = self._value[0:self._selectPos - 1] + self._value[self._selectPos:]
+                       self._selectPos -= 1
+                       self._callback(self._value)
+               if c == wx.WXK_DELETE:
+                       self._value = self._value[0:self._selectPos] + self._value[self._selectPos + 1:]
+                       self._callback(self._value)
+               if (ord('0') <= c <= ord('9') or c == ord('.')) and len(self._value) < self._maxLen:
+                       self._value = self._value[0:self._selectPos] + chr(c) + self._value[self._selectPos:]
+                       self._selectPos += 1
+                       self._callback(self._value)
+               self._inCallback = False
+
+class glCheckbox(glGuiControl):
+       def __init__(self, parent, value, pos, callback):
+               self._callback = callback
+               self._value = value
+               self._selectPos = 0
+               self._maxLen = 6
+               self._inCallback = False
+               super(glCheckbox, self).__init__(parent, pos)
+
+       def setValue(self, value):
+               if self._inCallback:
+                       return
+               self._value = str(value)
+
+       def getValue(self):
+               return self._value
+
+       def getMinSize(self):
+               return 20, 20
+
+       def _getPixelPos(self):
+               x0, y0, w, h = self.getSize()
+               return x0, y0
+
+       def draw(self):
+               x, y, w, h = self.getSize()
+
+               glPushMatrix()
+               glTranslatef(x, y, 0)
+
+               if self._value:
+                       glColor4ub(0,255,0,255)
+               else:
+                       glColor4ub(255,0,0,255)
+               glBegin(GL_QUADS)
+               glTexCoord2f(1, 0)
+               glVertex2f( w, 0)
+               glTexCoord2f(0, 0)
+               glVertex2f( 0, 0)
+               glTexCoord2f(0, 1)
+               glVertex2f( 0, h)
+               glTexCoord2f(1, 1)
+               glVertex2f( w, h)
+               glEnd()
+
+               glPopMatrix()
+
+       def _checkHit(self, x, y):
+               x1, y1, w, h = self.getSize()
+               return 0 <= x - x1 <= w and 0 <= y - y1 <= h
+
+       def OnMouseMotion(self, x, y):
+               return False
+
+       def OnMouseDown(self, x, y):
+               if self._checkHit(x, y):
+                       self._value = not self._value
+                       return True
+               return False
index 099b44fcb8d7ba67c15c5627500d35ff2558d634..fb14f2d37e6dfb2dfc9108ca3223f16fb6b39fe3 100644 (file)
@@ -407,7 +407,7 @@ class toolScale(object):
                        glTranslate(0,-(radius + 5),0)
                if self.parent.tempMatrix is not None:
                        size = (numpy.matrix([size]) * self.parent.tempMatrix).getA().flatten()
-               opengl.glDrawStringCenter("%0.1fx%0.1fx%0.1fmm" % (size[0], size[1], size[2]))
+               opengl.glDrawStringCenter("W, D, H: %0.1f, %0.1f, %0.1f mm" % (size[0], size[1], size[2]))
                glPopMatrix()
 
                glLineWidth(1)
@@ -467,8 +467,10 @@ class toolScale(object):
                        opengl.glDrawStringCenter("%0.2f" % (scaleZ))
                glPopMatrix()
 
+               glEnable(GL_DEPTH_TEST)
                glColor(255,255,255)
                size = size / 2
+               size += 0.01
                glLineWidth(1)
                glBegin(GL_LINES)
                glVertex3f(size[0], size[1], size[2])
@@ -478,6 +480,20 @@ class toolScale(object):
                glVertex3f(size[0], size[1], size[2])
                glVertex3f(size[0]/4*3, size[1], size[2])
 
+               glVertex3f(-size[0], size[1], size[2])
+               glVertex3f(-size[0], size[1], size[2]/4*3)
+               glVertex3f(-size[0], size[1], size[2])
+               glVertex3f(-size[0], size[1]/4*3, size[2])
+               glVertex3f(-size[0], size[1], size[2])
+               glVertex3f(-size[0]/4*3, size[1], size[2])
+
+               glVertex3f(size[0], -size[1], size[2])
+               glVertex3f(size[0], -size[1], size[2]/4*3)
+               glVertex3f(size[0], -size[1], size[2])
+               glVertex3f(size[0], -size[1]/4*3, size[2])
+               glVertex3f(size[0], -size[1], size[2])
+               glVertex3f(size[0]/4*3, -size[1], size[2])
+
                glVertex3f(-size[0], -size[1], size[2])
                glVertex3f(-size[0], -size[1], size[2]/4*3)
                glVertex3f(-size[0], -size[1], size[2])
@@ -485,12 +501,12 @@ class toolScale(object):
                glVertex3f(-size[0], -size[1], size[2])
                glVertex3f(-size[0]/4*3, -size[1], size[2])
 
-               glVertex3f(size[0], -size[1], -size[2])
-               glVertex3f(size[0], -size[1], -size[2]/4*3)
-               glVertex3f(size[0], -size[1], -size[2])
-               glVertex3f(size[0], -size[1]/4*3, -size[2])
-               glVertex3f(size[0], -size[1], -size[2])
-               glVertex3f(size[0]/4*3, -size[1], -size[2])
+               glVertex3f(size[0], size[1], -size[2])
+               glVertex3f(size[0], size[1], -size[2]/4*3)
+               glVertex3f(size[0], size[1], -size[2])
+               glVertex3f(size[0], size[1]/4*3, -size[2])
+               glVertex3f(size[0], size[1], -size[2])
+               glVertex3f(size[0]/4*3, size[1], -size[2])
 
                glVertex3f(-size[0], size[1], -size[2])
                glVertex3f(-size[0], size[1], -size[2]/4*3)
@@ -498,6 +514,20 @@ class toolScale(object):
                glVertex3f(-size[0], size[1]/4*3, -size[2])
                glVertex3f(-size[0], size[1], -size[2])
                glVertex3f(-size[0]/4*3, size[1], -size[2])
+
+               glVertex3f(size[0], -size[1], -size[2])
+               glVertex3f(size[0], -size[1], -size[2]/4*3)
+               glVertex3f(size[0], -size[1], -size[2])
+               glVertex3f(size[0], -size[1]/4*3, -size[2])
+               glVertex3f(size[0], -size[1], -size[2])
+               glVertex3f(size[0]/4*3, -size[1], -size[2])
+
+               glVertex3f(-size[0], -size[1], -size[2])
+               glVertex3f(-size[0], -size[1], -size[2]/4*3)
+               glVertex3f(-size[0], -size[1], -size[2])
+               glVertex3f(-size[0], -size[1]/4*3, -size[2])
+               glVertex3f(-size[0], -size[1], -size[2])
+               glVertex3f(-size[0]/4*3, -size[1], -size[2])
                glEnd()
 
                glEnable(GL_DEPTH_TEST)
index e1d7932b7507ac468250f7b4963726eee64baa8d..94141f5496e560a61ce4d2723fbafd01aa30dfd1 100644 (file)
Binary files a/Cura/resources/images/splash.png and b/Cura/resources/images/splash.png differ