ArcObjects Library Reference  

StationsInContainers

About the Implementing schematic containers around schematic features Sample

[C#]

StationsInContainers.cs

using ESRI.ArcGIS.Schematic;
using Microsoft.VisualBasic;

namespace ContainerManagerCS
{
	public class StationsInContainers : ESRI.ArcGIS.Desktop.AddIns.Extension
	{
		//The OnAfterLoadDiagram is used to define the relations between elements
		//contained in a diagram. It is called by the AfterLoadDiagram 
		//event defined in the schematic project. The diagram contains Stations and 
		//Containers elements. For the Station element type, a particular attribute 
		//named RelatedFeeder has been created. This attribute is used to identify 
		//the container the station is related to. Near the top of the procedure, 
		//a new schematic relation is created (SchematicContainerManager). The 
		//ISchematicRelationControllerEdit CreateRelation method is used to specify 
		//that the station is related to its container. The value set for the 
		//RelatedFeeder attribute specifies whether or not the station is related 
		//to a container.

		private SchematicDatasetManager m_DatasetMgr;

		public StationsInContainers()
		{
		}

		protected override void OnStartup()
		{
			m_DatasetMgr = new SchematicDatasetManager();
			m_DatasetMgr.AfterLoadDiagram += new ISchematicDatasetEvents_AfterLoadDiagramEventHandler(OnAfterLoadDiagram);
			m_DatasetMgr.AfterRefreshDiagram+=new ISchematicDatasetEvents_AfterRefreshDiagramEventHandler(OnAfterRefreshDiagram);
		}

		protected override void OnShutdown()
		{
			m_DatasetMgr.AfterLoadDiagram -= OnAfterLoadDiagram;
			m_DatasetMgr.AfterRefreshDiagram -= OnAfterRefreshDiagram;
			m_DatasetMgr = null;
		}

		public void OnAfterLoadDiagram(ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram inMemoryDiagram)
		{
			if (State != ESRI.ArcGIS.Desktop.AddIns.ExtensionState.Enabled) return;

			ISchematicElementClass schemContainerClass = null;
			ISchematicElementClass schemElementClass;
			ISchematicElementClass schemStationClass = null;
			IEnumSchematicInMemoryFeature enumElementsInContainer;
			IEnumSchematicInMemoryFeature enumContainerElements;
			ISchematicInMemoryFeature schemFeature = null;
			ISchematicInMemoryFeature schemContainerFeature = null;
			object feederOID;
			string containerNameID;
			IEnumSchematicElementClass enumElementClass;
			ISchematicAttributeContainer schemAttributeContainer;
			ISchematicAttribute schemAttributeRelatedFeeder;
			//ISchematicElement schemElement ;
			ISchematicRelationController schemRelationController = null;
			ISchematicRelationControllerEdit schemRelationControllerEdit = null;
			Collection colContElem = new Collection();

			// Getting SchematicFeature Class Stations and Containers
			enumElementClass = inMemoryDiagram.SchematicDiagramClass.AssociatedSchematicElementClasses;
			enumElementClass.Reset();
			schemElementClass = enumElementClass.Next();

			while (schemElementClass != null)
			{
				if (schemElementClass.Name == "Stations")
					schemStationClass = schemElementClass;
				if (schemElementClass.Name == "Containers")
					schemContainerClass = schemElementClass;
				if (schemStationClass != null && schemContainerClass != null)
					break;

				schemElementClass = enumElementClass.Next();
			}
			// go out if schemStationClass or schemContainerClass are null
			if (schemStationClass == null || schemContainerClass == null)
				return;

			// Getting the Stations elements that will be displayed in the containers
			enumElementsInContainer = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(schemStationClass);
			if (enumElementsInContainer == null)
				return;

			// Creating the Schematic Container Manager
			schemRelationController = new SchematicRelationController();

			// Creating the Schematic Container Editor that will be used to define the relation between the stations and their container
			schemRelationControllerEdit = (ISchematicRelationControllerEdit)schemRelationController;

			// Defining each Container element as a schematic container
			enumContainerElements = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(schemContainerClass);

			// Add Container Element to a collection
			enumContainerElements.Reset();
			schemContainerFeature = enumContainerElements.Next();
			while (schemContainerFeature != null)
			{
				colContElem.Add(schemContainerFeature, schemContainerFeature.Name, null, null);
				schemContainerFeature = enumContainerElements.Next();
			}

			// Setting the relation between each station and its related container
			enumElementsInContainer.Reset();
			schemFeature = enumElementsInContainer.Next();

			while (schemFeature != null)
			{
				// The relation is specified by the RelatedFeeder attribute value defined for each station
				schemAttributeContainer = (ISchematicAttributeContainer)schemFeature.SchematicElementClass;
				schemAttributeRelatedFeeder = schemAttributeContainer.GetSchematicAttribute("RelatedFeeder", false);

				feederOID = schemAttributeRelatedFeeder.GetValue((ISchematicObject)schemFeature);

				if (feederOID != null)
				{
					containerNameID = "Container-" + feederOID.ToString();

					try
					{
						// Retrieve Container Element in the collection
						schemContainerFeature = (ISchematicInMemoryFeature)colContElem[containerNameID];
						// Create relation
						schemRelationControllerEdit.CreateRelation(schemFeature, schemContainerFeature);
					}
					catch { }
				}

				schemContainerFeature = null;
				schemFeature = enumElementsInContainer.Next();
			}
		}

		public void OnAfterRefreshDiagram(ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram inMemoryDiagram)
		{
			OnAfterLoadDiagram(inMemoryDiagram);
		}

	}

}

[Visual Basic .NET]

StationsInContainers.vb

Imports ESRI.ArcGIS.Schematic

Public Class StationsInContainers
	Inherits ESRI.ArcGIS.Desktop.AddIns.Extension

	' The OnAfterLoadDiagram is used to define the relations between elements
	' contained in a diagram. It is called by the AfterLoadDiagram 
	' event defined in the schematic project. The diagram contains Stations and 
	' Containers elements. For the Station element type, a particular attribute 
	' named RelatedFeeder has been created. This attribute is used to identify 
	' the container the station is related to. Near the top of the procedure, 
	' a new schematic relation is created (SchematicContainerManager). The 
	' ISchematicRelationControllerEdit CreateRelation method is used to specify 
	' that the station is related to its container. The value set for the 
	' RelatedFeeder attribute specifies whether or not the station is related 
	' to a container.

	Private m_DatasetMgr As SchematicDatasetManager

	Protected Overrides Sub OnStartup()
		m_DatasetMgr = New SchematicDatasetManager
		AddHandler m_DatasetMgr.AfterLoadDiagram, AddressOf OnAfterLoadDiagram
		AddHandler m_DatasetMgr.AfterRefreshDiagram, AddressOf OnAfterRefreshDiagram
	End Sub

	Protected Overrides Sub OnShutdown()
		RemoveHandler m_DatasetMgr.AfterLoadDiagram, AddressOf OnAfterLoadDiagram
		RemoveHandler m_DatasetMgr.AfterRefreshDiagram, AddressOf OnAfterRefreshDiagram
		m_DatasetMgr = Nothing
	End Sub

	Public Sub OnAfterLoadDiagram(ByVal inMemoryDiagram As ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram)
		If (State <> ESRI.ArcGIS.Desktop.AddIns.ExtensionState.Enabled) Then Return

		Dim schemContainerClass As ISchematicElementClass = Nothing
		Dim schemElementClass As ISchematicElementClass
		Dim schemStationClass As ISchematicElementClass = Nothing
		Dim enumElementsInContainer As IEnumSchematicInMemoryFeature
		Dim enumContainerElements As IEnumSchematicInMemoryFeature
		Dim schemFeature As ISchematicInMemoryFeature = Nothing
		Dim schemContainerFeature As ISchematicInMemoryFeature = Nothing
		Dim feederOID As Object
		Dim containerNameID As String
		Dim enumElementClass As IEnumSchematicElementClass
		Dim schemAttributeContainer As ISchematicAttributeContainer
		Dim schemAttributeRelatedFeeder As ISchematicAttribute
		Dim schemElement As ISchematicElement = Nothing
		Dim schemRelationController As ISchematicRelationController
		Dim schemRelationControllerEdit As ISchematicRelationControllerEdit
		Dim colContElem As New Collection

		' Getting SchematicFeature Class Stations and Containers
		enumElementClass = inMemoryDiagram.SchematicDiagramClass.AssociatedSchematicElementClasses
		enumElementClass.Reset()
		schemElementClass = enumElementClass.Next
		While (schemElementClass IsNot Nothing)
			If schemElementClass.Name = "Stations" Then schemStationClass = schemElementClass
			If schemElementClass.Name = "Containers" Then schemContainerClass = schemElementClass
			If (schemStationClass IsNot Nothing AndAlso schemContainerClass IsNot Nothing) Then Exit While

			schemElementClass = enumElementClass.Next
		End While
		' go out if schemStationClass or schemContainerClass are null
		If (schemStationClass Is Nothing OrElse schemContainerClass Is Nothing) Then Return

		' Getting the Stations elements that will be displayed in the containers
		enumElementsInContainer = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(schemStationClass)
		If (enumElementsInContainer Is Nothing) Then Return

		' Creating the Schematic Container Manager
		schemRelationController = New SchematicRelationController

		' Creating the Schematic Container Editor that will be used to define the relation between the stations and their container
		schemRelationControllerEdit = schemRelationController

		' Defining each Container element as a schematic container
		enumContainerElements = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(schemContainerClass)

		' Add Container Element to a collection
		enumContainerElements.Reset()
		schemContainerFeature = enumContainerElements.Next
		While (schemContainerFeature IsNot Nothing)
			colContElem.Add(schemContainerFeature, schemContainerFeature.Name)
			schemContainerFeature = enumContainerElements.Next
		End While

		' Setting the relation between each station and its related container
		enumElementsInContainer.Reset()
		schemFeature = enumElementsInContainer.Next

		While (schemFeature IsNot Nothing)
			' The relation is specified by the RelatedFeeder attribute value defined for each station
			schemAttributeContainer = CType(schemFeature.SchematicElementClass, ISchematicAttributeContainer)
			schemAttributeRelatedFeeder = schemAttributeContainer.GetSchematicAttribute("RelatedFeeder")

			If schemAttributeRelatedFeeder IsNot Nothing Then
				feederOID = schemAttributeRelatedFeeder.GetValue(CType(schemFeature, ISchematicObject))
				If feederOID IsNot Nothing Then
					containerNameID = "Container-" & feederOID.ToString()

					Try
						' Retrieve Container Element in the collection
						schemContainerFeature = CType(colContElem(containerNameID), ISchematicInMemoryFeature)
						' Create relation
						schemRelationControllerEdit.CreateRelation(schemFeature, schemContainerFeature)
					Catch
					End Try
				End If
			End If


			schemContainerFeature = Nothing
			schemFeature = enumElementsInContainer.Next
		End While
	End Sub

	Public Sub OnAfterRefreshDiagram(ByVal inMemoryDiagram As ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram)
		OnAfterLoadDiagram(inMemoryDiagram)
	End Sub

End Class