7 votos

¿Cómo instalar GP de comandos herramientas, herramientas y script en Python para una barra de herramientas?

Necesito crear una barra de herramientas personalizada que puede lanzar los siguientes elementos:

  • Una herramienta de secuencia de comandos de Python - no debería ser un problema, como ya se puede conecte estos a una barra de herramientas
  • Fuera de la caja de funciones tales como la Barra de herramientas del Editor o tal vez un estándar GP herramienta - de nuevo, debe ser capaz de hacer-como ya se puede adjuntar a una barra de herramientas
  • Una secuencia de comandos de Python que lanza un PyQT/wxPython/Tk interfaz gráfica de usuario. Este es el truco que yo creo. Ahora, esta interfaz de usuario no necesita interactuar con ArcMap. Mis otras herramientas personalizadas se hacer todo eso, esta GUI es para que el usuario los parámetros de configuración que se graban en un archivo de configuración XML. Es también hacer algo de arcpy llamadas en el fondo y sorber algunos datos y valores de una geodatabase y empujar para el mismo archivo de configuración XML.

enter image description here

Así que la pregunta es cómo hacerlo de la forma más sencilla posible? Parece que no puedo adjuntar una secuencia de comandos de Python (que no está encerrado en una herramienta) para una barra de herramientas de ArcMap. Estoy pensando que voy a tener que ir a Agregar-En ruta y crear una sencilla Barra de herramientas con botones para el kick off de cada uno de los elementos mencionados anteriormente. VBA no es una opción. Los pensamientos?

5voto

warsze Puntos 178

@ChadCooper, tal vez estoy con vistas a algo, pero con respecto a tu 3er caso:

Una secuencia de comandos de Python que lanza un PyQT/wxPython/Tk GUI..

Hay una razón por la que no podía usar .Net API del Proceso (ver System.Diagnostics) para la ejecución de su encargo de secuencia de comandos de Python a través de la Norma En/Fuera? Por supuesto, este tipo de arquitectura se asume una correcta versión de Python está instalado y equipado adicionales con las libs que usted requiere. Me parece que usted sólo desea extender una ICommand objeto y el uso de la API del Proceso en su Click() evento. Este ejemplo (que era un solo experimento llamado .py secuencia de comandos que utiliza dbfpy a leer las columnas en un archivo DBF y se les devolverá como una lista .Neto de la aplicación.

private static List<string> _readDbfOutput;

public static List<string> ReadDbfTable(string dbfPath, int limit)
{
    // start a fresh output object..
    _readDbfOutput = new List<string>();
    _readDbfOutput.Clear();

    // ready..
    string executable = "C:\Python27\python.exe";
    string fullUtilPath = "C:\some_app\utils\read_dbf_table.py";

    // The path to the python file and it's arguments become a single input
    // submitted to the python runtime. In this case, I've got somethign like:
    // C:\>C:/Python27/python.exe C:\some_app\utils\read_dbf_table.py -f C:/data/some_shapefiles.dbf -l 100

    // dbfPath and limit were method arguments..
    string exeArguments = fullUtilPath + " -f " + dbfPath + " -l " + limit.ToString();

    ProcessStartInfo startInfo = new ProcessStartInfo(executable, exeArguments);
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardOutput = true;  // necessary if you need to listen..
    startInfo.RedirectStandardInput = false;  // necessary if you send more inputs..
    startInfo.StandardOutputEncoding = System.Text.Encoding.ASCII;

    Process proc = new Process();

    // ReadingDbfTable is my redirected standard input..
    proc.OutputDataReceived += new DataReceivedEventHandler(ReadingDbfTable);
    proc.StartInfo = startInfo;
    proc.Start();
    proc.BeginOutputReadLine();

    // WaitForExit() may need to be wrapped in a Try or Using block.
    // Will it run indefinitely if the script fails?
    proc.WaitForExit();
    proc.Close();

    return _readDbfOutput;
}

/// Handle redirected STDOUT.
private static void ReadingDbfTable(object sendingProc, DataReceivedEventArgs stdOutput)
{
    if ( ! String.IsNullOrEmpty(stdOutput.Data) )
    {
        _readDbfOutput.Add(stdOutput.Data);
    }
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X