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