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