geosolver/workbench/sceneObjects.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

521 lines
16 KiB
Python

from includes import *
"""# no more nasty rounding with integer divisions
from __future__ import division
import sys, pdb
from PyQt4 import QtCore, QtGui, QtOpenGL
"""
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 SceneObject:
def __init__(self,viewport):
self.quadratic = gluNewQuadric()
#gluQuadricNormals(self.quadratic, GLU_SMOOTH)
#gluQuadricDrawStyle(self.quadratic, GLU_LINE)
self.activeViewport = viewport
def drawCylinder(self, orientation, position, radiusBottom, radiusTop, height):
glPushMatrix()
glColor3fv([0.0,1.0,1.0])
glTranslatef(position[0], position[1], position[2])
glRotatef(orientation[0], orientation[1], orientation[2], orientation[3])
gluCylinder(self.quadratic, radiusBottom, radiusTop, height, 10, 10)
glPopMatrix()
def drawSphere(self, pos, radius, reflectance=0.0):
glPushMatrix()
glTranslatef(pos[0], pos[1], pos[2])
gluSphere(self.quadratic, radius, 10, 10)
glPopMatrix()
def drawRectangle(self, geometry):
glPushMatrix()
#print "left: " , geometry.left(), " right: ", geometry.right(), " bottom ", geometry.bottom(), " top: ", geometry.top()
#glTranslatef(0.0,0.0,-199.0)
glDisable(GL_LIGHTING)
glRecti(geometry.left(), geometry.top(), geometry.right(), geometry.bottom())
glEnable(GL_LIGHTING)
glPopMatrix()
def drawSelection(self, x1, y1, x2, y2):
glPushMatrix()
glTranslatef(0.0,0.0,-50.0)
glDisable(GL_LIGHTING)
glBegin(GL_LINE_STRIP)
glVertex2f(x1, y1)
glVertex2f(x1, y2)
glVertex2f(x2, y2)
glVertex2f(x2, y1)
glVertex2f(x1, y1)
glEnd()
glEnable(GL_LIGHTING)
glPopMatrix()
def drawBackgroundgrid3D(self, gridWidth, gridHeight, rectWidth, rectHeight, gridColor, filled=False):
if rectWidth > 0 and rectHeight > 0:
glPushMatrix()
cameraPos = self.activeViewport.getCamera().getPosition()
glDisable(GL_LIGHTING)
#glEnable(GL_LINE_SMOOTH)
leftRest = (-gridWidth/2) % rectWidth
bottomRest = (-gridHeight/2) % rectHeight
posX1Start = int((-gridWidth/2) - leftRest)
posZ1Start = int((-gridHeight/2) - bottomRest)
posX1 = posX1Start
rangeX = int(gridWidth / rectWidth) + 1
rangeZ = int(gridHeight / rectHeight) + 1
glLineWidth(1.0)
if filled:
glRotatef(90.0, 1.0, 0.0, 0.0)
for x in range (0, rangeX):
if x != 0 and not filled:
glEnd()
if not filled:
glBegin(GL_LINE_STRIP)
posZ1 = posZ1Start
for z in range(0, rangeZ):
glColor3f(gridColor.redF(), gridColor.greenF(), gridColor.blueF())
if(filled):
if (x + z) % 2 == 0:
glColor3f(1, 1, 1)
else:
glColor3f(0, 0, 1)
glRectf(posX1, posZ1, posX1+rectWidth, posZ1+rectHeight)
else:
glVertex3f(posX1+rectWidth, 0, posZ1)
glVertex3f(posX1, 0, posZ1)
glVertex3f(posX1, 0, posZ1+rectHeight)
glVertex3f(posX1+rectWidth, 0, posZ1+rectHeight)
glVertex3f(posX1+rectWidth, 0, posZ1)
posZ1 += rectHeight
posX1 += rectWidth
if not filled:
glEnd()
else:
glRotatef(-90, 1.0, 0.0, 0.0)
self.drawThickAxis(posX1Start, posX1Start+gridWidth+rectWidth, 0.0, 0.0, posZ1Start, posZ1Start+gridHeight+rectHeight, 2.0)
#glDisable(GL_LINE_SMOOTH)
glEnable(GL_LIGHTING)
glPopMatrix()
def drawBackgroundgrid2D(self, rectWidth, rectHeight, gridColor, filled=False):
if rectWidth > 0 and rectHeight > 0:
glPushMatrix()
vpType = self.activeViewport.getViewportType()
camera = self.activeViewport.getCamera()
cameraPos = camera.getPosition()
leftPlaneSub = 0.0
bottomPlaneSub = 0.0
if vpType == ViewportType.FRONT:
leftPlaneSub = cameraPos[0]
bottomPlaneSub = cameraPos[1]
inBack = camera.getFarPlane() - cameraPos[2]
glTranslatef(0,0, -inBack)
elif vpType == ViewportType.SIDE:
leftPlaneSub = -cameraPos[2]
bottomPlaneSub = cameraPos[1]
inBack = camera.getFarPlane() - cameraPos[0]
glTranslatef(-inBack,0,0)
elif vpType == ViewportType.TOP:
leftPlaneSub = cameraPos[0]
bottomPlaneSub = cameraPos[2]
inBack = camera.getFarPlane() - cameraPos[1]
glTranslatef(0,-inBack,0)
glDisable(GL_LIGHTING)
width = camera.getWindowWidth()
height = camera.getWindowHeight()
viewWidth = 0.0
viewHeight = 0.0
ratio = camera.getAspectRatio()
if width >= height:
viewWidth = 2*camera.getOrthoWidth()*ratio #rightplane -leftplane
viewHeight = 2*camera.getOrthoHeight() # topplane - bottomplane
leftPlane = -camera.getOrthoWidth()*ratio + leftPlaneSub # leftplane
bottomPlane = -camera.getOrthoHeight() + bottomPlaneSub # topplane
else:
viewWidth = 2*camera.getOrthoWidth()
viewHeight = 2*camera.getOrthoHeight()*ratio
leftPlane = -camera.getOrthoWidth() - leftPlaneSub
bottomPlane = -camera.getOrthoHeight()*ratio + bottomPlaneSub
leftRest = leftPlane % rectWidth
posLeft = (leftPlane - leftRest)
bottomRest = bottomPlane % rectHeight
posBottom = (bottomPlane - bottomRest)
#print "width: ", viewWidth, " heihgt: ", viewHeight
#rectWidthAdjustment = int(viewWidth/3000) + 1
#rectHeightAdjustment = int(viewHeight/3000) + 1
#rectWidth *= rectWidthAdjustment
#rectHeight *= rectHeightAdjustment
widthRange = int(viewWidth / rectWidth) + 2
heightRange = int(viewHeight / rectHeight) + 2
#print widthRange, heightRange
if vpType == ViewportType.FRONT:
if filled:
self.drawFilledGrid(posLeft, posBottom, widthRange, heightRange, rectWidth, rectHeight)
else:
self.drawOpenGrid(posLeft, posBottom, widthRange, heightRange, rectWidth, rectHeight, gridColor)
self.drawThickAxis(posLeft, posLeft+viewWidth+rectWidth, posBottom, posBottom+viewHeight+rectHeight,
0.0, 0.0, 2.0)
elif vpType == ViewportType.SIDE:
glPushMatrix()
glRotatef(90.0, 0.0 , 1.0, 0.0)
if filled:
self.drawFilledGrid(posLeft, posBottom, widthRange, heightRange, rectWidth, rectHeight)
else:
self.drawOpenGrid(posLeft, posBottom, widthRange, heightRange, rectWidth, rectHeight, gridColor)
glPopMatrix()
self.drawThickAxis(0.0, 0.0, posBottom, posBottom+viewHeight+rectHeight,
-posLeft, -(posLeft+viewWidth+rectWidth), 2.0)
elif vpType == ViewportType.TOP:
glPushMatrix()
glRotatef(90.0, 1.0 , 0.0, 0.0)
if filled:
self.drawFilledGrid(posLeft, posBottom, widthRange, heightRange, rectWidth, rectHeight)
else:
self.drawOpenGrid(posLeft, posBottom, widthRange, heightRange, rectWidth, rectHeight, gridColor)
glPopMatrix()
self.drawThickAxis(posLeft, posLeft+viewWidth+rectWidth, 0.0, 0.0,
posBottom, (posBottom+viewHeight+rectHeight), 2.0)
glEnable(GL_LIGHTING)
glPopMatrix()
def drawFilledGrid(self, startPosX, startPosY, rangeX, rangeY, rectWidth, rectHeight):
posX = startPosX
for x in range (0, rangeX):
posY = startPosY
for y in range(0, rangeY):
glColor3f(0, 0, 1)
if (posX + posY) % 100 == 0:
glColor3f(1, 1, 1)
else:
glColor3f(0, 0, 1)
glRectf(posX, posY, posX+rectWidth, posY+rectHeight)
posY += rectHeight
posX += rectWidth
def drawOpenGrid(self, startPosX, startPosY, rangeX, rangeY, rectWidth, rectHeight, gridColor):
glLineWidth(0.5)
posX = startPosX
glColor3f(gridColor.redF(),gridColor.greenF(),gridColor.blueF())
for x in range (0, rangeX):
if x != 0:
glEnd()
glBegin(GL_LINE_STRIP)
posY = startPosY
for y in range(0, rangeY):
glVertex2f(posX+rectWidth, posY)
glVertex2f(posX, posY)
glVertex2f(posX, posY+rectHeight)
glVertex2f(posX+rectWidth, posY+rectHeight)
posY += rectHeight
posX += rectWidth
glEnd()
def drawThickAxis(self, beginX, endX, beginY, endY, beginZ, endZ, thickness):
glLineWidth(thickness)
glColor3f(0.25,0.5,0.25)
# draw thick x axis
glBegin(GL_LINES)
glVertex3f(beginX, 0,0)
glVertex3f(endX, 0,0)
glEnd()
# draw thick y axis
glBegin(GL_LINES)
glVertex3f(0, beginY,0)
glVertex3f(0, endY,0)
glEnd()
# draw thick z axis
glBegin(GL_LINES)
glVertex3f(0, 0, beginZ)
glVertex3f(0, 0, endZ)
glEnd()
glLineWidth(1.0)
def testDraw(self, size):
direction = 20.0
glColor3f(0.5,0.5,0.5)
position = [-direction, 0.0, -direction]
self.drawSphere(position, size)
position = [direction, 0.0, -direction]
self.drawSphere(position, size)
position = [direction, 0.0, direction]
self.drawSphere(position, size)
position = [-direction, 0.0, direction]
self.drawSphere(position, size)
glColor3f(0.7,0.0,0.5)
position = [-direction*2, -10.0, direction]
self.drawSphere(position, size)
glColor3f(0.0,0.7,0.5)
position = [-direction, direction*2, -direction]
self.drawSphere(position, size)
position = [direction, direction*2, -direction]
self.drawSphere(position, size)
position = [direction, direction*2, direction]
self.drawSphere(position, size)
position = [-direction, direction*2, direction]
self.drawSphere(position, size)
height = 40.0
radius1 = size/4
radius2 = size/4
position = [-direction, 0.0, -direction]
orientation = [90.0, 0.0, 1.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [direction, 0.0, -direction]
orientation = [90.0, 0.0, 0.0, 1.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, 0.0, -direction]
orientation = [0.0, 0.0, 0.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, 0.0, direction]
orientation = [90.0, 0.0, 1.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, direction*2, -direction]
orientation = [90.0, 0.0, 1.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [direction, direction*2, -direction]
orientation = [90.0, 0.0, 0.0, 1.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, direction*2, -direction]
orientation = [0.0, 0.0, 0.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, direction*2, direction]
orientation = [90.0, 0.0, 1.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, direction*2, -direction]
orientation = [90.0, 1.0, 0.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [direction, direction*2, -direction]
orientation = [90.0, 1.0, 0.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [-direction, direction*2, direction]
orientation = [90.0, 1.0, 0.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
position = [direction, direction*2, direction]
orientation = [90.0, 1.0, 0.0, 0.0]
self.drawCylinder(orientation,position,radius1, radius2, height)
def testDrawWithNames(self, size):
i = 0
direction = 20.0
glColor3f(0.5,0.5,0.5)
position = [-direction, 0.0, -direction]
glPushName(i)
self.drawSphere(position, size)
glPopName()
position = [direction, 0.0, -direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
position = [direction, 0.0, direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
position = [-direction, 0.0, direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
glColor3f(0.7,0.0,0.5)
position = [-direction*2, -10.0, direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
glColor3f(0.0,0.7,0.5)
position = [-direction, direction*2, -direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
position = [direction, direction*2, -direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
position = [direction, direction*2, direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
position = [-direction, direction*2, direction]
i+=1
glPushName(i)
self.drawSphere(position, size)
glPopName()
height = 40.0
radius1 = size/4
radius2 = size/4
position = [-direction, 0.0, -direction]
orientation = [90.0, 0.0, 1.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [direction, 0.0, -direction]
orientation = [90.0, 0.0, 0.0, 1.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, 0.0, -direction]
orientation = [0.0, 0.0, 0.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, 0.0, direction]
orientation = [90.0, 0.0, 1.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, direction*2, -direction]
orientation = [90.0, 0.0, 1.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [direction, direction*2, -direction]
orientation = [90.0, 0.0, 0.0, 1.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, direction*2, -direction]
orientation = [0.0, 0.0, 0.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, direction*2, direction]
orientation = [90.0, 0.0, 1.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, direction*2, -direction]
orientation = [90.0, 1.0, 0.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [direction, direction*2, -direction]
orientation = [90.0, 1.0, 0.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [-direction, direction*2, direction]
orientation = [90.0, 1.0, 0.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
position = [direction, direction*2, direction]
orientation = [90.0, 1.0, 0.0, 0.0]
i+=1
glPushName(i)
self.drawCylinder(orientation,position,radius1, radius2, height)
glPopName()
def testDraw2(self):
glTranslatef(0.0, 0.0, -100.0)
glColor3f(0.0,0.0,1.0)
self.drawRectangle(QtCore.QRect(0.0, 0.0, 50.0, 50.0))
glColor3f(1.0,0.0,0.0)
glTranslatef(0.0, 0.0, -100.0)
#glRotatef(-90.0, 0.0,1.0,0.0)
gluDisk(self.quadratic, 0.0, 10.0,10, 10)
#gluCylinder(self.quadratic, 0.0, 25.0, 50.0, 10, 10)
def drawXAxis(self, width=2.0, height=20.0):
# x axis
glPushMatrix()
glColor3fv([1.0,0.0,0.0])
glTranslate(-1.0, 0.0, 0.0)
glRotate(90, 0.0, 1.0 ,0.0)
#glRotate(180, 1.0, 0.0, 0.0)
gluCylinder(self.quadratic, width, width, height, 10, 10)
glPushMatrix()
glTranslatef(0.0,0.0,height)
gluCylinder(self.quadratic, width*2.5, 0.0, height/5, 10, 10)
#newFont = QtGui.QFont()
#newFont.setStyleStrategy(QtGui.QFont.OpenGLCompatible)
#self.activeViewport.renderText(-4.0, 4.0, 6.0, 'X', newFont)
glPopMatrix()
glPopMatrix()
def drawYAxis(self, width=2.0, height=20.0):
# y axis
glPushMatrix()
glColor3fv([0.0,1.0,0.0])
glRotate(90, 1.0, 0.0 ,0.0)
gluCylinder(self.quadratic, width, width, height, 10, 10)
glPushMatrix()
glTranslatef(0.0,0.0,height)
gluCylinder(self.quadratic, width*2.5, 0.0, height/5, 10, 10)
#newFont = QtGui.QFont()
#newFont.setStyleStrategy(QtGui.QFont.OpenGLCompatible)
#self.activeViewport.renderText(5.0, 10.0, 1.0, 'Y', newFont)
#glEnable(GL_LIGHTING)
glPopMatrix()
glPopMatrix()
def drawZAxis(self, width=2.0, height=20.0):
# z axis
glPushMatrix()
glColor3fv([0.0,0.0,1.0])
glRotate(180, 0.0, 1.0 ,0.0)
gluCylinder(self.quadratic, width, width, height, 10, 10)
glPushMatrix()
glTranslatef(0.0,0.0,height)
gluCylinder(self.quadratic, width*2.5, 0.0, height/5, 10, 10)
#newFont = QtGui.QFont()
#newFont.setStyleStrategy(QtGui.QFont.OpenGLCompatible)
#self.activeViewport.renderText(-4.0, 4.0, 6.0, 'Z', newFont)
glPopMatrix()
glPopMatrix()