Add case for symbol code only; draw line symbol colors

This commit is contained in:
Fuhrmann 2024-12-09 09:57:25 +01:00
parent cfcc9bdfd7
commit 18f5ca5aa5

View file

@ -378,7 +378,7 @@ class FeatureRenderer:
# Print message if symbol could not be found # Print message if symbol could not be found
if not symbol_found: if not symbol_found:
messages.AddMessage( messages.AddMessage(
f"Could not find symbol {symbol_key} for {leg_id}" f"Could not find symbol in gallery {symbol_key}"
) )
# Add user defined labels # Add user defined labels
@ -393,27 +393,76 @@ class FeatureRenderer:
# Retrieve stroke symbol properties # Retrieve stroke symbol properties
stroke_symbol_props = {} stroke_symbol_props = {}
for group in cim_lyr.renderer.groups: if layer_shape_type == "Polygon":
for unique_value_class in group.classes: for group in cim_lyr.renderer.groups:
if unique_value_class.values[0].fieldValues[0] != "<Null>": for unique_value_class in group.classes:
leg_id = str( if (
unique_value_class.values[0].fieldValues[0] unique_value_class.values[0].fieldValues[0]
) != "<Null>"
else:
leg_id = None
stroke_symbol_props[leg_id] = {
"color": None,
"width": None,
}
for (
symbol_layer
) in unique_value_class.symbol.symbol.symbolLayers:
if isinstance(
symbol_layer,
arcpy.cim.CIMSymbols.CIMSolidStroke,
): ):
leg_id = str(
unique_value_class.values[0].fieldValues[0]
)
else:
leg_id = None
stroke_symbol_props[leg_id] = {
"color": None,
"width": None,
}
for (
symbol_layer
) in unique_value_class.symbol.symbol.symbolLayers:
if isinstance(
symbol_layer,
arcpy.cim.CIMSymbols.CIMSolidStroke,
):
if leg_id in outline_codes:
# Set user defined outline color
outline_code = outline_codes[leg_id]
color_value = get_symbol_color(outline_code)
color = (
arcpy.cim.CreateCIMObjectFromClassName(
"CIMCMYKColor", "V3"
)
)
color.values = color_value["CMYK"]
stroke_symbol_props[leg_id]["color"] = color
else:
if symbol_layer.color:
# Set color as it was before
stroke_symbol_props[leg_id][
"color"
] = symbol_layer.color
else:
# Set default color
color = arcpy.cim.CreateCIMObjectFromClassName(
"CIMCMYKColor", "V3"
)
color.values = [40, 40, 40, 10, 100]
stroke_symbol_props[leg_id][
"color"
] = color
if draw_outlines:
if symbol_layer.width:
# Set width as it was before
stroke_symbol_props[leg_id][
"width"
] = symbol_layer.width
else:
# Set default width
stroke_symbol_props[leg_id][
"width"
] = DEFAULT_LINE_WIDTH
else:
stroke_symbol_props[leg_id]["width"] = 0
break
# In case the layer did not have a stroke symbol layer or outline color
if not stroke_symbol_props[leg_id]["color"]:
if leg_id in outline_codes: if leg_id in outline_codes:
# Set user defined outline color # Set user defined outline color
outline_code = outline_codes[leg_id] outline_code = outline_codes[leg_id]
@ -424,65 +473,21 @@ class FeatureRenderer:
color.values = color_value["CMYK"] color.values = color_value["CMYK"]
stroke_symbol_props[leg_id]["color"] = color stroke_symbol_props[leg_id]["color"] = color
else: else:
if symbol_layer.color: # Set default color
# Set color as it was before color = arcpy.cim.CreateCIMObjectFromClassName(
stroke_symbol_props[leg_id][ "CIMCMYKColor", "V3"
"color" )
] = symbol_layer.color color.values = [40, 40, 40, 10, 100]
else: stroke_symbol_props[leg_id]["color"] = color
# Set default color
color = (
arcpy.cim.CreateCIMObjectFromClassName(
"CIMCMYKColor", "V3"
)
)
color.values = [40, 40, 40, 10, 100]
stroke_symbol_props[leg_id]["color"] = color
if not stroke_symbol_props[leg_id]["width"]:
if draw_outlines: if draw_outlines:
if symbol_layer.width: stroke_symbol_props[leg_id][
# Set width as it was before "width"
stroke_symbol_props[leg_id][ ] = DEFAULT_LINE_WIDTH
"width"
] = symbol_layer.width
else:
# Set default width
stroke_symbol_props[leg_id][
"width"
] = DEFAULT_LINE_WIDTH
else: else:
stroke_symbol_props[leg_id]["width"] = 0 stroke_symbol_props[leg_id]["width"] = 0
break
# In case the layer did not have a stroke symbol layer or outline color
if not stroke_symbol_props[leg_id]["color"]:
if leg_id in outline_codes:
messages.AddMessage("Add color")
# Set user defined outline color
outline_code = outline_codes[leg_id]
color_value = get_symbol_color(outline_code)
color = arcpy.cim.CreateCIMObjectFromClassName(
"CIMCMYKColor", "V3"
)
color.values = color_value["CMYK"]
stroke_symbol_props[leg_id]["color"] = color
else:
# Set default color
color = arcpy.cim.CreateCIMObjectFromClassName(
"CIMCMYKColor", "V3"
)
color.values = [40, 40, 40, 10, 100]
stroke_symbol_props[leg_id]["color"] = color
if not stroke_symbol_props[leg_id]["width"]:
if draw_outlines:
stroke_symbol_props[leg_id][
"width"
] = DEFAULT_LINE_WIDTH
else:
stroke_symbol_props[leg_id]["width"] = 0
new_groups = [] new_groups = []
for group in cim_lyr.renderer.groups: for group in cim_lyr.renderer.groups:
for unique_value_class in group.classes: for unique_value_class in group.classes:
@ -505,7 +510,7 @@ class FeatureRenderer:
color_value = code_components["color"] color_value = code_components["color"]
symbol_color_value = code_components["symbol_color"] symbol_color_value = code_components["symbol_color"]
has_color = False has_background_color = False
for ( for (
symbol_layer symbol_layer
) in unique_value_class.symbol.symbol.symbolLayers: ) in unique_value_class.symbol.symbol.symbolLayers:
@ -516,14 +521,14 @@ class FeatureRenderer:
) )
if color_value: if color_value:
# Update colors # Update background colors
if layer_shape_type == "Polygon": if layer_shape_type == "Polygon":
if isinstance( if isinstance(
symbol_layer, symbol_layer,
arcpy.cim.CIMSymbols.CIMSolidFill, arcpy.cim.CIMSymbols.CIMSolidFill,
): ):
update_color(symbol_layer, color_value) update_color(symbol_layer, color_value)
has_color = True has_background_color = True
if isinstance( if isinstance(
symbol_layer, symbol_layer,
@ -536,23 +541,8 @@ class FeatureRenderer:
stroke_symbol_props[leg_id]["color"] stroke_symbol_props[leg_id]["color"]
) )
elif layer_shape_type == "Polyline":
if isinstance(
symbol_layer,
arcpy.cim.CIMSymbols.CIMSolidStroke,
):
update_color(symbol_layer, color_value)
has_color = True
elif layer_shape_type == "Point":
if isinstance(
symbol_layer,
arcpy.cim.CIMSymbols.CIMMarker,
):
update_color(symbol_layer, color_value)
has_color = True
# Draw symbol background colors # Draw symbol background colors
if not has_color and color_value: if not has_background_color and color_value:
if layer_shape_type == "Polygon": if layer_shape_type == "Polygon":
# Add fill symbol layer # Add fill symbol layer
fill_symbol = arcpy.cim.CIMSolidFill() fill_symbol = arcpy.cim.CIMSolidFill()
@ -574,20 +564,6 @@ class FeatureRenderer:
unique_value_class.symbol.symbol.symbolLayers.append( unique_value_class.symbol.symbol.symbolLayers.append(
stroke_symbol stroke_symbol
) )
elif layer_shape_type == "Polyline":
# Add stroke symbol layer
stroke_symbol = arcpy.cim.CIMSolidStroke()
update_color(stroke_symbol, color_value)
unique_value_class.symbol.symbol.symbolLayers.append(
stroke_symbol
)
elif layer_shape_type == "Point":
# Add marker symbol layer
marker_symbol = arcpy.cim.CIMMarker()
update_color(marker_symbol, color_value)
unique_value_class.symbol.symbol.symbolLayers.append(
marker_symbol
)
# Regroup items # Regroup items
if heading_field: if heading_field:
@ -638,6 +614,9 @@ def update_color(symbol_layer, color_value):
def update_symbol_layer_colors(symbol_layer, symbol_color_value): def update_symbol_layer_colors(symbol_layer, symbol_color_value):
if isinstance(symbol_layer, arcpy.cim.CIMSymbols.CIMSolidStroke):
update_color(symbol_layer, symbol_color_value)
if isinstance( if isinstance(
symbol_layer, symbol_layer,
arcpy.cim.CIMSymbols.CIMCharacterMarker, arcpy.cim.CIMSymbols.CIMCharacterMarker,
@ -675,6 +654,14 @@ def get_code_components(code):
"symbol_key": "", "symbol_key": "",
"symbol_color": {}, "symbol_color": {},
} }
if code_len == 7:
return {
"color": {},
"symbol_key": code[0:7],
"symbol_color": {
"CMYK": [0, 0, 0, 100, 100],
},
}
elif code_len == 10: elif code_len == 10:
return { return {
"color": {}, "color": {},