4848)
4949
5050from qgis .core import (
51- QgsFeature ,
52- QgsGeometry ,
5351 QgsMapLayer ,
5452 QgsMapLayerProxyModel ,
5553 QgsMessageLog ,
@@ -94,10 +92,12 @@ def __init__(self, iface):
9492
9593 if qVersion () > '4.3.3' :
9694 QCoreApplication .installTranslator (self .translator )
97-
95+
9896 try :
99- locale .setlocale (locale .LC_ALL ,
100- QSettings ().value ('locale/userLocale' ))
97+ locale .setlocale (
98+ locale .LC_ALL ,
99+ QSettings ().value ('locale/userLocale' )
100+ )
101101 except :
102102 pass
103103
@@ -250,39 +250,6 @@ def validateInputs(self, unusedArgumentToMatchQtSignal=0):
250250 else :
251251 self .dialog .buttonBox .button (QDialogButtonBox .Ok ).setEnabled (True )
252252
253- def createMemoryLayer (self , layerName , sourceLayer ):
254- # create empty memory layer
255- memoryLayer = QgsVectorLayer (
256- QgsWkbTypes .geometryDisplayString (sourceLayer .geometryType ()) +
257- "?crs=" + sourceLayer .crs ().authid () +
258- "&index=yes" ,
259- layerName ,
260- "memory"
261- )
262- memoryLayerDataProvider = memoryLayer .dataProvider ()
263-
264- # copy the table structure
265- memoryLayer .startEditing ()
266- memoryLayerDataProvider .addAttributes (
267- sourceLayer .fields ().toList ()
268- )
269- memoryLayer .commitChanges ()
270-
271- # copy the features
272- #memoryLayerDataProvider.addFeatures(
273- # [QgsFeature(feature) for feature in sourceLayer.getFeatures()]
274- #)
275-
276- # DEEP copy the features
277- features = []
278- for feature in sourceLayer .getFeatures ():
279- f = QgsFeature (feature )
280- f .setGeometry (QgsGeometry (feature .geometry ()))
281- features .append (f )
282- memoryLayerDataProvider .addFeatures (features )
283-
284- return memoryLayer
285-
286253 def run (self ):
287254 """Run method that performs all the real work"""
288255
@@ -336,37 +303,25 @@ def run(self):
336303 result = self .dialog .exec_ ()
337304 # See if OK was pressed
338305 if result :
339- self .t = timeit .default_timer ()
306+ self .t = timeit .default_timer ()
340307
341308 self .inputLayer = self .dialog .layerComboBox .currentLayer ()
342309 self .selectedFields = self .dialog .fieldListView .selectedFields ()
343310 self .maxIterations = self .dialog .iterationsSpinBox .value ()
344311 self .maxAverageError = \
345312 self .dialog .averageErrorDoubleSpinBox .value () / 100.0 + 1.0
346313
347- QgsMessageLog .logMessage (str (self .inputLayer .id ()))
348- # save a copy of the current status of the input layer
349- self .memoryLayer = self .createMemoryLayer (
350- "cartogram base" ,
351- self .inputLayer
352- )
353-
354314 # remember the input layer’s style
355315 self .inputLayerStyle = QDomDocument ()
356316 self .inputLayer .exportNamedStyle (self .inputLayerStyle , "" )
357317
358- # which fields to process on
359- self .jobs = queue .Queue ()
360- for fieldName in self .selectedFields :
361- self .jobs .put (fieldName )
362-
363318 # set up all widgets for status reporting
364319 self .progressBar = QProgressBar ()
365320 self .progressBar .setAlignment (Qt .AlignLeft | Qt .AlignVCenter )
366321 self .progressBar .setMaximum (
367322 len (self .selectedFields ) *
368323 self .maxIterations *
369- len (list (self .memoryLayer .getFeatures ())) +
324+ len (list (self .inputLayer .getFeatures ())) +
370325 1
371326 )
372327
@@ -376,7 +331,7 @@ def run(self):
376331 )
377332
378333 cancelButton = QPushButton (self .tr ("Cancel" ))
379- cancelButton .clicked .connect (self .killWorker )
334+ cancelButton .clicked .connect (self .stopWorker )
380335
381336 self .messageBarItem = self .iface .messageBar ().createMessage ("" )
382337 for widget in [
@@ -411,29 +366,9 @@ def updateProgressBar(self, increase=1):
411366 pass
412367
413368 def startWorker (self ):
414- try :
415- fieldName = self .jobs .get (False )
416- except queue .Empty :
417- del self .jobs
418- self .iface .messageBar ().popWidget (self .messageBarItem )
419- self .t = timeit .default_timer () - self .t
420- QgsMessageLog .logMessage ("{}s" .format (self .t ))
421- return
422-
423- QgsMessageLog .logMessage (str (self .memoryLayer .id ()))
424- QgsProject .instance ().addMapLayer (self .memoryLayer )
425-
426- baseLayer = self .createMemoryLayer (
427- "cartogram_{}" .format (fieldName ),
428- self .memoryLayer
429- )
430-
431- QgsMessageLog .logMessage (str (baseLayer .id ()))
432- QgsProject .instance ().addMapLayer (baseLayer )
433-
434369 worker = CartogramWorker (
435- baseLayer ,
436- fieldName ,
370+ self . inputLayer ,
371+ self . selectedFields ,
437372 self .maxIterations ,
438373 self .maxAverageError ,
439374 self .tr
@@ -443,6 +378,7 @@ def startWorker(self):
443378
444379 # connecting signals+slots
445380 worker .finished .connect (self .workerFinished )
381+ worker .cartogramComplete .connect (self .workerCartogramComplete )
446382 worker .error .connect (self .workerError )
447383 worker .progress .connect (self .updateProgressBar )
448384 worker .status .connect (self .updateStatusMessage )
@@ -453,28 +389,30 @@ def startWorker(self):
453389 self .worker = worker
454390 self .thread = thread
455391
456- def killWorker (self ):
392+ def stopWorker (self ):
457393 self .worker .stopped = True
458- self .jobs = queue .Queue () # empty queue
459394
460- def workerFinished (
395+ def workerFinished (self ):
396+ try :
397+ self .worker .deleteLater ()
398+ except :
399+ pass
400+ self .thread .quit ()
401+ self .thread .wait ()
402+ self .thread .terminate ()
403+ self .thread .deleteLater ()
404+
405+ self .iface .messageBar ().popWidget (self .messageBarItem )
406+ self .t = timeit .default_timer () - self .t
407+ QgsMessageLog .logMessage ("{}s" .format (self .t ))
408+
409+ def workerCartogramComplete (
461410 self ,
462411 layer = None ,
463412 fieldName = None ,
464413 iterations = None ,
465414 avgError = None
466415 ):
467- # clean up
468- try :
469- self .worker .deleteLater ()
470- self .thread .quit ()
471- self .thread .wait ()
472- self .thread .terminate ()
473- self .thread .deleteLater ()
474- except Exception as e :
475- QgsMessageLog .logMessage (repr (e ))
476-
477- # add output layer to qgis project
478416 if layer is not None :
479417 # try to update the style xml before applying it,
480418 # hide input layer
@@ -507,9 +445,6 @@ def workerFinished(
507445 self .tr ("cartogram3 computation cancelled by user" )
508446 )
509447
510- # check whether there‘s still jobs
511- self .startWorker ()
512-
513448 def workerError (self , e , exceptionString ):
514449 self .iface .messageBar ().pushCritical (
515450 self .tr ("Error" ),
@@ -575,3 +510,27 @@ def addSampleDataset(self):
575510
576511 QgsProject .instance ().addMapLayer (sampleLayer )
577512 del sampleDataset
513+
514+ def createMemoryLayer (self , layerName , sourceLayer ):
515+ # create empty memory layer
516+ memoryLayer = QgsVectorLayer (
517+ QgsWkbTypes .geometryDisplayString (sourceLayer .geometryType ()) +
518+ "?crs=" + sourceLayer .crs ().authid () +
519+ "&index=yes" ,
520+ layerName ,
521+ "memory"
522+ )
523+ memoryLayerDataProvider = memoryLayer .dataProvider ()
524+
525+ # copy the table structure
526+ memoryLayerDataProvider .addAttributes (
527+ sourceLayer .fields ().toList ()
528+ )
529+ memoryLayer .updateFields ()
530+
531+ # copy the features
532+ memoryLayerDataProvider .addFeatures (
533+ list (sourceLayer .getFeatures ())
534+ )
535+
536+ return memoryLayer
0 commit comments