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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # scale #============================================================================ def scale(self, f, basePt, scale, layerEntitySet, entitySet): # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.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.__highlight.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # scalo la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.scale(basePt, scale) self.__highlight.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__highlight.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__highlight.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) #============================================================================ # addScaledGeometries #============================================================================ def addScaledGeometries(self, scale): self.__highlight.reset() # copio entitySet entitySet = QadEntitySet(self.entitySet) if scale <= 0: return for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapSettings().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.__highlight.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.__highlight.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.clear() self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # 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) self.__highlight.reset() # 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) self.__highlight.reset() # 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_gripStretch_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.selectedEntityGripPoints = [ ] # lista in cui ogni elemento è una entità + una lista di punti da stirare self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # getSelectedEntityGripPointNdx #============================================================================ def getSelectedEntityGripPointNdx(self, entity): # lista delle entityGripPoint con dei grip point selezionati # cerca la posizione di un'entità nella lista in cui ogni elemento è una entità + una lista di punti da stirare i = 0 tot = len(self.selectedEntityGripPoints) while i < tot: selectedEntityGripPoint = self.selectedEntityGripPoints[i] if selectedEntityGripPoint[0] == entity: return i i = i + 1 return -1 #============================================================================ # stretch #============================================================================ def stretch(self, entity, ptList, offSetX, offSetY, tolerance2ApproxCurve): # entity = entità da stirare # ptList = lista dei punti da stirare # offSetX, offSetY = spostamento da fare # tolerance2ApproxCurve = tolleranza per ricreare le curve # entitySet = gruppo di selezione delle entità da stirare # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": stretchedGeom = entity.gripGeomStretch(self.basePt, ptList, offSetX, offSetY, tolerance2ApproxCurve) if stretchedGeom is not None: self.__highlight.addGeometry(stretchedGeom, entity.layer) elif entity.whatIs() == "DIMENTITY": # stiro la quota entity.stretch(ptList, offSetX, offSetY) self.__highlight.addGeometry(entity.textualFeature.geometry(), entity.getTextualLayer()) self.__highlight.addGeometries( entity.getLinearGeometryCollection(), entity.getLinearLayer()) self.__highlight.addGeometries( entity.getSymbolGeometryCollection(), entity.getSymbolLayer()) #============================================================================ # addStretchedGeometries #============================================================================ def addStretchedGeometries(self, newPt): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate for selectedEntity in self.selectedEntityGripPoints: entity = selectedEntity[0] ptList = selectedEntity[1] layer = entity.layer tolerance2ApproxCurve = QadVariables.get( QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) offSetX = newPt.x() - self.basePt.x() offSetY = newPt.y() - self.basePt.y() # verifico se l'entità appartiene ad uno stile di quotatura if entity.isDimensionComponent() == False: self.stretch(entity, ptList, offSetX, offSetY, tolerance2ApproxCurve) else: dimEntity = QadDimEntity() if dimEntity.initByDimId(entity.dimStyle, entity.dimId): found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimEntitySet = dimEntity.getEntitySet() # creo un'unica lista contenente i grip points di tutti i componenti della quota dimPtlist = [] for layerEntitySet in dimEntitySet.layerEntitySetList: for featureId in layerEntitySet.featureIds: componentDim = QadEntity() componentDim.set(layerEntitySet.layer, featureId) i = self.getSelectedEntityGripPointNdx( componentDim) if i >= 0: dimPtlist.extend( self.selectedEntityGripPoints[i][1]) dimElaboratedList.append(dimEntity) self.stretch(dimEntity, dimPtlist, offSetX, offSetY, tolerance2ApproxCurve) 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.__highlight.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.__highlight.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_stretch_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # 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_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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # stretch #============================================================================ def stretch(self, entity, containerGeom, offSetX, offSetY, tolerance2ApproxCurve): # entity = entità da stirare # ptList = lista dei punti da stirare # offSetX, offSetY = spostamento da fare # tolerance2ApproxCurve = tolleranza per ricreare le curve # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": stretchedGeom = entity.getGeometry() # controllo inserito perchè con le quote, questa viene cancellata e ricreata quindi alcuni oggetti potrebbero non esistere più if stretchedGeom is None: # se non c'è lo salto senza errore return True # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy coordTransform = QgsCoordinateTransform( entity.layer.crs(), self.canvas.mapSettings().destinationCrs()) stretchedGeom.transform(coordTransform) # stiro la feature stretchedGeom = qad_stretch_fun.stretchQgsGeometry(stretchedGeom, containerGeom, \ offSetX, offSetY, \ tolerance2ApproxCurve) if stretchedGeom is not None: # trasformo la geometria nel crs del layer coordTransform = QgsCoordinateTransform( self.canvas.mapSettings().destinationCrs(), entity.layer.crs()) stretchedGeom.transform(coordTransform) self.__highlight.addGeometry(stretchedGeom, entity.layer) elif entity.whatIs() == "DIMENTITY": newDimEntity = QadDimEntity(entity) # la copio # stiro la quota newDimEntity.stretch(containerGeom, offSetX, offSetY) self.__highlight.addGeometry( newDimEntity.textualFeature.geometry(), newDimEntity.getTextualLayer()) self.__highlight.addGeometries( newDimEntity.getLinearGeometryCollection(), newDimEntity.getLinearLayer()) self.__highlight.addGeometries( newDimEntity.getSymbolGeometryCollection(), newDimEntity.getSymbolLayer()) return True #============================================================================ # addStretchedGeometries #============================================================================ def addStretchedGeometries(self, newPt): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate tolerance2ApproxCurve = QadVariables.get( QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) offSetX = newPt.x() - self.basePt.x() offSetY = newPt.y() - self.basePt.y() entity = QadEntity() for SSGeom in self.SSGeomList: # copio entitySet entitySet = QadEntitySet(SSGeom[0]) geomSel = SSGeom[1] for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer for featureId in layerEntitySet.featureIds: entity.set(layer, featureId) # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(entity) if dimEntity is None: self.stretch(entity, geomSel, offSetX, offSetY, tolerance2ApproxCurve) else: found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimElaboratedList.append(dimEntity) self.stretch(dimEntity, geomSel, offSetX, offSetY, tolerance2ApproxCurve) 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.__highlight.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.__highlight.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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # move #============================================================================ def move(self, entity, offSetX, offSetY): # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": # sposto l'entità movedGeom = qad_utils.moveQgsGeometry(entity.getGeometry(), offSetX, offSetY) if movedGeom is not None: self.__highlight.addGeometry(movedGeom, entity.layer) else: newDimEntity = QadDimEntity(entity) # la copio # sposto la quota newDimEntity.move(offSetX, offSetY) self.__highlight.addGeometry( newDimEntity.textualFeature.geometry(), newDimEntity.getTextualLayer()) self.__highlight.addGeometries( newDimEntity.getLinearGeometryCollection(), newDimEntity.getLinearLayer()) self.__highlight.addGeometries( newDimEntity.getSymbolGeometryCollection(), newDimEntity.getSymbolLayer()) def addMovedGeometries(self, newPt): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate entity = QadEntity() for layerEntitySet in self.entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapSettings( ).mapToLayerCoordinates(layer, self.basePt) transformedNewPt = self.canvas.mapSettings().mapToLayerCoordinates( layer, newPt) offSetX = transformedNewPt.x() - transformedBasePt.x() offSetY = transformedNewPt.y() - transformedBasePt.y() for featureId in layerEntitySet.featureIds: # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(layer, featureId) if dimEntity is None: entity.set(layer, featureId) f = layerEntitySet.getFeature(featureId) self.move(entity, offSetX, offSetY) else: found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimElaboratedList.append(dimEntity) self.move(dimEntity, offSetX, offSetY) 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.__highlight.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.__highlight.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.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # 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_mirror_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.firstMirrorPt = None self.entitySet = QadEntitySet() self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # mirror #============================================================================ def mirror(self, f, pt1, pt2, layerEntitySet, entitySet): # verifico se la feature appartiene ad una quotatura dimEntity = QadDimStyles.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.__highlight.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # specchio la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.mirror(pt1, qad_utils.getAngleBy2Pts(pt1, pt2)) self.__highlight.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__highlight.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__highlight.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) def setMirroredGeometries(self, newPt): self.__highlight.reset() # copio entitySet entitySet = QadEntitySet(self.entitySet) for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedFirstMirrorPt = self.canvas.mapSettings().mapToLayerCoordinates(layer, self.firstMirrorPt) transformedNewPtMirrorPt = self.canvas.mapSettings().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.__highlight.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.__highlight.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) self.__highlight.reset() # 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)
class Qad_copy_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.entitySet = QadEntitySet() self.seriesLen = 0 self.adjust = False self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # move #============================================================================ def move(self, f, offSetX, offSetY, layerEntitySet, entitySet, dimEntity): if dimEntity is None: # sposto la feature f.setGeometry( qad_utils.moveQgsGeometry(f.geometry(), offSetX, offSetY)) self.__highlight.addGeometry(f.geometry(), layerEntitySet.layer) else: # sposto la quota dimEntity.move(offSetX, offSetY) self.__highlight.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__highlight.addGeometries( dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__highlight.addGeometries( dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) def setCopiedGeometries(self, newPt): self.__highlight.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() entity = QadEntity() while len(layerEntitySet.featureIds) > 0: featureId = layerEntitySet.featureIds[0] f = layerEntitySet.getFeature(featureId) if f is None: del layerEntitySet.featureIds[0] continue # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(layer, f.id()) if self.seriesLen > 0: # devo fare una serie if self.adjust == True: offSetX = offSetX / (self.seriesLen - 1) offSetY = offSetY / (self.seriesLen - 1) deltaX = offSetX deltaY = offSetY for i in xrange(1, self.seriesLen, 1): self.move(f, deltaX, deltaY, layerEntitySet, entitySet, dimEntity) deltaX = deltaX + offSetX deltaY = deltaY + offSetY else: self.move(f, offSetX, offSetY, layerEntitySet, entitySet, dimEntity) # la rimuovo da entitySet if dimEntity is None: del layerEntitySet.featureIds[0] else: dimEntitySet = dimEntity.getEntitySet() entitySet.subtract(dimEntitySet) def canvasMoveEvent(self, event): QadGetPoint.canvasMoveEvent(self, event) # noto il punto base si richiede il secondo punto if self.mode == Qad_copy_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_COPY_PT: self.setCopiedGeometries(self.tmpPoint) def activate(self): QadGetPoint.activate(self) self.__highlight.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.__highlight.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_copy_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il punto base si richiede il secondo punto per l'angolo di rotazione elif self.mode == Qad_copy_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_COPY_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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # move #============================================================================ def move(self, entity, offSetX, offSetY): # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": # sposto l'entità movedGeom = qad_utils.moveQgsGeometry(entity.getGeometry(), offSetX, offSetY) if movedGeom is not None: self.__highlight.addGeometry(movedGeom, entity.layer) else: # sposto la quota entity.move(offSetX, offSetY) self.__highlight.addGeometry(entity.textualFeature.geometry(), entity.getTextualLayer()) self.__highlight.addGeometries(entity.getLinearGeometryCollection(), entity.getLinearLayer()) self.__highlight.addGeometries(entity.getSymbolGeometryCollection(), entity.getSymbolLayer()) def addMovedGeometries(self, newPt): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate entity = QadEntity() for layerEntitySet in self.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() for featureId in layerEntitySet.featureIds: # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(layer, featureId) if dimEntity is None: entity.set(layer, featureId) f = layerEntitySet.getFeature(featureId) self.move(entity, offSetX, offSetY) else: found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimElaboratedList.append(dimEntity) self.stretch(dimEntity, offSetX, offSetY) 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.__highlight.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.__highlight.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.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # 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_copy_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.entitySet = QadEntitySet() self.seriesLen = 0 self.adjust = False self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # move #============================================================================ def move(self, f, offSetX, offSetY, layerEntitySet, entitySet, dimEntity): if dimEntity is None: # sposto la feature f.setGeometry(qad_utils.moveQgsGeometry(f.geometry(), offSetX, offSetY)) self.__highlight.addGeometry(f.geometry(), layerEntitySet.layer) else: # sposto la quota dimEntity.move(offSetX, offSetY) self.__highlight.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__highlight.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__highlight.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) def setCopiedGeometries(self, newPt): self.__highlight.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() entity = QadEntity() while len(layerEntitySet.featureIds) > 0: featureId = layerEntitySet.featureIds[0] f = layerEntitySet.getFeature(featureId) if f is None: del layerEntitySet.featureIds[0] continue # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(layer, f.id()) if self.seriesLen > 0: # devo fare una serie if self.adjust == True: offSetX = offSetX / (self.seriesLen - 1) offSetY = offSetY / (self.seriesLen - 1) deltaX = offSetX deltaY = offSetY for i in xrange(1, self.seriesLen, 1): self.move(f, deltaX, deltaY, layerEntitySet, entitySet, dimEntity) deltaX = deltaX + offSetX deltaY = deltaY + offSetY else: self.move(f, offSetX, offSetY, layerEntitySet, entitySet, dimEntity) # la rimuovo da entitySet if dimEntity is None: del layerEntitySet.featureIds[0] else: dimEntitySet = dimEntity.getEntitySet() entitySet.subtract(dimEntitySet) def canvasMoveEvent(self, event): QadGetPoint.canvasMoveEvent(self, event) # noto il punto base si richiede il secondo punto if self.mode == Qad_copy_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_COPY_PT: self.setCopiedGeometries(self.tmpPoint) def activate(self): QadGetPoint.activate(self) self.__highlight.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.__highlight.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_copy_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il punto base si richiede il secondo punto per l'angolo di rotazione elif self.mode == Qad_copy_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_COPY_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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # scale #============================================================================ def scale(self, f, basePt, scale, layerEntitySet, entitySet): # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.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.__highlight.addGeometry(f.geometry(), layerEntitySet.layer) del layerEntitySet.featureIds[0] else: # scalo la quota e la rimuovo da entitySet dimEntitySet = dimEntity.getEntitySet() dimEntity.scale(basePt, scale) self.__highlight.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__highlight.addGeometries( dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__highlight.addGeometries( dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) #============================================================================ # addScaledGeometries #============================================================================ def addScaledGeometries(self, scale): self.__highlight.reset() # copio entitySet entitySet = QadEntitySet(self.entitySet) if scale <= 0: return for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapSettings( ).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.__highlight.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.__highlight.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.clear() self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # 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) self.__highlight.reset() # 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) self.__highlight.reset() # 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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # mirror #============================================================================ def mirror(self, f, pt1, pt2, layerEntitySet, entitySet): # verifico se la feature appartiene ad una quotatura dimEntity = QadDimStyles.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.__highlight.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.__highlight.addGeometry(dimEntity.textualFeature.geometry(), dimEntity.getTextualLayer()) self.__highlight.addGeometries(dimEntity.getLinearGeometryCollection(), dimEntity.getLinearLayer()) self.__highlight.addGeometries(dimEntity.getSymbolGeometryCollection(), dimEntity.getSymbolLayer()) entitySet.subtract(dimEntitySet) def setMirroredGeometries(self, newPt): self.__highlight.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.__highlight.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.__highlight.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) self.__highlight.reset() # 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)
class Qad_rotate_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.Pt1ReferenceAng = None self.ReferenceAng = 0 self.Pt1NewAng = None self.entitySet = QadEntitySet() self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # rotate #============================================================================ def rotate(self, entity, basePt, angle): # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": # ruoto l'entità rotatedGeom = qad_utils.rotateQgsGeometry(entity.getGeometry(), basePt, angle) if rotatedGeom is not None: self.__highlight.addGeometry(rotatedGeom, entity.layer) else: # ruoto la quota entity.rotate(basePt, angle) self.__highlight.addGeometry(entity.textualFeature.geometry(), entity.getTextualLayer()) self.__highlight.addGeometries(entity.getLinearGeometryCollection(), entity.getLinearLayer()) self.__highlight.addGeometries(entity.getSymbolGeometryCollection(), entity.getSymbolLayer()) #============================================================================ # addRotatedGeometries #============================================================================ def addRotatedGeometries(self, angle): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate entity = QadEntity() for layerEntitySet in self.entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapSettings().mapToLayerCoordinates(layer, self.basePt) for featureId in layerEntitySet.featureIds: # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(layer, featureId) if dimEntity is None: entity.set(layer, featureId) self.rotate(entity, transformedBasePt, angle) else: found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimElaboratedList.append(dimEntity) self.rotate(dimEntity, transformedBasePt, angle) 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_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_ROTATION_PT: angle = qad_utils.getAngleBy2Pts(self.basePt, self.tmpPoint) self.addRotatedGeometries(angle) # noto il punto base si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_NEW_ROTATION_PT: angle = qad_utils.getAngleBy2Pts(self.basePt, self.tmpPoint) diffAngle = angle - self.ReferenceAng self.addRotatedGeometries(diffAngle) # noto il primo punto si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_NEW_ROTATION_PT: angle = qad_utils.getAngleBy2Pts(self.Pt1NewAng, self.tmpPoint) diffAngle = angle - self.ReferenceAng self.addRotatedGeometries(diffAngle) def activate(self): QadGetPoint.activate(self) self.__highlight.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.__highlight.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_rotate_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # noto il punto base si richiede il secondo punto per l'angolo di rotazione elif self.mode == Qad_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt) # si richiede il primo punto per l'angolo di riferimento elif self.mode == Qad_rotate_maptool_ModeEnum.ASK_FOR_FIRST_PT_REFERENCE_ANG: self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # noto il primo punto si richiede il secondo punto per l'angolo di riferimento elif self.mode == Qad_rotate_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT_REFERENCE_ANG: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.Pt1ReferenceAng) # noto il punto base si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_NEW_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt) # si richiede il primo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.ASK_FOR_FIRST_NEW_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il primo punto si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_NEW_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.Pt1NewAng)
class Qad_rotate_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.Pt1ReferenceAng = None self.ReferenceAng = 0 self.Pt1NewAng = None self.entitySet = QadEntitySet() self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # rotate #============================================================================ def rotate(self, entity, basePt, angle): # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": # ruoto l'entità rotatedGeom = qad_utils.rotateQgsGeometry(entity.getGeometry(), basePt, angle) if rotatedGeom is not None: self.__highlight.addGeometry(rotatedGeom, entity.layer) else: # ruoto la quota entity.rotate(basePt, angle) self.__highlight.addGeometry(entity.textualFeature.geometry(), entity.getTextualLayer()) self.__highlight.addGeometries(entity.getLinearGeometryCollection(), entity.getLinearLayer()) self.__highlight.addGeometries(entity.getSymbolGeometryCollection(), entity.getSymbolLayer()) #============================================================================ # addRotatedGeometries #============================================================================ def addRotatedGeometries(self, angle): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate entity = QadEntity() for layerEntitySet in self.entitySet.layerEntitySetList: layer = layerEntitySet.layer transformedBasePt = self.canvas.mapSettings().mapToLayerCoordinates(layer, self.basePt) for featureId in layerEntitySet.featureIds: # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(layer, featureId) if dimEntity is None: entity.set(layer, featureId) self.rotate(entity, transformedBasePt, angle) else: found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimElaboratedList.append(dimEntity) self.rotate(dimEntity, transformedBasePt, angle) 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_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_ROTATION_PT: angle = qad_utils.getAngleBy2Pts(self.basePt, self.tmpPoint) self.addRotatedGeometries(angle) # noto il punto base si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_NEW_ROTATION_PT: angle = qad_utils.getAngleBy2Pts(self.basePt, self.tmpPoint) diffAngle = angle - self.ReferenceAng self.addRotatedGeometries(diffAngle) # noto il primo punto si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_NEW_ROTATION_PT: angle = qad_utils.getAngleBy2Pts(self.Pt1NewAng, self.tmpPoint) diffAngle = angle - self.ReferenceAng self.addRotatedGeometries(diffAngle) def activate(self): QadGetPoint.activate(self) self.__highlight.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.__highlight.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_rotate_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # noto il punto base si richiede il secondo punto per l'angolo di rotazione elif self.mode == Qad_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt) # si richiede il primo punto per l'angolo di riferimento elif self.mode == Qad_rotate_maptool_ModeEnum.ASK_FOR_FIRST_PT_REFERENCE_ANG: self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # noto il primo punto si richiede il secondo punto per l'angolo di riferimento elif self.mode == Qad_rotate_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT_REFERENCE_ANG: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.Pt1ReferenceAng) # noto il punto base si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.BASE_PT_KNOWN_ASK_FOR_NEW_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.basePt) # si richiede il primo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.ASK_FOR_FIRST_NEW_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.NONE) # noto il primo punto si richiede il secondo punto per il nuovo angolo elif self.mode == Qad_rotate_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_NEW_ROTATION_PT: self.setDrawMode(QadGetPointDrawModeEnum.ELASTIC_LINE) self.setStartPoint(self.Pt1NewAng)
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.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # stretch #============================================================================ def stretch(self, entity, containerGeom, offSetX, offSetY, tolerance2ApproxCurve): # entity = entità da stirare # ptList = lista dei punti da stirare # offSetX, offSetY = spostamento da fare # tolerance2ApproxCurve = tolleranza per ricreare le curve # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": stretchedGeom = entity.getGeometry() # controllo inserito perchè con le quote, questa viene cancellata e ricreata quindi alcuni oggetti potrebbero non esistere più if stretchedGeom is None: # se non c'è lo salto senza errore return True # trasformo la geometria nel crs del canvas per lavorare con coordinate piane xy coordTransform = QgsCoordinateTransform(entity.layer.crs(), self.canvas.mapSettings().destinationCrs()) stretchedGeom.transform(coordTransform) # stiro la feature stretchedGeom = qad_stretch_fun.stretchQgsGeometry(stretchedGeom, containerGeom, \ offSetX, offSetY, \ tolerance2ApproxCurve) if stretchedGeom is not None: # trasformo la geometria nel crs del layer coordTransform = QgsCoordinateTransform(self.canvas.mapSettings().destinationCrs(), entity.layer.crs()) stretchedGeom.transform(coordTransform) self.__highlight.addGeometry(stretchedGeom, entity.layer) elif entity.whatIs() == "DIMENTITY": newDimEntity = QadDimEntity(entity) # la copio # stiro la quota newDimEntity.stretch(containerGeom, offSetX, offSetY) self.__highlight.addGeometry(newDimEntity.textualFeature.geometry(), newDimEntity.getTextualLayer()) self.__highlight.addGeometries(newDimEntity.getLinearGeometryCollection(), newDimEntity.getLinearLayer()) self.__highlight.addGeometries(newDimEntity.getSymbolGeometryCollection(), newDimEntity.getSymbolLayer()) return True #============================================================================ # addStretchedGeometries #============================================================================ def addStretchedGeometries(self, newPt): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate tolerance2ApproxCurve = QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) offSetX = newPt.x() - self.basePt.x() offSetY = newPt.y() - self.basePt.y() entity = QadEntity() for SSGeom in self.SSGeomList: # copio entitySet entitySet = QadEntitySet(SSGeom[0]) geomSel = SSGeom[1] for layerEntitySet in entitySet.layerEntitySetList: layer = layerEntitySet.layer for featureId in layerEntitySet.featureIds: entity.set(layer, featureId) # verifico se l'entità appartiene ad uno stile di quotatura dimEntity = QadDimStyles.getDimEntity(entity) if dimEntity is None: self.stretch(entity, geomSel, offSetX, offSetY, tolerance2ApproxCurve) else: found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimElaboratedList.append(dimEntity) self.stretch(dimEntity, geomSel, offSetX, offSetY, tolerance2ApproxCurve) 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.__highlight.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.__highlight.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_gripStretch_maptool(QadGetPoint): def __init__(self, plugIn): QadGetPoint.__init__(self, plugIn) self.basePt = None self.selectedEntityGripPoints = [] # lista in cui ogni elemento è una entità + una lista di punti da stirare self.__highlight = QadHighlight(self.canvas) def hidePointMapToolMarkers(self): QadGetPoint.hidePointMapToolMarkers(self) self.__highlight.hide() def showPointMapToolMarkers(self): QadGetPoint.showPointMapToolMarkers(self) self.__highlight.show() def clear(self): QadGetPoint.clear(self) self.__highlight.reset() self.mode = None #============================================================================ # getSelectedEntityGripPointNdx #============================================================================ def getSelectedEntityGripPointNdx(self, entity): # lista delle entityGripPoint con dei grip point selezionati # cerca la posizione di un'entità nella lista in cui ogni elemento è una entità + una lista di punti da stirare i = 0 tot = len(self.selectedEntityGripPoints) while i < tot: selectedEntityGripPoint = self.selectedEntityGripPoints[i] if selectedEntityGripPoint[0] == entity: return i i = i + 1 return -1 #============================================================================ # stretch #============================================================================ def stretch(self, entity, ptList, offSetX, offSetY, tolerance2ApproxCurve): # entity = entità da stirare # ptList = lista dei punti da stirare # offSetX, offSetY = spostamento da fare # tolerance2ApproxCurve = tolleranza per ricreare le curve # entitySet = gruppo di selezione delle entità da stirare # verifico se l'entità appartiene ad uno stile di quotatura if entity.whatIs() == "ENTITY": stretchedGeom = entity.gripGeomStretch(self.basePt, ptList, offSetX, offSetY, tolerance2ApproxCurve) if stretchedGeom is not None: self.__highlight.addGeometry(stretchedGeom, entity.layer) elif entity.whatIs() == "DIMENTITY": # stiro la quota entity.stretch(ptList, offSetX, offSetY) self.__highlight.addGeometry(entity.textualFeature.geometry(), entity.getTextualLayer()) self.__highlight.addGeometries(entity.getLinearGeometryCollection(), entity.getLinearLayer()) self.__highlight.addGeometries(entity.getSymbolGeometryCollection(), entity.getSymbolLayer()) #============================================================================ # addStretchedGeometries #============================================================================ def addStretchedGeometries(self, newPt): self.__highlight.reset() dimElaboratedList = [] # lista delle quotature già elaborate for selectedEntity in self.selectedEntityGripPoints: entity = selectedEntity[0] ptList = selectedEntity[1] layer = entity.layer tolerance2ApproxCurve = QadVariables.get(QadMsg.translate("Environment variables", "TOLERANCE2APPROXCURVE")) offSetX = newPt.x() - self.basePt.x() offSetY = newPt.y() - self.basePt.y() # verifico se l'entità appartiene ad uno stile di quotatura if entity.isDimensionComponent() == False: self.stretch(entity, ptList, offSetX, offSetY, tolerance2ApproxCurve) else: dimEntity = QadDimEntity() if dimEntity.initByDimId(entity.dimStyle, entity.dimId): found = False for dimElaborated in dimElaboratedList: if dimElaborated == dimEntity: found = True if found == False: # quota non ancora elaborata dimEntitySet = dimEntity.getEntitySet() # creo un'unica lista contenente i grip points di tutti i componenti della quota dimPtlist = [] for layerEntitySet in dimEntitySet.layerEntitySetList: for featureId in layerEntitySet.featureIds: componentDim = QadEntity() componentDim.set(layerEntitySet.layer, featureId) i = self.getSelectedEntityGripPointNdx(componentDim) if i >= 0: dimPtlist.extend(self.selectedEntityGripPoints[i][1]) dimElaboratedList.append(dimEntity) self.stretch(dimEntity, dimPtlist, offSetX, offSetY, tolerance2ApproxCurve) 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.__highlight.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.__highlight.hide() except: pass def setMode(self, mode): self.mode = mode # noto niente si richiede il punto base if self.mode == Qad_stretch_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_BASE_PT: self.setSelectionMode(QadGetPointSelectionModeEnum.POINT_SELECTION) self.setDrawMode(QadGetPointDrawModeEnum.NONE) self.__highlight.reset() # 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)