コード例 #1
0
	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)
コード例 #2
0
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
コード例 #3
0
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