About the Reducing schematic nodes and computing a cumulative attribute via a schematic rule Sample
[C#]
FrmNodeReductionRule.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using ESRI.ArcGIS.Framework; using Schematic = ESRI.ArcGIS.Schematic; using ESRI.ArcGIS.Geodatabase; namespace CustomRulesPageCS { public partial class FrmNodeReductionRule : Form { private bool m_isDirty = false; private IComPropertyPageSite m_pageSite; private Schematic.ISchematicDiagramClass m_diagramClass; public FrmNodeReductionRule() { InitializeComponent(); } ~FrmNodeReductionRule() { m_diagramClass = null; m_pageSite = null; } // For managing the IsDirty flag that specifies whether // or not controls in the custom form have been modified public bool IsDirty { get { return m_isDirty; } set { m_isDirty = value; } } //- For managing the related IComPropertyPageSite public IComPropertyPageSite PageSite { set { m_pageSite = value; } } private void Changed(object sender, System.EventArgs e) { // If the user changes something, mark the custom form; dirty and // enable the apply button on the page site via the PageChanged method m_isDirty = true; if (m_pageSite != null) { m_pageSite.PageChanged(); } } public Schematic.ISchematicDiagramClass DiagramClass { set { m_diagramClass = value; } } private Schematic.ISchematicElementClass GetElementClass(Schematic.IEnumSchematicElementClass enumElementClass, string linkCClassName) { enumElementClass.Reset(); Schematic.ISchematicElementClass elementClass = enumElementClass.Next(); while (elementClass != null) { if (elementClass.Name == linkCClassName) return elementClass; elementClass = enumElementClass.Next(); } return null; } private bool IsFieldNumeriqueAndEditable(string fieldName, Schematic.ISchematicElementClass elementClass) { ITable table = (ITable)elementClass; if (table == null) return false; int index = table.FindField(fieldName); if (index < 0) return false; esriFieldType fieldType = table.Fields.get_Field(index).Type; if ( ((fieldType == esriFieldType.esriFieldTypeDouble) || (fieldType == esriFieldType.esriFieldTypeInteger) || (fieldType == esriFieldType.esriFieldTypeSmallInteger)) && table.Fields.get_Field(index).Editable) return true; return false; } private void FillAttNames(object sender, EventArgs e) { // report to the propertysheet that the page is dirty m_isDirty = true; if (m_pageSite != null) { m_pageSite.PageChanged(); } string linkClassName = ""; if (cmbTargetSuperspanClass.SelectedItem != null) linkClassName = this.cmbTargetSuperspanClass.SelectedItem.ToString(); if (linkClassName == "" || m_diagramClass == null) { cmbAttributeName.Items.Clear(); return; } cmbAttributeName.Items.Clear(); Schematic.ISchematicElementClass elementClass; Schematic.IEnumSchematicElementClass enumElementClass; enumElementClass = m_diagramClass.AssociatedSchematicElementClasses; elementClass = GetElementClass(enumElementClass, linkClassName); if (elementClass == null) return; Schematic.ISchematicAttributeContainer attCont = (Schematic.ISchematicAttributeContainer)elementClass; if (attCont == null) return; Schematic.IEnumSchematicAttribute enumAtt = attCont.SchematicAttributes; if (enumAtt == null) return; enumAtt.Reset(); Schematic.ISchematicAttribute att = enumAtt.Next(); while (att != null) { try { Schematic.SchematicAttributeAssociatedField attField = (Schematic.SchematicAttributeAssociatedField)att; if (attField != null) { string fieldName = attField.Name; if (IsFieldNumeriqueAndEditable(fieldName, elementClass)) cmbAttributeName.Items.Add(fieldName); } } catch { } att = enumAtt.Next(); } } private void chkLinkAttribute_CheckedChanged(object sender, EventArgs e) { // report to the propertysheet that the page is dirty m_isDirty = true; if (m_pageSite != null) { m_pageSite.PageChanged(); } if (!chkLinkAttribute.Checked) txtLinkAttribute.Text = ""; } } }
[Visual Basic .NET]
FrmNodeReductionRule.vb
Imports ESRI.ArcGIS.Schematic Imports ESRI.ArcGIS.Geodatabase Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Drawing Imports System.Text Imports System.Windows.Forms Friend Class FrmNodeReductionRule Private m_isDirty As Boolean = False Private m_pageSite As ESRI.ArcGIS.Framework.IComPropertyPageSite Private m_diagramClass As ISchematicDiagramClass Public Sub New() InitializeComponent() End Sub Protected Overrides Sub Finalize() m_diagramClass = Nothing m_pageSite = Nothing MyBase.Finalize() End Sub ' For managing the IsDirty flag that specifies whether ' or not controls in the custom form have been modified Public Property IsDirty() As Boolean Get Return m_isDirty End Get Set(ByVal value As Boolean) m_isDirty = value End Set End Property '- For managing the related IComPropertyPageSite Public WriteOnly Property PageSite() As ESRI.ArcGIS.Framework.IComPropertyPageSite Set(ByVal value As ESRI.ArcGIS.Framework.IComPropertyPageSite) m_pageSite = value End Set End Property Private Sub Changed(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtDescription.TextChanged, chkKeepVertices.CheckStateChanged, cmbReducedNodeClass.SelectedIndexChanged, cmbReducedNodeClass.Click, txtLinkAttribute.TextChanged, txtLinkAttribute.Click ' If the user changes something, mark the custom form dirty and ' enable the apply button on the page site via the PageChanged method m_isDirty = True If (m_pageSite IsNot Nothing) Then m_pageSite.PageChanged() End Sub Public WriteOnly Property DiagramClass As ISchematicDiagramClass Set(ByVal value As ISchematicDiagramClass) m_diagramClass = value End Set End Property Private Function GetElementClass(ByRef enumElementClass As IEnumSchematicElementClass, ByRef linkClassName As String) As ISchematicElementClass enumElementClass.Reset() Dim elementClass As ISchematicElementClass = enumElementClass.Next() Do While (elementClass IsNot Nothing) If (elementClass.Name = linkClassName) Then Return elementClass elementClass = enumElementClass.Next() Loop Return Nothing End Function Private Function IsFieldNumericAndEditable(ByRef fieldName As String, ByRef elementClass As ISchematicElementClass) As Boolean Dim table As ITable = CType(elementClass, ITable) If (table Is Nothing) Then Return False Dim index As Integer = table.FindField(fieldName) If (index < 0) Then Return False Dim FieldType As esriFieldType = table.Fields.Field(index).Type If ((FieldType = esriFieldType.esriFieldTypeDouble Or FieldType = esriFieldType.esriFieldTypeInteger Or FieldType = esriFieldType.esriFieldTypeSmallInteger) And (table.Fields.Field(index).Editable)) Then Return True Return False End Function Private Sub FillAttNames(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbTargetSuperspanClass.SelectedIndexChanged, cmbTargetSuperspanClass.Click m_isDirty = True If (m_pageSite IsNot Nothing) Then m_pageSite.PageChanged() Dim linkClassName As String = "" If (cmbTargetSuperspanClass.SelectedItem IsNot Nothing) Then linkClassName = cmbTargetSuperspanClass.SelectedItem.ToString() End If If (linkClassName = "" Or m_diagramClass Is Nothing) Then cmbAttributeName.Items.Clear() Return End If cmbAttributeName.Items.Clear() Dim elementClass As ISchematicElementClass Dim enumElementClass As IEnumSchematicElementClass = m_diagramClass.AssociatedSchematicElementClasses elementClass = GetElementClass(enumElementClass, linkClassName) If (elementClass Is Nothing) Then Return Dim attCont As ISchematicAttributeContainer = CType(elementClass, ISchematicAttributeContainer) If (attCont Is Nothing) Then Return Dim enumAtt As IEnumSchematicAttribute = attCont.SchematicAttributes If (enumAtt Is Nothing) Then Return enumAtt.Reset() Dim att As ISchematicAttribute = enumAtt.Next() Do While (att IsNot Nothing) Try Dim attField As SchematicAttributeAssociatedField = CType(att, ISchematicAttributeAssociatedField) If (attField IsNot Nothing) Then Dim fieldName As String = attField.Name If (IsFieldNumericAndEditable(fieldName, elementClass)) Then cmbAttributeName.Items.Add(fieldName) End If End If Catch ex As Exception End Try att = enumAtt.Next() Loop End Sub Private Sub chkAttribute_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkLinkAttribute.CheckStateChanged m_isDirty = True If (m_pageSite IsNot Nothing) Then m_pageSite.PageChanged() If (Not chkLinkAttribute.Checked) Then txtLinkAttribute.Text = "" End If End Sub End Class