initial view scaling
This commit is contained in:
parent
5678df7dbb
commit
6e2e19d1a5
@ -11,6 +11,9 @@ from Circle import Circle
|
|||||||
class SketchWidget:
|
class SketchWidget:
|
||||||
def __init__(self, sketch):
|
def __init__(self, sketch):
|
||||||
self.sketch = sketch
|
self.sketch = sketch
|
||||||
|
self.view_center = (0, 0)
|
||||||
|
self.view_width = 5.0
|
||||||
|
self.size = (1, 1)
|
||||||
try:
|
try:
|
||||||
# try double-buffered
|
# try double-buffered
|
||||||
self.glconfig = gtk.gdkgl.Config(mode = (gtk.gdkgl.MODE_RGB |
|
self.glconfig = gtk.gdkgl.Config(mode = (gtk.gdkgl.MODE_RGB |
|
||||||
@ -51,10 +54,11 @@ class SketchWidget:
|
|||||||
if not gldrawable.gl_begin(glcontext): return
|
if not gldrawable.gl_begin(glcontext): return
|
||||||
|
|
||||||
x, y, width, height = glarea.get_allocation()
|
x, y, width, height = glarea.get_allocation()
|
||||||
|
self.size = (width, height)
|
||||||
|
|
||||||
glViewport(0, 0, width, height)
|
glViewport(0, 0, width, height)
|
||||||
glMatrixMode(GL_PROJECTION)
|
glMatrixMode(GL_PROJECTION)
|
||||||
glOrtho(-2, 2, -1.5, 1.5, 1.0, -1.0)
|
glOrtho(0, width, 0, height, 1.0, -1.0)
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW)
|
glMatrixMode(GL_MODELVIEW)
|
||||||
glLoadIdentity()
|
glLoadIdentity()
|
||||||
@ -75,9 +79,9 @@ class SketchWidget:
|
|||||||
|
|
||||||
for shape in self.sketch:
|
for shape in self.sketch:
|
||||||
if isinstance(shape, Line):
|
if isinstance(shape, Line):
|
||||||
self.drawLine(shape, 0.03)
|
self.drawLine(shape, 1.5)
|
||||||
elif isinstance(shape, Circle):
|
elif isinstance(shape, Circle):
|
||||||
self.drawCircle(shape, 0.03)
|
self.drawCircle(shape, 1.5)
|
||||||
|
|
||||||
if gldrawable.is_double_buffered():
|
if gldrawable.is_double_buffered():
|
||||||
gldrawable.swap_buffers()
|
gldrawable.swap_buffers()
|
||||||
@ -88,16 +92,26 @@ class SketchWidget:
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def ptToScreenPt(self, pt):
|
||||||
|
return ((pt[0] - self.view_center[0]) / self.view_width * self.size[0]
|
||||||
|
+ self.size[0] / 2,
|
||||||
|
(pt[1] - self.view_center[1]) /
|
||||||
|
(self.view_width * self.size[1] / self.size[0]
|
||||||
|
* self.size[1] + self.size[1] / 2))
|
||||||
|
|
||||||
|
def distToScreenDist(self, dist):
|
||||||
|
return dist / self.view_width * self.size[0]
|
||||||
|
|
||||||
def drawLine(self, shape, size):
|
def drawLine(self, shape, size):
|
||||||
pt0 = shape.getPt(0)
|
pt0 = self.ptToScreenPt(shape.getPt(0))
|
||||||
pt1 = shape.getPt(1)
|
pt1 = self.ptToScreenPt(shape.getPt(1))
|
||||||
self.drawFilledLine(pt0[0], pt0[1], pt1[0], pt1[1], size)
|
self.drawFilledLine(pt0[0], pt0[1], pt1[0], pt1[1], size)
|
||||||
|
|
||||||
def drawCircle(self, shape, size):
|
def drawCircle(self, shape, size):
|
||||||
steps = 16
|
steps = 16
|
||||||
step = 2 * math.pi / steps
|
step = 2 * math.pi / steps
|
||||||
center = shape.getCenter()
|
center = self.ptToScreenPt(shape.getCenter())
|
||||||
rad = shape.getRadius()
|
rad = self.distToScreenDist(shape.getRadius())
|
||||||
for i in range(steps + 1):
|
for i in range(steps + 1):
|
||||||
angle = i * step
|
angle = i * step
|
||||||
next_angle = (i + 1) * step
|
next_angle = (i + 1) * step
|
||||||
|
Loading…
x
Reference in New Issue
Block a user