chiark / gitweb /
Change how the engine is interfaced from the python code. Put the GCode viewer in...
[cura.git] / Cura / gui / util / previewTools.py
index 553ead0a52392ee2172ed9f8e004d951eae18d37..372d9cf2ff039bc3a3f6d16d4812ba043257665a 100644 (file)
@@ -1,16 +1,36 @@
 from __future__ import absolute_import
+__copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
 
 import math
 import wx
 import numpy
 
 import OpenGL
-OpenGL.ERROR_CHECKING = False
+#OpenGL.ERROR_CHECKING = False
 from OpenGL.GLU import *
 from OpenGL.GL import *
 
 from Cura.gui.util import opengl
 
+class toolNone(object):
+       def __init__(self, parent):
+               self.parent = parent
+
+       def OnMouseMove(self, p0, p1):
+               pass
+
+       def OnDragStart(self, p0, p1):
+               return False
+
+       def OnDrag(self, p0, p1):
+               pass
+
+       def OnDragEnd(self):
+               pass
+
+       def OnDraw(self):
+               pass
+
 class toolInfo(object):
        def __init__(self, parent):
                self.parent = parent
@@ -104,7 +124,7 @@ class toolRotate(object):
                cursorX0, cursorY0, cursorZ0, cursorYZ, cursorXZ, cursorXY = self._ProjectToPlanes(p0, p1)
                oldDragPlane = self.dragPlane
                if radius * self.rotateRingDistMin <= cursorXY <= radius * self.rotateRingDistMax or radius * self.rotateRingDistMin <= cursorYZ <= radius * self.rotateRingDistMax or radius * self.rotateRingDistMin <= cursorXZ <= radius * self.rotateRingDistMax:
-                       self.parent.SetCursor(wx.StockCursor(wx.CURSOR_SIZING))
+                       #self.parent.SetCursor(wx.StockCursor(wx.CURSOR_SIZING))
                        if self.dragStartAngle is None:
                                if radius * self.rotateRingDistMin <= cursorXY <= radius * self.rotateRingDistMax:
                                        self.dragPlane = 'XY'
@@ -115,7 +135,7 @@ class toolRotate(object):
                else:
                        if self.dragStartAngle is None:
                                self.dragPlane = ''
-                       self.parent.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
+                       #self.parent.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
 
        def OnDragStart(self, p0, p1):
                radius = self.parent.getObjectBoundaryCircle()
@@ -130,6 +150,7 @@ class toolRotate(object):
                        else:
                                self.dragPlane = 'YZ'
                                self.dragStartAngle = math.atan2(cursorX0[2], cursorX0[1]) * 180 / math.pi
+                       self.dragEndAngle = self.dragStartAngle
                        return True
                return False
 
@@ -188,7 +209,7 @@ class toolRotate(object):
                                glEnd()
                                glTranslatef(1.1,0,0)
                                glColor4ub(0,0,0,255)
-                               opengl.glDrawStringCenter("%d" % (abs(self.dragEndAngle - self.dragStartAngle)))
+                               opengl.glDrawStringCenter("%d" % (abs(self.dragEndAngle - self.dragStartAngle) + 0.5))
                                glColor4ub(255,64,64,255)
                                glPopMatrix()
                else:
@@ -296,7 +317,7 @@ class toolScale(object):
                return t
 
        def _nodeSize(self):
-               return float(self.parent.zoom) / float(self.parent.GetSize().GetWidth()) * 6.0
+               return float(self.parent._zoom) / float(self.parent.GetSize().GetWidth()) * 6.0
 
        def OnMouseMove(self, p0, p1):
                self.node = self._traceNodes(p0, p1)
@@ -317,7 +338,19 @@ class toolScale(object):
                        endPoint = [0,0,1]
                scale = self._lineLineCrossingDistOnLine(p0, p1, numpy.array([0,0,0], numpy.float32), numpy.array(endPoint, numpy.float32)) / 15.0 / s
                if not wx.GetKeyState(wx.WXK_SHIFT):
-                       scale = round(scale * 10) / 10
+                       objMatrix = self.parent.getObjectMatrix()
+                       scaleX = numpy.linalg.norm(objMatrix[::,0].getA().flatten())
+                       scaleY = numpy.linalg.norm(objMatrix[::,1].getA().flatten())
+                       scaleZ = numpy.linalg.norm(objMatrix[::,2].getA().flatten())
+                       if self.node == 1 or not wx.GetKeyState(wx.WXK_CONTROL):
+                               matrixScale = (scaleX + scaleY + scaleZ) / 3
+                       elif self.node == 2:
+                               matrixScale = scaleX
+                       elif self.node == 3:
+                               matrixScale = scaleY
+                       elif self.node == 4:
+                               matrixScale = scaleZ
+                       scale = (round((matrixScale * scale) * 10) / 10) / matrixScale
                if scale < 0:
                        scale = -scale
                if scale < 0.1:
@@ -347,9 +380,9 @@ class toolScale(object):
                if self.node == 4 and self.scale is not None:
                        sz *= self.scale
                objMatrix = self.parent.getObjectMatrix()
-               scaleX = numpy.linalg.norm(objMatrix[0].getA().flatten())
-               scaleY = numpy.linalg.norm(objMatrix[1].getA().flatten())
-               scaleZ = numpy.linalg.norm(objMatrix[2].getA().flatten())
+               scaleX = numpy.linalg.norm(objMatrix[::,0].getA().flatten())
+               scaleY = numpy.linalg.norm(objMatrix[::,1].getA().flatten())
+               scaleZ = numpy.linalg.norm(objMatrix[::,2].getA().flatten())
                if self.scale is not None:
                        scaleX *= self.scale
                        scaleY *= self.scale
@@ -362,17 +395,21 @@ class toolScale(object):
 
                glColor3ub(0,0,0)
                size = self.parent.getObjectSize()
-               radius = self.parent.getObjectBoundaryCircle() * max(scaleX, scaleY, scaleZ)
+               radius = self.parent.getObjectBoundaryCircle()
+               if self.scale is not None:
+                       radius *= self.scale
                glPushMatrix()
                glTranslate(0,0,size[2]/2 + 5)
-               glRotate(-self.parent.yaw, 0,0,1)
-               if self.parent.pitch < 80:
+               glRotate(-self.parent._yaw, 0,0,1)
+               if self.parent._pitch < 80:
                        glTranslate(0, radius + 5,0)
-               elif self.parent.pitch < 100:
-                       glTranslate(0, (radius + 5) * (90 - self.parent.pitch) / 10,0)
+               elif self.parent._pitch < 100:
+                       glTranslate(0, (radius + 5) * (90 - self.parent._pitch) / 10,0)
                else:
                        glTranslate(0,-(radius + 5),0)
-               opengl.glDrawStringCenter("%dx%dx%d" % (size[0] * scaleX, size[1] * scaleY, size[2] * scaleZ))
+               if self.parent.tempMatrix is not None:
+                       size = (numpy.matrix([size]) * self.parent.tempMatrix).getA().flatten()
+               opengl.glDrawStringCenter("W, D, H: %0.1f, %0.1f, %0.1f mm" % (size[0], size[1], size[2]))
                glPopMatrix()
 
                glLineWidth(1)
@@ -380,10 +417,10 @@ class toolScale(object):
                glColor3ub(128,0,0)
                glVertex3f(0, 0, 0)
                glVertex3f(sx, 0, 0)
-               glColor3ub(128,128,0)
+               glColor3ub(0,128,0)
                glVertex3f(0, 0, 0)
                glVertex3f(0, sy, 0)
-               glColor3ub(0,128,0)
+               glColor3ub(0,0,128)
                glVertex3f(0, 0, 0)
                glVertex3f(0, 0, sz)
                glEnd()
@@ -410,9 +447,9 @@ class toolScale(object):
                        opengl.glDrawStringCenter("%0.2f" % (scaleX))
                glPopMatrix()
                if self.node == 3:
-                       glColor3ub(255,255,0)
+                       glColor3ub(64,255,64)
                else:
-                       glColor3ub(128,128,0)
+                       glColor3ub(0,128,0)
                glPushMatrix()
                glTranslatef(0,sy,0)
                opengl.DrawBox([-s,-s,-s], [s,s,s])
@@ -421,9 +458,9 @@ class toolScale(object):
                        opengl.glDrawStringCenter("%0.2f" % (scaleY))
                glPopMatrix()
                if self.node == 4:
-                       glColor3ub(64,255,64)
+                       glColor3ub(64,64,255)
                else:
-                       glColor3ub(0,128,0)
+                       glColor3ub(0,0,128)
                glPushMatrix()
                glTranslatef(0,0,sz)
                opengl.DrawBox([-s,-s,-s], [s,s,s])
@@ -433,3 +470,66 @@ class toolScale(object):
                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])
+               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])
+               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])
+
+               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])
+               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)