def fromGeom(self, geom, atLeastNSegment=None): """ setta la lista degli archi e degli estremi leggendo una geometria ritorna il numero di archi trovati """ if atLeastNSegment is None: _atLeastNSegment = QadVariables.get(QadMsg.translate("Environment variables", "ARCMINSEGMENTQTY"), 12) else: _atLeastNSegment = atLeastNSegment self.clear() arc = QadArc() incremental = 0 # riduco in polilinee geoms = qad_utils.asPointOrPolyline(geom) for g in geoms: points = g.asPolyline() # vettore di punti startVertex = 0 startEndVertices = arc.fromPolyline(points, startVertex, _atLeastNSegment) while startEndVertices is not None: _arc = QadArc(arc) # ne faccio una copia self.arcList.append(_arc) self.startEndVerticesList.append([startEndVertices[0] + incremental, startEndVertices[1] + incremental]) startVertex = startEndVertices[1] # l'ultimo punto dell'arco startEndVertices = arc.fromPolyline(points, startVertex, _atLeastNSegment) incremental = len(points) - 1 return len(self.arcList)
def fromGeom(self, geom, atLeastNSegment = None): """ setta la lista degli archi e degli estremi leggendo una geometria ritorna il numero di archi trovati """ if atLeastNSegment is None: _atLeastNSegment = QadVariables.get(QadMsg.translate("Environment variables", "ARCMINSEGMENTQTY"), 12) else: _atLeastNSegment = atLeastNSegment self.clear() arc = QadArc() incremental = 0 # riduco in polilinee geoms = qad_utils.asPointOrPolyline(geom) for g in geoms: points = g.asPolyline() # vettore di punti startVertex = 0 startEndVertices = arc.fromPolyline(points, startVertex, _atLeastNSegment) while startEndVertices is not None: _arc = QadArc(arc) # ne faccio una copia self.arcList.append(_arc) self.startEndVerticesList.append([startEndVertices[0] + incremental, startEndVertices[1] + incremental]) startVertex = startEndVertices[1] # l'ultimo punto dell'arco startEndVertices = arc.fromPolyline(points, startVertex, _atLeastNSegment) incremental = len(points) - 1 return len(self.arcList)
def addEntitySetToPolyline(self, entitySet, removeOriginals = True): """ Aggiunge il set di entità alla polilinea da modificare """ geom = self.entity.getGeometry() layerList = [] layerList.append(self.entity.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.entity.layer.crs()) for featureId in layerEntitySet.featureIds: # se la feature è quella di entity è errore if layer.id() == self.entity.layerId() and featureId == self.entity.featureId: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer dell'entità da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) # Riduco la geometria in point o polyline simplifiedGeoms = qad_utils.asPointOrPolyline(geomToAdd) for simplifiedGeom in simplifiedGeoms: points = simplifiedGeom.asPolyline() # vettore di punti # aggiungo una parte if geom.addPart(points) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.entity.getFeature() f.setGeometry(geom) layerList = entitySet.getLayerList() layerList.append(self.entity.layer) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.entity.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() return True
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
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
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
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
def addEntitySetToPolygon(self, entitySet, removeOriginals=True): """ Aggiunge il set di entità al poligono da modificare """ geom = self.entity.getGeometry() layerList = [] layerList.append(self.entity.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.entity.layer.crs()) for featureId in layerEntitySet.featureIds: # se la feature è quella di entity è errore if layer.id() == self.entity.layerId( ) and featureId == self.entity.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.entity.getFeature() f.setGeometry(geom) layerList = entitySet.getLayerList() layerList.append(self.entity.layer) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.entity.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() return True
def addEntitySetToPoint(self, entitySet, removeOriginals=True): """ Aggiunge il set di entità al punto da modificare """ geom = self.entity.getGeometry() layerList = [] layerList.append(self.entity.layer) for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer if layer.geometryType() != QGis.Point: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False if removeOriginals: layerList.append(layer) coordTransform = QgsCoordinateTransform(layer.crs(), self.entity.layer.crs()) for featureId in layerEntitySet.featureIds: # se la feature è quella di entity è errore if layer.id() == self.entity.layerId( ) and featureId == self.entity.featureId: self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = layerEntitySet.getFeature(featureId) # trasformo la geometria nel crs del layer dell'entità da modificare geomToAdd = f.geometry() geomToAdd.transform(coordTransform) simplifiedGeoms = qad_utils.asPointOrPolyline(geomToAdd) for simplifiedGeom in simplifiedGeoms: point = simplifiedGeom.asPoint() # aggiungo una parte if geom.addPart([point]) != 0: # 0 in case of success self.showMsg(QadMsg.translate("QAD", "Invalid object.")) return False f = self.entity.getFeature() f.setGeometry(geom) layerList = entitySet.getLayerList() layerList.append(self.entity.layer) self.plugIn.beginEditCommand("Feature edited", layerList) # plugIn, layer, feature, refresh, check_validity if qad_layer.updateFeatureToLayer(self.plugIn, self.entity.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() return True
def AddGeoms(self, currLayer): bufferGeoms = [] tolerance = QadVariables.get( QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) for layerEntitySet in self.entitySet.layerEntitySetList: layer = layerEntitySet.layer geoms = layerEntitySet.getGeometryCollection() for geom in geoms: # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy newGeom = self.layerToMapCoordinates(layer, geom) g = qad_utils.ApproxCurvesOnGeom(newGeom.buffer(self.width, self.segments), \ self.segments, self.segments, \ tolerance) # trasformo la geometria nel crs del layer bufferGeoms.append(self.mapToLayerCoordinates(layer, g)) self.plugIn.beginEditCommand("Feature buffered", currLayer) # filtro le features per tipo pointGeoms, lineGeoms, polygonGeoms = qad_utils.filterGeomsByType(bufferGeoms, \ currLayer.geometryType()) # aggiungo le geometrie del tipo corretto if currLayer.geometryType() == QGis.Line: polygonToLines = [] # Riduco le geometrie in linee for g in polygonGeoms: lines = qad_utils.asPointOrPolyline(g) for l in lines: if l.type() == QGis.Line: polygonToLines.append(l) # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, polygonToLines, None, False, False) == False: self.plugIn.destroyEditCommand() return del polygonGeoms[:] # svuoto la lista # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, bufferGeoms, None, False, False) == False: self.plugIn.destroyEditCommand() return if pointGeoms is not None and len(pointGeoms) > 0: PointTempLayer = qad_layer.createQADTempLayer( self.plugIn, QGis.Point) self.plugIn.addLayerToLastEditCommand("Feature buffered", PointTempLayer) if lineGeoms is not None and len(lineGeoms) > 0: LineTempLayer = qad_layer.createQADTempLayer( self.plugIn, QGis.Line) self.plugIn.addLayerToLastEditCommand("Feature buffered", LineTempLayer) if polygonGeoms is not None and len(polygonGeoms) > 0: PolygonTempLayer = qad_layer.createQADTempLayer( self.plugIn, QGis.Polygon) self.plugIn.addLayerToLastEditCommand("Feature buffered", PolygonTempLayer) # aggiungo gli scarti nei layer temporanei di QAD # trasformo la geometria in quella dei layer temporanei # plugIn, pointGeoms, lineGeoms, polygonGeoms, coord, refresh if qad_layer.addGeometriesToQADTempLayers(self.plugIn, pointGeoms, lineGeoms, polygonGeoms, \ None, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand()
def offsetGeoms(self, currLayer): featuresLayers = [] # lista di (layer, features) for f in self.featureCache: layer = f[0] feature = f[1] found = False for featuresLayer in featuresLayers: if featuresLayer[0].id() == layer.id(): found = True featuresLayer[1].append(feature) break # se non c'era ancora il layer if not found: featuresLayers.append([layer, [feature]]) layerList = [] for featuresLayer in featuresLayers: layerList.append(featuresLayer[0]) PointTempLayer = None LineTempLayer = None PolygonTempLayer = None self.plugIn.beginEditCommand("Feature offseted", layerList) for featuresLayer in featuresLayers: # filtro le features per tipo pointGeoms, lineGeoms, polygonGeoms = qad_utils.filterFeaturesByType(featuresLayer[1], \ currLayer.geometryType()) # aggiungo le features con geometria del tipo corretto if currLayer.geometryType() == QGis.Line: polygonToLines = [] # Riduco le geometrie in linee for g in polygonGeoms: lines = qad_utils.asPointOrPolyline(g) for l in lines: if l.type() == QGis.Line: polygonToLines.append(l) # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, polygonToLines, None, False, False) == False: self.plugIn.destroyEditCommand() return del polygonGeoms[:] # svuoto la lista # plugIn, layer, features, coordTransform, refresh, check_validity if qad_layer.addFeaturesToLayer(self.plugIn, currLayer, featuresLayer[1], None, False, False) == False: self.plugIn.destroyEditCommand() return if pointGeoms is not None and len(pointGeoms) > 0 and PointTempLayer is None: PointTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Point) self.plugIn.addLayerToLastEditCommand("Feature offseted", PointTempLayer) if lineGeoms is not None and len(lineGeoms) > 0 and LineTempLayer is None: LineTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Line) self.plugIn.addLayerToLastEditCommand("Feature offseted", LineTempLayer) if polygonGeoms is not None and len(polygonGeoms) > 0 and PolygonTempLayer is None: PolygonTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Polygon) self.plugIn.addLayerToLastEditCommand("Feature offseted", PolygonTempLayer) # aggiungo gli scarti nei layer temporanei di QAD # trasformo la geometria in quella dei layer temporanei # plugIn, pointGeoms, lineGeoms, polygonGeoms, coord, refresh if qad_layer.addGeometriesToQADTempLayers(self.plugIn, pointGeoms, lineGeoms, polygonGeoms, \ featuresLayer[0].crs(), False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand()
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
def AddGeoms(self, currLayer): bufferGeoms = [] tolerance = QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) for layerEntitySet in self.entitySet.layerEntitySetList: layer = layerEntitySet.layer geoms = layerEntitySet.getGeometryCollection() for geom in geoms: # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy newGeom = self.layerToMapCoordinates(layer, geom) g = qad_utils.ApproxCurvesOnGeom(newGeom.buffer(self.width, self.segments), \ self.segments, self.segments, \ tolerance) # trasformo la geometria nel crs del layer bufferGeoms.append(self.mapToLayerCoordinates(layer, g)) self.plugIn.beginEditCommand("Feature buffered", currLayer) # filtro le features per tipo pointGeoms, lineGeoms, polygonGeoms = qad_utils.filterGeomsByType(bufferGeoms, \ currLayer.geometryType()) # aggiungo le geometrie del tipo corretto if currLayer.geometryType() == QGis.Line: polygonToLines = [] # Riduco le geometrie in linee for g in polygonGeoms: lines = qad_utils.asPointOrPolyline(g) for l in lines: if l.type() == QGis.Line: polygonToLines.append(l) # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, polygonToLines, None, False, False) == False: self.plugIn.destroyEditCommand() return del polygonGeoms[:] # svuoto la lista # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, bufferGeoms, None, False, False) == False: self.plugIn.destroyEditCommand() return if pointGeoms is not None and len(pointGeoms) > 0: PointTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Point) self.plugIn.addLayerToLastEditCommand("Feature buffered", PointTempLayer) if lineGeoms is not None and len(lineGeoms) > 0: LineTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Line) self.plugIn.addLayerToLastEditCommand("Feature buffered", LineTempLayer) if polygonGeoms is not None and len(polygonGeoms) > 0: PolygonTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Polygon) self.plugIn.addLayerToLastEditCommand("Feature buffered", PolygonTempLayer) # aggiungo gli scarti nei layer temporanei di QAD # trasformo la geometria in quella dei layer temporanei # plugIn, pointGeoms, lineGeoms, polygonGeoms, coord, refresh if qad_layer.addGeometriesToQADTempLayers(self.plugIn, pointGeoms, lineGeoms, polygonGeoms, \ None, False) == False: self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand()
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
def AddGeoms(self, currLayer): bufferGeoms = [] for layerEntitySet in self.entitySet.layerEntitySetList: geoms = layerEntitySet.getGeometryCollection() width = qad_utils.distMapToLayerCoordinates( self.width, self.SSGetClass.getPointMapTool().canvas, layerEntitySet.layer ) tolerance = qad_utils.distMapToLayerCoordinates( QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")), self.SSGetClass.getPointMapTool().canvas, layerEntitySet.layer, ) if layerEntitySet.layer.crs() != currLayer.crs(): coordTransform = QgsCoordinateTransform( layerEntitySet.layer.crs(), currLayer.crs() ) # trasformo la geometria else: coordTransform = None for geom in geoms: g = qad_utils.ApproxCurvesOnGeom( geom.buffer(width, self.segments), self.segments, self.segments, tolerance ) if coordTransform is not None: g.transform(coordTransform) bufferGeoms.append(g) self.plugIn.beginEditCommand("Feature buffered", currLayer) # filtro le features per tipo pointGeoms, lineGeoms, polygonGeoms = qad_utils.filterGeomsByType(bufferGeoms, currLayer.geometryType()) # aggiungo le geometrie del tipo corretto if currLayer.geometryType() == QGis.Line: polygonToLines = [] # Riduco le geometrie in linee for g in polygonGeoms: lines = qad_utils.asPointOrPolyline(g) for l in lines: if l.type() == QGis.Line: polygonToLines.append(l) # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, polygonToLines, None, False, False) == False: self.plugIn.destroyEditCommand() return del polygonGeoms[:] # svuoto la lista # plugIn, layer, geoms, coordTransform , refresh, check_validity if qad_layer.addGeomsToLayer(self.plugIn, currLayer, bufferGeoms, None, False, False) == False: self.plugIn.destroyEditCommand() return if pointGeoms is not None and len(pointGeoms) > 0: PointTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Point) self.plugIn.addLayerToLastEditCommand("Feature buffered", PointTempLayer) if lineGeoms is not None and len(lineGeoms) > 0: LineTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Line) self.plugIn.addLayerToLastEditCommand("Feature buffered", LineTempLayer) if polygonGeoms is not None and len(polygonGeoms) > 0: PolygonTempLayer = qad_layer.createQADTempLayer(self.plugIn, QGis.Polygon) self.plugIn.addLayerToLastEditCommand("Feature buffered", PolygonTempLayer) # aggiungo gli scarti nei layer temporanei di QAD # trasformo la geometria in quella dei layer temporanei # plugIn, pointGeoms, lineGeoms, polygonGeoms, coord, refresh if ( qad_layer.addGeometriesToQADTempLayers( self.plugIn, pointGeoms, lineGeoms, polygonGeoms, currLayer.crs(), False ) == False ): self.plugIn.destroyEditCommand() return self.plugIn.endEditCommand()