public override void OnMouseDown(int Button, int Shift, int X, int Y) { base.OnMouseDown(Button, Shift, X, Y); if (Button != 1) { return; } //获取坐标点 IPoint inPoint = new PointClass(); inPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); IMap map = m_hookHelper.FocusMap; //查询与坐标点最近的管点 IPointToEID pointToEID = new PointToEIDClass(); // if (geomretyNetwork == null) { return; } pointToEID.GeometricNetwork = geomretyNetwork; pointToEID.SourceMap = map; pointToEID.SnapTolerance = 10; IPoint outPoint = new PointClass(); int nearestJunctionEID = -1; pointToEID.GetNearestJunction(inPoint, out nearestJunctionEID, out outPoint); if (outPoint == null || outPoint.IsEmpty) { return; } //获取管点标识并加入列表 INetElements netElemnts = geomretyNetwork.Network as INetElements; int UserClassID = 0; int UserID = 0; int UserSubID = 0; netElemnts.QueryIDs(nearestJunctionEID, esriElementType.esriETJunction, out UserClassID, out UserID, out UserSubID); //设置并添加管点标识 INetFlag netFlag = new JunctionFlagClass() as INetFlag; netFlag.UserClassID = UserClassID; netFlag.UserID = UserID; netFlag.UserSubID = UserSubID; // listJunctionFlags.Add(netFlag as IJunctionFlag); //绘制点要素 DrawElement(outPoint); }
/// <summary> /// 根据输入点建立旗帜数组 /// </summary> /// <param name="pGeometricNet"></param> /// <param name="pCollection"></param> /// <param name="pDisc"></param> /// <param name="pNetElements"></param> /// <returns></returns> private static IJunctionFlag[] GetJunctionFlags(IMap pMap, IGeometricNetwork pGeometricNet, IPointCollection pCollection, double pDisc) { INetElements pNetElements = pGeometricNet.Network as INetElements; int pCount = pCollection.PointCount; IJunctionFlag[] pJunctionFlags = new JunctionFlagClass[pCount]; IPointToEID pPointToEID = new PointToEIDClass(); pPointToEID.SourceMap = pMap; pPointToEID.GeometricNetwork = pGeometricNet; //从输入点找最近节点的距离阈值 pPointToEID.SnapTolerance = pDisc; for (int i = 0; i < pCount; i++) { INetFlag pNetFlag = new JunctionFlagClass(); IPoint pEdgePoint = pCollection.get_Point(i); #region 查找输入点最近的节点的ID int nearestJunctionID; IPoint locationPoint; int userClassID; int userID; int userSubID; pPointToEID.GetNearestJunction(pEdgePoint, out nearestJunctionID, out locationPoint); pNetElements.QueryIDs(nearestJunctionID, esriElementType.esriETJunction, out userClassID, out userID, out userSubID); #endregion //设置网络旗帜的节点的ID pNetFlag.UserClassID = userClassID; pNetFlag.UserID = userID; pNetFlag.UserSubID = userSubID; //节点旗帜 IJunctionFlag pJuncF = pNetFlag as IJunctionFlag; //添加 pJunctionFlags[i] = pJuncF; } return(pJunctionFlags); }
public static void UpStreamTrace(AxMapControl ppAxMapControl, IPoint pPoint, IGeometricNetwork pGeoNetwork) { try { //�����ͼ��ѡ�� ppAxMapControl.ActiveView.FocusMap.ClearSelection(); INetElements pNetElements = pGeoNetwork.Network as INetElements; IPointToEID pPtToEID = new PointToEIDClass(); int pJunctionID = 0; int iUserClassID; int iUserID; int iUserSubID; IPoint pLocation; pPtToEID.SourceMap = ppAxMapControl.ActiveView.FocusMap; pPtToEID.GeometricNetwork = pGeoNetwork; pPtToEID.SnapTolerance = ppAxMapControl.ActiveView.Extent.Envelope.Width / 100; pPtToEID.GetNearestJunction(pPoint, out pJunctionID, out pLocation); if (pJunctionID == 0) { MessageBox.Show("û�в������ٽ��ĵ�"); } else { pNetElements.QueryIDs(pJunctionID, esriElementType.esriETJunction, out iUserClassID, out iUserID, out iUserSubID); INetFlag ipNetFlag = new JunctionFlagClass(); ipNetFlag.UserClassID = iUserClassID; ipNetFlag.UserID = iUserID; ipNetFlag.UserSubID = iUserSubID; IMarkerSymbol pMarkerSym = new SimpleMarkerSymbolClass(); IRgbColor pRGBColor = new RgbColorClass(); pRGBColor.Red = 255; pRGBColor.Green = 0; pRGBColor.Blue = 0; pMarkerSym.Color = pRGBColor; pMarkerSym.Size = 20; //�����µ�Flag IEdgeFlagDisplay pEdgeFlagDisplay = new EdgeFlagDisplayClass(); IFlagDisplay pFlagDisplay = pEdgeFlagDisplay as IFlagDisplay; pFlagDisplay.Symbol = pMarkerSym as ISymbol; pFlagDisplay.Geometry = pLocation; pFlagDisplay.FeatureClassID = iUserClassID; pFlagDisplay.FID = iUserID; pFlagDisplay.SubID = iUserSubID; //���Ƹõ� IScreenDisplay pScreenDisplay = ppAxMapControl.ActiveView.ScreenDisplay; pScreenDisplay.StartDrawing(pScreenDisplay.hDC, 0); pScreenDisplay.SetSymbol(pMarkerSym as ISymbol); pScreenDisplay.DrawPoint(pLocation as IGeometry); pScreenDisplay.FinishDrawing(); //�����ٽ�� FindStreamTraceResult(ppAxMapControl, ipNetFlag, pGeoNetwork); } } catch (Exception eX) { MessageBox.Show(eX.Message); } }
//////////////////////////////////�����������ǰ���ý����С�� public static void ProfileSetJunctionFlag(AxMapControl ppAxMapControl, ref IArray pNetFlagArray, IPoint pPoint, IGeometricNetwork pGeoNetwork) { try { //�����ͼ��ѡ�� ppAxMapControl.ActiveView.FocusMap.ClearSelection(); INetElements pNetElements = pGeoNetwork.Network as INetElements; IPointToEID pPtToEID = new PointToEIDClass(); int pJunctionID = 0; int iUserClassID; int iUserID; int iUserSubID; IPoint pLocation; pPtToEID.SourceMap = ppAxMapControl.ActiveView.FocusMap; pPtToEID.GeometricNetwork = pGeoNetwork; pPtToEID.SnapTolerance = ppAxMapControl.ActiveView.Extent.Envelope.Width / 100; pPtToEID.GetNearestJunction(pPoint, out pJunctionID, out pLocation); if (pJunctionID == 0) { MessageBox.Show("û�в������ٽ��ĵ�"); } else { pNetElements.QueryIDs(pJunctionID, esriElementType.esriETJunction, out iUserClassID, out iUserID, out iUserSubID); INetFlag ipNetFlag = new JunctionFlagClass(); ipNetFlag.UserClassID = iUserClassID; ipNetFlag.UserID = iUserID; ipNetFlag.UserSubID = iUserSubID; IMarkerSymbol pMarkerSym = new SimpleMarkerSymbolClass(); IRgbColor pRGBColor = new RgbColorClass(); pRGBColor.Red = 255; pRGBColor.Green = 0; pRGBColor.Blue = 0; pMarkerSym.Color = pRGBColor; pMarkerSym.Size = 20; //���Ƹõ� IScreenDisplay pScreenDisplay = ppAxMapControl.ActiveView.ScreenDisplay; pScreenDisplay.StartDrawing(pScreenDisplay.hDC, 0); pScreenDisplay.SetSymbol(pMarkerSym as ISymbol); pScreenDisplay.DrawPoint(pLocation); pScreenDisplay.FinishDrawing(); if (pLocation != null) { pNetFlagArray.Add(ipNetFlag); } if (pNetFlagArray.Count == 2) { //�����ٽ�� ProfileFindPath(ppAxMapControl, pNetFlagArray, pGeoNetwork); } } } catch (Exception eX) { MessageBox.Show(eX.Message); } }
public ITraceFlowSolverGEN UTIL_coreTraceSetup() { // get the current network's logical network INetworkAnalysisExt nax = m_utilNetExt as INetworkAnalysisExt; INetwork net = nax.CurrentNetwork.Network; // create a new TraceFlowSolver object and // set the source network for the solve ITraceFlowSolverGEN tfs = new TraceFlowSolverClass() as ITraceFlowSolverGEN; INetSolver netSolver = tfs as INetSolver; netSolver.SourceNetwork = net; // get the barriers for the network, using the element barriers and // selection barriers that have been added using the user interface INetworkAnalysisExtBarriers naxBarriers = m_utilNetExt as INetworkAnalysisExtBarriers; INetElementBarriers juncElemBarriers, edgeElemBarriers; naxBarriers.CreateElementBarriers(out juncElemBarriers, out edgeElemBarriers); ISelectionSetBarriers selSetBarriers; naxBarriers.CreateSelectionBarriers(out selSetBarriers); netSolver.set_ElementBarriers(esriElementType.esriETJunction, juncElemBarriers); netSolver.set_ElementBarriers(esriElementType.esriETEdge, edgeElemBarriers); netSolver.SelectionSetBarriers = selSetBarriers; // set up the disabled layers for the network solver // for each feature layer belonging to this network, determine if it is // enabled or disabled; if it's disabled, then notify the network solver for (int i = 0; i < nax.FeatureLayerCount; i++) { IFeatureLayer featureLayer = nax.get_FeatureLayer(i); if (naxBarriers.GetDisabledLayer(featureLayer)) { netSolver.DisableElementClass(featureLayer.FeatureClass.FeatureClassID); } } INetworkAnalysisExtWeightFilter naxWeightFilter = m_utilNetExt as INetworkAnalysisExtWeightFilter; INetSolverWeightsGEN netSolverWeights = netSolver as INetSolverWeightsGEN; INetSchema netSchema = net as INetSchema; // create the junction weight filter int juncFilterRangeCount = naxWeightFilter.get_FilterRangeCount(esriElementType.esriETJunction); if (juncFilterRangeCount > 0) { INetWeight netWeight = netSchema.get_WeightByName(naxWeightFilter.JunctionWeightFilterName); netSolverWeights.JunctionFilterWeight = netWeight; esriWeightFilterType juncWeightFilterType; bool juncApplyNotOperator; naxWeightFilter.GetFilterType(esriElementType.esriETJunction, out juncWeightFilterType, out juncApplyNotOperator); netSolverWeights.SetFilterType(esriElementType.esriETJunction, juncWeightFilterType, juncApplyNotOperator); object[] juncFromValues = new object[juncFilterRangeCount]; object[] juncToValues = new object[juncFilterRangeCount]; for (int i = 0; i < juncFilterRangeCount; i++) { naxWeightFilter.GetFilterRange(esriElementType.esriETJunction, i, out juncFromValues[i], out juncToValues[i]); } netSolverWeights.SetFilterRanges(esriElementType.esriETJunction, ref juncFromValues, ref juncToValues); } // create the edge weight filters int edgeFilterRangeCount = naxWeightFilter.get_FilterRangeCount(esriElementType.esriETEdge); if (edgeFilterRangeCount > 0) { INetWeight fromToNetWeight = netSchema.get_WeightByName(naxWeightFilter.FromToEdgeWeightFilterName); netSolverWeights.FromToEdgeFilterWeight = fromToNetWeight; INetWeight toFromNetWeight = netSchema.get_WeightByName(naxWeightFilter.ToFromEdgeWeightFilterName); netSolverWeights.ToFromEdgeFilterWeight = toFromNetWeight; esriWeightFilterType edgeWeightFilterType; bool edgeApplyNotOperator; naxWeightFilter.GetFilterType(esriElementType.esriETEdge, out edgeWeightFilterType, out edgeApplyNotOperator); netSolverWeights.SetFilterType(esriElementType.esriETEdge, edgeWeightFilterType, edgeApplyNotOperator); object[] edgeFromValues = new object[edgeFilterRangeCount]; object[] edgeToValues = new object[edgeFilterRangeCount]; for (int i = 0; i < edgeFilterRangeCount; i++) { naxWeightFilter.GetFilterRange(esriElementType.esriETEdge, i, out edgeFromValues[i], out edgeToValues[i]); } netSolverWeights.SetFilterRanges(esriElementType.esriETEdge, ref edgeFromValues, ref edgeToValues); } INetworkAnalysisExtFlags naxFlags = m_utilNetExt as INetworkAnalysisExtFlags; // assign the edge flags to the network solver int edgeFlagCount = naxFlags.EdgeFlagCount; if (edgeFlagCount > 0) { IEdgeFlag[] edgeFlags = new IEdgeFlag[edgeFlagCount]; for (int i = 0; i < edgeFlagCount; i++) { IEdgeFlagDisplay edgeFlagDisplay = naxFlags.get_EdgeFlag(i); IFlagDisplay flagDisplay = edgeFlagDisplay as IFlagDisplay; IEdgeFlag edgeFlag = new EdgeFlagClass(); edgeFlag.Position = Convert.ToSingle(edgeFlagDisplay.Percentage); INetFlag netFlag = edgeFlag as INetFlag; netFlag.UserClassID = flagDisplay.FeatureClassID; netFlag.UserID = flagDisplay.FID; netFlag.UserSubID = flagDisplay.SubID; edgeFlags[i] = edgeFlag; } tfs.PutEdgeOrigins(ref edgeFlags); } // assign the junction flags to the network solver int juncFlagCount = naxFlags.JunctionFlagCount; if (juncFlagCount > 0) { IJunctionFlag[] juncFlags = new IJunctionFlag[juncFlagCount]; for (int i = 0; i < juncFlagCount; i++) { IJunctionFlagDisplay juncFlagDisplay = naxFlags.get_JunctionFlag(i); IFlagDisplay flagDisplay = juncFlagDisplay as IFlagDisplay; IJunctionFlag juncFlag = new JunctionFlagClass(); INetFlag netFlag = juncFlag as INetFlag; netFlag.UserClassID = flagDisplay.FeatureClassID; netFlag.UserID = flagDisplay.FID; netFlag.UserSubID = flagDisplay.SubID; juncFlags[i] = juncFlag; } tfs.PutJunctionOrigins(ref juncFlags); } // set the option for tracing on indeterminate flow ITraceTasks traceTasks = m_utilNetExt as ITraceTasks; tfs.TraceIndeterminateFlow = traceTasks.TraceIndeterminateFlow; return(tfs); }
public static string TraceIsolation(double[] x, double[] y, IApplication app, string sourceFLName, string valveFLName, string operableFieldNameValves, string operableFieldNameSources, double snapTol, bool processEvent, string[] opValues, string addSQL, bool traceIndeterminate, bool ZeroSourceCont, bool selectEdges, string MeterName, string MeterCritField, string MeterCritVal) { IMap map = null; List<int> valveFCClassIDs = new List<int>(); IProgressDialogFactory pProDFact = null; IStepProgressor pStepPro = null; IProgressDialog2 pProDlg = null; ITrackCancel pTrkCan = null; int pointAlong = 0; List<IGeometricNetwork> gnList = null; int gnIdx; IGeometricNetwork gn = null; IPoint snappedPoint = null; int EID = -1; double distanceAlong; List<INetFlag> startNetFlag = null; List<IFlagDisplay> pFlagsDisplay = null; //Find feature classes string[] sourceFLs; IFeatureClass[] sourceFC = null; IFeatureLayer[] sourceFL = null; List<int> sourceFCClassIDs = new List<int>(); string[] strValveFLs; IFeatureLayer pTempLay = null; List<IFeatureLayer> valveFLs = null; List<IFeatureClass> valveFCs = null; //IFeatureLayer meterFL = null; // string meterDSName; IJunctionFlag[] junctionFlag = null; IEdgeFlag[] edgeFlag = null; ITraceFlowSolverGEN traceFlowSolver = null; INetSolver netSolver = null; INetElementBarriersGEN netElementBarriers = null; INetElementBarriers nb = null; IEnumNetEID juncEIDs = null; IEnumNetEID edgeEIDs = null; IEIDInfo eidInfo = null; IEIDInfo valveEIDInfo = null; IEIDInfo sourceEIDInfo = null; IEIDInfo vEIDInfo = null; List<int[]> userIds = null; IEIDHelper eidHelper = null; List<Hashtable> valveEIDInfoHT = null; Hashtable sourceEIDInfoHT = null; System.Object[] segCosts = null; ISelectionSetBarriers netElementBarrier = null; List<IEdgeFlag> pEdgeFlags = null; List<IJunctionFlag> pJunctionFlags = null; //List<IEdgeFlag> pEdgeFlagsBar = null; //List<IJunctionFlag> pJunctionFlagsBar = null; INetElementBarriers pEdgeElementBarriers = null; INetElementBarriers pJunctionElementBarriers = null; ISelectionSetBarriers pSelectionSetBarriers = null; List<INetFlag> pNetFlags; //ITraceResult traceRes = null; IFlagDisplay pFlagDisplay = null; INetworkAnalysisExt pNetAnalysisExt = null; UID pID = null; IJunctionFlag[] junctionFlags = null; IEdgeFlag[] edgeFlags = null; Hashtable noSourceValveHT = null; Hashtable hasSourceValveHT = null; List<BarClassIDS> barrierIds = null; Hashtable sourceDirectEIDInfoHT = null; INetFlag netFlag1 = null; INetFlag netFlag2 = null; try { map = ((app.Document as IMxDocument).FocusMap); bool boolCont = true; if (processEvent) { // 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; pProDlg.Description = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsDesc_16a"); pProDlg.Title = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsTitle_16a"); pProDlg.Animation = esriProgressAnimationTypes.esriProgressGlobe; // Set the properties of the Step Progressor pStepPro = (IStepProgressor)pProDlg; pStepPro.MinRange = 0; pStepPro.MaxRange = 18; pStepPro.StepValue = 1; pStepPro.Position = 0; pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_4"); 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 A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } } if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_4"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } pointAlong++; gnList = Globals.GetGeometricNetworksCurrentlyVisible(ref map); gnIdx = -1; if (processEvent) { 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 A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } pointAlong++; // Create junction or edge flag at start of trace - also returns geometric network, snapped point, and EID of junction if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15a"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } startNetFlag = new List<INetFlag>();// null;// Globals.GetJunctionFlag(x, y, map, ref gnList, snapTol, ref gnIdx, out snappedPoint, out EID) as INetFlag; //if (startNetFlag == null) pFlagsDisplay = new List<IFlagDisplay>(); if (x != null) { for (int l = 0; l < x.Length; l++) { startNetFlag.Add(Globals.GetEdgeFlag(x[l], y[l], ref map, ref gnList, snapTol, ref gnIdx, out snappedPoint, out EID, out distanceAlong, out pFlagDisplay, true) as INetFlag); pFlagsDisplay.Add(pFlagDisplay); } } pointAlong++; //Set network to trace if (gnIdx > -1) gn = gnList[gnIdx] as IGeometricNetwork; if (app != null) { pID = new UID(); pID.Value = "esriEditorExt.UtilityNetworkAnalysisExt"; pNetAnalysisExt = (INetworkAnalysisExt)app.FindExtensionByCLSID(pID); if (gn != null) { Globals.SetCurrentNetwork(ref pNetAnalysisExt, ref gn); } traceFlowSolver = Globals.CreateTraceFlowSolverFromToolbar(ref pNetAnalysisExt, out pEdgeFlags, out pJunctionFlags, out pEdgeElementBarriers, out pJunctionElementBarriers, out pSelectionSetBarriers) as ITraceFlowSolverGEN; gn = pNetAnalysisExt.CurrentNetwork; netSolver = traceFlowSolver as INetSolver; } else { if (gn == null || startNetFlag.Count == 0) { return A4LGSharedFunctions.Localizer.GetString("NoFlagReturnStatement"); } traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = gn.Network; } traceFlowSolver.TraceIndeterminateFlow = traceIndeterminate; pNetFlags = new List<INetFlag>(); 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) { if (startNetFlag.Count > 0) { foreach (INetFlag pNF in startNetFlag) { if (pNF != null) { pNetFlags.Add((INetFlag)pNF); } } } // pNetFlags.Add((INetFlag)startNetFlag); } if (pNetFlags.Count == 0) { return A4LGSharedFunctions.Localizer.GetString("AddFlagOrClickReturnStatement"); } // Stop if user point was not on a visible network feature, old trace results and selection are cleared if (gn == null || pNetFlags.Count == 0) { return A4LGSharedFunctions.Localizer.GetString("NotIntersectReturnStatement"); } pointAlong++; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16a"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } //Find feature classes sourceFLs = sourceFLName.Split('|'); sourceFC = new IFeatureClass[sourceFLs.Length]; sourceFL = new IFeatureLayer[sourceFLs.Length]; for (int i = 0; i < sourceFLs.Length; i++) { bool FCorLayerTemp = true; sourceFL[i] = (IFeatureLayer)Globals.FindLayer(map, sourceFLs[i], ref FCorLayerTemp); if (sourceFL[i] != null) { sourceFC[i] = sourceFL[i].FeatureClass; sourceFCClassIDs.Add(sourceFL[i].FeatureClass.FeatureClassID); } } pointAlong++; // IFeatureClass sourceFC = (IFeatureClass)Globals.GetFeatureClassFromGeometricNetwork(sourceFCName, gn, esriFeatureType.esriFTSimpleJunction); // IFeatureClass valveFC = (IFeatureClass)Globals.GetFeatureClassFromGeometricNetwork(valveFCName, gn, esriFeatureType.esriFTSimpleJunction); strValveFLs = valveFLName.Split('|'); valveFLs = new List<IFeatureLayer>();//(IFeatureLayer)Globals.FindLayer(map, valveFLName); valveFCs = new List<IFeatureClass>();//[strValveFLs.Length]; for (int i = 0; i < strValveFLs.Length; i++) { bool FCorLayerTemp = true; pTempLay = (IFeatureLayer)Globals.FindLayer(map, strValveFLs[i], ref FCorLayerTemp); if (pTempLay != null) { if (pTempLay.FeatureClass != null) { valveFLs.Add(pTempLay); valveFCs.Add(pTempLay.FeatureClass); valveFCClassIDs.Add(pTempLay.FeatureClass.FeatureClassID); } } } // string strMeterFL = meterFLName; //meterFL = (IFeatureLayer)Globals.FindLayer(map, meterFLName); //meterDSName = ""; //if (meterFL != null) //{ // if (meterFL is IDataset) // { // IDataset pTempDataset = (IDataset)meterFL; // meterDSName = pTempDataset.BrowseName; // if (meterDSName.Contains(".")) // { // meterDSName = meterDSName.Substring(meterDSName.LastIndexOf(".") + 1); // } // Marshal.ReleaseComObject(pTempDataset); // pTempDataset = null; // } //} //meterFL = null; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16a"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } pointAlong++; if (valveFCs == null) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15d") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); ; } return A4LGSharedFunctions.Localizer.GetString("LambdaReturnStatement") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); } pointAlong++; if (valveFCs.Count == 0) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15d") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } return A4LGSharedFunctions.Localizer.GetString("LambdaReturnStatement") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); } if (sourceFC == null) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15d") + sourceFLs + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } return A4LGSharedFunctions.Localizer.GetString("LambdaReturnStatement") + sourceFLs + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); } pointAlong++; if (sourceFC.Length == 0) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15d") + sourceFLs + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } return A4LGSharedFunctions.Localizer.GetString("LambdaReturnStatement") + sourceFLs + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15e") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15f"); } pointAlong++; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16b"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } Globals.AddFlagsToTraceSolver(pNetFlags.ToArray(), ref traceFlowSolver, out junctionFlags, out edgeFlags); if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16c"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } //Create barriers based on all operable valves pointAlong++; netElementBarriers = new NetElementBarriersClass() as INetElementBarriersGEN; netElementBarriers.ElementType = esriElementType.esriETJunction; netElementBarriers.Network = gn.Network; userIds = Globals.GetOperableValveOIDs(valveFCs.ToArray(), operableFieldNameValves, opValues, addSQL); if (userIds == null) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16d"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } } else { if (userIds.Count == 0) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16d"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } } else { try { int idxUser = 0; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16e"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } foreach (IFeatureClass valveFC in valveFCs) { int[] usrid = userIds[idxUser]; if (usrid.Length > 0) { netElementBarriers.SetBarriers(valveFC.FeatureClassID, ref usrid); //error here after sum nb = netElementBarriers as INetElementBarriers; netSolver.set_ElementBarriers(esriElementType.esriETJunction, nb); } idxUser++; } } catch (Exception Ex) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsError_16a") + Ex.Message; pStepPro.Step(); boolCont = pTrkCan.Continue(); return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } } } } pointAlong++; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16f"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } try { traceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out juncEIDs, out edgeEIDs); } catch { juncEIDs = null; edgeEIDs = null; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("ErrorInThe") + "FindFlowEndElements"; pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } return A4LGSharedFunctions.Localizer.GetString("DontFindFlowEltReturnStatement"); //MessageBox.Show("Error in the FindFlowEndElements"); } pointAlong++; eidHelper = new EIDHelperClass(); eidHelper.GeometricNetwork = gn; eidHelper.ReturnFeatures = true; //Save valves which stopped the trace if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16g"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } pointAlong++; valveEIDInfoHT = new List<Hashtable>(); int totalreachcount = 0; foreach (IFeatureClass valveFC in valveFCs) { if (valveFC != null) { Hashtable valveEIDInfoHTtemp = Globals.GetEIDInfoListByFC(valveFC.FeatureClassID, juncEIDs, eidHelper); totalreachcount = totalreachcount + valveEIDInfoHTtemp.Count; valveEIDInfoHT.Add(valveEIDInfoHTtemp); } } if (totalreachcount == 0) { if (processEvent) { pStepPro.Message = (A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16a") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15c") + Environment.NewLine + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16b") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16c") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16d") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16e")); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } return A4LGSharedFunctions.Localizer.GetString("Error") + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16a") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15c") + Environment.NewLine + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16b") + valveFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16c") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16d") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16e"); } pointAlong++; if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16h"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; traceFlowSolver.TraceIndeterminateFlow = traceIndeterminate; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = gn.Network; //Globals.AddFlagsToTraceSolver(startNetFlag.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag); Globals.AddFlagsToTraceSolver(pNetFlags.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag); Globals.AddBarriersToSolver(ref traceFlowSolver, ref pEdgeElementBarriers, ref pJunctionElementBarriers, ref pSelectionSetBarriers); pointAlong++; foreach (int sFC in sourceFCClassIDs) { netSolver.DisableElementClass(sFC); } traceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctions, out juncEIDs, out edgeEIDs); pointAlong++; //Save sources which are reachable if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16i"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } sourceEIDInfoHT = new Hashtable(); //foreach (IFeatureClass sFC in sourceFC) //{ Globals.GetEIDInfoListByFCWithHT(ref sourceEIDInfoHT, sourceFCClassIDs, operableFieldNameSources, opValues, juncEIDs, eidHelper); //} pointAlong++; if (sourceEIDInfoHT.Count == 0) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("No") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15c") + Environment.NewLine + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16b") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16c") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16j"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return null; } return A4LGSharedFunctions.Localizer.GetString("Error") + A4LGSharedFunctions.Localizer.GetString("No") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_15c") + Environment.NewLine + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16b") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16c") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16j"); } if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16k"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return null; } traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; traceFlowSolver.TraceIndeterminateFlow = traceIndeterminate; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = gn.Network; //Globals.AddFlagsToTraceSolver(startNetFlag.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag); Globals.AddFlagsToTraceSolver(pNetFlags.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag); Globals.AddBarriersToSolver(ref traceFlowSolver, ref pEdgeElementBarriers, ref pJunctionElementBarriers, ref pSelectionSetBarriers); pointAlong++; //Set the barriers in the network based on the saved valves if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16l"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } //Run the trace to find directly reachable sources (without passing valve) if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16m"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } netElementBarrier = new SelectionSetBarriersClass(); totalreachcount = 0; foreach (Hashtable HTentry in valveEIDInfoHT) { foreach (DictionaryEntry entry in HTentry) { eidInfo = entry.Value as IEIDInfo; netElementBarrier.Add(eidInfo.Feature.Class.ObjectClassID, eidInfo.Feature.OID); } totalreachcount++; } pointAlong++; netSolver.SelectionSetBarriers = netElementBarrier; pointAlong++; Globals.AddBarriersToSolver(ref traceFlowSolver, ref pEdgeElementBarriers, ref pJunctionElementBarriers, ref pSelectionSetBarriers); traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out juncEIDs, out edgeEIDs); // Hashtable sourceDirectEIDInfoHT = Globals.GetEIDInfoListByFC(sourceFC.FeatureClassID, juncEIDs, eidHelper); sourceDirectEIDInfoHT = new Hashtable(); Globals.GetEIDInfoListByFCWithHT(ref sourceDirectEIDInfoHT, sourceFCClassIDs, operableFieldNameSources, opValues, juncEIDs, eidHelper); //Remove directly reachable sources from source array if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16n"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } pointAlong++; foreach (DictionaryEntry entry in sourceDirectEIDInfoHT) { eidInfo = entry.Value as IEIDInfo; sourceEIDInfoHT.Remove(eidInfo.Feature.OID); } pointAlong++;//21 if (sourceEIDInfoHT.Count == 0) { if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("No") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16o") + Environment.NewLine + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16b") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16c") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16j"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } return A4LGSharedFunctions.Localizer.GetString("Error") + A4LGSharedFunctions.Localizer.GetString("No") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16o") + Environment.NewLine + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16b") + sourceFLName + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsMess_16c") + Environment.NewLine + A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16j"); } pointAlong++;//22 if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16p"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } noSourceValveHT = new Hashtable(); hasSourceValveHT = new Hashtable(); // IEIDInfo vEIDInfo; barrierIds = null; bool foundSource; // ArrayList barrierArrayList; pointAlong++; totalreachcount = 0; foreach (Hashtable valveHT in valveEIDInfoHT) { foreach (DictionaryEntry valveEntry in valveHT) { foundSource = false; valveEIDInfo = valveEntry.Value as IEIDInfo; //Create array of all isolation valves excluding the current one // barrierArrayList = new ArrayList(); barrierIds = new List<BarClassIDS>(); foreach (Hashtable valveHTBar in valveEIDInfoHT) { BarClassIDS barClID = new BarClassIDS(); List<int> tempIntArr = new List<int>(); foreach (DictionaryEntry valveEntryBar in valveHTBar) { vEIDInfo = valveEntryBar.Value as IEIDInfo; barClID.ClassID = vEIDInfo.Feature.Class.ObjectClassID; vEIDInfo = valveEntryBar.Value as IEIDInfo; if (vEIDInfo.Feature.OID == valveEIDInfo.Feature.OID && vEIDInfo.Feature.Class.ObjectClassID == valveEIDInfo.Feature.Class.ObjectClassID) { } else { // barrierArrayList.Add(vEIDInfo.Feature.OID); tempIntArr.Add(vEIDInfo.Feature.OID); //barrierIds.Add(vEIDInfo.Feature.OID); } } barClID.IDs = tempIntArr.ToArray(); barrierIds.Add(barClID); } //if (valveHT.Count > 1) //{ // barrierArrayList = new ArrayList(); // barrierIds = new int[valveHT.Count - 1]; // foreach (DictionaryEntry v in valveHT) // { // vEIDInfo = v.Value as IEIDInfo; // if (vEIDInfo.Feature.OID != valveEIDInfo.Feature.OID) // { // barrierArrayList.Add(vEIDInfo.Feature.OID); // } // } // barrierArrayList.CopyTo(barrierIds); //} //else // barrierArrayList = null; pointAlong++; //For each source, attempt to trace foreach (DictionaryEntry sourceEntry in sourceEIDInfoHT) { sourceEIDInfo = sourceEntry.Value as IEIDInfo; //Setup trace to test each valve traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; traceFlowSolver.TraceIndeterminateFlow = traceIndeterminate; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = gn.Network; Globals.AddBarriersToSolver(ref traceFlowSolver, ref pEdgeElementBarriers, ref pJunctionElementBarriers, ref pSelectionSetBarriers); //Set the first junction flag for path finding based this current valve netFlag1 = new JunctionFlagClass(); netFlag1.UserClassID = valveEIDInfo.Feature.Class.ObjectClassID; netFlag1.UserID = valveEIDInfo.Feature.OID; netFlag1.UserSubID = 0; netFlag1.Label = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsLbl_16a"); //AddFlagToTraceSolver(netFlag1, ref traceFlowSolver, out junctionFlag, out edgeFlag); //Set the second (and last) trace flag at this source netFlag2 = new JunctionFlagClass(); netFlag2.UserClassID = sourceEIDInfo.Feature.Class.ObjectClassID; netFlag2.UserID = sourceEIDInfo.Feature.OID; netFlag2.UserSubID = 0; netFlag2.Label = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsLbl_16b"); Globals.AddTwoJunctionFlagsToTraceSolver(ref traceFlowSolver, netFlag1, netFlag2); //Set as isolation valves (except the current one) as barriers if (barrierIds != null && barrierIds.Count > 0) { netElementBarriers = new NetElementBarriersClass() as INetElementBarriersGEN; netElementBarriers.ElementType = esriElementType.esriETJunction; netElementBarriers.Network = gn.Network; bool setBar = false; foreach (BarClassIDS tempBarIDS in barrierIds) { if (tempBarIDS.IDs.Length > 0) { int[] barIDs = tempBarIDS.IDs; netElementBarriers.SetBarriers(tempBarIDS.ClassID, ref barIDs); setBar = true; } } if (setBar)//required, it would produce an error if there where no other barriers { nb = netElementBarriers as INetElementBarriers; netSolver.set_ElementBarriers(esriElementType.esriETJunction, nb); } } //Run trace segCosts = new System.Object[1]; segCosts[0] = new System.Object(); edgeEIDs = null; traceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum, out juncEIDs, out edgeEIDs, 1, ref segCosts); if (edgeEIDs != null && edgeEIDs.Count > 0) { foundSource = true; break; } } // End of source loop pointAlong++;//25 -30ish if (foundSource) { hasSourceValveHT.Add(valveEIDInfo.Feature.OID, valveEIDInfo);//valveEIDInfo.Feature.Class.ObjectClassID +":" + } else { noSourceValveHT.Add(valveEIDInfo.Feature.OID, valveEIDInfo); } } // End of valve loop totalreachcount++; } //Setup last trace with correct valve barriers if (hasSourceValveHT.Count == 0) { if (ZeroSourceCont) hasSourceValveHT = noSourceValveHT; else return A4LGSharedFunctions.Localizer.GetString("NoWaterSourceIdentifiedReturnStatement"); } if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("GeoNetToolsProc_16q"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } pointAlong++; traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; traceFlowSolver.TraceIndeterminateFlow = traceIndeterminate; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = gn.Network; //Globals.AddFlagsToTraceSolver(startNetFlag.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag); Globals.AddFlagsToTraceSolver(pNetFlags.ToArray(), ref traceFlowSolver, out junctionFlag, out edgeFlag); Globals.AddBarriersToSolver(ref traceFlowSolver, ref pEdgeElementBarriers, ref pJunctionElementBarriers, ref pSelectionSetBarriers); //Set the barriers in the network based on the saved valves netElementBarrier = new SelectionSetBarriersClass(); foreach (DictionaryEntry entry in hasSourceValveHT) { eidInfo = entry.Value as IEIDInfo; //netElementBarrier.Add(valveFC.FeatureClassID, eidInfo.Feature.OID); netElementBarrier.Add(((IFeatureClass)eidInfo.Feature.Class).FeatureClassID, eidInfo.Feature.OID); } netSolver.SelectionSetBarriers = netElementBarrier; pointAlong++; //Run last trace traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out juncEIDs, out edgeEIDs); //skipped valves => //Hashtable skippedValvesEIDInfoHT = GetEIDInfoListByFC(valveFC.FeatureClassID, juncEIDs, eidHelper); //Select junction features pointAlong++; //51,44 //Open identify dialog with selected features //IdentifySelected(map); if (processEvent) { pStepPro.Message = A4LGSharedFunctions.Localizer.GetString("Complete"); pStepPro.Step(); boolCont = pTrkCan.Continue(); } if (!boolCont) { pStepPro.Hide(); pProDlg.HideDialog(); pStepPro = null; pProDlg = null; pProDFact = null; return A4LGSharedFunctions.Localizer.GetString("CanceledReturnStatement"); } if (snappedPoint != null) { snappedPoint.Project(map.SpatialReference); // traceRes.TracePoint = snappedPoint; } // return "Post1"; //Globals.LoadJunctions(ref traceRes, ref gn, ref map, ref juncEIDs, ref meterDSName); // Globals.LoadValves(ref traceRes, ref gn, ref map, ref hasSourceValveHT); //Globals.LoadEdges(ref traceRes, ref gn, ref map, ref edgeEIDs); //((IMxDocument)app.Document).FocusMap.ClearSelection(); //Globals.RemoveGraphics(((IMxDocument)app.Document).FocusMap, false); string returnVal = ""; returnVal = Globals.SelectJunctions(ref map, ref gn, ref juncEIDs, ref junctionFlag, MeterName, MeterCritField, MeterCritVal, processEvent); if (processEvent) { if (selectEdges) Globals.SelectEdges(ref map, ref gn, ref edgeEIDs); else Globals.DrawEdges(ref map, ref gn, ref edgeEIDs); } returnVal = Globals.SelectValveJunctions(ref map, ref hasSourceValveHT, ref valveFLs, processEvent) + "_" + returnVal; if (processEvent) { if (pNetAnalysisExt != null) { foreach (IFlagDisplay pFgDi in pFlagsDisplay) { Globals.AddFlagToGN(ref pNetAnalysisExt, ref gn, pFgDi); // Globals.AddPointGraphic(map, pFgDi.Geometry as IPoint, false); } } else { foreach (IFlagDisplay pFgDi in pFlagsDisplay) { // Globals.AddFlagToGN(ref pNetAnalysisExt, ref gn, pFgDi); Globals.AddPointGraphic(map, pFgDi.Geometry as IPoint, false); } } Globals.GetCommand("esriArcMapUI.ZoomToSelectedCommand", app).Execute(); } return returnVal; } catch (Exception ex) { // MessageBox.Show(ex.ToString()); return ex.Message.ToString() + "\n" + pointAlong; } finally { barrierIds = null; sourceDirectEIDInfoHT = null; netFlag1 = null; netFlag2 = null; junctionFlags = null; edgeFlags = null; pID = null; noSourceValveHT = null; hasSourceValveHT = null; if (pProDlg != null) { pProDlg.HideDialog(); } pStepPro = null; pProDlg = null; pProDFact = null; if (gnList != null) { // Marshal.ReleaseComObject(gnList); } if (gn != null) { Marshal.ReleaseComObject(gn); } if (snappedPoint != null) { Marshal.ReleaseComObject(snappedPoint); } if (startNetFlag != null) { // Marshal.ReleaseComObject(startNetFlag); } if (sourceFC != null) { // Marshal.ReleaseComObject(sourceFC); } if (sourceFL != null) { // Marshal.ReleaseComObject(sourceFL); } if (pTempLay != null) { Marshal.ReleaseComObject(pTempLay); } if (valveFLs != null) { // Marshal.ReleaseComObject(valveFLs); } if (valveFCs != null) { // Marshal.ReleaseComObject(valveFCs); } //if (meterFL != null) //{ // Marshal.ReleaseComObject(meterFL); //} if (junctionFlag != null) { // Marshal.ReleaseComObject(junctionFlag); } if (edgeFlag != null) { // Marshal.ReleaseComObject(edgeFlag); } if (traceFlowSolver != null) { Marshal.ReleaseComObject(traceFlowSolver); } if (netSolver != null) { Marshal.ReleaseComObject(netSolver); } if (netElementBarriers != null) { Marshal.ReleaseComObject(netElementBarriers); } if (nb != null) { Marshal.ReleaseComObject(nb); } if (juncEIDs != null) { Marshal.ReleaseComObject(juncEIDs); } if (edgeEIDs != null) { Marshal.ReleaseComObject(edgeEIDs); } if (eidInfo != null) { Marshal.ReleaseComObject(eidInfo); } if (valveEIDInfo != null) { Marshal.ReleaseComObject(valveEIDInfo); } if (sourceEIDInfo != null) { Marshal.ReleaseComObject(sourceEIDInfo); } if (vEIDInfo != null) { Marshal.ReleaseComObject(vEIDInfo); } if (userIds != null) { // Marshal.ReleaseComObject(userIds); } if (eidHelper != null) { Marshal.ReleaseComObject(eidHelper); } if (valveEIDInfoHT != null) { // Marshal.ReleaseComObject(valveEIDInfoHT); } if (sourceEIDInfoHT != null) { // Marshal.ReleaseComObject(sourceEIDInfoHT); } if (segCosts != null) { // Marshal.ReleaseComObject(segCosts); } if (netElementBarrier != null) { Marshal.ReleaseComObject(netElementBarrier); } //if (traceRes != null) //{ // traceRes.Dispose(); // // Marshal.ReleaseComObject(traceRes); //} pNetAnalysisExt = null; pFlagsDisplay = null; pEdgeFlags = null; pJunctionFlags = null; pNetFlags = null; pFlagDisplay = null; //pEdgeFlagsBar = null; //pJunctionFlagsBar = null; gnList = null; gn = null; snappedPoint = null; startNetFlag = null; sourceFC = null; sourceFL = null; pTempLay = null; valveFLs = null; valveFCs = null; //meterFL = null; junctionFlag = null; edgeFlag = null; traceFlowSolver = null; netSolver = null; netElementBarriers = null; nb = null; juncEIDs = null; edgeEIDs = null; eidInfo = null; valveEIDInfo = null; sourceEIDInfo = null; vEIDInfo = null; userIds = null; eidHelper = null; valveEIDInfoHT = null; sourceEIDInfoHT = null; segCosts = null; netElementBarrier = null; //traceRes = null; } GC.Collect(); GC.WaitForFullGCComplete(300); }
public ITraceFlowSolverGEN UTIL_coreTraceSetup() { // get the current network's logical network INetworkAnalysisExt nax = m_utilNetExt as INetworkAnalysisExt; INetwork net = nax.CurrentNetwork.Network; // create a new TraceFlowSolver object and // set the source network for the solve ITraceFlowSolverGEN tfs = new TraceFlowSolverClass() as ITraceFlowSolverGEN; INetSolver netSolver = tfs as INetSolver; netSolver.SourceNetwork = net; // get the barriers for the network, using the element barriers and // selection barriers that have been added using the user interface INetworkAnalysisExtBarriers naxBarriers = m_utilNetExt as INetworkAnalysisExtBarriers; INetElementBarriers juncElemBarriers, edgeElemBarriers; naxBarriers.CreateElementBarriers(out juncElemBarriers, out edgeElemBarriers); ISelectionSetBarriers selSetBarriers; naxBarriers.CreateSelectionBarriers(out selSetBarriers); netSolver.set_ElementBarriers(esriElementType.esriETJunction, juncElemBarriers); netSolver.set_ElementBarriers(esriElementType.esriETEdge, edgeElemBarriers); netSolver.SelectionSetBarriers = selSetBarriers; // set up the disabled layers for the network solver // for each feature layer belonging to this network, determine if it is // enabled or disabled; if it's disabled, then notify the network solver for (int i = 0; i < nax.FeatureLayerCount; i++) { IFeatureLayer featureLayer = nax.get_FeatureLayer(i); if (naxBarriers.GetDisabledLayer(featureLayer)) netSolver.DisableElementClass(featureLayer.FeatureClass.FeatureClassID); } INetworkAnalysisExtWeightFilter naxWeightFilter = m_utilNetExt as INetworkAnalysisExtWeightFilter; INetSolverWeightsGEN netSolverWeights = netSolver as INetSolverWeightsGEN; INetSchema netSchema = net as INetSchema; // create the junction weight filter int juncFilterRangeCount = naxWeightFilter.get_FilterRangeCount(esriElementType.esriETJunction); if (juncFilterRangeCount > 0) { INetWeight netWeight = netSchema.get_WeightByName(naxWeightFilter.JunctionWeightFilterName); netSolverWeights.JunctionFilterWeight = netWeight; esriWeightFilterType juncWeightFilterType; bool juncApplyNotOperator; naxWeightFilter.GetFilterType(esriElementType.esriETJunction, out juncWeightFilterType, out juncApplyNotOperator); netSolverWeights.SetFilterType(esriElementType.esriETJunction, juncWeightFilterType, juncApplyNotOperator); object[] juncFromValues = new object[juncFilterRangeCount]; object[] juncToValues = new object[juncFilterRangeCount]; for (int i = 0; i < juncFilterRangeCount; i++) { naxWeightFilter.GetFilterRange(esriElementType.esriETJunction, i, out juncFromValues[i], out juncToValues[i]); } netSolverWeights.SetFilterRanges(esriElementType.esriETJunction, ref juncFromValues, ref juncToValues); } // create the edge weight filters int edgeFilterRangeCount = naxWeightFilter.get_FilterRangeCount(esriElementType.esriETEdge); if (edgeFilterRangeCount > 0) { INetWeight fromToNetWeight = netSchema.get_WeightByName(naxWeightFilter.FromToEdgeWeightFilterName); netSolverWeights.FromToEdgeFilterWeight = fromToNetWeight; INetWeight toFromNetWeight = netSchema.get_WeightByName(naxWeightFilter.ToFromEdgeWeightFilterName); netSolverWeights.ToFromEdgeFilterWeight = toFromNetWeight; esriWeightFilterType edgeWeightFilterType; bool edgeApplyNotOperator; naxWeightFilter.GetFilterType(esriElementType.esriETEdge, out edgeWeightFilterType, out edgeApplyNotOperator); netSolverWeights.SetFilterType(esriElementType.esriETEdge, edgeWeightFilterType, edgeApplyNotOperator); object[] edgeFromValues = new object[edgeFilterRangeCount]; object[] edgeToValues = new object[edgeFilterRangeCount]; for (int i = 0; i < edgeFilterRangeCount; i++) { naxWeightFilter.GetFilterRange(esriElementType.esriETEdge, i, out edgeFromValues[i], out edgeToValues[i]); } netSolverWeights.SetFilterRanges(esriElementType.esriETEdge, ref edgeFromValues, ref edgeToValues); } INetworkAnalysisExtFlags naxFlags = m_utilNetExt as INetworkAnalysisExtFlags; // assign the edge flags to the network solver int edgeFlagCount = naxFlags.EdgeFlagCount; if (edgeFlagCount > 0) { IEdgeFlag[] edgeFlags = new IEdgeFlag[edgeFlagCount]; for (int i = 0; i < edgeFlagCount; i++) { IEdgeFlagDisplay edgeFlagDisplay = naxFlags.get_EdgeFlag(i); IFlagDisplay flagDisplay = edgeFlagDisplay as IFlagDisplay; IEdgeFlag edgeFlag = new EdgeFlagClass(); edgeFlag.Position = Convert.ToSingle(edgeFlagDisplay.Percentage); INetFlag netFlag = edgeFlag as INetFlag; netFlag.UserClassID = flagDisplay.FeatureClassID; netFlag.UserID = flagDisplay.FID; netFlag.UserSubID = flagDisplay.SubID; edgeFlags[i] = edgeFlag; } tfs.PutEdgeOrigins(ref edgeFlags); } // assign the junction flags to the network solver int juncFlagCount = naxFlags.JunctionFlagCount; if (juncFlagCount > 0) { IJunctionFlag[] juncFlags = new IJunctionFlag[juncFlagCount]; for (int i = 0; i < juncFlagCount; i++) { IJunctionFlagDisplay juncFlagDisplay = naxFlags.get_JunctionFlag(i); IFlagDisplay flagDisplay = juncFlagDisplay as IFlagDisplay; IJunctionFlag juncFlag = new JunctionFlagClass(); INetFlag netFlag = juncFlag as INetFlag; netFlag.UserClassID = flagDisplay.FeatureClassID; netFlag.UserID = flagDisplay.FID; netFlag.UserSubID = flagDisplay.SubID; juncFlags[i] = juncFlag; } tfs.PutJunctionOrigins(ref juncFlags); } // set the option for tracing on indeterminate flow ITraceTasks traceTasks = m_utilNetExt as ITraceTasks; tfs.TraceIndeterminateFlow = traceTasks.TraceIndeterminateFlow; return tfs; }
private void setUpstreamJunctionFlag(IPoint pPoint) { try { if (pGeometricNetwork == null) { openGeoNetwork(); } IEnumNetEID m_ipEnumNetEID_Junctions, m_ipEnumNetEID_Edges; //用来存放搜索结果的Junctions和Edges ipNetwork = pGeometricNetwork.Network; /* * IMarkerSymbol pMarkerSym=SpatialHelperFunction.FindMarkerSym("Civic.ServerStyle", "Default", "Pin Flag Square"); * if(pMarkerSym==null){ * MessageBox.Show("无法取得Symbol"); * return; * } * * IRgbColor pRGBColor=Utility.getRGBColor(255, 0, 0); * * pMarkerSym.Color=pRGBColor; * pMarkerSym.Size=26; * pMarkerSym.XOffset=10; * pMarkerSym.YOffset=10; * //无法使用 IFlagDisplay,只有 INetworkAnalysisExtFlags才可以使用IFlagDisplay * * Utility.drawPointToGraphicLayer(m_HookHelper.ActiveView,pPoint,pMarkerSym); */ int pJunctionID; IPoint pLocation; int iUserClassID, iUserID, iUserSubID; INetElements ipNetElements; ipNetElements = ipNetwork as INetElements; //得到network中所有的Elements mPointToEID = new PointToEIDClass(); //设置它的GeometricNetwork mPointToEID.GeometricNetwork = pGeometricNetwork; //设置容限值 mPointToEID.SnapTolerance = m_HookHelper.ActiveView.Extent.Envelope.Width / 100; //设置Source Map mPointToEID.SourceMap = m_HookHelper.ActiveView.FocusMap; //得到最近的JunctionID mPointToEID.GetNearestJunction(pPoint, out pJunctionID, out pLocation); //Each element in a logical network has a unique element ID (EID). ipNetElements.QueryIDs(pJunctionID, esriElementType.esriETJunction, out iUserClassID, out iUserID, out iUserSubID); //得到所在Junction的ID //无法使用 IFlagDisplay,只有 INetworkAnalysisExtFlags才可以使用IFlagDisplay INetFlag ipNetFlag = new JunctionFlagClass(); ipNetFlag.UserClassID = iUserClassID; ipNetFlag.UserID = iUserID; ipNetFlag.UserSubID = iUserSubID; IJunctionFlag [] pArrayJFlag = new IJunctionFlag[1]; pArrayJFlag[0] = ipNetFlag as IJunctionFlag; ipTraceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; //get the inetsolver interface ipNetSolver = ipTraceFlowSolver as INetSolver; ipNetSolver.SourceNetwork = pGeometricNetwork.Network; ipTraceFlowSolver.PutJunctionOrigins(ref pArrayJFlag); ipTraceFlowSolver.TraceIndeterminateFlow = false; object[] totalCost = new object[1]; //ipTraceFlowSolver.FindSource(esriFlowMethod.esriFMUpstream,esriShortestPathObjFn.esriSPObjFnMinSum,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges,1,ref totalCost); ipTraceFlowSolver.FindFlowElements(esriFlowMethod.esriFMUpstream, esriFlowElements.esriFEEdges, out m_ipEnumNetEID_Junctions, out m_ipEnumNetEID_Edges); SpatialHelperFunction.pathToPolyline(pGeometricNetwork, m_HookHelper.ActiveView, m_ipEnumNetEID_Edges); //ipTraceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMUpstream,esriFlowElements.esriFEJunctionsAndEdges,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges); m_HookHelper.ActiveView.Refresh(); } catch (Exception e) { MessageBox.Show(e.Message); } }
private void setUpstreamJunctionFlag(IPoint pPoint) { try { if(pGeometricNetwork==null){ openGeoNetwork(); } IEnumNetEID m_ipEnumNetEID_Junctions,m_ipEnumNetEID_Edges;//����������������Junctions��Edges ipNetwork=pGeometricNetwork.Network; /* IMarkerSymbol pMarkerSym=SpatialHelperFunction.FindMarkerSym("Civic.ServerStyle", "Default", "Pin Flag Square"); if(pMarkerSym==null){ MessageBox.Show("��ȡ��Symbol"); return; } IRgbColor pRGBColor=Utility.getRGBColor(255, 0, 0); pMarkerSym.Color=pRGBColor; pMarkerSym.Size=26; pMarkerSym.XOffset=10; pMarkerSym.YOffset=10; //��ʹ�� IFlagDisplay��ֻ�� INetworkAnalysisExtFlags�ſ���ʹ��IFlagDisplay Utility.drawPointToGraphicLayer(m_HookHelper.ActiveView,pPoint,pMarkerSym); */ int pJunctionID; IPoint pLocation; int iUserClassID,iUserID,iUserSubID; INetElements ipNetElements; ipNetElements = ipNetwork as INetElements; //�õ�network�����е�Elements mPointToEID=new PointToEIDClass(); //��������GeometricNetwork mPointToEID.GeometricNetwork=pGeometricNetwork; //��������ֵ mPointToEID.SnapTolerance=m_HookHelper.ActiveView.Extent.Envelope.Width/100; //����Source Map mPointToEID.SourceMap=m_HookHelper.ActiveView.FocusMap; //�õ������JunctionID mPointToEID.GetNearestJunction(pPoint,out pJunctionID,out pLocation); //Each element in a logical network has a unique element ID (EID). ipNetElements.QueryIDs(pJunctionID,esriElementType.esriETJunction,out iUserClassID,out iUserID,out iUserSubID); //�õ�����Junction��ID //��ʹ�� IFlagDisplay��ֻ�� INetworkAnalysisExtFlags�ſ���ʹ��IFlagDisplay INetFlag ipNetFlag=new JunctionFlagClass(); ipNetFlag.UserClassID=iUserClassID; ipNetFlag.UserID=iUserID; ipNetFlag.UserSubID=iUserSubID; IJunctionFlag [] pArrayJFlag=new IJunctionFlag[1]; pArrayJFlag[0]=ipNetFlag as IJunctionFlag; ipTraceFlowSolver=new TraceFlowSolverClass() as ITraceFlowSolverGEN; //get the inetsolver interface ipNetSolver=ipTraceFlowSolver as INetSolver; ipNetSolver.SourceNetwork=pGeometricNetwork.Network; ipTraceFlowSolver.PutJunctionOrigins(ref pArrayJFlag); ipTraceFlowSolver.TraceIndeterminateFlow=false; object[] totalCost=new object[1]; //ipTraceFlowSolver.FindSource(esriFlowMethod.esriFMUpstream,esriShortestPathObjFn.esriSPObjFnMinSum,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges,1,ref totalCost); ipTraceFlowSolver.FindFlowElements(esriFlowMethod.esriFMUpstream, esriFlowElements.esriFEEdges, out m_ipEnumNetEID_Junctions, out m_ipEnumNetEID_Edges); SpatialHelperFunction.pathToPolyline(pGeometricNetwork,m_HookHelper.ActiveView,m_ipEnumNetEID_Edges); //ipTraceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMUpstream,esriFlowElements.esriFEJunctionsAndEdges,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges); m_HookHelper.ActiveView.Refresh(); } catch(Exception e){ MessageBox.Show(e.Message); } }
/// <summary> /// Set Flags Geometric Network /// </summary> protected void SetFlagsGeometricNetwork() { //// edge Flags List <INetFlag> edgeFlagList = new List <INetFlag>(); this.flagNotFound = new List <IGeometry>(); if (this.EdgeFlags.Count > 0) { foreach (IPoint point in this.EdgeFlags) { int eid = this.GetEIDFromPoint(this.Tolerance, point, esriElementType.esriETEdge); if (eid < 1) { this.flagNotFound.Add(point); continue; } INetElements netElements = this.geometricNetwork.Network as INetElements; int featureClassID, featureID, subID; netElements.QueryIDs(eid, esriElementType.esriETEdge, out featureClassID, out featureID, out subID); INetFlag netFlag = new EdgeFlagClass(); netFlag.UserClassID = featureClassID; netFlag.UserID = featureID; netFlag.UserSubID = subID; edgeFlagList.Add(netFlag); } this.edgeFlags = new IEdgeFlag[edgeFlagList.Count]; edgeFlagList.Each((i, index) => { this.edgeFlags[index] = i as IEdgeFlag; }); } //// junction Flags List <INetFlag> junctionFlagList = new List <INetFlag>(); if (this.JunctionFlags.Count > 0) { foreach (IPoint point in this.JunctionFlags) { int eid = this.GetEIDFromPoint(this.Tolerance, point, esriElementType.esriETJunction); if (eid < 1) { this.flagNotFound.Add(point); continue; } INetElements netElements = this.geometricNetwork.Network as INetElements; int featureClassID, featureID, subID; netElements.QueryIDs(eid, esriElementType.esriETJunction, out featureClassID, out featureID, out subID); INetFlag netFlag = new JunctionFlagClass(); netFlag.UserClassID = featureClassID; netFlag.UserID = featureID; netFlag.UserSubID = subID; junctionFlagList.Add(netFlag); } this.junctionFlags = new IJunctionFlag[junctionFlagList.Count]; junctionFlagList.Each((i, index) => { this.junctionFlags[index] = i as JunctionFlag; }); } }
/// <summary> /// solve isolation /// </summary> /// <returns>object JsonObject</returns> public override JsonObject Solve() { try { if ((this.edgeFlags.Length == 0) && (this.junctionFlags.Length == 0)) { string message = "No input valid flags found"; if (this.flagNotFound.Count == 0) { throw new GeometricNetworkException(message); } else { JsonObject error = (new ObjectError(message)).ToJsonObject(); error.AddArray("flagsNotFound", Helper.GetListJsonObjects(this.flagNotFound)); return(error); } } INetwork network = this.geometricNetwork.Network; ITraceFlowSolverGEN traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; INetSolver netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = network; this.SetFlagsOrigin(ref traceFlowSolver); ////now create barries based on valves INetElementBarriersGEN netElementBarriersGEN = new NetElementBarriersClass() as INetElementBarriersGEN; netElementBarriersGEN.ElementType = esriElementType.esriETJunction; netElementBarriersGEN.Network = network; int[] userIds = Helper.GetOIDs(this.Valve); netElementBarriersGEN.SetBarriers(this.Valve.FeatureClassID, ref userIds); INetElementBarriers netElementBarriers = netElementBarriersGEN as INetElementBarriers; netSolver.set_ElementBarriers(esriElementType.esriETJunction, netElementBarriers); IEnumNetEID junctionEIDs; IEnumNetEID edgeEIDs; traceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs); IEIDHelper eidHelper = new EIDHelperClass(); eidHelper.GeometricNetwork = this.geometricNetwork; eidHelper.ReturnFeatures = true; List <IEIDInfo> valveEIDInfoHT = Helper.GetEIDInfoListByFeatureClass(this.Valve.FeatureClassID, junctionEIDs, eidHelper); traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = network; this.SetFlagsOrigin(ref traceFlowSolver); netSolver.DisableElementClass(this.Station.FeatureClassID); traceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctions, out junctionEIDs, out edgeEIDs); List <IEIDInfo> sourceEIDInfoHT = Helper.GetEIDInfoListByFeatureClass(this.Station.FeatureClassID, junctionEIDs, eidHelper); ////set up trace to find directly reachable sources traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = network; this.SetFlagsOrigin(ref traceFlowSolver); ////set barriers in the network based on the saved valves ISelectionSetBarriers netElementBarrier = new SelectionSetBarriersClass(); foreach (IEIDInfo eidInfo in valveEIDInfoHT) { netElementBarrier.Add(this.Valve.FeatureClassID, eidInfo.Feature.OID); } netSolver.SelectionSetBarriers = netElementBarrier; ////run trace to find directly reachable sources(without passing valve) traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs); List <IEIDInfo> sourceDirectEIDInfoHT = Helper.GetEIDInfoListByFeatureClass(this.Station.FeatureClassID, junctionEIDs, eidHelper); ////remove directly reachable sources from source array foreach (IEIDInfo eidInfo in sourceDirectEIDInfoHT) { sourceEIDInfoHT.RemoveAll(x => x.Feature.OID == eidInfo.Feature.OID); } List <IEIDInfo> noSourceValveHT = new List <IEIDInfo>(); List <IEIDInfo> hasSourceValveHT = new List <IEIDInfo>(); List <int> listBarrierIds; bool foundSource; foreach (IEIDInfo valve in valveEIDInfoHT) { foundSource = false; ////create array of all isolation valve excluding the current one listBarrierIds = new List <int>(); if (valveEIDInfoHT.Count > 1) { listBarrierIds.AddRange(valveEIDInfoHT.ConvertAll <int>(i => i.Feature.OID)); if (listBarrierIds.Contains(valve.Feature.OID)) { listBarrierIds.Remove(valve.Feature.OID); } } ////for each source attempt to trace INetFlag netFlag1; INetFlag netFlag2; foreach (IEIDInfo source in sourceEIDInfoHT) { ////setup trace to test each valve traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = network; ////set the first junction flag for path finding based this current valve netFlag1 = new JunctionFlagClass(); netFlag1.UserClassID = valve.Feature.Class.ObjectClassID; netFlag1.UserID = valve.Feature.OID; netFlag1.UserSubID = 0; netFlag1.Label = "Origin"; ////set the second and last trace flag at this source netFlag2 = new JunctionFlagClass(); netFlag2.UserClassID = source.Feature.Class.ObjectClassID; netFlag2.UserID = source.Feature.OID; netFlag2.UserSubID = 0; netFlag2.Label = "Destination"; Helper.AddTwoJunctionFlagsToTraceSolver(ref traceFlowSolver, netFlag1, netFlag2); if (listBarrierIds.Count > 0) { netElementBarriersGEN = new NetElementBarriersClass() as INetElementBarriersGEN; netElementBarriersGEN.ElementType = esriElementType.esriETJunction; netElementBarriersGEN.Network = network; int[] barrierIds = listBarrierIds.ToArray(); netElementBarriersGEN.SetBarriers(this.Valve.FeatureClassID, ref barrierIds); netElementBarriers = netElementBarriersGEN as INetElementBarriers; netSolver.set_ElementBarriers(esriElementType.esriETJunction, netElementBarriers); } ////run trace object[] segCosts = new object[1]; segCosts[0] = new object(); edgeEIDs = null; traceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum, out junctionEIDs, out edgeEIDs, 1, ref segCosts); if (edgeEIDs != null && edgeEIDs.Count > 0) { foundSource = true; break; } } if (foundSource) { hasSourceValveHT.Add(valve); } else { noSourceValveHT.Add(valve); } } traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; netSolver = traceFlowSolver as INetSolver; netSolver.SourceNetwork = network; this.SetFlagsOrigin(ref traceFlowSolver); ////set the barrier in the network based on the saved valves netElementBarrier = new SelectionSetBarriersClass(); foreach (IEIDInfo eidInfo in hasSourceValveHT) { netElementBarrier.Add(this.Valve.FeatureClassID, eidInfo.Feature.OID); } netSolver.SelectionSetBarriers = netElementBarrier; ////run last trace traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMConnected, this.FlowElements, out junctionEIDs, out edgeEIDs); ////deal with out put juncEIDs and edgeEIDs JsonObject objectJson = new JsonObject(); this.SetResults(ref objectJson, edgeEIDs, junctionEIDs); objectJson.AddArray("flagsNotFound", Helper.GetListJsonObjects(this.flagNotFound)); ////valves if (hasSourceValveHT.Count > 0) { JsonObject[] featureSetValves; this.GetTrace(Helper.GetEnumNetEID(hasSourceValveHT, esriElementType.esriETJunction), out featureSetValves); objectJson.AddJsonObject("valves", featureSetValves[0]); } return(objectJson); } catch (Exception e) { return((new ObjectError(e.Message)).ToJsonObject()); } }
/// <summary> /// operation solve trace /// </summary> /// <returns>solve trace</returns> public override JsonObject Solve() { try { if ((this.edgeFlags.Length == 0) && (this.junctionFlags.Length == 0)) { string message = "No input valid flags found"; if (this.flagNotFound.Count == 0) { throw new GeometricNetworkException(message); } else { JsonObject error = (new ObjectError(message)).ToJsonObject(); error.AddArray("flagsNotFound", Helper.GetListJsonObjects(this.flagNotFound)); if (this.barrierNotFound.Count > 0) { error.AddArray("barriersNotFound", Helper.GetListJsonObjects(this.barrierNotFound)); } return(error); } } ITraceFlowSolverGEN traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN; INetSolver netSolver = traceFlowSolver as INetSolver; INetwork network = this.geometricNetwork.Network; netSolver.SourceNetwork = network; // flag origin this.SetFlagsOrigin(ref traceFlowSolver); // barrier this.SetBarriers(ref traceFlowSolver); // set disabled layers foreach (int i in this.DisableLayers) { netSolver.DisableElementClass(i); } // set weight this.SetWeights(ref traceFlowSolver); if ((this.TraceSolverType != TraceSolverType.FindCircuits) && (this.TraceSolverType != TraceSolverType.FindCommonAncestors)) { // The TraceIndeterminateFlow property affects the trace results of trace solvers whose FlowMethod parameter is esriFMUpstream or esriFMDownstream if ((this.FlowMethod == esriFlowMethod.esriFMDownstream) || (this.FlowMethod == esriFlowMethod.esriFMUpstream)) { traceFlowSolver.TraceIndeterminateFlow = this.TraceIndeterminateFlow; } } IEnumNetEID junctionEIDs = null; IEnumNetEID edgeEIDs = null; object totalCost; int count; object[] segmentCosts; JsonObject objectJson = new JsonObject(); switch (this.TraceSolverType) { case TraceSolverType.FindAccumulation: traceFlowSolver.FindAccumulation(this.FlowMethod, this.FlowElements, out junctionEIDs, out edgeEIDs, out totalCost); objectJson.AddDouble("totalCost", (double)totalCost); break; case TraceSolverType.FindCircuits: traceFlowSolver.FindCircuits(this.FlowElements, out junctionEIDs, out edgeEIDs); break; case TraceSolverType.FindCommonAncestors: traceFlowSolver.FindCommonAncestors(this.FlowElements, out junctionEIDs, out edgeEIDs); break; case TraceSolverType.FindFlowElements: traceFlowSolver.FindFlowElements(this.FlowMethod, this.FlowElements, out junctionEIDs, out edgeEIDs); break; case TraceSolverType.FindFlowEndElements: traceFlowSolver.FindFlowEndElements(this.FlowMethod, this.FlowElements, out junctionEIDs, out edgeEIDs); break; case TraceSolverType.FindFlowUnreachedElements: traceFlowSolver.FindFlowUnreachedElements(this.FlowMethod, this.FlowElements, out junctionEIDs, out edgeEIDs); break; case TraceSolverType.FindPath: count = Math.Max(this.junctionFlags.Length, this.edgeFlags.Length); if (count < 2) { throw new GeometricNetworkException("Edge or junction found < 2!"); } --count; segmentCosts = new object[count]; traceFlowSolver.FindPath(this.FlowMethod, this.ShortestPathObjFn, out junctionEIDs, out edgeEIDs, count, ref segmentCosts); objectJson.AddArray("segmentCosts", segmentCosts); break; case TraceSolverType.FindSource: count = this.junctionFlags.Length + this.edgeFlags.Length; segmentCosts = new object[count]; traceFlowSolver.FindSource(this.FlowMethod, this.ShortestPathObjFn, out junctionEIDs, out edgeEIDs, count, ref segmentCosts); objectJson.AddArray("segmentCosts", segmentCosts); break; case TraceSolverType.FindLongest: // get end junctions in upstream IEnumNetEID junctionEIDsFindLongest = null; IEnumNetEID edgeEIDsFindLongest = null; traceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMUpstream, esriFlowElements.esriFEJunctions, out junctionEIDsFindLongest, out edgeEIDsFindLongest); int? eidLongest = null; double eidLongestLenght = double.MinValue; if (junctionEIDsFindLongest.Count > 0) { double eidLongestLenghtCurrent = double.NaN; for (int i = 0; i < junctionEIDsFindLongest.Count; i++) { int netEIDCurrent = junctionEIDsFindLongest.Next(); object[] segmentLenghts = new object[1]; IEnumNetEID junctionEIDsLongest = null; IEnumNetEID edgeEIDsLongest = null; INetFlag netFlag = new JunctionFlagClass(); INetElements netElements = this.geometricNetwork.Network as INetElements; int featureClassID, featureID, subID; netElements.QueryIDs(netEIDCurrent, esriElementType.esriETJunction, out featureClassID, out featureID, out subID); netFlag.UserClassID = featureClassID; netFlag.UserID = featureID; netFlag.UserSubID = subID; IJunctionFlag[] junctionFlags = new IJunctionFlag[] { this.junctionFlags[0], netFlag as IJunctionFlag }; traceFlowSolver.PutJunctionOrigins(ref junctionFlags); traceFlowSolver.FindPath(esriFlowMethod.esriFMUpstream, esriShortestPathObjFn.esriSPObjFnMinMax, out junctionEIDsLongest, out edgeEIDsLongest, 1, ref segmentLenghts); if (segmentLenghts[0] != null) { eidLongestLenghtCurrent = Convert.ToDouble(segmentLenghts[0]); if (eidLongestLenghtCurrent > eidLongestLenght) { eidLongestLenght = eidLongestLenghtCurrent; eidLongest = netEIDCurrent; edgeEIDs = edgeEIDsLongest; junctionEIDs = junctionEIDsLongest; } } } } else { throw new GeometricNetworkException("Junction end not found!"); } if (eidLongest.HasValue) { objectJson.AddDouble("totalCost", eidLongestLenght); } else { throw new GeometricNetworkException("EID longest not found!"); } break; default: throw new GeometricNetworkException("Trace solver type not found"); } this.SetResults(ref objectJson, edgeEIDs, junctionEIDs); objectJson.AddArray("flagsNotFound", Helper.GetListJsonObjects(this.flagNotFound)); objectJson.AddArray("barriersNotFound", Helper.GetListJsonObjects(this.barrierNotFound)); return(objectJson); } catch (Exception e) { return((new ObjectError(e.Message)).ToJsonObject()); } }