About the Create custom move, rotate, and scale GeometricEffects within a single project Sample
[C#]
clsGE_Transform_Move.cs
[Visual Basic .NET]
clsGE_Transform_Move.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_Move
Implements IGeometricEffect
Implements IGraphicAttributes
Implements IPersistVariant
Implements IEditInteraction
#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 = "39509DF8-376C-4dae-9B02-B7A5F06490A4"
#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
' ------------------------------------------------------------------------------------
' ArcGIS developer sample of a simple geometric effect for use in representation rules
' It moves the display geometry by a given x,y amount
' ------------------------------------------------------------------------------------
' Declare private variables used by this class
Dim m_dOffsetX As Double ' the amount to move in X
Dim m_dOffsetY As Double ' the amount to move in Y
Dim m_bDone As Boolean ' flag for no more geometries
Dim m_pGeom As IGeometry ' current geometry being moved
Dim m_pTransform As ITransform2D ' geometry transformation
Dim m_pCloneGeom As ESRI.ArcGIS.esriSystem.IClone ' so can replicate geometry
Dim m_pGeomCopy As IGeometry ' handle on the copied geometry
' Initialize method gets called once, to set things up
Private Sub Class_Initialize_Renamed()
m_dOffsetX = 0.1 ' default move offset is right a bit ...
m_dOffsetY = -0.1 ' ... and down a bit
End Sub
Public Sub New()
MyBase.New()
Class_Initialize_Renamed()
End Sub
Public ReadOnly Property IsEditableAttribute(ByVal editParams As Object, ByVal attrIndex As Integer) As Boolean Implements ESRI.ArcGIS.Display.IEditInteraction.IsEditableAttribute
Get
Dim pMove As ESRI.ArcGIS.Display.IMoveInteraction
pMove = editParams
If Not pMove Is Nothing Then
If (attrIndex = 0 Or attrIndex = 1) Then
Return True
End If
End If
Return False
End Get
End Property
Public Sub ModifyAttributes(ByVal editParams As Object, ByVal attrArray As Object) Implements ESRI.ArcGIS.Display.IEditInteraction.ModifyAttributes
Dim pMove As ESRI.ArcGIS.Display.IMoveInteraction
pMove = editParams
If Not pMove Is Nothing Then
If attrArray(0) = True Then
m_dOffsetX = m_dOffsetX + pMove.OffsetX
End If
If attrArray(1) = True Then
m_dOffsetY = m_dOffsetY + pMove.OffsetY
End If
End If
End Sub
' --------------------------------------------------------
' IPersistVariant interface
' Sets up persistence for this class, to store the current offset values
' --------------------------------------------------------
' Allocate a unique ID GUID for it
Public ReadOnly Property ID() As ESRI.ArcGIS.esriSystem.UID Implements ESRI.ArcGIS.esriSystem.IPersistVariant.ID
Get
Dim pUID As ESRI.ArcGIS.esriSystem.IUID
pUID = New ESRI.ArcGIS.esriSystem.UID
pUID.Value = "GETransformVBNet.clsGE_Transform_Move"
Return 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 = Stream.Read
m_dOffsetX = Stream.Read
m_dOffsetY = Stream.Read
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_dOffsetX)
Stream.Write(m_dOffsetY)
End Sub
Public ReadOnly Property ClassName() As String Implements ESRI.ArcGIS.Display.IGraphicAttributes.ClassName
Get
Return "Transform Move VBNet"
End Get
End Property
Public ReadOnly Property GraphicAttributeCount() As Integer Implements ESRI.ArcGIS.Display.IGraphicAttributes.GraphicAttributeCount
Get
Return 2
End Get
End Property
Public ReadOnly Property ID1(ByVal attrIndex As Integer) As Integer Implements ESRI.ArcGIS.Display.IGraphicAttributes.ID
Get
If (attrIndex >= 0 And attrIndex < 2) Then
Return attrIndex
End If
Return -1
End Get
End Property
Public ReadOnly Property IDByName(ByVal Name As String) As Integer Implements ESRI.ArcGIS.Display.IGraphicAttributes.IDByName
Get
If (Name = "X Offset Move") Then
Return 0
End If
If Name = "Y Offset Move" Then
Return 1
End If
Return -1
End Get
End Property
Public ReadOnly Property Name(ByVal attrId As Integer) As String Implements ESRI.ArcGIS.Display.IGraphicAttributes.Name
Get
If (attrId = 0) Then
Return "X Offset Move"
End If
If attrId = 1 Then
Return "Y Offset Move"
End If
Return -1
End Get
End Property
Public ReadOnly Property Type(ByVal attrId As Integer) As ESRI.ArcGIS.Display.IGraphicAttributeType Implements ESRI.ArcGIS.Display.IGraphicAttributes.Type
Get
If attrId = 0 Then
Return New ESRI.ArcGIS.Display.GraphicAttributeSizeType
End If
If attrId = 1 Then
Return New ESRI.ArcGIS.Display.GraphicAttributeSizeType
End If
Return Nothing
End Get
End Property
Public Property Value(ByVal attrId As Integer) As Object Implements ESRI.ArcGIS.Display.IGraphicAttributes.Value
Get
If attrId = 0 Then Return m_dOffsetX
If attrId = 1 Then Return m_dOffsetY
End Get
Set(ByVal value As Object)
If attrId = 0 Then m_dOffsetX = value
If attrId = 1 Then m_dOffsetY = value
End Set
End Property
Public Function NextGeometry() As IGeometry Implements ESRI.ArcGIS.Display.IGeometricEffect.NextGeometry
If m_bDone Then
Return 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.Move(m_dOffsetX, m_dOffsetY) ' by the offset amounts
m_bDone = True ' no more to do for this geometry
Return m_pGeomCopy ' return the moved geometry
End If
End Function
Public ReadOnly Property OutputType(ByVal inputType As esriGeometryType) As esriGeometryType Implements ESRI.ArcGIS.Display.IGeometricEffect.OutputType
Get
Return inputType
End Get
End Property
Public Sub Reset(ByVal Geometry As IGeometry) Implements ESRI.ArcGIS.Display.IGeometricEffect.Reset
m_pGeom = Geometry ' current geometry to be moved
m_pGeomCopy = Nothing ' discard any previous geometry copy
m_bDone = False ' still work to do
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
End Class