About the Schematics Engine application Sample
[C#]
MainForm.cs
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.ADF; using ESRI.ArcGIS.SystemUI; using ESRI.ArcGIS.SchematicControls; using ESRI.ArcGIS.Schematic; namespace SchematicApplication { public sealed partial class MainForm : Form { #region class private members private ITOCControl2 m_tocControl; private IMapControl3 m_mapControl = null; private string m_mapDocumentName = string.Empty; private IToolbarMenu m_menuSchematicLayer; private IToolbarMenu m_menuLayer; private IToolbarMenu m_CreateMenu = new ToolbarMenuClass(); #endregion #region class constructor public MainForm() { InitializeComponent(); } #endregion private void MainForm_Load(object sender, EventArgs e) { //get the MapControl and tocControl m_tocControl = (ITOCControl2)axTOCControl1.Object; m_mapControl = (IMapControl3)axMapControl1.Object; //Set buddy control for tocControl m_tocControl.SetBuddyControl(m_mapControl); //disable the Save menu (since there is no document yet) menuSaveDoc.Enabled = false; //Create a SchematicEditor's MenuDef object IMenuDef menuDefSchematicEditor = new CreateMenuSchematicEditor(); //Add SchematicEditor on the ToolBarMenu m_CreateMenu.AddItem(menuDefSchematicEditor, 0, -1, false, esriCommandStyles.esriCommandStyleIconAndText); //Set the ToolbarMenu's hook m_CreateMenu.SetHook(axToolbarControl2.Object); //Set the ToolbarMenu's caption m_CreateMenu.Caption = "SchematicEditor"; /// Add ToolbarMenu on the ToolBarControl axToolbarControl2.AddItem(m_CreateMenu, -1, -1, false, 0, esriCommandStyles.esriCommandStyleMenuBar); ///Create a other ToolbarMenu for layer m_menuSchematicLayer = new ToolbarMenuClass(); m_menuLayer = new ToolbarMenuClass(); ///Add 3 items on the SchematicLayer properties menu m_menuSchematicLayer.AddItem(new RemoveLayer(), -1, 0, false, esriCommandStyles.esriCommandStyleTextOnly); m_menuSchematicLayer.AddItem("esriControls.ControlsSchematicSaveEditsCommand", -1, 1, true, esriCommandStyles.esriCommandStyleIconAndText); m_menuSchematicLayer.AddItem("esriControls.ControlsSchematicUpdateDiagramCommand", -1, 2, false, esriCommandStyles.esriCommandStyleIconAndText); IMenuDef subMenuDef = new CreateSubMenuSchematic(); m_menuSchematicLayer.AddSubMenu(subMenuDef, 3, true); ////Add the sub-menu as the third item on the Layer properties menu, making it start a new group m_menuSchematicLayer.AddItem(new ZoomToLayer(), -1, 4, true, esriCommandStyles.esriCommandStyleTextOnly); m_menuLayer.AddItem(new RemoveLayer(), -1, 0, false, esriCommandStyles.esriCommandStyleTextOnly); m_menuLayer.AddItem(new ZoomToLayer(), -1, 1, true, esriCommandStyles.esriCommandStyleTextOnly); ////Set the hook of each menu m_menuSchematicLayer.SetHook(m_mapControl); m_menuLayer.SetHook(m_mapControl); } private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) { if (e.button != 2) return; esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone; IBasicMap map = null; ILayer layer = null; object other = null; object index = null; //Determine what kind of item is selected m_tocControl.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index); //Ensure the item gets selected if (item == esriTOCControlItem.esriTOCControlItemMap) m_tocControl.SelectItem(map, null); else m_tocControl.SelectItem(layer, null); //Set the layer into the CustomProperty (this is used by the custom layer commands) m_mapControl.CustomProperty = layer; ISchematicLayer schLayer = layer as ISchematicLayer; if (schLayer != null) /// attach menu for SchematicLayer { ISchematicTarget schematicTarget = new ESRI.ArcGIS.SchematicControls.EngineSchematicEnvironmentClass() as ISchematicTarget; if (schematicTarget != null) schematicTarget.SchematicTarget = schLayer; //Popup the correct context menu if (item == esriTOCControlItem.esriTOCControlItemLayer) m_menuSchematicLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd); } else /// attach menu for Layer { //Popup the correct context menu if (item == esriTOCControlItem.esriTOCControlItemLayer) m_menuLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd); } } #region Main Menu event handlers private void menuNewDoc_Click(object sender, EventArgs e) { //execute New Document command ICommand command = new CreateNewDocument(); command.OnCreate(m_mapControl.Object); command.OnClick(); } private void menuOpenDoc_Click(object sender, EventArgs e) { //execute Open Document command ICommand command = new ControlsOpenDocCommandClass(); command.OnCreate(m_mapControl.Object); command.OnClick(); } private void menuSaveDoc_Click(object sender, EventArgs e) { //execute Save Document command if (m_mapControl.CheckMxFile(m_mapDocumentName)) { //create a new instance of a MapDocument IMapDocument mapDoc = new MapDocumentClass(); mapDoc.Open(m_mapDocumentName, string.Empty); //Make sure that the MapDocument is not read only if (mapDoc.get_IsReadOnly(m_mapDocumentName)) { MessageBox.Show("Map document is read only!"); mapDoc.Close(); return; } //Replace its contents with the current map mapDoc.ReplaceContents((IMxdContents)m_mapControl.Map); //save the MapDocument in order to persist it mapDoc.Save(mapDoc.UsesRelativePaths, false); //close the MapDocument mapDoc.Close(); } } private void menuSaveAs_Click(object sender, EventArgs e) { //execute SaveAs Document command ICommand command = new ControlsSaveAsDocCommandClass(); command.OnCreate(m_mapControl.Object); command.OnClick(); } private void menuExitApp_Click(object sender, EventArgs e) { //exit the application Application.Exit(); } #endregion //listen to MapReplaced event in order to update the status bar and the Save menu private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) { //get the current document name from the MapControl m_mapDocumentName = m_mapControl.DocumentFilename; //if there is no MapDocument, disable the Save menu and clear the status bar if (m_mapDocumentName == string.Empty) { menuSaveDoc.Enabled = false; statusBarXY.Text = string.Empty; } else { //enable the Save menu and write the doc name to the status bar menuSaveDoc.Enabled = true; statusBarXY.Text = Path.GetFileName(m_mapDocumentName); } } private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) { statusBarXY.Text = string.Format("{0}, {1} {2}", e.mapX.ToString("#######.##"), e.mapY.ToString("#######.##"), axMapControl1.MapUnits.ToString().Substring(4)); } } }
[Visual Basic .NET]
MainForm.vb
Imports System.IO Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Controls Imports ESRI.ArcGIS.ADF Imports ESRI.ArcGIS.SystemUI Imports ESRI.ArcGIS.SchematicControls Imports ESRI.ArcGIS.Schematic Public Class MainForm Private m_mapControl As IMapControl3 = Nothing Private m_mapDocumentName As String = String.Empty Private m_menuLayer As IToolbarMenu Private m_menuSchematicLayer As IToolbarMenu Private m_createMenu As IToolbarMenu = New ToolbarMenuClass Private m_pTocControl As ITOCControl2 Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As EventArgs) Handles MyBase.Load 'get the MapControl m_mapControl = CType(axMapControl1.Object, IMapControl3) m_pTocControl = CType(axTOCControl1.Object, ITOCControl2) 'disable the Save menu (since there is no document yet) menuSaveDoc.Enabled = False Dim menuDefSchematicEditor As IMenuDef 'Create a SchematicEditor's MenuDef object menuDefSchematicEditor = New CreateMenuSchematicEditor 'Add SchematicEditor on the ToolBarMenu m_createMenu.AddItem(menuDefSchematicEditor, 0, -1, False, esriCommandStyles.esriCommandStyleIconAndText) 'Set the Toolbar menu's hook m_createMenu.SetHook(axToolbarControl2.Object) 'Set the ToolbarMenu's caption m_createMenu.Caption = "SchematicEditor" 'Add ToolbarMenu on the ToolBarControl axToolbarControl2.AddItem(m_createMenu, -1, -1, False, 0, esriCommandStyles.esriCommandStyleMenuBar) 'Create a other ToolbarMenu for layer m_menuSchematicLayer = New ToolbarMenuClass() m_menuLayer = New ToolbarMenuClass() 'Add 2 ControlsSchematic items on the Layer properties menu m_menuSchematicLayer.AddItem(New RemoveLayer, -1, 0, False, esriCommandStyles.esriCommandStyleTextOnly) m_menuSchematicLayer.AddItem("esriControls.ControlsSchematicSaveEditsCommand", 0, 1, True, esriCommandStyles.esriCommandStyleIconAndText) m_menuSchematicLayer.AddItem("esriControls.ControlsSchematicUpdateDiagramCommand", 0, 2, False, esriCommandStyles.esriCommandStyleIconAndText) Dim subMenuDef As IMenuDef = New CreateSubMenuSchematic() 'Add the sub-menu as the third item on the Layer properties menu, making it start a new group m_menuSchematicLayer.AddSubMenu(subMenuDef, 3, True) m_menuSchematicLayer.AddItem(New ZoomToLayer, -1, 4, True, esriCommandStyles.esriCommandStyleTextOnly) m_menuLayer.AddItem(New RemoveLayer, -1, 0, False, esriCommandStyles.esriCommandStyleTextOnly) m_menuLayer.AddItem(New ZoomToLayer, -1, 1, True, esriCommandStyles.esriCommandStyleTextOnly) 'Set the hook of each menu m_menuSchematicLayer.SetHook(m_mapControl) m_menuLayer.SetHook(m_mapControl) End Sub #Region "Main Menu event handlers" Private Sub menuNewDoc_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuNewDoc.Click 'execute New Document command Dim command As ICommand = New CreateNewDocument() command.OnCreate(m_mapControl.Object) command.OnClick() End Sub Private Sub menuOpenDoc_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuOpenDoc.Click 'execute Open Document command Dim command As ICommand = New ControlsOpenDocCommandClass() command.OnCreate(m_mapControl.Object) command.OnClick() End Sub Private Sub menuSaveDoc_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuSaveDoc.Click 'execute Save Document command If m_mapControl.CheckMxFile(m_mapDocumentName) Then 'create a new instance of a MapDocument Dim mapDoc As IMapDocument = New MapDocumentClass() mapDoc.Open(m_mapDocumentName, String.Empty) 'Make sure that the MapDocument is not read only If mapDoc.IsReadOnly(m_mapDocumentName) Then MsgBox("Map document is read only!") mapDoc.Close() Return End If 'Replace its contents with the current map mapDoc.ReplaceContents(CType(m_mapControl.Map, IMxdContents)) 'save the MapDocument in order to persist it mapDoc.Save(mapDoc.UsesRelativePaths, False) 'close the MapDocument mapDoc.Close() End If End Sub Private Sub menuSaveAs_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuSaveAs.Click 'execute SaveAs Document command Dim command As ICommand = New ControlsSaveAsDocCommandClass() command.OnCreate(m_mapControl.Object) command.OnClick() End Sub Private Sub menuExitApp_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuExitApp.Click 'exit the application Application.Exit() End Sub #End Region 'listen to MapReplaced event in order to update the status bar and the Save menu Private Sub axMapControl1_OnMapReplaced(ByVal sender As Object, ByVal e As IMapControlEvents2_OnMapReplacedEvent) Handles axMapControl1.OnMapReplaced 'get the current document name from the MapControl m_mapDocumentName = m_mapControl.DocumentFilename 'if there is no MapDocument, disable the Save menu and clear the status bar If m_mapDocumentName = String.Empty Then menuSaveDoc.Enabled = False statusBarXY.Text = String.Empty Else 'enable the Save menu and write the doc name to the status bar menuSaveDoc.Enabled = True statusBarXY.Text = Path.GetFileName(m_mapDocumentName) End If End Sub Private Sub axMapControl1_OnMouseMove(ByVal sender As Object, ByVal e As IMapControlEvents2_OnMouseMoveEvent) Handles axMapControl1.OnMouseMove statusBarXY.Text = String.Format("{0}, {1} {2}", e.mapX.ToString("#######.##"), e.mapY.ToString("#######.##"), axMapControl1.MapUnits.ToString().Substring(4)) End Sub Private Sub AxTOCControl1_OnMouseDown(ByVal sender As System.Object, ByVal e As ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent) Handles axTOCControl1.OnMouseDown If (e.button <> 2) Then Exit Sub Dim pItem As esriTOCControlItem Dim pMap As IMap = Nothing, pLayer As ILayer = Nothing Dim pOther As Object = Nothing, pIndex As Object = Nothing 'Determine what kind of item is selected m_pTocControl.HitTest(e.x, e.y, pItem, CType(pMap, IBasicMap), pLayer, pOther, pIndex) 'Ensure the item gets selected If (pItem = esriTOCControlItem.esriTOCControlItemMap) Then m_pTocControl.SelectItem(pMap, Nothing) Else m_pTocControl.SelectItem(pLayer, Nothing) End If 'Set the layer into the CustomProperty (this is used by the custom layer commands) m_mapControl.CustomProperty = pLayer Dim schLayer As ISchematicLayer schLayer = TryCast(pLayer, ISchematicLayer) If Not schLayer Is Nothing Then Dim schematicTarget As ISchematicTarget schematicTarget = TryCast(New ESRI.ArcGIS.SchematicControls.EngineSchematicEnvironmentClass(), ISchematicTarget) If (Not schematicTarget Is Nothing) Then schematicTarget.SchematicTarget = schLayer End If 'Popup the correct context menu If (pItem = esriTOCControlItem.esriTOCControlItemLayer) Then m_menuSchematicLayer.PopupMenu(e.x, e.y, m_pTocControl.hWnd) Else 'Popup the correct context menu If (pItem = esriTOCControlItem.esriTOCControlItemLayer) Then m_menuLayer.PopupMenu(e.x, e.y, m_pTocControl.hWnd) End If End Sub End Class