ArcObjects Library Reference  

ReductionLinkRule

About the Implementing a schematic rule and its property page Sample

[C#]

ReductionLinkRule.cs

using System;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Schematic;
using esriSystem = ESRI.ArcGIS.esriSystem;

namespace CustomRulesCS
{
	[ClassInterface(ClassInterfaceType.None)]
	[Guid(ReductionLinkRule.GUID)]
	[ProgId(ReductionLinkRule.PROGID)]
	public class ReductionLinkRule : ISchematicRule, ISchematicRuleDesign
	{
		public const string GUID = "52E0F9A1-5E21-4b4a-A5C8-C30721CC1ED4";
		public const string PROGID = "CustomRulesCS.ReductionLinkRule";

		// Register/unregister categories for this class
		#region Component Category Registration
		[System.Runtime.InteropServices.ComRegisterFunction()]
		public static void Register(string CLSID)
		{
			SchematicRules.Register(CLSID);
		}

		[System.Runtime.InteropServices.ComUnregisterFunction()]
		public static void Unregister(string CLSID)
		{
			SchematicRules.Unregister(CLSID);
		}
		#endregion

		private ESRI.ArcGIS.Schematic.ISchematicDiagramClass m_diagramClass;
		private string m_reductionLinkName;
		private bool m_usePort = false;
		private string m_description = "Reduction Link Rule C#";

		public ReductionLinkRule()
		{
		}

		~ReductionLinkRule()
		{
			m_diagramClass = null;
		}

		public string ReductionLinkName
		{
			get
			{
				return m_reductionLinkName;
			}
			set
			{
				m_reductionLinkName = value;
			}
		}

		public bool UsePort
		{
			get
			{
				return m_usePort;
			}
			set
			{
				m_usePort = value;
			}
		}

		#region ISchematicRule Members

		public void Alter(ISchematicDiagramClass schematicDiagramClass, ESRI.ArcGIS.esriSystem.IPropertySet propertySet)
		{
			m_diagramClass = schematicDiagramClass;

			try
			{
				m_description = propertySet.GetProperty("DESCRIPTION").ToString();
			}
			catch { }

			try
			{
				m_reductionLinkName = propertySet.GetProperty("REDUCTIONLINKNAME").ToString();
			}
			catch { }
			try
			{
				m_usePort = (bool)propertySet.GetProperty("USEPORT");
			}
			catch { }
		}

		public void Apply(ISchematicInMemoryDiagram inMemoryDiagram, ESRI.ArcGIS.esriSystem.ITrackCancel cancelTracker)
		{
			if (m_reductionLinkName == "") return;

			IEnumSchematicInMemoryFeature enumSchematicElement;
			ISchematicInMemoryFeature schemElement;
			ISchematicDiagramClass diagramClass = null;
			ISchematicElementClass elementClass;
			IEnumSchematicElementClass enumElementClass;
			Microsoft.VisualBasic.Collection allreadyUsed = new Microsoft.VisualBasic.Collection();
			try
			{
				diagramClass = inMemoryDiagram.SchematicDiagramClass;
			}
			catch { }
			if (diagramClass == null) return;

			enumElementClass = diagramClass.AssociatedSchematicElementClasses;
			enumElementClass.Reset();
			elementClass = enumElementClass.Next();
			while (elementClass != null)
			{
				if (elementClass.Name == m_reductionLinkName) break;
				elementClass = enumElementClass.Next();
			}
			if (elementClass == null) return;

			// Get all link from selected class
			enumSchematicElement = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(elementClass);
			enumSchematicElement.Reset();

			ISchematicInMemoryFeatureLink link = null;
			ISchematicInMemoryFeatureNode fromNode = null;
			ISchematicInMemoryFeatureNode toNode = null;
			int iFromPort = 0;
			int iToPort = 0;
			ISchematicInMemoryFeature newElem = null;
			IEnumSchematicInMemoryFeatureLink enumIncidentLinks;
			ISchematicInMemoryFeatureLinkerEdit schemLinker = (ISchematicInMemoryFeatureLinkerEdit)(new SchematicLinkerClass());
			bool bReduction = false;

			schemElement = enumSchematicElement.Next();
			while (schemElement != null)
			{
				try
				{
					string elemName = allreadyUsed[schemElement.Name].ToString();
					// if found, this link is allready used
					schemElement = enumSchematicElement.Next();
					continue;
				}
				catch
				{
					// Add link to collection
					allreadyUsed.Add(schemElement.Name, schemElement.Name, null, null);
				}

				// Get from node and to node
				link = (ISchematicInMemoryFeatureLink)schemElement;
				fromNode = link.FromNode;
				toNode = link.ToNode;
				if (m_usePort)
				{
					iFromPort = link.FromPort;
					iToPort = link.ToPort;
				}
				// Get all links from this node
				enumIncidentLinks = fromNode.GetIncidentLinks(esriSchematicEndPointType.esriSchematicOriginOrExtremityNode);
				enumIncidentLinks.Reset();
				newElem = enumIncidentLinks.Next();
				while (newElem != null)
				{
					bReduction = false;
					if (newElem == schemElement)
					{
						// the new link is the same link we works on
						newElem = enumIncidentLinks.Next();
						continue;
					}
					link = (ISchematicInMemoryFeatureLink)newElem;

					// 1st case of comparison
					if (fromNode == link.FromNode && toNode == link.ToNode)
					{
						if (m_usePort)
							bReduction = (iFromPort == link.FromPort && iToPort == link.ToPort);
						else
							bReduction = true;
					}
					// 2nd case of comparison
					else if (fromNode == link.ToNode && toNode == link.FromNode)
					{
						if (m_usePort)
							bReduction = (iFromPort == link.ToPort && iToPort == link.FromPort);
						else
							bReduction = true;
					}

					if (bReduction)
					{
						try
						{
							schemLinker.ReportAssociations(newElem, schemElement); // Reports asssociation to first link
							allreadyUsed.Add(newElem.Name, newElem.Name, null, null);	// Add link to collection
							newElem.Displayed = false; // this link is not visible
						}
						catch { }
					}
					newElem = enumIncidentLinks.Next();
				}
				schemElement.Displayed = true;
				schemElement = enumSchematicElement.Next();
			}
		}

		public ESRI.ArcGIS.esriSystem.UID ClassID
		{
			get
			{
				esriSystem.UID ruleID = new esriSystem.UID();
				ruleID.Value = PROGID;
				return ruleID;
			}
		}

		public string Description
		{
			get
			{
				return m_description;
			}
			set
			{
				m_description = value;
			}
		}

		string ISchematicRule.Description
		{
			get { return m_description; }
		}

		public string Name
		{
			get
			{
				return "Reduction Link Rule C#";
			}
		}

		public ESRI.ArcGIS.esriSystem.IPropertySet PropertySet
		{
			get
			{
				esriSystem.IPropertySet propertySet = new esriSystem.PropertySet();

				propertySet.SetProperty("DESCRIPTION", m_description);
				propertySet.SetProperty("USEPORT", m_usePort);
				propertySet.SetProperty("REDUCTIONLINKNAME", m_reductionLinkName);

				return propertySet;
			}
		}

		ISchematicDiagramClass ISchematicRule.SchematicDiagramClass
		{
			get { return m_diagramClass; }
		}


		#endregion

		#region ISchematicRuleDesign Members

		public void Detach()
		{
			m_diagramClass = null;
		}

		ESRI.ArcGIS.esriSystem.IPropertySet ISchematicRuleDesign.PropertySet
		{
			set
			{
				m_description = value.GetProperty("DESCRIPTION").ToString();
				m_usePort = (bool)value.GetProperty("USEPORT");
				m_reductionLinkName = value.GetProperty("REDUCTIONLINKNAME").ToString();
			}
		}

		ISchematicDiagramClass ISchematicRuleDesign.SchematicDiagramClass
		{
			get
			{
				return m_diagramClass;
			}
			set
			{
				m_diagramClass = value;
			}
		}
		#endregion
	}
}

[Visual Basic .NET]

ReductionLinkRule.vb

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports ESRI.ArcGIS
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.Schematic
Imports esriSystem = ESRI.ArcGIS.esriSystem

<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
<System.Runtime.InteropServices.Guid(ReductionLinkRule.GUID)> _
<System.Runtime.InteropServices.ProgId(ReductionLinkRule.PROGID)> _
Public Class ReductionLinkRule
	Implements ESRI.ArcGIS.Schematic.ISchematicRule
	Implements ESRI.ArcGIS.Schematic.ISchematicRuleDesign

	Public Const GUID As String = "F18765AE-DDAA-464d-812D-EB9D9F544F5B"
	Public Const PROGID As String = "CustomRulesVB.ReductionLinkRule"

	' Register/unregister categories for this class
#Region "Component Category Registration"
	<System.Runtime.InteropServices.ComRegisterFunction()> _
	Shared Sub Register(ByVal CLSID As String)
		Try
			ESRI.ArcGIS.ADF.CATIDs.SchematicRules.Register(CLSID)
		Catch e As System.Exception
			System.Windows.Forms.MessageBox.Show(e.Message)
		End Try
	End Sub

	<System.Runtime.InteropServices.ComUnregisterFunction()> _
	Shared Sub Unregister(ByVal CLSID As String)
		ESRI.ArcGIS.ADF.CATIDs.SchematicRules.Unregister(CLSID)
	End Sub
#End Region

	Private m_diagramClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass
	Private m_reductionLinkName As String
	Private m_usePort As Boolean = False
	Private m_description As String = "Reduction Link Rule VBNet"

	Public Sub New()
	End Sub

	Protected Overrides Sub Finalize()
		m_diagramClass = Nothing
		MyBase.Finalize()
	End Sub

	Public Property ReductionLinkName() As String
		Get
			Return m_reductionLinkName
		End Get
		Set(ByVal value As String)
			m_reductionLinkName = value
		End Set
	End Property

	Public Property UsePort() As Boolean
		Get
			Return m_usePort
		End Get
		Set(ByVal value As Boolean)
			m_usePort = value
		End Set
	End Property

#Region "ISchematicRule Members"
	Public Sub Alter(ByVal schematicDiagramClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal propertySet As ESRI.ArcGIS.esriSystem.IPropertySet) Implements ESRI.ArcGIS.Schematic.ISchematicRule.Alter
		On Error Resume Next
		m_diagramClass = schematicDiagramClass

		m_description = propertySet.GetProperty("DESCRIPTION").ToString()
		m_reductionLinkName = propertySet.GetProperty("REDUCTIONLINKNAME").ToString()
		m_usePort = CType(propertySet.GetProperty("USEPORT"), Boolean)
	End Sub

	Public Sub Apply(ByVal inMemoryDiagram As ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram, Optional ByVal cancelTracker As ESRI.ArcGIS.esriSystem.ITrackCancel = Nothing) Implements ESRI.ArcGIS.Schematic.ISchematicRule.Apply

		If (m_reductionLinkName = "") Then Return

		Dim enumSchematicElement As IEnumSchematicInMemoryFeature
		Dim schemElement As ISchematicInMemoryFeature
		Dim diagramClass As ISchematicDiagramClass = Nothing
		Dim elementClass As ISchematicElementClass
		Dim enumElementClass As IEnumSchematicElementClass
		Dim allreadyUsed As Collection = New Microsoft.VisualBasic.Collection

		Try
			diagramClass = inMemoryDiagram.SchematicDiagramClass
		Catch
		End Try
		If (diagramClass Is Nothing) Then Return

		enumElementClass = diagramClass.AssociatedSchematicElementClasses
		enumElementClass.Reset()
		elementClass = enumElementClass.Next()
		While (elementClass IsNot Nothing)
			If (elementClass.Name = m_reductionLinkName) Then Exit While
			elementClass = enumElementClass.Next()
		End While

		If (elementClass Is Nothing) Then Return

		enumSchematicElement = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(elementClass)
		enumSchematicElement.Reset()

		Dim link As ISchematicInMemoryFeatureLink = Nothing
		Dim fromNode As ISchematicInMemoryFeatureNode = Nothing
		Dim toNode As ISchematicInMemoryFeatureNode = Nothing
		Dim fromPort As Integer = 0
		Dim toPort As Integer = 0
		Dim newElem As ISchematicInMemoryFeature = Nothing
		Dim enumIncidentLinks As IEnumSchematicInMemoryFeatureLink
		Dim schemLinker As ISchematicInMemoryFeatureLinkerEdit = CType(New SchematicLinkerClass(), ISchematicInMemoryFeatureLinkerEdit)
		Dim reduction As Boolean = False

		schemElement = enumSchematicElement.Next()
		While (schemElement IsNot Nothing)
			Try
				Dim elemName As String = allreadyUsed(schemElement.Name).ToString()
				' if found, this link is allready used
				schemElement = enumSchematicElement.Next()
				Continue While
			Catch
				' Add link to collection
				allreadyUsed.Add(schemElement.Name, schemElement.Name)
			End Try

			' Get from node and to node
			link = CType(schemElement, ISchematicInMemoryFeatureLink)

			fromNode = link.FromNode
			toNode = link.ToNode
			If (m_usePort) Then
				fromPort = link.FromPort
				toPort = link.ToPort
			End If

			' Get all links from this node
			enumIncidentLinks = fromNode.GetIncidentLinks(esriSchematicEndPointType.esriSchematicOriginOrExtremityNode)
			enumIncidentLinks.Reset()
			newElem = enumIncidentLinks.Next()
			While (newElem IsNot Nothing)
				reduction = False
				If newElem Is schemElement Then
					'  the new link is the same link we works on
					newElem = enumIncidentLinks.Next()
					Continue While
				End If
				link = CType(newElem, ISchematicInMemoryFeatureLink)

				' 1st case of comparison
				If (fromNode Is link.FromNode AndAlso toNode Is link.ToNode) Then
					If (m_usePort) Then
						reduction = (fromPort = link.FromPort AndAlso toPort = link.ToPort)
					Else
						reduction = True
					End If
					' 2nd case of comparison
				ElseIf (fromNode Is link.ToNode AndAlso toNode Is link.FromNode) Then
					If (m_usePort) Then
						reduction = (fromPort = link.ToPort AndAlso toPort = link.FromPort)
					Else
						reduction = True
					End If
				End If

				If (reduction) Then
					Try
						schemLinker.ReportAssociations(newElem, schemElement)	' Reports asssociation to first link
						allreadyUsed.Add(newElem.Name, newElem.Name) '  Add link to collection
						newElem.Displayed = False	' this link is not visible

					Catch
					End Try
				End If
				newElem = enumIncidentLinks.Next()

			End While
			schemElement.Displayed = True
			schemElement = enumSchematicElement.Next()
		End While
	End Sub

	Public ReadOnly Property ClassID() As ESRI.ArcGIS.esriSystem.UID Implements ESRI.ArcGIS.Schematic.ISchematicRule.ClassID
		Get

			Dim ruleID As esriSystem.UID = New esriSystem.UID()
			ruleID.Value = PROGID
			Return ruleID
		End Get
	End Property

	Public ReadOnly Property Description1() As String Implements ESRI.ArcGIS.Schematic.ISchematicRule.Description
		Get
			Return m_description
		End Get
	End Property

	Public Property Description() As String
		Get
			Return m_description
		End Get
		Set(ByVal value As String)
			m_description = value
		End Set
	End Property

	Public ReadOnly Property Name() As String Implements ESRI.ArcGIS.Schematic.ISchematicRule.Name
		Get
			Return "Reduction Link Rule VBNet"
		End Get
	End Property

	Public ReadOnly Property PropertySet() As ESRI.ArcGIS.esriSystem.IPropertySet Implements ESRI.ArcGIS.Schematic.ISchematicRule.PropertySet
		Get
			Dim propSet As esriSystem.IPropertySet = New esriSystem.PropertySet()

			propSet.SetProperty("DESCRIPTION", m_description)
			propSet.SetProperty("USEPORT", m_usePort)
			propSet.SetProperty("REDUCTIONLINKNAME", m_reductionLinkName)

			Return propSet
		End Get
	End Property

	Public ReadOnly Property SchematicDiagramClass() As ESRI.ArcGIS.Schematic.ISchematicDiagramClass Implements ESRI.ArcGIS.Schematic.ISchematicRule.SchematicDiagramClass
		Get
			Return m_diagramClass
		End Get
	End Property
#End Region

#Region "ISchematicRuleDesign Members"

	Public Sub Detach() Implements ESRI.ArcGIS.Schematic.ISchematicRuleDesign.Detach
		m_diagramClass = Nothing
	End Sub

	Public WriteOnly Property PropertySet1() As ESRI.ArcGIS.esriSystem.IPropertySet Implements ESRI.ArcGIS.Schematic.ISchematicRuleDesign.PropertySet
		Set(ByVal value As ESRI.ArcGIS.esriSystem.IPropertySet)
			m_description = value.GetProperty("DESCRIPTION").ToString
			m_usePort = CBool(value.GetProperty("USEPORT"))
			m_reductionLinkName = value.GetProperty("REDUCTIONLINKNAME").ToString
		End Set
	End Property

	Public Property SchematicDiagramClass1() As ESRI.ArcGIS.Schematic.ISchematicDiagramClass Implements ESRI.ArcGIS.Schematic.ISchematicRuleDesign.SchematicDiagramClass
		Get
			Return m_diagramClass
		End Get
		Set(ByVal value As ESRI.ArcGIS.Schematic.ISchematicDiagramClass)
			m_diagramClass = value
		End Set
	End Property
#End Region

End Class