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;
}
}