Skip to content

Commit 80d8dcc

Browse files
7.7.0
1 parent 5754655 commit 80d8dcc

152 files changed

Lines changed: 35924 additions & 35415 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

__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.6.3 - Matera'
45+
return 'Version 7.7.0 - Matera'
4646

4747

4848
def icon():

core/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,8 @@
481481
USGSUserASTER = ''
482482
regUSGSPassASTER = 'SemiAutomaticClassificationPlugin/USGSPassASTER'
483483
USGSPassASTER = ''
484+
regSentinelAlternativeSearch = 'SemiAutomaticClassificationPlugin/SentinelAlternativeSearch'
485+
sentinelAlternativeSearch = '0'
484486
regSciHubUser = 'SemiAutomaticClassificationPlugin/SciHubUser'
485487
SciHubUser = ''
486488
regSciHubPass = 'SemiAutomaticClassificationPlugin/SciHubPass'

core/utils.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6673,6 +6673,27 @@ def saveMemoryLayerToShapefile(self, memoryLayer, output, name = None, format =
66736673
tSS.updateExtents()
66746674
return tSS
66756675

6676+
# duplicate memory layer
6677+
def duplicateMemoryLayer(self, layer):
6678+
# create memory layer
6679+
provider = layer.dataProvider()
6680+
fields = provider.fields().toList()
6681+
pCrs = cfg.utls.getCrs(layer)
6682+
dT = cfg.utls.getTime()
6683+
mL2 = cfg.qgisCoreSCP.QgsVectorLayer('MultiPolygon?crs=' + str(pCrs.toWkt()), dT, 'memory')
6684+
mL2.setCrs(pCrs)
6685+
pr2 = mL2.dataProvider()
6686+
pr2.addAttributes(fields)
6687+
mL2.updateFields()
6688+
f = cfg.qgisCoreSCP.QgsFeature()
6689+
mL2.startEditing()
6690+
for f in layer.getFeatures():
6691+
mL2.addFeature(f)
6692+
mL2.commitChanges()
6693+
mL2.dataProvider().createSpatialIndex()
6694+
mL2.updateExtents()
6695+
return mL2
6696+
66766697
# save features to shapefile
66776698
def featuresToShapefile(self, idList):
66786699
# create shapefile
@@ -8055,7 +8076,9 @@ def mergePolygons(self, targetLayer, idList, attributeList):
80558076
g.convertToMultiType()
80568077
sg.addPartGeometry(g)
80578078
pr = targetLayer.dataProvider()
8079+
fields = pr.fields().toList()
80588080
targetLayer.startEditing()
8081+
f = cfg.qgisCoreSCP.QgsFeature()
80598082
f.setGeometry(sg)
80608083
f.setAttributes(attributeList)
80618084
pr.addFeatures([f])

dock/scpdock.py

Lines changed: 168 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@
3737
class SCPDock:
3838

3939
def __init__(self):
40+
cfg.shpLay = None
41+
cfg.shpLayList = []
42+
cfg.shpLayListCounter = 1
43+
cfg.uidc.undo_save_Button.setEnabled(False)
44+
cfg.uidc.redo_save_Button.setEnabled(False)
4045
# rubber band
4146
cfg.rbbrBnd = cfg.qgisGuiSCP.QgsRubberBand(cfg.cnvs, False)
4247
cfg.rbbrBnd.setColor(cfg.QtGuiSCP.QColor(0,255,255))
@@ -277,8 +282,9 @@ def openInput(self, scpPath = None):
277282
# logger
278283
cfg.utls.logCondition(str(__name__) + "-" + (cfg.inspectSCP.stack()[0][3])+ " " + cfg.utls.lineOfCode(), " signatures opened: " + str(scpPath))
279284
else:
280-
# shape layer
281-
cfg.shpLay = None
285+
cfg.SCPD.resetShapeList()
286+
cfg.uidc.undo_save_Button.setEnabled(False)
287+
cfg.uidc.redo_save_Button.setEnabled(False)
282288
# training layer name
283289
cfg.trnLay = None
284290
# signature file path
@@ -362,21 +368,30 @@ def openShapeFile(self, shapeFilePath):
362368
if check == 'Yes':
363369
# create memory layer
364370
provider = tSS.dataProvider()
365-
fields = provider.fields()
371+
fields = provider.fields().toList()
366372
pCrs = cfg.utls.getCrs(tSS)
367373
mL = cfg.qgisCoreSCP.QgsVectorLayer('MultiPolygon?crs=' + str(pCrs.toWkt()), name, 'memory')
374+
mL2 = cfg.qgisCoreSCP.QgsVectorLayer('MultiPolygon?crs=' + str(pCrs.toWkt()), dT, 'memory')
368375
mL.setCrs(pCrs)
376+
mL2.setCrs(pCrs)
369377
pr = mL.dataProvider()
370-
for fld in fields:
371-
pr.addAttributes([fld])
378+
pr2 = mL2.dataProvider()
379+
pr.addAttributes(fields)
380+
pr2.addAttributes(fields)
372381
mL.updateFields()
382+
mL2.updateFields()
373383
f = cfg.qgisCoreSCP.QgsFeature()
374384
mL.startEditing()
385+
mL2.startEditing()
375386
for f in tSS.getFeatures():
376387
mL.addFeature(f)
388+
mL2.addFeature(f)
377389
mL.commitChanges()
390+
mL2.commitChanges()
378391
mL.dataProvider().createSpatialIndex()
392+
mL2.dataProvider().createSpatialIndex()
379393
mL.updateExtents()
394+
mL2.updateExtents()
380395
cfg.utls.ROISymbol(mL)
381396
cfg.shpLay = mL
382397
cfg.trnLay = name
@@ -396,6 +411,9 @@ def openShapeFile(self, shapeFilePath):
396411
cfg.SCPD.saveSignatureList(cfg.sigFile)
397412
cfg.mx.msg20()
398413
cfg.SCPD.openSignatureList(cfg.sigFile)
414+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
415+
cfg.uidc.undo_save_Button.setEnabled(False)
416+
cfg.uidc.redo_save_Button.setEnabled(False)
399417
return check
400418

401419
# save memory layer to shapefile
@@ -418,21 +436,30 @@ def saveMemToSHP(self, memoryLayer):
418436
tSS = cfg.shpLay
419437
# create memory layer
420438
provider = tSS.dataProvider()
421-
fields = provider.fields()
439+
fields = provider.fields().toList()
422440
pCrs = cfg.utls.getCrs(tSS)
423441
mL = cfg.qgisCoreSCP.QgsVectorLayer('MultiPolygon?crs=' + str(pCrs.toWkt()), cfg.trnLay, 'memory')
442+
mL2 = cfg.qgisCoreSCP.QgsVectorLayer('MultiPolygon?crs=' + str(pCrs.toWkt()), dT, 'memory')
424443
mL.setCrs(pCrs)
444+
mL2.setCrs(pCrs)
425445
pr = mL.dataProvider()
426-
for fld in fields:
427-
pr.addAttributes([fld])
446+
pr2 = mL2.dataProvider()
447+
pr.addAttributes(fields)
448+
pr2.addAttributes(fields)
428449
mL.updateFields()
450+
mL2.updateFields()
429451
f = cfg.qgisCoreSCP.QgsFeature()
430452
mL.startEditing()
453+
mL2.startEditing()
431454
for f in tSS.getFeatures():
432455
mL.addFeature(f)
456+
mL2.addFeature(f)
433457
mL.commitChanges()
458+
mL2.commitChanges()
434459
mL.dataProvider().createSpatialIndex()
460+
mL2.dataProvider().createSpatialIndex()
435461
mL.updateExtents()
462+
mL2.updateExtents()
436463
cfg.utls.ROISymbol(mL)
437464
try:
438465
cfg.utls.removeLayerByLayer(cfg.shpLay)
@@ -443,6 +470,44 @@ def saveMemToSHP(self, memoryLayer):
443470
sigFileNm = cfg.trnLay + '.slf'
444471
cfg.sigFile = cfg.inptDir + '/' + sigFileNm
445472
cfg.SCPD.saveSignatureList(cfg.sigFile)
473+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
474+
cfg.uidc.undo_save_Button.setEnabled(True)
475+
cfg.uidc.redo_save_Button.setEnabled(False)
476+
477+
# reset shape list
478+
def resetShapeList(self):
479+
for i in range(0, len(cfg.shpLayList)):
480+
try:
481+
cfg.utls.removeLayerByLayer(cfg.shpLayList[i][0])
482+
except:
483+
pass
484+
try:
485+
cfg.shpLayList.pop(i)
486+
except:
487+
pass
488+
# shape layer
489+
cfg.shpLay = None
490+
cfg.shpLayList = []
491+
cfg.shpLayListCounter = 1
492+
493+
# manage shape list
494+
def manageShapeList(self, memoryLayer, sigFile):
495+
try:
496+
for sK in range(1, cfg.shpLayListCounter):
497+
cfg.shpLayList.pop(-sK)
498+
except:
499+
pass
500+
cfg.shpLayList.append([memoryLayer, sigFile])
501+
cfg.shpLayListCounter = 1
502+
if len(cfg.shpLayList) > 10:
503+
try:
504+
cfg.utls.removeLayerByLayer(cfg.shpLayList[0][0])
505+
except:
506+
pass
507+
try:
508+
cfg.shpLayList.pop(0)
509+
except:
510+
pass
446511

447512
# check shapefile and fields
448513
def checkFields(self, trainingLayer):
@@ -520,7 +585,11 @@ def importSLCSignatureList(self, signatureFile, addToSignature = 'No'):
520585
tVect = cfg.utls.createTempRasterPath('gpkg')
521586
inputLayersList = [sL, shpF]
522587
v = cfg.utls.mergeAllLayers(inputLayersList, tVect)
523-
l = cfg.shpLay
588+
# create memory layer
589+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
590+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
591+
cfg.uidc.undo_save_Button.setEnabled(True)
592+
cfg.uidc.redo_save_Button.setEnabled(False)
524593
try:
525594
tSS = cfg.utls.addVectorLayer(tVect)
526595
except:
@@ -533,14 +602,14 @@ def importSLCSignatureList(self, signatureFile, addToSignature = 'No'):
533602
cfg.utls.removeLayer(cfg.trnLay)
534603
except:
535604
pass
605+
# create memory layer
536606
provider = tSS.dataProvider()
537-
fields = provider.fields()
607+
fields = provider.fields().toList()
538608
pCrs = cfg.utls.getCrs(tSS)
539609
mL = cfg.qgisCoreSCP.QgsVectorLayer('MultiPolygon?crs=' + str(pCrs.toWkt()), cfg.trnLay , 'memory')
540610
mL.setCrs(pCrs)
541611
pr = mL.dataProvider()
542-
for fld in fields:
543-
pr.addAttributes([fld])
612+
pr.addAttributes(fields)
544613
mL.updateFields()
545614
fldSCP_UID = cfg.utls.fieldID(tSS, cfg.fldSCP_UID)
546615
f = cfg.qgisCoreSCP.QgsFeature()
@@ -906,6 +975,12 @@ def calculateSignatures(self):
906975
if cfg.saveInputCheck == '2':
907976
cfg.SCPD.saveMemToSHP(cfg.shpLay)
908977
cfg.utls.zipDirectoryInFile(cfg.scpFlPath, cfg.inptDir)
978+
else:
979+
# create memory layer
980+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
981+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
982+
cfg.uidc.undo_save_Button.setEnabled(True)
983+
cfg.uidc.redo_save_Button.setEnabled(False)
909984
cfg.uiUtls.removeProgressBar()
910985

911986
# merge highlighted signatures
@@ -963,7 +1038,7 @@ def mergeSelectedSignatures(self):
9631038
i = cfg.utls.signatureID()
9641039
# if ROIs
9651040
if 0 not in ROIcheck:
966-
attributeList = [cfg.ROI_MC_ID[id], cfg.merged_name + cfg.ROI_MC_Info[id], cfg.ROI_C_ID[id], cfg.merged_name + cfg.ROI_C_Info[id], i]
1041+
attributeList = [1, cfg.ROI_MC_ID[id], cfg.merged_name + cfg.ROI_MC_Info[id], cfg.ROI_C_ID[id], cfg.merged_name + cfg.ROI_C_Info[id], i]
9671042
tl = cfg.utls.mergePolygons(cfg.shpLay, ids, attributeList)
9681043
rId = cfg.utls.getIDByAttributes(cfg.shpLay, cfg.fldSCP_UID, str(i))
9691044
cfg.utls.calculateSignature(cfg.shpLay, cfg.bandSetsList[cfg.bndSetNumber][8], rId, cfg.ROI_MC_ID[id], cfg.ROI_MC_Info[id], cfg.ROI_C_ID[id], cfg.ROI_C_Info[id], None, None, 'No', 'No', i)
@@ -1024,6 +1099,12 @@ def mergeSelectedSignatures(self):
10241099
if cfg.saveInputCheck == '2':
10251100
cfg.SCPD.saveMemToSHP(cfg.shpLay)
10261101
cfg.utls.zipDirectoryInFile(cfg.scpFlPath, cfg.inptDir)
1102+
else:
1103+
# create memory layer
1104+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
1105+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
1106+
cfg.uidc.undo_save_Button.setEnabled(True)
1107+
cfg.uidc.redo_save_Button.setEnabled(False)
10271108
cfg.uiUtls.removeProgressBar()
10281109
# logger
10291110
cfg.utls.logCondition(str(__name__) + '-' + (cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' merged signatures: ' + str(v))
@@ -1061,6 +1142,12 @@ def removeSelectedSignatures(self):
10611142
if cfg.saveInputCheck == '2':
10621143
cfg.SCPD.saveMemToSHP(cfg.shpLay)
10631144
cfg.utls.zipDirectoryInFile(cfg.scpFlPath, cfg.inptDir)
1145+
else:
1146+
# create memory layer
1147+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
1148+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
1149+
cfg.uidc.undo_save_Button.setEnabled(True)
1150+
cfg.uidc.redo_save_Button.setEnabled(False)
10641151
# logger
10651152
cfg.utls.logCondition(str(__name__) + '-' + (cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' removed signatures: ' + str(ids))
10661153

@@ -2120,8 +2207,9 @@ def resetInputDock(self):
21202207
cfg.cnvs.refresh()
21212208
except:
21222209
pass
2123-
# shape layer
2124-
cfg.shpLay = None
2210+
cfg.SCPD.resetShapeList()
2211+
cfg.uidc.undo_save_Button.setEnabled(False)
2212+
cfg.uidc.redo_save_Button.setEnabled(False)
21252213
# training layer name
21262214
cfg.trnLay = None
21272215
# signature file path
@@ -2316,6 +2404,12 @@ def saveROItoShapefile(self, progressbar = 'Yes', bandSetNumber = None):
23162404
if cfg.saveInputCheck == '2':
23172405
cfg.SCPD.saveMemToSHP(cfg.shpLay)
23182406
cfg.utls.zipDirectoryInFile(cfg.scpFlPath, cfg.inptDir)
2407+
else:
2408+
# create memory layer
2409+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
2410+
cfg.SCPD.manageShapeList(mL2, cfg.sigFile)
2411+
cfg.uidc.undo_save_Button.setEnabled(True)
2412+
cfg.uidc.redo_save_Button.setEnabled(False)
23192413
if progressbar == 'Yes':
23202414
cfg.uiUtls.updateBar(100)
23212415
cfg.uiUtls.removeProgressBar()
@@ -2333,30 +2427,67 @@ def undoSaveROI(self):
23332427
# logger
23342428
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' ERROR exception: ' + str(err))
23352429
cfg.mx.msg3()
2336-
# check if no layer is selected
2337-
if cfg.shpLay is None:
2338-
cfg.mx.msg3()
2339-
# check if no ROI created
2340-
elif cfg.lstROI is None:
2341-
cfg.mx.msg6()
2342-
else:
2343-
# ask for confirm
2344-
a = cfg.utls.questionBox(cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Undo save ROI'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Are you sure you want to delete the last saved ROI?'))
2345-
if a == 'Yes':
2346-
f = cfg.utls.getFeaturebyID(cfg.shpLay, self.ROILastID)
2347-
SCP_UID = str(f[cfg.fldSCP_UID])
2348-
cfg.utls.deleteFeatureShapefile(cfg.shpLay, [self.ROILastID])
2349-
try:
2350-
cfg.SCPD.deleteSignatureByID(SCP_UID)
2351-
del cfg.treeDockItm[SCP_UID]
2352-
except:
2353-
pass
2430+
# ask for confirm
2431+
a = cfg.utls.questionBox(cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Undo save ROI'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Are you sure you want to undo?'))
2432+
if a == 'Yes':
2433+
# create memory layer
2434+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
2435+
cfg.shpLayList[-(cfg.shpLayListCounter)][0] = mL2
2436+
cfg.shpLayListCounter = cfg.shpLayListCounter+1
2437+
try:
2438+
cfg.utls.removeLayerByLayer(cfg.shpLay)
2439+
except:
2440+
pass
2441+
# create memory layer
2442+
cfg.shpLay = cfg.utls.duplicateMemoryLayer(cfg.shpLayList[-(cfg.shpLayListCounter)][0])
2443+
cfg.utls.ROISymbol(cfg.shpLay)
2444+
cfg.utls.addLayerToMap(cfg.shpLay)
2445+
cfg.sigFile = cfg.shpLayList[-(cfg.shpLayListCounter)][1]
2446+
cfg.uidc.redo_save_Button.setEnabled(True)
2447+
if cfg.shpLayListCounter == len(cfg.shpLayList):
23542448
cfg.uidc.undo_save_Button.setEnabled(False)
2355-
cfg.SCPD.ROIListTableTree(cfg.shpLay, cfg.uidc.signature_list_treeWidget)
2356-
cfg.cnvs.refresh()
2357-
# logger
2358-
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), 'roi deleted: ' + str(self.ROILastID))
2449+
cfg.SCPD.openSignatureListFile(cfg.sigFile)
2450+
cfg.SCPD.ROIListTableTree(cfg.shpLay, cfg.uidc.signature_list_treeWidget)
2451+
cfg.cnvs.refresh()
2452+
# logger
2453+
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), 'undo ROI')
23592454

2455+
# redo saved ROI
2456+
def redoSaveROI(self):
2457+
l = cfg.shpLay
2458+
if l is None:
2459+
cfg.mx.msg3()
2460+
return 0
2461+
# check if layer was removed ## there is an issue if the removed layer was already saved in the project ##
2462+
try:
2463+
s = str(cfg.shpLay.name())
2464+
except Exception as err:
2465+
# logger
2466+
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), ' ERROR exception: ' + str(err))
2467+
cfg.mx.msg3()
2468+
# ask for confirm
2469+
a = cfg.utls.questionBox(cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Redo save ROI'), cfg.QtWidgetsSCP.QApplication.translate('semiautomaticclassificationplugin', 'Are you sure you want to redo?'))
2470+
if a == 'Yes':
2471+
# create memory layer
2472+
mL2 = cfg.utls.duplicateMemoryLayer(cfg.shpLay)
2473+
cfg.shpLayList[-(cfg.shpLayListCounter)][0] = mL2
2474+
cfg.shpLayListCounter = cfg.shpLayListCounter-1
2475+
try:
2476+
cfg.utls.removeLayerByLayer(cfg.shpLay)
2477+
except:
2478+
pass
2479+
cfg.shpLay = cfg.utls.duplicateMemoryLayer(cfg.shpLayList[-(cfg.shpLayListCounter)][0])
2480+
cfg.utls.ROISymbol(cfg.shpLay)
2481+
cfg.utls.addLayerToMap(cfg.shpLay)
2482+
cfg.sigFile = cfg.shpLayList[-(cfg.shpLayListCounter)][1]
2483+
cfg.uidc.undo_save_Button.setEnabled(True)
2484+
if cfg.shpLayListCounter == 1:
2485+
cfg.uidc.redo_save_Button.setEnabled(False)
2486+
cfg.SCPD.openSignatureListFile(cfg.sigFile)
2487+
cfg.SCPD.ROIListTableTree(cfg.shpLay, cfg.uidc.signature_list_treeWidget)
2488+
cfg.cnvs.refresh()
2489+
# logger
2490+
cfg.utls.logCondition(str(__name__) + '-' + str(cfg.inspectSCP.stack()[0][3])+ ' ' + cfg.utls.lineOfCode(), 'redo ROI')
23602491

23612492
##################################
23622493
''' Map functions '''

0 commit comments

Comments
 (0)