def leftDrag(self, event): """ Compute the changing rubber band window ending point. Erase the previous window, draw the new window. """ # bugs 1190, 1818 wware 4/05/2006 - sometimes Qt neglects to call leftDown # before this if not hasattr(self, "pWxy") or not hasattr(self, "firstDraw"): return cWxy = (event.pos().x(), self.glpane.height - event.pos().y()) rbwcolor = self.command.rbwcolor if not self.firstDraw: #Erase the previous rubber window drawrectangle(self.pStart, self.pPrev, self.glpane.up, self.glpane.right, rbwcolor) self.firstDraw = False self.pPrev = A(gluUnProject(cWxy[0], cWxy[1], 0.005)) # draw the new rubber band drawrectangle(self.pStart, self.pPrev, self.glpane.up, self.glpane.right, rbwcolor) glFlush() self.glpane.swapBuffers() # Update display return
def leftDrag(self, event): """ Compute the changing rubber band window ending point. Erase the previous window, draw the new window. """ # bugs 1190, 1818 wware 4/05/2006 - sometimes Qt neglects to call leftDown # before this if not hasattr(self, "pWxy") or not hasattr(self, "firstDraw"): return cWxy = (event.pos().x(), self.glpane.height - event.pos().y()) rbwcolor = self.command.rbwcolor if not self.firstDraw: #Erase the previous rubberband window drawrectangle(self.pStart, self.pPrev, self.glpane.up, self.glpane.right, rbwcolor) self.firstDraw = False self.pPrev = A(gluUnProject(cWxy[0], cWxy[1], 0.005)) # draw the new rubberband window drawrectangle(self.pStart, self.pPrev, self.glpane.up, self.glpane.right, rbwcolor) glFlush() self.glpane.swapBuffers() # Update display # Based on a suggestion in bug 2961, I added this second call to # swapBuffers(). It definitely helps, but the rectangle disappears # once the zoom cursor stops moving. I suspect this is due to # a gl_update() elsewhere. I'll ask Bruce about his thoughts on # this. --Mark 2008-12-22. self.glpane.swapBuffers() return
def draw(self): """ Draw the rectangle """ color = get_selCurve_color(self.selSense) drawrectangle(self.ptlist[0], self.ptlist[1], self.right, self.up, color)
def leftUp(self, event): """ Erase the final rubber band window and do zoom if user indeed draws a rubber band window. """ # bugs 1190, 1818 wware 4/05/2006 - sometimes Qt neglects to call # leftDown before this if not hasattr(self, "pWxy") or not hasattr(self, "firstDraw"): return cWxy = (event.pos().x(), self.glpane.height - event.pos().y()) zoomX = (abs(cWxy[0] - self.pWxy[0]) + 0.0) / (self.glpane.width + 0.0) zoomY = (abs(cWxy[1] - self.pWxy[1]) + 0.0) / (self.glpane.height + 0.0) # The rubber band window size can be larger than that of glpane. # Limit the zoomFactor to 1.0 zoomFactor = min(max(zoomX, zoomY), 1.0) # Huaicai: when rubber band window is too small, # like a double click, a single line rubber band, skip zoom DELTA = 1.0E-5 if self.pWxy[0] == cWxy[0] or self.pWxy[1] == cWxy[1] \ or zoomFactor < DELTA: self.command.command_Done() return # Erase the last rubber-band window rbwcolor = self.command.rbwcolor drawrectangle(self.pStart, self.pPrev, self.glpane.up, self.glpane.right, rbwcolor) glFlush() self.glpane.swapBuffers() winCenterX = (cWxy[0] + self.pWxy[0]) / 2.0 winCenterY = (cWxy[1] + self.pWxy[1]) / 2.0 winCenterZ = \ glReadPixelsf(int(winCenterX), int(winCenterY), 1, 1, GL_DEPTH_COMPONENT) assert winCenterZ[0][0] >= 0.0 and winCenterZ[0][0] <= 1.0 if winCenterZ[0][0] >= GL_FAR_Z: # window center touches nothing p1 = A(gluUnProject(winCenterX, winCenterY, 0.005)) p2 = A(gluUnProject(winCenterX, winCenterY, 1.0)) los = self.glpane.lineOfSight k = dot(los, -self.glpane.pov - p1) / dot(los, p2 - p1) zoomCenter = p1 + k*(p2-p1) else: zoomCenter = \ A(gluUnProject(winCenterX, winCenterY, winCenterZ[0][0])) self.glpane.pov = V(-zoomCenter[0], -zoomCenter[1], -zoomCenter[2]) # The following are 2 ways to do the zoom, the first one # changes view angles, the 2nd one change viewing distance # The advantage for the 1st one is model will not be clipped by # near or back clipping planes, and the rubber band can be # always shown. The disadvantage: when the view field is too # small, a selection window may be actually act as a single pick. # rubber band window will not look as rectangular any more. #zf = self.glpane.getZoomFactor() # [note: method does not exist] #zoomFactor = pow(zoomFactor, 0.25) #zoomFactor *= zf #self.glpane.setZoomFactor(zoomFactor) # [note: method does not exist] # Change viewing distance to do zoom. This works better with # mouse wheel, since both are changing viewing distance, and # it's not too bad of model being clipped, since the near/far clip # plane change as scale too. self.glpane.scale *= zoomFactor self.command.command_Done() return
def leftUp(self, event): """ Erase the final rubber band window and do zoom if user indeed draws a rubber band window. """ # bugs 1190, 1818 wware 4/05/2006 - sometimes Qt neglects to call # leftDown before this if not hasattr(self, "pWxy") or not hasattr(self, "firstDraw"): return cWxy = (event.pos().x(), self.glpane.height - event.pos().y()) zoomX = (abs(cWxy[0] - self.pWxy[0]) + 0.0) / (self.glpane.width + 0.0) zoomY = (abs(cWxy[1] - self.pWxy[1]) + 0.0) / (self.glpane.height + 0.0) # The rubber band window size can be larger than that of glpane. # Limit the zoomFactor to 1.0 zoomFactor = min(max(zoomX, zoomY), 1.0) # Huaicai: when rubber band window is too small, # like a double click, a single line rubber band, skip zoom DELTA = 1.0E-5 if self.pWxy[0] == cWxy[0] or self.pWxy[1] == cWxy[1] \ or zoomFactor < DELTA: self.command.Done() return # Erase the last rubber-band window rbwcolor = self.command.rbwcolor drawrectangle(self.pStart, self.pPrev, self.glpane.up, self.glpane.right, rbwcolor) glFlush() self.glpane.swapBuffers() winCenterX = (cWxy[0] + self.pWxy[0]) / 2.0 winCenterY = (cWxy[1] + self.pWxy[1]) / 2.0 winCenterZ = \ glReadPixelsf(int(winCenterX), int(winCenterY), 1, 1, GL_DEPTH_COMPONENT) assert winCenterZ[0][0] >= 0.0 and winCenterZ[0][0] <= 1.0 if winCenterZ[0][0] >= GL_FAR_Z: # window center touches nothing p1 = A(gluUnProject(winCenterX, winCenterY, 0.005)) p2 = A(gluUnProject(winCenterX, winCenterY, 1.0)) los = self.glpane.lineOfSight k = dot(los, -self.glpane.pov - p1) / dot(los, p2 - p1) zoomCenter = p1 + k * (p2 - p1) else: zoomCenter = \ A(gluUnProject(winCenterX, winCenterY, winCenterZ[0][0])) self.glpane.pov = V(-zoomCenter[0], -zoomCenter[1], -zoomCenter[2]) # The following are 2 ways to do the zoom, the first one # changes view angles, the 2nd one change viewing distance # The advantage for the 1st one is model will not be clipped by # near or back clipping planes, and the rubber band can be # always shown. The disadvantage: when the view field is too # small, a selection window may be actually act as a single pick. # rubber ban window will not look as rectanglular any more. #zf = self.glpane.getZoomFactor() #zoomFactor = pow(zoomFactor, 0.25) #zoomFactor *= zf #self.glpane.setZoomFactor(zoomFactor) # Change viewing distance to do zoom. This works better with # mouse wheel, since both are changing viewing distance, and # it's not too bad of model being clipped, since the near/far clip # plane change as scale too. self.glpane.scale *= zoomFactor self.command.Done(exit_using_done_or_cancel_button=False) return