से बचने में विफल रहता है।


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 का उपयोग करते हुए और सक्सेज के बिना टूल नेम से कॉल करने का। क्या यह सिर्फ मैं हूं या ...?

क्या कोई मुझे "अच्छे" समाधान का संकेत दे सकता है? मुझे ऐसी कई प्रक्रियाएँ चलाने की ज़रूरत है जो पहले से ही आर्कटबॉक्स में निर्मित हैं जिन्हें मैं वास्तव में डुप्लिकेट नहीं करना चाहता।


आपके द्वारा अपने प्रश्न में बाद में उल्लिखित त्रुटि क्या है?
डांडी

नमस्ते बांका। यह त्रुटियों को नहीं फेंकता है, यह बस विफल हो जाता है।
जॉर्ज सिल्वा

जवाबों:


14

नीचे दिए गए कोड में, मेरे लिए 10.0 में मल्टी 2 सिंग्नल फ़ंक्शन काम करता है। जब से मेरे पास एक 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
}

मुझे वीएस में यह आउटपुट मिलता है:

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

उस त्रुटि को संभालना शानदार किर्क है। मैंने IGIOProcessorEvent इंटरफेस के बारे में जानने के लिए जियोप्रोसेसर का उपयोग करते हुए कभी पर्याप्त समय नहीं बिताया। इस पर ध्यान दिलाने के लिए धन्यवाद!
ब्लिंकीबिल

आपका कोड काम करता है! आर्कोबजेक्ट्स मुझे पसंद नहीं है।
जॉर्ज सिल्वा

4

आप इसमें सही हैं कि AoInitialize की कोई आवश्यकता नहीं है। जैसा कि आपने पाया है, भू-प्रोसेसर ऑब्जेक्ट के साथ डीबगिंग गर्दन में दर्द है।

समस्याओं के लिए जाँच करने के लिए आपको प्रत्येक कॉल के बाद संदेश, चेतावनी और त्रुटि कतार पढ़ने के लिए क्या करने की आवश्यकता है। मानक .NET त्रुटि सौंपने पर भरोसा करने जैसी कोई किस्मत नहीं है।

प्रत्येक निष्पादित कॉल के बाद यह कोशिश करें (GetMessageS, GetMessage पर ध्यान दें) ...

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

नमस्कार eldac! मैंने सिर पीटने के कुछ घंटों के बाद हार मान ली, लेकिन मैं जल्द ही फिर से कोशिश करूंगा और सवाल पर फॉलोअप पूरा करूंगा। जब आप पहली बार इसे बनाते हैं तो क्या यह विधानसभा पर हस्ताक्षर करने में समस्या हो सकती है?
जॉर्ज सिल्वा

हाय जॉर्ज, यह शायद एक हस्ताक्षर करने का मुद्दा नहीं है। यदि आपके पास FeatureToPoint (या किसी अन्य जियोप्रोसेसिंग टूल) के लिए एक सरल वाक्यविन्यास / पथ / प्रकार त्रुटि है, तो यह बिना किसी अधिसूचना के विफल हो जाएगा, इसलिए त्रुटि कतार का निरीक्षण। मैं शायद ही अब जियोप्रोसेसिंग टूल्स से परेशान हूं। ज्यादातर मामलों में इसे काम करने में बस इतना समय लगता है, क्योंकि डिबगिंग नरक है।
ब्लिंकीबिल सिप

यह एक दर्द है, क्योंकि मुझे एक सेंट्रोइड का परीक्षण करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि मैं एक जियोप्रोसेसिंग टूल का उपयोग किए बिना मेरे द्वारा किए जाने वाले परिवर्तनों को कैसे जोड़ सकता हूं। मुझे एक बहुभुज परत को बदलने की आवश्यकता है, लेकिन परीक्षण को इसके केन्द्रक के तहत किया जाना चाहिए। मैं अपने परिणामों को फ़िल्टर करने के लिए एक स्थानिक क्वेरी का उपयोग कर रहा हूं, इसलिए मैं इसे ढीला कर दूंगा।
जॉर्ज सिल्वा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.