geosolver/workbench/glViewer.py
kwikrick 22e159a5ad Changes to GeometricSolver:
- Added RigidConstraint.
- Depricated some methods (get_result, get_constrainedness) and 
added some new methods (get_solution, get_cluster, get_status).

Removed old SelectionConstraint and renamed FunctionConstraint to SelectionConstraint

Depricated ClusterSolver2D
Small bugfixes in cluster ClusterSolver3D

Renamed solvergui directory to workbench

Renamed solvertest directory to test
2009-10-09 12:23:02 +00:00

510 lines
18 KiB
Python

from includes import *
from camera import *
from cameraHandler import *
from prototypeObjects import *
from sceneObjects import *
from parameters import Settings
from geosolver.matfunc import Vec
import viewport
try:
from OpenGL.GL import *
from OpenGL.GLU import *
except ImportError:
app = QtGui.QApplication(sys.argv)
QtGui.QMessageBox.critical(None, "OpenGL grabber","PyOpenGL must be installed to run this example.",
QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default, QtGui.QMessageBox.NoButton)
sys.exit(1)
class GLViewport(QtOpenGL.QGLWidget):
def __init__(self, viewport, vpType, shareWidget=None, format=None, parent=None):
QtOpenGL.QGLWidget.__init__(self, format, parent)
self.gridColor = QtGui.QColor(190,190,190)
#self.gridVisible = True
self.viewport = viewport
self.sceneObjects = SceneObject(self)
self.setMouseTracking(True)
self.windowWidth = 0
self.windowHeight = 0
self.zoomfactor = 1.0
self.scaleAxis = 1.0
self.viewportType = vpType
self.camera = None
self.cameraHandler = CameraHandler(self)
self.selectionHandler = SelectionHandler()
self.settings = Settings()
self.bindings = {}
self.bufferSize = 4000
self.selectRegionWidth = 3
self.selectRegionHeight = 3
self.selectionRect = QtCore.QRect()
self.selectedName = -1
self.texture = None
self.mousePosition = Vec([0.0, 0.0, 0.0])
self.prtManager = PrototypeManager()
self.currentTool = None
self.updateStatusBar = UpdateTaskbarCommand(self, self.getMainWindow())
if self.viewportType == ViewportType.PERSPECTIVE or self.viewportType == ViewportType.SOLUTION:
self.camera = Camera(self, CameraType.PERSPECTIVE)
else:
self.camera = Camera(self, CameraType.ORTHOGRAPHIC)
self.createTriggers()
self.setCameraView()
self.setBindings()
def initializeGL(self):
mat_specular = [0.1, 0.1, 0.1, 0.5]
mat_emission = [0.0, 0.0, 0.0, 1.0]
mat_shininess = [10.0]
light_position = [1.0, 1.0, 0.0, 0.0]
light_position2 = [-100.0, -100.0, -100.0, 0.0]
light_ambient = [0.2, 0.2, 0.2, 1.0]
light_diffuse = [1.0, 1.0, 1.0, 1.0]
glLightfv(GL_LIGHT0, GL_POSITION, light_position)
glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient )
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse )
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE)
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular)
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission)
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST )
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glShadeModel( GL_SMOOTH )
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glEnable(GL_NORMALIZE)
glEnable(GL_COLOR_MATERIAL)
#glEnable(GL_CULL_FACE)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
self.setBackgroundColor()
#self.zoom(1.0)
def createTriggers(self):
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("showGridChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("gridWidthChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("gridHeightChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("backgroundColorChanged"), self.setBackgroundColor)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("backgroundColorChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("pointSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("fPointSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("lineSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("distanceSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("pointColorChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("fPointColorChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("lineColorChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("angleColorChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("selectionColorChanged"), self.update)
QtCore.QObject.connect(self.settings.sketcherData,QtCore.SIGNAL("distanceColorChanged"), self.update)
def paintGL(self):
self.preDraw()
self.draw()
self.postDraw()
glFlush()
def preDraw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
self.camera.loadProjection()
self.camera.loadModelView()
self.showGrid()
def showGrid(self):
if self.settings.sketcherData.showGrid:
self.qglColor(QtGui.QColor(0.0, 0.0, 0.0))
self.drawGrid()
def draw(self):
self.prtManager.drawObjects()
def postDraw(self):
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
self.camera.loadModelView()
glPushAttrib(GL_ALL_ATTRIB_BITS)
glDisable(GL_COLOR_MATERIAL)
self.startOverlay()
self.drawViewportAxis()
self.drawRotationHelper()
if self.viewport.isActive():
self.drawSelection()
#self.sceneObjects.testDraw2()
self.endOverlay()
#glDisable(GL_LIGHTING)
#self.drawText(100.0, 100.0, "GALLOEWTERGERGEG")
glPopAttrib()
glPopMatrix()
def transparentDraw(self):
self.prtManager.drawTransparentObjects()
def resizeGL(self, newWidth, newHeight):
glViewport( 0, 0, newWidth, newHeight)
self.windowWidth = newWidth
self.windowHeight = newHeight
self.camera.setScreenWidthAndHeight(newWidth, newHeight)
def setCameraView(self):
if self.viewportType == ViewportType.TOP:
self.camera.setPosition([0.0, 300.0, 0.0])
elif self.viewportType == ViewportType.SIDE:
self.camera.setPosition([300.0, 0.0, 0.0])
elif self.viewportType == ViewportType.FRONT:
self.camera.setPosition([0.0, 0.0, 300.0])
elif self.viewportType == ViewportType.PERSPECTIVE:
self.camera.setPosition([-200.0, 200.0, 300.0])
elif self.viewportType == ViewportType.SOLUTION:
self.camera.setPosition([-200.0, 200.0, 300.0])
self.camera.lookAt(self.camera.getSceneCenter())
def getViewportType(self):
return self.viewportType
def getCamera(self):
return self.camera
def startOverlay(self, upward=False):
glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()
if (upward):
glOrtho(0, self.camera.getWindowWidth(), 0, self.camera.getWindowHeight(), 0.1, 100.0)
else:
glOrtho(0, self.camera.getWindowWidth(),self.camera.getWindowHeight(), 0.0, 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()
glEnable(GL_COLOR_MATERIAL)
def endOverlay(self):
glMatrixMode(GL_PROJECTION)
glPopMatrix()
glMatrixMode(GL_MODELVIEW)
glPopMatrix()
def drawGrid(self):
if self.viewportType == ViewportType.PERSPECTIVE or self.viewportType == ViewportType.SOLUTION:
self.sceneObjects.drawBackgroundgrid3D(600, 600, self.settings.sketcherData.gridWidth, self.settings.sketcherData.gridHeight, self.gridColor, False)
else:
self.sceneObjects.drawBackgroundgrid2D(self.settings.sketcherData.gridWidth, self.settings.sketcherData.gridHeight, self.gridColor, False)
def drawSelection(self):
if self.currentTool != None and self.currentTool.multipleSelect and self.currentTool.selectionStarted:
self.sceneObjects.drawSelection(self.currentTool.beginSelPoint.x(), self.currentTool.beginSelPoint.y(), self.currentTool.endSelPoint.x(), self.currentTool.endSelPoint.y())
"""glPushMatrix()
glDisable(GL_LIGHTING)
glRectf(self.currentTool.beginSelPoint.x(), self.currentTool.beginSelPoint.y(), self.currentTool.endSelPoint.x(), self.currentTool.endSelPoint.y())
glEnable(GL_LIGHTING)
glPopMatrix() """
def drawViewportAxis(self):
glPushMatrix()
#glScalef(self.scaleAxis,self.scaleAxis,1.0)
glTranslatef(20.0, self.camera.getWindowHeight()-40.0, -50.0)
rotAxis = Vec([0.0,0.0,0.0])
rotAngle = self.camera.getOrientation().getAxisAngle(self.camera.getOrientation(), rotAxis)
glRotatef(rotAngle, rotAxis[0], -rotAxis[1], rotAxis[2])
self.sceneObjects.drawXAxis()
self.sceneObjects.drawYAxis()
self.sceneObjects.drawZAxis()
glPopMatrix()
def setMouseBinding(self, mouseAction, state):
self.bindings[mouseAction] = state
def mouseAction(self, state):
for key in self.bindings:
if self.bindings[key] == state:
return key
return None
def getMouseState(self, key):
return self.bindings[key]
def getMainWindow(self):
return self.viewport.getMainWindow()
def setBindings(self):
self.setMouseBinding(MouseAction.TRANSLATE, QtCore.Qt.LeftButton)
self.setMouseBinding(MouseAction.ROTATE, QtCore.Qt.LeftButton)
self.setMouseBinding(MouseAction.ZOOM, QtCore.Qt.LeftButton)
self.setMouseBinding(MouseAction.FIT, QtCore.Qt.LeftButton)
def mouseMoveEvent(self, mouseEvent):
""" The user has moved the mouse, which needs to be handled depending on the selected tool """
self.makeCurrent()
if self.currentTool == None:
self.cameraHandler.mouseMoveEvent(mouseEvent, self.camera)
self.updateGL()
else:
self.currentTool.needUpdate = False
if self.currentTool.needPicking:
selection = self.picking(mouseEvent.pos(), mouseEvent.buttons())
self.currentTool.handleMouseMove(mouseEvent, self.camera, self.viewportType, selection)
else:
self.currentTool.handleMouseMove(mouseEvent, self.camera, self.viewportType)
if self.currentTool.needUpdate:
self.prtManager.updateObjects()
self.viewport.updateViewports()
self.updateStatusBar.execute(mouseEvent)
#if self.prtManager.isObjectSelected():
# self.picking(mouseEvent.pos(), mouseEvent.buttons())
def mousePressEvent(self, mouseEvent):
""" The user has pressed a mousebutton, which needs to be handled depending on the selected tool """
self.makeCurrent() # Rick 20091519
if self.currentTool != None:
self.currentTool.needUpdate = False
if self.currentTool.needPicking:
selection = self.picking(mouseEvent.pos(), mouseEvent.buttons())
self.currentTool.handleMousePress(mouseEvent, self.camera, self.viewportType, selection)
else:
self.currentTool.handleMousePress(mouseEvent, self.camera, self.viewportType)
if self.currentTool.needUpdate:
self.prtManager.updateObjects()
self.viewport.updateViewports()
if isinstance(self.viewport, viewport.Viewport):
self.viewport.mousePressEvent(mouseEvent)
def mouseReleaseEvent(self, mouseEvent):
if self.currentTool != None:
self.currentTool.needUpdate = False
if self.currentTool.needPicking:
selection = self.picking(mouseEvent.pos(), mouseEvent.buttons())
self.currentTool.handleMouseRelease(mouseEvent, selection)
if self.currentTool.needUpdate:
self.viewport.updateViewports()
def keyPressEvent(self, keyEvent):
if self.currentTool != None:
self.currentTool.handleKeyPress(keyEvent)
self.viewport.updateViewports()
def keyReleaseEvent(self, keyEvent):
if self.currentTool != None:
self.currentTool.handleKeyRelease(keyEvent)
self.viewport.updateViewports()
def setBackgroundColor(self):
self.makeCurrent()
self.qglClearColor(self.settings.sketcherData.bgColor)
def drawRotationHelper(self):
pass
def drawWithPicking(self):
self.prtManager.drawWithPicking()
self.prtManager.drawTransparentWithPicking()
def picking(self, point, buttons):
self.startPicking(point)
self.drawWithPicking()
selection = self.endPicking(point, buttons)
return selection
def startPicking(self, point):
self.makeCurrent()
glSelectBuffer(self.bufferSize)
glRenderMode(GL_SELECT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
if self.currentTool != None and self.currentTool.multipleSelect and self.currentTool.selectionStarted:
width = height = centerX = centerY = 0
self.selectionRect = QtCore.QRect(self.currentTool.beginSelPoint, self.currentTool.endSelPoint)
if self.selectionRect.width() < 0:
width = -self.selectionRect.width()
else:
width = self.selectionRect.width()
if self.selectionRect.height() < 0:
height = -self.selectionRect.height()
else:
height = self.selectionRect.height()
if width == 0:
width = self.selectRegionWidth
if height == 0:
height = self.selectRegionHeight
centerX = self.selectionRect.center().x()
centerY = self.selectionRect.center().y()
gluPickMatrix(centerX, centerY, width, height, self.camera.getViewport())
else:
gluPickMatrix(point.x(), point.y(), self.selectRegionWidth, self.selectRegionHeight, self.camera.getViewport())
self.camera.loadProjection(False)
self.camera.loadModelView()
glInitNames()
def endPicking(self, point, buttons):
glFlush()
hits = list(glRenderMode(GL_RENDER))
self.selectionHandler.processHits(hits)
selection = -1
if len(hits) > 0:
selection = self.selectionHandler.getOrderedHits()
#print selection
#self.prtManager.setSelectedObject(selection)
#if selection != -1:
# self.prtManager.objectsSelected(selection, buttons)
#print selectedName
return selection
"""
def wheelEvent(self, wheelEvent):
self.makeCurrent()
if wheelEvent.delta() < 0 and self.zoomfactor > 1.0:
self.zoomfactor=1.0
elif wheelEvent.delta() > 0 and self.zoomfactor < 1.0:
self.zoomfactor = 1.0
if self.zoomfactor < 0.0:
self.zoomfactor = 0.0
self.zoomfactor -= wheelEvent.delta()/4*0.001
self.zoom(self.zoomfactor)
"""
class SolutionGLViewport(GLViewport):
def __init__(self, viewport, vpType,shareWidget=None, format=None, parent=None):
GLViewport.__init__(self, viewport, vpType, shareWidget, format, parent)
#self.timer = QtCore.QTimer(self)
#self.timer.start(1000)
self.createTriggers()
def createTriggers(self):
#QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("showGridChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("gridWidthChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("gridHeightChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("backgroundColorChanged"), self.setBackgroundColor)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("backgroundColorChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("pointSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("fPointSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("lineSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("distanceSizeChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("pointColorChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("fPointColorChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("lineColorChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("angleColorChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("distanceColorChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("pointVisChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("fpointVisChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("lineVisChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("angleVisChanged"), self.update)
QtCore.QObject.connect(self.settings.svData,QtCore.SIGNAL("distanceVisChanged"), self.update)
def draw(self):
self.viewport.drawObjects()
def setBackgroundColor(self):
self.makeCurrent()
self.qglClearColor(self.settings.svData.bgColor)
def showGrid(self):
if self.settings.svData.showGrid:
self.qglColor(QtGui.QColor(0.0, 0.0, 0.0))
self.drawGrid()
def drawGrid(self):
if self.viewportType == ViewportType.PERSPECTIVE or self.viewportType == ViewportType.SOLUTION:
self.sceneObjects.drawBackgroundgrid3D(600, 600, self.settings.svData.gridWidth, self.settings.svData.gridHeight, self.gridColor, False)
else:
self.sceneObjects.drawBackgroundgrid2D(self.settings.svData.gridWidth, self.settings.svData.gridHeight, self.gridColor, False)
class SelectionHandler:
""" Selection of the objects by the user """
def __init__(self):
self.hits = []
self.selection = []
def getClosestHit(self):
""" select the objects which is closest to the user """
self.selection[0] = [self.hits[0][2][0]]
zMin = self.hits[0][0]
for hit in self.hits:
if hit[0] < zMin:
zMin = hit[0]
self.selection[0] = [hit[2][0]]
if len(hit[2]) > 1:
self.selection[0] += [hit[2][1]]
""" check whether a subobject is selected (like axis) """
if len(self.hits[0][2]) > 1:
self.selection[0] += [self.hits[0][2][1]]
return self.selection
def getOrderedHits(self):
aHit = False
self.selection = []
zBuffer = []
for hit in self.hits:
inserted = False
for index, zValue in enumerate(zBuffer):
if hit[0] <= zValue:
zBuffer.insert(index, [hit[0]])
self.selection.insert(index, [hit[2][0]])
inserted = True
break
if not inserted:
self.selection += [[hit[2][0]]]
zBuffer += [hit[0]]
if len(hit[2]) > 1:
self.selection[len(self.selection)-1] += [hit[2][1]]
aHit = True
if not aHit:
self.selection = [[-1]]
return self.selection
def getHits(self):
""" Return al the hits, not ordered """
aHit = False
self.selection = []
for index, hit in enumerate(self.hits):
self.selection += [[hit[2][0]]]
if len(hit[2]) > 1:
self.selection[index] += [hit[2][1]]
aHit = True
if not aHit:
self.selection = [[-1]]
return self.selection
def processHits(self, hits):
""" Process the selection of the objects """
self.hits = hits
self.selection = [[-1]]