He encontrado un problema extraño al intentar completar una clase de entidad de anotación mediante programación (ArcObjects, C #). Como puede ver en la imagen a continuación, los caracteres en cada cadena de texto parecen apilarse unos sobre otros, en lugar de estar dispuestos horizontalmente como esperaba.
Estoy obteniendo varios valores de MySQL (creados por una aplicación diferente), y esos se ven bien en el depurador. Intenté usar una mezcla de sistema de coordenadas desconocido / proyectado, así como algunas interfaces de Elemento diferentes. Si alguien ha visto y conquistado este problema antes, seguramente agradecería un empujón en la dirección correcta.
Aquí está la parte relevante de mi 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();
Y como se prometió, aquí hay un vistazo a los resultados que estoy obteniendo:
[Actualizar]
Según el consejo de @ Radar, probé la siguiente revisión, pero aún muestra texto de anotación apilado / superpuesto:
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;
Alguien tiene alguna idea adicional?
[Segunda actualización]
Básicamente, estoy tratando de lograr lo que @murdoch hizo en esta "antigua" publicación de ArcScripts (vea su segunda entrada). Revisé su enfoque nuevamente y noté que está usando la interfaz IFormattedTextSymbol, así que lo intenté, pero sigo experimentando el mismo problema con el texto apilado / superpuesto en las anotaciones colocadas. Aquí está mi ú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();
¿Alguien tiene problemas con esto? o tener una implementación favorecida? Así es como se ve ahora; Como puede ver, el enfoque cambió un poco, pero los resultados son los mismos:
[Tercera actualización]
En el análisis final, el problema no era el código que usé para crear las anotaciones individuales, sino como reveló @Kirk Kuykendall, el problema fue cómo inicialmente creé mi AnnotationLayer IAnnotationLayerFactory.CreateAnnotationLayer()
. Estaba presentando null
el IGraphicsLayerScale
argumento, suponiendo que se resolvería a valores por defecto funcionales, si no feos. Aparentemente no lo hace. Creé ese objeto de la siguiente manera, y solucionó mi 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!