Currently, when working with heavily managed Utility Network (UN) datasets, enterprise administrators cannot scale or automate map production using Python scripts. Subtype Group Layer sublayers isolate their rendering pipeline from the standard ArcPy/CIM environment.
When attempting to programmatic change symbols on a Subtype Feature Layer using standard workflows (e.g., layer.symbology or low-level layer.getDefinition('V3')), the application either silently drops the edits, throws an attribute error, or corrupts the internal XML schema validation, throwing a "Requested operation could not be completed" banner and rendering a blank white square in the UI.
Even using CIMREGISTRY pointers on dynamically generated CIMUniqueValueClass entries fails because the UI-cached values are hidden from the active layer definition matrix until manually committed via mouse clicks in the Symbology pane.
Extend the ArcGIS Pro arcpy.mp or arcpy.cim module to natively support schema-aware unique value mapping on Utility Network sublayers. Specifically:
Provide a stable high-level method such as UniqueValueRenderer.addValueCombination([field1, field2], style_item_name) that forces serialization straight into the core map document.
Allow Symbol.applyStyleItem() or an equivalent property-setter to interact with read-only subtype symbol objects when a valid style sheet is actively imported into the project items framework.
@SavageTrimble We need more information to fully understand the issue. One option would be to work with Esri Support where they can help set up a reproducible case we can look at. Another option, yet less direct, is trying to describe your schema in more detail and provide a script that is attempting to modify the renderer?
Some questions:
How is the script running? Is it stand-alone, or run from script tool in the application?
Does the script modify the underlying data just prior to trying to change the renderer (in the same script)? Have you tried arcpy.RefreshLayer()?
Would it be helpful if you had an additional isSubtypeGroupLayer Layer property?
Thanks,
Jeff - arcpy.mp team
When interacting with an out-of-the-box Utility Network subtype sublayer, attempting to programmatic convert or apply a multi-field UniqueValueRenderer (specifically targeting ASSETGROUP and ASSETTYPE) fails to serialize into the active map document.
To demonstrate this behavior on any standard ArcGIS Solutions Utility Network layer (set to Unique Values in the UI), run the attached snippet. It illustrates how the UI and the CIM completely decouple, trapping the generated rows in a memory dead-zone:
import arcpy
# Target any standard ArcGIS Solutions UN sublayer currently using Unique Values
layer_name = "Water Device - Fire Hydrant"
aprx = arcpy.mp.ArcGISProject("CURRENT")
active_map = aprx.activeMap
layer = active_map.listLayers(layer_name)[0]
# 1. Attempt standard high-level multi-field assignment
sym = layer.symbology
sym.renderer.fields = ['ASSETGROUP', 'ASSETTYPE']
layer.symbology = sym # The UI pane now visually shows the fields assigned
# 2. Immediately inspect the low-level CIM definition to modify the newly generated rows
cim_def = layer.getDefinition('V3')
uv_renderer = cim_def.renderer
# BUG: This will print 'Found 0 active rows' even though rows are generated/visible in the UI pane!
if hasattr(uv_renderer, 'groups') and len(uv_renderer.groups) > 0:
active_items = getattr(uv_renderer.groups[0], 'items', [])
print(f"Success: Found {len(active_items)} rows available for style mapping.")
else:
print("BUG DETECTED: Found 0 active rows in the CIM rendering list. The data provider has sandboxed the rows.")
@SavageTrimble is it possible that "items" in the arcpy API is called "classes" in the CIM. We are not 100% consistent, but we tend to try and match what you see in the UI. In this case, the CIM is different and I don't recall the CIM lineage.
If you change:
active_items = getattr(uv_renderer.groups[0], 'items', [])
to
active_items = getattr(uv_renderer.groups[0], 'classes', [])
Are you getting what you expect?
Jeff - arcpy.mp team
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.