Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 56 additions & 2 deletions Mergin/project_settings_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import typing
from qgis.PyQt import uic
from qgis.PyQt.QtGui import QIcon, QColor
from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtCore import Qt, QFileInfo
from qgis.PyQt.QtWidgets import QFileDialog, QMessageBox
from qgis.core import (
QgsProject,
Expand All @@ -16,8 +16,15 @@
QgsFeatureRequest,
QgsExpression,
QgsMapLayer,
QgsCoordinateReferenceSystem,
)
from qgis.gui import (
QgsOptionsWidgetFactory,
QgsOptionsPageWidget,
QgsColorButton,
QgsCoordinateReferenceSystemProxyModel,
QgsProjectionSelectionWidget,
)
from qgis.gui import QgsOptionsWidgetFactory, QgsOptionsPageWidget, QgsColorButton
from .attachment_fields_model import AttachmentFieldsModel
from .utils import (
mm_symbol_path,
Expand All @@ -31,6 +38,7 @@
invalid_filename_character,
qvariant_to_string,
escape_html_minimal,
copy_file_new,
)

ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui", "ui_project_config.ui")
Expand Down Expand Up @@ -118,6 +126,17 @@ def __init__(self, parent=None):
idx = self.cmb_sort_method.findData(mode) if ok else 1
self.cmb_sort_method.setCurrentIndex(idx)

self.cmb_vertical_crs.setFilters(QgsCoordinateReferenceSystemProxyModel.FilterVertical)
vcrs_def, ok = QgsProject.instance().readEntry("Mergin", "TargetVerticalCRS")
vertical_crs = (
QgsCoordinateReferenceSystem.fromWkt(vcrs_def) if ok else QgsCoordinateReferenceSystem.fromEpsgId(5773)
) # EGM96 geoid model
self.cmb_vertical_crs.crsChanged.connect(self.geoid_model_path_change_state)
self.cmb_vertical_crs.setCrs(vertical_crs)
self.cmb_vertical_crs.setOptionVisible(QgsProjectionSelectionWidget.CurrentCrs, True)
self.cmb_vertical_crs.setDialogTitle("Target Vertical CRS")
self.btn_get_geoid_file.clicked.connect(self.get_geoid_path)

self.local_project_dir = mergin_project_local_path()

if self.local_project_dir:
Expand All @@ -132,6 +151,28 @@ def __init__(self, parent=None):
self.attachment_fields.selectionModel().currentChanged.connect(self.update_expression_edit)
self.edit_photo_expression.expressionChanged.connect(self.expression_changed)

def geoid_model_path_change_state(self, newCRS):
if newCRS == QgsCoordinateReferenceSystem.fromEpsgId(5773):
self.label_geoid_file.hide()
self.edit_geoid_file.hide()
self.edit_geoid_file.clear()
self.btn_get_geoid_file.hide()
else:
self.label_geoid_file.show()
self.edit_geoid_file.show()
self.btn_get_geoid_file.show()

def get_geoid_path(self):
# open the set location or user home
open_path = (
QFileInfo(self.edit_geoid_file.text()).absolutePath()
if len(self.edit_geoid_file.text()) > 0
else os.path.expanduser("~")
)
abs_path = QFileDialog.getOpenFileName(None, "Select File", open_path, "Geoid Model Files (*.tif *.gtx)")
if len(abs_path[0]) > 0:
self.edit_geoid_file.setText(abs_path[0])

def get_sync_dir(self):
abs_path = QFileDialog.getExistingDirectory(
None,
Expand Down Expand Up @@ -309,6 +350,17 @@ def setup_map_sketches(self):
# create a new layer and add it as a map sketches layer
create_map_sketches_layer(QgsProject.instance().absolutePath())

# we could possibly first lookup if the gridfile is available with QGSProjUtils.gridsUsed()`
def package_vcrs_file(self, vertical_crs):
"""
Get the grid shift file picked by user and copy it to project proj folder. We do this only for vertical CRS different than EGM96.
"""
if len(self.edit_geoid_file.text()) == 0:
return True

project_proj_dir = os.path.join(mergin_project_local_path(), "proj")
return copy_file_new(project_proj_dir, self.edit_geoid_file.text())

def apply(self):
QgsProject.instance().writeEntry("Mergin", "PhotoQuality", self.cmb_photo_quality.currentData())
QgsProject.instance().writeEntry("Mergin", "Snapping", self.cmb_snapping_mode.currentData())
Expand Down Expand Up @@ -345,10 +397,12 @@ def apply(self):
expression = item.data(AttachmentFieldsModel.EXPRESSION)
QgsProject.instance().writeEntry("Mergin", f"PhotoNaming/{layer_id}/{field_name}", expression)

QgsProject.instance().writeEntry("Mergin", "TargetVerticalCRS", self.cmb_vertical_crs.crs().toWkt())
QgsProject.instance().writeEntry("Mergin", "SortLayersMethod/Method", self.cmb_sort_method.currentData())
self.save_config_file()
self.setup_tracking()
self.setup_map_sketches()
self.package_vcrs_file(self.cmb_vertical_crs.crs())

def colors_change_state(self) -> None:
"""
Expand Down
123 changes: 109 additions & 14 deletions Mergin/ui/ui_project_config.ui
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>-888</y>
<width>628</width>
<height>1444</height>
<y>-1160</y>
<width>621</width>
<height>1716</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
Expand Down Expand Up @@ -153,16 +153,16 @@
<string>Snapping</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="1">
<widget class="QComboBox" name="cmb_snapping_mode"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Snapping settings</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="cmb_snapping_mode"/>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
Expand Down Expand Up @@ -352,7 +352,7 @@
<layout class="QHBoxLayout" name="mColorsHorizontalLayout">
<item>
<widget class="QgsColorButton" name="mColorButton_2">
<property name="color">
<property name="color" stdset="0">
<color>
<red>255</red>
<green>255</green>
Expand All @@ -363,7 +363,7 @@
</item>
<item>
<widget class="QgsColorButton" name="mColorButton_6">
<property name="color">
<property name="color" stdset="0">
<color>
<red>18</red>
<green>24</green>
Expand All @@ -374,7 +374,7 @@
</item>
<item>
<widget class="QgsColorButton" name="mColorButton_5">
<property name="color">
<property name="color" stdset="0">
<color>
<red>94</red>
<green>158</green>
Expand All @@ -385,7 +385,7 @@
</item>
<item>
<widget class="QgsColorButton" name="mColorButton_4">
<property name="color">
<property name="color" stdset="0">
<color>
<red>87</red>
<green>180</green>
Expand All @@ -396,7 +396,7 @@
</item>
<item>
<widget class="QgsColorButton" name="mColorButton_3">
<property name="color">
<property name="color" stdset="0">
<color>
<red>253</red>
<green>203</green>
Expand All @@ -407,7 +407,7 @@
</item>
<item>
<widget class="QgsColorButton" name="mColorButton_1">
<property name="color">
<property name="color" stdset="0">
<color>
<red>255</red>
<green>156</green>
Expand All @@ -418,7 +418,7 @@
</item>
<item>
<widget class="QgsColorButton" name="mColorButton_7">
<property name="color">
<property name="color" stdset="0">
<color>
<red>255</red>
<green>143</green>
Expand Down Expand Up @@ -471,6 +471,95 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Vertical CRS</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<item row="4" column="2">
<widget class="QToolButton" name="btn_get_geoid_file">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QgsProjectionSelectionWidget" name="cmb_vertical_crs" native="true"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_16">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Vertical CRS</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_geoid_file">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Geoid model file</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_15">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Choose which vertical CRS will be used for elevation calculation. By default the mobile application uses EGM96_15 geoid model.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="edit_geoid_file">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>175</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="placeholderText">
<string>Select geoid model file</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_photo_sketching">
<property name="title">
Expand All @@ -493,7 +582,7 @@
<string>Photo sketching lets mobile app users draw freehand annotations directly on captured photos. This feature is in Preview: it works, but may still have some issues.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
<bool>true</bool>
</property>
</widget>
</item>
Expand Down Expand Up @@ -531,6 +620,12 @@
<header>qgsexpressionlineedit.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsProjectionSelectionWidget</class>
<extends>QWidget</extends>
<header>qgsprojectionselectionwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>chk_sync_enabled</tabstop>
Expand Down
15 changes: 15 additions & 0 deletions Mergin/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,21 @@ def copy_datum_shift_grids(grids_dir):
return missed_files


def copy_file_new(dst_dir, src_file):
"""
Copies file, which doesn't exist in destination directory, specified by absolute path.
"""
os.makedirs(dst_dir, exist_ok=True)
copy_ok = False
if os.path.exists(src_file):
dst = os.path.join(dst_dir, Path(src_file).name)
if not os.path.exists(dst):
shutil.copy(src_file, dst)
copy_ok = True

return copy_ok


def project_grids_directory(mp):
"""
Returns location of the "proj" directory inside MerginMaps project root directory
Expand Down
Loading