def fromStartEndPtsRadius(self, startPt, endPt, radius): """ setta le caratteristiche dell'arco attraverso: punto iniziale punto finale raggio """ if startPt == endPt or radius <= 0: return False chord = qad_utils.getDistance(startPt, endPt) half_chord = chord / 2 if radius < half_chord: return False self.radius = radius angleSegment = qad_utils.getAngleBy2Pts(startPt, endPt) ptMiddle = qad_utils.getMiddlePoint(startPt, endPt) # Pitagora distFromCenter = math.sqrt((self.radius * self.radius) - (half_chord * half_chord)) # aggiungo 90 gradi self.center = qad_utils.getPolarPointByPtAngle(ptMiddle, angleSegment + (math.pi / 2), distFromCenter) self.startAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, endPt) return True
def fromStartEndPtsAngle(self, startPt, endPt, angle): """ setta le caratteristiche dell'arco attraverso: punto iniziale punto finale angolo inscritto """ if startPt == endPt or angle == 0: return False chord = qad_utils.getDistance(startPt, endPt) half_chord = chord / 2 # Teorema della corda self.radius = half_chord / math.sin(angle / 2) angleSegment = qad_utils.getAngleBy2Pts(startPt, endPt) ptMiddle = qad_utils.getMiddlePoint(startPt, endPt) # Pitagora distFromCenter = math.sqrt((self.radius * self.radius) - (half_chord * half_chord)) if angle < math.pi: # se angolo < 180 gradi # aggiungo 90 gradi per cercare il centro a sinistra del segmento self.center = qad_utils.getPolarPointByPtAngle(ptMiddle, angleSegment + (math.pi / 2), distFromCenter) else: # sottraggo 90 gradi per cercare il centro a destra del segmento self.center = qad_utils.getPolarPointByPtAngle(ptMiddle, angleSegment - (math.pi / 2), distFromCenter) self.startAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, endPt) return True
def fromStartEndPtsTan(self, startPt, endPt, tan): """ setta le caratteristiche dell'arco attraverso: punto iniziale punto finale direzione della tangente sul punto iniziale """ if startPt == endPt: return False angleSegment = qad_utils.getAngleBy2Pts(startPt, endPt) if tan == angleSegment or tan == angleSegment - math.pi: return False chord = qad_utils.getDistance(startPt, endPt) half_chord = chord / 2 ptMiddle = qad_utils.getMiddlePoint(startPt, endPt) angle = tan + (math.pi / 2) angle = angleSegment - angle distFromCenter = math.tan(angle) * half_chord self.center = qad_utils.getPolarPointByPtAngle(ptMiddle, angleSegment - (math.pi / 2), distFromCenter) pt = qad_utils.getPolarPointByPtAngle(startPt, tan, chord) if qad_utils.leftOfLine(endPt, startPt, pt) < 0: # arco si sviluppa a sinistra della tangente self.startAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, endPt) else: # arco si sviluppa a destra della tangente self.startAngle = qad_utils.getAngleBy2Pts(self.center, endPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.radius = qad_utils.getDistance(startPt, self.center) return True
def fromStartEndPtsRadius(self, startPt, endPt, radius): """ setta le caratteristiche dell'arco attraverso: punto iniziale punto finale raggio """ if startPt == endPt or radius <= 0: return False chord = qad_utils.getDistance(startPt, endPt) half_chord = chord / 2 if radius < half_chord: return False self.radius = radius angleSegment = qad_utils.getAngleBy2Pts(startPt, endPt) ptMiddle = qad_utils.getMiddlePoint(startPt, endPt) # Pitagora distFromCenter = math.sqrt((self.radius * self.radius) - (half_chord * half_chord)) # aggiungo 90 gradi self.center = qad_utils.getPolarPointByPtAngle( ptMiddle, angleSegment + (math.pi / 2), distFromCenter) self.startAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, endPt) return True
def fromStartEndPtsAngle(self, startPt, endPt, angle): """ setta le caratteristiche dell'arco attraverso: punto iniziale punto finale angolo inscritto """ if startPt == endPt or angle == 0: return False chord = qad_utils.getDistance(startPt, endPt) half_chord = chord / 2 # Teorema della corda self.radius = half_chord / math.sin(angle / 2) angleSegment = qad_utils.getAngleBy2Pts(startPt, endPt) ptMiddle = qad_utils.getMiddlePoint(startPt, endPt) # Pitagora distFromCenter = math.sqrt((self.radius * self.radius) - (half_chord * half_chord)) if angle < math.pi: # se angolo < 180 gradi # aggiungo 90 gradi per cercare il centro a sinistra del segmento self.center = qad_utils.getPolarPointByPtAngle( ptMiddle, angleSegment + (math.pi / 2), distFromCenter) else: # sottraggo 90 gradi per cercare il centro a destra del segmento self.center = qad_utils.getPolarPointByPtAngle( ptMiddle, angleSegment - (math.pi / 2), distFromCenter) self.startAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, endPt) return True
def fromStartEndPtsTan(self, startPt, endPt, tan): """ setta le caratteristiche dell'arco attraverso: punto iniziale punto finale direzione della tangente sul punto iniziale """ if startPt == endPt: return False angleSegment = qad_utils.getAngleBy2Pts(startPt, endPt) if tan == angleSegment or tan == angleSegment - math.pi: return False chord = qad_utils.getDistance(startPt, endPt) half_chord = chord / 2 ptMiddle = qad_utils.getMiddlePoint(startPt, endPt) angle = tan + (math.pi / 2) angle = angleSegment - angle distFromCenter = math.tan(angle) * half_chord self.center = qad_utils.getPolarPointByPtAngle(ptMiddle, angleSegment - (math.pi / 2), distFromCenter) pt = qad_utils.getPolarPointByPtAngle(startPt, tan, chord) if qad_utils.leftOfLine(endPt, startPt, pt) < 0: # arco si sviluppa a sinistra della tangente self.startAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, endPt) else: # arco si sviluppa a destra della tangente self.startAngle = qad_utils.getAngleBy2Pts(self.center, endPt) self.endAngle = qad_utils.getAngleBy2Pts(self.center, startPt) self.radius = qad_utils.getDistance(startPt, self.center) return True
def stretchQgsLineStringGeometry(geom, containerGeom, offSetX, offSetY, tolerance2ApproxCurve): """ 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 """ 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(tolerance2ApproxCurve)) 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(tolerance2ApproxCurve) 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