ArcEngine注记旋转功能的实现Annotation Rotate
我们可以使用ITransform2D来进行旋转,主要是提示:Rotate方法传入的是弧度,而不是角度,可参照如下代码:
Sub GetAnnotationAttributes() Dim n As Integer Dim rAngle As Integer Dim pDoc As IMxDocument Set pDoc = ThisDocument Dim pMap As IMap Set pMap = pDoc.FocusMap Dim pMxDoc As IMxDocument Dim pElement As IElement Set pMxDoc = ThisDocument Dim pActiveView As IActiveView Set pActiveView = pMxDoc.ActivatedView Set pMap = pActiveView Dim pLayer As ILayer Dim pFLayer As IFeatureLayer Dim pFeat As IFeature Set pLayer = pMap.Layer(0) If TypeOf pLayer Is IFeatureLayer Then Set pFLayer = pLayer Else MsgBox "The first layer must be an annotation layer" Exit Sub End If Dim pFC As IFeatureClass Set pFC = pFLayer.FeatureClass If Not pFC.FeatureType = esriFTAnnotation Then MsgBox "The first layer must be an annotation layer" Exit Sub End If Dim FCursor As IFeatureCursor Set FCursor = pFC.Update(Nothing, False) Dim pAnnoFeat As IAnnotationFeature Dim pTextElt As ITextElement Dim pTextSym As IFormattedTextSymbol Set pAnnoFeat = FCursor.NextFeature Do While Not pAnnoFeat Is Nothing Set pTextElt = pAnnoFeat.Annotation Set pTextSym = pTextElt.Symbol Set pFeat = pAnnoFeat Dim pEnv As IEnvelope Set pEnv = pFeat.Shape.Envelope 'pMxDoc.ActiveView.ScreenDisplay.DisplayTransformation.FittedBounds pEnv.Expand 0.01, 0.01, True Set pElement = pTextElt pElement.Geometry = pEnv.UpperLeft n = 6 ' Have to change the TextSymbol.Angle to the TextElement If (pTextSym.Angle < (0 + n)) Then rAngle = 0 End If If (pTextSym.Angle > (365 - n)) Then rAngle = 0 End If If ((pTextSym.Angle < (270 + n)) And (pTextSym.Angle > (270 - n))) Then rAngle = 90 End If If ((pTextSym.Angle < (90 + n)) And (pTextSym.Angle > (90 - n))) Then rAngle = 90 End If ' here's the workaround Dim pTrans2D As ITransform2D Set pTrans2D = pElement pTrans2D.Rotate pEnv.UpperLeft, rAngle ' any point would do ' end of workaround pMxDoc.ActiveView.PartialRefresh esriViewGraphics, pElement, Nothing Set pAnnoFeat = FCursor.NextFeature Loop pMxDoc.ActiveView.PartialRefresh esriViewGraphics, Nothing, Nothing MsgBox "Finished Rotating Text", vbInformation, "Text Rotation" End Su Dim pAnnoElement As IElement Set pAnnoElement = pAnnoFeature.Annotation Dim dAngle as Double dAngle = GetAngle(pAnnoElement.Geometry) Private Function GetAngle(ByVal pPolyline As IPolyline) As Double Const PI As Double = 3.14159 Dim ppolycurve As IPolycurve Dim pTangentLine As ILine Dim Length As Double Dim radAngle As Double Dim degAngle As Double Set pTangentLine = New Line Length = pPolyline.Length pPolyline.QueryTangent esriNoExtension, 0.5, True, Length, pTangentLine radAngle = pTangentLine.Angle degAngle = radAngle * 57.2958279087978 '57 = (180 / PI) Do While degAngle < 0 degAngle = degAngle + 360 Loop GetAngle = degAngle End Function