def on_applyPushButton_clicked(self): try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) dbName = self.dbComboBox.currentText() styleName = self.styleComboBox.currentText() lyrList = self.getLayers(dbName) abstractDb = self.getAbstractDb(dbName) dbVersion = abstractDb.getDatabaseVersion() stylesDict = abstractDb.getStyleDict(dbVersion) selectedStyle = stylesDict[styleName] localProgress = ProgressWidget( 1, len(lyrList) - 1, self.tr('Loading style {0}').format(styleName), parent=self.iface.mapCanvas()) for lyr in lyrList: try: uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri()) fullPath = self.getStyle(abstractDb, selectedStyle, lyr.name()) if fullPath: lyr.applyNamedStyle(fullPath) except: pass localProgress.step() self.iface.mapCanvas().refreshAllLayers() QApplication.restoreOverrideCursor() except Exception as e: QgsMessageLog.logMessage( self.tr('Error setting style ') + styleName + ': ' + ':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) QApplication.restoreOverrideCursor()
def createDb(self, dbName, srid, paramDict=dict(), parentWidget=None): destination = os.path.join(self.outputDir, dbName + '.sqlite') if 'version' not in paramDict.keys(): raise Exception('Undefined database version') edgvPath = self.getTemplateLocation(paramDict['version']) f = open(edgvPath, 'rb') g = open(destination, 'wb') x = f.readlines() if parentWidget: progress = ProgressWidget( 1, len(x) + 2, self.tr('Creating Spatialite {0}... ').format(dbName), parent=parentWidget) progress.initBar() for i in x: g.write(i) if parentWidget: progress.step() g.close() f.close() #TODO: put defineSrid into AbstractDb self.defineSrid(destination, srid) if parentWidget: progress.step() newDb = self.instantiateNewDb(destination) if parentWidget: progress.step() return newDb
def on_applyPushButton_clicked(self): try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) dbName = self.dbComboBox.currentText() styleName = self.styleComboBox.currentText() lyrList = self.getLayers(dbName) abstractDb = self.getAbstractDb(dbName) dbVersion = abstractDb.getDatabaseVersion() stylesDict = abstractDb.getStyleDict(dbVersion) selectedStyle = stylesDict[styleName] localProgress = ProgressWidget(1, len(lyrList) - 1, self.tr('Loading style {0}').format(styleName), parent=self.iface.mapCanvas()) for lyr in lyrList: try: uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri()) fullPath = self.getStyle(abstractDb, selectedStyle, lyr.name()) if fullPath: lyr.applyNamedStyle(fullPath) except: pass localProgress.step() self.iface.mapCanvas().refreshAllLayers() QApplication.restoreOverrideCursor() except Exception as e: QgsMessageLog.logMessage(self.tr('Error setting style ') + styleName + ': ' +':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) QApplication.restoreOverrideCursor()
def createUnifiedLayer(self, layerList, attributeTupple = False, attributeBlackList = ''): """ Creates a unified layer from a list of layers """ #getting srid from something like 'EPSG:31983' srid = layerList[0].crs().authid().split(':')[-1] # creating the layer geomtype = layerList[0].dataProvider().geometryType() for lyr in layerList: if lyr.dataProvider().geometryType() != geomtype: raise Exception(self.tr('Error! Different geometry primitives!')) coverage = self.iface.addVectorLayer("{0}?crs=epsg:{1}".format(self.getGeometryTypeText(geomtype),srid), "coverage", "memory") provider = coverage.dataProvider() coverage.startEditing() #defining fields if not attributeTupple: fields = [QgsField('featid', QVariant.Int), QgsField('classname', QVariant.String)] else: fields = [QgsField('featid', QVariant.Int), QgsField('classname', QVariant.String), QgsField('tupple', QVariant.String), QgsField('blacklist', QVariant.String)] provider.addAttributes(fields) coverage.updateFields() totalCount = 0 for layer in layerList: totalCount += layer.pendingFeatureCount() self.localProgress = ProgressWidget(1, totalCount - 1, self.tr('Building unified layers with ') + ', '.join([i.name() for i in layerList])+'.', parent=self.iface.mapCanvas()) featlist = [] if attributeBlackList != '': bList = attributeBlackList.replace(' ','').split(',') else: bList = [] for layer in layerList: # recording class name classname = layer.name() uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri()) keyColumn = uri.keyColumn() for feature in layer.getFeatures(): newfeat = QgsFeature(coverage.pendingFields()) newfeat.setGeometry(feature.geometry()) newfeat['featid'] = feature.id() newfeat['classname'] = classname if attributeTupple: attributeList = [] attributes = [field.name() for field in feature.fields() if (field.type() != 6 and field.name() != keyColumn)] for attribute in attributes: if attribute not in bList: attributeList.append(u'{0}'.format(feature[attribute])) #done due to encode problems tup = ','.join(attributeList) newfeat['tupple'] = tup featlist.append(newfeat) self.localProgress.step() #inserting new features into layer coverage.addFeatures(featlist, True) coverage.commitChanges() return coverage
def createDb(self, dbName, srid, paramDict = dict(), parentWidget = None): destination = os.path.join(self.outputDir,dbName+'.sqlite') if 'version' not in paramDict.keys(): raise Exception('Undefined database version') edgvPath = self.getTemplateLocation(paramDict['version']) f = open(edgvPath,'rb') g = open(destination,'wb') x = f.readlines() if parentWidget: progress = ProgressWidget(1,len(x)+2,self.tr('Creating Spatialite {0}... ').format(dbName), parent = parentWidget) progress.initBar() for i in x: g.write(i) if parentWidget: progress.step() g.close() f.close() #TODO: put defineSrid into AbstractDb self.defineSrid(destination, srid) if parentWidget: progress.step() newDb = self.instantiateNewDb(destination) if parentWidget: progress.step() return newDb
def buildInitialAndEndPointDict(self, lyr, tableSchema, tableName): """ Calculates initial point and end point from each line from lyr. """ if isinstance(lyr, list): featureList = lyr size = len(featureList) else: if self.parameters['Only Selected']: featureList = lyr.selectedFeatures() size = len(featureList) else: featureList = lyr.getFeatures() size = len(lyr.allFeatureIds()) localProgress = ProgressWidget( 1, size, self.tr('Building search structure for {0}.{1}').format( tableSchema, tableName), parent=self.iface.mapCanvas()) # start and end points dict endVerticesDict = {} # iterating over features to store start and end points for feat in featureList: geom = feat.geometry() if geom.isMultipart(): multiLine = geom.asMultiPolyline() for j in xrange(len(multiLine)): line = multiLine[j] startPoint = line[0] endPoint = line[len(line) - 1] # storing start point in the dict if startPoint not in endVerticesDict.keys(): endVerticesDict[startPoint] = [] endVerticesDict[startPoint].append(feat.id()) # storing end point in the dict if endPoint not in endVerticesDict.keys(): endVerticesDict[endPoint] = [] endVerticesDict[endPoint].append(feat.id()) else: line = geom.asPolyline() startPoint = line[0] endPoint = line[len(line) - 1] # storing start point in the dict if startPoint not in endVerticesDict.keys(): endVerticesDict[startPoint] = [] endVerticesDict[startPoint].append(feat.id()) # storing end point in the dict if endPoint not in endVerticesDict.keys(): endVerticesDict[endPoint] = [] endVerticesDict[endPoint].append(feat.id()) localProgress.step() return endVerticesDict
def on_buttonBox_accepted(self): """ Loads the selected classes/categories """ #1- filter classes if categories is checked and build list. selectedKeys = self.layersCustomSelector.getSelectedNodes() if len(selectedKeys) == 0: QMessageBox.information(self, self.tr('Error!'), self.tr('Select at least one layer to be loaded!')) return #2- get parameters withElements = self.checkBoxOnlyWithElements.isChecked() selectedStyle = None if self.customServerConnectionWidget.edgvType == 'Non_EDGV': isEdgv = False else: isEdgv = True if self.styleComboBox.currentIndex() != 0: selectedStyle = self.customServerConnectionWidget.stylesDict[self.styleComboBox.currentText()] uniqueLoad = self.uniqueLoadCheckBox.isChecked() onlyParents = self.onlyParentsCheckBox.isChecked() #3- Build factory dict factoryDict = dict() dbList = self.customServerConnectionWidget.selectedDbsDict.keys() for dbName in dbList: factoryDict[dbName] = self.layerFactory.makeLoader(self.iface, self.customServerConnectionWidget.selectedDbsDict[dbName]) #4- load for each db exceptionDict = dict() progress = ProgressWidget(1, len(dbList), self.tr('Loading layers from selected databases... '), parent=self) for dbName in factoryDict.keys(): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) try: selectedClasses = [] for i in selectedKeys: if i in self.lyrDict.keys(): if dbName in self.lyrDict[i].keys(): selectedClasses.append(self.lyrDict[i][dbName]) factoryDict[dbName].load(selectedClasses, uniqueLoad=uniqueLoad, onlyWithElements=withElements, stylePath=selectedStyle, useInheritance=onlyParents, isEdgv=isEdgv, parent=self) progress.step() except Exception as e: exceptionDict[dbName] = ':'.join(e.args) QApplication.restoreOverrideCursor() progress.step() QApplication.restoreOverrideCursor() if factoryDict[dbName].errorLog != '': if dbName in exceptionDict.keys(): exceptionDict[dbName] += '\n'+factoryDict[dbName].errorLog else: exceptionDict[dbName] = factoryDict[dbName].errorLog QApplication.restoreOverrideCursor() self.logInternalError(exceptionDict) self.close()
def createUnifiedLineLayer(self, layerList, onlySelected=False): """ For each layer in layerList, transforms it into lines if lyrType is polygon and adds features into layerList. Duplicates can happen in this process. """ srid = layerList[0].crs().authid().split(':')[-1] coverage = self.iface.addVectorLayer( "{0}?crs=epsg:{1}".format('Linestring', srid), "coverage_lines", "memory") provider = coverage.dataProvider() coverage.startEditing() coverage.beginEditCommand('Creating coverage lines layer') self.localProgress = ProgressWidget( 1, len(layerList) - 1, self.tr('Building unified layers with ') + ', '.join([i.name() for i in layerList]) + '.', parent=self.iface.mapCanvas()) addFeatureList = [] for lyr in layerList: isPolygon = True if lyr.dataProvider().geometryType() in [ QGis.WKBPolygon, QGis.WKBMultiPolygon ] else False isMulti = QgsWKBTypes.isMultiType(int(lyr.wkbType())) featureIterator = lyr.getFeatures( ) if not onlySelected else lyr.selectedFeatures() for feature in featureIterator: geom = feature.geometry() if geom: parts = geom.asGeometryCollection() if parts: for part in parts: if isPolygon: linestrings = part.asPolygon() for line in linestrings: newfeat = QgsFeature( coverage.pendingFields()) newfeat.setGeometry( QgsGeometry.fromPolyline(line)) addFeatureList.append(newfeat) else: newfeat = QgsFeature(coverage.pendingFields()) newfeat.setGeometry(part) addFeatureList.append(newfeat) self.localProgress.step() coverage.addFeatures(addFeatureList, True) coverage.endEditCommand() coverage.commitChanges() return coverage
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags(self.getName()) #erase previous flags tol = self.parameters[self.tr('Length')] classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 classesWithGeom = [] recordList = [] for key in classesWithElem: # preparation classAndGeom = self.classesWithElemDict[key] localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() lyr = self.loadLayerBeforeValidationProcess(classAndGeom) localProgress.step() allIds = lyr.allFeatureIds() localProgress = ProgressWidget(1, len(allIds) - 1, self.tr('Running process on ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) if self.parameters['Only Selected']: featureList = lyr.selectedFeatures() else: featureList = lyr.getFeatures() for feat in featureList: if feat.geometry().length() < tol: geometry = binascii.hexlify(feat.geometry().asWkb()) recordList.append((classAndGeom['tableSchema']+'.'+classAndGeom['tableName'], feat.id(), self.tr('Small Line.'), geometry, classAndGeom['geom'])) localProgress.step() if len(recordList) > 0: numberOfProblems = self.addFlag(recordList) msg = str(numberOfProblems)+ self.tr(' features have small lines. Check flags.') self.setStatus(msg, 4) #Finished with flags QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) else: msg = self.tr('There are no small lines.') self.setStatus(msg, 1) #Finished QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.startTimeCount() try: self.setStatus(self.tr('Running'), 3) #now I'm running! refKey = self.parameters['Reference and Layers'][0] classesWithElemKeys = self.parameters['Reference and Layers'][1] if len(classesWithElemKeys) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished return 1 if not refKey: self.setStatus(self.tr('One reference must be selected! Stopping.'), 1) #Finished return 1 # preparing reference layer refcl = self.classesWithElemDict[refKey] reflyr = self.loadLayerBeforeValidationProcess(refcl) snapper = DsgGeometrySnapper(reflyr) snapper.featureSnapped.connect(self.updateProgress) tol = self.parameters['Snap'] msg = '' for key in classesWithElemKeys: # preparation clDict = self.classesWithElemDict[key] localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + clDict['tableName'], parent=self.iface.mapCanvas()) localProgress.step() lyr = self.loadLayerBeforeValidationProcess(clDict) localProgress.step() # snapping lyr to reference if self.parameters['Only Selected']: featureList = lyr.selectedFeatures() else: featureList = lyr.getFeatures() features = [feature for feature in featureList] self.localProgress = ProgressWidget(1, len(features) - 1, self.tr('Processing features on ') + clDict['tableName'], parent=self.iface.mapCanvas()) snappedFeatures = snapper.snapFeatures(features, tol) self.updateOriginalLayerV2(lyr, None, featureList=snappedFeatures) self.logLayerTime(clDict['lyrName']) localMsg = self.tr('All features from ') +clDict['lyrName']+ self.tr(' snapped to reference ') +refcl['tableName']+ self.tr(' succesfully.\n') QgsMessageLog.logMessage(localMsg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) msg += localMsg self.setStatus(msg, 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! refWithElem = self.parameters['Reference and Layers'][0] classesWithElem = self.parameters['Reference and Layers'][1] if len(classesWithElem) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 if not refWithElem: self.setStatus(self.tr('One reference must be selected! Stopping.'), 1) #Finished QgsMessageLog.logMessage(self.tr('One reference must be selected! Stopping.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 # preparing reference layer refcl, refGeometryColumn = refWithElem.split(':') reflyr = self.loadLayerBeforeValidationProcess(refcl) snapper = DsgGeometrySnapper(reflyr) snapper.featureSnapped.connect(self.updateProgress) tol = self.parameters['Snap'] msg = '' for classAndGeom in classesWithElem: # preparation cl, geometryColumn = classAndGeom.split(':') localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + cl, parent=self.iface.mapCanvas()) localProgress.step() lyr = self.loadLayerBeforeValidationProcess(cl) localProgress.step() # snapping lyr to reference features = [feature for feature in lyr.getFeatures()] self.localProgress = ProgressWidget(1, len(features) - 1, self.tr('Processing features on ') + cl, parent=self.iface.mapCanvas()) snappedFeatures = snapper.snapFeatures(features, tol) self.updateOriginalLayer(lyr, None, featureList=snappedFeatures) localMsg = self.tr('All features from ') +cl+ self.tr(' snapped to reference ') +refcl+ self.tr(' succesfully.\n') QgsMessageLog.logMessage(localMsg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) msg += localMsg self.setStatus(msg, 1) #Finished QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def updateLayersFromDbs(self, type, dbList, showViews = False): """ """ errorDict = dict() if type == 'added': progress = ProgressWidget(1, len(dbList), self.tr('Reading selected databases... '), parent=self) progress.initBar() for dbName in dbList: try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) geomList = self.customServerConnectionWidget.selectedDbsDict[dbName].getGeomColumnTupleList(showViews = showViews) for tableSchema, tableName, geom, geomType, tableType in geomList: if self.customServerConnectionWidget.edgvType == 'Non_EDGV': lyrName = tableName cat = tableSchema else: lyrName = '_'.join(tableName.split('_')[1::]) cat = tableName.split('_')[0] key = ','.join([cat, lyrName, geom, geomType, tableType]) if key not in self.lyrDict.keys(): self.lyrDict[key] = dict() self.lyrDict[key][dbName] = {'tableSchema':tableSchema, 'tableName':tableName, 'geom':geom, 'geomType':geomType, 'tableType':tableType, 'lyrName':lyrName, 'cat':cat} except Exception as e: errorDict[dbName] = ':'.join(e.args) QApplication.restoreOverrideCursor() progress.step() QApplication.restoreOverrideCursor() elif type == 'removed': for key in self.lyrDict.keys(): for db in self.lyrDict[key].keys(): if db in dbList: self.lyrDict[key].pop(db) if self.lyrDict[key] == dict(): self.lyrDict.pop(key) interfaceDictList = [] for key in self.lyrDict.keys(): cat, lyrName, geom, geomType, tableType = key.split(',') interfaceDictList.append({self.tr('Category'):cat, self.tr('Layer Name'):lyrName, self.tr('Geometry\nColumn'):geom, self.tr('Geometry\nType'):geomType, self.tr('Layer\nType'):tableType}) self.layersCustomSelector.setInitialState(interfaceDictList,unique = True)
def createDbFromMIList(self, miList, srid, prefix = None, sufix = None, createFrame = False, paramDict = dict()): outputDbDict = dict() errorDict = dict() templateDb = None if self.parentWidget: progress = ProgressWidget(1,2*len(miList)+1,self.tr('Creating databases... '),parent = self.parentWidget) progress.initBar() progress.step() for mi in miList: dbName = self.buildDatabaseName(mi, prefix, sufix) try: if not templateDb: newDb = self.createDb(dbName, srid, paramDict, parentWidget = self.parentWidget) templateDb = dbName else: paramDict['templateDb'] = templateDb newDb = self.createDb(dbName, srid, paramDict, parentWidget = self.parentWidget) outputDbDict[dbName] = newDb except Exception as e: if dbName not in errorDict.keys(): errorDict[dbName] = ':'.join(e.args) else: errorDict[dbName] += '\n' + ':'.join(e.args) if self.parentWidget: progress.step() if createFrame: for dbName in outputDbDict.keys(): try: scale = self.scaleMIDict[len(mi.split('-'))] mi = [i for i in miList if i in dbName][0] outputDbDict[dbName].createFrame('mi', scale, mi, paramDict = paramDict) except Exception as e: if dbName not in errorDict.keys(): errorDict[dbName] = ':'.join(e.args) else: errorDict[dbName] += '\n' + ':'.join(e.args) if self.parentWidget: progress.step() return outputDbDict, errorDict
def browseServer(self, dbList, host, port, user, password): """ Browses server for EDGV databases dbList: databases list host: server host ip address port: server port user: user name password: password """ canLoad = True if self.superNeeded: canLoad = False try: if self.serverWidget.abstractDb.checkSuperUser(): canLoad = True else: QMessageBox.warning(self, self.tr('Info!'), self.tr('Connection refused. Connect with a super user to inspect server.')) return [] except Exception as e: QMessageBox.critical(self, self.tr('Critical!'), ':'.join(e.args)) if canLoad: progress = ProgressWidget(1,len(dbList),self.tr('Loading databases from server... '), parent = self) progress.initBar() gen = self.factory.createSqlGenerator(False) edvgDbList = [] for database in dbList: db = self.getPostGISDatabaseWithParams(database, host, port, user, password) if not db.open(): qgis.utils.iface.messageBar().pushMessage('DB :'+database+'| msg: '+db.lastError().databaseText(), level=QgsMessageBar.CRITICAL) query = QSqlQuery(db) if query.exec_(gen.getEDGVVersion()): while query.next(): version = query.value(0) if version: edvgDbList.append((database, version)) progress.step() return edvgDbList
def browseServer(self, dbList, host, port, user, password): """ Browses server for EDGV databases dbList: databases list host: server host ip address port: server port user: user name password: password """ canLoad = True if self.superNeeded: canLoad = False try: if self.serverWidget.abstractDb.checkSuperUser(): canLoad = True else: QMessageBox.warning( self, self.tr('Info!'), self. tr('Connection refused. Connect with a super user to inspect server.' )) return [] except Exception as e: QMessageBox.critical(self, self.tr('Critical!'), ':'.join(e.args)) if canLoad: progress = ProgressWidget( 1, len(dbList), self.tr('Loading databases from server... '), parent=self) progress.initBar() gen = self.factory.createSqlGenerator(False) edvgDbList = [] for database in dbList: db = self.getPostGISDatabaseWithParams(database, host, port, user, password) if not db.open(): qgis.utils.iface.messageBar().pushMessage( 'DB :' + database + '| msg: ' + db.lastError().databaseText(), level=QgsMessageBar.CRITICAL) query = QSqlQuery(db) if query.exec_(gen.getEDGVVersion()): while query.next(): version = query.value(0) if version: edvgDbList.append((database, version)) progress.step() return edvgDbList
def on_buttonBox_accepted(self): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) exceptionList = [] customJsonDict = dict() for i in self.customDict.keys(): customJsonDict[i] = [] correspondenceDict = {self.customDict[i]:i for i in self.customDict.keys()} nCustom = 0 for key in self.contentsDict.keys(): for widgetItem in self.contentsDict[key]['widgetList']: nCustom += 1 progress = ProgressWidget(1,nCustom,self.tr('Preparing to export customizations... '), parent = self) progress.initBar() for key in self.contentsDict.keys(): jsonTagList = [] for widget in self.contentsDict[key]['widgetList']: currJsonItem = {'jsonUi':None, 'dbJsonTagList':[]} currentWidget = widget.layout().itemAt(0).widget() try: jsonTagList = currentWidget.getJSONTag() jsonUi = currentWidget.getUiParameterJsonDict() except Exception as e: exceptionList.append(':'.join(e.args)) if len(exceptionList) == 0: currJsonItem['jsonUi'] = jsonUi for jsonItem in jsonTagList: if jsonItem not in currJsonItem['dbJsonTagList']: currJsonItem['dbJsonTagList'].append(jsonItem) if currJsonItem not in customJsonDict[correspondenceDict[key]]: customJsonDict[correspondenceDict[key]].append(currJsonItem) progress.step() QApplication.restoreOverrideCursor() if self.validateJsonDict(customJsonDict) and len(exceptionList) == 0: versionText = 'database_'+self.edgvVersion finalJsonDict = {versionText:customJsonDict} self.customizationManager.createSetting(self.customizationName, self.edgvVersion, finalJsonDict) QMessageBox.information(self, self.tr('Success!'), self.tr('Database Customization ') + self.customizationName + self.tr(' created successfuly!')) #EMIT to reload? self.close() else: msg = '' if len(exceptionList)> 0: msg += self.tr('\Errors occured while trying to export customs built. Check qgis log for further details.') for error in exceptionList: QgsMessageLog.logMessage(self.tr('Customization error: ') + error, "DSG Tools Plugin", QgsMessageLog.CRITICAL) QMessageBox.warning(self, self.tr('Error!'), msg)
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags(self.getName()) #erase previous flags classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 tol = self.parameters['Angle'] error = False flagLyr = self.getFlagLyr(0) for key in classesWithElem: self.startTimeCount() # preparation classAndGeom = self.classesWithElemDict[key] lyr = self.loadLayerBeforeValidationProcess(classAndGeom) # running the process localProgress = ProgressWidget(0, 1, self.tr('Running process on ')+classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() result = self.getOutOfBoundsAngleList(lyr, tol, classAndGeom['geom'], onlySelected = self.parameters['Only Selected']) localProgress.step() # storing flags if len(result) > 0: numberOfProblems = self.buildAndRaiseOutOfBoundsFlag(classAndGeom['tableSchema'], classAndGeom['tableName'], flagLyr, result) QgsMessageLog.logMessage(str(numberOfProblems) + self.tr(' features from') + classAndGeom['tableName'] + self.tr(' have out of bounds angle(s). Check flags.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) else: QgsMessageLog.logMessage(self.tr('There are no out of bounds angles on ') + classAndGeom['tableName'] + '.', "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.logLayerTime(classAndGeom['tableSchema']+'.'+classAndGeom['tableName']) if error: self.setStatus(self.tr('There are features with angles out of bounds. Check log.'), 4) #Finished with errors else: self.setStatus(self.tr('There are no features with angles out of bounds.'), 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def searchDanglesOnPointDict(self, endVerticesDict, tableSchema, tableName): """ Counts the number of points on each endVerticesDict's key and returns a list of QgsPoint built from key candidate. """ pointList = [] idList = [] # actual search for dangles localProgress = ProgressWidget( 1, len(endVerticesDict.keys()), self.tr('Searching dangles on {0}.{1}').format( tableSchema, tableName), parent=self.iface.mapCanvas()) for point in endVerticesDict.keys(): # this means we only have one occurrence of point, therefore it is a dangle if len(endVerticesDict[point]) > 1: localProgress.step() continue pointList.append(point) localProgress.step() return pointList
def batchCreateDb(self, dbNameList, srid, paramDict = dict()): outputDbDict = dict() errorDict = dict() templateDb = None if self.parentWidget: progress = ProgressWidget(1,len(dbNameList),self.tr('Creating databases... '),parent = self.parentWidget) progress.initBar() for dbName in dbNameList: try: if not templateDb: newDb = self.createDb(dbName, srid, paramDict = paramDict, parentWidget = self.parentWidget) templateDb = dbName else: paramDict['templateDb'] = templateDb newDb = self.createDb(dbName, srid, paramDict, parentWidget = self.parentWidget) outputDbDict[dbName] = newDb except Exception as e: if dbName not in errorDict.keys(): errorDict[dbName] = ':'.join(e.args) else: errorDict[dbName] += '\n' + ':'.join(e.args) if self.parentWidget: progress.step() return outputDbDict, errorDict
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags( self.getName()) #erase previous flags classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus( self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage( self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 tol = self.parameters['Angle'] error = False for key in classesWithElem: # preparation classAndGeom = self.classesWithElemDict[key] localProgress = ProgressWidget( 0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution( classAndGeom, selectedFeatures=self.parameters['Only Selected']) tableSchema, tableName = self.abstractDb.getTableSchema( processTableName) localProgress.step() # running the process localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() result = self.abstractDb.getOutOfBoundsAnglesRecords( tableSchema, tableName, tol, classAndGeom['geom'], classAndGeom['geomType'], keyColumn) localProgress.step() # dropping temp table self.abstractDb.dropTempTable(processTableName) # storing flags if len(result) > 0: error = True recordList = [] for tupple in result: recordList.append( (classAndGeom['tableSchema'] + '.' + classAndGeom['tableName'], tupple[0], self.tr('Angle out of bound.'), tupple[1], classAndGeom['geom'])) self.addClassesToBeDisplayedList(tupple[0]) numberOfProblems = self.addFlag(recordList) QgsMessageLog.logMessage( str(numberOfProblems) + self.tr(' features from') + classAndGeom['tableName'] + self.tr(' have out of bounds angle(s). Check flags.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) else: QgsMessageLog.logMessage( self.tr('There are no out of bounds angles on ') + classAndGeom['tableName'] + '.', "DSG Tools Plugin", QgsMessageLog.CRITICAL) if error: self.setStatus( self. tr('There are features with angles out of bounds. Check log.' ), 4) #Finished with errors else: self.setStatus( self.tr( 'There are no features with angles out of bounds.'), 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr('Process.\n'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! # getting parameters after the execution of our pre process self.flagsDict = self.abstractDb.getFlagsDictByProcess( 'IdentifyInvalidGeometriesProcess') classesWithFlags = self.flagsDict.keys() if len(classesWithFlags) == 0: self.setStatus(self.tr('There are no invalid geometries.'), 1) #Finished QgsMessageLog.logMessage( self.tr('There are no invalid geometries.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 numberOfProblems = 0 for cl in classesWithFlags: # preparation localProgress = ProgressWidget( 0, 1, self.tr('Preparing execution for ') + cl, parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution(cl) localProgress.step() #running the process in the temp table localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + cl, parent=self.iface.mapCanvas()) localProgress.step() problems = self.abstractDb.forceValidity( processTableName, self.flagsDict[cl], keyColumn) localProgress.step() numberOfProblems += problems # finalization self.postProcessSteps(processTableName, lyr) QgsMessageLog.logMessage( self.tr('{0} features from {1} were changed.').format( problems, cl), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.setStatus( self.tr('{0} features were changed.').format(numberOfProblems), 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def updateLayersFromDbs(self, type, dbList, showViews=False): """ """ errorDict = dict() if type == 'added': progress = ProgressWidget( 1, len(dbList), self.tr('Reading selected databases... '), parent=self) progress.initBar() for dbName in dbList: try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) geomList = self.customServerConnectionWidget.selectedDbsDict[ dbName].getGeomColumnTupleList(showViews=showViews) for tableSchema, tableName, geom, geomType, tableType in geomList: if self.customServerConnectionWidget.edgvType == 'Non_EDGV': lyrName = tableName cat = tableSchema else: lyrName = '_'.join(tableName.split('_')[1::]) cat = tableName.split('_')[0] key = ','.join( [cat, lyrName, geom, geomType, tableType]) if key not in self.lyrDict.keys(): self.lyrDict[key] = dict() self.lyrDict[key][dbName] = { 'tableSchema': tableSchema, 'tableName': tableName, 'geom': geom, 'geomType': geomType, 'tableType': tableType, 'lyrName': lyrName, 'cat': cat } except Exception as e: errorDict[dbName] = ':'.join(e.args) QApplication.restoreOverrideCursor() progress.step() QApplication.restoreOverrideCursor() elif type == 'removed': for key in self.lyrDict.keys(): for db in self.lyrDict[key].keys(): if db in dbList: self.lyrDict[key].pop(db) if self.lyrDict[key] == dict(): self.lyrDict.pop(key) interfaceDictList = [] for key in self.lyrDict.keys(): cat, lyrName, geom, geomType, tableType = key.split(',') interfaceDictList.append({ self.tr('Category'): cat, self.tr('Layer Name'): lyrName, self.tr('Geometry\nColumn'): geom, self.tr('Geometry\nType'): geomType, self.tr('Layer\nType'): tableType }) self.layersCustomSelector.setInitialState(interfaceDictList, unique=True)
def on_buttonBox_accepted(self): """ Loads the selected classes/categories """ #1- filter classes if categories is checked and build list. selectedKeys = self.layersCustomSelector.getSelectedNodes() if len(selectedKeys) == 0: QMessageBox.information( self, self.tr('Error!'), self.tr('Select at least one layer to be loaded!')) return #2- get parameters withElements = self.checkBoxOnlyWithElements.isChecked() selectedStyle = None if self.customServerConnectionWidget.edgvType == 'Non_EDGV': isEdgv = False else: isEdgv = True if self.styleComboBox.currentIndex() != 0: selectedStyle = self.customServerConnectionWidget.stylesDict[ self.styleComboBox.currentText()] uniqueLoad = self.uniqueLoadCheckBox.isChecked() onlyParents = self.onlyParentsCheckBox.isChecked() #3- Build factory dict factoryDict = dict() dbList = self.customServerConnectionWidget.selectedDbsDict.keys() for dbName in dbList: factoryDict[dbName] = self.layerFactory.makeLoader( self.iface, self.customServerConnectionWidget.selectedDbsDict[dbName]) #4- load for each db exceptionDict = dict() progress = ProgressWidget( 1, len(dbList), self.tr('Loading layers from selected databases... '), parent=self) for dbName in factoryDict.keys(): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) try: selectedClasses = [] for i in selectedKeys: if i in self.lyrDict.keys(): if dbName in self.lyrDict[i].keys(): selectedClasses.append(self.lyrDict[i][dbName]) factoryDict[dbName].load(selectedClasses, uniqueLoad=uniqueLoad, onlyWithElements=withElements, stylePath=selectedStyle, useInheritance=onlyParents, isEdgv=isEdgv, parent=self) progress.step() except Exception as e: exceptionDict[dbName] = ':'.join(e.args) QApplication.restoreOverrideCursor() progress.step() QApplication.restoreOverrideCursor() if factoryDict[dbName].errorLog != '': if dbName in exceptionDict.keys(): exceptionDict[ dbName] += '\n' + factoryDict[dbName].errorLog else: exceptionDict[dbName] = factoryDict[dbName].errorLog QApplication.restoreOverrideCursor() self.logInternalError(exceptionDict) self.close()
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus( self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage( self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 #getting parameters tol = self.parameters['Snap'] for key in classesWithElem: # preparation classAndGeom = self.classesWithElemDict[key] localProgress = ProgressWidget( 0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution( classAndGeom) localProgress.step() # specific EPSG search parameters = { 'tableSchema': classAndGeom['tableSchema'], 'tableName': classAndGeom['tableName'], 'geometryColumn': classAndGeom['geom'] } srid = self.abstractDb.findEPSG(parameters=parameters) #running the process in the temp table localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() self.abstractDb.snapToGrid([processTableName], tol, srid, classAndGeom['geom']) localProgress.step() # finalization self.postProcessSteps(processTableName, lyr) #setting status QgsMessageLog.logMessage( self.tr('All features from ') + classAndGeom['tableName'] + self.tr(' snapped to grid successfully.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) #returning success self.setStatus( self.tr('All features from ') + classAndGeom['tableName'] + self.tr(' snapped successfully.'), 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() #returning error return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! # getting parameters after the execution of our pre process self.flagsDict = self.abstractDb.getFlagsDictByProcess('IdentifySmallAreasProcess') flagsClasses = self.flagsDict.keys() if len(flagsClasses) == 0: self.setStatus(self.tr('There are no small areas.'), 1) #Finished QgsMessageLog.logMessage(self.tr('There are no small areas.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 numberOfProblems = 0 for cl in flagsClasses: # preparation localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + cl, parent=self.iface.mapCanvas()) localProgress.step() lyr = self.loadLayerBeforeValidationProcess(cl) localProgress.step() #running the process on cl localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + cl, parent=self.iface.mapCanvas()) localProgress.step() problems = len(self.flagsDict[cl]) smallIds = [int(flag['id']) for flag in self.flagsDict[cl]] lyr.startEditing() lyr.deleteFeatures(smallIds) localProgress.step() numberOfProblems += problems QgsMessageLog.logMessage(str(problems) + self.tr(' features from ') + cl + self.tr(' were removed.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.setStatus(str(numberOfProblems) + self.tr(' features were removed.'), 1) #Finished with flags return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr('Process.\n'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! classesWithElem = self.parameters['Classes'] snap = self.parameters['Snap'] if len(classesWithElem) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 for key in classesWithElem: self.startTimeCount() # preparation classAndGeom = self.classesWithElemDict[key] localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution(classAndGeom) localProgress.step() # running the process localProgress = ProgressWidget(0, 1, self.tr('Running process for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() self.abstractDb.recursiveSnap([processTableName], snap, classAndGeom['geom'], keyColumn) localProgress.step() self.logLayerTime(key) #check this time later (I guess time will be counted twice due to postProcess) # finalization self.postProcessSteps(processTableName, lyr) QgsMessageLog.logMessage(self.tr('All features from {} were snapped.').format(key), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.setStatus(self.tr('All features were snapped.'), 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr('Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags(self.getName()) classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus( self.tr('No classes selected!. Nothing to be done.'), 1) #Finished return 1 for key in classesWithElem: self.startTimeCount() # preparation classAndGeom = self.classesWithElemDict[key] lyr = self.loadLayerBeforeValidationProcess(classAndGeom) localProgress = ProgressWidget( 0, 1, self.tr('Preparing execution for ') + classAndGeom['lyrName'], parent=self.iface.mapCanvas()) localProgress.step() localProgress.step() lyr.startEditing() provider = lyr.dataProvider() uri = QgsDataSourceURI(provider.dataSourceUri()) keyColumn = uri.keyColumn() if self.parameters['Only Selected']: featureList = lyr.selectedFeatures() size = len(featureList) else: featureList = lyr.getFeatures() size = len(lyr.allFeatureIds()) localProgress = ProgressWidget(1, size, self.tr('Running process on ') + classAndGeom['lyrName'], parent=self.iface.mapCanvas()) for feat in featureList: geom = feat.geometry() if not geom: #insert deletion lyr.deleteFeature(feat.id()) localProgress.step() continue if geom.geometry().partCount() > 1: parts = geom.asGeometryCollection() for part in parts: part.convertToMultiType() addList = [] for i in range(1, len(parts)): if parts[i]: newFeat = QgsFeature(feat) newFeat.setGeometry(parts[i]) idx = newFeat.fieldNameIndex(keyColumn) newFeat.setAttribute( idx, provider.defaultValue(idx)) addList.append(newFeat) feat.setGeometry(parts[0]) lyr.updateFeature(feat) lyr.addFeatures(addList, True) localProgress.step() self.logLayerTime(classAndGeom['lyrName']) msg = self.tr('All geometries are now single parted.') self.setStatus(msg, 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def load(self, inputList, useQml = False, uniqueLoad = False, useInheritance = False, stylePath = None, onlyWithElements = False, geomFilterList = [], isEdgv = True, parent = None): """ 1. Get loaded layers 2. Filter layers; 3. Load domains; 4. Get Aux Dicts; 5. Build Groups; 6. Load Layers; """ layerList, isDictList = self.preLoadStep(inputList) #1. Get Loaded Layers loadedLayers = self.iface.legendInterface().layers() loadedGroups = self.iface.legendInterface().groups() #2. Filter Layers: filteredLayerList = self.filterLayerList(layerList, useInheritance, onlyWithElements, geomFilterList) if isDictList: filteredDictList = [i for i in inputList if i['tableName'] in filteredLayerList] else: filteredDictList = filteredLayerList edgvVersion = self.abstractDb.getDatabaseVersion() dbGroup = self.getDatabaseGroup(loadedGroups) #3. Load Domains #do this only if EDGV Version = FTer if edgvVersion in ('FTer_2a_Ed', '3.0'): domainGroup = self.createGroup(loadedGroups, self.tr("Domains"), dbGroup) domLayerDict = self.loadDomains(filteredLayerList, loadedLayers, domainGroup) else: domLayerDict = dict() #4. Get Aux dicts domainDict = self.abstractDb.getDbDomainDict(self.geomDict) constraintDict = self.abstractDb.getCheckConstraintDict() multiColumnsDict = self.abstractDb.getMultiColumnsDict() notNullDict = self.abstractDb.getNotNullDictV2() lyrDict = self.getLyrDict(filteredDictList, isEdgv=isEdgv) #5. Build Groups groupDict = self.prepareGroups(loadedGroups, dbGroup, lyrDict) #6. load layers loadedDict = dict() if parent: primNumber = 0 for prim in lyrDict.keys(): for cat in lyrDict[prim].keys(): for lyr in lyrDict[prim][cat]: primNumber += 1 localProgress = ProgressWidget(1, primNumber-1, self.tr('Loading layers... '), parent=parent) for prim in lyrDict.keys(): for cat in lyrDict[prim].keys(): for lyr in lyrDict[prim][cat]: try: vlayer = self.loadLayer(lyr, groupDict[prim][cat], loadedLayers, useInheritance, useQml, uniqueLoad, stylePath, domainDict, multiColumnsDict, domLayerDict, edgvVersion) if vlayer: loadedLayers.append(vlayer) if isinstance(lyr, dict): key = lyr['lyrName'] else: key = lyr loadedDict[key]=vlayer except Exception as e: if isinstance(lyr, dict): key = lyr['lyrName'] else: key = lyr self.logErrorDict[key] = self.tr('Error for layer ')+key+': '+':'.join(e.args) self.logError() if parent: localProgress.step() return loadedDict
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags(self.getName()) rules = self.getRules() for rule in rules: # preparation localProgress = ProgressWidget( 0, 1, self.tr('Preparing execution for ') + rule[0], parent=self.iface.mapCanvas()) localProgress.step() class_a, lyrA, aKeyColumn = self.prepareExecution(rule[0]) class_b, lyrB, bKeyColumn = self.prepareExecution(rule[3]) # getting keyColumn because we want to be generic aGeomColumn = self.getGeometryColumnFromLayer(lyrA) bGeomColumn = self.getGeometryColumnFromLayer(lyrB) localProgress.step() #running the process in the temp table localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + class_a, parent=self.iface.mapCanvas()) localProgress.step() invalidGeomRecordList = self.abstractDb.testSpatialRule( class_a, rule[1], rule[2], class_b, rule[4], rule[5], rule[6], aKeyColumn, bKeyColumn, aGeomColumn, bGeomColumn) localProgress.step() # dropping temp table self.abstractDb.dropTempTable(class_a) self.abstractDb.dropTempTable(class_b) if len(invalidGeomRecordList) > 0: numberOfInvGeom = self.addFlag(invalidGeomRecordList) for tuple in invalidGeomRecordList: self.addClassesToBeDisplayedList(tuple[0]) msg = str(numberOfInvGeom) + self.tr( ' features are invalid. Check flags.') self.setStatus(msg, 4) #Finished with flags QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) else: msg = self.tr('All features are valid.') self.setStatus(msg, 1) #Finished QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.startTimeCount() self.setStatus(self.tr('Running'), 3) #now I'm running! # getting parameters after the execution of our pre process self.flagsDict = self.abstractDb.getFlagsDictByProcess('IdentifyDuplicatedGeometriesProcess') flagsClasses = self.flagsDict.keys() if len(flagsClasses) == 0: self.setStatus(self.tr('There are no duplicated geometries.'), 1) #Finished return 1 numberOfProblems = 0 for cl in flagsClasses: self.startTimeCount() # preparation localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + cl, parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution(cl) localProgress.step() #running the process in the temp table localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + cl, parent=self.iface.mapCanvas()) localProgress.step() problems = self.abstractDb.removeFeatures(processTableName,self.flagsDict[cl], keyColumn) localProgress.step() numberOfProblems += problems # finalization self.postProcessSteps(processTableName, lyr) QgsMessageLog.logMessage(str(problems) + self.tr(' duplicated features from ') + cl + self.tr(' were removed.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.logLayerTime(cl) self.setStatus(str(numberOfProblems) + self.tr(' duplicated features were removed.'), 1) return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def load(self, inputList, useQml=False, uniqueLoad=False, useInheritance=False, stylePath=None, onlyWithElements=False, geomFilterList=[], isEdgv=True, parent=None): """ 1. Get loaded layers 2. Filter layers; 3. Load domains; 4. Get Aux Dicts; 5. Build Groups; 6. Load Layers; """ layerList, isDictList = self.preLoadStep(inputList) #1. Get Loaded Layers loadedLayers = self.iface.legendInterface().layers() loadedGroups = self.iface.legendInterface().groups() #2. Filter Layers: filteredLayerList = self.filterLayerList(layerList, useInheritance, onlyWithElements, geomFilterList) if isDictList: filteredDictList = [ i for i in inputList if i['tableName'] in filteredLayerList ] else: filteredDictList = filteredLayerList edgvVersion = self.abstractDb.getDatabaseVersion() dbGroup = self.getDatabaseGroup(loadedGroups) #3. Load Domains #do this only if EDGV Version = FTer if edgvVersion in ('FTer_2a_Ed', '3.0'): domainGroup = self.createGroup(loadedGroups, self.tr("Domains"), dbGroup) domLayerDict = self.loadDomains(filteredLayerList, loadedLayers, domainGroup) else: domLayerDict = dict() #4. Get Aux dicts domainDict = self.abstractDb.getDbDomainDict(self.geomDict) constraintDict = self.abstractDb.getCheckConstraintDict() multiColumnsDict = self.abstractDb.getMultiColumnsDict() notNullDict = self.abstractDb.getNotNullDictV2() lyrDict = self.getLyrDict(filteredDictList, isEdgv=isEdgv) #5. Build Groups groupDict = self.prepareGroups(loadedGroups, dbGroup, lyrDict) #6. load layers loadedDict = dict() if parent: primNumber = 0 for prim in lyrDict.keys(): for cat in lyrDict[prim].keys(): for lyr in lyrDict[prim][cat]: primNumber += 1 localProgress = ProgressWidget(1, primNumber - 1, self.tr('Loading layers... '), parent=parent) for prim in lyrDict.keys(): for cat in lyrDict[prim].keys(): for lyr in lyrDict[prim][cat]: try: vlayer = self.loadLayer(lyr, groupDict[prim][cat], loadedLayers, useInheritance, useQml, uniqueLoad, stylePath, domainDict, multiColumnsDict, domLayerDict, edgvVersion) if vlayer: loadedLayers.append(vlayer) if isinstance(lyr, dict): key = lyr['lyrName'] else: key = lyr loadedDict[key] = vlayer except Exception as e: if isinstance(lyr, dict): key = lyr['lyrName'] else: key = lyr self.logErrorDict[key] = self.tr( 'Error for layer ') + key + ': ' + ':'.join(e.args) self.logError() if parent: localProgress.step() return loadedDict
class ValidationProcess(QObject): def __init__(self, postgisDb, iface, instantiating=False): """ Constructor """ super(ValidationProcess, self).__init__() self.abstractDb = postgisDb if self.getStatus() == None: self.setStatus(self.tr('Instantianting process'), 0) self.classesToBeDisplayedAfterProcess = [] self.parameters = None self.iface = iface self.layerLoader = LayerLoaderFactory().makeLoader(self.iface, self.abstractDb) self.processAlias = self.tr('Validation Process') self.instantiating = instantiating def setParameters(self, params): """ Define the process parameteres """ self.parameters = params def execute(self): """ Abstract method. MUST be reimplemented. """ pass def shouldBeRunAgain(self): """ Defines if the method should run again later """ return False def getName(self): """ Gets the process name """ return str(self.__class__).split('.')[-1].replace('\'>', '') def getProcessGroup(self): """ Returns the process group """ return 'Ungrouped' def getClassesToBeDisplayedAfterProcess(self): """ Returns classes to be loaded to TOC after executing this process. """ return self.classesToBeDisplayedAfterProcess def addClassesToBeDisplayedList(self,className): """ Add a class into the class list that will be displayed after the process """ if className not in self.classesToBeDisplayedAfterProcess: self.classesToBeDisplayedAfterProcess.append(className) def clearClassesToBeDisplayedAfterProcess(self): """ Clears the class list to be displayed """ self.classesToBeDisplayedAfterProcess = [] def preProcess(self): """ Returns the name of the pre process that must run before, must be reimplemented in each process """ return None def postProcess(self): """ Returns the name of the post process that must run after, must be reimplemented in each process """ return None def addFlag(self, flagTupleList): """ Adds flags flagTUpleList: list of tuples to be added as flag """ try: return self.abstractDb.insertFlags(flagTupleList, self.getName()) except Exception as e: QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred inserting flags! Check log for details.')) QgsMessageLog.logMessage(str(e.args[0]), "DSG Tools Plugin", QgsMessageLog.CRITICAL) def removeFeatureFlags(self, layer, featureId): """ Removes specific flags from process layer: Name of the layer that should be remove from the flags featureId: Feature id from layer name that must be removed """ try: return self.abstractDb.removeFeatureFlags(layer, featureId, self.getName()) except Exception as e: QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.')) QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) def getStatus(self): """ Gets the process status """ try: return self.abstractDb.getValidationStatus(self.getName()) except Exception as e: QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.')) QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) def getStatusMessage(self): """ Gets the status message text """ try: return self.abstractDb.getValidationStatusText(self.getName()) except Exception as e: QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.')) QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) def setStatus(self, msg, status): """ Sets the status message status: Status number msg: Status text message """ try: self.abstractDb.setValidationProcessStatus(self.getName(), msg, status) except Exception as e: QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.')) QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) def finishedWithError(self): """ Sets the finished with error status (status number 2) Clears the classes to be displayed """ self.setStatus(self.tr('Process finished with errors.'), 2) #Failed status #drop temps try: classesWithElem = self.parameters['Classes'] for cl in classesWithElem: tempName = cl.split(':')[0]+'_temp' self.abstractDb.dropTempTable(tempName) except: pass self.clearClassesToBeDisplayedAfterProcess() def inputData(self): """ Returns current active layers """ return self.iface.mapCanvas().layers() def getTableNameFromLayer(self, lyr): """ Gets the layer name as present in the rules """ uri = lyr.dataProvider().dataSourceUri() dsUri = QgsDataSourceURI(uri) name = '.'.join([dsUri.schema(), dsUri.table()]) return name def mapInputLayer(self, inputLyr, selectedFeatures = False): """ Gets the layer features considering the edit buffer in the case the layer is already in edition mode """ #return dict featureMap = dict() #getting only selected features if selectedFeatures: for feat in inputLyr.selectedFeatures(): featureMap[feat.id()] = feat #getting all features else: for feat in inputLyr.getFeatures(): featureMap[feat.id()] = feat return featureMap def updateOriginalLayer(self, pgInputLayer, qgisOutputVector, featureList=None, featureTupleList=None): """ Updates the original layer using the grass output layer pgInputLyr: postgis input layer grassOutputLyr: grass output layer """ provider = pgInputLayer.dataProvider() # getting keyColumn because we want to be generic uri = QgsDataSourceURI(pgInputLayer.dataProvider().dataSourceUri()) keyColumn = uri.keyColumn() # starting edition mode pgInputLayer.startEditing() addList = [] idsToRemove = [] #making the changes and inserts for feature in pgInputLayer.getFeatures(): id = feature.id() outFeats = [] #getting the output features with the specific id if qgisOutputVector: for gf in qgisOutputVector.dataProvider().getFeatures(QgsFeatureRequest(QgsExpression("{0}={1}".format(keyColumn, id)))): outFeats.append(gf) elif featureTupleList: for gfid, gf in featureTupleList: if gfid == id and gf['classname'] == pgInputLayer.name(): outFeats.append(gf) else: for gf in [gf for gf in featureList if gf.id() == id]: outFeats.append(gf) #starting to make changes for i in range(len(outFeats)): if i == 0: #let's update this feature newGeom = outFeats[i].geometry() newGeom.convertToMultiType() feature.setGeometry(newGeom) pgInputLayer.updateFeature(feature) else: #for the rest, let's add them newFeat = QgsFeature(feature) newGeom = outFeats[i].geometry() newGeom.convertToMultiType() newFeat.setGeometry(newGeom) idx = newFeat.fieldNameIndex(keyColumn) newFeat.setAttribute(idx, provider.defaultValue(idx)) addList.append(newFeat) #in the case we don't find features in the output we should mark them to be removed if len(outFeats) == 0: idsToRemove.append(id) #pushing the changes into the edit buffer pgInputLayer.addFeatures(addList, True) #removing features from the layer. pgInputLayer.deleteFeatures(idsToRemove) def getProcessingErrors(self, layer): """ Gets processing errors layer: error layer (QgsVectorLayer) output made by grass """ recordList = [] for feature in layer.getFeatures(): recordList.append((feature.id(), binascii.hexlify(feature.geometry().asWkb()))) return recordList def loadLayerBeforeValidationProcess(self, cl): """ Loads all layers to QGIS' TOC prior the validation process """ #creating vector layer if self.abstractDb.getDatabaseVersion() == 'Non_EDGV': isEdgv = False else: isEdgv = True if isinstance(cl, dict): lyr = self.layerLoader.load([cl], uniqueLoad=True, isEdgv=isEdgv)[cl['lyrName']] else: schema, layer_name = self.abstractDb.getTableSchema(cl) lyr = self.layerLoader.load([layer_name], uniqueLoad=True, isEdgv=isEdgv)[layer_name] return lyr def prepareExecution(self, cl, geometryColumn='geom', selectedFeatures = False): """ Prepare the process to be executed cl: table name """ # loading layer prior to execution lyr = self.loadLayerBeforeValidationProcess(cl) # getting keyColumn because we want to be generic uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri()) keyColumn = uri.keyColumn() #getting feature map including the edit buffer featureMap = self.mapInputLayer(lyr, selectedFeatures = selectedFeatures) #getting table name with schema if isinstance(cl, dict): tableSchema = cl['tableSchema'] tableName = cl['tableName'] geometryColumn = cl['geom'] fullTableName = '''{0}.{1}'''.format(cl['tableSchema'], cl['tableName']) else: fullTableName = cl tableSchema, tableName = cl.split('.') #setting temp table name processTableName = fullTableName+'_temp' # specific EPSG search parameters = {'tableSchema':tableSchema, 'tableName':tableName, 'geometryColumn':geometryColumn} srid = self.abstractDb.findEPSG(parameters=parameters) #creating temp table self.abstractDb.createAndPopulateTempTableFromMap(fullTableName, featureMap, geometryColumn, keyColumn, srid) return processTableName, lyr, keyColumn def postProcessSteps(self, processTableName, lyr): """ Execute the final steps after the actual process """ #getting the output as a QgsVectorLayer outputLayer = QgsVectorLayer(self.abstractDb.getURI(processTableName, True).uri(), processTableName, "postgres") #updating the original layer (lyr) self.updateOriginalLayer(lyr, outputLayer) #dropping the temp table as we don't need it anymore self.abstractDb.dropTempTable(processTableName) def getGeometryTypeText(self, geomtype): if geomtype == QGis.WKBPoint: return 'Point' elif geomtype == QGis.WKBMultiPoint: return 'MultiPoint' elif geomtype == QGis.WKBLineString: return 'Linestring' elif geomtype == QGis.WKBMultiLineString: return 'MultiLinestring' elif geomtype == QGis.WKBPolygon: return 'Polygon' elif geomtype == QGis.WKBMultiPolygon: return 'MultiPolygon' else: raise Exception(self.tr('Operation not defined with provided geometry type!')) def createUnifiedLayer(self, layerList, attributeTupple = False, attributeBlackList = ''): """ Creates a unified layer from a list of layers """ #getting srid from something like 'EPSG:31983' srid = layerList[0].crs().authid().split(':')[-1] # creating the layer geomtype = layerList[0].dataProvider().geometryType() for lyr in layerList: if lyr.dataProvider().geometryType() != geomtype: raise Exception(self.tr('Error! Different geometry primitives!')) coverage = self.iface.addVectorLayer("{0}?crs=epsg:{1}".format(self.getGeometryTypeText(geomtype),srid), "coverage", "memory") provider = coverage.dataProvider() coverage.startEditing() #defining fields if not attributeTupple: fields = [QgsField('featid', QVariant.Int), QgsField('classname', QVariant.String)] else: fields = [QgsField('featid', QVariant.Int), QgsField('classname', QVariant.String), QgsField('tupple', QVariant.String), QgsField('blacklist', QVariant.String)] provider.addAttributes(fields) coverage.updateFields() totalCount = 0 for layer in layerList: totalCount += layer.pendingFeatureCount() self.localProgress = ProgressWidget(1, totalCount - 1, self.tr('Building unified layers with ') + ', '.join([i.name() for i in layerList])+'.', parent=self.iface.mapCanvas()) featlist = [] if attributeBlackList != '': bList = attributeBlackList.replace(' ','').split(',') else: bList = [] for layer in layerList: # recording class name classname = layer.name() uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri()) keyColumn = uri.keyColumn() for feature in layer.getFeatures(): newfeat = QgsFeature(coverage.pendingFields()) newfeat.setGeometry(feature.geometry()) newfeat['featid'] = feature.id() newfeat['classname'] = classname if attributeTupple: attributeList = [] attributes = [field.name() for field in feature.fields() if (field.type() != 6 and field.name() != keyColumn)] for attribute in attributes: if attribute not in bList: attributeList.append(u'{0}'.format(feature[attribute])) #done due to encode problems tup = ','.join(attributeList) newfeat['tupple'] = tup featlist.append(newfeat) self.localProgress.step() #inserting new features into layer coverage.addFeatures(featlist, True) coverage.commitChanges() return coverage def splitUnifiedLayer(self, outputLayer, layerList): """ Updates all original layers making requests with the class name """ for layer in layerList: classname = layer.name() tupplelist = [(feature['featid'], feature) for feature in outputLayer.getFeatures()] self.updateOriginalLayer(layer, None, featureTupleList=tupplelist) def getGeometryColumnFromLayer(self, layer): uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri()) geomColumn = uri.geometryColumn() return geomColumn
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 for key in classesWithElem: # preparation classAndGeom = self.classesWithElemDict[key] localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution(classAndGeom) localProgress.step() # running the process localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() self.abstractDb.removeEmptyGeometries(processTableName, classAndGeom['geom']) localProgress.step() # finalization self.postProcessSteps(processTableName, lyr) #removes null geometries for feat in lyr.getFeatures(): if not feat.geometry(): lyr.deleteFeature(feat.id()) localProgress.step() msg = self.tr('Process executed successfully!') self.setStatus(msg, 1) #Finished QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
class SnapLayerOnLayerProcess(ValidationProcess): def __init__(self, postgisDb, iface, instantiating=False): """ Constructor """ super(SnapLayerOnLayerProcess, self).__init__(postgisDb, iface, instantiating) self.processAlias = self.tr('Snap Layer on Layer') if not self.instantiating: # getting tables with elements self.classesWithElemDict = self.abstractDb.getGeomColumnDictV2(primitiveFilter=['a', 'l'], withElements=True, excludeValidation = True) # adjusting process parameters interfaceDict = dict() for key in self.classesWithElemDict: cat, lyrName, geom, geomType, tableType = key.split(',') interfaceDict[key] = {self.tr('Category'):cat, self.tr('Layer Name'):lyrName, self.tr('Geometry\nColumn'):geom, self.tr('Geometry\nType'):geomType, self.tr('Layer\nType'):tableType} # adjusting process parameters self.parameters = {'Snap': 5.0, 'Reference and Layers': OrderedDict({'referenceDictList':{}, 'layersDictList':interfaceDict}), 'Only Selected':False} def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.startTimeCount() try: self.setStatus(self.tr('Running'), 3) #now I'm running! refKey = self.parameters['Reference and Layers'][0] classesWithElemKeys = self.parameters['Reference and Layers'][1] if len(classesWithElemKeys) == 0: self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished return 1 if not refKey: self.setStatus(self.tr('One reference must be selected! Stopping.'), 1) #Finished return 1 # preparing reference layer refcl = self.classesWithElemDict[refKey] reflyr = self.loadLayerBeforeValidationProcess(refcl) snapper = DsgGeometrySnapper(reflyr) snapper.featureSnapped.connect(self.updateProgress) tol = self.parameters['Snap'] msg = '' for key in classesWithElemKeys: # preparation clDict = self.classesWithElemDict[key] localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + clDict['tableName'], parent=self.iface.mapCanvas()) localProgress.step() lyr = self.loadLayerBeforeValidationProcess(clDict) localProgress.step() # snapping lyr to reference if self.parameters['Only Selected']: featureList = lyr.selectedFeatures() else: featureList = lyr.getFeatures() features = [feature for feature in featureList] self.localProgress = ProgressWidget(1, len(features) - 1, self.tr('Processing features on ') + clDict['tableName'], parent=self.iface.mapCanvas()) snappedFeatures = snapper.snapFeatures(features, tol) self.updateOriginalLayerV2(lyr, None, featureList=snappedFeatures) self.logLayerTime(clDict['lyrName']) localMsg = self.tr('All features from ') +clDict['lyrName']+ self.tr(' snapped to reference ') +refcl['tableName']+ self.tr(' succesfully.\n') QgsMessageLog.logMessage(localMsg, "DSG Tools Plugin", QgsMessageLog.CRITICAL) msg += localMsg self.setStatus(msg, 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0 def updateProgress(self): self.localProgress.step()
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags( self.getName()) #erase previous flags classesWithElem = self.parameters['Classes'] if len(classesWithElem) == 0: self.setStatus( self.tr('No classes selected!. Nothing to be done.'), 1) #Finished QgsMessageLog.logMessage( self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return 1 classesWithGeom = [] recordFlagList = [] for key in classesWithElem: self.startTimeCount() # preparation classAndGeom = self.classesWithElemDict[key] localProgress = ProgressWidget( 0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() processTableName, lyr, keyColumn = self.prepareExecution( classAndGeom, selectedFeatures=self.parameters['Only Selected']) localProgress.step() # running the process localProgress = ProgressWidget(0, 1, self.tr('Running process ') + classAndGeom['tableName'], parent=self.iface.mapCanvas()) localProgress.step() result = self.abstractDb.getNotSimpleRecords( processTableName, classAndGeom['geom'], keyColumn) localProgress.step() # dropping temp table self.abstractDb.dropTempTable(processTableName) #storing flags if len(result) > 0: if classAndGeom['tableSchema'] not in ('validation'): for r in result: featId, geom = r recordFlagList.append( (classAndGeom['tableSchema'] + '.' + classAndGeom['tableName'], featId, self.tr('Not simple geometry.'), geom, classAndGeom['geom'])) self.logLayerTime(classAndGeom['tableSchema'] + '.' + classAndGeom['tableName']) # storing flags if len(recordFlagList) > 0: numberOfProblems = self.addFlag(recordFlagList) msg = str(numberOfProblems) + self.tr( ' features are not simple. Check flags.') self.setStatus(msg, 4) #Finished with flags else: msg = self.tr('All features are simple.') self.setStatus(msg, 1) #Finished return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0
def execute(self): """ Reimplementation of the execute method from the parent class """ QgsMessageLog.logMessage( self.tr('Starting ') + self.getName() + self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) try: self.setStatus(self.tr('Running'), 3) #now I'm running! self.abstractDb.deleteProcessFlags( self.getName()) #erase previous flags #TODO: check if frame is created #getting earth coverage configuration edgvVersion = self.abstractDb.getDatabaseVersion() propertyDict = self.abstractDb.getAllSettingsFromAdminDb( 'EarthCoverage') propertyName = propertyDict[edgvVersion][0] settingDict = json.loads( self.abstractDb.getSettingFromAdminDb('EarthCoverage', propertyName, edgvVersion)) earthCoverageDict = settingDict['earthCoverageDict'] self.frameLayer = settingDict['frameLayer'] coverageClassList = earthCoverageDict.keys() if coverageClassList.__len__() == 0: self.setStatus(self.tr('Empty earth coverage!'), 1) #Finished QgsMessageLog.logMessage(self.tr('Empty earth coverage!'), "DSG Tools Plugin", QgsMessageLog.CRITICAL) return self.cleanCentroidsAreas(coverageClassList) #making temp layers epsg = self.abstractDb.findEPSG() areaLyr, centroidLyr = self.createAuxStruct(epsg) #building centroid index self.populateCentroidLyr(coverageClassList, centroidLyr) centroidIdx = self.makeIndex(centroidLyr) relateDict = dict() for cl in coverageClassList: localProgress = ProgressWidget( 0, 1, self.tr('Processing earth coverage on ') + cl, parent=self.iface.mapCanvas()) localProgress.step() #must gather all lines (including frame) to close areas lineLyr = self.defineQueryLayer(earthCoverageDict[cl]) #close areas from lines self.runPolygonize(cl, areaLyr, lineLyr) self.relateAreasWithCentroids(cl, areaLyr, centroidLyr, relateDict, centroidIdx) # reclassifying areas self.prepareReclassification(cl, areaLyr, centroidLyr, relateDict) self.reclassifyAreasWithCentroids(coverageClassList, areaLyr, centroidLyr, relateDict) localProgress.step() self.raiseFlags(areaLyr) return 1 except Exception as e: QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL) self.finishedWithError() return 0