def testBestPathFinder(self):
        """Test full process to obtain layers (points and Lines layers)
        """
        import tempfile
        outputFolder = tempfile.mkdtemp("frd")

        polylineThreshold = 5

        parameters = {
            "min_slope_pct": 0,
            "max_slope_pct": 10,
            "semi_size": 2,
            "penalty_factor_xy": 40,
            "penalty_factor_z": 40
        }

        finder = oq.BestPathFinder(self.input_dtm, self.exclusion_areas_layer)
        finder.set_parameters(parameters)
        finder.set_output_folder(outputFolder)
        raw_layer = finder.create_raw_output_layer()

        simplified_layer = finder.create_simplified_output_layer(
            polylineThreshold)

        for point_index in af.waypoints_list(self.input_v_layer):
            finder.add_segment_to(point_index)

        self.assertEqual(raw_layer.dataProvider().featureCount(), 179)
        self.assertTrue(simplified_layer.isValid())
    def test_coords_and_indexes(self):
        """Test conversion between coordinates and indexes
        """
        waypoints_coords_list = af.waypoints_list(self.input_v_layer)
        wpts_index_array, ds_geotransform = af.coord_to_index(
            self.input_dtm, waypoints_coords_list)
        q_coords = af.index_to_coord(ds_geotransform, wpts_index_array)

        np.testing.assert_allclose(np.array(waypoints_coords_list), q_coords)
    def processRouteOptimization(self):
        """This function manages the progressBar
        """
        iface.messageBar().clearWidgets()
        progressMessageBar = iface.messageBar()
        progress = QProgressBar()
        progress.setMaximum(100)
        progressMessageBar.pushWidget(progress)

        waypointsLayer = QgsProject.instance().mapLayersByName(
            self.waypointsLayerComboBox.currentText())[0]

        try:
            ok, message = inputs_checker.check_layers(
                self.finder.dtm["layer"], waypointsLayer,
                self.finder.exclusion_areas["layer"])
            if not ok:
                raise ValueError(message)
            waypoints = af.waypoints_list(waypointsLayer)
            for idx, point_coords in enumerate(waypoints):

                def updateProgress(value):
                    progress.setValue(
                        max(
                            0,
                            float(value) / (len(waypoints) - 1) +
                            (idx - 1) * 100.0 / (len(waypoints) - 1)))
                    progress.repaint()

                self.finder.optimizer.progress_callback = updateProgress

                self.finder.add_segment_to(point_coords)
                for _ in range(10):
                    QgsApplication.instance().processEvents()
                self.finder.raw_layer.triggerRepaint()
                self.iface.mapCanvas().refresh()
                for _ in range(10):
                    QgsApplication.instance().processEvents()

        except ValueError as e:
            self.showMessageBox(unicode(e), u"Error del optimizador")

            self.showMessageBar(
                u"Forest Road Designer: ha fallado la optimización", u"Error",
                QgsMessageBar.WARNING)
            return False
        return True
    def testExclusionUtility(self):
        """Test if exclusion utility is working
        """
        import tempfile
        from qgis.core import QGis
        outputFolder = tempfile.mkdtemp("frd")

        parameters = {
            "min_slope_pct": 0,
            "max_slope_pct": 10,
            "semi_size": 2,
            "penalty_factor_xy": 40,
            "penalty_factor_z": 40
        }

        finder = oq.BestPathFinder(self.input_dtm, self.exclusion_areas_layer)
        finder.set_parameters(parameters)
        finder.set_output_folder(outputFolder)
        raw_layer = finder.create_raw_output_layer()
        for point_index in af.waypoints_list(self.input_v_layer):
            finder.add_segment_to(point_index)
        raw_layer = finder.create_raw_output_layer()
        self.assertTrue(raw_layer)

        provider = raw_layer.dataProvider().getFeatures()
        puntos_geom = []
        for elem in provider:
            geom2 = elem.geometry()
            if geom2.wkbType() == QGis.WKBPoint:
                puntos_geom.append(geom2)

        exc_provider = self.exclusion_areas_layer.dataProvider().getFeatures()
        exc_geoms = []
        for elem in exc_provider:
            geom1 = elem.geometry()
            exc_geoms.append(geom1)

        contenido = []
        for elem_exc in self.exclusion_areas_layer.dataProvider().getFeatures(
        ):
            for elem in raw_layer.dataProvider().getFeatures():
                geom2 = elem.geometry()
                geom1 = elem_exc.geometry()
                if geom1.contains(geom2):
                    contenido.append(geom2)
        self.assertEqual(contenido, [])