def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" )) return True # fine comando if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer currLayer, errMsg = qad_layer.getCurrLayerEditable( self.plugIn.canvas, QGis.Polygon) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: self.PLINECommand = QadPLINECommandClass(self.plugIn, True) self.PLINECommand.setRubberBandColor(self.rubberBandBorderColor, self.rubberBandFillColor) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.asToolForMPolygon = True # per rubberband tipo poligono self.PLINECommand.run(msgMapTool, msg) self.step = 1 return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO (da step = 0 o 1) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: verticesLen = len(self.PLINECommand.vertices) if verticesLen >= 3: self.vertices = self.PLINECommand.vertices[:] # copio la lista firstVertex = self.vertices[0] # se l'ultimo vertice non é uguale al primo if self.vertices[verticesLen - 1] != firstVertex: # aggiungo un vertice con le stesse coordinate del primo self.vertices.append(firstVertex) if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer if qad_layer.addPolygonToLayer(self.plugIn, currLayer, self.vertices) == False: self.showMsg( QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.vertices[:] # svuoto la lista else: self.showMsg( QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.PLINECommand self.PLINECommand = None return True # fine return False
def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" ) ) return True # fine comando if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Polygon) if currLayer is None: self.showErr(errMsg) return True # fine comando # ========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: self.PLINECommand = QadPLINECommandClass(self.plugIn, True) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.asToolForMPolygon = True # per rubberband tipo poligono self.PLINECommand.run(msgMapTool, msg) self.step = 1 return False # continua # ========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO (da step = 0 o 1) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: verticesLen = len(self.PLINECommand.vertices) if verticesLen > 3: self.vertices = self.PLINECommand.vertices[:] # copio la lista firstVertex = self.vertices[0] # se l'ultimo vertice non é uguale al primo if self.vertices[verticesLen - 1] != firstVertex: # aggiungo un vertice con le stesse coordinate del primo self.vertices.append(firstVertex) if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer if qad_layer.addPolygonToLayer(self.plugIn, currLayer, self.vertices) == False: self.showMsg(QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.vertices[:] # svuoto la lista else: self.showMsg(QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.PLINECommand self.PLINECommand = None return True # fine return False
class QadTRIMCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadTRIMCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "TRIM") def getEnglishName(self): return "TRIM" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runTRIMCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/trim.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_TRIM", "Trims (or extends) objects to meet the edges of other objects.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.SSGetClass = QadSSGetClass(plugIn) self.PLINECommand = None self.RECTANGLECommand = None self.entitySet = QadEntitySet() # entità da tagliare o estendere self.limitEntitySet = QadEntitySet() # entità che fanno da limiti self.edgeMode = QadVariables.get(QadMsg.translate("Environment variables", "EDGEMODE")) self.defaultValue = None # usato per gestire il tasto dx del mouse self.nOperationsToUndo = 0 def __del__(self): QadCommandClass.__del__(self) def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 3: # quando si é in fase di disegno linea return self.PLINECommand.getPointMapTool(drawMode) elif self.step == 4: # quando si é in fase di disegno rettangolo return self.RECTANGLECommand.getPointMapTool(drawMode) else: return QadCommandClass.getPointMapTool(self, drawMode) #============================================================================ # trimFeatures #============================================================================ def trimFeatures(self, geom, toExtend): # geom è in map coordinates tolerance2ApproxCurve = QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) LineTempLayer = None self.plugIn.beginEditCommand("Feature extended" if toExtend else "Feature trimmed", \ self.entitySet.getLayerList()) for layerEntitySet in self.entitySet.layerEntitySetList: layer = layerEntitySet.layer for featureId in layerEntitySet.featureIds: f = qad_utils.getFeatureById(layer, featureId) if f is None: continue # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy f_geom = self.layerToMapCoordinates(layer, f.geometry()) if geom.type() == QGis.Point: # ritorna una tupla (<The squared cartesian distance>, # <minDistPoint> # <afterVertex> # <leftOf>) dummy = qad_utils.closestSegmentWithContext(geom.asPoint(), f_geom) if dummy[1] is not None: intPts = [dummy[1]] else: intPts = qad_utils.getIntersectionPoints(geom, f_geom) for intPt in intPts: if toExtend: newGeom = qad_utils.extendQgsGeometry(self.plugIn.canvas.mapRenderer().destinationCrs(), f_geom, intPt, \ self.limitEntitySet, self.edgeMode, \ tolerance2ApproxCurve) if newGeom is not None: # aggiorno la feature con la geometria estesa extendedFeature = QgsFeature(f) # trasformo la geometria nel crs del layer extendedFeature.setGeometry(self.mapToLayerCoordinates(layer, newGeom)) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, layer, extendedFeature, False, False) == False: self.plugIn.destroyEditCommand() return else: # trim result = qad_utils.trimQgsGeometry(self.plugIn.canvas.mapRenderer().destinationCrs(), f_geom, intPt, \ self.limitEntitySet, self.edgeMode, \ tolerance2ApproxCurve) if result is not None: line1 = result[0] line2 = result[1] atSubGeom = result[2] if layer.geometryType() == QGis.Line: updGeom = qad_utils.setSubGeom(f_geom, line1, atSubGeom) if updGeom is None: self.plugIn.destroyEditCommand() return trimmedFeature1 = QgsFeature(f) # trasformo la geometria nel crs del layer trimmedFeature1.setGeometry(self.mapToLayerCoordinates(layer, updGeom)) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, layer, trimmedFeature1, False, False) == False: self.plugIn.destroyEditCommand() return if line2 is not None: trimmedFeature2 = QgsFeature(f) # trasformo la geometria nel crs del layer trimmedFeature2.setGeometry(self.mapToLayerCoordinates(layer, line2)) # plugIn, layer, feature, coordTransform, refresh, check_validity if qad_layer.addFeatureToLayer(self.plugIn, layer, trimmedFeature2, None, False, False) == False: self.plugIn.destroyEditCommand() return else: # aggiungo le linee nei layer temporanei di QAD if LineTempLayer is None: LineTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Line) self.plugIn.addLayerToLastEditCommand("Feature trimmed", LineTempLayer) lineGeoms = [line1] if line2 is not None: lineGeoms.append(line2) # trasformo la geometria in quella dei layer temporanei # plugIn, pointGeoms, lineGeoms, polygonGeoms, coord, refresh if qad_layer.addGeometriesToQADTempLayers(self.plugIn, None, lineGeoms, None, None, False) == False: self.plugIn.destroyEditCommand() return updGeom = qad_utils.delSubGeom(f_geom, atSubGeom) if updGeom is None or updGeom.isGeosEmpty(): # da cancellare # plugIn, layer, feature id, refresh if qad_layer.deleteFeatureToLayer(self.plugIn, layer, f.id(), False) == False: self.plugIn.destroyEditCommand() return else: trimmedFeature1 = QgsFeature(f) # trasformo la geometria nel crs del layer trimmedFeature1.setGeometry(self.mapToLayerCoordinates(layer, updGeom)) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, layer, trimmedFeature1, False, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 #============================================================================ # waitForObjectSel #============================================================================ def waitForObjectSel(self): self.step = 2 # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITY_SELECTION_DYNAMIC) # solo layer lineari editabili che non appartengano a quote layerList = [] for layer in qad_utils.getVisibleVectorLayers(self.plugIn.canvas): # Tutti i layer vettoriali visibili if layer.geometryType() == QGis.Line and layer.isEditable(): if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) self.getPointMapTool().layersToCheck = layerList self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) self.getPointMapTool().onlyEditableLayers = True keyWords = QadMsg.translate("Command_TRIM", "Fence") + "/" + \ QadMsg.translate("Command_TRIM", "Crossing") + "/" + \ QadMsg.translate("Command_TRIM", "Edge") + "/" + \ QadMsg.translate("Command_TRIM", "Undo") prompt = QadMsg.translate("Command_TRIM", "Select the object to trim or shift-select to extend or [{0}]: ").format(keyWords) englishKeyWords = "Fence" + "/" + "Crossing" + "/" + "Edge" + "/" + "Undo" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) #============================================================================ # run #============================================================================ def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE OGGETTI LIMITI if self.step == 0: # inizio del comando CurrSettingsMsg = QadMsg.translate("QAD", "\nCurrent settings: ") if self.edgeMode == 0: # 0 = nessuna estensione CurrSettingsMsg = CurrSettingsMsg + QadMsg.translate("Command_TRIM", "Edge = No extend") else: CurrSettingsMsg = CurrSettingsMsg + QadMsg.translate("Command_TRIM", "Edge = Extend") self.showMsg(CurrSettingsMsg) self.showMsg(QadMsg.translate("Command_TRIM", "\nSelect trim limits...")) if self.SSGetClass.run(msgMapTool, msg) == True: # selezione terminata self.step = 1 return self.run(msgMapTool, msg) #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI LIMITI elif self.step == 1: self.limitEntitySet.set(self.SSGetClass.entitySet) if self.limitEntitySet.count() == 0: return True # fine comando # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI DA ESTENDERE elif self.step == 2: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_TRIM", "Fence") or value == "Fence": # Seleziona tutti gli oggetti che intersecano una polilinea self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 3 return False elif value == QadMsg.translate("Command_TRIM", "Crossing") or value == "Crossing": # Seleziona tutti gli oggetti che intersecano un rettangolo self.RECTANGLECommand = QadRECTANGLECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.RECTANGLECommand.virtualCmd = True self.RECTANGLECommand.run(msgMapTool, msg) self.step = 4 return False elif value == QadMsg.translate("Command_TRIM", "Edge") or value == "Edge": # Per estendere un oggetto usando anche le estensioni degli oggetti di riferimento # vedi variabile EDGEMODE keyWords = QadMsg.translate("Command_TRIM", "Extend") + "/" + \ QadMsg.translate("Command_TRIM", "No extend") if self.edgeMode == 0: # 0 = nessuna estensione self.defaultValue = QadMsg.translate("Command_TRIM", "No") else: self.defaultValue = QadMsg.translate("Command_TRIM", "Extend") prompt = QadMsg.translate("Command_TRIM", "Specify an extension mode [{0}] <{1}>: ").format(keyWords, self.defaultValue) englishKeyWords = "Extend" + "/" + "No extend" keyWords += "_" + englishKeyWords # si appresta ad attendere enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 5 return False elif value == QadMsg.translate("Command_TRIM", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif type(value) == QgsPoint: # se é stato selezionato un punto self.entitySet.clear() if self.getPointMapTool().entity.isInitialized(): self.entitySet.addEntity(self.getPointMapTool().entity) ToExtend = True if self.getPointMapTool().shiftKey == True else False self.trimFeatures(QgsGeometry.fromPoint(value), ToExtend) else: # cerco se ci sono entità nel punto indicato considerando # solo layer lineari editabili che non appartengano a quote layerList = [] for layer in qad_utils.getVisibleVectorLayers(self.plugIn.canvas): # Tutti i layer vettoriali visibili if layer.geometryType() == QGis.Line and layer.isEditable(): if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) result = qad_utils.getEntSel(self.getPointMapTool().toCanvasCoordinates(value), self.getPointMapTool(), \ QadVariables.get(QadMsg.translate("Environment variables", "PICKBOX")), \ layerList) if result is not None: feature = result[0] layer = result[1] point = result[2] self.entitySet.addEntity(QadEntity().set(layer, feature.id())) self.trimFeatures(QgsGeometry.fromPoint(point), False) else: return True # fine comando # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERCETTA (da step = 2) elif self.step == 3: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: if len(self.PLINECommand.vertices) > 1: if msgMapTool == True: # se la polilinea arriva da una selezione grafica ToExtend = True if self.getPointMapTool().shiftKey == True else False else: ToExtend = False # cerco tutte le geometrie passanti per la polilinea saltando i layer punto e poligono # e considerando solo layer editabili self.entitySet = qad_utils.getSelSet("F", self.getPointMapTool(), self.PLINECommand.vertices, \ None, False, True, False, \ True) self.trimFeatures(QgsGeometry.fromPolyline(self.PLINECommand.vertices), ToExtend) del self.PLINECommand self.PLINECommand = None # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di pline return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERSECA (da step = 2) elif self.step == 4: # dopo aver atteso un punto si riavvia il comando if self.RECTANGLECommand.run(msgMapTool, msg) == True: if len(self.RECTANGLECommand.vertices) > 1: if msgMapTool == True: # se la polilinea arriva da una selezione grafica ToExtend = True if self.getPointMapTool().shiftKey == True else False else: ToExtend = False # cerco tutte le geometrie passanti per la polilinea saltando i layer punto e poligono # e considerando solo layer editabili self.entitySet = qad_utils.getSelSet("F", self.getPointMapTool(), self.RECTANGLECommand.vertices, \ None, False, True, False, \ True) self.trimFeatures(QgsGeometry.fromPolyline(self.RECTANGLECommand.vertices), ToExtend) del self.RECTANGLECommand self.RECTANGLECommand = None # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di rectangle return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI TIPO DI ESTENSIONE (da step = 2) elif self.step == 5: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: # il valore arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_TRIM", "No") or value == "No": self.edgeMode = 0 QadVariables.set(QadMsg.translate("Environment variables", "EDGEMODE"), self.edgeMode) QadVariables.save() # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() elif value == QadMsg.translate("Command_TRIM", "Extend") or value == "Extend": self.edgeMode = 1 QadVariables.set(QadMsg.translate("Environment variables", "EDGEMODE"), self.edgeMode) QadVariables.save() # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() return False
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE OGGETTI LIMITI if self.step == 0: # inizio del comando CurrSettingsMsg = QadMsg.translate("QAD", "\nCurrent settings: ") if self.edgeMode == 0: # 0 = nessuna estensione CurrSettingsMsg = CurrSettingsMsg + QadMsg.translate("Command_TRIM", "Edge = No extend") else: CurrSettingsMsg = CurrSettingsMsg + QadMsg.translate("Command_TRIM", "Edge = Extend") self.showMsg(CurrSettingsMsg) self.showMsg(QadMsg.translate("Command_TRIM", "\nSelect trim limits...")) if self.SSGetClass.run(msgMapTool, msg) == True: # selezione terminata self.step = 1 return self.run(msgMapTool, msg) #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI LIMITI elif self.step == 1: self.limitEntitySet.set(self.SSGetClass.entitySet) if self.limitEntitySet.count() == 0: return True # fine comando # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI DA ESTENDERE elif self.step == 2: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_TRIM", "Fence") or value == "Fence": # Seleziona tutti gli oggetti che intersecano una polilinea self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 3 return False elif value == QadMsg.translate("Command_TRIM", "Crossing") or value == "Crossing": # Seleziona tutti gli oggetti che intersecano un rettangolo self.RECTANGLECommand = QadRECTANGLECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.RECTANGLECommand.virtualCmd = True self.RECTANGLECommand.run(msgMapTool, msg) self.step = 4 return False elif value == QadMsg.translate("Command_TRIM", "Edge") or value == "Edge": # Per estendere un oggetto usando anche le estensioni degli oggetti di riferimento # vedi variabile EDGEMODE keyWords = QadMsg.translate("Command_TRIM", "Extend") + "/" + \ QadMsg.translate("Command_TRIM", "No extend") if self.edgeMode == 0: # 0 = nessuna estensione self.defaultValue = QadMsg.translate("Command_TRIM", "No") else: self.defaultValue = QadMsg.translate("Command_TRIM", "Extend") prompt = QadMsg.translate("Command_TRIM", "Specify an extension mode [{0}] <{1}>: ").format(keyWords, self.defaultValue) englishKeyWords = "Extend" + "/" + "No extend" keyWords += "_" + englishKeyWords # si appresta ad attendere enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 5 return False elif value == QadMsg.translate("Command_TRIM", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif type(value) == QgsPoint: # se é stato selezionato un punto self.entitySet.clear() if self.getPointMapTool().entity.isInitialized(): self.entitySet.addEntity(self.getPointMapTool().entity) ToExtend = True if self.getPointMapTool().shiftKey == True else False self.trimFeatures(QgsGeometry.fromPoint(value), ToExtend) else: # cerco se ci sono entità nel punto indicato considerando # solo layer lineari editabili che non appartengano a quote layerList = [] for layer in qad_utils.getVisibleVectorLayers(self.plugIn.canvas): # Tutti i layer vettoriali visibili if layer.geometryType() == QGis.Line and layer.isEditable(): if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) result = qad_utils.getEntSel(self.getPointMapTool().toCanvasCoordinates(value), self.getPointMapTool(), \ QadVariables.get(QadMsg.translate("Environment variables", "PICKBOX")), \ layerList) if result is not None: feature = result[0] layer = result[1] point = result[2] self.entitySet.addEntity(QadEntity().set(layer, feature.id())) self.trimFeatures(QgsGeometry.fromPoint(point), False) else: return True # fine comando # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERCETTA (da step = 2) elif self.step == 3: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: if len(self.PLINECommand.vertices) > 1: if msgMapTool == True: # se la polilinea arriva da una selezione grafica ToExtend = True if self.getPointMapTool().shiftKey == True else False else: ToExtend = False # cerco tutte le geometrie passanti per la polilinea saltando i layer punto e poligono # e considerando solo layer editabili self.entitySet = qad_utils.getSelSet("F", self.getPointMapTool(), self.PLINECommand.vertices, \ None, False, True, False, \ True) self.trimFeatures(QgsGeometry.fromPolyline(self.PLINECommand.vertices), ToExtend) del self.PLINECommand self.PLINECommand = None # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di pline return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERSECA (da step = 2) elif self.step == 4: # dopo aver atteso un punto si riavvia il comando if self.RECTANGLECommand.run(msgMapTool, msg) == True: if len(self.RECTANGLECommand.vertices) > 1: if msgMapTool == True: # se la polilinea arriva da una selezione grafica ToExtend = True if self.getPointMapTool().shiftKey == True else False else: ToExtend = False # cerco tutte le geometrie passanti per la polilinea saltando i layer punto e poligono # e considerando solo layer editabili self.entitySet = qad_utils.getSelSet("F", self.getPointMapTool(), self.RECTANGLECommand.vertices, \ None, False, True, False, \ True) self.trimFeatures(QgsGeometry.fromPolyline(self.RECTANGLECommand.vertices), ToExtend) del self.RECTANGLECommand self.RECTANGLECommand = None # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di rectangle return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI TIPO DI ESTENSIONE (da step = 2) elif self.step == 5: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: # il valore arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_TRIM", "No") or value == "No": self.edgeMode = 0 QadVariables.set(QadMsg.translate("Environment variables", "EDGEMODE"), self.edgeMode) QadVariables.save() # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() elif value == QadMsg.translate("Command_TRIM", "Extend") or value == "Extend": self.edgeMode = 1 QadVariables.set(QadMsg.translate("Environment variables", "EDGEMODE"), self.edgeMode) QadVariables.save() # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSel() return False
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando if self.step == 0: self.waitForEntsel(msgMapTool, msg) # seleziona il poligono da modificare return False # continua #========================================================================= # RISPOSTA ALLA SELEZIONE POLIGONO DA MODIFICARE elif self.step == 1: if self.entSelClass.run(msgMapTool, msg) == True: if self.entSelClass.entity.isInitialized(): self.poligonEntity.set(self.entSelClass.entity.layer, self.entSelClass.entity.featureId) layer = self.entSelClass.entity.layer self.poligonEntity.deselectOnLayer() self.WaitForMainMenu() else: if self.entSelClass.canceledByUsr == True: # fine comando return True self.showMsg(QadMsg.translate("QAD", "No geometries in this position.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL MENU PRINCIPALE elif self.step == 2: # dopo aver atteso una opzione si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False self.WaitForMainMenu() return False else: # l'opzione arriva come parametro della funzione value = msg self.poligonEntity.deselectOnLayer() if value == QadMsg.translate("Command_MAPMPEDIT", "Add") or value == "Add": self.SSGetClass.checkPointLayer = False # scarto i punto self.SSGetClass.run(msgMapTool, msg) self.step = 3 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Delete") or value == "Delete": self.waitForBoundary(msgMapTool, msg) self.step = 4 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Union") or value == "Union": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 5 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Substract") or value == "Substract": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 6 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Intersect") or value == "Intersect": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 7 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "split Objects") or value == "split Objects": # Disegna una polilinea di divisione del poligono self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 9 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "split Parts") or value == "split Parts": # Disegna una polilinea di divisione del poligono self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 10 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "iNclude objs") or value == "iNclude objs": self.SSGetClass.checkPointLayer = True # includo i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 8 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif value == QadMsg.translate("Command_MAPMPEDIT", "eXit") or value == "eXit": return True # fine comando else: return True # fine comando self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI ADD (da step = 2) elif self.step == 3: if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.addEntitySetToPolygon(self.SSGetClass.entitySet) self.reinitSSGetClass() self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI DELETE (da step = 2) elif self.step == 4: if self.entSelClass.run(msgMapTool, msg) == True: if self.setCurrentSubGeom(self.entSelClass) == True: self.delCurrentSubGeomToPolygon() self.WaitForMainMenu() return False else: if self.entSelClass.canceledByUsr == True: # fine selezione entità self.WaitForMainMenu() else: self.waitForBoundary(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI UNION (da step = 2) elif self.step == 5: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.UNION) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI SUBTRACT (da step = 2) elif self.step == 6: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI INTERSECT (da step = 2) elif self.step == 7: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.INTERSECTION) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI INCLUDE OBJS (da step = 2) elif self.step == 8: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.convexHullEntitySetToPolygon(self.SSGetClass.entitySet) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LINEA DI DIVISIONE (da step = 2) elif self.step == 9: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.splitPolygon(self.PLINECommand.vertices, True) del self.PLINECommand self.PLINECommand = None self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LINEA DI DIVISIONE (da step = 2) elif self.step == 10: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.splitPolygon(self.PLINECommand.vertices, False) del self.PLINECommand self.PLINECommand = None self.WaitForMainMenu() return False
class QadMAPMPEDITCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadMAPMPEDITCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "MAPMPEDIT") def getEnglishName(self): return "MAPMPEDIT" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runMAPMPEDITCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/mapmpedit.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_MAPMPEDIT", "Modifies existing polygon.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.poligonEntity = QadEntity() self.SSGetClass = QadSSGetClass(plugIn) self.SSGetClass.onlyEditableLayers = False self.SSGetClass.checkDimLayers = False # scarto le quote self.entSelClass = None self.currSubGeom = None self.currAtSubGeom = None self.nOperationsToUndo = 0 def __del__(self): QadCommandClass.__del__(self) del self.SSGetClass self.poligonEntity.deselectOnLayer() def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 1 or self.step == 4: # quando si é in fase di selezione entità return self.entSelClass.getPointMapTool(drawMode) elif self.step == 3 or self.step == 5 or \ self.step == 6 or self.step == 7 or self.step == 8: # quando si é in fase di selezione gruppo entità return self.SSGetClass.getPointMapTool() else: return QadCommandClass.getPointMapTool(self, drawMode) def getCurrentContextualMenu(self): if self.step == 1 or self.step == 4: # quando si é in fase di selezione entità return self.entSelClass.getCurrentContextualMenu() elif self.step == 3 or self.step == 5 or \ self.step == 6 or self.step == 7 or self.step == 8: # quando si é in fase di selezione gruppo entità return None # return self.SSGetClass.getCurrentContextualMenu() else: return self.contextualMenu def reinitSSGetClass(self): checkPointLayer = self.SSGetClass.checkPointLayer del self.SSGetClass self.SSGetClass = QadSSGetClass(self.plugIn) self.SSGetClass.onlyEditableLayers = False self.SSGetClass.checkDimLayers = False # scarto le quote self.SSGetClass.checkPointLayer = checkPointLayer #============================================================================ # setCurrentSubGeom #============================================================================ def setCurrentSubGeom(self, entSelClass): """ Setta la sottogeometria corrente """ self.currSubGeom = None self.currAtSubGeom = None # verifico che sia stata selezionata un'entità if entSelClass.entity.isInitialized() == False: self.showMsg(QadMsg.translate("QAD", "No geometries in this position.")) return False # verifico che sia stata selezionata attraverso un punto # (per capire quale sottogeometria è stata selezionata) if entSelClass.point is None: return False # verifico che sia stato selezionato lo stesso polygono che è da modificare if self.poligonEntity != entSelClass.entity: self.showMsg(QadMsg.translate("Command_MAPMPEDIT", "The boundary doesn't belong to the selected polygon.")) return False # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy geom = self.layerToMapCoordinates(entSelClass.entity.layer, entSelClass.entity.getGeometry()) # ritorna una tupla (<The squared cartesian distance>, # <minDistPoint> # <afterVertex> # <leftOf>) dummy = qad_utils.closestSegmentWithContext(entSelClass.point, geom) if dummy[2] is None: return False # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based) self.currSubGeom, self.currAtSubGeom = qad_utils.getSubGeomAtVertex(geom, dummy[2]) if self.currSubGeom is None or self.currAtSubGeom is None: self.currSubGeom = None self.currAtSubGeom = None return False return True #============================================================================ # addEntitySetToPolygon #============================================================================ def addEntitySetToPolygon(self, entitySet, removeOriginals = False): """ Aggiunge il set di entità al poligono da modificare """ geom = self.poligonEntity.getGeometry() layerList = [] layerList.append(self.poligonEntity.layer) for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer if layer.geometryType() != QGis.Polygon and layer.geometryType() != QGis.Line: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals: layerList.append(layer) coordTransform = QgsCoordinateTransform(layer.crs(), self.poligonEntity.layer.crs()) for featureId in layerEntitySet.featureIds: # se la feature è quella di polygonEntity è errore if layer.id() == self.poligonEntity.layerId() and featureId == self.poligonEntity.featureId: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) # se il poligono è contenuto nella geometria da aggiungere if geomToAdd.contains(geom): # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geom) # deve essere un poligono senza ring if len(simplifiedGeoms) != 1 or simplifiedGeoms[0].wkbType() != QGis.WKBLineString: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False points = simplifiedGeoms[0].asPolyline() # vettore di punti # aggiungo un'isola if geomToAdd.addRing(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False del geom geom = QgsGeometry.fromPolygon(geomToAdd.asPolygon()) else: # se il poligono non è contenuto nella geometria da aggiungere # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geomToAdd) for simplifiedGeom in simplifiedGeoms: points = simplifiedGeom.asPolyline() # vettore di punti # se la geometria da aggiungere è contenuta nel poligono if geom.contains(QgsGeometry.fromPolyline(points)): # aggiungo un'isola if geom.addRing(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False else: # aggiungo una parte if geom.addPart(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) layerList = entitySet.getLayerList() layerList.append(self.poligonEntity.layer) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if removeOriginals: for layerEntitySet in entitySet.layerEntitySetList: if qad_layer.deleteFeaturesToLayer(self.plugIn, layerEntitySet.layer, layerEntitySet.featureIds, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # delCurrentSubGeomToPolygon #============================================================================ def delCurrentSubGeomToPolygon(self): """ Cancella la sotto-geometria corrente dal poligono da modificare """ geom = self.poligonEntity.getGeometry() # la posizione é espressa con una lista (<index ogg. princ> [<index ogg. sec.>]) part = self.currAtSubGeom[0] if len(self.currAtSubGeom) == 2: ring = self.currAtSubGeom[1] if geom.deleteRing(ring + 1, part) == False: # cancello una isola (Ring 0 is outer ring and can't be deleted) self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False else: if geom.deletePart(part) == False: # cancello una parte self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", self.poligonEntity.layer) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 #============================================================================ # unionIntersSubtractEntitySetToPolygon #============================================================================ def unionIntersSubtractEntitySetToPolygon(self, entitySet, opType, removeOriginals = False): """ Unisce o interseca i poligoni di entitySet al poligono corrente """ geom = self.poligonEntity.getGeometry() layerList = [] layerList.append(self.poligonEntity.layer) geomList = [] geomList.append(geom) for layerEntitySet in entitySet.layerEntitySetList: del geomList[:] layer = layerEntitySet.layer coordTransform = QgsCoordinateTransform(layer.crs(), self.poligonEntity.layer.crs()) if layer.geometryType() == QGis.Polygon: for featureId in layerEntitySet.featureIds: # se la feature è quella di polygonEntity è errore if layer.id() == self.poligonEntity.layerId() and featureId == self.poligonEntity.featureId: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) if opType == QadMAPMPEDITCommandOpTypeEnum.UNION: geom = geom.combine(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.INTERSECTION: geom = geom.intersection(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE: geom = geom.difference(geomToAdd) if geom is None: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals and layer.id() != self.poligonEntity.layerId(): layerList.append(layer) elif layer.geometryType() == QGis.Line: for featureId in layerEntitySet.featureIds: f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geomToAdd) for simplifiedGeom in simplifiedGeoms: if simplifiedGeom.wkbType() != QGis.WKBLineString: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False points = simplifiedGeom.asPolyline() # vettore di punti if len(points) < 4 or points[0] != points[-1]: # polilinea chiusa con almeno 4 punti (primo e ultimo uguali) self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False geomToAdd = QgsGeometry.fromPolygon([points]) if opType == QadMAPMPEDITCommandOpTypeEnum.UNION: geom = geom.combine(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.INTERSECTION: geom = geom.intersection(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE: geom = geom.difference(geomToAdd) if geom is None or geom.type() != QGis.Polygon: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals: layerList.append(layer) else: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if removeOriginals: for layerEntitySet in entitySet.layerEntitySetList: if qad_layer.deleteFeaturesToLayer(self.plugIn, layerEntitySet.layer, layerEntitySet.featureIds, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # convexHullEntitySetToPolygon #============================================================================ def convexHullEntitySetToPolygon(self, entitySet, removeOriginals = False): """ modifica il poligono corrente in modo che includa tutti i punti delle geometrie di entitySet """ layerList = [] layerList.append(self.poligonEntity.layer) pointsForConvexHull = [] for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer coordTransform = QgsCoordinateTransform(layer.crs(), self.poligonEntity.layer.crs()) for featureId in layerEntitySet.featureIds: f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geom = f.geometry() geom.transform(coordTransform) # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geom) for simplifiedGeom in simplifiedGeoms: if simplifiedGeom.wkbType() == QGis.WKBLineString: pointsForConvexHull.extend(simplifiedGeom.asPolyline()) else: pointsForConvexHull.append(simplifiedGeom.asPoint()) if removeOriginals and layer.id() != self.poligonEntity.layerId(): layerList.append(layer) geom = QgsGeometry.fromMultiPoint(pointsForConvexHull) geom = geom.convexHull() if geom is None: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if removeOriginals: for layerEntitySet in entitySet.layerEntitySetList: if qad_layer.deleteFeaturesToLayer(self.plugIn, layerEntitySet.layer, layerEntitySet.featureIds, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # dividePolygon #============================================================================ def splitPolygon(self, splitLine, createNewEntities): """ divide il poligono corrente usando una polilinea con i vertci in <plineVertices> in modo da generare o meno nuove entità """ layerList = [] layerList.append(self.poligonEntity.layer) splitLineTransformed = self.mapToLayerCoordinates(self.poligonEntity.layer, splitLine) f = self.poligonEntity.getFeature() geom = f.geometry() result, newGeoms, topologyTestPts = geom.splitGeometry(splitLineTransformed, False) if result <> 0 or len(newGeoms) == 0: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False newfeatures =[] if createNewEntities: for newGeom in newGeoms: newfeature = QgsFeature(f) newfeature.setGeometry(newGeom) newfeatures.append(newfeature) else: for newGeom in newGeoms: # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(newGeom) for simplifiedGeom in simplifiedGeoms: points = simplifiedGeom.asPolyline() # vettore di punti res = geom.addPart(points) f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if len(newfeatures) > 0: # plugIn, layer, features, coordTransform, refresh, check_validity if qad_layer.addFeaturesToLayer(self.plugIn, self.poligonEntity.layer, newfeatures, None, False, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # waitForEntsel #============================================================================ def waitForEntsel(self, msgMapTool, msg): if self.entSelClass is not None: del self.entSelClass self.step = 1 self.entSelClass = QadEntSelClass(self.plugIn) self.entSelClass.msg = QadMsg.translate("Command_MAPMPEDIT", "Select polygon: ") # scarto la selezione di punti e polilinee self.entSelClass.checkPointLayer = False self.entSelClass.checkLineLayer = False self.entSelClass.checkPolygonLayer = True self.entSelClass.checkDimLayers = False self.entSelClass.onlyEditableLayers = True self.entSelClass.run(msgMapTool, msg) #============================================================================ # WaitForMainMenu #============================================================================ def WaitForMainMenu(self): self.poligonEntity.selectOnLayer(False) keyWords = QadMsg.translate("Command_MAPMPEDIT", "Add") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Delete") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Union") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Substract") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Intersect") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "split Objects") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "split Parts") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "iNclude objs") englishKeyWords = "Add" + "/" + "Delete" + "/" + "Union" + "/" + "Substract" + "/" + "Intersect" "/" + \ "split Objects" + "/" + "split Parts" + "/" + "iNclude objs" if self.nOperationsToUndo > 0: # se c'è qualcosa che si può annullare keyWords = keyWords + "/" + QadMsg.translate("Command_MAPMPEDIT", "Undo") englishKeyWords = englishKeyWords + "/" + "Undo" keyWords = keyWords + "/" + QadMsg.translate("Command_MAPMPEDIT", "eXit") englishKeyWords = englishKeyWords + "/" + "eXit" default = QadMsg.translate("Command_MAPMPEDIT", "eXit") prompt = QadMsg.translate("Command_MAPMPEDIT", "Enter an option [{0}] <{1}>: ").format(keyWords, default) self.step = 2 self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.NONE) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) keyWords += "_" + englishKeyWords # si appresta ad attendere enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) return False #============================================================================ # waitForBoundary #============================================================================ def waitForBoundary(self, msgMapTool, msg): if self.entSelClass is not None: del self.entSelClass self.entSelClass = QadEntSelClass(self.plugIn) self.entSelClass.msg = QadMsg.translate("Command_MAPMPEDIT", "Select boundary: ") # scarto la selezione di punti e polilinee self.entSelClass.checkPointLayer = False self.entSelClass.checkLineLayer = False self.entSelClass.checkPolygonLayer = True self.entSelClass.checkDimLayers = False self.entSelClass.onlyEditableLayers = True self.entSelClass.run(msgMapTool, msg) def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando if self.step == 0: self.waitForEntsel(msgMapTool, msg) # seleziona il poligono da modificare return False # continua #========================================================================= # RISPOSTA ALLA SELEZIONE POLIGONO DA MODIFICARE elif self.step == 1: if self.entSelClass.run(msgMapTool, msg) == True: if self.entSelClass.entity.isInitialized(): self.poligonEntity.set(self.entSelClass.entity.layer, self.entSelClass.entity.featureId) layer = self.entSelClass.entity.layer self.poligonEntity.deselectOnLayer() self.WaitForMainMenu() else: if self.entSelClass.canceledByUsr == True: # fine comando return True self.showMsg(QadMsg.translate("QAD", "No geometries in this position.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL MENU PRINCIPALE elif self.step == 2: # dopo aver atteso una opzione si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False self.WaitForMainMenu() return False else: # l'opzione arriva come parametro della funzione value = msg self.poligonEntity.deselectOnLayer() if value == QadMsg.translate("Command_MAPMPEDIT", "Add") or value == "Add": self.SSGetClass.checkPointLayer = False # scarto i punto self.SSGetClass.run(msgMapTool, msg) self.step = 3 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Delete") or value == "Delete": self.waitForBoundary(msgMapTool, msg) self.step = 4 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Union") or value == "Union": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 5 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Substract") or value == "Substract": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 6 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Intersect") or value == "Intersect": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 7 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "split Objects") or value == "split Objects": # Disegna una polilinea di divisione del poligono self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 9 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "split Parts") or value == "split Parts": # Disegna una polilinea di divisione del poligono self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 10 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "iNclude objs") or value == "iNclude objs": self.SSGetClass.checkPointLayer = True # includo i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 8 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif value == QadMsg.translate("Command_MAPMPEDIT", "eXit") or value == "eXit": return True # fine comando else: return True # fine comando self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI ADD (da step = 2) elif self.step == 3: if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.addEntitySetToPolygon(self.SSGetClass.entitySet) self.reinitSSGetClass() self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI DELETE (da step = 2) elif self.step == 4: if self.entSelClass.run(msgMapTool, msg) == True: if self.setCurrentSubGeom(self.entSelClass) == True: self.delCurrentSubGeomToPolygon() self.WaitForMainMenu() return False else: if self.entSelClass.canceledByUsr == True: # fine selezione entità self.WaitForMainMenu() else: self.waitForBoundary(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI UNION (da step = 2) elif self.step == 5: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.UNION) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI SUBTRACT (da step = 2) elif self.step == 6: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI INTERSECT (da step = 2) elif self.step == 7: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.INTERSECTION) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI INCLUDE OBJS (da step = 2) elif self.step == 8: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.convexHullEntitySetToPolygon(self.SSGetClass.entitySet) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LINEA DI DIVISIONE (da step = 2) elif self.step == 9: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.splitPolygon(self.PLINECommand.vertices, True) del self.PLINECommand self.PLINECommand = None self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LINEA DI DIVISIONE (da step = 2) elif self.step == 10: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.splitPolygon(self.PLINECommand.vertices, False) del self.PLINECommand self.PLINECommand = None self.WaitForMainMenu() return False
class QadSSGetClass(QadCommandClass): # Classe che gestisce la selezione di oggetti geometrici def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadSSGetClass(self.plugIn) def __init__(self, plugIn): self.init(plugIn) def __del__(self): QadCommandClass.__del__(self) #self.entitySet.deselectOnLayer() def init(self, plugIn): QadCommandClass.__init__(self, plugIn) self.AddOnSelection = True # se = False significa remove self.entitySet = QadEntitySet() self.points = [] self.currSelectionMode = "" # opzioni per limitare gli oggetti da selezionare self.onlyEditableLayers = False self.checkPointLayer = True self.checkLineLayer = True self.checkPolygonLayer = True self.checkDimLayers = True # include tutte le features che compongono le quotature selezionate self.help = False # se SingleSelection = True viene selezionato il primo oggetto o gruppo di oggetti indicato, # senza che vengano richieste altre selezioni. self.SingleSelection = False self.pickAdd = QadVariables.get(QadMsg.translate("Environment variables", "PICKADD")) # se exitAfterSelection = True il comando viene terminato dopo una qualunque selezione # indipendentemente che sia stato selezionato o meno un oggetto o gruppo di oggetti. # usato da QadVirtualSelCommandClass self.exitAfterSelection = False # selezione degli oggetti aggiunti più recentemente al gruppo di selezione (x opzione annulla) self.lastEntitySet = QadEntitySet() self.PLINECommand = None self.CIRCLECommand = None self.MPOLYGONCommand = None self.MBUFFERCommand = None self.SSGetClass = None def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 4: # quando si é in fase di disegno linea return self.PLINECommand.getPointMapTool(drawMode) elif self.step == 5: # quando si é in fase di disegno cerchio return self.CIRCLECommand.getPointMapTool(drawMode) elif self.step == 6: # quando si é in fase di selezione entità return self.SSGetClass.getPointMapTool(drawMode) elif self.step == 7: # quando si é in fase di disegno polygono return self.MPOLYGONCommand.getPointMapTool(drawMode) elif self.step == 8: # quando si é in fase di disegno buffer return self.MBUFFERCommand.getPointMapTool(drawMode) else: ptMapTool = QadCommandClass.getPointMapTool(self, drawMode) ptMapTool.setSnapType(QadSnapTypeEnum.DISABLE) ptMapTool.setOrthoMode(0) return ptMapTool #============================================================================ # getLayersToCheck #============================================================================ def getLayersToCheck(self): layerList = [] for layer in self.plugIn.canvas.layers(): # Tutti i layer visibili visibili # considero solo i layer vettoriali che sono filtrati per tipo if (layer.type() == QgsMapLayer.VectorLayer) and \ ((layer.geometryType() == QGis.Point and self.checkPointLayer == True) or \ (layer.geometryType() == QGis.Line and self.checkLineLayer == True) or \ (layer.geometryType() == QGis.Polygon and self.checkPolygonLayer == True)) and \ (self.onlyEditableLayers == False or layer.isEditable()): # se devo includere i layers delle quotature if self.checkDimLayers == True or \ len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) return layerList #============================================================================ # showMsgOnAddRemove #============================================================================ def showMsgOnAddRemove(self, found): msg = QadMsg.translate("Command_SSGET", " found {0}, total {1}") self.showMsg(msg.format(found, self.entitySet.count()), True) # ripete il prompt #============================================================================ # elaborateEntity #============================================================================ def elaborateEntity(self, entity, shiftKey): if self.AddOnSelection == True: # aggiungi al gruppo di selezione if shiftKey: # se la selezione é avvenuta con shift premuto if self.pickAdd == 0: # The objects most recently selected become the selection set if self.entitySet.containsEntity(entity): # se l'entità era già stata selezionata self.AddRemoveEntity(entity, False) # rimuovo l'entità else: self.AddRemoveEntity(entity, True) # aggiungo l'entità else: self.AddRemoveEntity(entity, False) # rimuovo l'entità else: # senza tasto shift if self.pickAdd == 0: # The objects most recently selected become the selection set self.SetEntity(entity) else: self.AddRemoveEntity(entity, True) # aggiungo l'entità else: # se si deve rimuovere dal gruppo di selezione self.AddRemoveEntity(entity, False) # rimuovo l'entità #============================================================================ # SetEntity #============================================================================ def SetEntity(self, entity): # controllo sul layer if self.onlyEditableLayers == True and entity.layer.isEditable() == False: self.showMsgOnAddRemove(0) return # controllo sul tipo if (self.checkPointLayer == False and entity.layer.geometryType() == QGis.Point) or \ (self.checkLineLayer == False and entity.layer.geometryType() == QGis.Line) or \ (self.checkPolygonLayer == False and entity.layer.geometryType() == QGis.Polygon): self.showMsgOnAddRemove(0) return # controllo su layer delle quotature # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(entity) if self.checkDimLayers == False and dimEntity is not None: self.showMsgOnAddRemove(0) return self.entitySet.deselectOnLayer() self.entitySet.clear() self.entitySet.addEntity(entity) if self.checkDimLayers == True and dimEntity is not None: # Aggiungo i componenenti della quotatura a set <entitySet> self.entitySet.unite(dimEntity.getEntitySet()) self.showMsgOnAddRemove(self.entitySet.count()) self.entitySet.selectOnLayer(False) # incremental = False aaaaaaaaaaaaaaaaaaaaaaaaaa qui parte l'evento activate di qad_maptool self.lastEntitySet.clear() self.lastEntitySet.addEntity(entity) #============================================================================ # AddRemoveEntity #============================================================================ def AddRemoveEntity(self, entity, Add): # controllo sul layer if self.onlyEditableLayers == True and entity.layer.isEditable() == False: self.showMsgOnAddRemove(0) return # controllo sul tipo if (self.checkPointLayer == False and entity.layer.geometryType() == QGis.Point) or \ (self.checkLineLayer == False and entity.layer.geometryType() == QGis.Line) or \ (self.checkPolygonLayer == False and entity.layer.geometryType() == QGis.Polygon): self.showMsgOnAddRemove(0) return # controllo su layer delle quotature if self.checkDimLayers == False and len(QadDimStyles.getDimListByLayer(entity.layer)) > 0: self.showMsgOnAddRemove(0) return self.entitySet.deselectOnLayer() if Add == True: # aggiungi al gruppo di selezione self.entitySet.addEntity(entity) else: # rimuovi dal gruppo di selezione self.entitySet.removeEntity(entity) if self.checkDimLayers == True: dimEntitySet = QadEntitySet() dimEntitySet.addEntity(entity) # La funzione verifica se le entità che fanno parte di un entitySet sono anche parte di quotatura e, # in caso affermativo, aggiunge/rimuove tutti i componenti delle quotature all'entitySet. QadDimStyles.addAllDimComponentsToEntitySet(dimEntitySet, self.onlyEditableLayers) if Add == True: # aggiungi al gruppo di selezione self.entitySet.unite(dimEntitySet) else: # rimuovi dal gruppo di selezione self.entitySet.subtract(dimEntitySet) self.showMsgOnAddRemove(dimEntitySet.count()) else: self.showMsgOnAddRemove(1) self.entitySet.selectOnLayer(False) # incremental = False self.lastEntitySet.clear() self.lastEntitySet.addEntity(entity) #============================================================================ # elaborateSelSet #============================================================================ def elaborateSelSet(self, selSet, shiftKey): if self.AddOnSelection == True: # aggiungi al gruppo di selezione if shiftKey: # se la selezione é avvenuta con shift premuto if self.pickAdd == 0: # The objects most recently selected become the selection set # verifico se ci sono degli oggetti non ancora selezionati intersectSS = QadEntitySet(selSet) intersectSS.subtract(self.entitySet) if intersectSS.isEmpty(): # tutti gli oggetti erano già selezionati self.AddRemoveSelSet(selSet, False) # rimuovo il gruppo di selezione else: self.AddRemoveSelSet(selSet, True) # aggiungo il gruppo di selezione else: self.AddRemoveSelSet(selSet, False) # rimuovo il gruppo di selezione else: # senza tasto shift if self.pickAdd == 0: # The objects most recently selected become the selection set self.SetSelSet(selSet) else: self.AddRemoveSelSet(selSet, True) # aggiungo il gruppo di selezione else: # se si deve rimuovere dal gruppo di selezione self.AddRemoveEntity(selSet, False) # rimuovo il gruppo di selezione #============================================================================ # SetSelSet #============================================================================ def SetSelSet(self, selSet): for layerEntitySet in self.entitySet.layerEntitySetList: # se il layer non é presente in selSet if selSet.findLayerEntitySet(layerEntitySet) is None: layerEntitySet.deselectOnLayer() else: layerEntitySet.deselectOnLayer() self.entitySet.set(selSet) if self.checkDimLayers == True: dimEntitySet = QadEntitySet(selSet) # La funzione verifica se le entità che fanno parte di un entitySet sono anche parte di quotatura e, # in caso affermativo, aggiunge tutti i componenti delle quotature all'entitySet. QadDimStyles.addAllDimComponentsToEntitySet(dimEntitySet, self.onlyEditableLayers) self.entitySet.unite(dimEntitySet) self.showMsgOnAddRemove(self.entitySet.count()) self.entitySet.selectOnLayer(False) # incremental = False self.lastEntitySet.set(selSet) #============================================================================ # AddCurrentQgsSelectedFeatures #============================================================================ def AddCurrentQgsSelectedFeatures(self): # verifico se ci sono entità correntemente selezionate self.entitySet.initByCurrentQgsSelectedFeatures(self.getLayersToCheck()) found = self.entitySet.count() if found > 0: msg = QadMsg.translate("Command_SSGET", "\nfound {0}") self.showMsg(msg.format(found), False) # non ripete il prompt return True else: return False #============================================================================ # AddRemoveSelSet #============================================================================ def AddRemoveSelSet(self, selSet, Add): self.entitySet.deselectOnLayer() if Add == True: # aggiungi al gruppo di selezione self.entitySet.unite(selSet) else: # rimuovi dal gruppo di selezione self.entitySet.subtract(selSet) self.showMsgOnAddRemove(selSet.count()) self.entitySet.selectOnLayer(False) # incremental = False self.lastEntitySet.set(selSet) #============================================================================ # AddRemoveSelSetByFence #============================================================================ def AddRemoveSelSetByFence(self, points): if len(points) > 1: selSet = qad_utils.getSelSet("F", self.getPointMapTool(), points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) #============================================================================ # AddRemoveSelSetByPolygon #============================================================================ def AddRemoveSelSetByPolygon(self, mode, points): if len(points) > 2: selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) #============================================================================ # AddRemoveSelSetByGeometry #============================================================================ def AddRemoveSelSetByGeometry(self, mode, geom): if type(geom) == QgsGeometry: # singola geometria selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), geom, \ self.getLayersToCheck()) else: # lista di geometrie selSet = QadEntitySet() for g in geom: partial = qad_utils.getSelSet(mode, self.getPointMapTool(), g, \ self.getLayersToCheck()) selSet.unite(partial) self.elaborateSelSet(selSet, False) #============================================================================ # WaitForFirstPoint #============================================================================ def WaitForFirstPoint(self): self.step = 1 # "Finestra" "Ultimo" "Interseca" # "Riquadro" "Tutto" "iNTercetta" # "FPoligono" "IPoligono" # "FCerchio" "ICerchio" # "FOggetti" "IOggetti" # "FBuffer" "IBuffer" # "AGgiungi" "Elimina" # "Precedente" "Annulla" # "AUto" "SIngolo" "Help" keyWords = QadMsg.translate("Command_SSGET", "Window") + "/" + \ QadMsg.translate("Command_SSGET", "Last") + "/" + \ QadMsg.translate("Command_SSGET", "Crossing") + "/" + \ QadMsg.translate("Command_SSGET", "Box") + "/" + \ QadMsg.translate("Command_SSGET", "All") + "/" + \ QadMsg.translate("Command_SSGET", "Fence") + "/" + \ QadMsg.translate("Command_SSGET", "WPolygon") + "/" + \ QadMsg.translate("Command_SSGET", "CPolygon") + "/" + \ QadMsg.translate("Command_SSGET", "WCircle") + "/" + \ QadMsg.translate("Command_SSGET", "CCircle") + "/" + \ QadMsg.translate("Command_SSGET", "WObjects") + "/" + \ QadMsg.translate("Command_SSGET", "CObjects") + "/" + \ QadMsg.translate("Command_SSGET", "WBuffer") + "/" + \ QadMsg.translate("Command_SSGET", "CBuffer") + "/" + \ QadMsg.translate("Command_SSGET", "Add") + "/" + \ QadMsg.translate("Command_SSGET", "Remove") + "/" + \ QadMsg.translate("Command_SSGET", "Previous") + "/" + \ QadMsg.translate("Command_SSGET", "Undo") + "/" + \ QadMsg.translate("Command_SSGET", "AUto") + "/" + \ QadMsg.translate("Command_SSGET", "SIngle") + "/" + \ QadMsg.translate("Command_SSGET", "Help") englishKeyWords = "Window" + "/" + "Last" + "/" + "Crossing" + "/" + "Box" + "/" \ + "All" + "/" + "Fence" + "/" + "WPolygon" + "/" + "CPolygon" + "/" \ + "WCircle" + "/" + "CCircle" + "/" + "WObjects" + "/" + "CObjects" + "/" \ + "WBuffer" + "/" + "CBuffer" + "/" + "Add" + "/" + "Remove" + "/" \ + "Previous" + "/" + "Undo" + "/" + "AUto" + "/" + "SIngle" + "/" + "Help" if self.AddOnSelection == True: prompt = QadMsg.translate("Command_SSGET", "Select Objects") else: prompt = QadMsg.translate("Command_SSGET", "Remove objects") if self.help == True: prompt = prompt + QadMsg.translate("Command_SSGET", " or [{0}]").format(keyWords) prompt = prompt + QadMsg.translate("Command_SSGET", ": ") # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITY_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # imposto i layer da controllare sul maptool self.getPointMapTool().layersToCheck = self.getLayersToCheck() self.points = [] keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) return def run(self, msgMapTool = False, msg = None): # ritorna: # True per selezione non terminata # False per selezione terminata if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # errore #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: # if you can also select objects before you start a command if QadVariables.get(QadMsg.translate("Environment variables", "PICKFIRST")) == 1: if self.AddCurrentQgsSelectedFeatures() == True: self.plugIn.setLastEntitySet(self.entitySet) return True; self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI elif self.step == 1: # dopo aver atteso un punto o enter o una parola chiave si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False # continua shiftKey = self.getPointMapTool().shiftKey # se é stata selezionata un'entità if self.getPointMapTool().entity.isInitialized(): value = self.getPointMapTool().entity else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione shiftKey = False value = msg if value is None: if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if type(value) == unicode: self.currSelectionMode = value if value == QadMsg.translate("Command_SSGET", "Window") or value == "Window" or \ value == QadMsg.translate("Command_SSGET", "Crossing") or value == "Crossing": # "Finestra" = Seleziona tutti gli oggetti che si trovano completamente all'interno di un rettangolo definito da due punti # "Interseca" = Seleziona gli oggetti che intersecano o si trovano all'interno di un'area definita da due punti # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "First corner: ")) self.step = 2 if value == QadMsg.translate("Command_SSGET", "Last") or value == "Last": # Seleziona l'ultima entità inserita if self.plugIn.getLastEntity() is None: self.showMsgOnAddRemove(0) else: self.AddRemoveEntity(self.plugIn.getLastEntity(), self.AddOnSelection) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Box") or value == "Box": # Seleziona tutti gli oggetti che intersecano o si trovano all'interno di un rettangolo specificato da due punti. # Se i punti del rettangolo sono specificati da destra a sinistra, Riquadro equivale ad Interseca, # altrimenti é equivalente a Finestra # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "First corner: ")) self.step = 2 elif value == QadMsg.translate("Command_SSGET", "All") or value == "All": # Seleziona tutti gli oggetti selSet = qad_utils.getSelSet("X", self.getPointMapTool(), None, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Fence") or value == "Fence": # Seleziona tutti gli oggetti che intersecano una polilinea self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 4 elif value == QadMsg.translate("Command_SSGET", "WPolygon") or value == "WPolygon" or \ value == QadMsg.translate("Command_SSGET", "CPolygon") or value == "CPolygon": # "FPoligono" = Seleziona oggetti che si trovano completamente all'interno di un poligono definito da punti # "IPoligono" = Seleziona gli oggetti che intersecano o si trovano all'interno di un poligono definito specificando dei punti self.MPOLYGONCommand = QadMPOLYGONCommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.MPOLYGONCommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WPolygon") or value == "WPolygon": self.MPOLYGONCommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.MPOLYGONCommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.MPOLYGONCommand.run(msgMapTool, msg) self.step = 7 elif value == QadMsg.translate("Command_SSGET", "WCircle") or value == "WCircle" or \ value == QadMsg.translate("Command_SSGET", "CCircle") or value == "CCircle": # "FCerchio" = Seleziona oggetti che si trovano completamente all'interno di un cerchio # "ICerchio" = Seleziona oggetti che intersecano o si trovano all'interno di un cerchio self.CIRCLECommand = QadCIRCLECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un cerchio # che non verrà salvata su un layer self.CIRCLECommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WCircle") or value == "WCircle": self.CIRCLECommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.CIRCLECommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.CIRCLECommand.run(msgMapTool, msg) self.step = 5 elif value == QadMsg.translate("Command_SSGET", "WObjects") or value == "WObjects" or \ value == QadMsg.translate("Command_SSGET", "CObjects") or value == "CObjects": # "FOggetti" = Seleziona oggetti che si trovano completamente all'interno di oggetti da selezionare # "IOggetti" = Seleziona oggetti che intersecano o si trovano all'interno di oggetti da selezionare self.SSGetClass = QadSSGetClass(self.plugIn) self.SSGetClass.run(msgMapTool, msg) self.step = 6 elif value == QadMsg.translate("Command_SSGET", "WBuffer") or value == "WBuffer" or \ value == QadMsg.translate("Command_SSGET", "CBuffer") or value == "CBuffer": # ho dovuto spostare questo import perché qad_mbuffer_cmd fa l'import di qad_ssget_cmd from qad_mbuffer_cmd import QadMBUFFERCommandClass # "FBuffer" = Seleziona oggetti che si trovano completamente all'interno di buffer intorno ad oggetti da selezionare # "IBuffer" = Seleziona oggetti che intersecano o si trovano all'interno di buffer intorno ad oggetti da selezionare self.MBUFFERCommand = QadMBUFFERCommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un cerchio # che non verrà salvata su un layer self.MBUFFERCommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WBuffer") or value == "WBuffer": self.MBUFFERCommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.MBUFFERCommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.MBUFFERCommand.run(msgMapTool, msg) self.step = 8 elif value == QadMsg.translate("Command_SSGET", "Add") or value == "Add": # Passa al metodo Aggiungi: gli oggetti selezionati possono essere aggiunti al gruppo di selezione self.AddOnSelection = True self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Remove") or value == "Remove": # Passa al metodo Rimuovi: gli oggetti possono essere rimossi dal gruppo di selezione self.AddOnSelection = False self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Previous") or value == "Previous": # Seleziona il gruppo di selezione più recente if self.plugIn.lastEntitySet is None: self.showMsgOnAddRemove(0) else: entitySet = QadEntitySet() entitySet.set(self.plugIn.lastEntitySet) # controllo sul layer if self.onlyEditableLayers == True: entitySet.removeNotEditable() # controllo sul tipo if self.checkPointLayer == False: entitySet.removeGeomType(QGis.Point) if self.checkLineLayer == False: entitySet.removeGeomType(QGis.Line) if self.checkPolygonLayer == False: entitySet.removeGeomType(QGis.Polygon) # controllo sulle quotature if self.checkDimLayers == False: QadDimStyles.removeAllDimLayersFromEntitySet(entitySet) entitySet.removeNotExisting() self.elaborateSelSet(entitySet, False) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Undo") or value == "Undo": # Annulla la selezione dell'oggetto aggiunto più recentemente al gruppo di selezione. # Inverto il tipo di selezione prevAddOnSelection = self.AddOnSelection self.AddOnSelection = not self.AddOnSelection self.elaborateSelSet(self.lastEntitySet, False) # Ripristino il tipo di selezione self.AddOnSelection = prevAddOnSelection if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "AUto") or value == "AUto": # Passa alla selezione automatica: vengono selezionati gli oggetti sui quali si posiziona il puntatore. # Facendo clic su un'area vuota all'interno o all'esterno di un oggetto, # si crea il primo angolo di un rettangolo di selezione, come per il metodo Riquadro self.SingleSelection = False self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "SIngle") or value == "SIngle": # Passa al metodo Singolo: viene selezionato il primo oggetto o gruppo di oggetti indicato, # senza che vengano richieste altre selezioni. self.SingleSelection = True if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Help") or value == "Help": self.help = True self.WaitForFirstPoint() elif type(value) == QgsPoint: # se é stato inserito il punto iniziale del rettangolo self.currSelectionMode = QadMsg.translate("Command_SSGET", "Box") self.points.append(value) self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITYSET_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) self.getPointMapTool().setStartPoint(value) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) self.step = 3 else: # se é stata selezionata un'entità self.elaborateEntity(value, shiftKey) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL PRIMO PUNTO DEL RETTANGOLO DA OPZIONE # FINESTRA, INTERSECA, RIQUADRO (da step = 1) elif self.step == 2: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) self.WaitForFirstPoint() return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == QgsPoint: self.points.append(value) self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITYSET_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) # cambio il colore impostato da setDrawMode if self.currSelectionMode == QadMsg.translate("Command_SSGET", "Window") or value == "Window": self.getPointMapTool().rectangleCrossingSelectionColor = self.getPointMapTool().rectangleWindowSelectionColor elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "Crossing") or value == "Crossing": self.getPointMapTool().rectangleWindowSelectionColor = self.getPointMapTool().rectangleCrossingSelectionColor self.rectangleCrossingSelectionColor = getColorForCrossingSelectionArea() self.rectangleWindowSelectionColor = getColorForWindowSelectionArea() self.getPointMapTool().setStartPoint(value) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) self.step = 3 else: self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL SECONDO PUNTO DEL RETTANGOLO (da step = 1) elif self.step == 3: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False shiftKey = self.getPointMapTool().shiftKey value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione shiftKey = False value = msg if type(value) == QgsPoint: self.getPointMapTool().clear() self.points.append(value) if self.currSelectionMode == QadMsg.translate("Command_SSGET", "Box") or \ self.currSelectionMode == "Box": if self.points[0].x() < value.x(): mode = "W" else: mode = "C" elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "Window") or \ self.currSelectionMode == "Window": mode = "W" else: # "Interseca" mode = "C" selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), self.points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, shiftKey) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() else: self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERCETTA (da step = 1 o 4) elif self.step == 4: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.AddRemoveSelSetByFence(self.PLINECommand.vertices) del self.PLINECommand self.PLINECommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PER MODALITA' FCERCHIO e ICERCHIO (da step = 1 o 5) elif self.step == 5: # dopo aver atteso un punto si riavvia il comando if self.CIRCLECommand.run(msgMapTool, msg) == True: self.showMsg("\n") if (self.CIRCLECommand.centerPt is not None) and \ (self.CIRCLECommand.radius is not None): circle = QadCircle() circle.set(self.CIRCLECommand.centerPt, self.CIRCLECommand.radius) points = circle.asPolyline() if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WCircle") or \ self.currSelectionMode == "WCircle": self.AddRemoveSelSetByPolygon("WP", points) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CCircle") or \ self.currSelectionMode == "CCircle": self.AddRemoveSelSetByPolygon("CP", points) del self.CIRCLECommand self.CIRCLECommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI SELEZIONE DI OGGETTI PER MODALITA' FOGGETTI e IOGGETTI (da step = 1 o 6) elif self.step == 6: # dopo aver atteso un punto si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: self.showMsg("\n") destCRS = self.SSGetClass.getPointMapTool().canvas.mapRenderer().destinationCrs() geoms = self.SSGetClass.entitySet.getGeometryCollection(destCRS) # trasformo la geometria if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WObjects") or \ self.currSelectionMode == "WObjects": self.AddRemoveSelSetByGeometry("WO", geoms) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CObjects") or \ self.currSelectionMode == "CObjects": self.AddRemoveSelSetByGeometry("CO", geoms) del self.SSGetClass self.SSGetClass = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PER MODALITA' FPOLIGONO e IPOLIGONO (da step = 1 o 7) elif self.step == 7: # dopo aver atteso un punto si riavvia il comando if self.MPOLYGONCommand.run(msgMapTool, msg) == True: self.showMsg("\n") if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WPolygon") or \ self.currSelectionMode == "WPolygon": self.AddRemoveSelSetByPolygon("WP", self.MPOLYGONCommand.vertices) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CPolygon") or \ self.currSelectionMode == "CPolygon": self.AddRemoveSelSetByPolygon("CP", self.MPOLYGONCommand.vertices) del self.MPOLYGONCommand self.MPOLYGONCommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI SELEZIONE DI OGGETTI PER MODALITA' FBUFFER e IBUFFER (da step = 1 o 8) elif self.step == 8: # dopo aver atteso un punto si riavvia il comando if self.MBUFFERCommand.run(msgMapTool, msg) == True: self.showMsg("\n") bufferGeoms = [] for layerEntitySet in self.MBUFFERCommand.entitySet.layerEntitySetList: geoms = layerEntitySet.getGeometryCollection() width = qad_utils.distMapToLayerCoordinates(self.MBUFFERCommand.width, \ self.MBUFFERCommand.getPointMapTool().canvas,\ layerEntitySet.layer) for geom in geoms: bufferGeoms.append(geom.buffer(width, self.MBUFFERCommand.segments)) if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WBuffer") or \ self.currSelectionMode == "WBuffer": self.AddRemoveSelSetByGeometry("WO", bufferGeoms) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CBuffer") or \ self.currSelectionMode == "CBuffer": self.AddRemoveSelSetByGeometry("CO", bufferGeoms) del self.MBUFFERCommand self.MBUFFERCommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False
def run(self, msgMapTool = False, msg = None): # ritorna: # True per selezione non terminata # False per selezione terminata if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # errore #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: # if you can also select objects before you start a command if QadVariables.get(QadMsg.translate("Environment variables", "PICKFIRST")) == 1: if self.AddCurrentQgsSelectedFeatures() == True: self.plugIn.setLastEntitySet(self.entitySet) return True; self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI elif self.step == 1: # dopo aver atteso un punto o enter o una parola chiave si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False # continua shiftKey = self.getPointMapTool().shiftKey # se é stata selezionata un'entità if self.getPointMapTool().entity.isInitialized(): value = self.getPointMapTool().entity else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione shiftKey = False value = msg if value is None: if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if type(value) == unicode: self.currSelectionMode = value if value == QadMsg.translate("Command_SSGET", "Window") or value == "Window" or \ value == QadMsg.translate("Command_SSGET", "Crossing") or value == "Crossing": # "Finestra" = Seleziona tutti gli oggetti che si trovano completamente all'interno di un rettangolo definito da due punti # "Interseca" = Seleziona gli oggetti che intersecano o si trovano all'interno di un'area definita da due punti # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "First corner: ")) self.step = 2 if value == QadMsg.translate("Command_SSGET", "Last") or value == "Last": # Seleziona l'ultima entità inserita if self.plugIn.getLastEntity() is None: self.showMsgOnAddRemove(0) else: self.AddRemoveEntity(self.plugIn.getLastEntity(), self.AddOnSelection) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Box") or value == "Box": # Seleziona tutti gli oggetti che intersecano o si trovano all'interno di un rettangolo specificato da due punti. # Se i punti del rettangolo sono specificati da destra a sinistra, Riquadro equivale ad Interseca, # altrimenti é equivalente a Finestra # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "First corner: ")) self.step = 2 elif value == QadMsg.translate("Command_SSGET", "All") or value == "All": # Seleziona tutti gli oggetti selSet = qad_utils.getSelSet("X", self.getPointMapTool(), None, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Fence") or value == "Fence": # Seleziona tutti gli oggetti che intersecano una polilinea self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 4 elif value == QadMsg.translate("Command_SSGET", "WPolygon") or value == "WPolygon" or \ value == QadMsg.translate("Command_SSGET", "CPolygon") or value == "CPolygon": # "FPoligono" = Seleziona oggetti che si trovano completamente all'interno di un poligono definito da punti # "IPoligono" = Seleziona gli oggetti che intersecano o si trovano all'interno di un poligono definito specificando dei punti self.MPOLYGONCommand = QadMPOLYGONCommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.MPOLYGONCommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WPolygon") or value == "WPolygon": self.MPOLYGONCommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.MPOLYGONCommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.MPOLYGONCommand.run(msgMapTool, msg) self.step = 7 elif value == QadMsg.translate("Command_SSGET", "WCircle") or value == "WCircle" or \ value == QadMsg.translate("Command_SSGET", "CCircle") or value == "CCircle": # "FCerchio" = Seleziona oggetti che si trovano completamente all'interno di un cerchio # "ICerchio" = Seleziona oggetti che intersecano o si trovano all'interno di un cerchio self.CIRCLECommand = QadCIRCLECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un cerchio # che non verrà salvata su un layer self.CIRCLECommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WCircle") or value == "WCircle": self.CIRCLECommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.CIRCLECommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.CIRCLECommand.run(msgMapTool, msg) self.step = 5 elif value == QadMsg.translate("Command_SSGET", "WObjects") or value == "WObjects" or \ value == QadMsg.translate("Command_SSGET", "CObjects") or value == "CObjects": # "FOggetti" = Seleziona oggetti che si trovano completamente all'interno di oggetti da selezionare # "IOggetti" = Seleziona oggetti che intersecano o si trovano all'interno di oggetti da selezionare self.SSGetClass = QadSSGetClass(self.plugIn) self.SSGetClass.run(msgMapTool, msg) self.step = 6 elif value == QadMsg.translate("Command_SSGET", "WBuffer") or value == "WBuffer" or \ value == QadMsg.translate("Command_SSGET", "CBuffer") or value == "CBuffer": # ho dovuto spostare questo import perché qad_mbuffer_cmd fa l'import di qad_ssget_cmd from qad_mbuffer_cmd import QadMBUFFERCommandClass # "FBuffer" = Seleziona oggetti che si trovano completamente all'interno di buffer intorno ad oggetti da selezionare # "IBuffer" = Seleziona oggetti che intersecano o si trovano all'interno di buffer intorno ad oggetti da selezionare self.MBUFFERCommand = QadMBUFFERCommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un cerchio # che non verrà salvata su un layer self.MBUFFERCommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WBuffer") or value == "WBuffer": self.MBUFFERCommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.MBUFFERCommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.MBUFFERCommand.run(msgMapTool, msg) self.step = 8 elif value == QadMsg.translate("Command_SSGET", "Add") or value == "Add": # Passa al metodo Aggiungi: gli oggetti selezionati possono essere aggiunti al gruppo di selezione self.AddOnSelection = True self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Remove") or value == "Remove": # Passa al metodo Rimuovi: gli oggetti possono essere rimossi dal gruppo di selezione self.AddOnSelection = False self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Previous") or value == "Previous": # Seleziona il gruppo di selezione più recente if self.plugIn.lastEntitySet is None: self.showMsgOnAddRemove(0) else: entitySet = QadEntitySet() entitySet.set(self.plugIn.lastEntitySet) # controllo sul layer if self.onlyEditableLayers == True: entitySet.removeNotEditable() # controllo sul tipo if self.checkPointLayer == False: entitySet.removeGeomType(QGis.Point) if self.checkLineLayer == False: entitySet.removeGeomType(QGis.Line) if self.checkPolygonLayer == False: entitySet.removeGeomType(QGis.Polygon) # controllo sulle quotature if self.checkDimLayers == False: QadDimStyles.removeAllDimLayersFromEntitySet(entitySet) entitySet.removeNotExisting() self.elaborateSelSet(entitySet, False) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Undo") or value == "Undo": # Annulla la selezione dell'oggetto aggiunto più recentemente al gruppo di selezione. # Inverto il tipo di selezione prevAddOnSelection = self.AddOnSelection self.AddOnSelection = not self.AddOnSelection self.elaborateSelSet(self.lastEntitySet, False) # Ripristino il tipo di selezione self.AddOnSelection = prevAddOnSelection if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "AUto") or value == "AUto": # Passa alla selezione automatica: vengono selezionati gli oggetti sui quali si posiziona il puntatore. # Facendo clic su un'area vuota all'interno o all'esterno di un oggetto, # si crea il primo angolo di un rettangolo di selezione, come per il metodo Riquadro self.SingleSelection = False self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "SIngle") or value == "SIngle": # Passa al metodo Singolo: viene selezionato il primo oggetto o gruppo di oggetti indicato, # senza che vengano richieste altre selezioni. self.SingleSelection = True if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Help") or value == "Help": self.help = True self.WaitForFirstPoint() elif type(value) == QgsPoint: # se é stato inserito il punto iniziale del rettangolo self.currSelectionMode = QadMsg.translate("Command_SSGET", "Box") self.points.append(value) self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITYSET_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) self.getPointMapTool().setStartPoint(value) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) self.step = 3 else: # se é stata selezionata un'entità self.elaborateEntity(value, shiftKey) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL PRIMO PUNTO DEL RETTANGOLO DA OPZIONE # FINESTRA, INTERSECA, RIQUADRO (da step = 1) elif self.step == 2: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) self.WaitForFirstPoint() return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == QgsPoint: self.points.append(value) self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITYSET_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) # cambio il colore impostato da setDrawMode if self.currSelectionMode == QadMsg.translate("Command_SSGET", "Window") or value == "Window": self.getPointMapTool().rectangleCrossingSelectionColor = self.getPointMapTool().rectangleWindowSelectionColor elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "Crossing") or value == "Crossing": self.getPointMapTool().rectangleWindowSelectionColor = self.getPointMapTool().rectangleCrossingSelectionColor self.rectangleCrossingSelectionColor = getColorForCrossingSelectionArea() self.rectangleWindowSelectionColor = getColorForWindowSelectionArea() self.getPointMapTool().setStartPoint(value) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) self.step = 3 else: self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL SECONDO PUNTO DEL RETTANGOLO (da step = 1) elif self.step == 3: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False shiftKey = self.getPointMapTool().shiftKey value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione shiftKey = False value = msg if type(value) == QgsPoint: self.getPointMapTool().clear() self.points.append(value) if self.currSelectionMode == QadMsg.translate("Command_SSGET", "Box") or \ self.currSelectionMode == "Box": if self.points[0].x() < value.x(): mode = "W" else: mode = "C" elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "Window") or \ self.currSelectionMode == "Window": mode = "W" else: # "Interseca" mode = "C" selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), self.points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, shiftKey) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() else: self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERCETTA (da step = 1 o 4) elif self.step == 4: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.AddRemoveSelSetByFence(self.PLINECommand.vertices) del self.PLINECommand self.PLINECommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PER MODALITA' FCERCHIO e ICERCHIO (da step = 1 o 5) elif self.step == 5: # dopo aver atteso un punto si riavvia il comando if self.CIRCLECommand.run(msgMapTool, msg) == True: self.showMsg("\n") if (self.CIRCLECommand.centerPt is not None) and \ (self.CIRCLECommand.radius is not None): circle = QadCircle() circle.set(self.CIRCLECommand.centerPt, self.CIRCLECommand.radius) points = circle.asPolyline() if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WCircle") or \ self.currSelectionMode == "WCircle": self.AddRemoveSelSetByPolygon("WP", points) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CCircle") or \ self.currSelectionMode == "CCircle": self.AddRemoveSelSetByPolygon("CP", points) del self.CIRCLECommand self.CIRCLECommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI SELEZIONE DI OGGETTI PER MODALITA' FOGGETTI e IOGGETTI (da step = 1 o 6) elif self.step == 6: # dopo aver atteso un punto si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: self.showMsg("\n") destCRS = self.SSGetClass.getPointMapTool().canvas.mapRenderer().destinationCrs() geoms = self.SSGetClass.entitySet.getGeometryCollection(destCRS) # trasformo la geometria if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WObjects") or \ self.currSelectionMode == "WObjects": self.AddRemoveSelSetByGeometry("WO", geoms) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CObjects") or \ self.currSelectionMode == "CObjects": self.AddRemoveSelSetByGeometry("CO", geoms) del self.SSGetClass self.SSGetClass = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PER MODALITA' FPOLIGONO e IPOLIGONO (da step = 1 o 7) elif self.step == 7: # dopo aver atteso un punto si riavvia il comando if self.MPOLYGONCommand.run(msgMapTool, msg) == True: self.showMsg("\n") if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WPolygon") or \ self.currSelectionMode == "WPolygon": self.AddRemoveSelSetByPolygon("WP", self.MPOLYGONCommand.vertices) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CPolygon") or \ self.currSelectionMode == "CPolygon": self.AddRemoveSelSetByPolygon("CP", self.MPOLYGONCommand.vertices) del self.MPOLYGONCommand self.MPOLYGONCommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI SELEZIONE DI OGGETTI PER MODALITA' FBUFFER e IBUFFER (da step = 1 o 8) elif self.step == 8: # dopo aver atteso un punto si riavvia il comando if self.MBUFFERCommand.run(msgMapTool, msg) == True: self.showMsg("\n") bufferGeoms = [] for layerEntitySet in self.MBUFFERCommand.entitySet.layerEntitySetList: geoms = layerEntitySet.getGeometryCollection() width = qad_utils.distMapToLayerCoordinates(self.MBUFFERCommand.width, \ self.MBUFFERCommand.getPointMapTool().canvas,\ layerEntitySet.layer) for geom in geoms: bufferGeoms.append(geom.buffer(width, self.MBUFFERCommand.segments)) if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WBuffer") or \ self.currSelectionMode == "WBuffer": self.AddRemoveSelSetByGeometry("WO", bufferGeoms) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CBuffer") or \ self.currSelectionMode == "CBuffer": self.AddRemoveSelSetByGeometry("CO", bufferGeoms) del self.MBUFFERCommand self.MBUFFERCommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False
class QadMPOLYGONCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadMPOLYGONCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "MPOLYGON") def getEnglishName(self): return "MPOLYGON" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runMPOLYGONCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/mpolygon.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_MPOLYGON", "Draws a polygon by many methods.\nA Polygon is a closed sequence of straight line segments,\narcs or a combination of two.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.vertices = [] # se questo flag = True il comando serve all'interno di un altro comando per disegnare un poligono # che non verrà salvato su un layer self.virtualCmd = False self.rubberBandBorderColor = None self.rubberBandFillColor = None self.PLINECommand = None def __del__(self): QadCommandClass.__del__(self) if self.PLINECommand is not None: del self.PLINECommand def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.PLINECommand is not None: return self.PLINECommand.getPointMapTool(drawMode) else: return QadCommandClass.getPointMapTool(self, drawMode) def getCurrentContextualMenu(self): if self.PLINECommand is not None: return self.PLINECommand.getCurrentContextualMenu() else: return self.contextualMenu def setRubberBandColor(self, rubberBandBorderColor, rubberBandFillColor): self.rubberBandBorderColor = rubberBandBorderColor self.rubberBandFillColor = rubberBandFillColor if self.PLINECommand is not None: self.PLINECommand.setRubberBandColor(rubberBandBorderColor, rubberBandFillColor) def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Polygon) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: self.PLINECommand = QadPLINECommandClass(self.plugIn, True) self.PLINECommand.setRubberBandColor(self.rubberBandBorderColor, self.rubberBandFillColor) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.asToolForMPolygon = True # per rubberband tipo poligono self.PLINECommand.run(msgMapTool, msg) self.step = 1 return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO (da step = 0 o 1) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: verticesLen = len(self.PLINECommand.vertices) if verticesLen >= 3: self.vertices = self.PLINECommand.vertices[:] # copio la lista firstVertex = self.vertices[0] # se l'ultimo vertice non é uguale al primo if self.vertices[verticesLen - 1] != firstVertex: # aggiungo un vertice con le stesse coordinate del primo self.vertices.append(firstVertex) if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer if qad_layer.addPolygonToLayer(self.plugIn, currLayer, self.vertices) == False: self.showMsg(QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.vertices[:] # svuoto la lista else: self.showMsg(QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.PLINECommand self.PLINECommand = None return True # fine return False
class QadMPOLYGONCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadMPOLYGONCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "MPOLIGONO") def getEnglishName(self): return "MPOLYGON" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runMPOLYGONCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/mpolygon.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_MPOLYGON", "Disegna un poligono mediante diversi metodi.\n\nUn poligono é una sequenza chiusa di segmenti retti,\narchi o una combinazione dei due.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.vertices = [] # se questo flag = True il comando serve all'interno di un altro comando per disegnare un poligono # che non verrà salvato su un layer self.virtualCmd = False self.PLINECommand = None def __del__(self): QadCommandClass.__del__(self) del self.SSGetClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.PLINECommand is not None: return self.PLINECommand.getPointMapTool(drawMode) else: return QadCommandClass.getPointMapTool(self, drawMode) def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nIl sistema di riferimento del progetto deve essere un sistema di coordinate proiettate.\n")) return True # fine comando if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Polygon) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: self.PLINECommand = QadPLINECommandClass(self.plugIn, True) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.asToolForMPolygon = True # per rubberband tipo poligono self.PLINECommand.run(msgMapTool, msg) self.step = 1 return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO (da step = 0 o 1) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: verticesLen = len(self.PLINECommand.vertices) if verticesLen > 3: self.vertices = self.PLINECommand.vertices[:] # copio la lista firstVertex = self.vertices[0] # se l'ultimo vertice non é uguale al primo if self.vertices[verticesLen - 1] != firstVertex: # aggiungo un vertice con le stesse coordinate del primo self.vertices.append(firstVertex) if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer if qad_layer.addPolygonToLayer(self.plugIn, currLayer, self.vertices) == False: self.showMsg(QadMsg.translate("Command_MPOLYGON", "\nPoligono non valido.\n")) del self.vertices[:] # svuoto la lista else: self.showMsg(QadMsg.translate("Command_MPOLYGON", "\nPoligono non valido.\n")) del self.PLINECommand self.PLINECommand = None return True # fine return False
class QadSSGetClass(QadCommandClass): # Classe che gestisce la selezione di oggetti geometrici def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadSSGetClass(self.plugIn) def __init__(self, plugIn): self.init(plugIn) def __del__(self): QadCommandClass.__del__(self) #self.entitySet.deselectOnLayer() def init(self, plugIn): QadCommandClass.__init__(self, plugIn) self.AddOnSelection = True # se = False significa remove self.entitySet = QadEntitySet() self.points = [] self.currSelectionMode = "" # opzioni per limitare gli oggetti da selezionare self.onlyEditableLayers = False self.checkPointLayer = True self.checkLineLayer = True self.checkPolygonLayer = True self.checkDimLayers = True # include tutte le features che compongono le quotature selezionate self.help = False # se SingleSelection = True viene selezionato il primo oggetto o gruppo di oggetti indicato, # senza che vengano richieste altre selezioni. self.SingleSelection = False self.pickAdd = QadVariables.get(QadMsg.translate("Environment variables", "PICKADD")) # se exitAfterSelection = True il comando viene terminato dopo una qualunque selezione # indipendentemente che sia stato selezionato o meno un oggetto o gruppo di oggetti. # usato da QadVirtualSelCommandClass self.exitAfterSelection = False # selezione degli oggetti aggiunti più recentemente al gruppo di selezione (x opzione annulla) self.lastEntitySet = QadEntitySet() self.PLINECommand = None self.CIRCLECommand = None self.MPOLYGONCommand = None self.MBUFFERCommand = None self.SSGetClass = None def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 4: # quando si é in fase di disegno linea return self.PLINECommand.getPointMapTool(drawMode) elif self.step == 5: # quando si é in fase di disegno cerchio return self.CIRCLECommand.getPointMapTool(drawMode) elif self.step == 6: # quando si é in fase di selezione entità return self.SSGetClass.getPointMapTool(drawMode) elif self.step == 7: # quando si é in fase di disegno polygono return self.MPOLYGONCommand.getPointMapTool(drawMode) elif self.step == 8: # quando si é in fase di disegno buffer return self.MBUFFERCommand.getPointMapTool(drawMode) else: ptMapTool = QadCommandClass.getPointMapTool(self, drawMode) ptMapTool.setSnapType(QadSnapTypeEnum.DISABLE) ptMapTool.setOrthoMode(0) return ptMapTool #============================================================================ # getLayersToCheck #============================================================================ def getLayersToCheck(self): layerList = [] for layer in qad_utils.getVisibleVectorLayers(self.plugIn.canvas): # Tutti i layer vettoriali visibili # considero solo i layer vettoriali che sono filtrati per tipo if ((layer.geometryType() == QGis.Point and self.checkPointLayer == True) or \ (layer.geometryType() == QGis.Line and self.checkLineLayer == True) or \ (layer.geometryType() == QGis.Polygon and self.checkPolygonLayer == True)) and \ (self.onlyEditableLayers == False or layer.isEditable()): # se devo includere i layers delle quotature if self.checkDimLayers == True or \ len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) return layerList #============================================================================ # showMsgOnAddRemove #============================================================================ def showMsgOnAddRemove(self, found): msg = QadMsg.translate("Command_SSGET", " found {0}, total {1}") self.showMsg(msg.format(found, self.entitySet.count()), False) # non ripete il prompt 2016 #============================================================================ # elaborateEntity #============================================================================ def elaborateEntity(self, entity, shiftKey): if self.AddOnSelection == True: # aggiungi al gruppo di selezione if shiftKey: # se la selezione é avvenuta con shift premuto if self.pickAdd == 0: # The objects most recently selected become the selection set if self.entitySet.containsEntity(entity): # se l'entità era già stata selezionata self.AddRemoveEntity(entity, False) # rimuovo l'entità else: self.AddRemoveEntity(entity, True) # aggiungo l'entità else: self.AddRemoveEntity(entity, False) # rimuovo l'entità else: # senza tasto shift if self.pickAdd == 0: # The objects most recently selected become the selection set self.SetEntity(entity) else: self.AddRemoveEntity(entity, True) # aggiungo l'entità else: # se si deve rimuovere dal gruppo di selezione self.AddRemoveEntity(entity, False) # rimuovo l'entità #============================================================================ # SetEntity #============================================================================ def SetEntity(self, entity): # controllo sul layer if self.onlyEditableLayers == True and entity.layer.isEditable() == False: self.showMsgOnAddRemove(0) return # controllo sul tipo if (self.checkPointLayer == False and entity.layer.geometryType() == QGis.Point) or \ (self.checkLineLayer == False and entity.layer.geometryType() == QGis.Line) or \ (self.checkPolygonLayer == False and entity.layer.geometryType() == QGis.Polygon): self.showMsgOnAddRemove(0) return # controllo su layer delle quotature # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(entity) if self.checkDimLayers == False and dimEntity is not None: self.showMsgOnAddRemove(0) return self.entitySet.deselectOnLayer() self.entitySet.clear() self.entitySet.addEntity(entity) if self.checkDimLayers == True and dimEntity is not None: # Aggiungo i componenenti della quotatura a set <entitySet> self.entitySet.unite(dimEntity.getEntitySet()) self.showMsgOnAddRemove(self.entitySet.count()) self.entitySet.selectOnLayer(False) # incremental = False aaaaaaaaaaaaaaaaaaaaaaaaaa qui parte l'evento activate di qad_maptool (se il layer non è in modifica) self.lastEntitySet.clear() self.lastEntitySet.addEntity(entity) #============================================================================ # AddRemoveEntity #============================================================================ def AddRemoveEntity(self, entity, Add): # controllo sul layer if self.onlyEditableLayers == True and entity.layer.isEditable() == False: self.showMsgOnAddRemove(0) return # controllo sul tipo if (self.checkPointLayer == False and entity.layer.geometryType() == QGis.Point) or \ (self.checkLineLayer == False and entity.layer.geometryType() == QGis.Line) or \ (self.checkPolygonLayer == False and entity.layer.geometryType() == QGis.Polygon): self.showMsgOnAddRemove(0) return # controllo su layer delle quotature if self.checkDimLayers == False and len(QadDimStyles.getDimListByLayer(entity.layer)) > 0: self.showMsgOnAddRemove(0) return self.entitySet.deselectOnLayer() if Add == True: # aggiungi al gruppo di selezione self.entitySet.addEntity(entity) else: # rimuovi dal gruppo di selezione self.entitySet.removeEntity(entity) if self.checkDimLayers == True: dimEntitySet = QadEntitySet() dimEntitySet.addEntity(entity) # La funzione verifica se le entità che fanno parte di un entitySet sono anche parte di quotatura e, # in caso affermativo, aggiunge/rimuove tutti i componenti delle quotature all'entitySet. QadDimStyles.addAllDimComponentsToEntitySet(dimEntitySet, self.onlyEditableLayers) if Add == True: # aggiungi al gruppo di selezione self.entitySet.unite(dimEntitySet) else: # rimuovi dal gruppo di selezione self.entitySet.subtract(dimEntitySet) self.showMsgOnAddRemove(dimEntitySet.count()) else: self.showMsgOnAddRemove(1) self.entitySet.selectOnLayer(False) # incremental = False self.lastEntitySet.clear() self.lastEntitySet.addEntity(entity) #============================================================================ # elaborateSelSet #============================================================================ def elaborateSelSet(self, selSet, shiftKey): if self.AddOnSelection == True: # aggiungi al gruppo di selezione if shiftKey: # se la selezione é avvenuta con shift premuto if self.pickAdd == 0: # The objects most recently selected become the selection set # verifico se ci sono degli oggetti non ancora selezionati intersectSS = QadEntitySet(selSet) intersectSS.subtract(self.entitySet) if intersectSS.isEmpty(): # tutti gli oggetti erano già selezionati self.AddRemoveSelSet(selSet, False) # rimuovo il gruppo di selezione else: self.AddRemoveSelSet(selSet, True) # aggiungo il gruppo di selezione else: self.AddRemoveSelSet(selSet, False) # rimuovo il gruppo di selezione else: # senza tasto shift if self.pickAdd == 0: # The objects most recently selected become the selection set self.SetSelSet(selSet) else: self.AddRemoveSelSet(selSet, True) # aggiungo il gruppo di selezione else: # se si deve rimuovere dal gruppo di selezione self.AddRemoveEntity(selSet, False) # rimuovo il gruppo di selezione #============================================================================ # SetSelSet #============================================================================ def SetSelSet(self, selSet): for layerEntitySet in self.entitySet.layerEntitySetList: # se il layer non é presente in selSet if selSet.findLayerEntitySet(layerEntitySet) is None: layerEntitySet.deselectOnLayer() else: layerEntitySet.deselectOnLayer() self.entitySet.set(selSet) if self.checkDimLayers == True: dimEntitySet = QadEntitySet(selSet) # La funzione verifica se le entità che fanno parte di un entitySet sono anche parte di quotatura e, # in caso affermativo, aggiunge tutti i componenti delle quotature all'entitySet. QadDimStyles.addAllDimComponentsToEntitySet(dimEntitySet, self.onlyEditableLayers) self.entitySet.unite(dimEntitySet) self.showMsgOnAddRemove(self.entitySet.count()) self.entitySet.selectOnLayer(False) # incremental = False self.lastEntitySet.set(selSet) #============================================================================ # AddCurrentQgsSelectedFeatures #============================================================================ def AddCurrentQgsSelectedFeatures(self): # verifico se ci sono entità correntemente selezionate self.entitySet.initByCurrentQgsSelectedFeatures(self.getLayersToCheck()) found = self.entitySet.count() if found > 0: msg = QadMsg.translate("Command_SSGET", "\nfound {0}") self.showMsg(msg.format(found), False) # non ripete il prompt return True else: return False #============================================================================ # AddRemoveSelSet #============================================================================ def AddRemoveSelSet(self, selSet, Add): self.entitySet.deselectOnLayer() if Add == True: # aggiungi al gruppo di selezione self.entitySet.unite(selSet) else: # rimuovi dal gruppo di selezione self.entitySet.subtract(selSet) self.showMsgOnAddRemove(selSet.count()) self.entitySet.selectOnLayer(False) # incremental = False self.lastEntitySet.set(selSet) #============================================================================ # AddRemoveSelSetByFence #============================================================================ def AddRemoveSelSetByFence(self, points): if len(points) > 1: selSet = qad_utils.getSelSet("F", self.getPointMapTool(), points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) #============================================================================ # AddRemoveSelSetByPolygon #============================================================================ def AddRemoveSelSetByPolygon(self, mode, points): if len(points) > 2: selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) #============================================================================ # AddRemoveSelSetByGeometry #============================================================================ def AddRemoveSelSetByGeometry(self, mode, geom): if type(geom) == QgsGeometry: # singola geometria selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), geom, \ self.getLayersToCheck()) else: # lista di geometrie selSet = QadEntitySet() for g in geom: partial = qad_utils.getSelSet(mode, self.getPointMapTool(), g, \ self.getLayersToCheck()) selSet.unite(partial) self.elaborateSelSet(selSet, False) #============================================================================ # WaitForFirstPoint #============================================================================ def WaitForFirstPoint(self): self.step = 1 # "Finestra" "Ultimo" "Interseca" # "Riquadro" "Tutto" "iNTercetta" # "FPoligono" "IPoligono" # "FCerchio" "ICerchio" # "FOggetti" "IOggetti" # "FBuffer" "IBuffer" # "AGgiungi" "Elimina" # "Precedente" "Annulla" # "AUto" "SIngolo" "Help" keyWords = QadMsg.translate("Command_SSGET", "Window") + "/" + \ QadMsg.translate("Command_SSGET", "Last") + "/" + \ QadMsg.translate("Command_SSGET", "Crossing") + "/" + \ QadMsg.translate("Command_SSGET", "Box") + "/" + \ QadMsg.translate("Command_SSGET", "All") + "/" + \ QadMsg.translate("Command_SSGET", "Fence") + "/" + \ QadMsg.translate("Command_SSGET", "WPolygon") + "/" + \ QadMsg.translate("Command_SSGET", "CPolygon") + "/" + \ QadMsg.translate("Command_SSGET", "WCircle") + "/" + \ QadMsg.translate("Command_SSGET", "CCircle") + "/" + \ QadMsg.translate("Command_SSGET", "WObjects") + "/" + \ QadMsg.translate("Command_SSGET", "CObjects") + "/" + \ QadMsg.translate("Command_SSGET", "WBuffer") + "/" + \ QadMsg.translate("Command_SSGET", "CBuffer") + "/" + \ QadMsg.translate("Command_SSGET", "Add") + "/" + \ QadMsg.translate("Command_SSGET", "Remove") + "/" + \ QadMsg.translate("Command_SSGET", "Previous") + "/" + \ QadMsg.translate("Command_SSGET", "Undo") + "/" + \ QadMsg.translate("Command_SSGET", "AUto") + "/" + \ QadMsg.translate("Command_SSGET", "SIngle") + "/" + \ QadMsg.translate("Command_SSGET", "Help") englishKeyWords = "Window" + "/" + "Last" + "/" + "Crossing" + "/" + "Box" + "/" \ + "All" + "/" + "Fence" + "/" + "WPolygon" + "/" + "CPolygon" + "/" \ + "WCircle" + "/" + "CCircle" + "/" + "WObjects" + "/" + "CObjects" + "/" \ + "WBuffer" + "/" + "CBuffer" + "/" + "Add" + "/" + "Remove" + "/" \ + "Previous" + "/" + "Undo" + "/" + "AUto" + "/" + "SIngle" + "/" + "Help" if self.AddOnSelection == True: prompt = QadMsg.translate("Command_SSGET", "Select Objects") else: prompt = QadMsg.translate("Command_SSGET", "Remove objects") if self.help == True: prompt = prompt + QadMsg.translate("Command_SSGET", " or [{0}]").format(keyWords) prompt = prompt + QadMsg.translate("Command_SSGET", ": ") # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITY_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # imposto i layer da controllare sul maptool self.getPointMapTool().layersToCheck = self.getLayersToCheck() self.points = [] keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) return def run(self, msgMapTool = False, msg = None): # ritorna: # True per selezione non terminata # False per selezione terminata if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # errore #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: # if you can also select objects before you start a command if QadVariables.get(QadMsg.translate("Environment variables", "PICKFIRST")) == 1: if self.AddCurrentQgsSelectedFeatures() == True: self.plugIn.setLastEntitySet(self.entitySet) return True; self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI elif self.step == 1: # dopo aver atteso un punto o enter o una parola chiave si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False # continua shiftKey = self.getPointMapTool().shiftKey # se é stata selezionata un'entità if self.getPointMapTool().entity.isInitialized(): value = self.getPointMapTool().entity else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione shiftKey = False value = msg if value is None: if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if type(value) == unicode: self.currSelectionMode = value if value == QadMsg.translate("Command_SSGET", "Window") or value == "Window" or \ value == QadMsg.translate("Command_SSGET", "Crossing") or value == "Crossing": # "Finestra" = Seleziona tutti gli oggetti che si trovano completamente all'interno di un rettangolo definito da due punti # "Interseca" = Seleziona gli oggetti che intersecano o si trovano all'interno di un'area definita da due punti # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "First corner: ")) self.step = 2 if value == QadMsg.translate("Command_SSGET", "Last") or value == "Last": # Seleziona l'ultima entità inserita if self.plugIn.getLastEntity() is None: self.showMsgOnAddRemove(0) else: self.AddRemoveEntity(self.plugIn.getLastEntity(), self.AddOnSelection) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Box") or value == "Box": # Seleziona tutti gli oggetti che intersecano o si trovano all'interno di un rettangolo specificato da due punti. # Se i punti del rettangolo sono specificati da destra a sinistra, Riquadro equivale ad Interseca, # altrimenti é equivalente a Finestra # imposto il map tool self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "First corner: ")) self.step = 2 elif value == QadMsg.translate("Command_SSGET", "All") or value == "All": # Seleziona tutti gli oggetti selSet = qad_utils.getSelSet("X", self.getPointMapTool(), None, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, False) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Fence") or value == "Fence": # Seleziona tutti gli oggetti che intersecano una polilinea self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 4 elif value == QadMsg.translate("Command_SSGET", "WPolygon") or value == "WPolygon" or \ value == QadMsg.translate("Command_SSGET", "CPolygon") or value == "CPolygon": # "FPoligono" = Seleziona oggetti che si trovano completamente all'interno di un poligono definito da punti # "IPoligono" = Seleziona gli oggetti che intersecano o si trovano all'interno di un poligono definito specificando dei punti self.MPOLYGONCommand = QadMPOLYGONCommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.MPOLYGONCommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WPolygon") or value == "WPolygon": self.MPOLYGONCommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.MPOLYGONCommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.MPOLYGONCommand.run(msgMapTool, msg) self.step = 7 elif value == QadMsg.translate("Command_SSGET", "WCircle") or value == "WCircle" or \ value == QadMsg.translate("Command_SSGET", "CCircle") or value == "CCircle": # "FCerchio" = Seleziona oggetti che si trovano completamente all'interno di un cerchio # "ICerchio" = Seleziona oggetti che intersecano o si trovano all'interno di un cerchio self.CIRCLECommand = QadCIRCLECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un cerchio # che non verrà salvata su un layer self.CIRCLECommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WCircle") or value == "WCircle": self.CIRCLECommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.CIRCLECommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.CIRCLECommand.run(msgMapTool, msg) self.step = 5 elif value == QadMsg.translate("Command_SSGET", "WObjects") or value == "WObjects" or \ value == QadMsg.translate("Command_SSGET", "CObjects") or value == "CObjects": # "FOggetti" = Seleziona oggetti che si trovano completamente all'interno di oggetti da selezionare # "IOggetti" = Seleziona oggetti che intersecano o si trovano all'interno di oggetti da selezionare self.SSGetClass = QadSSGetClass(self.plugIn) self.SSGetClass.run(msgMapTool, msg) self.step = 6 elif value == QadMsg.translate("Command_SSGET", "WBuffer") or value == "WBuffer" or \ value == QadMsg.translate("Command_SSGET", "CBuffer") or value == "CBuffer": # ho dovuto spostare questo import perché qad_mbuffer_cmd fa l'import di qad_ssget_cmd from qad_mbuffer_cmd import QadMBUFFERCommandClass # "FBuffer" = Seleziona oggetti che si trovano completamente all'interno di buffer intorno ad oggetti da selezionare # "IBuffer" = Seleziona oggetti che intersecano o si trovano all'interno di buffer intorno ad oggetti da selezionare self.MBUFFERCommand = QadMBUFFERCommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un cerchio # che non verrà salvata su un layer self.MBUFFERCommand.virtualCmd = True if value == QadMsg.translate("Command_SSGET", "WBuffer") or value == "WBuffer": self.MBUFFERCommand.setRubberBandColor(None, getColorForWindowSelectionArea()) else: self.MBUFFERCommand.setRubberBandColor(None, getColorForCrossingSelectionArea()) self.MBUFFERCommand.run(msgMapTool, msg) self.step = 8 elif value == QadMsg.translate("Command_SSGET", "Add") or value == "Add": # Passa al metodo Aggiungi: gli oggetti selezionati possono essere aggiunti al gruppo di selezione self.AddOnSelection = True self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Remove") or value == "Remove": # Passa al metodo Rimuovi: gli oggetti possono essere rimossi dal gruppo di selezione self.AddOnSelection = False self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Previous") or value == "Previous": # Seleziona il gruppo di selezione più recente if self.plugIn.lastEntitySet is None: self.showMsgOnAddRemove(0) else: entitySet = QadEntitySet() entitySet.set(self.plugIn.lastEntitySet) # controllo sul layer if self.onlyEditableLayers == True: entitySet.removeNotEditable() # controllo sul tipo if self.checkPointLayer == False: entitySet.removeGeomType(QGis.Point) if self.checkLineLayer == False: entitySet.removeGeomType(QGis.Line) if self.checkPolygonLayer == False: entitySet.removeGeomType(QGis.Polygon) # controllo sulle quotature if self.checkDimLayers == False: QadDimStyles.removeAllDimLayersFromEntitySet(entitySet) entitySet.removeNotExisting() self.elaborateSelSet(entitySet, False) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Undo") or value == "Undo": # Annulla la selezione dell'oggetto aggiunto più recentemente al gruppo di selezione. # Inverto il tipo di selezione prevAddOnSelection = self.AddOnSelection self.AddOnSelection = not self.AddOnSelection self.elaborateSelSet(self.lastEntitySet, False) # Ripristino il tipo di selezione self.AddOnSelection = prevAddOnSelection if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "AUto") or value == "AUto": # Passa alla selezione automatica: vengono selezionati gli oggetti sui quali si posiziona il puntatore. # Facendo clic su un'area vuota all'interno o all'esterno di un oggetto, # si crea il primo angolo di un rettangolo di selezione, come per il metodo Riquadro self.SingleSelection = False self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "SIngle") or value == "SIngle": # Passa al metodo Singolo: viene selezionato il primo oggetto o gruppo di oggetti indicato, # senza che vengano richieste altre selezioni. self.SingleSelection = True if self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine self.WaitForFirstPoint() elif value == QadMsg.translate("Command_SSGET", "Help") or value == "Help": self.help = True self.WaitForFirstPoint() elif type(value) == QgsPoint: # se é stato inserito il punto iniziale del rettangolo self.currSelectionMode = QadMsg.translate("Command_SSGET", "Box") self.points.append(value) self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITYSET_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) self.getPointMapTool().setStartPoint(value) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) self.step = 3 else: # se é stata selezionata un'entità self.elaborateEntity(value, shiftKey) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL PRIMO PUNTO DEL RETTANGOLO DA OPZIONE # FINESTRA, INTERSECA, RIQUADRO (da step = 1) elif self.step == 2: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) self.WaitForFirstPoint() return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == QgsPoint: self.points.append(value) self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.ENTITYSET_SELECTION) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) # cambio il colore impostato da setDrawMode if self.currSelectionMode == QadMsg.translate("Command_SSGET", "Window") or value == "Window": self.getPointMapTool().rectangleCrossingSelectionColor = self.getPointMapTool().rectangleWindowSelectionColor elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "Crossing") or value == "Crossing": self.getPointMapTool().rectangleWindowSelectionColor = self.getPointMapTool().rectangleCrossingSelectionColor self.rectangleCrossingSelectionColor = getColorForCrossingSelectionArea() self.rectangleWindowSelectionColor = getColorForWindowSelectionArea() self.getPointMapTool().setStartPoint(value) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) self.step = 3 else: self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) self.WaitForFirstPoint() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL SECONDO PUNTO DEL RETTANGOLO (da step = 1) elif self.step == 3: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False shiftKey = self.getPointMapTool().shiftKey value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione shiftKey = False value = msg if type(value) == QgsPoint: self.getPointMapTool().clear() self.points.append(value) if self.currSelectionMode == QadMsg.translate("Command_SSGET", "Box") or \ self.currSelectionMode == "Box": if self.points[0].x() < value.x(): mode = "W" else: mode = "C" elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "Window") or \ self.currSelectionMode == "Window": mode = "W" else: # "Interseca" mode = "C" selSet = qad_utils.getSelSet(mode, self.getPointMapTool(), self.points, \ self.getLayersToCheck()) self.elaborateSelSet(selSet, shiftKey) if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() else: self.showMsg(QadMsg.translate("Command_SSGET", "Window not correct.")) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_SSGET", "Specify opposite corner: ")) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO PER MODALITA' INTERCETTA (da step = 1 o 4) elif self.step == 4: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.AddRemoveSelSetByFence(self.PLINECommand.vertices) del self.PLINECommand self.PLINECommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PER MODALITA' FCERCHIO e ICERCHIO (da step = 1 o 5) elif self.step == 5: # dopo aver atteso un punto si riavvia il comando if self.CIRCLECommand.run(msgMapTool, msg) == True: self.showMsg("\n") if (self.CIRCLECommand.centerPt is not None) and \ (self.CIRCLECommand.radius is not None): circle = QadCircle() circle.set(self.CIRCLECommand.centerPt, self.CIRCLECommand.radius) points = circle.asPolyline() if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WCircle") or \ self.currSelectionMode == "WCircle": self.AddRemoveSelSetByPolygon("WP", points) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CCircle") or \ self.currSelectionMode == "CCircle": self.AddRemoveSelSetByPolygon("CP", points) del self.CIRCLECommand self.CIRCLECommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI SELEZIONE DI OGGETTI PER MODALITA' FOGGETTI e IOGGETTI (da step = 1 o 6) elif self.step == 6: # dopo aver atteso un punto si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: self.showMsg("\n") destCRS = self.SSGetClass.getPointMapTool().canvas.mapRenderer().destinationCrs() geoms = self.SSGetClass.entitySet.getGeometryCollection(destCRS) # trasformo la geometria if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WObjects") or \ self.currSelectionMode == "WObjects": self.AddRemoveSelSetByGeometry("WO", geoms) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CObjects") or \ self.currSelectionMode == "CObjects": self.AddRemoveSelSetByGeometry("CO", geoms) del self.SSGetClass self.SSGetClass = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PER MODALITA' FPOLIGONO e IPOLIGONO (da step = 1 o 7) elif self.step == 7: # dopo aver atteso un punto si riavvia il comando if self.MPOLYGONCommand.run(msgMapTool, msg) == True: self.showMsg("\n") if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WPolygon") or \ self.currSelectionMode == "WPolygon": self.AddRemoveSelSetByPolygon("WP", self.MPOLYGONCommand.vertices) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CPolygon") or \ self.currSelectionMode == "CPolygon": self.AddRemoveSelSetByPolygon("CP", self.MPOLYGONCommand.vertices) del self.MPOLYGONCommand self.MPOLYGONCommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DI SELEZIONE DI OGGETTI PER MODALITA' FBUFFER e IBUFFER (da step = 1 o 8) elif self.step == 8: # dopo aver atteso un punto si riavvia il comando if self.MBUFFERCommand.run(msgMapTool, msg) == True: self.showMsg("\n") bufferGeoms = [] for layerEntitySet in self.MBUFFERCommand.entitySet.layerEntitySetList: geoms = layerEntitySet.getGeometryCollection() width = qad_utils.distMapToLayerCoordinates(self.MBUFFERCommand.width, \ self.MBUFFERCommand.getPointMapTool().canvas,\ layerEntitySet.layer) for geom in geoms: bufferGeoms.append(geom.buffer(width, self.MBUFFERCommand.segments)) if self.currSelectionMode == QadMsg.translate("Command_SSGET", "WBuffer") or \ self.currSelectionMode == "WBuffer": self.AddRemoveSelSetByGeometry("WO", bufferGeoms) elif self.currSelectionMode == QadMsg.translate("Command_SSGET", "CBuffer") or \ self.currSelectionMode == "CBuffer": self.AddRemoveSelSetByGeometry("CO", bufferGeoms) del self.MBUFFERCommand self.MBUFFERCommand = None if self.SingleSelection == True and self.entitySet.count() > 0: self.plugIn.setLastEntitySet(self.entitySet) return True # fine if self.exitAfterSelection == True: return True # fine self.WaitForFirstPoint() return False
class QadMAPMPEDITCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadMAPMPEDITCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "MAPMPEDIT") def getEnglishName(self): return "MAPMPEDIT" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runMAPMPEDITCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/mapmpedit.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_MAPMPEDIT", "Modifies existing polygon.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.poligonEntity = QadEntity() self.SSGetClass = QadSSGetClass(plugIn) self.SSGetClass.onlyEditableLayers = False self.SSGetClass.checkDimLayers = False # scarto le quote self.entSelClass = None self.currSubGeom = None self.currAtSubGeom = None self.nOperationsToUndo = 0 def __del__(self): QadCommandClass.__del__(self) del self.SSGetClass self.poligonEntity.deselectOnLayer() def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 1 or self.step == 4: # quando si é in fase di selezione entità return self.entSelClass.getPointMapTool(drawMode) elif self.step == 3 or self.step == 5 or \ self.step == 6 or self.step == 7 or self.step == 8: # quando si é in fase di selezione gruppo entità return self.SSGetClass.getPointMapTool() else: return QadCommandClass.getPointMapTool(self, drawMode) def getCurrentContextualMenu(self): if self.step == 1 or self.step == 4: # quando si é in fase di selezione entità return self.entSelClass.getCurrentContextualMenu() elif self.step == 3 or self.step == 5 or \ self.step == 6 or self.step == 7 or self.step == 8: # quando si é in fase di selezione gruppo entità return self.SSGetClass.getCurrentContextualMenu() else: return self.contextualMenu def reinitSSGetClass(self): checkPointLayer = self.SSGetClass.checkPointLayer del self.SSGetClass self.SSGetClass = QadSSGetClass(self.plugIn) self.SSGetClass.onlyEditableLayers = False self.SSGetClass.checkDimLayers = False # scarto le quote self.SSGetClass.checkPointLayer = checkPointLayer #============================================================================ # setCurrentSubGeom #============================================================================ def setCurrentSubGeom(self, entSelClass): """ Setta la sottogeometria corrente """ self.currSubGeom = None self.currAtSubGeom = None # verifico che sia stata selezionata un'entità if entSelClass.entity.isInitialized() == False: self.showMsg(QadMsg.translate("QAD", "No geometries in this position.")) return False # verifico che sia stata selezionata attraverso un punto # (per capire quale sottogeometria è stata selezionata) if entSelClass.point is None: return False # verifico che sia stato selezionato lo stesso polygono che è da modificare if self.poligonEntity != entSelClass.entity: self.showMsg(QadMsg.translate("Command_MAPMPEDIT", "The boundary doesn't belong to the selected polygon.")) return False # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy geom = self.layerToMapCoordinates(entSelClass.entity.layer, entSelClass.entity.getGeometry()) # ritorna una tupla (<The squared cartesian distance>, # <minDistPoint> # <afterVertex> # <leftOf>) dummy = qad_utils.closestSegmentWithContext(entSelClass.point, geom) if dummy[2] is None: return False # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based) self.currSubGeom, self.currAtSubGeom = qad_utils.getSubGeomAtVertex(geom, dummy[2]) if self.currSubGeom is None or self.currAtSubGeom is None: self.currSubGeom = None self.currAtSubGeom = None return False return True #============================================================================ # addEntitySetToPolygon #============================================================================ def addEntitySetToPolygon(self, entitySet, removeOriginals = False): """ Aggiunge il set di entità al poligono da modificare """ geom = self.poligonEntity.getGeometry() layerList = [] layerList.append(self.poligonEntity.layer) for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer if layer.geometryType() != QGis.Polygon and layer.geometryType() != QGis.Line: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals: layerList.append(layer) coordTransform = QgsCoordinateTransform(layer.crs(), self.poligonEntity.layer.crs()) for featureId in layerEntitySet.featureIds: # se la feature è quella di polygonEntity è errore if layer.id() == self.poligonEntity.layerId() and featureId == self.poligonEntity.featureId: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) # se il poligono è contenuto nella geometria da aggiungere if geomToAdd.contains(geom): # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geom) # deve essere un poligono senza ring if len(simplifiedGeoms) != 1 or simplifiedGeoms[0].wkbType() != QGis.WKBLineString: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False points = simplifiedGeoms[0].asPolyline() # vettore di punti # aggiungo un'isola if geomToAdd.addRing(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False del geom geom = QgsGeometry.fromPolygon(geomToAdd.asPolygon()) else: # se il poligono non è contenuto nella geometria da aggiungere # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geomToAdd) for simplifiedGeom in simplifiedGeoms: points = simplifiedGeom.asPolyline() # vettore di punti # se la geometria da aggiungere è contenuta nel poligono if geom.contains(QgsGeometry.fromPolyline(points)): # aggiungo un'isola if geom.addRing(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False else: # aggiungo una parte if geom.addPart(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) layerList = entitySet.getLayerList() layerList.append(self.poligonEntity.layer) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if removeOriginals: for layerEntitySet in entitySet.layerEntitySetList: if qad_layer.deleteFeaturesToLayer(self.plugIn, layerEntitySet.layer, layerEntitySet.featureIds, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # delCurrentSubGeomToPolygon #============================================================================ def delCurrentSubGeomToPolygon(self): """ Cancella la sotto-geometria corrente dal poligono da modificare """ geom = self.poligonEntity.getGeometry() # la posizione é espressa con una lista (<index ogg. princ> [<index ogg. sec.>]) part = self.currAtSubGeom[0] if len(self.currAtSubGeom) == 2: ring = self.currAtSubGeom[1] if geom.deleteRing(ring + 1, part) == False: # cancello una isola (Ring 0 is outer ring and can't be deleted) self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False else: if geom.deletePart(part) == False: # cancello una parte self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", self.poligonEntity.layer) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 #============================================================================ # unionIntersSubtractEntitySetToPolygon #============================================================================ def unionIntersSubtractEntitySetToPolygon(self, entitySet, opType, removeOriginals = False): """ Unisce o interseca i poligoni di entitySet al poligono corrente """ geom = self.poligonEntity.getGeometry() layerList = [] layerList.append(self.poligonEntity.layer) geomList = [] geomList.append(geom) for layerEntitySet in entitySet.layerEntitySetList: del geomList[:] layer = layerEntitySet.layer coordTransform = QgsCoordinateTransform(layer.crs(), self.poligonEntity.layer.crs()) if layer.geometryType() == QGis.Polygon: for featureId in layerEntitySet.featureIds: # se la feature è quella di polygonEntity è errore if layer.id() == self.poligonEntity.layerId() and featureId == self.poligonEntity.featureId: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) if opType == QadMAPMPEDITCommandOpTypeEnum.UNION: geom = geom.combine(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.INTERSECTION: geom = geom.intersection(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE: geom = geom.difference(geomToAdd) if geom is None: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals and layer.id() != self.poligonEntity.layerId(): layerList.append(layer) elif layer.geometryType() == QGis.Line: for featureId in layerEntitySet.featureIds: f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geomToAdd) for simplifiedGeom in simplifiedGeoms: if simplifiedGeom.wkbType() != QGis.WKBLineString: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False points = simplifiedGeom.asPolyline() # vettore di punti if len(points) < 4 or points[0] != points[-1]: # polilinea chiusa con almeno 4 punti (primo e ultimo uguali) self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False geomToAdd = QgsGeometry.fromPolygon([points]) if opType == QadMAPMPEDITCommandOpTypeEnum.UNION: geom = geom.combine(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.INTERSECTION: geom = geom.intersection(geomToAdd) elif opType == QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE: geom = geom.difference(geomToAdd) if geom is None or geom.type() != QGis.Polygon: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals: layerList.append(layer) else: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if removeOriginals: for layerEntitySet in entitySet.layerEntitySetList: if qad_layer.deleteFeaturesToLayer(self.plugIn, layerEntitySet.layer, layerEntitySet.featureIds, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # convexHullEntitySetToPolygon #============================================================================ def convexHullEntitySetToPolygon(self, entitySet, removeOriginals = False): """ modifica il poligono corrente in modo che includa tutti i punti delle geometrie di entitySet """ layerList = [] layerList.append(self.poligonEntity.layer) pointsForConvexHull = [] for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer coordTransform = QgsCoordinateTransform(layer.crs(), self.poligonEntity.layer.crs()) for featureId in layerEntitySet.featureIds: f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer del poligono da modificare geom = f.geometry() geom.transform(coordTransform) # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geom) for simplifiedGeom in simplifiedGeoms: if simplifiedGeom.wkbType() == QGis.WKBLineString: pointsForConvexHull.extend(simplifiedGeom.asPolyline()) else: pointsForConvexHull.append(simplifiedGeom.asPoint()) if removeOriginals and layer.id() != self.poligonEntity.layerId(): layerList.append(layer) geom = QgsGeometry.fromMultiPoint(pointsForConvexHull) geom = geom.convexHull() if geom is None: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.poligonEntity.getFeature() f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if removeOriginals: for layerEntitySet in entitySet.layerEntitySetList: if qad_layer.deleteFeaturesToLayer(self.plugIn, layerEntitySet.layer, layerEntitySet.featureIds, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # dividePolygon #============================================================================ def splitPolygon(self, splitLine, createNewEntities): """ divide il poligono corrente usando una polilinea con i vertci in <plineVertices> in modo da generare o meno nuove entità """ layerList = [] layerList.append(self.poligonEntity.layer) splitLineTransformed = self.mapToLayerCoordinates(self.poligonEntity.layer, splitLine) f = self.poligonEntity.getFeature() geom = f.geometry() result, newGeoms, topologyTestPts = geom.splitGeometry(splitLineTransformed, False) if result <> 0 or len(newGeoms) == 0: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False newfeatures =[] if createNewEntities: for newGeom in newGeoms: newfeature = QgsFeature(f) newfeature.setGeometry(newGeom) newfeatures.append(newfeature) else: for newGeom in newGeoms: # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(newGeom) for simplifiedGeom in simplifiedGeoms: points = simplifiedGeom.asPolyline() # vettore di punti res = geom.addPart(points) f.setGeometry(geom) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.poligonEntity.layer, f, False, False) == False: self.plugIn.destroyEditCommand() return False if len(newfeatures) > 0: # plugIn, layer, features, coordTransform, refresh, check_validity if qad_layer.addFeaturesToLayer(self.plugIn, self.poligonEntity.layer, newfeatures, None, False, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand() self.nOperationsToUndo = self.nOperationsToUndo + 1 return True #============================================================================ # waitForEntsel #============================================================================ def waitForEntsel(self, msgMapTool, msg): if self.entSelClass is not None: del self.entSelClass self.step = 1 self.entSelClass = QadEntSelClass(self.plugIn) self.entSelClass.msg = QadMsg.translate("Command_MAPMPEDIT", "Select polygon: ") # scarto la selezione di punti e polilinee self.entSelClass.checkPointLayer = False self.entSelClass.checkLineLayer = False self.entSelClass.checkPolygonLayer = True self.entSelClass.checkDimLayers = False self.entSelClass.onlyEditableLayers = True self.entSelClass.run(msgMapTool, msg) #============================================================================ # WaitForMainMenu #============================================================================ def WaitForMainMenu(self): self.poligonEntity.selectOnLayer(False) keyWords = QadMsg.translate("Command_MAPMPEDIT", "Add") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Delete") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Union") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Substract") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "Intersect") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "split Objects") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "split Parts") + "/" + \ QadMsg.translate("Command_MAPMPEDIT", "iNclude objs") englishKeyWords = "Add" + "/" + "Delete" + "/" + "Union" + "/" + "Substract" + "/" + "Intersect" "/" + \ "split Objects" + "/" + "split Parts" + "/" + "iNclude objs" if self.nOperationsToUndo > 0: # se c'è qualcosa che si può annullare keyWords = keyWords + "/" + QadMsg.translate("Command_MAPMPEDIT", "Undo") englishKeyWords = englishKeyWords + "/" + "Undo" keyWords = keyWords + "/" + QadMsg.translate("Command_MAPMPEDIT", "eXit") englishKeyWords = englishKeyWords + "/" + "eXit" default = QadMsg.translate("Command_MAPMPEDIT", "eXit") prompt = QadMsg.translate("Command_MAPMPEDIT", "Enter an option [{0}] <{1}>: ").format(keyWords, default) self.step = 2 self.getPointMapTool().setSelectionMode(QadGetPointSelectionModeEnum.NONE) self.getPointMapTool().setDrawMode(QadGetPointDrawModeEnum.NONE) keyWords += "_" + englishKeyWords # si appresta ad attendere enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) return False #============================================================================ # waitForBoundary #============================================================================ def waitForBoundary(self, msgMapTool, msg): if self.entSelClass is not None: del self.entSelClass self.entSelClass = QadEntSelClass(self.plugIn) self.entSelClass.msg = QadMsg.translate("Command_MAPMPEDIT", "Select boundary: ") # scarto la selezione di punti e polilinee self.entSelClass.checkPointLayer = False self.entSelClass.checkLineLayer = False self.entSelClass.checkPolygonLayer = True self.entSelClass.checkDimLayers = False self.entSelClass.onlyEditableLayers = True self.entSelClass.run(msgMapTool, msg) def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando if self.step == 0: self.waitForEntsel(msgMapTool, msg) # seleziona il poligono da modificare return False # continua #========================================================================= # RISPOSTA ALLA SELEZIONE POLIGONO DA MODIFICARE elif self.step == 1: if self.entSelClass.run(msgMapTool, msg) == True: if self.entSelClass.entity.isInitialized(): self.poligonEntity.set(self.entSelClass.entity.layer, self.entSelClass.entity.featureId) layer = self.entSelClass.entity.layer self.poligonEntity.deselectOnLayer() self.WaitForMainMenu() else: if self.entSelClass.canceledByUsr == True: # fine comando return True self.showMsg(QadMsg.translate("QAD", "No geometries in this position.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL MENU PRINCIPALE elif self.step == 2: # dopo aver atteso una opzione si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False self.WaitForMainMenu() return False else: # l'opzione arriva come parametro della funzione value = msg self.poligonEntity.deselectOnLayer() if value == QadMsg.translate("Command_MAPMPEDIT", "Add") or value == "Add": self.SSGetClass.checkPointLayer = False # scarto i punto self.SSGetClass.run(msgMapTool, msg) self.step = 3 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Delete") or value == "Delete": self.waitForBoundary(msgMapTool, msg) self.step = 4 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Union") or value == "Union": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 5 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Substract") or value == "Substract": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 6 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Intersect") or value == "Intersect": self.SSGetClass.checkPointLayer = False # scarto i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 7 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "split Objects") or value == "split Objects": # Disegna una polilinea di divisione del poligono self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 9 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "split Parts") or value == "split Parts": # Disegna una polilinea di divisione del poligono self.PLINECommand = QadPLINECommandClass(self.plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.run(msgMapTool, msg) self.step = 10 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "iNclude objs") or value == "iNclude objs": self.SSGetClass.checkPointLayer = True # includo i layer puntuali self.SSGetClass.run(msgMapTool, msg) self.step = 8 return False elif value == QadMsg.translate("Command_MAPMPEDIT", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif value == QadMsg.translate("Command_MAPMPEDIT", "eXit") or value == "eXit": return True # fine comando else: return True # fine comando self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI ADD (da step = 2) elif self.step == 3: if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.addEntitySetToPolygon(self.SSGetClass.entitySet) self.reinitSSGetClass() self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI DELETE (da step = 2) elif self.step == 4: if self.entSelClass.run(msgMapTool, msg) == True: if self.setCurrentSubGeom(self.entSelClass) == True: self.delCurrentSubGeomToPolygon() self.WaitForMainMenu() return False else: if self.entSelClass.canceledByUsr == True: # fine selezione entità self.WaitForMainMenu() else: self.waitForBoundary(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI UNION (da step = 2) elif self.step == 5: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.UNION) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI SUBTRACT (da step = 2) elif self.step == 6: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.DIFFERENCE) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI INTERSECT (da step = 2) elif self.step == 7: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.unionIntersSubtractEntitySetToPolygon(self.SSGetClass.entitySet, QadMAPMPEDITCommandOpTypeEnum.INTERSECTION) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' DI INCLUDE OBJS (da step = 2) elif self.step == 8: # dopo aver atteso una entità si riavvia il comando if self.SSGetClass.run(msgMapTool, msg) == True: if self.SSGetClass.entitySet.count() > 0: self.convexHullEntitySetToPolygon(self.SSGetClass.entitySet) self.reinitSSGetClass() self.WaitForMainMenu() return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LINEA DI DIVISIONE (da step = 2) elif self.step == 9: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.splitPolygon(self.PLINECommand.vertices, True) del self.PLINECommand self.PLINECommand = None self.WaitForMainMenu() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LINEA DI DIVISIONE (da step = 2) elif self.step == 10: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: self.showMsg("\n") self.splitPolygon(self.PLINECommand.vertices, False) del self.PLINECommand self.PLINECommand = None self.WaitForMainMenu() return False
def __init__(self, plugIn): self.plugIn = plugIn self.__cmdObjs = [] # lista interna degli oggetti comandi self.__cmdObjs.append(QadIDCommandClass(self.plugIn)) # ID self.__cmdObjs.append(QadSETVARCommandClass(self.plugIn)) # SETVAR self.__cmdObjs.append(QadPLINECommandClass(self.plugIn)) # PLINE self.__cmdObjs.append(QadSETCURRLAYERBYGRAPHCommandClass( self.plugIn)) # SETCURRLAYERBYGRAPH self.__cmdObjs.append( QadSETCURRUPDATEABLELAYERBYGRAPHCommandClass( self.plugIn)) # SETCURRUPDATEABLELAYERBYGRAPH self.__cmdObjs.append(QadARCCommandClass(self.plugIn)) # ARC self.__cmdObjs.append(QadCIRCLECommandClass(self.plugIn)) # CIRCLE self.__cmdObjs.append(QadDSETTINGSCommandClass( self.plugIn)) # DSETTINGS self.__cmdObjs.append(QadLINECommandClass(self.plugIn)) # LINE self.__cmdObjs.append(QadERASECommandClass(self.plugIn)) # ERASE self.__cmdObjs.append(QadMPOLYGONCommandClass(self.plugIn)) # MPOLYGON self.__cmdObjs.append(QadMBUFFERCommandClass(self.plugIn)) # MBUFFER self.__cmdObjs.append(QadROTATECommandClass(self.plugIn)) # ROTATE self.__cmdObjs.append(QadMOVECommandClass(self.plugIn)) # MOVE self.__cmdObjs.append(QadSCALECommandClass(self.plugIn)) # SCALE self.__cmdObjs.append(QadCOPYCommandClass(self.plugIn)) # COPY self.__cmdObjs.append(QadOFFSETCommandClass(self.plugIn)) # OFFSET self.__cmdObjs.append(QadEXTENDCommandClass(self.plugIn)) # EXTEND self.__cmdObjs.append(QadTRIMCommandClass(self.plugIn)) # TRIM self.__cmdObjs.append(QadRECTANGLECommandClass( self.plugIn)) # RECTANGLE self.__cmdObjs.append(QadMIRRORCommandClass(self.plugIn)) # MIRROR self.__cmdObjs.append(QadUNDOCommandClass(self.plugIn)) # UNDO self.__cmdObjs.append(QadREDOCommandClass(self.plugIn)) # REDO self.__cmdObjs.append(QadINSERTCommandClass(self.plugIn)) # INSERT self.__cmdObjs.append(QadTEXTCommandClass(self.plugIn)) # TEXT self.__cmdObjs.append(QadSTRETCHCommandClass(self.plugIn)) # STRETCH self.__cmdObjs.append(QadBREAKCommandClass(self.plugIn)) # BREAK self.__cmdObjs.append(QadPEDITCommandClass(self.plugIn)) # PEDIT self.__cmdObjs.append(QadFILLETCommandClass(self.plugIn)) # FILLET self.__cmdObjs.append(QadPOLYGONCommandClass(self.plugIn)) # POLYGON self.__cmdObjs.append(QadDIMLINEARCommandClass( self.plugIn)) # DIMLINEAR self.__cmdObjs.append(QadDIMALIGNEDCommandClass( self.plugIn)) # DIMALIGNED self.__cmdObjs.append(QadDIMARCCommandClass(self.plugIn)) # DIMALIGNED self.__cmdObjs.append(QadDIMSTYLECommandClass(self.plugIn)) # DIMSTYLE self.__cmdObjs.append(QadHELPCommandClass(self.plugIn)) # HELP self.__cmdObjs.append(QadLENGTHENCommandClass(self.plugIn)) # LENGTHEN self.__cmdObjs.append(QadOPTIONSCommandClass(self.plugIn)) # OPTIONS self.__cmdObjs.append(QadMAPMPEDITCommandClass( self.plugIn)) # MAPMEDIT self.__cmdObjs.append(QadJOINCommandClass(self.plugIn)) # JOIN self.__cmdObjs.append(QadDISJOINCommandClass(self.plugIn)) # DISJOIN self.__cmdObjs.append(QadARRAYCommandClass(self.plugIn)) # ARRAY self.__cmdObjs.append(QadARRAYRECTCommandClass( self.plugIn)) # ARRAYRECT self.__cmdObjs.append(QadARRAYPATHCommandClass( self.plugIn)) # ARRAYPATH self.__cmdObjs.append(QadARRAYPOLARCommandClass( self.plugIn)) # ARRAYPOLAR self.__cmdObjs.append(QadDIVIDECommandClass(self.plugIn)) # DIVIDE self.__cmdObjs.append(QadMEASURECommandClass(self.plugIn)) # MEASURE self.actualCommand = None # Comando in corso di esecuzione # scarto gli alias che hanno lo stesso nome dei comandi exceptionList = [] for cmdObj in self.__cmdObjs: exceptionList.append(cmdObj.getName()) exceptionList.append("_" + cmdObj.getEnglishName()) # carico alias dei comandi self.commandAliases = QadCommandAliasesClass() self.commandAliases.load("", exceptionList) self.usedCmdNames = QadUsedCmdNamesClass()
class QadMPOLYGONCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadMPOLYGONCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "MPOLYGON") def getEnglishName(self): return "MPOLYGON" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runMPOLYGONCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/mpolygon.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate( "Command_MPOLYGON", "Draws a polygon by many methods.\nA Polygon is a closed sequence of straight line segments,\narcs or a combination of two." ) def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.vertices = [] # se questo flag = True il comando serve all'interno di un altro comando per disegnare un poligono # che non verrà salvato su un layer self.virtualCmd = False self.rubberBandBorderColor = None self.rubberBandFillColor = None self.PLINECommand = None def __del__(self): QadCommandClass.__del__(self) if self.PLINECommand is not None: del self.PLINECommand def getPointMapTool(self, drawMode=QadGetPointDrawModeEnum.NONE): if self.PLINECommand is not None: return self.PLINECommand.getPointMapTool(drawMode) else: return QadCommandClass.getPointMapTool(self, drawMode) def getCurrentContextualMenu(self): if self.PLINECommand is not None: return self.PLINECommand.getCurrentContextualMenu() else: return self.contextualMenu def setRubberBandColor(self, rubberBandBorderColor, rubberBandFillColor): self.rubberBandBorderColor = rubberBandBorderColor self.rubberBandFillColor = rubberBandFillColor if self.PLINECommand is not None: self.PLINECommand.setRubberBandColor(rubberBandBorderColor, rubberBandFillColor) def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" )) return True # fine comando if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer currLayer, errMsg = qad_layer.getCurrLayerEditable( self.plugIn.canvas, QGis.Polygon) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO PER SELEZIONE OGGETTI if self.step == 0: self.PLINECommand = QadPLINECommandClass(self.plugIn, True) self.PLINECommand.setRubberBandColor(self.rubberBandBorderColor, self.rubberBandFillColor) # se questo flag = True il comando serve all'interno di un altro comando per disegnare una linea # che non verrà salvata su un layer self.PLINECommand.virtualCmd = True self.PLINECommand.asToolForMPolygon = True # per rubberband tipo poligono self.PLINECommand.run(msgMapTool, msg) self.step = 1 return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO (da step = 0 o 1) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if self.PLINECommand.run(msgMapTool, msg) == True: verticesLen = len(self.PLINECommand.vertices) if verticesLen >= 3: self.vertices = self.PLINECommand.vertices[:] # copio la lista firstVertex = self.vertices[0] # se l'ultimo vertice non é uguale al primo if self.vertices[verticesLen - 1] != firstVertex: # aggiungo un vertice con le stesse coordinate del primo self.vertices.append(firstVertex) if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer if qad_layer.addPolygonToLayer(self.plugIn, currLayer, self.vertices) == False: self.showMsg( QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.vertices[:] # svuoto la lista else: self.showMsg( QadMsg.translate("Command_MPOLYGON", "\nPolygon not valid.\n")) del self.PLINECommand self.PLINECommand = None return True # fine return False