About the Create a custom marker placement for placing markers around a point Sample
[C#]
AroundPoint.cs
[Visual Basic .NET]
AroundPoint.vb
Option Strict Off Option Explicit On Imports ESRI.ArcGIS.Display Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geometry Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.ADF.CATIDs Public Class AroundPoint Implements IGraphicAttributes Implements IMarkerPlacement Implements IPersistVariant #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "0021E82A-D5E4-45a9-879F-DB6CD5AA07B9" #End Region #Region "Component Category Registration" <ComRegisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub RegisterFunction(ByVal regkey As String) MarkerPlacement.Register(regkey) End Sub <ComUnregisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub UnRegisterFunction(ByVal regkey As String) MarkerPlacement.Unregister(regkey) End Sub #End Region ' A creatable COM class must have a Public Sub New() ' with no parameters, otherwise, the class will not be ' registered in the COM registry and cannot be created ' via CreateObject. '------------------------------------------------------------------------------------ ' This class has to be registered in COM category ESRI Representation Marker placement '------------------------------------------------------------------------------------ Dim m_Radius As Double Dim m_Number As Integer Dim m_X0 As Double Dim m_Y0 As Double Dim m_Iter As Integer Dim m_pT As IAffineTransformation2D Public ReadOnly Property ClassName() As String Implements ESRI.ArcGIS.Display.IGraphicAttributes.ClassName Get ClassName = "AroundPoint" End Get End Property Public ReadOnly Property GraphicAttributeCount() As Integer Implements ESRI.ArcGIS.Display.IGraphicAttributes.GraphicAttributeCount Get GraphicAttributeCount = 2 End Get End Property Public ReadOnly Property ID(ByVal attrIndex As Integer) As Integer Implements ESRI.ArcGIS.Display.IGraphicAttributes.ID Get ID = -1 If attrIndex >= 0 And attrIndex < 2 Then ID = attrIndex End Get End Property Public ReadOnly Property IDByName(ByVal Name As String) As Integer Implements ESRI.ArcGIS.Display.IGraphicAttributes.IDByName Get IDByName = -1 If Name = "Radius" Then IDByName = 0 If Name = "Number" Then IDByName = 1 End Get End Property Public ReadOnly Property Name(ByVal attrId As Integer) As String Implements ESRI.ArcGIS.Display.IGraphicAttributes.Name Get Name = "" If attrId = 0 Then Name = "Radius" If attrId = 1 Then Name = "Number" End Get End Property Public ReadOnly Property Type(ByVal attrId As Integer) As ESRI.ArcGIS.Display.IGraphicAttributeType Implements ESRI.ArcGIS.Display.IGraphicAttributes.Type Get Type = Nothing If attrId = 0 Then Type = New GraphicAttributeSizeType End If If attrId = 1 Then Type = New GraphicAttributeIntegerType End If End Get End Property Public Property Value(ByVal attrId As Integer) As Object Implements ESRI.ArcGIS.Display.IGraphicAttributes.Value Get If attrId = 0 Then Value = m_Radius If attrId = 1 Then Value = m_Number End Get Set(ByVal value As Object) If attrId = 0 Then m_Radius = value If attrId = 1 Then m_Number = value End Set End Property Public ReadOnly Property AcceptGeometryType(ByVal inputType As ESRI.ArcGIS.Geometry.esriGeometryType) As Boolean Implements ESRI.ArcGIS.Display.IMarkerPlacement.AcceptGeometryType Get If inputType = esriGeometryType.esriGeometryPoint Then AcceptGeometryType = True Else AcceptGeometryType = False End If End Get End Property Public Function NextTransformation() As ESRI.ArcGIS.Geometry.IAffineTransformation2D Implements ESRI.ArcGIS.Display.IMarkerPlacement.NextTransformation NextTransformation = Nothing Dim angle As Double Dim x As Object Dim y As Double If m_Iter <> m_Number Then angle = m_Iter * 2 * 3.141592 / m_Number x = m_X0 + m_Radius * System.Math.Cos(angle) y = m_Y0 + m_Radius * System.Math.Sin(angle) m_pT.Reset() m_pT.Rotate(angle) m_pT.Move(x, y) NextTransformation = m_pT m_Iter = m_Iter + 1 End If End Function Public Sub Reset(ByVal geom As ESRI.ArcGIS.Geometry.IGeometry) Implements ESRI.ArcGIS.Display.IMarkerPlacement.Reset m_Iter = -1 Dim pP As IPoint pP = geom If Not pP Is Nothing Then pP.QueryCoords(m_X0, m_Y0) m_Iter = 0 End If End Sub Public ReadOnly Property ID1() As ESRI.ArcGIS.esriSystem.UID Implements ESRI.ArcGIS.esriSystem.IPersistVariant.ID Get Dim pUID As UID pUID = New UID pUID.Value = "AroundPoint_MP.AroundPoint" ID1 = pUID End Get End Property Public Sub Load(ByVal Stream As ESRI.ArcGIS.esriSystem.IVariantStream) Implements ESRI.ArcGIS.esriSystem.IPersistVariant.Load Dim version As Integer version = CType(Stream.Read, Integer) m_Radius = CType(Stream.Read, Double) m_Number = CType(Stream.Read, Double) End Sub Public Sub Save(ByVal Stream As ESRI.ArcGIS.esriSystem.IVariantStream) Implements ESRI.ArcGIS.esriSystem.IPersistVariant.Save Dim version As Integer version = 1 Stream.Write(version) Stream.Write(m_Radius) Stream.Write(m_Number) End Sub Public Sub New() m_Radius = 10 m_Number = 6 m_pT = New AffineTransformation2D End Sub End Class