Пример #1
0
class Interface(BaseWidget):

    def __init__(self):
        super(Interface, self).__init__('IR project')

        self._query = ControlText(label='Type your query and press "Enter"; for example:',
                                  defaultValue='Albert Einstein')

        self._query.key_pressed = self.__enter_pressed_event

        self._pages_result = ControlList('Found web-pages:')
        self._pages_result.readOnly = True
        self._pages_result.currentCellChanged = self.__page_selected
        self._pages_displayed = []

        self._papers_result = ControlList('Found papers (by author):')
        self._papers_result.readOnly = True
        self._papers_result.currentCellChanged = self.__paper_selected
        self._papers_displayed = []

        self.formset = ['_query', ('_pages_result', '_papers_result')]

    def __enter_pressed_event(self, e):
        if e.key() == QtCore.Qt.Key_Return:

            query = query_words(self._query.value)
            self._pages_displayed, self._papers_displayed = process_query(query, self._query.value)

            self._pages_result.clear()
            self._pages_result.value = [(QtGui.QLabel(format_text(query, document, 'pages')),)
                                        for document in self._pages_displayed]
            self._pages_result.resizeRowsToContents()

            self._papers_result.clear()
            self._papers_result.value = [(QtGui.QLabel(format_text(query, document, 'papers')),)
                                        for document in self._papers_displayed]
            self._papers_result.resizeRowsToContents()

    def __page_selected(self, next_row, unused1, unused2, unused3):
        open_url(self._pages_displayed[next_row]['url'])

    def __paper_selected(self, next_row, unused1, unused2, unused3):
        open_url(self._papers_displayed[next_row]['url'])
Пример #2
0
class PointsTab(BaseWidget):
    """
    A Tab for a list of points
    """

    _axis = []

    _update_function = None

    _controller = None
    _sensor = None
    _lightsource = None
    _saved_points = None

    def __init__(self, update_function=None):
        super().__init__("Points")

        self._update_function = update_function

        self._open_file = ControlFile(
            label="Points File: "
        )
        self._open_file.changed_event = self._on_open_file

        self._save_file = ControlButton(
            label="Save"
        )
        self._save_file.value = self._save_points

        self._points_list = ControlList(
            label="Points",
            add_function=self._add_point,
            remove_function=self._remove_point,
            auto_resize=False
        )
        self._points_list.data_changed_event = self._change_point
        self._points_list.horizontal_headers = [
            axis.get_name() for axis in self._axis]

        self._pre_delay_time = ControlNumber(
            label="Pre Delay Time (s)",
            default=1,
            minimum=0,
            maximum=float('inf'),
            decimals=5
        )

        self._measure_time = ControlNumber(
            label="Measure Time (s)",
            default=5,
            minimum=0,
            maximum=float('inf'),
            decimals=5
        )

        self._post_delay_time = ControlNumber(
            label="Post Delay Time (s)",
            default=1,
            minimum=0,
            maximum=float('inf'),
            decimals=5
        )

        self._scan_frequency = ControlNumber(
            label="Scan Frequency (Hz)",
            default=10,
            minimum=0,
            maximum=float('inf'),
            decimals=5
        )

        self._out_file = ControlDir(
            label="Output Folder: "
        )

        self._scan_button = ControlButton(
            label="Scan"
        )
        self._scan_button.value = self._begin_scan

        self.formset = [
            ('_open_file', '_save_file'),
            '_points_list',
            ('_pre_delay_time', '_post_delay_time'),
            ('_measure_time', '_scan_frequency'),
            '_out_file',
            '_scan_button',
        ]

    def update_events(self, events):
        """
        Updates all events
        """

        # Update the points with the most recent axis
        if 'axis' in events:
            self._axis = events['axis']
            self._update_lists()

        if 'sensor' in events:
            self._sensor = events['sensor']

        if 'lightsource' in events:
            self._lightsource = events['lightsource']

        if 'scan' in events:
            state = events['scan'][0]
            if state == AxisControllerState.DONE:
                self._scan_button.label = "Scan"
            else:
                self._scan_button.label = "Stop"

        if 'saved_points' in events:
            self._saved_points = events['saved_points']

    def _update_lists(self):
        self._points_list.clear()
        self._points_list.horizontal_headers = [
            axis.get_name() for axis in self._axis]
        self._points_list.resize_rows_contents()

        length = self._max_axis_len()
        for i in range(0, length):
            point = []
            for axis in self._axis:
                assert isinstance(axis, ControlAxis)

                # Add enough extra points to the axis so it matches the rest of the axis if it is missing points
                if len(axis.points) <= i:
                    for j in range(len(axis.points) - 1, i):
                        axis.points.append(str(axis.get_min()))

                point.append(str(axis.points[i]))
            self._points_list += point
        self._points_list.resize_rows_contents()

    def _max_axis_len(self):
        """
        Get the number of points in the axis that has the most points
        """
        max_len = 0
        for axis in self._axis:
            assert isinstance(axis, ControlAxis)
            if len(axis.points) > max_len:
                max_len = len(axis.points)
        return max_len

    def _add_point(self):
        for axis in self._axis:
            assert isinstance(axis, ControlAxis)
            axis.points.append("0.0")
        self._update_lists()

    def _remove_point(self):
        index = self._points_list.selected_row_index
        if index is not None:
            for axis in self._axis:
                assert isinstance(axis, ControlAxis)
                axis.points.pop(index)

        self._update_lists()

    def _change_point(self, row, col, item):
        if len(self._axis) > col and len(self._axis[col].points) > row:
            try:
                self._axis[col].points[row] = float(item)
            except ValueError:
                self._axis[col].points[row] = item

    def _begin_scan(self):
        """
        Create an AxisController and begin scanning
        """
        if self._controller is None or self._controller.get_state() == AxisControllerState.DONE:
            self._controller = AxisController(
                self._axis, self._sensor, self._lightsource, self._pre_delay_time.value, self._measure_time.value,
                self._post_delay_time.value, self._scan_frequency.value, self._saved_points, self._out_file.value, self._update_function)
            self._controller.begin()
        else:
            self._controller.stop()

    def _on_open_file(self):
        """
        Open a csv file and rearange columns accoring to header
        """
        print("Opening File:", self._open_file.value)

        if self._open_file.value is not None and self._open_file.value != '':

            with open(self._open_file.value, newline='') as csvfile:

                try:
                    csvreader = csv.reader(csvfile)
                    self._parse_file(csvreader)
                except:
                    print("Failed to read file")

    def _parse_file(self, csvreader):
        for axis in self._axis:
            if isinstance(axis, ControlAxis):
                axis.points.clear()
        self._points_list.clear()

        points = []

        for row in csvreader:
            for index, data in enumerate(row):
                if len(points) <= index:
                    points.append([])
                points[index].append(data)

        #print(points)

        for points_list in points:
            print(points_list[0])
            if isinstance(points_list[0], str):
                for axis in self._axis:
                    if points_list[0] == axis.get_name():
                        axis.points.clear()
                        for point in points_list[1:]:
                            try:
                                axis.points.append(float(point))
                            except ValueError:
                                axis.points.append(point)
                        #print(axis.get_name(), axis.points)

        self._update_lists()


    def _save_points(self):
        points_file = QFileDialog.getSaveFileName(
            caption="Save Points", filter='CSV Files (*.csv)')

        if points_file[0] is not None and points_file[0] != '':
            out_points = []

            headers = []
            for axis in self._axis:
                headers.append(axis.get_name())

            out_points.append(headers)

            length = self._max_axis_len()
            for i in range(0, length):
                point = []
                for axis in self._axis:
                    assert isinstance(axis, ControlAxis)

                    # Add enough extra points to the axis so it matches the rest of the axis if it is missing points
                    if len(axis.points) <= i:
                        for j in range(len(axis.points) - 1, i):
                            axis.points.append(str(axis.get_min()))

                    point.append(str(axis.points[i]))
                out_points.append(point)

            with open(points_file[0], 'w', newline='') as csvfile:
                csvwriter = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL)
                csvwriter.writerows(out_points)

            self._open_file.value = points_file[0]
Пример #3
0
class SavedPointsTab(BaseWidget):
    """
    The Saved Points tab
    """

    _saved_points = {}

    _update_function = None

    def __init__(self, update_function=None):
        super().__init__("Saved Points")

        self._update_function = update_function

        self._open_file = ControlFile(label="Saved Points File")
        self._open_file.changed_event = self._on_open_file

        self._save_file = ControlButton(label="Save")
        self._save_file.value = self._on_save_file

        self._saved_points_list = ControlList(
            label="Saved Points",
            add_function=self._add_saved_point,
            remove_function=self._remove_saved_point)
        self._saved_points_list.data_changed_event = self._change_point

        self._saved_points_list.horizontal_headers = ["Name", "Value"]

        self.formset = [('_open_file', '_save_file'), '_saved_points_list']

    def update_events(self, events):
        pass

    def _send_events(self):
        if self._update_function is not None:
            self._update_function({'saved_points': self._saved_points})

    def _update_saved_points(self):
        self._saved_points_list.clear()

        for name, value in self._saved_points.items():
            self._saved_points_list += [name, value]

    def add_saved_point(self, name):
        if not name in self._saved_points:
            self._saved_points[name] = "0.0"
            self._update_saved_points()
            self._send_events()
            return True
        else:
            return False

    def _add_saved_point(self):
        window = NewPointWindow(self.add_saved_point)
        window.show()

    def _remove_saved_point(self):
        index = self._saved_points_list.selected_row_index
        if index is not None:
            name = self._saved_points_list.get_value(0, index)
            self._saved_points.pop(name)

        self._update_saved_points()
        self._send_events()

    def _change_point(self, row, col, item):
        name = self._saved_points_list.get_value(0, row)
        if col == 1:
            # The data was edited
            self._saved_points[name] = item
            self._send_events()
        else:
            # Something else (name) was edited and needs to be changed back
            if not name in self._saved_points:
                self._update_saved_points()

    def _on_open_file(self):
        if self._open_file.value is not None and self._open_file.value != '':
            with open(self._open_file.value, newline='') as csvfile:
                try:
                    csvreader = csv.reader(csvfile)

                    self._saved_points = {}

                    for point in csvreader:
                        self._saved_points[point[0]] = point[1]
                except:
                    print("Failed to read file")

            self._update_saved_points()

    def _on_save_file(self):
        points_file = QFileDialog.getSaveFileName(caption="Save Points",
                                                  filter='CSV Files (*.csv)')

        if points_file[0] is not None and points_file[0] != '':

            out_points = []
            for name, value in self._saved_points.items():
                out_points.append([name, value])

            with open(points_file[0], 'w', newline='') as csvfile:
                csvwriter = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL)
                csvwriter.writerows(out_points)
Пример #4
0
class GraphsProperties(BaseWidget):

	def __init__(self, timelineWidget=None, parentWindow=None):
		super(GraphsProperties, self).__init__('Graphs properties', parentWindow=parentWindow)
		self.setContentsMargins(10, 10, 10, 10)
		self._timeline = timelineWidget

		# Definition of the forms fields
		self._graphs_list = ControlList('Datasets')
		self._name        = ControlText('Name')
		self._min_value   = ControlNumber('Min', 0, -sys.float_info.max, sys.float_info.max)
		self._max_value   = ControlNumber('Max', 0, -sys.float_info.max, sys.float_info.max)
		self._values_zoom = ControlSlider('Amplitude', 100, 60, 400)
		self._values_top  = ControlNumber('Bottom', 0, -1000, 1000)
		self._remove_graph_btn = ControlButton('Remove graph')
		self._value 	  = ControlLabel()

		self._formset = [
			(
				['_graphs_list','_remove_graph_btn'],
				'||', 
				[
					' ',
					'_name',
					('_min_value', '_max_value'),
					('_values_top',' '),
					'_values_zoom',
					'info:Choose one dataset and move the mouse over the graph line to visualize the coordenates.',
					'_value'
				]),
			]

		self._graphs_list.itemSelectionChanged = self.__graphs_list_selection_changed

		self._loaded = False

		self._name.changed          = self.__save_graphs_changes
		self._min_value.changed     = self.__save_graphs_changes
		self._max_value.changed     = self.__save_graphs_changes
		self._values_zoom.changed   = self.__save_graphs_changes
		self._values_top.changed    = self.__save_graphs_changes

		self._name.enabled          = False
		self._min_value.enabled     = False
		self._max_value.enabled     = False
		self._values_zoom.enabled   = False
		self._values_top.enabled    = False
		self._remove_graph_btn.enabled = False

		self._remove_graph_btn.value = self.__remove_chart

	@property
	def selected_chart(self):
		index = self._graphs_list.mouseSelectedRowIndex
		return self._timeline._charts[0] if (index is not None) else None
	
	@property
	def coordenate_text(self): return self._value
	@coordenate_text.setter
	def coordenate_text(self, value): self._value.value = str(value) if value else ''
	


	def show(self):
		super(GraphsProperties, self).show()
		self._loaded = False

		self._graphs_list.clear()            
		for graph in self._timeline._charts:
			self._graphs_list += [graph.name]

	def __remove_chart(self):
		index = self._graphs_list.mouseSelectedRowIndex
		if index is not None:
			self._graphs_list -= -1
			self._timeline._charts.pop(index)
			self._timeline.repaint()


	def __graphs_list_selection_changed(self):        
		index = self._graphs_list.mouseSelectedRowIndex
		if index is not None:
			graph = self._timeline._charts[index]

			exponent_min = abs(decimal.Decimal(graph._graphMin).as_tuple().exponent)
			exponent_max = abs(decimal.Decimal(graph._graphMax).as_tuple().exponent)
			exponent_min = 4 if exponent_min>4 else exponent_min
			exponent_max = 4 if exponent_min>4 else exponent_min

			self._name.value            = graph.name
			self._min_value.decimals    = exponent_min
			self._min_value.value       = graph._graphMin
			self._max_value.decimals    = exponent_max
			
			self._max_value.value   = graph._graphMax
			self._values_zoom.value = graph._zoom * 100.0
			self._values_top.value  = graph._top

			self._loaded = True

			self._name.enabled          = True
			self._min_value.enabled     = True
			self._max_value.enabled     = True
			self._values_zoom.enabled   = True
			self._values_top.enabled    = True
			self._remove_graph_btn.enabled = True
		else:
			self._name.enabled          = False
			self._min_value.enabled     = False
			self._max_value.enabled     = False
			self._values_zoom.enabled   = False
			self._values_top.enabled    = False
			self._remove_graph_btn.enabled = False


	def __save_graphs_changes(self):
		index = self._graphs_list.mouseSelectedRowIndex
			
		if self._loaded and index is not None:
			graph = self._timeline._charts[index]

			logger.debug('Before: Min: {0} | Max: {1} Zoom: {2}'.format(graph.graph_min, graph.graph_max,graph.zoom ) )


			graph.name      = self._name.value; self._graphs_list.setValue(0, index, self._name.value)
			graph.graph_min = self._min_value.value
			graph.graph_max = self._max_value.value

			graph.zoom     	= self._values_zoom.value / 100.0
			graph.top      	= self._values_top.value  

			logger.debug('Min: {0} | Max: {1} Zoom: {2}'.format(graph.graph_min, graph.graph_max,graph.zoom ) )

			self._timeline.repaint()

	@property
	def charts(self):
		return self._timeline._charts
Пример #5
0
class GraphsProperties(BaseWidget):
    def __init__(self, timelineWidget=None):
        super(GraphsProperties, self).__init__('Graphs properties')
        self.setContentsMargins(10, 10, 10, 10)
        self._timeline = timelineWidget

        # Definition of the forms fields
        self._graphs_list = ControlList('Graphs list')
        self._name = ControlText('Name')
        self._min_value = ControlNumber('Min')
        self._max_value = ControlNumber('Max')
        self._values_zoom = ControlSlider('Amplitude', 100, 60, 400)
        self._values_top = ControlNumber('Top position', 0, -1000, 1000)
        self._remove_graph_btn = ControlButton('Remove graph')

        self._formset = [
            (['_graphs_list', '_remove_graph_btn'], '||', [
                ' ', '_name', ('_min_value', '_max_value'),
                ('_values_top', ' '), '_values_zoom', ' '
            ]),
        ]

        self._graphs_list.itemSelectionChanged = self.__graphs_list_selection_changed

        self._loaded = False

        self._name.changed = self.__save_graphs_changes
        self._min_value.changed = self.__save_graphs_changes
        self._max_value.changed = self.__save_graphs_changes
        self._values_zoom.changed = self.__save_graphs_changes
        self._values_top.changed = self.__save_graphs_changes

    def show(self):
        super(GraphsProperties, self).show()
        self._loaded = False

        self._graphs_list.clear()
        for graph in self._timeline._charts:
            self._graphs_list += [graph.name]

    def __graphs_list_selection_changed(self):
        index = self._graphs_list.mouseSelectedRowIndex
        if index is not None:
            graph = self._timeline._charts[index]

            exponent_min = abs(
                decimal.Decimal(graph._graphMin).as_tuple().exponent)
            exponent_max = abs(
                decimal.Decimal(graph._graphMax).as_tuple().exponent)
            exponent_min = 4 if exponent_min > 4 else exponent_min
            exponent_max = 4 if exponent_min > 4 else exponent_min

            self._name.value = graph.name
            self._min_value.decimals = exponent_min
            self._min_value.value = graph._graphMin
            self._max_value.decimals = exponent_max

            self._max_value.value = graph._graphMax
            self._values_zoom.value = graph._zoom * 100.0
            self._values_top.value = graph._top

            self._loaded = True

    def __save_graphs_changes(self):
        index = self._graphs_list.mouseSelectedRowIndex

        if self._loaded and index is not None:
            graph = self._timeline._charts[index]

            graph.name = self._name.value
            self._graphs_list.setValue(0, index, self._name.value)
            graph._graphMin = self._min_value.value
            graph._graphMax = self._max_value.value
            graph._zoom = self._values_zoom.value / 100.0
            graph._top = self._values_top.value

            self._timeline.repaint()
Пример #6
0
class GraphsProperties(BaseWidget):

	def __init__(self, timelineWidget=None):
		super(GraphsProperties, self).__init__('Graphs properties')
		self.setContentsMargins(10, 10, 10, 10)
		self._timeline = timelineWidget

		# Definition of the forms fields
		self._graphs_list = ControlList('Graphs list')
		self._name        = ControlText('Name')
		self._min_value   = ControlNumber('Min')
		self._max_value   = ControlNumber('Max')
		self._values_zoom = ControlSlider('Amplitude', 100, 60, 400)
		self._values_top  = ControlNumber('Top position', 0, -1000, 1000)
		self._remove_graph_btn = ControlButton('Remove graph')

		self._formset = [
			(
				['_graphs_list','_remove_graph_btn'],
				'||', 
				[
					' ',
					'_name',
					('_min_value', '_max_value'),
					('_values_top',' '),
					'_values_zoom',
					' '
				]),
			]

		self._graphs_list.itemSelectionChanged = self.__graphs_list_selection_changed

		self._loaded = False

		self._name.changed          = self.__save_graphs_changes
		self._min_value.changed     = self.__save_graphs_changes
		self._max_value.changed     = self.__save_graphs_changes
		self._values_zoom.changed   = self.__save_graphs_changes
		self._values_top.changed    = self.__save_graphs_changes

	def show(self):
		super(GraphsProperties, self).show()
		self._loaded = False

		self._graphs_list.clear()            
		for graph in self._timeline._charts:
			self._graphs_list += [graph.name]

	def __graphs_list_selection_changed(self):        
		index = self._graphs_list.mouseSelectedRowIndex
		if index is not None:
			graph = self._timeline._charts[index]

			exponent_min = abs(decimal.Decimal(graph._graphMin).as_tuple().exponent)
			exponent_max = abs(decimal.Decimal(graph._graphMax).as_tuple().exponent)
			exponent_min = 4 if exponent_min>4 else exponent_min
			exponent_max = 4 if exponent_min>4 else exponent_min

			self._name.value            = graph.name
			self._min_value.decimals    = exponent_min
			self._min_value.value       = graph._graphMin
			self._max_value.decimals    = exponent_max
			
			self._max_value.value   = graph._graphMax
			self._values_zoom.value = graph._zoom * 100.0
			self._values_top.value  = graph._top

			self._loaded = True

	def __save_graphs_changes(self):
		index = self._graphs_list.mouseSelectedRowIndex
			
		if self._loaded and index is not None:
			graph = self._timeline._charts[index]

			graph.name      = self._name.value; self._graphs_list.setValue(0, index, self._name.value)
			graph._graphMin = self._min_value.value   
			graph._graphMax = self._max_value.value   
			graph._zoom     = self._values_zoom.value / 100.0
			graph._top      = self._values_top.value  

			self._timeline.repaint()