def waitForTotalAngle(self, msgMapTool, msg): self.step = 9 self.OpType = "Angle" # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter total angle <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.plugIn.lastTotalAngle_lengthen))) self.GetAngleClass.angle = self.plugIn.lastTotalAngle_lengthen self.GetAngleClass.run(msgMapTool, msg)
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nIl sistema di riferimento del progetto deve essere un sistema di coordinate proiettate.\n")) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isSymbolLayer(currLayer) == False: errMsg = QadMsg.translate("QAD", "\nIl layer corrente non é di tipo simbolo.") errMsg = errMsg + QadMsg.translate("QAD", "\nUn layer simbolo é un layer vettoriale di tipo punto senza etichetta.\n") self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se la scala dipende da un campo scaleFldName = qad_layer.get_symbolScaleFieldName(currLayer) if len(scaleFldName) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specificare la scala del simbolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.scale)) self.GetDistClass.dist = self.scale self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(currLayer) if len(rotFldName) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specificare la rotazione del simbolo <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.addFeature(currLayer) return True #========================================================================= # RISPOSTA ALLA RICHIESTA SCALA (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.scale = self.GetDistClass.dist self.plugIn.setLastScale(self.scale) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(currLayer) if len(rotFldName) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specificare la rotazione del simbolo <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.addFeature(currLayer) return True # fine comando else: return True return False
class QadTEXTCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadTEXTCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "TEXT") def getEnglishName(self): return "TEXT" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runTEXTCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/text.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_TEXT", "Inserts a text.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.insPt = None self.hText = self.plugIn.lastHText self.rot = self.plugIn.lastRot self.GetDistClass = None self.GetAngleClass = None self.labelFields = None self.labelFieldNamesNdx = 0 self.labelFieldValues = [] def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): # quando si éin fase di richiesta distanza (altezza testo) if self.step == 2: return self.GetDistClass.getPointMapTool() # quando si éin fase di richiesta rotazione elif self.step == 3: return self.GetAngleClass.getPointMapTool() else: return QadCommandClass.getPointMapTool(self, drawMode) def addFeature(self, layer): transformedPoint = self.mapToLayerCoordinates(layer, self.insPt) g = QgsGeometry.fromPoint(transformedPoint) f = QgsFeature() f.setGeometry(g) # Add attribute fields to feature. fields = layer.pendingFields() f.setFields(fields) # assegno i valori di default provider = layer.dataProvider() for field in fields.toList(): i = fields.indexFromName(field.name()) f[field.name()] = provider.defaultValue(i) # se l'altezza testo dipende da un solo campo sizeFldNames = qad_label.get_labelSizeFieldNames(layer) if len(sizeFldNames) == 1 and len(sizeFldNames[0]) > 0: f.setAttribute(sizeFldNames[0], self.hText) # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(layer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: f.setAttribute(rotFldNames[0], qad_utils.toDegrees(self.rot)) # setto i valori degli attributi che compongono l'etichetta i = 0 tot = len(self.labelFields) while i < tot: f.setAttribute(self.labelFields[i].name(), self.labelFieldValues[i]) i = i + 1 return qad_layer.addFeatureToLayer(self.plugIn, layer, f) def initLabelFields(self, layer): labelFieldNames = qad_label.get_labelFieldNames(layer) if len(labelFieldNames) > 0: self.labelFields = QgsFields() for field in layer.dataProvider().fields(): if field.name() in labelFieldNames: self.labelFields.append(QgsField(field.name(), field.type())) #============================================================================ # waitForFieldValue #============================================================================ def waitForFieldValue(self): self.step = 4 if self.labelFields is None: return False if self.labelFieldNamesNdx >= len(self.labelFields): return False field = self.labelFields[self.labelFieldNamesNdx] prompt = QadMsg.translate("Command_TEXT", "Enter the value of attribute \"{0}\": ").format(field.name()) if field.type() == QVariant.Double: # si appresta ad attendere un double o valore nullo self.waitForFloat(prompt, None, QadInputModeEnum.NONE) elif field.type() == QVariant.LongLong: # si appresta ad attendere un long a 64 bit o valore nullo self.waitForLong(prompt, None, QadInputModeEnum.NONE) elif field.type() == QVariant.Int: # si appresta ad attendere un integer o valore nullo self.waitForInt(prompt, None, QadInputModeEnum.NONE) elif field.type() == QVariant.Bool: # si appresta ad attendere un boolean o valore nullo self.waitForBool(prompt, None, QadInputModeEnum.NONE) else: # si appresta ad attendere una stringa o valore nullo self.waitForString(prompt, None, QadInputModeEnum.NONE) return True def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isTextLayer(currLayer) == False: errMsg = QadMsg.translate("QAD", "\nCurrent layer is not a textual layer.") errMsg = errMsg + QadMsg.translate("QAD", "\nA textual layer is a vector punctual layer having a label and the symbol transparency no more than 10%.\n") self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # éstato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool éstato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se l'altezza testo dipende da un solo campo sizeFldNames = qad_label.get_labelSizeFieldNames(currLayer) if len(sizeFldNames) == 1 and len(sizeFldNames[0]) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text height <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.hText)) self.GetDistClass.dist = self.hText self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ALTEZZA TESTO (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.hText = self.GetDistClass.dist self.plugIn.setLastHText(self.hText) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL VALORE DI UN CAMPO elif self.step == 4: # dopo aver atteso un valore si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica self.waitForFieldValue() return False # il valore arriva come parametro della funzione self.labelFieldValues.append(msg) self.labelFieldNamesNdx = self.labelFieldNamesNdx + 1 if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando return False
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isTextLayer(currLayer) == False: errMsg = QadMsg.translate("QAD", "\nCurrent layer is not a textual layer.") errMsg = errMsg + QadMsg.translate("QAD", "\nA textual layer is a vector punctual layer having a label and the symbol transparency no more than 10%.\n") self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # éstato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool éstato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se l'altezza testo dipende da un solo campo sizeFldNames = qad_label.get_labelSizeFieldNames(currLayer) if len(sizeFldNames) == 1 and len(sizeFldNames[0]) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text height <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.hText)) self.GetDistClass.dist = self.hText self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ALTEZZA TESTO (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.hText = self.GetDistClass.dist self.plugIn.setLastHText(self.hText) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL VALORE DI UN CAMPO elif self.step == 4: # dopo aver atteso un valore si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica self.waitForFieldValue() return False # il valore arriva come parametro della funzione self.labelFieldValues.append(msg) self.labelFieldNamesNdx = self.labelFieldNamesNdx + 1 if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando return False
class QadLENGTHENCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadLENGTHENCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "LENGTHEN") def getEnglishName(self): return "LENGTHEN" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runLENGTHENCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/lengthen.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_LENGTHEN", "Lengthen an object.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.OpMode = plugIn.lastOpMode_lengthen # "DElta" o "Percent" o "Total" o "DYnamic" self.OpType = None # "length" o "Angle" self.value = None self.startPt = None self.GetDistClass = None self.GetAngleClass = None self.entity = QadEntity() self.linearObjectList = None self.atSubGeom = None self.move_startPt = None self.nOperationsToUndo = 0 def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 3: # quando si é in fase di richiesta distanza return self.GetDistClass.getPointMapTool() if self.step == 4: # quando si é in fase di richiesta angolo return self.GetAngleClass.getPointMapTool() elif (self.plugIn is not None): if self.PointMapTool is None: self.PointMapTool = Qad_lengthen_maptool(self.plugIn) return self.PointMapTool else: return None def setInfo(self, entity, point): # setta: self.entity, self.linearObjectList, self.atSubGeom e self.move_startPt if self.linearObjectList is not None: del self.linearObjectList self.linearObjectList = None self.entity.set(entity.layer, entity.featureId) transformedPt = self.mapToLayerCoordinates(self.entity.layer, point) f = self.entity.getFeature() geom = self.entity.getGeometry() # ritorna una tupla (<The squared cartesian distance>, # <minDistPoint> # <afterVertex> # <leftOf>) res = False 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, 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(), transformedPt) <= \ qad_utils.getDistance(self.linearObjectList.getEndPt(), transformedPt): # si allunga dal punto iniziale self.move_startPt = True else: # si allunga dal punto finale self.move_startPt = False return True #============================================================================ # lengthen #============================================================================ 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 showLength(self, entity, pt): # visualizza la lunghezza dell'entità in unità di mappa geom = entity.getGeometry() if geom is None: self.showErr(QadMsg.translate("QAD", "\nInvalid object.")) 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: self.showErr(QadMsg.translate("QAD", "\nInvalid object.")) 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 waitForObjectSelToMisure(self): self.step = 1 # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_OBJ_TO_MISURE) if self.plugIn.lastOpMode_lengthen == "DElta": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "DElta") elif self.plugIn.lastOpMode_lengthen == "Percent": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "Percent") elif self.plugIn.lastOpMode_lengthen == "Total": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "Total") elif self.plugIn.lastOpMode_lengthen == "DYnamic": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "DYnamic") else: self.defaultValue = None keyWords = QadMsg.translate("Command_LENGTHEN", "DElta") + "/" + \ QadMsg.translate("Command_LENGTHEN", "Percent") + "/" + \ QadMsg.translate("Command_LENGTHEN", "Total") + "/" + \ QadMsg.translate("Command_LENGTHEN", "DYnamic") if self.defaultValue is None: prompt = QadMsg.translate("Command_LENGTHEN", "Select an object or [{0}] <{1}>: ").format(keyWords, self.defaultValue) else: prompt = QadMsg.translate("Command_LENGTHEN", "Select an object or [{0}] <{1}>: ").format(keyWords, self.defaultValue) englishKeyWords = "DElta" + "/" + "Percent" + "/" + "Total" + "/" + "DYnamic" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) def waitForDelta(self): self.step = 2 self.OpMode = "DElta" self.plugIn.setLastOpMode_lengthen(self.OpMode) # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_DELTA) keyWords = QadMsg.translate("Command_LENGTHEN", "Angle") prompt = QadMsg.translate("Command_LENGTHEN", "Enter delta length or [{0}] <{1}>: ").format(keyWords, str(self.plugIn.lastDelta_lengthen)) englishKeyWords = "Angle" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS | QadInputTypeEnum.FLOAT, \ self.plugIn.lastDelta_lengthen, \ keyWords, QadInputModeEnum.NONE) def waitForDeltaLength(self, msgMapTool, msg): self.step = 3 self.OpType = "length" # si appresta ad attendere una distanza if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter delta length <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.plugIn.lastDelta_lengthen)) self.GetDistClass.startPt = self.startPt self.GetDistClass.dist = self.plugIn.lastDelta_lengthen self.GetDistClass.inputMode = QadInputModeEnum.NONE self.GetDistClass.run(msgMapTool, msg) def waitForDeltaAngle(self, msgMapTool, msg): self.step = 4 self.OpType = "Angle" # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter delta angle <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.plugIn.lastDeltaAngle_lengthen))) self.GetAngleClass.angle = self.plugIn.lastDeltaAngle_lengthen self.GetAngleClass.run(msgMapTool, msg) def waitForObjectSel(self): self.step = 5 # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_OBJ_TO_LENGTHEN) self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza o angolo self.getPointMapTool().OpType = self.OpType self.getPointMapTool().value = self.value keyWords = QadMsg.translate("Command_LENGTHEN", "Undo") prompt = QadMsg.translate("Command_LENGTHEN", "Select an object to change or [{0}]: ").format(QadMsg.translate("Command_LENGTHEN", "Undo")) englishKeyWords = "Undo" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) def waitForPercent(self): self.step = 6 self.OpMode = "Percent" self.plugIn.setLastOpMode_lengthen(self.OpMode) # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_PERCENT) prompt = QadMsg.translate("Command_LENGTHEN", "Enter percentage length <{0}>: ") prompt = prompt.format(str(self.plugIn.lastPerc_lengthen)) # si appresta ad attendere un numero reale # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.FLOAT, \ self.plugIn.lastPerc_lengthen, "", \ QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) def waitForTotal(self): self.step = 7 self.OpMode = "Total" self.plugIn.setLastOpMode_lengthen(self.OpMode) # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_TOTAL) keyWords = QadMsg.translate("Command_LENGTHEN", "Angle") prompt = QadMsg.translate("Command_LENGTHEN", "Specify total length or [{0}] <{1}>: ").format(keyWords, str(self.plugIn.lastTotal_lengthen)) englishKeyWords = "Angle" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS | QadInputTypeEnum.FLOAT, \ self.plugIn.lastTotal_lengthen, \ keyWords, QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) def waitForTotalLength(self, msgMapTool, msg): self.step = 8 self.OpType = "length" # si appresta ad attendere una distanza if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter total length <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.plugIn.lastTotal_lengthen)) self.GetDistClass.startPt = self.startPt self.GetDistClass.dist = self.plugIn.lastTotal_lengthen self.GetDistClass.inputMode = QadInputModeEnum.NONE self.GetDistClass.run(msgMapTool, msg) def waitForTotalAngle(self, msgMapTool, msg): self.step = 9 self.OpType = "Angle" # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter total angle <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.plugIn.lastTotalAngle_lengthen))) self.GetAngleClass.angle = self.plugIn.lastTotalAngle_lengthen self.GetAngleClass.run(msgMapTool, msg) def waitForDynamicPt(self): self.step = 10 # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_DYNAMIC_POINT) prompt = QadMsg.translate("Command_LENGTHEN", "Specify new endpoint: ") # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D, \ None, \ "", QadInputModeEnum.NONE) #============================================================================ # run #============================================================================ def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE OGGETTO if self.step == 0: # inizio del comando # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSelToMisure() return False #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI DA MISURARE elif self.step == 1: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "DElta") or value == "DElta": self.waitForDelta() return False elif value == QadMsg.translate("Command_LENGTHEN", "Percent") or value == "Percent": self.waitForPercent() return False elif value == QadMsg.translate("Command_LENGTHEN", "Total") or value == "Total": self.waitForTotal() return False elif value == QadMsg.translate("Command_LENGTHEN", "DYnamic") or value == "DYnamic": self.OpMode = "DYnamic" self.plugIn.setLastOpMode_lengthen(self.OpMode) # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False elif type(value) == QgsPoint: # se é stato selezionato un punto if self.getPointMapTool().entity.isInitialized(): self.showLength(self.getPointMapTool().entity, value) else: # cerco se ci sono entità nel punto indicato considerando # solo layer di tipo lineari che non appartengano a quote o di tipo poligono layerList = [] for layer in self.plugIn.canvas.layers(): if layer.type() == QgsMapLayer.VectorLayer and \ layer.geometryType() == QGis.Line or layer.geometryType() == QGis.Polygon: if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) result = qad_utils.getEntSel(self.getPointMapTool().toCanvasCoordinates(value), self.getPointMapTool(), \ layerList) if result is not None: feature = result[0] layer = result[1] self.showLength(QadEntity().set(layer, feature.id()), value) else: return True # fine comando # si appresta ad attendere la selezione degli oggetti da misurare self.waitForObjectSelToMisure() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL DELTA (da step = 1) elif self.step == 2: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.plugIn.lastDelta_lengthen # opzione di default "spostamento" else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "Angle") or value == "Angle": self.waitForDeltaAngle(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito un punto self.startPt = value self.waitForDeltaLength(msgMapTool, msg) elif type(value) == float: # se é stato inserito il delta self.plugIn.setLastDelta_lengthen(value) self.OpType = "length" self.value = value # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LUNGHEZZA DEL DELTA (da step = 2) elif self.step == 3: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.plugIn.setLastDelta_lengthen(self.GetDistClass.dist) self.value = self.GetDistClass.dist # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() #========================================================================= # RISPOSTA ALLA RICHIESTA DELL'ANGOLO DEL DELTA (da step = 2) elif self.step == 4: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.plugIn.setLastDeltaAngle_lengthen(self.GetAngleClass.angle) self.value = self.GetAngleClass.angle # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI DA ALLUNGARE elif self.step == 5: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif type(value) == QgsPoint: # se é stato selezionato un punto if self.getPointMapTool().entity.isInitialized(): self.setInfo(self.getPointMapTool().entity, value) if self.OpMode != "DYnamic": self.lengthen(value) else: self.waitForDynamicPt() return False else: # cerco se ci sono entità nel punto indicato considerando # solo layer lineari editabili che non appartengano a quote layerList = [] for layer in self.plugIn.canvas.layers(): if layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Line and \ layer.isEditable(): if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) result = qad_utils.getEntSel(self.getPointMapTool().toCanvasCoordinates(value), self.getPointMapTool(), \ layerList) if result is not None: feature = result[0] layer = result[1] self.setInfo(QadEntity().set(layer, feature.id()), value) if self.OpMode != "DYnamic": self.lengthen(value) else: self.waitForDynamicPt() return False else: return True # fine comando # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PERCENTUALE (da step = 1) elif self.step == 6: # dopo aver atteso un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.plugIn.lastPerc_lengthen else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: return False else: # il punto arriva come parametro della funzione value = msg if type(value) == float: # é stata inserita la percentuale self.plugIn.setLastPerc_lengthen(value) self.value = value # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL TOTALE (da step = 1) elif self.step == 7: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.plugIn.lastTotal_lengthen else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "Angle") or value == "Angle": self.waitForTotalAngle(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito un punto self.startPt = value self.waitForTotalLength(msgMapTool, msg) elif type(value) == float: # se é stato inserito il delta self.plugIn.setLastTotal_lengthen(value) self.OpType = "length" self.value = value # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LUNGHEZZA DEL TOTALE (da step = 7) elif self.step == 8: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.plugIn.setLastTotal_lengthen(self.GetDistClass.dist) self.value = self.GetDistClass.dist # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELL'ANGOLO DEL DELTA (da step = 7) elif self.step == 9: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.plugIn.setLastTotalAngle_lengthen(self.GetAngleClass.angle) self.value = self.GetAngleClass.angle # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA NUOVA ESTREMITA' IN MODO DINAMICO (da step = 5) elif self.step == 10: # dopo aver atteso un punto if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == QgsPoint: # se é stato inserito un punto self.lengthen(value) # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando if self.dimStyle is None: self.showMsg(QadMsg.translate("QAD", "\nDimension style not valid.\nVerify the value of DIMSTYLE variable.\n")) return True # fine comando errMsg = self.dimStyle.getInValidErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando errMsg = self.dimStyle.getNotGraphEditableErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE ARCO DA QUOTARE if self.step == 0: # inizio del comando self.waitForEntsel(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA SELEZIONE DI UN'ENTITA' (da step = 0) elif self.step == 1: if self.EntSelClass.run(msgMapTool, msg) == True: if self.EntSelClass.entity.isInitialized(): result = getStartEndPointClosestPartWithContext(self.EntSelClass.entity, \ self.EntSelClass.point, \ self.plugIn.canvas.mapRenderer().destinationCrs()) if result is not None: if (type(result) != list and type(result) != tuple): # se non é una lista di 2 punti objType = result.whatIs() if objType == "ARC": # se é arco self.dimArc = result return False self.showMsg(QadMsg.translate("Command_DIM", "Select an arc.")) self.waitForEntsel(msgMapTool, msg) else: self.showMsg(QadMsg.translate("Command_DIM", "No geometries in this position.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ORIGINE SECONDA LINEA DI ESTENSIONE (da step = 1) elif self.step == 3: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if value is None: return True if type(value) == QgsPoint: # se é stato inserito il secondo punto self.dimPt2.set(value.x(), value.y()) self.waitForDimensionLinePos() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA POSIZIONE DELLA LINEA DI QUOTA (da step = 2 e 3) elif self.step == 4: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_DIM", "Text") or value == "Text": prompt = QadMsg.translate("Command_DIM", "Enter dimension text <{0}>: ") dist = qad_utils.getDistance(self.dimPt1, self.dimPt2) self.waitForString(prompt.format(str(dist)), dist) self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.ASK_FOR_TEXT) self.step = 5 elif value == QadMsg.translate("Command_DIM", "Angle") or value == "Angle": # si appresta ad attendere l'angolo di rotazione del testo if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_DIM", "Specify angle of dimension text <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.dimStyle.textForcedRot))) self.GetAngleClass.angle = self.dimStyle.textForcedRot self.step = 6 self.GetAngleClass.run(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito il punto di posizionamento linea quota self.dimPt1 = self.getPointMapTool().dimPt1 self.dimPt2 = self.getPointMapTool().dimPt2 self.addDimToLayers(value) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL TESTO (da step = 4) elif self.step == 5: # dopo aver atteso una stringa si riavvia il comando if type(msg) == unicode: text = msg.strip() if len(text) > 0: self.measure = text self.getPointMapTool().measure = self.measure self.waitForDimensionLinePos() return False
class QadDIMLINEARCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadDIMLINEARCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "DIMLINEARE") def getEnglishName(self): return "DIMLINEAR" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runDIMLINEARCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/dimLinear.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_DIM", "Crea una quota lineare orizzontale o verticale.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.EntSelClass = None self.GetAngleClass = None self.dimPt1 = QgsPoint() # primo punto di quotatura esplicito self.dimPt2 = QgsPoint() # secondo punto di quotatura esplicito self.dimCircle = None # oggetto cerchio da quotare self.measure = None # misura della quota (se None viene calcolato) self.preferredAlignment = QadDimStyleAlignmentEnum.HORIZONTAL # allineamento della linea di quota # leggo lo stile di quotatura corrente dimStyleName = QadVariables.get(QadMsg.translate("Environment variables", "DIMSTYLE")) self.forcedDimLineAlignment = None # allineamento della linea di quota forzato self.forcedDimLineRot = 0.0 # rotazione della linea di quota forzato _dimStyle = self.plugIn.dimStyles.findDimStyle(dimStyleName) if _dimStyle is not None: self.dimStyle = QadDimStyle(_dimStyle) # ne faccio una copia perché può venire modificato dal comando self.dimStyle.dimType = QadDimTypeEnum.LINEAR else: self.dimStyle = None def __del__(self): QadCommandClass.__del__(self) if self.EntSelClass is not None: self.EntSelClass.entity.deselectOnLayer() del self.EntSelClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 2: # quando si é in fase di selezione entità return self.EntSelClass.getPointMapTool(drawMode) # quando si é in fase di richiesta rotazione elif self.step == 6 or self.step == 7: return self.GetAngleClass.getPointMapTool() else: if (self.plugIn is not None): if self.PointMapTool is None: self.PointMapTool = Qad_dim_maptool(self.plugIn) return self.PointMapTool else: return None #============================================================================ # addDimToLayers #============================================================================ def addDimToLayers(self, linePosPt): return self.dimStyle.addLinearDimToLayers(self.plugIn, self.dimPt1, self.dimPt2, \ linePosPt, self.measure, self.preferredAlignment, \ self.forcedDimLineRot) #============================================================================ # waitForFirstPt #============================================================================ def waitForFirstPt(self): self.step = 1 # imposto il map tool self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_PT) msg = QadMsg.translate("Command_DIM", "Specificare l'origine della prima linea di estensione o <seleziona oggetto>: ") # si appresta ad attendere un punto o enter # msg, inputType, default, keyWords, nessun controllo self.waitFor(msg, \ QadInputTypeEnum.POINT2D, \ None, \ "", QadInputModeEnum.NONE) #============================================================================ # waitForSecondPt #============================================================================ def waitForSecondPt(self): self.step = 3 # imposto il map tool self.getPointMapTool().dimPt1 = self.dimPt1 self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.FIRST_PT_KNOWN_ASK_FOR_SECOND_PT) # si appresta ad attendere un punto self.waitForPoint(QadMsg.translate("Command_DIM", "Specificare l'origine della seconda linea di estensione: ")) #============================================================================ # waitForEntsel #============================================================================ def waitForEntsel(self, msgMapTool, msg): if self.EntSelClass is not None: del self.EntSelClass self.step = 2 self.EntSelClass = QadEntSelClass(self.plugIn) self.EntSelClass.msg = QadMsg.translate("Command_DIM", "Selezionare l'oggetto da quotare: ") # scarto la selezione di punti self.EntSelClass.checkPointLayer = False self.EntSelClass.checkLineLayer = True self.EntSelClass.checkPolygonLayer = True self.EntSelClass.getPointMapTool().setSnapType(QadSnapTypeEnum.DISABLE) self.EntSelClass.run(msgMapTool, msg) #============================================================================ # waitForDimensionLinePos #============================================================================ def waitForDimensionLinePos(self): self.step = 4 # imposto il map tool self.getPointMapTool().dimPt2 = self.dimPt2 if self.getPointMapTool().dimPt1 is None: # in caso di selezione oggetto dimPt1 non era stato inizializzato self.getPointMapTool().dimPt1 = self.dimPt1 self.getPointMapTool().dimCircle = self.dimCircle self.getPointMapTool().preferredAlignment = self.preferredAlignment self.getPointMapTool().forcedDimLineAlignment = self.forcedDimLineAlignment self.getPointMapTool().forcedDimLineRot = self.forcedDimLineRot self.getPointMapTool().dimStyle = self.dimStyle self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.FIRST_SECOND_PT_KNOWN_ASK_FOR_LINEAR_DIM_LINE_POS) # si appresta ad attendere un punto o una parola chiave keyWords = QadMsg.translate("Command_DIM", "Testo") + "/" + \ QadMsg.translate("Command_DIM", "Angolo") + "/" + \ QadMsg.translate("Command_DIM", "Orizzontale") + "/" + \ QadMsg.translate("Command_DIM", "Verticale") + "/" + \ QadMsg.translate("Command_DIM", "Ruotato") prompt = QadMsg.translate("Command_DIM", "Specificare la posizione della linea di quota o [{0}]: ").format(keyWords) englishKeyWords = "Text" + "/" + "Angle" + "/" + "Horizontal" + "/" + "Vertical" + "/" + "Rotated" keyWords += "_" + englishKeyWords # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, \ QadInputModeEnum.NONE) #============================================================================ # run #============================================================================ def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nIl sistema di riferimento del progetto deve essere un sistema di coordinate proiettate.\n")) return True # fine comando if self.dimStyle is None: self.showMsg(QadMsg.translate("QAD", "\nStile di quotatura corrente non valido.\nVerificare il valore della variabile DIMSTYLE.\n")) return True # fine comando errMsg = self.dimStyle.getInValidErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando errMsg = self.dimStyle.getNotGraphEditableErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE ORIGINE PRIMA LINEA DI ESTENSIONE if self.step == 0: # inizio del comando self.waitForFirstPt() return False #========================================================================= # RISPOSTA ALLA RICHIESTA ORIGINE PRIMA LINEA DI ESTENSIONE (da step = 0) elif self.step == 1: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = None # opzione di default None else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if value is None: self.waitForEntsel(msgMapTool, msg) else: self.dimPt1.set(value.x(), value.y()) self.waitForSecondPt() return False #========================================================================= # RISPOSTA ALLA SELEZIONE DI UN'ENTITA' (da step = 1) elif self.step == 2: if self.EntSelClass.run(msgMapTool, msg) == True: if self.EntSelClass.entity.isInitialized(): result = getStartEndPointClosestPartWithContext(self.EntSelClass.entity, \ self.EntSelClass.point, \ self.plugIn.canvas.mapRenderer().destinationCrs()) if result is not None: if (type(result) == list or type(result) == tuple): # se é una lista di 2 punti self.dimPt1 = result[0] self.dimPt2 = result[1] else: objType = result.whatIs() if objType == "ARC": # se é arco self.dimPt1 = result.getStartPt() self.dimPt2 = result.getEndPt() elif objType == "CIRCLE": # se é cerchio self.dimCircle = result self.waitForDimensionLinePos() return False else: self.showMsg(QadMsg.translate("Command_DIM", "Non ci sono geometrie in questa posizione.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ORIGINE SECONDA LINEA DI ESTENSIONE (da step = 1) elif self.step == 3: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if value is None: return True if type(value) == QgsPoint: # se é stato inserito il secondo punto self.dimPt2.set(value.x(), value.y()) self.waitForDimensionLinePos() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA POSIZIONE DELLA LINEA DI QUOTA (da step = 2 e 3) elif self.step == 4: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_DIM", "Testo") or value == "Text": prompt = QadMsg.translate("Command_DIM", "Digitare il testo di quota <{0}>: ") dist = qad_utils.getDistance(self.dimPt1, self.dimPt2) self.waitForString(prompt.format(str(dist)), dist) self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.ASK_FOR_TEXT) self.step = 5 elif value == QadMsg.translate("Command_DIM", "Angolo") or value == "Angle": # si appresta ad attendere l'angolo di rotazione del testo if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_DIM", "Specificare l'angolo del testo di quota <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.dimStyle.textForcedRot))) self.GetAngleClass.angle = self.dimStyle.textForcedRot self.step = 6 self.GetAngleClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_DIM", "Orizzontale") or value == "Horizontal": # allineamento della linea di quota orizzontale self.forcedDimLineAlignment = QadDimStyleAlignmentEnum.HORIZONTAL # allineamento della linea di quota forzato self.forcedDimLineRot = 0.0 self.waitForDimensionLinePos() elif value == QadMsg.translate("Command_DIM", "Verticale") or value == "Vertical": # allineamento della linea di quota verticale self.forcedDimLineAlignment = QadDimStyleAlignmentEnum.VERTICAL # allineamento della linea di quota forzato self.forcedDimLineRot = 0.0 self.waitForDimensionLinePos() elif value == QadMsg.translate("Command_DIM", "Ruotato") or value == "Rotated": # si appresta ad attendere l'angolo di rotazionedella linea di quotatura if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_DIM", "Specificare l'angolo della linea di quota <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.forcedDimLineRot))) self.GetAngleClass.angle = self.forcedDimLineRot self.step = 7 self.GetAngleClass.run(msgMapTool, msg) pass elif type(value) == QgsPoint: # se é stato inserito il punto di posizionamento linea quota self.preferredAlignment = self.getPointMapTool().preferredAlignment self.dimPt1 = self.getPointMapTool().dimPt1 self.dimPt2 = self.getPointMapTool().dimPt2 self.addDimToLayers(value) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL TESTO (da step = 4) elif self.step == 5: # dopo aver atteso una stringa si riavvia il comando if type(msg) == unicode: text = msg.strip() if len(text) > 0: self.measure = text self.getPointMapTool().measure = self.measure self.waitForDimensionLinePos() return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE DEL TESTO DI QUOTA (da step = 4) elif self.step == 6: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.dimStyle.textRotMode = QadDimStyleTxtRotModeEnum.FORCED_ROTATION self.dimStyle.textForcedRot = self.GetAngleClass.angle self.waitForDimensionLinePos() return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE DELLA LINEA DI QUOTA (da step = 4) elif self.step == 7: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.forcedDimLineRot = self.GetAngleClass.angle self.waitForDimensionLinePos() return False
def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" )) return True # fine comando currLayer = None if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer # il layer corrente deve essere editabile e di tipo linea o poligono currLayer, errMsg = qad_layer.getCurrLayerEditable( self.plugIn.canvas, [QGis.Line, QGis.Polygon]) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO if self.step == 0: # inizio del comando self.WaitForFirstCorner() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL PRIMO PUNTO DEL RETTANGOLO (da step = 0) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse self.showMsg( QadMsg.translate("Command_RECTANGLE", "Window not correct.")) self.WaitForFirstCorner() return False else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode or type(value) == str: if value == QadMsg.translate("Command_RECTANGLE", "Chamfer") or value == "Chamfer": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate( "Command_RECTANGLE", "Specify first chamfer distance for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue1)) self.GetDistClass.dist = self.gapValue1 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 4 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Fillet") or value == "Fillet": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate( "Command_RECTANGLE", "Specify rectangle fillet radius <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue1)) self.GetDistClass.dist = self.gapValue1 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 3 self.GetDistClass.run(msgMapTool, msg) elif type(value) == QgsPoint: self.firstCorner = value self.getPointMapTool().firstCorner = self.firstCorner self.WaitForSecondCorner(currLayer) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL SECONDO PUNTO DEL RETTANGOLO (da step = 1) elif self.step == 2: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse self.showMsg( QadMsg.translate("Command_RECTANGLE", "Window not correct.")) self.WaitForSecondCorner(currLayer) return False else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode or type(value) == str: if value == QadMsg.translate("Command_RECTANGLE", "Area") or value == "Area": msg = QadMsg.translate( "Command_RECTANGLE", "Enter rectangle area in current units <{0}>: ") # si appresta ad attendere un numero reale # msg, inputType, default, keyWords, valori positivi self.waitFor(msg.format(str(self.area)), QadInputTypeEnum.FLOAT, \ self.area, "", \ QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) self.getPointMapTool().setMode( Qad_rectangle_maptool_ModeEnum. NONE_KNOWN_ASK_FOR_FIRST_CORNER) self.step = 6 elif value == QadMsg.translate( "Command_RECTANGLE", "Dimensions") or value == "Dimensions": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate( "Command_RECTANGLE", "Specify length for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 10 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate( "Command_RECTANGLE", "Rotation") or value == "Rotation": keyWords = QadMsg.translate("Command_RECTANGLE", "Points") self.defaultValue = self.rot prompt = QadMsg.translate( "Command_RECTANGLE", "Specify rotation angle or [{0}] <{1}>: ").format( keyWords, str(qad_utils.toDegrees(self.rot))) englishKeyWords = "Points" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o un numero reale # msg, inputType, default, keyWords, valori non nulli self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.FLOAT | QadInputTypeEnum.KEYWORDS, \ self.rot, keyWords) self.getPointMapTool().setMode( Qad_rectangle_maptool_ModeEnum. NONE_KNOWN_ASK_FOR_FIRST_CORNER) self.step = 12 elif type(value) == QgsPoint: self.vertices.extend(qad_utils.getRectByCorners(self.firstCorner, value, self.rot, \ self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA RAGGIO DI CURVATURA (da step = 1) elif self.step == 3: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue1 = self.GetDistClass.dist if self.gapValue1 == 0: self.gapType = 0 # 0 = Angoli retti else: self.gapType = 1 # 1 = Raccorda i segmenti self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType( ) # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA PRIMA DISTANZA DI CIMATURA (da step = 1) elif self.step == 4: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue1 = self.GetDistClass.dist if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate( "Command_RECTANGLE", "Specify second chamfer distance for rectangle <{0}>: " ) self.GetDistClass.msg = prompt.format(str(self.gapValue2)) self.GetDistClass.dist = self.gapValue2 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 5 self.GetDistClass.run(msgMapTool, msg) else: self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType( ) # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA SECONDA DISTANZA DI CIMATURA (da step = 1) elif self.step == 5: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue2 = self.GetDistClass.dist if self.gapValue1 == 0 or self.gapValue2 == 0: self.gapType = 0 # 0 = Angoli retti else: self.gapType = 2 # 2 = Cima i segmenti self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType( ) # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA AREA RETTANGOLO (da step = 2) elif self.step == 6: # dopo aver atteso un punto si riavvia il comando keyWords = QadMsg.translate("Command_RECTANGLE", "Length") + "/" + \ QadMsg.translate("Command_RECTANGLE", "Width") englishKeyWords = "Length" + "/" + "Width" if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse self.defaultValue = QadMsg.translate( "Command_RECTANGLE", "Length") prompt = QadMsg.translate( "Command_RECTANGLE", "Calcolate the rectangle dimensions based on [{0}] <{1}>: " ).format(keyWords, self.defaultValue) keyWords += "_" + englishKeyWords # si appresta ad attendere una parola chiave # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 7 return False else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == float: # é stata inserita l'area self.area = value self.defaultValue = QadMsg.translate("Command_RECTANGLE", "Length") prompt = QadMsg.translate( "Command_RECTANGLE", "Calcolate the rectangle dimensions based on [{0}] <{1}>: " ).format(keyWords, self.defaultValue) keyWords += "_" + englishKeyWords # si appresta ad attendere una parola chiave # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 7 return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' (LUNGHEZZA / LARGHEZZA) DATA L'AREA (da step = 6) elif self.step == 7: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue return True # fine comando else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False else: return False else: # il punto arriva come parametro della funzione value = msg if value == QadMsg.translate("Command_RECTANGLE", "Length") or value == "Length": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate( "Command_RECTANGLE", "Enter length for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 8 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Width") or value == "Width": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Enter width for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 9 self.GetDistClass.run(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA RICHIESTA LUNGHEZZA RETTANGOLO DATA L'AREA (da step = 7) elif self.step == 8: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByAreaAndLength(self.firstCorner, self.area, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA LARGHEZZA RETTANGOLO DATA L'AREA (da step = 7) elif self.step == 9: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByAreaAndWidth(self.firstCorner, self.area, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA LUNGHEZZA RETTANGOLO (da step = 2) elif self.step == 10: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.dim1 = self.GetDistClass.dist if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Enter width for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 11 self.GetDistClass.run(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA RICHIESTA LARGHEZZA RETTANGOLO (da step = 10) elif self.step == 11: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByCornerAndDims(self.firstCorner, self.dim1, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE RETTANGOLO (da step = 2) elif self.step == 12: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode or type(value) == str: if value == QadMsg.translate("Command_RECTANGLE", "Points") or value == "Points": # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) self.GetAngleClass.msg = QadMsg.translate( "Command_RECTANGLE", "Specify first point: ") self.GetAngleClass.angle = self.rot self.step = 13 self.GetAngleClass.run(msgMapTool, msg) elif type(value) == QgsPoint: self.rot = qad_utils.getAngleBy2Pts(self.firstCorner, value) self.WaitForSecondCorner(currLayer) elif type(value) == float: self.rot = qad_utils.toRadians(value) self.WaitForSecondCorner(currLayer) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE RETTANGOLO (da step = 12) elif self.step == 13: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.WaitForSecondCorner(currLayer) self.getPointMapTool().refreshSnapType( ) # aggiorno lo snapType che può essere variato dal maptool di rotazione
class QadTEXTCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadTEXTCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "TEXT") def getEnglishName(self): return "TEXT" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runTEXTCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/text.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_TEXT", "Inserts a text.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.insPt = None self.hText = self.plugIn.lastHText self.rot = self.plugIn.lastRot self.GetDistClass = None self.GetAngleClass = None self.labelFields = None self.labelFieldNamesNdx = 0 self.labelFieldValues = [] def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode=QadGetPointDrawModeEnum.NONE): # quando si éin fase di richiesta distanza (altezza testo) if self.step == 2: return self.GetDistClass.getPointMapTool() # quando si éin fase di richiesta rotazione elif self.step == 3: return self.GetAngleClass.getPointMapTool() else: return QadCommandClass.getPointMapTool(self, drawMode) def getCurrentContextualMenu(self): # quando si éin fase di richiesta distanza (altezza testo) if self.step == 2: return self.GetDistClass.getCurrentContextualMenu() # quando si éin fase di richiesta rotazione elif self.step == 3: return self.GetAngleClass.getCurrentContextualMenu() else: return self.contextualMenu def addFeature(self, layer): transformedPoint = self.mapToLayerCoordinates(layer, self.insPt) g = QgsGeometry.fromPoint(transformedPoint) f = QgsFeature() f.setGeometry(g) # Add attribute fields to feature. fields = layer.pendingFields() f.setFields(fields) # assegno i valori di default provider = layer.dataProvider() for field in fields.toList(): i = fields.indexFromName(field.name()) f[field.name()] = provider.defaultValue(i) # se l'altezza testo dipende da un solo campo sizeFldNames = qad_label.get_labelSizeFieldNames(layer) if len(sizeFldNames) == 1 and len(sizeFldNames[0]) > 0: f.setAttribute(sizeFldNames[0], self.hText) # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(layer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: f.setAttribute(rotFldNames[0], qad_utils.toDegrees(self.rot)) # setto i valori degli attributi che compongono l'etichetta i = 0 tot = len(self.labelFields) while i < tot: f.setAttribute(self.labelFields[i].name(), self.labelFieldValues[i]) i = i + 1 return qad_layer.addFeatureToLayer(self.plugIn, layer, f) def initLabelFields(self, layer): labelFieldNames = qad_label.get_labelFieldNames(layer) if len(labelFieldNames) > 0: self.labelFields = QgsFields() for field in layer.dataProvider().fields(): if field.name() in labelFieldNames: self.labelFields.append( QgsField(field.name(), field.type())) #============================================================================ # waitForFieldValue #============================================================================ def waitForFieldValue(self): self.step = 4 if self.labelFields is None: return False if self.labelFieldNamesNdx >= len(self.labelFields): return False field = self.labelFields[self.labelFieldNamesNdx] prompt = QadMsg.translate( "Command_TEXT", "Enter the value of attribute \"{0}\": ").format(field.name()) if field.type( ) == QVariant.Double: # si appresta ad attendere un double o valore nullo self.waitForFloat(prompt, None, QadInputModeEnum.NONE) elif field.type( ) == QVariant.LongLong: # si appresta ad attendere un long a 64 bit o valore nullo self.waitForLong(prompt, None, QadInputModeEnum.NONE) elif field.type( ) == QVariant.Int: # si appresta ad attendere un integer o valore nullo self.waitForInt(prompt, None, QadInputModeEnum.NONE) elif field.type( ) == QVariant.Bool: # si appresta ad attendere un boolean o valore nullo self.waitForBool(prompt, None, QadInputModeEnum.NONE) else: # si appresta ad attendere una stringa o valore nullo self.waitForString(prompt, None, QadInputModeEnum.NONE) return True def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" )) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable( self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isTextLayer(currLayer) == False: errMsg = QadMsg.translate( "QAD", "\nCurrent layer is not a textual layer.") errMsg = errMsg + QadMsg.translate( "QAD", "\nA textual layer is a vector punctual layer having a label and the symbol transparency no more than 10%.\n" ) self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # éstato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool éstato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se l'altezza testo dipende da un solo campo sizeFldNames = qad_label.get_labelSizeFieldNames(currLayer) if len(sizeFldNames) == 1 and len(sizeFldNames[0]) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text height <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.hText)) self.GetDistClass.dist = self.hText self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate( "Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format( str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ALTEZZA TESTO (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.hText = self.GetDistClass.dist self.plugIn.setLastHText(self.hText) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames( currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate( "Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format( str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL VALORE DI UN CAMPO elif self.step == 4: # dopo aver atteso un valore si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica self.waitForFieldValue() return False # il valore arriva come parametro della funzione self.labelFieldValues.append(msg) self.labelFieldNamesNdx = self.labelFieldNamesNdx + 1 if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando return False
def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" )) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable( self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isTextLayer(currLayer) == False: errMsg = QadMsg.translate( "QAD", "\nCurrent layer is not a textual layer.") errMsg = errMsg + QadMsg.translate( "QAD", "\nA textual layer is a vector punctual layer having a label and the symbol transparency no more than 10%.\n" ) self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # éstato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool éstato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se l'altezza testo dipende da un solo campo sizeFldNames = qad_label.get_labelSizeFieldNames(currLayer) if len(sizeFldNames) == 1 and len(sizeFldNames[0]) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_TEXT", "Specify the text height <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.hText)) self.GetDistClass.dist = self.hText self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames(currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate( "Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format( str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ALTEZZA TESTO (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.hText = self.GetDistClass.dist self.plugIn.setLastHText(self.hText) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un solo campo rotFldNames = qad_label.get_labelRotationFieldNames( currLayer) if len(rotFldNames) == 1 and len(rotFldNames[0]) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate( "Command_TEXT", "Specify the text rotation <{0}>: ") self.GetAngleClass.msg = prompt.format( str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.initLabelFields(currLayer) if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL VALORE DI UN CAMPO elif self.step == 4: # dopo aver atteso un valore si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica self.waitForFieldValue() return False # il valore arriva come parametro della funzione self.labelFieldValues.append(msg) self.labelFieldNamesNdx = self.labelFieldNamesNdx + 1 if self.waitForFieldValue() == False: self.addFeature(currLayer) return True # fine comando return False
class QadLENGTHENCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadLENGTHENCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "LENGTHEN") def getEnglishName(self): return "LENGTHEN" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runLENGTHENCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/lengthen.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_LENGTHEN", "Lengthen an object.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.OpMode = plugIn.lastOpMode_lengthen # "DElta" o "Percent" o "Total" o "DYnamic" self.OpType = None # "length" o "Angle" self.value = None self.startPt = None self.GetDistClass = None self.GetAngleClass = None self.entity = QadEntity() self.linearObjectList = None self.atSubGeom = None self.move_startPt = None self.nOperationsToUndo = 0 def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 3: # quando si é in fase di richiesta distanza return self.GetDistClass.getPointMapTool() if self.step == 4: # quando si é in fase di richiesta angolo return self.GetAngleClass.getPointMapTool() elif (self.plugIn is not None): if self.PointMapTool is None: self.PointMapTool = Qad_lengthen_maptool(self.plugIn) return self.PointMapTool else: return None def setInfo(self, entity, point): # setta: self.entity, self.linearObjectList, self.atSubGeom e self.move_startPt if self.linearObjectList is not None: del self.linearObjectList self.linearObjectList = None self.entity.set(entity.layer, entity.featureId) transformedPt = self.mapToLayerCoordinates(self.entity.layer, point) f = self.entity.getFeature() geom = self.entity.getGeometry() # ritorna una tupla (<The squared cartesian distance>, # <minDistPoint> # <afterVertex> # <leftOf>) res = False 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, 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(), transformedPt) <= \ qad_utils.getDistance(self.linearObjectList.getEndPt(), transformedPt): # si allunga dal punto iniziale self.move_startPt = True else: # si allunga dal punto finale self.move_startPt = False return True #============================================================================ # lengthen #============================================================================ 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 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 waitForObjectSelToMisure(self): self.step = 1 # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_OBJ_TO_MISURE) if self.plugIn.lastOpMode_lengthen == "DElta": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "DElta") elif self.plugIn.lastOpMode_lengthen == "Percent": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "Percent") elif self.plugIn.lastOpMode_lengthen == "Total": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "Total") elif self.plugIn.lastOpMode_lengthen == "DYnamic": self.defaultValue = QadMsg.translate("Command_LENGTHEN", "DYnamic") else: self.defaultValue = None keyWords = QadMsg.translate("Command_LENGTHEN", "DElta") + "/" + \ QadMsg.translate("Command_LENGTHEN", "Percent") + "/" + \ QadMsg.translate("Command_LENGTHEN", "Total") + "/" + \ QadMsg.translate("Command_LENGTHEN", "DYnamic") if self.defaultValue is None: prompt = QadMsg.translate("Command_LENGTHEN", "Select an object or [{0}] <{1}>: ").format(keyWords, self.defaultValue) else: prompt = QadMsg.translate("Command_LENGTHEN", "Select an object or [{0}] <{1}>: ").format(keyWords, self.defaultValue) englishKeyWords = "DElta" + "/" + "Percent" + "/" + "Total" + "/" + "DYnamic" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) def waitForDelta(self): self.step = 2 self.OpMode = "DElta" self.plugIn.setLastOpMode_lengthen(self.OpMode) # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_DELTA) keyWords = QadMsg.translate("Command_LENGTHEN", "Angle") prompt = QadMsg.translate("Command_LENGTHEN", "Enter delta length or [{0}] <{1}>: ").format(keyWords, str(self.plugIn.lastDelta_lengthen)) englishKeyWords = "Angle" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS | QadInputTypeEnum.FLOAT, \ self.plugIn.lastDelta_lengthen, \ keyWords, QadInputModeEnum.NONE) def waitForDeltaLength(self, msgMapTool, msg): self.step = 3 self.OpType = "length" # si appresta ad attendere una distanza if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter delta length <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.plugIn.lastDelta_lengthen)) self.GetDistClass.startPt = self.startPt self.GetDistClass.dist = self.plugIn.lastDelta_lengthen self.GetDistClass.inputMode = QadInputModeEnum.NONE self.GetDistClass.run(msgMapTool, msg) def waitForDeltaAngle(self, msgMapTool, msg): self.step = 4 self.OpType = "Angle" # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter delta angle <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.plugIn.lastDeltaAngle_lengthen))) self.GetAngleClass.angle = self.plugIn.lastDeltaAngle_lengthen self.GetAngleClass.run(msgMapTool, msg) def waitForObjectSel(self): self.step = 5 # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_OBJ_TO_LENGTHEN) self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza o angolo self.getPointMapTool().OpType = self.OpType self.getPointMapTool().value = self.value keyWords = QadMsg.translate("Command_LENGTHEN", "Undo") prompt = QadMsg.translate("Command_LENGTHEN", "Select an object to change or [{0}]: ").format(QadMsg.translate("Command_LENGTHEN", "Undo")) englishKeyWords = "Undo" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, QadInputModeEnum.NONE) def waitForPercent(self): self.step = 6 self.OpMode = "Percent" self.plugIn.setLastOpMode_lengthen(self.OpMode) # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_PERCENT) prompt = QadMsg.translate("Command_LENGTHEN", "Enter percentage length <{0}>: ") prompt = prompt.format(str(self.plugIn.lastPerc_lengthen)) # si appresta ad attendere un numero reale # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.FLOAT, \ self.plugIn.lastPerc_lengthen, "", \ QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) def waitForTotal(self): self.step = 7 self.OpMode = "Total" self.plugIn.setLastOpMode_lengthen(self.OpMode) # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_TOTAL) keyWords = QadMsg.translate("Command_LENGTHEN", "Angle") prompt = QadMsg.translate("Command_LENGTHEN", "Specify total length or [{0}] <{1}>: ").format(keyWords, str(self.plugIn.lastTotal_lengthen)) englishKeyWords = "Angle" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS | QadInputTypeEnum.FLOAT, \ self.plugIn.lastTotal_lengthen, \ keyWords, QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) def waitForTotalLength(self, msgMapTool, msg): self.step = 8 self.OpType = "length" # si appresta ad attendere una distanza if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter total length <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.plugIn.lastTotal_lengthen)) self.GetDistClass.startPt = self.startPt self.GetDistClass.dist = self.plugIn.lastTotal_lengthen self.GetDistClass.inputMode = QadInputModeEnum.NONE self.GetDistClass.run(msgMapTool, msg) def waitForTotalAngle(self, msgMapTool, msg): self.step = 9 self.OpType = "Angle" # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_LENGTHEN", "Enter total angle <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.plugIn.lastTotalAngle_lengthen))) self.GetAngleClass.angle = self.plugIn.lastTotalAngle_lengthen self.GetAngleClass.run(msgMapTool, msg) def waitForDynamicPt(self): self.step = 10 # imposto il map tool self.getPointMapTool().setMode(Qad_lengthen_maptool_ModeEnum.ASK_FOR_DYNAMIC_POINT) prompt = QadMsg.translate("Command_LENGTHEN", "Specify new endpoint: ") # si appresta ad attendere un punto o enter o una parola chiave # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D, \ None, \ "", QadInputModeEnum.NONE) #============================================================================ # run #============================================================================ def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE OGGETTO if self.step == 0: # inizio del comando # si appresta ad attendere la selezione degli oggetti da estendere/tagliare self.waitForObjectSelToMisure() return False #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI DA MISURARE elif self.step == 1: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "DElta") or value == "DElta": self.waitForDelta() return False elif value == QadMsg.translate("Command_LENGTHEN", "Percent") or value == "Percent": self.waitForPercent() return False elif value == QadMsg.translate("Command_LENGTHEN", "Total") or value == "Total": self.waitForTotal() return False elif value == QadMsg.translate("Command_LENGTHEN", "DYnamic") or value == "DYnamic": self.OpMode = "DYnamic" self.plugIn.setLastOpMode_lengthen(self.OpMode) # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False elif type(value) == QgsPoint: # se é stato selezionato un punto if self.getPointMapTool().entity.isInitialized(): self.showLength(self.getPointMapTool().entity, value) else: # cerco se ci sono entità nel punto indicato considerando # solo layer di tipo lineari che non appartengano a quote o di tipo poligono layerList = [] for layer in qad_utils.getVisibleVectorLayers(self.plugIn.canvas): # Tutti i layer vettoriali visibili if layer.geometryType() == QGis.Line or layer.geometryType() == QGis.Polygon: if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) result = qad_utils.getEntSel(self.getPointMapTool().toCanvasCoordinates(value), \ self.getPointMapTool(), \ QadVariables.get(QadMsg.translate("Environment variables", "PICKBOX")), \ layerList) if result is not None: feature = result[0] layer = result[1] self.showLength(QadEntity().set(layer, feature.id()), value) else: return True # fine comando # si appresta ad attendere la selezione degli oggetti da misurare self.waitForObjectSelToMisure() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL DELTA (da step = 1) elif self.step == 2: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.plugIn.lastDelta_lengthen # opzione di default "spostamento" else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "Angle") or value == "Angle": self.waitForDeltaAngle(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito un punto self.startPt = value self.waitForDeltaLength(msgMapTool, msg) elif type(value) == float: # se é stato inserito il delta self.plugIn.setLastDelta_lengthen(value) self.OpType = "length" self.value = value # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LUNGHEZZA DEL DELTA (da step = 2) elif self.step == 3: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.plugIn.setLastDelta_lengthen(self.GetDistClass.dist) self.value = self.GetDistClass.dist # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() #========================================================================= # RISPOSTA ALLA RICHIESTA DELL'ANGOLO DEL DELTA (da step = 2) elif self.step == 4: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.plugIn.setLastDeltaAngle_lengthen(self.GetAngleClass.angle) self.value = self.GetAngleClass.angle # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() #========================================================================= # RISPOSTA ALLA SELEZIONE OGGETTI DA ALLUNGARE elif self.step == 5: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "Undo") or value == "Undo": if self.nOperationsToUndo > 0: self.nOperationsToUndo = self.nOperationsToUndo - 1 self.plugIn.undoEditCommand() else: self.showMsg(QadMsg.translate("QAD", "\nThe command has been canceled.")) elif type(value) == QgsPoint: # se é stato selezionato un punto if self.getPointMapTool().entity.isInitialized(): self.setInfo(self.getPointMapTool().entity, value) if self.OpMode != "DYnamic": self.lengthen(value) else: self.waitForDynamicPt() return False else: # cerco se ci sono entità nel punto indicato considerando # solo layer lineari editabili che non appartengano a quote layerList = [] for layer in qad_utils.getVisibleVectorLayers(self.plugIn.canvas): # Tutti i layer vettoriali visibili if layer.geometryType() == QGis.Line and layer.isEditable(): if len(QadDimStyles.getDimListByLayer(layer)) == 0: layerList.append(layer) result = qad_utils.getEntSel(self.getPointMapTool().toCanvasCoordinates(value), \ self.getPointMapTool(), \ QadVariables.get(QadMsg.translate("Environment variables", "PICKBOX")), \ layerList) if result is not None: feature = result[0] layer = result[1] self.setInfo(QadEntity().set(layer, feature.id()), value) if self.OpMode != "DYnamic": self.lengthen(value) else: self.waitForDynamicPt() return False else: return True # fine comando # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA PERCENTUALE (da step = 1) elif self.step == 6: # dopo aver atteso un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.plugIn.lastPerc_lengthen else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: return False else: # il punto arriva come parametro della funzione value = msg if type(value) == float: # é stata inserita la percentuale self.plugIn.setLastPerc_lengthen(value) self.value = value # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL TOTALE (da step = 1) elif self.step == 7: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.plugIn.lastTotal_lengthen else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_LENGTHEN", "Angle") or value == "Angle": self.waitForTotalAngle(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito un punto self.startPt = value self.waitForTotalLength(msgMapTool, msg) elif type(value) == float: # se é stato inserito il delta self.plugIn.setLastTotal_lengthen(value) self.OpType = "length" self.value = value # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA LUNGHEZZA DEL TOTALE (da step = 7) elif self.step == 8: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.plugIn.setLastTotal_lengthen(self.GetDistClass.dist) self.value = self.GetDistClass.dist # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELL'ANGOLO DEL DELTA (da step = 7) elif self.step == 9: # dopo aver atteso un punto o un numero reale si riavvia il comando if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.plugIn.setLastTotalAngle_lengthen(self.GetAngleClass.angle) self.value = self.GetAngleClass.angle # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA NUOVA ESTREMITA' IN MODO DINAMICO (da step = 5) elif self.step == 10: # dopo aver atteso un punto if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == QgsPoint: # se é stato inserito un punto self.lengthen(value) # si appresta ad attendere la selezione degli oggetti da allungare self.waitForObjectSel() return False
class QadINSERTCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadINSERTCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "INSERT") def getEnglishName(self): return "INSERT" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runINSERTCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/insert.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_INSERT", "Insert a symbol.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.insPt = None self.scale = self.plugIn.lastScale self.rot = self.plugIn.lastRot self.GetDistClass = None self.GetAngleClass = None def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode=QadGetPointDrawModeEnum.NONE): # quando si é in fase di richiesta distanza (scala) if self.step == 2: return self.GetDistClass.getPointMapTool() # quando si é in fase di richiesta rotazione elif self.step == 3: return self.GetAngleClass.getPointMapTool() else: return QadCommandClass.getPointMapTool(self, drawMode) def getCurrentContextualMenu(self): # quando si é in fase di richiesta distanza (scala) if self.step == 2: return self.GetDistClass.getCurrentContextualMenu() # quando si é in fase di richiesta rotazione elif self.step == 3: return self.GetAngleClass.getCurrentContextualMenu() else: return self.contextualMenu def addFeature(self, layer): transformedPoint = self.mapToLayerCoordinates(layer, self.insPt) g = QgsGeometry.fromPoint(transformedPoint) f = QgsFeature() f.setGeometry(g) # Add attribute fields to feature. fields = layer.pendingFields() f.setFields(fields) # assegno i valori di default provider = layer.dataProvider() for field in fields.toList(): i = fields.indexFromName(field.name()) f[field.name()] = provider.defaultValue(i) # se la scala dipende da un campo scaleFldName = qad_layer.get_symbolScaleFieldName(layer) if len(scaleFldName) > 0: f.setAttribute(scaleFldName, self.scale) # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(layer) if len(rotFldName) > 0: f.setAttribute(rotFldName, qad_utils.toDegrees(self.rot)) return qad_layer.addFeatureToLayer(self.plugIn, layer, f) def run(self, msgMapTool=False, msg=None): if self.plugIn.canvas.mapSettings().destinationCrs().geographicFlag(): self.showMsg( QadMsg.translate( "QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n" )) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable( self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isSymbolLayer(currLayer) == False: errMsg = QadMsg.translate( "QAD", "\nCurrent layer is not a symbol layer.") errMsg = errMsg + QadMsg.translate( "QAD", "\nA symbol layer is a vector punctual layer without label.\n") self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool( ).point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool( ).rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool( self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se la scala dipende da un campo scaleFldName = qad_layer.get_symbolScaleFieldName(currLayer) if len(scaleFldName) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specify the symbol scale <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.scale)) self.GetDistClass.dist = self.scale self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(currLayer) if len(rotFldName) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate( "Command_INSERT", "Specify the symbol rotation <{0}>: ") self.GetAngleClass.msg = prompt.format( str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.addFeature(currLayer) return True #========================================================================= # RISPOSTA ALLA RICHIESTA SCALA (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.scale = self.GetDistClass.dist self.plugIn.setLastScale(self.scale) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName( currLayer) if len(rotFldName) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate( "Command_INSERT", "Specify the symbol rotation <{0}>: ") self.GetAngleClass.msg = prompt.format( str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.addFeature(currLayer) return True # fine comando else: return True return False
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nIl sistema di riferimento del progetto deve essere un sistema di coordinate proiettate.\n")) return True # fine comando currLayer = None if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer # il layer corrente deve essere editabile e di tipo linea o poligono currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, [QGis.Line, QGis.Polygon]) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO if self.step == 0: # inizio del comando self.WaitForFirstCorner() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL PRIMO PUNTO DEL RETTANGOLO (da step = 0) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_RECTANGLE", "La finestra non é stata specificata correttamente.")) self.WaitForFirstCorner() return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_RECTANGLE", "Cima") or value == "Chamfer": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specificare prima distanza di cimatura del rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue1)) self.GetDistClass.dist = self.gapValue1 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 4 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Raccordo") or value == "Fillet": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specificare raggio di raccordo del rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue1)) self.GetDistClass.dist = self.gapValue1 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 3 self.GetDistClass.run(msgMapTool, msg) elif type(value) == QgsPoint: self.firstCorner = value self.getPointMapTool().firstCorner = self.firstCorner self.WaitForSecondCorner(currLayer) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL SECONDO PUNTO DEL RETTANGOLO (da step = 1) elif self.step == 2: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_RECTANGLE", "La finestra non é stata specificata correttamente.")) self.WaitForSecondCorner(currLayer) return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_RECTANGLE", "Area") or value == "Area": msg = QadMsg.translate("Command_RECTANGLE", "Digitare l'area del rettangolo in unità correnti <{0}>: ") # si appresta ad attendere un numero reale # msg, inputType, default, keyWords, valori positivi self.waitFor(msg.format(str(self.area)), QadInputTypeEnum.FLOAT, \ self.area, "", \ QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) self.getPointMapTool().setMode(Qad_rectangle_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_CORNER) self.step = 6 elif value == QadMsg.translate("Command_RECTANGLE", "Quote") or value == "Dimensions": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specificare lunghezza del rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 10 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Rotazione") or value == "Rotation": keyWords = QadMsg.translate("Command_RECTANGLE", "SCegli punti") self.defaultValue = self.rot prompt = QadMsg.translate("Command_RECTANGLE", "Specificare l'angolo di rotazione o [{0}] <{1}>: ").format(keyWords, str(qad_utils.toDegrees(self.rot))) englishKeyWords = "Points" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o un numero reale # msg, inputType, default, keyWords, valori non nulli self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.FLOAT | QadInputTypeEnum.KEYWORDS, \ self.rot, keyWords) self.getPointMapTool().setMode(Qad_rectangle_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_CORNER) self.step = 12 elif type(value) == QgsPoint: self.vertices.extend(qad_utils.getRectByCorners(self.firstCorner, value, self.rot, \ self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA RAGGIO DI CURVATURA (da step = 1) elif self.step == 3: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue1 = self.GetDistClass.dist if self.gapValue1 == 0: self.gapType = 0 # 0 = Angoli retti else: self.gapType = 1 # 1 = Raccorda i segmenti self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA PRIMA DISTANZA DI CIMATURA (da step = 1) elif self.step == 4: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue1 = self.GetDistClass.dist if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specificare seconda distanza di cimatura del rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue2)) self.GetDistClass.dist = self.gapValue2 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 5 self.GetDistClass.run(msgMapTool, msg) else: self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA SECONDA DISTANZA DI CIMATURA (da step = 1) elif self.step == 5: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue2 = self.GetDistClass.dist if self.gapValue1 == 0 or self.gapValue2 == 0: self.gapType = 0 # 0 = Angoli retti else: self.gapType = 2 # 2 = Cima i segmenti self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA AREA RETTANGOLO (da step = 2) elif self.step == 6: # dopo aver atteso un punto si riavvia il comando keyWords = QadMsg.translate("Command_RECTANGLE", "Lunghezza") + "/" + \ QadMsg.translate("Command_RECTANGLE", "lArghezza") englishKeyWords = "Length" + "/" + "Width" if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.defaultValue = QadMsg.translate("Command_RECTANGLE", "Lunghezza") prompt = QadMsg.translate("Command_RECTANGLE", "Calcolare le quote rettangolo in base alla [{0}] <{1}>: ").format(keyWords, self.defaultValue) keyWords += "_" + englishKeyWords # si appresta ad attendere una parola chiave # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 7 return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == float: # é stata inserita l'area self.area = value self.defaultValue = QadMsg.translate("Command_RECTANGLE", "Lunghezza") prompt = QadMsg.translate("Command_RECTANGLE", "Calcolare le quote rettangolo in base alla [{0}] <{1}>: ").format(keyWords, self.defaultValue) keyWords += "_" + englishKeyWords # si appresta ad attendere una parola chiave # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 7 return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' (LUNGHEZZA / LARGHEZZA) DATA L'AREA (da step = 6) elif self.step == 7: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: return False else: # il punto arriva come parametro della funzione value = msg if value == QadMsg.translate("Command_RECTANGLE", "Lunghezza") or value == "Length": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Digitare la lunghezza rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 8 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "lArghezza") or value == "Width": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Digitare la larghezza rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 9 self.GetDistClass.run(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA RICHIESTA LUNGHEZZA RETTANGOLO DATA L'AREA (da step = 7) elif self.step == 8: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByAreaAndLength(self.firstCorner, self.area, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA LARGHEZZA RETTANGOLO DATA L'AREA (da step = 7) elif self.step == 9: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByAreaAndWidth(self.firstCorner, self.area, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA LUNGHEZZA RETTANGOLO (da step = 2) elif self.step == 10: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.dim1 = self.GetDistClass.dist if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Digitare la larghezza rettangolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 11 self.GetDistClass.run(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA RICHIESTA LARGHEZZA RETTANGOLO (da step = 10) elif self.step == 11: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByCornerAndDims(self.firstCorner, self.dim1, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE RETTANGOLO (da step = 2) elif self.step == 12: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_RECTANGLE", "SCegli punti") or value == "Points": # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) self.GetAngleClass.msg = QadMsg.translate("Command_RECTANGLE", "Specificare primo punto: ") self.GetAngleClass.angle = self.rot self.step = 13 self.GetAngleClass.run(msgMapTool, msg) elif type(value) == QgsPoint: self.rot = qad_utils.getAngleBy2Pts(self.firstCorner, value) self.WaitForSecondCorner(currLayer) elif type(value) == float: self.rot = qad_utils.toRadians(value) self.WaitForSecondCorner(currLayer) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE RETTANGOLO (da step = 12) elif self.step == 13: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.WaitForSecondCorner(currLayer) self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di rotazione
class QadINSERTCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadINSERTCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "INSER") def getEnglishName(self): return "INSERT" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runINSERTCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/insert.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_INSERT", "Inserisce un simbolo.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.insPt = None self.scale = self.plugIn.lastScale self.rot = self.plugIn.lastRot self.GetDistClass = None self.GetAngleClass = None def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): # quando si é in fase di richiesta distanza (scala) if self.step == 2: return self.GetDistClass.getPointMapTool() # quando si é in fase di richiesta rotazione elif self.step == 3: return self.GetAngleClass.getPointMapTool() else: return QadCommandClass.getPointMapTool(self, drawMode) def addFeature(self, layer): transformedPoint = self.mapToLayerCoordinates(layer, self.insPt) g = QgsGeometry.fromPoint(transformedPoint) f = QgsFeature() f.setGeometry(g) # Add attribute fields to feature. fields = layer.pendingFields() f.setFields(fields) # assegno i valori di default provider = layer.dataProvider() for field in fields.toList(): i = fields.indexFromName(field.name()) f[field.name()] = provider.defaultValue(i) # se la scala dipende da un campo scaleFldName = qad_layer.get_symbolScaleFieldName(layer) if len(scaleFldName) > 0: f.setAttribute(scaleFldName, self.scale) # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(layer) if len(rotFldName) > 0: f.setAttribute(rotFldName, qad_utils.toDegrees(self.rot)) return qad_layer.addFeatureToLayer(self.plugIn, layer, f) def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nIl sistema di riferimento del progetto deve essere un sistema di coordinate proiettate.\n")) return True # fine comando currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, QGis.Point) if currLayer is None: self.showErr(errMsg) return True # fine comando if qad_layer.isSymbolLayer(currLayer) == False: errMsg = QadMsg.translate("QAD", "\nIl layer corrente non é di tipo simbolo.") errMsg = errMsg + QadMsg.translate("QAD", "\nUn layer simbolo é un layer vettoriale di tipo punto senza etichetta.\n") self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PUNTO DI INSERIMENTO if self.step == 0: # inizio del comando self.waitForPoint() # si appresta ad attendere un punto self.step = self.step + 1 return False #========================================================================= # RISPOSTA ALLA RICHIESTA PUNTO DI INSERIMENTO elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False pt = self.getPointMapTool().point else: # il punto arriva come parametro della funzione pt = msg self.insPt = QgsPoint(pt) self.plugIn.setLastPoint(self.insPt) # se la scala dipende da un campo scaleFldName = qad_layer.get_symbolScaleFieldName(currLayer) if len(scaleFldName) > 0: # si appresta ad attendere la scala self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specificare la scala del simbolo <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.scale)) self.GetDistClass.dist = self.scale self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE | QadInputModeEnum.NOT_ZERO self.GetDistClass.startPt = self.insPt self.step = 2 self.GetDistClass.run(msgMapTool, msg) return False else: # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(currLayer) if len(rotFldName) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specificare la rotazione del simbolo <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.addFeature(currLayer) return True #========================================================================= # RISPOSTA ALLA RICHIESTA SCALA (da step = 1) elif self.step == 2: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.scale = self.GetDistClass.dist self.plugIn.setLastScale(self.scale) del self.GetDistClass self.GetDistClass = None # se la rotazione dipende da un campo rotFldName = qad_layer.get_symbolRotationFieldName(currLayer) if len(rotFldName) > 0: if self.GetAngleClass is not None: del self.GetAngleClass # si appresta ad attendere l'angolo di rotazione self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_INSERT", "Specificare la rotazione del simbolo <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.rot))) self.GetAngleClass.angle = self.rot self.GetAngleClass.startPt = self.insPt self.step = 3 self.GetAngleClass.run(msgMapTool, msg) return False else: self.addFeature(currLayer) return True else: return True return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE (da step = 1 o 2) elif self.step == 3: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.addFeature(currLayer) return True # fine comando else: return True return False
class QadDIMARCCommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadDIMARCCommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "DIMARC") def getEnglishName(self): return "DIMARC" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runDIMARCCommand) def getIcon(self): return QIcon(":/plugins/qad/icons/dimArc.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_DIM", "Creates an arc length dimension.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) self.EntSelClass = None self.GetAngleClass = None self.dimPt1 = QgsPoint() self.dimPt2 = QgsPoint() self.dimArc = None # oggetto arco da quotare self.measure = None # misura della quota (se None viene calcolato) self.leader = False # leggo lo stile di quotatura corrente dimStyleName = QadVariables.get(QadMsg.translate("Environment variables", "DIMSTYLE")) self.dimStyle = self.plugIn.dimStyles.findDimStyle(dimStyleName) if self.dimStyle is not None: self.dimStyle.dimType = QadDimTypeEnum.ALIGNED def __del__(self): QadCommandClass.__del__(self) if self.EntSelClass is not None: self.EntSelClass.entity.deselectOnLayer() del self.EntSelClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): if self.step == 1: # quando si é in fase di selezione entità return self.EntSelClass.getPointMapTool(drawMode) # quando si é in fase di richiesta rotazione elif self.step == 6: return self.GetAngleClass.getPointMapTool() else: if (self.plugIn is not None): if self.PointMapTool is None: self.PointMapTool = Qad_dim_maptool(self.plugIn) return self.PointMapTool else: return None #============================================================================ # addDimToLayers #============================================================================ def addDimToLayers(self, linePosPt): return self.dimStyle.addAlignedDimToLayers(self.plugIn, self.dimPt1, self.dimPt2, \ linePosPt, self.measure) #============================================================================ # waitForEntsel #============================================================================ def waitForEntsel(self, msgMapTool, msg): if self.EntSelClass is not None: del self.EntSelClass self.step = 1 self.EntSelClass = QadEntSelClass(self.plugIn) self.EntSelClass.msg = QadMsg.translate("Command_DIM", "Select arc or polyline arc segment: ") # scarto la selezione di punti self.EntSelClass.checkPointLayer = False self.EntSelClass.checkLineLayer = True self.EntSelClass.checkPolygonLayer = True self.EntSelClass.getPointMapTool().setSnapType(QadSnapTypeEnum.DISABLE) self.EntSelClass.run(msgMapTool, msg) #============================================================================ # waitForDimensionLinePos #============================================================================ def waitForDimensionLinePos(self): self.step = 4 # imposto il map tool self.getPointMapTool().dimPt2 = self.dimPt2 if self.getPointMapTool().dimPt1 is None: # in caso di selezione oggetto dimPt1 non era stato inizializzato self.getPointMapTool().dimPt1 = self.dimPt1 self.getPointMapTool().dimCircle = self.dimCircle self.getPointMapTool().dimStyle = self.dimStyle self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.FIRST_SECOND_PT_KNOWN_ASK_FOR_ALIGNED_DIM_LINE_POS) # si appresta ad attendere un punto o una parola chiave # si appresta ad attendere un punto o una parola chiave keyWords = QadMsg.translate("Command_DIM", "Text") + "/" + \ QadMsg.translate("Command_DIM", "Angle") + "/" + \ QadMsg.translate("Command_DIM", "Partial") + "/" englishKeyWords = "Text" + "/" + "2POints" + "/" + "Partial" + "/" if self.leader: keyWords = keyWords + QadMsg.translate("Command_DIM", "Leader") englishKeyWords = englishKeyWords + "Leader" else: keyWords = keyWords + QadMsg.translate("Command_DIM", "No leader") englishKeyWords = englishKeyWords + "No leader" keyWords += "_" + englishKeyWordsAngle prompt = QadMsg.translate("Command_DIM", "Specify dimension location or [{0}]: ").format(keyWords) # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, \ keyWords, \ QadInputModeEnum.NONE) #============================================================================ # run #============================================================================ def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando if self.dimStyle is None: self.showMsg(QadMsg.translate("QAD", "\nDimension style not valid.\nVerify the value of DIMSTYLE variable.\n")) return True # fine comando errMsg = self.dimStyle.getInValidErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando errMsg = self.dimStyle.getNotGraphEditableErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE ARCO DA QUOTARE if self.step == 0: # inizio del comando self.waitForEntsel(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA SELEZIONE DI UN'ENTITA' (da step = 0) elif self.step == 1: if self.EntSelClass.run(msgMapTool, msg) == True: if self.EntSelClass.entity.isInitialized(): result = getStartEndPointClosestPartWithContext(self.EntSelClass.entity, \ self.EntSelClass.point, \ self.plugIn.canvas.mapRenderer().destinationCrs()) if result is not None: if (type(result) != list and type(result) != tuple): # se non é una lista di 2 punti objType = result.whatIs() if objType == "ARC": # se é arco self.dimArc = result return False self.showMsg(QadMsg.translate("Command_DIM", "Select an arc.")) self.waitForEntsel(msgMapTool, msg) else: self.showMsg(QadMsg.translate("Command_DIM", "No geometries in this position.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ORIGINE SECONDA LINEA DI ESTENSIONE (da step = 1) elif self.step == 3: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if value is None: return True if type(value) == QgsPoint: # se é stato inserito il secondo punto self.dimPt2.set(value.x(), value.y()) self.waitForDimensionLinePos() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA POSIZIONE DELLA LINEA DI QUOTA (da step = 2 e 3) elif self.step == 4: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_DIM", "Text") or value == "Text": prompt = QadMsg.translate("Command_DIM", "Enter dimension text <{0}>: ") dist = qad_utils.getDistance(self.dimPt1, self.dimPt2) self.waitForString(prompt.format(str(dist)), dist) self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.ASK_FOR_TEXT) self.step = 5 elif value == QadMsg.translate("Command_DIM", "Angle") or value == "Angle": # si appresta ad attendere l'angolo di rotazione del testo if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_DIM", "Specify angle of dimension text <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.dimStyle.textForcedRot))) self.GetAngleClass.angle = self.dimStyle.textForcedRot self.step = 6 self.GetAngleClass.run(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito il punto di posizionamento linea quota self.dimPt1 = self.getPointMapTool().dimPt1 self.dimPt2 = self.getPointMapTool().dimPt2 self.addDimToLayers(value) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL TESTO (da step = 4) elif self.step == 5: # dopo aver atteso una stringa si riavvia il comando if type(msg) == unicode: text = msg.strip() if len(text) > 0: self.measure = text self.getPointMapTool().measure = self.measure self.waitForDimensionLinePos() return False
class QadRECTANGLECommandClass(QadCommandClass): def instantiateNewCmd(self): """ istanzia un nuovo comando dello stesso tipo """ return QadRECTANGLECommandClass(self.plugIn) def getName(self): return QadMsg.translate("Command_list", "RECTANGLE") def getEnglishName(self): return "RECTANGLE" def connectQAction(self, action): QObject.connect(action, SIGNAL("triggered()"), self.plugIn.runRECTANGLECommand) def getIcon(self): return QIcon(":/plugins/qad/icons/rectangle.png") def getNote(self): # impostare le note esplicative del comando return QadMsg.translate("Command_RECTANGLE", "Creates a rectangle.") def __init__(self, plugIn): QadCommandClass.__init__(self, plugIn) # se questo flag = True il comando serve all'interno di un altro comando per disegnare un rettangolo # che non verrà salvato su un layer self.virtualCmd = False self.firstCorner = None self.gapType = 0 # 0 = Angoli retti; 1 = Raccorda i segmenti; 2 = Cima i segmenti self.gapValue1 = 0 # se gapType = 1 -> raggio di curvatura; se gapType = 2 -> prima distanza di cimatura self.gapValue2 = 0 # se gapType = 2 -> seconda distanza di cimatura self.area = 100 self.dim1 = 10 self.rot = 0 self.vertices = [] self.GetDistClass = None self.GetAngleClass = None self.defaultValue = None # usato per gestire il tasto dx del mouse def __del__(self): QadCommandClass.__del__(self) if self.GetDistClass is not None: del self.GetDistClass if self.GetAngleClass is not None: del self.GetAngleClass def getPointMapTool(self, drawMode = QadGetPointDrawModeEnum.NONE): # quando si é in fase di richiesta distanza if self.step == 3 or self.step == 4 or self.step == 5 or \ self.step == 8 or self.step == 9 or self.step == 10 or self.step == 11: return self.GetDistClass.getPointMapTool() # quando si é in fase di richiesta rotazione elif self.step == 13: return self.GetAngleClass.getPointMapTool() else: if (self.plugIn is not None): if self.PointMapTool is None: self.PointMapTool = Qad_rectangle_maptool(self.plugIn) return self.PointMapTool else: return None def addRectangleToLayer(self, layer): if layer.geometryType() == QGis.Line: qad_layer.addLineToLayer(self.plugIn, layer, self.vertices) elif layer.geometryType() == QGis.Polygon: qad_layer.addPolygonToLayer(self.plugIn, layer, self.vertices) #============================================================================ # WaitForFirstCorner #============================================================================ def WaitForFirstCorner(self): self.step = 1 self.getPointMapTool().setMode(Qad_rectangle_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_CORNER) keyWords = QadMsg.translate("Command_RECTANGLE", "Chamfer") + "/" + \ QadMsg.translate("Command_RECTANGLE", "Fillet") prompt = QadMsg.translate("Command_RECTANGLE", "Specify first corner or [{0}]: ").format(keyWords) englishKeyWords = "Chamfer" + "/" + "Fillet" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, keyWords, QadInputModeEnum.NONE) #============================================================================ # WaitForSecondCorner #============================================================================ def WaitForSecondCorner(self, layer): self.step = 2 self.getPointMapTool().rot = self.rot self.getPointMapTool().gapType = self.gapType self.getPointMapTool().gapValue1 = self.gapValue1 self.getPointMapTool().gapValue2 = self.gapValue2 self.getPointMapTool().setMode(Qad_rectangle_maptool_ModeEnum.FIRST_CORNER_KNOWN_ASK_FOR_SECOND_CORNER) if layer is not None: self.getPointMapTool().geomType = layer.geometryType() keyWords = QadMsg.translate("Command_RECTANGLE", "Area") + "/" + \ QadMsg.translate("Command_RECTANGLE", "Dimensions") + "/" + \ QadMsg.translate("Command_RECTANGLE", "Rotation") prompt = QadMsg.translate("Command_RECTANGLE", "Specify other corner or [{0}]: ").format(keyWords) englishKeyWords = "Area" + "/" + "Dimensions" + "/" + "Rotation" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o enter # msg, inputType, default, keyWords, nessun controllo self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.KEYWORDS, \ None, keyWords, QadInputModeEnum.NONE) #============================================================================ # run #============================================================================ def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nThe coordinate reference system of the project must be a projected coordinate system.\n")) return True # fine comando currLayer = None if self.virtualCmd == False: # se si vuole veramente salvare la polylinea in un layer # il layer corrente deve essere editabile e di tipo linea o poligono currLayer, errMsg = qad_layer.getCurrLayerEditable(self.plugIn.canvas, [QGis.Line, QGis.Polygon]) if currLayer is None: self.showErr(errMsg) return True # fine comando #========================================================================= # RICHIESTA PRIMO PUNTO if self.step == 0: # inizio del comando self.WaitForFirstCorner() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL PRIMO PUNTO DEL RETTANGOLO (da step = 0) elif self.step == 1: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_RECTANGLE", "Window not correct.")) self.WaitForFirstCorner() return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_RECTANGLE", "Chamfer") or value == "Chamfer": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specify first chamfer distance for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue1)) self.GetDistClass.dist = self.gapValue1 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 4 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Fillet") or value == "Fillet": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specify rectangle fillet radius <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue1)) self.GetDistClass.dist = self.gapValue1 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 3 self.GetDistClass.run(msgMapTool, msg) elif type(value) == QgsPoint: self.firstCorner = value self.getPointMapTool().firstCorner = self.firstCorner self.WaitForSecondCorner(currLayer) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA DEL SECONDO PUNTO DEL RETTANGOLO (da step = 1) elif self.step == 2: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.showMsg(QadMsg.translate("Command_RECTANGLE", "Window not correct.")) self.WaitForSecondCorner(currLayer) return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_RECTANGLE", "Area") or value == "Area": msg = QadMsg.translate("Command_RECTANGLE", "Enter rectangle area in current units <{0}>: ") # si appresta ad attendere un numero reale # msg, inputType, default, keyWords, valori positivi self.waitFor(msg.format(str(self.area)), QadInputTypeEnum.FLOAT, \ self.area, "", \ QadInputModeEnum.NOT_ZERO | QadInputModeEnum.NOT_NEGATIVE) self.getPointMapTool().setMode(Qad_rectangle_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_CORNER) self.step = 6 elif value == QadMsg.translate("Command_RECTANGLE", "Dimensions") or value == "Dimensions": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specify length for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 10 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Rotation") or value == "Rotation": keyWords = QadMsg.translate("Command_RECTANGLE", "Points") self.defaultValue = self.rot prompt = QadMsg.translate("Command_RECTANGLE", "Specify rotation angle or [{0}] <{1}>: ").format(keyWords, str(qad_utils.toDegrees(self.rot))) englishKeyWords = "Points" keyWords += "_" + englishKeyWords # si appresta ad attendere un punto o un numero reale # msg, inputType, default, keyWords, valori non nulli self.waitFor(prompt, \ QadInputTypeEnum.POINT2D | QadInputTypeEnum.FLOAT | QadInputTypeEnum.KEYWORDS, \ self.rot, keyWords) self.getPointMapTool().setMode(Qad_rectangle_maptool_ModeEnum.NONE_KNOWN_ASK_FOR_FIRST_CORNER) self.step = 12 elif type(value) == QgsPoint: self.vertices.extend(qad_utils.getRectByCorners(self.firstCorner, value, self.rot, \ self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA RAGGIO DI CURVATURA (da step = 1) elif self.step == 3: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue1 = self.GetDistClass.dist if self.gapValue1 == 0: self.gapType = 0 # 0 = Angoli retti else: self.gapType = 1 # 1 = Raccorda i segmenti self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA PRIMA DISTANZA DI CIMATURA (da step = 1) elif self.step == 4: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue1 = self.GetDistClass.dist if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Specify second chamfer distance for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.gapValue2)) self.GetDistClass.dist = self.gapValue2 self.GetDistClass.inputMode = QadInputModeEnum.NOT_NEGATIVE self.step = 5 self.GetDistClass.run(msgMapTool, msg) else: self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA SECONDA DISTANZA DI CIMATURA (da step = 1) elif self.step == 5: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.gapValue2 = self.GetDistClass.dist if self.gapValue1 == 0 or self.gapValue2 == 0: self.gapType = 0 # 0 = Angoli retti else: self.gapType = 2 # 2 = Cima i segmenti self.WaitForFirstCorner() self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di distanza return False # fine comando #========================================================================= # RISPOSTA ALLA RICHIESTA AREA RETTANGOLO (da step = 2) elif self.step == 6: # dopo aver atteso un punto si riavvia il comando keyWords = QadMsg.translate("Command_RECTANGLE", "Length") + "/" + \ QadMsg.translate("Command_RECTANGLE", "Width") englishKeyWords = "Length" + "/" + "Width" if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse self.defaultValue = QadMsg.translate("Command_RECTANGLE", "Length") prompt = QadMsg.translate("Command_RECTANGLE", "Calcolate the rectangle dimensions based on [{0}] <{1}>: ").format(keyWords, self.defaultValue) keyWords += "_" + englishKeyWords # si appresta ad attendere una parola chiave # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 7 return False else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == float: # é stata inserita l'area self.area = value self.defaultValue = QadMsg.translate("Command_RECTANGLE", "Length") prompt = QadMsg.translate("Command_RECTANGLE", "Calcolate the rectangle dimensions based on [{0}] <{1}>: ").format(keyWords, self.defaultValue) keyWords += "_" + englishKeyWords # si appresta ad attendere una parola chiave # msg, inputType, default, keyWords, valori positivi self.waitFor(prompt, QadInputTypeEnum.KEYWORDS, \ self.defaultValue, \ keyWords, QadInputModeEnum.NONE) self.step = 7 return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA MODALITA' (LUNGHEZZA / LARGHEZZA) DATA L'AREA (da step = 6) elif self.step == 7: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: return False else: # il punto arriva come parametro della funzione value = msg if value == QadMsg.translate("Command_RECTANGLE", "Length") or value == "Length": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Enter length for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 8 self.GetDistClass.run(msgMapTool, msg) elif value == QadMsg.translate("Command_RECTANGLE", "Width") or value == "Width": if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Enter width for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 9 self.GetDistClass.run(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA RICHIESTA LUNGHEZZA RETTANGOLO DATA L'AREA (da step = 7) elif self.step == 8: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByAreaAndLength(self.firstCorner, self.area, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA LARGHEZZA RETTANGOLO DATA L'AREA (da step = 7) elif self.step == 9: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByAreaAndWidth(self.firstCorner, self.area, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA LUNGHEZZA RETTANGOLO (da step = 2) elif self.step == 10: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.dim1 = self.GetDistClass.dist if self.GetDistClass is not None: del self.GetDistClass self.GetDistClass = QadGetDistClass(self.plugIn) prompt = QadMsg.translate("Command_RECTANGLE", "Enter width for rectangle <{0}>: ") self.GetDistClass.msg = prompt.format(str(self.dim1)) self.GetDistClass.dist = self.dim1 self.step = 11 self.GetDistClass.run(msgMapTool, msg) return False #========================================================================= # RISPOSTA ALLA RICHIESTA LARGHEZZA RETTANGOLO (da step = 10) elif self.step == 11: if self.GetDistClass.run(msgMapTool, msg) == True: if self.GetDistClass.dist is not None: self.vertices.extend(qad_utils.getRectByCornerAndDims(self.firstCorner, self.dim1, self.GetDistClass.dist, \ self.rot, self.gapType, self.gapValue1, self.gapValue2)) if self.virtualCmd == False: # se si vuole veramente salvare i buffer in un layer self.addRectangleToLayer(currLayer) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE RETTANGOLO (da step = 2) elif self.step == 12: # dopo aver atteso un punto si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = self.defaultValue else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_RECTANGLE", "Points") or value == "Points": # si appresta ad attendere l'angolo di rotazione if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) self.GetAngleClass.msg = QadMsg.translate("Command_RECTANGLE", "Specify first point: ") self.GetAngleClass.angle = self.rot self.step = 13 self.GetAngleClass.run(msgMapTool, msg) elif type(value) == QgsPoint: self.rot = qad_utils.getAngleBy2Pts(self.firstCorner, value) self.WaitForSecondCorner(currLayer) elif type(value) == float: self.rot = qad_utils.toRadians(value) self.WaitForSecondCorner(currLayer) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ROTAZIONE RETTANGOLO (da step = 12) elif self.step == 13: if self.GetAngleClass.run(msgMapTool, msg) == True: if self.GetAngleClass.angle is not None: self.rot = self.GetAngleClass.angle self.plugIn.setLastRot(self.rot) self.WaitForSecondCorner(currLayer) self.getPointMapTool().refreshSnapType() # aggiorno lo snapType che può essere variato dal maptool di rotazione
def run(self, msgMapTool = False, msg = None): if self.plugIn.canvas.mapRenderer().destinationCrs().geographicFlag(): self.showMsg(QadMsg.translate("QAD", "\nIl sistema di riferimento del progetto deve essere un sistema di coordinate proiettate.\n")) return True # fine comando if self.dimStyle is None: self.showMsg(QadMsg.translate("QAD", "\nStile di quotatura corrente non valido.\nVerificare il valore della variabile DIMSTYLE.\n")) return True # fine comando errMsg = self.dimStyle.getInValidErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando errMsg = self.dimStyle.getNotGraphEditableErrMsg() if errMsg is not None: self.showMsg(errMsg) return True # fine comando #========================================================================= # RICHIESTA SELEZIONE ORIGINE PRIMA LINEA DI ESTENSIONE if self.step == 0: # inizio del comando self.waitForFirstPt() return False #========================================================================= # RISPOSTA ALLA RICHIESTA ORIGINE PRIMA LINEA DI ESTENSIONE (da step = 0) elif self.step == 1: if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse value = None # opzione di default None else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False else: value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if value is None: self.waitForEntsel(msgMapTool, msg) else: self.dimPt1.set(value.x(), value.y()) self.waitForSecondPt() return False #========================================================================= # RISPOSTA ALLA SELEZIONE DI UN'ENTITA' (da step = 1) elif self.step == 2: if self.EntSelClass.run(msgMapTool, msg) == True: if self.EntSelClass.entity.isInitialized(): result = getStartEndPointClosestPartWithContext(self.EntSelClass.entity, \ self.EntSelClass.point, \ self.plugIn.canvas.mapRenderer().destinationCrs()) if result is not None: if (type(result) == list or type(result) == tuple): # se é una lista di 2 punti self.dimPt1 = result[0] self.dimPt2 = result[1] else: objType = result.whatIs() if objType == "ARC": # se é arco self.dimPt1 = result.getStartPt() self.dimPt2 = result.getEndPt() elif objType == "CIRCLE": # se é cerchio self.dimCircle = result intPts = self.dimCircle.getIntersectionPointsWithInfinityLine(self.dimCircle.center, self.EntSelClass.point) if len(intPts) == 2: self.dimPt1 = intPts[0] self.dimPt2 = intPts[1] self.waitForDimensionLinePos() return False else: self.showMsg(QadMsg.translate("Command_DIM", "Non ci sono geometrie in questa posizione.")) self.waitForEntsel(msgMapTool, msg) return False # continua #========================================================================= # RISPOSTA ALLA RICHIESTA ORIGINE SECONDA LINEA DI ESTENSIONE (da step = 1) elif self.step == 3: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if value is None: return True if type(value) == QgsPoint: # se é stato inserito il secondo punto self.dimPt2.set(value.x(), value.y()) self.waitForDimensionLinePos() return False #========================================================================= # RISPOSTA ALLA RICHIESTA DELLA POSIZIONE DELLA LINEA DI QUOTA (da step = 2 e 3) elif self.step == 4: # dopo aver atteso un punto o un numero reale si riavvia il comando if msgMapTool == True: # il punto arriva da una selezione grafica # la condizione seguente si verifica se durante la selezione di un punto # é stato attivato un altro plugin che ha disattivato Qad # quindi stato riattivato il comando che torna qui senza che il maptool # abbia selezionato un punto if self.getPointMapTool().point is None: # il maptool é stato attivato senza un punto if self.getPointMapTool().rightButton == True: # se usato il tasto destro del mouse return True # fine comando else: self.setMapTool(self.getPointMapTool()) # riattivo il maptool return False value = self.getPointMapTool().point else: # il punto arriva come parametro della funzione value = msg if type(value) == unicode: if value == QadMsg.translate("Command_DIM", "Testo"): prompt = QadMsg.translate("Command_DIM", "Digitare il testo di quota <{0}>: ") dist = qad_utils.getDistance(self.dimPt1, self.dimPt2) self.waitForString(prompt.format(str(dist)), dist) self.getPointMapTool().setMode(Qad_dim_maptool_ModeEnum.ASK_FOR_TEXT) self.step = 5 elif value == QadMsg.translate("Command_DIM", "Angolo"): # si appresta ad attendere l'angolo di rotazione del testo if self.GetAngleClass is not None: del self.GetAngleClass self.GetAngleClass = QadGetAngleClass(self.plugIn) prompt = QadMsg.translate("Command_DIM", "Specificare l'angolo del testo di quota <{0}>: ") self.GetAngleClass.msg = prompt.format(str(qad_utils.toDegrees(self.dimStyle.textForcedRot))) self.GetAngleClass.angle = self.dimStyle.textForcedRot self.step = 6 self.GetAngleClass.run(msgMapTool, msg) elif type(value) == QgsPoint: # se é stato inserito il punto di posizionamento linea quota self.dimPt1 = self.getPointMapTool().dimPt1 self.dimPt2 = self.getPointMapTool().dimPt2 self.addDimToLayers(value) return True # fine comando return False #========================================================================= # RISPOSTA ALLA RICHIESTA DEL TESTO (da step = 4) elif self.step == 5: # dopo aver atteso una stringa si riavvia il comando if type(msg) == unicode: text = msg.strip() if len(text) > 0: self.measure = text self.getPointMapTool().measure = self.measure self.waitForDimensionLinePos() return False