Skip to content

Instantly share code, notes, and snippets.

@SrNetoChan
Last active March 22, 2023 11:40
Show Gist options
  • Save SrNetoChan/6e4bec315749e3d65e3b7c91bb0a98ad to your computer and use it in GitHub Desktop.
Save SrNetoChan/6e4bec315749e3d65e3b7c91bb0a98ad to your computer and use it in GitHub Desktop.
Alterar formularios de Camadas recart para serem mais faceis de editar
def field_readonly(layer, fieldname, option = True):
'''
Tornar o campo de uma camada vectorial nao editavel
'''
if layer.type() != QgsMapLayer.VectorLayer:
return
fields = layer.fields()
field_idx = fields.indexOf(fieldname)
if field_idx >= 0:
form_config = layer.editFormConfig()
form_config.setReadOnly(field_idx, option)
layer.setEditFormConfig(form_config)
return
def field_to_datetime(layer, fieldname):
'''
Configurar campo do tipo data de uma camada vectorial como DateTime
Define um default now() no campo
'''
if layer.type() != QgsMapLayer.VectorLayer:
return
config = {'allow_null': True,
'calendar_popup': True,
'display_format': 'yyyy-MM-dd HH:mm:ss',
'field_format': 'yyyy-MM-dd HH:mm:ss',
'field_iso_format': False}
type = 'DateTime'
fields = layer.fields()
field_idx = fields.indexOf(fieldname)
if field_idx >= 0:
widget_setup = QgsEditorWidgetSetup(type,config)
layer.setEditorWidgetSetup(field_idx, widget_setup)
layer.setDefaultValueDefinition(field_idx, QgsDefaultValue('now()'))
return
def field_to_value_relation(layer):
'''
Configura os campos de uma camada vectorial com widget value relation
usando camadas auxiliar com nome semelhante
'''
if layer.type() != QgsMapLayer.VectorLayer:
return
fields = layer.fields()
pattern = re.compile(r'^valor_')
fields_valor = [field for field in fields if pattern.match(field.name())]
if len(fields_valor) > 0:
config = {'AllowMulti': False,
'AllowNull': True,
'FilterExpression': '',
'Key': 'identificador',
'Layer': '',
'NofColumns': 1,
'OrderByValue': False,
'UseCompleter': False,
'Value': 'descricao'}
for field in fields_valor:
field_idx = fields.indexOf(field.name())
if field_idx >= 0:
print(field)
try:
target_layer = QgsProject.instance().mapLayersByName(field.name())[0]
config['Layer'] = target_layer.id()
widget_setup = QgsEditorWidgetSetup('ValueRelation',config)
layer.setEditorWidgetSetup(field_idx, widget_setup)
except:
pass
else:
return False
else:
return False
return True
project = QgsProject.instance()
layers = project.mapLayers()
for layer in layers.values():
field_readonly(layer,'identificador')
field_readonly(layer,'fim_objecto')
field_to_datetime(layer,'inicio_objeto')
field_to_value_relation(layer)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment