Skip to content

Commit 58325c3

Browse files
committed
Merge branch 'issue#5' into develop
2 parents 3f6cf21 + 76f9197 commit 58325c3

3 files changed

Lines changed: 215 additions & 188 deletions

File tree

cartogram3.py

Lines changed: 51 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@
4848
)
4949

5050
from 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

Comments
 (0)