Suite

Ajout d'Arc Python - remplissage dynamique de la liste déroulante

Ajout d'Arc Python - remplissage dynamique de la liste déroulante


J'essaie mon tout premier complément Python. Ce que je voudrais qu'il fasse, c'est de regarder une classe d'entités, de regarder à travers le champ de la ville. lorsque l'utilisateur sélectionne une ville, je veux que la zone de liste déroulante suivante se remplisse avec le champ LABELTEXT avec toutes les valeurs de cette ville et lorsqu'un LABELTEXT est sélectionné, zoom sur ce mauvais garçon.

Je ne sais pas comment obtenir le retour de la ville dans la classe ComboClass2 ou créer la requête pour filtrer en fonction du résultat de la ville

class ComboBoxClass1(object): """Implémentation pour addin2_addin.combobox (ComboBox)""" def __init__(self): self.editable = True self.enabled = True self.dropdownWidth = 'WWWWWWWWWWWWWWWW' self.width = 'WWWWWWWWWWWWWWWW' def onSelChange(self, selection): layer = arcpy.mapping.ListLayers(mxd, "block_cards", df)[0] a = arcpy.SelectLayerByAttribute_management(layer, "NEW_SELECTION", "town = '" + selection + "'" "'") renvoie un df.extent = layer.getSelectedExtent() arcpy.RefreshActiveView() def onFocus(self, focus): global mxd mxd = arcpy.mapping.MapDocument('current') global df df = arcpy.mapping. ListDataFrames(mxd, "Layers")[0] layer = arcpy.mapping.ListLayers(mxd, "block_cards", df)[0] arcpy.SelectLayerByAttribute_management(layer, "CLEAR_SELECTION") self.items = [] values ​​= [row [0] pour la ligne dans arcpy.da.SearchCursor(layer, ["town"])] pour uniqueVal dans trié(set(values)): self.items.append(uniqueVal) class ComboBoxClass2(object): """Implémentation pour addin2_addin.combobox (ComboBox)""" de f __init__(self): self.editable = True self.enabled = True self.dropdownWidth = 'WWWWWW' self.width = 'WWWWWW' def onSelChange(self, selection): layer = arcpy.mapping.ListLayers(mxd, "block_cards) ", df)[0] arcpy.SelectLayerByAttribute_management(layer, "NEW_SELECTION", "town = '" + ComboBoxClass1.onSelChange() + "' AND LABELTEXT = '" + selection + "'" ) df.extent = layer.getSelectedExtent () arcpy.RefreshActiveView() def onFocus(self, focus): global mxd mxd = arcpy.mapping.MapDocument('current') global df df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0] layer = arcpy.mapping.ListLayers(mxd, "block_cards", df)[0] arcpy.SelectLayerByAttribute_management(layer, "CLEAR_SELECTION") self.items = [] values ​​= [row[0] pour la ligne dans arcpy.da.SearchCursor(layer , ["LABELTEXT"])] pour uniqueVal dans trié(set(valeurs)): self.items.append(uniqueVal)

Merci à tous pour les réponses. tellement mieux que geonet. J'ai pu ressembler à un maniaque avec le code ci-dessous.

class ComboBoxClass1(object): """Implémentation pour addin2_addin.combobox (ComboBox)""" def __init__(self): self.editable = True self.enabled = True self.dropdownWidth = 'W' * 16 self.width = ' W' * 16 mxd = arcpy.mapping.MapDocument("CURRENT") self.mxd = arcpy.mapping.MapDocument("CURRENT") self.df = arcpy.mapping.ListDataFrames(mxd)[0] def onSelChange(self, selection): layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df)[0] a = arcpy.SelectLayerByAttribute_management(layer, "NEW_SELECTION", "town = '{}'".format(selection )) self.df.extent = layer.getSelectedExtent() arcpy.RefreshActiveView() def onFocus(self, focus): layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df)[0] arcpy .SelectLayerByAttribute_management(layer, "CLEAR_SELECTION") self.items = trié(list(set(filter(None, [row[0] for row in arcpy.da.SearchCursor(layer, ["town"])])))) class ComboBoxClass2(object): """Implémentation pour addin2_addin.combobox (ComboBox)""" def __init__(self): self.edita ble = True self.enabled = True self.dropdownWidth = 'W' * 6 self.width = 'W' * 6 mxd = arcpy.mapping.MapDocument("CURRENT") self.mxd = arcpy.mapping.MapDocument('current ') self.df = arcpy.mapping.ListDataFrames(mxd)[0] def onSelChange(self, selection): layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df)[0] arcpy. SelectLayerByAttribute_management(layer, "NEW_SELECTION", "town = '{}' AND LABELTEXT = '{}'".format(combobox.value, selection)) self.df.extent = layer.getSelectedExtent() arcpy.RefreshActiveView() def onFocus(self, focus): layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df)[0] arcpy.SelectLayerByAttribute_management(layer, "CLEAR_SELECTION") expression = "town = '{}'" .format(combobox.value) self.items = trié(list(set(filter(None, [row[0] for row in arcpy.da.SearchCursor(layer, ["LABELTEXT"], where_clause=expression)])) ))

Pour obtenir la valeur de votre valeur ComboboxClass1, vous devez rechercher dans le config.xml pour cette classe et tout ce qui est après la période est ce que vous devez référencer. Étant donné que vous avez plus d'une liste déroulante, je pense que vous voudriez vous assurer que ces classes ont des noms uniques après la période où vous configurez le complément.

ÉDITER:

Cela étant dit, vous ne voulez pas exécuter de tâches à partir de la liste déroulante. Au lieu de cela, vous pouvez demander à l'utilisateur de sélectionner des valeurs dans deux listes déroulantes, puis d'avoir un bouton pour exécuter la requête. Je retournerais donc à l'assistant d'ajout et créerais un bouton pour l'exécuter.

Voilà comment je ferais :

import arcpy import pythonaddins class Query(object): """Implémentation pour addin2_addin.button (Button)""" def __init__(self): self.enabled = True self.checked = False self.mxd = arcpy.mapping.MapDocument( 'current') self.df = self.mxd.activeDataFrame self.layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df)[0] def onClick(self): # sélectionnez les fonctionnalités arcpy.SelectLayerByAttribute_management (self.layer, "NEW_SELECTION", "town = '{}' AND LABELTEXT = '{}'".format(combobox.value, combobox_1.value)) #en supposant que ce sont les noms propres self.df.extent = self .layer.getSelectedExtent() arcpy.RefreshActiveView() class ComboBoxClass1(object): """Implémentation pour addin2_addin.combobox (ComboBox)""" def __init__(self): self.editable = True self.enabled = True self.dropdownWidth = 'W' * 16 self.width = 'W' * 16 def onSelChange(self, selection): mxd = arcpy.mapping.MapDocument('current') layer = arcpy.mapping.ListLayers(mxd, "block_cards", df )[0] arcpy.SelectLayerByAttribute_management(l ayer, "CLEAR_SELECTION") self.mxd = arcpy.mapping.MapDocument('current') self.df = self.mxd.activeDataFrame self.layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df )[0] arcpy.RefreshActiveView() def onFocus(self, focus): layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", df)[0] self.items = trié(list(set(filter( Aucun, [row[0] pour la ligne dans arcpy.da.SearchCursor(layer, ["town"])])))) classe ComboBoxClass2(object): """Implémentation pour addin2_addin.combobox (ComboBox)""" def __init__(self): self.editable = True self.enabled = True self.dropdownWidth = 'W' * 6 self.width = 'W' * 6 self.mxd = arcpy.mapping.MapDocument('current') self.layer = arcpy.mapping.ListLayers(self.mxd, "block_cards", self.df)[0] def onSelChange(self, selection): arcpy.SelectLayerByAttribute_management(self.layer, "CLEAR_SELECTION") arcpy.RefreshActiveView() def onFocus( self, focus): self.items = trié(list(set(filter(None, [row[0] for row in arcpy.da.SearchCursor(self.layer, ["LABELTEXT"])])) ))

Vous pouvez trouver les noms de classe combobox dans le config.xml comme ce complément que j'ai construit dans le passé :

Voici un exemple d'un complément que j'ai créé dans le passé qui trouve des fonctionnalités non connectées et utilise 2 listes déroulantes. Peut-être pas parfait, mais montre un exemple d'utilisation de 2 listes déroulantes et d'un bouton :

import arcpy import pythonaddins class Query(object): """Implémentation pour FindUnconnectedFeatures_addin.button (Button)""" def __init__(self): self.enabled = True self.checked = False def onClick(self): mxd = arcpy. mapping.MapDocument('Current') df = mxd.activeDataFrame targ = arcpy.mapping.ListLayers(mxd, combobox.value)[0] source = arcpy.mapping.ListLayers(mxd, combobox_1.value)[0] sel = ' INTERSECT' # sélectionner par emplacement arcpy.SelectLayerByLocation_management(targ, sel, source) arcpy.SelectLayerByAttribute_management(targ, 'SWITCH_SELECTION') class SourceLayer(object): """Implémentation pour FindUnconnectedFeatures_addin.combobox_1 (ComboBox)""" def __init ): self.items = [] self.editable = True self.enabled = True self.dropdownWidth = 'W' * 12 self.width = 'W' * 12 def onSelChange(self, selection): pass def onEditChange(self, text): pass def onFocus(self, focus): si focus: self.mxd = arcpy.mapping.MapDocument('current') self.df = self.mxd.activeDataFrame lyrs = [l.name for l dans arcpy.mapping.ListLayers(self.mxd, '*', self.df) sinon l.isBroken et l.supports('DATASOURCE')] self.items = triés(lyrs) del self.mxd def onEnter( self): pass def refresh(self): pass class TargLayer(object): """Implémentation pour FindUnconnectedFeatures_addin.combobox (ComboBox)""" def __init__(self): self.items = [] self.editable = True self. enabled = True self.dropdownWidth = 'W' * 12 self.width = 'W' * 12 def onSelChange(self, selection): pass def onEditChange(self, text): pass def onFocus(self, focus): si focus: self.mxd = arcpy.mapping.MapDocument('current') self.df = self.mxd.activeDataFrame lyrs = [l.name pour l dans arcpy.mapping.ListLayers(self.mxd, '*', self.df) sinon l.isBroken et l.supports('DATASOURCE')] self.items = triés(lyrs) del self.mxd def onEnter(self): pass def refresh(self): pass

Voir la vidéo: ArcGIS Model Tool4: Create a Python Script Tool