<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: how to make a tool box from python script in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1414140#M70430</link>
    <description>&lt;P&gt;Are you wanting the scrip to just run or are you wanting the ability to have drop downs that people can select from?&lt;/P&gt;</description>
    <pubDate>Tue, 23 Apr 2024 14:18:32 GMT</pubDate>
    <dc:creator>TonyAlmeida</dc:creator>
    <dc:date>2024-04-23T14:18:32Z</dc:date>
    <item>
      <title>how to make a tool box from python script</title>
      <link>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1413803#M70425</link>
      <description>&lt;P&gt;I have this code:&lt;/P&gt;&lt;P&gt;import arcpy&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the active map in the current project&amp;nbsp;&lt;/P&gt;&lt;P&gt;active_map = arcpy.mp.ArcGISProject("CURRENT").activeMap&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the currently selected layer in tcrhe Contents pane&amp;nbsp;&lt;/P&gt;&lt;P&gt;current_layer = active_map.listLayers()[0]&amp;nbsp; # Assumes the first layer; adjust as needed&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Define the desired new name&amp;nbsp;&lt;/P&gt;&lt;P&gt;new_layer_name = "HZ004"&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Check if the layer was found&amp;nbsp;&lt;/P&gt;&lt;P&gt;if current_layer:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Update the layer's name in the Contents pane&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; current_layer.name = new_layer_name&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Select and unselect the layer to trigger a refresh in the TOC&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; current_layer.visible = False&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; current_layer.visible = True&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(f"The layer name in the Contents pane has been successfully changed to {new_layer_name}.")&amp;nbsp;&lt;/P&gt;&lt;P&gt;else:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(f"No layer found in the project.")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# begin of required paramters&amp;nbsp;&lt;/P&gt;&lt;P&gt;# name of the Lot layer that will be sampled&amp;nbsp;&lt;/P&gt;&lt;P&gt;Polygon_Layer = "HZ004"&amp;nbsp;&lt;/P&gt;&lt;P&gt;# sampling percentage&amp;nbsp;&lt;/P&gt;&lt;P&gt;Sampling_Percent = 0.04&amp;nbsp;&lt;/P&gt;&lt;P&gt;# the cell width and height for fishnet&amp;nbsp;&lt;/P&gt;&lt;P&gt;# determine the size of each cell&amp;nbsp;&lt;/P&gt;&lt;P&gt;cellSizeWidth = '25'&amp;nbsp;&lt;/P&gt;&lt;P&gt;cellSizeHeight = '25'&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#task Id and Lot Parameter&amp;nbsp;&lt;/P&gt;&lt;P&gt;taskId = "NPA_CL_SY01_001"&amp;nbsp;&lt;/P&gt;&lt;P&gt;lotNum = "LOT01"&amp;nbsp;&lt;/P&gt;&lt;P&gt;Fishnet_Layer = "Fishnet004"&amp;nbsp;&lt;/P&gt;&lt;P&gt;labels = 'NO_LABELS'&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# end of required paramters&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#begin of optional parameter - no need to change&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Number of rows and columns for fishnet if we don't determin width and height of cell&amp;nbsp;&lt;/P&gt;&lt;P&gt;numRows =&amp;nbsp; '0'&amp;nbsp;&lt;/P&gt;&lt;P&gt;numColumns = '0'&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Create a point label feature class for the fishnet&amp;nbsp;&lt;/P&gt;&lt;P&gt;#labels = 'NO_LABELS'&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# name of fishnet layer&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Fishnet_Layer = "Fishnet004"&amp;nbsp;&lt;/P&gt;&lt;P&gt;# end of optional parameter&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;import arcpy&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the current project&amp;nbsp;&lt;/P&gt;&lt;P&gt;project = arcpy.mp.ArcGISProject("CURRENT")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get a list of all the layers in the project&amp;nbsp;&lt;/P&gt;&lt;P&gt;layers = []&amp;nbsp;&lt;/P&gt;&lt;P&gt;for map in project.listMaps():&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; layers.extend(map.listLayers())&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Find the feature class you want to use as the clip feature&amp;nbsp;&lt;/P&gt;&lt;P&gt;clip_feature = None&amp;nbsp;&lt;/P&gt;&lt;P&gt;for layer in layers:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if layer.isFeatureLayer:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if layer.name == Polygon_Layer :&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clip_feature = layer&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;extent = project.activeView.camera.getExtent()&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# fishnet options and creation&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Set the latitude and longitude coordinates for fishnet&amp;nbsp;&lt;/P&gt;&lt;P&gt;latitude = extent.XMin&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;longitude = extent.YMin&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;maxLongitude = extent.YMax&amp;nbsp;&lt;/P&gt;&lt;P&gt;maxLatitude = extent.XMax&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;originCoordinate = "%f %f" % (latitude,longitude)&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;yAxisCoordinate = "%f %f" % (latitude,maxLongitude)&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;conrnerCoordinate = "%f %f" % (maxLatitude,maxLongitude)&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.CreateFishnet_management(Fishnet_Layer, originCoordinate,yAxisCoordinate , cellSizeWidth, cellSizeHeight, numRows, numColumns, conrnerCoordinate, labels, '', 'POLYGON')&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.DefineProjection(Fishnet_Layer, arcpy.SpatialReference(arcpy.mp.ArcGISProject("CURRENT").activeMap.spatialReference.name))&amp;nbsp;&lt;/P&gt;&lt;P&gt;# end of fishnet creation&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.SelectLayerByLocation(Fishnet_Layer, "INTERSECT", Polygon_Layer, None, "NEW_SELECTION", "NOT_INVERT")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddField(Fishnet_Layer, "Box_Number", "TEXT", None, None, 15, "Box_Number", "NULLABLE", "NON_REQUIRED", '')&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.CalculateField(Fishnet_Layer, "Box_Number", "SequentialNumber()", "PYTHON3", """# Calculates a sequential number&amp;nbsp;&lt;/P&gt;&lt;P&gt;# More calculator examples at esriurl.com/CalculatorExamples&amp;nbsp;&lt;/P&gt;&lt;P&gt;rec=0&amp;nbsp;&lt;/P&gt;&lt;P&gt;def SequentialNumber():&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; global rec&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; pStart = 1&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; pInterval = 1&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (rec == 0):&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rec = pStart&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rec = rec + pInterval&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return rec""", "TEXT", "NO_ENFORCE_DOMAINS")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the full path of the clip feature&amp;nbsp;&lt;/P&gt;&lt;P&gt;clip_feature_path = clip_feature.dataSource&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Set the output feature class&amp;nbsp;&lt;/P&gt;&lt;P&gt;output_fc = "Sampling_Polygon"&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Perform the clip&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.analysis.Clip(Fishnet_Layer, clip_feature_path, output_fc)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;import arcpy&amp;nbsp;&lt;/P&gt;&lt;P&gt;import random&amp;nbsp;&lt;/P&gt;&lt;P&gt;import string&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Set the workspace to the current workspace&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.env.workspace = arcpy.mp.ArcGISProject("CURRENT").defaultGeodatabase&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Generate a random domain name starting with "Random_Status"&amp;nbsp;&lt;/P&gt;&lt;P&gt;domain_name = "Sampling_Status_" + ''.join(random.choices(string.ascii_uppercase + string.digits, k=3))&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Check if the domain already exists and delete it if it does&amp;nbsp;&lt;/P&gt;&lt;P&gt;if arcpy.Exists(domain_name):&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;arcpy.management.DeleteDomain(arcpy.env.workspace, domain_name)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Create the domain&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.CreateDomain(arcpy.env.workspace, domain_name, "Sampling Domain Status", "TEXT", "CODED")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Random Pending", "Random Pending")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Random Passed", "Random Passed")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Random Failed", "Random Failed")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Random Replaced", "Random Replaced")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Targeted Pending", "Targeted Pending")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Targeted Passed", "Targeted Passed")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddCodedValueToDomain(arcpy.env.workspace, domain_name, "Targeted Failed", "Targeted Failed")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the "Sampling_Polygon" feature layer&amp;nbsp;&lt;/P&gt;&lt;P&gt;sampling_polygon_layer = arcpy.mp.ArcGISProject("CURRENT").listMaps()[0].listLayers("Sampling_Polygon")[0]&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Check if the "Random_Status" field already exists and delete it if it does&amp;nbsp;&lt;/P&gt;&lt;P&gt;if "Sampling_Status" in [f.name for f in arcpy.ListFields(sampling_polygon_layer)]:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;arcpy.management.DeleteField(sampling_polygon_layer, "Sampling_Status")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Add the "Random_Status" field to the layer&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddField(sampling_polygon_layer, "Sampling_Status", "TEXT", field_length=50)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Assign the random domain to the "Random_Status" field in the layer&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AssignDomainToField(sampling_polygon_layer, "Sampling_Status", domain_name)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddField("Sampling_Polygon", "X", "TEXT", None, None, None, "X", "NULLABLE", "NON_REQUIRED", '')&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddField("Sampling_Polygon", "Y", "TEXT", None, None, None, "Y", "NULLABLE", "NON_REQUIRED", '')&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.CalculateGeometryAttributes("Sampling_Polygon", "X INSIDE_X;Y INSIDE_Y", '', '', None, "SAME_AS_INPUT")&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddField("Sampling_Polygon", "TaskID", "TEXT", None, None, None, "TaskID", "NULLABLE", "NON_REQUIRED", '')&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Use an update cursor to update the field&amp;nbsp;&lt;/P&gt;&lt;P&gt;with arcpy.da.UpdateCursor("Sampling_Polygon", "TaskID") as cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row[0] = taskId&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursor.updateRow(row)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Clean up the cursor&amp;nbsp;&lt;/P&gt;&lt;P&gt;del cursor&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.AddField("Sampling_Polygon", "Lot_Number", "TEXT", None, None, None, "Lot_Number", "NULLABLE", "NON_REQUIRED", '')&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Use an update cursor to update the field&amp;nbsp;&lt;/P&gt;&lt;P&gt;with arcpy.da.UpdateCursor("Sampling_Polygon", "Lot_Number") as cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row[0] = lotNum&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursor.updateRow(row)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Clean up the cursor&amp;nbsp;&lt;/P&gt;&lt;P&gt;del cursor&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;import arcpy&amp;nbsp;&lt;/P&gt;&lt;P&gt;import random&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the "Sampling_Polygon" feature layer&amp;nbsp;&lt;/P&gt;&lt;P&gt;sampling_polygon_layer = arcpy.mp.ArcGISProject("CURRENT").listMaps()[0].listLayers("Sampling_Polygon")[0]&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Define the feature layer and field names&amp;nbsp;&lt;/P&gt;&lt;P&gt;feature_layer = "Sampling_Polygon"&amp;nbsp;&lt;/P&gt;&lt;P&gt;area_field = "SHAPE@AREA"&amp;nbsp;&lt;/P&gt;&lt;P&gt;oid_field = arcpy.Describe(feature_layer).OIDFieldName&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Calculate the area threshold for selecting records&amp;nbsp;&lt;/P&gt;&lt;P&gt;total_area = sum(row[0] for row in arcpy.da.SearchCursor(feature_layer, area_field))&amp;nbsp;&lt;/P&gt;&lt;P&gt;area_threshold = total_area * Sampling_Percent&amp;nbsp; # Sampling_Percent% of the total area&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Select a random box to start with&amp;nbsp;&lt;/P&gt;&lt;P&gt;selected_boxes = []&amp;nbsp;&lt;/P&gt;&lt;P&gt;selected_area = 0&amp;nbsp;&lt;/P&gt;&lt;P&gt;with arcpy.da.SearchCursor(feature_layer, [area_field, oid_field, "SHAPE@"]) as cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; row = random.choice([row for row in cursor])&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; selected_boxes.append((row[1], row[2]))&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; selected_area += row[0]&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Determine the minimum distance between selected boxes&amp;nbsp;&lt;/P&gt;&lt;P&gt;min_distance = max([box[1].length / 100 for box in selected_boxes])&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Exclude boxes that are within the minimum distance from the selected boxes&amp;nbsp;&lt;/P&gt;&lt;P&gt;excluded_boxes = set()&amp;nbsp;&lt;/P&gt;&lt;P&gt;while selected_area &amp;lt; area_threshold:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; # Get the distance between the selected boxes and all other boxes&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; distances = {}&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; with arcpy.da.SearchCursor(feature_layer, [oid_field, "SHAPE@"]) as cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if row[0] not in excluded_boxes:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; distance = min([box[1].distanceTo(row[1]) for box in selected_boxes])&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; distances[row[0]] = distance&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; # Select the box with the maximum distance from the selected boxes&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if not distances:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; max_distance_oid = max(distances, key=distances.get)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if distances[max_distance_oid] &amp;gt;= min_distance:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; excluded_boxes.add(max_distance_oid)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.SearchCursor(feature_layer, [area_field, oid_field, "SHAPE@"], "{0} = {1}".format(oid_field, max_distance_oid)) as cursor:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row = next(cursor)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; selected_boxes.append((row[1], row[2]))&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; selected_area += row[0]&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Update the minimum distance between selected boxes&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; min_distance = max([box[1].length / 100 for box in selected_boxes])&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # If no box can be selected, reduce the min_distance and try again&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; min_distance *= 0.9&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Select the randomly selected boxes by their ObjectIDs&amp;nbsp;&lt;/P&gt;&lt;P&gt;selected_oids = [box[0] for box in selected_boxes]&amp;nbsp;&lt;/P&gt;&lt;P&gt;where_clause = "{0} IN ({1})".format(oid_field, ','.join(str(oid) for oid in selected_oids))&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.SelectLayerByAttribute_management(feature_layer, "NEW_SELECTION", where_clause)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.management.CalculateField("Sampling_Polygon", "Sampling_Status", "'Random Pending'", "PYTHON3", "", "TEXT", "NO_ENFORCE_DOMAINS")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Set the workspace to the current workspace&amp;nbsp;&lt;/P&gt;&lt;P&gt;arcpy.env.workspace = arcpy.mp.ArcGISProject("CURRENT").defaultGeodatabase&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Delete the "Fishnet_Sampling_Polygon" layer if it exists&amp;nbsp;&lt;/P&gt;&lt;P&gt;if arcpy.Exists(Fishnet_Layer):&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;arcpy.management.Delete(Fishnet_Layer)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Delete the "Exported_Polygon" layer if it exists&amp;nbsp;&lt;/P&gt;&lt;P&gt;if arcpy.Exists(Polygon_Layer &lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;arcpy.management.Delete(Polygon_Layer )&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;import arcpy&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the active map in the current project&amp;nbsp;&lt;/P&gt;&lt;P&gt;active_map = arcpy.mp.ArcGISProject("CURRENT").activeMap&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Get the currently selected layer in the Contents pane&amp;nbsp;&lt;/P&gt;&lt;P&gt;current_layer = active_map.listLayers()[0]&amp;nbsp; # Assumes the first layer; adjust as needed&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;# Check if a layer is selected&amp;nbsp;&lt;/P&gt;&lt;P&gt;if current_layer:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get the layer name&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polygon_layer_name = current_layer.name&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Set the output point feature class name&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output_points_fc = f"{polygon_layer_name}_Vertices_Points"&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Use the Feature Vertices to Points tool&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.management.FeatureVerticesToPoints(polygon_layer_name, output_points_fc, "ALL")&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(f"Points have been created from the vertices of the {polygon_layer_name} layer.")&amp;nbsp;&lt;/P&gt;&lt;P&gt;else:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print("No layer found in the project.")&amp;nbsp;&lt;/P&gt;&lt;P&gt;and its working when I run it in python window.&lt;BR /&gt;can any one help me to craete a tool box based on this code&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 22 Apr 2024 21:59:42 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1413803#M70425</guid>
      <dc:creator>MahdiMohammed</dc:creator>
      <dc:date>2024-04-22T21:59:42Z</dc:date>
    </item>
    <item>
      <title>Re: how to make a tool box from python script</title>
      <link>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1413872#M70426</link>
      <description>&lt;P&gt;&lt;A href="https://community.esri.com/t5/python-blog/code-formatting-the-community-version/ba-p/1007633" target="_blank"&gt;Code formatting ... the Community Version - Esri Community&lt;/A&gt;&lt;/P&gt;&lt;P&gt;would help people who wish to comment so they can refer to line numbers.&lt;/P&gt;&lt;P&gt;&lt;A href="https://pro.arcgis.com/en/pro-app/latest/arcpy/geoprocessing_and_python/a-quick-tour-of-creating-tools-in-python.htm" target="_blank"&gt;A quick tour of creating tools with Python—ArcGIS Pro | Documentation&lt;/A&gt;&lt;/P&gt;&lt;P&gt;will allow you to decide which type of toolbox you want to make&lt;/P&gt;</description>
      <pubDate>Tue, 23 Apr 2024 01:01:13 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1413872#M70426</guid>
      <dc:creator>DanPatterson</dc:creator>
      <dc:date>2024-04-23T01:01:13Z</dc:date>
    </item>
    <item>
      <title>Re: how to make a tool box from python script</title>
      <link>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1414140#M70430</link>
      <description>&lt;P&gt;Are you wanting the scrip to just run or are you wanting the ability to have drop downs that people can select from?&lt;/P&gt;</description>
      <pubDate>Tue, 23 Apr 2024 14:18:32 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/how-to-make-a-tool-box-from-python-script/m-p/1414140#M70430</guid>
      <dc:creator>TonyAlmeida</dc:creator>
      <dc:date>2024-04-23T14:18:32Z</dc:date>
    </item>
  </channel>
</rss>

