4 votos

Cómo utilizar ICalculator con un pre-expresión en C#

Otro gran predicamento. Estoy tratando de usar una instancia de ICalculator a la actualización de un campo basado en otro campo. Libros de texto de cosas. Por desgracia, el ejemplo en el SDK para C# es un poco falta.

Aquí es lo que me ha desconcertado a cabo tan lejos de la C# GeoDatabaseUI 10.x y VB.NET ICalculator 9.3 ejemplos/documentación (NOTA: estoy haciendo esto en C#, en caso de que no estaba claro).

  1. Si desea utilizar una cadena en la Expresión de la propiedad, ¿ no use triple comillas (debe ser el legado de la información), pero escapó de comillas para el normal cadena dentro de la cadena de notación.
  2. Puede utilizar VB.NET código en el pre-expresión cuando se trabaja en VB.NET (esto me confunde).

Con estas premisas en mente, he estado tratando de usar python o C# en el pre-expresión de la propiedad, pero yo no estoy teniendo suerte.

snip....

Alguien ha probado esto todavía? Si es así, ¿cuál es la forma correcta de usar una función de python y/o un método de C# cuando se trabaja con el ICalculcator?

ACTUALIZACIÓN: Bueno, intentando el método kenbuja sugiere a continuación, he cambiado a un IGeoProcessor método con el siguiente código:

public void GPCalculate(ITable table)
    {
        IGeoProcessor gp = new GeoProcessorClass();
        IVariantArray varray = new VarArrayClass();
        string input = workspacepath+"\\"+targetfile;

        string codeblock = "states = {'2':'AK', '1':'AL', '5':'AR', '60':'AS', '4':'AZ', '6':'CA', '8':'CO', '9':'CT', '11':'DC', '10':'DE', '12':'FL',"+
            "'13':'GA', '66':'GU', '15':'HI', '19':'IA', '16':'ID', '17':'IL', '18':'IN', '20':'KS', '21':'KY', '22':'LA', '25':'MA', '24':'MD', '23':'ME',"+
            "'26':'MI', '27':'MN', '29':'MO', '28':'MS', '30':'MT', '37':'NC', '38':'ND', '31':'NE', '33':'NH', '34':'NJ', '35':'NM', '32':'NV', '36':'NY',"+
            "'39':'OH', '40':'OK', '41':'OR', '42':'PA', '72':'PR', '44':'RI', '45':'SC', '46':'SD', '47':'TN', '48':'TX', '49':'UT', '51':'VA', '78':'VI',"+
            "'50':'VT', '53':'WA', '55':'WI', '54':'WV', '56':'WY'}\n" +
            "def getstate(id):\n" +
            "  id = str(id)\n"+
            "  if (len(id) == 14):\n" +
            "    id = id[0]\n" +
            "  if (len(id) == 15):\n" +
            "    tid = id[0:2]\n" +
            "  return states[id]";
        // First Parameter in_table
        varray.Add(input);
        // Second Parameter calculate field
        varray.Add("PSTATE");
        // Third Parameter expression
        varray.Add("getstate(!ID!)");
        // Fourth Parameter expression_type (optional)
        varray.Add("PYTHON_9.3");
        // Fifth Parameter Codeblock (optional)
        varray.Add(codeblock);

        IGeoProcessorResult result = new GeoProcessorResultClass();
        settesttext("Starting Calculation");
        result = gp.Execute("CalculateField_management", varray, null);
    }

El código anterior funciona perfectamente ahora (gracias a una edición @blah238).

3voto

Michael La Voie Puntos 56

Actualmente en ArcGIS 10, ICalculator no tiene ninguna propiedad que permite establecer la parcer el uso de Python, por lo que el valor por omisión es VBScript (error NIM061356). La solución sería usar algo como el siguiente ejemplo VBA para utilizar el Geoprocessor y CalculateField_management herramienta.

    'Create the Geoprocessor
Dim pGp As IGeoProcessor
Set pGp = New GeoProcessor

'Set Overwriteoutput to True
'pGp.OverwriteOutput = True

'Add the custom toolbox containing the model tool
'pGp.AddToolbox "C:\CustomTools\custom.tbx"

'Create the Parameter array
Dim pParamArray As IVariantArray
Set pParamArray = New VarArray

'Populate array of parameters
'First Parameter:  in_table (e.g. File GDB feature class)
pParamArray.Add "C:\Incidents\845875\Converted_GDB931\downgradedFGDB.gdb\Main_931"

'Second Parameter:  field on which to calculate
pParamArray.Add "LastField"

'Third Parameter:  expression
pParamArray.Add "math.log1p(!SumOfConcentrations!)"

'Fourth Parameter:  expression_type (Optional)  !!!  !!!  !!!  !!!  !!!
pParamArray.Add "PYTHON_9.3"
Dim pResult As IGeoProcessorResult

'Execute the Model tool
Set pResult = pGp.Execute("CalculateField_management", pParamArray, Nothing)

'Get the returned tool messages
ReturnMessages pResult

Public Sub ReturnMessages(ByVal messages As IGeoProcessorResult)

  Dim i As Long
  Dim message As String

  For i = 0 To messages.MessageCount - 1
     message = messages.GetMessage(i)
     Debug.Print message
  Next

End Sub

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