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 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)