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
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)
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
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
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)
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
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)
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)
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
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
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)
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)
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)
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
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
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
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