From 5d584bd001cca5a275c1567a16f157c1d770d535 Mon Sep 17 00:00:00 2001 From: JackB-Ansys Date: Thu, 2 Oct 2025 15:32:20 +0100 Subject: [PATCH] - Add draw functionality for Coordinate objects - Allow drawing a mix of regions, entities and coordinates --- src/ansys/motorcad/core/geometry_drawing.py | 64 +++++++++++++++++---- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/src/ansys/motorcad/core/geometry_drawing.py b/src/ansys/motorcad/core/geometry_drawing.py index e8e66f522..6a670a2b2 100644 --- a/src/ansys/motorcad/core/geometry_drawing.py +++ b/src/ansys/motorcad/core/geometry_drawing.py @@ -482,6 +482,11 @@ def _draw_entity(self, entity, colour, draw_points=False): return drawn_entity + def _draw_coordinate(self, coordinate, colour): + """Draw coordinate onto plot.""" + drawn_coordinate = plt.plot(coordinate.x, coordinate.y, "x", color=colour) + return drawn_coordinate + def draw_objects_debug(objects): """Draw regions on plot if not being run in Motor-CAD. @@ -641,28 +646,44 @@ def draw_objects( # Draw a list of entities or nodes elif isinstance(objects, list): - if all(isinstance(object, Region) for object in objects): - if draw_points is None: - draw_points = False - for region in objects: - legend_key = region.name + # mix of regions and entities + if draw_points is None: + draw_points = False + for i, object in enumerate(objects): + if isinstance(object, Region): + legend_key = object.name region_drawing.legend_objects[legend_key] = [] region_drawing.object_states[legend_key] = True - region_drawing.keys_and_labels.insert(legend_key, region_drawing.get_label(region)) + region_drawing.keys_and_labels.insert(legend_key, region_drawing.get_label(object)) region_drawing._draw_region( - region, region.colour, label_regions, draw_points=draw_points + object, object.colour, label_regions, draw_points=draw_points + ) + + elif isinstance(object, Entity): + legend_key = str(object.__class__).split(".")[-1][0:-2] + str(i) + region_drawing.legend_objects[legend_key] = [] + region_drawing.object_states[legend_key] = True + region_drawing.keys_and_labels.insert(legend_key, legend_key) + region_drawing.legend_objects[legend_key].append( + region_drawing._draw_entity(object, "black", draw_points) ) + region_drawing.bounds[legend_key] = object.get_bounds() - if all(isinstance(object, Entity) for object in objects): - for i, entity in enumerate(objects): - legend_key = str(entity.__class__).split(".")[-1][0:-2] + str(i) + elif isinstance(object, Coordinate): + legend_key = str(object.__class__).split(".")[-1][0:-2] + str(i) region_drawing.legend_objects[legend_key] = [] region_drawing.object_states[legend_key] = True region_drawing.keys_and_labels.insert(legend_key, legend_key) region_drawing.legend_objects[legend_key].append( - region_drawing._draw_entity(entity, "black", draw_points) + region_drawing._draw_coordinate(object, "black") + ) + region_drawing.bounds[legend_key] = ( + Coordinate.get_polar_coords_deg(object)[0], + object.x, + object.x, + object.y, + object.y, ) - region_drawing.bounds[legend_key] = entity.get_bounds() # Draw a sole region/node if isinstance(objects, Region) or isinstance(objects, GeometryNode): @@ -690,6 +711,25 @@ def draw_objects( ) region_drawing.bounds[legend_key] = objects.get_bounds() + # Draw a sole coordinate + if isinstance(objects, Coordinate): + if draw_points is None: + draw_points = True + legend_key = str(objects.__class__).split(".")[-1][0:-2] + region_drawing.legend_objects[legend_key] = [] + region_drawing.object_states[legend_key] = True + region_drawing.keys_and_labels.insert(legend_key, legend_key) + region_drawing.legend_objects[legend_key].append( + region_drawing._draw_coordinate(object, "black") + ) + region_drawing.bounds[legend_key] = ( + Coordinate.get_polar_coords_deg(object)[0], + object.x, + object.x, + object.y, + object.y, + ) + # Create an interactable legend to label and change displayed regions if legend: region_drawing.enable_legend()