def toggle_menu_triggered(self, action): """ Toggles usae of layers :param action: the menu action that triggered this """ sync_action = SyncAction.NO_ACTION if action in (self.remove_hidden_action, self.remove_all_action): sync_action = SyncAction.REMOVE elif action in (self.add_all_offline_action, self.add_visible_offline_action): sync_action = SyncAction.OFFLINE # all layers if action in (self.remove_all_action, self.add_all_copy_action, self.add_all_offline_action): for i in range(self.layersTable.rowCount()): item = self.layersTable.item(i, 0) layer_source = item.data(Qt.UserRole) old_action = layer_source.action available_actions, _ = zip(*layer_source.available_actions) if sync_action in available_actions: layer_source.action = sync_action if layer_source.action != old_action: self.project.setDirty(True) layer_source.apply() # based on visibility elif action in (self.remove_hidden_action, self.add_visible_copy_action, self.add_visible_offline_action): visible = Qt.Unchecked if action == self.remove_hidden_action else Qt.Checked root = QgsProject.instance().layerTreeRoot() for layer in QgsProject.instance().mapLayers().values(): node = root.findLayer(layer.id()) if node and node.isVisible() == visible: layer_source = LayerSource(layer) old_action = layer_source.action available_actions, _ = zip(*layer_source.available_actions) if sync_action in available_actions: layer_source.action = sync_action if layer_source.action != old_action: self.project.setDirty(True) layer_source.apply() self.reloadProject()
def toggle_menu_triggered(self, action): """ Toggles usae of layers :param action: the menu action that triggered this """ sync_action = SyncAction.NO_ACTION if action in (self.remove_hidden_action, self.remove_all_action): sync_action = SyncAction.REMOVE elif action in (self.add_all_offline_action, self.add_visible_offline_action): sync_action = SyncAction.OFFLINE # all layers if action in (self.remove_all_action, self.add_all_copy_action, self.add_all_offline_action): for i in range(self.layersTable.rowCount()): item = self.layersTable.item(i, 0) layer_source = item.data(Qt.UserRole) old_action = layer_source.action available_actions, _ = zip(*layer_source.available_actions) if sync_action in available_actions: layer_source.action = sync_action if layer_source.action != old_action: self.project.setDirty(True) layer_source.apply() # based on visibility elif action in (self.remove_hidden_action, self.add_visible_copy_action, self.add_visible_offline_action): visible = Qt.Unchecked if action == self.remove_hidden_action else Qt.Checked root = QgsProject.instance().layerTreeRoot() for layer in QgsProject.instance().mapLayers().values(): node = root.findLayer(layer.id()) if node and node.isVisible() == visible: layer_source = LayerSource(layer) old_action = layer_source.action available_actions, _ = zip(*layer_source.available_actions) if sync_action in available_actions: layer_source.action = sync_action if layer_source.action != old_action: self.project.setDirty(True) layer_source.apply() self.reloadProject()
class MapLayerConfigWidget(QgsMapLayerConfigWidget, WidgetUi): def __init__(self, layer, canvas, parent): super(MapLayerConfigWidget, self).__init__(layer, canvas, parent) self.setupUi(self) self.layer_source = LayerSource(layer) self.project = QgsProject.instance() set_available_actions(self.layerActionComboBox, self.layer_source) self.isGeometryLockedCheckBox.setEnabled(self.layer_source.can_lock_geometry) self.isGeometryLockedCheckBox.setChecked(self.layer_source.is_geometry_locked) self.photoNamingTable = PhotoNamingTableWidget() self.photoNamingTable.addLayerFields(self.layer_source) self.photoNamingTable.setLayerColumnHidden(True) # insert the table as a second row only for vector layers if Qgis.QGIS_VERSION_INT >= 31300 and layer.type() == QgsMapLayer.VectorLayer: self.layout().insertRow(1, self.tr('Photo Naming'), self.photoNamingTable) self.photoNamingTable.setEnabled(self.photoNamingTable.rowCount() > 0) def apply(self): old_layer_action = self.layer_source.action old_is_geometry_locked = self.layer_source.is_geometry_locked self.layer_source.action = self.layerActionComboBox.itemData(self.layerActionComboBox.currentIndex()) self.layer_source.is_geometry_locked = self.isGeometryLockedCheckBox.isChecked() self.photoNamingTable.syncLayerSourceValues() # apply always the photo_namings (to store default values on first apply as well) if (self.layer_source.action != old_layer_action or self.layer_source.is_geometry_locked != old_is_geometry_locked or self.photoNamingTable.rowCount() > 0 ): self.layer_source.apply() self.project.setDirty(True)
def convert_to_offline(self, db, surveyor_expression_dict, export_dir): sys.path.append(PLUGINS_DIR) from qfieldsync.core.layer import LayerSource, SyncAction from qfieldsync.core.offline_converter import OfflineConverter from qfieldsync.core.project import ProjectConfiguration project = QgsProject.instance() extent = QgsRectangle() offline_editing = QgsOfflineEditing() # Configure project project_configuration = ProjectConfiguration(project) project_configuration.create_base_map = False project_configuration.offline_copy_only_aoi = False project_configuration.use_layer_selection = True # Layer config layer_sync_action = LayerConfig.get_field_data_capture_layer_config( db.names) total_projects = len(surveyor_expression_dict) current_progress = 0 for surveyor, layer_config in surveyor_expression_dict.items(): export_folder = os.path.join(export_dir, surveyor) # Get layers (cannot be done out of this for loop because the project is closed and layers are deleted) layers = { layer_name: None for layer_name, _ in layer_sync_action.items() } self.app.core.get_layers(db, layers, True) if not layers: return False, QCoreApplication.translate( "FieldDataCapture", "At least one layer could not be found.") # Configure layers for layer_name, layer in layers.items(): layer_source = LayerSource(layer) layer_source.action = layer_sync_action[layer_name] if layer_name in layer_config: layer_source.select_expression = layer_config[layer_name] layer_source.apply() offline_converter = OfflineConverter(project, export_folder, extent, offline_editing) offline_converter.convert() offline_editing.layerProgressUpdated.disconnect( offline_converter.on_offline_editing_next_layer) offline_editing.progressModeSet.disconnect( offline_converter.on_offline_editing_max_changed) offline_editing.progressUpdated.disconnect( offline_converter.offline_editing_task_progress) current_progress += 1 self.total_progress_updated.emit( int(100 * current_progress / total_projects)) return True, QCoreApplication.translate( "FieldDataCapture", "{count} offline projects have been successfully created in <a href='file:///{normalized_path}'>{path}</a>!" ).format(count=total_projects, normalized_path=normalize_local_url(export_dir), path=export_dir)