From 854df86eaf8eb80f52afab2d47a4b6bcdeab268d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 23 Apr 2011 21:48:42 -0400 Subject: [PATCH] snap lines to horizontal/vertical within snap_angle degrees --- SketchWidget.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/SketchWidget.py b/SketchWidget.py index 63c1e51..d2d1be0 100644 --- a/SketchWidget.py +++ b/SketchWidget.py @@ -27,6 +27,7 @@ class SketchWidget: self.line_color = (0.1, 0.6, 1.0, 1.0) self.axis_color = (1.0, 0.0, 0.0, 1.0) self.constraint_color = (0.8, 1.0, 0.0, 1.0) + self.snap_angle = 10 try: # try double-buffered @@ -208,10 +209,12 @@ class SketchWidget: def button_press_event(self, widget, event, data = None): if event.button == 1: + start = self.screenPtToPt((event.x, self.size[1] - event.y)) if self.drawingLine is not None: self.sketch.shapes.append(self.drawingLine) - start = self.screenPtToPt((event.x, self.size[1] - event.y)) + start = self.drawingLine.getPt(1) self.drawingLine = Line(start[0], start[1], start[0], start[1]) + self.queue_redraw() elif event.button == 2: self.panning = True self.panning_start = (event.x, self.size[1] - event.y) @@ -235,6 +238,14 @@ class SketchWidget: self.queue_redraw() elif self.drawingLine is not None: this_pt = self.screenPtToPt((event.x, self.size[1] - event.y)) + start = self.drawingLine.getPt(0) + angle = math.atan2(this_pt[1] - start[1], this_pt[0] - start[0]) + angle *= 180.0 / math.pi + def snaps_to(q): return abs(angle - q) < self.snap_angle + if snaps_to(-180) or snaps_to(180) or snaps_to(0): + this_pt = (this_pt[0], start[1]) + elif snaps_to(-90) or snaps_to(90): + this_pt = (start[0], this_pt[1]) self.drawingLine.setPt(1, this_pt) self.queue_redraw()