Skip to content

Commit 4c701ae

Browse files
7.5.1
1 parent 35463b5 commit 4c701ae

19 files changed

Lines changed: 24794 additions & 23600 deletions

__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def description():
4242

4343

4444
def version():
45-
return 'Version 7.5.0 - Matera'
45+
return 'Version 7.5.1 - Matera'
4646

4747

4848
def icon():

dock/scpdock.py

Lines changed: 110 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -120,43 +120,61 @@ def redoPreview(self):
120120
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), "REDO Preview")
121121

122122
# set all items to state 0 or 2
123-
def allItemsSetState(self, value):
123+
def allItemsSetState(self, value, selected = None):
124124
tW = cfg.uidc.signature_list_treeWidget
125+
tW.setSortingEnabled(False)
125126
tW.blockSignals(True)
126-
for id, val in cfg.treeDockItm.items():
127-
if cfg.actionCheck == 'Yes':
128-
cfg.treeDockItm[str(id)].setCheckState(0, value)
129-
else:
130-
# logger
131-
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), " cancelled")
132-
tW.blockSignals(False)
127+
if selected is None:
128+
for id, val in cfg.treeDockItm.items():
129+
if cfg.actionCheck == 'Yes':
130+
cfg.treeDockItm[str(id)].setCheckState(0, value)
131+
cfg.signList['CHECKBOX_' + str(id)] = cfg.treeDockItm[str(id)].checkState(0)
132+
else:
133+
# logger
134+
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' cancelled')
135+
break
136+
else:
137+
for i in tW.selectedItems():
138+
if cfg.actionCheck == 'Yes':
139+
# classes
140+
if len(i.text(1)) > 0:
141+
try:
142+
i.setCheckState(0, value)
143+
cfg.signList['CHECKBOX_' + str(i.text(5))] = cfg.treeDockItm[str(i.text(5))].checkState(0)
144+
except:
145+
pass
146+
# macroclasses
147+
else:
148+
count = i.childCount()
149+
for roi in range(0, count):
150+
try:
151+
i.child(roi).setCheckState(0, value)
152+
cfg.signList['CHECKBOX_' + str(i.child(roi).text(5))] = cfg.treeDockItm[str(i.child(roi).text(5))].checkState(0)
153+
except:
154+
pass
155+
else:
156+
# logger
157+
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' cancelled')
158+
break
159+
tW.setSortingEnabled(True)
133160
tW.blockSignals(False)
134161

135162
# select all signatures
136-
def selectAllSignatures(self, check):
137-
tW = cfg.uidc.signature_list_treeWidget
138-
tW.setSortingEnabled(False)
139-
tW.blockSignals(True)
163+
def selectAllSignatures(self, check = None, selected = None):
164+
cfg.uiUtls.addProgressBar()
140165
try:
141-
cfg.uiUtls.addProgressBar()
142166
# select all
143167
if check is True:
144-
cfg.SCPD.allItemsSetState(2)
168+
cfg.SCPD.allItemsSetState(2, selected)
145169
# unselect all
146170
else:
147-
cfg.SCPD.allItemsSetState(0)
148-
for id, val in cfg.treeDockItm.items():
149-
id = cfg.treeDockItm[str(id)].text(5)
150-
cfg.signList['CHECKBOX_' + str(id)] = cfg.treeDockItm[str(id)].checkState(0)
151-
cfg.uiUtls.removeProgressBar()
171+
cfg.SCPD.allItemsSetState(0, selected)
152172
# logger
153173
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' all signatures')
154174
except Exception as err:
155175
# logger
156176
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), " ERROR exception: " + str(err))
157-
cfg.uiUtls.removeProgressBar()
158-
tW.setSortingEnabled(True)
159-
tW.blockSignals(False)
177+
cfg.uiUtls.removeProgressBar()
160178

161179
# export signature list to file
162180
def saveSignatureList(self, signatureFile):
@@ -1276,25 +1294,43 @@ def clearTree(self, tree = None):
12761294
cfg.uidc.signature_list_treeWidget.customContextMenuRequested.connect(cfg.SCPD.contextMenu)
12771295
return cfg.uidc.signature_list_treeWidget
12781296

1297+
# add item to menu
1298+
def addMenuItem(self, menu, function, iconName, name, tooltip = ''):
1299+
try:
1300+
action = cfg.QtWidgetsSCP.QAction(cfg.QtGuiSCP.QIcon(':/plugins/semiautomaticclassificationplugin/icons/' + iconName), name, cfg.iface.mainWindow())
1301+
except:
1302+
action = cfg.QtWidgetsSCP.QAction(name, cfg.iface.mainWindow())
1303+
action.setObjectName('action')
1304+
action.setToolTip(tooltip)
1305+
action.triggered.connect(function)
1306+
menu.addAction(action)
1307+
return action
1308+
12791309
# menu
12801310
def contextMenu(self, event):
12811311
#index = cfg.uidc.signature_list_treeWidget.indexAt(event)
12821312
#cfg.itemMenu = cfg.uidc.signature_list_treeWidget.itemAt(event)
12831313
#cfg.uidc.signature_list_treeWidget.setCurrentItem(cfg.itemMenu)
12841314
m = cfg.QtWidgetsSCP.QMenu()
1285-
zoomToMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.zoomToMenu, 'semiautomaticclassificationplugin_zoom_to_ROI.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Zoom to highlighted items'))
1286-
selectAllMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.selectAllMenu, 'semiautomaticclassificationplugin_batch_check.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Check/uncheck all'))
1287-
clearSelectionMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.clearSelectionMenu, 'semiautomaticclassificationplugin_select_all.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Clear selection'))
1288-
collapseMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.collapseMenu, 'semiautomaticclassificationplugin_docks.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Collapse/expand all'))
1315+
m.setToolTipsVisible(True)
1316+
zoomToMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.zoomToMenu, 'semiautomaticclassificationplugin_zoom_to_ROI.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Zoom to'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Zoom to highlighted items'))
1317+
selectAllMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.selectAllMenu, 'semiautomaticclassificationplugin_batch_check.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Check/uncheck'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Check/uncheck highlighted items'))
1318+
clearSelectionMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.clearSelectionMenu, 'semiautomaticclassificationplugin_select_all.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Clear selection'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Clear selection of highlighted items'))
1319+
collapseMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.collapseMenu, 'semiautomaticclassificationplugin_docks.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Collapse/expand all'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Collapse/expand all macroclasses'))
1320+
m.addSeparator()
1321+
changeMacroclassMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.changeMacroclassMenu, 'semiautomaticclassificationplugin_enter.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Change MC ID'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Change MC ID for highlighted items'))
1322+
changeColorMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.changeColorMenu, 'semiautomaticclassificationplugin_enter.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Change color'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Change color for highlighted items'))
1323+
m.addSeparator()
1324+
mergeSignaturesMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.mergeSelectedSignatures, 'semiautomaticclassificationplugin_merge_sign_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Merge items'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Merge highlighted items'))
1325+
calculateSignaturesMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.calculateSignatures, 'semiautomaticclassificationplugin_add_sign_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Calculate signatures'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Calculate signatures for highlighted items'))
1326+
deleteSignaturesMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.removeSelectedSignatures, 'semiautomaticclassificationplugin_delete_signature.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Delete items'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Delete highlighted items'))
12891327
m.addSeparator()
1290-
mergeSignaturesMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.mergeSelectedSignatures, 'semiautomaticclassificationplugin_merge_sign_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Merge highlighted items'))
1291-
calculateSignaturesMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.calculateSignatures, 'semiautomaticclassificationplugin_add_sign_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Calculate signatures for highlighted items'))
1292-
deleteSignaturesMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.removeSelectedSignatures, 'semiautomaticclassificationplugin_delete_signature.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Delete highlighted items'))
1293-
changeMacroclassMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.changeMacroclassMenu, 'semiautomaticclassificationplugin_enter.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Change MC ID for highlighted items'))
1328+
addSignaturesPlotMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.addSignatureToSpectralPlot, 'semiautomaticclassificationplugin_sign_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Add to spectral plot'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Add highlighted items to spectral plot'))
1329+
addScatterPlotMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.addROIToScatterPlot, 'semiautomaticclassificationplugin_scatter_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Add to scatter plot'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Add highlighted items to scatter plot'))
1330+
propertiesMenu = cfg.SCPD.addMenuItem(m, cfg.SCPD.propertiesMenu, 'semiautomaticclassificationplugin_accuracy_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Properties'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Properties for highlighted items'))
12941331
m.addSeparator()
1295-
addSignaturesPlotMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.addSignatureToSpectralPlot, 'semiautomaticclassificationplugin_sign_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Add highlighted items to spectral plot'))
1296-
addScatterPlotMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.addROIToScatterPlot, 'semiautomaticclassificationplugin_scatter_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Add highlighted items to scatter plot'))
1297-
propertiesMenu = cfg.ipt.addMenuItem(m, cfg.SCPD.propertiesMenu, 'semiautomaticclassificationplugin_accuracy_tool.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Properties'))
1332+
importMenu = cfg.SCPD.addMenuItem(m, cfg.utls.importSignaturesTab, 'semiautomaticclassificationplugin_import_spectral_library.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Import'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Import spectral signatures'))
1333+
exportMenu = cfg.SCPD.addMenuItem(m, cfg.utls.exportSignaturesTab, 'semiautomaticclassificationplugin_export_spectral_library.svg', cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Export'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Export highlighted items'))
12981334
m.exec_(cfg.uidc.signature_list_treeWidget.mapToGlobal(event))
12991335

13001336
# properties menu
@@ -1344,6 +1380,25 @@ def changeMacroclassMenu(self):
13441380
cfg.utls.editFeatureShapefile(cfg.shpLay, rI, cfg.fldMacroID_class, mc)
13451381
cfg.SCPD.ROIListTableTree(cfg.shpLay, cfg.uidc.signature_list_treeWidget)
13461382

1383+
# change color menu
1384+
def changeColorMenu(self):
1385+
if len(cfg.uidc.signature_list_treeWidget.selectedItems()) > 0:
1386+
c = cfg.utls.selectColor()
1387+
if c is not None:
1388+
r = []
1389+
for i in cfg.uidc.signature_list_treeWidget.selectedItems():
1390+
id = i.text(5)
1391+
try:
1392+
cfg.treeDockItm[str(id)].setBackground(4, c)
1393+
cfg.signList['COLOR_' + str(id)] = c
1394+
except:
1395+
pass
1396+
try:
1397+
cfg.treeDockMCItm[str(id)].setBackground(4, c)
1398+
cfg.SCPD.roiMacroclassInfoCompleter()
1399+
except:
1400+
pass
1401+
13471402
# clear selection menu
13481403
def clearSelectionMenu(self):
13491404
cfg.uidc.signature_list_treeWidget.clearSelection()
@@ -1364,9 +1419,25 @@ def zoomToMenu(self):
13641419

13651420
# select all menu
13661421
def selectAllMenu(self):
1422+
for i in cfg.uidc.signature_list_treeWidget.selectedItems():
1423+
# classes
1424+
if len(i.text(1)) > 0:
1425+
try:
1426+
v = cfg.signList['CHECKBOX_' + str(i.text(5))]
1427+
break
1428+
except:
1429+
pass
1430+
# macroclasses
1431+
else:
1432+
count = i.childCount()
1433+
for roi in range(0, count):
1434+
try:
1435+
v = cfg.signList['CHECKBOX_' + str(i.child(roi).text(5))]
1436+
break
1437+
except:
1438+
pass
13671439
try:
1368-
c = cfg.treeDockMCItm[next(iter(cfg.treeDockMCItm))]
1369-
cfg.SCPD.selectAllSignatures(not cfg.signList['CHECKBOX_' + str(c.child(0).text(5))])
1440+
cfg.SCPD.selectAllSignatures(check = not v, selected = True)
13701441
except:
13711442
pass
13721443

@@ -1820,9 +1891,9 @@ def signatureListDoubleClickTree(self, item, column):
18201891
tW = cfg.uidc.signature_list_treeWidget
18211892
for id, val in cfg.treeDockItm.items():
18221893
if val == item:
1823-
if column == 0:
1824-
self.selectAllSignatures(not item.checkState(0))
1825-
elif column == 4:
1894+
#if column == 0:
1895+
# self.selectAllSignatures(not item.checkState(0))
1896+
if column == 4:
18261897
c = cfg.utls.selectColor()
18271898
if c is not None:
18281899
r = []
@@ -2106,7 +2177,7 @@ def createInput(self):
21062177
except Exception as err:
21072178
# logger
21082179
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' ERROR exception: ' + str(err))
2109-
cfg.ipt.refreshRasterLayer()
2180+
cfg.SCPD.refreshRasterLayer()
21102181
cfg.mx.msg4()
21112182
except Exception as err:
21122183
# logger

docs/repository.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version = '1.0' encoding = 'UTF-8'?>
22
<plugins>
3-
<pyqgis_plugin name="Semi-Automatic Classification Plugin - master" version="7.5.0" plugin_id="284">
3+
<pyqgis_plugin name="Semi-Automatic Classification Plugin - master" version="7.5.1" plugin_id="284">
44
<description><![CDATA[The Semi-Automatic Classification Plugin (SCP) allows for the supervised classification of remote sensing images, providing tools for the download, the preprocessing and postprocessing of images.]]></description>
55
<about><![CDATA[Developed by Luca Congedo, the Semi-Automatic Classification Plugin (SCP) allows for the supervised classification of remote sensing images, providing tools for the download, the preprocessing and postprocessing of images. Search and download is available for ASTER, GOES, Landsat, MODIS, Sentinel-1, Sentinel-2, and Sentinel-3 images. Several algorithms are available for the land cover classification. This plugin requires the installation of GDAL, OGR, Numpy, SciPy, and Matplotlib. Some tools require also the installation of SNAP (ESA Sentinel Application Platform). For more information please visit https://fromgistors.blogspot.com .]]></about>
6-
<version>7.5.0</version>
6+
<version>7.5.1</version>
77
<qgis_minimum_version>3.0.0</qgis_minimum_version>
88
<qgis_maximum_version>3.99.0</qgis_maximum_version>
99
<homepage><![CDATA[https://fromgistors.blogspot.com/p/semi-automatic-classification-plugin.html]]></homepage>

0 commit comments

Comments
 (0)