We have developed functionality in ArcGIS Pro that lets us create annotations in ArcGIS Pro using the official Norwegian place names registry. The place names registry are presented as a point layer in Pro, and the user can select a place name point and 'push the button' to create an annotation. The annotation is assigned the correct place name registry attributes, and symbology (font, color, size etc) is automatically set based on the type of place name, including the Textstring attribute. However, the first time (and sometimes even the second time) the functionality is used in after starting Pro, the Textstring attribute is set to 'Text' and not the correct place name. 'Text' is the default value when creating a new annotation, and no value is given for Textstring. All other attributes are set correctly.
This problem started when we from ArcGIS Pro 3.4 to 3.5.
The code for creating annotation from place name registry-data looks like this:
private async Task<bool> LagAnnotationFraSSR(SSR_skrivemaate ssr_skrivemaate, string skriftkodetall)
{
bool result = await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
string skriftkode = "Sk" + skriftkodetall;
var fc = m_navnAnnoLayer.GetFeatureClass() as ArcGIS.Core.Data.Mapping.AnnotationFeatureClass;
var label = HentLabelForSkriftkode(fc, skriftkode);
// Finn tekstsymbol-ID for label/annotation class
var symbolName = label.TextSymbol.SymbolName;
var symbolID = HentSymbolIDForLabel(fc, symbolName);
Inspector inspector = m_navnLayer.GetTemplate(skriftkode).Inspector;
var annoProperties = inspector.GetAnnotationProperties();
inspector["AnnotationClassID"] = label.ID;
inspector["SymbolID"] = symbolID;
//THE PROBLEM IS THE FOLLOWING LINE
annoProperties.TextString = ssr_skrivemaate.Valgt_langnavn;
annoProperties.Shape = LagNavnGeometri(ssr_skrivemaate.SSRpunkt);
annoProperties.HorizontalAlignment = ArcGIS.Core.CIM.HorizontalAlignment.Left;
inspector["SKRIVEMAATENUMMER"] = ssr_skrivemaate.Skrivemaatenummer;
inspector["STEDSNUMMER"] = ssr_skrivemaate.Stedsnummer;
inspector["STEDSNAVNNUMMER"] = ssr_skrivemaate.Stedsnavnnummer;
inspector["SKRIVEMATE_ID"] = ssr_skrivemaate.Skrivemaate_ID;
inspector["SPRAK"] = ssr_skrivemaate.Spraak;
inspector["NAVNESTATUS"] = ssr_skrivemaate.Navnestatus;
inspector["NAVNTYPE"] = ssr_skrivemaate.Navneobjekttype_kodeverdi;
inspector["SNAVN"] = ssr_skrivemaate.Valgt_langnavn;
inspector["SKRIFTKODE"] = skriftkodetall;
inspector["OBJTYPE"] = "Tekst";
inspector.SetAnnotationProperties(annoProperties);
var createOperation = new EditOperation();
createOperation.Name = "Lag navn";
createOperation.SelectNewFeatures = true;
createOperation.Create(m_navnLayer.GetTemplate(skriftkode).Layer, inspector);
m_OpprettetFraSSR = true;
return createOperation.Execute();
});
return result;
}
I tried to change the TextString in ArcGIS Pro 3.5 and it worked if I understood the problem correctly
// Get the first annotation layer in the map
AnnotationLayer annoLayer = MapView.Active.Map.GetLayersAsFlattenedList()
.OfType<AnnotationLayer>().FirstOrDefault();
if (annoLayer == null)
return;
await QueuedTask.Run(() =>
{
// Open the table for the annotation layer
using (Table table = annoLayer.GetTable())
{
// Get the first row (or define your own query)
ArcGIS.Core.Data.QueryFilter qf = new ArcGIS.Core.Data.QueryFilter
{
WhereClause = "1=1",
SubFields = "*"
};
using (RowCursor cursor = table.Search(qf, false))
{
if (!cursor.MoveNext())
return;
using (Row row = cursor.Current)
{
long oid = row.GetObjectID();
// Load feature into Inspector
var insp = new Inspector();
insp.Load(annoLayer, oid);
// Get and update annotation properties
var annoProps = insp.GetAnnotationProperties();
annoProps.TextString = "Updated annotation text";
annoProps.FontSize = 24;
annoProps.HorizontalAlignment = ArcGIS.Core.CIM.HorizontalAlignment.Center;
annoProps.VerticalAlignment = ArcGIS.Core.CIM.VerticalAlignment.Bottom;
insp.SetAnnotationProperties(annoProps);
// Apply edit operation
var op = new EditOperation
{
Name = "Update annotation text",
SelectNewFeatures = false
};
op.Modify(insp);
if (!op.Execute())
{
System.Diagnostics.Debug.WriteLine("Failed to update annotation.");
}
}
}
}
});
Thanks for your your feedback!
Changing the textstring works, but not the first time the functionality is used. Then the textstring is only set to 'Text'. I have also tried to hardcode a textstring like you do
annoProperties.TextString = "PleaseDontBeText";
but the same still happens. I have no idea why, this has never happened before.
I have tried running isolated code like you do in your sample, and then this is not a problem. But we have also several other tools, that picks out attributevalues from features and turns them into annotations (for example, taking the altitude attribute of a lake feature and creating an annotation out of it). Then the problem is still there, the first time the code is run the textstring is set to 'Text' and not the altitude value.
We have had this code running for years, through various editions of Pro (both 2.x and 3.x), and this started happening with version 3.5.
I tried creating a new annotation feature class — it's working, could you please explain"but not the first time the functionality is used"
await QueuedTask.Run(() =>
{
// Get default GDB path
string gdbPath = Project.Current.DefaultGeodatabasePath;
var gdbConnection = new FileGeodatabaseConnectionPath(new Uri(gdbPath));
using (Geodatabase geodatabase = new Geodatabase(gdbConnection))
{
// Feature dataset name
string featureDatasetName = "Places";
// Annotation feature class name
string annotationFeatureClassName = "CitiesAnnotation";
// Create a SchemaBuilder object
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);
// Open existing annotation feature class name
using (AnnotationFeatureClass existingAnnotationFeatureClass = geodatabase.OpenDataset<AnnotationFeatureClass>("testanno"))
{
// Create Feature dataset description
FeatureDatasetDescription featureDatasetDescription =
new FeatureDatasetDescription(featureDatasetName, existingAnnotationFeatureClass.GetDefinition().GetSpatialReference());
// Add the creation of the Places dataset to DDL task
FeatureDatasetToken featureDatasetToken = schemaBuilder.Create(featureDatasetDescription);
// Create an annotation feature class description using existing annotation feature class
AnnotationFeatureClassDescription annotationFeatureClassDescription = new AnnotationFeatureClassDescription(annotationFeatureClassName, existingAnnotationFeatureClass.GetDefinition())
{
IsAutoCreate = true,
IsSymbolIDRequired = false,
IsUpdatedOnShapeChange = true
};
// Add the creation of the Cities annotation feature class inside Places feature dataset
schemaBuilder.Create(new FeatureDatasetDescription(featureDatasetToken), annotationFeatureClassDescription);
// Execute the DDL
bool success = schemaBuilder.Build();
// Inspect error messages
if (!success)
{
IReadOnlyList<string> errorMessages = schemaBuilder.ErrorMessages;
//etc.
}
var newAnnoFCPath = System.IO.Path.Combine(gdbPath, featureDatasetName, annotationFeatureClassName);
var annoLayer = LayerFactory.Instance.CreateLayer(new Uri(newAnnoFCPath), MapView.Active.Map) as AnnotationLayer;
var op = new EditOperation { Name = "Insert new annotation" };
var insp = new Inspector();
insp.LoadSchema(annoLayer);
var annoProps = insp.GetAnnotationProperties();
annoProps.TextString = "New City Annotation";
annoProps.FontSize = 16;
insp.SetAnnotationProperties(annoProps);
// Set shape to center of current map view
var centerPoint = MapView.Active.Extent.Center;
insp["SHAPE"] = centerPoint;
op.Create(annoLayer, insp);
if (!op.Execute())
System.Diagnostics.Debug.WriteLine("Annotation creation failed.");
}
}
});