Cancellazione multipla di viste

buongiorno,
ho un progetto con 25 viste.
sapete se c’è un modo per toglierle tutte insieme anziché una per volta o agire direttamente sul file di progetto?

grazie mille

s.

Salve
Ho provato a disiscrivermi dalla mailing list, ma nonostante tutto continuo
a ricevere messaggi. Potete aiutarmi?
grazie mille

Il giorno lun 22 lug 2024 alle ore 10:42 stefano via OSGeo Discourse <
noreply@discourse.osgeo.org> ha scritto:

skampus https://discourse.osgeo.org/u/skampus
July 22

buongiorno,
ho un progetto con 25 viste.
sapete se c’è un modo per toglierle tutte insieme anziché una per volta o
agire direttamente sul file di progetto?

grazie mille

s.


Emanuele Di Fini

@skampus che io sappia dall’interfaccia non esiste un gestore delle viste, quindi, il mio consiglio è di salvare il progetto con un nome diverso (in modo da non perdere l’originale in caso di errori) dopodichè, agendo sul file .qgs del progetto appena salvato, cerca il tag <visibility-presets> , (avendo cura di non rimuovere il tag iniziale e quello finale), elimina dal file tutte le informazioni relative alle viste da cancellare compreso il tag </visibility-presets> di chiusura di ogni vista (tranne ovviamente di quella che vuoi mantenere), come nell’esempio dello screenshot

se il progetto si apre senza errori allora lo potrai sostituire a quello di partenza
Saluti
Antonio

fatto!

s.

speravo di non dovere fare questo, anche perché ormai uso qgz e quindi mi tocca decomprimerlo editarlo e ricomprimerlo.
vediamo se riesco a fare uno script.

grazie per la dritta, comunque

s.

1 Like

Putroppo da interfaccia, a mia conoscenza, esiste solo la possibilità di eliminare la vista corrente, quindi nel tuo caso si tratterebbe di decine di click.
per quanto riguarda il qgz, lo puoi decomprimere, editarlo, aprirlo nuovamente in QGIS e salvarlo di nuovo in .qgz :wink:

Ciao stefano. prova avviare questo script python vedi se ti funziona.

from qgis.PyQt.QtWidgets import QApplication, QDialog, QVBoxLayout,
QCheckBox, QPushButton, QLabel
from qgis.core import QgsProject

class RemoveViewsDialog(QDialog):
def init(self):
super().init()
self.setWindowTitle(‘Rimuovi Viste’)
self.layout = QVBoxLayout()

    self.views = QgsProject.instance().mapViews()
    self.checkboxes = []

    if not self.views:
        self.layout.addWidget(QLabel("Nessuna vista disponibile."))
    else:
        for view in self.views:
            checkbox = QCheckBox(view.name())
            self.layout.addWidget(checkbox)
            self.checkboxes.append((checkbox, view))

        self.remove_button = QPushButton('Rimuovi Selezionate')
        self.remove_button.clicked.connect(self.remove_selected_views)
        self.layout.addWidget(self.remove_button)

    self.setLayout(self.layout)

def remove_selected_views(self):
    project = QgsProject.instance()
    for checkbox, view in self.checkboxes:
        if checkbox.isChecked():
            project.removeMapView(view)
    self.close()

Mostra il dialogo

app = QApplication()
dialog = RemoveViewsDialog()
dialog.exec_()

Spero ti aiuti
E

Il lun 22 lug 2024, 11:39 stefano via OSGeo Discourse <
noreply@discourse.osgeo.org> ha scritto:

skampus https://discourse.osgeo.org/u/skampus
July 22

buongiorno,
ho un progetto con 25 viste.
sapete se c’è un modo per toglierle tutte insieme anziché una per volta o
agire direttamente sul file di progetto?

grazie mille

s.

Visit Topic
https://discourse.osgeo.org/t/cancellazione-multipla-di-viste/30986/1
or reply to this email to respond.

To unsubscribe from these emails, click here
https://discourse.osgeo.org/email/unsubscribe/6170f633f0f37f332a11a42b97b636a35ce952989dcfaefde84fff9ae720548a
.

Ecco lo script che ha creato dopo cinque o sei tentativi chatGPT.
non ho idea se sia stilisticamente “elegante” ma funziona.

copiare lo script nella console python che si trova nel menu dei Plugin e lanciarlo.

compare una finestra di dialogo che chiede una stringa contenuta nel nome delle viste e cancellerà tutte le viste che contengono quella stringa nel nome.
se anziché una stringa si inserisce l’asterisco (*) saranno cancellate tutte le viste.

from qgis.core import QgsProject
from PyQt5.QtWidgets import QInputDialog

# Funzione per eliminare i temi di mappa (map themes) che contengono una stringa specifica
def delete_map_themes(search_string):
    # Ottieni il progetto corrente
    project = QgsProject.instance()

    # Accedi ai temi di mappa salvati
    map_themes = project.mapThemeCollection()

    # Ottieni tutti i nomi dei temi di mappa salvati
    themes = map_themes.mapThemes()

    # Controlla se l'utente vuole eliminare tutti i temi di mappa
    if search_string == "*":
        for theme in themes:
            map_themes.removeMapTheme(theme)
            print(f"Tema di mappa '{theme}' eliminato.")
        print("Tutti i temi di mappa sono stati eliminati.")
    else:
        # Elimina i temi di mappa che contengono la stringa specificata
        for theme in themes:
            if search_string in theme:
                map_themes.removeMapTheme(theme)
                print(f"Tema di mappa '{theme}' eliminato.")

# Richiedi all'utente di inserire la stringa di ricerca tramite una finestra di dialogo
search_string, ok = QInputDialog.getText(None, "Elimina Temi di Mappa", "Inserisci la stringa da cercare (inserisci '*' per eliminare tutti i temi di mappa):")

# Controlla se l'utente ha premuto "OK" nella finestra di dialogo
if ok:
    # Chiama la funzione per eliminare i temi di mappa
    delete_map_themes(search_string)
1 Like

Copialo e incollalo in qgis python e lo avvii. Dovrebbe comparirti una
finestra con i checkbox delle view che vuoi canacellare. Prova sempre su
una copia non vorrei che corrompesse qualcosa

Il lun 22 lug 2024, 12:19 Enzo Cocca enzo.ccc@gmail.com ha scritto:

Ciao stefano. prova avviare questo script python vedi se ti funziona.

from qgis.PyQt.QtWidgets import QApplication, QDialog, QVBoxLayout,
QCheckBox, QPushButton, QLabel
from qgis.core import QgsProject

class RemoveViewsDialog(QDialog):
def init(self):
super().init()
self.setWindowTitle(‘Rimuovi Viste’)
self.layout = QVBoxLayout()

    self.views = QgsProject.instance().mapViews()
    self.checkboxes = []

    if not self.views:
        self.layout.addWidget(QLabel("Nessuna vista disponibile."))
    else:
        for view in self.views:
            checkbox = QCheckBox(view.name())
            self.layout.addWidget(checkbox)
            self.checkboxes.append((checkbox, view))

        self.remove_button = QPushButton('Rimuovi Selezionate')
        self.remove_button.clicked.connect(self.remove_selected_views)
        self.layout.addWidget(self.remove_button)

    self.setLayout(self.layout)

def remove_selected_views(self):
    project = QgsProject.instance()
    for checkbox, view in self.checkboxes:
        if checkbox.isChecked():
            project.removeMapView(view)
    self.close()

Mostra il dialogo

app = QApplication()
dialog = RemoveViewsDialog()
dialog.exec_()

Spero ti aiuti
E

Il lun 22 lug 2024, 11:39 stefano via OSGeo Discourse <
noreply@discourse.osgeo.org> ha scritto:

skampus https://discourse.osgeo.org/u/skampus
July 22

buongiorno,
ho un progetto con 25 viste.
sapete se c’è un modo per toglierle tutte insieme anziché una per volta o
agire direttamente sul file di progetto?

grazie mille

s.

Visit Topic
https://discourse.osgeo.org/t/cancellazione-multipla-di-viste/30986/1
or reply to this email to respond.

To unsubscribe from these emails, click here
https://discourse.osgeo.org/email/unsubscribe/6170f633f0f37f332a11a42b97b636a35ce952989dcfaefde84fff9ae720548a
.

Si potrebbero fare miglioramenti stilistici e aggiungere elementi di
controllo sulle eccezioni. Inoltre conviene sempre usare il pyqt di di
qgis. Ad ogni modo se ti funziona ottimo. :love_you_gesture:

Il lun 22 lug 2024, 12:26 stefano via OSGeo Discourse <
noreply@discourse.osgeo.org> ha scritto:

skampus https://discourse.osgeo.org/u/skampus
July 22

Ecco lo script che ha creato dopo cinque o sei tentativi chatGPT.
non ho idea se sia stilisticamente “elegante” ma funziona.

copiare lo script nella console python che si trova nel menu dei Plugin e
lanciarlo.

compare una finestra di dialogo che chiede una stringa contenuta nel nome
delle viste e cancellerà tutte le viste che contengono quella stringa nel
nome.
se anziché una stringa si inserisce l’asterisco (*) saranno cancellate
tutte le viste.

from qgis.core import QgsProject
from PyQt5.QtWidgets import QInputDialog

Funzione per eliminare i temi di mappa (map themes) che contengono una stringa specifica

def delete_map_themes(search_string):
# Ottieni il progetto corrente
project = QgsProject.instance()

# Accedi ai temi di mappa salvati
map_themes = project.mapThemeCollection()

# Ottieni tutti i nomi dei temi di mappa salvati
themes = map_themes.mapThemes()

# Controlla se l'utente vuole eliminare tutti i temi di mappa
if search_string == "*":
    for theme in themes:
        map_themes.removeMapTheme(theme)
        print(f"Tema di mappa '{theme}' eliminato.")
    print("Tutti i temi di mappa sono stati eliminati.")
else:
    # Elimina i temi di mappa che contengono la stringa specificata
    for theme in themes:
        if search_string in theme:
            map_themes.removeMapTheme(theme)
            print(f"Tema di mappa '{theme}' eliminato.")

Richiedi all’utente di inserire la stringa di ricerca tramite una finestra di dialogo

search_string, ok = QInputDialog.getText(None, “Elimina Temi di Mappa”, “Inserisci la stringa da cercare (inserisci ‘*’ per eliminare tutti i temi di mappa):”)

Controlla se l’utente ha premuto “OK” nella finestra di dialogo

if ok:
# Chiama la funzione per eliminare i temi di mappa
delete_map_themes(search_string)


Visit Topic
https://discourse.osgeo.org/t/cancellazione-multipla-di-viste/30986/8
or reply to this email to respond.

To unsubscribe from these emails, click here
https://discourse.osgeo.org/email/unsubscribe/adc2da01d0415dc68a30a8a5c5d8068e568f5eef926b49d962b8ddf4bb3b22be
.

Scusatemi, sto scrivendo come moderatore

non ‘buttare script mal formattati e senza spiegazione’

se volete partecipare fatelo bene, perdeteci un po’ di tempo questa non è una chat.

saluti

grazie mille Enzo.
è fantastico che si possa risolvere un problema in mille modi diversi.

grazie ancora per il tuo tempo :kissing_heart:

s.

grazie del tuo intervento.
in realtà lo script è commentato in ogni sua parte e quanto alla formattazione ho selezionato il testo dello script e premuto il tasto Preformatted text.

se non va bene, troviamo insieme una specifica che pubblichiamo nelle regole?

grazie mille

s.

Ciao @skampus non mi riferivo a te, il tuo script funziona ed è ben formattato.

grazie

@skampus scusa Stefano, l’ho provato, ma permette di cercare una stringa per volta, quindi la cancella senza chiedere conferma, per cancellare selettivamente la serie di viste desiderate bisogna agire rilanciando più volte lo script oppure ho capito male?

Mi dispiace e chiedo scusa per la formattazione ma era una soluzione che ho
scritto al volo tramite cellulare

Il lun 22 lug 2024, 12:56 Totò Fiandaca via OSGeo Discourse <
noreply@discourse.osgeo.org> ha scritto:

pigreco https://discourse.osgeo.org/u/pigreco
July 22

skampus:

se non va bene, troviamo insieme una specifica che pubblichiamo nelle
regole?

Ciao @skampus https://discourse.osgeo.org/u/skampus non mi riferivo a
te, il tuo script funziona ed è ben formattato.

grazie

Visit Topic
https://discourse.osgeo.org/t/cancellazione-multipla-di-viste/30986/14
or reply to this email to respond.

To unsubscribe from these emails, click here
https://discourse.osgeo.org/email/unsubscribe/a54a0f8aff969e7f887957528d414c5ea5e913c0522562807c2fc2e4b19d4a7f
.

sì è corretto come hai inteso.
provo a fare aggiungere la possibilità di selezione manuale, ma per come organizzo io le viste, la stringa mi era sufficiente.

s.

1 Like
from qgis.core import QgsProject
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QCheckBox, QPushButton, QScrollArea, QWidget, QVBoxLayout

# Classe per la finestra di dialogo con le checkbox
class MapThemeDeletionDialog(QDialog):
    def __init__(self, themes):
        super().__init__()
        self.setWindowTitle("Elimina Temi di Mappa")
        self.layout = QVBoxLayout()

        # Creare una scroll area per gestire un numero elevato di checkbox
        self.scroll = QScrollArea()
        self.scroll_widget = QWidget()
        self.scroll_layout = QVBoxLayout()
        self.scroll_widget.setLayout(self.scroll_layout)
        self.scroll.setWidget(self.scroll_widget)
        self.scroll.setWidgetResizable(True)

        # Crea una checkbox per ogni tema di mappa
        self.checkboxes = []
        for theme in themes:
            checkbox = QCheckBox(theme)
            self.checkboxes.append(checkbox)
            self.scroll_layout.addWidget(checkbox)

        self.layout.addWidget(self.scroll)

        # Crea un pulsante per confermare la cancellazione
        self.delete_button = QPushButton("Elimina Temi Selezionati")
        self.delete_button.clicked.connect(self.delete_selected_themes)
        self.layout.addWidget(self.delete_button)

        self.setLayout(self.layout)
        self.themes_to_delete = []

    # Funzione per ottenere i temi selezionati
    def delete_selected_themes(self):
        self.themes_to_delete = [cb.text() for cb in self.checkboxes if cb.isChecked()]
        self.accept()

# Funzione per eliminare i temi di mappa selezionati
def delete_map_themes(themes_to_delete):
    project = QgsProject.instance()
    map_themes = project.mapThemeCollection()

    for theme in themes_to_delete:
        map_themes.removeMapTheme(theme)
        print(f"Tema di mappa '{theme}' eliminato.")
    print("Temi di mappa selezionati sono stati eliminati.")

# Funzione principale
def main():
    # Ottieni il progetto corrente e i temi di mappa salvati
    project = QgsProject.instance()
    map_themes = project.mapThemeCollection()
    themes = map_themes.mapThemes()

    # Mostra la finestra di dialogo per selezionare i temi di mappa da eliminare
    dialog = MapThemeDeletionDialog(themes)
    if dialog.exec_():
        delete_map_themes(dialog.themes_to_delete)

# Esegui la funzione principale
main()

@skampus mi sono permesso di prendere spunto e ho chiesto a Chatgpt di crearmi questo script, ora appare un popup con le checkbox per ogni vista

spero possa essere utile

Antonio

2 Likes