From: daid303 Date: Mon, 8 Apr 2013 08:31:18 +0000 (+0200) Subject: Add working scale entry form. X-Git-Tag: 13.05~120 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=57b06ca47bf07119440c36462730fd09df1a0574;p=cura.git Add working scale entry form. --- diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index d1308837..7a1fc5bf 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -213,6 +213,27 @@ class SceneView(openglGui.glGuiPanel): if self._selectedObj is None: return self._selectedObj.mirror(axis) + self.sceneUpdated() + + def OnScaleEntry(self, value, axis): + if self._selectedObj is None: + return + try: + value = float(value) + except: + return + self._selectedObj.setScale(value, axis, self.scaleUniform.getValue()) + self.updateProfileToControls() + self.sceneUpdated() + + def OnScaleEntryMM(self, value, axis): + try: + value = float(value) + except: + return + self._selectedObj.setSize(value, axis, self.scaleUniform.getValue()) + self.updateProfileToControls() + self.sceneUpdated() def sceneUpdated(self): self._sceneUpdateTimer.Start(1, True) @@ -255,14 +276,7 @@ class SceneView(openglGui.glGuiPanel): def _selectObject(self, obj, zoom = True): if obj != self._selectedObj: self._selectedObj = obj - scale = self._selectedObj.getScale() - size = self._selectedObj.getSize() - self.scaleXctrl.setValue(round(scale[0], 2)) - self.scaleYctrl.setValue(round(scale[1], 2)) - self.scaleZctrl.setValue(round(scale[2], 2)) - self.scaleXmmctrl.setValue(round(size[0], 2)) - self.scaleYmmctrl.setValue(round(size[1], 2)) - self.scaleZmmctrl.setValue(round(size[2], 2)) + self.updateProfileToControls() if zoom: newViewPos = numpy.array([obj.getPosition()[0], obj.getPosition()[1], obj.getMaximum()[2] / 2]) self._animView = anim(self._viewTarget.copy(), newViewPos, 0.5) @@ -284,6 +298,16 @@ class SceneView(openglGui.glGuiPanel): self._objColors[3] = profile.getPreferenceColour('model_colour4') self._scene.setMachineSize(self._machineSize) + if self._selectedObj is not None: + scale = self._selectedObj.getScale() + size = self._selectedObj.getSize() + self.scaleXctrl.setValue(round(scale[0], 2)) + self.scaleYctrl.setValue(round(scale[1], 2)) + self.scaleZctrl.setValue(round(scale[2], 2)) + self.scaleXmmctrl.setValue(round(size[0], 2)) + self.scaleYmmctrl.setValue(round(size[1], 2)) + self.scaleZmmctrl.setValue(round(size[2], 2)) + def OnKeyChar(self, keyCode): if keyCode == wx.WXK_DELETE or keyCode == wx.WXK_NUMPAD_DELETE: if self._selectedObj is not None: diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index 9fe24c85..1bf3f6ac 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -84,6 +84,30 @@ class printableObject(object): numpy.linalg.norm(self._matrix[::,1].getA().flatten()), numpy.linalg.norm(self._matrix[::,2].getA().flatten())], numpy.float64); + def setScale(self, scale, axis, uniform): + currentScale = numpy.linalg.norm(self._matrix[::,axis].getA().flatten()) + scale /= currentScale + if scale == 0: + return + if uniform: + matrix = [[scale,0,0], [0, scale, 0], [0, 0, scale]] + else: + matrix = [[1.0,0,0], [0, 1.0, 0], [0, 0, 1.0]] + matrix[axis][axis] = scale + self.applyMatrix(numpy.matrix(matrix, numpy.float64)) + + def setSize(self, size, axis, uniform): + scale = self.getSize()[axis] + scale = size / scale + if scale == 0: + return + if uniform: + 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.applyMatrix(numpy.matrix(matrix, numpy.float64)) + class mesh(object): def __init__(self): self.vertexes = None