
'''
Autor: Ing. Winston De Oleo
Fecha: 12/04/2025
Descripción:
Este script permite al usuario interactuar con un proyecto de ArcGIS Pro (.aprx)
para seleccionar un mapa, elegir una capa y generar un buffer a partir de dicha capa.
'''

import arcpy
import os

# Ruta al proyecto de ArcGIS Pro (.aprx)
ruta_proyecto = r"C:\Users\winst\OneDrive\Documentos\ArcGIS\Projects\Practica_Python\Practica_Python.aprx"

def main():
    try:
        # Cargar el proyecto
        aprx = arcpy.mp.ArcGISProject(ruta_proyecto)
        mapas = aprx.listMaps()

        if not mapas:
            print("El proyecto no contiene mapas.")
            return

        mapa = seleccionar_mapa(mapas)
        capa = seleccionar_capa(mapa)

        if capa is None:
            return

        if capa.isFeatureLayer:
            generar_buffer(capa)
        elif capa.isRasterLayer:
            print("Los rasters no son compatibles con la operación de buffer.")
        else:
            print("Tipo de capa no compatible. Solo se pueden aplicar buffers a capas vectoriales (shapefiles).")

    except Exception as e:
        print(f"Error general: {e}")

def seleccionar_mapa(mapas):
    print(" Mapas disponibles en el proyecto:")
    for i, mapa in enumerate(mapas, 1):
        print(f"{i}. {mapa.name}")

    try:
        seleccion = int(input("Selecciona el número del mapa que deseas usar: ")) - 1
        if 0 <= seleccion < len(mapas):
            mapa = mapas[seleccion]
            print(f"Mapa seleccionado: {mapa.name}")
            return mapa
        else:
            print("Selección inválida.")
            return None
    except ValueError:
        print("Entrada no válida. Debes ingresar un número.")
        return None

def seleccionar_capa(mapa):
    capas = mapa.listLayers()
    if not capas:
        print("El mapa no contiene capas.")
        return None

    print("\n Capas disponibles:")
    for i, capa in enumerate(capas, 1):
        tipo = "Shapefile" if capa.isFeatureLayer else "Raster" if capa.isRasterLayer else "Otro"
        print(f"{i}. {capa.name} (Tipo: {tipo})")

    try:
        seleccion = int(input("Selecciona el número de la capa que deseas usar: ")) - 1
        if 0 <= seleccion < len(capas):
            capa = capas[seleccion]
            print(f"Capa seleccionada: {capa.name}")
            return capa
        else:
            print("Selección inválida.")
            return None
    except ValueError:
        print("Entrada no válida. Debes ingresar un número.")
        return None

def generar_buffer(capa):
    distancia = input("Ingresa la distancia del buffer (en metros): ")
    salida = input("Ingresa la ruta completa de salida para el buffer (ej. C:/Ruta/buffer_output.shp): ")

    if not salida.lower().endswith(".shp"):
        print("La salida debe ser un archivo .shp")
        return

    try:
        arcpy.Buffer_analysis(capa.dataSource, salida, f"{distancia} Meters")
        print(f"Buffer generado correctamente en: {salida}")
    except Exception as e:
        print(f"Error al generar buffer: {e}")

if __name__ == "__main__":
    main()
