class ExecuteSQLWidget(BASE, WIDGET): def __init__(self, dialog): super(ExecuteSQLWidget, self).__init__(None) self.setupUi(self) self.dialog = dialog self.dialogType = dialogTypes[dialog.__class__.__name__] self.mExpressionWidget = QgsFieldExpressionWidget() # add model parameters in context scope if called from modeler if self.dialogType == DIALOG_MODELER: strings = dialog.getAvailableValuesOfType( [QgsProcessingParameterString, QgsProcessingParameterNumber], []) model_params = [dialog.resolveValueDescription(s) for s in strings] scope = QgsExpressionContextScope() for param in model_params: var = QgsExpressionContextScope.StaticVariable(param) scope.addVariable(var) self.mExpressionWidget.appendScope(scope) self.mHLayout.insertWidget(0, self.mExpressionWidget) self.mInsert.clicked.connect(self.insert) def insert(self): if self.mExpressionWidget.currentText(): exp = '[%{}%]'.format(self.mExpressionWidget.currentText()) self.mText.insertPlainText(exp) def setValue(self, value): text = value if self.dialogType == DIALOG_MODELER: if isinstance(value, list): for v in value: if isinstance(v, QgsProcessingModelChildParameterSource) \ and v.source() == QgsProcessingModelChildParameterSource.ExpressionText: text = v.expressionText() # replace parameter's name by expression (diverging after model save) names = QgsExpression.referencedVariables(text) strings = self.dialog.getAvailableValuesOfType( [QgsProcessingParameterString, QgsProcessingParameterNumber], []) model_params = [(self.dialog.resolveValueDescription(s), s) for s in strings] for k, v in model_params: if v.parameterName() in names: text = text.replace('[% @{} %]'.format(v.parameterName()), '[% @{} %]'.format(k)) self.mText.setPlainText(text) def value(self): value = self.mText.toPlainText() if self.dialogType == DIALOG_MODELER: expression_values = self._expressionValues(value) if len(expression_values) > 1: value = expression_values return value def _expressionValues(self, text): strings = self.dialog.getAvailableValuesOfType( [QgsProcessingParameterString, QgsProcessingParameterNumber], []) model_params = [(self.dialog.resolveValueDescription(s), s) for s in strings] variables = QgsExpression.referencedVariables(text) # replace description by parameter's name (diverging after model save) descriptions = QgsExpression.referencedVariables(text) for k, v in model_params: if k in descriptions: text = text.replace('[% @{} %]'.format(k), '[% @{} %]'.format(v.parameterName())) src = QgsProcessingModelChildParameterSource.fromExpressionText(text) # add parameters currently used by the expression expression_values = [] expression_values.append(src) for k, v in model_params: if k in variables: expression_values.append(v) return expression_values
class vectorLayerPropertyDlg(QDialog): ''' classdocs ''' def __init__(self, parent, layer): ''' Constructor ''' QDialog.__init__(self, parent) self.ui = Ui_VectorLayerProPertyDialog() self.ui.setupUi(self) self.ui.txtLayerName.setText(layer.name()) self.ui.txtLayerSource.setText(layer.source()) self.ui.txtCrs.setText(layer.crs().authid() + " - " + layer.crs().description()) self.ui.btnCrsSelect.clicked.connect(self.selectCrs) self.mCrs = layer.crs() self.vLayer = layer self.ui.mOptionsListWidget.currentRowChanged.connect( self.changeStackWidget) ''' init RenderV2 Widget''' self.mRendererDialog = QgsRendererV2PropertiesDialog( self.vLayer, QgsStyleV2.defaultStyle(), True) self.ui.stackedWidget.insertWidget(1, self.mRendererDialog) self.ui.buttonBox.accepted.connect(self.OK) frame_Label = QFrame() verticalLayout_Label = QVBoxLayout(frame_Label) self.mLabelWidget = QgsFieldExpressionWidget() self.mLabelWidget.setLayer(layer) verticalLayout_Label.addWidget(self.mLabelWidget) spacerItem = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) verticalLayout_Label.addItem(spacerItem) frame_Label.setLayout(verticalLayout_Label) self.ui.stackedWidget.insertWidget(2, frame_Label) # self.ui.buttonBox.accepted.connect(self.OK) def selectCrs(self): projectionDlg = QgsGenericProjectionSelector(self) projectionDlg.setSelectedAuthId(self.mCrs.authid()) if projectionDlg.exec_(): self.mCrs = QgsCoordinateReferenceSystem( projectionDlg.selectedCrsId(), QgsCoordinateReferenceSystem.InternalCrsId) self.ui.txtCrs.setText(self.mCrs.authid() + " - " + self.mCrs.description()) def changeStackWidget(self, index): self.ui.stackedWidget.setCurrentIndex(index) def OK(self): self.vLayer.setCrs(self.mCrs) self.mRendererDialog.apply() self.vLayer.triggerRepaint() if self.ui.stackedWidget.currentIndex( ) == 2 and self.mLabelWidget.currentText() != "": self.vLayer.setCustomProperty("labeling", "pal") self.vLayer.setCustomProperty("labeling/enabled", "true") self.vLayer.setCustomProperty("labeling/fontFamily", "Arial") self.vLayer.setCustomProperty("labeling/fontSize", "8") self.vLayer.setCustomProperty("labeling/fieldName", self.mLabelWidget.currentText()) # palLayerSetting = QgsPalLayerSettings() # palLayerSetting.readFromLayer(self.vLayer) # palLayerSetting.enabled = True # palLayerSetting.fieldName = self.mLabelWidget.currentText() # palLayerSetting.isExpression = True if self.vLayer.geometryType() == QGis.Line: self.vLayer.setCustomProperty("labeling/placement", "2") self.vLayer.setCustomProperty( "labeling/placementFlags", str(QgsPalLayerSettings.AboveLine)) # palLayerSetting.placement = QgsPalLayerSettings.Line # palLayerSetting.placementFlags = QgsPalLayerSettings.AboveLine elif self.vLayer.geometryType() == QGis.Point: self.vLayer.setCustomProperty("labeling/placement", "0") self.vLayer.setCustomProperty( "labeling/placementFlags", str(QgsPalLayerSettings.AroundPoint)) # self.vLayer.setCustomProperty("labeling/placementFlags", "0") # palLayerSetting.placement = QgsPalLayerSettings.Points # palLayerSetting.placementFlags = QgsPalLayerSettings.AroundPoint else: self.vLayer.setCustomProperty("labeling/placement", "3") self.vLayer.setCustomProperty( "labeling/placementFlags", str(QgsPalLayerSettings.AboveLine)) # palLayerSetting.placement = QgsPalLayerSettings.PolygonBoundary # palLayerSetting.placementFlags = QgsPalLayerSettings.AboveLine # palLayerSetting.setDataDefinedProperty(QgsPalLayerSettings.Size, True, True, '8', "") # palLayerSetting.writeToLayer(self.vLayer) elif self.ui.stackedWidget.currentIndex( ) == 2 and self.mLabelWidget.currentText() == "": self.vLayer.setCustomProperty("labeling", "") QgsProject.instance().dirty(True) QDialog.accept(self)
class ExecuteSQLWidget(BASE, WIDGET): def __init__(self, dialog): super(ExecuteSQLWidget, self).__init__(None) self.setupUi(self) self.dialog = dialog self.dialogType = dialogTypes[dialog.__class__.__name__] self.mExpressionWidget = QgsFieldExpressionWidget() # add model parameters in context scope if called from modeler if self.dialogType == DIALOG_MODELER: strings = dialog.getAvailableValuesOfType( [QgsProcessingParameterString, QgsProcessingParameterNumber], []) model_params = [dialog.resolveValueDescription(s) for s in strings] scope = QgsExpressionContextScope() for param in model_params: var = QgsExpressionContextScope.StaticVariable(param) scope.addVariable(var) self.mExpressionWidget.appendScope(scope) self.mHLayout.insertWidget(0, self.mExpressionWidget) self.mInsert.clicked.connect(self.insert) def insert(self): if self.mExpressionWidget.currentText(): exp = '[%{}%]'.format(self.mExpressionWidget.currentText()) self.mText.insertPlainText(exp) def setValue(self, value): text = value if self.dialogType == DIALOG_MODELER: if isinstance(value, list): for v in value: if isinstance(v, QgsProcessingModelChildParameterSource) \ and v.source() == QgsProcessingModelChildParameterSource.ExpressionText: text = v.expressionText() # replace parameter's name by expression (diverging after model save) names = QgsExpression.referencedVariables(text) strings = self.dialog.getAvailableValuesOfType( [QgsProcessingParameterString, QgsProcessingParameterNumber], []) model_params = [(self.dialog.resolveValueDescription(s), s) for s in strings] for k, v in model_params: if v.parameterName() in names: text = text.replace('[% @{} %]'.format(v.parameterName()), '[% @{} %]'.format(k)) self.mText.setPlainText(text) def value(self): value = self.mText.toPlainText() if self.dialogType == DIALOG_MODELER: expression_values = self._expressionValues(value) if len(expression_values) > 1: value = expression_values return value def _expressionValues(self, text): strings = self.dialog.getAvailableValuesOfType( [QgsProcessingParameterString, QgsProcessingParameterNumber], []) model_params = [(self.dialog.resolveValueDescription(s), s) for s in strings] variables = QgsExpression.referencedVariables(text) # replace description by parameter's name (diverging after model save) descriptions = QgsExpression.referencedVariables(text) for k, v in model_params: if k in descriptions: text = text.replace('[% @{} %]'.format(k), '[% @{} %]'.format(v.parameterName())) src = QgsProcessingModelChildParameterSource.fromExpressionText(text) # add parameters currently used by the expression expression_values = [] expression_values.append(src) for k, v in model_params: if k in variables: expression_values.append(v) return expression_values
class PresetRow(): def __init__(self, qgsfieldexpressionwidget=None, qgscolorbutton=None, qspinbox=None): self._qgsfieldexpressionwidget = qgsfieldexpressionwidget if qgsfieldexpressionwidget is None: self._qgsfieldexpressionwidget = QgsFieldExpressionWidget() self._qgscolorbutton = qgscolorbutton if qgscolorbutton is None: self._qgscolorbutton = QgsColorButton() self._qspinbox = qspinbox if qspinbox is None: self._qspinbox = QtGui.QSpinBox() self._last_feature = None def set_layer(self, layer_id): self._qgsfieldexpressionwidget.setLayer(layer_id) def __del__(self): self._qgsfieldexpressionwidget.deleteLater() self._qgsfieldexpressionwidget = None self._qgscolorbutton.deleteLater() self._qgscolorbutton = None self._qspinbox.deleteLater() self._qspinbox = None def __str__(self): return "{}-{}-{}".format(str(self._qgsfieldexpressionwidget), str(self._qgscolorbutton), str(self._qspinbox)) def __repr__(self): return self.__str__() def asLst(self): return self._qgscolorbutton, self._qgsfieldexpressionwidget, self._qspinbox @property def qgsfieldexp(self): return self._qgsfieldexpressionwidget @property def exp_txt(self): return self._qgsfieldexpressionwidget.currentText() @property def qgscolorbutton(self): return self._qgscolorbutton @property def qspinbox(self): return self._qspinbox @property def lvl(self): return self._qspinbox.value() def copy(self): field_expression_widget = QgsFieldExpressionWidget() field_expression_widget.setLayer( self._qgsfieldexpressionwidget.layer()) field_expression_widget.setField( self._qgsfieldexpressionwidget.currentText()) color_btn_widget = QgsColorButton() color_btn_widget.setColor(self._qgscolorbutton.color()) spinbox = QtGui.QSpinBox() spinbox.setValue(self._qspinbox.value()) return PresetRow(field_expression_widget, color_btn_widget, spinbox) #=========================================================================== # #=========================================================================== def dump(self): exp = self._qgsfieldexpressionwidget.currentText() #color=self._qgscolorbutton.color().name() color = self._qgscolorbutton.color().rgba() idx = self._qspinbox.value() res = {"exp": exp, "color": color, "idx": idx} return json.dumps(res) #======================================================================= # #======================================================================= def load(self, str_dump): res = json.loads(str_dump) self._qgsfieldexpressionwidget.setField(res["exp"]) #self._qgscolorbutton.color().setNamedColor(res["color"]) qcolor = self._qgscolorbutton.color() qcolor.setRgba(res["color"]) self._qgscolorbutton.setColor(qcolor) self._qspinbox.setValue(res["idx"]) @property def exp(self): return QgsExpression(self._qgsfieldexpressionwidget.asExpression()) @property def qcolor(self): return self._qgscolorbutton.color() @property def color_rgba(self): return self._qgscolorbutton.color().rgba() @property def color_hex(self): return self._qgscolorbutton.color().name() def setFeature(self, feature): self._last_feature = feature def execute(self, feature=None): if feature is not None: self.setFeature(feature) if self._last_feature is None: return None else: return self.exp.evaluate(self._last_feature)