diff --git a/README.i18n b/README.i18n index 0b1d9fd..3684941 100644 --- a/README.i18n +++ b/README.i18n @@ -25,6 +25,10 @@ now there is only one, for German. New ones can be created: # Edit the .po file to add messages for newlang msgfmt -o ${newlang}.mo ${newlang}.po +To update a previously created message catalog from the template, use : + + msgmerge -U locale/fr/LC_MESSAGES/${lang}.po locale/pronterface.pot + As currently coded, the default location for these message catalogs is /usr/share/pronterface/locale/ diff --git a/gcview.py b/gcview.py new file mode 100755 index 0000000..912bb87 --- /dev/null +++ b/gcview.py @@ -0,0 +1,997 @@ +#!/usr/bin/python +import os +import math +import wx +from wx import glcanvas +import time +import threading + +import pyglet +pyglet.options['shadow_window'] = False +pyglet.options['debug_gl'] = False +from pyglet.gl import * + +import stltool + +import threading + + +class GLPanel(wx.Panel): + '''A simple class for using OpenGL with wxPython.''' + + def __init__(self, parent, id, pos=wx.DefaultPosition, + size=wx.DefaultSize, style=0): + # Forcing a no full repaint to stop flickering + style = style | wx.NO_FULL_REPAINT_ON_RESIZE + #call super function + super(GLPanel, self).__init__(parent, id, pos, size, style) + + #init gl canvas data + self.GLinitialized = False + attribList = (glcanvas.WX_GL_RGBA, # RGBA + glcanvas.WX_GL_DOUBLEBUFFER, # Double Buffered + glcanvas.WX_GL_DEPTH_SIZE, 24) # 24 bit + # Create the canvas + self.sizer = wx.BoxSizer(wx.HORIZONTAL) + self.canvas = glcanvas.GLCanvas(self, attribList=attribList) + self.sizer.Add(self.canvas, 1, wx.EXPAND) + self.SetSizer(self.sizer) + #self.sizer.Fit(self) + self.Layout() + + # bind events + self.canvas.Bind(wx.EVT_ERASE_BACKGROUND, self.processEraseBackgroundEvent) + self.canvas.Bind(wx.EVT_SIZE, self.processSizeEvent) + self.canvas.Bind(wx.EVT_PAINT, self.processPaintEvent) + + #========================================================================== + # Canvas Proxy Methods + #========================================================================== + def GetGLExtents(self): + '''Get the extents of the OpenGL canvas.''' + return self.canvas.GetClientSize() + + def SwapBuffers(self): + '''Swap the OpenGL buffers.''' + self.canvas.SwapBuffers() + + #========================================================================== + # wxPython Window Handlers + #========================================================================== + def processEraseBackgroundEvent(self, event): + '''Process the erase background event.''' + pass # Do nothing, to avoid flashing on MSWin + + def processSizeEvent(self, event): + '''Process the resize event.''' + if self.canvas.GetContext(): + # Make sure the frame is shown before calling SetCurrent. + self.Show() + self.canvas.SetCurrent() + size = self.GetGLExtents() + self.winsize = (size.width, size.height) + self.width, self.height = size.width, size.height + self.OnReshape(size.width, size.height) + self.canvas.Refresh(False) + event.Skip() + + def processPaintEvent(self, event): + '''Process the drawing event.''' + self.canvas.SetCurrent() + + # This is a 'perfect' time to initialize OpenGL ... only if we need to + if not self.GLinitialized: + self.OnInitGL() + self.GLinitialized = True + + self.OnDraw() + event.Skip() + + def Destroy(self): + #clean up the pyglet OpenGL context + #self.pygletcontext.destroy() + #call the super method + super(wx.Panel, self).Destroy() + + #========================================================================== + # GLFrame OpenGL Event Handlers + #========================================================================== + def OnInitGL(self): + '''Initialize OpenGL for use in the window.''' + #create a pyglet context for this panel + self.pmat = (GLdouble * 16)() + self.mvmat = (GLdouble * 16)() + self.pygletcontext = Context(current_context) + self.pygletcontext.set_current() + self.dist = 1000 + self.vpmat = None + #normal gl init + glClearColor(0, 0, 0, 1) + glColor3f(1, 0, 0) + glEnable(GL_DEPTH_TEST) + glEnable(GL_CULL_FACE) + # Uncomment this line for a wireframe view + #glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + + # Simple light setup. On Windows GL_LIGHT0 is enabled by default, + # but this is not the case on Linux or Mac, so remember to always + # include it. + glEnable(GL_LIGHTING) + glEnable(GL_LIGHT0) + glEnable(GL_LIGHT1) + + # Define a simple function to create ctypes arrays of floats: + def vec(*args): + return (GLfloat * len(args))(*args) + + glLightfv(GL_LIGHT0, GL_POSITION, vec(.5, .5, 1, 0)) + glLightfv(GL_LIGHT0, GL_SPECULAR, vec(.5, .5, 1, 1)) + glLightfv(GL_LIGHT0, GL_DIFFUSE, vec(1, 1, 1, 1)) + glLightfv(GL_LIGHT1, GL_POSITION, vec(1, 0, .5, 0)) + glLightfv(GL_LIGHT1, GL_DIFFUSE, vec(.5, .5, .5, 1)) + glLightfv(GL_LIGHT1, GL_SPECULAR, vec(1, 1, 1, 1)) + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.5, 0, 0.3, 1)) + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, vec(1, 1, 1, 1)) + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50) + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, vec(0, 0.1, 0, 0.9)) + #create objects to draw + #self.create_objects() + + def OnReshape(self, width, height): + '''Reshape the OpenGL viewport based on the dimensions of the window.''' + + if not self.GLinitialized: + self.OnInitGL() + self.GLinitialized = True + self.pmat = (GLdouble * 16)() + self.mvmat = (GLdouble * 16)() + glViewport(0, 0, width, height) + glMatrixMode(GL_PROJECTION) + glLoadIdentity() + gluPerspective(60., width / float(height), .1, 1000.) + glMatrixMode(GL_MODELVIEW) + glLoadIdentity() + #pyglet stuff + self.vpmat = (GLint * 4)(0, 0, *list(self.GetClientSize())) + glGetDoublev(GL_PROJECTION_MATRIX, self.pmat) + glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat) + #glMatrixMode(GL_PROJECTION) + + # Wrap text to the width of the window + if self.GLinitialized: + self.pygletcontext.set_current() + self.update_object_resize() + + def OnDraw(self, *args, **kwargs): + """Draw the window.""" + #clear the context + self.canvas.SetCurrent() + self.pygletcontext.set_current() + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + #draw objects + self.draw_objects() + #update screen + self.SwapBuffers() + + #========================================================================== + # To be implemented by a sub class + #========================================================================== + def create_objects(self): + '''create opengl objects when opengl is initialized''' + pass + + def update_object_resize(self): + '''called when the window recieves only if opengl is initialized''' + pass + + def draw_objects(self): + '''called in the middle of ondraw after the buffer has been cleared''' + pass + + +def _dist(dist): + """return axis length, or 0 if None""" + if dist is None: + return 0 + else: + return float(dist) + +class gcpoint(object): + """gcode point + stub for first line""" + def __init__(self, x=0,y=0,z=0,e=0): + self.x = x + self.y = y + self.z = z + self.e = e + self.length = 0 + + +class gcline(object): + """gcode move line + Once initialised,it knows its position, length and extrusion ratio + Returns lines into gcview batch() + """ + def __init__(self, x=None, y=None, z=None, e=None, f=None, prev_gcline=None, orgline = False): + if prev_gcline is None: + self.prev_gcline = gcpoint() + else: + self.prev_gcline = prev_gcline + if x is None: + self.x = self.prev_gcline.x + else: + self.x = float(x) + if y is None: + self.y = self.prev_gcline.y + else: + self.y = float(y) + if z is None: + self.z = self.prev_gcline.z + else: + self.z = float(z) + if e is None: + self.e = self.prev_gcline.e + else: + self.e = float(e) + + self.f = f + + self.orgline = orgline + + self.calc_delta() + self.calc_len() + + def __str__(self): + return u"line from %s,%s,%s to %s,%s,%s with extrusion ratio %s and feedrate %s\n%s" % ( + self.prev_gcline.x, + self.prev_gcline.y, + self.prev_gcline.z, + self.x, + self.y, + self.z, + self.extrusion_ratio, + self.f, + self.orgline, + ) + + def calc_delta(self, prev_gcline=None): + if prev_gcline is None: + prev_gcline = self.prev_gcline + if self.prev_gcline is not None: + self.dx = self.x - prev_gcline.x + self.dy = self.y - prev_gcline.y + self.dz = self.z - prev_gcline.z + self.de = self.e - prev_gcline.e + else: + self.dx = self.x + self.dy = self.y + self.dz = self.z + self.de = self.e + + def calc_len(self): + if self.dz != 0: + self.length = math.sqrt(self.dx**2 + self.dy**2 + self.dz**2) + else: + self.length = math.sqrt(self.dx**2 + self.dy**2) + if self.de: + self.extrusion_ratio = self.length / self.de + else: + self.extrusion_ratio = 0 + + def glline(self): + return [ + self.prev_gcline.x, + self.prev_gcline.y, + self.prev_gcline.z, + self.x, + self.y, + self.z, + ] + def glcolor(self, upper_limit = None, lower_limit = 0, max_feedrate = 0): + if self.extrusion_ratio == 0: + return [255,255,255,0,0,0] + else: + blue_color = 0 + green_color = 0 + if upper_limit is not None: + if self.extrusion_ratio <= lower_limit: + blue_color = 0 + else: + blue_color = int ((self.extrusion_ratio - lower_limit) / (upper_limit - lower_limit) * 255) + else: + blue_color = 0 + if max_feedrate > 0 and self.f > 0: + green_color = int((self.f/max_feedrate) * 255) + + if green_color > 255: + green_color = 255 + if green_color < 0: + green_color = 0 + if blue_color > 255: + blue_color = 255 + if blue_color < 0: + blue_color = 0 + return[255,green_color,blue_color,128,green_color,blue_color/4] + + +def float_from_line(axe, line): + return float(line.split(axe)[1].split(" ")[0]) + +class gcThreadRenderer(threading.Thread): + def __init__(self, gcview, lines): + threading.Thread.__init__(self) + self.gcview = gcview + self.lines = lines + print "q init" + + def run(self): + for line in self.lines: + layer_name = line.z + if line.z not in self.gcview.layers: + self.gcview.layers[line.z] = pyglet.graphics.Batch() + self.gcview.layerlist = self.gcview.layers.keys() + self.gcview.layerlist.sort() + self.gcview.layers[line.z].add(2, GL_LINES, None, ("v3f", line.glline()), ("c3B", line.glcolor(self.gcview.upper_limit, self.gcview.lower_limit, self.gcview.max_feedrate))) + self.gcview.t2 = time.time() + print "Rendered lines in %fs" % (self.gcview.t2-self.gcview.t1) + +class gcview(object): + """gcode visualiser + Holds opengl objects for all layers + """ + def __init__(self, lines, batch, w=0.5, h=0.5): + if len(lines) == 0: + return + print "Loading %s lines" % (len(lines)) + #End pos of previous mode + self.prev = gcpoint() + # Correction for G92 moves + self.delta = [0, 0, 0, 0] + self.layers = {} + self.t0 = time.time() + self.lastf = 0 + lines = [self.transform(i) for i in lines] + lines = [i for i in lines if i is not None] + self.t1 = time.time() + print "transformed %s lines in %fs" % (len(lines), self.t1- self.t0) + self.upper_limit = 0 + self.lower_limit = None + self.max_feedrate = 0 + for line in lines: + if line.extrusion_ratio and line.length > 0.005: #lines shorter than 0.003 can have large extrusion ratio + if line.extrusion_ratio > self.upper_limit: + self.upper_limit = line.extrusion_ratio + if self.lower_limit is None or line.extrusion_ratio < self.lower_limit: + self.lower_limit = line.extrusion_ratio + if line.f > self.max_feedrate: + self.max_feedrate = line.f + #print upper_limit, lower_limit + #self.render_gl(lines) + q = gcThreadRenderer(self, lines) + q.setDaemon(True) + q.start() + + + + + def transform(self, line): + """transforms line of gcode into gcline object (or None if its not move) + Tracks coordinates across resets in self.delta + """ + orgline = line + line = line.split(";")[0] + cur = [None, None, None, None, None] + if len(line) > 0: + if "G92" in line: + #Recalculate delta on G92 (reset) + if("X" in line): + try: + self.delta[0] = float_from_line("X", line) + self.prev.x + except: + self.delta[0] = 0 + if("Y" in line): + try: + self.delta[1] = float_from_line("Y", line) + self.prev.y + except: + self.delta[1] = 0 + if("Z" in line): + try: + self.delta[2] = float_from_line("Z", line) + self.prev.z + except: + self.delta[2] = 0 + if("E" in line): + try: + self.delta[3] = float_from_line("E", line) + self.prev.e + except: + self.delta[3] = 0 + return None + + if "G1" in line or "G0" in line: + #Create new gcline + if("X" in line): + cur[0] = float_from_line("X", line) + self.delta[0] + if("Y" in line): + cur[1] = float_from_line("Y", line) + self.delta[1] + if("Z" in line): + cur[2] = float_from_line("Z", line) + self.delta[2] + if("E" in line): + cur[3] = float_from_line("E", line) + self.delta[3] + if "F" in line: + cur[4] = float_from_line("F", line) + + + if cur == [None, None, None, None, None]: + return None + else: + #print cur + if cur[4] is None: + cur[4] = self.lastf + else: + self.lastf = cur[4] + + r = gcline(x=cur[0], y=cur[1], z=cur[2],e=cur[3], f=cur[4], prev_gcline=self.prev, orgline=orgline) + self.prev = r + return r + return None + + def delete(self): + #for i in self.vlists: + # i.delete() + #self.vlists = [] + pass + + +def trackball(p1x, p1y, p2x, p2y, r): + TRACKBALLSIZE = r + +#float a[3]; /* Axis of rotation */ +#float phi; /* how much to rotate about axis */ +#float p1[3], p2[3], d[3]; +#float t; + + if (p1x == p2x and p1y == p2y): + return [0.0, 0.0, 0.0, 1.0] + + p1 = [p1x, p1y, project_to_sphere(TRACKBALLSIZE, p1x, p1y)] + p2 = [p2x, p2y, project_to_sphere(TRACKBALLSIZE, p2x, p2y)] + a = stltool.cross(p2, p1) + + d = map(lambda x, y: x - y, p1, p2) + t = math.sqrt(sum(map(lambda x: x * x, d))) / (2.0 * TRACKBALLSIZE) + + if (t > 1.0): + t = 1.0 + if (t < -1.0): + t = -1.0 + phi = 2.0 * math.asin(t) + + return axis_to_quat(a, phi) + + +def vec(*args): + return (GLfloat * len(args))(*args) + + +def axis_to_quat(a, phi): + #print a, phi + lena = math.sqrt(sum(map(lambda x: x * x, a))) + q = map(lambda x: x * (1 / lena), a) + q = map(lambda x: x * math.sin(phi / 2.0), q) + q.append(math.cos(phi / 2.0)) + return q + + +def build_rotmatrix(q): + m = (GLdouble * 16)() + m[0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]) + m[1] = 2.0 * (q[0] * q[1] - q[2] * q[3]) + m[2] = 2.0 * (q[2] * q[0] + q[1] * q[3]) + m[3] = 0.0 + + m[4] = 2.0 * (q[0] * q[1] + q[2] * q[3]) + m[5] = 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]) + m[6] = 2.0 * (q[1] * q[2] - q[0] * q[3]) + m[7] = 0.0 + + m[8] = 2.0 * (q[2] * q[0] - q[1] * q[3]) + m[9] = 2.0 * (q[1] * q[2] + q[0] * q[3]) + m[10] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]) + m[11] = 0.0 + + m[12] = 0.0 + m[13] = 0.0 + m[14] = 0.0 + m[15] = 1.0 + return m + + +def project_to_sphere(r, x, y): + d = math.sqrt(x * x + y * y) + if (d < r * 0.70710678118654752440): + return math.sqrt(r * r - d * d) + else: + t = r / 1.41421356237309504880 + return t * t / d + + +def mulquat(q1, rq): + return [q1[3] * rq[0] + q1[0] * rq[3] + q1[1] * rq[2] - q1[2] * rq[1], + q1[3] * rq[1] + q1[1] * rq[3] + q1[2] * rq[0] - q1[0] * rq[2], + q1[3] * rq[2] + q1[2] * rq[3] + q1[0] * rq[1] - q1[1] * rq[0], + q1[3] * rq[3] - q1[0] * rq[0] - q1[1] * rq[1] - q1[2] * rq[2]] + + +class TestGlPanel(GLPanel): + + def __init__(self, parent, size, id=wx.ID_ANY): + super(TestGlPanel, self).__init__(parent, id, wx.DefaultPosition, size, 0) + self.batches = [] + self.rot = 0 + self.canvas.Bind(wx.EVT_MOUSE_EVENTS, self.move) + self.canvas.Bind(wx.EVT_LEFT_DCLICK, self.double) + self.initialized = 1 + self.canvas.Bind(wx.EVT_MOUSEWHEEL, self.wheel) + self.parent = parent + self.initpos = None + self.dist = 200 + self.bedsize = [200, 200] + self.transv = [0, 0, -self.dist] + self.basequat = [0, 0, 0, 1] + wx.CallAfter(self.forceresize) + self.mousepos = [0, 0] + + def double(self, event): + p = event.GetPositionTuple() + sz = self.GetClientSize() + v = map(lambda m, w, b: b * m / w, p, sz, self.bedsize) + v[1] = self.bedsize[1] - v[1] + v += [300] + print v + self.add_file("../prusa/metric-prusa/x-end-idler.stl", v) + + def forceresize(self): + self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] + 1)) + self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] - 1)) + threading.Thread(target=self.update).start() + self.initialized = 0 + + def move_shape(self, delta): + """moves shape (selected in l, which is list ListBox of shapes) + by an offset specified in tuple delta. + Positive numbers move to (rigt, down)""" + name = self.parent.l.GetSelection() + if name == wx.NOT_FOUND: + return False + + name = self.parent.l.GetString(name) + + model = self.parent.models[name] + model.offsets = [ + model.offsets[0] + delta[0], + model.offsets[1] + delta[1], + model.offsets[2] + ] + self.Refresh() + return True + + def move(self, event): + """react to mouse actions: + no mouse: show red mousedrop + LMB: move active object, + with shift rotate viewport + RMB: nothing + with shift move viewport + """ + if event.Dragging() and event.LeftIsDown(): + if self.initpos == None: + self.initpos = event.GetPositionTuple() + else: + if not event.ShiftDown(): + currentpos = event.GetPositionTuple() + delta = ( + (currentpos[0] - self.initpos[0]), + -(currentpos[1] - self.initpos[1]) + ) + self.move_shape(delta) + self.initpos = None + return + #print self.initpos + p1 = self.initpos + self.initpos = None + p2 = event.GetPositionTuple() + sz = self.GetClientSize() + p1x = (float(p1[0]) - sz[0] / 2) / (sz[0] / 2) + p1y = -(float(p1[1]) - sz[1] / 2) / (sz[1] / 2) + p2x = (float(p2[0]) - sz[0] / 2) / (sz[0] / 2) + p2y = -(float(p2[1]) - sz[1] / 2) / (sz[1] / 2) + #print p1x,p1y,p2x,p2y + quat = trackball(p1x, p1y, p2x, p2y, -self.transv[2] / 250.0) + if self.rot: + self.basequat = mulquat(self.basequat, quat) + #else: + glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat) + #self.basequat = quatx + mat = build_rotmatrix(self.basequat) + glLoadIdentity() + glTranslatef(self.transv[0], self.transv[1], 0) + glTranslatef(0, 0, self.transv[2]) + glMultMatrixd(mat) + glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat) + self.rot = 1 + + elif event.ButtonUp(wx.MOUSE_BTN_LEFT): + if self.initpos is not None: + self.initpos = None + elif event.ButtonUp(wx.MOUSE_BTN_RIGHT): + if self.initpos is not None: + self.initpos = None + + elif event.Dragging() and event.RightIsDown() and event.ShiftDown(): + if self.initpos is None: + self.initpos = event.GetPositionTuple() + else: + p1 = self.initpos + p2 = event.GetPositionTuple() + sz = self.GetClientSize() + p1 = list(p1) + p2 = list(p2) + p1[1] *= -1 + p2[1] *= -1 + + self.transv = map(lambda x, y, z, c: c - self.dist * (x - y) / z, list(p1) + [0], list(p2) + [0], list(sz) + [1], self.transv) + + glLoadIdentity() + glTranslatef(self.transv[0], self.transv[1], 0) + glTranslatef(0, 0, self.transv[2]) + if(self.rot): + glMultMatrixd(build_rotmatrix(self.basequat)) + glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat) + self.rot = 1 + self.initpos = None + else: + #mouse is moving without a button press + p = event.GetPositionTuple() + sz = self.GetClientSize() + v = map(lambda m, w, b: b * m / w, p, sz, self.bedsize) + v[1] = self.bedsize[1] - v[1] + self.mousepos = v + + def rotate_shape(self, angle): + """rotates acive shape + positive angle is clockwise + """ + name = self.parent.l.GetSelection() + if name == wx.NOT_FOUND: + return False + name = self.parent.l.GetString(name) + model = self.parent.models[name] + model.rot += angle + + def wheel(self, event): + """react to mouse wheel actions: + rotate object + with shift zoom viewport + """ + z = event.GetWheelRotation() + angle = 10 + if not event.ShiftDown(): + i = self.parent.l.GetSelection() + + if i < 0: + try: + self.parent.setlayerindex(z) + except: + pass + return + + if z > 0: + self.rotate_shape(angle / 2) + else: + self.rotate_shape(-angle / 2) + return + if z > 0: + self.transv[2] += angle + else: + self.transv[2] -= angle + + glLoadIdentity() + glTranslatef(*self.transv) + if(self.rot): + glMultMatrixd(build_rotmatrix(self.basequat)) + glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat) + self.rot = 1 + + def keypress(self, event): + """gets keypress events and moves/rotates acive shape""" + keycode = event.GetKeyCode() + print keycode + step = 5 + angle = 18 + if event.ControlDown(): + step = 1 + angle = 1 + #h + if keycode == 72: + self.move_shape((-step, 0)) + #l + if keycode == 76: + self.move_shape((step, 0)) + #j + if keycode == 75: + self.move_shape((0, step)) + #k + if keycode == 74: + self.move_shape((0, -step)) + #[ + if keycode == 91: + self.rotate_shape(-angle) + #] + if keycode == 93: + self.rotate_shape(angle) + event.Skip() + + def update(self): + while(1): + dt = 0.05 + time.sleep(0.05) + try: + wx.CallAfter(self.Refresh) + except: + return + + def anim(self, obj): + g = 50 * 9.8 + v = 20 + dt = 0.05 + basepos = obj.offsets[2] + obj.offsets[2] += obj.animoffset + while obj.offsets[2] > -1: + time.sleep(dt) + obj.offsets[2] -= v * dt + v += g * dt + if(obj.offsets[2] < 0): + obj.scale[2] *= 1 - 3 * dt + #return + v = v / 4 + while obj.offsets[2] < basepos: + time.sleep(dt) + obj.offsets[2] += v * dt + v -= g * dt + obj.scale[2] *= 1 + 5 * dt + obj.scale[2] = 1.0 + + def create_objects(self): + '''create opengl objects when opengl is initialized''' + self.initialized = 1 + wx.CallAfter(self.Refresh) + + def drawmodel(self, m, n): + batch = pyglet.graphics.Batch() + stl = stlview(m.facets, batch=batch) + m.batch = batch + m.animoffset = 300 + #print m + #threading.Thread(target = self.anim, args = (m, )).start() + wx.CallAfter(self.Refresh) + + def update_object_resize(self): + '''called when the window recieves only if opengl is initialized''' + pass + + def draw_objects(self): + '''called in the middle of ondraw after the buffer has been cleared''' + if self.vpmat is None: + return + if not self.initialized: + self.create_objects() + + #glLoadIdentity() + #print list(self.pmat) + if self.rot == 1: + glLoadIdentity() + glMultMatrixd(self.mvmat) + else: + glLoadIdentity() + glTranslatef(*self.transv) + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1)) + glBegin(GL_LINES) + glNormal3f(0, 0, 1) + rows = 10 + cols = 10 + zheight = 50 + for i in xrange(-rows, rows + 1): + if i % 5 == 0: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1)) + else: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1)) + glVertex3f(10 * -cols, 10 * i, 0) + glVertex3f(10 * cols, 10 * i, 0) + for i in xrange(-cols, cols + 1): + if i % 5 == 0: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1)) + else: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1)) + glVertex3f(10 * i, 10 * -rows, 0) + glVertex3f(10 * i, 10 * rows, 0) + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1)) + glVertex3f(10 * -cols, 10 * -rows, 0) + glVertex3f(10 * -cols, 10 * -rows, zheight) + glVertex3f(10 * cols, 10 * rows, 0) + glVertex3f(10 * cols, 10 * rows, zheight) + glVertex3f(10 * cols, 10 * -rows, 0) + glVertex3f(10 * cols, 10 * -rows, zheight) + glVertex3f(10 * -cols, 10 * rows, 0) + glVertex3f(10 * -cols, 10 * rows, zheight) + + glVertex3f(10 * -cols, 10 * rows, zheight) + glVertex3f(10 * cols, 10 * rows, zheight) + glVertex3f(10 * cols, 10 * rows, zheight) + glVertex3f(10 * cols, 10 * -rows, zheight) + glVertex3f(10 * cols, 10 * -rows, zheight) + glVertex3f(10 * -cols, 10 * -rows, zheight) + glVertex3f(10 * -cols, 10 * -rows, zheight) + glVertex3f(10 * -cols, 10 * rows, zheight) + + glEnd() + glPushMatrix() + glTranslatef(self.mousepos[0] - self.bedsize[0] / 2, self.mousepos[1] - self.bedsize[1] / 2, 0) + glBegin(GL_TRIANGLES) + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(1, 0, 0, 1)) + glNormal3f(0, 0, 1) + glVertex3f(2, 2, 0) + glVertex3f(-2, 2, 0) + glVertex3f(-2, -2, 0) + glVertex3f(2, -2, 0) + glVertex3f(2, 2, 0) + glVertex3f(-2, -2, 0) + glEnd() + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.3, 0.7, 0.5, 1)) + #glTranslatef(0, 40, 0) + glPopMatrix() + glPushMatrix() + glTranslatef(-100, -100, 0) + glEnable(GL_LINE_SMOOTH) + glEnable(GL_BLEND) + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + glHint (GL_LINE_SMOOTH_HINT, GL_NICEST) + glLineWidth (1.5) + + for i in self.parent.models.values(): + glPushMatrix() + glTranslatef(*(i.offsets)) + glRotatef(i.rot, 0.0, 0.0, 1.0) + glScalef(*i.scale) + #glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.93, 0.37, 0.25, 1)) + glEnable(GL_COLOR_MATERIAL) + + if i.curlayer == -1: + # curlayer == -1 means we are over the top. + glLineWidth (0.8) + [i.gc.layers[j].draw() for j in i.gc.layerlist] + else: + glLineWidth (0.6) + + tmpindex = i.gc.layerlist.index(i.curlayer) + if tmpindex >= 5: + thin_layer = i.gc.layerlist[tmpindex - 5] + [i.gc.layers[j].draw() for j in i.gc.layerlist if j <= thin_layer] + + if tmpindex > 4: + glLineWidth (0.9) + i.gc.layers[i.gc.layerlist[tmpindex - 4]].draw() + + if tmpindex > 3: + glLineWidth (1.1) + i.gc.layers[i.gc.layerlist[tmpindex - 3]].draw() + + if tmpindex > 2: + glLineWidth (1.3) + i.gc.layers[i.gc.layerlist[tmpindex - 2]].draw() + + if tmpindex > 1: + glLineWidth (2.2) + i.gc.layers[i.gc.layerlist[tmpindex - 1]].draw() + + glLineWidth (3.5) + i.gc.layers[i.curlayer].draw() + glLineWidth (1.5) + + glDisable(GL_COLOR_MATERIAL) + + glPopMatrix() + glPopMatrix() + #print "drawn batch" + + +class GCFrame(wx.Frame): + '''A simple class for using OpenGL with wxPython.''' + + def __init__(self, parent, ID, title, pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE): + super(GCFrame, self).__init__(parent, ID, title, pos, (size[0] + 150, size[1]), style) + + class d: + def GetSelection(self): + return wx.NOT_FOUND + self.p = self + m = d() + m.offsets = [0, 0, 0] + m.rot = 0 + m.curlayer = -1 + m.scale = [1.0, 1.0, 1.0] + m.batch = pyglet.graphics.Batch() + m.gc = gcview([], batch=m.batch) + self.models = {"GCODE": m} + self.l = d() + self.modelindex = 0 + self.GLPanel1 = TestGlPanel(self, size) + + def addfile(self, gcode=[]): + self.models["GCODE"].gc.delete() + self.models["GCODE"].gc = gcview(gcode, batch=self.models["GCODE"].batch) + self.setlayerindex(None) + + def clear(self): + self.models["GCODE"].gc.delete() + self.models["GCODE"].gc = gcview([], batch=self.models["GCODE"].batch) + + def Show(self, arg=True): + wx.Frame.Show(self, arg) + self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] + 1)) + self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] - 1)) + self.Refresh() + wx.FutureCall(500, self.GLPanel1.forceresize) + #threading.Thread(target = self.update).start() + #self.initialized = 0 + + def setlayerindex(self, z): + m = self.models["GCODE"] + try: + mlk = m.gc.layerlist + except: + mlk = [] + if z is None: + self.modelindex = -1 + elif z > 0: + if self.modelindex < len(mlk) - 1: + if self.modelindex > -1: + self.modelindex += 1 + else: + self.modelindex = -1 + elif z < 0: + if self.modelindex > 0: + self.modelindex -= 1 + elif self.modelindex == -1: + self.modelindex = len(mlk) + + if self.modelindex >= 0: + m.curlayer = mlk[self.modelindex] + wx.CallAfter(self.SetTitle, "Gcode view, shift to move. Layer %d/%d, Z = %f" % (self.modelindex, len(mlk), m.curlayer)) + else: + m.curlayer = -1 + wx.CallAfter(self.SetTitle, "Gcode view, shift to move view, mousewheel to set layer") + + + +def main(): + app = wx.App(redirect=False) + frame = GCFrame(None, wx.ID_ANY, 'Gcode view, shift to move view, mousewheel to set layer', size=(400, 400)) + import sys + for filename in sys.argv: + if ".gcode" in filename: + frame.addfile(list(open(filename))) + elif ".stl" in filename: + #TODO: add stl here + pass + + #frame = wx.Frame(None, -1, "GL Window", size=(400, 400)) + #panel = TestGlPanel(frame, size=(300,300)) + frame.Show(True) + app.MainLoop() + app.Destroy() + +if __name__ == "__main__": + #import cProfile + #print cProfile.run("main()") + main() diff --git a/graph.py b/graph.py new file mode 100644 index 0000000..d96675f --- /dev/null +++ b/graph.py @@ -0,0 +1,267 @@ +#!/usr/bin/python + +# This file is part of the Printrun suite. +# +# Printrun is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Printrun is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Printrun. If not, see . + +import wx, random + +from bufferedcanvas import * + +class Graph(BufferedCanvas): + '''A class to show a Graph with Pronterface.''' + + def __init__(self, parent, id, pos=wx.DefaultPosition, + size=wx.DefaultSize, style=0): + # Forcing a no full repaint to stop flickering + style = style | wx.NO_FULL_REPAINT_ON_RESIZE + #call super function + #super(Graph, self).__init__(parent, id, pos, size, style) + BufferedCanvas.__init__(self, parent, id) + + self.SetSize(wx.Size(170, 100)) + + self.extruder0temps = [0] + self.extruder0targettemps = [0] + self.extruder1temps = [0] + self.extruder1targettemps = [0] + self.bedtemps = [0] + self.bedtargettemps = [0] + + self.timer = wx.Timer(self) + self.Bind(wx.EVT_TIMER, self.updateTemperatures, self.timer) + + self.maxyvalue = 250 + self.ybars = 5 + self.xbars = 6 # One bar per 10 second + self.xsteps = 60 # Covering 1 minute in the graph + + self.y_offset = 1 # This is to show the line even when value is 0 and maxyvalue + + self._lastyvalue = 0 + + + #self.sizer = wx.BoxSizer(wx.HORIZONTAL) + #self.sizer.Add(wx.Button(self, -1, "Button1", (0,0))) + #self.SetSizer(self.sizer) + + + + def OnPaint(self, evt): + dc = wx.PaintDC(self) + gc = wx.GraphicsContext.Create(dc) + + def Destroy(self): + #call the super method + super(wx.Panel, self).Destroy() + + + def updateTemperatures(self, event): + self.AddBedTemperature(self.bedtemps[-1]) + self.AddBedTargetTemperature(self.bedtargettemps[-1]) + self.AddExtruder0Temperature(self.extruder0temps[-1]) + self.AddExtruder0TargetTemperature(self.extruder0targettemps[-1]) + #self.AddExtruder1Temperature(self.extruder1temps[-1]) + #self.AddExtruder1TargetTemperature(self.extruder1targettemps[-1]) + self.Refresh() + + + def drawgrid(self, dc, gc): + #cold,medium,hot = wx.Colour(0,167,223),wx.Colour(239,233,119),wx.Colour(210,50.100) + #col1 = wx.Colour(255,0,0, 255) + #col2 = wx.Colour(255,255,255, 128) + + #b = gc.CreateLinearGradientBrush(0, 0, w, h, col1, col2) + + gc.SetPen(wx.Pen(wx.Colour(255,0,0,0), 4)) + #gc.SetBrush(gc.CreateBrush(wx.Brush(wx.Colour(245,245,255,252)))) + #gc.SetBrush(b) + gc.DrawRectangle(0, 0, self.width, self.height) + + #gc.SetBrush(wx.Brush(wx.Colour(245,245,255,52))) + + #gc.SetBrush(gc.CreateBrush(wx.Brush(wx.Colour(0,0,0,255)))) + #gc.SetPen(wx.Pen(wx.Colour(255,0,0,0), 4)) + + #gc.DrawLines(wx.Point(0,0), wx.Point(50,10)) + + #path = gc.CreatePath() + #path.MoveToPoint(0.0, 0.0) + #path.AddLineToPoint(0.0, 100.0) + #path.AddLineToPoint(100.0, 0.0) + #path.AddCircle( 50.0, 50.0, 50.0 ) + #path.CloseSubpath() + #gc.DrawPath(path) + #gc.StrokePath(path) + + + font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD) + gc.SetFont(font, wx.Colour(23,44,44)) + + dc.SetPen(wx.Pen(wx.Colour(225,225,225), 1)) + for x in range(self.xbars): + dc.DrawLine(x*(float(self.width)/self.xbars), 0, x*(float(self.width)/self.xbars), self.height) + + dc.SetPen(wx.Pen(wx.Colour(225,225,225), 1)) + for y in range(self.ybars): + y_pos = y*(float(self.height)/self.ybars) + dc.DrawLine(0,y_pos, self.width,y_pos) + gc.DrawText(unicode(int(self.maxyvalue - (y * (self.maxyvalue/self.ybars)))), 1, y_pos - (font.GetPointSize() / 2)) + + if self.timer.IsRunning() == False: + font = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD) + gc.SetFont(font, wx.Colour(3,4,4)) + gc.DrawText("Graph offline", self.width/2 - (font.GetPointSize() * 3), self.height/2 - (font.GetPointSize() * 1)) + + #dc.DrawCircle(50,50, 1) + + #gc.SetPen(wx.Pen(wx.Colour(255,0,0,0), 1)) + #gc.DrawLines([[20,30], [10,53]]) + #dc.SetPen(wx.Pen(wx.Colour(255,0,0,0), 1)) + + def drawtemperature(self, dc, gc, temperature_list, text, text_xoffset, r, g, b, a): + if self.timer.IsRunning() == False: + dc.SetPen(wx.Pen(wx.Colour(128,128,128,128), 1)) + else: + dc.SetPen(wx.Pen(wx.Colour(r,g,b,a), 1)) + + x_add = float(self.width)/self.xsteps + x_pos = float(0.0) + lastxvalue = float(0.0) + + for temperature in (temperature_list): + y_pos = int((float(self.height-self.y_offset)/self.maxyvalue)*temperature) + self.y_offset + if (x_pos > 0.0): # One need 2 points to draw a line. + dc.DrawLine(lastxvalue,self.height-self._lastyvalue, x_pos, self.height-y_pos) + + lastxvalue = x_pos + x_pos = float(x_pos) + x_add + self._lastyvalue = y_pos + + if len(text) > 0: + font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD) + #font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL) + if self.timer.IsRunning() == False: + gc.SetFont(font, wx.Colour(128,128,128)) + else: + gc.SetFont(font, wx.Colour(r,g,b)) + + #gc.DrawText(text, self.width - (font.GetPointSize() * ((len(text) * text_xoffset + 1))), self.height - self._lastyvalue - (font.GetPointSize() / 2)) + gc.DrawText(text, x_pos - x_add - (font.GetPointSize() * ((len(text) * text_xoffset + 1))), self.height - self._lastyvalue - (font.GetPointSize() / 2)) + #gc.DrawText(text, self.width - (font.GetPixelSize().GetWidth() * ((len(text) * text_xoffset + 1) + 1)), self.height - self._lastyvalue - (font.GetPointSize() / 2)) + + + def drawbedtemp(self, dc, gc): + self.drawtemperature(dc, gc, self.bedtemps, "Bed",2, 255,0,0, 128) + + def drawbedtargettemp(self, dc, gc): + self.drawtemperature(dc, gc, self.bedtargettemps, "Bed Target",2, 255,120,0, 128) + + + def drawextruder0temp(self, dc, gc): + self.drawtemperature(dc, gc, self.extruder0temps, "Ex0",1, 0,155,255, 128) + + def drawextruder0targettemp(self, dc, gc): + self.drawtemperature(dc, gc, self.extruder0targettemps, "Ex0 Target",2, 0,5,255, 128) + + + def drawextruder1temp(self, dc, gc): + self.drawtemperature(dc, gc, self.extruder1temps, "Ex1",3, 55,55,0, 128) + + def drawextruder1targettemp(self, dc, gc): + self.drawtemperature(dc, gc, self.extruder1targettemps, "Ex1 Target",2, 55,55,0, 128) + + + def SetBedTemperature(self, value): + self.bedtemps.pop() + self.bedtemps.append(value) + + def AddBedTemperature(self, value): + self.bedtemps.append(value) + if (len(self.bedtemps)-1) * float(self.width)/self.xsteps > self.width: + self.bedtemps.pop(0) + + + def SetBedTargetTemperature(self, value): + self.bedtargettemps.pop() + self.bedtargettemps.append(value) + + def AddBedTargetTemperature(self, value): + self.bedtargettemps.append(value) + if (len(self.bedtargettemps)-1) * float(self.width)/self.xsteps > self.width: + self.bedtargettemps.pop(0) + + + def SetExtruder0Temperature(self, value): + self.extruder0temps.pop() + self.extruder0temps.append(value) + + def AddExtruder0Temperature(self, value): + self.extruder0temps.append(value) + if (len(self.extruder0temps)-1) * float(self.width)/self.xsteps > self.width: + self.extruder0temps.pop(0) + + + def SetExtruder0TargetTemperature(self, value): + self.extruder0targettemps.pop() + self.extruder0targettemps.append(value) + + def AddExtruder0TargetTemperature(self, value): + self.extruder0targettemps.append(value) + if (len(self.extruder0targettemps)-1) * float(self.width)/self.xsteps > self.width: + self.extruder0targettemps.pop(0) + + + def SetExtruder1Temperature(self, value): + self.extruder1temps.pop() + self.extruder1temps.append(value) + + def AddExtruder1Temperature(self, value): + self.extruder1temps.append(value) + if (len(self.extruder1temps)-1) * float(self.width)/self.xsteps > self.width: + self.extruder1temps.pop(0) + + + def SetExtruder1TargetTemperature(self, value): + self.extruder1targettemps.pop() + self.extruder1targettemps.append(value) + + def AddExtruder1TargetTemperature(self, value): + self.extruder1targettemps.append(value) + if (len(self.extruder1targettemps)-1) * float(self.width)/self.xsteps > self.width: + self.extruder1targettemps.pop(0) + + + def StartPlotting(self, time): + self.Refresh() + self.timer.Start(time) + + def StopPlotting(self): + self.timer.Stop() + self.Refresh() + + def draw(self, dc, w, h): + dc.Clear() + gc = wx.GraphicsContext.Create(dc) + self.width = w + self.height = h + self.drawgrid(dc, gc) + self.drawbedtargettemp(dc, gc) + self.drawbedtemp(dc, gc) + self.drawextruder0targettemp(dc, gc) + self.drawextruder0temp(dc, gc) + self.drawextruder1targettemp(dc, gc) + self.drawextruder1temp(dc, gc) + + diff --git a/gviz.py b/gviz.py index e2bd119..e919b71 100755 --- a/gviz.py +++ b/gviz.py @@ -47,13 +47,21 @@ class window(wx.Frame): else: event.Skip() + def key(self, event): x=event.GetKeyCode() + if event.ShiftDown(): + cx,cy=self.p.translate + if x==wx.WXK_UP: + self.p.zoom(cx,cy,1.2) + if x==wx.WXK_DOWN: + self.p.zoom(cx,cy,1/1.2) + else: + if x==wx.WXK_UP: + self.p.layerup() + if x==wx.WXK_DOWN: + self.p.layerdown() #print x - if x==wx.WXK_UP: - self.p.layerup() - if x==wx.WXK_DOWN: - self.p.layerdown() #print p.lines.keys() def zoom(self, event): diff --git a/locale/de/LC_MESSAGES/pronterface.mo b/locale/de/LC_MESSAGES/pronterface.mo index a1a42cd..8caed27 100644 Binary files a/locale/de/LC_MESSAGES/pronterface.mo and b/locale/de/LC_MESSAGES/pronterface.mo differ diff --git a/locale/de/LC_MESSAGES/pronterface.po b/locale/de/LC_MESSAGES/pronterface.po index e6c864d..6dc248b 100644 --- a/locale/de/LC_MESSAGES/pronterface.po +++ b/locale/de/LC_MESSAGES/pronterface.po @@ -5,77 +5,21 @@ msgid "" msgstr "" "Project-Id-Version: Pronterface jm1\n" -"POT-Creation-Date: 2012-01-19 09:21+CET\n" +"POT-Creation-Date: 2012-02-26 02:12+CET\n" "PO-Revision-Date: 2012-01-23 10:01+0100\n" "Last-Translator: Christian Metzen \n" "Language-Team: DE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "Generated-By: pygettext.py 1.5\n" -#: pronsole.py:250 -msgid "Communications Speed (default: 115200)" -msgstr "Kommunikationsgeschwindigkeit (Vorgabe: 115200)" - -#: pronsole.py:251 -msgid "Heated Build Platform temp for ABS (default: 110 deg C)" -msgstr "Heizbett Temp. für ABS (Vorgabe: 110 Grad Celsius)" - -#: pronsole.py:252 -msgid "Heated Build Platform temp for PLA (default: 60 deg C)" -msgstr "Heizbett Temp. für PLA (Vorgabe: 60 Grad Celsius)" - -#: pronsole.py:253 -msgid "Feedrate for Control Panel Moves in Extrusions (default: 300mm/min)" -msgstr "Vorschub Control Panel Bewegungen Extrudierung (Vorgabe: 300mm/min)" - -#: pronsole.py:254 -msgid "Port used to communicate with printer" -msgstr "Port für Druckerkommunikation" - -#: pronsole.py:255 -msgid "" -"Slice command\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py $s)" -msgstr "" -"Kommando Slicing\n" -" Vorgabe:\n" -" python skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py $s)" - -#: pronsole.py:256 -msgid "" -"Slice settings command\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge.py" -msgstr "" -"Kommando Slicing Einstellungen\n" -" Vorgabe:\n" -" python skeinforge/skeinforge_application/skeinforge.py" - -#: pronsole.py:257 -msgid "Extruder temp for ABS (default: 230 deg C)" -msgstr "Extruder Temperatur für ABS (Vorgabe: 230 Grad Celsius)" - -#: pronsole.py:258 -msgid "Extruder temp for PLA (default: 185 deg C)" -msgstr "Extruder Temperatur für PLA (Vorgabe: 185 Grad Celsius)" - -#: pronsole.py:259 -msgid "Feedrate for Control Panel Moves in X and Y (default: 3000mm/min)" -msgstr "Vorschub Control Panel Bewegungen X und Y (Vorgabe: 3000mm/min)" - -#: pronsole.py:260 -msgid "Feedrate for Control Panel Moves in Z (default: 200mm/min)" -msgstr "Vorschub Control Panel Bewegungen Z (Vorgabe: 200mm/min)" - -#: pronterface.py:15 +#: pronterface.py:30 msgid "WX is not installed. This program requires WX to run." msgstr "WX ist nicht installiert. Dieses Programm erfordert WX zum Starten." -#: pronterface.py:66 +#: pronterface.py:81 msgid "" "Dimensions of Build Platform\n" " & optional offset of origin\n" @@ -93,55 +37,55 @@ msgstr "" " XXX,YYY,ZZZ\n" " XXXxYYYxZZZ+OffX+OffY+OffZ" -#: pronterface.py:67 +#: pronterface.py:82 msgid "Last Set Temperature for the Heated Print Bed" msgstr "Letzte gesetzte Temperatur für das Heizbett" -#: pronterface.py:68 +#: pronterface.py:83 msgid "Folder of last opened file" msgstr "Verzeichniss der zuletzt geöffneten Datei" -#: pronterface.py:69 +#: pronterface.py:84 msgid "Last Temperature of the Hot End" msgstr "Letzte Hotend Temperatur" -#: pronterface.py:70 +#: pronterface.py:85 msgid "Width of Extrusion in Preview (default: 0.5)" msgstr "Vorschaubreite der Extrudierung (Vorgabe: 0.5)" -#: pronterface.py:71 +#: pronterface.py:86 msgid "Fine Grid Spacing (default: 10)" msgstr "Feiner Rasterabstand (Vorgabe: 10)" -#: pronterface.py:72 +#: pronterface.py:87 msgid "Coarse Grid Spacing (default: 50)" msgstr "Grober Rasterabstand (Vorgabe: 50)" -#: pronterface.py:73 +#: pronterface.py:88 msgid "Pronterface background color (default: #FFFFFF)" msgstr "Pronterface Hintergrundfarbe (Vorgabe: #FFFFFF)" -#: pronterface.py:76 +#: pronterface.py:91 msgid "Printer Interface" msgstr "Printer Interface" -#: pronterface.py:93 +#: pronterface.py:108 msgid "Motors off" msgstr "Motoren aus" -#: pronterface.py:94 +#: pronterface.py:109 msgid "Check temp" msgstr "Temperatur prüfen" -#: pronterface.py:95 +#: pronterface.py:110 msgid "Extrude" msgstr "Extrudieren" -#: pronterface.py:96 +#: pronterface.py:111 msgid "Reverse" msgstr "Rückwärts" -#: pronterface.py:114 +#: pronterface.py:129 msgid "" "# I moved all your custom buttons into .pronsolerc.\n" "# Please don't add them here any more.\n" @@ -151,552 +95,560 @@ msgstr "" "# Bitte fügen Sie sie hier nicht mehr ein.\n" "# Backup Ihrer alten Buttons befindet sich in custombtn.old\n" -#: pronterface.py:119 -msgid "Note!!! You have specified custom buttons in both custombtn.txt and .pronsolerc" -msgstr "Achtung! Sie haben benutzerdefinierte Buttons in custombtn.txt und .pronsolerc angegeben" +#: pronterface.py:134 +msgid "" +"Note!!! You have specified custom buttons in both custombtn.txt and ." +"pronsolerc" +msgstr "" +"Achtung! Sie haben benutzerdefinierte Buttons in custombtn.txt und ." +"pronsolerc angegeben" -#: pronterface.py:120 -msgid "Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" -msgstr "Ignoriere custombtn.txt. Alle aktuellen Buttons entfernen um wieder zu custombtn.txt zurückzukehren" +#: pronterface.py:135 +msgid "" +"Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" +msgstr "" +"Ignoriere custombtn.txt. Alle aktuellen Buttons entfernen um wieder zu " +"custombtn.txt zurückzukehren" -#: pronterface.py:148 -#: pronterface.py:499 -#: pronterface.py:1319 -#: pronterface.py:1373 -#: pronterface.py:1495 -#: pronterface.py:1529 -#: pronterface.py:1544 +#: pronterface.py:163 pronterface.py:514 pronterface.py:1333 +#: pronterface.py:1387 pronterface.py:1509 pronterface.py:1543 +#: pronterface.py:1558 msgid "Print" msgstr "Drucken" -#: pronterface.py:152 +#: pronterface.py:167 msgid "Printer is now online." msgstr "Drucker ist jetzt Online." -#: pronterface.py:212 -msgid "Setting hotend temperature to " -msgstr "Setze Hotend Temperatur auf " +#: pronterface.py:168 +msgid "Disconnect" +msgstr "Trennen" -#: pronterface.py:212 -#: pronterface.py:248 -msgid " degrees Celsius." -msgstr " Grad Celsius." +#: pronterface.py:227 +msgid "Setting hotend temperature to %f degrees Celsius." +msgstr "Setze Hotend Temperatur auf %f Grad Celsius." -#: pronterface.py:231 -#: pronterface.py:267 -#: pronterface.py:325 +#: pronterface.py:246 pronterface.py:282 pronterface.py:340 msgid "Printer is not online." msgstr "Drucker ist nicht online." -#: pronterface.py:233 -msgid "You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0." -msgstr "Sie können keine negativen Temperaturen einstellen. Um das Hotend ganz auszuschalten, Temperatur auf 0 setzen." - #: pronterface.py:248 -msgid "Setting bed temperature to " -msgstr "Setze Heizbett Temperatur auf" +msgid "" +"You cannot set negative temperatures. To turn the hotend off entirely, set " +"its temperature to 0." +msgstr "" +"Sie können keine negativen Temperaturen einstellen. Um das Hotend ganz " +"auszuschalten, Temperatur auf 0 setzen." -#: pronterface.py:269 -msgid "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0." -msgstr "Sie können keine negativen Temperaturen einstellen. Um das Heizbett ganz auszuschalten, Temperatur auf 0 setzen." +#: pronterface.py:250 +msgid "You must enter a temperature. (%s)" +msgstr "Sie müssen eine Temperatur eingeben. (%s)" -#: pronterface.py:271 +#: pronterface.py:263 +msgid "Setting bed temperature to %f degrees Celsius." +msgstr "Setze Heizbett Temperatur auf %f Grad Celsius." + +#: pronterface.py:284 +msgid "" +"You cannot set negative temperatures. To turn the bed off entirely, set its " +"temperature to 0." +msgstr "" +"Sie können keine negativen Temperaturen einstellen. Um das Heizbett ganz " +"auszuschalten, Temperatur auf 0 setzen." + +#: pronterface.py:286 msgid "You must enter a temperature." msgstr "Sie müssen eine Temperatur eingeben." -#: pronterface.py:286 +#: pronterface.py:301 msgid "Do you want to erase the macro?" msgstr "Möchten Sie das Makro löschen?" -#: pronterface.py:290 +#: pronterface.py:305 msgid "Cancelled." msgstr "Abgebrochen." -#: pronterface.py:331 +#: pronterface.py:346 msgid " Opens file" msgstr " Öffnet eine Datei" -#: pronterface.py:331 +#: pronterface.py:346 msgid "&Open..." msgstr "&Öffnen..." -#: pronterface.py:332 +#: pronterface.py:347 msgid " Edit open file" msgstr " Offene Datei bearbeiten" -#: pronterface.py:332 +#: pronterface.py:347 msgid "&Edit..." msgstr "&Bearbeiten..." -#: pronterface.py:333 +#: pronterface.py:348 msgid " Clear output console" msgstr " Ausgabe Konsole leeren" -#: pronterface.py:333 +#: pronterface.py:348 msgid "Clear console" msgstr "Konsole leeren" -#: pronterface.py:334 +#: pronterface.py:349 msgid " Project slices" msgstr " Projekt Slices" -#: pronterface.py:334 +#: pronterface.py:349 msgid "Projector" msgstr "Projektor" -#: pronterface.py:335 +#: pronterface.py:350 msgid " Closes the Window" msgstr " Schliesst das Fenster" -#: pronterface.py:335 +#: pronterface.py:350 msgid "E&xit" msgstr "&Verlassen" -#: pronterface.py:336 +#: pronterface.py:351 msgid "&File" msgstr "&Datei" -#: pronterface.py:341 +#: pronterface.py:356 msgid "&Macros" msgstr "&Makros" -#: pronterface.py:342 +#: pronterface.py:357 msgid "<&New...>" msgstr "<&Neu...>" -#: pronterface.py:343 +#: pronterface.py:358 msgid " Options dialog" msgstr " Optionen Dialog" -#: pronterface.py:343 +#: pronterface.py:358 msgid "&Options" msgstr "&Optionen" -#: pronterface.py:345 +#: pronterface.py:360 msgid " Adjust slicing settings" msgstr " Slicing Einstellungen anpassen" -#: pronterface.py:345 +#: pronterface.py:360 msgid "Slicing Settings" msgstr "Slicing Einstellungen" -#: pronterface.py:352 +#: pronterface.py:367 msgid "&Settings" msgstr "&Einstellungen" -#: pronterface.py:368 +#: pronterface.py:383 msgid "Enter macro name" msgstr "Makro Name eingeben" -#: pronterface.py:371 +#: pronterface.py:386 msgid "Macro name:" msgstr "Makro Name:" -#: pronterface.py:374 +#: pronterface.py:389 msgid "Ok" msgstr "Ok" -#: pronterface.py:378 -#: pronterface.py:1330 -#: pronterface.py:1587 +#: pronterface.py:393 pronterface.py:1344 pronterface.py:1601 msgid "Cancel" msgstr "Abbrechen" -#: pronterface.py:396 -msgid "' is being used by built-in command" -msgstr "' wird durch eingebautes Kommando genutzt" +#: pronterface.py:411 +msgid "Name '%s' is being used by built-in command" +msgstr "Name '%s' wird durch eingebautes Kommando genutzt" -#: pronterface.py:396 -msgid "Name '" -msgstr "Name '" - -#: pronterface.py:399 +#: pronterface.py:414 msgid "Macro name may contain only alphanumeric symbols and underscores" msgstr "Makro Name darf nur alphanumerische Zeichen und Unterstriche enthalten" -#: pronterface.py:448 +#: pronterface.py:463 msgid "Port" msgstr "Port:" -#: pronterface.py:467 +#: pronterface.py:482 msgid "Connect" msgstr "Verbinden" -#: pronterface.py:469 +#: pronterface.py:484 msgid "Connect to the printer" msgstr "Drucker Verbinden" -#: pronterface.py:471 +#: pronterface.py:486 msgid "Reset" msgstr "Zurücksetzen" -#: pronterface.py:474 -#: pronterface.py:751 +#: pronterface.py:489 pronterface.py:766 msgid "Mini mode" msgstr "Mini-Modus" -#: pronterface.py:478 +#: pronterface.py:493 msgid "Monitor Printer" msgstr "Drucker überwachen" -#: pronterface.py:488 +#: pronterface.py:503 msgid "Load file" msgstr "Datei laden" -#: pronterface.py:491 +#: pronterface.py:506 msgid "Compose" msgstr "Zusammenstellen" -#: pronterface.py:495 +#: pronterface.py:510 msgid "SD" msgstr "SD" -#: pronterface.py:503 -#: pronterface.py:1374 -#: pronterface.py:1419 -#: pronterface.py:1469 -#: pronterface.py:1494 -#: pronterface.py:1528 -#: pronterface.py:1543 +#: pronterface.py:518 pronterface.py:1388 pronterface.py:1433 +#: pronterface.py:1483 pronterface.py:1508 pronterface.py:1542 +#: pronterface.py:1557 msgid "Pause" msgstr "Pause" -#: pronterface.py:516 +#: pronterface.py:531 msgid "Send" msgstr "Senden" -#: pronterface.py:524 -#: pronterface.py:625 +#: pronterface.py:539 pronterface.py:640 msgid "mm/min" msgstr "mm/min" -#: pronterface.py:526 +#: pronterface.py:541 msgid "XY:" msgstr "XY:" -#: pronterface.py:528 +#: pronterface.py:543 msgid "Z:" msgstr "Z:" -#: pronterface.py:551 -#: pronterface.py:632 +#: pronterface.py:566 pronterface.py:647 msgid "Heater:" msgstr "Heizelement:" -#: pronterface.py:554 -#: pronterface.py:574 +#: pronterface.py:569 pronterface.py:589 msgid "Off" msgstr "Aus" -#: pronterface.py:566 -#: pronterface.py:586 +#: pronterface.py:581 pronterface.py:601 msgid "Set" msgstr "Ein" -#: pronterface.py:571 -#: pronterface.py:634 +#: pronterface.py:586 pronterface.py:649 msgid "Bed:" msgstr "Heizbett:" -#: pronterface.py:619 +#: pronterface.py:634 msgid "mm" msgstr "mm" -#: pronterface.py:677 -#: pronterface.py:1182 -#: pronterface.py:1413 +#: pronterface.py:692 pronterface.py:1196 pronterface.py:1427 msgid "Not connected to printer." msgstr "Keine Verbindung zum Drucker." -#: pronterface.py:706 +#: pronterface.py:721 msgid "SD Upload" msgstr "SD Laden" -#: pronterface.py:710 +#: pronterface.py:725 msgid "SD Print" msgstr "SD Drucken" -#: pronterface.py:758 +#: pronterface.py:773 msgid "Full mode" msgstr "Voll-Modus" -#: pronterface.py:783 +#: pronterface.py:798 msgid "Execute command: " msgstr "Kommando ausführen:" -#: pronterface.py:794 +#: pronterface.py:809 msgid "click to add new custom button" msgstr "Individuellen Button hinzufügen" -#: pronterface.py:813 -msgid "Defines custom button. Usage: button \"title\" [/c \"colour\"] command" -msgstr "Definiert einen individuellen Button. Nutzung: button \"title\" [/c \"colour\"] command" +#: pronterface.py:828 +msgid "" +"Defines custom button. Usage: button \"title\" [/c \"colour\"] command" +msgstr "" +"Definiert einen individuellen Button. Nutzung: button \"title\" [/c " +"\"colour\"] command" -#: pronterface.py:835 +#: pronterface.py:850 msgid "Custom button number should be between 0 and 63" msgstr "Nummer des individuellen Button sollte zwischen 0 und 63 sein." -#: pronterface.py:927 +#: pronterface.py:942 msgid "Edit custom button '%s'" msgstr "Individuellen Button '%s' bearbeiten" -#: pronterface.py:929 +#: pronterface.py:944 msgid "Move left <<" msgstr "Links bewegen <<" -#: pronterface.py:932 +#: pronterface.py:947 msgid "Move right >>" msgstr "Rechts bewegen >>" -#: pronterface.py:936 +#: pronterface.py:951 msgid "Remove custom button '%s'" msgstr "Individuellen Button '%s' entfernen" -#: pronterface.py:939 +#: pronterface.py:954 msgid "Add custom button" msgstr "Individuellen Button hinzufuegen" -#: pronterface.py:1084 +#: pronterface.py:1099 msgid "event object missing" msgstr "Ereigniss Objekt fehlt" -#: pronterface.py:1112 +#: pronterface.py:1127 msgid "Invalid period given." msgstr "Ungültiger Abschnitt angegeben." -#: pronterface.py:1115 +#: pronterface.py:1130 msgid "Monitoring printer." msgstr "Überwache Drucker." -#: pronterface.py:1117 +#: pronterface.py:1132 msgid "Done monitoring." msgstr "Überwachung abgeschlossen." -#: pronterface.py:1139 +#: pronterface.py:1154 msgid "Printer is online. " -msgstr "Drucker ist online." +msgstr "Drucker ist online. " -#: pronterface.py:1141 -#: pronterface.py:1317 -#: pronterface.py:1372 +#: pronterface.py:1156 pronterface.py:1331 msgid "Loaded " -msgstr "Geladen" +msgstr "Geladen " -#: pronterface.py:1144 +#: pronterface.py:1159 msgid "Bed" msgstr "Heizbett" -#: pronterface.py:1144 +#: pronterface.py:1159 msgid "Hotend" msgstr "Hotend" -#: pronterface.py:1154 +#: pronterface.py:1169 msgid " SD printing:%04.2f %%" msgstr "SD Drucken:%04.2f %%" -#: pronterface.py:1157 +#: pronterface.py:1172 msgid " Printing:%04.2f %% |" msgstr " Drucken:%04.2f %% |" -#: pronterface.py:1158 -msgid " Line# " -msgstr "Zeile#" +#: pronterface.py:1173 +msgid " Line# %d of %d lines |" +msgstr " Zeile# %d von %d Zeilen |" -#: pronterface.py:1158 -msgid " lines |" -msgstr " Zeilen |" +#: pronterface.py:1178 +msgid " Est: %s of %s remaining | " +msgstr " Erw: %s von %s verbleibend | " -#: pronterface.py:1158 -msgid "of " -msgstr "von" - -#: pronterface.py:1163 -msgid " Est: " -msgstr " Erw:" - -#: pronterface.py:1164 -msgid " of: " -msgstr " von: " - -#: pronterface.py:1165 -msgid " Remaining | " -msgstr " Verbleibend | " - -#: pronterface.py:1166 +#: pronterface.py:1180 msgid " Z: %0.2f mm" msgstr " Z: %0.2f mm" -#: pronterface.py:1233 +#: pronterface.py:1247 msgid "Opening file failed." msgstr "Datei öffnen fehlgeschlagen." -#: pronterface.py:1239 +#: pronterface.py:1253 msgid "Starting print" msgstr "Starte Druck" -#: pronterface.py:1262 +#: pronterface.py:1276 msgid "Pick SD file" msgstr "Wähle SD Datei" -#: pronterface.py:1262 +#: pronterface.py:1276 msgid "Select the file to print" msgstr "Wähle Druckdatei" -#: pronterface.py:1297 +#: pronterface.py:1311 msgid "Failed to execute slicing software: " msgstr "Fehler beim Ausführen der Slicing Software:" -#: pronterface.py:1304 +#: pronterface.py:1318 msgid "Slicing..." msgstr "Slicing..." -#: pronterface.py:1317 -#: pronterface.py:1372 +#: pronterface.py:1331 msgid ", %d lines" msgstr ", %d Zeilen" -#: pronterface.py:1324 +#: pronterface.py:1338 msgid "Load File" msgstr "Datei laden" -#: pronterface.py:1331 +#: pronterface.py:1345 msgid "Slicing " msgstr "Slicing" -#: pronterface.py:1350 +#: pronterface.py:1364 msgid "Open file to print" msgstr "Öffne zu druckende Datei" -#: pronterface.py:1351 +#: pronterface.py:1365 msgid "OBJ, STL, and GCODE files (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" -msgstr "OBJ,STL und GCODE Dateien (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" +msgstr "" +"OBJ,STL und GCODE Dateien (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" -#: pronterface.py:1358 +#: pronterface.py:1372 msgid "File not found!" msgstr "Datei nicht gefunden!" -#: pronterface.py:1382 +#: pronterface.py:1386 +msgid "Loaded %s, %d lines" +msgstr "Geladen %s, %d Zeilen" + +#: pronterface.py:1396 msgid "mm of filament used in this print\n" msgstr "mm Filament in Druck genutzt\n" -#: pronterface.py:1383 +#: pronterface.py:1397 msgid "" -"mm in X\n" -"and is" +"the print goes from %f mm to %f mm in X\n" +"and is %f mm wide\n" msgstr "" -"mm in X\n" -"und ist" +"Der Druck verläuft von %f mm bis %f mm in X\n" +"und ist %f mm breit\n" -#: pronterface.py:1383 -#: pronterface.py:1384 -msgid "mm wide\n" -msgstr "mm breit\n" - -#: pronterface.py:1383 -#: pronterface.py:1384 -#: pronterface.py:1385 -msgid "mm to" -msgstr "mm bis" - -#: pronterface.py:1383 -#: pronterface.py:1384 -#: pronterface.py:1385 -msgid "the print goes from" -msgstr "Der Druck verläuft von" - -#: pronterface.py:1384 +#: pronterface.py:1398 msgid "" -"mm in Y\n" -"and is" +"the print goes from %f mm to %f mm in Y\n" +"and is %f mm wide\n" msgstr "" -"mm in Y\n" -"und ist" +"Der Druck verläuft von %f mm bis %f mm in Y\n" +"und ist %f mm breit\n" -#: pronterface.py:1385 -msgid "mm high\n" -msgstr "mm hoch\n" - -#: pronterface.py:1385 +#: pronterface.py:1399 msgid "" -"mm in Z\n" -"and is" +"the print goes from %f mm to %f mm in Z\n" +"and is %f mm high\n" msgstr "" -"mm in Z\n" -"und ist" +"Der Druck verläuft von %f mm bis %f mm in Z\n" +"und ist %f mm hoch\n" -#: pronterface.py:1386 +#: pronterface.py:1400 msgid "Estimated duration (pessimistic): " -msgstr "Geschätze Dauer (pessimistisch):" +msgstr "Geschätze Dauer (pessimistisch): " -#: pronterface.py:1410 +#: pronterface.py:1424 msgid "No file loaded. Please use load first." msgstr "Keine Datei geladen. Benutze zuerst laden." -#: pronterface.py:1421 +#: pronterface.py:1435 msgid "Restart" msgstr "Neustart" -#: pronterface.py:1425 +#: pronterface.py:1439 msgid "File upload complete" msgstr "Datei Upload komplett" -#: pronterface.py:1444 +#: pronterface.py:1458 msgid "Pick SD filename" msgstr "Wähle SD Dateiname" -#: pronterface.py:1452 +#: pronterface.py:1466 msgid "Paused." msgstr "Pausiert." -#: pronterface.py:1462 +#: pronterface.py:1476 msgid "Resume" msgstr "Fortsetzen" -#: pronterface.py:1478 +#: pronterface.py:1492 msgid "Connecting..." msgstr "Verbinde..." -#: pronterface.py:1509 +#: pronterface.py:1523 msgid "Disconnected." msgstr "Getrennt." -#: pronterface.py:1536 +#: pronterface.py:1550 msgid "Reset." msgstr "Zurücksetzen." -#: pronterface.py:1537 +#: pronterface.py:1551 msgid "Are you sure you want to reset the printer?" msgstr "Möchten Sie den Drucker wirklich zurücksetzen?" -#: pronterface.py:1537 +#: pronterface.py:1551 msgid "Reset?" msgstr "Zurücksetzen?" -#: pronterface.py:1583 +#: pronterface.py:1597 msgid "Save" msgstr "Speichern" -#: pronterface.py:1639 +#: pronterface.py:1653 msgid "Edit settings" msgstr "Einstellungen bearbeiten" -#: pronterface.py:1641 +#: pronterface.py:1655 msgid "Defaults" msgstr "Standardwerte" -#: pronterface.py:1670 +#: pronterface.py:1684 msgid "Custom button" msgstr "Individueller Button" -#: pronterface.py:1675 +#: pronterface.py:1689 msgid "Button title" msgstr "Button Titel" -#: pronterface.py:1678 +#: pronterface.py:1692 msgid "Command" msgstr "Kommando" -#: pronterface.py:1687 +#: pronterface.py:1701 msgid "Color" msgstr "Farbe" +#~ msgid "Communications Speed (default: 115200)" +#~ msgstr "Kommunikationsgeschwindigkeit (Vorgabe: 115200)" + +#~ msgid "Heated Build Platform temp for ABS (default: 110 deg C)" +#~ msgstr "Heizbett Temp. für ABS (Vorgabe: 110 Grad Celsius)" + +#~ msgid "Heated Build Platform temp for PLA (default: 60 deg C)" +#~ msgstr "Heizbett Temp. für PLA (Vorgabe: 60 Grad Celsius)" + +#~ msgid "Feedrate for Control Panel Moves in Extrusions (default: 300mm/min)" +#~ msgstr "Vorschub Control Panel Bewegungen Extrudierung (Vorgabe: 300mm/min)" + +#~ msgid "Port used to communicate with printer" +#~ msgstr "Port für Druckerkommunikation" + +#~ msgid "" +#~ "Slice command\n" +#~ " default:\n" +#~ " python skeinforge/skeinforge_application/skeinforge_utilities/" +#~ "skeinforge_craft.py $s)" +#~ msgstr "" +#~ "Kommando Slicing\n" +#~ " Vorgabe:\n" +#~ " python skeinforge/skeinforge_application/skeinforge_utilities/" +#~ "skeinforge_craft.py $s)" + +#~ msgid "" +#~ "Slice settings command\n" +#~ " default:\n" +#~ " python skeinforge/skeinforge_application/skeinforge.py" +#~ msgstr "" +#~ "Kommando Slicing Einstellungen\n" +#~ " Vorgabe:\n" +#~ " python skeinforge/skeinforge_application/skeinforge.py" + +#~ msgid "Extruder temp for ABS (default: 230 deg C)" +#~ msgstr "Extruder Temperatur für ABS (Vorgabe: 230 Grad Celsius)" + +#~ msgid "Extruder temp for PLA (default: 185 deg C)" +#~ msgstr "Extruder Temperatur für PLA (Vorgabe: 185 Grad Celsius)" + +#~ msgid "Feedrate for Control Panel Moves in X and Y (default: 3000mm/min)" +#~ msgstr "Vorschub Control Panel Bewegungen X und Y (Vorgabe: 3000mm/min)" + +#~ msgid "Feedrate for Control Panel Moves in Z (default: 200mm/min)" +#~ msgstr "Vorschub Control Panel Bewegungen Z (Vorgabe: 200mm/min)" diff --git a/locale/fr/LC_MESSAGES/fr.po b/locale/fr/LC_MESSAGES/fr.po deleted file mode 100755 index 14926e7..0000000 --- a/locale/fr/LC_MESSAGES/fr.po +++ /dev/null @@ -1,572 +0,0 @@ -# Pronterface Message Catalog Template -# Copyright (C) 2011 Jonathan Marsden -# Jonathan Marsden , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: Pronterface jm1\n" -"POT-Creation-Date: 2011-08-06 13:27+PDT\n" -"PO-Revision-Date: 2011-11-16 16:53+0100\n" -"Last-Translator: Cyril Laguilhon-Debat \n" -"Language-Team: FR \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: pronterface.py:15 -msgid "WX is not installed. This program requires WX to run." -msgstr "wxWidgets n'est pas installé. Ce programme nécessite la librairie wxWidgets pour fonctionner." - -#: pronterface.py:67 -msgid "Printer Interface" -msgstr "Interface imprimante" - -#: pronterface.py:80 -msgid "Motors off" -msgstr "Arrêter les moteurs" - -#: pronterface.py:81 -msgid "Check temp" -msgstr "Lire les températures" - -#: pronterface.py:82 -msgid "Extrude" -msgstr "Extruder" - -#: pronterface.py:83 -msgid "Reverse" -msgstr "Inverser" - -#: pronterface.py:99 -msgid "" -"# I moved all your custom buttons into .pronsolerc.\n" -"# Please don't add them here any more.\n" -"# Backup of your old buttons is in custombtn.old\n" -msgstr "" -"# I moved all your custom buttons into .pronsolerc.\n" -"# Please don't add them here any more.\n" -"# Backup of your old buttons is in custombtn.old\n" - -#: pronterface.py:104 -msgid "Note!!! You have specified custom buttons in both custombtn.txt and .pronsolerc" -msgstr "Remarque! Vous avez spécifié des boutons personnalisés dans custombtn.txt et aussi dans .pronsolerc" - -#: pronterface.py:105 -msgid "Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" -msgstr "Ignorant custombtn.txt. Retirez tous les boutons en cours pour revenir à custombtn.txt" - -#: pronterface.py:130 -#: pronterface.py:476 -#: pronterface.py:1228 -#: pronterface.py:1279 -#: pronterface.py:1396 -#: pronterface.py:1428 -#: pronterface.py:1443 -msgid "Print" -msgstr "Imprimer" - -#: pronterface.py:134 -msgid "Printer is now online." -msgstr "L'imprimante est connectée" - -#: pronterface.py:188 -msgid "Setting hotend temperature to " -msgstr "Réglage de la température de la buse à" - -#: pronterface.py:188 -#: pronterface.py:224 -msgid " degrees Celsius." -msgstr " degrés Celsius." - -#: pronterface.py:207 -#: pronterface.py:242 -msgid "Printer is not online." -msgstr "L'imprimante est déconnectée" - -#: pronterface.py:209 -msgid "You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0." -msgstr "Vous ne pouvez pas régler une température négative.Pour éteindre le chauffage de la buse, réglez sa température à 0°c." - -#: pronterface.py:224 -msgid "Setting bed temperature to " -msgstr "Réglage de la température du plateau à " - -#: pronterface.py:244 -msgid "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0." -msgstr "Vous ne pouvez pas régler une température négative. Pour désactiver votre plateau chauffant, réglez sa température à 0°c." - -#: pronterface.py:246 -msgid "You must enter a temperature." -msgstr "Vous devez saisir une température." - -#: pronterface.py:261 -msgid "Do you want to erase the macro?" -msgstr "Voulez-vous effacer la macro ?" - -#: pronterface.py:265 -msgid "Cancelled." -msgstr "Annulé" - -#: pronterface.py:295 -msgid " Opens file" -msgstr " Ouvrir un fichier" - -#: pronterface.py:295 -msgid "&Open..." -msgstr "&Ouvrir..." - -#: pronterface.py:296 -msgid " Edit open file" -msgstr " Éditer le fichier ouvert" - -#: pronterface.py:296 -msgid "&Edit..." -msgstr "&Éditer..." - -#: pronterface.py:297 -msgid " Clear output console" -msgstr "Effacer le contenu de la console de sortie" - -#: pronterface.py:297 -msgid "Clear console" -msgstr "Effacer la console" - -#: pronterface.py:298 -msgid " Closes the Window" -msgstr " Quitter le programme" - -#: pronterface.py:298 -msgid "E&xit" -msgstr "&Quitter" - -#: pronterface.py:299 -msgid "&File" -msgstr "&Fichier" - -#: pronterface.py:304 -msgid "&Macros" -msgstr "&Macros" - -#: pronterface.py:305 -msgid "<&New...>" -msgstr "<&Nouvelle...>" - -#: pronterface.py:306 -msgid " Options dialog" -msgstr " Fenêtre des options" - -#: pronterface.py:306 -msgid "&Options" -msgstr "&Options" - -#: pronterface.py:308 -msgid " Adjust SFACT settings" -msgstr " Régler les paramètres SFACT" - -#: pronterface.py:308 -msgid "SFACT Settings" -msgstr "Paramètres &SFACT..." - -#: pronterface.py:311 -msgid " Quickly adjust SFACT settings for active profile" -msgstr " Réglages rapides des paramètres SFACT pour le profil actif." - -#: pronterface.py:311 -msgid "SFACT Quick Settings" -msgstr "Réglages rapides SFACT" - -#: pronterface.py:315 -msgid "&Settings" -msgstr "&Paramètres" - -#: pronterface.py:331 -msgid "Enter macro name" -msgstr "Saisissez le nom de la macro" - -#: pronterface.py:334 -msgid "Macro name:" -msgstr "Nom :" - -#: pronterface.py:337 -msgid "Ok" -msgstr "Valider" - -#: pronterface.py:341 -#: pronterface.py:1465 -msgid "Cancel" -msgstr "Annuler" - -#: pronterface.py:359 -msgid "' is being used by built-in command" -msgstr "' est utilisé par des commandes internes." - -#: pronterface.py:359 -msgid "Name '" -msgstr "Le nom '" - -#: pronterface.py:362 -msgid "Macro name may contain only alphanumeric symbols and underscores" -msgstr "Un nom de macro ne peut contenir que des caractères alphanumérique et des underscore (_)" - -#: pronterface.py:411 -msgid "Port" -msgstr "Port :" - -#: pronterface.py:430 -msgid "Connect" -msgstr "Connecter" - -#: pronterface.py:432 -msgid "Connect to the printer" -msgstr "Connecter l'imprimante" - -#: pronterface.py:434 -msgid "Disconnect" -msgstr "Déconnecter" - -#: pronterface.py:438 -msgid "Reset" -msgstr "Réinitialiser" - -#: pronterface.py:441 -#: pronterface.py:687 -msgid "Mini mode" -msgstr "Mode réduit" - -#: pronterface.py:455 -msgid "" -"Monitor\n" -"printer" -msgstr "" -"Surveiller\n" -"l'imprimante" - -#: pronterface.py:465 -msgid "Load file" -msgstr "Charger un fichier" - -#: pronterface.py:468 -msgid "SD Upload" -msgstr "Copier sur SD" - -#: pronterface.py:472 -msgid "SD Print" -msgstr "Imprimer depuis SD" - -#: pronterface.py:480 -#: pronterface.py:1280 -#: pronterface.py:1321 -#: pronterface.py:1370 -#: pronterface.py:1395 -#: pronterface.py:1427 -#: pronterface.py:1442 -msgid "Pause" -msgstr "Pause" - -#: pronterface.py:494 -msgid "Send" -msgstr "Envoyer" - -#: pronterface.py:502 -#: pronterface.py:603 -msgid "mm/min" -msgstr "mm/min" - -#: pronterface.py:504 -msgid "XY:" -msgstr "XY:" - -#: pronterface.py:506 -msgid "Z:" -msgstr "Z:" - -#: pronterface.py:529 -msgid "Heater:" -msgstr "Buse :" - -#: pronterface.py:532 -#: pronterface.py:552 -msgid "Off" -msgstr "Off" - -#: pronterface.py:544 -#: pronterface.py:564 -msgid "Set" -msgstr "Régler" - -#: pronterface.py:549 -msgid "Bed:" -msgstr "Plateau :" - -#: pronterface.py:597 -msgid "mm" -msgstr "mm" - -#: pronterface.py:636 -#: pronterface.py:1099 -#: pronterface.py:1315 -msgid "Not connected to printer." -msgstr "Imprimante non connectée" - -#: pronterface.py:694 -msgid "Full mode" -msgstr "Mode complet" - -#: pronterface.py:719 -msgid "Execute command: " -msgstr "Exécuter la commande :" - -#: pronterface.py:730 -msgid "click to add new custom button" -msgstr "Ajouter un bouton personnalisé" - -#: pronterface.py:751 -msgid "Defines custom button. Usage: button \"title\" [/c \"colour\"] command" -msgstr "Définit des boutons personnalidés. Utilisation : \"Libelle\" [/c \"couleur\"] commande" - -#: pronterface.py:773 -msgid "Custom button number should be between 0 and 63" -msgstr "Les numéros des boutons personnalisés doivent être compris entre 0 et 63." - -#: pronterface.py:865 -msgid "Edit custom button '%s'" -msgstr "Editer le bouton personnalisé n°'%s'" - -#: pronterface.py:867 -msgid "Move left <<" -msgstr "Déplacer vers la gauche <<" - -#: pronterface.py:870 -msgid "Move right >>" -msgstr "Déplacer vers la droite >>" - -#: pronterface.py:874 -msgid "Remove custom button '%s'" -msgstr "Supprimer le bouton personnalisé n°'%s'" - -#: pronterface.py:877 -msgid "Add custom button" -msgstr "Ajouter un bouton personnalisé" - -#: pronterface.py:1022 -msgid "event object missing" -msgstr "evennement d'objet manquant" - -#: pronterface.py:1050 -msgid "Invalid period given." -msgstr "La période donnée est invalide" - -#: pronterface.py:1053 -msgid "Monitoring printer." -msgstr "Surveillance de l'imprimante" - -#: pronterface.py:1055 -msgid "Done monitoring." -msgstr "Surveillance de l'imprimante effectuée." - -#: pronterface.py:1077 -msgid "Printer is online. " -msgstr "L'imprimante est connectée" - -#: pronterface.py:1079 -#: pronterface.py:1226 -#: pronterface.py:1278 -msgid "Loaded " -msgstr "Chargé " - -#: pronterface.py:1082 -msgid "Bed" -msgstr "Plateau" - -#: pronterface.py:1082 -msgid "Hotend" -msgstr "Buse" - -#: pronterface.py:1089 -msgid " SD printing:%04.2f %%" -msgstr "Impression SD : %04.2f %%" - -#: pronterface.py:1091 -msgid " Printing:%04.2f %%" -msgstr "Impression : %04.2f %%" - -#: pronterface.py:1149 -msgid "Opening file failed." -msgstr "L'ouverture du fichier a échoué" - -#: pronterface.py:1155 -msgid "Starting print" -msgstr "Début de l'impression..." - -#: pronterface.py:1178 -msgid "Pick SD file" -msgstr "Choisir un fichier sur la carte SD" - -#: pronterface.py:1178 -msgid "Select the file to print" -msgstr "Sélectionnez le fichier à imprimer :" - -#: pronterface.py:1206 -msgid "Skeinforge execution failed." -msgstr "Exécution de Skeinforge échoué" - -#: pronterface.py:1213 -msgid "Skeining..." -msgstr "Skeining..." - -#: pronterface.py:1226 -#: pronterface.py:1278 -msgid ", %d lines" -msgstr ", %d lignes" - -#: pronterface.py:1235 -msgid "Skeining " -msgstr "Skeining " - -#: pronterface.py:1237 -msgid "" -"Skeinforge not found. \n" -"Please copy Skeinforge into a directory named \"skeinforge\" in the same directory as this file." -msgstr "" -"Skeinforge non trouvé. \n" -"Veuillez copier Skeinforge dans un répertoire nommé \"skeinforge\" placé dans le repertoire du programme." - -#: pronterface.py:1256 -msgid "Open file to print" -msgstr "Ouvrir un fichier à imprimer" - -#: pronterface.py:1257 -msgid "OBJ, STL, and GCODE files (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" -msgstr "Fichiers OBJ, STL et GCODE (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" - -#: pronterface.py:1264 -msgid "File not found!" -msgstr "Fichier non trouvé" - -#: pronterface.py:1288 -msgid "mm of filament used in this print\n" -msgstr "mm de filament utilisés pour cette impression\n" - -#: pronterface.py:1289 -msgid "" -"mm in X\n" -"and is" -msgstr "" -"mm en X\n" -"et mesure" - -#: pronterface.py:1289 -#: pronterface.py:1290 -msgid "mm wide\n" -msgstr "mm de large\n" - -#: pronterface.py:1289 -#: pronterface.py:1290 -#: pronterface.py:1291 -msgid "mm to" -msgstr "mm à" - -#: pronterface.py:1289 -#: pronterface.py:1290 -#: pronterface.py:1291 -msgid "the print goes from" -msgstr "L'impression va de" - -#: pronterface.py:1290 -msgid "" -"mm in Y\n" -"and is" -msgstr "" -"mm en Y\n" -"et mesure" - -#: pronterface.py:1291 -msgid "mm high\n" -msgstr "mm de haut\n" - -#: pronterface.py:1291 -msgid "" -"mm in Z\n" -"and is" -msgstr "" -"mm en Z\n" -"et mesure" - -#: pronterface.py:1292 -msgid "Estimated duration (pessimistic): " -msgstr "Durée estimée (pessimiste)" - -#: pronterface.py:1312 -msgid "No file loaded. Please use load first." -msgstr "Aucun fichier chargé. Veuillez charger un fichier avant." - -#: pronterface.py:1323 -msgid "Restart" -msgstr "Recommencer" - -#: pronterface.py:1327 -msgid "File upload complete" -msgstr "Envoi du fichier terminé" - -#: pronterface.py:1346 -msgid "Pick SD filename" -msgstr "Lister les fichiers sur la carte SD" - -#: pronterface.py:1353 -msgid "Paused." -msgstr "En pause" - -#: pronterface.py:1363 -msgid "Resume" -msgstr "Reprendre" - -#: pronterface.py:1379 -msgid "Connecting..." -msgstr "Connection en cours..." - -#: pronterface.py:1410 -msgid "Disconnected." -msgstr "Déconnecté" - -#: pronterface.py:1435 -msgid "Reset." -msgstr "Réinitialiser" - -#: pronterface.py:1436 -msgid "Are you sure you want to reset the printer?" -msgstr "Etes-vous sûr de vouloir réinitialiser l'imprimante?" - -#: pronterface.py:1436 -msgid "Reset?" -msgstr "Réinitialiser ?" - -#: pronterface.py:1461 -msgid "Save" -msgstr "Enregistrer" - -#: pronterface.py:1519 -msgid "Edit settings" -msgstr "Modifier les paramètres" - -#: pronterface.py:1521 -msgid "Defaults" -msgstr "Paramètres par défaut" - -#: pronterface.py:1543 -msgid "Custom button" -msgstr "Commande personnalisée" - -#: pronterface.py:1551 -msgid "Button title" -msgstr "Titre du bouton" - -#: pronterface.py:1554 -msgid "Command" -msgstr "Commande" - -#: pronterface.py:1563 -msgid "Color" -msgstr "Couleur" - diff --git a/locale/fr/LC_MESSAGES/plater.mo b/locale/fr/LC_MESSAGES/plater.mo new file mode 100644 index 0000000..d3690d4 Binary files /dev/null and b/locale/fr/LC_MESSAGES/plater.mo differ diff --git a/locale/fr/LC_MESSAGES/plater.po b/locale/fr/LC_MESSAGES/plater.po new file mode 100644 index 0000000..9113445 --- /dev/null +++ b/locale/fr/LC_MESSAGES/plater.po @@ -0,0 +1,95 @@ +# French Plater Message Catalog +# Copyright (C) 2012 Guillaume Seguin +# Guillaume Seguin , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: Plater\n" +"POT-Creation-Date: 2012-02-26 02:40+CET\n" +"PO-Revision-Date: 2012-02-26 02:41+0100\n" +"Last-Translator: Guillaume Seguin \n" +"Language-Team: FR \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: plater.py:247 +msgid "Plate building tool" +msgstr "Outil d'assemblage de plateau" + +#: plater.py:253 +msgid "Clear" +msgstr "Vider" + +#: plater.py:254 +msgid "Load" +msgstr "Charger" + +#: plater.py:256 +msgid "Export" +msgstr "Exporter" + +#: plater.py:259 +msgid "Done" +msgstr "Terminé" + +#: plater.py:261 +msgid "Cancel" +msgstr "Annuler" + +#: plater.py:263 +msgid "Snap to Z = 0" +msgstr "Poser en Z = 0" + +#: plater.py:264 +msgid "Put at 100, 100" +msgstr "Placer en 100, 100" + +#: plater.py:265 +msgid "Delete" +msgstr "Supprimer" + +#: plater.py:266 +msgid "Auto" +msgstr "Auto" + +#: plater.py:290 +msgid "Autoplating" +msgstr "Placement auto" + +#: plater.py:318 +msgid "Bed full, sorry sir :(" +msgstr "Le lit est plein, désolé :(" + +#: plater.py:328 +msgid "" +"Are you sure you want to clear the grid? All unsaved changes will be lost." +msgstr "" +"Êtes vous sur de vouloir vider la grille ? Toutes les modifications non " +"enregistrées seront perdues." + +#: plater.py:328 +msgid "Clear the grid?" +msgstr "Vider la grille ?" + +#: plater.py:370 +msgid "Pick file to save to" +msgstr "Choisir le fichier dans lequel enregistrer" + +#: plater.py:371 +msgid "STL files (;*.stl;*.STL;)" +msgstr "Fichiers STL (;*.stl;*.STL;)" + +#: plater.py:391 +msgid "wrote %s" +msgstr "%s écrit" + +#: plater.py:394 +msgid "Pick file to load" +msgstr "Choisir le fichier à charger" + +#: plater.py:395 +msgid "STL files (;*.stl;*.STL;)|*.stl|OpenSCAD files (;*.scad;)|*.scad" +msgstr "Fichiers STL (;*.stl;*.STL;)|*.stl|Fichiers OpenSCAD (;*.scad;)|*.scad" diff --git a/locale/fr/LC_MESSAGES/pronterface.mo b/locale/fr/LC_MESSAGES/pronterface.mo index ffc7689..27908bd 100644 Binary files a/locale/fr/LC_MESSAGES/pronterface.mo and b/locale/fr/LC_MESSAGES/pronterface.mo differ diff --git a/locale/fr/LC_MESSAGES/pronterface.po b/locale/fr/LC_MESSAGES/pronterface.po new file mode 100644 index 0000000..cccef81 --- /dev/null +++ b/locale/fr/LC_MESSAGES/pronterface.po @@ -0,0 +1,609 @@ +# Pronterface Message Catalog Template +# Copyright (C) 2011 Jonathan Marsden +# Jonathan Marsden , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: Pronterface jm1\n" +"POT-Creation-Date: 2012-03-16 03:48+CET\n" +"PO-Revision-Date: 2012-03-16 03:50+0100\n" +"Last-Translator: Guillaume Seguin \n" +"Language-Team: FR \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: pronterface.py:30 +msgid "WX is not installed. This program requires WX to run." +msgstr "" +"wxWidgets n'est pas installé. Ce programme nécessite la librairie wxWidgets " +"pour fonctionner." + +#: pronterface.py:81 +msgid "" +"Dimensions of Build Platform\n" +" & optional offset of origin\n" +"\n" +"Examples:\n" +" XXXxYYY\n" +" XXX,YYY,ZZZ\n" +" XXXxYYYxZZZ+OffX+OffY+OffZ" +msgstr "" + +#: pronterface.py:82 +msgid "Last Set Temperature for the Heated Print Bed" +msgstr "Dernière température du plateau chauffant définie" + +#: pronterface.py:83 +msgid "Folder of last opened file" +msgstr "Dossier du dernier fichier ouvert" + +#: pronterface.py:84 +msgid "Last Temperature of the Hot End" +msgstr "Dernière température de la buse définie" + +#: pronterface.py:85 +msgid "Width of Extrusion in Preview (default: 0.5)" +msgstr "Largeur de l'extrusion dans la prévisualisation (défaut : 0.5)" + +#: pronterface.py:86 +msgid "Fine Grid Spacing (default: 10)" +msgstr "Espacement fin de la grille (défaut : 10)" + +#: pronterface.py:87 +msgid "Coarse Grid Spacing (default: 50)" +msgstr "Espacement large de la grille (défaut : 50)" + +#: pronterface.py:88 +msgid "Pronterface background color (default: #FFFFFF)" +msgstr "Couleur de fond de la Pronterface (défaut : #FFFFFF)" + +#: pronterface.py:91 +msgid "Printer Interface" +msgstr "Interface de l'imprimante" + +#: pronterface.py:109 +msgid "Motors off" +msgstr "Arrêter les moteurs" + +#: pronterface.py:110 +msgid "Check temp" +msgstr "Lire les températures" + +#: pronterface.py:111 +msgid "Extrude" +msgstr "Extruder" + +#: pronterface.py:112 +msgid "Reverse" +msgstr "Inverser" + +#: pronterface.py:130 +msgid "" +"# I moved all your custom buttons into .pronsolerc.\n" +"# Please don't add them here any more.\n" +"# Backup of your old buttons is in custombtn.old\n" +msgstr "" +"# Tous vos boutons personalisés ont été déplacés dans le fichier ." +"pronsolerc.\n" +"# Veuillez ne plus en ajouter ici.\n" +"# Une sauvegarde de vos anciens boutons est dans le fichier custombtn.old\n" + +#: pronterface.py:135 +msgid "" +"Note!!! You have specified custom buttons in both custombtn.txt and ." +"pronsolerc" +msgstr "" +"Remarque! Vous avez spécifié des boutons personnalisés dans custombtn.txt et " +"aussi dans .pronsolerc" + +#: pronterface.py:136 +msgid "" +"Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" +msgstr "" +"custombtn.txt ignoré. Retirez tous les boutons en cours pour revenir à " +"custombtn.txt" + +#: pronterface.py:165 pronterface.py:520 pronterface.py:1343 +#: pronterface.py:1397 pronterface.py:1521 pronterface.py:1555 +#: pronterface.py:1567 +msgid "Print" +msgstr "Imprimer" + +#: pronterface.py:169 +msgid "Printer is now online." +msgstr "L'imprimante est connectée" + +#: pronterface.py:170 +msgid "Disconnect" +msgstr "Déconnecter" + +#: pronterface.py:229 +msgid "Setting hotend temperature to %f degrees Celsius." +msgstr "Réglage de la température de la buse à %f degrés Celsius." + +#: pronterface.py:248 pronterface.py:284 pronterface.py:346 +msgid "Printer is not online." +msgstr "L'imprimante est déconnectée" + +#: pronterface.py:250 +msgid "" +"You cannot set negative temperatures. To turn the hotend off entirely, set " +"its temperature to 0." +msgstr "" +"Vous ne pouvez pas régler une température négative. Pour éteindre la buse, " +"réglez sa température à 0°C." + +#: pronterface.py:252 +msgid "You must enter a temperature. (%s)" +msgstr "Vous devez saisir une température. (%s)" + +#: pronterface.py:265 +msgid "Setting bed temperature to %f degrees Celsius." +msgstr "Réglage de la température du plateau à %f degrés Celsius." + +#: pronterface.py:286 +msgid "" +"You cannot set negative temperatures. To turn the bed off entirely, set its " +"temperature to 0." +msgstr "" +"Vous ne pouvez pas régler une température négative. Pour désactiver votre " +"plateau chauffant, réglez sa température à 0°C." + +#: pronterface.py:288 +msgid "You must enter a temperature." +msgstr "Vous devez saisir une température." + +#: pronterface.py:303 +msgid "Do you want to erase the macro?" +msgstr "Voulez-vous effacer la macro ?" + +#: pronterface.py:307 +msgid "Cancelled." +msgstr "Annulé" + +#: pronterface.py:352 +msgid " Opens file" +msgstr " Ouvrir un fichier" + +#: pronterface.py:352 +msgid "&Open..." +msgstr "&Ouvrir..." + +#: pronterface.py:353 +msgid " Edit open file" +msgstr " Éditer le fichier ouvert" + +#: pronterface.py:353 +msgid "&Edit..." +msgstr "&Éditer..." + +#: pronterface.py:354 +msgid " Clear output console" +msgstr " Effacer le contenu de la console de sortie" + +#: pronterface.py:354 +msgid "Clear console" +msgstr "Effacer la console" + +#: pronterface.py:355 +msgid " Project slices" +msgstr " Projeter les couches" + +#: pronterface.py:355 +msgid "Projector" +msgstr "Projecteur" + +#: pronterface.py:356 +msgid " Closes the Window" +msgstr " Quitter le programme" + +#: pronterface.py:356 +msgid "E&xit" +msgstr "&Quitter" + +#: pronterface.py:357 +msgid "&File" +msgstr "&Fichier" + +#: pronterface.py:362 +msgid "&Macros" +msgstr "&Macros" + +#: pronterface.py:363 +msgid "<&New...>" +msgstr "<&Nouvelle...>" + +#: pronterface.py:364 +msgid " Options dialog" +msgstr " Fenêtre des options" + +#: pronterface.py:364 +msgid "&Options" +msgstr "&Options" + +#: pronterface.py:366 +msgid " Adjust slicing settings" +msgstr " Régler les paramètres de slicing" + +#: pronterface.py:366 +msgid "Slicing Settings" +msgstr "Paramètres de slicing" + +#: pronterface.py:373 +msgid "&Settings" +msgstr "&Paramètres" + +#: pronterface.py:389 +msgid "Enter macro name" +msgstr "Saisissez le nom de la macro" + +#: pronterface.py:392 +msgid "Macro name:" +msgstr "Nom :" + +#: pronterface.py:395 +msgid "Ok" +msgstr "Valider" + +#: pronterface.py:399 pronterface.py:1354 pronterface.py:1613 +msgid "Cancel" +msgstr "Annuler" + +#: pronterface.py:417 +msgid "Name '%s' is being used by built-in command" +msgstr "Le nom '%s' est utilisé par une commande interne" + +#: pronterface.py:420 +msgid "Macro name may contain only alphanumeric symbols and underscores" +msgstr "" +"Un nom de macro ne peut contenir que des caractères alphanumérique et des " +"underscore (_)" + +#: pronterface.py:469 +msgid "Port" +msgstr "Port" + +#: pronterface.py:488 +msgid "Connect" +msgstr "Connecter" + +#: pronterface.py:490 +msgid "Connect to the printer" +msgstr "Connecter l'imprimante" + +#: pronterface.py:492 +msgid "Reset" +msgstr "Réinitialiser" + +#: pronterface.py:495 pronterface.py:772 +msgid "Mini mode" +msgstr "Mode réduit" + +#: pronterface.py:499 +msgid "Monitor Printer" +msgstr "Surveiller l'imprimante" + +#: pronterface.py:509 +msgid "Load file" +msgstr "Charger un fichier" + +#: pronterface.py:512 +msgid "Compose" +msgstr "Composer" + +#: pronterface.py:516 +msgid "SD" +msgstr "SD" + +#: pronterface.py:524 pronterface.py:1398 pronterface.py:1444 +#: pronterface.py:1495 pronterface.py:1520 pronterface.py:1554 +#: pronterface.py:1570 +msgid "Pause" +msgstr "Pause" + +#: pronterface.py:537 +msgid "Send" +msgstr "Envoyer" + +#: pronterface.py:545 pronterface.py:646 +msgid "mm/min" +msgstr "mm/min" + +#: pronterface.py:547 +msgid "XY:" +msgstr "XY:" + +#: pronterface.py:549 +msgid "Z:" +msgstr "Z:" + +#: pronterface.py:572 pronterface.py:653 +msgid "Heater:" +msgstr "Buse :" + +#: pronterface.py:575 pronterface.py:595 +msgid "Off" +msgstr "Off" + +#: pronterface.py:587 pronterface.py:607 +msgid "Set" +msgstr "Régler" + +#: pronterface.py:592 pronterface.py:655 +msgid "Bed:" +msgstr "Plateau :" + +#: pronterface.py:640 +msgid "mm" +msgstr "mm" + +#: pronterface.py:698 pronterface.py:1206 pronterface.py:1438 +msgid "Not connected to printer." +msgstr "Imprimante non connectée." + +#: pronterface.py:727 +msgid "SD Upload" +msgstr "Copier sur SD" + +#: pronterface.py:731 +msgid "SD Print" +msgstr "Imprimer depuis SD" + +#: pronterface.py:779 +msgid "Full mode" +msgstr "Mode complet" + +#: pronterface.py:804 +msgid "Execute command: " +msgstr "Exécuter la commande :" + +#: pronterface.py:815 +msgid "click to add new custom button" +msgstr "Ajouter un bouton personnalisé" + +#: pronterface.py:834 +msgid "" +"Defines custom button. Usage: button \"title\" [/c \"colour\"] command" +msgstr "" +"Définit des boutons personnalidés. Utilisation : \"Libelle\" [/c " +"\"couleur\"] commande" + +#: pronterface.py:856 +msgid "Custom button number should be between 0 and 63" +msgstr "" +"Les numéros des boutons personnalisés doivent être compris entre 0 et 63." + +#: pronterface.py:948 +msgid "Edit custom button '%s'" +msgstr "Editer le bouton personnalisé '%s'" + +#: pronterface.py:950 +msgid "Move left <<" +msgstr "Déplacer vers la gauche <<" + +#: pronterface.py:953 +msgid "Move right >>" +msgstr "Déplacer vers la droite >>" + +#: pronterface.py:957 +msgid "Remove custom button '%s'" +msgstr "Supprimer le bouton personnalisé '%s'" + +#: pronterface.py:960 +msgid "Add custom button" +msgstr "Ajouter un bouton personnalisé" + +#: pronterface.py:1105 +msgid "event object missing" +msgstr "événement d'objet manquant" + +#: pronterface.py:1133 +msgid "Invalid period given." +msgstr "La période donnée est invalide" + +#: pronterface.py:1136 +msgid "Monitoring printer." +msgstr "Imprimante sous surveillance." + +#: pronterface.py:1138 +msgid "Done monitoring." +msgstr "Surveillance de l'imprimante effectuée." + +#: pronterface.py:1160 +msgid "Printer is online. " +msgstr "L'imprimante est connectée. " + +#: pronterface.py:1162 pronterface.py:1341 +msgid "Loaded " +msgstr "Chargé " + +#: pronterface.py:1165 +msgid "Bed" +msgstr "Plateau" + +#: pronterface.py:1165 +msgid "Hotend" +msgstr "Buse" + +#: pronterface.py:1175 +msgid " SD printing:%04.2f %%" +msgstr " Impression SD : %04.2f %%" + +#: pronterface.py:1178 +msgid " Printing:%04.2f %% |" +msgstr " Impression : %04.2f %% |" + +#: pronterface.py:1179 +msgid " Line# %d of %d lines |" +msgstr " Ligne# %d sur %d lignes |" + +#: pronterface.py:1184 +msgid " Est: %s of %s remaining | " +msgstr " ETA: %s restant sur %s | " + +#: pronterface.py:1186 +msgid " Z: %0.2f mm" +msgstr " Z: %0.2f mm" + +#: pronterface.py:1257 +msgid "Opening file failed." +msgstr "L'ouverture du fichier a échoué" + +#: pronterface.py:1263 +msgid "Starting print" +msgstr "Début de l'impression..." + +#: pronterface.py:1286 +msgid "Pick SD file" +msgstr "Choisir un fichier sur la carte SD" + +#: pronterface.py:1286 +msgid "Select the file to print" +msgstr "Sélectionnez le fichier à imprimer :" + +#: pronterface.py:1321 +msgid "Failed to execute slicing software: " +msgstr "Une erreur s'est produite lors du slicing : " + +#: pronterface.py:1328 +msgid "Slicing..." +msgstr "Slicing..." + +#: pronterface.py:1341 +msgid ", %d lines" +msgstr ", %d lignes" + +#: pronterface.py:1348 +msgid "Load File" +msgstr "Charger un fichier" + +#: pronterface.py:1355 +msgid "Slicing " +msgstr "Slicing " + +#: pronterface.py:1374 +msgid "Open file to print" +msgstr "Ouvrir un fichier à imprimer" + +#: pronterface.py:1375 +msgid "" +"OBJ, STL, and GCODE files (*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ)|*." +"gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ|All Files (*.*)|*.*" +msgstr "" +"Fichiers OBJ, STL et GCODE (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)|*." +"gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ|Tous les fichiers (*.*)|*.*" + +#: pronterface.py:1382 +msgid "File not found!" +msgstr "Fichier non trouvé" + +#: pronterface.py:1396 +msgid "Loaded %s, %d lines" +msgstr "%s chargé, %d lignes" + +#: pronterface.py:1406 +msgid "mm of filament used in this print\n" +msgstr "mm de filament utilisés pour cette impression\n" + +#: pronterface.py:1407 +msgid "" +"the print goes from %f mm to %f mm in X\n" +"and is %f mm wide\n" +msgstr "" +"L'impression va de %f mm à %f m en X\n" +"et mesure %f mm de large\n" + +#: pronterface.py:1408 +msgid "" +"the print goes from %f mm to %f mm in Y\n" +"and is %f mm wide\n" +msgstr "" +"L'impression va de %f mm à %f m en Y\n" +"et mesure %f mm de large\n" + +#: pronterface.py:1409 +msgid "" +"the print goes from %f mm to %f mm in Z\n" +"and is %f mm high\n" +msgstr "" +"L'impression va de %f mm à %f m en Y\n" +"et mesure %f mm de haut\n" + +#: pronterface.py:1410 +msgid "Estimated duration (pessimistic): " +msgstr "Durée estimée (pessimiste) : " + +#: pronterface.py:1435 +msgid "No file loaded. Please use load first." +msgstr "Aucun fichier chargé. Veuillez charger un fichier avant." + +#: pronterface.py:1446 +msgid "Restart" +msgstr "Recommencer" + +#: pronterface.py:1450 +msgid "File upload complete" +msgstr "Envoi du fichier terminé" + +#: pronterface.py:1469 +msgid "Pick SD filename" +msgstr "Lister les fichiers sur la carte SD" + +#: pronterface.py:1477 +msgid "Paused." +msgstr "En pause." + +#: pronterface.py:1488 +msgid "Resume" +msgstr "Reprendre" + +#: pronterface.py:1504 +msgid "Connecting..." +msgstr "Connection en cours..." + +#: pronterface.py:1535 +msgid "Disconnected." +msgstr "Déconnecté." + +#: pronterface.py:1562 +msgid "Reset." +msgstr "Réinitialisée." + +#: pronterface.py:1563 +msgid "Are you sure you want to reset the printer?" +msgstr "Etes-vous sûr de vouloir réinitialiser l'imprimante?" + +#: pronterface.py:1563 +msgid "Reset?" +msgstr "Réinitialiser ?" + +#: pronterface.py:1609 +msgid "Save" +msgstr "Enregistrer" + +#: pronterface.py:1665 +msgid "Edit settings" +msgstr "Modifier les paramètres" + +#: pronterface.py:1667 +msgid "Defaults" +msgstr "Paramètres par défaut" + +#: pronterface.py:1696 +msgid "Custom button" +msgstr "Commande personnalisée" + +#: pronterface.py:1701 +msgid "Button title" +msgstr "Titre du bouton" + +#: pronterface.py:1704 +msgid "Command" +msgstr "Commande" + +#: pronterface.py:1713 +msgid "Color" +msgstr "Couleur" diff --git a/locale/it/LC_MESSAGES/pronterface.mo b/locale/it/LC_MESSAGES/pronterface.mo index 0bbc057..e796d8e 100644 Binary files a/locale/it/LC_MESSAGES/pronterface.mo and b/locale/it/LC_MESSAGES/pronterface.mo differ diff --git a/locale/it/LC_MESSAGES/pronterface.po b/locale/it/LC_MESSAGES/pronterface.po index 0d70178..757cdfc 100644 --- a/locale/it/LC_MESSAGES/pronterface.po +++ b/locale/it/LC_MESSAGES/pronterface.po @@ -5,77 +5,21 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2012-01-19 09:21+CET\n" +"POT-Creation-Date: 2012-02-26 02:12+CET\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Italian RepRap Community \n" "Language-Team: Italian RepRap Community \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" - -#: pronsole.py:250 -msgid "Communications Speed (default: 115200)" -msgstr "Velocità di comunicazione (default: 115200)" - -#: pronsole.py:251 -msgid "Heated Build Platform temp for ABS (default: 110 deg C)" -msgstr "Temperatura piano di stampa per ABS (default: 110° C) " - -#: pronsole.py:252 -msgid "Heated Build Platform temp for PLA (default: 60 deg C)" -msgstr "Temperatura piano di stampa per PLA (default: 60° C)" - -#: pronsole.py:253 -msgid "Feedrate for Control Panel Moves in Extrusions (default: 300mm/min)" -msgstr "Velocità dei movimenti dell'estrusore in modalità manuale (default: 300mm/min)" - -#: pronsole.py:254 -msgid "Port used to communicate with printer" -msgstr "Porta usata per comunicare con la stampante" - -#: pronsole.py:255 -msgid "" -"Slice command\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py $s)" -msgstr "" -"Comando del generatore di percorso\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py $s)" - -#: pronsole.py:256 -msgid "" -"Slice settings command\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge.py" -msgstr "" -"Comando di configurazione del generatore di percorso\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge.py" - -#: pronsole.py:257 -msgid "Extruder temp for ABS (default: 230 deg C)" -msgstr "Temperatura di estrusione per ABS (default: 230° C)" - -#: pronsole.py:258 -msgid "Extruder temp for PLA (default: 185 deg C)" -msgstr "Temperatura di estrusione per PLA (default: 185° C" - -#: pronsole.py:259 -msgid "Feedrate for Control Panel Moves in X and Y (default: 3000mm/min)" -msgstr "Velocità dei movimenti degli assi X e Y in modalità manuale (default: 3000mm/min)" - -#: pronsole.py:260 -msgid "Feedrate for Control Panel Moves in Z (default: 200mm/min)" -msgstr "Velocità dei movimenti dell'asse Z in modalità manuale (default: 200mm/min)" - -#: pronterface.py:15 +#: pronterface.py:30 msgid "WX is not installed. This program requires WX to run." msgstr "WX non è installato. Questo software richiede WX per funzionare." -#: pronterface.py:66 +#: pronterface.py:81 msgid "" "Dimensions of Build Platform\n" " & optional offset of origin\n" @@ -93,55 +37,55 @@ msgstr "" " XXX,YYY,ZZZ\n" " XXXxYYYxZZZ+SposX+SposY+SposZ" -#: pronterface.py:67 +#: pronterface.py:82 msgid "Last Set Temperature for the Heated Print Bed" msgstr "Ultima temperatura impostata per il letto riscaldato" -#: pronterface.py:68 +#: pronterface.py:83 msgid "Folder of last opened file" msgstr "Cartella dell'ultimo file aperto" -#: pronterface.py:69 +#: pronterface.py:84 msgid "Last Temperature of the Hot End" msgstr "Ultima temperatura dell'estrusore" -#: pronterface.py:70 +#: pronterface.py:85 msgid "Width of Extrusion in Preview (default: 0.5)" msgstr "Larghezza dell'estrusione nell'anteprima (default: 0.5)" -#: pronterface.py:71 +#: pronterface.py:86 msgid "Fine Grid Spacing (default: 10)" msgstr "Spaziatura fine della griglia (default: 10)" -#: pronterface.py:72 +#: pronterface.py:87 msgid "Coarse Grid Spacing (default: 50)" msgstr "Spaziatura larga della griglia (default: 50)" -#: pronterface.py:73 +#: pronterface.py:88 msgid "Pronterface background color (default: #FFFFFF)" msgstr "Colore di sfondo di Pronterface (default: #FFFFFF)" -#: pronterface.py:76 +#: pronterface.py:91 msgid "Printer Interface" msgstr "Interfaccia di stampa" -#: pronterface.py:93 +#: pronterface.py:108 msgid "Motors off" msgstr "Spegni motori" -#: pronterface.py:94 +#: pronterface.py:109 msgid "Check temp" msgstr "Leggi temperatura" -#: pronterface.py:95 +#: pronterface.py:110 msgid "Extrude" msgstr "Estrudi" -#: pronterface.py:96 +#: pronterface.py:111 msgid "Reverse" msgstr "Ritrai" -#: pronterface.py:114 +#: pronterface.py:129 msgid "" "# I moved all your custom buttons into .pronsolerc.\n" "# Please don't add them here any more.\n" @@ -151,528 +95,566 @@ msgstr "" "# Per favore non aggiungerne altri qui.\n" "# Un backup dei tuoi vecchi pulsanti è in custombtn.old\n" -#: pronterface.py:119 -msgid "Note!!! You have specified custom buttons in both custombtn.txt and .pronsolerc" -msgstr "Nota!!! Hai specificato pulsanti personalizzati sia in custombtn.txt che in .pronsolerc" +#: pronterface.py:134 +msgid "" +"Note!!! You have specified custom buttons in both custombtn.txt and ." +"pronsolerc" +msgstr "" +"Nota!!! Hai specificato pulsanti personalizzati sia in custombtn.txt che in ." +"pronsolerc" -#: pronterface.py:120 -msgid "Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" -msgstr "Ignoro custombtn.txt. Elimina tutti i pulsanti attuali per tornare a custombtn.txt" +#: pronterface.py:135 +msgid "" +"Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" +msgstr "" +"Ignoro custombtn.txt. Elimina tutti i pulsanti attuali per tornare a " +"custombtn.txt" -#: pronterface.py:148 pronterface.py:499 pronterface.py:1319 -#: pronterface.py:1373 pronterface.py:1495 pronterface.py:1529 -#: pronterface.py:1544 +#: pronterface.py:163 pronterface.py:514 pronterface.py:1333 +#: pronterface.py:1387 pronterface.py:1509 pronterface.py:1543 +#: pronterface.py:1558 msgid "Print" msgstr "Stampa" -#: pronterface.py:152 +#: pronterface.py:167 msgid "Printer is now online." msgstr "La stampante ora è connessa." -#: pronterface.py:212 -msgid "Setting hotend temperature to " -msgstr "Imposto la temperatura dell'estrusore a " +#: pronterface.py:168 +msgid "Disconnect" +msgstr "Disconnettere." -#: pronterface.py:212 pronterface.py:248 -msgid " degrees Celsius." -msgstr " gradi Celsius" +#: pronterface.py:227 +msgid "Setting hotend temperature to %f degrees Celsius." +msgstr "Imposto la temperatura dell'estrusore a %f gradi Celsius." -#: pronterface.py:231 pronterface.py:267 pronterface.py:325 +#: pronterface.py:246 pronterface.py:282 pronterface.py:340 msgid "Printer is not online." msgstr "La stampante non è connessa." -#: pronterface.py:233 -msgid "You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0." -msgstr "Non è possibile impostare temperature negative. Per raffreddare l'ugello imposta la sua temperatura a 0." - #: pronterface.py:248 -msgid "Setting bed temperature to " -msgstr "Imposto la temperatura del piano di stampa a " +msgid "" +"You cannot set negative temperatures. To turn the hotend off entirely, set " +"its temperature to 0." +msgstr "" +"Non è possibile impostare temperature negative. Per raffreddare l'ugello " +"imposta la sua temperatura a 0." -#: pronterface.py:269 -msgid "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0." -msgstr "Non è possibile impostare temperature negative. Per raffreddare il piano di stampa imposta la sua temperatura a 0." +#: pronterface.py:250 +msgid "You must enter a temperature. (%s)" +msgstr "Devi inserire una temperatura. (%s)" -#: pronterface.py:271 +#: pronterface.py:263 +msgid "Setting bed temperature to %f degrees Celsius." +msgstr "Imposto la temperatura del piano di stampa a %f gradi Celsius." + +#: pronterface.py:284 +msgid "" +"You cannot set negative temperatures. To turn the bed off entirely, set its " +"temperature to 0." +msgstr "" +"Non è possibile impostare temperature negative. Per raffreddare il piano di " +"stampa imposta la sua temperatura a 0." + +#: pronterface.py:286 msgid "You must enter a temperature." msgstr "Devi inserire una temperatura." -#: pronterface.py:286 +#: pronterface.py:301 msgid "Do you want to erase the macro?" msgstr "Vuoi cancellare la macro?" -#: pronterface.py:290 +#: pronterface.py:305 msgid "Cancelled." msgstr "Annullato." -#: pronterface.py:331 +#: pronterface.py:346 msgid " Opens file" msgstr " Apre un file" -#: pronterface.py:331 +#: pronterface.py:346 msgid "&Open..." msgstr "&Apri..." -#: pronterface.py:332 +#: pronterface.py:347 msgid " Edit open file" msgstr " Modifica file aperto" -#: pronterface.py:332 +#: pronterface.py:347 msgid "&Edit..." msgstr "&Modifica" -#: pronterface.py:333 +#: pronterface.py:348 msgid " Clear output console" msgstr " Svuota la console" -#: pronterface.py:333 +#: pronterface.py:348 msgid "Clear console" msgstr "Pulisci console" -#: pronterface.py:334 +#: pronterface.py:349 msgid " Project slices" msgstr " Proietta i layer" -#: pronterface.py:334 +#: pronterface.py:349 msgid "Projector" msgstr "Proiettore" -#: pronterface.py:335 +#: pronterface.py:350 msgid " Closes the Window" msgstr " Chiude la finestra" -#: pronterface.py:335 +#: pronterface.py:350 msgid "E&xit" msgstr "&Esci" -#: pronterface.py:336 +#: pronterface.py:351 msgid "&File" msgstr "&File" -#: pronterface.py:341 +#: pronterface.py:356 msgid "&Macros" msgstr "&Macro" -#: pronterface.py:342 +#: pronterface.py:357 msgid "<&New...>" msgstr "<&Nuovo...>" -#: pronterface.py:343 +#: pronterface.py:358 msgid " Options dialog" msgstr " Finestra di opzioni" -#: pronterface.py:343 +#: pronterface.py:358 msgid "&Options" msgstr "&Opzioni" -#: pronterface.py:345 +#: pronterface.py:360 msgid " Adjust slicing settings" msgstr " Configura la generazione del percorso" -#: pronterface.py:345 +#: pronterface.py:360 msgid "Slicing Settings" msgstr "Impostazioni di generazione del percorso" -#: pronterface.py:352 +#: pronterface.py:367 msgid "&Settings" msgstr "&Impostazioni" -#: pronterface.py:368 +#: pronterface.py:383 msgid "Enter macro name" msgstr "Inserisci il nome della macro" -#: pronterface.py:371 +#: pronterface.py:386 msgid "Macro name:" msgstr "Nome macro:" -#: pronterface.py:374 +#: pronterface.py:389 msgid "Ok" msgstr "Ok" -#: pronterface.py:378 pronterface.py:1330 pronterface.py:1587 +#: pronterface.py:393 pronterface.py:1344 pronterface.py:1601 msgid "Cancel" msgstr "Annulla" -#: pronterface.py:396 -msgid "' is being used by built-in command" -msgstr "' è usato da un comando interno" +#: pronterface.py:411 +msgid "Name '%s' is being used by built-in command" +msgstr "Nome '%s' è usato da un comando interno" -#: pronterface.py:396 -msgid "Name '" -msgstr "Nome '" - -#: pronterface.py:399 +#: pronterface.py:414 msgid "Macro name may contain only alphanumeric symbols and underscores" -msgstr "I nomi delle macro possono contenere solo simboli alfanumerici e underscore" +msgstr "" +"I nomi delle macro possono contenere solo simboli alfanumerici e underscore" -#: pronterface.py:448 +#: pronterface.py:463 msgid "Port" msgstr "Porta" -#: pronterface.py:467 +#: pronterface.py:482 msgid "Connect" msgstr "Connetti" -#: pronterface.py:469 +#: pronterface.py:484 msgid "Connect to the printer" msgstr "Connetti alla stampante" -#: pronterface.py:471 +#: pronterface.py:486 msgid "Reset" msgstr "Reset" -#: pronterface.py:474 pronterface.py:751 +#: pronterface.py:489 pronterface.py:766 msgid "Mini mode" msgstr "Contrai" -#: pronterface.py:478 +#: pronterface.py:493 msgid "Monitor Printer" msgstr "Controllo automatico temperatura" -#: pronterface.py:488 +#: pronterface.py:503 msgid "Load file" msgstr "Carica file" -#: pronterface.py:491 +#: pronterface.py:506 msgid "Compose" msgstr "Componi" -#: pronterface.py:495 +#: pronterface.py:510 msgid "SD" msgstr "SD" -#: pronterface.py:503 pronterface.py:1374 pronterface.py:1419 -#: pronterface.py:1469 pronterface.py:1494 pronterface.py:1528 -#: pronterface.py:1543 +#: pronterface.py:518 pronterface.py:1388 pronterface.py:1433 +#: pronterface.py:1483 pronterface.py:1508 pronterface.py:1542 +#: pronterface.py:1557 msgid "Pause" msgstr "Pausa" -#: pronterface.py:516 +#: pronterface.py:531 msgid "Send" msgstr "Invia" -#: pronterface.py:524 pronterface.py:625 +#: pronterface.py:539 pronterface.py:640 msgid "mm/min" msgstr "mm/min" -#: pronterface.py:526 +#: pronterface.py:541 msgid "XY:" msgstr "XY:" -#: pronterface.py:528 +#: pronterface.py:543 msgid "Z:" msgstr "Z:" -#: pronterface.py:551 pronterface.py:632 +#: pronterface.py:566 pronterface.py:647 msgid "Heater:" msgstr "Estrusore:" -#: pronterface.py:554 pronterface.py:574 +#: pronterface.py:569 pronterface.py:589 msgid "Off" msgstr "Off" -#: pronterface.py:566 pronterface.py:586 +#: pronterface.py:581 pronterface.py:601 msgid "Set" msgstr "On" -#: pronterface.py:571 pronterface.py:634 +#: pronterface.py:586 pronterface.py:649 msgid "Bed:" msgstr "Piano:" -#: pronterface.py:619 +#: pronterface.py:634 msgid "mm" msgstr "mm" -#: pronterface.py:677 pronterface.py:1182 pronterface.py:1413 +#: pronterface.py:692 pronterface.py:1196 pronterface.py:1427 msgid "Not connected to printer." msgstr "Non connesso alla stampante." -#: pronterface.py:706 +#: pronterface.py:721 msgid "SD Upload" msgstr "Carica SD" -#: pronterface.py:710 +#: pronterface.py:725 msgid "SD Print" msgstr "Stampa SD" -#: pronterface.py:758 +#: pronterface.py:773 msgid "Full mode" msgstr "Espandi" -#: pronterface.py:783 +#: pronterface.py:798 msgid "Execute command: " msgstr "Esegui comando: " -#: pronterface.py:794 +#: pronterface.py:809 msgid "click to add new custom button" msgstr "clicca per aggiungere un nuovo pulsante personalizzato" -#: pronterface.py:813 -msgid "Defines custom button. Usage: button \"title\" [/c \"colour\"] command" -msgstr "Definisce un pulsante personalizzato. Uso: button \"titolo\" [/c \"colore\"] comando" +#: pronterface.py:828 +msgid "" +"Defines custom button. Usage: button \"title\" [/c \"colour\"] command" +msgstr "" +"Definisce un pulsante personalizzato. Uso: button \"titolo\" [/c " +"\"colore\"] comando" -#: pronterface.py:835 +#: pronterface.py:850 msgid "Custom button number should be between 0 and 63" msgstr "Il numero del pulsante personalizzato dev'essere tra 0 e 63" -#: pronterface.py:927 +#: pronterface.py:942 msgid "Edit custom button '%s'" msgstr "Modifica pulsante personalizzato '%s'" -#: pronterface.py:929 +#: pronterface.py:944 msgid "Move left <<" msgstr "Muovi a sinistra <<" -#: pronterface.py:932 +#: pronterface.py:947 msgid "Move right >>" msgstr "Muovi a destra >>" -#: pronterface.py:936 +#: pronterface.py:951 msgid "Remove custom button '%s'" msgstr "Elimina pulsante personalizzato '%s'" -#: pronterface.py:939 +#: pronterface.py:954 msgid "Add custom button" msgstr "Aggiungi pulsante personalizzato" -#: pronterface.py:1084 +#: pronterface.py:1099 msgid "event object missing" msgstr "oggetto dell'evento mancante" -#: pronterface.py:1112 +#: pronterface.py:1127 msgid "Invalid period given." msgstr "Periodo non valido." -#: pronterface.py:1115 +#: pronterface.py:1130 msgid "Monitoring printer." msgstr "Sto controllando la stampante." -#: pronterface.py:1117 +#: pronterface.py:1132 msgid "Done monitoring." msgstr "Controllo terminato." -#: pronterface.py:1139 +#: pronterface.py:1154 msgid "Printer is online. " msgstr "La stampante è online. " -#: pronterface.py:1141 pronterface.py:1317 pronterface.py:1372 +#: pronterface.py:1156 pronterface.py:1331 msgid "Loaded " msgstr "Caricato " -#: pronterface.py:1144 +#: pronterface.py:1159 msgid "Bed" msgstr "Letto" -#: pronterface.py:1144 +#: pronterface.py:1159 msgid "Hotend" msgstr "Estrusore" -#: pronterface.py:1154 +#: pronterface.py:1169 msgid " SD printing:%04.2f %%" msgstr " stampa da scheda SD:%04.2f %%" -#: pronterface.py:1157 +#: pronterface.py:1172 msgid " Printing:%04.2f %% |" msgstr " Stampa in corso:%04.2f %% |" -#: pronterface.py:1158 -msgid " Line# " -msgstr " Linea# " +#: pronterface.py:1173 +msgid " Line# %d of %d lines |" +msgstr " Linea# %d di %d linee |" -#: pronterface.py:1158 -msgid " lines |" -msgstr " linee |" +#: pronterface.py:1178 +msgid " Est: %s of %s remaining | " +msgstr " Stima: %s di %s rimanente | " -#: pronterface.py:1158 -msgid "of " -msgstr "di " - -#: pronterface.py:1163 -msgid " Est: " -msgstr " Stima: " - -#: pronterface.py:1164 -msgid " of: " -msgstr " di: " - -#: pronterface.py:1165 -msgid " Remaining | " -msgstr " Rimanente | " - -#: pronterface.py:1166 +#: pronterface.py:1180 msgid " Z: %0.2f mm" msgstr " Z: %0.2f mm" -#: pronterface.py:1233 +#: pronterface.py:1247 msgid "Opening file failed." msgstr "Apertura del file fallita." -#: pronterface.py:1239 +#: pronterface.py:1253 msgid "Starting print" msgstr "Inizio della stampa" -#: pronterface.py:1262 +#: pronterface.py:1276 msgid "Pick SD file" msgstr "Scegli un file dalla scheda SD" -#: pronterface.py:1262 +#: pronterface.py:1276 msgid "Select the file to print" msgstr "Seleziona il file da stampare" -#: pronterface.py:1297 +#: pronterface.py:1311 msgid "Failed to execute slicing software: " msgstr "Imposibile eseguire il software di generazione percorso: " -#: pronterface.py:1304 +#: pronterface.py:1318 msgid "Slicing..." msgstr "Generazione percorso..." -#: pronterface.py:1317 pronterface.py:1372 +#: pronterface.py:1331 msgid ", %d lines" msgstr ", %d linee" -#: pronterface.py:1324 +#: pronterface.py:1338 msgid "Load File" msgstr "Apri file" -#: pronterface.py:1331 +#: pronterface.py:1345 msgid "Slicing " msgstr "Generazione del percorso " -#: pronterface.py:1350 +#: pronterface.py:1364 msgid "Open file to print" msgstr "Apri il file da stampare" -#: pronterface.py:1351 +#: pronterface.py:1365 msgid "OBJ, STL, and GCODE files (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" msgstr "files OBJ, STL e GCODE (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" -#: pronterface.py:1358 +#: pronterface.py:1372 msgid "File not found!" msgstr "File non trovato!" -#: pronterface.py:1382 -msgid "" -"mm of filament used in this print\n" -msgstr "" -"mm di filamento usato in questa stampa\n" - -#: pronterface.py:1383 -msgid "" -"mm in X\n" -"and is" -msgstr "" -"mm in X\n" -"ed è" - -#: pronterface.py:1383 pronterface.py:1384 -msgid "" -"mm wide\n" -msgstr "" -"mm di larghezza\n" - -#: pronterface.py:1383 pronterface.py:1384 pronterface.py:1385 -msgid "mm to" -msgstr "mm a" - -#: pronterface.py:1383 pronterface.py:1384 pronterface.py:1385 -msgid "the print goes from" -msgstr "la stampa va da" - -#: pronterface.py:1384 -msgid "" -"mm in Y\n" -"and is" -msgstr "" -"mm in Y\n" -"ed è" - -#: pronterface.py:1385 -msgid "" -"mm high\n" -msgstr "" -"mm di altezza\n" - -#: pronterface.py:1385 -msgid "" -"mm in Z\n" -"and is" -msgstr "" -"mm in Z\n" -"ed è" - #: pronterface.py:1386 +msgid "Loaded %s, %d lines" +msgstr "Caricato %s, %d linee" + +#: pronterface.py:1396 +msgid "mm of filament used in this print\n" +msgstr "mm di filamento usato in questa stampa\n" + +#: pronterface.py:1397 +msgid "" +"the print goes from %f mm to %f mm in X\n" +"and is %f mm wide\n" +msgstr "" +"la stampa va da %f mm a %f mm in X\n" +"ed è %f mm di larghezza\n" + +#: pronterface.py:1398 +msgid "" +"the print goes from %f mm to %f mm in Y\n" +"and is %f mm wide\n" +msgstr "" +"la stampa va da %f mm a %f mm in Y\n" +"ed è %f mm di larghezza\n" + +#: pronterface.py:1399 +msgid "" +"the print goes from %f mm to %f mm in Z\n" +"and is %f mm high\n" +msgstr "" +"la stampa va da %f mm a %f mm in Z\n" +"ed è %f mm di altezza\n" + +#: pronterface.py:1400 msgid "Estimated duration (pessimistic): " msgstr "Durata stimata (pessimistica): " -#: pronterface.py:1410 +#: pronterface.py:1424 msgid "No file loaded. Please use load first." msgstr "Nessub file caricato. Usare Apri prima." -#: pronterface.py:1421 +#: pronterface.py:1435 msgid "Restart" msgstr "Ricomincia" -#: pronterface.py:1425 +#: pronterface.py:1439 msgid "File upload complete" msgstr "Caricamento file completato" -#: pronterface.py:1444 +#: pronterface.py:1458 msgid "Pick SD filename" msgstr "Scegli un file dalla scheda SD" -#: pronterface.py:1452 +#: pronterface.py:1466 msgid "Paused." msgstr "In pausa." -#: pronterface.py:1462 +#: pronterface.py:1476 msgid "Resume" msgstr "Ripristina" -#: pronterface.py:1478 +#: pronterface.py:1492 msgid "Connecting..." msgstr "Connessione..." -#: pronterface.py:1509 +#: pronterface.py:1523 msgid "Disconnected." msgstr "Disconnesso." -#: pronterface.py:1536 +#: pronterface.py:1550 msgid "Reset." msgstr "Reset." -#: pronterface.py:1537 +#: pronterface.py:1551 msgid "Are you sure you want to reset the printer?" msgstr "Sei sicuro di voler resettare la stampante?" -#: pronterface.py:1537 +#: pronterface.py:1551 msgid "Reset?" msgstr "Reset?" -#: pronterface.py:1583 +#: pronterface.py:1597 msgid "Save" msgstr "Salva" -#: pronterface.py:1639 +#: pronterface.py:1653 msgid "Edit settings" msgstr "Modifica impostazioni" -#: pronterface.py:1641 +#: pronterface.py:1655 msgid "Defaults" msgstr "Valori di default" -#: pronterface.py:1670 +#: pronterface.py:1684 msgid "Custom button" msgstr "Personalizza bottone" -#: pronterface.py:1675 +#: pronterface.py:1689 msgid "Button title" msgstr "Titolo bottone" -#: pronterface.py:1678 +#: pronterface.py:1692 msgid "Command" msgstr "Comando" -#: pronterface.py:1687 +#: pronterface.py:1701 msgid "Color" msgstr "Colore" + +#~ msgid "Communications Speed (default: 115200)" +#~ msgstr "Velocità di comunicazione (default: 115200)" + +#~ msgid "Heated Build Platform temp for ABS (default: 110 deg C)" +#~ msgstr "Temperatura piano di stampa per ABS (default: 110° C) " + +#~ msgid "Heated Build Platform temp for PLA (default: 60 deg C)" +#~ msgstr "Temperatura piano di stampa per PLA (default: 60° C)" + +#~ msgid "Feedrate for Control Panel Moves in Extrusions (default: 300mm/min)" +#~ msgstr "" +#~ "Velocità dei movimenti dell'estrusore in modalità manuale (default: 300mm/" +#~ "min)" + +#~ msgid "Port used to communicate with printer" +#~ msgstr "Porta usata per comunicare con la stampante" + +#~ msgid "" +#~ "Slice command\n" +#~ " default:\n" +#~ " python skeinforge/skeinforge_application/skeinforge_utilities/" +#~ "skeinforge_craft.py $s)" +#~ msgstr "" +#~ "Comando del generatore di percorso\n" +#~ " default:\n" +#~ " python skeinforge/skeinforge_application/skeinforge_utilities/" +#~ "skeinforge_craft.py $s)" + +#~ msgid "" +#~ "Slice settings command\n" +#~ " default:\n" +#~ " python skeinforge/skeinforge_application/skeinforge.py" +#~ msgstr "" +#~ "Comando di configurazione del generatore di percorso\n" +#~ " default:\n" +#~ " python skeinforge/skeinforge_application/skeinforge.py" + +#~ msgid "Extruder temp for ABS (default: 230 deg C)" +#~ msgstr "Temperatura di estrusione per ABS (default: 230° C)" + +#~ msgid "Extruder temp for PLA (default: 185 deg C)" +#~ msgstr "Temperatura di estrusione per PLA (default: 185° C" + +#~ msgid "Feedrate for Control Panel Moves in X and Y (default: 3000mm/min)" +#~ msgstr "" +#~ "Velocità dei movimenti degli assi X e Y in modalità manuale (default: " +#~ "3000mm/min)" + +#~ msgid "Feedrate for Control Panel Moves in Z (default: 200mm/min)" +#~ msgstr "" +#~ "Velocità dei movimenti dell'asse Z in modalità manuale (default: 200mm/" +#~ "min)" diff --git a/locale/nl/LC_MESSAGES/nl.po b/locale/nl/LC_MESSAGES/nl.po index 7c422bb..4dfcac8 100755 --- a/locale/nl/LC_MESSAGES/nl.po +++ b/locale/nl/LC_MESSAGES/nl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Pronterface rl1\n" -"POT-Creation-Date: 2011-09-06 16:31+0100\n" +"POT-Creation-Date: 2012-02-26 02:12+CET\n" "PO-Revision-Date: 2011-09-06 16:31+0100\n" "Last-Translator: Ruben Lubbes \n" "Language-Team: NL \n" @@ -15,135 +15,70 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" -#: pronterface.py:10 +#: pronterface.py:30 msgid "WX is not installed. This program requires WX to run." msgstr "WX is niet geïnstalleerd. Dit programma vereist WX." -#: pronterface.py:60 +#: pronterface.py:81 +msgid "" +"Dimensions of Build Platform\n" +" & optional offset of origin\n" +"\n" +"Examples:\n" +" XXXxYYY\n" +" XXX,YYY,ZZZ\n" +" XXXxYYYxZZZ+OffX+OffY+OffZ" +msgstr "" + +#: pronterface.py:82 +msgid "Last Set Temperature for the Heated Print Bed" +msgstr "" + +#: pronterface.py:83 +msgid "Folder of last opened file" +msgstr "" + +#: pronterface.py:84 +msgid "Last Temperature of the Hot End" +msgstr "" + +#: pronterface.py:85 +msgid "Width of Extrusion in Preview (default: 0.5)" +msgstr "" + +#: pronterface.py:86 +msgid "Fine Grid Spacing (default: 10)" +msgstr "" + +#: pronterface.py:87 +msgid "Coarse Grid Spacing (default: 50)" +msgstr "" + +#: pronterface.py:88 +msgid "Pronterface background color (default: #FFFFFF)" +msgstr "" + +#: pronterface.py:91 msgid "Printer Interface" msgstr "Printer Interface" -#: pronterface.py:72 -msgid "X+100" -msgstr "X+100" - -#: pronterface.py:73 -msgid "X+10" -msgstr "X+10" - -#: pronterface.py:74 -msgid "X+1" -msgstr "X+1" - -#: pronterface.py:75 -msgid "X+0.1" -msgstr "X+0.1" - -#: pronterface.py:76 -msgid "HomeX" -msgstr "0-puntX" - -#: pronterface.py:77 -msgid "X-0.1" -msgstr "X-0.1" - -#: pronterface.py:78 -msgid "X-1" -msgstr "X-1" - -#: pronterface.py:79 -msgid "X-10" -msgstr "X-10" - -#: pronterface.py:80 -msgid "X-100" -msgstr "X-100" - -#: pronterface.py:81 -msgid "Y+100" -msgstr "Y+100" - -#: pronterface.py:82 -msgid "Y+10" -msgstr "Y+10" - -#: pronterface.py:83 -msgid "Y+1" -msgstr "Y+1" - -#: pronterface.py:84 -msgid "Y+0.1" -msgstr "Y+0.1" - -#: pronterface.py:85 -msgid "HomeY" -msgstr "0-puntY" - -#: pronterface.py:86 -msgid "Y-0.1" -msgstr "Y-0.1" - -#: pronterface.py:87 -msgid "Y-1" -msgstr "Y-1" - -#: pronterface.py:88 -msgid "Y-10" -msgstr "Y-10" - -#: pronterface.py:89 -msgid "Y-100" -msgstr "Y-100" - -#: pronterface.py:90 +#: pronterface.py:108 msgid "Motors off" msgstr "Motoren uit" -#: pronterface.py:91 -msgid "Z+10" -msgstr "Z+10" - -#: pronterface.py:92 -msgid "Z+1" -msgstr "Z+1" - -#: pronterface.py:93 -msgid "Z+0.1" -msgstr "Z+0.1" - -#: pronterface.py:94 -msgid "HomeZ" -msgstr "0-puntZ" - -#: pronterface.py:95 -msgid "Z-0.1" -msgstr "Z-0.1" - -#: pronterface.py:96 -msgid "Z-1" -msgstr "Z-1" - -#: pronterface.py:97 -msgid "Z-10" -msgstr "Z-10" - -#: pronterface.py:98 -msgid "Home" -msgstr "0-punt" - -#: pronterface.py:99 +#: pronterface.py:109 msgid "Check temp" msgstr "Controleer Temp." -#: pronterface.py:100 +#: pronterface.py:110 msgid "Extrude" msgstr "Extruden" -#: pronterface.py:101 +#: pronterface.py:111 msgid "Reverse" msgstr "Terug" -#: pronterface.py:117 +#: pronterface.py:129 msgid "" "# I moved all your custom buttons into .pronsolerc.\n" "# Please don't add them here any more.\n" @@ -153,484 +88,621 @@ msgstr "" "# Hier geen nieuwe knoppen definiëren.\n" "# Een backup van de oude knoppen staat in custombtn.old\n" -#: pronterface.py:122 -msgid "Note!!! You have specified custom buttons in both custombtn.txt and .pronsolerc" -msgstr "Let op!!! Er zijn gedefinieerde knoppen in zowel custombtn.txt en .pronsolerc" +#: pronterface.py:134 +msgid "" +"Note!!! You have specified custom buttons in both custombtn.txt and ." +"pronsolerc" +msgstr "" +"Let op!!! Er zijn gedefinieerde knoppen in zowel custombtn.txt en .pronsolerc" -#: pronterface.py:123 -msgid "Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" -msgstr "Negeer custombtn.txt. Verwijder alle gedefinieerde knoppen om gebruik te maken van custombtn.txt" +#: pronterface.py:135 +msgid "" +"Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" +msgstr "" +"Negeer custombtn.txt. Verwijder alle gedefinieerde knoppen om gebruik te " +"maken van custombtn.txt" -#: pronterface.py:146 -#: pronterface.py:434 -#: pronterface.py:971 -#: pronterface.py:1020 -#: pronterface.py:1134 -#: pronterface.py:1161 -#: pronterface.py:1175 +#: pronterface.py:163 pronterface.py:514 pronterface.py:1333 +#: pronterface.py:1387 pronterface.py:1509 pronterface.py:1543 +#: pronterface.py:1558 msgid "Print" msgstr "Printen" -#: pronterface.py:150 -msgid "Printer is now online" -msgstr "Printer is nu verbonden" +#: pronterface.py:167 +msgid "Printer is now online." +msgstr "Printer is nu verbonden." -#: pronterface.py:199 -msgid "Setting hotend temperature to " -msgstr "Stel elementtemperatuur in op " - -#: pronterface.py:199 -#: pronterface.py:220 -msgid " degrees Celsius." -msgstr " graden Celsius." - -#: pronterface.py:203 -#: pronterface.py:224 -msgid "Printer is not online." -msgstr "Printer is niet verbonden." - -#: pronterface.py:205 -msgid "You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0." -msgstr "Negatieve temperatuur is niet instelbaar. Om het element uit te schakelen wordt temperatuur 0 ingesteld." - -#: pronterface.py:207 -#: pronterface.py:228 -msgid "You must enter a temperature." -msgstr "Er moet een temperatuur worden ingesteld." - -#: pronterface.py:220 -msgid "Setting bed temperature to " -msgstr "Bed teperatuur ingesteld op " - -#: pronterface.py:226 -msgid "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0." -msgstr "Negatieve temperatuur is niet instelbaar. Om het printbed uit te schakelen wordt temperatuur 0 ingesteld." - -#: pronterface.py:243 -msgid "Do you want to erase the macro?" -msgstr "Wilt u de macro verwijderen?" - -#: pronterface.py:247 -msgid "Cancelled." -msgstr "Afgebroken" - -#: pronterface.py:277 -msgid "&Open..." -msgstr "&Open..." - -#: pronterface.py:277 -msgid " Opens file" -msgstr " Opent bestand" - -#: pronterface.py:278 -msgid "&Edit..." -msgstr "&Wijzig..." - -#: pronterface.py:278 -msgid " Edit open file" -msgstr " Wijzig geopend bestand" - -#: pronterface.py:279 -msgid "E&xit" -msgstr "&Stoppen" - -#: pronterface.py:279 -msgid " Closes the Window" -msgstr " Sluit het venster" - -#: pronterface.py:280 -msgid "&File" -msgstr "" - -#: pronterface.py:285 -msgid "&Macros" -msgstr "&Macros" - -#: pronterface.py:286 -msgid "<&New...>" -msgstr "<&Nieuw...>" - -#: pronterface.py:287 -msgid "&Options" -msgstr "&Opties" - -#: pronterface.py:287 -msgid " Options dialog" -msgstr "Optievenster" - -#: pronterface.py:289 -msgid "SFACT Settings" -msgstr "SFACT Instellingen" - -#: pronterface.py:289 -msgid " Adjust SFACT settings" -msgstr "Instellen SFACT" - -#: pronterface.py:292 -msgid "SFACT Quick Settings" -msgstr "SFACT Snelinstelling" - -#: pronterface.py:292 -msgid " Quickly adjust SFACT settings for active profile" -msgstr " Eenvoudig SFACT's huidige profiel instellen" - -#: pronterface.py:295 -msgid "&Settings" -msgstr "&Instellingen" - -#: pronterface.py:311 -msgid "Enter macro name" -msgstr "Voer macronaam in" - -#: pronterface.py:314 -msgid "Macro name:" -msgstr "Macronaam:" - -#: pronterface.py:317 -msgid "Ok" -msgstr "Ok" - -#: pronterface.py:321 -#: pronterface.py:1197 -msgid "Cancel" -msgstr "Annuleer" - -#: pronterface.py:339 -msgid "Name '" -msgstr "Naam '" - -#: pronterface.py:339 -msgid "' is being used by built-in command" -msgstr "' wordt gebruikt door ingebouwde instructie" - -#: pronterface.py:342 -msgid "Macro name may contain only alphanumeric symbols and underscores" -msgstr "" - -#: pronterface.py:375 -msgid "Port:" -msgstr "Poort" - -#: pronterface.py:397 -msgid "Connect" -msgstr "Verbind" - -#: pronterface.py:399 -msgid "Connect to the printer" -msgstr "Verbind met printer" - -#: pronterface.py:401 +#: pronterface.py:168 msgid "Disconnect" msgstr "Ontkoppel" -#: pronterface.py:405 +#: pronterface.py:227 +msgid "Setting hotend temperature to %f degrees Celsius." +msgstr "Stel elementtemperatuur in op %f graden Celsius." + +#: pronterface.py:246 pronterface.py:282 pronterface.py:340 +msgid "Printer is not online." +msgstr "Printer is niet verbonden." + +#: pronterface.py:248 +msgid "" +"You cannot set negative temperatures. To turn the hotend off entirely, set " +"its temperature to 0." +msgstr "" +"Negatieve temperatuur is niet instelbaar. Om het element uit te schakelen " +"wordt temperatuur 0 ingesteld." + +#: pronterface.py:250 +msgid "You must enter a temperature. (%s)" +msgstr "Er moet een temperatuur worden ingesteld. (%s)" + +#: pronterface.py:263 +msgid "Setting bed temperature to %f degrees Celsius." +msgstr "Bed teperatuur ingesteld op %f graden Celsius." + +#: pronterface.py:284 +msgid "" +"You cannot set negative temperatures. To turn the bed off entirely, set its " +"temperature to 0." +msgstr "" +"Negatieve temperatuur is niet instelbaar. Om het printbed uit te schakelen " +"wordt temperatuur 0 ingesteld." + +#: pronterface.py:286 +msgid "You must enter a temperature." +msgstr "Er moet een temperatuur worden ingesteld." + +#: pronterface.py:301 +msgid "Do you want to erase the macro?" +msgstr "Wilt u de macro verwijderen?" + +#: pronterface.py:305 +msgid "Cancelled." +msgstr "Afgebroken" + +#: pronterface.py:346 +msgid " Opens file" +msgstr " Opent bestand" + +#: pronterface.py:346 +msgid "&Open..." +msgstr "&Open..." + +#: pronterface.py:347 +msgid " Edit open file" +msgstr " Wijzig geopend bestand" + +#: pronterface.py:347 +msgid "&Edit..." +msgstr "&Wijzig..." + +#: pronterface.py:348 +msgid " Clear output console" +msgstr "" + +#: pronterface.py:348 +msgid "Clear console" +msgstr "" + +#: pronterface.py:349 +msgid " Project slices" +msgstr "" + +#: pronterface.py:349 +msgid "Projector" +msgstr "" + +#: pronterface.py:350 +msgid " Closes the Window" +msgstr " Sluit het venster" + +#: pronterface.py:350 +msgid "E&xit" +msgstr "&Stoppen" + +#: pronterface.py:351 +msgid "&File" +msgstr "" + +#: pronterface.py:356 +msgid "&Macros" +msgstr "&Macros" + +#: pronterface.py:357 +msgid "<&New...>" +msgstr "<&Nieuw...>" + +#: pronterface.py:358 +msgid " Options dialog" +msgstr "Optievenster" + +#: pronterface.py:358 +msgid "&Options" +msgstr "&Opties" + +#: pronterface.py:360 +#, fuzzy +msgid " Adjust slicing settings" +msgstr "Instellen SFACT" + +#: pronterface.py:360 +#, fuzzy +msgid "Slicing Settings" +msgstr "SFACT Instellingen" + +#: pronterface.py:367 +msgid "&Settings" +msgstr "&Instellingen" + +#: pronterface.py:383 +msgid "Enter macro name" +msgstr "Voer macronaam in" + +#: pronterface.py:386 +msgid "Macro name:" +msgstr "Macronaam:" + +#: pronterface.py:389 +msgid "Ok" +msgstr "Ok" + +#: pronterface.py:393 pronterface.py:1344 pronterface.py:1601 +msgid "Cancel" +msgstr "Annuleer" + +#: pronterface.py:411 +msgid "Name '%s' is being used by built-in command" +msgstr "Naam '%s' wordt gebruikt door ingebouwde instructie" + +#: pronterface.py:414 +msgid "Macro name may contain only alphanumeric symbols and underscores" +msgstr "" + +#: pronterface.py:463 +msgid "Port" +msgstr "Poort" + +#: pronterface.py:482 +msgid "Connect" +msgstr "Verbind" + +#: pronterface.py:484 +msgid "Connect to the printer" +msgstr "Verbind met printer" + +#: pronterface.py:486 msgid "Reset" msgstr "Reset" -#: pronterface.py:408 -#: pronterface.py:592 +#: pronterface.py:489 pronterface.py:766 msgid "Mini mode" msgstr "Mini-venster" -#: pronterface.py:414 -msgid "" -"Monitor\n" -"printer" +#: pronterface.py:493 +#, fuzzy +msgid "Monitor Printer" msgstr "Printercommunicatie volgen" -#: pronterface.py:423 +#: pronterface.py:503 msgid "Load file" msgstr "open bestand" -#: pronterface.py:426 -msgid "SD Upload" -msgstr "uploaden naar SD" +#: pronterface.py:506 +msgid "Compose" +msgstr "" -#: pronterface.py:430 -msgid "SD Print" -msgstr "Afdruk van SD" +#: pronterface.py:510 +msgid "SD" +msgstr "" -#: pronterface.py:438 -#: pronterface.py:1021 -#: pronterface.py:1061 -#: pronterface.py:1109 -#: pronterface.py:1133 -#: pronterface.py:1160 -#: pronterface.py:1174 +#: pronterface.py:518 pronterface.py:1388 pronterface.py:1433 +#: pronterface.py:1483 pronterface.py:1508 pronterface.py:1542 +#: pronterface.py:1557 msgid "Pause" msgstr "Pauze" -#: pronterface.py:452 +#: pronterface.py:531 msgid "Send" msgstr "Zend" -#: pronterface.py:460 -#: pronterface.py:518 +#: pronterface.py:539 pronterface.py:640 msgid "mm/min" msgstr "mm/min" -#: pronterface.py:462 +#: pronterface.py:541 msgid "XY:" msgstr "XY:" -#: pronterface.py:464 +#: pronterface.py:543 msgid "Z:" msgstr "Z:" -#: pronterface.py:481 +#: pronterface.py:566 pronterface.py:647 msgid "Heater:" msgstr "Element:" -#: pronterface.py:489 -#: pronterface.py:501 +#: pronterface.py:569 pronterface.py:589 +msgid "Off" +msgstr "" + +#: pronterface.py:581 pronterface.py:601 msgid "Set" msgstr "Stel in" -#: pronterface.py:493 +#: pronterface.py:586 pronterface.py:649 msgid "Bed:" msgstr "Bed:" -#: pronterface.py:512 +#: pronterface.py:634 msgid "mm" msgstr "mm" -#: pronterface.py:551 -#: pronterface.py:846 -#: pronterface.py:1055 +#: pronterface.py:692 pronterface.py:1196 pronterface.py:1427 msgid "Not connected to printer." msgstr "Printer is niet verbonden." -#: pronterface.py:599 +#: pronterface.py:721 +msgid "SD Upload" +msgstr "uploaden naar SD" + +#: pronterface.py:725 +msgid "SD Print" +msgstr "Afdruk van SD" + +#: pronterface.py:773 msgid "Full mode" msgstr "Volledig venster" -#: pronterface.py:637 -msgid "Defines custom button. Usage: button \"title\" [/c \"colour\"] command" -msgstr "Definieert eigen knop. Gebruik: knop \"titel\" [/c \"kleur\"] commando" +#: pronterface.py:798 +msgid "Execute command: " +msgstr "" -#: pronterface.py:659 +#: pronterface.py:809 +#, fuzzy +msgid "click to add new custom button" +msgstr "Definieer eigen knop." + +#: pronterface.py:828 +msgid "" +"Defines custom button. Usage: button \"title\" [/c \"colour\"] command" +msgstr "" +"Definieert eigen knop. Gebruik: knop \"titel\" [/c \"kleur\"] commando" + +#: pronterface.py:850 msgid "Custom button number should be between 0 and 63" msgstr "Knopnummer moet tussen 0 en 63 zijn" -#: pronterface.py:749 -#, python-format +#: pronterface.py:942 msgid "Edit custom button '%s'" msgstr "Wijzig gedefineerde knop '%s'" -#: pronterface.py:751 +#: pronterface.py:944 msgid "Move left <<" msgstr "Verplaats links <<" -#: pronterface.py:754 +#: pronterface.py:947 msgid "Move right >>" msgstr "Verplaats rechts >>" -#: pronterface.py:758 -#, python-format +#: pronterface.py:951 msgid "Remove custom button '%s'" msgstr "Verwijder gedefinieerde knop '%s'" -#: pronterface.py:761 +#: pronterface.py:954 msgid "Add custom button" msgstr "Definieer eigen knop." -#: pronterface.py:776 +#: pronterface.py:1099 msgid "event object missing" msgstr "vermist object" -#: pronterface.py:804 +#: pronterface.py:1127 msgid "Invalid period given." msgstr "Foute gegevens ingevoerd" -#: pronterface.py:807 +#: pronterface.py:1130 msgid "Monitoring printer." msgstr "Printercommunicatie wordt gevolgd." -#: pronterface.py:809 +#: pronterface.py:1132 msgid "Done monitoring." msgstr "Klaar met volgen." -#: pronterface.py:828 +#: pronterface.py:1154 msgid "Printer is online. " msgstr "Printer is verbonden. " -#: pronterface.py:830 -#: pronterface.py:969 -#: pronterface.py:1019 +#: pronterface.py:1156 pronterface.py:1331 msgid "Loaded " -msgstr "Geladen" +msgstr "Geladen " -#: pronterface.py:833 -msgid "Hotend" -msgstr "Element" - -#: pronterface.py:833 +#: pronterface.py:1159 msgid "Bed" msgstr "Bed" -#: pronterface.py:836 -#, python-format +#: pronterface.py:1159 +msgid "Hotend" +msgstr "Element" + +#: pronterface.py:1169 msgid " SD printing:%04.2f %%" msgstr " SD printen:%04.2f %%" -#: pronterface.py:838 -#, python-format -msgid " Printing:%04.2f %%" -msgstr " Printen:%04.2f %%" +#: pronterface.py:1172 +msgid " Printing:%04.2f %% |" +msgstr " Printen:%04.2f %% |" -#: pronterface.py:892 +#: pronterface.py:1173 +msgid " Line# %d of %d lines |" +msgstr "" + +#: pronterface.py:1178 +msgid " Est: %s of %s remaining | " +msgstr "" + +#: pronterface.py:1180 +msgid " Z: %0.2f mm" +msgstr " Z: %0.2f mm" + +#: pronterface.py:1247 msgid "Opening file failed." msgstr "Bestand openen mislukt" -#: pronterface.py:898 +#: pronterface.py:1253 msgid "Starting print" msgstr "Start het printen" -#: pronterface.py:921 -msgid "Select the file to print" -msgstr "Kies het te printen bestand" - -#: pronterface.py:921 +#: pronterface.py:1276 msgid "Pick SD file" msgstr "Kies bestand op SD" -#: pronterface.py:949 -msgid "Skeinforge execution failed." -msgstr "Skeinforge was niet succesvol." +#: pronterface.py:1276 +msgid "Select the file to print" +msgstr "Kies het te printen bestand" -#: pronterface.py:956 -msgid "Skeining..." +#: pronterface.py:1311 +msgid "Failed to execute slicing software: " +msgstr "" + +#: pronterface.py:1318 +#, fuzzy +msgid "Slicing..." msgstr "Skeinforge draait..." -#: pronterface.py:969 -#: pronterface.py:1019 -#, python-format +#: pronterface.py:1331 msgid ", %d lines" -msgstr ",%d regels" +msgstr ", %d regels" -#: pronterface.py:978 -msgid "Skeining " +#: pronterface.py:1338 +#, fuzzy +msgid "Load File" +msgstr "open bestand" + +#: pronterface.py:1345 +#, fuzzy +msgid "Slicing " msgstr "Skeinforge draait" -#: pronterface.py:980 -msgid "" -"Skeinforge not found. \n" -"Please copy Skeinforge into a directory named \"skeinforge\" in the same directory as this file." -msgstr "" -"Skeinforge niet gevonden.\n" -"Plaats Skeinforge in een map met de naam \"skeinforge\" in dezelfde map als dit bestand." - -#: pronterface.py:999 +#: pronterface.py:1364 msgid "Open file to print" msgstr "Open het te printen bestand" -#: pronterface.py:1000 -msgid "STL and GCODE files (;*.gcode;*.g;*.stl;*.STL;)" +#: pronterface.py:1365 +#, fuzzy +msgid "OBJ, STL, and GCODE files (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" msgstr "STL en GCODE bestanden (;*.gcode;*.g;*.stl;*.STL;)" -#: pronterface.py:1007 +#: pronterface.py:1372 msgid "File not found!" msgstr "Bestand niet gevonden!" -#: pronterface.py:1029 -#, fuzzy +#: pronterface.py:1386 +msgid "Loaded %s, %d lines" +msgstr "Geladen %s, %d regels" + +#: pronterface.py:1396 msgid "mm of filament used in this print\n" -msgstr "mm fillament wordt gebruikt in deze print" +msgstr "mm fillament wordt gebruikt in deze print\n" -#: pronterface.py:1030 -#: pronterface.py:1031 -#: pronterface.py:1032 -msgid "the print goes from" -msgstr "" - -#: pronterface.py:1030 -#: pronterface.py:1031 -#: pronterface.py:1032 -msgid "mm to" -msgstr "" - -#: pronterface.py:1030 +#: pronterface.py:1397 msgid "" -"mm in X\n" -"and is" +"the print goes from %f mm to %f mm in X\n" +"and is %f mm wide\n" msgstr "" -#: pronterface.py:1030 -#: pronterface.py:1031 -msgid "mm wide\n" -msgstr "" - -#: pronterface.py:1031 +#: pronterface.py:1398 msgid "" -"mm in Y\n" -"and is" +"the print goes from %f mm to %f mm in Y\n" +"and is %f mm wide\n" msgstr "" -#: pronterface.py:1032 +#: pronterface.py:1399 msgid "" -"mm in Z\n" -"and is" +"the print goes from %f mm to %f mm in Z\n" +"and is %f mm high\n" msgstr "" -#: pronterface.py:1032 -msgid "mm high\n" +#: pronterface.py:1400 +msgid "Estimated duration (pessimistic): " msgstr "" -#: pronterface.py:1052 +#: pronterface.py:1424 msgid "No file loaded. Please use load first." msgstr "Geen bestand geladen. Eerst bestand inladen." -#: pronterface.py:1063 +#: pronterface.py:1435 msgid "Restart" msgstr "Herstart" -#: pronterface.py:1067 +#: pronterface.py:1439 msgid "File upload complete" msgstr "Bestandsupload voltooid" -#: pronterface.py:1086 +#: pronterface.py:1458 msgid "Pick SD filename" msgstr "Kies bestandsnaam op SD" -#: pronterface.py:1102 +#: pronterface.py:1466 +#, fuzzy +msgid "Paused." +msgstr "Pauze" + +#: pronterface.py:1476 msgid "Resume" msgstr "Hervat" -#: pronterface.py:1168 +#: pronterface.py:1492 +#, fuzzy +msgid "Connecting..." +msgstr "Verbind" + +#: pronterface.py:1523 +#, fuzzy +msgid "Disconnected." +msgstr "Ontkoppel" + +#: pronterface.py:1550 +#, fuzzy +msgid "Reset." +msgstr "Reset" + +#: pronterface.py:1551 msgid "Are you sure you want to reset the printer?" msgstr "Weet je zeker dat je de printer wilt resetten?" -#: pronterface.py:1168 +#: pronterface.py:1551 msgid "Reset?" msgstr "resetten?" -#: pronterface.py:1193 +#: pronterface.py:1597 msgid "Save" msgstr "" -#: pronterface.py:1248 +#: pronterface.py:1653 msgid "Edit settings" msgstr "Wijzig instellingen" -#: pronterface.py:1250 +#: pronterface.py:1655 msgid "Defaults" msgstr "Standaardinstelling" -#: pronterface.py:1272 +#: pronterface.py:1684 msgid "Custom button" msgstr "Gedefinieerde knop" -#: pronterface.py:1280 +#: pronterface.py:1689 msgid "Button title" msgstr "Knoptitel" -#: pronterface.py:1283 +#: pronterface.py:1692 msgid "Command" msgstr "Commando" -#: pronterface.py:1292 +#: pronterface.py:1701 msgid "Color" msgstr "Kleur" +#~ msgid "X+100" +#~ msgstr "X+100" + +#~ msgid "X+10" +#~ msgstr "X+10" + +#~ msgid "X+1" +#~ msgstr "X+1" + +#~ msgid "X+0.1" +#~ msgstr "X+0.1" + +#~ msgid "HomeX" +#~ msgstr "0-puntX" + +#~ msgid "X-0.1" +#~ msgstr "X-0.1" + +#~ msgid "X-1" +#~ msgstr "X-1" + +#~ msgid "X-10" +#~ msgstr "X-10" + +#~ msgid "X-100" +#~ msgstr "X-100" + +#~ msgid "Y+100" +#~ msgstr "Y+100" + +#~ msgid "Y+10" +#~ msgstr "Y+10" + +#~ msgid "Y+1" +#~ msgstr "Y+1" + +#~ msgid "Y+0.1" +#~ msgstr "Y+0.1" + +#~ msgid "HomeY" +#~ msgstr "0-puntY" + +#~ msgid "Y-0.1" +#~ msgstr "Y-0.1" + +#~ msgid "Y-1" +#~ msgstr "Y-1" + +#~ msgid "Y-10" +#~ msgstr "Y-10" + +#~ msgid "Y-100" +#~ msgstr "Y-100" + +#~ msgid "Z+10" +#~ msgstr "Z+10" + +#~ msgid "Z+1" +#~ msgstr "Z+1" + +#~ msgid "Z+0.1" +#~ msgstr "Z+0.1" + +#~ msgid "HomeZ" +#~ msgstr "0-puntZ" + +#~ msgid "Z-0.1" +#~ msgstr "Z-0.1" + +#~ msgid "Z-1" +#~ msgstr "Z-1" + +#~ msgid "Z-10" +#~ msgstr "Z-10" + +#~ msgid "Home" +#~ msgstr "0-punt" + +#~ msgid " degrees Celsius." +#~ msgstr " graden Celsius." + +#~ msgid "SFACT Quick Settings" +#~ msgstr "SFACT Snelinstelling" + +#~ msgid " Quickly adjust SFACT settings for active profile" +#~ msgstr " Eenvoudig SFACT's huidige profiel instellen" + +#~ msgid "Name '" +#~ msgstr "Naam '" + +#~ msgid "Skeinforge execution failed." +#~ msgstr "Skeinforge was niet succesvol." + +#~ msgid "" +#~ "Skeinforge not found. \n" +#~ "Please copy Skeinforge into a directory named \"skeinforge\" in the same " +#~ "directory as this file." +#~ msgstr "" +#~ "Skeinforge niet gevonden.\n" +#~ "Plaats Skeinforge in een map met de naam \"skeinforge\" in dezelfde map " +#~ "als dit bestand." + #~ msgid "&Print" #~ msgstr "&Printen" diff --git a/locale/nl/LC_MESSAGES/pronterface.mo b/locale/nl/LC_MESSAGES/pronterface.mo index dc2606e..9198c7e 100644 Binary files a/locale/nl/LC_MESSAGES/pronterface.mo and b/locale/nl/LC_MESSAGES/pronterface.mo differ diff --git a/locale/plater.pot b/locale/plater.pot index c4daabd..2db698d 100644 --- a/locale/plater.pot +++ b/locale/plater.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2012-01-09 15:07+CET\n" +"POT-Creation-Date: 2012-02-26 02:40+CET\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -15,79 +15,79 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" -#: plater.py:223 +#: plater.py:247 msgid "Plate building tool" msgstr "" -#: plater.py:229 +#: plater.py:253 msgid "Clear" msgstr "" -#: plater.py:230 +#: plater.py:254 msgid "Load" msgstr "" -#: plater.py:232 +#: plater.py:256 msgid "Export" msgstr "" -#: plater.py:235 +#: plater.py:259 msgid "Done" msgstr "" -#: plater.py:237 +#: plater.py:261 msgid "Cancel" msgstr "" -#: plater.py:239 +#: plater.py:263 msgid "Snap to Z = 0" msgstr "" -#: plater.py:240 +#: plater.py:264 msgid "Put at 100, 100" msgstr "" -#: plater.py:241 +#: plater.py:265 msgid "Delete" msgstr "" -#: plater.py:242 +#: plater.py:266 msgid "Auto" msgstr "" -#: plater.py:266 +#: plater.py:290 msgid "Autoplating" msgstr "" -#: plater.py:294 +#: plater.py:318 msgid "Bed full, sorry sir :(" msgstr "" -#: plater.py:304 +#: plater.py:328 msgid "Are you sure you want to clear the grid? All unsaved changes will be lost." msgstr "" -#: plater.py:304 +#: plater.py:328 msgid "Clear the grid?" msgstr "" -#: plater.py:346 +#: plater.py:370 msgid "Pick file to save to" msgstr "" -#: plater.py:347 -msgid "STL files (;*.stl;)" +#: plater.py:371 +msgid "STL files (;*.stl;*.STL;)" msgstr "" -#: plater.py:367 -msgid "wrote " +#: plater.py:391 +msgid "wrote %s" msgstr "" -#: plater.py:370 +#: plater.py:394 msgid "Pick file to load" msgstr "" -#: plater.py:371 -msgid "STL files (;*.stl;)|*.stl|OpenSCAD files (;*.scad;)|*.scad" +#: plater.py:395 +msgid "STL files (;*.stl;*.STL;)|*.stl|OpenSCAD files (;*.scad;)|*.scad" msgstr "" diff --git a/locale/pronterface.pot b/locale/pronterface.pot index 3429d9a..7f3ab68 100644 --- a/locale/pronterface.pot +++ b/locale/pronterface.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2012-01-19 09:21+CET\n" +"POT-Creation-Date: 2012-03-16 03:48+CET\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -15,61 +15,11 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" -#: pronsole.py:250 -msgid "Communications Speed (default: 115200)" -msgstr "" - -#: pronsole.py:251 -msgid "Heated Build Platform temp for ABS (default: 110 deg C)" -msgstr "" - -#: pronsole.py:252 -msgid "Heated Build Platform temp for PLA (default: 60 deg C)" -msgstr "" - -#: pronsole.py:253 -msgid "Feedrate for Control Panel Moves in Extrusions (default: 300mm/min)" -msgstr "" - -#: pronsole.py:254 -msgid "Port used to communicate with printer" -msgstr "" - -#: pronsole.py:255 -msgid "" -"Slice command\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py $s)" -msgstr "" - -#: pronsole.py:256 -msgid "" -"Slice settings command\n" -" default:\n" -" python skeinforge/skeinforge_application/skeinforge.py" -msgstr "" - -#: pronsole.py:257 -msgid "Extruder temp for ABS (default: 230 deg C)" -msgstr "" - -#: pronsole.py:258 -msgid "Extruder temp for PLA (default: 185 deg C)" -msgstr "" - -#: pronsole.py:259 -msgid "Feedrate for Control Panel Moves in X and Y (default: 3000mm/min)" -msgstr "" - -#: pronsole.py:260 -msgid "Feedrate for Control Panel Moves in Z (default: 200mm/min)" -msgstr "" - -#: pronterface.py:15 +#: pronterface.py:30 msgid "WX is not installed. This program requires WX to run." msgstr "" -#: pronterface.py:66 +#: pronterface.py:81 msgid "" "Dimensions of Build Platform\n" " & optional offset of origin\n" @@ -80,575 +30,545 @@ msgid "" " XXXxYYYxZZZ+OffX+OffY+OffZ" msgstr "" -#: pronterface.py:67 +#: pronterface.py:82 msgid "Last Set Temperature for the Heated Print Bed" msgstr "" -#: pronterface.py:68 +#: pronterface.py:83 msgid "Folder of last opened file" msgstr "" -#: pronterface.py:69 +#: pronterface.py:84 msgid "Last Temperature of the Hot End" msgstr "" -#: pronterface.py:70 +#: pronterface.py:85 msgid "Width of Extrusion in Preview (default: 0.5)" msgstr "" -#: pronterface.py:71 +#: pronterface.py:86 msgid "Fine Grid Spacing (default: 10)" msgstr "" -#: pronterface.py:72 +#: pronterface.py:87 msgid "Coarse Grid Spacing (default: 50)" msgstr "" -#: pronterface.py:73 +#: pronterface.py:88 msgid "Pronterface background color (default: #FFFFFF)" msgstr "" -#: pronterface.py:76 +#: pronterface.py:91 msgid "Printer Interface" msgstr "" -#: pronterface.py:93 +#: pronterface.py:109 msgid "Motors off" msgstr "" -#: pronterface.py:94 +#: pronterface.py:110 msgid "Check temp" msgstr "" -#: pronterface.py:95 +#: pronterface.py:111 msgid "Extrude" msgstr "" -#: pronterface.py:96 +#: pronterface.py:112 msgid "Reverse" msgstr "" -#: pronterface.py:114 +#: pronterface.py:130 msgid "" "# I moved all your custom buttons into .pronsolerc.\n" "# Please don't add them here any more.\n" "# Backup of your old buttons is in custombtn.old\n" msgstr "" -#: pronterface.py:119 +#: pronterface.py:135 msgid "Note!!! You have specified custom buttons in both custombtn.txt and .pronsolerc" msgstr "" -#: pronterface.py:120 +#: pronterface.py:136 msgid "Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt" msgstr "" -#: pronterface.py:148 pronterface.py:499 pronterface.py:1319 -#: pronterface.py:1373 pronterface.py:1495 pronterface.py:1529 -#: pronterface.py:1544 +#: pronterface.py:165 pronterface.py:520 pronterface.py:1343 +#: pronterface.py:1397 pronterface.py:1521 pronterface.py:1555 +#: pronterface.py:1567 msgid "Print" msgstr "" -#: pronterface.py:152 +#: pronterface.py:169 msgid "Printer is now online." msgstr "" -#: pronterface.py:212 -msgid "Setting hotend temperature to " +#: pronterface.py:170 +msgid "Disconnect" msgstr "" -#: pronterface.py:212 pronterface.py:248 -msgid " degrees Celsius." +#: pronterface.py:229 +msgid "Setting hotend temperature to %f degrees Celsius." msgstr "" -#: pronterface.py:231 pronterface.py:267 pronterface.py:325 +#: pronterface.py:248 pronterface.py:284 pronterface.py:346 msgid "Printer is not online." msgstr "" -#: pronterface.py:233 +#: pronterface.py:250 msgid "You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0." msgstr "" -#: pronterface.py:248 -msgid "Setting bed temperature to " +#: pronterface.py:252 +msgid "You must enter a temperature. (%s)" msgstr "" -#: pronterface.py:269 -msgid "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0." -msgstr "" - -#: pronterface.py:271 -msgid "You must enter a temperature." +#: pronterface.py:265 +msgid "Setting bed temperature to %f degrees Celsius." msgstr "" #: pronterface.py:286 +msgid "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0." +msgstr "" + +#: pronterface.py:288 +msgid "You must enter a temperature." +msgstr "" + +#: pronterface.py:303 msgid "Do you want to erase the macro?" msgstr "" -#: pronterface.py:290 +#: pronterface.py:307 msgid "Cancelled." msgstr "" -#: pronterface.py:331 +#: pronterface.py:352 msgid " Opens file" msgstr "" -#: pronterface.py:331 +#: pronterface.py:352 msgid "&Open..." msgstr "" -#: pronterface.py:332 +#: pronterface.py:353 msgid " Edit open file" msgstr "" -#: pronterface.py:332 +#: pronterface.py:353 msgid "&Edit..." msgstr "" -#: pronterface.py:333 +#: pronterface.py:354 msgid " Clear output console" msgstr "" -#: pronterface.py:333 +#: pronterface.py:354 msgid "Clear console" msgstr "" -#: pronterface.py:334 +#: pronterface.py:355 msgid " Project slices" msgstr "" -#: pronterface.py:334 +#: pronterface.py:355 msgid "Projector" msgstr "" -#: pronterface.py:335 +#: pronterface.py:356 msgid " Closes the Window" msgstr "" -#: pronterface.py:335 +#: pronterface.py:356 msgid "E&xit" msgstr "" -#: pronterface.py:336 +#: pronterface.py:357 msgid "&File" msgstr "" -#: pronterface.py:341 +#: pronterface.py:362 msgid "&Macros" msgstr "" -#: pronterface.py:342 +#: pronterface.py:363 msgid "<&New...>" msgstr "" -#: pronterface.py:343 +#: pronterface.py:364 msgid " Options dialog" msgstr "" -#: pronterface.py:343 +#: pronterface.py:364 msgid "&Options" msgstr "" -#: pronterface.py:345 +#: pronterface.py:366 msgid " Adjust slicing settings" msgstr "" -#: pronterface.py:345 +#: pronterface.py:366 msgid "Slicing Settings" msgstr "" -#: pronterface.py:352 +#: pronterface.py:373 msgid "&Settings" msgstr "" -#: pronterface.py:368 +#: pronterface.py:389 msgid "Enter macro name" msgstr "" -#: pronterface.py:371 +#: pronterface.py:392 msgid "Macro name:" msgstr "" -#: pronterface.py:374 +#: pronterface.py:395 msgid "Ok" msgstr "" -#: pronterface.py:378 pronterface.py:1330 pronterface.py:1587 +#: pronterface.py:399 pronterface.py:1354 pronterface.py:1613 msgid "Cancel" msgstr "" -#: pronterface.py:396 -msgid "' is being used by built-in command" +#: pronterface.py:417 +msgid "Name '%s' is being used by built-in command" msgstr "" -#: pronterface.py:396 -msgid "Name '" -msgstr "" - -#: pronterface.py:399 +#: pronterface.py:420 msgid "Macro name may contain only alphanumeric symbols and underscores" msgstr "" -#: pronterface.py:448 +#: pronterface.py:469 msgid "Port" msgstr "" -#: pronterface.py:467 +#: pronterface.py:488 msgid "Connect" msgstr "" -#: pronterface.py:469 +#: pronterface.py:490 msgid "Connect to the printer" msgstr "" -#: pronterface.py:471 +#: pronterface.py:492 msgid "Reset" msgstr "" -#: pronterface.py:474 pronterface.py:751 +#: pronterface.py:495 pronterface.py:772 msgid "Mini mode" msgstr "" -#: pronterface.py:478 +#: pronterface.py:499 msgid "Monitor Printer" msgstr "" -#: pronterface.py:488 +#: pronterface.py:509 msgid "Load file" msgstr "" -#: pronterface.py:491 +#: pronterface.py:512 msgid "Compose" msgstr "" -#: pronterface.py:495 +#: pronterface.py:516 msgid "SD" msgstr "" -#: pronterface.py:503 pronterface.py:1374 pronterface.py:1419 -#: pronterface.py:1469 pronterface.py:1494 pronterface.py:1528 -#: pronterface.py:1543 +#: pronterface.py:524 pronterface.py:1398 pronterface.py:1444 +#: pronterface.py:1495 pronterface.py:1520 pronterface.py:1554 +#: pronterface.py:1570 msgid "Pause" msgstr "" -#: pronterface.py:516 +#: pronterface.py:537 msgid "Send" msgstr "" -#: pronterface.py:524 pronterface.py:625 +#: pronterface.py:545 pronterface.py:646 msgid "mm/min" msgstr "" -#: pronterface.py:526 +#: pronterface.py:547 msgid "XY:" msgstr "" -#: pronterface.py:528 +#: pronterface.py:549 msgid "Z:" msgstr "" -#: pronterface.py:551 pronterface.py:632 +#: pronterface.py:572 pronterface.py:653 msgid "Heater:" msgstr "" -#: pronterface.py:554 pronterface.py:574 +#: pronterface.py:575 pronterface.py:595 msgid "Off" msgstr "" -#: pronterface.py:566 pronterface.py:586 +#: pronterface.py:587 pronterface.py:607 msgid "Set" msgstr "" -#: pronterface.py:571 pronterface.py:634 +#: pronterface.py:592 pronterface.py:655 msgid "Bed:" msgstr "" -#: pronterface.py:619 +#: pronterface.py:640 msgid "mm" msgstr "" -#: pronterface.py:677 pronterface.py:1182 pronterface.py:1413 +#: pronterface.py:698 pronterface.py:1206 pronterface.py:1438 msgid "Not connected to printer." msgstr "" -#: pronterface.py:706 +#: pronterface.py:727 msgid "SD Upload" msgstr "" -#: pronterface.py:710 +#: pronterface.py:731 msgid "SD Print" msgstr "" -#: pronterface.py:758 +#: pronterface.py:779 msgid "Full mode" msgstr "" -#: pronterface.py:783 +#: pronterface.py:804 msgid "Execute command: " msgstr "" -#: pronterface.py:794 +#: pronterface.py:815 msgid "click to add new custom button" msgstr "" -#: pronterface.py:813 +#: pronterface.py:834 msgid "Defines custom button. Usage: button \"title\" [/c \"colour\"] command" msgstr "" -#: pronterface.py:835 +#: pronterface.py:856 msgid "Custom button number should be between 0 and 63" msgstr "" -#: pronterface.py:927 +#: pronterface.py:948 msgid "Edit custom button '%s'" msgstr "" -#: pronterface.py:929 +#: pronterface.py:950 msgid "Move left <<" msgstr "" -#: pronterface.py:932 +#: pronterface.py:953 msgid "Move right >>" msgstr "" -#: pronterface.py:936 +#: pronterface.py:957 msgid "Remove custom button '%s'" msgstr "" -#: pronterface.py:939 +#: pronterface.py:960 msgid "Add custom button" msgstr "" -#: pronterface.py:1084 +#: pronterface.py:1105 msgid "event object missing" msgstr "" -#: pronterface.py:1112 +#: pronterface.py:1133 msgid "Invalid period given." msgstr "" -#: pronterface.py:1115 +#: pronterface.py:1136 msgid "Monitoring printer." msgstr "" -#: pronterface.py:1117 +#: pronterface.py:1138 msgid "Done monitoring." msgstr "" -#: pronterface.py:1139 +#: pronterface.py:1160 msgid "Printer is online. " msgstr "" -#: pronterface.py:1141 pronterface.py:1317 pronterface.py:1372 +#: pronterface.py:1162 pronterface.py:1341 msgid "Loaded " msgstr "" -#: pronterface.py:1144 +#: pronterface.py:1165 msgid "Bed" msgstr "" -#: pronterface.py:1144 +#: pronterface.py:1165 msgid "Hotend" msgstr "" -#: pronterface.py:1154 +#: pronterface.py:1175 msgid " SD printing:%04.2f %%" msgstr "" -#: pronterface.py:1157 +#: pronterface.py:1178 msgid " Printing:%04.2f %% |" msgstr "" -#: pronterface.py:1158 -msgid " Line# " +#: pronterface.py:1179 +msgid " Line# %d of %d lines |" msgstr "" -#: pronterface.py:1158 -msgid " lines |" +#: pronterface.py:1184 +msgid " Est: %s of %s remaining | " msgstr "" -#: pronterface.py:1158 -msgid "of " -msgstr "" - -#: pronterface.py:1163 -msgid " Est: " -msgstr "" - -#: pronterface.py:1164 -msgid " of: " -msgstr "" - -#: pronterface.py:1165 -msgid " Remaining | " -msgstr "" - -#: pronterface.py:1166 +#: pronterface.py:1186 msgid " Z: %0.2f mm" msgstr "" -#: pronterface.py:1233 +#: pronterface.py:1257 msgid "Opening file failed." msgstr "" -#: pronterface.py:1239 +#: pronterface.py:1263 msgid "Starting print" msgstr "" -#: pronterface.py:1262 +#: pronterface.py:1286 msgid "Pick SD file" msgstr "" -#: pronterface.py:1262 +#: pronterface.py:1286 msgid "Select the file to print" msgstr "" -#: pronterface.py:1297 +#: pronterface.py:1321 msgid "Failed to execute slicing software: " msgstr "" -#: pronterface.py:1304 +#: pronterface.py:1328 msgid "Slicing..." msgstr "" -#: pronterface.py:1317 pronterface.py:1372 +#: pronterface.py:1341 msgid ", %d lines" msgstr "" -#: pronterface.py:1324 +#: pronterface.py:1348 msgid "Load File" msgstr "" -#: pronterface.py:1331 +#: pronterface.py:1355 msgid "Slicing " msgstr "" -#: pronterface.py:1350 +#: pronterface.py:1374 msgid "Open file to print" msgstr "" -#: pronterface.py:1351 -msgid "OBJ, STL, and GCODE files (;*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ;)" -msgstr "" - -#: pronterface.py:1358 -msgid "File not found!" +#: pronterface.py:1375 +msgid "OBJ, STL, and GCODE files (*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ)|*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ|All Files (*.*)|*.*" msgstr "" #: pronterface.py:1382 +msgid "File not found!" +msgstr "" + +#: pronterface.py:1396 +msgid "Loaded %s, %d lines" +msgstr "" + +#: pronterface.py:1406 msgid "" "mm of filament used in this print\n" msgstr "" -#: pronterface.py:1383 +#: pronterface.py:1407 msgid "" -"mm in X\n" -"and is" +"the print goes from %f mm to %f mm in X\n" +"and is %f mm wide\n" msgstr "" -#: pronterface.py:1383 pronterface.py:1384 +#: pronterface.py:1408 msgid "" -"mm wide\n" +"the print goes from %f mm to %f mm in Y\n" +"and is %f mm wide\n" msgstr "" -#: pronterface.py:1383 pronterface.py:1384 pronterface.py:1385 -msgid "mm to" -msgstr "" - -#: pronterface.py:1383 pronterface.py:1384 pronterface.py:1385 -msgid "the print goes from" -msgstr "" - -#: pronterface.py:1384 +#: pronterface.py:1409 msgid "" -"mm in Y\n" -"and is" -msgstr "" - -#: pronterface.py:1385 -msgid "" -"mm high\n" -msgstr "" - -#: pronterface.py:1385 -msgid "" -"mm in Z\n" -"and is" -msgstr "" - -#: pronterface.py:1386 -msgid "Estimated duration (pessimistic): " +"the print goes from %f mm to %f mm in Z\n" +"and is %f mm high\n" msgstr "" #: pronterface.py:1410 +msgid "Estimated duration (pessimistic): " +msgstr "" + +#: pronterface.py:1435 msgid "No file loaded. Please use load first." msgstr "" -#: pronterface.py:1421 +#: pronterface.py:1446 msgid "Restart" msgstr "" -#: pronterface.py:1425 +#: pronterface.py:1450 msgid "File upload complete" msgstr "" -#: pronterface.py:1444 +#: pronterface.py:1469 msgid "Pick SD filename" msgstr "" -#: pronterface.py:1452 +#: pronterface.py:1477 msgid "Paused." msgstr "" -#: pronterface.py:1462 +#: pronterface.py:1488 msgid "Resume" msgstr "" -#: pronterface.py:1478 +#: pronterface.py:1504 msgid "Connecting..." msgstr "" -#: pronterface.py:1509 +#: pronterface.py:1535 msgid "Disconnected." msgstr "" -#: pronterface.py:1536 +#: pronterface.py:1562 msgid "Reset." msgstr "" -#: pronterface.py:1537 +#: pronterface.py:1563 msgid "Are you sure you want to reset the printer?" msgstr "" -#: pronterface.py:1537 +#: pronterface.py:1563 msgid "Reset?" msgstr "" -#: pronterface.py:1583 +#: pronterface.py:1609 msgid "Save" msgstr "" -#: pronterface.py:1639 +#: pronterface.py:1665 msgid "Edit settings" msgstr "" -#: pronterface.py:1641 +#: pronterface.py:1667 msgid "Defaults" msgstr "" -#: pronterface.py:1670 +#: pronterface.py:1696 msgid "Custom button" msgstr "" -#: pronterface.py:1675 +#: pronterface.py:1701 msgid "Button title" msgstr "" -#: pronterface.py:1678 +#: pronterface.py:1704 msgid "Command" msgstr "" -#: pronterface.py:1687 +#: pronterface.py:1713 msgid "Color" msgstr "" diff --git a/plater.py b/plater.py index 28f4e5a..dc7d72a 100755 --- a/plater.py +++ b/plater.py @@ -256,8 +256,10 @@ class stlwin(wx.Frame): self.eb = wx.Button(self.panel, label=_("Export"), pos=(100, 0)) self.eb.Bind(wx.EVT_BUTTON, self.export) else: - self.eb = wx.Button(self.panel, label=_("Done"), pos=(100, 0)) - self.eb.Bind(wx.EVT_BUTTON, lambda e: self.done(e, callback)) + self.eb = wx.Button(self.panel, label=_("Export"), pos=(200, 205)) + self.eb.Bind(wx.EVT_BUTTON, self.export) + self.edb = wx.Button(self.panel, label=_("Done"), pos=(100, 0)) + self.edb.Bind(wx.EVT_BUTTON, lambda e: self.done(e, callback)) self.eb = wx.Button(self.panel, label=_("Cancel"), pos=(200, 0)) self.eb.Bind(wx.EVT_BUTTON, lambda e: self.Destroy()) self.sb = wx.Button(self.panel, label=_("Snap to Z = 0"), pos=(00, 255)) @@ -388,7 +390,7 @@ class stlwin(wx.Frame): facets += i.facets sf.close() stltool.emitstl(name, facets, "plater_export") - print _("wrote "), name + print _("wrote %s") % name def right(self, event): dlg = wx.FileDialog(self, _("Pick file to load"), self.basedir, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) diff --git a/printcore.py b/printcore.py index cadbc0e..f021c52 100755 --- a/printcore.py +++ b/printcore.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with Printrun. If not, see . -from serial import Serial +from serial import Serial, SerialException from threading import Thread from select import error as SelectError import time, getopt, sys @@ -47,6 +47,7 @@ class printcore(): self.endcb=None#impl () self.onlinecb=None#impl () self.loud=False#emit sent and received lines to terminal + self.greetings=['start','Grbl '] if port is not None and baud is not None: #print port, baud self.connect(port, baud) @@ -100,6 +101,12 @@ class printcore(): break else: raise + except SerialException, e: + print "Can't read from printer (disconnected?)." + break + except OSError, e: + print "Can't read from printer (disconnected?)." + break if(len(line)>1): self.log+=[line] @@ -112,10 +119,10 @@ class printcore(): print "RECV: ",line.rstrip() if(line.startswith('DEBUG_')): continue - if(line.startswith('start') or line.startswith('ok')): + if(line.startswith(tuple(self.greetings)) or line.startswith('ok')): self.clear=True - if(line.startswith('start') or line.startswith('ok') or "T:" in line): - if (not self.online or line.startswith('start')) and self.onlinecb is not None: + if(line.startswith(tuple(self.greetings)) or line.startswith('ok') or "T:" in line): + if (not self.online or line.startswith(tuple(self.greetings))) and self.onlinecb is not None: try: self.onlinecb() except: @@ -279,7 +286,10 @@ class printcore(): self.sendcb(command) except: pass - self.printer.write(str(command+"\n")) + try: + self.printer.write(str(command+"\n")) + except SerialException, e: + print "Can't write to printer (disconnected?)." if __name__ == '__main__': baud = 115200 diff --git a/projectlayer.py b/projectlayer.py index e50ce8b..4db5f85 100644 --- a/projectlayer.py +++ b/projectlayer.py @@ -37,6 +37,13 @@ class dispframe(wx.Frame): self.p=printer self.pic=wx.StaticBitmap(self) self.bitmap=wx.EmptyBitmap(*res) + self.bbitmap=wx.EmptyBitmap(*res) + dc=wx.MemoryDC() + dc.SelectObject(self.bbitmap) + dc.SetBackground(wx.Brush("black")) + dc.Clear() + dc.SelectObject(wx.NullBitmap) + self.SetBackgroundColour("black") self.pic.Hide() self.pen=wx.Pen("white") @@ -61,20 +68,33 @@ class dispframe(wx.Frame): self.pic.SetBitmap(self.bitmap) self.pic.Show() self.Refresh() + + #self.pic.SetBitmap(self.bitmap) + except: + raise pass - def nextimg(self,event): - if self.index. @@ -21,7 +21,7 @@ import os, gettext, Queue, re if os.path.exists('/usr/share/pronterface/locale'): gettext.install('pronterface', '/usr/share/pronterface/locale', unicode=1) -else: +else: gettext.install('pronterface', './locale', unicode=1) try: @@ -35,7 +35,7 @@ try: except: pass StringIO=cStringIO - + thread=threading.Thread winsize=(800,500) if os.name=="nt": @@ -48,6 +48,7 @@ if os.name=="nt": from xybuttons import XYButtons from zbuttons import ZButtons +from graph import Graph import pronsole def dosify(name): @@ -93,7 +94,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.panel=wx.Panel(self,-1,size=size) self.statuscheck=False - self.capture_skip=[] + self.capture_skip={} + self.capture_skip_newline=False self.tempreport="" self.monitor=0 self.f=None @@ -118,7 +120,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): customdict={} try: execfile("custombtn.txt",customdict) - if len(customdict["btns"]): + if len(customdict["btns"]): if not len(self.custombuttons): try: self.custombuttons = customdict["btns"] @@ -133,7 +135,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): else: print _("Note!!! You have specified custom buttons in both custombtn.txt and .pronsolerc") print _("Ignoring custombtn.txt. Remove all current buttons to revert to custombtn.txt") - + except: pass self.popmenu() @@ -146,26 +148,27 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.p.startcb=self.startcb self.p.endcb=self.endcb self.starttime=0 + self.extra_print_time=0 self.curlayer=0 self.cur_button=None self.hsetpoint=0.0 self.bsetpoint=0.0 - + def startcb(self): self.starttime=time.time() print "Print Started at: " +time.strftime('%H:%M:%S',time.localtime(self.starttime)) - + def endcb(self): if(self.p.queueindex==0): print "Print ended at: " +time.strftime('%H:%M:%S',time.localtime(time.time())) - print "and took: "+time.strftime('%H:%M:%S', time.gmtime(int(time.time()-self.starttime))) #+str(int(time.time()-self.starttime)/60)+" minutes "+str(int(time.time()-self.starttime)%60)+" seconds." + print "and took: "+time.strftime('%H:%M:%S', time.gmtime(int(time.time()-self.starttime+self.extra_print_time))) #+str(int(time.time()-self.starttime)/60)+" minutes "+str(int(time.time()-self.starttime)%60)+" seconds." wx.CallAfter(self.pausebtn.Disable) wx.CallAfter(self.printbtn.SetLabel,_("Print")) - - + + def online(self): print _("Printer is now online.") - self.connectbtn.SetLabel("Disconnect") + self.connectbtn.SetLabel(_("Disconnect")) self.connectbtn.Bind(wx.EVT_BUTTON,self.disconnect) for i in self.printerControls: @@ -177,8 +180,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if self.filename: wx.CallAfter(self.printbtn.Enable) - - + + def sentcb(self,line): if("G1" in line): if("Z" in line): @@ -196,7 +199,31 @@ class PronterWindow(wx.Frame,pronsole.pronsole): pass #threading.Thread(target=self.gviz.addgcode,args=(line,1)).start() #self.gwindow.p.addgcode(line,hilight=1) - + if("M104" in line or "M109" in line): + if("S" in line): + try: + temp=float(line.split("S")[1].split("*")[0]) + self.hottgauge.SetTarget(temp) + self.graph.SetExtruder0TargetTemperature(temp) + except: + pass + try: + self.sentlines.put_nowait(line) + except: + pass + if("M140" in line): + if("S" in line): + try: + temp=float(line.split("S")[1].split("*")[0]) + self.bedtgauge.SetTarget(temp) + self.graph.SetBedTargetTemperature(temp) + except: + pass + try: + self.sentlines.put_nowait(line) + except: + pass + def do_extrude(self,l=""): try: if not (l.__class__=="".__class__ or l.__class__==u"".__class__) or (not len(l)): @@ -204,7 +231,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): pronsole.pronsole.do_extrude(self,l) except: raise - + def do_reverse(self,l=""): try: if not (l.__class__=="".__class__ or l.__class__==u"".__class__) or (not len(l)): @@ -212,7 +239,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): pronsole.pronsole.do_extrude(self,l) except: pass - + def do_settemp(self,l=""): try: if not (l.__class__=="".__class__ or l.__class__==u"".__class__) or (not len(l)): @@ -224,10 +251,11 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if f>=0: if self.p.online: self.p.send_now("M104 S"+l) - print _("Setting hotend temperature to "),f,_(" degrees Celsius.") + print _("Setting hotend temperature to %f degrees Celsius.") % f self.hsetpoint=f self.hottgauge.SetTarget(int(f)) - if f>0: + self.graph.SetExtruder0TargetTemperature(int(f)) + if f>0: wx.CallAfter(self.htemp.SetValue,l) self.set("last_temperature",str(f)) wx.CallAfter(self.settoff.SetBackgroundColour,"") @@ -248,7 +276,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): print _("You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0.") except Exception,x: print _("You must enter a temperature. (%s)" % (repr(x),)) - + def do_bedtemp(self,l=""): try: if not (l.__class__=="".__class__ or l.__class__==u"".__class__) or (not len(l)): @@ -260,10 +288,11 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if f>=0: if self.p.online: self.p.send_now("M140 S"+l) - print _("Setting bed temperature to "),f,_(" degrees Celsius.") + print _("Setting bed temperature to %f degrees Celsius.") % f self.bsetpoint=f self.bedtgauge.SetTarget(int(f)) - if f>0: + self.graph.SetBedTargetTemperature(int(f)) + if f>0: wx.CallAfter(self.btemp.SetValue,l) self.set("last_bed_temperature",str(f)) wx.CallAfter(self.setboff.SetBackgroundColour,"") @@ -284,15 +313,15 @@ class PronterWindow(wx.Frame,pronsole.pronsole): print _("You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0.") except: print _("You must enter a temperature.") - + def end_macro(self): pronsole.pronsole.end_macro(self) self.update_macros_menu() - + def delete_macro(self,macro_name): pronsole.pronsole.delete_macro(self,macro_name) self.update_macros_menu() - + def start_macro(self,macro_name,old_macro_definition=""): if not self.processing_rc: def cb(definition): @@ -310,14 +339,18 @@ class PronterWindow(wx.Frame,pronsole.pronsole): macroed(macro_name,old_macro_definition,cb) else: pronsole.pronsole.start_macro(self,macro_name,old_macro_definition) - + def catchprint(self,l): - for pat in self.capture_skip: - if pat.match(l): - self.capture_skip.remove(pat) + if self.capture_skip_newline and len(l) and not len(l.strip("\n\r")): + self.capture_skip_newline = False + return + for pat in self.capture_skip.keys(): + if self.capture_skip[pat] > 0 and pat.match(l): + self.capture_skip[pat] -= 1 + self.capture_skip_newline = True return wx.CallAfter(self.logbox.AppendText,l) - + def scanserial(self): """scan for available ports. return a list of device names.""" baselist=[] @@ -331,14 +364,14 @@ class PronterWindow(wx.Frame,pronsole.pronsole): except: pass return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*") - + def project(self,event): import projectlayer if(self.p.online): projectlayer.setframe(self,self.p).Show() else: print _("Printer is not online.") - + def popmenu(self): self.menustrip = wx.MenuBar() # File menu @@ -349,14 +382,14 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.Bind(wx.EVT_MENU, self.project, m.Append(-1,_("Projector"),_(" Project slices"))) self.Bind(wx.EVT_MENU, self.OnExit, m.Append(wx.ID_EXIT,_("E&xit"),_(" Closes the Window"))) self.menustrip.Append(m,_("&File")) - + # Settings menu m = wx.Menu() self.macros_menu = wx.Menu() m.AppendSubMenu(self.macros_menu, _("&Macros")) self.Bind(wx.EVT_MENU, self.new_macro, self.macros_menu.Append(-1, _("<&New...>"))) self.Bind(wx.EVT_MENU, lambda *e:options(self), m.Append(-1,_("&Options"),_(" Options dialog"))) - + self.Bind(wx.EVT_MENU, lambda x:threading.Thread(target=lambda :self.do_skein("set")).start(), m.Append(-1,_("Slicing Settings"),_(" Adjust slicing settings"))) #try: # from SkeinforgeQuickEditDialog import SkeinforgeQuickEditDialog @@ -367,18 +400,18 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.menustrip.Append(m,_("&Settings")) self.update_macros_menu() self.SetMenuBar(self.menustrip) - - + + def doneediting(self,gcode): f=open(self.filename,"w") f.write("\n".join(gcode)) f.close() wx.CallAfter(self.loadfile,None,self.filename) - + def do_editgcode(self,e=None): if(self.filename is not None): macroed(self.filename,self.f,self.doneediting,1) - + def new_macro(self,e=None): dialog = wx.Dialog(self,-1,_("Enter macro name"),size=(260,85)) panel = wx.Panel(dialog,-1) @@ -402,13 +435,13 @@ class PronterWindow(wx.Frame,pronsole.pronsole): wx.CallAfter(self.edit_macro,macro) dialog.Destroy() return macro - + def edit_macro(self,macro): if macro == "": return self.new_macro() if self.macros.has_key(macro): old_def = self.macros[macro] elif hasattr(self.__class__,"do_"+macro): - print _("Name '")+macro+_("' is being used by built-in command") + print _("Name '%s' is being used by built-in command") % macro return elif len([c for c in macro if not c.isalnum() and c != "_"]): print _("Macro name may contain only alphanumeric symbols and underscores") @@ -417,7 +450,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): old_def = "" self.start_macro(macro,old_def) return macro - + def update_macros_menu(self): if not hasattr(self,"macros_menu"): return # too early, menu not yet built @@ -433,7 +466,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): def OnExit(self, event): self.Close() - + def rescanports(self,event=None): scan=self.scanserial() portslist=list(scan) @@ -448,13 +481,13 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.serialport.SetValue(portslist[0]) except: pass - - + + def popwindow(self): # this list will contain all controls that should be only enabled # when we're connected to a printer self.printerControls = [] - + #sizer layout: topsizer is a column sizer containing two sections #upper section contains the mini view buttons #lower section contains the rest of the window - manual controls, console, visualizations @@ -462,7 +495,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): uts=self.uppertopsizer=wx.BoxSizer(wx.HORIZONTAL) self.rescanbtn=wx.Button(self.panel,-1,_("Port")) self.rescanbtn.Bind(wx.EVT_BUTTON,self.rescanports) - + uts.Add(self.rescanbtn,0,wx.TOP|wx.LEFT,0) self.serialport = wx.ComboBox(self.panel, -1, choices=self.scanserial(), @@ -488,18 +521,18 @@ class PronterWindow(wx.Frame,pronsole.pronsole): uts.Add(self.resetbtn) self.minibtn=wx.Button(self.panel,-1,_("Mini mode")) self.minibtn.Bind(wx.EVT_BUTTON,self.toggleview) - + uts.Add((25,-1)) self.monitorbox=wx.CheckBox(self.panel,-1,_("Monitor Printer")) uts.Add(self.monitorbox,0,wx.ALIGN_CENTER) self.monitorbox.Bind(wx.EVT_CHECKBOX,self.setmonitor) - + uts.Add((15,-1),flag=wx.EXPAND) uts.Add(self.minibtn,0,wx.ALIGN_CENTER) - + #SECOND ROW ubs=self.upperbottomsizer=wx.BoxSizer(wx.HORIZONTAL) - + self.loadbtn=wx.Button(self.panel,-1,_("Load file")) self.loadbtn.Bind(wx.EVT_BUTTON,self.loadfile) ubs.Add(self.loadbtn) @@ -533,7 +566,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #self.printerControls.append(self.sendbtn) lbrs.Add(self.sendbtn) lrs.Add(lbrs,0,wx.EXPAND) - + #left pane lls=self.lowerlsizer=wx.GridBagSizer() lls.Add(wx.StaticText(self.panel,-1,_("mm/min")),pos=(0,4),span=(1,4)) @@ -543,15 +576,15 @@ class PronterWindow(wx.Frame,pronsole.pronsole): lls.Add(wx.StaticText(self.panel,-1,_("Z:")),pos=(1,6),span=(1,1), flag=wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.zfeedc=wx.SpinCtrl(self.panel,-1,str(self.settings.z_feedrate),min=0,max=50000,size=(70,-1)) lls.Add(self.zfeedc,pos=(1,7),span=(1,3)) - + #lls.Add((200,375)) - + self.xyb = XYButtons(self.panel, self.moveXY, self.homeButtonClicked) lls.Add(self.xyb, pos=(2,0), span=(1,6), flag=wx.ALIGN_CENTER) self.zb = ZButtons(self.panel, self.moveZ) lls.Add(self.zb, pos=(2,7), span=(1,2), flag=wx.ALIGN_CENTER) wx.CallAfter(self.xyb.SetFocus) - + for i in self.cpbuttons: btn=wx.Button(self.panel,-1,i[0])#) btn.SetBackgroundColour(i[3]) @@ -561,16 +594,16 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.btndict[i[1]]=btn self.printerControls.append(btn) lls.Add(btn,pos=i[2],span=i[4]) - - + + lls.Add(wx.StaticText(self.panel,-1,_("Heater:")),pos=(3,0),span=(1,1),flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT) htemp_choices=[self.temps[i]+" ("+i+")" for i in sorted(self.temps.keys(),key=lambda x:self.temps[x])] - + self.settoff=wx.Button(self.panel,-1,_("Off"),size=(36,-1)) self.settoff.Bind(wx.EVT_BUTTON,lambda e:self.do_settemp("off")) self.printerControls.append(self.settoff) lls.Add(self.settoff,pos=(3,1),span=(1,1)) - + if self.settings.last_temperature not in map(float,self.temps.values()): htemp_choices = [str(self.settings.last_temperature)] + htemp_choices self.htemp=wx.ComboBox(self.panel, -1, @@ -582,34 +615,34 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.settbtn.Bind(wx.EVT_BUTTON,self.do_settemp) self.printerControls.append(self.settbtn) lls.Add(self.settbtn,pos=(3,4),span=(1,1)) - + lls.Add(wx.StaticText(self.panel,-1,_("Bed:")),pos=(4,0),span=(1,1),flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT) btemp_choices=[self.bedtemps[i]+" ("+i+")" for i in sorted(self.bedtemps.keys(),key=lambda x:self.temps[x])] - + self.setboff=wx.Button(self.panel,-1,_("Off"),size=(36,-1)) self.setboff.Bind(wx.EVT_BUTTON,lambda e:self.do_bedtemp("off")) self.printerControls.append(self.setboff) lls.Add(self.setboff,pos=(4,1),span=(1,1)) - + if self.settings.last_bed_temperature not in map(float,self.bedtemps.values()): btemp_choices = [str(self.settings.last_bed_temperature)] + btemp_choices self.btemp=wx.ComboBox(self.panel, -1, choices=btemp_choices,style=wx.CB_DROPDOWN, size=(80,-1)) self.btemp.Bind(wx.EVT_COMBOBOX,self.btemp_change) lls.Add(self.btemp,pos=(4,2),span=(1,2)) - + self.setbbtn=wx.Button(self.panel,-1,_("Set"),size=(38,-1)) self.setbbtn.Bind(wx.EVT_BUTTON,self.do_bedtemp) self.printerControls.append(self.setbbtn) lls.Add(self.setbbtn,pos=(4,4),span=(1,1)) - + self.btemp.SetValue(str(self.settings.last_bed_temperature)) self.htemp.SetValue(str(self.settings.last_temperature)) - ## added for an error where only the bed would get (pla) or (abs). + ## added for an error where only the bed would get (pla) or (abs). #This ensures, if last temp is a default pla or abs, it will be marked so. # if it is not, then a (user) remark is added. This denotes a manual entry - + for i in btemp_choices: if i.split()[0] == str(self.settings.last_bed_temperature).split('.')[0] or i.split()[0] == str(self.settings.last_bed_temperature): self.btemp.SetValue(i) @@ -620,34 +653,34 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if( '(' not in self.btemp.Value): self.btemp.SetValue(self.btemp.Value + ' (user)') if( '(' not in self.htemp.Value): - self.htemp.SetValue(self.htemp.Value + ' (user)') + self.htemp.SetValue(self.htemp.Value + ' (user)') #lls.Add(self.btemp,pos=(4,1),span=(1,3)) #lls.Add(self.setbbtn,pos=(4,4),span=(1,2)) self.tempdisp=wx.StaticText(self.panel,-1,"") lls.Add(self.tempdisp,pos=(4,5),span=(1,3)) - + self.edist=wx.SpinCtrl(self.panel,-1,"5",min=0,max=1000,size=(60,-1)) self.edist.SetBackgroundColour((225,200,200)) self.edist.SetForegroundColour("black") lls.Add(self.edist,pos=(5,2),span=(1,1)) - lls.Add(wx.StaticText(self.panel,-1,_("mm")),pos=(5,3),span=(1,2)) + lls.Add(wx.StaticText(self.panel,-1,_("mm")),pos=(5,3),span=(1,1)) self.efeedc=wx.SpinCtrl(self.panel,-1,str(self.settings.e_feedrate),min=0,max=50000,size=(60,-1)) self.efeedc.SetBackgroundColour((225,200,200)) self.efeedc.SetForegroundColour("black") self.efeedc.Bind(wx.EVT_SPINCTRL,self.setfeeds) lls.Add(self.efeedc,pos=(6,2),span=(1,1)) - lls.Add(wx.StaticText(self.panel,-1,_("mm/min")),pos=(6,3),span=(1,2)) + lls.Add(wx.StaticText(self.panel,-1,_("mm/min")),pos=(6,3),span=(1,1)) self.xyfeedc.Bind(wx.EVT_SPINCTRL,self.setfeeds) self.zfeedc.Bind(wx.EVT_SPINCTRL,self.setfeeds) self.zfeedc.SetBackgroundColour((180,255,180)) self.zfeedc.SetForegroundColour("black") # lls.Add((10,0),pos=(0,11),span=(1,1)) - - self.hottgauge=TempGauge(self.panel,size=(300,24),title=_("Heater:"),maxval=230) - lls.Add(self.hottgauge,pos=(7,0),span=(1,8)) - self.bedtgauge=TempGauge(self.panel,size=(300,24),title=_("Bed:"),maxval=130) - lls.Add(self.bedtgauge,pos=(8,0),span=(1,8)) + + self.hottgauge=TempGauge(self.panel,size=(200,24),title=_("Heater:"),maxval=230) + lls.Add(self.hottgauge,pos=(7,0),span=(1,4)) + self.bedtgauge=TempGauge(self.panel,size=(200,24),title=_("Bed:"),maxval=130) + lls.Add(self.bedtgauge,pos=(8,0),span=(1,4)) #def scroll_setpoint(e): # if e.GetWheelRotation()>0: # self.do_settemp(str(self.hsetpoint+1)) @@ -655,6 +688,9 @@ class PronterWindow(wx.Frame,pronsole.pronsole): # self.do_settemp(str(max(0,self.hsetpoint-1))) #self.tgauge.Bind(wx.EVT_MOUSEWHEEL,scroll_setpoint) + self.graph = Graph(self.panel, wx.ID_ANY) + lls.Add(self.graph, pos=(5, 4), span=(4,4), flag=wx.ALIGN_LEFT) + self.gviz=gviz.gviz(self.panel,(300,300), build_dimensions=self.build_dimensions_list, grid=(self.settings.preview_grid_step1,self.settings.preview_grid_step2), @@ -675,11 +711,11 @@ class PronterWindow(wx.Frame,pronsole.pronsole): vcs.Add(self.gviz,1,flag=wx.SHAPED) cs=self.centersizer=wx.GridBagSizer() vcs.Add(cs,0,flag=wx.EXPAND) - + self.uppersizer=wx.BoxSizer(wx.VERTICAL) self.uppersizer.Add(self.uppertopsizer) self.uppersizer.Add(self.upperbottomsizer) - + self.lowersizer=wx.BoxSizer(wx.HORIZONTAL) self.lowersizer.Add(lls) self.lowersizer.Add(vcs,1,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL) @@ -692,29 +728,29 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.status.SetStatusText(_("Not connected to printer.")) self.panel.Bind(wx.EVT_MOUSE_EVENTS,self.editbutton) self.Bind(wx.EVT_CLOSE, self.kill) - + self.topsizer.Layout() self.topsizer.Fit(self) - + # disable all printer controls until we connect to a printer self.pausebtn.Disable() for i in self.printerControls: i.Disable() - + #self.panel.Fit() #uts.Layout() self.cbuttons_reload() - - + + def plate(self,e): import plater print "plate function activated" plater.stlwin(size=(800,580),callback=self.platecb,parent=self).Show() - + def platecb(self,name): print "plated: "+name self.loadfile(None,name) - + def sdmenu(self,e): obj = e.GetEventObject() popupmenu=wx.Menu() @@ -725,7 +761,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): item = popupmenu.Append(-1,_("SD Print")) self.Bind(wx.EVT_MENU,self.sdprintfile,id=item.GetId()) self.panel.PopupMenu(popupmenu, obj.GetPosition()) - + def htemp_change(self,event): if self.hsetpoint > 0: self.do_settemp("") @@ -735,7 +771,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if self.bsetpoint > 0: self.do_bedtemp("") wx.CallAfter(self.btemp.SetInsertionPoint,0) - + def showwin(self,event): if(self.f is not None): self.gwindow.Show(True) @@ -755,23 +791,23 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.settings._set("xy_feedrate",self.xyfeedc.GetValue()) except: pass - - + + def toggleview(self,e): if(self.mini): self.mini=False self.topsizer.Fit(self) - + #self.SetSize(winsize) wx.CallAfter(self.minibtn.SetLabel, _("Mini mode")) - + else: self.mini=True self.uppersizer.Fit(self) - + #self.SetSize(winssize) wx.CallAfter(self.minibtn.SetLabel, _("Full mode")) - + def cbuttons_reload(self): allcbs = [] ubs=self.upperbottomsizer @@ -823,10 +859,10 @@ class PronterWindow(wx.Frame,pronsole.pronsole): else: cs.Add(b,pos=((i-4)/3,(i-4)%3)) self.topsizer.Layout() - + def help_button(self): print _('Defines custom button. Usage: button "title" [/c "colour"] command') - + def do_button(self,argstr): def nextarg(rest): rest=rest.lstrip() @@ -859,7 +895,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #except Exception,x: # print "Bad syntax for button definition, see 'help button'" # print x - + def cbutton_save(self,n,bdef,new_n=None): if new_n is None: new_n=n @@ -915,7 +951,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #while len(self.custombuttons) and self.custombuttons[-1] is None: # del self.custombuttons[-1] wx.CallAfter(self.cbuttons_reload) - + def cbutton_order(self,e,button,dir): n = button.custombutton if dir<0: @@ -929,7 +965,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #if self.custombuttons[-1] is None: # del self.custombuttons[-1] self.cbuttons_reload() - + def editbutton(self,e): if e.IsCommandEvent() or e.ButtonUp(wx.MOUSE_BTN_RIGHT): if e.IsCommandEvent(): @@ -961,7 +997,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.dragpos = scrpos e.Skip() return - else: + else: dx,dy=self.dragpos[0]-scrpos[0],self.dragpos[1]-scrpos[1] if dx*dx+dy*dy < 5*5: # threshold to detect dragging for jittery mice e.Skip() @@ -992,11 +1028,11 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.dragging.label = obj.s_label = obj.GetLabel() self.dragging.bgc = obj.s_bgc = obj.GetBackgroundColour() self.dragging.fgc = obj.s_fgc = obj.GetForegroundColour() - else: + else: # dragging in progress self.dragging.SetPosition(self.panel.ScreenToClient(scrpos)) wx.CallAfter(self.dragging.Refresh) - btns = self.custombuttonbuttons + btns = self.custombuttonbuttons dst = None src = self.dragging.sourcebutton drg = self.dragging @@ -1066,7 +1102,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): del self.dragpos else: e.Skip() - + def homeButtonClicked(self, corner): if corner == 0: # upper-left self.onecmd('home X') @@ -1076,17 +1112,17 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.onecmd('home Z') if corner == 3: # lower-left self.onecmd('home') - + def moveXY(self, x, y): if x != 0: self.onecmd('move X %s' % x) if y != 0: self.onecmd('move Y %s' % y) - + def moveZ(self, z): if z != 0: self.onecmd('move Z %s' % z) - + def procbutton(self,e): try: if hasattr(e.GetEventObject(),"custombutton"): @@ -1099,7 +1135,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): print _("event object missing") self.cur_button=None raise - + def kill(self,e): self.statuscheck=0 self.p.recvcb=None @@ -1113,7 +1149,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): except: pass self.Destroy() - + def do_monitor(self,l=""): if l.strip()=="": self.monitorbox.SetValue(not self.monitorbox.GetValue()) @@ -1130,11 +1166,17 @@ class PronterWindow(wx.Frame,pronsole.pronsole): print _("Monitoring printer.") else: print _("Done monitoring.") - - + + def setmonitor(self,e): self.monitor=self.monitorbox.GetValue() - + if self.monitor: + self.graph.StartPlotting(1000) + else: + self.graph.StopPlotting() + + + def sendline(self,e): command=self.commandbox.GetValue() if not len(command): @@ -1145,7 +1187,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): def clearOutput(self,e): self.logbox.Clear() - + def statuschecker(self): try: while(self.statuscheck): @@ -1156,11 +1198,13 @@ class PronterWindow(wx.Frame,pronsole.pronsole): string+=_("Loaded ")+os.path.split(self.filename)[1]+" " except: pass - string+=(self.tempreport.replace("\r","").replace("T",_("Hotend")).replace("B",_("Bed")).replace("\n","").replace("ok ",""))+" " + string+=(self.tempreport.replace("\r","").replace("T:",_("Hotend") + ":").replace("B:",_("Bed") + ":").replace("\n","").replace("ok ",""))+" " wx.CallAfter(self.tempdisp.SetLabel,self.tempreport.strip().replace("ok ","")) try: self.hottgauge.SetValue(float(filter(lambda x:x.startswith("T:"),self.tempreport.split())[0].split(":")[1])) + self.graph.SetExtruder0Temperature(float(filter(lambda x:x.startswith("T:"),self.tempreport.split())[0].split(":")[1])) self.bedtgauge.SetValue(float(filter(lambda x:x.startswith("B:"),self.tempreport.split())[0].split(":")[1])) + self.graph.SetBedTemperature(float(filter(lambda x:x.startswith("B:"),self.tempreport.split())[0].split(":")[1])) except: pass fractioncomplete = 0.0 @@ -1170,22 +1214,22 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if self.p.printing: fractioncomplete = float(self.p.queueindex)/len(self.p.mainqueue) string+= _(" Printing:%04.2f %% |") % (100*float(self.p.queueindex)/len(self.p.mainqueue),) - string+= _(" Line# ") + str(self.p.queueindex) + _("of ") + str(len(self.p.mainqueue)) + _(" lines |" ) + string+= _(" Line# %d of %d lines |" ) % (self.p.queueindex, len(self.p.mainqueue)) if fractioncomplete > 0.0: - secondselapsed = int(time.time()-self.starttime) + secondselapsed = int(time.time()-self.starttime+self.extra_print_time) secondsestimate = secondselapsed/fractioncomplete secondsremain = secondsestimate - secondselapsed - string+= _(" Est: ") + time.strftime('%H:%M:%S', time.gmtime(secondsremain)) - string+= _(" of: ") + time.strftime('%H:%M:%S', time.gmtime(secondsestimate)) - string+= _(" Remaining | ") + string+= _(" Est: %s of %s remaining | ") % (time.strftime('%H:%M:%S', time.gmtime(secondsremain)), + time.strftime('%H:%M:%S', time.gmtime(secondsestimate))) string+= _(" Z: %0.2f mm") % self.curlayer wx.CallAfter(self.status.SetStatusText,string) wx.CallAfter(self.gviz.Refresh) if(self.monitor and self.p.online): if self.sdprinting: self.p.send_now("M27") - self.capture_skip.append(re.compile(r"ok T:[\d\.]+( B:[\d\.]+)?( @:[\d\.]+)?\s*")) - self.capture_skip.append(re.compile(r"\n")) + if not hasattr(self,"auto_monitor_pattern"): + self.auto_monitor_pattern = re.compile(r"(ok\s+)?T:[\d\.]+(\s+B:[\d\.]+)?(\s+@:[\d\.]+)?\s*") + self.capture_skip[self.auto_monitor_pattern]=self.capture_skip.setdefault(self.auto_monitor_pattern,0)+1 self.p.send_now("M105") time.sleep(self.monitor_interval) while not self.sentlines.empty(): @@ -1206,7 +1250,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): pass if cout is None: cout=cStringIO.StringIO() - + sys.stdout=cout retval=None try: @@ -1222,7 +1266,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole): wx.CallAfter(self.tempdisp.SetLabel,self.tempreport.strip().replace("ok ","")) try: self.hottgauge.SetValue(float(filter(lambda x:x.startswith("T:"),self.tempreport.split())[0].split(":")[1])) - self.bedtgauge.SetValue(float(filter(lambda x:x.startswith("B:"),self.tempreport.split())[0].split(":")[1])) + self.graph.SetExtruder0Temperature(float(filter(lambda x:x.startswith("T:"),self.tempreport.split())[0].split(":")[1])) + self.graph.SetBedTemperature(float(filter(lambda x:x.startswith("B:"),self.tempreport.split())[0].split(":")[1])) except: pass tstring=l.rstrip() @@ -1232,7 +1277,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #wx.CallAfter(self.logbox.AppendText,tstring+"\n") for i in self.recvlisteners: i(l) - + def listfiles(self,line): if "Begin file list" in line: self.listing=1 @@ -1242,7 +1287,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): wx.CallAfter(self.filesloaded) elif self.listing: self.sdfiles+=[line.replace("\n","").replace("\r","").lower()] - + def waitforsdresponse(self,l): if "file.open failed" in l: wx.CallAfter(self.status.SetStatusText,_("Opening file failed.")) @@ -1270,9 +1315,9 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.percentdone=100.0*int(vals[0])/int(vals[1]) except: pass - - - + + + def filesloaded(self): dlg=wx.SingleChoiceDialog(self, _("Select the file to print"), _("Pick SD file"), self.sdfiles) if(dlg.ShowModal()==wx.ID_OK): @@ -1280,7 +1325,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if len(target): self.recvlisteners+=[self.waitforsdresponse] self.p.send_now("M23 "+target.lower()) - + #print self.sdfiles pass @@ -1293,7 +1338,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.recvlisteners+=[self.listfiles] self.p.send_now("M21") self.p.send_now("M20") - + def skein_func(self): try: import shlex @@ -1312,7 +1357,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): print _("Failed to execute slicing software: ") self.stopsf=1 traceback.print_exc(file=sys.stdout) - + def skein_monitor(self): while(not self.stopsf): try: @@ -1328,7 +1373,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): of.close if self.p.online: wx.CallAfter(self.printbtn.Enable) - + wx.CallAfter(self.status.SetStatusText,_("Loaded ")+self.filename+_(", %d lines") % (len(self.f),)) wx.CallAfter(self.pausebtn.Disable) wx.CallAfter(self.printbtn.SetLabel,_("Print")) @@ -1339,8 +1384,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole): wx.CallAfter(self.loadbtn.SetLabel,_("Load File")) self.skeining=0 self.skeinp=None - - + + def skein(self,filename): wx.CallAfter(self.loadbtn.SetLabel,_("Cancel")) print _("Slicing ") + filename @@ -1350,7 +1395,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.skeining=1 thread(target=self.skein_func).start() thread(target=self.skein_monitor).start() - + def loadfile(self,event,filename=None): if self.skeining and self.skeinp is not None: self.skeinp.terminate() @@ -1384,20 +1429,20 @@ class PronterWindow(wx.Frame,pronsole.pronsole): of=open(self.filename) self.f=[i.replace("\n","").replace("\r","") for i in of] of.close - self.status.SetStatusText(_("Loaded ") + name + _(", %d lines") % (len(self.f),)) + self.status.SetStatusText(_("Loaded %s, %d lines") % (name, len(self.f))) wx.CallAfter(self.printbtn.SetLabel, _("Print")) wx.CallAfter(self.pausebtn.SetLabel, _("Pause")) wx.CallAfter(self.pausebtn.Disable) if self.p.online: wx.CallAfter(self.printbtn.Enable) threading.Thread(target=self.loadviz).start() - + def loadviz(self): Xtot,Ytot,Ztot,Xmin,Xmax,Ymin,Ymax,Zmin,Zmax = pronsole.measurements(self.f) print pronsole.totalelength(self.f), _("mm of filament used in this print\n") - print _("the print goes from"),Xmin,_("mm to"),Xmax,_("mm in X\nand is"),Xtot,_("mm wide\n") - print _("the print goes from"),Ymin,_("mm to"),Ymax,_("mm in Y\nand is"),Ytot,_("mm wide\n") - print _("the print goes from"),Zmin,_("mm to"),Zmax,_("mm in Z\nand is"),Ztot,_("mm high\n") + print _("the print goes from %f mm to %f mm in X\nand is %f mm wide\n") % (Xmin, Xmax, Xtot) + print _("the print goes from %f mm to %f mm in Y\nand is %f mm wide\n") % (Ymin, Ymax, Ytot) + print _("the print goes from %f mm to %f mm in Z\nand is %f mm high\n") % (Zmin, Zmax, Ztot) print _("Estimated duration (pessimistic): "), pronsole.estimate_duration(self.f) #import time #t0=time.time() @@ -1410,8 +1455,9 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #print "generated 3d view in %f s"%(time.time()-t0) self.gviz.showall=1 wx.CallAfter(self.gviz.Refresh) - + def printfile(self,event): + self.extra_print_time=0 if self.paused: self.p.paused=0 self.paused=0 @@ -1420,7 +1466,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.p.send_now("M26 S0") self.p.send_now("M24") return - + if self.f is None or not len(self.f): wx.CallAfter(self.status.SetStatusText, _("No file loaded. Please use load first.")) return @@ -1429,19 +1475,19 @@ class PronterWindow(wx.Frame,pronsole.pronsole): return self.on_startprint() self.p.startprint(self.f) - + def on_startprint(self): wx.CallAfter(self.pausebtn.SetLabel, _("Pause")) wx.CallAfter(self.pausebtn.Enable) wx.CallAfter(self.printbtn.SetLabel, _("Restart")) - + def endupload(self): self.p.send_now("M29 ") wx.CallAfter(self.status.SetStatusText, _("File upload complete")) time.sleep(0.5) self.p.clear=True self.uploading=False - + def uploadtrigger(self,l): if "Writing to file" in l: self.uploading=True @@ -1450,7 +1496,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.recvlisteners.remove(self.uploadtrigger) elif "open failed, File" in l: self.recvlisteners.remove(self.uploadtrigger) - + def upload(self,event): if not self.f or not len(self.f): return @@ -1462,7 +1508,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.p.send_now("M28 "+str(dlg.GetValue())) self.recvlisteners+=[self.uploadtrigger] pass - + def pause(self,event): print _("Paused.") if not self.paused: @@ -1474,6 +1520,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): return self.p.pause() self.paused=True + self.extra_print_time += int(time.time() - self.starttime) wx.CallAfter(self.pausebtn.SetLabel, _("Resume")) else: self.paused=False @@ -1482,13 +1529,13 @@ class PronterWindow(wx.Frame,pronsole.pronsole): else: self.p.resume() wx.CallAfter(self.pausebtn.SetLabel, _("Pause")) - - + + def sdprintfile(self,event): self.on_startprint() threading.Thread(target=self.getfiles).start() pass - + def connect(self,event): print _("Connecting...") port=None @@ -1518,13 +1565,13 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if baud != self.settings.baudrate: self.set("baudrate",str(baud)) threading.Thread(target=self.statuschecker).start() - - + + def disconnect(self,event): print _("Disconnected.") self.p.disconnect() self.statuscheck=False - + self.connectbtn.SetLabel("Connect") self.connectbtn.Bind(wx.EVT_BUTTON,self.connect) @@ -1536,7 +1583,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): # Disable XYButtons and ZButtons wx.CallAfter(self.xyb.disable) wx.CallAfter(self.zb.disable) - + if self.paused: self.p.paused=0 self.p.printing=0 @@ -1545,20 +1592,20 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.paused=0 if self.sdprinting: self.p.send_now("M26 S0") - - + + def reset(self,event): print _("Reset.") dlg=wx.MessageDialog(self, _("Are you sure you want to reset the printer?"), _("Reset?"), wx.YES|wx.NO) if dlg.ShowModal()==wx.ID_YES: self.p.reset() + self.p.printing=0 + wx.CallAfter(self.printbtn.SetLabel, _("Print")) if self.paused: self.p.paused=0 - self.p.printing=0 wx.CallAfter(self.pausebtn.SetLabel, _("Pause")) - wx.CallAfter(self.printbtn.SetLabel, _("Print")) self.paused=0 - + def get_build_dimensions(self,bdim): import re # a string containing up to six numbers delimited by almost anything @@ -1670,7 +1717,7 @@ class options(wx.Dialog): grid.Add(ctrls[k,0],0,wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.ALIGN_RIGHT) grid.Add(ctrls[k,1],1,wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND) topsizer.Add(self.CreateSeparatedButtonSizer(wx.OK+wx.CANCEL),0,wx.EXPAND) - self.SetSizer(topsizer) + self.SetSizer(topsizer) topsizer.Layout() topsizer.Fit(self) if self.ShowModal()==wx.ID_OK: @@ -1678,7 +1725,7 @@ class options(wx.Dialog): if ctrls[k,1].GetValue() != str(v): pronterface.set(k,str(ctrls[k,1].GetValue())) self.Destroy() - + class ButtonEdit(wx.Dialog): """Custom button edit dialog""" def __init__(self,pronterface): @@ -1726,7 +1773,7 @@ class ButtonEdit(wx.Dialog): self.command.SetValue(macro) if self.name.GetValue()=="": self.name.SetValue(macro) - + class TempGauge(wx.Panel): def __init__(self,parent,size=(200,22),title="",maxval=240,gaugeColour=None): wx.Panel.__init__(self,parent,-1,size=size) @@ -1821,12 +1868,12 @@ class TempGauge(wx.Panel): #gc.SetFont(gc.CreateFont(wx.Font(12,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD),wx.WHITE)) #gc.DrawText(text,29,-2) gc.SetFont(gc.CreateFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD),wx.WHITE)) - gc.DrawText(self.title,x0+19,y0+1) - gc.DrawText(text, x0+153,y0+1) + gc.DrawText(self.title,x0+19,y0+4) + gc.DrawText(text, x0+133,y0+4) gc.SetFont(gc.CreateFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD))) - gc.DrawText(self.title,x0+18,y0+0) - gc.DrawText(text, x0+152,y0+0) - + gc.DrawText(self.title,x0+18,y0+3) + gc.DrawText(text, x0+132,y0+3) + if __name__ == '__main__': app = wx.App(False) main = PronterWindow()