I am importing symbology from a layer as below. After updating the symbology, I update the label expression to use the label field in the current data. Once I turn on the labels however, the labels now have default properties; the label design from the imported layer is lost. Font size and style are off and the halo is removed. How can I maintain the layer file's labelling properties with my new data?
await QueuedTask.Run(() =>
{
var lyrDoc = new LayerDocument(LayerFilePath);
var cimLyrDoc = lyrDoc.GetCIMLayerDocument();
var rendFromLyrFile = ((CIMFeatureLayer)cimLyrDoc.LayerDefinitions[0]).Renderer as CIMUniqueValueRenderer;
rendFromLyrFile.Fields= new string[] { "SiteDesc" };
facLayer.SetRenderer(rendFromLyrFile);
});
//update the labels
await QueuedTask.Run(() =>
{
var def = facLayer.GetDefinition() as CIMFeatureLayer;
var listLabelClasses = def.LabelClasses.ToList();
var theLabelClass = listLabelClasses.FirstOrDefault();
theLabelClass.Expression = $"$feature.{divFieldnameFac} + ' ' + $feature.{divNameFieldnameFac}";//set the label class Expression to use the Arcade expression
facLayer.SetDefinition(def);
facLayer.SetLabelVisibility(true);
});
@CharlesMacleod @UmaHarano @Wolf
Solved! Go to Solution.
i believe there is a LabelClasses collection property on the layer definition. I think all u need to do is set that. A label class also has a text symbol property I believe - so I think you could just set _that_ on the default classes if, similar to the issue with the renderer, the classes in the layer document are not equivalent to the data in the layer.
in your code snippet it looks like you set the labelling expression on the (default) label classes from "facLayer" without having set the label classes (imported from the CIMLayerDocument)....but maybe that's just in the code snippet and not in the real addin. Can you verify pls?
You are correct in your assumption. The code I posted is exactly what I am using in my application. How do I go about doing what you're suggesting?
i believe there is a LabelClasses collection property on the layer definition. I think all u need to do is set that. A label class also has a text symbol property I believe - so I think you could just set _that_ on the default classes if, similar to the issue with the renderer, the classes in the layer document are not equivalent to the data in the layer.