Quantcast
Channel: Forums - Python
Viewing all articles
Browse latest Browse all 2485

Subset Selection in Python Add-in tool

$
0
0
Can anybody tell me why the second combo box (subset selection) does not become enabled in python add-in?
Here is a picture and code...

Attachment 21258

Code:

import arcpy
import pythonaddins
#Clear any Selections there may be on the Document before it is opened
#set the layer variable to the first layer in the map document(coded inline with layer)
layer = arcpy.mapping.ListLayers(arcpy.mapping.MapDocument("CURRENT"))[0]
# Select the layer to clear any Current selection on the map
arcpy.SelectLayerByAttribute_management(layer,"CLEAR_SELECTION")
#refresh the active view of the map document
arcpy.RefreshActiveView()


class Survey(object):
    """Implementation for MapperTest_addin.combobox1 (ComboBox)"""
    def __init__(self):
        #in the initialisation of the addin
        self.items = []
        self.editable = True
        self.enabled = True
        self.dropdownWidth = 'WWWWWW'
        self.width = 'WWWWWW'
        #set the map document reference
        mxd = arcpy.mapping.MapDocument("CURRENT")
        #set the dataframe reference using the map document and the first data frame in the list
        df = arcpy.mapping.ListDataFrames(mxd)[0]
        #set the layer reference using the map document reference and the first layer in the list of layers
        layer = arcpy.mapping.ListLayers(mxd)[0]
        # check if the layer exists
        if layer:
            #create a column name variable for the search cursor parameters
            column_Survey = "L1SURNAM"
            #create a search cursor for the survey name field
            sc = arcpy.SearchCursor(layer,""""L1SURNAM" <> ' '""","",column_Survey,column_Survey)
            #Due to the multiple values stored in the attribute table a dictionary had to be used
            #Create a dictionary
            dictionary = {}
            #for loop to iterate through the attribute tables getting the values for the column
            for row in sc:
                #set the value as the row value in the column Survey
                val = row.getValue(column_Survey)
                #the nature of dictionaries does not allow for duplicates thus handling the redundant block numbers in the data table for use in the combobox
                dictionary[val] = val
                #create a list of items for the dictionary's unique keys to be written to
            Items = []
            #for loop to iterate through the keys in the dictionary
            for key in dictionary.iterkeys():
                #append the key values to the list Items
                Items.append(key)
                #append the list of keys to the Survey(self) item list
                self.items.append(key)
            #sort keys in ascending numeric order
            self.items.sort()
        #delete row variable
        del row
        #delete search cursor
        del sc

    def onSelChange(self, selection):
        #set the map document reference
        mxd = arcpy.mapping.MapDocument("CURRENT")
        #set the dataframe reference using the map document and the first data frame in the list
        df = arcpy.mapping.ListDataFrames(mxd)[0]
        #set the layer reference using the map document reference and the first layer in the list of layers
        layer = arcpy.mapping.ListLayers(mxd)[0]
        #Use the select by attributed tool to create a new selection of the survey based on the selection in the combobox
        arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION","L1SURNAM = '" + selection + "'")
        #zoom to the selected features in the dataframe
        df.zoomToSelectedFeatures()
        #refresh the active view
        arcpy.RefreshActiveView()
        #if the layer exists
        if layer:
            #empty the block number item list
            Block.items = []
            #create a variable for the block number
            column_Block = "L2BLOCK"
            #create a search cursor for the layer on the lot number field selecting all the values that are not an empty string
            sc = arcpy.SearchCursor(layer,""""L2BLOCK" <> ' '""","",column_Block,column_Block)
            #for loop to read through the values in the block number field
            for row in sc:
                #append the lot number items to the block number item list
                LotNumber.items.append(row.getValue(column_Block))
                #once a selection is made the block number box becomes active
                Block.enabled = True
        #delete row variable
        del row
        #delete rsearch cursor
        del sc
    def onEditChange(self, text):
        #create a variable to store the text in for the selection tool
        surNam = text
        #set the map document reference
        mxd = arcpy.mapping.MapDocument("CURRENT")
        #set the dataframe reference using the map document and the first data frame in the list
        df = arcpy.mapping.ListDataFrames(mxd)[0]
        #set the layer reference using the map document reference and the first layer in the list of layers
        layer = arcpy.mapping.ListLayers(mxd)[0]
        #Selection tool used to select the values in the layer where the survey name is the value that is typed into the combo box
        arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION","L1SURNAM = '" + surNam + "'")
        #Zoom to the selected features
        df.zoomToSelectedFeatures()

    def onFocus(self, focused):
        pass
    def onEnter(self):
        pass
    def refresh(self):
        pass


class Block(object):
    """Implementation for MapperTest_addin.combobox2 (ComboBox)"""
    def __init__(self):
        self.items = []
        self.editable = True
        #only activated when block number is populated
        self.enabled = False
        self.dropdownWidth = 'WWWWWW'
        self.width = 'WWWWWW'
    def onSelChange(self, selection):
        blockNum = selection
        #set the map document reference
        mxd = arcpy.mapping.MapDocument("CURRENT")
        #set the dataframe reference using the map document and the first data frame in the list
        df = arcpy.mapping.ListDataFrames(mxd)[0]
        #set the layer reference using the map document reference and the first layer in the list of layers
        layer = arcpy.mapping.ListLayers(mxd)[0]
        #select a subset from the selected fields of blocknumber
        arcpy.SelectLayerByAttribute_management(layer,"SUBSET_SELECTION","L2BLOCK = '" + blockNum + "'")
        df.zoomToSelectedFeatures()
        arcpy.RefreshActiveView()
    def onEditChange(self, text):
        pass
    def onFocus(self, focused):
        pass
    def onEnter(self):
        pass
    def refresh(self):
        pass

Attached Thumbnails
Click image for larger version

Name:	Database_Toolbar.jpg‎
Views:	N/A
Size:	6.0 KB
ID:	21258  

Viewing all articles
Browse latest Browse all 2485

Latest Images

Trending Articles



Latest Images