예제 #1
0
    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)
예제 #2
0
	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
예제 #3
0
파일: preview3d.py 프로젝트: cb0/Cura
	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()
예제 #4
0
	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()
예제 #5
0
	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)
예제 #6
0
	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()
예제 #7
0
    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()
예제 #8
0
    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()