About the Create custom move, rotate, and scale GeometricEffects within a single project Sample
[C#]
clsGE_Transform_Rotate.cs
[Visual Basic .NET]
clsGE_Transform_Rotate.vb
Option Strict Off Option Explicit On Imports System Imports System.Collections.Generic Imports System.Text Imports ESRI.ArcGIS.Display Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.ADF.CATIDs Imports System.Runtime.InteropServices Public Class clsGE_Transform_Rotate Implements IGeometricEffect Implements IGraphicAttributes Implements IEditInteraction 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 = "BA911714-92DF-4691-9700-5F3E67B08E70" #End Region #Region "Component Category Registration" <ComRegisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub RegisterFunction(ByVal regkey As String) GeometricEffect.Register(regkey) End Sub <ComUnregisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub UnRegisterFunction(ByVal regkey As String) GeometricEffect.Unregister(regkey) End Sub #End Region ' ------------------------------------------------------------------------------------ ' GE_Transform_Rotate ' ArcGIS developer sample of a simple geometric effect for use in representation rules ' It rotates the display geometry by a given x,y amount ' ------------------------------------------------------------------------------------ ' Declare private variables used by this class Dim m_dAngle As Double ' the angle to rotate Dim m_bDone As Boolean ' flag for no more geometries Dim m_pGeom As IGeometry ' current geometry being rotated Dim m_pTransform As ITransform2D ' geometry transformation Dim m_pCloneGeom As IClone ' so can replicate geometry Dim m_pGeomCopy As IGeometry ' handle on the copied geometry Dim m_pCenterPoint As IPoint ' point to rotate about ' Initialize method gets called once, to set things up Private Sub Class_Initialize_Renamed() m_dAngle = 0 ' default rotate angle is zero m_pCenterPoint = New Point End Sub Public Sub New() MyBase.New() Class_Initialize_Renamed() End Sub ' -------------------------------------------------------- ' IGeometricEffect interface ' Applies the effect to a geometry ' -------------------------------------------------------- ' Determine whether line, polygon, or point geometry Private ReadOnly Property OutputType(ByVal inputType As esriGeometryType) As esriGeometryType Implements IGeometricEffect.OutputType Get If inputType = esriGeometryType.esriGeometryPolygon Then Return inputType ' OK If inputType = esriGeometryType.esriGeometryPolyline Then Return inputType ' OK Return esriGeometryType.esriGeometryNull ' assume won't work End Get End Property ' Start the work of applying the effect for this particular feature geometry Private Sub IGeometricEffect_Reset(ByVal Geometry As IGeometry) Implements IGeometricEffect.Reset m_pGeom = Geometry ' current geometry to be rotated m_pGeomCopy = Nothing ' discard any previous geometry copy Dim dXCenter As Double ' X coordinate of center Dim dYCenter As Double ' Y coordinate of center dXCenter = (m_pGeom.Envelope.XMin + m_pGeom.Envelope.XMax) / 2 ' find center ... dYCenter = (m_pGeom.Envelope.YMin + m_pGeom.Envelope.YMax) / 2 ' ... from envelope m_pCenterPoint.PutCoords(dXCenter, dYCenter) ' and store in a Point m_pCenterPoint.SpatialReference = m_pGeom.SpatialReference ' and in same coordinate space m_bDone = False ' still work to do End Sub ' Do the real work - calculate a rotated geometry Private Function IGeometricEffect_NextGeometry() As IGeometry Implements IGeometricEffect.NextGeometry If m_bDone Then IGeometricEffect_NextGeometry = Nothing Else m_pCloneGeom = m_pGeom ' but we need to copy so don't change original m_pGeomCopy = m_pCloneGeom.Clone ' make a copy m_pTransform = m_pGeomCopy ' now we need to transform the copy m_pTransform.Rotate(m_pCenterPoint, m_dAngle) ' by the angle IGeometricEffect_NextGeometry = m_pGeomCopy ' return the rotated geometry m_bDone = True ' no more to do for this geometry End If End Function ' -------------------------------------------------------- ' IGraphicAttributes Interface ' specifies how this effect appears in the graphic attributes form ' -------------------------------------------------------- ' Friendly name of effect is 'Transform Rotate' Private ReadOnly Property ClassName() As String Implements IGraphicAttributes.ClassName Get Return "Transform Rotate VBNet" End Get End Property ' Effect has one editable attribute ... Private ReadOnly Property GraphicAttributeCount() As Integer Implements IGraphicAttributes.GraphicAttributeCount Get Return 1 End Get End Property ' ... with attribute ID of 0 Private ReadOnly Property IGraphicAttributes_ID(ByVal attrIdx As Integer) As Integer Implements IGraphicAttributes.ID Get IGraphicAttributes_ID = -1 If attrIdx >= 0 And attrIdx < 1 Then Return attrIdx End Get End Property ' The attribute to the effect is called Angle ... Private ReadOnly Property IGraphicAttributes_IDByName(ByVal Name As String) As Integer Implements IGraphicAttributes.IDByName Get IGraphicAttributes_IDByName = -1 If Name = "Transform Angle" Then Return 0 End Get End Property ' ... corresponding to number 0 Private ReadOnly Property IGraphicAttributes_Name(ByVal Index As Integer) As String Implements IGraphicAttributes.Name Get If Index = 0 Then Return "Transform Angle" End Get End Property ' ... and it is a double attribute Private ReadOnly Property IGraphicAttributes_Type(ByVal Index As Integer) As IGraphicAttributeType Implements IGraphicAttributes.Type Get If Index = 0 Then Return New GraphicAttributeDoubleType End If If Index = 1 Then Return New GraphicAttributeDoubleType End If Return Nothing End Get End Property ' ... set to value ' ... or get current value Private Property IGraphicAttributes_Value(ByVal Index As Integer) As Object Implements IGraphicAttributes.Value Get If Index = 0 Then Return m_dAngle * 360.0# / 3.141592653 End Get Set(ByVal Value As Object) If Index = 0 Then m_dAngle = Value / 360.0# * 3.141592653 End Set End Property ' -------------------------------------------------------- ' IeditInteraction interface ' Allows use of edit tools to set rotate angles ' -------------------------------------------------------- ' Report back that it has an editable attributes Private ReadOnly Property IsEditableAttribute(ByVal editParams As Object, ByVal attrIndex As Integer) As Boolean Implements IEditInteraction.IsEditableAttribute Get Dim pRotate As IRotateInteraction pRotate = editParams If Not pRotate Is Nothing Then If attrIndex = 0 Then Return True End If End If Return False End Get End Property ' -------------------------------------------------------- ' IPersistVariant interface ' Sets up persistence for this class, to store the current angle value ' -------------------------------------------------------- ' Allocate a unique ID GUID for it Private ReadOnly Property IPersistVariant_ID() As UID Implements IPersistVariant.ID Get Dim pUID As IUID pUID = New UID pUID.Value = "GETransformVBNet.clsGE_Transform_Rotate" Return pUID End Get End Property ' Get the angle from the Rotate tool Private Sub IEditInteraction_ModifyAttributes(ByVal editParams As Object, ByVal attrs As Object) Implements IEditInteraction.ModifyAttributes Dim pRotate As IRotateInteraction pRotate = editParams If Not pRotate Is Nothing Then If attrs(0) = True Then m_dAngle = pRotate.Angle End If End If End Sub ' read the angle value from the stream Private Sub IPersistVariant_Load(ByVal Stream As IVariantStream) Implements IPersistVariant.Load Dim version As Integer version = Stream.Read m_dAngle = Stream.Read End Sub ' Write the angle value to the stream Private Sub IPersistVariant_Save(ByVal Stream As IVariantStream) Implements IPersistVariant.Save Dim version As Integer version = 1 Stream.Write(version) Stream.Write(m_dAngle) End Sub End Class