diff --git a/_unittest/test_02_3D_modeler.py b/_unittest/test_02_3D_modeler.py index 3fa2769d0a6..db00f830f31 100644 --- a/_unittest/test_02_3D_modeler.py +++ b/_unittest/test_02_3D_modeler.py @@ -91,11 +91,6 @@ def test_02_boundingbox(self): bounding = self.aedtapp.modeler.obounding_box assert len(bounding) == 6 - def test_03_objects(self): - print(self.aedtapp.modeler.oeditor) - print(self.aedtapp.modeler._odefinition_manager) - print(self.aedtapp.modeler._omaterial_manager) - def test_04_convert_to_selection(self): assert type(self.aedtapp.modeler.convert_to_selections("inner", True)) is list assert type(self.aedtapp.modeler.convert_to_selections("inner", False)) is str @@ -256,7 +251,7 @@ def test_18_chamfer(self): def test_19_clone(self): self.restore_model() - status, cloned = self.aedtapp.modeler.clone("Poly1") + status, _ = self.aedtapp.modeler.clone("Poly1") assert status def test_20_intersect(self): @@ -1192,6 +1187,30 @@ def test_63_create_conical_rings(self, add_app): assert not self.aedtapp.modeler.create_conical_rings("Z", position, 20, 10, 20, 0) assert not self.aedtapp.modeler.create_conical_rings("Z", [0], 20, 10, 20, 0) + def test_get_group_bounding_box_with_non_existing_group_name(self): + assert self.aedtapp.modeler.get_group_bounding_box("SomeUnknownGroupName") is None + + def test_get_group_bounding_box_with_wrong_input_type(self): + with pytest.raises(ValueError): + self.aedtapp.modeler.get_group_bounding_box(5) + + def test_get_group_bounding_box_with_existing_group_name(self): + assert self.aedtapp.modeler.get_group_bounding_box("Sheets") is not None + + def test_chassis_subtraction(self): + self.restore_model() + chassis = self.aedtapp.modeler.create_box([0, 0, 0], [10, 10, 5], "chassis", "Copper") + # Add vacuum to extend code coverage + self.aedtapp.modeler.create_box([20, 20, 20], [1, 1, 1], "box", "Vacuum") + assert self.aedtapp.modeler.chassis_subtraction(chassis.name) + + def test_explicitly_subtract(self): + box_0 = self.aedtapp.modeler.create_box([0, 0, 0], [10, 10, 5], "box_0", "Copper") + box_1 = self.aedtapp.modeler.create_box([0, 0, 0], [5, 5, 5], "box_1", "Copper") + box_2 = self.aedtapp.modeler.create_box([0, 0, 0], [6, 6, 6], "box_2", "Copper") + box_3 = self.aedtapp.modeler.create_box([0, 0, 0], [7, 7, 7], "box_3", "Copper") + assert self.aedtapp.modeler.explicitly_subtract([box_0.name, box_1.name], [box_2.name, box_3.name]) + def test_clean_objects_name(self): box_0 = self.aedtapp.modeler.create_box([0, 0, 0], [10, 10, 10], name="Object_Part0") box_1 = self.aedtapp.modeler.create_box([5, 5, 0], [1, 1, 1], name="Object_Part1") diff --git a/src/ansys/aedt/core/desktop.py b/src/ansys/aedt/core/desktop.py index ae988675087..3dac79dcca7 100644 --- a/src/ansys/aedt/core/desktop.py +++ b/src/ansys/aedt/core/desktop.py @@ -1240,7 +1240,7 @@ def project_list(self): return list(self.odesktop.GetProjectList()) @pyaedt_function_handler() - def analyze_all(self, project=None, design=None): + def analyze_all(self, project=None, design=None): # pragma: no cover """Analyze all setups in a project. Parameters @@ -1598,7 +1598,7 @@ def release_desktop(self, close_projects=True, close_on_exit=True): for edb_object in _edb_sessions: try: edb_object.close() - except Exception: + except Exception: # pragma: no cover self.logger.warning("Failed to close Edb object.") if close_projects and "PYTEST_CURRENT_TEST" not in os.environ: @@ -1609,7 +1609,7 @@ def release_desktop(self, close_projects=True, close_on_exit=True): except Exception: # pragma: no cover self.logger.warning(f"Failed to close Project {project}") result = _close_aedt_application(self, close_on_exit, self.aedt_process_id, self.is_grpc_api) - if not result: + if not result: # pragma: no cover self.logger.error("Error releasing desktop.") return False self.logger._desktop_class = None @@ -2281,7 +2281,7 @@ def are_there_simulations_running(self): return False @pyaedt_function_handler() - def get_monitor_data(self): + def get_monitor_data(self): # pragma: no cover """Check and get monitor data of an existing analysis. .. note:: diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 0256e3a7e2c..4da34256a9a 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -1278,7 +1278,7 @@ def _get_coordinates_data(self): # pragma: no cover coord.reverse() return coord - def _get_lists_data(self): + def _get_lists_data(self): # pragma: no cover """Retrieve user object list data. Returns @@ -2073,7 +2073,7 @@ def set_objects_deformation(self, assignment): self.logger.info("Enabling deformation feedback") try: self._odesign.SetObjectDeformation(["EnabledObjects:=", assignment]) - except Exception: + except Exception: # pragma: no cover self.logger.error("Failed to enable the deformation dependence") return False else: @@ -2133,7 +2133,7 @@ def set_objects_temperature(self, assignment, ambient_temperature=22, create_pro vargs1.append(vargs2) try: self._odesign.SetObjectTemperature(vargs1) - except Exception: + except Exception: # pragma: no cover self.logger.error("Failed to enable the temperature dependence") return False else: @@ -2528,7 +2528,7 @@ def get_group_bounding_box(self, group): self._change_geometry_property(vArg1, objs_to_unmodel) bounding = self.get_model_bounding_box() self._odesign.Undo() - else: + else: # pragma: no cover bounding = self.get_model_bounding_box() return bounding @@ -2705,7 +2705,7 @@ def split( obj_name = tool.name obj = o.edges[0] tool_type = "EdgeTool" - else: + else: # pragma: no cover self.logger.error("Face tool part has to be provided as a string (name) or an int (face id).") return False planes = "Dummy" @@ -3638,7 +3638,7 @@ def unite(self, assignment, purge=False, keep_originals=False): vArg2.append("TurnOnNBodyBoolean:=") vArg2.append(True) self.oeditor.Unite(vArg1, vArg2) - if szSelections.split(",")[0] in self.unclassified_names: + if szSelections.split(",")[0] in self.unclassified_names: # pragma: no cover self.logger.error("Error in uniting objects.") self._odesign.Undo() self.cleanup_objects() @@ -3709,7 +3709,7 @@ def copy(self, assignment): vArg1 = ["NAME:Selections", "Selections:=", selections] self.oeditor.Copy(vArg1) return selections - except AttributeError: + except AttributeError: # pragma: no cover self.logger.error("Unable to copy selections to clipboard.") return None @@ -3764,7 +3764,7 @@ def intersect(self, assignment, keep_originals=False, **kwargs): self.oeditor.Intersect(vArg1, vArg2) unclassified1 = list(self.oeditor.GetObjectsInGroup("Unclassified")) - if unclassified != unclassified1: + if unclassified != unclassified1: # pragma: no cover self._odesign.Undo() self.logger.error("Error in intersection. Reverting Operation") return @@ -3833,7 +3833,7 @@ def connect(self, assignment): vArg1 = ["NAME:Selections", "Selections:=", szSelections] self.oeditor.Connect(vArg1) - if unclassified_before != self.unclassified_names: + if unclassified_before != self.unclassified_names: # pragma: no cover self._odesign.Undo() self.logger.error("Error in connection. Reverting Operation") return False @@ -3872,9 +3872,7 @@ def chassis_subtraction(self, chassis_part): blank_part = chassis_part # in main code this object will need to be determined automatically eg by name such as chassis or sheer size self.logger.info("Blank Part in Subtraction = " + str(blank_part)) - """ - check if blank part exists, if not, skip subtraction - """ + # Check if blank part exists, if not, skip subtraction tool_parts = list(self.oeditor.GetObjectsInGroup("Solids")) tool_parts.remove(blank_part) for mat in mat_names: @@ -3885,9 +3883,9 @@ def chassis_subtraction(self, chassis_part): # tool_parts_final=list(set(tool_parts).difference(set(objnames))) tool_parts = ",".join(tool_parts) num_obj_end = self.oeditor.GetNumObjects() - self.subtract(blank_part, tool_parts, True) - + res = self.subtract(blank_part, tool_parts, True) self.logger.info("Subtraction Objs - Initial: " + str(num_obj_start) + " , Final: " + str(num_obj_end)) + return res @pyaedt_function_handler() def _offset_on_plane(self, i, offset): @@ -4188,10 +4186,10 @@ def create_face_list(self, assignment, name=None): result = user_list.create(assignment=assignment, name=name, entity_type=list_type) if result: return user_list - else: + else: # pragma: no cover self._app.logger.error("Wrong object definition. Review object list and type") return False - else: + else: # pragma: no cover self._app.logger.error("User list object could not be created") return False @@ -4228,10 +4226,10 @@ def create_object_list(self, assignment, name=None): result = user_list.create(assignment=assignment, name=name, entity_type=list_type) if result: return user_list - else: + else: # pragma: no cover self._app.logger.error("Wrong object definition. Review object list and type") return False - else: + else: # pragma: no cover self._app.logger.error("User list object could not be created") return False @@ -4306,7 +4304,7 @@ def create_faceted_bondwire_from_true_surface(self, assignment, direction, min_s if dir == direction: edgelist.append(el) verlist.append([p1, p2]) - if not edgelist: + if not edgelist: # pragma: no cover self.logger.error("No edges found specified direction. Check again") return False connected = [edgelist[0]] @@ -4865,7 +4863,7 @@ def import_3d_cad( return True @pyaedt_function_handler(SCFile="input_file") - def import_spaceclaim_document(self, input_file): + def import_spaceclaim_document(self, input_file): # pragma: no cover """Import a SpaceClaim document. Parameters @@ -4890,7 +4888,7 @@ def import_spaceclaim_document(self, input_file): if variable > latest_version: latest_version = variable break - if not latest_version: + if not latest_version: # pragma: no cover self.logger.error("SpaceClaim is not found.") else: scdm_path = os.path.join(os.environ[latest_version], "scdm") @@ -5104,7 +5102,7 @@ def import_discovery_model(self, input_file): >>> oEditor.CreateUserDefinedModel """ - if is_linux: + if is_linux: # pragma: no cover self.logger.error("Discovery not supported on Linux.") return False version = self._app.aedt_version_id[-3:] @@ -5731,10 +5729,10 @@ def wrap_sheet(self, sheet, object, imprinted=False): sheet = self.convert_to_selections(sheet, False) object = self.convert_to_selections(object, False) - if sheet not in self.sheet_names: + if sheet not in self.sheet_names: # pragma: no cover self.logger.error(f"{sheet} is not a valid sheet.") return False - if object not in self.solid_names: + if object not in self.solid_names: # pragma: no cover self.logger.error(f"{object} is not a valid solid body.") return False unclassified = [i for i in self.unclassified_objects] @@ -5743,7 +5741,7 @@ def wrap_sheet(self, sheet, object, imprinted=False): ["NAME:WrapSheetParameters", "Imprinted:=", imprinted], ) is_unclassified = [i for i in self.unclassified_objects if i not in unclassified] - if is_unclassified: + if is_unclassified: # pragma: no cover self.logger.error("Failed to Wrap sheet. Reverting to original objects.") self._odesign.Undo() return False @@ -6049,7 +6047,7 @@ def simplify_objects( try: self.oeditor.Simplify(selections_args, simplify_parameters, groups_for_new_object) return True - except Exception: + except Exception: # pragma: no cover self.logger.error("Simplify objects failed.") return False @@ -6437,7 +6435,7 @@ def _parse_region_args(self, pad_value, pad_type, region_name, parts, region_typ if not units and pad_value[i].isnumeric() and not is_percentage: units = self.model_units pad_value[i] += units - elif units and is_percentage: + elif units and is_percentage: # pragma: no cover self.logger.error("Percentage input must not have units") return False, False elif not is_percentage: @@ -6486,7 +6484,7 @@ def _parse_region_args(self, pad_value, pad_type, region_name, parts, region_typ def _create_region( self, pad_value=300, pad_type="Percentage Offset", name="Region", parts=None, region_type="Region" ): - if name in self._app.modeler.objects_by_name: + if name in self._app.modeler.objects_by_name: # pragma: no cover self._app.logger.error(f"{name} object already exists") return False if not isinstance(pad_value, list): @@ -8942,18 +8940,18 @@ def __init__(self, app, input_file=None, input_dict=None): props = self._read_csv_cylinder_props(csv_data) if primitive_type_cleaned in ["Blocks Prism", "Prism"]: props = self._read_csv_prism_props(csv_data) - if not props: + if not props: # pragma: no cover msg = "CSV file not valid." self.logger.error(msg) raise TypeError(msg) - else: + else: # pragma: no cover msg = "Format is not valid." self.logger.error(msg) raise TypeError(msg) else: props = input_dict - if not props or not all(key in props for key in ["Primitives", "Instances"]): + if not props or not all(key in props for key in ["Primitives", "Instances"]): # pragma: no cover msg = "Input data is wrong." self.logger.error(msg) raise AttributeError(msg) @@ -8987,7 +8985,7 @@ def create(self): if self.coordinate_systems: cs_flag = self._create_coordinate_system() - if not cs_flag: + if not cs_flag: # pragma: no cover self.logger.error("Wrong coordinate system is defined.") return False @@ -8995,7 +8993,7 @@ def create(self): for instance_data in self.instances: name = instance_data.get("Name") - if not name: + if not name: # pragma: no cover self.logger.error("``Name`` parameter is not defined.") return False @@ -9004,7 +9002,9 @@ def create(self): self.logger.warning("``Coordinate System`` parameter is not defined, ``Global`` is assigned.") instance_data["Coordinate System"] = "Global" cs = instance_data.get("Coordinate System") - elif instance_data["Coordinate System"] != "Global" and instance_data["Coordinate System"] not in cs_names: + elif ( + instance_data["Coordinate System"] != "Global" and instance_data["Coordinate System"] not in cs_names + ): # pragma: no cover self.logger.error(f"Coordinate system {cs} does not exist.") return False @@ -9188,7 +9188,7 @@ def _read_csv_cylinder_props(self, csv_data): csv_keys = csv_keys.tolist() break - if not all(k in required_csv_keys for k in csv_keys): + if not all(k in required_csv_keys for k in csv_keys): # pragma: no cover msg = "The column names in the CSV file do not match the expected names." self.logger.error(msg) raise ValueError @@ -9197,7 +9197,7 @@ def _read_csv_cylinder_props(self, csv_data): row_cont = 0 for index_row_new, row in csv_data.iloc[index_row + 1 :].iterrows(): row_info = row.dropna().values - if len(row_info) != len(csv_keys): + if len(row_info) != len(csv_keys): # pragma: no cover msg = "Values missing in the CSV file " self.logger.error(msg) raise ValueError @@ -9265,7 +9265,7 @@ def _read_csv_prism_props(self, csv_data): csv_keys = csv_keys.tolist() break - if not all(k in required_csv_keys for k in csv_keys): + if not all(k in required_csv_keys for k in csv_keys): # pragma: no cover msg = "The column names in the CSV file do not match the expected names." self.logger.error(msg) raise ValueError @@ -9274,7 +9274,7 @@ def _read_csv_prism_props(self, csv_data): row_cont = 0 for index_row_new, row in csv_data.iloc[index_row + 1 :].iterrows(): row_info = row.dropna().values - if len(row_info) != len(csv_keys): + if len(row_info) != len(csv_keys): # pragma: no cover msg = "Values missing in the CSV file " self.logger.error(msg) raise ValueError