コード例 #1
0
class TestAequilibraEData(TestCase):
    def test___init__(self):
        # Generates the dataset
        dataset = AequilibraeData()
        dataset.create_empty(**args)

        dataset.index[:] = np.arange(dataset.entries) + 100
        dataset.d[:] = dataset.index[:]**2
        if dataset.index[70] != 170:
            self.fail()

        if int(dataset.d[70]) != 28900:
            self.fail()

        # removes the dataset
        del dataset

    def test_load(self):
        # re-imports the dataset
        self.ad = AequilibraeData()
        self.ad.load(file_path)

        # checks if the values were properly saved
        if self.ad.index[70] != 170:
            self.fail("Value for data index test was not as expected")

        if int(self.ad.d[70]) != 28900:
            self.fail("Value for data field test was not as expected")

        for f in self.ad.fields:
            if f not in args["field_names"]:
                self.fail("Could not retrieve all fields")

    def test_export(self):
        self.test_load()
        temp_name = os.path.join(tempfile.gettempdir(),
                                 "aequilibrae_data_example.csv")
        self.ad.export(temp_name)
コード例 #2
0
class LoadDatasetDialog(QtWidgets.QDialog, FORM_CLASS):
    def __init__(self, iface, single_use=True):
        QtWidgets.QDialog.__init__(self)
        self.iface = iface
        self.setupUi(self)
        self.path = standard_path()

        self.output_name = None
        self.layer = None
        self.zones = None
        self.cells = None
        self.error = None
        self.selected_fields = None
        self.worker_thread = None
        self.dataset = None
        self.ignore_fields = []
        self.single_use = single_use

        self.radio_layer_matrix.clicked.connect(
            partial(self.size_it_accordingly, False))
        self.radio_aequilibrae.clicked.connect(
            partial(self.size_it_accordingly, False))
        self.chb_all_fields.clicked.connect(self.set_tables_with_fields)
        self.but_adds_to_links.clicked.connect(self.append_to_list)

        # For changing the network layer
        self.cob_data_layer.currentIndexChanged.connect(
            self.load_fields_to_combo_boxes)
        self.but_removes_from_links.clicked.connect(self.removes_fields)
        # For adding skims
        self.but_load.clicked.connect(self.load_from_aequilibrae_format)
        self.but_save_and_use.clicked.connect(self.load_the_vector)
        self.but_import_and_use.clicked.connect(self.load_just_to_use)

        # THIRD, we load layers in the canvas to the combo-boxes
        for layer in all_layers_from_toc():  # We iterate through all layers
            if "wkbType" in dir(layer):
                if layer.wkbType() in [100] + point_types + poly_types:
                    self.cob_data_layer.addItem(layer.name())

        if not self.single_use:
            self.radio_layer_matrix.setChecked(True)
            self.radio_aequilibrae.setEnabled(False)
            self.but_import_and_use.setEnabled(False)
            self.but_load.setEnabled(False)
            self.but_save_and_use.setText("Import")

        self.size_it_accordingly(partial(self.size_it_accordingly, False))

    def set_tables_with_fields(self):
        self.size_it_accordingly(False)

        if self.chb_all_fields.isChecked() and self.layer is not None:
            self.ignore_fields = []
            self.selected_fields = [
                x.name() for x in self.layer.dataProvider().fields().toList()
            ]

        for table in [self.table_all_fields, self.table_fields_to_import]:
            table.setRowCount(0)
            table.clearContents()
        if self.layer is not None:
            comb = [(self.table_fields_to_import, self.selected_fields),
                    (self.table_all_fields, self.ignore_fields)]
            for table, fields in comb:
                for field in fields:
                    table.setRowCount(table.rowCount() + 1)
                    item1 = QTableWidgetItem(field)
                    item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
                    table.setItem(table.rowCount() - 1, 0, item1)

    def size_it_accordingly(self, final=False):
        def set_size(w, h):
            self.setMaximumSize(QtCore.QSize(w, h))
            self.resize(w, h)

        if self.radio_aequilibrae.isChecked():
            set_size(154, 100)
        else:
            if final:
                if self.radio_layer_matrix.isChecked():
                    if self.chb_all_fields.isChecked():
                        set_size(498, 120)
                    self.progressbar.setMinimumHeight(100)
                else:
                    set_size(498, 410)
                    self.progressbar.setMinimumHeight(390)
            else:
                if self.chb_all_fields.isChecked():
                    set_size(449, 120)
                else:
                    set_size(449, 410)

    def removes_fields(self):
        for i in self.table_fields_to_import.selectedRanges():
            old_fields = [
                self.table_fields_to_import.item(row, 0).text()
                for row in xrange(i.topRow(),
                                  i.bottomRow() + 1)
            ]

            self.ignore_fields.extend(old_fields)
            self.selected_fields = [
                x for x in self.selected_fields if x not in old_fields
            ]

        self.set_tables_with_fields()

    def append_to_list(self):
        for i in self.table_all_fields.selectedRanges():
            new_fields = [
                self.table_all_fields.item(row, 0).text()
                for row in xrange(i.topRow(),
                                  i.bottomRow() + 1)
            ]

            self.selected_fields.extend(new_fields)
            self.ignore_fields = [
                x for x in self.ignore_fields if x not in new_fields
            ]

        self.set_tables_with_fields()

    def load_fields_to_combo_boxes(self):
        self.cob_index_field.clear()

        all_fields = []
        if self.cob_data_layer.currentIndex() >= 0:
            self.ignore_fields = []
            self.layer = get_vector_layer_by_name(
                self.cob_data_layer.currentText())
            self.selected_fields = [
                x.name() for x in self.layer.dataProvider().fields().toList()
            ]
            for field in self.layer.dataProvider().fields().toList():
                if field.type() in integer_types:
                    self.cob_index_field.addItem(field.name())
                    all_fields.append(field.name())
                if field.type() in float_types:
                    all_fields.append(field.name())
        self.set_tables_with_fields()

    def run_thread(self):
        self.worker_thread.ProgressValue.connect(
            self.progress_value_from_thread)
        self.worker_thread.ProgressMaxValue.connect(
            self.progress_range_from_thread)
        self.worker_thread.finished_threaded_procedure.connect(
            self.finished_threaded_procedure)

        self.chb_all_fields.setEnabled(False)
        self.but_load.setEnabled(False)
        self.but_save_and_use.setEnabled(False)
        self.worker_thread.start()
        self.exec_()

    # VAL and VALUE have the following structure: (bar/text ID, value)
    def progress_range_from_thread(self, val):
        self.progressbar.setRange(0, val)

    def progress_value_from_thread(self, val):
        self.progressbar.setValue(val)

    def finished_threaded_procedure(self, param):
        self.but_load.setEnabled(True)
        self.but_save_and_use.setEnabled(True)
        self.chb_all_fields.setEnabled(True)
        if self.worker_thread.error is not None:
            qgis.utils.iface.messageBar().pushMessage(
                "Error while loading vector:",
                self.worker_thread.error,
                level=1)
        else:
            self.dataset = self.worker_thread.output
        self.exit_procedure()

    def load_from_aequilibrae_format(self):
        out_name, _ = GetOutputFileName(self, "AequilibraE dataset",
                                        ["Aequilibrae dataset(*.aed)"], ".aed",
                                        self.path)
        try:
            self.dataset = AequilibraeData()
            self.dataset.load(out_name)
        except:
            self.error = "Could not load file. It might be corrupted or might not be a valid AequilibraE file"
        self.exit_procedure()

    def load_the_vector(self):
        if self.single_use:
            self.output_name = None
        else:
            self.error = None
            self.output_name, _ = GetOutputFileName(
                self, "AequilibraE dataset", ["Aequilibrae dataset(*.aed)"],
                ".aed", self.path)
            if self.output_name is None:
                self.error = "No name provided for the output file"

        if self.radio_layer_matrix.isChecked() and self.error is None:
            if self.cob_data_layer.currentIndex(
            ) < 0 or self.cob_index_field.currentIndex() < 0:
                self.error = "Invalid field chosen"

            index_field = self.cob_index_field.currentText()
            if index_field in self.selected_fields:
                self.selected_fields.remove(index_field)

            if len(self.selected_fields) > 0:
                self.worker_thread = LoadDataset(
                    qgis.utils.iface.mainWindow(),
                    layer=self.layer,
                    index_field=index_field,
                    fields=self.selected_fields,
                    file_name=self.output_name,
                )
                self.size_it_accordingly(True)
                self.run_thread()
            else:
                qgis.utils.iface.messageBar().pushMessage(
                    "Error:",
                    "One cannot load a dataset with indices only",
                    level=1)
        if self.error is not None:
            qgis.utils.iface.messageBar().pushMessage("Error:",
                                                      self.error,
                                                      level=1)

    def load_just_to_use(self):
        self.single_use = True
        self.load_the_vector()

    def exit_procedure(self):
        self.close()