Пример #1
0
   def setInfo(self, entity, point):
      # setta: self.layer, self.tmpLinearObjectList e self.move_startPt

      if self.tmpLinearObjectList is not None:
         del self.tmpLinearObjectList
         self.tmpLinearObjectList = None
      
      if entity.isInitialized() == False:
         return False
         
      self.layer = entity.layer
      transformedPt = self.canvas.mapSettings().mapToLayerCoordinates(self.layer, point)
      geom = entity.getGeometry()
                  
      # ritorna una tupla (<The squared cartesian distance>,
      #                    <minDistPoint>
      #                    <afterVertex>
      #                    <leftOf>)
      dummy = qad_utils.closestSegmentWithContext(transformedPt, geom)
      if dummy[2] is None:
         return False
      # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based)
      subGeom, atSubGeom = qad_utils.getSubGeomAtVertex(geom, dummy[2])               
      self.tmpLinearObjectList = qad_utils.QadLinearObjectList()               
      self.tmpLinearObjectList.fromPolyline(subGeom.asPolyline())
      
      if qad_utils.getDistance(self.tmpLinearObjectList.getStartPt(), transformedPt) <= \
         qad_utils.getDistance(self.tmpLinearObjectList.getEndPt(), transformedPt):
         # si allunga/accorcia dal punto iniziale                 
         self.move_startPt = True
      else:
         # si allunga dal punto finale
         self.move_startPt = False
      return True
Пример #2
0
    def canvasMoveEvent(self, event):
        QadGetPoint.canvasMoveEvent(self, event)

        self.__highlight.reset()
        tmpLinearObjectList = None

        # si richiede un nuovo vertice da inserire
        if self.mode == Qad_pedit_maptool_ModeEnum.ASK_FOR_NEW_VERTEX:
            if self.basePt is not None:
                offSetX = self.tmpPoint.x() - self.basePt.x()
                offSetY = self.tmpPoint.y() - self.basePt.y()
                newPt = QgsPoint(self.vertexPt.x() + offSetX,
                                 self.vertexPt.y() + offSetY)
            else:
                newPt = QgsPoint(self.tmpPoint)

            tmpLinearObjectList = qad_utils.QadLinearObjectList()
            tmpLinearObjectList.set(self.linearObjectList)
            if self.after:  # dopo
                if self.vertexAt == tmpLinearObjectList.qty(
                ) and tmpLinearObjectList.isClosed():
                    tmpLinearObjectList.insertPoint(0, newPt)
                else:
                    tmpLinearObjectList.insertPoint(self.vertexAt, newPt)
            else:  # prima
                if self.vertexAt == 0 and tmpLinearObjectList.isClosed():
                    tmpLinearObjectList.insertPoint(
                        tmpLinearObjectList.qty() - 1, newPt)
                else:
                    tmpLinearObjectList.insertPoint(self.vertexAt - 1, newPt)
        elif self.mode == Qad_pedit_maptool_ModeEnum.ASK_FOR_MOVE_VERTEX:
            newPt = QgsPoint(self.tmpPoint)
            tmpLinearObjectList = qad_utils.QadLinearObjectList()
            tmpLinearObjectList.set(self.linearObjectList)
            tmpLinearObjectList.movePoint(self.vertexAt, newPt)

        if tmpLinearObjectList is not None:
            pts = tmpLinearObjectList.asPolyline(self.tolerance2ApproxCurve)
            if self.layer.geometryType() == QGis.Polygon:
                geom = QgsGeometry.fromPolygon([pts])
            else:
                geom = QgsGeometry.fromPolyline(pts)

            # trasformo la geometria nel crs del layer
            self.__highlight.addGeometry(
                self.mapToLayerCoordinates(self.layer, geom), self.layer)
Пример #3
0
   def __init__(self, plugIn):
      QadCommandClass.__init__(self, plugIn)      
      self.GetDistClass = None

      self.entity1 = QadEntity()
      self.atSubGeom1 = None
      self.linearObjectList1 = qad_utils.QadLinearObjectList()
      self.partAt1 = 0
      self.pointAt1 = None
      
      self.entity2 = QadEntity()
      self.atSubGeom2 = None
      self.linearObjectList2 = qad_utils.QadLinearObjectList()
      self.partAt2 = 0
      self.pointAt2 = None

      self.filletMode = plugIn.filletMode # modalità di raccordo; 1=Taglia-estendi, 2=Non taglia-estendi
      self.radius = QadVariables.get(QadMsg.translate("Environment variables", "FILLETRAD"))
      self.multi = False
      self.nOperationsToUndo = 0
Пример #4
0
   def setSelectedEntityGripPoints(self, entitySetGripPoints):
      # lista delle entityGripPoint con dei grip point selezionati
      # setta la prima entità con un grip selezionato
      self.entity = None
      for entityGripPoints in entitySetGripPoints.entityGripPoints:
         for gripPoint in entityGripPoints.gripPoints:
            # grip point selezionato
            if gripPoint.getStatus() == qad_grip.QadGripStatusEnum.SELECTED:
               # verifico se l'entità appartiene ad uno stile di quotatura
               if entityGripPoints.entity.isDimensionComponent():
                  return False
               if entityGripPoints.entity.getEntityType() != QadEntityGeomTypeEnum.ARC and \
                  entityGripPoints.entity.getEntityType() != QadEntityGeomTypeEnum.LINESTRING:
                  return False
               
               # setta: self.entity, self.linearObjectList, self.atSubGeom e self.move_startPt
               self.entity = entityGripPoints.entity
               
               if self.linearObjectList is not None:
                  del self.linearObjectList
                  self.linearObjectList = None

               # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy
               geom = self.layerToMapCoordinates(self.entity.layer, self.entity.getGeometry())
               
               # ritorna una tupla (<The squared cartesian distance>,
               #                    <minDistPoint>
               #                    <afterVertex>
               #                    <leftOf>)
               res = False
               dummy = qad_utils.closestSegmentWithContext(gripPoint.getPoint(), geom)
               if dummy[2] is None:
                  return False
               # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based)
               subGeom, self.atSubGeom = qad_utils.getSubGeomAtVertex(geom, dummy[2])               
               self.linearObjectList = qad_utils.QadLinearObjectList()

               self.linearObjectList.fromPolyline(subGeom.asPolyline())
               
               if qad_utils.getDistance(self.linearObjectList.getStartPt(), gripPoint.getPoint()) <= \
                  qad_utils.getDistance(self.linearObjectList.getEndPt(), gripPoint.getPoint()):
                  # si allunga dal punto iniziale
                  self.move_startPt = True
               else:
                  # si allunga dal punto finale
                  self.move_startPt = False

               # imposto il map tool
               if self.getPointMapTool().setInfo(self.entity, gripPoint.getPoint()) == False:
                  return False
               
               return True
      return False
Пример #5
0
    def __init__(self, plugIn):
        QadGetPoint.__init__(self, plugIn)

        self.firstPt = None
        self.mode = None

        self.layer = None
        self.linearObjectList = qad_utils.QadLinearObjectList()
        self.linearObject = None
        self.startPt = None
        self.endPt = None
        self.tolerance2ApproxCurve = None
        self.__highlight = QadHighlight(self.canvas)
Пример #6
0
def gripStretchQgsLinearObjectList(linearObjectList, ptListToStretch, offSetX,
                                   offSetY, tolerance2ApproxCurve):
    """
   Stira i punti di grip di una linestring che sono contenuti in ptListToStretch
   linearObjectListToStretch = geometria da stirare
   ptListToStretch = lista dei punti da stirare
   offSetX = spostamento X
   offSetY = spostamento Y
   """
    linearObjectListToStretch = qad_utils.QadLinearObjectList(linearObjectList)

    atPart = 0
    while atPart < linearObjectListToStretch.qty():
        linearObject = linearObjectListToStretch.getLinearObjectAt(atPart)
        if linearObject.isSegment():
            pt = linearObject.getStartPt()
            if isPtContainedForStretch(
                    pt, ptListToStretch
            ):  # se il punto è contenuto in ptListToStretch
                # cambio punto iniziale
                pt.setX(pt.x() + offSetX)
                pt.setY(pt.y() + offSetY)
                linearObject.setStartPt(pt)

            pt = linearObject.getEndPt()
            if isPtContainedForStretch(
                    pt, ptListToStretch
            ):  # se il punto è contenuto in ptListToStretch
                # cambio punto finale
                pt.setX(pt.x() + offSetX)
                pt.setY(pt.y() + offSetY)
                linearObject.setEndPt(pt)
        else:  # se è arco
            newArc, newInverseFlag = gripStretchArc(
                linearObject.getArc(), ptListToStretch, offSetX, offSetY,
                tolerance2ApproxCurve, linearObject.isInverseArc())
            if newArc is None:
                return None
            linearObject.setArc(newArc, newInverseFlag)

        atPart = atPart + 1

    pt = linearObjectListToStretch.getCentroid(
        tolerance2ApproxCurve)  # verifico se polilinea ha un centroide
    if pt is not None:
        if isPtContainedForStretch(
                pt,
                ptListToStretch):  # se il punto è contenuto in ptListToStretch
            linearObjectListToStretch.move(offSetX, offSetY)

    return linearObjectListToStretch
Пример #7
0
    def __init__(self, plugIn):
        QadGetPoint.__init__(self, plugIn)

        self.filletMode = 1  # modalità di raccordo; 1=Taglia-estendi, 2=Non taglia-estendi
        self.radius = 0.0

        self.layer = None
        self.linearObjectList = qad_utils.QadLinearObjectList()
        self.partAt1 = 0
        self.vertexAt1 = 0

        self.tolerance2ApproxCurve = None

        self.__rubberBand = QadRubberBand(self.canvas)
Пример #8
0
    def __init__(self, plugIn):
        QadGetPoint.__init__(self, plugIn)

        self.firstPt = None
        self.mode = None

        self.layer = None
        self.linearObjectList = qad_utils.QadLinearObjectList()
        self.tolerance2ApproxCurve = None
        self.vertexAt = 0
        self.vertexPt = None
        self.after = True
        self.basePt = None
        self.__highlight = QadHighlight(self.canvas)
Пример #9
0
 def __fromPoyline(self, pointList): # funzione privata
    # restituisce entityType, qadGeom
    arc = QadArc()
    startEndVertices = arc.fromPolyline(pointList, 0)
    # se la polilinea è composta solo da un arco
    if startEndVertices and startEndVertices[0] == 0 and startEndVertices[1] == len(pointList)-1:
       return QadEntityGeomTypeEnum.ARC, arc # oggetto arco
    else:
       circle = QadCircle()
       if circle.fromPolyline(pointList): # se la polilinea è un cerchio
          return QadEntityGeomTypeEnum.CIRCLE, circle # oggetto cerchio
       else:
          linearObjectList = qad_utils.QadLinearObjectList() # oggetto QadLinearObjectList
          linearObjectList.fromPolyline(pointList)
          return QadEntityGeomTypeEnum.LINESTRING, linearObjectList
    
    return QadEntityGeomTypeEnum.NONE, None
Пример #10
0
    def doDivide(self, dstLayer):
        f = self.entSelClass.entity.getFeature()
        if f is None:
            return

        layer = self.entSelClass.entity.layer

        # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy
        geom = self.layerToMapCoordinates(layer, f.geometry())

        # ritorna una tupla (<The squared cartesian distance>,
        #                    <minDistPoint>
        #                    <afterVertex>
        #                    <leftOf>)
        dummy = qad_utils.closestSegmentWithContext(self.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)
        subGeom, atSubGeom = qad_utils.getSubGeomAtVertex(geom, dummy[2])
        pathLinearObjectList = qad_utils.QadLinearObjectList()
        geomType = subGeom.type()
        pathLinearObjectList.fromPolyline(subGeom.asPolyline())
        distance = pathLinearObjectList.length() / self.nSegments

        self.plugIn.beginEditCommand("Feature divided", dstLayer)

        i = 1
        distanceFromStart = distance
        while i < self.nSegments:
            pt, rot = pathLinearObjectList.getPointFromStart(distanceFromStart)
            if self.addFeature(dstLayer, pt,
                               rot if self.objectAlignment else 0) == False:
                self.plugIn.destroyEditCommand()
                return False
            i = i + 1
            distanceFromStart = distanceFromStart + distance

        self.plugIn.endEditCommand()
        return True
Пример #11
0
   def showLength(self, entity, pt):
      # visualizza la lunghezza dell'entità in unità di mappa
      geom = entity.getGeometry()
      if geom is None:         
         errMsg = QadMsg.translate("QAD", "Invalid object.")
         self.showErr("\n" + errMsg)
         return None
   
      # Trasformo il punto nel sistema di coordinate del layer
      convPt = self.mapToLayerCoordinates(entity.layer, pt)

      # ritorna una tupla (<The squared cartesian distance>,
      #                    <minDistPoint>
      #                    <afterVertex>
      #                    <leftOf>)
      dummy = qad_utils.closestSegmentWithContext(pt, geom)
      if dummy[2] is None:
         errMsg = QadMsg.translate("QAD", "Invalid object.")
         self.showErr("\n" + errMsg)
         return None
      # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based)
      subGeom, atSubGeom = qad_utils.getSubGeomAtVertex(geom, dummy[2])
      
      LinearObjectListToMisure = qad_utils.QadLinearObjectList()
      pointList = subGeom.asPolyline()
      LinearObjectListToMisure.fromPolyline(pointList)
      # la trasformo in unità di mappa
      LinearObjectListToMisure.transformFromCRSToCRS(entity.layer.crs(), self.plugIn.canvas.mapRenderer().destinationCrs())      
      
      msg = QadMsg.translate("Command_LENGTHEN", "\nCurrent length: {0}")
      msg = msg.format(str(LinearObjectListToMisure.length()))

      arc = QadArc()
      startEndVertices = arc.fromPolyline(pointList, 0)
      # se la polilinea è composta solo da un arco
      if startEndVertices and startEndVertices[0] == 0 and startEndVertices[1] == len(pointList)-1:
         msg = msg + QadMsg.translate("Command_LENGTHEN", ", included angle: {0}")
         msg = msg.format(str(qad_utils.toDegrees(arc.totalAngle())))
         
      self.showMsg(msg)
Пример #12
0
   def canvasMoveEvent(self, event):
      QadGetPoint.canvasMoveEvent(self, event)
      
      self.__rubberBand.reset()
      res = False
       
      # si richiede la selezione dell'oggetto da allungare
      if self.mode == Qad_lengthen_maptool_ModeEnum.ASK_FOR_OBJ_TO_LENGTHEN:
         if self.tmpEntity.isInitialized():
            if self.setInfo(self.tmpEntity, self.tmpPoint) == False:
               return

            if self.OpMode == "DElta":
               newTmpLinearObjectList = qad_utils.QadLinearObjectList(self.tmpLinearObjectList)
               if self.OpType == "length":
                  res = newTmpLinearObjectList.lengthen_delta(self.move_startPt, self.value)
               elif self.OpType == "Angle":
                  res = newTmpLinearObjectList.lengthen_deltaAngle(self.move_startPt, self.value)
            elif self.OpMode == "Percent":
               newTmpLinearObjectList = qad_utils.QadLinearObjectList(self.tmpLinearObjectList)
               value = newTmpLinearObjectList.length() * self.value / 100
               value = value - newTmpLinearObjectList.length()
               res = newTmpLinearObjectList.lengthen_delta(self.move_startPt, value)
            elif self.OpMode == "Total":
               newTmpLinearObjectList = qad_utils.QadLinearObjectList(self.tmpLinearObjectList)
               if self.OpType == "length":
                  value = self.value - self.tmpLinearObjectList.length()
                  res = newTmpLinearObjectList.lengthen_delta(self.move_startPt, value)
               elif self.OpType == "Angle":                     
                  if newTmpLinearObjectList.qty() == 1:
                     linearObject = newTmpLinearObjectList.getLinearObjectAt(0)
                     if linearObject.isArc() == True: # se è un arco
                        value = self.value - linearObject.getArc().totalAngle()
                        res = newTmpLinearObjectList.lengthen_deltaAngle(self.move_startPt, value)
               
      # si richiede un punto per la nuova estremità
      elif self.mode == Qad_lengthen_maptool_ModeEnum.ASK_FOR_DYNAMIC_POINT:
         newTmpLinearObjectList = qad_utils.QadLinearObjectList(self.tmpLinearObjectList)
         transformedPt = self.canvas.mapSettings().mapToLayerCoordinates(self.layer, self.tmpPoint)
         
         if self.move_startPt:
            linearObject = newTmpLinearObjectList.getLinearObjectAt(0)
         else:
            linearObject = newTmpLinearObjectList.getLinearObjectAt(-1)
            
         if linearObject.isSegment():
            newPt = qad_utils.getPerpendicularPointOnInfinityLine(linearObject.getStartPt(), linearObject.getEndPt(), transformedPt)
         else: # arco
            newPt = qad_utils.getPolarPointByPtAngle(linearObject.getArc().center, \
                                                     qad_utils.getAngleBy2Pts(linearObject.getArc().center, transformedPt), \
                                                     linearObject.getArc().radius)                  

         if newTmpLinearObjectList.qty() > 1 and linearObject.isSegment():
            ang = linearObject.getTanDirectionOnStartPt()

         if self.move_startPt:
            linearObject.setStartPt(newPt)
         else:
            linearObject.setEndPt(newPt)

         if newTmpLinearObjectList.qty() > 1 and linearObject.isSegment() and \
            qad_utils.TanDirectionNear(ang, linearObject.getTanDirectionOnStartPt()) == False:
            res = False
         else:
            res = True
      
      if res == False: # allungamento impossibile
         return
      pts = newTmpLinearObjectList.asPolyline()
      geom = QgsGeometry.fromPolyline(pts)
      self.__rubberBand.addGeometry(geom, self.layer)
Пример #13
0
    def canvasMoveEvent(self, event):
        QadGetPoint.canvasMoveEvent(self, event)

        self.__rubberBand.reset()
        tmpLinearObjectList = None

        # si richiede la selezione del secondo oggetto
        if self.mode == Qad_fillet_maptool_ModeEnum.ASK_FOR_SECOND_LINESTRING:
            if self.tmpEntity.isInitialized():
                # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy
                geom = self.layerToMapCoordinates(self.tmpEntity.layer,
                                                  self.tmpEntity.getGeometry())

                # ritorna una tupla (<The squared cartesian distance>,
                #                    <minDistPoint>
                #                    <afterVertex>
                #                    <leftOf>)
                dummy = qad_utils.closestSegmentWithContext(
                    self.tmpPoint, geom)
                if dummy[2] is not None:
                    # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based)
                    subGeom, atSubGeom = qad_utils.getSubGeomAtVertex(
                        geom, dummy[2])
                    tmpLinearObjectList = qad_utils.QadLinearObjectList()
                    tmpLinearObjectList.fromPolyline(subGeom.asPolyline())

                    # la funzione ritorna una lista con (<minima distanza al quadrato>,
                    #                                    <punto più vicino>
                    #                                    <indice della parte più vicina>
                    #                                    <"a sinistra di">)
                    dummy = tmpLinearObjectList.closestPartWithContext(
                        self.tmpPoint)
                    tmpPartAt = dummy[2]
                    tmpPointAt = dummy[1]

                    # stessa entità e stessa parte
                    if self.layer.id() == self.tmpEntity.layer.id() and \
                       self.featureId == self.tmpEntity.featureId and \
                       self.partAt == tmpPartAt:
                        return

                    # uso il crs del canvas per lavorare con coordinate piane xy
                    epsg = self.canvas.mapRenderer().destinationCrs().authid()

                    if self.tmpShiftKey == True:  # tasto shift premuto durante il movimento del mouse
                        # filletMode = 1 # modalità di raccordo; 1=Taglia-estendi
                        # raggio = 0
                        res = qad_utils.getFilletLinearObjectList(self.linearObjectList, self.partAt, self.pointAt, \
                                                                  tmpLinearObjectList, tmpPartAt, tmpPointAt,\
                                                                  1, 0, epsg)
                    else:
                        res = qad_utils.getFilletLinearObjectList(self.linearObjectList, self.partAt, self.pointAt, \
                                                                  tmpLinearObjectList, tmpPartAt, tmpPointAt,\
                                                                  self.filletMode, self.radius, epsg)
                    if res is None:  # raccordo non possibile
                        return
                    tmpLinearObjectList = res[0]

        # si richiede la selezione della polilinea
        elif self.mode == Qad_fillet_maptool_ModeEnum.ASK_FOR_POLYLINE:
            if self.tmpEntity.isInitialized():
                # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy
                geom = self.layerToMapCoordinates(self.tmpEntity.layer,
                                                  self.tmpEntity.getGeometry())
                # ritorna una tupla (<The squared cartesian distance>,
                #                    <minDistPoint>
                #                    <afterVertex>
                #                    <leftOf>)
                dummy = qad_utils.closestSegmentWithContext(
                    self.tmpPoint, geom)
                if dummy[2] is not None:
                    # ritorna la sotto-geometria al vertice <atVertex> e la sua posizione nella geometria (0-based)
                    subGeom, atSubGeom = qad_utils.getSubGeomAtVertex(
                        geom, dummy[2])
                    tmpLinearObjectList = qad_utils.QadLinearObjectList()
                    tmpLinearObjectList.fromPolyline(subGeom.asPolyline())
                    tmpLinearObjectList.fillet(self.radius)

        if tmpLinearObjectList is not None:
            pts = tmpLinearObjectList.asPolyline(self.tolerance2ApproxCurve)
            if self.layer.geometryType() == QGis.Polygon:
                geom = QgsGeometry.fromPolygon([pts])
            else:
                geom = QgsGeometry.fromPolyline(pts)

            # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy
            geom = self.layerToMapCoordinates(self.layer, geom)
            self.__rubberBand.addGeometry(geom, self.layer)
Пример #14
0
   def lengthen(self, point):
      layer = self.entity.layer
      f = self.entity.getFeature()
      if f is None: # non c'è più la feature
         return False
      # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy
      geom = self.layerToMapCoordinates(layer, self.entity.getGeometry())
                  
      # ritorna una tupla (<The squared cartesian distance>,
      #                    <minDistPoint>
      #                    <afterVertex>
      #                    <leftOf>)
      res = False
      newLinearObjectList = qad_utils.QadLinearObjectList(self.linearObjectList)
         
      if self.move_startPt:
         linearObject = newLinearObjectList.getLinearObjectAt(0)
      else:
         linearObject = newLinearObjectList.getLinearObjectAt(-1)
         
      if linearObject.isSegment():
         newPt = qad_utils.getPerpendicularPointOnInfinityLine(linearObject.getStartPt(), linearObject.getEndPt(), point)
      else: # arco
         newPt = qad_utils.getPolarPointByPtAngle(linearObject.getArc().center, \
                                                  qad_utils.getAngleBy2Pts(linearObject.getArc().center, point), \
                                                  linearObject.getArc().radius)                  

      if newLinearObjectList.qty() > 1 and linearObject.isSegment():
         ang = linearObject.getTanDirectionOnStartPt()

      if self.move_startPt:
         linearObject.setStartPt(newPt)
      else:
         linearObject.setEndPt(newPt)
         
      if newLinearObjectList.qty() > 1 and linearObject.isSegment() and \
         qad_utils.TanDirectionNear(ang, linearObject.getTanDirectionOnStartPt()) == False:
         res = False
      else:
         res = True

      if res == False: # allungamento impossibile
         return False
               
      pts = newLinearObjectList.asPolyline() 
      updSubGeom = QgsGeometry.fromPolyline(pts)
               
      updGeom = qad_utils.setSubGeom(geom, updSubGeom, self.atSubGeom)
      if updGeom is None:
         return False
      # trasformo la geometria nel crs del layer
      f.setGeometry(self.mapToLayerCoordinates(layer, updGeom))
         
      self.plugIn.beginEditCommand("Feature edited", layer)
      
      if self.copyEntities == False:
         # plugIn, layer, feature, refresh, check_validity
         if qad_layer.updateFeatureToLayer(self.plugIn, layer, f, False, False) == False:
            self.plugIn.destroyEditCommand()
            return False
      else:
         # plugIn, layer, features, coordTransform, refresh, check_validity
         if qad_layer.addFeatureToLayer(self.plugIn, layer, f, None, False, False) == False:
            self.plugIn.destroyEditCommand()
            return False
      
      self.plugIn.endEditCommand()
      self.nOperationsToUndo = self.nOperationsToUndo + 1
      
      return True
Пример #15
0
   def lengthen(self, point):
      layer = self.entity.layer
      f = self.entity.getFeature()
      if f is None: # non c'è più la feature
         return False
      geom = self.entity.getGeometry()
                  
      # ritorna una tupla (<The squared cartesian distance>,
      #                    <minDistPoint>
      #                    <afterVertex>
      #                    <leftOf>)
      res = False
      if self.OpMode == "DElta":
         newLinearObjectList = qad_utils.QadLinearObjectList(self.linearObjectList)
         if self.OpType == "length":
            res = newLinearObjectList.lengthen_delta(self.move_startPt, self.value)
         elif self.OpType == "Angle":
            res = newLinearObjectList.lengthen_deltaAngle(self.move_startPt, self.value)
      elif self.OpMode == "Percent":
         newLinearObjectList = qad_utils.QadLinearObjectList(self.linearObjectList)
         value = newLinearObjectList.length() * self.value / 100
         value = value - newLinearObjectList.length()
         res = newLinearObjectList.lengthen_delta(self.move_startPt, value)
      elif self.OpMode == "Total":
         newLinearObjectList = qad_utils.QadLinearObjectList(self.linearObjectList)
         if self.OpType == "length":
            value = self.value - newLinearObjectList.length()
            res = newLinearObjectList.lengthen_delta(self.move_startPt, value)
         elif self.OpType == "Angle":                     
            if newLinearObjectList.qty() == 1:
               linearObject = newLinearObjectList.getLinearObjectAt(0)
               if linearObject.isArc() == True: # se è un arco
                  value = self.value - linearObject.getArc().totalAngle()
                  res = newLinearObjectList.lengthen_deltaAngle(self.move_startPt, value)
      elif self.OpMode == "DYnamic":
         newLinearObjectList = qad_utils.QadLinearObjectList(self.linearObjectList)
         transformedPt = self.mapToLayerCoordinates(layer, point)
            
         if self.move_startPt:
            linearObject = newLinearObjectList.getLinearObjectAt(0)
         else:
            linearObject = newLinearObjectList.getLinearObjectAt(-1)
            
         if linearObject.isSegment():
            newPt = qad_utils.getPerpendicularPointOnInfinityLine(linearObject.getStartPt(), linearObject.getEndPt(), transformedPt)
         else: # arco
            newPt = qad_utils.getPolarPointByPtAngle(linearObject.getArc().center, \
                                                     qad_utils.getAngleBy2Pts(linearObject.getArc().center, transformedPt), \
                                                     linearObject.getArc().radius)                  

         if newLinearObjectList.qty() > 1 and linearObject.isSegment():
            ang = linearObject.getTanDirectionOnStartPt()

         if self.move_startPt:
            linearObject.setStartPt(newPt)
         else:
            linearObject.setEndPt(newPt)
            
         if newLinearObjectList.qty() > 1 and linearObject.isSegment() and \
            qad_utils.TanDirectionNear(ang, linearObject.getTanDirectionOnStartPt()) == False:
            res = False
         else:
            res = True

      if res == False: # allungamento impossibile
         return False
               
      pts = newLinearObjectList.asPolyline() 
      updSubGeom = QgsGeometry.fromPolyline(pts)
               
      updGeom = qad_utils.setSubGeom(geom, updSubGeom, self.atSubGeom)
      if updGeom is None:
         return False
      f.setGeometry(updGeom)
         
      self.plugIn.beginEditCommand("Feature edited", layer)
      
      # plugIn, layer, feature, refresh, check_validity
      if qad_layer.updateFeatureToLayer(self.plugIn, layer, f, False, False) == False:
         self.plugIn.destroyEditCommand()
         return False

      self.plugIn.endEditCommand()
      self.nOperationsToUndo = self.nOperationsToUndo + 1
      
      return True
Пример #16
0
def gripStretchQgsLineStringGeometry(geom, basePt, ptListToStretch, offSetX, offSetY, tolerance2ApproxCurve):
   """
   Stira i punti di grip di una linestring che sono contenuti in ptListToStretch
   geom = geometria da stirare
   basePt = punto base
   ptListToStretch = lista dei punti da stirare
   offSetX = spostamento X
   offSetY = spostamento Y
   """
   if tolerance2ApproxCurve == None:
      tolerance = QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE"))
   else:
      tolerance = tolerance2ApproxCurve
   
   obj = qad_utils.whatGeomIs(0, geom)
   if (type(obj) != list and type(obj) != tuple):
      objType = obj.whatIs()
      if objType == "CIRCLE": # se é cerchio
         newCircle = gripStretchCircle(obj, basePt, ptListToStretch, offSetX, offSetY, tolerance)
         if newCircle is not None:
            return QgsGeometry.fromPolyline(newCircle.asPolyline(tolerance))
      elif objType == "ARC": # se é arco
         newArc = gripStretchArc(obj, ptListToStretch, offSetX, offSetY, tolerance)
         if newArc is not None:
            return QgsGeometry.fromPolyline(newArc.asPolyline(tolerance))
      return None
   
   linearObjectListToStretch = qad_utils.QadLinearObjectList()
   linearObjectListToStretch.fromPolyline(geom.asPolyline())
   
   atPart = 0
   while atPart < linearObjectListToStretch.qty():
      linearObject = linearObjectListToStretch.getLinearObjectAt(atPart)
      if linearObject.isSegment():
         pt = linearObject.getStartPt()
         if isPtContainedForStretch(pt, ptListToStretch): # se il punto è contenuto in ptListToStretch
            # cambio punto iniziale        
            pt.setX(pt.x() + offSetX)
            pt.setY(pt.y() + offSetY)
            linearObject.setStartPt(pt)
            
         pt = linearObject.getEndPt()
         if isPtContainedForStretch(pt, ptListToStretch): # se il punto è contenuto in ptListToStretch
            # cambio punto finale
            pt.setX(pt.x() + offSetX)
            pt.setY(pt.y() + offSetY)
            linearObject.setEndPt(pt)
      else: # se è arco
         newArc, newInverseFlag = gripStretchArc(linearObject.getArc(), ptListToStretch, offSetX, offSetY, tolerance, linearObject.isInverseArc())
         if newArc is None:
            return None
         linearObject.setArc(newArc, newInverseFlag)

      atPart = atPart + 1
   
   pt = linearObjectListToStretch.getCentroid(tolerance) # verifico se polilinea ha un centroide
   if pt is not None:
      if isPtContainedForStretch(pt, ptListToStretch): # se il punto è contenuto in ptListToStretch
         linearObjectListToStretch.move(offSetX, offSetY)
   
   pts = linearObjectListToStretch.asPolyline(tolerance)
   stretchedGeom = QgsGeometry.fromPolyline(pts)    
      
   return stretchedGeom   
Пример #17
0
def stretchQgsLineStringGeometry(geom, containerGeom, offSetX, offSetY, tolerance2ApproxCurve = None):
   """
   Stira i punti di una linestring che sono contenuti in containerGeom
   point = punto da tirare
   containerGeom = può essere una QgsGeometry rappresentante un poligono contenente i punti di geom da stirare
                   oppure una lista dei punti da stirare
   offSetX = spostamento X
   offSetY = spostamento Y
   """
   if tolerance2ApproxCurve == None:
      tolerance = QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE"))
   else:
      tolerance = tolerance2ApproxCurve

   obj = qad_utils.whatGeomIs(0, geom)
   if (type(obj) != list and type(obj) != tuple):
      objType = obj.whatIs()
      if objType == "CIRCLE": # se é cerchio
         if isPtContainedForStretch(obj.center, containerGeom): # se il punto è contenuto in containerGeom
            obj.center.setX(obj.center.x() + offSetX)
            obj.center.setY(obj.center.y() + offSetY)
         return QgsGeometry.fromPolyline(obj.asPolyline(tolerance))

   stretchedGeom = QgsGeometry(geom)
   snapper = QadSnapper()
   points = snapper.getEndPoints(stretchedGeom)
   del snapper

   linearObjectListToStretch = qad_utils.QadLinearObjectList()
   linearObjectListToStretch.fromPolyline(geom.asPolyline())
   
   for point in points:
      if isPtContainedForStretch(point, containerGeom): # se il punto è contenuto in containerGeom
         atPart = linearObjectListToStretch.containsPt(point)
         while atPart >= 0:
            linearObject = linearObjectListToStretch.getLinearObjectAt(atPart)
            pt = linearObject.getStartPt()        
            if qad_utils.ptNear(pt, point): # cambio punto iniziale
               pt.setX(pt.x() + offSetX)
               pt.setY(pt.y() + offSetY)
               if linearObject.isSegment():
                  linearObject.setStartPt(pt)
               else:
                  oldArc = linearObject.getArc()
                  middlePt = oldArc.getMiddlePt()
                  distFromMiddleChord = qad_utils.getDistance(middlePt, qad_utils.getPerpendicularPointOnInfinityLine(oldArc.getStartPt(), oldArc.getEndPt(), middlePt))
                  
                  newArc = QadArc()
                  if linearObject.isInverseArc():                  
                     middlePt = qad_utils.getMiddlePoint(pt, oldArc.getStartPt())
                     middlePt = qad_utils.getPolarPointByPtAngle(middlePt, \
                                                                 qad_utils.getAngleBy2Pts(pt, oldArc.getStartPt()) + math.pi / 2, \
                                                                 distFromMiddleChord)                  
                     if newArc.fromStartSecondEndPts(oldArc.getStartPt(), middlePt, pt) == False:
                        return None
                  else:
                     middlePt = qad_utils.getMiddlePoint(pt, oldArc.getEndPt())
                     middlePt = qad_utils.getPolarPointByPtAngle(middlePt, \
                                                                 qad_utils.getAngleBy2Pts(pt, oldArc.getEndPt()) - math.pi / 2, \
                                                                 distFromMiddleChord)                  
                     if newArc.fromStartSecondEndPts(pt, middlePt, oldArc.getEndPt()) == False:
                        return None
                  linearObject.setArc(newArc, linearObject.isInverseArc())         
            else:
               pt = linearObject.getEndPt()
               if qad_utils.ptNear(pt, point): # cambio punto finale
                  pt.setX(pt.x() + offSetX)
                  pt.setY(pt.y() + offSetY)
                  if linearObject.isSegment():
                     linearObject.setEndPt(pt)
                  else:
                     oldArc = linearObject.getArc()
                     middlePt = oldArc.getMiddlePt()
                     distFromMiddleChord = qad_utils.getDistance(middlePt, qad_utils.getPerpendicularPointOnInfinityLine(oldArc.getStartPt(), oldArc.getEndPt(), middlePt))
                     
                     newArc = QadArc()
                     if linearObject.isInverseArc():
                        middlePt = qad_utils.getMiddlePoint(pt, oldArc.getEndPt())
                        middlePt = qad_utils.getPolarPointByPtAngle(middlePt, \
                                                                    qad_utils.getAngleBy2Pts(pt, oldArc.getEndPt()) - math.pi / 2, \
                                                                    distFromMiddleChord)                  
                        if newArc.fromStartSecondEndPts(pt, middlePt, oldArc.getEndPt()) == False:
                           return None
                     else:
                        middlePt = qad_utils.getMiddlePoint(pt, oldArc.getStartPt())
                        middlePt = qad_utils.getPolarPointByPtAngle(middlePt, \
                                                                    qad_utils.getAngleBy2Pts(pt, oldArc.getStartPt()) + math.pi / 2, \
                                                                    distFromMiddleChord)                  
                        if newArc.fromStartSecondEndPts(oldArc.getStartPt(), middlePt, pt) == False:
                           return None
                     linearObject.setArc(newArc, linearObject.isInverseArc())            
                  
            atPart = linearObjectListToStretch.containsPt(point, atPart + 1)
            
   pts = linearObjectListToStretch.asPolyline(tolerance)
   stretchedGeom = QgsGeometry.fromPolyline(pts)    
      
   return stretchedGeom