From: daid303 Date: Wed, 6 Feb 2013 09:33:51 +0000 (+0100) Subject: Add working scale entry tools. X-Git-Tag: 13.03~57 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=4a4a6daa4637cb4f70b8dcbf3194cd82dc563eea;p=cura.git Add working scale entry tools. --- diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 9d95a8b3..f51b2cab 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -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): diff --git a/Cura/gui/util/openglGui.py b/Cura/gui/util/openglGui.py index a008d884..5bdcf08c 100644 --- a/Cura/gui/util/openglGui.py +++ b/Cura/gui/util/openglGui.py @@ -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 diff --git a/Cura/gui/util/previewTools.py b/Cura/gui/util/previewTools.py index 099b44fc..fb14f2d3 100644 --- a/Cura/gui/util/previewTools.py +++ b/Cura/gui/util/previewTools.py @@ -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) diff --git a/Cura/resources/images/splash.png b/Cura/resources/images/splash.png index e1d7932b..94141f54 100644 Binary files a/Cura/resources/images/splash.png and b/Cura/resources/images/splash.png differ