chiark / gitweb /
Add working scale entry form.
authordaid303 <daid303@gmail.com>
Mon, 8 Apr 2013 08:31:18 +0000 (10:31 +0200)
committerdaid303 <daid303@gmail.com>
Mon, 8 Apr 2013 08:31:18 +0000 (10:31 +0200)
Cura/gui/sceneView.py
Cura/util/mesh.py

index d130883787f9a27b8d6c6a5d0d5d90e17bfdd644..7a1fc5bfc3908418eae4261e002de3535b89da43 100644 (file)
@@ -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:
index 9fe24c85701342abbd42acbed69afecf85612e7c..1bf3f6ac4f6d6e4dc4996a3d515a98f799affb17 100644 (file)
@@ -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