📄 form1.cs
字号:
//{
// this.TOC2D.Refresh();
// ((IActiveView)this.Map2D.Map).Refresh();
//}
//else
//{
this.TOC2D.Refresh();
((IActiveView)this.Map2D.Map).Refresh();
this.TOC3D.Refresh();
this.Map3D.SceneGraph.Invalidate(pSA3DLayer as ILayer,true,false);
this.Map3D.SceneGraph.Invalidate(pPolygonBarrier3DLayer as ILayer,true,false);
this.Map3D.SceneGraph.Invalidate(pStops3D as ILayer,true,false);
this.Map3D.SceneGraph.RefreshViewers();
//}
}
private void tabPage1_Click(object sender, System.EventArgs e)
{
}
private void BtnGO_Click(object sender, System.EventArgs e)
{
try
{
this.Cursor = Cursors.WaitCursor;
this.BtnAnimate.Enabled = false;
this.LblSlider.Text = "Calculating...";
Log("Solving...");
//Initialize variables
INALayer pNALayer = m_pAppProperties.NetworkLayer;
INAContext pNAContext = pNALayer.Context;
IGPMessages pGPMessages = new GPMessagesClass();
INASolver pNASolver = pNAContext.Solver;
//Set impedance
((INASolverSettings)pNASolver).ImpedanceAttributeName = this.LstImpendances.Text;
//Set restrictions
IStringArray pRestrictions = ((INASolverSettings)pNASolver).RestrictionAttributeNames;
pRestrictions.RemoveAll();
int iTotalRestrictions = this.ChkRestrictions.CheckedItems.Count;
for(int i = 0;i<iTotalRestrictions;i++)
{
string sRestriction = this.ChkRestrictions.CheckedItems[i].ToString();
pRestrictions.Add (sRestriction);
}
((INASolverSettings)pNASolver).RestrictionAttributeNames = pRestrictions;
int iTotalIncidents = 0; //Only used if solver is closest facility
//Update Context
IDatasetComponent pDSCom = pNAContext.NetworkDataset as IDatasetComponent;
pNASolver.UpdateContext(pNAContext,pDSCom.DataElement as IDENetworkDataset,pGPMessages);
switch(this.LstSolvers.Text)
{
case "Area of reach":
INAServiceAreaSolver pSASolver = pNASolver as INAServiceAreaSolver;
IFeatureClass pFCSA = pNAContext.NAClasses.get_ItemByName("SAPolygons")as IFeatureClass;
IFeatureLayer pFLayerSA3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sServiceArea3D) as IFeatureLayer;
IFeatureClass pFCSA3D = pFLayerSA3D.FeatureClass;
MiscUtils.CleanupFC(pFCSA3D);
//Set breaks
IDoubleArray pDoubleArray = new DoubleArrayClass();
pDoubleArray.Add(Convert.ToDouble(this.SliderAreaOfReach.Value));
pSASolver.DefaultBreaks = pDoubleArray;
//Calculate area of reach per each floor
int iTotalFloors = m_FloorNames.Length;
IStringArray pSourcesToExclude = new StrArrayClass();
for (int i = 0;i<iTotalFloors;i++)
{
pSourcesToExclude.RemoveAll();
for (int i2 = 0;i2<iTotalFloors;i2++)
{
if (m_FloorNames[i] != m_FloorNames[i2])
{
pSourcesToExclude.Add (m_FloorNames[i2]);
}
}
pSASolver.ExcludeSourcesFromPolygons = pSourcesToExclude;
pNAContext.Solver.Solve(pNAContext,pGPMessages,null);
Log("Adding ouput to map...");
//Flag 2D polygons (using the floor field);
//Add 3D polygons to scene and attribute every polygon with its floor
MiscUtils.Add3DServiceArea(pFCSA3D,pFCSA,m_FloorNames[i],MiscUtils.GetFloorHeight(m_FloorNames,m_FloorHeights,m_FloorNames[i]));
}
this.Map3D.SceneGraph.Invalidate(pFLayerSA3D as ILayer,true,false);
break;
default: //Shortest path or Closest Facility
pNASolver.Solve(pNAContext,pGPMessages,null);
Log("Adding ouput to map 3D...");
//Get Route3D
IFeatureLayer pFLayerRoute3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,"Route3D") as IFeatureLayer;
IFeatureClass pFCRoute3D = pFLayerRoute3D.FeatureClass;
//Get the traversal result
INATraversalResultQuery pTraverse = pNAContext.Result as INATraversalResultQuery;
if (pTraverse==null)return;
IFeatureClass pFCEdges = pTraverse.get_FeatureClass(ESRI.ArcGIS.Geodatabase.esriNetworkElementType.esriNETEdge);
//Add 3D features to Route3D
//MiscUtils.Create3DRoute(pFCRoute3D,pFCEdges,m_FloorNames,m_FloorHeights,pNAContext.NetworkDataset);
MiscUtils.Create3DRoute(pFCRoute3D,pNALayer);
iTotalIncidents = pFCRoute3D.FeatureCount(null);
//Add 2D features to Route2D (every segment will have its floor name)
Log("Adding ouput to map 2D...");
IFeatureClass pFCRoute2D = ((IFeatureLayer)m_pRoute2DActiveLayer).FeatureClass;
MiscUtils.Create2DRoutes(pFCRoute2D,pFCEdges,m_FloorNames,m_FloorHeights,pNAContext.NetworkDataset);
this.Map3D.SceneGraph.Invalidate(pFLayerRoute3D as ILayer,true,false);
break;
}
Log("Refreshing display...");
//Refresh
this.Map3D.SceneGraph.RefreshViewers();
((IActiveView)this.Map2D.Map).Refresh();
Application.DoEvents();
Log("");
if(this.LstSolvers.Text == "Find Closest")
{
if (iTotalIncidents < 5)
{
System.Threading.ThreadStart pThreadStart = new System.Threading.ThreadStart(this.ConfigureEvacuationObjects);
System.Threading.Thread pModelThread = new System.Threading.Thread(pThreadStart);
pModelThread.Priority = System.Threading.ThreadPriority.Highest;
pModelThread.Start();
}
else
{
ConfigureEvacuationObjects();
}
}
}
catch(Exception exx)
{
Log(exx.Message + " \n Solve_Click()");
MessageBox.Show(exx.Message + " \n Solve_Click()");
}
finally
{
this.Cursor = Cursors.Default;
}
}
private void BtnClean_Click(object sender, System.EventArgs e)
{
//CleanUp SceneRoutes
IFeatureLayer pFLayerRoute3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,"Route3D") as IFeatureLayer;
IFeatureClass pFCRoute3D = pFLayerRoute3D.FeatureClass;
MiscUtils.CleanupFC(pFCRoute3D);
this.Map3D.SceneGraph.Invalidate(pFLayerRoute3D as ILayer,true,false);
//Cleanup SceneMarkers
IFeatureLayer pFLayerStops3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sStops3D) as IFeatureLayer;
IFeatureClass pFCStops3D = pFLayerStops3D.FeatureClass;
MiscUtils.CleanupFC(pFCStops3D);
this.Map3D.SceneGraph.Invalidate(pFLayerStops3D as ILayer,true,false);
// Clean Up 3D Service Areas
IFeatureLayer pFLayerSA3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sServiceArea3D) as IFeatureLayer;
MiscUtils.CleanupFC(pFLayerSA3D.FeatureClass);
this.Map3D.SceneGraph.Invalidate(pFLayerSA3D as ILayer,true,false);
// Clean up Polygon Barriers
IFeatureLayer pFLayerPolygonBarriers3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sPolygonBarriers3D) as IFeatureLayer;
MiscUtils.CleanupFC(pFLayerPolygonBarriers3D.FeatureClass);
this.Map3D.SceneGraph.Invalidate(pFLayerPolygonBarriers3D as ILayer,true,false);
// Clean up animations
MiscUtils.CleanupFC( ((IFeatureLayer)m_AgentAnimation2DLayer).FeatureClass );
//CleanUp 2D Layers
//Cleanup 2DRoute
IFeatureClass pFCRoute2D = ((IFeatureLayer)m_pRoute2DActiveLayer).FeatureClass;
MiscUtils.CleanupFC(pFCRoute2D);
//Cleanup Route NALayer
INALayer pFLayerRoute = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer)as INALayer;
MiscUtils.RemoveNAObjects(pFLayerRoute,"Stops");
MiscUtils.RemoveNAObjects(pFLayerRoute,"Barriers");
MiscUtils.RemoveNAObjects(pFLayerRoute ,"Routes");
//Cleanup Closest Facility NALayer
INALayer pFLayerCF = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer)as INALayer;
MiscUtils.RemoveNAObjects(pFLayerCF,"Incidents");
MiscUtils.RemoveNAObjects(pFLayerCF,"Barriers");
MiscUtils.RemoveNAObjects(pFLayerCF ,"CFRoutes");
//Cleanup Service Area NALayer
INALayer pFLayerSA = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer)as INALayer;
MiscUtils.RemoveNAObjects(pFLayerSA,"Facilities");
MiscUtils.RemoveNAObjects(pFLayerSA,"Barriers");
MiscUtils.RemoveNAObjects(pFLayerSA ,"SAPolygons");
this.BtnAnimate.Enabled = false;
((IActiveView)this.Map2D.Map).Refresh();
this.Map3D.SceneGraph.RefreshViewers();
}
private void LstSolvers_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.groupClosestFacility.Visible = false;
this.groupBoxAreaOfReach.Visible = false;
ILayer pNALayer = null;
ILayer pEmergencyExits3DLayer = ESRIControlUtils.GetLayerFromMap(this.Map3D, m_EmergencyExits3DLayer);
pEmergencyExits3DLayer.Visible = false;
//Switch Layers visibility
switch(this.LstSolvers.Text)
{
case "Route Solver":
pNALayer = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer);
pNALayer.Visible = true;
ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer).Visible = false;
ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer).Visible = false;
break;
case "Find Closest":
pNALayer = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer);
pNALayer.Visible = true;
ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer).Visible = false;
ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer).Visible = false;
pEmergencyExits3DLayer.Visible = true;
this.groupClosestFacility.Visible = true;
break;
case "Area of reach":
this.groupBoxAreaOfReach.Visible = true;
this.LblAreaOfReachUnits.Text = this.SliderSeconds.Value.ToString() + " " + this.SliderAreaOfReach.Value.ToString();
pNALayer = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer);
pNALayer.Visible = true;
ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer).Visible = false;
ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer).Visible = false;
break;
default:
break;
}
//Update 'map' Network Layer (custom property)
m_pAppProperties.NetworkLayer = pNALayer as INALayer;
this.Map2D.CustomProperty = m_pAppProperties;
//Cleanup previous outputs and refresh
BtnClean_Click(sender,e);
}
private void SliderSeconds_ValueChanged(object sender, System.EventArgs e)
{
if (this.LstSolvers.Text == "Area of Reach")
{
this.LblSlider.Text = this.SliderSeconds.Value.ToString() + " " + this.LstImpendances.Text;
}
else
{
this.LblSlider.Text = MiscUtils.SecondsToString(this.SliderSeconds.Value * 0.75);
}
}
private void SliderSeconds_Scroll(object sender, System.EventArgs e)
{
}
private void Map2D_OnKeyDown(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnKeyDownEvent e)
{
if (e.keyCode.ToString()=="83")
{
this.BtnGO_Click(null,null);
return;
}
SwitchView( e.keyCode.ToString() == "90");
}
private void Map3D_OnKeyDown(object sender, ESRI.ArcGIS.SceneControl.ISceneControlEvents_OnKeyDownEvent e)
{
if (e.keyCode.ToString()=="83")
{
this.BtnGO_Click(null,null);
return;
}
SwitchView( e.keyCode.ToString() == "90");
}
private void TOC3D_OnKeyDown(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnKeyDownEvent e)
{
if (e.keyCode.ToString()=="83")
{
this.BtnGO_Click(null,null);
return;
}
SwitchView( e.keyCode.ToString() == "90");
}
private void TOC2D_OnKeyDown(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnKeyDownEvent e)
{
if (e.keyCode.ToString()=="83")
{
this.BtnGO_Click(null,null);
return;
}
SwitchView( e.keyCode.ToString() == "90");
}
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode.ToString()=="83")
{
this.BtnGO_Click(null,null);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -