From 760c45394988237adf5c85fd777b6b97434b29b6 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:14:35 +0200 Subject: [PATCH 01/11] New API: update_modeling_region() --- src/ansys/sherlock/core/errors.py | 17 ++ src/ansys/sherlock/core/layer.py | 267 +++++++++++++++++++++++++++++- tests/test_layer.py | 155 +++++++++++++++++ 3 files changed, 438 insertions(+), 1 deletion(-) diff --git a/src/ansys/sherlock/core/errors.py b/src/ansys/sherlock/core/errors.py index 28e8b1162..308ffc335 100644 --- a/src/ansys/sherlock/core/errors.py +++ b/src/ansys/sherlock/core/errors.py @@ -1200,3 +1200,20 @@ def str_itr(self): assert self.error_array is None return [f"Add modeling region error: {self.message}"] + + +class SherlockUpdateModelingRegionError(Exception): + """Contains the errors raised when modeling regions for a project cannot be updated.""" + + def __init__(self, message=None, error_array=None): + """Initialize error message.""" + self.message = message + self.error_array = error_array + + def str_itr(self): + """Format error message.""" + if self.message is None: + return [f"Update modeling region error: {error}" for error in self.error_array] + + assert self.error_array is None + return [f"Update modeling region error: {self.message}"] diff --git a/src/ansys/sherlock/core/layer.py b/src/ansys/sherlock/core/layer.py index 02d181bef..508f4f6f4 100644 --- a/src/ansys/sherlock/core/layer.py +++ b/src/ansys/sherlock/core/layer.py @@ -30,6 +30,7 @@ SherlockExportAllMountPoints, SherlockExportAllTestFixtures, SherlockExportAllTestPoints, + SherlockUpdateModelingRegionError, SherlockUpdateMountPointsByFileError, SherlockUpdateTestFixturesByFileError, SherlockUpdateTestPointsByFileError, @@ -997,7 +998,7 @@ def add_modeling_region( } } ] - >>> result = sherlock.project.add_modeling_region("Tutorial Project", modeling_regions) + >>> result = sherlock.layer.add_modeling_region("Tutorial Project", modeling_regions) """ try: if not project: @@ -1158,3 +1159,267 @@ def add_modeling_region( except SherlockAddModelingRegionError as e: LOG.error(str(e)) raise e + + def update_modeling_region( + self, + project: str, + modeling_regions: List[Dict[str, Union[str, float, bool, dict]]], + ): + """ + Update one or more modeling regions in a specific project. + + Parameters + ---------- + project : str + Name of the Sherlock project. + modeling_regions : list of dict + List of modeling regions to update. Each dictionary should contain: + + - cca_name : str + Name of the CCA. + - region_id : str + Unique region ID of the modeling region. + - region_units : str + Units of the modeling region. + - model_mode : str + Mode that specifies how the region is used. Valid values are ``Enabled``, + ``Disabled`` and ``Excluded``. + - shape: PolygonalShape|RectangularShape|SlotShape|CircularShape|PCBShape + The shape of the modeling region. + - pcb_model_props : list + List of the PCB model parameters consisting of these properties: + + - export_model_type : str + The type of model to be generated for a given modeling region. + Valid values are ``Default``, ``Sherlock``, ``Sweep`` and ``None``. + - elem_order: str + The type of 3D elements to be created for the PCB in the modeling region. + Valid values are ``First_Order``, ``Second_Order`` and ``Solid_Shell``. + - max_mesh_size : float + The maximum size of the mesh to be used in the region. + - max_mesh_size_units : str + Units for the maximum mesh size. + - quads_preferred : bool + Whether to generate quad-shaped elements when creating the mesh if true. + - trace_model_props : list + List of the trace model parameters consisting of these properties: + + - trace_model_type : str + The specification of whether trace modeling should be performed + within the region. Valid values are ``Default``, ``Enabled`` and + ``Disabled``. + - elem_order: str, optional + The type of 3D elements to be created for the PCB in the modeling region. + Valid values are ``First_Order``, ``Second_Order`` and ``Solid_Shell``. + - trace_mesh_size : float, optional + The maximum mesh size to be used in the region when trace modeling + is enabled. + - trace_mesh_size_units: str, optional + Units for the maximum mesh size when trace modeling is enabled. + - region_id_replacement : str, optional + Represents a unique region id that will replace the existing regionId value during + a modeling region update if a value exists. + + Returns + ------- + int + Status code of the response. 0 for success. + + Example + ------- + >>> from ansys.sherlock.core.launcher import launch_sherlock + >>> sherlock = launch_sherlock() + >>> sherlock.project.import_odb_archive( + "ODB++ Tutorial.tgz", + True, + True, + True, + True, + project="Tutorial Project", + cca_name="Card", + ) + >>> modeling_regions = [ + >>> { + >>> "cca_name": "CCA1", + >>> "region_id": "Region1", + >>> "region_units": "mm", + >>> "model_mode": "Mode1", + >>> "shape": PolygonalShape(points=[(0, 0), (1, 1)], rotation=0), + >>> "pcb_model_props": { + >>> "export_model_type": "Type1", + >>> "elem_order": "Order1", + >>> "max_mesh_size": 0.5, + >>> "max_mesh_size_units": "mm", + >>> "quads_preferred": True, + >>> }, + >>> "trace_model_props": { + >>> "trace_model_type": "TypeA", + >>> "elem_order": "OrderA", + >>> "trace_mesh_size": 0.1, + >>> "trace_mesh_size_units": "mm", + >>> }, + >>> "region_id_replacement": "NewRegion1", + >>> } + >>> ] + >>> result = sherlock.layer.update_modeling_region("Tutorial Project", modeling_regions) + """ + try: + if not project: + raise SherlockUpdateModelingRegionError(message="Project name is invalid.") + + if not modeling_regions: + raise SherlockUpdateModelingRegionError(message="Modeling regions list is empty.") + + for region in modeling_regions: + if "cca_name" not in region or not region["cca_name"]: + raise SherlockUpdateModelingRegionError(message="CCA name is invalid.") + if "region_id" not in region or not region["region_id"]: + raise SherlockUpdateModelingRegionError(message="Region ID is invalid.") + if "region_units" not in region or not region["region_units"]: + raise SherlockUpdateModelingRegionError(message="Region units are invalid.") + if "shape" not in region: + raise SherlockUpdateModelingRegionError(message="Shape is missing.") + elif not isinstance( + region["shape"], + ( + PolygonalShape, + RectangularShape, + SlotShape, + CircularShape, + PCBShape, + ), + ): + raise SherlockUpdateModelingRegionError(message="Shape is not of a valid type.") + + pcb_model_props = region.get("pcb_model_props", {}) + if pcb_model_props: + if ( + "export_model_type" not in pcb_model_props + or pcb_model_props["export_model_type"] == "" + ): + raise SherlockUpdateModelingRegionError( + message="PCB model export type is invalid." + ) + if "elem_order" not in pcb_model_props or pcb_model_props["elem_order"] == "": + raise SherlockUpdateModelingRegionError( + message="PCB element order is invalid." + ) + if "max_mesh_size" not in pcb_model_props or not isinstance( + pcb_model_props["max_mesh_size"], float + ): + raise SherlockUpdateModelingRegionError( + message="PCB max mesh size is invalid." + ) + if "quads_preferred" not in pcb_model_props or not isinstance( + pcb_model_props["quads_preferred"], bool + ): + raise SherlockUpdateModelingRegionError( + message="PCB quads preferred is invalid." + ) + + trace_model_props = region.get("trace_model_props", {}) + if trace_model_props: + if ( + "trace_model_type" not in trace_model_props + or trace_model_props["trace_model_type"] == "" + ): + raise SherlockUpdateModelingRegionError( + message="Trace model type is invalid." + ) + + if not self._is_connection_up(): + LOG.error("There is no connection to a gRPC service.") + return + + update_modeling_region_request = SherlockLayerService_pb2.UpdateModelingRegionRequest() + update_modeling_region_request.project = project + + for region_request in modeling_regions: + modeling_region = update_modeling_region_request.modelingRegions.add() + modeling_region.ccaName = region_request["cca_name"] + modeling_region.regionId = region_request["region_id"] + modeling_region.regionUnits = region_request["region_units"] + modeling_region.modelMode = ModelingRegion.ModelingMode.Value( + region_request["model_mode"] + ) + + shape = region_request["shape"] + if isinstance(shape, PolygonalShape): + polygonal_shape = modeling_region.polygonalShape + for point in shape.points: + polygonal_point = polygonal_shape.points.add() + polygonal_point.x = point[0] + polygonal_point.y = point[1] + polygonal_shape.rotation = shape.rotation + elif isinstance(shape, RectangularShape): + rectangular_shape = modeling_region.rectangularShape + for point in shape.points: + rectangular_point = rectangular_shape.points.add() + rectangular_point.x = point[0] + rectangular_point.y = point[1] + rectangular_shape.rotation = shape.rotation + elif isinstance(shape, SlotShape): + slot_shape = modeling_region.slotShape + for point in shape.points: + slot_point = slot_shape.points.add() + slot_point.x = point[0] + slot_point.y = point[1] + slot_shape.rotation = shape.rotation + elif isinstance(shape, CircularShape): + circular_shape = modeling_region.circularShape + for point in shape.points: + circular_point = circular_shape.points.add() + circular_point.x = point[0] + circular_point.y = point[1] + circular_shape.rotation = shape.rotation + else: + raise SherlockUpdateModelingRegionError(message="Shape is not of a valid type.") + + ExportModelType = ModelingRegion.PCBModelingProperties.ExportModelType + pcb_model_props = region_request.get("pcb_model_props", {}) + modeling_region.pcbModelProps.exportModelType = getattr( + ExportModelType, + pcb_model_props["export_model_type"], + ) + modeling_region.pcbModelProps.elemOrder = getattr( + ModelingRegion.ElementOrder, + pcb_model_props["elem_order"], + ) + modeling_region.pcbModelProps.maxMeshSize = pcb_model_props["max_mesh_size"] + modeling_region.pcbModelProps.maxMeshSizeUnits = pcb_model_props[ + "max_mesh_size_units" + ] + modeling_region.pcbModelProps.quadsPreferred = pcb_model_props["quads_preferred"] + + TraceModelingType = ModelingRegion.TraceModelingProperties.TraceModelingType + trace_model_props = region_request.get("trace_model_props", {}) + modeling_region.traceModelProps.traceModelType = getattr( + TraceModelingType, + trace_model_props["trace_model_type"], + ) + if "elem_order" in trace_model_props: + modeling_region.traceModelProps.elemOrder = getattr( + ModelingRegion.ElementOrder, + trace_model_props["elem_order"], + ) + if "trace_mesh_size" in trace_model_props: + modeling_region.traceModelProps.traceMeshSize = trace_model_props[ + "trace_mesh_size" + ] + if "trace_mesh_size_units" in trace_model_props: + modeling_region.traceModelProps.traceMeshSizeUnits = trace_model_props[ + "trace_mesh_size_units" + ] + + if "region_id_replacement" in region_request: + modeling_region.regionIdReplacement = region_request["region_id_replacement"] + + return_code = self.stub.updateModelingRegion(update_modeling_region_request) + if return_code.value != 0: + raise SherlockUpdateModelingRegionError(message=return_code.message) + + return return_code.value + + except SherlockUpdateModelingRegionError as e: + LOG.error(str(e)) + raise e diff --git a/tests/test_layer.py b/tests/test_layer.py index d3e1b1f9c..9775e7882 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -16,6 +16,7 @@ SherlockExportAllMountPoints, SherlockExportAllTestFixtures, SherlockExportAllTestPoints, + SherlockUpdateModelingRegionError, SherlockUpdateMountPointsByFileError, SherlockUpdateTestFixturesByFileError, SherlockUpdateTestPointsByFileError, @@ -41,6 +42,7 @@ def test_all(): helper_test_export_all_test_fixtures(layer) helper_test_export_all_test_points(layer) helper_test_add_modeling_region(layer) + helper_test_update_modeling_region(layer) def helper_test_add_potting_region(layer): @@ -869,5 +871,158 @@ def helper_test_add_modeling_region(layer): pytest.fail(str(e)) +def helper_test_update_modeling_region(layer): + modeling_region_example = [ + { + "cca_name": "Card", + "region_id": "Region001", + "region_units": "mm", + "model_mode": "Enabled", + "shape": PolygonalShape(points=[(0, 0), (0, 6.35), (9.77, 0)], rotation=87.8), + "pcb_model_props": { + "export_model_type": "Sherlock", + "elem_order": "First_Order", + "max_mesh_size": 0.5, + "max_mesh_size_units": "mm", + "quads_preferred": True, + }, + "trace_model_props": { + "trace_model_type": "Enabled", + "elem_order": "Second_Order", + "trace_mesh_size": 0.3, + "trace_mesh_size_units": "mm", + }, + "region_id_replacement": "NewRegion001", + } + ] + + # Invalid project name + try: + layer.update_modeling_region("", modeling_region_example) + pytest.fail("No exception raised for invalid project name") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: Project name is invalid.']" + + # Empty modeling regions list + try: + layer.update_modeling_region("Tutorial Project", []) + pytest.fail("No exception raised for empty modeling regions list") + except SherlockUpdateModelingRegionError as e: + assert ( + str(e.str_itr()) == "['Update modeling region error: Modeling regions list is empty.']" + ) + + # Invalid CCA name + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["cca_name"] = "" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid CCA name") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: CCA name is invalid.']" + + # Invalid region ID + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["region_id"] = "" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid region ID") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: Region ID is invalid.']" + + # Invalid region units + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["region_units"] = "" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid region units") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: Region units are invalid.']" + + # Missing shape + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0].pop("shape") + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for missing shape") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: Shape is missing.']" + + # Invalid shape type + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["shape"] = "InvalidShapeType" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid shape type") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: Shape is not of a valid type.']" + + # Invalid PCB model export type + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["pcb_model_props"]["export_model_type"] = "" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid PCB model export type") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == ( + "['Update modeling region error: PCB model export type is invalid.']" + ) + + # Invalid PCB element order + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["pcb_model_props"]["elem_order"] = "" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid PCB element order") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: PCB element order is invalid.']" + + # Invalid PCB max mesh size + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["pcb_model_props"]["max_mesh_size"] = "not_a_float" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid PCB max mesh size") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: PCB max mesh size is invalid.']" + + # Invalid PCB quads preferred + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["pcb_model_props"]["quads_preferred"] = "not_a_bool" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid PCB quads preferred") + except SherlockUpdateModelingRegionError as e: + assert ( + str(e.str_itr()) == "['Update modeling region error: PCB quads preferred is invalid.']" + ) + + # Invalid trace model type + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["trace_model_props"]["trace_model_type"] = "" + try: + layer.update_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid trace model type") + except SherlockUpdateModelingRegionError as e: + assert str(e.str_itr()) == "['Update modeling region error: Trace model type is invalid.']" + + if layer._is_connection_up(): + # Unhappy project name + try: + layer.update_modeling_region("Invalid Project", modeling_region_example) + pytest.fail("No exception raised for invalid project name") + except Exception as e: + assert type(e) == SherlockUpdateModelingRegionError + + # Valid request + try: + valid_region = copy.deepcopy(modeling_region_example) + valid_region[0]["cca_name"] = "Main Board" + result = layer.update_modeling_region("Tutorial Project", valid_region) + assert result == 0 + except SherlockUpdateModelingRegionError as e: + pytest.fail(str(e)) + + if __name__ == "__main__": test_all() From a26eee7d59079520d902ede8bb6cce59a4958fb4 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:17:43 +0200 Subject: [PATCH 02/11] Update after feedback --- src/ansys/sherlock/core/layer.py | 68 ++++++++++++++--------------- tests/test_layer.py | 75 ++++++++++++++++++++++++-------- 2 files changed, 90 insertions(+), 53 deletions(-) diff --git a/src/ansys/sherlock/core/layer.py b/src/ansys/sherlock/core/layer.py index 508f4f6f4..b7df3e8f4 100644 --- a/src/ansys/sherlock/core/layer.py +++ b/src/ansys/sherlock/core/layer.py @@ -1088,24 +1088,25 @@ def add_modeling_region( polygonal_shape.rotation = shape.rotation elif isinstance(shape, RectangularShape): rectangular_shape = modeling_region.rectangularShape - for point in shape.points: - rectangular_point = rectangular_shape.points.add() - rectangular_point.x = point[0] - rectangular_point.y = point[1] + rectangular_shape.length = shape.length + rectangular_shape.width = shape.width + rectangular_shape.centerX = shape.centerX + rectangular_shape.centerY = shape.centerY rectangular_shape.rotation = shape.rotation elif isinstance(shape, SlotShape): slot_shape = modeling_region.slotShape - for point in shape.points: - slot_point = slot_shape.points.add() - slot_point.x = point[0] - slot_point.y = point[1] + slot_shape.length = shape.length + slot_shape.width = shape.width + slot_shape.nodeCount = shape.nodeCount + slot_shape.centerX = shape.centerX + slot_shape.centerY = shape.centerY slot_shape.rotation = shape.rotation elif isinstance(shape, CircularShape): circular_shape = modeling_region.circularShape - for point in shape.points: - circular_point = circular_shape.points.add() - circular_point.x = point[0] - circular_point.y = point[1] + circular_shape.diameter = shape.diameter + circular_shape.nodeCount = shape.nodeCount + circular_shape.centerX = shape.centerX + circular_shape.centerY = shape.centerY circular_shape.rotation = shape.rotation else: raise SherlockAddModelingRegionError( @@ -1240,25 +1241,25 @@ def update_modeling_region( ) >>> modeling_regions = [ >>> { - >>> "cca_name": "CCA1", - >>> "region_id": "Region1", + >>> "cca_name": "Card", + >>> "region_id": "Region001", >>> "region_units": "mm", - >>> "model_mode": "Mode1", + >>> "model_mode": "Enabled", >>> "shape": PolygonalShape(points=[(0, 0), (1, 1)], rotation=0), >>> "pcb_model_props": { - >>> "export_model_type": "Type1", - >>> "elem_order": "Order1", + >>> "export_model_type": "Sherlock", + >>> "elem_order": "Second_Order", >>> "max_mesh_size": 0.5, >>> "max_mesh_size_units": "mm", >>> "quads_preferred": True, >>> }, >>> "trace_model_props": { - >>> "trace_model_type": "TypeA", - >>> "elem_order": "OrderA", + >>> "trace_model_type": "Enabled", + >>> "elem_order": "Enabled", >>> "trace_mesh_size": 0.1, >>> "trace_mesh_size_units": "mm", >>> }, - >>> "region_id_replacement": "NewRegion1", + >>> "region_id_replacement": "NewRegion001", >>> } >>> ] >>> result = sherlock.layer.update_modeling_region("Tutorial Project", modeling_regions) @@ -1353,27 +1354,26 @@ def update_modeling_region( polygonal_shape.rotation = shape.rotation elif isinstance(shape, RectangularShape): rectangular_shape = modeling_region.rectangularShape - for point in shape.points: - rectangular_point = rectangular_shape.points.add() - rectangular_point.x = point[0] - rectangular_point.y = point[1] + rectangular_shape.length = shape.length + rectangular_shape.width = shape.width + rectangular_shape.centerX = shape.center_x + rectangular_shape.centerY = shape.center_y rectangular_shape.rotation = shape.rotation elif isinstance(shape, SlotShape): slot_shape = modeling_region.slotShape - for point in shape.points: - slot_point = slot_shape.points.add() - slot_point.x = point[0] - slot_point.y = point[1] + slot_shape.length = shape.length + slot_shape.width = shape.width + slot_shape.nodeCount = shape.node_count + slot_shape.centerX = shape.center_x + slot_shape.centerY = shape.center_y slot_shape.rotation = shape.rotation elif isinstance(shape, CircularShape): circular_shape = modeling_region.circularShape - for point in shape.points: - circular_point = circular_shape.points.add() - circular_point.x = point[0] - circular_point.y = point[1] + circular_shape.diameter = shape.diameter + circular_shape.nodeCount = shape.node_count + circular_shape.centerX = shape.center_x + circular_shape.centerY = shape.center_y circular_shape.rotation = shape.rotation - else: - raise SherlockUpdateModelingRegionError(message="Shape is not of a valid type.") ExportModelType = ModelingRegion.PCBModelingProperties.ExportModelType pcb_model_props = region_request.get("pcb_model_props", {}) diff --git a/tests/test_layer.py b/tests/test_layer.py index 9775e7882..1396bee24 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -22,7 +22,13 @@ SherlockUpdateTestPointsByFileError, ) from ansys.sherlock.core.layer import Layer -from ansys.sherlock.core.types.layer_types import PCBShape, PolygonalShape +from ansys.sherlock.core.types.layer_types import ( + CircularShape, + PCBShape, + PolygonalShape, + RectangularShape, + SlotShape, +) def test_all(): @@ -36,13 +42,13 @@ def test_all(): helper_test_delete_all_mount_points(layer) helper_test_delete_all_test_points(layer) helper_test_add_potting_region(layer) - helper_test_update_test_fixtures_by_file(layer) - helper_test_update_test_points_by_file(layer) - helper_test_export_all_mount_points(layer) - helper_test_export_all_test_fixtures(layer) - helper_test_export_all_test_points(layer) - helper_test_add_modeling_region(layer) - helper_test_update_modeling_region(layer) + # helper_test_update_test_fixtures_by_file(layer) + # helper_test_update_test_points_by_file(layer) + # helper_test_export_all_mount_points(layer) + # helper_test_export_all_test_fixtures(layer) + # helper_test_export_all_test_points(layer) + region_id = helper_test_add_modeling_region(layer) + helper_test_update_modeling_region(layer, region_id) def helper_test_add_potting_region(layer): @@ -869,13 +875,14 @@ def helper_test_add_modeling_region(layer): assert result == 0 except SherlockAddModelingRegionError as e: pytest.fail(str(e)) + return valid_region[0]["region_id"] -def helper_test_update_modeling_region(layer): +def helper_test_update_modeling_region(layer, region_id): modeling_region_example = [ { "cca_name": "Card", - "region_id": "Region001", + "region_id": region_id, "region_units": "mm", "model_mode": "Enabled", "shape": PolygonalShape(points=[(0, 0), (0, 6.35), (9.77, 0)], rotation=87.8), @@ -948,15 +955,6 @@ def helper_test_update_modeling_region(layer): except SherlockUpdateModelingRegionError as e: assert str(e.str_itr()) == "['Update modeling region error: Shape is missing.']" - # Invalid shape type - invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["shape"] = "InvalidShapeType" - try: - layer.update_modeling_region("Tutorial Project", invalid_region) - pytest.fail("No exception raised for invalid shape type") - except SherlockUpdateModelingRegionError as e: - assert str(e.str_itr()) == "['Update modeling region error: Shape is not of a valid type.']" - # Invalid PCB model export type invalid_region = copy.deepcopy(modeling_region_example) invalid_region[0]["pcb_model_props"]["export_model_type"] = "" @@ -1023,6 +1021,45 @@ def helper_test_update_modeling_region(layer): except SherlockUpdateModelingRegionError as e: pytest.fail(str(e)) + # Test for RectangularShape + try: + valid_region = copy.deepcopy(modeling_region_example) + valid_region[0]["cca_name"] = "Main Board" + valid_region[0]["shape"] = RectangularShape( + length=10.0, width=5.0, center_x=0.0, center_y=0.0, rotation=45.0 + ) + valid_region[0]["region_id_replacement"] = "NewRegion002" + result = layer.update_modeling_region("Tutorial Project", valid_region) + assert result == 0 + except SherlockUpdateModelingRegionError as e: + pytest.fail(str(e)) + + # Test for SlotShape + try: + valid_region = copy.deepcopy(modeling_region_example) + valid_region[0]["cca_name"] = "Main Board" + valid_region[0]["shape"] = SlotShape( + length=10.0, width=5.0, node_count=4, center_x=0.0, center_y=0.0, rotation=45.0 + ) + valid_region[0]["region_id_replacement"] = "NewRegion003" + result = layer.update_modeling_region("Tutorial Project", valid_region) + assert result == 0 + except SherlockUpdateModelingRegionError as e: + pytest.fail(str(e)) + + # Test for CircularShape + try: + valid_region = copy.deepcopy(modeling_region_example) + valid_region[0]["cca_name"] = "Main Board" + valid_region[0]["shape"] = CircularShape( + diameter=10.0, node_count=8, center_x=0.0, center_y=0.0, rotation=0.0 + ) + valid_region[0]["region_id_replacement"] = "NewRegion004" + result = layer.update_modeling_region("Tutorial Project", valid_region) + assert result == 0 + except SherlockUpdateModelingRegionError as e: + pytest.fail(str(e)) + if __name__ == "__main__": test_all() From 28fdee86182221590a3c8470c8e13de92e5646f0 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:24:54 +0200 Subject: [PATCH 03/11] Delete error --- tests/test_layer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_layer.py b/tests/test_layer.py index 1396bee24..b77cee102 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -42,11 +42,11 @@ def test_all(): helper_test_delete_all_mount_points(layer) helper_test_delete_all_test_points(layer) helper_test_add_potting_region(layer) - # helper_test_update_test_fixtures_by_file(layer) - # helper_test_update_test_points_by_file(layer) - # helper_test_export_all_mount_points(layer) - # helper_test_export_all_test_fixtures(layer) - # helper_test_export_all_test_points(layer) + helper_test_update_test_fixtures_by_file(layer) + helper_test_update_test_points_by_file(layer) + helper_test_export_all_mount_points(layer) + helper_test_export_all_test_fixtures(layer) + helper_test_export_all_test_points(layer) region_id = helper_test_add_modeling_region(layer) helper_test_update_modeling_region(layer, region_id) From 5793ccff9a14476ff7ea4ef1cc26347cf846733e Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:45:50 +0200 Subject: [PATCH 04/11] Fix unit test --- tests/test_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_layer.py b/tests/test_layer.py index b77cee102..3c82a6736 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -778,7 +778,7 @@ def helper_test_add_modeling_region(layer): # Invalid region ID invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["region_id"] = "" + invalid_region[0].pop("region_id") try: layer.add_modeling_region("Tutorial Project", invalid_region) pytest.fail("No exception raised for invalid region ID") From 0e928216d4dee48b372b22ca98f910a25958a776 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:47:50 +0200 Subject: [PATCH 05/11] Fix unit test --- tests/test_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_layer.py b/tests/test_layer.py index 3c82a6736..e77350d59 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -930,7 +930,7 @@ def helper_test_update_modeling_region(layer, region_id): # Invalid region ID invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["region_id"] = "" + invalid_region[0].pop("region_id") try: layer.update_modeling_region("Tutorial Project", invalid_region) pytest.fail("No exception raised for invalid region ID") From b239007b087e478f51464a178d5657c5e0ccfe97 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:59:02 +0200 Subject: [PATCH 06/11] Fix unit test --- tests/test_layer.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/tests/test_layer.py b/tests/test_layer.py index e77350d59..5a4e2d741 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -42,11 +42,11 @@ def test_all(): helper_test_delete_all_mount_points(layer) helper_test_delete_all_test_points(layer) helper_test_add_potting_region(layer) - helper_test_update_test_fixtures_by_file(layer) - helper_test_update_test_points_by_file(layer) - helper_test_export_all_mount_points(layer) - helper_test_export_all_test_fixtures(layer) - helper_test_export_all_test_points(layer) + # helper_test_update_test_fixtures_by_file(layer) + # helper_test_update_test_points_by_file(layer) + # helper_test_export_all_mount_points(layer) + # helper_test_export_all_test_fixtures(layer) + # helper_test_export_all_test_points(layer) region_id = helper_test_add_modeling_region(layer) helper_test_update_modeling_region(layer, region_id) @@ -776,15 +776,6 @@ def helper_test_add_modeling_region(layer): except SherlockAddModelingRegionError as e: assert str(e.str_itr()) == "['Add modeling region error: CCA name is invalid.']" - # Invalid region ID - invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0].pop("region_id") - try: - layer.add_modeling_region("Tutorial Project", invalid_region) - pytest.fail("No exception raised for invalid region ID") - except SherlockAddModelingRegionError as e: - assert str(e.str_itr()) == "['Add modeling region error: Region ID is invalid.']" - # Invalid region units invalid_region = copy.deepcopy(modeling_region_example) invalid_region[0]["region_units"] = "" From ab7841dd227042e91b1fd7f3b1f83c301f7ce3f6 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:04:56 +0200 Subject: [PATCH 07/11] Fix unit test --- tests/test_layer.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_layer.py b/tests/test_layer.py index 5a4e2d741..974c1df15 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -776,6 +776,15 @@ def helper_test_add_modeling_region(layer): except SherlockAddModelingRegionError as e: assert str(e.str_itr()) == "['Add modeling region error: CCA name is invalid.']" + # Invalid region ID + invalid_region = copy.deepcopy(modeling_region_example) + invalid_region[0]["region_id"] = "invalidRegionID" + try: + layer.add_modeling_region("Tutorial Project", invalid_region) + pytest.fail("No exception raised for invalid region ID") + except SherlockAddModelingRegionError as e: + assert str(e.str_itr()) == "['Add modeling region error: Region ID is invalid.']" + # Invalid region units invalid_region = copy.deepcopy(modeling_region_example) invalid_region[0]["region_units"] = "" From fb40a2296ef24ff9038e5da3365a18fe2fd30cbf Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:06:26 +0200 Subject: [PATCH 08/11] Fix unit test --- tests/test_layer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_layer.py b/tests/test_layer.py index 974c1df15..4af1d5f34 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -778,7 +778,7 @@ def helper_test_add_modeling_region(layer): # Invalid region ID invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["region_id"] = "invalidRegionID" + invalid_region[0].pop("region_id") try: layer.add_modeling_region("Tutorial Project", invalid_region) pytest.fail("No exception raised for invalid region ID") @@ -787,7 +787,7 @@ def helper_test_add_modeling_region(layer): # Invalid region units invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["region_units"] = "" + invalid_region[0].pop("region_units") try: layer.add_modeling_region("Tutorial Project", invalid_region) pytest.fail("No exception raised for invalid region units") From fe33d959fdda91b789b55e78b86f113d575b237f Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:16:56 +0200 Subject: [PATCH 09/11] Fix unit test --- tests/test_layer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_layer.py b/tests/test_layer.py index 4af1d5f34..b5c08f4e6 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -42,11 +42,11 @@ def test_all(): helper_test_delete_all_mount_points(layer) helper_test_delete_all_test_points(layer) helper_test_add_potting_region(layer) - # helper_test_update_test_fixtures_by_file(layer) - # helper_test_update_test_points_by_file(layer) - # helper_test_export_all_mount_points(layer) - # helper_test_export_all_test_fixtures(layer) - # helper_test_export_all_test_points(layer) + helper_test_update_test_fixtures_by_file(layer) + helper_test_update_test_points_by_file(layer) + helper_test_export_all_mount_points(layer) + helper_test_export_all_test_fixtures(layer) + helper_test_export_all_test_points(layer) region_id = helper_test_add_modeling_region(layer) helper_test_update_modeling_region(layer, region_id) From b8091d37302ced705edd5c3cb81426b9c92dbe33 Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:26:29 +0200 Subject: [PATCH 10/11] Fix after feedback --- src/ansys/sherlock/core/layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/sherlock/core/layer.py b/src/ansys/sherlock/core/layer.py index b7df3e8f4..299f7ce40 100644 --- a/src/ansys/sherlock/core/layer.py +++ b/src/ansys/sherlock/core/layer.py @@ -1255,7 +1255,7 @@ def update_modeling_region( >>> }, >>> "trace_model_props": { >>> "trace_model_type": "Enabled", - >>> "elem_order": "Enabled", + >>> "elem_order": "Second_Order", >>> "trace_mesh_size": 0.1, >>> "trace_mesh_size_units": "mm", >>> }, From 2066117cc89f33d44d73edd6df521e29a199d4fa Mon Sep 17 00:00:00 2001 From: Nayane Fernandes <143632290+ansnfernand@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:31:51 +0200 Subject: [PATCH 11/11] Fix after feedback --- src/ansys/sherlock/core/layer.py | 6 +++--- tests/test_layer.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ansys/sherlock/core/layer.py b/src/ansys/sherlock/core/layer.py index 299f7ce40..d56f22b13 100644 --- a/src/ansys/sherlock/core/layer.py +++ b/src/ansys/sherlock/core/layer.py @@ -1272,11 +1272,11 @@ def update_modeling_region( raise SherlockUpdateModelingRegionError(message="Modeling regions list is empty.") for region in modeling_regions: - if "cca_name" not in region or not region["cca_name"]: + if "cca_name" not in region: raise SherlockUpdateModelingRegionError(message="CCA name is invalid.") - if "region_id" not in region or not region["region_id"]: + if "region_id" not in region: raise SherlockUpdateModelingRegionError(message="Region ID is invalid.") - if "region_units" not in region or not region["region_units"]: + if "region_units" not in region: raise SherlockUpdateModelingRegionError(message="Region units are invalid.") if "shape" not in region: raise SherlockUpdateModelingRegionError(message="Shape is missing.") diff --git a/tests/test_layer.py b/tests/test_layer.py index b5c08f4e6..51d89d3cb 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -921,7 +921,7 @@ def helper_test_update_modeling_region(layer, region_id): # Invalid CCA name invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["cca_name"] = "" + invalid_region[0].pop("cca_name") try: layer.update_modeling_region("Tutorial Project", invalid_region) pytest.fail("No exception raised for invalid CCA name") @@ -939,7 +939,7 @@ def helper_test_update_modeling_region(layer, region_id): # Invalid region units invalid_region = copy.deepcopy(modeling_region_example) - invalid_region[0]["region_units"] = "" + invalid_region[0].pop("region_units") try: layer.update_modeling_region("Tutorial Project", invalid_region) pytest.fail("No exception raised for invalid region units")