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
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
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
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
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
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
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
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