0

I created a toolbar using ArcObjects 10.0 which does some heavy processing in the onClick event of the only button it includes. It works fine however it works only once. If I click again on the button nothing happens. To run it again I need to restart ArcMap and run it again. I cannot understand this behavior?

i am working for Electrical Data set, which is having a tree like network, and network should be downstream, there are some lines which lies opposite direction in it. need to identify those lines. below is the example.

enter image description here

below is the process flow i am using in my tool.

enter image description here

Below is the Code linked to click event of the button:

public WrongDirection()
    {
        //Setting Status Bar
        IStatusBar pstatusbar = ArcMap.Application.StatusBar;
        pstatusbar.ShowProgressBar("Running wrong Direction..", 0, 17, 1, true);


        try
        {

            //Define IMxdocument and Imap
            IMxDocument mxdoc = ArcMap.Application.Document as IMxDocument;
            IMap map = mxdoc.FocusMap;
            if (map.Layer[0] == null)
            { return; }



            // Setting GXDialog for Output     
            IGxDialog pGXDialog = new GxDialogClass();
            pGXDialog.AllowMultiSelect = false;
            if (pGXDialog.DoModalSave(0) != true)
            {
                pstatusbar.HideProgressBar();
                return; 
            }

            pGXDialog.ButtonCaption = "Save";
            pGXDialog.Title = "Save Wrong Direction Points Feature";
            pGXDialog.RememberLocation = true;
            IGxObjectFilter gxobjFilter = new GxFilterShapefilesClass();
            pGXDialog.ObjectFilter = gxobjFilter;
            pGXDialog.DoModalSave(0);  
            IGxObject pGxObject = pGXDialog.FinalLocation;
            String s, Fp;
            s = pGXDialog.Name;
            Fp = pGxObject.FullName + "\\" + s;
            pstatusbar.StepProgressBar();




            // Merging HT Overhead Line and HT Underground Line                
            List<string> STRHT = new List<string>();
            for (int i = 0; i < map.LayerCount; i++)
            {
                if (map.Layer[i].Name == "HT Overhead Line")
                {
                    ILayer HTOverheadLine = map.Layer[i];
                    IFeatureLayer fl1 = new FeatureLayerClass();
                    fl1 = HTOverheadLine as IFeatureLayer;
                    IDataset dataset = (ESRI.ArcGIS.Geodatabase.IDataset)(HTOverheadLine);
                    STRHT.Add(dataset.Workspace.PathName + "\\" + ((IDataset)fl1.FeatureClass).BrowseName);
                }
                else
                {
                    if (map.Layer[i].Name == "HT Underground Line")
                    {
                        ILayer HTUndergroundLine = map.Layer[i];
                        IFeatureLayer fl2 = new FeatureLayerClass();
                        fl2 = HTUndergroundLine as IFeatureLayer;
                        IDataset dataset = (ESRI.ArcGIS.Geodatabase.IDataset)(HTUndergroundLine);
                        STRHT.Add(dataset.Workspace.PathName + "\\" + ((IDataset)fl2.FeatureClass).BrowseName);
                    }
                }
            }
            string combindedStringHT = string.Join(";", STRHT.ToArray());
            IGeoProcessor gp = new GeoProcessorClass();
            gp.AddOutputsToMap = true;
            gp.OverwriteOutput = true;
            IVariantArray parameters = new VarArrayClass();
            parameters.Add(combindedStringHT);
            parameters.Add(@"D:\MergeHT.shp");
            gp.Execute("Merge_management", parameters, null);
            pstatusbar.StepProgressBar();


            // Deleting extra field from mergeHT
            IGPUtilities2 gpUtils = new GPUtilitiesClass();
            IFeatureClass featureClass = gpUtils.OpenFeatureClassFromString(@"D:\MergeHT.shp");
            IFields2 fields = featureClass.Fields as IFields2;
            IField2 nameField = null;
            for (int fieldIndex = fields.FieldCount - 1; fieldIndex > -1; fieldIndex = fieldIndex - 1)
            {
                nameField = fields.Field[fieldIndex] as IField2;
                if (nameField.Name != "FID" && nameField.Name != "Shape" && nameField.Name != "OBJECTID" && nameField.Name != "SUBTYPECD")
                {
                    featureClass.DeleteField(nameField);
                }
            }
            pstatusbar.StepProgressBar();



            //Merging LT Overhead and LT underground into one
            List<string> STRLT = new List<string>();
            for (int i = 0; i < map.LayerCount; i++)
            {
                if (map.Layer[i].Name == "LT Overhead Line")
                {
                    ILayer LTOverheadLine = map.Layer[i];
                    IFeatureLayer fl3 = new FeatureLayerClass();
                    fl3 = LTOverheadLine as IFeatureLayer;
                    IDataset dataset = (ESRI.ArcGIS.Geodatabase.IDataset)(LTOverheadLine);
                    STRLT.Add(dataset.Workspace.PathName + "\\" + ((IDataset)fl3.FeatureClass).BrowseName);
                }
                else
                {
                    if (map.Layer[i].Name == "LT Underground Line")
                    {
                        ILayer LTUndergroundLine = map.Layer[i];
                        IFeatureLayer fl4 = new FeatureLayerClass();
                        fl4 = LTUndergroundLine as IFeatureLayer;
                        IDataset dataset = (ESRI.ArcGIS.Geodatabase.IDataset)(LTUndergroundLine);
                        STRLT.Add(dataset.Workspace.PathName + "\\" + ((IDataset)fl4.FeatureClass).BrowseName);
                    }
                }
            }
            string combindedStringLT = string.Join(";", STRLT.ToArray());
            IGeoProcessor gp7 = new GeoProcessorClass();
            gp7.AddOutputsToMap = true;
            gp7.OverwriteOutput = true;
            IVariantArray parameters7 = new VarArrayClass();
            parameters7.Add(combindedStringLT);
            parameters7.Add(@"D:\MergeLT.shp");
            gp7.Execute("Merge_management", parameters7, null);
            pstatusbar.StepProgressBar();

            // Deleting extra field from mergeLT
            IGPUtilities2 gpUtilsLT = new GPUtilitiesClass();
            IFeatureClass featureClassLT = gpUtilsLT.OpenFeatureClassFromString(@"D:\mergeLT.shp");
            IFields2 fieldsLT = featureClassLT.Fields as IFields2;
            IField2 nameFieldLT = null;
            for (int fieldIndex = fieldsLT.FieldCount - 1; fieldIndex > -1; fieldIndex = fieldIndex - 1)
            {
                nameFieldLT = fieldsLT.Field[fieldIndex] as IField2;
                if (nameFieldLT.Name != "FID" && nameFieldLT.Name != "Shape" && nameFieldLT.Name != "OBJECTID" && nameFieldLT.Name != "SUBTYPECD")
                {
                    featureClassLT.DeleteField(nameFieldLT);
                }
            }
            pstatusbar.StepProgressBar();


            //Merging LT and HT into single Merge 
            IGeoProcessor gp10 = new GeoProcessorClass();
            gp10.OverwriteOutput = true;
            IVariantArray parameters10 = new VarArrayClass();
            string STRM = "D:\\MergeHT.shp;D:\\MergeLT.shp";
            parameters10.Add(STRM);
            parameters10.Add(@"in_memory\Merge");
            gp10.Execute("Merge_management", parameters10, null);
            pstatusbar.StepProgressBar();


            // running Feature to Vertices GP tool
            IGeoProcessor gp2 = new GeoProcessorClass();
            gp2.AddOutputsToMap = true;
            gp2.OverwriteOutput = true;
            IVariantArray parameters2 = new VarArrayClass();
            parameters2.Add(@"in_memory\Merge");
            parameters2.Add(@"in_memory\Vertices");
            parameters2.Add("END");
            gp2.Execute("FeatureVerticesToPoints_management", parameters2, null);
            pstatusbar.StepProgressBar();


            // running Feature to CollectEvents GP tool
            IGeoProcessor gp3 = new GeoProcessorClass();
            gp3.AddOutputsToMap = true;
            gp3.OverwriteOutput = true;
            IVariantArray parameters3 = new VarArrayClass();
            parameters3.Add(@"in_memory\Vertices");
            parameters3.Add(Fp);
            gp3.Execute("CollectEvents_stats", parameters3, null);
            pstatusbar.StepProgressBar();

            // Deleting Records which are not duplicates by using Featurecursor.
            IGPUtilities2 gpUtilsWW = new GPUtilitiesClass();
            IFeatureClass featureClassww = gpUtilsLT.OpenFeatureClassFromString(Fp);
            IQueryFilter qF = new QueryFilterClass();
            qF.WhereClause = "ICOUNT = 1";
            IFeatureCursor featureCursor = featureClassww.Search(qF, false);
            IFeature feature = null;
            while ((feature = featureCursor.NextFeature()) != null)
            {
                feature.Delete();
            }
            pstatusbar.StepProgressBar();


            // deleting MeregeHT Shape
            IGeoProcessor gp5 = new GeoProcessorClass();
            gp5.AddOutputsToMap = true;
            gp5.OverwriteOutput = true;
            IVariantArray parameters5 = new VarArrayClass();
            parameters5.Add(@"D:\MergeHT.shp");
            gp5.Execute("Delete_management", parameters5, null);
            pstatusbar.StepProgressBar();


            // deleting MeregeLT Shape
            IGeoProcessor gp8 = new GeoProcessorClass();
            gp8.AddOutputsToMap = true;
            gp8.OverwriteOutput = true;
            IVariantArray parameters8 = new VarArrayClass();
            parameters8.Add(@"D:\MergeLT.shp");
            gp5.Execute("Delete_management", parameters8, null);
            pstatusbar.StepProgressBar();

            // deleting MeregeLT Shape
            IGeoProcessor gp9 = new GeoProcessorClass();
            gp9.AddOutputsToMap = true;
            gp9.OverwriteOutput = true;
            IVariantArray parameters9 = new VarArrayClass();
            parameters9.Add(@"in_memory\Merge");
            gp9.Execute("Delete_management", parameters9, null);
            pstatusbar.StepProgressBar();

            // deleting Vertices Shape
            IGeoProcessor gp6 = new GeoProcessorClass();
            gp6.AddOutputsToMap = true;
            gp6.OverwriteOutput = true;
            IVariantArray parameters6 = new VarArrayClass();
            parameters6.Add(@"in_memory\Vertices");
            gp6.Execute("Delete_management", parameters6, null);
            pstatusbar.StepProgressBar();

            // Removing Layer from TOC
            for (int i = map.LayerCount - 1; i > -1; i--)
            {
                if (map.Layer[i].Valid)
                {
                }
                else
                {
                    ILayer DeleteLayer = map.Layer[i];
                    map.DeleteLayer(DeleteLayer);
                }
            }
            pstatusbar.StepProgressBar();

            // Refreshing Active View
            mxdoc.ActiveView.Refresh();
            pstatusbar.StepProgressBar();
            pstatusbar.HideProgressBar();

        }
        catch (Exception ex)
        {
            pstatusbar.HideProgressBar();
            MessageBox.Show("Error: " + ex.ToString(), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            return;
        }
    }
  • 1
    The problem is to do with the final part of your code, you delete ALL the layers from your map! So when you run the code again there is nothing for it to process. – Hornbydd Jul 6 '17 at 13:59
  • I am deleting only Intermediate layers, original layers reside there always. – Akhil Kumar Jul 7 '17 at 4:40
  • If you feel the code you have posted is OK then you need to be showing us ALL the event code associated with the button as what you have shown us is what gets called not what is doing the calling, maybe the logic is failing in that rather than here? – Hornbydd Jul 7 '17 at 8:50
  • I shall edit the question and shall give complete brief of the tool working – Akhil Kumar Jul 7 '17 at 9:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.