ArcObjects Library Reference  

BisectorRulePropertyPage

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