#!/usr/bin/env python # A Python translation of the "enrichments" example of QwtPlot3D import sys import PyQt4.Qt as Qt from PyQt4.Qwt3D import * from PyQt4.Qwt3D.OpenGL import * # translated from enrichments.cpp class Bar(VertexEnrichment): def __init__(self, radius = 0.0, level = 1.0): VertexEnrichment.__init__(self) self.configure(radius, level) # init() def clone(self): return self # clone() def configure(self, radius, level): self.radius = radius self.level = level # configure() def drawBegin(self): self.diag = self.radius*(self.plot.hull().maxVertex - self.plot.hull().minVertex).length() glLineWidth(0) glEnable(GL_POLYGON_OFFSET_FILL) glPolygonOffset(1, 1) # drawBegin() def drawEnd(self): pass # drawEnd() def draw(self, pos): interval = self.plot.hull().maxVertex.z - self.plot.hull().minVertex.z numlevel = self.plot.hull().minVertex.z + self.level * interval interval /= 100 if pos.z > numlevel - interval and pos.z < numlevel + interval: Label3D().draw(pos, self.diag, 2*self.diag) minz = self.plot.hull().minVertex.z # FIXME: rgbat = self.plot.dataColor()(pos) rgbat = self.plot.dataColor()(pos.x, pos.y, pos.z) rgbab = self.plot.dataColor()(pos.x, pos.y, minz) glBegin(GL_QUADS) glColor4d(rgbab.r, rgbab.g, rgbab.b, rgbab.a) glVertex3d(pos.x - self.diag, pos.y - self.diag, minz) glVertex3d(pos.x + self.diag, pos.y - self.diag, minz) glVertex3d(pos.x + self.diag, pos.y + self.diag, minz) glVertex3d(pos.x - self.diag, pos.y + self.diag, minz) if pos.z > numlevel - interval and pos.z < numlevel + interval: glColor3d(0.7, 0.0, 0.0) else: glColor4d(rgbat.r, rgbat.g, rgbat.b, rgbat.a) glVertex3d(pos.x-self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y+self.diag, pos.z) glColor4d(rgbab.r, rgbab.g,rgbat.b, rgbab.a) glVertex3d(pos.x-self.diag, pos.y-self.diag, minz) glVertex3d(pos.x+self.diag, pos.y-self.diag, minz) glColor4d(rgbat.r,rgbat.g, rgbat.b, rgbat.a) glVertex3d(pos.x+self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y-self.diag, pos.z) glColor4d(rgbab.r, rgbab.g, rgbat.b, rgbab.a) glVertex3d(pos.x-self.diag, pos.y+self.diag, minz) glVertex3d(pos.x+self.diag, pos.y+self.diag, minz) glColor4d(rgbat.r, rgbat.g, rgbat.b, rgbat.a) glVertex3d(pos.x+self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y+self.diag, pos.z) glColor4d(rgbab.r, rgbab.g, rgbat.b, rgbab.a) glVertex3d(pos.x-self.diag, pos.y-self.diag, minz) glVertex3d(pos.x-self.diag, pos.y+self.diag, minz) glColor4d(rgbat.r, rgbat.g, rgbat.b, rgbat.a) glVertex3d(pos.x-self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y-self.diag, pos.z) glColor4d(rgbab.r, rgbab.g, rgbat.b, rgbab.a) glVertex3d(pos.x+self.diag, pos.y-self.diag, minz) glVertex3d(pos.x+self.diag, pos.y+self.diag, minz) glColor4d(rgbat.r, rgbat.g, rgbat.b, rgbat.a) glVertex3d(pos.x+self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y-self.diag, pos.z) glEnd() glColor3d(0, 0, 0) glBegin(GL_LINES) glVertex3d(pos.x-self.diag, pos.y-self.diag, minz) glVertex3d(pos.x+self.diag, pos.y-self.diag, minz) glVertex3d(pos.x-self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y+self.diag, minz) glVertex3d(pos.x+self.diag, pos.y+self.diag, minz) glVertex3d(pos.x-self.diag, pos.y-self.diag, minz) glVertex3d(pos.x-self.diag, pos.y+self.diag, minz) glVertex3d(pos.x+self.diag, pos.y-self.diag, minz) glVertex3d(pos.x+self.diag, pos.y+self.diag, minz) glVertex3d(pos.x+self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y-self.diag, minz) glVertex3d(pos.x-self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y-self.diag, minz) glVertex3d(pos.x+self.diag, pos.y-self.diag, pos.z) glVertex3d(pos.x+self.diag, pos.y+self.diag, minz) glVertex3d(pos.x+self.diag, pos.y+self.diag, pos.z) glVertex3d(pos.x-self.diag, pos.y+self.diag, minz) glVertex3d(pos.x-self.diag, pos.y+self.diag, pos.z) glEnd() # draw() # class Bar class Label3D: def __init__(self): pass # __init__() def draw(self, pos, w, h): gap = 0.3 glColor3d(1,1,1) glBegin(GL_QUADS) glVertex3d(pos.x - w, pos.y, pos.z + gap); glVertex3d(pos.x + w, pos.y, pos.z + gap); glVertex3d(pos.x + w, pos.y, pos.z + gap + h) glVertex3d(pos.x - w, pos.y, pos.z + gap + h) glEnd() glColor3d(0.4,0,0) glBegin(GL_LINE_LOOP) glVertex3d(pos.x - w, pos.y,pos.z + gap) glVertex3d(pos.x + w, pos.y,pos.z + gap) glVertex3d(pos.x + w, pos.y,pos.z + gap + h) glVertex3d(pos.x - w, pos.y, pos.z + gap + h) glEnd() glBegin(GL_LINES) glVertex3d(pos.x, pos.y, pos.z) glVertex3d(pos.x, pos.y, pos.z + gap) glEnd() # draw() # class Label3D class Hat(Function): def __init__(self, *args): Function.__init__(self, *args) # __init__() def __call__(self, x, y): return 1.0/(x*x + y*y + 0.5) # __call__() def name(self): return QString('$\\frac{1}{x^2+y^2+\\frac{1}{2}}$') # name() # class Hat # translated from enrichmentmainwindow.cpp class EnrichmentDemo(Qt.QWidget): def __init__(self, *args): Qt.QWidget.__init__(self, *args) family = Qt.QCoreApplication.instance().font().family() plot = self.plot = SurfacePlot(self) plot.setTitle('Bar Style (Vertex Enrichment)') if 'Verdana' in Qt.QFontDatabase().families(): family = 'Verdana' family = 'Courier' plot.setTitleFont(family, 16, Qt.QFont.Bold) plot.coordinates().setLabelFont(family, 14) plot.coordinates().setNumberFont(family, 12) plot.setZoom(0.8); plot.setRotation(30.0, 0.0, 15.0) plot.setCoordinateStyle(BOX) self.width = 0.007 self.level = .5 self.bar = plot.setPlotStyle(Bar(self.width, self.level)) hat = Hat(plot) hat.setMesh(23, 21) hat.setDomain(-1.8, 1.7, -1.6, 1.7) hat.create() plot.setFloorStyle(FLOORDATA) axes = plot.coordinates().axes # alias for axis in axes: axis.setMajors(5) axis.setMinors(4) plot.coordinates().setGridLinesColor(RGBA(0.0, 0.0, 0.5)) plot.coordinates().setLineWidth(1) plot.coordinates().setNumberFont(family, 8) plot.coordinates().adjustNumbers(5) self.setColor() plot.updateData(); plot.updateGL(); # Level levelLabel = Qt.QLabel('Level') levelSlider = Qt.QSlider(self) levelSlider.setValue(50); levelSlider.setTickPosition(Qt.QSlider.TicksRight) levelLayout = Qt.QVBoxLayout() levelLayout.addWidget(levelLabel) levelLayout.addWidget(levelSlider) self.connect( levelSlider, Qt.SIGNAL('valueChanged(int)'), self.setLevel) # Layout mainLayout = Qt.QHBoxLayout() self.setLayout(mainLayout) mainLayout.addWidget(plot) mainLayout.addLayout(levelLayout) # __init__() def setColor(self): i, step = 252, 4 colorVector = ColorVector() while (i>=0): colorVector.push_back(RGBA(i/255.0, max((i-60)/255.0, 0.0), 0.0)) step -= 1 if step == 0: i -= 4 step = 4 color = StandardColor(self.plot) color.setColorVector(colorVector) self.plot.setDataColor(color) # setColor() def setLevel(self, level): self.level = 1.0 - 0.01*level; self.bar.configure(self.width, self.level) self.plot.updateData() self.plot.updateGL() # setLevel() # class EnrichmentDemo def make(): demo = EnrichmentDemo() demo.show() # Matrox cards on Linux work better with a resize() after show() demo.resize(600, 400) return demo # make() def main(args): app = Qt.QApplication(args) demo = make() app.exec_() # main() # Admire if __name__ == '__main__': main(sys.argv) # Local Variables: *** # mode: python *** # End: ***