About the Implementing a schematic rule and its property page Sample
[C#]
ReductionLinkPropertyPage.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;
namespace CustomRulesCS
{
[ClassInterface(ClassInterfaceType.None)]
[Guid(ReductionLinkPropertyPage.GUID)]
[ProgId(ReductionLinkPropertyPage.PROGID)]
public class ReductionLinkPropertyPage : 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 = "9D1CD5C2-AF73-4a70-B1DD-8B092601CFE8";
public const string PROGID = "CustomRulesCS.ReductionLinkPropertyPage";
private frmReductionLink m_form = new frmReductionLink(); // the custom form
private ReductionLinkRule m_mySchematicRule; // the custom rule
private string m_title = "Reduction Links Rule C#"; // the form title
private int m_priority = 0; // the IComPage priority
#region IComPropertyPage Membres
public int Activate()
{
// Create a new RemoveElementForm but do not show it
if (m_form == null) m_form = new frmReductionLink();
return (int)m_form.Handle;
}
public bool Applies(ISet objects)
{
Schematic.ISchematicRule mySchematicRule;
mySchematicRule = FindMyRule(objects);
return (mySchematicRule != null);
}
public void Apply()
{
try
{
m_mySchematicRule.Description = m_form.txtDescription.Text;
m_mySchematicRule.ReductionLinkName = m_form.cboReduce.SelectedItem.ToString();
m_mySchematicRule.UsePort = m_form.chkUsePort.Checked;
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_mySchematicRule = FindMyRule(objects);
}
public void Show()
{
try
{
if (m_form.cboReduce.Items.Count == 0)
{
Schematic.ISchematicDiagramClass diagramClass;
diagramClass = ((Schematic.ISchematicRule)m_mySchematicRule).SchematicDiagramClass;
if (diagramClass == null) return;
Schematic.ISchematicElementClass elementClass;
Schematic.IEnumSchematicElementClass enumElementClass;
enumElementClass = diagramClass.AssociatedSchematicElementClasses;
enumElementClass.Reset();
elementClass = enumElementClass.Next();
while (elementClass != null)
{
if (elementClass.SchematicElementType == Schematic.esriSchematicElementType.esriSchematicLinkType)
m_form.cboReduce.Items.Add(elementClass.Name);
elementClass = enumElementClass.Next();
}
}
m_form.cboReduce.Text = m_mySchematicRule.ReductionLinkName;
m_form.txtDescription.Text = m_mySchematicRule.Description;
m_form.chkUsePort.Checked = m_mySchematicRule.UsePort;
m_form.IsDirty = false;
m_form.Visible = true;
m_form.lblDescription.Visible = true;
m_form.lblReduce.Visible = true;
m_form.txtDescription.Visible = true;
m_form.cboReduce.Visible = true;
m_form.chkUsePort.Visible = true;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public string Title
{
get
{
return m_title;
}
set
{
m_title = value;
}
}
public int Width
{
get { return m_form.Width; }
}
#endregion
~ReductionLinkPropertyPage()
{
m_form = null;
m_mySchematicRule = null;
}
// Find and return this rule from the passed in objects
private ReductionLinkRule 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 ReductionLinkRule)
{
break;
}
obj = Objectset.Next();
}
return (ReductionLinkRule)obj;
}
}
}
[Visual Basic .NET]
ReductionLinkPropertyPage.vb
Imports ESRI.ArcGIS Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.ADF.CATIDs Imports Schematic = ESRI.ArcGIS.Schematic Imports ESRI.ArcGIS.Framework Imports System.Windows.Forms Imports ESRI.ArcGIS.esriSystem Imports System Imports System.Collections.Generic Imports System.Text <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _ <System.Runtime.InteropServices.Guid(ReductionLinkPropertyPage.GUID)> _ <System.Runtime.InteropServices.ProgId(ReductionLinkPropertyPage.PROGID)> _ Public Class ReductionLinkPropertyPage Implements ESRI.ArcGIS.Framework.IComPropertyPage Public Const GUID As String = "4E3C6551-8594-4c51-9B8B-075E745CC622" Public Const PROGID As String = "CustomRulesVB.ReductionLinkPropertyPage" ' 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 frmReductionLink = New frmReductionLink() ' the custom form Private m_mySchematicRule As ReductionLinkRule ' the custom rule Private m_title As String = "Reduction Links 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 frmReductionLink() 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_mySchematicRule.Description = m_Form.txtDescription.Text m_mySchematicRule.ReductionLinkName = m_Form.cboReduce.SelectedItem.ToString() m_mySchematicRule.UsePort = m_Form.chkUsePort.Checked 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_mySchematicRule = FindMyRule(objects) End Sub Public Sub Show() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Show Try If (m_Form.cboReduce.Items.Count = 0) Then Dim diagramClass As Schematic.ISchematicDiagramClass diagramClass = m_mySchematicRule.SchematicDiagramClass If (diagramClass Is Nothing) Then Return Dim elementClass As Schematic.ISchematicElementClass Dim enumElementClass As Schematic.IEnumSchematicElementClass enumElementClass = diagramClass.AssociatedSchematicElementClasses enumElementClass.Reset() elementClass = enumElementClass.Next() While (elementClass IsNot Nothing) If (elementClass.SchematicElementType = Schematic.esriSchematicElementType.esriSchematicLinkType) Then m_Form.cboReduce.Items.Add(elementClass.Name) End If elementClass = enumElementClass.Next() End While End If m_Form.cboReduce.Text = m_mySchematicRule.ReductionLinkName m_Form.txtDescription.Text = m_mySchematicRule.Description m_Form.chkUsePort.Checked = m_mySchematicRule.UsePort m_Form.IsDirty = False m_Form.Visible = True m_Form.lblDescription.Visible = True m_Form.lblReduce.Visible = True m_Form.txtDescription.Visible = True m_Form.cboReduce.Visible = True m_Form.chkUsePort.Visible = True Catch ex As Exception MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try 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_mySchematicRule = 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 ReductionLinkRule If (Objectset.Count = 0) Then Return Nothing Objectset.Reset() Dim obj As Object obj = Objectset.Next() While (obj IsNot Nothing) If (TypeOf (obj) Is ReductionLinkRule) Then Exit While obj = Objectset.Next() End While Return CType(obj, ReductionLinkRule) End Function End Class