class KXKMPrinter(Usb): def __init__(self, mode, *args, **kwargs): Usb.__init__(self, *args, **kwargs) self.cutter = Cutter() if mode == 'rpi': self.cut = self._cut_rpi else: self.cut = Usb.cut def _cut_rpi(self, mode='PART', feed=True): """ Cut paper. Without any arguments the paper will be cut completely. With 'mode=PART' a partial cut will be attempted. Note however, that not all models can do a partial cut. See the documentation of your printer for details. .. todo:: Check this function on TM-T88II. :param mode: set to 'PART' for a partial cut. default: 'FULL' :param feed: print and feed before cutting. default: true :raises ValueError: if mode not in ('FULL', 'PART') """ if feed: self._raw(ESC + b"d" + six.int2byte(4)) time.sleep(0.15) time.sleep(0.10) mode = mode.upper() if mode not in ('FULL', 'PART'): raise ValueError("Mode must be one of ('FULL', 'PART')") try: if mode == "PART": self.cutter.cut(CUT_HALF) elif mode == "FULL": self.cutter.cut(CUT_FULL) except Exception as e: self.cutter.stop() raise e time.sleep(0.15) time.sleep(0.15) if feed: self._raw(ESC + b"d" + six.int2byte(3)) #time.sleep(0.00) def _test(self): self.cut() time.sleep(0.5) self.cut() time.sleep(0.5) self.cut(mode='FULL') time.sleep(0.5) self.cutter._test() time.sleep(0.1) self.cutter._repos()
class Curves( Node ) : BEZIER_C0 , BEZIER_C2 , INTERPOLATION , SURFACE_C0 , SURFACE_C2 , SURFACE_PIPE , SURFACE_GREGORY = range(7) C0 , C1 , C2 = range(3) def __init__( self ) : Node.__init__( self ) self.bz_points = True self.bz_curves = True self.bz_polygons = False self.bs_points = True self.bs_curves = False self.bs_polygons = False self.selected = None self.cutter = Cutter() self.w = 0 self.h = 0 def clear( self ) : self.del_all() self.selected = None self.cutter.clear() def set_screen_size( self , w , h ) : self.w = w self.h = h for b in self : b.set_screen_size( w , h ) def set_editmode( self , mode ) : for b in self : b.set_editmode( mode ) def new( self , pos , which_cur , pre_data = None , post_data = None ) : if which_cur == Curves.BEZIER_C0 : self.selected = BezierC0( self.bz_points , self.bz_curves , self.bz_polygons ) elif which_cur == Curves.BEZIER_C2 : self.selected = BezierC2( self.bz_points , self.bz_curves , self.bz_polygons , self.bs_points , self.bs_curves , self.bs_polygons ) elif which_cur == Curves.INTERPOLATION : self.selected = Interpolation( ) elif which_cur == Curves.SURFACE_C0 : self.selected = SurfaceC0( pre_data , self.bz_points , self.bz_curves , self.bz_polygons ) elif which_cur == Curves.SURFACE_C2 : self.selected = SurfaceC2( pre_data , self.bz_points , self.bz_curves , self.bz_polygons ) elif which_cur == Curves.SURFACE_PIPE : self.selected = Pipe( pre_data , self.bz_points , self.bz_curves , self.bz_polygons ) elif which_cur == Curves.SURFACE_GREGORY : self.selected = GregoryGap( pre_data , self.bz_points , self.bz_curves , self.bz_polygons ) self.selected.new( pos , post_data ) self.add_child( self.selected ) self.selected.set_screen_size( self.w , self.h ) def delete( self , pos , dist = .05 ) : s = self.find_near( pos , dist ) if not s[1] : return if self.selected == s[1] : self.selected = None self.del_child( s[1] ) def select( self , pos , dist = .05 ) : v , self.selected = self.find_near( pos , dist ) def find_near( self , pos , dist ) : minv = None for pts in self : v , p = pts.find_nearest( pos , dist ) if minv == None or minv > v : out = pts minv = v if not minv : return float('inf') , None else : return minv , out def point_new( self , which , pos ) : if self.selected : self.selected.new( pos , which ) self.selected.get_geom().refresh() def point_delete( self , pos , dist ) : if self.selected : self.selected.delete( pos , dist ) self.selected.get_geom().refresh() def point_select( self , pos , dist ) : if self.selected : self.selected.select( pos , dist ) self.selected.get_geom().refresh() def point_move( self , v ) : if self.selected : self.selected.move_current( v ) if self.cutter.cuts( self.selected ) : self.cutter.reset_trimms() def toggle( self , which , what ) : if which == Curve.BEZIER : if what == Curve.POINTS : self.bz_points = not self.bz_points elif what == Bezier.CURVE : self.bz_curves = not self.bz_curves elif what == Bezier.POLYGON : self.bz_polygons = not self.bz_polygons elif which == Curve.BSPLINE : if what == Curve.POINTS : self.bs_points = not self.bs_points elif what == Bezier.CURVE : self.bs_curves = not self.bs_curves elif what == Bezier.POLYGON : self.bs_polygons = not self.bs_polygons for b in self : b.set_visibility( Curve.BEZIER , self.bz_points , self.bz_curves , self.bz_polygons ) b.set_visibility( Curve.BSPLINE, self.bs_points , self.bs_curves , self.bs_polygons ) b.get_geom().refresh() def set_surf_density( self , dens ) : for b in self : if isinstance(b,SurfaceC0) or isinstance(b,SurfaceC2) or isinstance(b,GregoryGap) : b.set_density( dens ) def fill_gap( self , c ) : if isinstance(self.selected,GregoryGap) : if c == None : self.selected.fill_gap_none() if c == Curves.C0 : self.selected.fill_gap_c0() elif c == Curves.C1 : self.selected.fill_gap_c1() elif c == Curves.C2 : self.selected.fill_gap_c2() def select_to_cut( self , pos , dist = .05 ) : v , c = self.find_near( pos , dist ) if c != None and isinstance(c,SurfaceC2) : self.cutter.add( c ) def cut( self , pos , delta ) : return self.cutter.cut( pos , delta ) def clear_cut( self ) : self.cutter.reset_trimms() self.cutter.reset_ind() def cut_select( self , i , k ) : self.cutter.cut_select( i , k ) def load( self , path ) : with open(path,"r+") as f : for k in xrange(int(f.readline())) : u , v , t = map( int , f.readline().split(' ') ) pts = [] for i in xrange(u*(v+3) if t != 0 else (u+3)*(v+3)) : pts.append( np.array( f.readline().split(' ') , np.float32 ) ) if t == 0 : self.add_child( SurfaceC2( ( (u,v) , (1,1) ) , self.bz_points , self.bz_curves , self.bz_polygons , pts ) ) else : self.add_child( Pipe(( (u,v) , (1,1) ) , self.bz_points , self.bz_curves , self.bz_polygons , pts ) ) def dump( self , path ) : with open(path,"w+") as f : count = 0 for s in self : if not isinstance(s,SurfaceC2) : continue count += 1 f.write(str(count)+"\n") for s in self : if not isinstance(s,SurfaceC2) : continue f.write("{1} {2} {0}\n".format(int(isinstance(s,Pipe)),*s.get_uv())) for p in s.iter_pts() : f.write("{0} {1} {2}\n".format(*p))
class Curves(Node): BEZIER_C0, BEZIER_C2, INTERPOLATION, SURFACE_C0, SURFACE_C2, SURFACE_PIPE, SURFACE_GREGORY = range( 7) C0, C1, C2 = range(3) def __init__(self): Node.__init__(self) self.bz_points = True self.bz_curves = True self.bz_polygons = False self.bs_points = True self.bs_curves = False self.bs_polygons = False self.selected = None self.cutter = Cutter() self.w = 0 self.h = 0 def clear(self): self.del_all() self.selected = None self.cutter.clear() def set_screen_size(self, w, h): self.w = w self.h = h for b in self: b.set_screen_size(w, h) def set_editmode(self, mode): for b in self: b.set_editmode(mode) def new(self, pos, which_cur, pre_data=None, post_data=None): if which_cur == Curves.BEZIER_C0: self.selected = BezierC0(self.bz_points, self.bz_curves, self.bz_polygons) elif which_cur == Curves.BEZIER_C2: self.selected = BezierC2(self.bz_points, self.bz_curves, self.bz_polygons, self.bs_points, self.bs_curves, self.bs_polygons) elif which_cur == Curves.INTERPOLATION: self.selected = Interpolation() elif which_cur == Curves.SURFACE_C0: self.selected = SurfaceC0(pre_data, self.bz_points, self.bz_curves, self.bz_polygons) elif which_cur == Curves.SURFACE_C2: self.selected = SurfaceC2(pre_data, self.bz_points, self.bz_curves, self.bz_polygons) elif which_cur == Curves.SURFACE_PIPE: self.selected = Pipe(pre_data, self.bz_points, self.bz_curves, self.bz_polygons) elif which_cur == Curves.SURFACE_GREGORY: self.selected = GregoryGap(pre_data, self.bz_points, self.bz_curves, self.bz_polygons) self.selected.new(pos, post_data) self.add_child(self.selected) self.selected.set_screen_size(self.w, self.h) def delete(self, pos, dist=.05): s = self.find_near(pos, dist) if not s[1]: return if self.selected == s[1]: self.selected = None self.del_child(s[1]) def select(self, pos, dist=.05): v, self.selected = self.find_near(pos, dist) def find_near(self, pos, dist): minv = None for pts in self: v, p = pts.find_nearest(pos, dist) if minv == None or minv > v: out = pts minv = v if not minv: return float('inf'), None else: return minv, out def point_new(self, which, pos): if self.selected: self.selected.new(pos, which) self.selected.get_geom().refresh() def point_delete(self, pos, dist): if self.selected: self.selected.delete(pos, dist) self.selected.get_geom().refresh() def point_select(self, pos, dist): if self.selected: self.selected.select(pos, dist) self.selected.get_geom().refresh() def point_move(self, v): if self.selected: self.selected.move_current(v) if self.cutter.cuts(self.selected): self.cutter.reset_trimms() def toggle(self, which, what): if which == Curve.BEZIER: if what == Curve.POINTS: self.bz_points = not self.bz_points elif what == Bezier.CURVE: self.bz_curves = not self.bz_curves elif what == Bezier.POLYGON: self.bz_polygons = not self.bz_polygons elif which == Curve.BSPLINE: if what == Curve.POINTS: self.bs_points = not self.bs_points elif what == Bezier.CURVE: self.bs_curves = not self.bs_curves elif what == Bezier.POLYGON: self.bs_polygons = not self.bs_polygons for b in self: b.set_visibility(Curve.BEZIER, self.bz_points, self.bz_curves, self.bz_polygons) b.set_visibility(Curve.BSPLINE, self.bs_points, self.bs_curves, self.bs_polygons) b.get_geom().refresh() def set_surf_density(self, dens): for b in self: if isinstance(b, SurfaceC0) or isinstance( b, SurfaceC2) or isinstance(b, GregoryGap): b.set_density(dens) def fill_gap(self, c): if isinstance(self.selected, GregoryGap): if c == None: self.selected.fill_gap_none() if c == Curves.C0: self.selected.fill_gap_c0() elif c == Curves.C1: self.selected.fill_gap_c1() elif c == Curves.C2: self.selected.fill_gap_c2() def select_to_cut(self, pos, dist=.05): v, c = self.find_near(pos, dist) if c != None and isinstance(c, SurfaceC2): self.cutter.add(c) def cut(self, pos, delta): return self.cutter.cut(pos, delta) def clear_cut(self): self.cutter.reset_trimms() self.cutter.reset_ind() def cut_select(self, i, k): self.cutter.cut_select(i, k) def load(self, path): with open(path, "r+") as f: for k in xrange(int(f.readline())): u, v, t = map(int, f.readline().split(' ')) pts = [] for i in xrange(u * (v + 3) if t != 0 else (u + 3) * (v + 3)): pts.append(np.array(f.readline().split(' '), np.float32)) if t == 0: self.add_child( SurfaceC2(((u, v), (1, 1)), self.bz_points, self.bz_curves, self.bz_polygons, pts)) else: self.add_child( Pipe(((u, v), (1, 1)), self.bz_points, self.bz_curves, self.bz_polygons, pts)) def dump(self, path): with open(path, "w+") as f: count = 0 for s in self: if not isinstance(s, SurfaceC2): continue count += 1 f.write(str(count) + "\n") for s in self: if not isinstance(s, SurfaceC2): continue f.write("{1} {2} {0}\n".format(int(isinstance(s, Pipe)), *s.get_uv())) for p in s.iter_pts(): f.write("{0} {1} {2}\n".format(*p))