class Qad_stretch_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.SSGeomList = [] # lista di entità da stirare con geom di selezione self.__rubberBand = QadRubberBand(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__rubberBand.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__rubberBand.show() def clear(self): QadGetPoint.clear(self) self.__rubberBand.reset() self.mode = None #============================================================================ # stretch #============================================================================ def stretch(self, f, containerGeom, offSetX, offSetY, tolerance2ApproxCurve, layerEntitySet, entitySet): # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = self.plugIn.dimStyles.getDimEntity(layerEntitySet.layer, f.id()) if dimEntity is None: # stiro la feature e la rimuovo da entitySet (é la prima) stretchedGeom = qad_utils.stretchQgsGeometry(f.geometry(), containerGeom, \ offSetX, offSetY, \ tolerance2ApproxCurve) if stretchedGeom is not None: f.setGeometry(stretchedGeom) self.__rubberBand.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # stiro la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.stretch(self.plugIn, containerGeom, offSetX, offSetY) self.__rubberBand.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__rubberBand.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__rubberBand.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) #============================================================================ # addStretchedGeometries #============================================================================ def addStretchedGeometries(self, newPt): self.__rubberBand.reset() for SSGeom in self.SSGeomList: # copio entitySet entitySet = QadEntitySet(SSGeom[0]) geomSel = SSGeom[1] for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer tolerance2ApproxCurve = qad_utils.distMapToLayerCoordinates(QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")), \ self.canvas,\ layer) g = QgsGeometry(geomSel) if self.plugIn.canvas.mapRenderer().destinationCrs() != layer.crs(): # Trasformo la geometria nel sistema di coordinate del layer coordTransform = QgsCoordinateTransform(self.canvas.mapRenderer().destinationCrs(), \ layer.crs()) g.transform(coordTransform) transformedBasePt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, self.basePt) transformedNewPt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, newPt) offSetX = transformedNewPt.x() - transformedBasePt.x() offSetY = transformedNewPt.y() - transformedBasePt.y() else: offSetX = newPt.x() - self.basePt.x() offSetY = newPt.y() - self.basePt.y() while len(layerEntitySet.featureIds) > 0: featureId = layerEntitySet.featureIds[0] f = layerEntitySet.getFeature(featureId) self.stretch(f, g, offSetX, offSetY, tolerance2ApproxCurve, layerEntitySet, entitySet) def canvasMoveEvent(self, event): QadGetPoint.canvasMoveEvent(self, event) # noto il punto base si richiede il secondo punto per l'angolo di rotazione if self.mode == Qad_stretch_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_MOVE_PT: self.addStretchedGeometries(self.tmpPoint) def activate(self): QadGetPoint.activate(self) self.__rubberBand.show() def deactivate(self): try: # necessario perché se si chiude QGIS parte questo evento nonostante non ci sia più l'oggetto maptool ! QadGetPoint.deactivate(self) self.__rubberBand.hide() except: pass def setMode(self, mode): self.mode = mode # si richiede la selezione del primo punto del rettangolo per selezionare gli oggetti if self.mode == Qad_stretch_maptool_ModeEnum.ASK_FOR_FIRST_PT_RECTANGLE: self.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto niente il primo punto del rettangolo si richiede il secondo punto elif self.mode == Qad_stretch_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT_RECTANGLE: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_RECTANGLE) # noto niente si richiede il punto base elif self.mode == Qad_stretch_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il punto base si richiede il secondo punto elif self.mode == Qad_stretch_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_MOVE_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt)
class Qad_move_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.entitySet = QadEntitySet() self.__rubberBand = QadRubberBand(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__rubberBand.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__rubberBand.show() def clear(self): QadGetPoint.clear(self) self.__rubberBand.reset() self.mode = None #============================================================================ # move #============================================================================ def move(self, f, offSetX, offSetY, layerEntitySet, entitySet): # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = self.plugIn.dimStyles.getDimEntity(layerEntitySet.layer, f.id()) if dimEntity is None: # sposto la feature e la rimuovo da entitySet (é la prima) f.setGeometry(qad_utils.moveQgsGeometry(f.geometry(), offSetX, offSetY)) self.__rubberBand.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # sposto la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.move(offSetX, offSetY) self.__rubberBand.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__rubberBand.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__rubberBand.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) def addMovedGeometries(self, newPt): self.__rubberBand.reset() # copio entitySet entitySet = QadEntitySet(self.entitySet) for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, self.basePt) transformedNewPt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, newPt) offSetX = transformedNewPt.x() - transformedBasePt.x() offSetY = transformedNewPt.y() - transformedBasePt.y() while len(layerEntitySet.featureIds) > 0: featureId = layerEntitySet.featureIds[0] f = layerEntitySet.getFeature(featureId) self.move(f, offSetX, offSetY, layerEntitySet, entitySet) def canvasMoveEvent(self, event): QadGetPoint.canvasMoveEvent(self, event) # noto il punto base si richiede il secondo punto if self.mode == Qad_move_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_MOVE_PT: self.addMovedGeometries(self.tmpPoint) def activate(self): QadGetPoint.activate(self) self.__rubberBand.show() def deactivate(self): try: # necessario perché se si chiude QGIS parte questo evento nonostante non ci sia più l'oggetto maptool ! QadGetPoint.deactivate(self) self.__rubberBand.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_move_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il punto base si richiede il secondo punto elif self.mode == Qad_move_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_MOVE_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt)
class Qad_scale_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.Pt1ReferenceLen = None self.ReferenceLen = 0 self.Pt1NewLen = None self.entitySet = QadEntitySet() self.__rubberBand = QadRubberBand(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__rubberBand.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__rubberBand.show() def clear(self): QadGetPoint.clear(self) self.__rubberBand.reset() self.mode = None #============================================================================ # scale #============================================================================ def scale(self, f, basePt, scale, layerEntitySet, entitySet): # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = self.plugIn.dimStyles.getDimEntity(layerEntitySet.layer, f.id()) if dimEntity is None: # scalo la feature e la rimuovo da entitySet (é la prima) f.setGeometry(qad_utils.scaleQgsGeometry(f.geometry(), basePt, scale)) self.__rubberBand.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # scalo la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.scale(self.plugIn, basePt, scale) self.__rubberBand.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__rubberBand.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__rubberBand.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) #============================================================================ # addScaledGeometries #============================================================================ def addScaledGeometries(self, scale): self.__rubberBand.reset() # copio entitySet entitySet = QadEntitySet(self.entitySet) if scale <= 0: return for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, self.basePt) while len(layerEntitySet.featureIds) > 0: featureId = layerEntitySet.featureIds[0] f = layerEntitySet.getFeature(featureId) self.scale(f, transformedBasePt, scale, layerEntitySet, entitySet) def canvasMoveEvent(self, event): QadGetPoint.canvasMoveEvent(self, event) # noto il punto base si richiede il secondo punto per la scala if self.mode == Qad_scale_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_SCALE_PT: scale = qad_utils.getDistance(self.basePt, self.tmpPoint) self.addScaledGeometries(scale) # noto il primo punto si richiede il secondo punto per la lunghezza di riferimento elif self.mode == Qad_scale_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_NEW_LEN_PT: len = qad_utils.getDistance(self.basePt, self.tmpPoint) scale = len / self.ReferenceLen self.addScaledGeometries(scale) # noto il primo punto si richiede il secondo punto per la nuova lunghezza elif self.mode == Qad_scale_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_NEW_LEN_PT: len = qad_utils.getDistance(self.Pt1NewLen, self.tmpPoint) scale = len / self.ReferenceLen self.addScaledGeometries(scale) def activate(self): QadGetPoint.activate(self) self.__rubberBand.show() def deactivate(self): try: # necessario perché se si chiude QGIS parte questo evento nonostante non ci sia più l'oggetto maptool ! QadGetPoint.deactivate(self) self.__rubberBand.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_scale_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il punto base si richiede il secondo punto per la scala elif self.mode == Qad_scale_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_SCALE_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt) # si richiede il primo punto per la lunghezza di riferimento elif self.mode == Qad_scale_maptool_ModeEnum.ASK_FOR_FIRST_PT_REFERENCE_LEN: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il primo punto si richiede il secondo punto per la lunghezza di riferimento elif self.mode == Qad_scale_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT_REFERENCE_LEN: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.Pt1ReferenceLen) # noto il punto base si richiede il secondo punto per la nuova lunghezza elif self.mode == Qad_scale_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_NEW_LEN_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt) # si richiede il primo punto per la nuova lunghezza elif self.mode == Qad_scale_maptool_ModeEnum.ASK_FOR_FIRST_NEW_LEN_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il primo punto si richiede il secondo punto per la nuova lunghezza elif self.mode == Qad_scale_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_NEW_LEN_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.Pt1NewLen)
class Qad_mirror_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.firstMirrorPt = None self.entitySet = QadEntitySet() self.__rubberBand = QadRubberBand(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__rubberBand.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__rubberBand.show() def clear(self): QadGetPoint.clear(self) self.__rubberBand.reset() self.mode = None #============================================================================ # mirror #============================================================================ def mirror(self, f, pt1, pt2, layerEntitySet, entitySet): # verifico se la feature appartiene ad una quotatura dimEntity = self.plugIn.dimStyles.getDimEntity(layerEntitySet.layer, f.id()) if dimEntity is None: # specchio la feature e la rimuovo da entitySet (é la prima) f.setGeometry(qad_utils.mirrorQgsGeometry(f.geometry(), pt1, pt2)) self.__rubberBand.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # specchio la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.mirror(self.plugIn, pt1, qad_utils.getAngleBy2Pts(pt1, pt2)) self.__rubberBand.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__rubberBand.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__rubberBand.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) def setMirroredGeometries(self, newPt): self.__rubberBand.reset() # copio entitySet entitySet = QadEntitySet(self.entitySet) for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedFirstMirrorPt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, self.firstMirrorPt) transformedNewPtMirrorPt = self.canvas.mapRenderer().mapToLayerCoordinates(layer, newPt) while len(layerEntitySet.featureIds) > 0: featureId = layerEntitySet.featureIds[0] f = layerEntitySet.getFeature(featureId) self.mirror(f, transformedFirstMirrorPt, transformedNewPtMirrorPt, layerEntitySet, entitySet) def canvasMoveEvent(self, event): QadGetPoint.canvasMoveEvent(self, event) # noto il primo punto si richiede il secondo punto della linea speculare if self.mode == Qad_mirror_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT: self.setMirroredGeometries(self.tmpPoint) def activate(self): QadGetPoint.activate(self) self.__rubberBand.show() def deactivate(self): try: # necessario perché se si chiude QGIS parte questo evento nonostante non ci sia più l'oggetto maptool ! QadGetPoint.deactivate(self) self.__rubberBand.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il primo punto della linea speculare if self.mode == Qad_mirror_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il primo punto si richiede il secondo punto della linea speculare elif self.mode == Qad_mirror_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.firstMirrorPt)