def __init__(self,main_widget): super(MologramField,self).__init__() self.main_widget = main_widget self.initUI() self.in_movement = False # initialize thread to do movements self.worker_thread = Move_to_mologram_thread(self.main_widget.setup.chip) self.connect(self.worker_thread, QtCore.SIGNAL("done_moving"), self.main_widget.stop_moving)
class MologramField(QtGui.QWidget): def __init__(self,main_widget): super(MologramField,self).__init__() self.main_widget = main_widget self.initUI() self.in_movement = False # initialize thread to do movements self.worker_thread = Move_to_mologram_thread(self.main_widget.setup.chip) self.connect(self.worker_thread, QtCore.SIGNAL("done_moving"), self.main_widget.stop_moving) def initUI(self): # layout vbox = QtGui.QVBoxLayout() self.setLayout(vbox) # set up canvas self.figure = plt.figure(figsize=(3,10),facecolor='None',edgecolor='None') self.canvas = FigureCanvas(self.figure) vbox.addWidget(self.canvas) # image parameters, axes refer to setup axes self.x_max = 57 self.y_max = 14 self.ax = self.figure.add_subplot(111) self.ax.set_aspect('equal') self.figure.tight_layout() # initial display self.updateDisplay() cid = self.figure.canvas.mpl_connect('button_press_event', self.onclick) def updateDisplay(self): self.updatePos() # clear previous drawings plt.sca(self.ax) plt.cla() # draw features self.draw_chip() self.draw_current_field() # set up axes self.ax.xaxis.set_ticks_position('none') # tick markers self.ax.yaxis.set_ticks_position('none') plt.xticks([]) # labels plt.yticks([]) plt.axis([0,self.y_max,0,self.x_max]) # axis dimensions # show image self.canvas.draw() def updatePos(self): self.x = self.main_widget.setup.motors.x.pos('mm') self.y = self.main_widget.setup.motors.y.pos('mm') position = str(self.x) + ',' + str(self.y) self.field,self.line,self.row = self.main_widget.setup.chip.update_position(position) return position def draw_current_field(self): # background and current view view_size = 2 # disregard if not in a mologram field if self.field == -1: return # get x,y location of current field x = mologram.chip_height - mologram.bottom_margin - mologram.mologram_field_height/2 x -= (ord(self.field) - ord(mologram.starting_field_index))*mologram.mologram_field_spacing y = mologram.side_margin curr_field_pos = (y,x) self.ax.add_patch(patches.Rectangle( (y,x), mologram.mologram_field_width, mologram.mologram_field_height, facecolor='#00CC00' )) def draw_chip(self): # chip self.ax.add_patch(patches.Rectangle((0,0),self.y_max,self.x_max,facecolor='#F8F8F8')) # mologram fields for i in range(mologram.number_of_fields): y = mologram.side_margin x = mologram.bottom_margin - mologram.mologram_field_height/2 x += i*mologram.mologram_field_spacing self.ax.add_patch(patches.Rectangle( (y,x), mologram.mologram_field_width, mologram.mologram_field_height, facecolor='#262626' )) def onclick(self,event): # don't move if already in movement if self.in_movement == True: return # get position of mouse click and return if it was outside figure try: y = event.xdata + mologram.side_margin x = event.ydata + mologram.bottom_margin - mologram.mologram_field_height/2 except Exception: return # get corresponding mologram indices position = str(x) + ',' + str(y) field,line,row = self.main_widget.setup.chip.corresponding_mologram(position) if self.line == -1: line = 1 else: line = self.line if self.row == -1: row = 1 else: row = self.row # got to it self.main_widget.set_in_movement(True) self.worker_thread.move_to(field,line,row) def heightForWidth(self, w): return w*(57/14) def set_in_movement(self,state): self.in_movement = state
class MologramLineRow(QtGui.QWidget): def __init__(self,main_widget): super(MologramLineRow,self).__init__() self.main_widget = main_widget self.in_movement = False # initialize thread to do movements self.worker_thread = Move_to_mologram_thread(self.main_widget.setup.chip) self.connect(self.worker_thread, QtCore.SIGNAL("done_moving"), self.main_widget.stop_moving) self.initUI() def initUI(self): # layout vbox = QtGui.QVBoxLayout() self.setLayout(vbox) # set up canvas self.figure = plt.figure(figsize=(10,5),facecolor='None',edgecolor='None') self.canvas = FigureCanvas(self.figure) vbox.addWidget(self.canvas) # image parameters, axes refer to setup axes self.x_max = 2 self.y_max = 4 self.mologram = read_png('./images/mologram.png') self.mologram_turned = read_png('./images/mologram_turned.png') # initial display self.initDisplay() cid = self.figure.canvas.mpl_connect('button_press_event', self.onclick) def initDisplay(self): self.updatePos() # clear previous drawings self.ax = self.figure.add_subplot(111) self.ax.set_aspect('equal') # draw features self.draw_current_field() self.draw_current_mologram() # set up axes self.ax.xaxis.set_ticks_position('none') # tick markers self.ax.yaxis.set_ticks_position('none') plt.xticks([]) # labels plt.yticks([]) plt.axis([0,self.y_max,0,self.x_max]) # axis dimensions self.figure.tight_layout() # show image self.canvas.draw() def updateDisplay(self): self.updatePos() try: self.curr_mologram.remove() except Exception: pass self.draw_current_mologram() # show image self.canvas.draw() def updatePos(self): self.x = self.main_widget.setup.motors.x.pos('mm') self.y = self.main_widget.setup.motors.y.pos('mm') position = str(self.x) + ',' + str(self.y) self.field,self.line,self.row = self.main_widget.setup.chip.update_position(position) return position def draw_current_mologram(self): view_width = 2560*2.2/10/1000 view_height = 1920*2.2/10/1000 # disregard if not in a mologram field if (self.field == -1) or (self.line == -1) or (self.row == -1): return # get x,y location of current field x_offset = -(view_height)/2 + 2*mologram.mologram_ver_spacing y_offset = -(view_width)/2 # y = (self.row-1)*mologram.mologram_hor_spacing + y_offset # x = (mologram.lines_per_field-self.line)*mologram.mologram_ver_spacing + x_offset y = self.main_widget.setup.motors.y.pos('mm') - mologram.side_margin + y_offset x = -1*self.main_widget.setup.motors.x.pos('mm') - mologram.bottom_margin + x_offset x -= (5-(ord(self.field) - ord('B')))*mologram.mologram_field_spacing #print((x,y)) #self.ax.add_patch(patches.Rectangle( self.curr_mologram = (patches.Rectangle( (y,x), view_width, view_height, facecolor='#0A0A0A', alpha=0.2, zorder = 2 )) self.ax.add_artist(self.curr_mologram) def draw_mologram(self,position,turned): if turned: imagebox = OffsetImage(self.mologram_turned, zoom=.05) else: imagebox = OffsetImage(self.mologram, zoom=.05) ab = AnnotationBbox( imagebox, position, xybox= None, xycoords='data', boxcoords="offset points", frameon=False ) ab.zorder=1 self.ax.add_artist(ab) def draw_current_field(self): x_offset = (mologram.mologram_ver_spacing)/2 y_offset = (mologram.mologram_hor_spacing)/2 # draw all molograms in current field for i in range(mologram.lines_per_field): for j in range(mologram.rows_per_field): y = j*mologram.mologram_hor_spacing + y_offset x = i*mologram.mologram_ver_spacing + x_offset self.draw_mologram([y,x],turned = (i==2)) def onclick(self,event): # if already in movement, don't move if self.in_movement == True: return # get position of mouse click and return if it was outside figure try: y = event.xdata + mologram.side_margin x = event.ydata + mologram.bottom_margin - mologram.mologram_field_height/2 except Exception: return # get corresponding mologram indices position = str(x) + ',' + str(y) field,line,row = self.main_widget.setup.chip.corresponding_mologram(position) # in case the current view is not in a valid field, move to the selected mologram in the 'B' field if field == -1: field = 'B' else: field = self.field # Call thread to move to position self.main_widget.set_in_movement(True) self.worker_thread.move_to(field,line,row) def heightForWidth(self, w): return w*(1/2) def set_in_movement(self,state): self.in_movement = state