def OnMouseLeftDown(self, e): self.allowDrag = True if not self.parent.alwaysAutoPlace and not self.view3D: p0 = opengl.unproject( e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport) p1 = opengl.unproject( e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport) p0 -= self.viewTarget p1 -= self.viewTarget p0 -= self.getObjectCenterPos() - self.viewTarget p1 -= self.getObjectCenterPos() - self.viewTarget cursorZ0 = p0 - (p1 - p0) * (p0[2] / (p1[2] - p0[2])) for item in self.parent.list: iMin = -item.getSize() / 2 + numpy.array( [item.centerX, item.centerY, 0]) iMax = item.getSize() / 2 + numpy.array( [item.centerX, item.centerY, 0]) if iMin[0] <= cursorZ0[0] <= iMax[0] and iMin[1] <= cursorZ0[ 1] <= iMax[1]: self.parent.selection = item self.parent._updateListbox() self.parent.OnListSelect(None)
def getMouseRay(self, x, y): if self._viewport is None: return numpy.array([0,0,0],numpy.float32), numpy.array([0,0,1],numpy.float32) p0 = opengl.unproject(x, self._viewport[1] + self._viewport[3] - y, 0, self._modelMatrix, self._projMatrix, self._viewport) p1 = opengl.unproject(x, self._viewport[1] + self._viewport[3] - y, 1, self._modelMatrix, self._projMatrix, self._viewport) p0 -= self._viewTarget p1 -= self._viewTarget return p0, p1
def OnMouseMotion(self,e): if self.parent.objectsMaxV is not None and self.viewport is not None and self.viewMode != 'GCode' and self.viewMode != 'Mixed': p0 = opengl.unproject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport) p1 = opengl.unproject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport) p0 -= self.viewTarget p1 -= self.viewTarget if not e.Dragging() or self.dragType != 'tool': self.parent.tool.OnMouseMove(p0, p1) else: p0 = [0,0,0] p1 = [1,0,0] if e.Dragging() and e.LeftIsDown(): if self.dragType == '': #Define the drag type depending on the cursor position. self.dragType = 'viewRotate' if self.viewMode != 'GCode' and self.viewMode != 'Mixed': if self.parent.tool.OnDragStart(p0, p1): self.dragType = 'tool' if self.dragType == 'viewRotate': if self.view3D: self.yaw += e.GetX() - self.oldX self.pitch -= e.GetY() - self.oldY if self.pitch > 170: self.pitch = 170 if self.pitch < 10: self.pitch = 10 else: self.viewTarget[0] -= float(e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2 self.viewTarget[1] += float(e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2 elif self.dragType == 'tool': self.parent.tool.OnDrag(p0, p1) #Workaround for buggy ATI cards. size = self.GetSizeTuple() self.SetSize((size[0]+1, size[1])) self.SetSize((size[0], size[1])) self.Refresh() else: if self.dragType != '': if self.tempMatrix is not None: self.parent.matrix *= self.tempMatrix self.parent.updateModelTransform() self.tempMatrix = None for obj in self.parent.objectList: obj.steepDirty = True self.parent.tool.OnDragEnd() self.dragType = '' if e.Dragging() and e.RightIsDown(): self.zoom += e.GetY() - self.oldY if self.zoom < 1: self.zoom = 1 if self.zoom > 500: self.zoom = 500 self.oldX = e.GetX() self.oldY = e.GetY()
def OnMouseMotion(self,e): if self.viewport is not None: p0 = opengl.unproject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport) p1 = opengl.unproject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport) p0 -= self.viewTarget p1 -= self.viewTarget p0 -= self.getObjectCenterPos() - self.viewTarget p1 -= self.getObjectCenterPos() - self.viewTarget if not e.Dragging() or self.dragType != 'tool': self.parent.tool.OnMouseMove(p0, p1) else: p0 = [0,0,0] p1 = [1,0,0] if self.allowDrag and e.Dragging() and e.LeftIsDown(): if self.dragType == '': #Define the drag type depending on the cursor position. self.dragType = 'viewRotate' if self.parent.tool.OnDragStart(p0, p1): self.dragType = 'tool' if self.dragType == 'viewRotate': if self.view3D: self.yaw += e.GetX() - self.oldX self.pitch -= e.GetY() - self.oldY if self.pitch > 170: self.pitch = 170 if self.pitch < 10: self.pitch = 10 elif not self.parent.alwaysAutoPlace: item = self.parent.selection if item is not None: item.centerX += float(e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2 item.centerY -= float(e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2 item.clampXY() elif self.dragType == 'tool': self.parent.tool.OnDrag(p0, p1) else: if self.dragType != '': if self.tempMatrix is not None: self.parent.selection.matrix *= self.tempMatrix self.parent.selection.updateMatrix() self.tempMatrix = None self.parent.tool.OnDragEnd() self.dragType = '' self.allowDrag = False if e.Dragging() and e.RightIsDown(): if self.view3D: self.zoom += e.GetY() - self.oldY if self.zoom < 1: self.zoom = 1 self.Refresh() self.oldX = e.GetX() self.oldY = e.GetY()
def OnMouseLeftDown(self,e): self.allowDrag = True if not self.parent.alwaysAutoPlace and not self.view3D: p0 = opengl.unproject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport) p1 = opengl.unproject(e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport) p0 -= self.viewTarget p1 -= self.viewTarget p0 -= self.getObjectCenterPos() - self.viewTarget p1 -= self.getObjectCenterPos() - self.viewTarget cursorZ0 = p0 - (p1 - p0) * (p0[2] / (p1[2] - p0[2])) for item in self.parent.list: iMin =-item.getSize() / 2 + numpy.array([item.centerX, item.centerY, 0]) iMax = item.getSize() / 2 + numpy.array([item.centerX, item.centerY, 0]) if iMin[0] <= cursorZ0[0] <= iMax[0] and iMin[1] <= cursorZ0[1] <= iMax[1]: self.parent.selection = item self.parent._updateListbox() self.parent.OnListSelect(None)
def OnPaint(self,e): if machineCom.machineIsConnected(): self.printButton._imageID = 6 self.printButton._tooltip = 'Print' elif len(removableStorage.getPossibleSDcardDrives()) > 0: self.printButton._imageID = 2 self.printButton._tooltip = 'Toolpath to SD' else: self.printButton._imageID = 3 self.printButton._tooltip = 'Save toolpath' if self._animView is not None: 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.viewMode == 'gcode' and self._gcode is not None: try: self._viewTarget[2] = self._gcode.layerList[self.layerSelect.getValue()][-1]['points'][0][2] except: pass if self._objectShader is None: if opengl.hasShaderSupport(): self._objectShader = opengl.GLShader(""" varying float light_amount; void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_FrontColor = gl_Color; light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz))); light_amount += 0.2; } """,""" varying float light_amount; void main(void) { gl_FragColor = vec4(gl_Color.xyz * light_amount, gl_Color[3]); } """) self._objectOverhangShader = opengl.GLShader(""" uniform float cosAngle; uniform mat3 rotMatrix; varying float light_amount; void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_FrontColor = gl_Color; light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz))); light_amount += 0.2; if (normalize(rotMatrix * gl_Normal).z < -cosAngle) { light_amount = -10.0; } } """,""" varying float light_amount; void main(void) { if (light_amount == -10.0) { gl_FragColor = vec4(1.0, 0.0, 0.0, gl_Color[3]); }else{ gl_FragColor = vec4(gl_Color.xyz * light_amount, gl_Color[3]); } } """) self._objectLoadShader = opengl.GLShader(""" uniform float intensity; uniform float scale; varying float light_amount; void main(void) { vec4 tmp = gl_Vertex; tmp.x += sin(tmp.z/5.0+intensity*30.0) * scale * intensity; tmp.y += sin(tmp.z/3.0+intensity*40.0) * scale * intensity; gl_Position = gl_ModelViewProjectionMatrix * tmp; gl_FrontColor = gl_Color; light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz))); light_amount += 0.2; } """,""" uniform float intensity; varying float light_amount; void main(void) { gl_FragColor = vec4(gl_Color.xyz * light_amount, 1.0-intensity); } """) if self._objectShader == None or not self._objectShader.isValid(): self._objectShader = opengl.GLFakeShader() self._objectOverhangShader = opengl.GLFakeShader() self._objectLoadShader = None self._init3DView() glTranslate(0,0,-self._zoom) glRotate(-self._pitch, 1,0,0) glRotate(self._yaw, 0,0,1) glTranslate(-self._viewTarget[0],-self._viewTarget[1],-self._viewTarget[2]) self._viewport = glGetIntegerv(GL_VIEWPORT) self._modelMatrix = glGetDoublev(GL_MODELVIEW_MATRIX) self._projMatrix = glGetDoublev(GL_PROJECTION_MATRIX) glClearColor(1,1,1,1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) if self.viewMode != 'gcode': for n in xrange(0, len(self._scene.objects())): obj = self._scene.objects()[n] glColor4ub((n >> 16) & 0xFF, (n >> 8) & 0xFF, (n >> 0) & 0xFF, 0xFF) self._renderObject(obj) if self._mouseX > -1: glFlush() n = glReadPixels(self._mouseX, self.GetSize().GetHeight() - 1 - self._mouseY, 1, 1, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)[0][0] >> 8 if n < len(self._scene.objects()): self._focusObj = self._scene.objects()[n] else: self._focusObj = None f = glReadPixels(self._mouseX, self.GetSize().GetHeight() - 1 - self._mouseY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT)[0][0] #self.GetTopLevelParent().SetTitle(hex(n) + " " + str(f)) self._mouse3Dpos = opengl.unproject(self._mouseX, self._viewport[1] + self._viewport[3] - self._mouseY, f, self._modelMatrix, self._projMatrix, self._viewport) self._mouse3Dpos -= self._viewTarget self._init3DView() glTranslate(0,0,-self._zoom) glRotate(-self._pitch, 1,0,0) glRotate(self._yaw, 0,0,1) glTranslate(-self._viewTarget[0],-self._viewTarget[1],-self._viewTarget[2]) if self.viewMode == 'gcode': if self._gcode is not None and self._gcode.layerList is None: self._gcodeLoadThread = threading.Thread(target=self._loadGCode) self._gcodeLoadThread.daemon = True self._gcodeLoadThread.start() if self._gcode is not None and self._gcode.layerList is not None: glPushMatrix() glTranslate(-self._machineSize[0] / 2, -self._machineSize[1] / 2, 0) t = time.time() drawUpTill = min(len(self._gcode.layerList), self.layerSelect.getValue() + 1) for n in xrange(0, drawUpTill): c = 1.0 - float(drawUpTill - n) / 15 c = max(0.3, c) if len(self._gcodeVBOs) < n + 1: self._gcodeVBOs.append(self._generateGCodeVBOs(self._gcode.layerList[n])) if time.time() - t > 0.5: self.QueueRefresh() break #['WALL-OUTER', 'WALL-INNER', 'FILL', 'SUPPORT', 'SKIRT'] if n == drawUpTill - 1: if len(self._gcodeVBOs[n]) < 9: self._gcodeVBOs[n] += self._generateGCodeVBOs2(self._gcode.layerList[n]) glColor3f(c, 0, 0) self._gcodeVBOs[n][8].render(GL_QUADS) glColor3f(c/2, 0, c) self._gcodeVBOs[n][9].render(GL_QUADS) glColor3f(0, c, c/2) self._gcodeVBOs[n][10].render(GL_QUADS) glColor3f(c, 0, 0) self._gcodeVBOs[n][11].render(GL_QUADS) glColor3f(0, c, 0) self._gcodeVBOs[n][12].render(GL_QUADS) glColor3f(c/2, c/2, 0.0) self._gcodeVBOs[n][13].render(GL_QUADS) glColor3f(0, c, c) self._gcodeVBOs[n][14].render(GL_QUADS) self._gcodeVBOs[n][15].render(GL_QUADS) glColor3f(0, 0, c) self._gcodeVBOs[n][16].render(GL_LINES) else: glColor3f(c, 0, 0) self._gcodeVBOs[n][0].render(GL_LINES) glColor3f(c/2, 0, c) self._gcodeVBOs[n][1].render(GL_LINES) glColor3f(0, c, c/2) self._gcodeVBOs[n][2].render(GL_LINES) glColor3f(c, 0, 0) self._gcodeVBOs[n][3].render(GL_LINES) glColor3f(0, c, 0) self._gcodeVBOs[n][4].render(GL_LINES) glColor3f(c/2, c/2, 0.0) self._gcodeVBOs[n][5].render(GL_LINES) glColor3f(0, c, c) self._gcodeVBOs[n][6].render(GL_LINES) self._gcodeVBOs[n][7].render(GL_LINES) glPopMatrix() else: glStencilFunc(GL_ALWAYS, 1, 1) glStencilOp(GL_INCR, GL_INCR, GL_INCR) if self.viewMode == 'overhang': self._objectOverhangShader.bind() self._objectOverhangShader.setUniform('cosAngle', math.cos(math.radians(90 - 60))) else: self._objectShader.bind() for obj in self._scene.objects(): if obj._loadAnim is not None: if obj._loadAnim.isDone(): obj._loadAnim = None else: continue brightness = 1.0 if self._focusObj == obj: brightness = 1.2 elif self._focusObj is not None or self._selectedObj is not None and obj != self._selectedObj: brightness = 0.8 if self._selectedObj == obj or self._selectedObj is None: #If we want transparent, then first render a solid black model to remove the printer size lines. if self.viewMode == 'transparent': glColor4f(0, 0, 0, 0) self._renderObject(obj) glEnable(GL_BLEND) glBlendFunc(GL_ONE, GL_ONE) glDisable(GL_DEPTH_TEST) brightness *= 0.5 if self.viewMode == 'xray': glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) glStencilOp(GL_INCR, GL_INCR, GL_INCR) glEnable(GL_STENCIL_TEST) if self.viewMode == 'overhang': if self._selectedObj == obj and self.tempMatrix is not None: self._objectOverhangShader.setUniform('rotMatrix', obj.getMatrix() * self.tempMatrix) else: self._objectOverhangShader.setUniform('rotMatrix', obj.getMatrix()) if not self._scene.checkPlatform(obj): glColor4f(0.5 * brightness, 0.5 * brightness, 0.5 * brightness, 0.8 * brightness) self._renderObject(obj) else: self._renderObject(obj, brightness) glDisable(GL_STENCIL_TEST) glDisable(GL_BLEND) glEnable(GL_DEPTH_TEST) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) if self.viewMode == 'xray': glPushMatrix() glLoadIdentity() glEnable(GL_STENCIL_TEST) glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) glDisable(GL_DEPTH_TEST) for i in xrange(2, 15, 2): glStencilFunc(GL_EQUAL, i, 0xFF) glColor(float(i)/10, float(i)/10, float(i)/5) glBegin(GL_QUADS) glVertex3f(-1000,-1000,-10) glVertex3f( 1000,-1000,-10) glVertex3f( 1000, 1000,-10) glVertex3f(-1000, 1000,-10) glEnd() for i in xrange(1, 15, 2): glStencilFunc(GL_EQUAL, i, 0xFF) glColor(float(i)/10, 0, 0) glBegin(GL_QUADS) glVertex3f(-1000,-1000,-10) glVertex3f( 1000,-1000,-10) glVertex3f( 1000, 1000,-10) glVertex3f(-1000, 1000,-10) glEnd() glPopMatrix() glDisable(GL_STENCIL_TEST) glEnable(GL_DEPTH_TEST) self._objectShader.unbind() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_BLEND) if self._objectLoadShader is not None: self._objectLoadShader.bind() glColor4f(0.2, 0.6, 1.0, 1.0) for obj in self._scene.objects(): if obj._loadAnim is None: continue self._objectLoadShader.setUniform('intensity', obj._loadAnim.getPosition()) self._objectLoadShader.setUniform('scale', obj.getBoundaryCircle() / 10) self._renderObject(obj) self._objectLoadShader.unbind() glDisable(GL_BLEND) self._drawMachine() if self.viewMode == 'gcode': if self._gcodeLoadThread is not None and self._gcodeLoadThread.isAlive(): glDisable(GL_DEPTH_TEST) glPushMatrix() glLoadIdentity() glTranslate(0,-4,-10) glColor4ub(60,60,60,255) opengl.glDrawStringCenter('Loading toolpath for visualization...') glPopMatrix() else: #Draw the object box-shadow, so you can see where it will collide with other objects. if self._selectedObj is not None and len(self._scene.objects()) > 1: size = self._selectedObj.getSize()[0:2] / 2 + self._scene.getObjectExtend() glPushMatrix() glTranslatef(self._selectedObj.getPosition()[0], self._selectedObj.getPosition()[1], 0) glEnable(GL_BLEND) glEnable(GL_CULL_FACE) glColor4f(0,0,0,0.12) glBegin(GL_QUADS) glVertex3f(-size[0], size[1], 0.1) glVertex3f(-size[0], -size[1], 0.1) glVertex3f( size[0], -size[1], 0.1) glVertex3f( size[0], size[1], 0.1) glEnd() glDisable(GL_CULL_FACE) glPopMatrix() #Draw the outline of the selected object, on top of everything else except the GUI. if self._selectedObj is not None and self._selectedObj._loadAnim is None: glDisable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glEnable(GL_STENCIL_TEST) glDisable(GL_BLEND) glStencilFunc(GL_EQUAL, 0, 255) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glLineWidth(2) glColor4f(1,1,1,0.5) self._renderObject(self._selectedObj) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glViewport(0, 0, self.GetSize().GetWidth(), self.GetSize().GetHeight()) glDisable(GL_STENCIL_TEST) glDisable(GL_CULL_FACE) glEnable(GL_DEPTH_TEST) if self._selectedObj is not None: glPushMatrix() pos = self.getObjectCenterPos() glTranslate(pos[0], pos[1], pos[2]) self.tool.OnDraw() glPopMatrix() if self.viewMode == 'overhang' and not opengl.hasShaderSupport(): glDisable(GL_DEPTH_TEST) glPushMatrix() glLoadIdentity() glTranslate(0,-4,-10) glColor4ub(60,60,60,255) opengl.glDrawStringCenter('Overhang view not working due to lack of OpenGL shaders support.') glPopMatrix()
def OnMouseMotion(self, e): if self.parent.objectsMaxV is not None and self.viewport is not None and self.viewMode != 'GCode' and self.viewMode != 'Mixed': p0 = opengl.unproject( e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport) p1 = opengl.unproject( e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport) p0 -= self.viewTarget p1 -= self.viewTarget if not e.Dragging() or self.dragType != 'tool': self.parent.tool.OnMouseMove(p0, p1) else: p0 = [0, 0, 0] p1 = [1, 0, 0] if e.Dragging() and e.LeftIsDown(): if self.dragType == '': #Define the drag type depending on the cursor position. self.dragType = 'viewRotate' if self.viewMode != 'GCode' and self.viewMode != 'Mixed': if self.parent.tool.OnDragStart(p0, p1): self.dragType = 'tool' if self.dragType == 'viewRotate': if self.view3D: self.yaw += e.GetX() - self.oldX self.pitch -= e.GetY() - self.oldY if self.pitch > 170: self.pitch = 170 if self.pitch < 10: self.pitch = 10 else: self.viewTarget[0] -= float( e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2 self.viewTarget[1] += float( e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2 elif self.dragType == 'tool': self.parent.tool.OnDrag(p0, p1) #Workaround for buggy ATI cards. size = self.GetSizeTuple() self.SetSize((size[0] + 1, size[1])) self.SetSize((size[0], size[1])) self.Refresh() else: if self.dragType != '': if self.tempMatrix is not None: self.parent.matrix *= self.tempMatrix self.parent.updateModelTransform() self.tempMatrix = None for obj in self.parent.objectList: obj.steepDirty = True self.parent.tool.OnDragEnd() self.dragType = '' if e.Dragging() and e.RightIsDown(): self.zoom += e.GetY() - self.oldY if self.zoom < 1: self.zoom = 1 if self.zoom > 500: self.zoom = 500 self.oldX = e.GetX() self.oldY = e.GetY()
def OnMouseMotion(self, e): if self.viewport is not None: p0 = opengl.unproject( e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 0, self.modelMatrix, self.projMatrix, self.viewport) p1 = opengl.unproject( e.GetX(), self.viewport[1] + self.viewport[3] - e.GetY(), 1, self.modelMatrix, self.projMatrix, self.viewport) p0 -= self.viewTarget p1 -= self.viewTarget p0 -= self.getObjectCenterPos() - self.viewTarget p1 -= self.getObjectCenterPos() - self.viewTarget if not e.Dragging() or self.dragType != 'tool': self.parent.tool.OnMouseMove(p0, p1) else: p0 = [0, 0, 0] p1 = [1, 0, 0] if self.allowDrag and e.Dragging() and e.LeftIsDown(): if self.dragType == '': #Define the drag type depending on the cursor position. self.dragType = 'viewRotate' if self.parent.tool.OnDragStart(p0, p1): self.dragType = 'tool' if self.dragType == 'viewRotate': if self.view3D: self.yaw += e.GetX() - self.oldX self.pitch -= e.GetY() - self.oldY if self.pitch > 170: self.pitch = 170 if self.pitch < 10: self.pitch = 10 elif not self.parent.alwaysAutoPlace: item = self.parent.selection if item is not None: item.centerX += float( e.GetX() - self.oldX) * self.zoom / self.GetSize( ).GetHeight() * 2 item.centerY -= float( e.GetY() - self.oldY) * self.zoom / self.GetSize( ).GetHeight() * 2 item.clampXY() elif self.dragType == 'tool': self.parent.tool.OnDrag(p0, p1) else: if self.dragType != '': if self.tempMatrix is not None: self.parent.selection.matrix *= self.tempMatrix self.parent.selection.updateMatrix() self.tempMatrix = None self.parent.tool.OnDragEnd() self.dragType = '' self.allowDrag = False if e.Dragging() and e.RightIsDown(): if self.view3D: self.zoom += e.GetY() - self.oldY if self.zoom < 1: self.zoom = 1 self.Refresh() self.oldX = e.GetX() self.oldY = e.GetY()