.NETを使用したArcObjectsジオプロセシングの失敗を回避しますか?


14

ArcToolboxには使用できる便利な機能がいくつかありますが、何らかの理由でこれが適切に機能しません。それは私にエラーさえ投げません。

ソフトウェアはArcMap内で実行されているため、AoInitializeを再度行う必要はありませんか?

    public void Execute()
    {
        InitializeProduct();
        try
        {
            Geoprocessor gp = new Geoprocessor();
            gp.OverwriteOutput = true;

            FeatureToPoint featureToPoint = new FeatureToPoint();

            string outputPathName = CurrentWorkspace.PathName + "\\teste_centroide";

            featureToPoint.in_features = InputFeatureClass;
            featureToPoint.out_feature_class = outputPathName;
            featureToPoint.point_location = "INSIDE";

            IGeoProcessorResult result = (IGeoProcessorResult)gp.Execute(featureToPoint, null);

            if (result == null)
            {
                for (int i = 0; i <= gp.MessageCount - 1; i++)
                {
                    Console.WriteLine(gp.GetMessage(i));
                }
            }

            IGPUtilities gpUtils = new GPUtilitiesClass();
            this.OutputFeatureClass = gpUtils.OpenFeatureClassFromString(outputPathName);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\r\n");
        }

これは私がここで持っているコード例です。DataManagementツールアセンブリを生成しましたが、署名するファイルが見つかりませんでした。

このコードではエラーが発生します。署名が原因ですか?

私も、IVariantArrayを使用して、成功せずにツール名から呼び出して、別の方法を試しました。私だけですか...?

誰でも私に「より良い」解決策を教えてもらえますか?ArcToolboxで既にビルドされているいくつかのプロセスを実行する必要がありますが、実際には複製したくないです。


質問の後半で言及するエラーは何ですか?
ダンディ

こんにちはダンディ。エラーをスローせず、失敗するだけです。
ジョージ・シルバ

回答:


14

以下のコードでは、10.0でmulti2single関数が機能します。ArcInfoライセンスがないため、Feature2Pointをテストできませんでした。

public class Test
{
    public static void TestGP(IApplication app)
    {
        IMxDocument mxDoc = (IMxDocument)app.Document;
        //Feat2Point((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:\Projects\AmberGIS\Forums\forumtest.gdb\f2p");
        Multi2Single((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:\Projects\AmberGIS\Forums\forumtest.gdb\m2s");
    }

    public static void Multi2Single(IFeatureLayer inLayer, string outPath)
    {
        MultipartToSinglepart m2s = new MultipartToSinglepart();
        m2s.in_features = inLayer.FeatureClass;
        m2s.out_feature_class = outPath;
        Execute(m2s);
    }

    public static void Feat2Point(IFeatureLayer inLayer, string outPath)
    {
        FeatureToPoint f2p = new FeatureToPoint();
        f2p.in_features = inLayer.FeatureClass;
        f2p.out_feature_class = outPath;
        Execute(f2p);
    }

    public static void Execute(IGPProcess proc)
    {
        Geoprocessor gp = new Geoprocessor();
        gp.AddOutputsToMap = true;
        gp.OverwriteOutput = true;
        gp.RegisterGeoProcessorEvents((IGeoProcessorEvents)new GPEvents());
        IGeoProcessorResult2 result = gp.Execute(proc, null) as IGeoProcessorResult2;
        IGPMessages msgs = result.GetResultMessages();
        for(int i=0;i<msgs.Count;i++)
            Debug.Print("{0} {1}", msgs.GetMessage(i).Description, msgs.GetMessage(i).Type);            
    }
}
public class GPEvents : IGeoProcessorEvents3, IGeoProcessorEvents 
{
    #region IGeoProcessorEvents3 Members
    public void OnProcessMessages(IGeoProcessorResult result, IGPMessages pMsgs)
    {
        Debug.Print("OnProcessMessages {0}", result.Status);
    }
    public void OnProgressMessage(IGeoProcessorResult result, string message)
    {
        Debug.Print("OnProgressMessages {0}", result.Status);
    }
    public void OnProgressPercentage(IGeoProcessorResult result, double percentage)
    {
        Debug.Print("OnProgressPercentage {0}", result.Status);
    }
    public void OnProgressShow(IGeoProcessorResult result, bool Show)
    {
        Debug.Print("OnProgressShow {0}", result.Status);
    }
    public void PostToolExecute(IGeoProcessorResult result)
    {
        Debug.Print("PostToolExecute {0}", result.Status);
    }
    public void PreToolExecute(IGeoProcessorResult result)
    {
        Debug.Print("PreToolExecute {0}",result.Status);
    }
    #endregion

    #region IGeoProcessorEvents Members

    void IGeoProcessorEvents.OnMessageAdded(IGPMessage message)
    {
        Debug.Print("OnMessageAdded {0} {1}", message.Description, message.Type);
        throw new NotImplementedException();
    }

    void IGeoProcessorEvents.PostToolExecute(IGPTool Tool, ESRI.ArcGIS.esriSystem.IArray Values, int result, IGPMessages Messages)
    {
        Debug.Print("PostToolExecute2 {0}", Tool.Name);
    }

    void IGeoProcessorEvents.PreToolExecute(IGPTool Tool, ESRI.ArcGIS.esriSystem.IArray Values, int processID)
    {
        if (Tool.IsLicensed())
            Debug.Print("PreToolExecute");
        else
            Debug.Print("tool is not licensed to run");
    }

    void IGeoProcessorEvents.ToolboxChange()
    {
        Debug.Print("ToolboxChange");
    }

    #endregion
}

私はVSでこの出力を取得します:

PreToolExecute
PostToolExecute2 MultipartToSinglepart
Executing: MultipartToSinglepart GPL0 D:\Projects\AmberGIS\Forums\forumtest.gdb\m2s esriGPMessageTypeProcessDefinition
Start Time: Thu Sep 02 11:32:44 2010 esriGPMessageTypeProcessStart
Succeeded at Thu Sep 02 11:32:51 2010 (Elapsed Time: 7.00 seconds) esriGPMessageTypeProcessStop

このエラー処理は素晴らしいKirkです。IGeoProcessorEventインターフェイスについて知るためにジオプロセッサを使用するのに十分な時間を費やしたことはありません。それを指摘してくれてありがとう!
BlinkyBill

あなたのコードは機能します!ArcObjectsは私を好きではありません。
ジョージシルバ

4

AoInitializeの必要がないという点であなたは正しいです。あなたが発見したように、ジオプロセッサオブジェクトを使用したデバッグは苦痛です。

そのために必要なことは、各呼び出しの後にメッセージ、警告、エラーキューを読み、問題をチェックします。標準の.NETエラー処理に依存するような幸運はありません。

実行呼び出しごとにこれを試してください(GetMessageではなくGetMessageSに注意してください)...

Console.WriteLine("Messages: " + gp.GetMessages(1));
Console.WriteLine("Warnings: " + gp.GetMessages(2));
Console.WriteLine("Errors: " + gp.GetMessages(3));

こんにちは、eldac!数時間のヘッドバンギングの後、私はあきらめましたが、すぐにこれを再試行し、質問のフォローアップを完了します。これは、最初に生成するときにアセンブリに署名する際に問題になる可能性がありますか?
ジョージシルバ

こんにちはジョージ、おそらく署名の問題ではありません。FeatureToPoint(またはその他のジオプロセシングツール)のparamsに単純な構文/パス/タイプエラーがある場合、通知なしで失敗するため、エラーキューの検査が行われます。私はジオプロセシングツールをもう気にしません。デバッグは地獄なので、ほとんどの場合、動作させるのに非常に時間がかかります。
ブリンキービル

重心をテストする必要があるため、これは苦痛ですが、ジオプロセシングツールを使用せずに行う必要がある変更をどのようにリンクできるかはわかりません。ポリゴンレイヤーを変更する必要がありますが、テストはその重心の下で行う必要があります。結果をフィルタリングするために空間クエリを使用しているため、それを失います。
ジョージシルバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.