def __init__(self,motiondata,imagedata,num_instruction=None): self.pixels = None self.leftangle = 90 self.rightangle = 90 self.progress_ui = Progress() self.prev_x = -1 self.prev_y = -1 self.progress = -1 self.levels = [] self.canvas = Image.new("RGBA",(1000*PIX_PER_MM,1200*PIX_PER_MM),color=(255,255,255,255)) self.draw = ImageDraw.Draw(self.canvas) self.redlayer = Image.new("RGBA",(1000*PIX_PER_MM,1200*PIX_PER_MM),color=(255,255,255,0)) self.draw2 = ImageDraw.Draw(self.redlayer) self.blacklayer = Image.new("RGBA",(1000*PIX_PER_MM,1200*PIX_PER_MM),color=(255,255,255,0)) self.draw3 = ImageDraw.Draw(self.blacklayer) self.model = Blackstripes_MKII() self.instructions_executed = 0.0 self.num_instruction = float(num_instruction) if imagedata != None: self.pixels = [] self.imagedata = open(imagedata,'rb') b_counter = 0 try: byte = self.imagedata.read(1) while byte != "": sample = struct.unpack('B',byte) if b_counter > 5: self.pixels.append(sample[0]) else: self.levels.append(sample[0]) byte = self.imagedata.read(1) b_counter += 1 finally: self.imagedata.close() self.motiondata = open(motiondata,'rb') try: byte = self.motiondata.read(16) while byte != "": sample = struct.unpack('=LLLL',byte) left_engine,right_engine,p1,p2,p3,even,speed = coder.decode(sample[0]) sol1 = sample[1] sol2 = sample[2] sol3 = sample[3] self._draw(left_engine,right_engine,p1,p2,p3,even,speed,sol1,sol2,sol3) byte = self.motiondata.read(16) finally: self.canvas.paste(self.redlayer,self.redlayer) self.canvas.paste(self.blacklayer,self.blacklayer) self.canvas.save("blackstripes_preview.png") self.motiondata.close()
class Simulator: def __init__(self,motiondata,imagedata,num_instruction=None): self.pixels = None self.leftangle = 90 self.rightangle = 90 self.progress_ui = Progress() self.prev_x = -1 self.prev_y = -1 self.progress = -1 self.levels = [] self.canvas = Image.new("RGBA",(1000*PIX_PER_MM,1200*PIX_PER_MM),color=(255,255,255,255)) self.draw = ImageDraw.Draw(self.canvas) self.redlayer = Image.new("RGBA",(1000*PIX_PER_MM,1200*PIX_PER_MM),color=(255,255,255,0)) self.draw2 = ImageDraw.Draw(self.redlayer) self.blacklayer = Image.new("RGBA",(1000*PIX_PER_MM,1200*PIX_PER_MM),color=(255,255,255,0)) self.draw3 = ImageDraw.Draw(self.blacklayer) self.model = Blackstripes_MKII() self.instructions_executed = 0.0 self.num_instruction = float(num_instruction) if imagedata != None: self.pixels = [] self.imagedata = open(imagedata,'rb') b_counter = 0 try: byte = self.imagedata.read(1) while byte != "": sample = struct.unpack('B',byte) if b_counter > 5: self.pixels.append(sample[0]) else: self.levels.append(sample[0]) byte = self.imagedata.read(1) b_counter += 1 finally: self.imagedata.close() self.motiondata = open(motiondata,'rb') try: byte = self.motiondata.read(16) while byte != "": sample = struct.unpack('=LLLL',byte) left_engine,right_engine,p1,p2,p3,even,speed = coder.decode(sample[0]) sol1 = sample[1] sol2 = sample[2] sol3 = sample[3] self._draw(left_engine,right_engine,p1,p2,p3,even,speed,sol1,sol2,sol3) byte = self.motiondata.read(16) finally: self.canvas.paste(self.redlayer,self.redlayer) self.canvas.paste(self.blacklayer,self.blacklayer) self.canvas.save("blackstripes_preview.png") self.motiondata.close() def controlMarker(self,x,y,sol,p,levels_tup,even,color,draw): x = x*PIX_PER_MM y = y*PIX_PER_MM pix = (x-HALF_MARKER_PIXEL_SIZE,y-HALF_MARKER_PIXEL_SIZE,x+HALF_MARKER_PIXEL_SIZE,y+HALF_MARKER_PIXEL_SIZE) if p == 1 and self.pixels: if sol < 1000000 and self.pixels[sol+6] < self.levels[levels_tup[0]] and even == 1: draw.ellipse(pix, fill=color) elif sol < 1000000 and self.pixels[sol+6] < self.levels[levels_tup[1]] and even == 0: draw.ellipse(pix, fill=color) elif p == 2: draw.ellipse(pix, fill=color) def _draw(self,left_engine,right_engine,p1,p2,p3,even,speed,sol1,sol2,sol3): self.instructions_executed += 1 progress = (self.instructions_executed / self.num_instruction) * 100.0 if self.progress != int(round(progress)): self.progress = int(round(progress)) self.progress_ui.setProgress(self.progress) if left_engine < 1: self.leftangle -= ANGLE_PER_STEP elif left_engine > 1: self.leftangle += ANGLE_PER_STEP if right_engine < 1: self.rightangle -= ANGLE_PER_STEP elif right_engine > 1: self.rightangle += ANGLE_PER_STEP mx1,my1,mx2,my2,mx3,my3 = self.model.calculateMarkerPositions(self.leftangle,self.rightangle) x,y = self.model.getXYonCanvas(mx1,my1) x = int(round(x)) y = int(round(y)) if x == self.prev_x and y == self.prev_y: return; self.controlMarker(x,y,sol1,p1,(0,1),even,(150,150,150,255),self.draw) x2,y2 = self.model.getXYonCanvas(mx2,my2) self.controlMarker(x2,y2,sol2,p2,(2,3),even,(255,0,0,255),self.draw2) x3,y3 = self.model.getXYonCanvas(mx3,my3) self.controlMarker(x3,y3,sol3,p3,(4,5),even,(0,0,0,255),self.draw3) self.prev_x = x self.prev_y = y