Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
   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)
Exemplo n.º 3
0
   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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
   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
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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()
Exemplo n.º 11
0
   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()
Exemplo n.º 12
0
   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
Exemplo n.º 13
0
   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()
Exemplo n.º 14
0
   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
Exemplo n.º 15
0
   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
Exemplo n.º 16
0
    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()