This document is archived and information here might be outdated. Recommended version. |
ArcObjects Help for .NET developers > ESRI.ArcGIS.Snippets > Snippets > Create A Schematic Diagram Class Entirely Based On Custom Queries From Scratch Snippet (ArcObjects .NET 10.4 SDK) |
This class behaves as a template to create a schematic diagram template class based on the standard builder for which the diagrams are entirely built from custom queries. It uses a set of predefined object tables (which names can be changed according to your cases) which contain records that are queried to build the set of schematic features contained in schematic diagrams.
public class QueryDiagramClass { //This class behaves as a template to create a schematic diagram template based on the standard builder for which the diagrams are entirely built from custom queries. //It uses 3 object tables: Document, Nodes and Link which names can be changed according to your needs in the constant TABLE_NAME. //The structure of the 3 tables is predefined and the queries used to generate the diagrams based on the diagram template built by this code are linked to the tables' structure. //The Document table lists all the diagrams which can be generated from this template. //The Document table fields are: //OBJECTID AutoNumber Primary Key //DOCID Long Unique Index //DOCNAME Text(255) Diagram name //The Nodes table gives the list of the nodes expected to be contained in the different diagrams. //The Nodes table fields are: //OBJECTID AutoNumber Primary Key //DOCID Long Related DOCID value - Linked to the Document Table DOCID field //ObjectType Text(50) Type of object node (Container, Junction, NodeOnLink) //XGeo Double X Postion of the node - Only used for a Junction node //YGeo Double Y Postion of the node - Only used for a Junction node //ParentLink Long OBJECTID of the reference link - Only used for a NodeOnLink node //PositionOnLink Double Relative position on the reference link (ParentLink) - Only used for a NodeOnLink node //RelatedFCName Text(50) Type of the related container - Only used for a child node which is related to a Container node //RelatedFOID Long OBJECTID of the related container - Only used for a child node which is related to a Container node //Rotation Double Rotation of the node - Not used for a Container node //The Links table gives the list of the links expected to be contained in the different diagrams. //The Links table fields are: //OBJECTID AutoNumber Primary Key //DOCID Long Related DOCID value - Linked to the Document Table DOCID field //ObjectType Text(50) Type of object link (Link, SubLink) //FromOID Long OBJECTID Of the origin node //ToOID Long OBJECTID of extremity node //FromPort Short Number of the origin port //ToPort Short Number of the extremity port //ListPoint Memo List of vertices along le link (Syntax: NumberOfPoint;X1;Y1;X2;Y2...) //ParentLink Long OBJECTID of the reference link - Only used for a SubLink link //RelatedFCName Text(50) Type of the related container - Only used for a child link which is related to a Container node //RelatedFOID Long OBJECTID of the related container - Only used for a child link which is related to a Container node const string DATASET_NAME="MyQueryDatasetCS"; const string DIAGRAM_TEMPLATE_NAME="MyDiagramClass"; const string DOCUMENT_TABLE_NAME="Document"; const string NODE_TABLE_NAME="Nodes"; const string LINK_TABLE_NAME="Links"; const string NODEONLINK_TABLE_NAME="Nodes"; const string SUBLINK_TABLE_NAME="Links"; const string CONTAINER_TABLE_NAME="Nodes"; /// <summary> /// Type of attributes used in this class /// </summary> public enum EnumAtttributeType { AttributeConstant, AttributeField, AttributeFormatted } /// <summary> /// This sample shows how to create a schematic diagram template entirely configured with custom queries by code from scratch based on the object tables described above /// </summary> /// <param name="esriWorkspace">The ESRI.ArcGIS.Geodatabase.IWorkspace where the diagram template is going to be created</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicDataset</returns> /// <remarks>The esriWorkspace must be opened</remarks> public ESRI.ArcGIS.Schematic.ISchematicDataset CreateQuerySchematicDataset(ESRI.ArcGIS.Geodatabase.IWorkspace esriWorkspace) { // if the input IWorkspace is null, exit if (esriWorkspace == null) return null; ESRI.ArcGIS.Schematic.ISchematicWorkspace schWorkspace=null; ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass; ESRI.ArcGIS.Schematic.ISchematicDataset schData=null; // -- STEP#1 -- Opening the ISchematicWorkspace related to the input IWorkspace Type objectType=Type.GetTypeFromProgID("esriSchematic.SchematicWorkspaceFactory"); ESRI.ArcGIS.Schematic.ISchematicWorkspaceFactory schWorkspaceFct; schWorkspaceFct=Activator.CreateInstance(objectType) as ESRI.ArcGIS.Schematic.ISchematicWorkspaceFactory; schWorkspace=schWorkspaceFct.Open(esriWorkspace); // -- STEP#2 -- Creating the new ISchematicDataset schData=schWorkspace.get_SchematicDatasetByName(DATASET_NAME); // if it already exists, exit if (schData != null) return schData; // create the new ISchematicDataset in the input IWorkspace try { schData=schWorkspace.CreateSchematicDataset(DATASET_NAME, ""); schData.DesignMode=true; } catch { // if the ISchematicDataset cannot be created, the process stops return null; } // -- STEP#3 -- Creating the ISchematicStandardBuilder that will be assigned afterwards to the schematic diagram template objectType=Type.GetTypeFromProgID("esriSchematic.SchematicStandardBuilder"); ESRI.ArcGIS.Schematic.ISchematicStandardBuilder pSchStandardBuilder; if (objectType == null) return null; pSchStandardBuilder=Activator.CreateInstance(objectType) as ESRI.ArcGIS.Schematic.ISchematicStandardBuilder; // if the ISchematicStandardBuilder is Nothing, exit if (pSchStandardBuilder == null) return null; pSchStandardBuilder.AddConnectedNodes=true; pSchStandardBuilder.InitializeLinksVertices=true; ESRI.ArcGIS.Schematic.ISchematicBuilder pSchBuilder=(ESRI.ArcGIS.Schematic.ISchematicBuilder)pSchStandardBuilder; // -- STEP#4 -- Creating the ISchematicDiagramClass schDiagClass=CreateDiagramClass(schData, DIAGRAM_TEMPLATE_NAME, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, schData.DefaultSchematicDataSource, "SELECT * FROM " + DOCUMENT_TABLE_NAME, new string[] { "DOCNAME" }); schDiagClass.SchematicBuilder=pSchBuilder; // -- STEP#5 -- Creating the attributes for the diagram class ESRI.ArcGIS.Schematic.ISchematicAttributeField schAttribField=CreateAttribute(schDiagClass, "DOCID", EnumAtttributeType.AttributeField, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeBuildEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeFieldStorage) as ESRI.ArcGIS.Schematic.ISchematicAttributeField; schAttribField.FieldNames=new string[] { "DOCID" }; // This Attribute is used for link with Element ESRI.ArcGIS.Schematic.EnumSchematicQueryParameterClass enumQueryParameters=new ESRI.ArcGIS.Schematic.EnumSchematicQueryParameterClass(); ESRI.ArcGIS.Schematic.ISchematicQueryParameter schQueryParameter=new ESRI.ArcGIS.Schematic.SchematicQueryParameter(); // -- STEP#6 -- Configuring the query for the diagram class schQueryParameter.Name="DOCID"; schQueryParameter.Textual=false; enumQueryParameters.Add(schQueryParameter); schQueryParameter=null; ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass; // -- STEP#7 -- Creating the schematic feature classes // creating the SchematicLinks schematic feature class CreateLinks(schData, schDiagClass, "SchematicLinks", LINK_TABLE_NAME, "Links", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline, true); // creating the SchematicSubLinks schematic feature class CreateSubLinks(schData, schDiagClass, "SchematicSubLinks", SUBLINK_TABLE_NAME, "SubLinks", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline, true); // creating the SchematicNodeOnLinks schematic feature class CreateNodeOnLink(schData, schDiagClass, "SchematicNodeOnLinks", NODEONLINK_TABLE_NAME, "SubNodes", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint, true); // creating the SchematicNodes schematic feature class schEltClass=CreateNode(schData, schDiagClass, "SchematicNodes", NODE_TABLE_NAME, "Nodes", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint, false); // creating the Containers schematic feature class CreateChildNode(schData, schDiagClass, schEltClass, "SchematicJunctions", NODE_TABLE_NAME, "Junctions", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint, true); // creating the Links schematic feature class ESRI.ArcGIS.Schematic.ISchematicElementClass schContClass=CreateChildNode(schData, schDiagClass, schEltClass, "Containers", NODE_TABLE_NAME, "Container 1", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon, true); AddAttributeConst(schContClass, "ContainerMargin", "0.5"); // -- STEP#8 -- Saving the schematic dataset and exit the design mode schData.Save(ESRI.ArcGIS.esriSystem.esriArcGISVersion.esriArcGISVersionCurrent, false); schData.DesignMode=false; return schData; } /// <summary> /// Return the classID for the type of attributes used in this sample /// </summary> /// <param name="Value">EnumAtttributeType</param> /// <returns>string</returns> private string GetAttributeType(EnumAtttributeType Value) { switch (Value) { case EnumAtttributeType.AttributeConstant: return "{3AD9D8B8-0A1D-4F32-ABB5-54B848A46F85}"; case EnumAtttributeType.AttributeField: return "{E1902BB0-6070-4EE2-995A-DB86FAC5EEB0}"; case EnumAtttributeType.AttributeFormatted: return "{1DE95A2A-B750-446A-8D3A-3C67660E8B59}"; default: return ""; } } #region Create Elements /// <summary> /// <param name="schDataset">The ISchematicDataset where the schematic diagram template must be created</param> /// <param name="DiagramClassName">The name of the schematic diagram template to create</param> /// <param name="QueryMode">The evaluation mode for the query that must be configured on the diagram template</param> /// <param name="schDataSource">The ISchematicDataSource related to the query</param> /// <param name="QueryString">The query string</param> /// <param name="FieldNames">The field names used to build each diagram identifier</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicDiagramClass</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicDiagramClass CreateDiagramClass(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, string DiagramClassName, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode QueryMode, ESRI.ArcGIS.Schematic.ISchematicDataSource schDataSource, string QueryString, object FieldNames) { ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass=null; try { schDiagClass=schDataset.CreateSchematicDiagramClass(DiagramClassName); } catch { } schDiagClass.SchematicDataSource=schDataSource; schDiagClass.ExternalQueryEvaluationMode=QueryMode; schDiagClass.QueryString=QueryString; schDiagClass.IdentifierFieldNames=FieldNames; return schDiagClass; } /// <summary> /// Create a schematic feature class - basic creation /// </summary> /// <param name="schDataset">The ISchematicDataset where the schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new schematic feature class must be associated with</param> /// <param name="ElementName">The name of the schematic feature class to create</param> /// <param name="ClassType">The type of schematic element managed by this schematic feature class</param> /// <param name="schDataSource">The ISchematicDataSource related to the query that must return the schematic features based on this class</param> /// <param name="QueryString">The query string</param> /// <param name="FieldNames">The field names used to build each schematic feature identifier</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="Geometry">The type of geometry for the schematic features based on this class</param> /// <param name="QueryEvaluation">The evaluation mode for the query</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateElementClass(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType ClassType, ESRI.ArcGIS.Schematic.ISchematicDataSource schDataSource, string QueryString, object FieldNames, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType Geometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode QueryEvaluation, bool WithAssociation) { // schematic feature class creation ESRI.ArcGIS.Schematic.ISchematicElementClass schElement=null; try { schElement=schDataset.CreateSchematicElementClass(ElementName, ClassType); } catch { } schElement.ShapeField=BuildShapeField(Geometry, schDataset.SchematicWorkspace.Workspace); schElement.GeometryType=Geometry; schElement.SchematicDataSource=schDataSource; schElement.ExternalQueryEvaluationMode=QueryEvaluation; schElement.QueryString=QueryString; schElement.IdentifierFieldNames=FieldNames; schElement.SchematicQueryParameters=QueryParameters; // if WithAssociation is True, the schematic feature class is associated with the specified input diagram class if (WithAssociation) schDiagClass.AssociateSchematicElementClass(schElement); return schElement; } /// <summary> /// Create a schematic feature class which inherits from another schematic feature class /// </summary> /// <param name="ParentClass">The parent ISchematicElementClass</param> /// <param name="schDataset">The ISchematicDataset where the schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new schematic feature class must be associated with</param> /// <param name="ElementName">The name of the schematic feature class to create</param> /// <param name="ClassType">The type of schematic element managed by this schematic feature class</param> /// <param name="schDataSource">The ISchematicDataSource related to the query that must return the schematic features based on this class</param> /// <param name="QueryString">The query string</param> /// <param name="FieldNames">The field names used to build each schematic feature identifier</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="Geometry">The type of geometry for the schematic features based on this class</param> /// <param name="QueryEvaluation">The evaluation mode for the query</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateSubElementClass(ESRI.ArcGIS.Schematic.ISchematicElementClass ParentClass, ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType ClassType, ESRI.ArcGIS.Schematic.ISchematicDataSource schDataSource, string QueryString, object FieldNames, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType Geometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode QueryEvaluation, bool WithAssociation) { ESRI.ArcGIS.Schematic.ISchematicElementClass schElement=null; try { // schematic feature class creation schElement=CreateElementClass(schDataset, schDiagClass, ElementName, ClassType, schDataSource, QueryString, FieldNames, QueryParameters, Geometry, QueryEvaluation, WithAssociation); // specifying the parent schematic feature class for the new schematic feature class schElement.Parent=ParentClass; } catch { } return schElement; } /// <summary> /// Create a node schematic feature class /// </summary> /// <param name="schDataset">The ISchematicDataset where the node schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new node schematic feature class must be associated with</param> /// <param name="ElementName">The name of the node schematic feature class to create</param> /// <param name="TableName">The name of the table where the records related to the node schematic features must be queried</param> /// <param name="FilterElementInTable">The filter that must be used to filter out the records</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass node schematic feature class</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateNode(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string ElementName, string TableName, string FilterElementInTable, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType TypeGeometry, bool WithAssociation) { // node schematic feature class creation ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE DOCID=?", new string[] { "DOCID", "IDOBJECT", "Node" }, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation); // creation of the set of attributes expected for node schematic features AddAttributeField(schEltClass, "DOCID", new string[] { "DOCID" }); AddAttributeField(schEltClass, "ObjectId", new string[] { "IDOBJECT" }); AddAttributeFormat(schEltClass, "Name", "%s-%s-Node", new string[] { "DOCID", "ObjectId" }); AddAttributeField(schEltClass, "InitialXPosition", new string[] { "XGeo" }); AddAttributeField(schEltClass, "InitialYPosition", new string[] { "YGeo" }); AddAttributeField(schEltClass, "ParentId", new string[] { "RelatedFOID" }); AddAttributeField(schEltClass, "InitialRotation", new string[] { "Rotation" }); // creation of the attributes used to manage container if the nodes based on this schematic feature class have relations with container schematic features AddAttributeField(schEltClass, "PTN", new string[] { "RelatedFCName" }); AddAttributeFormat(schEltClass, "PEN", "%s-%s-Node", new string[] { "DOCID", "ParentId" }); return schEltClass; } /// <summary> /// Create a node schematic feature class which inherits from another node schematic feature class /// </summary> /// <param name="schDataset">The ISchematicDataset where the node schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new node schematic feature class must be associated with</param> /// <param name="schParentClass">The parent ISchematicElementClass</param> /// <param name="ElementName">The name of the node schematic feature class to create</param> /// <param name="TableName">The name of the table where the records related to the node schematic features must be queried</param> /// <param name="FilterElementInTable">The filter that must be used to filter out the records</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass node schematic feature class</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateChildNode(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, ESRI.ArcGIS.Schematic.ISchematicElementClass schParentClass, string ElementName, string TableName, string FilterElementInTable, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType TypeGeometry, bool WithAssociation) { // schematic feature class creation with a parent node schematic feature class ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateSubElementClass(schParentClass, schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", new string[] { "DOCID", "IDOBJECT", "Node" }, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation); return schEltClass; } /// <summary> /// Create a link schematic feature class /// </summary> /// <param name="schDataset">The ISchematicDataset where the link schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new link schematic feature class must be associated with</param> /// <param name="ElementName">The name of the link schematic feature class to create</param> /// <param name="TableName">The name of the table where the records related to the link schematic features must be queried</param> /// <param name="FilterElementInTable">The filter that must be used to filter out the records</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass link schematic feature class</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateLinks(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string ElementName, string TableName, string FilterElementInTable, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType TypeGeometry, bool WithAssociation) { // link schematic feature class creation ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicLinkType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", new string[] { "DOCID", "IDOBJECT", "Link" }, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation); // creation of the set of attributes expected for link schematic features AddAttributeField(schEltClass, "ExtremityNode", new string[] { "DOCID", "ToOID", "Node" }); AddAttributeField(schEltClass, "OriginNode", new string[] { "DOCID", "FromOID", "Node" }); AddAttributeField(schEltClass, "InitialListPoints", new string[] { "ListPoints" }); AddAttributeField(schEltClass, "DOCID",new string[] { "DOCID" }); AddAttributeField(schEltClass, "ObjectId", new string[] { "IDOBJECT" }); AddAttributeFormat(schEltClass, "Name", "%s-%s-Link", new string[] { "DOCID", "ObjectId" }); return schEltClass; } /// <summary> /// Create a sublink schematic feature class /// </summary> /// <param name="schDataset">The ISchematicDataset where the sublink schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new sublink schematic feature class must be associated with</param> /// <param name="ElementName">The name of the sublink schematic feature class to create</param> /// <param name="TableName">The name of the table where the records related to the sublink schematic features must be queried</param> /// <param name="FilterElementInTable">The filter that must be used to filter out the records</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass sublink schematic feature class</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateSubLinks(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string ElementName, string TableName, string FilterElementInTable, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType TypeGeometry, bool WithAssociation) { // sublink schematic feature class creation ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicSubLinkType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", new string[] { "DOCID", "IDOBJECT", "SubLink" }, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation); // creation of the set of attributes expected for sublink schematic features AddAttributeField(schEltClass, "ExtremityNode", new string[] { "DOCID", "ToOID", "Node" }); AddAttributeField(schEltClass, "OriginNode", new string[] { "DOCID", "FromOID", "Node" }); AddAttributeField(schEltClass, "ReferenceLink", new string[] { "DOCID", "ParentLink", "Link" }); AddAttributeField(schEltClass, "DOCID", new string[] { "DOCID" }); AddAttributeField(schEltClass, "ObjectId", new string[] { "IDOBJECT" }); AddAttributeFormat(schEltClass, "Name", "%s-%s-SubLink", new string[] { "DOCID", "ObjectId" }); return schEltClass; } /// <summary> /// Create a node-on-link schematic feature class /// </summary> /// <param name="schDataset">The ISchematicDataset where the node-on-link schematic feature class must be created</param> /// <param name="schDiagClass">The ISchematicDiagramClass the new node-on-link schematic feature class must be associated with</param> /// <param name="ElementName">The name of the node-on-link schematic feature class to create</param> /// <param name="TableName">The name of the table where the records related to the node-on-link schematic features must be queried</param> /// <param name="FilterElementInTable">The filter that must be used to filter out the records</param> /// <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> /// <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> /// <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass node-on-link schematic feature class</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicElementClass CreateNodeOnLink(ESRI.ArcGIS.Schematic.ISchematicDataset schDataset, ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string ElementName, string TableName, string FilterElementInTable, ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter QueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType TypeGeometry, bool WithAssociation) { // node-on-link schematic feature class creation ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeOnLinkType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", new string[] { "DOCID", "IDOBJECT", "Node" }, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation); // creation of the set of attributes expected for node-on-link schematic features AddAttributeField(schEltClass, "DOCID", new string[] { "DOCID" }); AddAttributeField(schEltClass, "InitialRotation", new string[] { "Rotation" }); AddAttributeField(schEltClass, "ObjectId", new string[] { "IDOBJECT" }); AddAttributeField(schEltClass, "RelativePosition", new string[] { "PositionOnLink" }); AddAttributeField(schEltClass, "ReferenceLink", new string[] { "DOCID", "ParentLink", "Link" }); AddAttributeFormat(schEltClass, "Name", "%s-%s-Node", new string[] { "DOCID", "ObjectId" }); return schEltClass; } #endregion #region Attributes /// <summary> /// Create an attribute on a schematic diagram class /// </summary> /// <param name="schDiagClass">The ISchematicDiagramClass where the attribute must be created</param> /// <param name="AttributeName">The name of the new attribute</param> /// <param name="AttribType">The type of attribute</param> /// <param name="EvalMode">The evaluation mode for the attribute</param> /// <param name="StorageMode">The storage mode for the attribute</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicAttribute</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicAttribute CreateAttribute(ESRI.ArcGIS.Schematic.ISchematicDiagramClass schDiagClass, string AttributeName, EnumAtttributeType AttribType, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode EvalMode, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode StorageMode) { ESRI.ArcGIS.Schematic.ISchematicAttribute schAttribute=null; try { ESRI.ArcGIS.esriSystem.UID pUid=new ESRI.ArcGIS.esriSystem.UID(); pUid.Value=GetAttributeType(AttribType); schAttribute=schDiagClass.CreateSchematicAttribute(AttributeName, pUid); } catch { return null; } ESRI.ArcGIS.Schematic.ISchematicAttributeManagement schAttributeMngt=(ESRI.ArcGIS.Schematic.ISchematicAttributeManagement)schAttribute; try { // the StorageMode must be set before the EvaluationMode // consistenty is checked when the EvaluationMode is set schAttributeMngt.StorageMode=StorageMode; schAttributeMngt.EvaluationMode=EvalMode; } catch { } // an error is returned if the StorageMode and EvaluationMode are not consistent return schAttribute; } /// <summary> /// Create an attribute on a schematic feature class /// </summary> /// <param name="schElementClass">The ISchematicElementClass where the attribute must be created</param> /// <param name="AttributeName">The name of the new attribute</param> /// <param name="AttribType">The type of attribute</param> /// <param name="EvalMode">The evaluation mode for the attribute</param> /// <param name="StorageMode">The storage mode for the attribute</param> /// <returns>The created ESRI.ArcGIS.Schematic.ISchematicAttribute</returns> /// <remarks></remarks> private ESRI.ArcGIS.Schematic.ISchematicAttribute CreateAttribute(ESRI.ArcGIS.Schematic.ISchematicElementClass schElementClass, string AttributeName, EnumAtttributeType AttribType, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode EvalMode, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode StorageMode) { ESRI.ArcGIS.Schematic.ISchematicAttribute schAttribute=null; try { ESRI.ArcGIS.esriSystem.UID pUid=new ESRI.ArcGIS.esriSystem.UID(); pUid.Value=GetAttributeType(AttribType); schAttribute=schElementClass.CreateSchematicAttribute(AttributeName, pUid); } catch { return null; } ESRI.ArcGIS.Schematic.ISchematicAttributeManagement schAttributeMngt=(ESRI.ArcGIS.Schematic.ISchematicAttributeManagement)schAttribute; try { // the StorageMode must be set before the EvaluationMode // consistenty is checked when the EvaluationMode is set schAttributeMngt.StorageMode=StorageMode; schAttributeMngt.EvaluationMode=EvalMode; } catch { } // an error is returned if the StorageMode and EvaluationMode are not consistent return schAttribute; } /// <summary> /// Add a constant schematic attribute on a schematic feature class /// </summary> /// <param name="schElementClass">The schematic feature class where the constant attribute must be created</param> /// <param name="AttributeName">The name of the constant schematic attribute</param> /// <param name="value">The constant value for the created schematic attribute</param> /// <remarks></remarks> private void AddAttributeConst(ESRI.ArcGIS.Schematic.ISchematicElementClass schElementClass, string AttributeName, string value) { ESRI.ArcGIS.Schematic.ISchematicAttributeConstant schAttConst=CreateAttribute(schElementClass, AttributeName, EnumAtttributeType.AttributeConstant, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeOnTheFlyEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeNoStorage) as ESRI.ArcGIS.Schematic.ISchematicAttributeConstant; if (schAttConst != null) schAttConst.ConstantValue=value; } /// <summary> /// Add a field schematic attribute on a schematic feature class /// </summary> /// <param name="schElementClass">The schematic feature class where the field attribute must be created</param> /// <param name="AttributeName">The name of the constant schematic attribute</param> /// <param name="FieldNames">The FieldNames for the created schematic attribute()</param> /// <remarks></remarks> private void AddAttributeField(ESRI.ArcGIS.Schematic.ISchematicElementClass schElementClass, string AttributeName, string[] FieldNames) { ESRI.ArcGIS.Schematic.ISchematicAttributeField schAttField=CreateAttribute(schElementClass, AttributeName, EnumAtttributeType.AttributeField, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeBuildEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeFieldStorage) as ESRI.ArcGIS.Schematic.ISchematicAttributeField; if (schAttField != null) schAttField.FieldNames=FieldNames; } /// <summary> /// Add a formatted schematic attribute on a schematic feature class /// </summary> /// <param name="schElementClass">The schematic feature class where the formatted attribute must be created</param> /// <param name="AttributeName">The name of the formatted schematic attribute</param> /// <param name="sFormat">The Format for the created schematic attribute</param> /// <param name="ParameterNames">The ParameterNames for the created schematic attribute()</param> /// <remarks></remarks> private void AddAttributeFormat(ESRI.ArcGIS.Schematic.ISchematicElementClass schElementClass, string AttributeName, string sFormat, string[] ParameterNames) { ESRI.ArcGIS.Schematic.ISchematicAttributeFormatted schAttField=CreateAttribute(schElementClass, AttributeName, EnumAtttributeType.AttributeFormatted, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeBuildEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeNoStorage) as ESRI.ArcGIS.Schematic.ISchematicAttributeFormatted; if (schAttField != null) { schAttField.Format=sFormat; schAttField.ParameterNames=ParameterNames; } } #endregion #region Others /// <summary> /// Building the Shape field for container schematic features /// </summary> /// <param name="geometryType">The type of geometry the Shape must manage</param> /// <param name="pWorkspace">The impacted IWorkspace</param> /// <returns>The created ESRI.ArcGIS.Geodatabase.IField Shape field</returns> /// <remarks></remarks> private static ESRI.ArcGIS.Geodatabase.IField BuildShapeField(ESRI.ArcGIS.Geometry.esriGeometryType geometryType, ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace) { ESRI.ArcGIS.Geodatabase.IField ipShapeField=null; try { ESRI.ArcGIS.Geometry.ISpatialReference ipSpatialReference=new ESRI.ArcGIS.Geometry.UnknownCoordinateSystem() as ESRI.ArcGIS.Geometry.ISpatialReference; if (ipSpatialReference == null) return null; ESRI.ArcGIS.Geometry.ISpatialReferenceResolution ipSpatialReferenceResolution=ipSpatialReference as ESRI.ArcGIS.Geometry.ISpatialReferenceResolution; if (ipSpatialReferenceResolution != null) { // initializing the resolution (and so the domain) if needed double xyRes=ipSpatialReferenceResolution.get_XYResolution(false); if (System.Double.IsNaN(xyRes)) ipSpatialReferenceResolution.SetDefaultXYResolution(); } ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance ipSpatialReferenceTolerance=ipSpatialReference as ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance; // initializing the tolerance if needed if (ipSpatialReferenceTolerance != null && ipSpatialReferenceTolerance.XYToleranceValid != ESRI.ArcGIS.Geometry.esriSRToleranceEnum.esriSRToleranceOK) ipSpatialReferenceTolerance.SetDefaultXYTolerance(); ESRI.ArcGIS.Geometry.ISpatialReference ipAdjustedSpatialReference=ConstructSpatialReference(pWorkspace, ipSpatialReference); if (ipAdjustedSpatialReference == null) ipAdjustedSpatialReference=ipSpatialReference; ipShapeField=new ESRI.ArcGIS.Geodatabase.Field(); ESRI.ArcGIS.Geodatabase.IGeometryDefEdit ipGeometryDefEdit=new ESRI.ArcGIS.Geodatabase.GeometryDef() as ESRI.ArcGIS.Geodatabase.IGeometryDefEdit; if (ipShapeField == null || ipGeometryDefEdit == null) return null; ipGeometryDefEdit.SpatialReference_2=ipAdjustedSpatialReference; ipGeometryDefEdit.GeometryType_2=geometryType; ipGeometryDefEdit.HasZ_2=false; if (geometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline) { ipGeometryDefEdit.HasM_2=true; if (ipSpatialReferenceResolution != null) { // initializing the resolution (and so the domain) if needed double interval=ipSpatialReferenceResolution.MResolution; if (System.Double.IsNaN(interval)) ipSpatialReferenceResolution.SetDefaultMResolution(); } // initializing the tolerance if needed if (ipSpatialReferenceTolerance != null && ipSpatialReferenceTolerance.MToleranceValid != ESRI.ArcGIS.Geometry.esriSRToleranceEnum.esriSRToleranceOK) ipSpatialReferenceTolerance.SetMinimumMTolerance(); } else ipGeometryDefEdit.HasM_2=false; ESRI.ArcGIS.Geodatabase.IFieldEdit ipShapeFieldEdit=ipShapeField as ESRI.ArcGIS.Geodatabase.IFieldEdit; ipShapeFieldEdit.IsNullable_2=true; ipShapeFieldEdit.Name_2="SHAPE"; ipShapeFieldEdit.Type_2=ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeGeometry; ipShapeFieldEdit.GeometryDef_2=ipGeometryDefEdit as ESRI.ArcGIS.Geodatabase.IGeometryDef; } // try catch (Exception ex) { ipShapeField=null; // don't use any verbose option if throwing error throw new SystemException(ex.Message, ex.InnerException); } return ipShapeField; } /// <summary> /// SpatialReference construction for the Shape field /// </summary> /// <param name="pWorkspace">ESRI.ArcGIS.Geodatabase.IWorkspace</param> /// <param name="pSpatialref">ESRI.ArcGIS.Geometry.ISpatialReference</param> /// <returns>ESRI.ArcGIS.Geometry.ISpatialReference</returns> /// <remarks></remarks> private static ESRI.ArcGIS.Geometry.ISpatialReference ConstructSpatialReference(ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace, ESRI.ArcGIS.Geometry.ISpatialReference pSpatialref) { if (pWorkspace == null || pSpatialref == null) return null; ESRI.ArcGIS.Geometry.ISpatialReference ipOutputSR=null; ESRI.ArcGIS.Geodatabase.IWorkspaceProperty ipWSProperty=((ESRI.ArcGIS.Geodatabase.IWorkspaceProperties)pWorkspace).get_Property(ESRI.ArcGIS.Geodatabase.esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup, (int)ESRI.ArcGIS.Geodatabase.esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage); bool highPrecisionDB=(bool)ipWSProperty.PropertyValue; bool highPrecisionSR=((ESRI.ArcGIS.Geometry.IControlPrecision2)(pSpatialref)).IsHighPrecision; if (highPrecisionSR && !highPrecisionDB) { // Need to create a low precision spatial reference double Xmin=0; double Ymin=0; double Xmax=0; double Ymax=0; pSpatialref.GetDomain(out Xmin, out Xmax, out Ymin, out Ymax); ESRI.ArcGIS.Geometry.IEnvelope ipEnv=new ESRI.ArcGIS.Geometry.Envelope() as ESRI.ArcGIS.Geometry.IEnvelope; ipEnv.PutCoords(Xmin, Ymin, Xmax, Ymax); ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3 ipSpatialReferenceFactory=new ESRI.ArcGIS.Geometry.SpatialReferenceEnvironment() as ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3; try { ipOutputSR=ipSpatialReferenceFactory.ConstructLowPrecisionSpatialReference(true, pSpatialref, ipEnv); } catch { } // Ignore errors if (ipOutputSR == null) ipOutputSR=ipSpatialReferenceFactory.ConstructLowPrecisionSpatialReference(false, pSpatialref, ipEnv); } if (!highPrecisionSR && highPrecisionDB) { // Create an equivalent high precision spatial reference ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance ipSRTolerance=(ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance)pSpatialref; ipSRTolerance.SetMinimumXYTolerance(); ipSRTolerance.SetMinimumZTolerance(); ipSRTolerance.SetMinimumMTolerance(); ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3 ipSpatialReferenceFactory=new ESRI.ArcGIS.Geometry.SpatialReferenceEnvironment() as ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3; ipOutputSR=ipSpatialReferenceFactory.ConstructHighPrecisionSpatialReference(pSpatialref, -1, -1, -1); if (ipOutputSR == null) ipOutputSR=ipSpatialReferenceFactory.ConstructHighPrecisionSpatialReference(pSpatialref, -1, -1, -1); } return ipOutputSR; } #endregion }
Public Class QueryDiagramClass 'This class behaves as a template to create a schematic diagram template based on the standard builder for which the diagrams are entirely built from custom queries. 'It uses 3 object tables: Document, Nodes and Links which names can be changed according to your needs in the constant TABLE_NAME. 'The structure of the 3 tables is predefined and the queries used to generate the diagrams based on the diagram template built by this code are linked to the tables' structure. 'The Document table lists all the diagrams which can be generated from this template. 'The Document table fields are: 'OBJECTID AutoNumber Primary Key 'DOCID Long Unique Index 'DOCNAME Text(255) Diagram name 'The Nodes table gives the list of the nodes expected to be contained in the different diagrams. 'The Nodes table fields are: 'OBJECTID AutoNumber Primary Key 'DOCID Long Related DOCID value - Linked to the Document Table DOCID field 'ObjectType Text(50) Type of object node (Container, Junction, NodeOnLink) 'XGeo Double X Postion of the node - Only used for a Junction node 'YGeo Double Y Postion of the node - Only used for a Junction node 'ParentLink Long OBJECTID of the reference link - Only used for a NodeOnLink node 'PositionOnLink Double Relative position on the reference link (ParentLink) - Only used for a NodeOnLink node 'RelatedFCName Text(50) Type of the related container - Only used for a child node which is related to a Container node 'RelatedFOID Long OBJECTID of the related container - Only used for a child node which is related to a Container node 'Rotation Double Rotation of the node - Not used for a Container node 'The Links table gives the list of the links expected to be contained in the different diagrams. 'The Links table fields are: 'OBJECTID AutoNumber Primary Key 'DOCID Long Related DOCID value - Linked to the Document Table DOCID field 'ObjectType Text(50) Type of object link (Link, SubLink) 'FromOID Long OBJECTID Of the origin node 'ToOID Long OBJECTID of extremity node 'FromPort Short Number of the origin port 'ToPort Short Number of the extremity port 'ListPoint Memo List of vertices along le link (Syntax: NumberOfPoint;X1;Y1;X2;Y2...) 'ParentLink Long OBJECTID of the reference link - Only used for a SubLink link 'RelatedFCName Text(50) Type of the related container - Only used for a child link which is related to a Container node 'RelatedFOID Long OBJECTID of the related container - Only used for a child link which is related to a Container node Private Const DATASET_NAME As String="MyQueryDatasetVB" Private Const DIAGRAM_TEMPLATE_NAME As String="MyDiagramClass" Private Const DOCUMENT_TABLE_NAME As String="Document" Private Const NODE_TABLE_NAME As String="Nodes" Private Const LINK_TABLE_NAME As String="Links" Private Const NODEONLINK_TABLE_NAME As String="Nodes" Private Const SUBLINK_TABLE_NAME As String="Links" Private Const CONTAINER_TABLE_NAME As String="Nodes" ''' <summary> ''' Type of attributes used in this class ''' </summary> ''' <remarks></remarks> Public Enum EnumAtttributeType AttributeConstant AttributeField AttributeFormatted End Enum ''' <summary> ''' This sample shows how to create a schematic diagram template entirely configured with custom queries by code from scratch based on the object tables described above ''' </summary> ''' <param name="esriWorkspace">The ESRI.ArcGIS.Geodatabase.IWorkspace where the diagram template is going to be created</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicDataset</returns> ''' <remarks>The esriWorkspace must be opened</remarks> Public Function CreateQuerySchematicDataset(ByVal esriWorkspace As ESRI.ArcGIS.Geodatabase.IWorkspace) As ESRI.ArcGIS.Schematic.ISchematicDataset ' if the input IWorkspace is null, exit If (esriWorkspace Is Nothing) Then Return Nothing Dim schWorkspace As ESRI.ArcGIS.Schematic.ISchematicWorkspace=Nothing Dim schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass Dim schData As ESRI.ArcGIS.Schematic.ISchematicDataset=Nothing ' -- STEP#1 -- Opening the ISchematicWorkspace related to the input IWorkspace Dim objectType As Type=Type.GetTypeFromProgID("esriSchematic.SchematicWorkspaceFactory") Dim schWorkspaceFct As ESRI.ArcGIS.Schematic.ISchematicWorkspaceFactory schWorkspaceFct=TryCast(Activator.CreateInstance(objectType), ESRI.ArcGIS.Schematic.ISchematicWorkspaceFactory) schWorkspace=schWorkspaceFct.Open(esriWorkspace) ' -- STEP#2 -- Creating the new ISchematicDataset ' verify that the ISchematicDataset to create doesn't already exist in the input IWorkspace schData=schWorkspace.SchematicDatasetByName(DATASET_NAME) ' if it already exists, exit If (schData IsNot Nothing) Then Return schData ' create the new ISchematicDataset in the input IWorkspace Try schData=schWorkspace.CreateSchematicDataset(DATASET_NAME, "") schData.DesignMode=True Catch ' if the ISchematicDataset cannot be created, the process stops Return Nothing End Try ' -- STEP#3 -- Creating the ISchematicStandardBuilder that will be assigned afterwards to the schematic diagram template objectType=Type.GetTypeFromProgID("esriSchematic.SchematicStandardBuilder") Dim pSchStandardBuilder As ESRI.ArcGIS.Schematic.ISchematicStandardBuilder If (objectType Is Nothing) Then Return Nothing pSchStandardBuilder=TryCast(Activator.CreateInstance(objectType), ESRI.ArcGIS.Schematic.ISchematicStandardBuilder) ' if the ISchematicStandardBuilder is Nothing, exit If (pSchStandardBuilder Is Nothing) Then Return Nothing pSchStandardBuilder.AddConnectedNodes=True pSchStandardBuilder.InitializeLinksVertices=True Dim pSchBuilder As ESRI.ArcGIS.Schematic.ISchematicBuilder=TryCast(pSchStandardBuilder, ESRI.ArcGIS.Schematic.ISchematicBuilder) ' -- STEP#4 -- Creating the ISchematicDiagramClass schDiagClass=CreateDiagramClass(schData, DIAGRAM_TEMPLATE_NAME, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, schData.DefaultSchematicDataSource, "SELECT * FROM " + DOCUMENT_TABLE_NAME, New String() {"DOCNAME"}) schDiagClass.SchematicBuilder=pSchBuilder ' -- STEP#5 -- Creating the attributes for the diagram class Dim schAttribField As ESRI.ArcGIS.Schematic.ISchematicAttributeField schAttribField=TryCast(CreateAttribute(schDiagClass, "DOCID", EnumAtttributeType.AttributeField, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeBuildEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeFieldStorage), ESRI.ArcGIS.Schematic.ISchematicAttributeField) schAttribField.FieldNames=New String() {"DOCID"} ' This Attribute is used for link with Element Dim enumQueryParameters As ESRI.ArcGIS.Schematic.EnumSchematicQueryParameterClass=New ESRI.ArcGIS.Schematic.EnumSchematicQueryParameterClass() Dim schQueryParameter As ESRI.ArcGIS.Schematic.ISchematicQueryParameter=New ESRI.ArcGIS.Schematic.SchematicQueryParameter() ' -- STEP#6 -- Configuring the query for the diagram class schQueryParameter.Name="DOCID" schQueryParameter.Textual=False enumQueryParameters.Add(schQueryParameter) schQueryParameter=Nothing Dim schEltClass As ESRI.ArcGIS.Schematic.ISchematicElementClass ' -- STEP#7 -- Creating the schematic feature classes ' creating the SchematicLinks schematic feature class CreateLinks(schData, schDiagClass, "SchematicLinks", LINK_TABLE_NAME, "Links", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline, True) ' creating the SchematicSubLinks schematic feature class CreateSubLinks(schData, schDiagClass, "SchematicSubLinks", SUBLINK_TABLE_NAME, "SubLinks", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline, True) ' creating the SchematicNodeOnLinks schematic feature class CreateNodeOnLink(schData, schDiagClass, "SchematicNodeOnLinks", NODEONLINK_TABLE_NAME, "SubNodes", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint, True) ' creating the SchematicNodes schematic feature class schEltClass=CreateNode(schData, schDiagClass, "SchematicNodes", NODE_TABLE_NAME, "Nodes", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint, False) ' creating the SchematicJunctions schematic feature class that inherits from the Nodes schematic feature class CreateChildNode(schData, schDiagClass, schEltClass, "SchematicJunctions", NODE_TABLE_NAME, "Junctions", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint, True) ' creating the Containers schematic feature class Dim schContClass As ESRI.ArcGIS.Schematic.ISchematicElementClass=CreateChildNode(schData, schDiagClass, schEltClass, "Containers", NODE_TABLE_NAME, "Container 1", enumQueryParameters, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon, True) AddAttributeConst(schContClass, "ContainerMargin", "0.5") ' -- STEP#8 -- Saving the schematic dataset and exit the design mode schData.Save(ESRI.ArcGIS.esriSystem.esriArcGISVersion.esriArcGISVersionCurrent, False) schData.DesignMode=False Return schData End Function ''' <summary> ''' Return the classID for the type of attributes used in this sample ''' </summary> ''' <param name="Value">EnumAtttributeType</param> ''' <returns>string</returns> ''' <remarks></remarks> Private Function GetAttributeType(ByVal Value As EnumAtttributeType) As String Select Case Value Case EnumAtttributeType.AttributeConstant Return "{3AD9D8B8-0A1D-4F32-ABB5-54B848A46F85}" Case EnumAtttributeType.AttributeField Return "{E1902BB0-6070-4EE2-995A-DB86FAC5EEB0}" Case EnumAtttributeType.AttributeFormatted Return "{1DE95A2A-B750-446A-8D3A-3C67660E8B59}" Case Else Return "" End Select End Function #Region "Create Elements" ''' <summary> ''' Create the schematic diagram template ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the schematic diagram template must be created</param> ''' <param name="DiagramClassName">The name of the schematic diagram template to create</param> ''' <param name="QueryMode">The evaluation mode for the query that must be configured on the diagram template</param> ''' <param name="schDataSource">The ISchematicDataSource related to the query</param> ''' <param name="QueryString">The query string</param> ''' <param name="FieldNames">The field names used to build each diagram identifier</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicDiagramClass</returns> ''' <remarks></remarks> Private Function CreateDiagramClass(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal DiagramClassName As String, ByVal QueryMode As ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode, ByVal schDataSource As ESRI.ArcGIS.Schematic.ISchematicDataSource, ByVal QueryString As String, ByVal FieldNames As Object) As ESRI.ArcGIS.Schematic.ISchematicDiagramClass Dim schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass=Nothing Try schDiagClass=schDataset.CreateSchematicDiagramClass(DiagramClassName) Catch Return Nothing End Try schDiagClass.SchematicDataSource=schDataSource schDiagClass.ExternalQueryEvaluationMode=QueryMode schDiagClass.QueryString=QueryString schDiagClass.IdentifierFieldNames=FieldNames Return schDiagClass End Function ''' <summary> ''' Create a schematic feature class - basic creation ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new schematic feature class must be associated with</param> ''' <param name="ElementName">The name of the schematic feature class to create</param> ''' <param name="ClassType">The type of schematic element managed by this schematic feature class</param> ''' <param name="schDataSource">The ISchematicDataSource related to the query that must return the schematic features based on this class</param> ''' <param name="QueryString">The query string</param> ''' <param name="FieldNames">The field names used to build each schematic feature identifier</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="Geometry">The type of geometry for the schematic features based on this class</param> ''' <param name="QueryEvaluation">The evaluation mode for the query</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass</returns> ''' <remarks></remarks> Private Function CreateElementClass(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal ElementName As String, ByVal ClassType As ESRI.ArcGIS.Schematic.esriSchematicElementType, ByVal schDataSource As ESRI.ArcGIS.Schematic.ISchematicDataSource, ByVal QueryString As String, ByVal FieldNames As Object, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal Geometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal QueryEvaluation As ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass ' schematic feature class creation Dim schElement As ESRI.ArcGIS.Schematic.ISchematicElementClass=Nothing Try schElement=schDataset.CreateSchematicElementClass(ElementName, ClassType) Catch Return Nothing End Try schElement.ShapeField=BuildShapeField(Geometry, schDataset.SchematicWorkspace.Workspace) schElement.GeometryType=Geometry schElement.SchematicDataSource=schDataSource schElement.ExternalQueryEvaluationMode=QueryEvaluation schElement.QueryString=QueryString schElement.IdentifierFieldNames=FieldNames schElement.SchematicQueryParameters=QueryParameters ' if WithAssociation is True, the schematic feature class is associated with the specified input diagram class If (WithAssociation) Then schDiagClass.AssociateSchematicElementClass(schElement) Return schElement End Function ''' <summary> ''' Create a schematic feature class which inherits from another schematic feature class ''' </summary> ''' <param name="ParentClass">The parent ISchematicElementClass</param> ''' <param name="schDataset">The ISchematicDataset where the schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new schematic feature class must be associated with</param> ''' <param name="ElementName">The name of the schematic feature class to create</param> ''' <param name="ClassType">The type of schematic element managed by this schematic feature class</param> ''' <param name="schDataSource">The ISchematicDataSource related to the query that must return the schematic features based on this class</param> ''' <param name="QueryString">The query string</param> ''' <param name="FieldNames">The field names used to build each schematic feature identifier</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="Geometry">The type of geometry for the schematic features based on this class</param> ''' <param name="QueryEvaluation">The evaluation mode for the query</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass</returns> ''' <remarks></remarks> Private Function CreateSubElementClass(ByVal ParentClass As ESRI.ArcGIS.Schematic.ISchematicElementClass, ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal ElementName As String, ByVal ClassType As ESRI.ArcGIS.Schematic.esriSchematicElementType, ByVal schDataSource As ESRI.ArcGIS.Schematic.ISchematicDataSource, ByVal QueryString As String, ByVal FieldNames As Object, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal Geometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal QueryEvaluation As ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass Dim schElement As ESRI.ArcGIS.Schematic.ISchematicElementClass=Nothing Try ' schematic feature class creation schElement=CreateElementClass(schDataset, schDiagClass, ElementName, ClassType, schDataSource, QueryString, FieldNames, QueryParameters, Geometry, QueryEvaluation, WithAssociation) ' specifying the parent schematic feature class for the new schematic feature class schElement.Parent=ParentClass Catch Return Nothing End Try Return schElement End Function ''' <summary> ''' Create a node schematic feature class ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the node schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new node schematic feature class must be associated with</param> ''' <param name="ElementName">The name of the node schematic feature class to create</param> ''' <param name="TableName">The name of the table where the records related to the node schematic features must be queried</param> ''' <param name="FilterElementInTable">The filter that must be used to filter out the records</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass node schematic feature class</returns> ''' <remarks></remarks> Private Function CreateNode(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal ElementName As String, ByVal TableName As String, ByVal FilterElementInTable As String, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal TypeGeometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass Dim schEltClass As ESRI.ArcGIS.Schematic.ISchematicElementClass ' node schematic feature class creation schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE DOCID=?", New String() {"DOCID", "IDOBJECT", "Node"}, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation) ' creation of the set of attributes expected for node schematic features AddAttributeField(schEltClass, "DOCID", New String() {"DOCID"}) AddAttributeField(schEltClass, "ObjectId", New String() {"IDOBJECT"}) AddAttributeFormat(schEltClass, "Name", "%s-%s-Node", New String() {"DOCID", "ObjectId"}) AddAttributeField(schEltClass, "InitialXPosition", New String() {"XGeo"}) AddAttributeField(schEltClass, "InitialYPosition", New String() {"YGeo"}) AddAttributeField(schEltClass, "ParentId", New String() {"RelatedFOID"}) AddAttributeField(schEltClass, "InitialRotation", New String() {"Rotation"}) ' creation of the attributes used to manage container if the nodes based on this schematic feature class have relations with container schematic features AddAttributeField(schEltClass, "PTN", New String() {"RelatedFCName"}) AddAttributeFormat(schEltClass, "PEN", "%s-%s-Node", New String() {"DOCID", "ParentId"}) Return schEltClass End Function ''' <summary> ''' Create a node schematic feature class which inherits from another node schematic feature class ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the node schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new node schematic feature class must be associated with</param> ''' <param name="schParentClass">The parent ISchematicElementClass</param> ''' <param name="ElementName">The name of the node schematic feature class to create</param> ''' <param name="TableName">The name of the table where the records related to the node schematic features must be queried</param> ''' <param name="FilterElementInTable">The filter that must be used to filter out the records</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass node schematic feature class</returns> ''' <remarks></remarks> Private Function CreateChildNode(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal schParentClass As ESRI.ArcGIS.Schematic.ISchematicElementClass, ByVal ElementName As String, ByVal TableName As String, ByVal FilterElementInTable As String, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal TypeGeometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass ' schematic feature class creation with a parent node schematic feature class Dim schEltClass As ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateSubElementClass(schParentClass, schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", New String() {"DOCID", "IDOBJECT", "Node"}, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation) Return schEltClass End Function ''' <summary> ''' Create a link schematic feature class ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the link schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new link schematic feature class must be associated with</param> ''' <param name="ElementName">The name of the link schematic feature class to create</param> ''' <param name="TableName">The name of the table where the records related to the link schematic features must be queried</param> ''' <param name="FilterElementInTable">The filter that must be used to filter out the records</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass link schematic feature class</returns> ''' <remarks></remarks> Private Function CreateLinks(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal ElementName As String, ByVal TableName As String, ByVal FilterElementInTable As String, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal TypeGeometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass ' link schematic feature class creation Dim schEltClass As ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicLinkType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", New String() {"DOCID", "IDOBJECT", "Link"}, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation) ' creation of the set of attributes expected for link schematic features AddAttributeField(schEltClass, "ExtremityNode", New String() {"DOCID", "ToOID", "Node"}) AddAttributeField(schEltClass, "OriginNode", New String() {"DOCID", "FromOID", "Node"}) AddAttributeField(schEltClass, "InitialListPoints", New String() {"ListPoints"}) AddAttributeField(schEltClass, "DOCID", New String() {"DOCID"}) AddAttributeField(schEltClass, "ObjectId", New String() {"IDOBJECT"}) AddAttributeFormat(schEltClass, "Name", "%s-%s-Link", New String() {"DOCID", "ObjectId"}) Return schEltClass End Function ''' <summary> ''' Create a sublink schematic feature class ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the sublink schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new sublink schematic feature class must be associated with</param> ''' <param name="ElementName">The name of the sublink schematic feature class to create</param> ''' <param name="TableName">The name of the table where the records related to the sublink schematic features must be queried</param> ''' <param name="FilterElementInTable">The filter that must be used to filter out the records</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass sublink schematic feature class</returns> ''' <remarks></remarks> Private Function CreateSubLinks(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal ElementName As String, ByVal TableName As String, ByVal FilterElementInTable As String, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal TypeGeometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass ' sublink schematic feature class creation Dim schEltClass As ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicSubLinkType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", New String() {"DOCID", "IDOBJECT", "SubLink"}, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation) ' creation of the set of attributes expected for sublink schematic features AddAttributeField(schEltClass, "ExtremityNode", New String() {"DOCID", "ToOID", "Node"}) AddAttributeField(schEltClass, "OriginNode", New String() {"DOCID", "FromOID", "Node"}) AddAttributeField(schEltClass, "ReferenceLink", New String() {"DOCID", "ParentLink", "Link"}) AddAttributeField(schEltClass, "DOCID", New String() {"DOCID"}) AddAttributeField(schEltClass, "ObjectId", New String() {"IDOBJECT"}) AddAttributeFormat(schEltClass, "Name", "%s-%s-SubLink", New String() {"DOCID", "ObjectId"}) Return schEltClass End Function ''' <summary> ''' Create a node-on-link schematic feature class ''' </summary> ''' <param name="schDataset">The ISchematicDataset where the node-on-link schematic feature class must be created</param> ''' <param name="schDiagClass">The ISchematicDiagramClass the new node-on-link schematic feature class must be associated with</param> ''' <param name="ElementName">The name of the node-on-link schematic feature class to create</param> ''' <param name="TableName">The name of the table where the records related to the node-on-link schematic features must be queried</param> ''' <param name="FilterElementInTable">The filter that must be used to filter out the records</param> ''' <param name="QueryParameters">ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter</param> ''' <param name="TypeGeometry">The type of geometry for the schematic features based on this class</param> ''' <param name="WithAssociation">If True, the schematic feature class is associated with the specified input diagram class</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicElementClass node-on-link schematic feature class</returns> ''' <remarks></remarks> Private Function CreateNodeOnLink(ByVal schDataset As ESRI.ArcGIS.Schematic.ISchematicDataset, ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal ElementName As String, ByVal TableName As String, ByVal FilterElementInTable As String, ByVal QueryParameters As ESRI.ArcGIS.Schematic.IEnumSchematicQueryParameter, ByVal TypeGeometry As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal WithAssociation As Boolean) As ESRI.ArcGIS.Schematic.ISchematicElementClass ' node-on-link schematic feature class creation Dim schEltClass As ESRI.ArcGIS.Schematic.ISchematicElementClass schEltClass=CreateElementClass(schDataset, schDiagClass, ElementName, ESRI.ArcGIS.Schematic.esriSchematicElementType.esriSchematicNodeOnLinkType, schDataset.DefaultSchematicDataSource, "SELECT * FROM " + TableName + " WHERE OBJECTTYPE='" + FilterElementInTable + "' AND DOCID=?", New String() {"DOCID", "IDOBJECT", "Node"}, QueryParameters, TypeGeometry, ESRI.ArcGIS.Schematic.esriSchematicExternalQueryEvaluationMode.esriSchematicQueryBuildEvaluation, WithAssociation) ' creation of the set of attributes expected for node-on-link schematic features AddAttributeField(schEltClass, "DOCID", New String() {"DOCID"}) AddAttributeField(schEltClass, "InitialRotation", New String() {"Rotation"}) AddAttributeField(schEltClass, "ObjectId", New String() {"IDOBJECT"}) AddAttributeField(schEltClass, "RelativePosition", New String() {"PositionOnLink"}) AddAttributeField(schEltClass, "ReferenceLink", New String() {"DOCID", "ParentLink", "Link"}) AddAttributeFormat(schEltClass, "Name", "%s-%s-Node", New String() {"DOCID", "ObjectId"}) Return schEltClass End Function #End Region #Region "Attributes" ''' <summary> ''' Create an attribute on a schematic diagram class ''' </summary> ''' <param name="schDiagClass">The ISchematicDiagramClass where the attribute must be created</param> ''' <param name="AttributeName">The name of the new attribute</param> ''' <param name="AttribType">The type of attribute</param> ''' <param name="EvalMode">The evaluation mode for the attribute</param> ''' <param name="StorageMode">The storage mode for the attribute</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicAttribute</returns> ''' <remarks></remarks> Private Function CreateAttribute(ByVal schDiagClass As ESRI.ArcGIS.Schematic.ISchematicDiagramClass, ByVal AttributeName As String, ByVal AttribType As EnumAtttributeType, ByVal EvalMode As ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode, ByVal StorageMode As ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode) As ESRI.ArcGIS.Schematic.ISchematicAttribute Dim schAttribute As ESRI.ArcGIS.Schematic.ISchematicAttribute=Nothing Try Dim pUid As ESRI.ArcGIS.esriSystem.UID=New ESRI.ArcGIS.esriSystem.UID() pUid.Value=GetAttributeType(AttribType) schAttribute=schDiagClass.CreateSchematicAttribute(AttributeName, pUid) Catch Return Nothing End Try Dim schAttributeMngt As ESRI.ArcGIS.Schematic.ISchematicAttributeManagement=TryCast(schAttribute, ESRI.ArcGIS.Schematic.ISchematicAttributeManagement) Try ' the StorageMode must be set before the EvaluationMode ' consistenty is checked when the EvaluationMode is set schAttributeMngt.StorageMode=StorageMode schAttributeMngt.EvaluationMode=EvalMode Catch ' an error is returned if the StorageMode and EvaluationMode are not consistent End Try Return schAttribute End Function ''' <summary> ''' Create an attribute on a schematic feature class ''' </summary> ''' <param name="schElementClass">The ISchematicElementClass where the attribute must be created</param> ''' <param name="AttributeName">The name of the new attribute</param> ''' <param name="AttribType">The type of attribute</param> ''' <param name="EvalMode">The evaluation mode for the attribute</param> ''' <param name="StorageMode">The storage mode for the attribute</param> ''' <returns>The created ESRI.ArcGIS.Schematic.ISchematicAttribute</returns> ''' <remarks></remarks> Private Function CreateAttribute(ByVal schElementClass As ESRI.ArcGIS.Schematic.ISchematicElementClass, ByVal AttributeName As String, ByVal AttribType As EnumAtttributeType, ByVal EvalMode As ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode, ByVal StorageMode As ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode) As ESRI.ArcGIS.Schematic.ISchematicAttribute Dim schAttribute As ESRI.ArcGIS.Schematic.ISchematicAttribute=Nothing Try Dim pUid As ESRI.ArcGIS.esriSystem.UID=New ESRI.ArcGIS.esriSystem.UID() pUid.Value=GetAttributeType(AttribType) schAttribute=schElementClass.CreateSchematicAttribute(AttributeName, pUid) Catch Return Nothing End Try Dim schAttributeMngt As ESRI.ArcGIS.Schematic.ISchematicAttributeManagement=TryCast(schAttribute, ESRI.ArcGIS.Schematic.ISchematicAttributeManagement) Try ' the StorageMode must be set before the EvaluationMode ' consistenty is checked when the EvaluationMode is set schAttributeMngt.StorageMode=StorageMode schAttributeMngt.EvaluationMode=EvalMode Catch ' an error is returned if the StorageMode and EvaluationMode are not consistent End Try Return schAttribute End Function ''' <summary> ''' Add a constant schematic attribute on a schematic feature class ''' </summary> ''' <param name="schElementClass">The schematic feature class where the constant attribute must be created</param> ''' <param name="AttributeName">The name of the constant schematic attribute</param> ''' <param name="value">The constant value for the created schematic attribute</param> ''' <remarks></remarks> Private Sub AddAttributeConst(ByVal schElementClass As ESRI.ArcGIS.Schematic.ISchematicElementClass, ByVal AttributeName As String, ByVal value As String) Dim schAttConst As ESRI.ArcGIS.Schematic.ISchematicAttributeConstant schAttConst=TryCast(CreateAttribute(schElementClass, AttributeName, EnumAtttributeType.AttributeConstant, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeOnTheFlyEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeNoStorage), ESRI.ArcGIS.Schematic.ISchematicAttributeConstant) If (schAttConst IsNot Nothing) Then schAttConst.ConstantValue=value End Sub ''' <summary> ''' Add a field schematic attribute on a schematic feature class ''' </summary> ''' <param name="schElementClass">The schematic feature class where the field attribute must be created</param> ''' <param name="AttributeName">The name of the constant schematic attribute</param> ''' <param name="FieldNames">The FieldNames for the created schematic attribute()</param> ''' <remarks></remarks> Private Sub AddAttributeField(ByVal schElementClass As ESRI.ArcGIS.Schematic.ISchematicElementClass, ByVal AttributeName As String, ByVal FieldNames As String()) Dim schAttField As ESRI.ArcGIS.Schematic.ISchematicAttributeField schAttField=TryCast(CreateAttribute(schElementClass, AttributeName, EnumAtttributeType.AttributeField, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeBuildEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeNoStorage), ESRI.ArcGIS.Schematic.ISchematicAttributeField) If (schAttField IsNot Nothing) Then schAttField.FieldNames=FieldNames End Sub ''' <summary> ''' Add a formatted schematic attribute on a schematic feature class ''' </summary> ''' <param name="schElementClass">The schematic feature class where the formatted attribute must be created</param> ''' <param name="AttributeName">The name of the formatted schematic attribute</param> ''' <param name="sFormat">The Format for the created schematic attribute</param> ''' <param name="ParameterNames">The ParameterNames for the created schematic attribute()</param> ''' <remarks></remarks> Private Sub AddAttributeFormat(ByVal schElementClass As ESRI.ArcGIS.Schematic.ISchematicElementClass, ByVal AttributeName As String, ByVal sFormat As String, ByVal ParameterNames As String()) Dim schAttField As ESRI.ArcGIS.Schematic.ISchematicAttributeFormatted schAttField=TryCast(CreateAttribute(schElementClass, AttributeName, EnumAtttributeType.AttributeFormatted, ESRI.ArcGIS.Schematic.esriSchematicAttributeEvaluationMode.esriSchematicAttributeBuildEvaluation, ESRI.ArcGIS.Schematic.esriSchematicAttributeStorageMode.esriSchematicAttributeNoStorage), ESRI.ArcGIS.Schematic.ISchematicAttributeFormatted) If (schAttField IsNot Nothing) Then schAttField.Format=sFormat schAttField.ParameterNames=ParameterNames End If End Sub #End Region #Region "Others" ''' <summary> ''' Building the Shape field for container schematic features ''' </summary> ''' <param name="geometryType">The type of geometry the Shape must manage</param> ''' <param name="pWorkspace">The impacted IWorkspace</param> ''' <returns>The created ESRI.ArcGIS.Geodatabase.IField Shape field</returns> ''' <remarks></remarks> Private Function BuildShapeField(ByVal geometryType As ESRI.ArcGIS.Geometry.esriGeometryType, ByVal pWorkspace As ESRI.ArcGIS.Geodatabase.IWorkspace) As ESRI.ArcGIS.Geodatabase.IField Dim ipShapeField As ESRI.ArcGIS.Geodatabase.IField=Nothing Try Dim ipSpatialReference As ESRI.ArcGIS.Geometry.ISpatialReference=TryCast(New ESRI.ArcGIS.Geometry.UnknownCoordinateSystem(), ESRI.ArcGIS.Geometry.ISpatialReference) If (ipSpatialReference Is Nothing) Then Return Nothing Dim ipSpatialReferenceResolution As ESRI.ArcGIS.Geometry.ISpatialReferenceResolution=TryCast(ipSpatialReference, ESRI.ArcGIS.Geometry.ISpatialReferenceResolution) If (ipSpatialReferenceResolution IsNot Nothing) Then ' initializing the resolution (and so the domain) if needed Dim xyRes As Double=ipSpatialReferenceResolution.XYResolution(False) If (System.Double.IsNaN(xyRes)) Then ipSpatialReferenceResolution.SetDefaultXYResolution() End If Dim ipSpatialReferenceTolerance As ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance=TryCast(ipSpatialReference, ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance) ' initializing the tolerance if needed If (ipSpatialReferenceTolerance IsNot Nothing AndAlso ipSpatialReferenceTolerance.XYToleranceValid <> ESRI.ArcGIS.Geometry.esriSRToleranceEnum.esriSRToleranceOK) Then ipSpatialReferenceTolerance.SetDefaultXYTolerance() Dim ipAdjustedSpatialReference As ESRI.ArcGIS.Geometry.ISpatialReference=ConstructSpatialReference(pWorkspace, ipSpatialReference) If (ipAdjustedSpatialReference Is Nothing) Then ipAdjustedSpatialReference=ipSpatialReference ipShapeField=New ESRI.ArcGIS.Geodatabase.Field() Dim ipGeometryDefEdit As ESRI.ArcGIS.Geodatabase.IGeometryDefEdit=TryCast(New ESRI.ArcGIS.Geodatabase.GeometryDef(), ESRI.ArcGIS.Geodatabase.IGeometryDefEdit) If (ipShapeField Is Nothing OrElse ipGeometryDefEdit Is Nothing) Then Return Nothing ipGeometryDefEdit.SpatialReference_2=ipAdjustedSpatialReference ipGeometryDefEdit.GeometryType_2=geometryType ipGeometryDefEdit.HasZ_2=False If (geometryType=ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline) Then ipGeometryDefEdit.HasM_2=True If (ipSpatialReferenceResolution IsNot Nothing) Then ' initializing the resolution (and so domain) if needed Dim interval As Double=ipSpatialReferenceResolution.MResolution If (System.Double.IsNaN(interval)) Then ipSpatialReferenceResolution.SetDefaultMResolution() End If ' initializing the tolerance if needed If (ipSpatialReferenceTolerance IsNot Nothing AndAlso ipSpatialReferenceTolerance.MToleranceValid <> ESRI.ArcGIS.Geometry.esriSRToleranceEnum.esriSRToleranceOK) Then ipSpatialReferenceTolerance.SetMinimumMTolerance() End If Else ipGeometryDefEdit.HasM_2=False End If Dim ipShapeFieldEdit As ESRI.ArcGIS.Geodatabase.IFieldEdit=TryCast(ipShapeField, ESRI.ArcGIS.Geodatabase.IFieldEdit) ipShapeFieldEdit.IsNullable_2=True ipShapeFieldEdit.Name_2="SHAPE" ipShapeFieldEdit.Type_2=ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeGeometry ipShapeFieldEdit.GeometryDef_2=TryCast(ipGeometryDefEdit, ESRI.ArcGIS.Geodatabase.IGeometryDef) Catch ex As Exception ipShapeField=Nothing ' don't use any verbose option if throwing error Throw New SystemException(ex.Message, ex.InnerException) End Try Return ipShapeField End Function ''' <summary> ''' SpatialReference construction for the Shape field ''' </summary> ''' <param name="pWorkspace">ESRI.ArcGIS.Geodatabase.IWorkspace</param> ''' <param name="pSpatialref">ESRI.ArcGIS.Geometry.ISpatialReference</param> ''' <returns>ESRI.ArcGIS.Geometry.ISpatialReference</returns> ''' <remarks></remarks> Private Function ConstructSpatialReference(ByVal pWorkspace As ESRI.ArcGIS.Geodatabase.IWorkspace, ByVal pSpatialref As ESRI.ArcGIS.Geometry.ISpatialReference) As ESRI.ArcGIS.Geometry.ISpatialReference If (pWorkspace Is Nothing OrElse pSpatialref Is Nothing) Then Return Nothing Dim ipOutputSR As ESRI.ArcGIS.Geometry.ISpatialReference=Nothing Dim ipWSProperty As ESRI.ArcGIS.Geodatabase.IWorkspaceProperty=TryCast(pWorkspace, ESRI.ArcGIS.Geodatabase.IWorkspaceProperties).Property(ESRI.ArcGIS.Geodatabase.esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup, CInt(ESRI.ArcGIS.Geodatabase.esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage)) Dim highPrecisionDB As Boolean=CBool(ipWSProperty.PropertyValue) Dim highPrecisionSR As Boolean=(TryCast(pSpatialref, ESRI.ArcGIS.Geometry.IControlPrecision2)).IsHighPrecision If (highPrecisionSR AndAlso Not highPrecisionDB) Then ' Need to create a low precision spatial reference Dim Xmin As Double=0 Dim Ymin As Double=0 Dim Xmax As Double=0 Dim Ymax As Double=0 pSpatialref.GetDomain(Xmin, Xmax, Ymin, Ymax) Dim ipEnv As ESRI.ArcGIS.Geometry.IEnvelope=TryCast(New ESRI.ArcGIS.Geometry.Envelope(), ESRI.ArcGIS.Geometry.IEnvelope) ipEnv.PutCoords(Xmin, Ymin, Xmax, Ymax) Dim ipSpatialReferenceFactory As ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3=TryCast(New ESRI.ArcGIS.Geometry.SpatialReferenceEnvironment(), ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3) Try ipOutputSR=ipSpatialReferenceFactory.ConstructLowPrecisionSpatialReference(True, pSpatialref, ipEnv) Catch ' Ignore(errors) End Try If (ipOutputSR Is Nothing) Then ipOutputSR=ipSpatialReferenceFactory.ConstructLowPrecisionSpatialReference(False, pSpatialref, ipEnv) End If If (Not highPrecisionSR AndAlso highPrecisionDB) Then ' Create an equivalent high precision spatial reference Dim ipSRTolerance As ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance=TryCast(pSpatialref, ESRI.ArcGIS.Geometry.ISpatialReferenceTolerance) ipSRTolerance.SetMinimumXYTolerance() ipSRTolerance.SetMinimumZTolerance() ipSRTolerance.SetMinimumMTolerance() Dim ipSpatialReferenceFactory As ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3=TryCast(New ESRI.ArcGIS.Geometry.SpatialReferenceEnvironment(), ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3) ipOutputSR=ipSpatialReferenceFactory.ConstructHighPrecisionSpatialReference(pSpatialref, -1, -1, -1) If (ipOutputSR Is Nothing) Then ipOutputSR=ipSpatialReferenceFactory.ConstructHighPrecisionSpatialReference(pSpatialref, -1, -1, -1) End If Return ipOutputSR End Function #End Region End Class