Skip to content

Commit

Permalink
Merge pull request #787 from dsgoficial/dev
Browse files Browse the repository at this point in the history
Versão 4.10.0
  • Loading branch information
phborba committed Sep 8, 2023
2 parents ea7e2a4 + da2e0c5 commit 4744df1
Show file tree
Hide file tree
Showing 215 changed files with 185,936 additions and 162,095 deletions.
2 changes: 1 addition & 1 deletion .docker/docker-compose.yml
Expand Up @@ -2,7 +2,7 @@ version: '3'

services:
qgis:
image: qgis/qgis:release-3_18
image: qgis/qgis:release-3_30
container_name: dsgtools-testing-env
volumes:
# - /tmp/.X11-unix:/tmp/.X11-unix
Expand Down
1 change: 1 addition & 0 deletions .docker/exec.sh
Expand Up @@ -5,3 +5,4 @@ docker exec -t dsgtools-testing-env sh -c "cd /tests_directory && qgis_testrunne
docker exec -t dsgtools-testing-env sh -c "cd /tests_directory && qgis_testrunner.sh tests.test_CustomButtonSetup"
docker exec -t dsgtools-testing-env sh -c "cd /tests_directory && qgis_testrunner.sh tests.test_DsgToolsProcessingModel"
docker exec -t dsgtools-testing-env sh -c "cd /tests_directory && qgis_testrunner.sh tests.test_OtherAlgorithms"
docker exec -t dsgtools-testing-env sh -c "cd /tests_directory && qgis_testrunner.sh tests.test_graphHandler"
3 changes: 2 additions & 1 deletion .docker/start.sh
Expand Up @@ -4,8 +4,9 @@ docker-compose up -d --build
echo 'Wait 10 seconds'
sleep 10
echo 'Installation of the plugin'
docker exec -t dsgtools-testing-env sh -c "qgis_setup.sh DsgTools"
docker exec -t dsgtools-testing-env sh -c "qgis_setup.sh"
docker exec -t dsgtools-testing-env sh -c "rm -f /root/.local/share/QGIS/QGIS3/profiles/default/python/plugins/DsgTools"
docker exec -t dsgtools-testing-env sh -c "ln -s /tests_directory/ /root/.local/share/QGIS/QGIS3/profiles/default/python/plugins/DsgTools"
docker exec -t dsgtools-testing-env sh -c "apt update && apt install -y libqt5sql5-psql libqt5sql5-sqlite"
docker exec -t dsgtools-testing-env sh -c "pip3 install numpy networkx"
echo 'Containers are running'
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -45,7 +45,9 @@ Temporary Items

# Python files
# =========================
__pycache__/
*.pyc
*.cpython*
tags
.dsg_tools.py.swp

Expand Down
54 changes: 54 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,57 @@
# CHANGELOG


## 4.10.0 - 2023-09-08

Novas Funcionalidades:

- Novo processo de identificar erros de construção em linhas que devem se sobrepor (exemplo, barragem e rodovia);
- Novo processo de identificar linhas entrelaçadas;
- Novo processo de identificar linhas cruzando outra camada (exemplo: trecho de drenagem e barragem);
- Novo processo de consertar o direcionamento de rios (funcionamento diferente do direcionamento que existia: mudado o comportamento para não levar em consideração os ângulos de digitalização);
- Novo processo de carregar temas;
- Nova ferramenta para indicar tamanho da feição durante aquisição;
- Novo processo para verificar feições próximas;
- Novo processo para identificar objetos pequenos (identifica pequenas linhas e pequenas áreas ao mesmo tempo);
- Novo processo de adicionar feições a uma camada (AppendFeaturesToLayerAlgorithm);
- O DSGTools agora guarda o estado das ferramentas no projeto: quando o usuário abrir um projeto no qual estão salvos os estados das ferramentas, automaticamente cada ferramenta é ajustada com os parâmetros necessários para que o usuário retome o trabalho de onde parou. Guarda o estado do inspetor de feições, ferramenta de grid e ferramenta de centróides;
- Novo processo de ajustar parâmetros do seletor genérico (integração com o FP/SAP);
- Novo processo de ajustar parâmetros da ferramenta de aquisição com ângulos retos (integração com o FP/SAP);
- Novo processo de converter entre bancos de mesma modelagem, clipando com um polígono feito para integração com FP/SAP (ClipAndCopyFeaturesBetweenDatabasesAlgorithm);
- Novo processo de verificar ligação na moldura;


Melhorias:

- Melhoria de desempenho na construção de polígonos quando se utiliza polígonos na entrada que contém linhas que podem delimitar (caso área edificada versus via deslocamento);
- Adicionado registro de alteração do tile na barra de ferramentas de revisão;
- Adicionada uma verificação antes de excluir um menu no menu de aquisição;
- Adicionado ao processo de identificar geometrias inválidas a verificação de vértices com coordenadas infinitas ou nulas;
- Adicionado ao processo de identificar geometrias inválidas a correção de vértices com coordenadas infinitas ou nulas;
- O processo de criar camada temporária agora carrega a camada com a contagem de elementos ativada;
- Alterado o default do número de pontos na criação da moldura, de 12 para 4 (o algoritmo continua com a opção de densificar mais, caso o usuário queira);
- Alterados os inputs da ferramenta de extração de pontos cotados;
- Correção de bug com área sem dados na ferramenta de extração de pontos cotados;
- Adicionado ao processo de extrair elevação de MDS utilizando geometria da camada de entrada a opção de arredondar as casas decimais;
- Novos helps integrados aos processos de identificação do provedor de algoritmos;
- O snap hierárquico agora adiciona vértice tanto na referência, quanto na camada atraída;

Correção de bug:

- Correção de bug no rubberband da ferramenta de ângulos retos no QGIS 3.30;
- Correção de bug na reclassificação do menu de aquisição;
- Correção de bug no processo de construir polígonos por linha e centroides (Build Polygons From Center Points and Boundary): com a otimização da versão anterior, o algoritmo estava excluindo as linhas da moldura;
- Correção de bug na ferramenta de trocar a direção da linha (flip) que não funcionava com feição não salva;
- Corrige crash no QGIS 3.32 quando se usa o merge features em um memory layer criado pela ferramenta de copiar feições para camada temporária;
- Correção de bug na ferramenta de aquisição à mão livre que não era ativada ao clicar ou desconectada ao mudar de ferramenta de aquisição;
- Correção de bug na ferramenta de identificação de geometrias inválidas (caso de geometria nula);
- Correção de bug na ferramenta de identificação de feições próximas (medida inválida, melhoria do texto da flag);
- Correção de bug no processo de extrair pontos cotados;
- Correção de bug na ferramenta de ângulos retos (quando está ativado o trace digitizing);
- Correção de bug no linux no carrega camada (o QGIS mudou a assinatura do atribute duration do QgsMessageBarItem para inteiro e só dava o bug no linux);
- Correção de bug na ferramenta de medição (não dá mais erro ao ligar e desligar a ferramenta sem selecionar ferramenta de digitalização);
- Correção de bug no seletor genérico (agora funciona com mais de uma camada com mesmo nome);

## 4.8.0 - 2023-06-14

Novas Funcionalidades:
Expand All @@ -10,6 +62,8 @@ Novas Funcionalidades:
- Nova ferramenta de extrair centróides a partir de linhas e polígono digitalizado na tela (Center Point Tool);
- Novo processo de extrair elevação de MDS utilizando geometria da camada de entrada e gravar em campo de elevação;
- Novo processo de carregar camada PostGIS Raster;
- Novo processo de carregar tracks para o banco;
- Novo processo de validar tracks;

Melhorias:

Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
@@ -1,4 +1,4 @@
FROM qgis/qgis:final-3_4_13
FROM qgis/qgis:release-3_30
RUN mkdir /tests_directory && \
qgis_setup.sh DsgTools && \
cd /tests_directory && \
Expand Down
Expand Up @@ -3,12 +3,12 @@
from DsgTools.Modules.qgis.controllers.qgisCtrl import QgisCtrl
import json
from qgis.core import QgsWkbTypes

from qgis.utils import iface

class AcquisitionMenuCtrl:
def __init__(self, qgis=QgisCtrl(), widgetFactory=WidgetFactory()):
self.qgis = qgis
self.widgetFactory = widgetFactory
def __init__(self, qgis=None, widgetFactory=None):
self.qgis = qgis if qgis is not None else QgisCtrl()
self.widgetFactory = widgetFactory if widgetFactory is not None else WidgetFactory()
self.menuDock = None
self.menuEditor = None
self.addMenuTab = None
Expand Down Expand Up @@ -165,10 +165,6 @@ def removeMenuDock(self):

def openReclassifyDialog(self, buttonConfig, callback):
layers = self.qgis.getVectorLayersByName(buttonConfig["buttonLayer"])
if not layers:
raise Exception("Camada não encontrada!")
if len(layers) > 1:
raise Exception("Há camadas repetidas!")
layer = layers[0]
layerName = layer.dataProvider().uri().table() if layer.providerType() == "postgres" else layer.name()
layersToReclassification = self.getLayersForReclassification(
Expand All @@ -195,6 +191,25 @@ def openReclassifyDialog(self, buttonConfig, callback):
return
self.reclassifyDialog.showTopLevel()

def validLayersToReclassification(self, buttonConfig):
layers = self.qgis.getVectorLayersByName(buttonConfig["buttonLayer"])
if not layers:
raise Exception("Camada não encontrada!")
if len(layers) > 1:
raise Exception("Há camadas repetidas!")
layer = layers[0]
layerName = layer.dataProvider().uri().table() if layer.providerType() == "postgres" else layer.name()
layersToReclassification = self.getLayersForReclassification(
layerName, layer.geometryType()
)
if not layersToReclassification:
return
noActive = False
for l in layersToReclassification:
noActive = l.id() != iface.activeLayer().id()
if noActive:
raise Exception("Selecione somente feições da camada que está em uso!")

def reclassify(self, buttonConfig, reclassifyData):
destinatonLayerName = buttonConfig["buttonLayer"]
destinatonLayer = self.qgis.getVectorLayerByName(destinatonLayerName)
Expand Down
4 changes: 2 additions & 2 deletions DsgTools/Modules/acquisitionMenu/widgets/addButtonDialog.py
Expand Up @@ -6,12 +6,12 @@

class AddButtonDialog(QtWidgets.QDialog):
def __init__(
self, controller, messageFactory=UtilsFactory().createMessageFactory()
self, controller, messageFactory=None
):
super(AddButtonDialog, self).__init__()
uic.loadUi(self.getUiPath(), self)
self.controller = controller
self.messageFactory = messageFactory
self.messageFactory = messageFactory if messageFactory is not None else UtilsFactory().createMessageFactory()
self.uuid = None
self.tabCombo = None
self.layerCombo = None
Expand Down
Expand Up @@ -5,12 +5,12 @@

class AttributeTableWidget(QtWidgets.QWidget):
def __init__(
self, controller, messageFactory=UtilsFactory().createMessageFactory()
self, controller, messageFactory=None
):
super(AttributeTableWidget, self).__init__()
uic.loadUi(self.getUiPath(), self)
self.controller = controller
self.messageFactory = messageFactory
self.messageFactory = messageFactory if messageFactory is not None else UtilsFactory().createMessageFactory()
self.tableWidget.horizontalHeader().sortIndicatorOrder()
self.tableWidget.setSortingEnabled(True)
self.tableWidget.setColumnHidden(0, True)
Expand Down
11 changes: 11 additions & 0 deletions DsgTools/Modules/acquisitionMenu/widgets/buttonEditorWidget.py
@@ -1,5 +1,6 @@
import os, sys, copy
from PyQt5 import QtCore, uic, QtWidgets, QtGui
from qgis.PyQt.QtWidgets import QMessageBox
from .tableEditorWidget import TableEditorWidget
import json

Expand Down Expand Up @@ -43,6 +44,16 @@ def handleEditBtn(self, index):
self.showEditButton(self.getRowData(index.row()))

def handleDeleteBtn(self, index):
if (
QMessageBox.question(
self,
self.tr("Question"),
self.tr("Do you really want to delete?"),
QMessageBox.Ok | QMessageBox.Cancel,
)
== QMessageBox.Cancel
):
return
try:
deletedButtonData = self.getRowData(index.row())
self.getController().deleteButtonMenuEditor(deletedButtonData)
Expand Down
7 changes: 5 additions & 2 deletions DsgTools/Modules/acquisitionMenu/widgets/menuDock.py
Expand Up @@ -6,15 +6,15 @@

class MenuDock(QtWidgets.QDockWidget):
def __init__(
self, controller, messageFactory=UtilsFactory().createMessageFactory()
self, controller, messageFactory=None
):
super(MenuDock, self).__init__()
uic.loadUi(self.getUiPath(), self)
self.controller = controller
self.menuWidget = None
self.currentMenu = None
self.currentButton = None
self.messageFactory = messageFactory
self.messageFactory = messageFactory if messageFactory is not None else UtilsFactory().createMessageFactory()
self.menusCb.currentIndexChanged.connect(self.setCurrentMenu)

def showError(self, title, message):
Expand Down Expand Up @@ -51,6 +51,9 @@ def getMenuWidget(self):

def setCurrentButton(self, buttonConfig):
try:
if self.reclassifyCkb.isChecked():
self.getController().validLayersToReclassification(buttonConfig)

currentButton = self.getCurrentButtonConfig()
if currentButton:
self.getController().deactiveMenuButton(currentButton)
Expand Down
15 changes: 13 additions & 2 deletions DsgTools/Modules/acquisitionMenu/widgets/menuEditorDialog.py
Expand Up @@ -2,16 +2,17 @@
from PyQt5 import QtCore, uic, QtWidgets, QtGui
import json
from DsgTools.Modules.utils.factories.utilsFactory import UtilsFactory
from qgis.PyQt.QtWidgets import QMessageBox


class MenuEditorDialog(QtWidgets.QDialog):
def __init__(
self, controller, messageFactory=UtilsFactory().createMessageFactory()
self, controller, messageFactory=None
):
super(MenuEditorDialog, self).__init__()
uic.loadUi(self.getUiPath(), self)
self.controller = controller
self.messageFactory = messageFactory
self.messageFactory = messageFactory if messageFactory is not None else UtilsFactory().createMessageFactory()
self.previewMenu.setAcceptDrops(True)
self.previewMenu.dragEnterEvent = self.previewDragEnterEvent
self.previewMenu.dropEvent = self.previewDropEvent
Expand Down Expand Up @@ -176,6 +177,16 @@ def on_createMenuBtn_clicked(self):

@QtCore.pyqtSlot(bool)
def on_deleteMenuBtn_clicked(self):
if (
QMessageBox.question(
self,
self.tr("Question"),
self.tr("Do you really want to delete?"),
QMessageBox.Ok | QMessageBox.Cancel,
)
== QMessageBox.Cancel
):
return
self.menuWidget.setMenuName("")
self.menuWidget.clean()
self.tabEditorWidget.clearAllItems()
Expand Down
4 changes: 2 additions & 2 deletions DsgTools/Modules/acquisitionMenu/widgets/tableEditorWidget.py
Expand Up @@ -5,12 +5,12 @@

class TableEditorWidget(QtWidgets.QWidget):
def __init__(
self, controller, messageFactory=UtilsFactory().createMessageFactory()
self, controller, messageFactory=None
):
super(TableEditorWidget, self).__init__()
uic.loadUi(self.getUiPath(), self)
self.controller = controller
self.messageFactory = messageFactory
self.messageFactory = messageFactory if messageFactory is not None else UtilsFactory().createMessageFactory()
self.tableWidget.horizontalHeader().sortIndicatorOrder()
self.tableWidget.setSortingEnabled(True)

Expand Down
13 changes: 10 additions & 3 deletions DsgTools/Modules/qgis/controllers/qgisCtrl.py
Expand Up @@ -3,11 +3,11 @@
from PyQt5 import QtCore, uic, QtWidgets, QtGui
import json
from DsgTools.Modules.qgis.factories.actionsFactory import ActionsFactory

from qgis.core import QgsWkbTypes

class QgisCtrl:
def __init__(self, actionsFactory=ActionsFactory()):
self.actionsFactory = actionsFactory
def __init__(self, actionsFactory=None):
self.actionsFactory = actionsFactory if actionsFactory is not None else ActionsFactory()

def getLoadedVectorLayerNames(self):
layerNames = []
Expand Down Expand Up @@ -215,6 +215,13 @@ def attributeFeature(self, feature, layer, attributes):
feature.setAttribute(indx, attributeValue)

def cutAndPasteSelectedFeatures(self, layer, destinatonLayer, attributes):
geometryFilterDict = {
QgsWkbTypes.PointGeometry: (QgsWkbTypes.PointGeometry,),
QgsWkbTypes.LineGeometry: (QgsWkbTypes.LineGeometry,),
QgsWkbTypes.PolygonGeometry: (QgsWkbTypes.PointGeometry, QgsWkbTypes.PolygonGeometry)
}
if destinatonLayer.geometryType() not in geometryFilterDict[layer.geometryType()]:
return
layer.startEditing()
destinatonLayer.startEditing()
features = layer.selectedFeatures()
Expand Down
Empty file.

0 comments on commit 4744df1

Please sign in to comment.