chiark / gitweb /
Add zoom animation.
authordaid303 <daid303@gmail.com>
Fri, 22 Mar 2013 17:56:08 +0000 (18:56 +0100)
committerdaid303 <daid303@gmail.com>
Fri, 22 Mar 2013 17:56:08 +0000 (18:56 +0100)
Cura/gui/sceneView.py
Cura/gui/util/openglGui.py
Cura/util/mesh.py

index 5ada8220457ae726f16fdcf6c2c1516b428d9f32..4e154791fbe3c6868ecf3f72203422aebb744a78 100644 (file)
@@ -16,8 +16,8 @@ from Cura.gui.util import openglGui
 
 class anim(object):
        def __init__(self, start, end, runTime):
-               self._start = start.copy()
-               self._end = end.copy()
+               self._start = start
+               self._end = end
                self._startTime = time.time()
                self._runTime = runTime
 
@@ -47,13 +47,15 @@ class SceneView(openglGui.glGuiPanel):
                self._objColors = [None,None,None,None]
                self._mouseX = -1
                self._mouseY = -1
+               self._mouseState = None
                self._viewTarget = numpy.array([0,0,0], numpy.float32);
                self._animView = None
+               self._animZoom = None
                wx.EVT_IDLE(self, self.OnIdle)
                self.updateProfileToControls()
 
        def OnIdle(self, e):
-               if self._animView is not None:
+               if self._animView is not None or self._animZoom is not None:
                        self.Refresh()
 
        def loadScene(self, fileList):
@@ -87,25 +89,39 @@ class SceneView(openglGui.glGuiPanel):
        def OnMouseDown(self,e):
                self._mouseX = e.GetX()
                self._mouseY = e.GetY()
-               if self._focusObj is not None:
-                       self._selectedObj = self._focusObj
-                       newViewPos = (self._selectedObj.getMaximum() + self._selectedObj.getMinimum()) / 2
-                       self._animView = anim(self._viewTarget, newViewPos, 0.5)
+               if e.ButtonDClick():
+                       self._mouseState = 'doubleClick'
+               else:
+                       self._mouseState = 'dragOrClick'
+
+       def OnMouseUp(self, e):
+               if self._mouseState == 'dragOrClick':
+                       if e.Button == 1 and self._focusObj is not None:
+                               self._selectedObj = self._focusObj
+                               newViewPos = (self._selectedObj.getMaximum() + self._selectedObj.getMinimum()) / 2
+                               self._animView = anim(self._viewTarget.copy(), newViewPos, 0.5)
+               if self._mouseState == 'doubleClick':
+                       if self._selectedObj is not None:
+                               newZoom = numpy.linalg.norm(self._selectedObj.getSize()) * 2
+                               self._animZoom = anim(self._zoom, newZoom, 0.5)
+               self._mouseState = None
 
        def OnMouseMotion(self,e):
-               if e.Dragging() and e.LeftIsDown():
-                       self._yaw += e.GetX() - self._mouseX
-                       self._pitch -= e.GetY() - self._mouseY
-                       if self._pitch > 170:
-                               self._pitch = 170
-                       if self._pitch < 10:
-                               self._pitch = 10
-               if e.Dragging() and e.RightIsDown():
-                       self._zoom += e.GetY() - self._mouseY
-                       if self._zoom < 1:
-                               self._zoom = 1
-                       if self._zoom > numpy.max(self._machineSize) * 3:
-                               self._zoom = numpy.max(self._machineSize) * 3
+               if e.Dragging():
+                       self._mouseState == 'drag'
+                       if not e.LeftIsDown() and e.RightIsDown():
+                               self._yaw += e.GetX() - self._mouseX
+                               self._pitch -= e.GetY() - self._mouseY
+                               if self._pitch > 170:
+                                       self._pitch = 170
+                               if self._pitch < 10:
+                                       self._pitch = 10
+                       if (e.LeftIsDown() and e.RightIsDown()) or e.MiddleIsDown():
+                               self._zoom += e.GetY() - self._mouseY
+                               if self._zoom < 1:
+                                       self._zoom = 1
+                               if self._zoom > numpy.max(self._machineSize) * 3:
+                                       self._zoom = numpy.max(self._machineSize) * 3
                self._mouseX = e.GetX()
                self._mouseY = e.GetY()
 
@@ -143,6 +159,10 @@ class SceneView(openglGui.glGuiPanel):
                        self._viewTarget = self._animView.getPosition()
                        if self._animView.isDone():
                                self._animView = None
+               if self._animZoom is not None:
+                       self._zoom = self._animZoom.getPosition()
+                       if self._animZoom.isDone():
+                               self._animZoom = None
                if self._objectShader is None:
                        self._objectShader = opengl.GLShader("""
 uniform float cameraDistance;
@@ -210,6 +230,7 @@ void main(void)
 
        def _renderObject(self, obj):
                glPushMatrix()
+               glTranslate(obj.getPosition()[0], obj.getPosition()[1], 0)
                offset = obj.getDrawOffset()
                glTranslate(-offset[0], -offset[1], -offset[2])
                for m in obj._meshList:
index 3f11a48e16c79196cbf29daf66d6926d27a8f68b..3faffe3bcc002da824c728212943c0f79559e155 100644 (file)
@@ -120,10 +120,13 @@ class glGuiPanel(glcanvas.GLCanvas):
                wx.EVT_SIZE(self, self._OnSize)
                wx.EVT_ERASE_BACKGROUND(self, self._OnEraseBackground)
                wx.EVT_LEFT_DOWN(self, self._OnGuiMouseDown)
+               wx.EVT_LEFT_DCLICK(self, self._OnGuiMouseDown)
                wx.EVT_LEFT_UP(self, self._OnGuiMouseUp)
                wx.EVT_RIGHT_DOWN(self, self._OnGuiMouseDown)
+               wx.EVT_RIGHT_DCLICK(self, self._OnGuiMouseDown)
                wx.EVT_RIGHT_UP(self, self._OnGuiMouseUp)
                wx.EVT_MIDDLE_DOWN(self, self._OnGuiMouseDown)
+               wx.EVT_MIDDLE_DCLICK(self, self._OnGuiMouseDown)
                wx.EVT_MIDDLE_UP(self, self._OnGuiMouseUp)
                wx.EVT_MOTION(self, self._OnGuiMouseMotion)
                wx.EVT_CHAR(self, self._OnGuiKeyChar)
index ac5c6f149e7ea9bcf842bba22d42565cfeec9f0f..d12497f83c26510f35c718ccbf80b4386001657c 100644 (file)
@@ -51,6 +51,9 @@ class printableObject(object):
                self._transformedMax -= self._drawOffset
                self._transformedMin -= self._drawOffset
 
+       def getPosition(self):
+               return self._position
+
        def getMaximum(self):
                return self._transformedMax
        def getMinimum(self):