From 56b934979295ad5c7d32198cae9a4d1f4d4f0e93 Mon Sep 17 00:00:00 2001 From: fmmt666 Date: Sun, 10 Jan 2016 05:02:57 +0100 Subject: [PATCH 1/8] added functionality to move object up/down --- README.md | 6 ++ gcodeParser.pyc | Bin 0 -> 12351 bytes yagv | 194 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 138 insertions(+), 62 deletions(-) create mode 100644 gcodeParser.pyc diff --git a/README.md b/README.md index 7cc3829..413d1d2 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ A fast 3D Gcode Viewer for Reprap-style 3D printers, in Python and OpenGL (via p Designed in Ubuntu Linux; Expected to work in any Linux, Windows or OS X + ## Requires: * python 2.x (2.7.3 tested) @@ -36,3 +37,8 @@ yagv [file.gcode] * Some gcodes unsupported, in particular: * G20: Set Units to Inches (usage unknown) * Arcs (G2 & G3 ?) + +## FMMT666's Changes: + +* Model can now be moved up and down (SHIFT + scroll). +* The scene now rotates around the center of the display, not the object. diff --git a/gcodeParser.pyc b/gcodeParser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa53e0bd60ea9a7d83088de7c0d867c4207047a6 GIT binary patch literal 12351 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 CPNQW2 literal 0 HcmV?d00001 diff --git a/yagv b/yagv index 8d96f65..c805226 100755 --- a/yagv +++ b/yagv @@ -19,10 +19,26 @@ import time class App: def __init__(self): - self.RX = 0.0 - self.RZ = 0.0 + self.RX = 0.0 + self.RZ = 0.0 self.zoom = 1.0 - + + self.layerDragStartLayer = None + self.layerDragStartX = None + self.layerDragStartY = None + + self.rotateDragStartRX = None + self.rotateDragStartRZ = None + self.rotateDragStartX = None + self.rotateDragStartY = None + + self.viewHeight = 0.0 + self.pressedShift = False + self.pressedCtrl = False + + # testing only + self.aaa = 0.0 + def main(self): #### MAIN CODE #### @@ -219,12 +235,13 @@ class App: def rotate_drag_do(self, x, y, dx, dy, buttons, modifiers): - # deltas - deltaX = x - self.rotateDragStartX - deltaY = y - self.rotateDragStartY - # rotate! - self.RZ = self.rotateDragStartRZ + deltaX/5.0 # mouse X bound to model Z - self.RX = self.rotateDragStartRX + deltaY/5.0 # mouse Y bound to model X + if self.rotateDragStartRX is not None: + # deltas + deltaX = x - self.rotateDragStartX + deltaY = y - self.rotateDragStartY + # rotate! + self.RZ = self.rotateDragStartRZ + deltaX/5.0 # mouse X bound to model Z + self.RX = self.rotateDragStartRX + deltaY/5.0 # mouse Y bound to model X def rotate_drag_end(self, x, y, button, modifiers): @@ -232,7 +249,7 @@ class App: self.rotateDragStartRZ = None self.rotateDragStartX = None self.rotateDragStartY = None - + def layer_drag_start(self, x, y, button, modifiers): self.layerDragStartLayer = self.layerIdx @@ -241,33 +258,34 @@ class App: def layer_drag_do(self, x, y, dx, dy, buttons, modifiers): - # sum x & y - delta = x - self.layerDragStartX + y - self.layerDragStartY - # new theoretical layer - self.layerIdx = int(self.layerDragStartLayer + delta/5) - # clamp layer to 0-max - self.layerIdx = max(min(self.layerIdx, self.model.topLayer), 0) - - self.window.layerLabel.text = "layer %d"%self.layerIdx - - # # clamp layer to 0-max, with origin slip - # if (self.layerIdx < 0): - # self.layerIdx = 0 - # self.layerDragStartLayer = 0 - # self.layerDragStartX = x - # self.layerDragStartY = y - # if (self.layerIdx > len(self.model.layers)-1): - # self.layerIdx = len(self.model.layers)-1 - # self.layerDragStartLayer = len(self.model.layers)-1 - # self.layerDragStartX = x - # self.layerDragStartY = y + if self.layerDragStartLayer is not None: + # sum x & y + delta = x - self.layerDragStartX + y - self.layerDragStartY + # new theoretical layer + self.layerIdx = int(self.layerDragStartLayer + delta/5) + # clamp layer to 0-max + self.layerIdx = max(min(self.layerIdx, self.model.topLayer), 0) + + self.window.layerLabel.text = "layer %d"%self.layerIdx + + # # clamp layer to 0-max, with origin slip + # if (self.layerIdx < 0): + # self.layerIdx = 0 + # self.layerDragStartLayer = 0 + # self.layerDragStartX = x + # self.layerDragStartY = y + # if (self.layerIdx > len(self.model.layers)-1): + # self.layerIdx = len(self.model.layers)-1 + # self.layerDragStartLayer = len(self.model.layers)-1 + # self.layerDragStartX = x + # self.layerDragStartY = y def layer_drag_end(self, x, y, button, modifiers): self.layerDragStartLayer = None self.layerDragStartX = None self.layerDragStartY = None - + class MyWindow(pyglet.window.Window): @@ -290,12 +308,13 @@ class MyWindow(pyglet.window.Window): self.helpText = [ "Ctrl-R to reload file", "Right-click & drag (any direction) to change layer", + "Scroll + Shift to move up/down", "Scroll to zoom", "Left-click & drag to rotate view"] for txt in self.helpText: self.blLabels.append( pyglet.text.Label( txt, - font_size=12) ) + font_size=10) ) # statistics ## model stats @@ -333,20 +352,29 @@ class MyWindow(pyglet.window.Window): def on_mouse_press(self, x, y, button, modifiers): #print "on_mouse_press(x=%d, y=%d, button=%s, modifiers=%s)"%(x, y, button, modifiers) - if button & mouse.LEFT: - self.app.rotate_drag_start(x, y, button, modifiers) - - if button & mouse.RIGHT: - self.app.layer_drag_start(x, y, button, modifiers) + if modifiers == 0: + if button & mouse.LEFT: + self.app.rotate_drag_start(x, y, button, modifiers) + + if button & mouse.RIGHT: + self.app.layer_drag_start(x, y, button, modifiers) + + elif modifiers == key.MOD_SHIFT: + pass def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): #print "on_mouse_drag(x=%d, y=%d, dx=%d, dy=%d, buttons=%s, modifiers=%s)"%(x, y, dx, dy, buttons, modifiers) - if buttons & mouse.LEFT: - self.app.rotate_drag_do(x, y, dx, dy, buttons, modifiers) - - if buttons & mouse.RIGHT: - self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) + if modifiers == 0: + if buttons & mouse.LEFT: + self.app.rotate_drag_do(x, y, dx, dy, buttons, modifiers) + + if buttons & mouse.RIGHT: + self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) + + elif modifiers == key.MOD_SHIFT: + if buttons & mouse.LEFT: + pass def on_mouse_release(self, x, y, button, modifiers): @@ -357,10 +385,30 @@ class MyWindow(pyglet.window.Window): if button & mouse.RIGHT: self.app.layer_drag_end(x, y, button, modifiers) + + def on_key_press(self, symbol, modifiers): + if symbol == key.LSHIFT or symbol == key.RSHIFT: + print("SHIFT") + self.app.pressedShift = True; + + if symbol == key.LCTRL or symbol == key.RCTRL: + print("CTRL") + self.app.pressedCtrl = True; + + def on_key_release(self, symbol, modifiers): print "pressed key: %s, mod: %s"%(symbol, modifiers) #print "pressed key: %s, mod: %s"%(pyglet.window.key.R, pyglet.window.key.MOD_CTRL) - if symbol==pyglet.window.key.R and modifiers & pyglet.window.key.MOD_CTRL: + + if symbol == key.LSHIFT or symbol == key.RSHIFT: + # This, of course, won't work if the windows loses thew focus... + self.app.pressedShift = False; + + if symbol == key.LCTRL or symbol == key.RCTRL: + # same focus problem like above + self.app.pressedCtrl = False; + + if symbol==key.R and modifiers & key.MOD_CTRL: self.app.reload() def placeLabels(self, width, height): @@ -394,10 +442,28 @@ class MyWindow(pyglet.window.Window): def on_mouse_scroll(self, x, y, dx, dy): - # zoom on mouse scroll delta = dx + dy - z = 1.2 if delta>0 else 1/1.2 - self.app.zoom = max(1.0, self.app.zoom * z) + + # scroll with SHIFT: translate height + if self.app.pressedShift: + if delta > 0: + self.app.viewHeight += 2; + elif delta < 0: + self.app.viewHeight -= 2; + + # scroll with CTRL: nothing in here, yet + elif self.app.pressedCtrl: + if delta > 0: + self.app.aaa += 2; + elif delta < 0: + self.app.aaa -= 2; + + # scroll: zomm in/out + else: + z = 1.2 if delta>0 else 1/1.2 + self.app.zoom = max(1.0, self.app.zoom * z) + + def on_draw(self): #print "draw" @@ -413,21 +479,8 @@ class MyWindow(pyglet.window.Window): # setup camera glMatrixMode(GL_MODELVIEW) glLoadIdentity() - gluLookAt(0,1.5,2,0,0,0,0,1,0) - - # enable alpha blending - glEnable(GL_BLEND) - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - - # rotate axes to match reprap style - glRotated(-90, 1,0,0) - # user rotate model - glRotated(-self.app.RX, 1,0,0) - glRotated(self.app.RZ, 0,0,1) - - # Todo check this - glTranslated(0,0,-0.5) - + gluLookAt( 0, 1.5, 2, 0 ,0 ,0 , 0 ,1 ,0 ) + # fit & user zoom model max_width = max( self.app.model.bbox.dx(), @@ -436,10 +489,27 @@ class MyWindow(pyglet.window.Window): ) scale = self.app.zoom / max_width glScaled(scale, scale, scale) + + # adjust camera height + gluLookAt( 0, self.app.viewHeight, 2, 0 ,self.app.viewHeight ,0 , 0 ,1 , 0 ) - glTranslated(-self.app.model.bbox.cx(), -self.app.model.bbox.cy(), -self.app.model.bbox.cz()) + # enable alpha blending + glEnable(GL_BLEND) + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + + # rotate axes to match reprap style + glRotated(-90, 1,0,0) + + glTranslated(0,0,self.app.viewHeight) + # user rotate model + glRotated(-self.app.RX, 1,0,0) + glRotated(self.app.RZ, 0,0,1) + + # modify the height + glTranslated(0,0,-self.app.viewHeight) + glTranslated(-self.app.model.bbox.cx(), -self.app.model.bbox.cy(), -self.app.model.bbox.cz()) # draw axes glBegin(GL_LINES) From aedc76a7f9248457348e241095c8471961ec6775 Mon Sep 17 00:00:00 2001 From: fmmt666 Date: Sun, 10 Jan 2016 20:27:35 +0100 Subject: [PATCH 2/8] implemented complete mouse and touch- or trackpad functionality --- README.md | 4 +- yagv | 164 ++++++++++++++++++++++++++++++------------------------ 2 files changed, 94 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 413d1d2..d7fec33 100644 --- a/README.md +++ b/README.md @@ -40,5 +40,7 @@ yagv [file.gcode] ## FMMT666's Changes: -* Model can now be moved up and down (SHIFT + scroll). +* Model can now be moved up and down * The scene now rotates around the center of the display, not the object. +* Implemented complete mouse functionality, compatible with touch- or trackpads (also Mac): + \ No newline at end of file diff --git a/yagv b/yagv index c805226..cf22321 100755 --- a/yagv +++ b/yagv @@ -19,20 +19,27 @@ import time class App: def __init__(self): - self.RX = 0.0 - self.RZ = 0.0 - self.zoom = 1.0 - - self.layerDragStartLayer = None - self.layerDragStartX = None - self.layerDragStartY = None - + + # viewport variables + self.RX = 0.0 + self.RZ = 0.0 + self.zoom = 1.0 + self.viewHeight = 0.0 + + # flags and variables for mouse operation "rotate" + self.rotateDrag = False # dragging in progess self.rotateDragStartRX = None self.rotateDragStartRZ = None self.rotateDragStartX = None self.rotateDragStartY = None - self.viewHeight = 0.0 + # flags and variables for mouse operation "layer change" + self.layerDrag = False # dragging in progess + self.layerDragStartLayer = None + self.layerDragStartX = None + self.layerDragStartY = None + + # flags for keyboard modifiers self.pressedShift = False self.pressedCtrl = False @@ -225,40 +232,39 @@ class App: t2 = time.time() print "end generateGraphics in %0.3f ms" % ((t2-t1)*1000.0, ) - - - def rotate_drag_start(self, x, y, button, modifiers): - self.rotateDragStartRX = self.RX - self.rotateDragStartRZ = self.RZ - self.rotateDragStartX = x - self.rotateDragStartY = y def rotate_drag_do(self, x, y, dx, dy, buttons, modifiers): - if self.rotateDragStartRX is not None: + if self.rotateDrag: # deltas deltaX = x - self.rotateDragStartX deltaY = y - self.rotateDragStartY # rotate! self.RZ = self.rotateDragStartRZ + deltaX/5.0 # mouse X bound to model Z self.RX = self.rotateDragStartRX + deltaY/5.0 # mouse Y bound to model X + else: + self.rotateDragStartRX = self.RX + self.rotateDragStartRZ = self.RZ + self.rotateDragStartX = x + self.rotateDragStartY = y + self.rotateDrag = True def rotate_drag_end(self, x, y, button, modifiers): self.rotateDragStartRX = None self.rotateDragStartRZ = None - self.rotateDragStartX = None - self.rotateDragStartY = None + self.rotateDragStartX = None + self.rotateDragStartY = None + self.rotateDrag = False + def layer_next_up(self, delta = 1): + self.layerIdx = max(min(self.layerIdx + delta, self.model.topLayer), 0) - def layer_drag_start(self, x, y, button, modifiers): - self.layerDragStartLayer = self.layerIdx - self.layerDragStartX = x - self.layerDragStartY = y - + def layer_next_down(self, delta = 1): + self.layerIdx = max(min(self.layerIdx - delta, self.model.topLayer), 0) def layer_drag_do(self, x, y, dx, dy, buttons, modifiers): - if self.layerDragStartLayer is not None: + if self.layerDrag: # sum x & y delta = x - self.layerDragStartX + y - self.layerDragStartY # new theoretical layer @@ -268,24 +274,23 @@ class App: self.window.layerLabel.text = "layer %d"%self.layerIdx - # # clamp layer to 0-max, with origin slip - # if (self.layerIdx < 0): - # self.layerIdx = 0 - # self.layerDragStartLayer = 0 - # self.layerDragStartX = x - # self.layerDragStartY = y - # if (self.layerIdx > len(self.model.layers)-1): - # self.layerIdx = len(self.model.layers)-1 - # self.layerDragStartLayer = len(self.model.layers)-1 - # self.layerDragStartX = x - # self.layerDragStartY = y - + else: + self.layerDragStartLayer = self.layerIdx + self.layerDragStartX = x + self.layerDragStartY = y + self.layerDrag = True + def layer_drag_end(self, x, y, button, modifiers): self.layerDragStartLayer = None - self.layerDragStartX = None - self.layerDragStartY = None + self.layerDragStartX = None + self.layerDragStartY = None + self.layerDrag = False + + def move_view_z(self, dz): + self.viewHeight += dz + class MyWindow(pyglet.window.Window): @@ -307,20 +312,16 @@ class MyWindow(pyglet.window.Window): # help self.helpText = [ "Ctrl-R to reload file", - "Right-click & drag (any direction) to change layer", - "Scroll + Shift to move up/down", - "Scroll to zoom", - "Left-click & drag to rotate view"] + "layer - scroll+ctrl or scroll+ctrl+shift or right+ctrl", + "zoom - scroll", + "up/down - mouse right or mouse left+shift or scroll+shift", + "rotate - mouse left"] for txt in self.helpText: - self.blLabels.append( - pyglet.text.Label( txt, - font_size=10) ) + self.blLabels.append( pyglet.text.Label( txt, font_size=10 ) ) # statistics ## model stats - self.statsLabel = pyglet.text.Label( "", - font_size=12, - anchor_y='top') + self.statsLabel = pyglet.text.Label( "", font_size=12, anchor_y='top' ) filename = os.path.basename(self.app.path) self.statsLabel.text = "%s: %d segments, %d layers."%(filename, len(self.app.model.segments), len(self.app.model.layers)) @@ -352,35 +353,45 @@ class MyWindow(pyglet.window.Window): def on_mouse_press(self, x, y, button, modifiers): #print "on_mouse_press(x=%d, y=%d, button=%s, modifiers=%s)"%(x, y, button, modifiers) - if modifiers == 0: - if button & mouse.LEFT: - self.app.rotate_drag_start(x, y, button, modifiers) - - if button & mouse.RIGHT: - self.app.layer_drag_start(x, y, button, modifiers) - - elif modifiers == key.MOD_SHIFT: - pass + + # ASkr: removed both of these to have a "mouse click" for other stuff. + #if button & mouse.LEFT: + # self.app.rotate_drag_start(x, y, button, modifiers) + #if button & mouse.RIGHT: + # self.app.layer_drag_start(x, y, button, modifiers) + + pass def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): - #print "on_mouse_drag(x=%d, y=%d, dx=%d, dy=%d, buttons=%s, modifiers=%s)"%(x, y, dx, dy, buttons, modifiers) + + # --- NO MODIFIERS if modifiers == 0: + # left drag rotates view if buttons & mouse.LEFT: self.app.rotate_drag_do(x, y, dx, dy, buttons, modifiers) - + # right drag moves view up/down if buttons & mouse.RIGHT: - self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) + self.app.move_view_z( -dy / 10.0 ) + # --- SHIFT elif modifiers == key.MOD_SHIFT: + # left drag + SHIFT moves view up/down if buttons & mouse.LEFT: - pass + self.app.move_view_z( -dy / 10.0 ) + + # --- CTRL + elif modifiers == key.MOD_CTRL: + # right drag + CTRL selects layer (touchpad compatibility) + if buttons & mouse.RIGHT: + self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) def on_mouse_release(self, x, y, button, modifiers): #print "on_mouse_release(x=%d, y=%d, button=%s, modifiers=%s)"%(x, y, button, modifiers) if button & mouse.LEFT: - self.app.rotate_drag_end(x, y, button, modifiers) + if self.app.rotateDrag == True: + self.app.rotate_drag_end(x, y, button, modifiers) if button & mouse.RIGHT: self.app.layer_drag_end(x, y, button, modifiers) @@ -401,7 +412,7 @@ class MyWindow(pyglet.window.Window): #print "pressed key: %s, mod: %s"%(pyglet.window.key.R, pyglet.window.key.MOD_CTRL) if symbol == key.LSHIFT or symbol == key.RSHIFT: - # This, of course, won't work if the windows loses thew focus... + # This, of course, won't work if the windows loses the focus... self.app.pressedShift = False; if symbol == key.LCTRL or symbol == key.RCTRL: @@ -444,21 +455,28 @@ class MyWindow(pyglet.window.Window): def on_mouse_scroll(self, x, y, dx, dy): delta = dx + dy - # scroll with SHIFT: translate height - if self.app.pressedShift: + # scroll with SHIFT only: translate height + if self.app.pressedShift and not self.app.pressedCtrl: if delta > 0: - self.app.viewHeight += 2; + self.app.move_view_z( 2.0 ) elif delta < 0: - self.app.viewHeight -= 2; + self.app.move_view_z( -2.0 ) - # scroll with CTRL: nothing in here, yet - elif self.app.pressedCtrl: + # scroll with CTRL only: select next layer (slow) + elif self.app.pressedCtrl and not self.app.pressedShift: if delta > 0: - self.app.aaa += 2; + self.app.layer_next_up() elif delta < 0: - self.app.aaa -= 2; + self.app.layer_next_down() - # scroll: zomm in/out + # scroll with CTRL and SHIFT: select next layer (fast) + elif self.app.pressedCtrl and self.app.pressedShift: + if delta > 0: + self.app.layer_next_up( 10 ) + elif delta < 0: + self.app.layer_next_down( 10 ) + + # scroll: zoom in/out else: z = 1.2 if delta>0 else 1/1.2 self.app.zoom = max(1.0, self.app.zoom * z) From 241e1a2464bee3b2290ffea81d640d2f44cf770e Mon Sep 17 00:00:00 2001 From: ASkr Date: Sun, 10 Jan 2016 21:38:15 +0100 Subject: [PATCH 3/8] reworked mouse, touch-/trackpad functionality for Mac compatibility --- README.md | 4 ++-- yagv | 43 +++++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index d7fec33..a5aa182 100644 --- a/README.md +++ b/README.md @@ -42,5 +42,5 @@ yagv [file.gcode] * Model can now be moved up and down * The scene now rotates around the center of the display, not the object. -* Implemented complete mouse functionality, compatible with touch- or trackpads (also Mac): - \ No newline at end of file +* Implemented complete mouse and track-/touchpad functionality. Compatible with Mac. + diff --git a/yagv b/yagv index cf22321..8d73a4f 100755 --- a/yagv +++ b/yagv @@ -42,6 +42,7 @@ class App: # flags for keyboard modifiers self.pressedShift = False self.pressedCtrl = False + self.pressedAlt = False # Command for Mac ('Alt' has wrong key code in OS X pyglet) # testing only self.aaa = 0.0 @@ -312,9 +313,9 @@ class MyWindow(pyglet.window.Window): # help self.helpText = [ "Ctrl-R to reload file", - "layer - scroll+ctrl or scroll+ctrl+shift or right+ctrl", - "zoom - scroll", - "up/down - mouse right or mouse left+shift or scroll+shift", + "layer - mouse left + alt/command; scroll + alt", + "zoom - mouse left + ctrl; scroll + ctrl", + "up/down - mouse left + shift; scroll + shift", "rotate - mouse left"] for txt in self.helpText: self.blLabels.append( pyglet.text.Label( txt, font_size=10 ) ) @@ -373,18 +374,29 @@ class MyWindow(pyglet.window.Window): # right drag moves view up/down if buttons & mouse.RIGHT: self.app.move_view_z( -dy / 10.0 ) - + # --- SHIFT elif modifiers == key.MOD_SHIFT: # left drag + SHIFT moves view up/down if buttons & mouse.LEFT: self.app.move_view_z( -dy / 10.0 ) - + # --- CTRL elif modifiers == key.MOD_CTRL: - # right drag + CTRL selects layer (touchpad compatibility) - if buttons & mouse.RIGHT: - self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) + # left drag + CTRL zoom + if buttons & mouse.LEFT: + z = 1.1 if dy>0 else 1/1.1 + self.app.zoom = max(1.0, self.app.zoom * z) + + # --- ALT/COMMAND + elif modifiers == key.MOD_ALT or modifiers == key.MOD_COMMAND: + # left drag + ALT selects layer + if buttons & mouse.LEFT: +# self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) + if dy > 0: + self.app.layer_next_up() + else: + self.app.layer_next_down() def on_mouse_release(self, x, y, button, modifiers): @@ -406,6 +418,9 @@ class MyWindow(pyglet.window.Window): print("CTRL") self.app.pressedCtrl = True; + if symbol == key.LALT or symbol == key.RALT or symbol == key.LCOMMAND or symbol == key.RCOMMAND: + print("ALT") + self.app.pressedAlt = True; def on_key_release(self, symbol, modifiers): print "pressed key: %s, mod: %s"%(symbol, modifiers) @@ -418,6 +433,10 @@ class MyWindow(pyglet.window.Window): if symbol == key.LCTRL or symbol == key.RCTRL: # same focus problem like above self.app.pressedCtrl = False; + + if symbol == key.LALT or symbol == key.RALT or symbol == key.LCOMMAND or symbol == key.RCOMMAND: + # same here + self.app.pressedAlt = False; if symbol==key.R and modifiers & key.MOD_CTRL: self.app.reload() @@ -462,15 +481,15 @@ class MyWindow(pyglet.window.Window): elif delta < 0: self.app.move_view_z( -2.0 ) - # scroll with CTRL only: select next layer (slow) - elif self.app.pressedCtrl and not self.app.pressedShift: + # scroll with ALT/COMMAND only: select next layer (slow) + elif self.app.pressedAlt and not self.app.pressedShift: if delta > 0: self.app.layer_next_up() elif delta < 0: self.app.layer_next_down() - # scroll with CTRL and SHIFT: select next layer (fast) - elif self.app.pressedCtrl and self.app.pressedShift: + # scroll with ALT/COMMAND and SHIFT: select next layer (fast) + elif self.app.pressedAlt and self.app.pressedShift: if delta > 0: self.app.layer_next_up( 10 ) elif delta < 0: From 6e13122fb3f1d550b9ea6a3f065686d0508c6075 Mon Sep 17 00:00:00 2001 From: fmmt666 Date: Sun, 10 Jan 2016 22:14:09 +0100 Subject: [PATCH 4/8] Tuned mouse and keyboard handling. Though completely different than before, yagv now behaves nice under Linux, Windows and Mac... Version increased to 0.5. --- yagv | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/yagv b/yagv index 8d73a4f..8322bac 100755 --- a/yagv +++ b/yagv @@ -1,6 +1,6 @@ #!/usr/bin/env python -YAGV_VERSION = "0.4" +YAGV_VERSION = "0.5" import pyglet @@ -312,13 +312,13 @@ class MyWindow(pyglet.window.Window): # help self.helpText = [ - "Ctrl-R to reload file", - "layer - mouse left + alt/command; scroll + alt", - "zoom - mouse left + ctrl; scroll + ctrl", + "reload - ctrl + r", + "layer - mouse left + alt/command; scroll + alt", + "zoom - mouse left + ctrl; scroll + ctrl", "up/down - mouse left + shift; scroll + shift", - "rotate - mouse left"] + "rotate - mouse left"] for txt in self.helpText: - self.blLabels.append( pyglet.text.Label( txt, font_size=10 ) ) + self.blLabels.append( pyglet.text.Label( txt, font_size=10, font_name="courier" ) ) # statistics ## model stats @@ -352,6 +352,7 @@ class MyWindow(pyglet.window.Window): return pyglet.event.EVENT_HANDLED + def on_mouse_press(self, x, y, button, modifiers): #print "on_mouse_press(x=%d, y=%d, button=%s, modifiers=%s)"%(x, y, button, modifiers) @@ -389,10 +390,11 @@ class MyWindow(pyglet.window.Window): self.app.zoom = max(1.0, self.app.zoom * z) # --- ALT/COMMAND + # Little annoying under Linux because Alt+drag moves windows (o_O), + # but the mouse's scroll wheel function coveres that... elif modifiers == key.MOD_ALT or modifiers == key.MOD_COMMAND: # left drag + ALT selects layer if buttons & mouse.LEFT: -# self.app.layer_drag_do(x, y, dx, dy, buttons, modifiers) if dy > 0: self.app.layer_next_up() else: @@ -422,6 +424,7 @@ class MyWindow(pyglet.window.Window): print("ALT") self.app.pressedAlt = True; + def on_key_release(self, symbol, modifiers): print "pressed key: %s, mod: %s"%(symbol, modifiers) #print "pressed key: %s, mod: %s"%(pyglet.window.key.R, pyglet.window.key.MOD_CTRL) @@ -440,6 +443,7 @@ class MyWindow(pyglet.window.Window): if symbol==key.R and modifiers & key.MOD_CTRL: self.app.reload() + def placeLabels(self, width, height): x = 5 @@ -475,21 +479,21 @@ class MyWindow(pyglet.window.Window): delta = dx + dy # scroll with SHIFT only: translate height - if self.app.pressedShift and not self.app.pressedCtrl: + if self.app.pressedShift and not self.app.pressedCtrl and not self.app.pressedAlt: if delta > 0: self.app.move_view_z( 2.0 ) elif delta < 0: self.app.move_view_z( -2.0 ) # scroll with ALT/COMMAND only: select next layer (slow) - elif self.app.pressedAlt and not self.app.pressedShift: + elif not self.app.pressedShift and not self.app.pressedCtrl and self.app.pressedAlt: if delta > 0: self.app.layer_next_up() elif delta < 0: self.app.layer_next_down() # scroll with ALT/COMMAND and SHIFT: select next layer (fast) - elif self.app.pressedAlt and self.app.pressedShift: + elif self.app.pressedShift and not self.app.pressedCtrl and self.app.pressedAlt: if delta > 0: self.app.layer_next_up( 10 ) elif delta < 0: @@ -501,7 +505,6 @@ class MyWindow(pyglet.window.Window): self.app.zoom = max(1.0, self.app.zoom * z) - def on_draw(self): #print "draw" From d3a9e53a2f3a330f3a5af56899dcc57ac375bbd6 Mon Sep 17 00:00:00 2001 From: fmmt666 Date: Tue, 12 Jan 2016 02:10:08 +0100 Subject: [PATCH 5/8] minor cleanups --- yagv | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/yagv b/yagv index 8322bac..c3c64e8 100755 --- a/yagv +++ b/yagv @@ -28,14 +28,14 @@ class App: # flags and variables for mouse operation "rotate" self.rotateDrag = False # dragging in progess - self.rotateDragStartRX = None + self.rotateDragStartRX = None # not necessary, only here for visibility self.rotateDragStartRZ = None self.rotateDragStartX = None self.rotateDragStartY = None # flags and variables for mouse operation "layer change" self.layerDrag = False # dragging in progess - self.layerDragStartLayer = None + self.layerDragStartLayer = None # not necessary, only here for visibility self.layerDragStartX = None self.layerDragStartY = None @@ -44,9 +44,7 @@ class App: self.pressedCtrl = False self.pressedAlt = False # Command for Mac ('Alt' has wrong key code in OS X pyglet) - # testing only - self.aaa = 0.0 - + def main(self): #### MAIN CODE #### @@ -252,10 +250,6 @@ class App: def rotate_drag_end(self, x, y, button, modifiers): - self.rotateDragStartRX = None - self.rotateDragStartRZ = None - self.rotateDragStartX = None - self.rotateDragStartY = None self.rotateDrag = False def layer_next_up(self, delta = 1): @@ -283,9 +277,6 @@ class App: def layer_drag_end(self, x, y, button, modifiers): - self.layerDragStartLayer = None - self.layerDragStartX = None - self.layerDragStartY = None self.layerDrag = False From a106c05df455bb9ae8185ca5dcf0084331a8da78 Mon Sep 17 00:00:00 2001 From: fmmt666 Date: Tue, 12 Jan 2016 02:24:26 +0100 Subject: [PATCH 6/8] minor cleanups --- .gitignore | 3 +++ gcodeParser.pyc | Bin 12351 -> 0 bytes yagv | 15 +++------------ 3 files changed, 6 insertions(+), 12 deletions(-) create mode 100644 .gitignore delete mode 100644 gcodeParser.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6de8bb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.bak +*~ +*.pyc diff --git a/gcodeParser.pyc b/gcodeParser.pyc deleted file mode 100644 index aa53e0bd60ea9a7d83088de7c0d867c4207047a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12351 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 CPNQW2 diff --git a/yagv b/yagv index 8322bac..c3c64e8 100755 --- a/yagv +++ b/yagv @@ -28,14 +28,14 @@ class App: # flags and variables for mouse operation "rotate" self.rotateDrag = False # dragging in progess - self.rotateDragStartRX = None + self.rotateDragStartRX = None # not necessary, only here for visibility self.rotateDragStartRZ = None self.rotateDragStartX = None self.rotateDragStartY = None # flags and variables for mouse operation "layer change" self.layerDrag = False # dragging in progess - self.layerDragStartLayer = None + self.layerDragStartLayer = None # not necessary, only here for visibility self.layerDragStartX = None self.layerDragStartY = None @@ -44,9 +44,7 @@ class App: self.pressedCtrl = False self.pressedAlt = False # Command for Mac ('Alt' has wrong key code in OS X pyglet) - # testing only - self.aaa = 0.0 - + def main(self): #### MAIN CODE #### @@ -252,10 +250,6 @@ class App: def rotate_drag_end(self, x, y, button, modifiers): - self.rotateDragStartRX = None - self.rotateDragStartRZ = None - self.rotateDragStartX = None - self.rotateDragStartY = None self.rotateDrag = False def layer_next_up(self, delta = 1): @@ -283,9 +277,6 @@ class App: def layer_drag_end(self, x, y, button, modifiers): - self.layerDragStartLayer = None - self.layerDragStartX = None - self.layerDragStartY = None self.layerDrag = False From c5e73744cd179e4590aa8013650bc13ac2218a95 Mon Sep 17 00:00:00 2001 From: fmmt666 Date: Tue, 12 Jan 2016 02:59:51 +0100 Subject: [PATCH 7/8] fix for "stuck" modifier keys, e.g. NUM_LOCK --- yagv | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/yagv b/yagv index c3c64e8..1326f64 100755 --- a/yagv +++ b/yagv @@ -357,7 +357,10 @@ class MyWindow(pyglet.window.Window): def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): - + + # ASkr: Suppress unwanted modifiers. Aka.: NUM_LOCK might ruin everything :) + modifiers &= ( key.MOD_SHIFT | key.MOD_CTRL | key.MOD_ALT | key.MOD_COMMAND ) + # --- NO MODIFIERS if modifiers == 0: # left drag rotates view From 756a0d181ea6dbac6e75ec4c64b6cf3592b0d9aa Mon Sep 17 00:00:00 2001 From: FMMT666 Date: Thu, 21 Sep 2017 00:17:31 +0200 Subject: [PATCH 8/8] updated readme --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a5aa182..c152109 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,18 @@ + +## FMMT666's Changes: + +* Model can now be moved up and down +* The scene now rotates around the center of the display, not the object. +* Implemented complete mouse and track-/touchpad functionality. Compatible with Mac. + +Future changes [tm] might be available from here: [yagv-ng][1]. + + +Have fun +FMMT666(ASkr) + +--- + # yagv - Yet Another Gcode Viewer, v0.4 A fast 3D Gcode Viewer for Reprap-style 3D printers, in Python and OpenGL (via pyglet) @@ -38,9 +53,7 @@ yagv [file.gcode] * G20: Set Units to Inches (usage unknown) * Arcs (G2 & G3 ?) -## FMMT666's Changes: +--- -* Model can now be moved up and down -* The scene now rotates around the center of the display, not the object. -* Implemented complete mouse and track-/touchpad functionality. Compatible with Mac. +[1]: https://github.com/FMMT666/yagv-ng