About the Implementing associations between GIS features and schematic features Sample
[C#]
ElementFeatureAssociation.cs
using ESRI.ArcGIS.Schematic; using ESRI.ArcGIS.Geodatabase; namespace LinkerManagerCS { public class ElementFeatureAssociation : ESRI.ArcGIS.Desktop.AddIns.Extension { private SchematicDatasetManager m_schemDatasetMgr; // Attribute names that specified the ClassName and OBJECTID of the feature related to each schematic element private const string AttClassNameName = "RelatedFeatureCN"; private const string AttObjectIdName = "RelatedFeatureOID"; protected override void OnStartup() { m_schemDatasetMgr = new SchematicDatasetManager(); m_schemDatasetMgr.AfterLoadDiagram += new ISchematicDatasetEvents_AfterLoadDiagramEventHandler(OnAfterLoadDiagram); m_schemDatasetMgr.AfterRefreshDiagram += new ISchematicDatasetEvents_AfterRefreshDiagramEventHandler(OnAfterRefreshDiagram); } protected override void OnShutdown() { m_schemDatasetMgr.AfterRefreshDiagram -= OnAfterRefreshDiagram; m_schemDatasetMgr.AfterLoadDiagram -= OnAfterLoadDiagram; m_schemDatasetMgr = null; base.OnShutdown(); } public void OnAfterLoadDiagram(ISchematicInMemoryDiagram inMemoryDiagram) { // if add-in is not enabled then quit if (State != ESRI.ArcGIS.Desktop.AddIns.ExtensionState.Enabled) return; IEnumSchematicInMemoryFeature enumSchemElements; ISchematicInMemoryFeature schemElement; string nameRelatedCN = ""; int numRelatedOID = 0; IFeatureClass esriFeatureClass; IFeature esriFeature; ISchematicInMemoryFeatureLinkerEdit schemFeatureLinkerEdit = (ISchematicInMemoryFeatureLinkerEdit)new SchematicLinker(); ISchematicObjectClass myObjectType; ISchematicAttribute schemAttributeCID; ISchematicAttribute schemAttributeOID; ISchematicAttributeContainer schemAttributeContainer; IWorkspace esriWorkspace; Microsoft.VisualBasic.Collection colFCByName; colFCByName = new Microsoft.VisualBasic.Collection(); esriWorkspace = inMemoryDiagram.SchematicDiagramClass.SchematicDataset.SchematicWorkspace.Workspace; // Retrieve all schematic element of the diagram enumSchemElements = (IEnumSchematicInMemoryFeature)inMemoryDiagram.SchematicInMemoryFeatures; enumSchemElements.Reset(); schemElement = enumSchemElements.Next(); while (schemElement != null) { // retrieve attribute myObjectType = schemElement.SchematicElementClass; schemAttributeContainer = (ISchematicAttributeContainer)schemElement.SchematicElementClass; schemAttributeCID = schemAttributeContainer.GetSchematicAttribute(AttClassNameName, false); schemAttributeOID = schemAttributeContainer.GetSchematicAttribute(AttObjectIdName, false); if (schemAttributeCID != null && schemAttributeOID != null) { // get value of attribute nameRelatedCN = schemAttributeCID.GetValue((ISchematicObject)schemElement).ToString(); numRelatedOID = System.Convert.ToInt32(schemAttributeOID.GetValue((ISchematicObject)schemElement)); // get feature from geodatabase esriFeatureClass = FindFeatureClassByName(esriWorkspace, nameRelatedCN, colFCByName); if (esriFeatureClass != null) { // get feature from FeatureClass esriFeature = esriFeatureClass.GetFeature(numRelatedOID); if (esriFeature != null) { // Associate geographical feature with schematic feature schemFeatureLinkerEdit.Associate(schemElement, esriFeature); } } } schemElement = enumSchemElements.Next(); } colFCByName.Clear(); colFCByName = null; } public void OnAfterRefreshDiagram(ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram InMemoryDiagram) { OnAfterLoadDiagram(InMemoryDiagram); } private IFeatureClass FindFeatureClassByName(IWorkspace workspace, string name, Microsoft.VisualBasic.Collection colFCByName) { IFeatureClass esriFeatureClass = null; try { // try to retrieve FeatureClass in collection esriFeatureClass = (IFeatureClass)colFCByName[name]; return esriFeatureClass; } catch { } IEnumDataset enumDatasets; IDataset esriDataset; IFeatureClassContainer featContainer; // get datasets enumDatasets = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); enumDatasets.Reset(); esriDataset = enumDatasets.Next(); while (esriDataset != null) { // try to find class in dataset try { featContainer = (IFeatureClassContainer)esriDataset; // get FeatureClass from current dataset esriFeatureClass = featContainer.get_ClassByName(name); if (esriFeatureClass != null) { // if exists add to collection and quit colFCByName.Add(esriFeatureClass, name, null, null); return esriFeatureClass; } } catch { } // try another dataset esriDataset = enumDatasets.Next(); } try { // try to find FeatureClass in workspace featContainer = (IFeatureClassContainer)workspace; esriFeatureClass = featContainer.get_ClassByName(name); if (esriFeatureClass != null) { // if exists add to collection and quit colFCByName.Add(esriFeatureClass, name, null, null); return esriFeatureClass; } } catch { } return null; } } }
[Visual Basic .NET]
ElementFeatureAssociation.vb
Imports ESRI.ArcGIS.Schematic Imports ESRI.ArcGIS.Geodatabase Public Class ElementFeatureAssociation Inherits ESRI.ArcGIS.Desktop.AddIns.Extension 'The OnAfterLoadDiagram procedure is used to specify the associations 'between schematic elements and features. 'The diagram contains schematic elements for which particular attributes have been created. 'These attributes specify the ClassID and the ObjectID the schematic element is related to. 'The ISchematicInMemoryFeatureLinkerEdit Associate method is used to specify 'that a schematic element is associated with a feature. Private m_schemDatasetMgr As SchematicDatasetManager ' Attribute names that specified the ClassName and OBJECTID of the feature related to each schematic element Private Const AttClassNameName As String = "RelatedFeatureCN" Private Const AttObjectIdName As String = "RelatedFeatureOID" Protected Overrides Sub OnStartup() m_schemDatasetMgr = New SchematicDatasetManager AddHandler m_schemDatasetMgr.AfterLoadDiagram, AddressOf OnAfterLoadDiagram End Sub Protected Overrides Sub OnShutdown() RemoveHandler m_schemDatasetMgr.AfterLoadDiagram, AddressOf OnAfterLoadDiagram m_schemDatasetMgr = Nothing End Sub Public Sub OnAfterLoadDiagram(ByVal inMemoryDiagram As ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram) ' if add-in is not enabled then quit If State <> ESRI.ArcGIS.Desktop.AddIns.ExtensionState.Enabled Then Return Dim enumSchemElements As IEnumSchematicInMemoryFeature Dim schemElement As ISchematicInMemoryFeature Dim nameRelatedCN As String Dim numRelatedOID As Long Dim esriFeatureClass As IFeatureClass Dim esriFeature As IFeature Dim schemFeatureLinkerEdit As ISchematicInMemoryFeatureLinkerEdit = New SchematicLinker Dim schemObjectType As ISchematicObjectClass Dim schemAttributeCID As ISchematicAttribute Dim schemAttributeOID As ISchematicAttribute Dim schemAttributeContainer As ISchematicAttributeContainer Dim esriWorkspace As IWorkspace Dim colFCByName As Collection colFCByName = New Collection esriWorkspace = inMemoryDiagram.SchematicDiagramClass.SchematicDataset.SchematicWorkspace.Workspace ' Retrieve all schematic element of the diagram enumSchemElements = CType(inMemoryDiagram.SchematicInMemoryFeatures, IEnumSchematicInMemoryFeature) enumSchemElements.Reset() schemElement = enumSchemElements.Next() While (schemElement IsNot Nothing) schemObjectType = schemElement.SchematicElementClass ' get Attributes schemAttributeContainer = CType(schemElement.SchematicElementClass, ISchematicAttributeContainer) schemAttributeCID = schemAttributeContainer.GetSchematicAttribute(AttClassNameName) schemAttributeOID = schemAttributeContainer.GetSchematicAttribute(AttObjectIdName) If (schemAttributeCID IsNot Nothing) AndAlso (schemAttributeOID IsNot Nothing) Then ' get value of attribute nameRelatedCN = schemAttributeCID.GetValue(schemElement) numRelatedOID = schemAttributeOID.GetValue(schemElement) ' get feature from geodatabase esriFeatureClass = FindFeatureClassByName(esriWorkspace, nameRelatedCN, colFCByName) If esriFeatureClass IsNot Nothing Then ' get feature from FeatureClass esriFeature = esriFeatureClass.GetFeature(numRelatedOID) If esriFeature IsNot Nothing Then ' Associate geographical feature with schematic feature schemFeatureLinkerEdit.Associate(schemElement, esriFeature) End If End If End If schemElement = enumSchemElements.Next() End While colFCByName.Clear() colFCByName = Nothing End Sub Public Sub OnAfterRefreshDiagram(ByVal InMemoryDiagram As ESRI.ArcGIS.Schematic.ISchematicInMemoryDiagram) OnAfterLoadDiagram(InMemoryDiagram) End Sub Private Function FindFeatureClassByName(ByVal workspace As IWorkspace, ByVal name As String, ByVal colFCByName As Collection) As IFeatureClass Dim esriFeatureClass As IFeatureClass Try ' try to retrieve FeatureClass in collection esriFeatureClass = CType(colFCByName(name), IFeatureClass) Return esriFeatureClass Catch End Try Dim enumDatasets As IEnumDataset Dim esriDataset As IDataset Dim featContainer As IFeatureClassContainer ' get datasets enumDatasets = workspace.Datasets(esriDatasetType.esriDTFeatureDataset) enumDatasets.Reset() esriDataset = enumDatasets.Next() While esriDataset IsNot Nothing ' try to find class in dataset Try featContainer = CType(esriDataset, IFeatureClassContainer) ' get FeatureClass from current dataset esriFeatureClass = featContainer.ClassByName(name) If esriFeatureClass IsNot Nothing Then ' if exists add to collection and quit colFCByName.Add(esriFeatureClass, name) Return esriFeatureClass End If Catch End Try ' try another dataset esriDataset = enumDatasets.Next() End While Try ' try to find FeatureClass in workspace featContainer = CType(workspace, IFeatureClassContainer) esriFeatureClass = featContainer.ClassByName(name) If esriFeatureClass IsNot Nothing Then ' if exists add to collection and quit colFCByName.Add(esriFeatureClass, name) Return esriFeatureClass End If Catch End Try Return Nothing End Function End Class