3737class 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