/// <summary> /// Trace Geometry Network /// </summary> /// <param name="geometricNetwork">Geometric Network</param> /// <param name="traceSolverType">trace Solver Type</param> /// <param name="flowElements">flow Elements</param> /// <param name="edgeFlags">edge Flags</param> /// <param name="junctionFlags">junction Flags</param> /// <param name="edgeBarriers">edge Barriers</param> /// <param name="junctionBarriers">junction Barriers</param> /// <param name="flowMethod">method flow</param> /// <param name="outFields">output fields</param> /// <param name="maxFeatures">max Features</param> /// <param name="tolerance">parameter tolerance</param> /// <param name="traceIndeterminateFlow">trace Indeterminate Flow</param> /// <param name="shortestPathObjFn">shortest Path Obj Fn</param> /// <param name="disableLayers">list of disable layers</param> /// <param name="netJunctionWeight">Junction Weight</param> /// <param name="netFromToEdgeWeight">FromTo Edge Weight</param> /// <param name="netToFromEdgeWeight">ToFrom Edge Weight</param> /// <param name="netJunctionFilterWeight">Junction Filter Weight</param> /// <param name="junctionFilterRangesFrom">junction Filter Ranges From</param> /// <param name="junctionFilterRangesTo">junction Filter Ranges To</param> /// <param name="junctionFilterNotOperator">junction Filter Not Operator</param> /// <param name="netFromToEdgeFilterWeight">FromTo Edge Filter Weight</param> /// <param name="netToFromEdgeFilterWeight">ToFrom Edge Filter Weight</param> /// <param name="edgeFilterRangesFrom">edge Filter Ranges From</param> /// <param name="edgeFilterRangesTo">edge Filter Ranges To</param> /// <param name="edgeFilterNotOperator">edge Filter Not Operator</param> /// <returns>Trace Geometric Network</returns> internal static byte[] GetTraceGeometryNetwork(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, TraceSolverType traceSolverType, esriFlowElements flowElements, List <IPoint> edgeFlags, List <IPoint> junctionFlags, List <IPoint> edgeBarriers, List <IPoint> junctionBarriers, esriFlowMethod flowMethod, string[] outFields, int maxFeatures, double tolerance, bool traceIndeterminateFlow, esriShortestPathObjFn shortestPathObjFn, List <int> disableLayers, INetWeight netJunctionWeight, INetWeight netFromToEdgeWeight, INetWeight netToFromEdgeWeight, INetWeight netJunctionFilterWeight, List <object> junctionFilterRangesFrom, List <object> junctionFilterRangesTo, bool junctionFilterNotOperator, INetWeight netFromToEdgeFilterWeight, INetWeight netToFromEdgeFilterWeight, List <object> edgeFilterRangesFrom, List <object> edgeFilterRangesTo, bool edgeFilterNotOperator) { IGeometricNetworkParameters geometricNetworkParameters = new GeometricNetworkParameters(); geometricNetworkParameters.EdgeFlags = edgeFlags; geometricNetworkParameters.JunctionFlags = junctionFlags; geometricNetworkParameters.EdgeBarriers = edgeBarriers; geometricNetworkParameters.JunctionBarriers = junctionBarriers; geometricNetworkParameters.MaxFeatures = maxFeatures; geometricNetworkParameters.Tolerance = tolerance; geometricNetworkParameters.FlowElements = flowElements; IGeometricNetworkTracer geometricNetworkTracer = new GeometricNetworkTracer(geometricNetwork, geometricNetworkParameters, traceSolverType, flowMethod, traceIndeterminateFlow); geometricNetworkTracer.OutFields = outFields; geometricNetworkTracer.DisableLayers = disableLayers; geometricNetworkTracer.JunctionWeight = netJunctionWeight; geometricNetworkTracer.FromToEdgeWeight = netFromToEdgeWeight; geometricNetworkTracer.ToFromEdgeWeight = netToFromEdgeWeight; geometricNetworkTracer.JunctionFilterWeight = netJunctionFilterWeight; geometricNetworkTracer.JunctionFilterRangesFrom = junctionFilterRangesFrom; geometricNetworkTracer.JunctionFilterRangesTo = junctionFilterRangesTo; geometricNetworkTracer.JunctionFilterNotOperator = junctionFilterNotOperator; geometricNetworkTracer.FromToEdgeFilterWeight = netFromToEdgeFilterWeight; geometricNetworkTracer.ToFromEdgeFilterWeight = netToFromEdgeFilterWeight; geometricNetworkTracer.EdgeFilterRangesFrom = edgeFilterRangesFrom; geometricNetworkTracer.EdgeFilterRangesTo = edgeFilterRangesTo; geometricNetworkTracer.EdgeFilterNotOperator = edgeFilterNotOperator; if ((traceSolverType == TraceSolverType.FindPath) || (traceSolverType == TraceSolverType.FindSource)) { geometricNetworkTracer.ShortestPathObjFn = shortestPathObjFn; } return(geometricNetworkTracer.Solve().JsonByte()); }
public static List <int> StreamTrace(IGeometricNetwork geometricNetwork, StartFlagEdge edge, List <int> disabledFeatureClassIds, StopperJunctions stoppers, bool isUpStream, int maxFeatureCount, ServerLogger logger) { esriFlowMethod direction = isUpStream ? esriFlowMethod.esriFMUpstream : esriFlowMethod.esriFMDownstream; if (null == geometricNetwork || null == edge || maxFeatureCount <= 0) { return(null); } ITraceFlowSolverGEN traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; INetSolver netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = geometricNetwork.Network; INetFlag netFlag = new EdgeFlagClass(); netFlag.UserClassID = edge.FeatureClassID; netFlag.UserID = edge.FeatureID; //no idea when to assign -1, when to do 0 netFlag.UserSubID = -1; traceFlowSolver.PutEdgeOrigins(new IEdgeFlag[1] { netFlag as IEdgeFlag }); if (null != disabledFeatureClassIds) { foreach (int il in disabledFeatureClassIds) { if (il > 0) { netSolver.DisableElementClass(il); } } } if (null != stoppers && null != stoppers.Stoppers && stoppers.Stoppers.Length > 0) { INetElementBarriersGEN netBarriersGEN = null; netBarriersGEN = new NetElementBarriersClass() as INetElementBarriersGEN; netBarriersGEN.ElementType = esriElementType.esriETJunction; netBarriersGEN.Network = geometricNetwork.Network; netBarriersGEN.SetBarriers(stoppers.FeatureClassID, stoppers.Stoppers); netSolver.set_ElementBarriers(esriElementType.esriETJunction, netBarriersGEN as INetElementBarriers); } IEnumNetEID junctionEIDs = null; IEnumNetEID edgeEIDs = null; traceFlowSolver.TraceIndeterminateFlow = false; try { traceFlowSolver.FindFlowElements(direction, esriFlowElements.esriFEEdges, out junctionEIDs, out edgeEIDs); if (null != edgeEIDs) { if (edgeEIDs.Count <= maxFeatureCount) { IEIDHelper eidHelper = new EIDHelperClass(); eidHelper.GeometricNetwork = geometricNetwork; eidHelper.ReturnGeometries = false; eidHelper.ReturnFeatures = true; //eidHelper.AddField("FType"); IEnumEIDInfo eidInfos = eidHelper.CreateEnumEIDInfo(edgeEIDs); eidInfos.Reset(); IEIDInfo eidInfo = null; List <int> ftrs = new List <int>(); //IFeature cadFtr = null; //int ftype; while ((eidInfo = eidInfos.Next()) != null) { ftrs.Add(eidInfo.Feature.OID); /*cadFtr = eidInfo.Feature; * if (null != cadFtr.get_Value(edgeTypeId) && int.TryParse(cadFtr.get_Value(edgeTypeId).ToString(), out ftype)) * { * if(460 == ftype || 558 == ftype) * ftrs.Add(cadFtr); * }*/ } return(ftrs); } } } catch (Exception e) { if (null != logger) { logger.LogMessage(ServerLogger.msgType.error, typeof(AOUtilities).Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name, ErrorCode, e.Message); } } finally { ReleaseCOMObj(traceFlowSolver); } return(null); }
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; } }
/// <summary> /// Initializes a new instance of the GeometricNetworkTracer class /// </summary> /// <param name="geometricNetwork">object geometricNetwork</param> /// <param name="geometricNetworkParameters">object IGeometricNetworkParameters</param> /// <param name="traceSolverType">trace Solver Type</param> /// <param name="flowMethod">flow method</param> /// <param name="traceIndeterminateFlow">trace Indeterminate Flow</param> public GeometricNetworkTracer(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, IGeometricNetworkParameters geometricNetworkParameters, TraceSolverType traceSolverType, esriFlowMethod flowMethod, bool traceIndeterminateFlow) : base(geometricNetwork, geometricNetworkParameters) { this.TraceSolverType = traceSolverType; this.FlowMethod = flowMethod; this.TraceIndeterminateFlow = traceIndeterminateFlow; this.DisableLayers = new List <int>(); }