A4WaterUtilities.GeoNetTools.TraceFlow C# (CSharp) Méthode

TraceFlow() public static méthode

public static TraceFlow ( IPoint &point, IApplication app, esriFlowMethod flow, double snapTol, bool traceIndeterminate, bool selectEdges ) : void
point IPoint
app IApplication
flow esriFlowMethod
snapTol double
traceIndeterminate bool
selectEdges bool
Résultat void
        public static void TraceFlow(ref IPoint point, IApplication app, esriFlowMethod flow, double snapTol, bool traceIndeterminate, bool selectEdges)
        {
            IMap map = null;
            IProgressDialogFactory pProDFact;
            IStepProgressor pStepPro;
            IProgressDialog2 pProDlg = null;
            ITrackCancel pTrkCan;

            List<IGeometricNetwork> gnList;
            IGeometricNetwork gn = null;
            IPoint snappedPoint = null;
            IFlagDisplay pFlagDisplay;
            INetFlag startNetFlag;
            ITraceFlowSolverGEN traceFlowSolver;
            List<IEdgeFlag> pEdgeFlags = null;
            List<IJunctionFlag> pJunctionFlags = null;
            //List<IEdgeFlag> pEdgeFlagsBar = null;
            //List<IJunctionFlag> pJunctionFlagsBar = null;
            INetElementBarriers pEdgeElementBarriers;
            INetElementBarriers pJunctionElementBarriers;
            ISelectionSetBarriers pSelectionSetBarriers;
            INetworkAnalysisExt pNetAnalysisExt = null;
            List<INetFlag> pNetFlags = new List<INetFlag>();
            IJunctionFlag[] junctionFlag;
            IEdgeFlag[] edgeFlag;
            IEnumNetEID juncEIDs;
            IEnumNetEID edgeEIDs;
            IEnvelope env;
            int EID = -1;
            double distanceAlong;

            UID pID = null;
            INetSolver netSolver = null;

            try
            {

                map = ((IMxDocument)app.Document).FocusMap;

                bool boolCont = true;
                // Create a CancelTracker
                pTrkCan = new CancelTrackerClass();
                // Create the ProgressDialog. This automatically displays the dialog
                pProDFact = new ProgressDialogFactoryClass();
                pProDlg = (IProgressDialog2)pProDFact.Create(pTrkCan, 0);

                // Set the properties of the ProgressDialog
                pProDlg.CancelEnabled = true;
                if (flow == esriFlowMethod.esriFMConnected)
                {
                    pProDlg.Description = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsDesc_14a");
                    pProDlg.Title = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsTitle_14a");
                }
                else if (flow == esriFlowMethod.esriFMDownstream)
                {
                    pProDlg.Description = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsDesc_14b");
                    pProDlg.Title = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsTitle_14b");
                }
                else if (flow == esriFlowMethod.esriFMUpstream)
                {
                    pProDlg.Description = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsDesc_14c");
                    pProDlg.Title = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsTitle_14c");
                }

                pProDlg.Animation = esriProgressAnimationTypes.esriProgressGlobe;

                // Set the properties of the Step Progressor
                pStepPro = (IStepProgressor)pProDlg;

                pStepPro.MinRange = 0;
                pStepPro.MaxRange = 8;
                pStepPro.StepValue = 1;
                pStepPro.Position = 0;
                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_4");

                gnList = Globals.GetGeometricNetworksCurrentlyVisible(ref map);
                int gnIdx = -1;

                if (gnList == null || gnList.Count == 0)
                {
                    MessageBox.Show(A4LGSharedFunctions.Localizer.GetString("GeoNetToolsError_2"), A4LGSharedFunctions.Localizer.GetString("GeoNetToolsErrorLbl_2"));
                    return;
                }

                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14a");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }
                //Remove old trace graphics (flags and results)
                Globals.RemoveTraceGraphics(map, true);
                Globals.ClearSelected(map, true);

                // Create junction or edge flag at start of trace - also returns geometric network, snapped point, and EID of junction
                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_5");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }

                startNetFlag = Globals.GetJunctionFlag(ref point, ref map, ref gnList, snapTol, ref gnIdx, out snappedPoint, out EID, out pFlagDisplay, true) as INetFlag;
                if (startNetFlag == null)
                {
                    startNetFlag = Globals.GetEdgeFlag(ref point, ref map, ref gnList, snapTol, ref gnIdx, out snappedPoint, out EID, out distanceAlong, out pFlagDisplay, true) as INetFlag;
                }

                //Set network to trace
                if (gnIdx > -1)
                    gn = gnList[gnIdx] as IGeometricNetwork;

                // Stop if user point was not on a visible network feature, old trace results and selection are cleared
                if (gn == null || startNetFlag == null)
                {
                    return;
                }

                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14b");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }
                //Setup trace solver
                //  ITraceFlowSolverGEN traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
                // ITraceFlowSolver traceFlowSolver = Globals.CreateTraceFlowSolverFromToolbar(gn);

                if (app != null)
                {

                    pID = new UID();

                    pID.Value = "esriEditorExt.UtilityNetworkAnalysisExt";
                    pNetAnalysisExt = (INetworkAnalysisExt)app.FindExtensionByCLSID(pID);
                    Globals.SetCurrentNetwork(ref pNetAnalysisExt, ref gn);
                    traceFlowSolver = Globals.CreateTraceFlowSolverFromToolbar(ref pNetAnalysisExt, out pEdgeFlags, out pJunctionFlags, out pEdgeElementBarriers, out pJunctionElementBarriers, out pSelectionSetBarriers) as ITraceFlowSolverGEN;
                    pID = null;

                }
                else
                {
                    traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
                    netSolver = traceFlowSolver as INetSolver;

                    netSolver.SourceNetwork = gn.Network;
                    netSolver = null;

                }

                traceFlowSolver.TraceIndeterminateFlow = traceIndeterminate;

                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14c");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }
                //Add the flag to the trace solver

                if (pEdgeFlags != null)
                {
                    foreach (IEdgeFlag pEdFl in pEdgeFlags)
                    {
                        pNetFlags.Add((INetFlag)pEdFl);

                    }
                }
                if (pJunctionFlags != null)
                {

                    foreach (IJunctionFlag pJcFl in pJunctionFlags)
                    {
                        pNetFlags.Add((INetFlag)pJcFl);
                    }
                }
                if (startNetFlag != null)
                {

                    pNetFlags.Add((INetFlag)startNetFlag);

                }

                Globals.AddFlagsToTraceSolver(pNetFlags.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag);

                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14d");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }
                //Run the trace

                traceFlowSolver.FindFlowElements(flow, esriFlowElements.esriFEJunctionsAndEdges, out juncEIDs, out edgeEIDs);

                if (juncEIDs.Count == 0)
                {
                    if (flow == esriFlowMethod.esriFMDownstream)
                        MessageBox.Show(
                          A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14e") + Environment.NewLine + Environment.NewLine +
                          A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14f")
                        , A4LGSharedFunctions.Localizer.GetString("GeoNetToolsTitle_14b"));
                    else
                        MessageBox.Show(
                          A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14g") + Environment.NewLine + Environment.NewLine +
                          A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14f")
                          , A4LGSharedFunctions.Localizer.GetString("GeoNetToolsTitle_14c"));
                    return;
                }

                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_14h");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }
                //Select junction features
                Globals.SelectJunctions(ref map, ref gn, ref juncEIDs, ref junctionFlag, "", "", "", true);

                if (selectEdges)
                    Globals.SelectEdges(ref map, ref gn, ref edgeEIDs);
                else
                    Globals.DrawEdges(ref map, ref gn, ref edgeEIDs);

                //edgeEIDs.Reset();

                //Draw edge graphics

                //Draw graphic point at start location of trace
                if (pNetAnalysisExt != null)
                {
                    Globals.AddFlagToGN(ref pNetAnalysisExt, ref gn, ref pFlagDisplay);
                }
                else
                {
                    Globals.AddPointGraphic(map, snappedPoint, false);
                }
                Globals.GetCommand("esriArcMapUI.ZoomToSelectedCommand", app).Execute();

                //Open identify dialog with selected features
                //IdentifySelected(map);

                // add set flow direction buttons
                pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("Complete");
                pStepPro.Step();
                boolCont = pTrkCan.Continue();

                if (!boolCont)
                {

                    pStepPro.Hide();
                    pProDlg.HideDialog();
                    pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;
                }
                ((IMxDocument)app.Document).ActiveView.Refresh();

                return;
            }
            catch (Exception ex)
            {
                MessageBox.Show(A4LGSharedFunctions.Localizer.GetString("ErrorInThe") + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_14a") + ": " + ex.ToString());
                if (pProDlg != null)
                {

                    pProDlg.HideDialog();
                    //pStepPro = null;
                    pProDlg = null;
                    pProDFact = null;
                    return;

                }

            }
            finally
            {
                if (pProDlg != null)
                {

                    pProDlg.HideDialog();
                }
                pStepPro = null;
                pProDlg = null;
                pProDFact = null;

                gnList = null;
                gn = null;
                snappedPoint = null;
                pFlagDisplay = null;
                startNetFlag = null;
                traceFlowSolver = null;
                pEdgeFlags = null;
                pJunctionFlags = null;
                pNetAnalysisExt = null;
                pNetFlags = null;
                junctionFlag = null;
                edgeFlag = null;
                juncEIDs = null;
                edgeEIDs = null;
                env = null;
                map = null;

                pID = null;
                netSolver = null;
            }
        }