About Text annotation format

01-24-2018 12:27 AM
New Contributor III

Hi ,

We are develope tools using text annotation in 2.1 new sdk. We have a symbol showing the width of the drawn vehicle rout ,how can we create this symbol with text annotation in the format shown below (picture) ? Ican create only 12 with text annotation but I can not create the others.

Text Annotation


Best Regards 

0 Kudos
2 Replies
New Contributor III

Hello, If I'm understanding correctly all you need to get the text you want within your circular point symbol callout is tags. The text string would be `12<SUP> <UND>00</UND></SUP>`. I hope that answers your question. 


Esri Contributor


2.1 was the first release of annotation and we are working on enhancing the API for 2.2, 2.3, etc.

Currently, to make a annotation symbol similar to the above requires:

  • An edit operation (currently you have to use the edit operation callback for 2.1) to handle the transation
  • Modifying the CIMTextGraphic of the annotation feature to "be" the text symbol you need (a point callout in your case above)
  • Modify the text string (using the text expression tags Ciara mentions above that can be referenced here: http://pro.arcgis.com/en/pro-app/help/mapping/text/text-formatting-tags.htm

The CIM is where it can get tricky - especially for a complex symbol as you have above. This is a complete example that will change whichever annotation feature you have selected to be a circle with the text "12 00"

internal class ChangeSymbol : Button
    protected async override void OnClick()
      var annoLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<AnnotationLayer>().FirstOrDefault();
      if (annoLayer == null)

      await QueuedTask.Run(() => {

        var select = annoLayer.GetSelection();
        if (select.GetObjectIDs().Count() > 0)
          var oid = select.GetObjectIDs().First();
          QueryFilter qf = new QueryFilter()
            WhereClause = $"OBJECTID = {oid}"
          var rowCursor = annoLayer.GetTable().Search(qf, false);
          var annoFeature = rowCursor.Current as ArcGIS.Core.Data.Mapping.AnnotationFeature;
          var graphic = annoFeature.GetGraphic();
          var textGraphic = graphic as CIMTextGraphic;

          var op = new EditOperation();
          op.Name = "Change Anno";
          op.Callback((context) => {
            //make the callout for the circle
            var callOut = new CIMPointSymbolCallout();
            callOut.PointSymbol = new CIMPointSymbol();
            //Circle outline
            var circle_outline = SymbolFactory.Instance.ConstructMarker(40, "ESRI Default Marker") as CIMCharacterMarker;
            circle_outline.Size = 30;
            //eliminate the outline
            foreach (var layer in circle_outline.Symbol.SymbolLayers)
              if (layer is CIMSolidStroke) {
                ((CIMSolidStroke) layer).Width = 0;

            //Circle fill
            var circle_fill = SymbolFactory.Instance.ConstructMarker(172, "ESRI Default Marker") as CIMCharacterMarker;
            circle_fill.Size = 30;
            //eliminate the outline, make sure the fill is white
            foreach (var layer in circle_fill.Symbol.SymbolLayers) {
              if (layer is CIMSolidFill) {
                ((CIMSolidFill)layer).Color = ColorFactory.Instance.WhiteRGB;
              else if (layer is CIMSolidStroke)
                ((CIMSolidStroke)layer).Width = 0;

            var calloutLayers = new List<CIMSymbolLayer>();
            //set the layers on the callout
            callOut.PointSymbol.SymbolLayers = calloutLayers.ToArray();

            //set the callout on the text symbol
            var textSym = textGraphic.Symbol.Symbol as CIMTextSymbol;
            textSym.Callout = callOut;
            textSym.Height = 8;//adjust as needed

            //now set the text
            textGraphic.Text = "12 <SUP><UND>00</UND></SUP>";
          }, annoLayer.GetTable());