About the Implementing the ISchematicRulesHelper to easily develop a custom schematic rule Sample
[C#]
BisectorRulePropertyPage.cs
using ESRI.ArcGIS;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.CATIDs;
using Schematic = ESRI.ArcGIS.Schematic;
using ESRI.ArcGIS.Framework;
using System.Windows.Forms;
using ESRI.ArcGIS.esriSystem;
using System;
using System.Collections.Generic;
using System.Text;
using CustomRulesCS;
namespace CustomRulesPageCS
{
[ClassInterface(ClassInterfaceType.None)]
[Guid(BisectorRulePropertyPage.GUID)]
[ProgId(BisectorRulePropertyPage.PROGID)]
public class BisectorRulePropertyPage : IComPropertyPage
{
// Register/unregister categories for this class
#region "Component Category Registration"
[System.Runtime.InteropServices.ComRegisterFunction()]
public static void Register(string CLSID)
{
SchematicRulePropertyPages.Register(CLSID);
}
[System.Runtime.InteropServices.ComUnregisterFunction()]
public static void Unregister(string CLSID)
{
SchematicRulePropertyPages.Unregister(CLSID);
}
#endregion
public const string GUID = "227ED86B-CFEB-4f9a-8237-2DC698B430EF";
public const string PROGID = "CustomRulesPageCS.BisectorRulePropertyPage";
private FrmBisectorRule m_form = new FrmBisectorRule(); // the custom form
private BisectorRule m_myBisectorRule; // the custom rule
private string m_title = "Bisector Rule C#"; // the form title
private int m_priority = 0; // the IComPage priority
#region IComPropertyPage Membres
public int Activate()
{
if (m_form == null) m_form = new FrmBisectorRule();
return (int)m_form.Handle;
}
public bool Applies(ISet objects)
{
Schematic.ISchematicRule mySchematicRule;
mySchematicRule = FindMyRule(objects);
return (mySchematicRule != null);
}
public void Apply()
{
try
{
m_myBisectorRule.Description = m_form.TxtDescription.Text;
m_myBisectorRule.distance = Convert.ToDouble(m_form.txtDistance.Text);
m_myBisectorRule.parentNodeClassName = m_form.cmbParentNodeClass.SelectedItem.ToString();
m_myBisectorRule.targetNodeClassName = m_form.cmbTargetNodeClass.SelectedItem.ToString();
m_myBisectorRule.targetLinkClassName = m_form.cmbTargetLinkClass.SelectedItem.ToString();
m_form.IsDirty = false;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Unable to initialize rule properties", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public void Cancel()
{
m_form.IsDirty = false;
}
public void Deactivate()
{
m_form.Close();
}
public int Height
{
get { return m_form.Height; }
}
public int get_HelpContextID(int controlID)
{
// TODO: return context ID if desired
return 0;
}
public string HelpFile
{
get { return ""; }
}
public void Hide()
{
m_form.Hide();
}
public bool IsPageDirty
{
get { return m_form.IsDirty; }
}
public IComPropertyPageSite PageSite
{
set { m_form.PageSite = value; }
}
public int Priority
{
get
{
return m_priority;
}
set
{
m_priority = value;
}
}
public void SetObjects(ISet objects)
{
// Search for the custom rule object instance
m_myBisectorRule = FindMyRule(objects);
}
public void Show()
{
Schematic.ISchematicDiagramClass diagramClass;
diagramClass = ((Schematic.ISchematicRule)m_myBisectorRule).SchematicDiagramClass;
if (diagramClass == null) return;
Schematic.ISchematicElementClass elementClass;
Schematic.IEnumSchematicElementClass enumElementClass;
enumElementClass = diagramClass.AssociatedSchematicElementClasses;
try
{
if (m_form.cmbParentNodeClass.Items.Count == 0)
{
enumElementClass.Reset();
elementClass = enumElementClass.Next();
while (elementClass != null)
{
if (elementClass.SchematicElementType == ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType)
m_form.cmbParentNodeClass.Items.Add(elementClass.Name);
elementClass = enumElementClass.Next();
}
}
if (m_form.cmbTargetNodeClass.Items.Count == 0)
{
enumElementClass.Reset();
elementClass = enumElementClass.Next();
while (elementClass != null)
{
if (elementClass.SchematicElementType == Schematic.esriSchematicElementType.esriSchematicNodeType)
m_form.cmbTargetNodeClass.Items.Add(elementClass.Name);
elementClass = enumElementClass.Next();
}
}
if (m_form.cmbTargetLinkClass.Items.Count == 0)
{
enumElementClass.Reset();
elementClass = enumElementClass.Next();
while (elementClass != null)
{
if (elementClass.SchematicElementType == Schematic.esriSchematicElementType.esriSchematicLinkType)
m_form.cmbTargetLinkClass.Items.Add(elementClass.Name);
elementClass = enumElementClass.Next();
}
}
m_form.txtDistance.Text = m_myBisectorRule.distance.ToString();
m_form.TxtDescription.Text = m_myBisectorRule.Description;
m_form.cmbParentNodeClass.Text = m_myBisectorRule.parentNodeClassName;
m_form.cmbTargetNodeClass.Text = m_myBisectorRule.targetNodeClassName;
m_form.cmbTargetLinkClass.Text = m_myBisectorRule.targetLinkClassName;
m_form.IsDirty = false;
SetVisibleControls();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void SetVisibleControls()
{
m_form.Visible = true;
m_form.lblDescription.Visible = true;
m_form.lblGroup.Visible = true;
m_form.lblParentNode.Visible = true;
m_form.lblTargetNode.Visible = true;
m_form.lblTargetLink.Visible = true;
m_form.lblDistance.Visible = true;
m_form.cmbParentNodeClass.Visible = true;
m_form.cmbTargetNodeClass.Visible = true;
m_form.cmbTargetLinkClass.Visible = true;
}
public string Title
{
get
{
return m_title;
}
set
{
m_title = value;
}
}
public int Width
{
get { return m_form.Width; }
}
#endregion
~BisectorRulePropertyPage()
{
m_form = null;
m_myBisectorRule = null;
}
// Find and return this rule from the passed in objects
private BisectorRule FindMyRule(ESRI.ArcGIS.esriSystem.ISet Objectset)
{
if (Objectset.Count == 0)
return null;
Objectset.Reset();
object obj;
obj = Objectset.Next();
while (obj != null)
{
if (obj is BisectorRule)
{
break;
}
obj = Objectset.Next();
}
return (BisectorRule)obj;
}
}
}
[Visual Basic .NET]
BisectorRulePropertyPage.vb
Option Strict On
Imports ESRI.ArcGIS
Imports ESRI.ArcGIS.ADF.CATIDs
Imports Schematic = ESRI.ArcGIS.Schematic
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.esriSystem
Imports System.Windows.Forms
Imports System
Imports System.Runtime.InteropServices
Imports System.Collections.Generic
Imports CustomRulesVB
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
<System.Runtime.InteropServices.Guid(BisectorRulePropertyPage.GUID)> _
<System.Runtime.InteropServices.ProgId(BisectorRulePropertyPage.PROGID)> _
Public Class BisectorRulePropertyPage
Implements ESRI.ArcGIS.Framework.IComPropertyPage
Public Const GUID As String = "2987D6CB-2B85-4f20-BA50-785224AB2528"
Public Const PROGID As String = "CustomRulesPageVB.BisectorRulePropertyPage"
' Register/unregister categories for this class
#Region "Component Category Registration"
<System.Runtime.InteropServices.ComRegisterFunction()> _
Shared Sub Register(ByVal CLSID As String)
SchematicRulePropertyPages.Register(CLSID)
End Sub
<System.Runtime.InteropServices.ComUnregisterFunction()> _
Shared Sub Unregister(ByVal CLSID As String)
SchematicRulePropertyPages.Unregister(CLSID)
End Sub
#End Region
Private m_Form As FrmBisectorRule = New FrmBisectorRule() ' the custom form
Private m_myBisectorRule As BisectorRule ' the custom rule
Private m_title As String = "Bisector Rule VBNet" ' the form title
Private m_priority As Integer = 0 ' the IComPage priority
#Region "IComPropertyPage Members"
Public Function Activate() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Activate
' Create a new RemoveElementForm but do not show it
If m_Form Is Nothing Then m_Form = New FrmBisectorRule()
Return m_Form.Handle.ToInt32
End Function
Public Function Applies(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) As Boolean Implements ESRI.ArcGIS.Framework.IComPropertyPage.Applies
Dim mySchematicRule As Schematic.ISchematicRule
mySchematicRule = FindMyRule(objects)
Return (mySchematicRule IsNot Nothing)
End Function
Public Sub Apply() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Apply
Try
m_myBisectorRule.Description = m_Form.TxtDescription.Text
m_myBisectorRule.Distance = CDbl(m_Form.txtDistance.Text)
m_myBisectorRule.parentNodeClassName = m_Form.cmbParentNodeClass.SelectedItem.ToString()
m_myBisectorRule.targetNodeClassName = m_Form.cmbTargetNodeClass.SelectedItem.ToString()
m_myBisectorRule.targetLinkClassName = m_Form.cmbTargetLinkClass.SelectedItem.ToString()
m_Form.IsDirty = True
Catch ex As Exception
MessageBox.Show(ex.Message, "Unable to initialize rule properties", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
Public Sub Cancel() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Cancel
m_Form.IsDirty = False
End Sub
Public Sub Deactivate() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Deactivate
m_Form.Close()
End Sub
Public ReadOnly Property Height() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Height
Get
Return m_Form.Height
End Get
End Property
Public ReadOnly Property HelpContextID(ByVal controlID As Integer) As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.HelpContextID
Get
' TODO: return context ID if desired
Return 0
End Get
End Property
Public ReadOnly Property HelpFile() As String Implements ESRI.ArcGIS.Framework.IComPropertyPage.HelpFile
Get
Return ""
End Get
End Property
Public Sub Hide() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Hide
m_Form.Hide()
End Sub
Public ReadOnly Property IsPageDirty() As Boolean Implements ESRI.ArcGIS.Framework.IComPropertyPage.IsPageDirty
Get
Return m_Form.IsDirty
End Get
End Property
Public WriteOnly Property PageSite() As ESRI.ArcGIS.Framework.IComPropertyPageSite Implements ESRI.ArcGIS.Framework.IComPropertyPage.PageSite
Set(ByVal value As ESRI.ArcGIS.Framework.IComPropertyPageSite)
m_Form.PageSite = value
End Set
End Property
Public Property Priority() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Priority
Get
Return m_priority
End Get
Set(ByVal value As Integer)
m_priority = value
End Set
End Property
Public Sub SetObjects(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) Implements ESRI.ArcGIS.Framework.IComPropertyPage.SetObjects
' Search for the custom rule object instance
m_myBisectorRule = FindMyRule(objects)
End Sub
Public Sub Show() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Show
Try
Dim diagramClass As Schematic.ISchematicDiagramClass
diagramClass = CType(m_myBisectorRule, Schematic.ISchematicRule).SchematicDiagramClass
If (diagramClass Is Nothing) Then Return
Dim elementClass As Schematic.ISchematicElementClass
Dim enumElementClass As Schematic.IEnumSchematicElementClass
enumElementClass = diagramClass.AssociatedSchematicElementClasses
If (m_Form.cmbParentNodeClass.Items.Count = 0) Then
enumElementClass.Reset()
elementClass = enumElementClass.Next()
While (elementClass IsNot Nothing)
If (elementClass.SchematicElementType = ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType) Then
m_Form.cmbParentNodeClass.Items.Add(elementClass.Name)
End If
elementClass = enumElementClass.Next()
End While
End If
If (m_Form.cmbTargetNodeClass.Items.Count = 0) Then
enumElementClass.Reset()
elementClass = enumElementClass.Next()
While (elementClass IsNot Nothing)
If (elementClass.SchematicElementType = ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType) Then
m_Form.cmbTargetNodeClass.Items.Add(elementClass.Name)
End If
elementClass = enumElementClass.Next()
End While
End If
If (m_Form.cmbTargetLinkClass.Items.Count = 0) Then
enumElementClass.Reset()
elementClass = enumElementClass.Next()
While (elementClass IsNot Nothing)
If (elementClass.SchematicElementType = ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicLinkType) Then
m_Form.cmbTargetLinkClass.Items.Add(elementClass.Name)
End If
elementClass = enumElementClass.Next()
End While
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
m_Form.txtDistance.Text = m_myBisectorRule.Distance.ToString()
m_Form.TxtDescription.Text = m_myBisectorRule.Description
m_Form.cmbParentNodeClass.Text = m_myBisectorRule.parentNodeClassName
m_Form.cmbTargetNodeClass.Text = m_myBisectorRule.targetNodeClassName
m_Form.cmbTargetLinkClass.Text = m_myBisectorRule.targetLinkClassName
m_Form.IsDirty = False
SetVisibleControls()
End Sub
Private Sub SetVisibleControls()
m_Form.Visible = True
m_Form.lblDescription.Visible = True
m_Form.lblGroup.Visible = True
m_Form.lblParentNode.Visible = True
m_Form.lblTargetNode.Visible = True
m_Form.lblTargetLink.Visible = True
m_Form.lblDistance.Visible = True
m_Form.cmbParentNodeClass.Visible = True
m_Form.cmbTargetNodeClass.Visible = True
m_Form.cmbTargetLinkClass.Visible = True
End Sub
Public Property Title() As String Implements ESRI.ArcGIS.Framework.IComPropertyPage.Title
Get
Return m_title
End Get
Set(ByVal value As String)
m_title = value
End Set
End Property
Public ReadOnly Property Width() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Width
Get
Return m_Form.Width
End Get
End Property
#End Region
Protected Overrides Sub Finalize()
m_Form = Nothing
m_myBisectorRule = Nothing
MyBase.Finalize()
End Sub
' Find and return this rule from the passed in objects
Private Function FindMyRule(ByVal Objectset As ESRI.ArcGIS.esriSystem.ISet) As BisectorRule
If (Objectset.Count = 0) Then Return Nothing
Objectset.Reset()
Dim obj As Object
obj = Objectset.Next()
While (obj IsNot Nothing)
If (TypeOf (obj) Is BisectorRule) Then Exit While
obj = Objectset.Next()
End While
Return CType(obj, BisectorRule)
End Function
End Class