Suite

Éviter les échecs du géotraitement ArcObjects avec .NET ?


Il existe quelques fonctionnalités intéressantes dans ArcToolbox que nous pouvons utiliser, mais pour une raison quelconque, cela ne fonctionne PAS correctement. Cela ne me renvoie même pas une erreur.

Mon logiciel s'exécute dans ArcMap, donc pas besoin d'AoInitialize à nouveau, n'est-ce pas ?

public void Execute() { InitializeProduct(); try { Géoprocesseur gp = new Géoprocesseur(); gp.OverwriteOutput = true; FeatureToPoint featureToPoint = new FeatureToPoint(); string outputPathName = CurrentWorkspace.PathName + "	este_centroide" ; featureToPoint.in_features = InputFeatureClass; featureToPoint.out_feature_class = outputPathName; featureToPoint.point_location = "À L'INTÉRIEUR"; Résultat IGeoProcessorResult = (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 + "
"); }

C'est un exemple de code que j'ai ici. J'ai généré l'assembly des outils DataManagement, mais je n'ai pas pu trouver le fichier pour le signer.

Ce code me donne juste une erreur. est-ce à cause de la signature ?

J'ai également essayé l'autre méthode, en utilisant IVariantArray et en appelant à partir du nom de l'outil, sans succès. C'est juste moi ou… ?

Quelqu'un peut-il m'indiquer une solution "plus agréable"? J'ai besoin d'exécuter plusieurs processus déjà intégrés dans ArcToolbox que je ne veux vraiment pas dupliquer.


Dans le code ci-dessous, la fonction multi2single fonctionne pour moi en 10.0. Je n'ai pas pu tester Feature2Point car je n'ai pas de licence ArcInfo, n'est-ce pas ?.

public class Test { public static void TestGP (application IApplication) { IMxDocument mxDoc = (IMxDocument) app.Document; //Feat2Point((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:ProjectsAmberGISForumsforumtest.gdbf2p"); Multi2Single((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:ProjectsAmberGISForumsforumtest.gdbm2s"); } public static void Multi2Single(IFeatureLayer inLayer, string outPath) { MultipartToSinglepart m2s = new MultipartToSinglepart(); m2s.in_features = inLayer.FeatureClass; m2s.out_feature_class = outPath; Exécuter (m2s); } public static void Feat2Point(IFeatureLayer inLayer, string outPath) { FeatureToPoint f2p = new FeatureToPoint(); f2p.in_features = inLayer.FeatureClass; f2p.out_feature_class = outPath; Exécuter (f2p); } public static void Execute(IGPProcess proc) { Geoprocessor gp = new Geoprocessor(); gp.AddOutputsToMap = true ; gp.OverwriteOutput = true; gp.RegisterGeoProcessorEvents((IGeoProcessorEvents)nouveau GPEvents()); IGeoProcessorResult2 result = gp.Execute(proc, null) as IGeoProcessorResult2; IGPMessages msgs = result.GetResultMessages(); for(int i=0;i

J'obtiens cette sortie dans VS:

PreToolExecute PostToolExecute2 MultipartToSinglepart Exécution : MultipartToSinglepart GPL0 D:ProjectsAmberGISForumsforumtest.gdbm2s esriGPMessageTypeProcessDefinition Heure de début : Thu Sep 02 11:32:44 2010 esriGPMessageTypeProcessStart 7,00 secondes) esriGPMessageTypeProcessStop

Vous avez raison, AoInitialize n'est pas nécessaire. Comme vous l'avez découvert, le débogage avec l'objet géoprocesseur est un véritable casse-tête.

Ce que vous devez faire pour lire le message, les avertissements et la file d'attente d'erreurs après chaque appel, pour vérifier les problèmes. Il n'y a pas de chance de se fier à la gestion des erreurs .NET standard.

Essayez ceci après chaque appel d'exécution (notez GetMessageS, pas GetMessage)…

Console.WriteLine("Messages : " + gp.GetMessages(1)); Console.WriteLine("Avertissements : " + gp.GetMessages(2)); Console.WriteLine("Erreurs : " + gp.GetMessages(3));


Voir la vidéo: Progresser aux echecs - Mat en 8 coups (Octobre 2021).