首页 > 编程语言 > 详细

arcgis python 参数验证

时间:2019-08-16 18:24:54      阅读:67      评论:0      收藏:0      [点我收藏+]
import arcpy
class ToolValidator(object):
  """Class for validating a tool‘s parameter values and controlling
  the behavior of the tool‘s dialog."""

  def __init__(self):
    """Setup arcpy and the list of tool parameters."""
    self.params = arcpy.GetParameterInfo()

  def initializeParameters(self):
    """Refine the properties of a tool‘s parameters.  This method is
    called when the tool is opened."""
    return

  def updateParameters(self):
    """Modify the values and properties of parameters before internal
    validation is performed.  This method is called whenever a parameter
    has been changed."""
    if self.params[0].value:
        try:
            desc = arcpy.Describe(self.params[0].value)
            shapeType = desc.shapeType
            sr = desc.spatialReference
            gcsOrMercator = False if not sr.GCSName and sr.PCSName.upper().find("MERCATOR") == -1 else True

            if shapeType.upper() == "POINT":
                self.params[1].filter.list = ["POINT_X_Y_Z_M"]
            elif shapeType.upper() == "MULTIPOINT":
                self.params[1].filter.list = ["CENTROID", "PART_COUNT", "EXTENT"]
            elif shapeType.upper() == "POLYLINE":
                if desc.hasZ:
                    lineList = ["LENGTH", "LENGTH_GEODESIC", "LENGTH_3D", "LINE_START_MID_END", "CENTROID", "CENTROID_INSIDE", "PART_COUNT", "POINT_COUNT", "LINE_BEARING", "EXTENT"]
                else:
                    lineList = ["LENGTH", "LENGTH_GEODESIC", "LINE_START_MID_END", "CENTROID", "CENTROID_INSIDE", "PART_COUNT", "POINT_COUNT", "LINE_BEARING", "EXTENT"]
                self.params[1].filter.list = lineList
                if gcsOrMercator:
                    lineList.remove("LENGTH")
                    if desc.hasZ:
                        lineList.remove("LENGTH_3D")
                    self.params[1].filter.list = lineList
            elif shapeType.upper() == "POLYGON":
                polyList = ["AREA", "AREA_GEODESIC", "PERIMETER_LENGTH", "PERIMETER_LENGTH_GEODESIC", "CENTROID", "CENTROID_INSIDE", "LINE_START_MID_END", "PART_COUNT", "POINT_COUNT", "EXTENT"]
                self.params[1].filter.list = polyList
                if gcsOrMercator:
                    polyList.remove("AREA")
                    polyList.remove("PERIMETER_LENGTH")
                    self.params[1].filter.list = polyList

            if self.params[1].value:
                self.params[5].parameterDependencies = [0]
                self.params[5].schema.clone = True
                newFields = []
                propDict = {"POINT_X_Y_Z_M":            ["POINT_X",
                                                         "POINT_Y",
                                                         "POINT_Z",
                                                         "POINT_M"],
                            "PART_COUNT":               ["PART_COUNT"],
                            "CENTROID":                 ["CENTROID_X",
                                                         "CENTROID_Y",
                                                         "CENTROID_Z",
                                                         "CENTROID_M"],
                            "EXTENT":                   ["EXT_MIN_X",
                                                         "EXT_MIN_Y",
                                                         "EXT_MAX_X",
                                                         "EXT_MAX_Y"],
                            "POINT_COUNT":              ["PNT_COUNT"],
                            "LINE_START_MID_END":       ["START_X",
                                                         "START_Y",
                                                         "START_Z",
                                                         "START_M",
                                                         "MID_X",
                                                         "MID_Y",
                                                         "MID_Z",
                                                         "MID_M",
                                                         "END_X",
                                                         "END_Y",
                                                         "END_Z",
                                                         "END_M"],
                            "LINE_BEARING":             ["BEARING"],
                            "CENTROID_INSIDE":          ["INSIDE_X",
                                                         "INSIDE_Y",
                                                         "INSIDE_Z",
                                                         "INSIDE_M"],
                            "LENGTH":                   ["LENGTH"],
                            "PERIMETER_LENGTH":         ["PERIMETER"],
                            "AREA":                     ["POLY_AREA"],
                            "LENGTH_GEODESIC":          ["LENGTH_GEO"],
                            "AREA_GEODESIC":            ["AREA_GEO"],
                            "LENGTH_3D":                ["LENGTH_3D"],
                            "PERIMETER_LENGTH_GEODESIC":["PERIM_GEO"],
                            }
                currentFields = [x.name for x in desc.fields]
                for prop in str(self.params[1].value).split(";"):
                    try:
                        for field in propDict[prop]:
                            if not field in currentFields:
                                newField = arcpy.Field()
                                newField.type, newField.name = "DOUBLE", field
                                newFields.append(newField)
                    except:
                        pass
                self.params[5].schema.additionalFields = newFields
        except:
            pass
    return


  def updateMessages(self):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return
============================================================
class ToolValidator:
  """Class for validating a tool‘s parameter values and controlling
  the behavior of the tool‘s dialog."""

  def __init__(self):
    """Setup the Geoprocessor and the list of tool parameters."""
    import arcpy
    self.params = arcpy.GetParameterInfo()

  def initializeParameters(self):
    """Refine the properties of a tool‘s parameters.  This method is
    called when the tool is opened."""
    return

  def updateParameters(self):
    """Modify the values and properties of parameters before internal
    validation is performed.  This method is called whenever a parmater
    has been changed."""
    import arcpy

    if self.params[0].value:
      mxd = arcpy.mapping.MapDocument(self.params[0].value.value)
      
      #The following will display an error if mxd is not DDP enabled
      testDDP = mxd.dataDrivenPages

      #Generate unique list of layer names
      lyrs = arcpy.mapping.ListLayers(mxd)
      layerList = []
      for lyr in lyrs:
        layerList.append(lyr.name)
      uniqueLayerList = list(set(layerList))
      uniqueLayerList.sort()
      
      if not self.params[1].altered:
        self.params[1].filter.list = uniqueLayerList

      #Generate unique list of field names
      if self.params[1].altered:
        selectedLayer = self.params[1].value
        layerRef = arcpy.mapping.ListLayers(mxd, selectedLayer)[0]
        fields = arcpy.ListFields(layerRef.dataSource)
        fieldList = []
        for field in fields:
          fieldList.append(field.name)
        uniqueFieldList = list(set(fieldList))
        uniqueFieldList.sort()
        self.params[2].filter.list = uniqueFieldList

      #Generate unique list of page names
      if self.params[2].altered:
        fieldName = self.params[2].value
        rows = arcpy.SearchCursor(layerRef.dataSource)
        row = rows.next()
        pageNameList = []
        while row:
          if row.getValue(fieldName) not in pageNameList:
            pageNameList.append(row.getValue(fieldName))
          row = rows.next()
        pageNameList.sort()
        self.params[3].filter.list = pageNameList
        
      #Generate the printer list   
      printerList = arcpy.mapping.ListPrinterNames()
      if not self.params[1].altered:
        self.params[4].filter.list = printerList

    return

  def updateMessages(self):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return

 

 

 

class ToolValidator:  """Class for validating a tool‘s parameter values and controlling  the behavior of the tool‘s dialog."""
  def __init__(self):    """Setup the Geoprocessor and the list of tool parameters."""    import arcpy    self.params = arcpy.GetParameterInfo()
  def initializeParameters(self):    """Refine the properties of a tool‘s parameters.  This method is    called when the tool is opened."""    return
  def updateParameters(self):    """Modify the values and properties of parameters before internal    validation is performed.  This method is called whenever a parmater    has been changed."""    import arcpy
    if self.params[0].value:      mxd = arcpy.mapping.MapDocument(self.params[0].value.value)            #The following will display an error if mxd is not DDP enabled      testDDP = mxd.dataDrivenPages
      #Generate unique list of layer names      lyrs = arcpy.mapping.ListLayers(mxd)      layerList = []      for lyr in lyrs:        layerList.append(lyr.name)      uniqueLayerList = list(set(layerList))      uniqueLayerList.sort()            if not self.params[1].altered:        self.params[1].filter.list = uniqueLayerList
      #Generate unique list of field names      if self.params[1].altered:        selectedLayer = self.params[1].value        layerRef = arcpy.mapping.ListLayers(mxd, selectedLayer)[0]        fields = arcpy.ListFields(layerRef.dataSource)        fieldList = []        for field in fields:          fieldList.append(field.name)        uniqueFieldList = list(set(fieldList))        uniqueFieldList.sort()        self.params[2].filter.list = uniqueFieldList
      #Generate unique list of page names      if self.params[2].altered:        fieldName = self.params[2].value        rows = arcpy.SearchCursor(layerRef.dataSource)        row = rows.next()        pageNameList = []        while row:          if row.getValue(fieldName) not in pageNameList:            pageNameList.append(row.getValue(fieldName))          row = rows.next()        pageNameList.sort()        self.params[3].filter.list = pageNameList              #Generate the printer list         printerList = arcpy.mapping.ListPrinterNames()      if not self.params[1].altered:        self.params[4].filter.list = printerList
    return
  def updateMessages(self):    """Modify the messages created by internal validation for each tool    parameter.  This method is called after internal validation."""    return

 

arcgis python 参数验证

原文:https://www.cnblogs.com/gisoracle/p/11365257.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!