About the Reducing schematic nodes and computing a cumulative attribute via a schematic rule Sample
[C#]
NodeReductionRulePropertyPage.cs
using ESRI.ArcGIS; using ESRI.ArcGIS.ADF.CATIDs; using Schematic = ESRI.ArcGIS.Schematic; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.esriSystem; using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Windows.Forms; using CustomRulesCS; namespace CustomRulesPageCS { [ClassInterface(ClassInterfaceType.None)] [Guid(NodeReductionRulePropertyPage.GUID)] [ProgId(NodeReductionRulePropertyPage.PROGID)] public class NodeReductionRulePropertyPage : 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 = "F58F5916-3A99-49CF-9A7D-5EB97E7618FD"; public const string PROGID = "CustomRulesPageCS.NodeReductionRulePropertyPage"; private FrmNodeReductionRule m_form = new FrmNodeReductionRule(); // the custom form private NodeReductionRule m_myNodeReductionRule; // the custom rule private string m_title = "Node Reduction 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 FrmNodeReductionRule(); return (int)m_form.Handle; } public bool Applies(ISet objects) { Schematic.ISchematicRule mySchematicRule; mySchematicRule = FindMyRule(objects); return (mySchematicRule != null); } public void Apply() { try { m_myNodeReductionRule.Description = m_form.TxtDescription.Text; } catch { } try { m_myNodeReductionRule.ReducedNodeClassName = m_form.cmbReducedNodeClass.SelectedItem.ToString(); } catch { } try { m_myNodeReductionRule.SuperpanLinkClassName = m_form.cmbTargetSuperspanClass.SelectedItem.ToString(); } catch { } try { m_myNodeReductionRule.KeepVertices = m_form.chkKeepVertices.Checked; } catch { } try { m_myNodeReductionRule.LengthAttributeName = m_form.cmbAttributeName.SelectedItem.ToString(); } catch { } try { m_myNodeReductionRule.LinkAttribute = m_form.chkLinkAttribute.Checked; } catch { } try { m_myNodeReductionRule.LinkAttributeName = m_form.txtLinkAttribute.Text; } catch { } m_form.IsDirty = false; } public void Cancel() { m_form.IsDirty = false; } public void Deactivate() { m_form.DiagramClass = null; 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_myNodeReductionRule = FindMyRule(objects); } public void Show() { Schematic.ISchematicDiagramClass diagramClass; diagramClass = ((Schematic.ISchematicRule)m_myNodeReductionRule).SchematicDiagramClass; if (diagramClass == null) return; m_form.DiagramClass = diagramClass; Schematic.ISchematicElementClass elementClass; Schematic.IEnumSchematicElementClass enumElementClass; enumElementClass = diagramClass.AssociatedSchematicElementClasses; m_form.cmbReducedNodeClass.Items.Clear(); m_form.cmbTargetSuperspanClass.Items.Clear(); m_form.cmbAttributeName.Items.Clear(); try { enumElementClass.Reset(); elementClass = enumElementClass.Next(); while (elementClass != null) { if (elementClass.SchematicElementType == ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType) m_form.cmbReducedNodeClass.Items.Add(elementClass.Name); else if (elementClass.SchematicElementType == ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicLinkType) { m_form.cmbTargetSuperspanClass.Items.Add(elementClass.Name); } elementClass = enumElementClass.Next(); } m_form.cmbAttributeName.Text = m_myNodeReductionRule.LengthAttributeName; m_form.TxtDescription.Text = m_myNodeReductionRule.Description; m_form.cmbReducedNodeClass.Text = m_myNodeReductionRule.ReducedNodeClassName; m_form.cmbTargetSuperspanClass.Text = m_myNodeReductionRule.SuperpanLinkClassName; m_form.chkKeepVertices.Checked = m_myNodeReductionRule.KeepVertices; m_form.chkLinkAttribute.Checked = m_myNodeReductionRule.LinkAttribute; m_form.txtLinkAttribute.Text = m_myNodeReductionRule.LinkAttributeName; 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.lblReducedNode.Visible = true; m_form.lblTargetSuperspan.Visible = true; m_form.lblAttributeName.Visible = true; m_form.cmbReducedNodeClass.Visible = true; m_form.cmbTargetSuperspanClass.Visible = true; m_form.chkKeepVertices.Visible = true; m_form.chkLinkAttribute.Visible = true; m_form.txtLinkAttribute.Visible = true; } public string Title { get { return m_title; } set { m_title = value; } } public int Width { get { return m_form.Width; } } #endregion ~NodeReductionRulePropertyPage() { m_form.DiagramClass = null; m_form = null; m_myNodeReductionRule = null; } // Find and return this rule from the passed in objects private NodeReductionRule 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 CustomRulesCS.NodeReductionRule) { break; } obj = Objectset.Next(); } return (NodeReductionRule)obj; } } }
[Visual Basic .NET]
NodeReductionRulePropertyPage.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 Imports System.Runtime.InteropServices Imports System.Collections.Generic Imports System.Windows.Forms Imports CustomRulesVB <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _ <System.Runtime.InteropServices.Guid(NodeReductionRulePropertyPage.GUID)> _ <System.Runtime.InteropServices.ProgId(NodeReductionRulePropertyPage.PROGID)> _ Public Class NodeReductionRulePropertyPage Implements ESRI.ArcGIS.Framework.IComPropertyPage Public Const GUID As String = "4B018649-6916-4713-A2C0-F5D2E81A86DE" Public Const PROGID As String = "CustomRulesPageVB.NodeReductionRulePropertyPage" ' 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 FrmNodeReductionRule = New FrmNodeReductionRule() ' the custom form Private m_myNodeReductionRule As NodeReductionRule ' the custom rule Private m_title As String = "Node Reduction 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 FrmNodeReductionRule() 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_myNodeReductionRule.Description = m_Form.TxtDescription.Text Catch End Try Try m_myNodeReductionRule.LengthAttributeName = m_Form.cmbAttributeName.SelectedItem.ToString() Catch End Try Try m_myNodeReductionRule.ReducedNodeClassName = m_Form.cmbReducedNodeClass.SelectedItem.ToString() Catch End Try Try m_myNodeReductionRule.SuperpanLinkClassName = m_Form.cmbTargetSuperspanClass.SelectedItem.ToString() Catch End Try Try m_myNodeReductionRule.KeepVertices = m_Form.chkKeepVertices.Checked Catch End Try Try m_myNodeReductionRule.LinkAttribute = m_Form.chkLinkAttribute.Checked Catch End Try Try m_myNodeReductionRule.LinkAttributeName = m_Form.txtLinkAttribute.Text Catch End Try m_Form.IsDirty = True 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.DiagramClass = Nothing 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_myNodeReductionRule = FindMyRule(objects) End Sub Public Sub Show() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Show Dim diagramClass As Schematic.ISchematicDiagramClass diagramClass = CType(m_myNodeReductionRule, Schematic.ISchematicRule).SchematicDiagramClass If (diagramClass Is Nothing) Then Return m_Form.DiagramClass = diagramClass Dim elementClass As Schematic.ISchematicElementClass Dim enumElementClass As Schematic.IEnumSchematicElementClass enumElementClass = diagramClass.AssociatedSchematicElementClasses m_Form.cmbReducedNodeClass.Items.Clear() m_Form.cmbTargetSuperspanClass.Items.Clear() m_Form.cmbAttributeName.Items.Clear() Try enumElementClass.Reset() elementClass = enumElementClass.Next() While (elementClass IsNot Nothing) If (elementClass.SchematicElementType = ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType) Then m_Form.cmbReducedNodeClass.Items.Add(elementClass.Name) ElseIf (elementClass.SchematicElementType = ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicLinkType) Then m_Form.cmbTargetSuperspanClass.Items.Add(elementClass.Name) End If elementClass = enumElementClass.Next() End While m_Form.cmbAttributeName.Text = m_myNodeReductionRule.LengthAttributeName m_Form.TxtDescription.Text = m_myNodeReductionRule.Description m_Form.cmbReducedNodeClass.Text = m_myNodeReductionRule.ReducedNodeClassName m_Form.cmbTargetSuperspanClass.Text = m_myNodeReductionRule.SuperpanLinkClassName m_Form.chkKeepVertices.Checked = m_myNodeReductionRule.KeepVertices m_Form.chkLinkAttribute.Checked = m_myNodeReductionRule.LinkAttribute m_Form.txtLinkAttribute.Text = m_myNodeReductionRule.LinkAttributeName m_Form.IsDirty = False SetVisibleControls() Catch ex As Exception MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End Sub Private Sub SetVisibleControls() m_Form.Visible = True m_Form.lblDescription.Visible = True m_Form.lblGroup.Visible = True m_Form.lblReducedNode.Visible = True m_Form.lblTargetSuperspan.Visible = True m_Form.lblAttributeName.Visible = True m_Form.cmbReducedNodeClass.Visible = True m_Form.cmbTargetSuperspanClass.Visible = True m_Form.chkKeepVertices.Visible = True m_Form.txtLinkAttribute.Visible = True m_Form.chkLinkAttribute.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.DiagramClass = Nothing m_Form = Nothing m_myNodeReductionRule = 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 NodeReductionRule If (Objectset.Count = 0) Then Return Nothing Objectset.Reset() Dim obj As Object obj = Objectset.Next() While (obj IsNot Nothing) If (TypeOf (obj) Is NodeReductionRule) Then Exit While obj = Objectset.Next() End While Return CType(obj, NodeReductionRule) End Function End Class