chiark / gitweb /
It is a bit tricked, but you can now rotate the model with a circle around the model...
authordaid <daid303@gmail.com>
Mon, 24 Sep 2012 14:37:52 +0000 (16:37 +0200)
committerdaid <daid303@gmail.com>
Mon, 24 Sep 2012 14:37:52 +0000 (16:37 +0200)
Cura/gui/preview3d.py

index 97f8a3f22daf7dd78e0feea1e46569fbb2fd4815..3899d08f1a14a40f7165d360125a3715c14b4ceb 100644 (file)
@@ -273,7 +273,7 @@ class previewPanel(wx.Panel):
                                size = (self.objectsMaxV - self.objectsMinV) * scale\r
                                if size[0] > self.machineSize.x or size[1] > self.machineSize.y or size[2] > self.machineSize.z:\r
                                        self.OnScaleMax(None)\r
-                               self.glCanvas.zoom = numpy.max(size) * 1.7\r
+                               self.glCanvas.zoom = numpy.max(size) * 2.5\r
                                self.errorList = []\r
                                wx.CallAfter(self.updateToolbar)\r
                                wx.CallAfter(self.glCanvas.Refresh)\r
@@ -419,6 +419,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                self.objColor = [[1.0, 0.8, 0.6, 1.0], [0.2, 1.0, 0.1, 1.0], [1.0, 0.2, 0.1, 1.0], [0.1, 0.2, 1.0, 1.0]]\r
                self.oldX = 0\r
                self.oldY = 0\r
+               self.dragType = ''\r
+               self.tempRotate = 0\r
        \r
        def updateProfileToControls(self):\r
                self.objColor[0] = profile.getPreferenceColour('model_colour')\r
@@ -427,23 +429,54 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                self.objColor[3] = profile.getPreferenceColour('model_colour3')\r
 \r
        def OnMouseMotion(self,e):\r
+               size = (self.parent.objectsMaxV - self.parent.objectsMinV)\r
+               sizeXY = math.sqrt((size[0] * size[0]) + (size[1] * size[1]))\r
+               \r
+               p0 = numpy.array(gluUnProject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport))\r
+               p1 = numpy.array(gluUnProject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport))\r
+               cursorZ0 = p0 - (p1 - p0) * (p0[2] / (p1[2] - p0[2]))\r
+               cursorXY = math.sqrt((cursorZ0[0] * cursorZ0[0]) + (cursorZ0[1] * cursorZ0[1]))\r
+               if cursorXY >= sizeXY * 0.7 and cursorXY <= sizeXY * 0.7 + 3:\r
+                       self.SetCursor(wx.StockCursor(wx.CURSOR_SIZING))\r
+               else:\r
+                       self.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))\r
+\r
                if e.Dragging() and e.LeftIsDown():\r
-                       if self.view3D:\r
-                               self.yaw += e.GetX() - self.oldX\r
-                               self.pitch -= e.GetY() - self.oldY\r
-                               if self.pitch > 170:\r
-                                       self.pitch = 170\r
-                               if self.pitch < 10:\r
-                                       self.pitch = 10\r
-                       else:\r
-                               self.offsetX += float(e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2\r
-                               self.offsetY -= float(e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2\r
-                       \r
+                       if self.dragType == '':\r
+                               #Define the drag type depending on the cursor position.\r
+                               if cursorXY >= sizeXY * 0.7 and cursorXY <= sizeXY * 0.7 + 3:\r
+                                       self.dragType = 'modelRotate'\r
+                                       self.dragStart = math.atan2(cursorZ0[0], cursorZ0[1])\r
+                               else:\r
+                                       self.dragType = 'viewRotate'\r
+                               \r
+                       if self.dragType == 'viewRotate':\r
+                               if self.view3D:\r
+                                       self.yaw += e.GetX() - self.oldX\r
+                                       self.pitch -= e.GetY() - self.oldY\r
+                                       if self.pitch > 170:\r
+                                               self.pitch = 170\r
+                                       if self.pitch < 10:\r
+                                               self.pitch = 10\r
+                               else:\r
+                                       self.offsetX += float(e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2\r
+                                       self.offsetY -= float(e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2\r
+                       elif self.dragType == 'modelRotate':\r
+                               angle = math.atan2(cursorZ0[0], cursorZ0[1])\r
+                               diff = self.dragStart - angle\r
+                               self.tempRotate = diff * 180 / math.pi\r
                        #Workaround for buggy ATI cards.\r
                        size = self.GetSizeTuple()\r
                        self.SetSize((size[0]+1, size[1]))\r
                        self.SetSize((size[0], size[1]))\r
                        self.Refresh()\r
+               else:\r
+                       if self.tempRotate != 0:\r
+                               profile.putProfileSetting('model_rotate_base', profile.getProfileSettingFloat('model_rotate_base') + self.tempRotate)\r
+                               self.parent.updateModelTransform()\r
+                               self.tempRotate = 0\r
+                               \r
+                       self.dragType = ''\r
                if e.Dragging() and e.RightIsDown():\r
                        self.zoom += e.GetY() - self.oldY\r
                        if self.zoom < 1:\r
@@ -451,6 +484,9 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                        self.Refresh()\r
                self.oldX = e.GetX()\r
                self.oldY = e.GetY()\r
+\r
+               #self.Refresh()\r
+               \r
        \r
        def OnMouseWheel(self,e):\r
                self.zoom *= 1.0 - float(e.GetWheelRotation() / e.GetWheelDelta()) / 10.0\r
@@ -482,10 +518,15 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                        glTranslate(0,0,-self.parent.gcode.layerList[self.parent.layerSpin.GetValue()][0].list[-1].z)\r
                        else:\r
                                if self.parent.objectsMaxV != None:\r
-                                       glTranslate(0,0,-self.parent.objectsMaxV[2] * profile.getProfileSettingFloat('model_scale') / 2)\r
+                                       glTranslate(0,0,-(self.parent.objectsMaxV[2]-self.parent.objectsMinV[2]) * profile.getProfileSettingFloat('model_scale') / 2)\r
                else:\r
                        glScale(1.0/self.zoom, 1.0/self.zoom, 1.0)\r
                        glTranslate(self.offsetX, self.offsetY, 0.0)\r
+\r
+               self.viewport = glGetIntegerv(GL_VIEWPORT);\r
+               self.modelMatrix = glGetDoublev(GL_MODELVIEW_MATRIX);\r
+               self.projMatrix = glGetDoublev(GL_PROJECTION_MATRIX);\r
+\r
                glTranslate(-self.parent.machineCenter.x, -self.parent.machineCenter.y, 0)\r
 \r
                self.OnDraw()\r
@@ -529,6 +570,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                self.drawModel(obj)\r
                                glColor3f(1.0,1.0,1.0)\r
                                glClear(GL_DEPTH_BUFFER_BIT)\r
+               \r
                glPopMatrix()\r
                \r
                if self.parent.gcode != None and (self.viewMode == "GCode" or self.viewMode == "Mixed"):\r
@@ -654,6 +696,28 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                        glEnd()\r
                        glEnable(GL_DEPTH_TEST)\r
                opengl.DrawMachine(machineSize)\r
+\r
+               glPushMatrix()\r
+               glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0)\r
+               \r
+               #Draw the rotate circle\r
+               glDisable(GL_LIGHTING)\r
+               glDisable(GL_CULL_FACE)\r
+               glEnable(GL_BLEND)\r
+               glBegin(GL_TRIANGLE_STRIP)\r
+               size = (self.parent.objectsMaxV - self.parent.objectsMinV)\r
+               sizeXY = math.sqrt((size[0] * size[0]) + (size[1] * size[1]))\r
+               for i in xrange(0, 64+1):\r
+                       f = i if i < 64/2 else 64 - i\r
+                       glColor4ub(255,int(f*255/(64/2)),0,128)\r
+                       glVertex3f(sizeXY * 0.7 * math.cos(i/32.0*math.pi), sizeXY * 0.7 * math.sin(i/32.0*math.pi),0.1)\r
+                       glColor4ub(  0,128,0,128)\r
+                       glVertex3f((sizeXY * 0.7 + 3) * math.cos(i/32.0*math.pi), (sizeXY * 0.7 + 3) * math.sin(i/32.0*math.pi),0.1)\r
+               glEnd()\r
+               glEnable(GL_CULL_FACE)\r
+               \r
+               glPopMatrix()\r
+               \r
                glFlush()\r
        \r
        def drawModel(self, obj):\r
@@ -662,6 +726,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                modelScale = profile.getProfileSettingFloat('model_scale')\r
                modelSize = (obj.mesh.getMaximum() - obj.mesh.getMinimum()) * modelScale\r
                glPushMatrix()\r
+               glRotate(self.tempRotate, 0, 0, 1)\r
                glTranslate(-(modelSize[0]+10)*(multiX-1)/2,-(modelSize[1]+10)*(multiY-1)/2, 0)\r
                for mx in xrange(0, multiX):\r
                        for my in xrange(0, multiY):\r