zoukankan      html  css  js  c++  java
  • arcgis python 参数验证

    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
    
    
    
     
  • 相关阅读:
    51 Nod 1086 多重背包问题(单调队列优化)
    51 Nod 1086 多重背包问题(二进制优化)
    51 Nod 1085 01背包问题
    poj 2559 Largest Rectangle(单调栈)
    51 Nod 1089 最长回文子串(Manacher算法)
    51 Nod N的阶乘的长度 (斯特林近似)
    51 Nod 1134 最长递增子序列(经典问题回顾)
    51 Nod 1020 逆序排列
    PCA-主成分分析(Principal components analysis)
    Python中cPickle
  • 原文地址:https://www.cnblogs.com/gisoracle/p/11365257.html
Copyright © 2011-2022 走看看