Encontrei um problema estranho ao tentar preencher uma classe de recurso de anotação programaticamente (ArcObjects, C #). Como você pode ver na imagem abaixo, os caracteres em cada sequência de texto parecem estar empilhados um sobre o outro, em vez de serem dispostos horizontalmente, como eu esperava.
Estou puxando vários valores do MySQL (criados por um aplicativo diferente), e esses ficam bem no depurador. Eu tentei usar uma mistura de sistema de coordenadas desconhecido / projetado, bem como algumas interfaces de elemento diferentes. Se alguém já viu e venceu esse problema antes, eu certamente apreciaria um empurrão na direção certa.
Aqui está a parte relevante do meu c #:
IFeature feature = featureClass.CreateFeature();
ITextElement textElement = new TextElementClass();
textElement.Text = textString; // value like: '183
IElement element = textElement as IElement;
element.Geometry = pointGeom; // Point: x=2986785, y=629058
(feature as IAnnotationFeature2).Annotation = element;
(feature as IAnnotationFeature2).AnnotationClassID = 0;
(feature as IAnnotationFeature2).Status = annoStatus; // ESRI constant for 0, "placed"
feature.Store();
E, como prometido, aqui estão os resultados que estou obtendo:
[Atualizar]
De acordo com o conselho do @ Radar, tentei a seguinte revisão, mas ela ainda processa o texto da anotação empilhada / sobreposta:
ISymbolCollectionElement scElement = new TextElementClass();
scElement.CharacterSpacing = 5;
scElement.Geometry = pointGeom;
scElement.Text = textString;
(feature as IAnnotationFeature2).Annotation = scElement as IElement;
(feat as IAnnotationFeature2).AnnotationClassID = 0;
(feat as IAnnotationFeature2).Status = annoStatus;
Alguém tem alguma ideia adicional?
[Segunda atualização]
Basicamente, estou tentando realizar o que o @murdoch fez neste post "antigo" do ArcScripts (veja sua segunda entrada). Revi sua abordagem novamente e notei que ele estava usando a interface IFormattedTextSymbol, então tentei isso, mas continuo tendo o mesmo problema com o texto empilhado / sobreposto nas anotações colocadas. Aqui está o meu último impulso de C #:
IFeature feature = featureClass.CreateFeature();
IFontDisp font = new StdFontClass() as IFontDisp;
font.Name = "Arial";
font.Bold = true;
// font.Size = 30;
// load in some reasonable default values..
IFormattedTextSymbol fmtTextSymb = new TextSymbolClass();
fmtTextSymb.Font = font;
fmtTextSymb.Size = 30;
fmtTextSymb.VerticalAlignment = esriTextVerticalAlignment.esriTVABottom;
fmtTextSymb.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft;
fmtTextSymb.Angle = 0;
fmtTextSymb.CharacterSpacing = 100;
fmtTextSymb.CharacterWidth = 100;
fmtTextSymb.FlipAngle = 90;
fmtTextSymb.Leading = 0;
fmtTextSymb.WordSpacing = 100;
fmtTextSymb.Text = textString; // my special text value..
ITextElement textElement = new TextElementClass();
textElement.Symbol = fmtTextSymb;
textElement.Text = textString;
IElement element = textElement as IElement;
element.Geometry = pt;
(feature as IAnnotationFeature2).Annotation = element;
feature.Store();
Alguém tem problema com isso? ou tem uma implementação favorecida? Aqui está o que parece agora; como você pode ver, a abordagem mudou um pouco, mas os resultados são os mesmos:
[Terceira atualização]
Na análise final, o problema não era o código que eu usei para criar as anotações individuais, mas como @Kirk Kuykendall revelou, o problema foi como eu criei meu AnnotationLayer inicialmente IAnnotationLayerFactory.CreateAnnotationLayer()
. Eu estava enviando null
para o IGraphicsLayerScale
argumento, assumindo que ele resolveria valores funcionais, se não feios, padrão. Aparentemente isso não acontece. Eu criei esse objeto da seguinte maneira, e ele corrigiu meu problema:
// Set the map scale and units the annos should be "cooked for".
// To get ReferenceScale, open ArcMap and zoom to an appropriate level.
// In the Standard toolbar, click the 1:N button (tip says "MapScale").
// It'll output something like 1:1,200. Drop the 1: and the comma
// and that's the value you want for ReferenceScale.
IGraphicsLayerScale graphicsLayerScale = new GraphicsLayerScaleClass();
graphicsLayerScale.ReferenceScale = 1200;
graphicsLayerScale.Units = esriUnits.esriFeet; // this should agree with your proj
Voila!