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