📄 addbarrier.cs
字号:
using System;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Utility.BaseClasses;
using ESRI.ArcGIS.Utility.CATIDs;
using ESRI.ArcGIS.ControlCommands;
using ESRI.ArcGIS.ToolbarControl;
using ESRI.ArcGIS.MapControl;
using ESRI.ArcGIS.SceneControl;
using ESRI.ArcGIS.Analyst3D;
//Ismael Chivite
//ESRI Redlands
//March 2005
namespace EvacuationRoutesTools
{
[ClassInterface(ClassInterfaceType.None)]
[Guid("554b7b00-0718-47bb-a06d-ee9dcd19ed53")]
public sealed class AddBarrier: BaseTool
{
private IHookHelper m_pHookHelper = new HookHelperClass();
private ISceneHookHelper m_pSceneHookHelper = new SceneHookHelperClass();
private bool m_is2D = true;
private bool m_Enabled = true;
#region "Component Category Registration"
[ComRegisterFunction()]
static void Reg(string regKey)
{
MxCommands.Register(regKey);
ControlsCommands.Register(regKey);
}
[ComUnregisterFunction()]
static void Unreg(string regKey)
{
MxCommands.Unregister(regKey);
ControlsCommands.Unregister(regKey);
}
#endregion
public AddBarrier()
{
base.m_category = "Network_3D";
base.m_caption = "Adds a barrier";
base.m_message = "Adds a barrier by clicking on the map/globe";
base.m_toolTip = "Add a barrier by clicking on the map/globe";
base.m_name = "AddBarrier";
try
{
string [] res = GetType().Assembly.GetManifestResourceNames();
if(res.GetLength(0)>0)
{
base.m_bitmap = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream("EvacuationRoutesTools.AddBarrier.bmp"));
}
}
catch(Exception exx)
{
//System.Windows.Forms.MessageBox.Show(exx.Message);
}
}
public override void OnCreate(object hook)
{
if (hook!=null)
{
if (hook is IToolbarControl)
{
IToolbarControl pToolBarControl = hook as IToolbarControl;
if (pToolBarControl.Buddy is MapControl)
{
m_is2D = true;
m_pHookHelper.Hook = hook; //This is a toolbar if the app is an ArcEngine app.
}
else
{
m_is2D = false;
m_pSceneHookHelper.Hook = hook ;
}
}
else
{
m_Enabled = false;
}
}
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
if (m_is2D==false)
{
MouseDown3D(Button,Shift,X,Y);
}
else
{
MouseDown2D(Button,Shift,X,Y);
}
}
public override bool Enabled
{
get
{
return m_Enabled;
}
}
private void MouseDown3D(int Button,int Shift,int X,int Y)
{
try
{
IToolbarControl pToolBar = m_pSceneHookHelper.Hook as IToolbarControl;
ISceneGraph pSceneGraph = m_pSceneHookHelper.SceneGraph;
IPoint pPoint = null;
object pOwner = null;
object ppObject = null;
pSceneGraph.Locate(pSceneGraph.ActiveViewer,X,Y,ESRI.ArcGIS.Analyst3D.esriScenePickMode.esriScenePickGeography,false,out pPoint,out pOwner,out ppObject);
//Get the active floor and NALayer
ISceneControl pSceneControl = pToolBar.Buddy as ISceneControl;
AppProperties.AppProperties pAppProps = pSceneControl.CustomProperty as AppProperties.AppProperties;
string sActiveFloor = pAppProps.ActiveFloor;
ESRI.ArcGIS.NetworkAnalyst.INALayer pNALayer = pAppProps.NetworkLayer;
//Adds a new NAObject to the NALayer (2D)
IPoint pPoint2D = new PointClass();
pPoint2D.PutCoords(pPoint.X,pPoint.Y);
bool added = APL.NetworkUtils.AddBarrier(pNALayer,pPoint,sActiveFloor,false,5);
//APL.NetworkUtils.AddNetWorkLocation(pNALayer,"Barriers",pPoint2D,sActiveFloor,sActiveFloor,15);
//Adds a new 3D representation of the NAObject (3D)
if (added)
{
double dHeight = pAppProps.FloorsHeight;
IPoint pPoint3D = ((ESRI.ArcGIS.esriSystem.IClone)pPoint).Clone() as IPoint;;
((IZAware)pPoint3D).ZAware = true;
pPoint3D.Z = dHeight;
IFeatureClass pFC = pAppProps.Marker3DLayer.FeatureClass;
IFeature p3DF = pFC.CreateFeature();
int idxType = pFC.Fields.FindField("Type");
if (idxType>0) p3DF.set_Value(idxType,"Barrier");
int idxFloor = pFC.Fields.FindField("Floor");
if (idxFloor>0) p3DF.set_Value(idxFloor,sActiveFloor);
p3DF.Shape = pPoint3D;
p3DF.Store();
//Refresh 3D
pSceneGraph.Invalidate(pAppProps.Marker3DLayer,true,false);
pSceneGraph.RefreshViewers();
}
}
catch(Exception exx)
{
System.Windows.Forms.MessageBox.Show("Add Stop tool: " + exx.Message);
}
}
private void MouseDown2D(int Button,int Shift,int X,int Y)
{
try
{
IToolbarControl pToolBar = m_pHookHelper.Hook as IToolbarControl;
IPoint pPoint = m_pHookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
//Get the active floor and NALayer
IMapControl3 pMapControl = pToolBar.Buddy as IMapControl3;
AppProperties.AppProperties pAppProps = pMapControl.CustomProperty as AppProperties.AppProperties;
string sActiveFloor = pAppProps.ActiveFloor;
ESRI.ArcGIS.NetworkAnalyst.INALayer pNALayer = pAppProps.NetworkLayer;
bool added = APL.NetworkUtils.AddBarrier(pNALayer,pPoint,sActiveFloor,false,5);
//APL.NetworkUtils.AddNetWorkLocation(pNALayer,"Barriers",pPoint,sActiveFloor,sActiveFloor,15);
//Adds a new 3D representation of the NAObject (3D)
if (added)
{
double dHeight = pAppProps.FloorsHeight;
IPoint pPoint3D = m_pHookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
((IZAware)pPoint3D).ZAware = true;
pPoint3D.Z = dHeight;
IFeatureClass pFC = pAppProps.Marker3DLayer.FeatureClass;
IFeature p3DF = pFC.CreateFeature();
int idxType = pFC.Fields.FindField("Type");
if (idxType>0) p3DF.set_Value(idxType,"Barrier");
int idxFloor = pFC.Fields.FindField("Floor");
if (idxFloor>0) p3DF.set_Value(idxFloor,sActiveFloor);
p3DF.Shape = pPoint3D;
p3DF.Store();
//Refresh 2D
ITopologicalOperator pTopOp = pPoint3D as ITopologicalOperator;
m_pHookHelper.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography,null,pTopOp.Buffer(5).Envelope);
//Refresh 3D
ISceneGraph pSceneGraph = pAppProps.SceneGraph;
pSceneGraph.Invalidate(pAppProps.Marker3DLayer,true,false);
pSceneGraph.RefreshViewers();
}
}
catch(Exception exx)
{
System.Windows.Forms.MessageBox.Show("Add Stop tool: " + exx.Message);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -