From dd10ffb4a1559e404edddf0e2dd071da61529186 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Dec 2025 05:48:54 +0000 Subject: [PATCH 01/14] Initial plan From aa8bf9f0eb221a396df1faf3dbb542b348f5357e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Dec 2025 06:01:49 +0000 Subject: [PATCH 02/14] Add check_optional_type helper and standardize None argument handling across codebase Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/boundary_conditions.py | 161 ++++++------------ src/moldflow/cad_manager.py | 17 +- src/moldflow/data_transform.py | 44 ++--- src/moldflow/diagnosis_manager.py | 113 +++++-------- src/moldflow/ent_list.py | 5 +- src/moldflow/folder_manager.py | 65 +++----- src/moldflow/helper.py | 28 ++++ src/moldflow/layer_manager.py | 68 +++----- src/moldflow/material_finder.py | 5 +- src/moldflow/mesh_editor.py | 218 +++++++++---------------- src/moldflow/modeler.py | 217 +++++++++--------------- src/moldflow/mold_surface_generator.py | 8 +- src/moldflow/plot.py | 40 ++--- src/moldflow/plot_manager.py | 89 ++++------ src/moldflow/predicate_manager.py | 29 ++-- src/moldflow/prop.py | 5 +- src/moldflow/property_editor.py | 17 +- src/moldflow/study_doc.py | 37 ++--- src/moldflow/system_message.py | 8 +- src/moldflow/user_plot.py | 95 ++++------- src/moldflow/viewer.py | 64 +++----- tests/core/test_helper.py | 30 ++++ 22 files changed, 501 insertions(+), 862 deletions(-) diff --git a/src/moldflow/boundary_conditions.py b/src/moldflow/boundary_conditions.py index e01bb13..633ed5d 100644 --- a/src/moldflow/boundary_conditions.py +++ b/src/moldflow/boundary_conditions.py @@ -8,7 +8,7 @@ from .helper import coerce_optional_dispatch from .common import LogMessage, AnalysisType, ConstraintType -from .helper import check_type, get_enum_value +from .helper import check_type, check_optional_type, get_enum_value from .com_proxy import safe_com from .logger import process_log from .ent_list import EntList @@ -76,8 +76,7 @@ def create_fixed_constraints(self, nodes: EntList | None, analysis: AnalysisType int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_fixed_constraints") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) analysis = get_enum_value(analysis, AnalysisType) return self.boundary_conditions.CreateFixedConstraints( coerce_optional_dispatch(nodes, "ent_list"), analysis @@ -97,8 +96,7 @@ def create_core_shift_fixed_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_fixed_constraints") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) check_type(retract_time, (float, int)) return self.boundary_conditions.CreateFixedConstraints2( coerce_optional_dispatch(nodes, "ent_list"), retract_time @@ -116,8 +114,7 @@ def create_pin_constraints(self, nodes: EntList | None, analysis: AnalysisType | int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_pin_constraints") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) analysis = get_enum_value(analysis, AnalysisType) return self.boundary_conditions.CreatePinConstraints( coerce_optional_dispatch(nodes, "ent_list"), analysis @@ -137,8 +134,7 @@ def create_core_shift_pin_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_pin_constraints") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) check_type(retract_time, (float, int)) return self.boundary_conditions.CreatePinConstraints2( coerce_optional_dispatch(nodes, "ent_list"), retract_time @@ -165,13 +161,10 @@ def create_spring_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spring_constraints") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) analysis = get_enum_value(analysis, AnalysisType) - if trans is not None: - check_type(trans, Vector) - if rotation is not None: - check_type(rotation, Vector) + check_optional_type(trans, Vector) + check_optional_type(rotation, Vector) return self.boundary_conditions.CreateSpringConstraints( coerce_optional_dispatch(nodes, "ent_list"), analysis, @@ -200,12 +193,9 @@ def create_core_shift_spring_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spring_constraints") - if nodes is not None: - check_type(nodes, EntList) - if trans is not None: - check_type(trans, Vector) - if rotation is not None: - check_type(rotation, Vector) + check_optional_type(nodes, EntList) + check_optional_type(trans, Vector) + check_optional_type(rotation, Vector) check_type(retract_time, (float, int)) return self.boundary_conditions.CreateSpringConstraints2( coerce_optional_dispatch(nodes, "ent_list"), @@ -239,16 +229,11 @@ def create_general_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_general_constraints") - if nodes is not None: - check_type(nodes, EntList) - if trans is not None: - check_type(trans, Vector) - if rotation is not None: - check_type(rotation, Vector) - if trans_types is not None: - check_type(trans_types, Vector) - if rotation_types is not None: - check_type(rotation_types, Vector) + check_optional_type(nodes, EntList) + check_optional_type(trans, Vector) + check_optional_type(rotation, Vector) + check_optional_type(trans_types, Vector) + check_optional_type(rotation_types, Vector) analysis = get_enum_value(analysis, AnalysisType) trans_types = self._check_vector(trans_types) rotation_types = self._check_vector(rotation_types) @@ -292,16 +277,11 @@ def create_core_shift_general_constraints( locals(), name="create_core_shift_general_constraints", ) - if nodes is not None: - check_type(nodes, EntList) - if trans is not None: - check_type(trans, Vector) - if rotation is not None: - check_type(rotation, Vector) - if trans_types is not None: - check_type(trans_types, Vector) - if rotation_types is not None: - check_type(rotation_types, Vector) + check_optional_type(nodes, EntList) + check_optional_type(trans, Vector) + check_optional_type(rotation, Vector) + check_optional_type(trans_types, Vector) + check_optional_type(rotation_types, Vector) check_type(retract_time, (int, float)) trans_types = self._check_vector(trans_types) rotation_types = self._check_vector(rotation_types) @@ -329,12 +309,9 @@ def create_nodal_loads( int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodal_loads") - if nodes is not None: - check_type(nodes, EntList) - if force is not None: - check_type(force, Vector) - if moment is not None: - check_type(moment, Vector) + check_optional_type(nodes, EntList) + check_optional_type(force, Vector) + check_optional_type(moment, Vector) return self.boundary_conditions.CreateNodalLoads( coerce_optional_dispatch(nodes, "ent_list"), coerce_optional_dispatch(force, "vector"), @@ -353,10 +330,8 @@ def create_edge_loads(self, nodes: EntList | None, force: Vector | None) -> int: int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_edge_loads") - if nodes is not None: - check_type(nodes, EntList) - if force is not None: - check_type(force, Vector) + check_optional_type(nodes, EntList) + check_optional_type(force, Vector) return self.boundary_conditions.CreateEdgeLoads( coerce_optional_dispatch(nodes, "ent_list"), coerce_optional_dispatch(force, "vector") ) @@ -373,10 +348,8 @@ def create_elemental_loads(self, tri: EntList | None, force: Vector | None) -> i int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_elemental_loads") - if tri is not None: - check_type(tri, EntList) - if force is not None: - check_type(force, Vector) + check_optional_type(tri, EntList) + check_optional_type(force, Vector) return self.boundary_conditions.CreateElementalLoads( coerce_optional_dispatch(tri, "ent_list"), coerce_optional_dispatch(force, "vector") ) @@ -393,8 +366,7 @@ def create_pressure_loads(self, tri: EntList | None, pressure: float) -> int: int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_pressure_loads") - if tri is not None: - check_type(tri, EntList) + check_optional_type(tri, EntList) check_type(pressure, (float, int)) return self.boundary_conditions.CreatePressureLoads( coerce_optional_dispatch(tri, "ent_list"), pressure @@ -413,8 +385,7 @@ def create_temperature_loads(self, tri: EntList | None, top: float, bottom: floa int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_temperature_loads") - if tri is not None: - check_type(tri, EntList) + check_optional_type(tri, EntList) check_type(top, (float, int)) check_type(bottom, (float, int)) return self.boundary_conditions.CreateTemperatureLoads( @@ -433,10 +404,8 @@ def create_volume_loads(self, tri: EntList | None, force: Vector | None) -> int: int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_volume_loads") - if tri is not None: - check_type(tri, EntList) - if force is not None: - check_type(force, Vector) + check_optional_type(tri, EntList) + check_optional_type(force, Vector) return self.boundary_conditions.CreateVolumeLoads( coerce_optional_dispatch(tri, "ent_list"), coerce_optional_dispatch(force, "vector") ) @@ -457,10 +426,8 @@ def create_critical_dimension( int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_critical_dimension") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) check_type(upper, (float, int)) check_type(lower, (float, int)) return self.boundary_conditions.CreateCriticalDimension( @@ -487,10 +454,8 @@ def create_doe_critical_dimension( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="create_doe_critical_dimension" ) - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) check_type(name, str) return self.boundary_conditions.CreateDoeCriticalDimension( coerce_optional_dispatch(node1, "ent_list"), @@ -516,13 +481,10 @@ def create_ndbc( EntList: The list of NDBC that were created. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_ndbc") - if nodes is not None: - check_type(nodes, EntList) - if normal is not None: - check_type(normal, Vector) + check_optional_type(nodes, EntList) + check_optional_type(normal, Vector) check_type(prop_type, int) - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) prop_disp = coerce_optional_dispatch(prop, "prop") result = self.boundary_conditions.CreateNDBC( coerce_optional_dispatch(nodes, "ent_list"), @@ -552,13 +514,10 @@ def create_ndbc_at_xyz( EntList: The list of NDBC that were created. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_ndbc_at_xyz") - if coord is not None: - check_type(coord, Vector) - if normal is not None: - check_type(normal, Vector) + check_optional_type(coord, Vector) + check_optional_type(normal, Vector) check_type(prop_type, int) - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) prop_disp = coerce_optional_dispatch(prop, "prop") result = self.boundary_conditions.CreateNDBCAtXYZ( coerce_optional_dispatch(coord, "vector"), @@ -583,12 +542,9 @@ def move_ndbc(self, ndbc: EntList | None, nodes: EntList | None, normal: Vector bool: True if the NDBC was moved successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_ndbc") - if ndbc is not None: - check_type(ndbc, EntList) - if nodes is not None: - check_type(nodes, EntList) - if normal is not None: - check_type(normal, Vector) + check_optional_type(ndbc, EntList) + check_optional_type(nodes, EntList) + check_optional_type(normal, Vector) return self.boundary_conditions.MoveNDBC( coerce_optional_dispatch(ndbc, "ent_list"), coerce_optional_dispatch(nodes, "ent_list"), @@ -610,12 +566,9 @@ def move_ndbc_to_xyz( bool: True if successful; False if not """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_ndbc_to_xyz") - if ndbc is not None: - check_type(ndbc, EntList) - if coord is not None: - check_type(coord, Vector) - if normal is not None: - check_type(normal, Vector) + check_optional_type(ndbc, EntList) + check_optional_type(coord, Vector) + check_optional_type(normal, Vector) return self.boundary_conditions.MoveNDBCToXYZ( coerce_optional_dispatch(ndbc, "ent_list"), coerce_optional_dispatch(coord, "vector"), @@ -653,8 +606,7 @@ def set_prohibited_gate_nodes(self, nodes: EntList | None, analysis: AnalysisTyp int : Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_prohibited_gate_nodes") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) analysis = get_enum_value(analysis, AnalysisType) return self.boundary_conditions.SetProhibitedGateNodes( coerce_optional_dispatch(nodes, "ent_list"), analysis @@ -686,16 +638,11 @@ def create_one_sided_constraints( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="create_one_sided_constraints" ) - if nodes is not None: - check_type(nodes, EntList) - if positive_trans is not None: - check_type(positive_trans, Vector) - if negative_trans is not None: - check_type(negative_trans, Vector) - if positive_trans_types is not None: - check_type(positive_trans_types, Vector) - if negative_trans_types is not None: - check_type(negative_trans_types, Vector) + check_optional_type(nodes, EntList) + check_optional_type(positive_trans, Vector) + check_optional_type(negative_trans, Vector) + check_optional_type(positive_trans_types, Vector) + check_optional_type(negative_trans_types, Vector) if retract_time != 0: check_type(retract_time, (float, int)) positive_trans_types = self._check_vector(positive_trans_types) diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index f2cfe9f..96e4b71 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -9,7 +9,7 @@ from .ent_list import EntList from .vector import Vector from .logger import process_log, LogMessage -from .helper import check_type, coerce_optional_dispatch +from .helper import check_type, check_optional_type, coerce_optional_dispatch from .com_proxy import safe_com @@ -60,10 +60,8 @@ def modify_cad_surfaces_by_normal( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_cad_surfaces_by_normal" ) - if faces is not None: - check_type(faces, EntList) - if transit_faces is not None: - check_type(transit_faces, EntList) + check_optional_type(faces, EntList) + check_optional_type(transit_faces, EntList) check_type(distance, (float, int)) return self.cad_manager.ModifyCADSurfacesByNormal( coerce_optional_dispatch(faces, "ent_list"), @@ -89,12 +87,9 @@ def modify_cad_surfaces_by_vector( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_cad_surfaces_by_vector" ) - if faces is not None: - check_type(faces, EntList) - if transit_faces is not None: - check_type(transit_faces, EntList) - if vector is not None: - check_type(vector, Vector) + check_optional_type(faces, EntList) + check_optional_type(transit_faces, EntList) + check_optional_type(vector, Vector) return self.cad_manager.ModifyCADSurfacesByVector( coerce_optional_dispatch(faces, "ent_list"), coerce_optional_dispatch(transit_faces, "ent_list"), diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index 81c8894..af02959 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -7,7 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com from .common import TransformFunctions, TransformOperations, TransformScalarOperations from .integer_array import IntegerArray @@ -53,14 +53,10 @@ def func( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="func") func_name = get_enum_value(func_name, TransformFunctions) - if label_in is not None: - check_type(label_in, IntegerArray) - if data_in is not None: - check_type(data_in, DoubleArray) - if label_out is not None: - check_type(label_out, IntegerArray) - if data_out is not None: - check_type(data_out, DoubleArray) + check_optional_type(label_in, IntegerArray) + check_optional_type(data_in, DoubleArray) + check_optional_type(label_out, IntegerArray) + check_optional_type(data_out, DoubleArray) return self.data_transform.Func( func_name, coerce_optional_dispatch(label_in, "integer_array"), @@ -96,19 +92,13 @@ def op( bool: True if the operation was applied successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="op") - if label_1 is not None: - check_type(label_1, IntegerArray) - if data_1 is not None: - check_type(data_1, DoubleArray) + check_optional_type(label_1, IntegerArray) + check_optional_type(data_1, DoubleArray) op = get_enum_value(op, TransformOperations) - if label_2 is not None: - check_type(label_2, IntegerArray) - if data_2 is not None: - check_type(data_2, DoubleArray) - if label_out is not None: - check_type(label_out, IntegerArray) - if data_out is not None: - check_type(data_out, DoubleArray) + check_optional_type(label_2, IntegerArray) + check_optional_type(data_2, DoubleArray) + check_optional_type(label_out, IntegerArray) + check_optional_type(data_out, DoubleArray) return self.data_transform.Op( coerce_optional_dispatch(label_1, "integer_array"), coerce_optional_dispatch(data_1, "double_array"), @@ -144,16 +134,12 @@ def scalar( bool: True if the scalar operation was applied successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scalar") - if label_in is not None: - check_type(label_in, IntegerArray) - if data_in is not None: - check_type(data_in, DoubleArray) + check_optional_type(label_in, IntegerArray) + check_optional_type(data_in, DoubleArray) op = get_enum_value(op, TransformScalarOperations) check_type(scalar_value, (float, int)) - if label_out is not None: - check_type(label_out, IntegerArray) - if data_out is not None: - check_type(data_out, DoubleArray) + check_optional_type(label_out, IntegerArray) + check_optional_type(data_out, DoubleArray) return self.data_transform.Scalar( coerce_optional_dispatch(label_in, "integer_array"), coerce_optional_dispatch(data_in, "double_array"), diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index 17dc75d..4a08ab5 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -9,7 +9,7 @@ from .logger import process_log from .common import LogMessage -from .helper import check_type, check_min_max, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_min_max, coerce_optional_dispatch from .com_proxy import safe_com from .ent_list import EntList from .mesh_summary import MeshSummary @@ -129,8 +129,7 @@ def show_connect( visible (bool): Show/hide the selected mesh diagnosis. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_connect") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) check_type(ex_beam, bool) check_type(assign_layer, bool) check_type(show_txt, bool) @@ -339,10 +338,8 @@ def get_thickness_diagnosis( check_type(max_value, (float, int)) check_min_max(min_value, max_value) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetThicknessDiagnosis2( min_value, max_value, @@ -380,10 +377,8 @@ def get_aspect_ratio_diagnosis( check_min_max(min_value, max_value) check_type(std_ar, bool) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetAspectRatioDiagnosis2( min_value, max_value, @@ -415,14 +410,11 @@ def get_connectivity_diagnosis( int: The number of connectivity diagnostics. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_connectivity_diagnosis") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) check_type(ex_beam, bool) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetConnectivityDiagnosis2( coerce_optional_dispatch(nodes, "ent_list"), ex_beam, @@ -453,10 +445,8 @@ def get_edges_diagnosis( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_edges_diagnosis") check_type(non_manifold, bool) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetEdgesDiagnosis2( non_manifold, visible, @@ -489,10 +479,8 @@ def get_overlap_diagnosis( check_type(overlap, bool) check_type(intersect, bool) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetOverlapDiagnosis2( overlap, intersect, @@ -517,10 +505,8 @@ def get_occurrence_diagnosis( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_occurrence_diagnosis") check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetOccurrenceDiagnosis2( visible, coerce_optional_dispatch(element_id, "integer_array"), @@ -541,10 +527,8 @@ def get_match_info_diagnosis( int: The number of mesh match diagnostics. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_match_info_diagnosis") - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetMatchInfoDiagnosis( coerce_optional_dispatch(element_id, "integer_array"), coerce_optional_dispatch(value, "double_array"), @@ -566,10 +550,8 @@ def get_orientation_diagnosis( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_orientation_diagnosis") check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetOrientationDiagnosis2( visible, coerce_optional_dispatch(element_id, "integer_array"), @@ -619,10 +601,8 @@ def get_zero_area_elements_diagnosis( ) check_type(min_value, (float, int)) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetZeroAreaElementsDiagnosis2( min_value, visible, @@ -760,10 +740,8 @@ def get_surface_with_bad_trim_curve( check_type(inner_loop, bool) check_type(surf_def, bool) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetSurfWithBadTrimCurv( outer_loop, inner_loop, @@ -800,10 +778,8 @@ def get_surface_with_free_trim_curve( check_type(free, bool) check_type(non_manifold, bool) check_type(visible, bool) - if element_id is not None: - check_type(element_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(value, DoubleArray) return self.diagnosis_manager.GetSurfWithFreeTrimCurv( free, non_manifold, @@ -1001,8 +977,7 @@ def get_inverted_tetras(self, visible: bool, tetra_id: IntegerArray | None) -> i int: The number of inverted tetras. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_inverted_tetras") - if tetra_id is not None: - check_type(tetra_id, IntegerArray) + check_optional_type(tetra_id, IntegerArray) check_type(visible, bool) return self.diagnosis_manager.GetInvertedTetras( visible, coerce_optional_dispatch(tetra_id, "integer_array") @@ -1020,8 +995,7 @@ def get_collapsed_faces(self, visible: bool, tetra_id: IntegerArray | None) -> i int: The number of collapsed faces. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_collapsed_faces") - if tetra_id is not None: - check_type(tetra_id, IntegerArray) + check_optional_type(tetra_id, IntegerArray) check_type(visible, bool) return self.diagnosis_manager.GetCollapsedFaces( visible, coerce_optional_dispatch(tetra_id, "integer_array") @@ -1048,8 +1022,7 @@ def get_insufficient_refinement_through_thickness( name="get_insufficient_refinement_through_thickness", ) check_type(min_layer, int) - if tetra_id is not None: - check_type(tetra_id, IntegerArray) + check_optional_type(tetra_id, IntegerArray) check_type(visible, bool) return self.diagnosis_manager.GetInsufficientRefinementThroughThickness( min_layer, visible, coerce_optional_dispatch(tetra_id, "integer_array") @@ -1076,10 +1049,8 @@ def get_internal_long_edges( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_internal_long_edges") check_type(max_edge_length_ratio, (float, int)) - if tetra_id is not None: - check_type(tetra_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(tetra_id, IntegerArray) + check_optional_type(value, DoubleArray) check_type(visible, bool) return self.diagnosis_manager.GetInternalLongEdges( max_edge_length_ratio, @@ -1114,10 +1085,8 @@ def get_tetras_with_extremely_large_volume( name="get_tetras_with_extremely_large_volume", ) check_type(max_volume_ratio, (float, int)) - if tetra_id is not None: - check_type(tetra_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(tetra_id, IntegerArray) + check_optional_type(value, DoubleArray) check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithExtremelyLargeVolume( max_volume_ratio, @@ -1149,10 +1118,8 @@ def get_tetras_with_high_aspect_ratio( __name__, LogMessage.FUNCTION_CALL, locals(), name="get_tetras_with_high_aspect_ratio" ) check_type(max_aspect_ratio, (float, int)) - if tetra_id is not None: - check_type(tetra_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(tetra_id, IntegerArray) + check_optional_type(value, DoubleArray) check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithHighAspectRatio( max_aspect_ratio, @@ -1187,10 +1154,8 @@ def get_tetras_with_extreme_min_angle_between_faces( name="get_tetras_with_extreme_min_angle_between_faces", ) check_type(min_angle, (float, int)) - if tetra_id is not None: - check_type(tetra_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(tetra_id, IntegerArray) + check_optional_type(value, DoubleArray) check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithExtremeMinAngleBetweenFaces( min_angle, @@ -1225,10 +1190,8 @@ def get_tetras_with_extreme_max_angle_between_faces( name="get_tetras_with_extreme_max_angle_between_faces", ) check_type(max_angle, (float, int)) - if tetra_id is not None: - check_type(tetra_id, IntegerArray) - if value is not None: - check_type(value, DoubleArray) + check_optional_type(tetra_id, IntegerArray) + check_optional_type(value, DoubleArray) check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithExtremeMaxAngleBetweenFaces( max_angle, diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 1c39a4c..69bb800 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -6,7 +6,7 @@ EntList Class API Wrapper """ -from .helper import check_index, check_type, coerce_optional_dispatch +from .helper import check_index, check_type, check_optional_type, coerce_optional_dispatch from .com_proxy import safe_com, expose_oleobj from .predicate import Predicate from .common import LogMessage @@ -65,8 +65,7 @@ def select_from_predicate(self, predicate: Predicate | None) -> None: inclusion of an entity. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="select_from_predicate") - if predicate is not None: - check_type(predicate, Predicate) + check_optional_type(predicate, Predicate) self.ent_list.SelectFromPredicate(coerce_optional_dispatch(predicate, "predicate")) def convert_to_string(self) -> str: diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index f423f53..4d6fa10 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -9,7 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .common import EntityType, DisplayOption -from .helper import get_enum_value, check_type, check_range, coerce_optional_dispatch +from .helper import get_enum_value, check_type, check_optional_type, check_range, coerce_optional_dispatch from .com_proxy import safe_com @@ -49,8 +49,7 @@ def create_child_layer(self, folder: EntList | None) -> EntList: EntList: The created child layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_child_layer") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) result = self.folder_manager.CreateChildLayer(coerce_optional_dispatch(folder, "ent_list")) if result is None: return None @@ -67,8 +66,7 @@ def create_child_folder(self, folder: EntList | None) -> EntList: EntList: The created child folder. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_child_folder") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) result = self.folder_manager.CreateChildFolder(coerce_optional_dispatch(folder, "ent_list")) if result is None: return None @@ -86,10 +84,8 @@ def add_objects_to_folder(self, objects: EntList | None, folder: EntList | None) bool: True if the objects were added successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_objects_to_folder") - if objects is not None: - check_type(objects, EntList) - if folder is not None: - check_type(folder, EntList) + check_optional_type(objects, EntList) + check_optional_type(folder, EntList) return self.folder_manager.AddObjectsToFolder( coerce_optional_dispatch(objects, "ent_list"), coerce_optional_dispatch(folder, "ent_list"), @@ -106,8 +102,7 @@ def remove_objects_from_folder(self, objects: EntList | None) -> bool: bool: True if the objects were removed successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="remove_objects_from_folder") - if objects is not None: - check_type(objects, EntList) + check_optional_type(objects, EntList) return self.folder_manager.RemoveObjectsFromFolder( coerce_optional_dispatch(objects, "ent_list") ) @@ -138,8 +133,7 @@ def delete_folder(self, folder: EntList | None, move_layers: bool) -> bool: bool: True if the folder was deleted successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_folder") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) check_type(move_layers, bool) return self.folder_manager.DeleteFolder( coerce_optional_dispatch(folder, "ent_list"), move_layers @@ -156,8 +150,7 @@ def toggle_folder(self, folder: EntList | None) -> bool: bool: True if the folder was toggled successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="toggle_folder") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) return self.folder_manager.ToggleFolder(coerce_optional_dispatch(folder, "ent_list")) # pylint: disable-next=R0913, R0917 @@ -187,8 +180,7 @@ def expand_folder( int: The number of entities affected. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="expand_folder") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) # pylint: disable=R0801 check_type(levels, int) check_type(expand_new_layer, bool) @@ -218,8 +210,7 @@ def set_folder_name(self, folder: EntList | None, name: str) -> bool: bool: True if the folder name was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_folder_name") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) check_type(name, str) return self.folder_manager.SetFolderName(coerce_optional_dispatch(folder, "ent_list"), name) @@ -245,8 +236,7 @@ def show_folders(self, folders: EntList | None, show: bool) -> bool: bool: True if the folders were shown/hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_folders") - if folders is not None: - check_type(folders, EntList) + check_optional_type(folders, EntList) check_type(show, bool) return self.folder_manager.ShowFolders(coerce_optional_dispatch(folders, "ent_list"), show) @@ -275,8 +265,7 @@ def set_type_color( int: The integer identifier for the color """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_color") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(default, bool) check_type(red, int) @@ -304,8 +293,7 @@ def set_type_visible( bool: True if the visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_visible") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(visible, bool) return self.folder_manager.SetTypeVisible( @@ -353,8 +341,7 @@ def set_type_display_option( bool: True if the display option was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_display_option") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) entity_type = get_enum_value(entity_type, EntityType) option = get_enum_value(option, DisplayOption) return self.folder_manager.SetTypeDisplayOption( @@ -385,8 +372,7 @@ def get_next(self, folder: EntList | None) -> EntList: EntList: The next folder. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) result = self.folder_manager.GetNext(coerce_optional_dispatch(folder, "ent_list")) if result is None: return None @@ -403,8 +389,7 @@ def get_name(self, folder: EntList | None) -> str: str: The name of the folder. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_name") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) return self.folder_manager.GetName(coerce_optional_dispatch(folder, "ent_list")) def show_labels(self, folder: EntList | None, show: bool) -> bool: @@ -419,8 +404,7 @@ def show_labels(self, folder: EntList | None, show: bool) -> bool: bool: True if the labels were shown/hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_labels") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) check_type(show, bool) return self.folder_manager.ShowLabels(coerce_optional_dispatch(folder, "ent_list"), show) @@ -436,8 +420,7 @@ def show_glyphs(self, folder: EntList | None, show: bool) -> bool: bool: True if the glyphs were shown/hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_glyphs") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) check_type(show, bool) return self.folder_manager.ShowGlyphs(coerce_optional_dispatch(folder, "ent_list"), show) @@ -456,8 +439,7 @@ def set_type_show_labels( bool: True if the label visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_labels") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.folder_manager.SetTypeShowLabels( @@ -479,8 +461,7 @@ def set_type_show_glyphs( bool: True if the glyph visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_glyphs") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.folder_manager.SetTypeShowGlyphs( @@ -532,8 +513,7 @@ def hide_all_other_folders(self, folder: EntList | None) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="hide_all_other_folders") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) return self.folder_manager.HideAllOtherFolders(coerce_optional_dispatch(folder, "ent_list")) def remove_empty_folders(self) -> bool: @@ -558,8 +538,7 @@ def allow_clipping(self, folder: EntList | None, checked: bool) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="allow_clipping") - if folder is not None: - check_type(folder, EntList) + check_optional_type(folder, EntList) check_type(checked, bool) return self.folder_manager.AllowClipping( coerce_optional_dispatch(folder, "ent_list"), checked diff --git a/src/moldflow/helper.py b/src/moldflow/helper.py index c2d1a90..b77adc2 100644 --- a/src/moldflow/helper.py +++ b/src/moldflow/helper.py @@ -76,6 +76,34 @@ def check_type(value, types: tuple): process_log(__name__, LogMessage.VALID_INPUT) +def check_optional_type(value, types: tuple): + """ + Check if the value is of the specified type(s) or None. + + This function is used to validate optional parameters that may be None or a specific type. + It provides standardized handling of None arguments across API calls. + + Args: + value: The value to check. Can be None or of the specified type(s). + types (tuple): A tuple of types to check against (excluding None). + + Returns: + bool: True if the value is None or of the specified type(s), otherwise raises a TypeError. + + Raises: + TypeError: If the value is not None and not of the specified type(s). + + Notes: + - None is always considered valid. + - The function handles the special case where in python `bool` is a subclass of `int`. + - If `types` is not a tuple, it is treated as a single type. + """ + if value is None: + process_log(__name__, LogMessage.VALID_INPUT) + return + check_type(value, types) + + def _compare(value1, value2, inclusive): """ Compare two values diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index 8ade557..fce4938 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -9,7 +9,7 @@ from .ent_list import EntList from .common import EntityType, DisplayOption from .logger import process_log, LogMessage -from .helper import check_type, check_range, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_range, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com @@ -39,8 +39,7 @@ def active(self, layer: EntList | None) -> bool: bool: True if the layer is active, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="active") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) return self.layer_manager.Active(coerce_optional_dispatch(layer, "ent_list")) def create_layer(self) -> bool: @@ -64,8 +63,7 @@ def activate_layer(self, layer: EntList | None) -> bool: bool: True if the layer was activated successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="activate_layer") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) return self.layer_manager.ActivateLayer(coerce_optional_dispatch(layer, "ent_list")) def create_entity_list(self) -> EntList: @@ -93,10 +91,8 @@ def assign_to_layer(self, elems: EntList | None, layer: EntList | None) -> int: int: The number of elements assigned to the layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="assign_to_layer") - if elems is not None: - check_type(elems, EntList) - if layer is not None: - check_type(layer, EntList) + check_optional_type(elems, EntList) + check_optional_type(layer, EntList) return self.layer_manager.AssignToLayer( coerce_optional_dispatch(elems, "ent_list"), coerce_optional_dispatch(layer, "ent_list") ) @@ -114,8 +110,7 @@ def delete_layer(self, layer: EntList | None, move_ent: bool) -> bool: bool: True if the layer was deleted successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_layer") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) check_type(move_ent, bool) return self.layer_manager.DeleteLayer(coerce_optional_dispatch(layer, "ent_list"), move_ent) @@ -130,8 +125,7 @@ def toggle_layer(self, layer: EntList | None) -> bool: bool: True if the layer was toggled successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="toggle_layer") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) return self.layer_manager.ToggleLayer(coerce_optional_dispatch(layer, "ent_list")) # pylint: disable-next=R0913, R0917 @@ -161,8 +155,7 @@ def expand_layer( int: The number of elements expanded. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="expand_layer") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) check_type(levels, int) check_type(expand_new_layer, bool) check_type(inc_nodes, bool) @@ -191,8 +184,7 @@ def set_layer_name(self, layer: EntList | None, name: str) -> bool: bool: True if the name was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_layer_name") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) check_type(name, str) return self.layer_manager.SetLayerName(coerce_optional_dispatch(layer, "ent_list"), name) @@ -218,8 +210,7 @@ def show_layers(self, layers: EntList | None, show: bool) -> bool: bool: True if the layers were shown or hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_layers") - if layers is not None: - check_type(layers, EntList) + check_optional_type(layers, EntList) check_type(show, bool) return self.layer_manager.ShowLayers(coerce_optional_dispatch(layers, "ent_list"), show) @@ -248,8 +239,7 @@ def set_type_color( int: The integer identifier for the color """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_color") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(default, bool) check_range(red, 0, 255, True, True) @@ -274,8 +264,7 @@ def set_type_visible( bool: True if the visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_visible") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(visible, bool) return self.layer_manager.SetTypeVisible( @@ -323,8 +312,7 @@ def set_type_display_option( bool: True if the display option was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_display_option") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) entity_type = get_enum_value(entity_type, EntityType) option = get_enum_value(option, DisplayOption) return self.layer_manager.SetTypeDisplayOption( @@ -355,8 +343,7 @@ def get_next(self, layer: EntList | None) -> EntList: EntList: The next layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) result = self.layer_manager.GetNext(coerce_optional_dispatch(layer, "ent_list")) if result is None: return None @@ -373,8 +360,7 @@ def get_name(self, layer: EntList | None) -> str: str: The name of the layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_name") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) return self.layer_manager.GetName(coerce_optional_dispatch(layer, "ent_list")) def show_labels(self, layer: EntList | None, show: bool) -> bool: @@ -389,8 +375,7 @@ def show_labels(self, layer: EntList | None, show: bool) -> bool: bool: True if the labels were shown or hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_labels") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) check_type(show, bool) return self.layer_manager.ShowLabels(coerce_optional_dispatch(layer, "ent_list"), show) @@ -406,8 +391,7 @@ def show_glyphs(self, layer: EntList | None, show: bool) -> bool: bool: True if the glyphs were shown or hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_glyphs") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) check_type(show, bool) return self.layer_manager.ShowGlyphs(coerce_optional_dispatch(layer, "ent_list"), show) @@ -426,8 +410,7 @@ def set_type_show_labels( bool: True if the label visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_labels") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.layer_manager.SetTypeShowLabels( @@ -449,8 +432,7 @@ def set_type_show_glyphs( bool: True if the glyphs visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_glyphs") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.layer_manager.SetTypeShowGlyphs( @@ -502,8 +484,7 @@ def hide_all_other_layers(self, layer: EntList | None) -> bool: bool: True if all other layers were hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="hide_all_other_layers") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) return self.layer_manager.HideAllOtherLayers(coerce_optional_dispatch(layer, "ent_list")) def remove_empty_layers(self) -> bool: @@ -527,8 +508,7 @@ def get_activated(self, layer: EntList | None) -> bool: bool: True if the layer is visible, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_activated") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) return self.layer_manager.GetActivated(coerce_optional_dispatch(layer, "ent_list")) def get_type_visible(self, layer: EntList | None, entity_type: EntityType | str) -> bool: @@ -543,8 +523,7 @@ def get_type_visible(self, layer: EntList | None, entity_type: EntityType | str) bool: True if the entity type is visible, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_type_visible") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) entity_type = get_enum_value(entity_type, EntityType) return self.layer_manager.GetTypeVisible( coerce_optional_dispatch(layer, "ent_list"), entity_type @@ -572,8 +551,7 @@ def allow_clipping(self, layer: EntList | None, checked: bool) -> bool: bool: True if the clipping was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="allow_clipping") - if layer is not None: - check_type(layer, EntList) + check_optional_type(layer, EntList) check_type(checked, bool) return self.layer_manager.AllowClipping( coerce_optional_dispatch(layer, "ent_list"), checked diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index 8cf8999..738b17b 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -9,7 +9,7 @@ from .prop import Property from .common import MaterialDatabase, MaterialDatabaseType from .logger import process_log -from .helper import check_type, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com from .common import LogMessage @@ -72,8 +72,7 @@ def get_next_material(self, material: Property | None) -> Property: Property: The next material. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_material") - if material is not None: - check_type(material, Property) + check_optional_type(material, Property) material_disp = coerce_optional_dispatch(material, "prop") result = self.material_finder.GetNextMaterial(material_disp) if result is None: diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index 88e207f..b30823d 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -13,7 +13,7 @@ from .ent_list import EntList from .vector import Vector from .prop import Property -from .helper import check_type, check_range, check_is_non_negative, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_range, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com @@ -80,10 +80,8 @@ def swap_edge( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="swap_edges") - if tri1 is not None: - check_type(tri1, EntList) - if tri2 is not None: - check_type(tri2, EntList) + check_optional_type(tri1, EntList) + check_optional_type(tri2, EntList) check_type(feat_allow, bool) return self.mesh_editor.SwapEdge( coerce_optional_dispatch(tri1, "ent_list"), @@ -104,8 +102,7 @@ def stitch_free_edges(self, nodes: EntList | None, tolerance: float) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="stitch_free_edges") check_type(tolerance, float) - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) return self.mesh_editor.StitchFreeEdges2( coerce_optional_dispatch(nodes, "ent_list"), tolerance ) @@ -121,10 +118,8 @@ def insert_node(self, node1: EntList | None, node2: EntList | None) -> EntList: The new node. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) result = self.mesh_editor.InsertNode( coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list") ) @@ -149,8 +144,7 @@ def insert_node_in_tri( The new node at the centroid of triangle. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tri") - if node1 is not None: - check_type(node1, EntList) + check_optional_type(node1, EntList) if node2 is None and node3 is None: check_range(node1.size, 3, 3, True, True) @@ -159,10 +153,8 @@ def insert_node_in_tri( return None return EntList(result) - if node2 is not None: - check_type(node2, EntList) - if node3 is not None: - check_type(node3, EntList) + check_optional_type(node2, EntList) + check_optional_type(node3, EntList) result = self.mesh_editor.InsertNodeInTri( coerce_optional_dispatch(node1, "ent_list"), @@ -196,20 +188,16 @@ def insert_node_in_tet( The new node at the centroid of tetrahedron. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tet") - if node1 is not None: - check_type(node1, EntList) + check_optional_type(node1, EntList) if node2 is None or node3 is None or node4 is None: check_range(node1.size, 4, 4, True, True) result = self.mesh_editor.InsertNodeInTet(coerce_optional_dispatch(node1, "ent_list")) if result is None: return None return EntList(result) - if node2 is not None: - check_type(node2, EntList) - if node3 is not None: - check_type(node3, EntList) - if node4 is not None: - check_type(node4, EntList) + check_optional_type(node2, EntList) + check_optional_type(node3, EntList) + check_optional_type(node4, EntList) result = self.mesh_editor.InsertNodeInTetByNodes( coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list"), @@ -243,14 +231,10 @@ def insert_node_in_tet_by_nodes( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tet_by_nodes" ) - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) - if node3 is not None: - check_type(node3, EntList) - if node4 is not None: - check_type(node4, EntList) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) + check_optional_type(node3, EntList) + check_optional_type(node4, EntList) result = self.mesh_editor.InsertNodeInTetByNodes( coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list"), @@ -272,8 +256,7 @@ def insert_node_on_beam(self, beam: EntList | None, num_div: int = 2) -> EntList Entlist of the new node. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_on_beam") - if beam is not None: - check_type(beam, EntList) + check_optional_type(beam, EntList) check_type(num_div, int) check_is_non_negative(num_div) result = self.mesh_editor.InsertNodeOnBeam( @@ -295,10 +278,8 @@ def move_nodes(self, nodes: EntList | None, vector: Vector | None, loc: bool) -> True if successful; False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_nodes") - if nodes is not None: - check_type(nodes, EntList) - if vector is not None: - check_type(vector, Vector) + check_optional_type(nodes, EntList) + check_optional_type(vector, Vector) check_type(loc, bool) return self.mesh_editor.MoveNodes( coerce_optional_dispatch(nodes, "ent_list"), @@ -322,12 +303,9 @@ def align_nodes( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_nodes") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) - if to_align is not None: - check_type(to_align, EntList) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) + check_optional_type(to_align, EntList) return self.mesh_editor.AlignNodes( coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list"), @@ -346,8 +324,7 @@ def smooth_nodes(self, nodes: EntList | None, feat: bool) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="smooth_nodes") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) check_type(feat, bool) return self.mesh_editor.SmoothNodes(coerce_optional_dispatch(nodes, "ent_list"), feat) @@ -377,8 +354,7 @@ def flip_normals(self, tris: EntList | None) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="flip_normals") - if tris is not None: - check_type(tris, EntList) + check_optional_type(tris, EntList) return self.mesh_editor.FlipNormals(coerce_optional_dispatch(tris, "ent_list")) def align_normals(self, seed_tri: EntList | None, tris: EntList | None) -> int: @@ -394,10 +370,8 @@ def align_normals(self, seed_tri: EntList | None, tris: EntList | None) -> int: Number of triangles whose normals were aligned """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_normals") - if seed_tri is not None: - check_type(seed_tri, EntList) - if tris is not None: - check_type(tris, EntList) + check_optional_type(seed_tri, EntList) + check_optional_type(tris, EntList) return self.mesh_editor.AlignNormals( coerce_optional_dispatch(seed_tri, "ent_list"), coerce_optional_dispatch(tris, "ent_list"), @@ -417,8 +391,7 @@ def fill_hole(self, nodes: EntList | None, fill_type: int | None = None) -> bool True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="fill_hole") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) if fill_type is None: return self.mesh_editor.FillHole(coerce_optional_dispatch(nodes, "ent_list")) check_type(fill_type, int) @@ -447,16 +420,11 @@ def create_tet( The new tetrahedron. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_tet") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) - if node3 is not None: - check_type(node3, EntList) - if node4 is not None: - check_type(node4, EntList) - if prop is not None: - check_type(prop, Property) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) + check_optional_type(node3, EntList) + check_optional_type(node4, EntList) + check_optional_type(prop, Property) prop_disp = coerce_optional_dispatch(prop, "prop") result = self.mesh_editor.CreateTet( coerce_optional_dispatch(node1, "ent_list"), @@ -489,14 +457,10 @@ def create_tri( The new triangle """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_tri") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) - if node3 is not None: - check_type(node3, EntList) - if prop is not None: - check_type(prop, Property) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) + check_optional_type(node3, EntList) + check_optional_type(prop, Property) prop_disp = coerce_optional_dispatch(prop, "prop") result = self.mesh_editor.CreateTri( coerce_optional_dispatch(node1, "ent_list"), @@ -557,8 +521,7 @@ def refine_tetras_by_labels( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="refine_tetras_by_labels") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) check_type(num_layer, int) check_is_non_negative(num_layer) check_type(isolate_refined_tet, bool) @@ -599,20 +562,13 @@ def create_wedge( The new wedge. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_wedge") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) - if node3 is not None: - check_type(node3, EntList) - if node4 is not None: - check_type(node4, EntList) - if node5 is not None: - check_type(node5, EntList) - if node6 is not None: - check_type(node6, EntList) - if prop is not None: - check_type(prop, Property) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) + check_optional_type(node3, EntList) + check_optional_type(node4, EntList) + check_optional_type(node5, EntList) + check_optional_type(node6, EntList) + check_optional_type(prop, Property) result = self.mesh_editor.CreateWedge( coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list"), @@ -639,8 +595,7 @@ def convert_wedges_to_tetras(self, wedges: EntList | None, num_layer: int) -> bo True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="convert_wedges_to_tetras") - if wedges is not None: - check_type(wedges, EntList) + check_optional_type(wedges, EntList) check_type(num_layer, int) check_is_non_negative(num_layer) return self.mesh_editor.ConvertWedgesToTetras( @@ -663,14 +618,11 @@ def create_beams( The new beam. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_beams") - if node1 is not None: - check_type(node1, EntList) - if node2 is not None: - check_type(node2, EntList) + check_optional_type(node1, EntList) + check_optional_type(node2, EntList) check_type(num_beams, int) check_is_non_negative(num_beams) - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) result = self.mesh_editor.CreateBeams( coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list"), @@ -715,8 +667,7 @@ def delete(self, entities: EntList | None) -> EntList: You would need to delete the dependent entities first """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete") - if entities is not None: - check_type(entities, EntList) + check_optional_type(entities, EntList) result = self.mesh_editor.Delete(coerce_optional_dispatch(entities, "ent_list")) if result is None: return None @@ -738,8 +689,7 @@ def remesh_area( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="remesh_area") - if tris is not None: - check_type(tris, EntList) + check_optional_type(tris, EntList) check_type(size, (int, float)) check_type(imprint, bool) check_type(smooth, (int, float)) @@ -762,10 +712,8 @@ def match_nodes(self, nodes: EntList | None, tris: EntList | None, layer: str) - Number of nodes affected """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="match_notes") - if nodes is not None: - check_type(nodes, EntList) - if tris is not None: - check_type(tris, EntList) + check_optional_type(nodes, EntList) + check_optional_type(tris, EntList) check_type(layer, str) return self.mesh_editor.MatchNodes( coerce_optional_dispatch(nodes, "ent_list"), @@ -793,8 +741,7 @@ def make_region( check_type(tol, float) check_type(is_angular, bool) check_type(mesh, bool) - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) return self.mesh_editor.MakeRegion2( tol, is_angular, mesh, coerce_optional_dispatch(prop, "prop") ) @@ -812,10 +759,8 @@ def move_beam_node(self, moving_node: EntList | None, target: Vector | None) -> True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_beam_node") - if moving_node is not None: - check_type(moving_node, EntList) - if target is not None: - check_type(target, Vector) + check_optional_type(moving_node, EntList) + check_optional_type(target, Vector) return self.mesh_editor.MoveBeamNode( coerce_optional_dispatch(moving_node, "ent_list"), coerce_optional_dispatch(target, "vector"), @@ -842,12 +787,9 @@ def move_node_to_edge( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_node_to_edge") - if node is not None: - check_type(node, EntList) - if edge_node1 is not None: - check_type(edge_node1, EntList) - if edge_node2 is not None: - check_type(edge_node2, EntList) + check_optional_type(node, EntList) + check_optional_type(edge_node1, EntList) + check_optional_type(edge_node2, EntList) check_type(param_loc, (int, float)) check_range(param_loc, 0.0, 1.0, True, True) return self.mesh_editor.MoveNodeToEdge( @@ -873,14 +815,11 @@ def create_beams_by_points( The new beam. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_beams_by_points") - if pt1 is not None: - check_type(pt1, Vector) - if pt2 is not None: - check_type(pt2, Vector) + check_optional_type(pt1, Vector) + check_optional_type(pt2, Vector) check_type(num, int) check_is_non_negative(num) - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) result = self.mesh_editor.CreateBeamsByPoints( coerce_optional_dispatch(pt1, "vector"), coerce_optional_dispatch(pt2, "vector"), @@ -902,8 +841,7 @@ def project_mesh(self, tris: EntList | None) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="project_mesh") - if tris is not None: - check_type(tris, EntList) + check_optional_type(tris, EntList) return self.mesh_editor.ProjectMesh(coerce_optional_dispatch(tris, "ent_list")) def convert_to_beams( @@ -922,10 +860,8 @@ def convert_to_beams( Number of beams created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="convert_to_beams") - if start_node is not None: - check_type(start_node, EntList) - if prop is not None: - check_type(prop, Property) + check_optional_type(start_node, EntList) + check_optional_type(prop, Property) check_type(junction, bool) check_type(num_branch, int) check_is_non_negative(num_branch) @@ -986,10 +922,8 @@ def cut_triangles_by_plane( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="cut_triangles_by_plane") - if plane_normal is not None: - check_type(plane_normal, Vector) - if ref_point is not None: - check_type(ref_point, Vector) + check_optional_type(plane_normal, Vector) + check_optional_type(ref_point, Vector) check_type(fill, bool) check_type(smooth, bool) return self.mesh_editor.CutTrianglesByPlane( @@ -1015,8 +949,7 @@ def offset_triangles( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="offset_triangles") - if offset_tri is not None: - check_type(offset_tri, EntList) + check_optional_type(offset_tri, EntList) check_type(offset_dist, (int, float)) check_type(falloff_dist, (int, float)) check_type(smooth_nb, bool) @@ -1049,14 +982,12 @@ def extrude_triangles( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="extrude_triangles") - if offset_tri is not None: - check_type(offset_tri, EntList) + check_optional_type(offset_tri, EntList) check_type(dist, (int, float)) check_type(scale, (int, float)) check_type(smooth_nb, bool) check_type(create_new_body, bool) - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) return self.mesh_editor.ExtrudeTriangles( coerce_optional_dispatch(offset_tri, "ent_list"), dist, @@ -1087,8 +1018,7 @@ def imprint_selected_triangles(self, tri: EntList | None) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="imprint_selected_triangles") - if tri is not None: - check_type(tri, EntList) + check_optional_type(tri, EntList) return self.mesh_editor.ImprintSelectedTriangles(coerce_optional_dispatch(tri, "ent_list")) # pylint: disable=R0913, R0917 @@ -1148,10 +1078,8 @@ def merge_nodes( number of nodes merged """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="merge_nodes") - if target is not None: - check_type(target, EntList) - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(target, EntList) + check_optional_type(nodes, EntList) check_type(fusion, bool) check_type(use_mid, bool) return self.mesh_editor.MergeNodes2( diff --git a/src/moldflow/modeler.py b/src/moldflow/modeler.py index 76f62da..1029d03 100644 --- a/src/moldflow/modeler.py +++ b/src/moldflow/modeler.py @@ -14,6 +14,7 @@ check_is_non_negative, check_is_positive, check_type, + check_optional_type, get_enum_value, coerce_optional_dispatch, ) @@ -51,8 +52,7 @@ def create_node_by_xyz(self, coord: Vector | None) -> EntList: int: The ID of the created node. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_node_by_xyz") - if coord is not None: - check_type(coord, Vector) + check_optional_type(coord, Vector) result = self.modeler.CreateNodeByXYZ(coerce_optional_dispatch(coord, "vector")) if result is None: return None @@ -73,10 +73,8 @@ def create_nodes_between( EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_between") - if start is not None: - check_type(start, Vector) - if end is not None: - check_type(end, Vector) + check_optional_type(start, Vector) + check_optional_type(end, Vector) check_type(num_nodes, int) check_is_positive(num_nodes) result = self.modeler.CreateNodesBetween( @@ -103,10 +101,8 @@ def create_nodes_by_offset( EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_by_offset") - if coord is not None: - check_type(coord, Vector) - if offset is not None: - check_type(offset, Vector) + check_optional_type(coord, Vector) + check_optional_type(offset, Vector) check_type(num_nodes, int) check_is_positive(num_nodes) result = self.modeler.CreateNodesByOffset( @@ -131,8 +127,7 @@ def create_nodes_by_divide(self, curve: EntList | None, num_nodes: int, ends: bo EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_by_divide") - if curve is not None: - check_type(curve, EntList) + check_optional_type(curve, EntList) check_type(num_nodes, int) check_is_positive(num_nodes) check_type(ends, bool) @@ -171,12 +166,9 @@ def create_node_by_intersect( EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_node_by_intersect") - if curve is not None: - check_type(curve, EntList) - if curve2 is not None: - check_type(curve2, EntList) - if pt is not None: - check_type(pt, Vector) + check_optional_type(curve, EntList) + check_optional_type(curve2, EntList) + check_optional_type(pt, Vector) result = self.modeler.CreateNodeByIntersect( coerce_optional_dispatch(curve, "ent_list"), coerce_optional_dispatch(curve2, "ent_list"), @@ -210,13 +202,10 @@ def create_line( EntList: The list of created lines. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_line") - if coord is not None: - check_type(coord, Vector) - if vec is not None: - check_type(vec, Vector) + check_optional_type(coord, Vector) + check_optional_type(vec, Vector) check_type(relative, bool) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(prop_set, Property) check_type(ends, bool) prop_disp = coerce_optional_dispatch(prop_set, "prop") result = self.modeler.CreateLine( @@ -255,14 +244,12 @@ def create_arc_by_angle( EntList: The list of created arcs. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_arc_by_angle") - if center is not None: - check_type(center, Vector) + check_optional_type(center, Vector) check_type(radius, (int, float)) check_is_positive(radius) check_type(start, (int, float)) check_type(end, (int, float)) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(prop_set, Property) check_type(ends, bool) result = self.modeler.CreateArcByAngle( coerce_optional_dispatch(center, "vector"), @@ -302,15 +289,11 @@ def create_arc_by_points( EntList: The list of created arcs. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_arc_by_points") - if pt1 is not None: - check_type(pt1, Vector) - if pt2 is not None: - check_type(pt2, Vector) - if pt3 is not None: - check_type(pt3, Vector) + check_optional_type(pt1, Vector) + check_optional_type(pt2, Vector) + check_optional_type(pt3, Vector) check_type(circle, bool) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(prop_set, Property) check_type(ends, bool) result = self.modeler.CreateArcByPoints( coerce_optional_dispatch(pt1, "vector"), @@ -373,15 +356,12 @@ def create_curve_by_connect( EntList: The list of created curves. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_curve_by_connect") - if curve1 is not None: - check_type(curve1, EntList) + check_optional_type(curve1, EntList) end1 = get_enum_value(end1, CurveInitPosition) - if curve2 is not None: - check_type(curve2, EntList) + check_optional_type(curve2, EntList) end2 = get_enum_value(end2, CurveInitPosition) check_type(factor, (int, float)) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(prop_set, Property) result = self.modeler.CreateCurveByConnect( coerce_optional_dispatch(curve1, "ent_list"), end1, @@ -409,10 +389,8 @@ def create_spline( EntList: The list of created splines. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spline") - if coord is not None: - check_type(coord, VectorArray) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(coord, VectorArray) + check_optional_type(prop_set, Property) check_type(ends, bool) result = self.modeler.CreateSpline( coerce_optional_dispatch(coord, "vector_array"), @@ -435,10 +413,8 @@ def break_curves(self, curve1: EntList | None, curve2: EntList | None) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="break_curves") - if curve1 is not None: - check_type(curve1, EntList) - if curve2 is not None: - check_type(curve2, EntList) + check_optional_type(curve1, EntList) + check_optional_type(curve2, EntList) return self.modeler.BreakCurves( coerce_optional_dispatch(curve1, "ent_list"), coerce_optional_dispatch(curve2, "ent_list"), @@ -456,10 +432,8 @@ def set_property(self, ents: EntList | None, prop_set: Property | None) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_property") - if ents is not None: - check_type(ents, EntList) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(ents, EntList) + check_optional_type(prop_set, Property) return self.modeler.SetProperty( coerce_optional_dispatch(ents, "ent_list"), coerce_optional_dispatch(prop_set, "prop") ) @@ -478,10 +452,8 @@ def create_region_by_boundary( EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_boundary") - if curve is not None: - check_type(curve, EntList) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(curve, EntList) + check_optional_type(prop_set, Property) result = self.modeler.CreateRegionByBoundary( coerce_optional_dispatch(curve, "ent_list"), coerce_optional_dispatch(prop_set, "prop") ) @@ -501,10 +473,8 @@ def create_region_by_nodes(self, nodes: EntList | None, prop_set: Property | Non EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_nodes") - if nodes is not None: - check_type(nodes, EntList) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(nodes, EntList) + check_optional_type(prop_set, Property) result = self.modeler.CreateRegionByNodes( coerce_optional_dispatch(nodes, "ent_list"), coerce_optional_dispatch(prop_set, "prop") ) @@ -527,12 +497,9 @@ def create_region_by_ruling( EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_ruling") - if curve1 is not None: - check_type(curve1, EntList) - if curve2 is not None: - check_type(curve2, EntList) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(curve1, EntList) + check_optional_type(curve2, EntList) + check_optional_type(prop_set, Property) result = self.modeler.CreateRegionByRuling( coerce_optional_dispatch(curve1, "ent_list"), coerce_optional_dispatch(curve2, "ent_list"), @@ -557,12 +524,9 @@ def create_region_by_extrusion( EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_extrusion") - if curve is not None: - check_type(curve, EntList) - if direction is not None: - check_type(direction, Vector) - if prop_set is not None: - check_type(prop_set, Property) + check_optional_type(curve, EntList) + check_optional_type(direction, Vector) + check_optional_type(prop_set, Property) result = self.modeler.CreateRegionByExtrusion( coerce_optional_dispatch(curve, "ent_list"), coerce_optional_dispatch(direction, "vector"), @@ -584,10 +548,8 @@ def create_hole_by_boundary(self, region: EntList | None, curve: EntList | None) bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_boundary") - if region is not None: - check_type(region, EntList) - if curve is not None: - check_type(curve, EntList) + check_optional_type(region, EntList) + check_optional_type(curve, EntList) return self.modeler.CreateHoleByBoundary( coerce_optional_dispatch(region, "ent_list"), coerce_optional_dispatch(curve, "ent_list"), @@ -605,10 +567,8 @@ def create_hole_by_nodes(self, region: EntList | None, nodes: EntList | None) -> bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_nodes") - if region is not None: - check_type(region, EntList) - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(region, EntList) + check_optional_type(nodes, EntList) return self.modeler.CreateHoleByNodes( coerce_optional_dispatch(region, "ent_list"), coerce_optional_dispatch(nodes, "ent_list"), @@ -629,12 +589,9 @@ def create_hole_by_ruling( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_ruling") - if region is not None: - check_type(region, EntList) - if curve1 is not None: - check_type(curve1, EntList) - if curve2 is not None: - check_type(curve2, EntList) + check_optional_type(region, EntList) + check_optional_type(curve1, EntList) + check_optional_type(curve2, EntList) return self.modeler.CreateHoleByRuling( coerce_optional_dispatch(region, "ent_list"), coerce_optional_dispatch(curve1, "ent_list"), @@ -656,12 +613,9 @@ def create_hole_by_extrusion( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_extrusion") - if region is not None: - check_type(region, EntList) - if curve is not None: - check_type(curve, EntList) - if direction is not None: - check_type(direction, Vector) + check_optional_type(region, EntList) + check_optional_type(curve, EntList) + check_optional_type(direction, Vector) return self.modeler.CreateHoleByExtrusion( coerce_optional_dispatch(region, "ent_list"), coerce_optional_dispatch(curve, "ent_list"), @@ -691,12 +645,9 @@ def reflect( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="reflect") - if ent is not None: - check_type(ent, EntList) - if reference is not None: - check_type(reference, Vector) - if plane is not None: - check_type(plane, Vector) + check_optional_type(ent, EntList) + check_optional_type(reference, Vector) + check_optional_type(plane, Vector) check_type(copy, bool) check_type(merge, bool) return self.modeler.Reflect( @@ -731,12 +682,9 @@ def scale( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scale") - if ent is not None: - check_type(ent, EntList) - if reference is not None: - check_type(reference, Vector) - if scale is not None: - check_type(scale, Vector) + check_optional_type(ent, EntList) + check_optional_type(reference, Vector) + check_optional_type(scale, Vector) check_type(copy, bool) check_type(merge, bool) return self.modeler.Scale( @@ -771,10 +719,8 @@ def translate( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="translate") - if ent is not None: - check_type(ent, EntList) - if translation is not None: - check_type(translation, Vector) + check_optional_type(ent, EntList) + check_optional_type(translation, Vector) check_type(copy, bool) check_type(num_copies, int) check_is_non_negative(num_copies) @@ -815,12 +761,9 @@ def rotate( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="rotate") - if ent is not None: - check_type(ent, EntList) - if center is not None: - check_type(center, Vector) - if axis is not None: - check_type(axis, Vector) + check_optional_type(ent, EntList) + check_optional_type(center, Vector) + check_optional_type(axis, Vector) check_type(angle, (int, float)) check_is_non_negative(angle) check_type(copy, bool) @@ -863,14 +806,10 @@ def rotate_3_pts( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="rotate_3_pts") - if ents is not None: - check_type(ents, EntList) - if pt1 is not None: - check_type(pt1, Vector) - if pt2 is not None: - check_type(pt2, Vector) - if pt3 is not None: - check_type(pt3, Vector) + check_optional_type(ents, EntList) + check_optional_type(pt1, Vector) + check_optional_type(pt2, Vector) + check_optional_type(pt3, Vector) check_type(copy, bool) check_type(merge, bool) return self.modeler.Rotate3Pts( @@ -897,12 +836,9 @@ def create_lcs_by_points( EntList: The created local coordinate system. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_lcs_by_points") - if coord1 is not None: - check_type(coord1, Vector) - if coord2 is not None: - check_type(coord2, Vector) - if coord3 is not None: - check_type(coord3, Vector) + check_optional_type(coord1, Vector) + check_optional_type(coord2, Vector) + check_optional_type(coord3, Vector) result = self.modeler.CreateLCSByPoints( coerce_optional_dispatch(coord1, "vector"), coerce_optional_dispatch(coord2, "vector"), @@ -926,8 +862,7 @@ def activate_lcs(self, lcs: EntList | None, active: bool, lcs_type: LCSType | st bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="activate_lcs") - if lcs is not None: - check_type(lcs, EntList) + check_optional_type(lcs, EntList) check_type(active, bool) lcs_type = get_enum_value(lcs_type, LCSType) return self.modeler.ActivateLCS(coerce_optional_dispatch(lcs, "ent_list"), active, lcs_type) @@ -972,14 +907,11 @@ def set_mesh_size( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_mesh_size") check_type(global_size, (int, float)) check_is_non_negative(global_size) - if ents is not None: - check_type(ents, EntList) - if boundaries is not None: - check_type(boundaries, BoundaryList) + check_optional_type(ents, EntList) + check_optional_type(boundaries, BoundaryList) check_type(size, (int, float)) check_is_positive(size) - if cad_bodies is not None: - check_type(cad_bodies, EntList) + check_optional_type(cad_bodies, EntList) check_type(num_layer, int) check_is_non_negative(num_layer) return self.modeler.SetMeshSize2( @@ -1006,10 +938,8 @@ def scale_mesh_density( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scale_mesh_density") - if ents is not None: - check_type(ents, EntList) - if boundaries is not None: - check_type(boundaries, BoundaryList) + check_optional_type(ents, EntList) + check_optional_type(boundaries, BoundaryList) check_type(scale, (int, float)) check_is_positive(scale) return self.modeler.ScaleMeshDensity( @@ -1031,8 +961,7 @@ def modified_with_inventor_fusion(self, ents: EntList | None) -> int: process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="modified_with_inventor_fusion" ) - if ents is not None: - check_type(ents, EntList) + check_optional_type(ents, EntList) return self.modeler.ModifiedWithInventorFusion(coerce_optional_dispatch(ents, "ent_list")) def is_inventor_fusion_cad_edit_done(self, job_id: int) -> bool: diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index 18374cd..b5308ce 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -7,7 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, coerce_optional_dispatch +from .helper import check_type, check_optional_type, coerce_optional_dispatch from .com_proxy import safe_com from .vector import Vector @@ -85,8 +85,7 @@ def origin(self, value: Vector | None) -> None: value (Vector): The new origin of the mold surface. """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="origin", value=value) - if value is not None: - check_type(value, Vector) + check_optional_type(value, Vector) self.mold_surface_generator.Origin = coerce_optional_dispatch(value, "vector") @property @@ -113,8 +112,7 @@ def dimensions(self, value: Vector | None) -> None: value (Vector): The new dimensions of the mold surface. """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="dimensions", value=value) - if value is not None: - check_type(value, Vector) + check_optional_type(value, Vector) self.mold_surface_generator.Dimensions = coerce_optional_dispatch(value, "vector") @property diff --git a/src/moldflow/plot.py b/src/moldflow/plot.py index 0cdbf24..434b8f2 100644 --- a/src/moldflow/plot.py +++ b/src/moldflow/plot.py @@ -11,6 +11,7 @@ from .logger import process_log, LogMessage from .helper import ( check_type, + check_optional_type, get_enum_value, check_range, check_is_non_negative, @@ -1072,8 +1073,7 @@ def add_xy_plot_curve(self, curve: EntList | None) -> None: curve (EntList): The curve to add. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_xy_plot_curve") - if curve is not None: - check_type(curve, EntList) + check_optional_type(curve, EntList) self.plot.AddXYPlotCurve(coerce_optional_dispatch(curve, "ent_list")) def delete_xy_plot_curve(self, curve: EntList | None) -> None: @@ -1084,8 +1084,7 @@ def delete_xy_plot_curve(self, curve: EntList | None) -> None: curve (EntList): The curve to delete. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_xy_plot_curve") - if curve is not None: - check_type(curve, EntList) + check_optional_type(curve, EntList) self.plot.DeleteXYPlotCurve(coerce_optional_dispatch(curve, "ent_list")) @property @@ -1166,8 +1165,7 @@ def apply_best_fit(self, nodes: EntList | None) -> bool: bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="apply_best_fit") - if nodes is not None: - check_type(nodes, EntList) + check_optional_type(nodes, EntList) return self.plot.ApplyBestFit(coerce_optional_dispatch(nodes, "ent_list")) @property @@ -1348,8 +1346,7 @@ def warp_query_node(self, node_id: int, return_values: DoubleArray | None) -> bo process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="warp_query_node") check_type(node_id, int) check_is_non_negative(node_id) - if return_values is not None: - check_type(return_values, DoubleArray) + check_optional_type(return_values, DoubleArray) return self.plot.WarpQueryNode( node_id, coerce_optional_dispatch(return_values, "double_array") ) @@ -1384,10 +1381,8 @@ def get_probe_plot_probe_line( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_probe_plot_probe_line") check_type(index, int) check_is_non_negative(index) - if start_pt is not None: - check_type(start_pt, Vector) - if end_pt is not None: - check_type(end_pt, Vector) + check_optional_type(start_pt, Vector) + check_optional_type(end_pt, Vector) return self.plot.GetProbePlotProbeLine( index, coerce_optional_dispatch(start_pt, "vector"), @@ -1406,10 +1401,8 @@ def add_probe_plot_probe_line(self, start_pt: Vector | None, end_pt: Vector | No bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_probe_plot_probe_line") - if start_pt is not None: - check_type(start_pt, Vector) - if end_pt is not None: - check_type(end_pt, Vector) + check_optional_type(start_pt, Vector) + check_optional_type(end_pt, Vector) return self.plot.AddProbePlotProbeLine( coerce_optional_dispatch(start_pt, "vector"), coerce_optional_dispatch(end_pt, "vector") ) @@ -1431,10 +1424,8 @@ def set_probe_plot_probe_line( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_probe_plot_probe_line") check_type(index, int) check_is_non_negative(index) - if start_pt is not None: - check_type(start_pt, Vector) - if end_pt is not None: - check_type(end_pt, Vector) + check_optional_type(start_pt, Vector) + check_optional_type(end_pt, Vector) return self.plot.SetProbePlotProbeLine( index, coerce_optional_dispatch(start_pt, "vector"), @@ -1756,8 +1747,7 @@ def single_color(self, value: Vector | None) -> None: value (Vector): single color to set as RGB vector. """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="single_color", value=value) - if value is not None: - check_type(value, Vector) + check_optional_type(value, Vector) self.plot.SetSingleColor(coerce_optional_dispatch(value, "vector")) def set_plot_nodes_from_string(self, nodes: str) -> None: @@ -1781,8 +1771,7 @@ def set_plot_nodes_from_ent_list(self, ent_list: EntList | None) -> None: process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="set_plot_nodes_from_ent_list" ) - if ent_list is not None: - check_type(ent_list, EntList) + check_optional_type(ent_list, EntList) self.plot.SetPlotNodesFromEntList(coerce_optional_dispatch(ent_list, "ent_list")) def add_probe_plane(self, normal: str, point: str) -> bool: @@ -2488,8 +2477,7 @@ def shrinkage_compensation_estimated_shrinkage(self, value: Vector | None) -> No name="shrinkage_compensation_estimated_shrinkage", value=value, ) - if value is not None: - check_type(value, Vector) + check_optional_type(value, Vector) self.plot.SetShrinkageCompensationEstimatedShrinkage( coerce_optional_dispatch(value, "vector") ) diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index 69e8c68..b1856e7 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -16,7 +16,7 @@ from .material_plot import MaterialPlot from .user_plot import UserPlot from .common import MaterialDatabase, MaterialIndex, PlotType, SystemUnits -from .helper import check_type, get_enum_value, check_file_extension, coerce_optional_dispatch +from .helper import check_type, check_optional_type, get_enum_value, check_file_extension, coerce_optional_dispatch from .com_proxy import safe_com from .errors import raise_save_error from .constants import XML_FILE_EXT, SDZ_FILE_EXT, FBX_FILE_EXT, ELE_FILE_EXT @@ -61,8 +61,7 @@ def get_next_plot(self, plot: Plot | None) -> Plot: Plot: The next plot. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_plot") - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) result = self.plot_manager.GetNextPlot(coerce_optional_dispatch(plot, "plot")) if result is None: return None @@ -156,8 +155,7 @@ def delete_plot(self, plot: Plot | None) -> None: plot (Plot): The plot to delete. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_plot") - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) self.plot_manager.DeletePlot(coerce_optional_dispatch(plot, "plot")) def data_has_xy_plot_by_ds_id(self, ds_id: int) -> bool: @@ -209,12 +207,9 @@ def get_scalar_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_scalar_data") check_type(ds_id, int) - if indp_values is not None: - check_type(indp_values, DoubleArray) - if ent_ids is not None: - check_type(ent_ids, IntegerArray) - if scalar_data is not None: - check_type(scalar_data, DoubleArray) + check_optional_type(indp_values, DoubleArray) + check_optional_type(ent_ids, IntegerArray) + check_optional_type(scalar_data, DoubleArray) return self.plot_manager.GetScalarData( ds_id, coerce_optional_dispatch(indp_values, "double_array"), @@ -248,16 +243,11 @@ def get_vector_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_vector_data") check_type(ds_id, int) - if indp_values is not None: - check_type(indp_values, DoubleArray) - if ent_ids is not None: - check_type(ent_ids, IntegerArray) - if va is not None: - check_type(va, DoubleArray) - if vb is not None: - check_type(vb, DoubleArray) - if vc is not None: - check_type(vc, DoubleArray) + check_optional_type(indp_values, DoubleArray) + check_optional_type(ent_ids, IntegerArray) + check_optional_type(va, DoubleArray) + check_optional_type(vb, DoubleArray) + check_optional_type(vc, DoubleArray) return self.plot_manager.GetVectorData( ds_id, coerce_optional_dispatch(indp_values, "double_array"), @@ -299,22 +289,14 @@ def get_tensor_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_tensor_data") check_type(ds_id, int) - if indp_values is not None: - check_type(indp_values, DoubleArray) - if ent_ids is not None: - check_type(ent_ids, IntegerArray) - if t11 is not None: - check_type(t11, DoubleArray) - if t22 is not None: - check_type(t22, DoubleArray) - if t33 is not None: - check_type(t33, DoubleArray) - if t12 is not None: - check_type(t12, DoubleArray) - if t13 is not None: - check_type(t13, DoubleArray) - if t23 is not None: - check_type(t23, DoubleArray) + check_optional_type(indp_values, DoubleArray) + check_optional_type(ent_ids, IntegerArray) + check_optional_type(t11, DoubleArray) + check_optional_type(t22, DoubleArray) + check_optional_type(t33, DoubleArray) + check_optional_type(t12, DoubleArray) + check_optional_type(t13, DoubleArray) + check_optional_type(t23, DoubleArray) return self.plot_manager.GetTensorData( ds_id, coerce_optional_dispatch(indp_values, "double_array"), @@ -343,10 +325,8 @@ def get_non_mesh_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_non_mesh_data") check_type(ds_id, int) - if indp_values is not None: - check_type(indp_values, DoubleArray) - if non_mesh_data is not None: - check_type(non_mesh_data, DoubleArray) + check_optional_type(indp_values, DoubleArray) + check_optional_type(non_mesh_data, DoubleArray) return self.plot_manager.GetNonmeshData( ds_id, coerce_optional_dispatch(indp_values, "double_array"), @@ -369,10 +349,8 @@ def get_highlight_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_highlight_data") check_type(ds_id, int) - if indp_values is not None: - check_type(indp_values, DoubleArray) - if highlight_data is not None: - check_type(highlight_data, DoubleArray) + check_optional_type(indp_values, DoubleArray) + check_optional_type(highlight_data, DoubleArray) return self.plot_manager.GetHighlightData( ds_id, coerce_optional_dispatch(indp_values, "double_array"), @@ -456,8 +434,7 @@ def get_indp_values(self, ds_id: int, values: DoubleArray | None) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_indp_values") check_type(ds_id, int) - if values is not None: - check_type(values, DoubleArray) + check_optional_type(values, DoubleArray) return self.plot_manager.GetIndpValues( ds_id, coerce_optional_dispatch(values, "double_array") ) @@ -511,8 +488,7 @@ def find_dataset_ids_by_name(self, name: str, ds_ids: IntegerArray | None) -> in """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="find_dataset_ids_by_name") check_type(name, str) - if ds_ids is not None: - check_type(ds_ids, IntegerArray) + check_optional_type(ds_ids, IntegerArray) return self.plot_manager.FindDatasetIdsByName( name, coerce_optional_dispatch(ds_ids, "integer_array") ) @@ -552,8 +528,7 @@ def apply_anchor_plane(self, anchor_index: int, plot: Plot | None) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="apply_anchor_plane") check_type(anchor_index, int) - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) return self.plot_manager.ApplyAnchorPlane( anchor_index, coerce_optional_dispatch(plot, "plot") ) @@ -748,8 +723,7 @@ def warp_query_node( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="warp_query_node") check_type(node_id, int) check_type(anchor_index, int) - if ret_values is not None: - check_type(ret_values, DoubleArray) + check_optional_type(ret_values, DoubleArray) return self.plot_manager.WarpQueryNode( node_id, anchor_index, coerce_optional_dispatch(ret_values, "double_array") ) @@ -767,8 +741,7 @@ def warp_query_begin(self, ds_id: int, indp_values: DoubleArray | None) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="warp_query_begin") check_type(ds_id, int) - if indp_values is not None: - check_type(indp_values, DoubleArray) + check_optional_type(indp_values, DoubleArray) return self.plot_manager.WarpQueryBegin( ds_id, coerce_optional_dispatch(indp_values, "double_array") ) @@ -962,10 +935,8 @@ def fbx_export( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="fbx_export") check_type(file_name, str) file_name = check_file_extension(file_name, FBX_FILE_EXT) - if geo_list is not None: - check_type(geo_list, EntList) - if mesh_list is not None: - check_type(mesh_list, EntList) + check_optional_type(geo_list, EntList) + check_optional_type(mesh_list, EntList) check_type(export_type, int) check_type(wp_scale_factor, (float, int)) check_type(sm_scale_factor, (float, int)) diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index 115dfef..12a48d9 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -9,7 +9,7 @@ from .predicate import Predicate from .double_array import DoubleArray from .common import CrossSectionType, LogMessage -from .helper import check_type, get_enum_value, check_range, coerce_optional_dispatch +from .helper import check_type, check_optional_type, get_enum_value, check_range, coerce_optional_dispatch from .com_proxy import safe_com from .logger import process_log @@ -117,10 +117,8 @@ def create_bool_and_predicate( Predicate: The created AND predicate. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_and_predicate") - if predicate1 is not None: - check_type(predicate1, Predicate) - if predicate2 is not None: - check_type(predicate2, Predicate) + check_optional_type(predicate1, Predicate) + check_optional_type(predicate2, Predicate) result = self.predicate_manager.CreateBoolAndPredicate( coerce_optional_dispatch(predicate1, "predicate"), coerce_optional_dispatch(predicate2, "predicate"), @@ -145,10 +143,8 @@ def create_bool_or_predicate( Predicate: The created OR predicate """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_or_predicate") - if predicate1 is not None: - check_type(predicate1, Predicate) - if predicate2 is not None: - check_type(predicate2, Predicate) + check_optional_type(predicate1, Predicate) + check_optional_type(predicate2, Predicate) result = self.predicate_manager.CreateBoolOrPredicate( coerce_optional_dispatch(predicate1, "predicate"), coerce_optional_dispatch(predicate2, "predicate"), @@ -169,8 +165,7 @@ def create_bool_not_predicate(self, predicate: Predicate | None) -> Predicate: Predicate: The created NOT predicate. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_not_predicate") - if predicate is not None: - check_type(predicate, Predicate) + check_optional_type(predicate, Predicate) result = self.predicate_manager.CreateBoolNotPredicate( coerce_optional_dispatch(predicate, "predicate") ) @@ -193,10 +188,8 @@ def create_bool_xor_predicate( Predicate: The created XOR predicate. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_xor_predicate") - if predicate1 is not None: - check_type(predicate1, Predicate) - if predicate2 is not None: - check_type(predicate2, Predicate) + check_optional_type(predicate1, Predicate) + check_optional_type(predicate2, Predicate) result = self.predicate_manager.CreateBoolXorPredicate( coerce_optional_dispatch(predicate1, "predicate"), coerce_optional_dispatch(predicate2, "predicate"), @@ -241,10 +234,8 @@ def create_x_section_predicate( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_x_section_predicate") cross_section = get_enum_value(cross_section, CrossSectionType) - if min_value is not None: - check_type(min_value, DoubleArray) - if max_value is not None: - check_type(max_value, DoubleArray) + check_optional_type(min_value, DoubleArray) + check_optional_type(max_value, DoubleArray) result = self.predicate_manager.CreateXSectionPredicate( cross_section, coerce_optional_dispatch(min_value, "double_array"), diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index c4723f3..aa5381e 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -9,7 +9,7 @@ from .double_array import DoubleArray from .string_array import StringArray from .logger import process_log -from .helper import check_type, check_is_non_negative, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com from .common import LogMessage @@ -209,8 +209,7 @@ def set_field_values(self, field_id: int, values: DoubleArray | None) -> None: process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_field_values") check_type(field_id, int) check_is_non_negative(field_id) - if values is not None: - check_type(values, DoubleArray) + check_optional_type(values, DoubleArray) self.prop.SetFieldValues(field_id, coerce_optional_dispatch(values, "double_array")) def field_units(self, field_id: int) -> StringArray: diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index 978e537..04245bb 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -9,7 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .prop import Property -from .helper import get_enum_value, check_type, coerce_optional_dispatch +from .helper import get_enum_value, check_type, check_optional_type, coerce_optional_dispatch from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType @@ -116,10 +116,8 @@ def set_property(self, entities: EntList | None, prop: Property | None) -> bool: bool: True if the property was assigned successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_property") - if entities is not None: - check_type(entities, EntList) - if prop is not None: - check_type(prop, Property) + check_optional_type(entities, EntList) + check_optional_type(prop, Property) return self.property_editor.SetProperty( coerce_optional_dispatch(entities, "ent_list"), coerce_optional_dispatch(prop, "prop") ) @@ -212,8 +210,7 @@ def get_next_property(self, prop: Property | None) -> Property: Property: The next property in the list. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_property") - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) result = self.property_editor.GetNextProperty(coerce_optional_dispatch(prop, "prop")) if result is None: return None @@ -230,8 +227,7 @@ def get_next_property_of_type(self, prop: Property | None) -> Property: Property: The next property of the same type. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_property_of_type") - if prop is not None: - check_type(prop, Property) + check_optional_type(prop, Property) result = self.property_editor.GetNextPropertyOfType(coerce_optional_dispatch(prop, "prop")) if result is None: return None @@ -248,8 +244,7 @@ def get_entity_property(self, entities: EntList | None) -> Property: Property: The property of the entities. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_property") - if entities is not None: - check_type(entities, EntList) + check_optional_type(entities, EntList) prop = self.property_editor.GetEntityProperty( coerce_optional_dispatch(entities, "ent_list") ) diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index 78295dd..711bdb2 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -11,6 +11,7 @@ from .logger import process_log from .helper import ( check_type, + check_optional_type, check_file_extension, check_range, get_enum_value, @@ -154,8 +155,7 @@ def selection(self, value: EntList | None) -> None: Set selection """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="selection", value=value) - if value is not None: - check_type(value, EntList) + check_optional_type(value, EntList) self.study_doc.Selection = coerce_optional_dispatch(value, "ent_list") @property @@ -264,8 +264,7 @@ def add_file(self, name: str, opts: ImportOptions | None, show_logs: bool) -> bo """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_file") check_type(name, str) - if opts is not None: - check_type(opts, ImportOptions) + check_optional_type(opts, ImportOptions) check_type(show_logs, bool) return self.study_doc.AddFile( name, coerce_optional_dispatch(opts, "import_options"), show_logs @@ -313,8 +312,7 @@ def get_next_node(self, node: EntList | None) -> EntList: EntList: The next node in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_node") - if node is not None: - check_type(node, EntList) + check_optional_type(node, EntList) result = self.study_doc.GetNextNode(coerce_optional_dispatch(node, "ent_list")) if result is None: return None @@ -331,8 +329,7 @@ def get_node_coord(self, node: EntList | None) -> Vector: Vector: The coordinates of the node """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_node_coord") - if node is not None: - check_type(node, EntList) + check_optional_type(node, EntList) result = self.study_doc.GetNodeCoord(coerce_optional_dispatch(node, "ent_list")) if result is None: return None @@ -362,8 +359,7 @@ def get_next_tri(self, tri: EntList | None) -> EntList: EntList: The next triangle in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_tri") - if tri is not None: - check_type(tri, EntList) + check_optional_type(tri, EntList) result = self.study_doc.GetNextTri(coerce_optional_dispatch(tri, "ent_list")) if result is None: return None @@ -393,8 +389,7 @@ def get_next_beam(self, beam: EntList | None) -> EntList: EntList: The next beam in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_beam") - if beam is not None: - check_type(beam, EntList) + check_optional_type(beam, EntList) result = self.study_doc.GetNextBeam(coerce_optional_dispatch(beam, "ent_list")) if result is None: return None @@ -424,8 +419,7 @@ def get_next_tet(self, tet: EntList | None) -> EntList: EntList: The next tetrahedral element in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_tet") - if tet is not None: - check_type(tet, EntList) + check_optional_type(tet, EntList) result = self.study_doc.GetNextTet(coerce_optional_dispatch(tet, "ent_list")) if result is None: return None @@ -442,8 +436,7 @@ def get_elem_nodes(self, elem: EntList | None) -> EntList: EntList: The nodes of the element """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_elem_nodes") - if elem is not None: - check_type(elem, EntList) + check_optional_type(elem, EntList) result = self.study_doc.GetElemNodes(coerce_optional_dispatch(elem, "ent_list")) if result is None: return None @@ -460,8 +453,7 @@ def get_entity_layer(self, ent: EntList | None) -> EntList: EntList: The layer of the entity """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_layer") - if ent is not None: - check_type(ent, EntList) + check_optional_type(ent, EntList) result = self.study_doc.GetEntityLayer(coerce_optional_dispatch(ent, "ent_list")) if result is None: return None @@ -478,8 +470,7 @@ def get_entity_id(self, ent: EntList | None) -> int: int: The ID of the entity """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_id") - if ent is not None: - check_type(ent, EntList) + check_optional_type(ent, EntList) return self.study_doc.GetEntityID(coerce_optional_dispatch(ent, "ent_list")) def get_first_curve(self) -> EntList: @@ -506,8 +497,7 @@ def get_next_curve(self, curve: EntList | None) -> EntList: EntList: The next curve in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_curve") - if curve is not None: - check_type(curve, EntList) + check_optional_type(curve, EntList) result = self.study_doc.GetNextCurve(coerce_optional_dispatch(curve, "ent_list")) if result is None: return None @@ -525,8 +515,7 @@ def get_curve_point(self, curve: EntList | None, pos_curve: float) -> Vector: Vector: The point on the curve """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_curve_point") - if curve is not None: - check_type(curve, EntList) + check_optional_type(curve, EntList) check_type(pos_curve, (int, float)) check_range(pos_curve, 0, 1, True, True) result = self.study_doc.GetCurvePoint( diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index 96f32d2..be1079d 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -10,7 +10,7 @@ from .double_array import DoubleArray from .common import SystemUnits from .logger import process_log, LogMessage -from .helper import check_type, get_enum_value, check_is_non_negative, coerce_optional_dispatch +from .helper import check_type, check_optional_type, get_enum_value, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com @@ -50,10 +50,8 @@ def get_data_message( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_data_message") check_type(msgid, int) - if preset_text is not None: - check_type(preset_text, StringArray) - if preset_vals is not None: - check_type(preset_vals, DoubleArray) + check_optional_type(preset_text, StringArray) + check_optional_type(preset_vals, DoubleArray) check_is_non_negative(msgid) unit_sys = get_enum_value(unit_sys, SystemUnits) return self.system_message.GetDataMessage( diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index 15ccb3d..957220b 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -6,7 +6,7 @@ UserPlot Class API Wrapper """ -from .helper import check_type, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com from .logger import process_log from .common import ( @@ -123,10 +123,8 @@ def add_scalar_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_scalar_data") check_type(indp_val, (int, float)) - if element_id is not None: - check_type(element_id, IntegerArray) - if data is not None: - check_type(data, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(data, DoubleArray) return self.user_plot.AddScalarData( indp_val, coerce_optional_dispatch(element_id, "integer_array"), @@ -157,14 +155,10 @@ def add_vector_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_vector_data") check_type(indp_val, (int, float)) - if element_id is not None: - check_type(element_id, IntegerArray) - if vx is not None: - check_type(vx, DoubleArray) - if vy is not None: - check_type(vy, DoubleArray) - if vz is not None: - check_type(vz, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(vx, DoubleArray) + check_optional_type(vy, DoubleArray) + check_optional_type(vz, DoubleArray) return self.user_plot.AddVectorData( indp_val, coerce_optional_dispatch(element_id, "integer_array"), @@ -203,20 +197,13 @@ def add_tensor_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_tensor_data") check_type(indp_val, (int, float)) - if element_id is not None: - check_type(element_id, IntegerArray) - if t_11 is not None: - check_type(t_11, DoubleArray) - if t_22 is not None: - check_type(t_22, DoubleArray) - if t_33 is not None: - check_type(t_33, DoubleArray) - if t_12 is not None: - check_type(t_12, DoubleArray) - if t_13 is not None: - check_type(t_13, DoubleArray) - if t_23 is not None: - check_type(t_23, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(t_11, DoubleArray) + check_optional_type(t_22, DoubleArray) + check_optional_type(t_33, DoubleArray) + check_optional_type(t_12, DoubleArray) + check_optional_type(t_13, DoubleArray) + check_optional_type(t_23, DoubleArray) return self.user_plot.AddTensorData( indp_val, coerce_optional_dispatch(element_id, "integer_array"), @@ -278,10 +265,8 @@ def set_scalar_data(self, element_id: IntegerArray | None, data: DoubleArray | N bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_scalar_data") - if element_id is not None: - check_type(element_id, IntegerArray) - if data is not None: - check_type(data, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(data, DoubleArray) return self.user_plot.SetScalarData( coerce_optional_dispatch(element_id, "integer_array"), coerce_optional_dispatch(data, "double_array"), @@ -307,14 +292,10 @@ def set_vector_data( bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_vector_data") - if element_id is not None: - check_type(element_id, IntegerArray) - if vx is not None: - check_type(vx, DoubleArray) - if vy is not None: - check_type(vy, DoubleArray) - if vz is not None: - check_type(vz, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(vx, DoubleArray) + check_optional_type(vy, DoubleArray) + check_optional_type(vz, DoubleArray) return self.user_plot.SetVectorData( coerce_optional_dispatch(element_id, "integer_array"), coerce_optional_dispatch(vx, "double_array"), @@ -349,20 +330,13 @@ def set_tensor_data( bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_tensor_data") - if element_id is not None: - check_type(element_id, IntegerArray) - if t_11 is not None: - check_type(t_11, DoubleArray) - if t_22 is not None: - check_type(t_22, DoubleArray) - if t_33 is not None: - check_type(t_33, DoubleArray) - if t_12 is not None: - check_type(t_12, DoubleArray) - if t_13 is not None: - check_type(t_13, DoubleArray) - if t_23 is not None: - check_type(t_23, DoubleArray) + check_optional_type(element_id, IntegerArray) + check_optional_type(t_11, DoubleArray) + check_optional_type(t_22, DoubleArray) + check_optional_type(t_33, DoubleArray) + check_optional_type(t_12, DoubleArray) + check_optional_type(t_13, DoubleArray) + check_optional_type(t_23, DoubleArray) return self.user_plot.SetTensorData( coerce_optional_dispatch(element_id, "integer_array"), coerce_optional_dispatch(t_11, "double_array"), @@ -389,10 +363,8 @@ def add_xy_plot_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_xy_plot_data") check_type(indp_val, (int, float)) - if x_value is not None: - check_type(x_value, DoubleArray) - if y_value is not None: - check_type(y_value, DoubleArray) + check_optional_type(x_value, DoubleArray) + check_optional_type(y_value, DoubleArray) return self.user_plot.AddXYPlotData( indp_val, coerce_optional_dispatch(x_value, "double_array"), @@ -411,10 +383,8 @@ def set_xy_plot_data(self, x_value: DoubleArray | None, y_value: DoubleArray | N bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_xy_plot_data") - if x_value is not None: - check_type(x_value, DoubleArray) - if y_value is not None: - check_type(y_value, DoubleArray) + check_optional_type(x_value, DoubleArray) + check_optional_type(y_value, DoubleArray) return self.user_plot.SetXYPlotData( coerce_optional_dispatch(x_value, "double_array"), coerce_optional_dispatch(y_value, "double_array"), @@ -473,8 +443,7 @@ def set_highlight_data(self, values: DoubleArray | None) -> bool: bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_highlight_data") - if values is not None: - check_type(values, DoubleArray) + check_optional_type(values, DoubleArray) return self.user_plot.SetHighlightData(coerce_optional_dispatch(values, "double_array")) def build_weldline_plot(self, plot_name: str, max_angle: float, for_overmolding: bool) -> Plot: diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index 52d974a..5c7010c 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -26,6 +26,7 @@ check_min_max, check_range, check_type, + check_optional_type, get_enum_value, check_is_positive, check_is_non_negative, @@ -76,10 +77,8 @@ def reset_view(self, normal_view: Vector | None, up_view: Vector | None) -> None up_view (Vector | None): The up view vector. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="reset_view") - if normal_view is not None: - check_type(normal_view, Vector) - if up_view is not None: - check_type(up_view, Vector) + check_optional_type(normal_view, Vector) + check_optional_type(up_view, Vector) self.viewer.ResetView( coerce_optional_dispatch(normal_view, "vector"), coerce_optional_dispatch(up_view, "vector"), @@ -404,10 +403,8 @@ def save_image_legacy(self, filename: str, x: int | None = None, y: int | None = filename = check_file_extension( filename, (PNG_FILE_EXT, JPG_FILE_EXT, JPEG_FILE_EXT, BMP_FILE_EXT, TIF_FILE_EXT) ) - if x is not None: - check_type(x, int) - if y is not None: - check_type(y, int) + check_optional_type(x, int) + check_optional_type(y, int) # Route strictly to legacy COM methods if x is None and y is None: @@ -480,14 +477,10 @@ def add_bookmark( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_bookmark") check_type(name, str) - if normal_view is not None: - check_type(normal_view, Vector) - if up_view is not None: - check_type(up_view, Vector) - if focal_point is not None: - check_type(focal_point, Vector) - if eye_position is not None: - check_type(eye_position, Vector) + check_optional_type(normal_view, Vector) + check_optional_type(up_view, Vector) + check_optional_type(focal_point, Vector) + check_optional_type(eye_position, Vector) check_type(clipping_range_min, (int, float)) check_is_non_negative(clipping_range_min) check_type(clipping_range_max, (int, float)) @@ -514,8 +507,7 @@ def show_plot(self, plot: Plot | None) -> None: plot (Plot | None): The plot to show. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_plot") - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) self.viewer.ShowPlot(coerce_optional_dispatch(plot, "plot")) def hide_plot(self, plot: Plot | None) -> None: @@ -526,8 +518,7 @@ def hide_plot(self, plot: Plot | None) -> None: plot (Plot | None): The plot to hide. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="hide_plot") - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) self.viewer.HidePlot(coerce_optional_dispatch(plot, "plot")) def overlay_plot(self, plot: Plot | None) -> None: @@ -538,8 +529,7 @@ def overlay_plot(self, plot: Plot | None) -> None: plot (Plot | None): The plot to overlay. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="overlay_plot") - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) self.viewer.OverlayPlot(coerce_optional_dispatch(plot, "plot")) def get_plot(self, plot_id: int) -> Plot: @@ -585,8 +575,7 @@ def world_to_display(self, world_coord: Vector | None) -> Vector: Vector: The converted display coordinates. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="world_to_display") - if world_coord is not None: - check_type(world_coord, Vector) + check_optional_type(world_coord, Vector) result = self.viewer.WorldToDisplay(coerce_optional_dispatch(world_coord, "vector")) if result is None: return None @@ -604,8 +593,7 @@ def create_clipping_plane(self, normal: Vector | None, distance: float) -> EntLi EntList: Object containing created clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_clipping_plane") - if normal is not None: - check_type(normal, Vector) + check_optional_type(normal, Vector) check_type(distance, (int, float)) result = self.viewer.CreateClippingPlane( coerce_optional_dispatch(normal, "vector"), distance @@ -641,10 +629,8 @@ def modify_clipping_plane( distance (float): The new distance from the origin to the clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="modify_clipping_plane") - if plane is not None: - check_type(plane, EntList) - if normal is not None: - check_type(normal, Vector) + check_optional_type(plane, EntList) + check_optional_type(normal, Vector) check_type(distance, (int, float)) self.viewer.ModifyClippingPlane( coerce_optional_dispatch(plane, "ent_list"), @@ -667,8 +653,7 @@ def modify_clipping_plane_by_id( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_clipping_plane_by_id" ) check_type(plane_id, int) - if normal is not None: - check_type(normal, Vector) + check_optional_type(normal, Vector) check_type(distance, (int, float)) self.viewer.ModifyClippingPlaneByID( plane_id, coerce_optional_dispatch(normal, "vector"), distance @@ -682,8 +667,7 @@ def delete_clipping_plane(self, plane: EntList | None) -> None: plane (EntList | None): The clipping plane to delete. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_clipping_plane") - if plane is not None: - check_type(plane, EntList) + check_optional_type(plane, EntList) self.viewer.DeleteClippingPlane(coerce_optional_dispatch(plane, "ent_list")) def get_first_clipping_plane(self) -> EntList: @@ -710,8 +694,7 @@ def get_next_clipping_plane(self, plane: EntList | None) -> EntList: EntList: The next clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_clipping_plane") - if plane is not None: - check_type(plane, EntList) + check_optional_type(plane, EntList) result = self.viewer.GetNextClippingPlane(coerce_optional_dispatch(plane, "ent_list")) if result is None: return None @@ -726,8 +709,7 @@ def enable_clipping_plane(self, plane: EntList | None, enable: bool) -> None: enable (bool): Whether to enable or disable the clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="enable_clipping_plane") - if plane is not None: - check_type(plane, EntList) + check_optional_type(plane, EntList) check_type(enable, bool) self.viewer.EnableClippingPlane(coerce_optional_dispatch(plane, "ent_list"), enable) @@ -754,8 +736,7 @@ def active_clipping_plane(self, plane: EntList | None) -> None: plane: The clipping plane to set as active. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_active_clipping_plane") - if plane is not None: - check_type(plane, EntList) + check_optional_type(plane, EntList) self.viewer.SetActiveClippingPlane(coerce_optional_dispatch(plane, "ent_list")) def show_plot_frame(self, plot: Plot | None, frame: int) -> None: @@ -767,8 +748,7 @@ def show_plot_frame(self, plot: Plot | None, frame: int) -> None: frame (int): The frame number to show. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_plot_frame") - if plot is not None: - check_type(plot, Plot) + check_optional_type(plot, Plot) check_type(frame, int) check_is_non_negative(frame) self.viewer.ShowPlotFrame(coerce_optional_dispatch(plot, "plot"), frame) diff --git a/tests/core/test_helper.py b/tests/core/test_helper.py index a1719fa..1d3c1ea 100644 --- a/tests/core/test_helper.py +++ b/tests/core/test_helper.py @@ -18,6 +18,7 @@ check_is_negative, check_min_max, check_type, + check_optional_type, check_range, check_expected_values, get_enum_value, @@ -339,3 +340,32 @@ def test_mf_array_to_list_empty(self): assert result == [] mock_array.val.assert_not_called() + + @pytest.mark.parametrize( + "value, types", + [(None, (int, float))] + + [(None, str)] + + [(None, bool)] + + [(x, (int, float)) for x in VALID_INT + VALID_FLOAT] + + [(x, str) for x in VALID_STR] + + [(x, bool) for x in VALID_BOOL], + ) + def test_check_optional_type(self, value, types, _, caplog): + """ + Test check_optional_type function with valid values including None. + """ + check_optional_type(value, types) + assert _("Valid") in caplog.text + + @pytest.mark.parametrize( + "value, types", + [(x, (int, float)) for x in list_intersection(INVALID_FLOAT, INVALID_INT)] + + [(x, int) for x in INVALID_INT], + ) + def test_check_optional_type_invalid(self, value, types, _): + """ + Test check_optional_type function with invalid type (but not None). + """ + with pytest.raises(TypeError) as e: + check_optional_type(value, types) + assert _("Invalid") in str(e.value) From d1c9d34bbaf993231948a24998d9b0fa1692e8af Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Dec 2025 06:03:58 +0000 Subject: [PATCH 03/14] Fix type hints and docstrings for check_type and check_optional_type Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/helper.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/moldflow/helper.py b/src/moldflow/helper.py index b77adc2..1c197ee 100644 --- a/src/moldflow/helper.py +++ b/src/moldflow/helper.py @@ -45,13 +45,13 @@ def get_enum_value(value, enum: Enum): return value -def check_type(value, types: tuple): +def check_type(value, types: tuple | type): """ Check if the value is of the specified type(s). Args: value: The value to check. - types (tuple): A tuple of types to check against. + types (tuple | type): A tuple of types to check against, or a single type. Returns: bool: True if the value is of the specified type(s), otherwise raises a TypeError. @@ -76,7 +76,7 @@ def check_type(value, types: tuple): process_log(__name__, LogMessage.VALID_INPUT) -def check_optional_type(value, types: tuple): +def check_optional_type(value, types: tuple | type): """ Check if the value is of the specified type(s) or None. @@ -85,7 +85,7 @@ def check_optional_type(value, types: tuple): Args: value: The value to check. Can be None or of the specified type(s). - types (tuple): A tuple of types to check against (excluding None). + types (tuple | type): A tuple of types to check against, or a single type (excluding None). Returns: bool: True if the value is None or of the specified type(s), otherwise raises a TypeError. From fe6565e0ef884fa53a874aae667da76b47fb6a84 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Dec 2025 07:44:54 +0000 Subject: [PATCH 04/14] Fix indentation issue in mesh_editor.py that caused localization check to fail Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/mesh_editor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index b30823d..84f56d6 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -742,6 +742,7 @@ def make_region( check_type(is_angular, bool) check_type(mesh, bool) check_optional_type(prop, Property) + if prop is not None: return self.mesh_editor.MakeRegion2( tol, is_angular, mesh, coerce_optional_dispatch(prop, "prop") ) From 7d1084e67fad7446a63dcc743a0102a389e897b8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:39:01 +0000 Subject: [PATCH 05/14] Combine type checking and coercion into check_and_coerce_optional function Co-authored-by: sankalps0549 <230025240+sankalps0549@users.noreply.github.com> --- src/moldflow/boundary_conditions.py | 206 +++++++++--------- src/moldflow/cad_manager.py | 20 +- src/moldflow/data_transform.py | 49 ++--- src/moldflow/diagnosis_manager.py | 134 ++++++------ src/moldflow/ent_list.py | 6 +- src/moldflow/folder_manager.py | 86 ++++---- src/moldflow/helper.py | 67 ++++++ src/moldflow/layer_manager.py | 88 ++++---- src/moldflow/material_finder.py | 6 +- src/moldflow/mesh_editor.py | 275 ++++++++++++------------- src/moldflow/modeler.py | 263 +++++++++++------------ src/moldflow/mold_surface_generator.py | 10 +- src/moldflow/plot.py | 50 ++--- src/moldflow/plot_manager.py | 100 +++++---- src/moldflow/predicate_manager.py | 38 ++-- src/moldflow/prop.py | 6 +- src/moldflow/property_editor.py | 19 +- src/moldflow/study_doc.py | 44 ++-- src/moldflow/system_message.py | 9 +- src/moldflow/user_plot.py | 120 +++++------ src/moldflow/viewer.py | 59 +++--- tests/core/test_helper.py | 57 +++++ 22 files changed, 872 insertions(+), 840 deletions(-) diff --git a/src/moldflow/boundary_conditions.py b/src/moldflow/boundary_conditions.py index 633ed5d..2b30c67 100644 --- a/src/moldflow/boundary_conditions.py +++ b/src/moldflow/boundary_conditions.py @@ -8,7 +8,7 @@ from .helper import coerce_optional_dispatch from .common import LogMessage, AnalysisType, ConstraintType -from .helper import check_type, check_optional_type, get_enum_value +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .logger import process_log from .ent_list import EntList @@ -76,10 +76,10 @@ def create_fixed_constraints(self, nodes: EntList | None, analysis: AnalysisType int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_fixed_constraints") - check_optional_type(nodes, EntList) + analysis = get_enum_value(analysis, AnalysisType) return self.boundary_conditions.CreateFixedConstraints( - coerce_optional_dispatch(nodes, "ent_list"), analysis + check_and_coerce_optional(nodes, EntList), analysis ) def create_core_shift_fixed_constraints( @@ -96,10 +96,10 @@ def create_core_shift_fixed_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_fixed_constraints") - check_optional_type(nodes, EntList) + check_type(retract_time, (float, int)) return self.boundary_conditions.CreateFixedConstraints2( - coerce_optional_dispatch(nodes, "ent_list"), retract_time + check_and_coerce_optional(nodes, EntList), retract_time ) def create_pin_constraints(self, nodes: EntList | None, analysis: AnalysisType | int) -> int: @@ -114,10 +114,10 @@ def create_pin_constraints(self, nodes: EntList | None, analysis: AnalysisType | int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_pin_constraints") - check_optional_type(nodes, EntList) + analysis = get_enum_value(analysis, AnalysisType) return self.boundary_conditions.CreatePinConstraints( - coerce_optional_dispatch(nodes, "ent_list"), analysis + check_and_coerce_optional(nodes, EntList), analysis ) def create_core_shift_pin_constraints( @@ -134,10 +134,10 @@ def create_core_shift_pin_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_pin_constraints") - check_optional_type(nodes, EntList) + check_type(retract_time, (float, int)) return self.boundary_conditions.CreatePinConstraints2( - coerce_optional_dispatch(nodes, "ent_list"), retract_time + check_and_coerce_optional(nodes, EntList), retract_time ) # pylint: disable-next=R0913,R0917 @@ -161,15 +161,15 @@ def create_spring_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spring_constraints") - check_optional_type(nodes, EntList) + analysis = get_enum_value(analysis, AnalysisType) - check_optional_type(trans, Vector) - check_optional_type(rotation, Vector) + + return self.boundary_conditions.CreateSpringConstraints( - coerce_optional_dispatch(nodes, "ent_list"), + check_and_coerce_optional(nodes, EntList), analysis, - coerce_optional_dispatch(trans, "vector"), - coerce_optional_dispatch(rotation, "vector"), + check_and_coerce_optional(trans, Vector), + check_and_coerce_optional(rotation, Vector), ) # pylint: disable-next=R0913,R0917 @@ -193,14 +193,13 @@ def create_core_shift_spring_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spring_constraints") - check_optional_type(nodes, EntList) - check_optional_type(trans, Vector) - check_optional_type(rotation, Vector) + + check_type(retract_time, (float, int)) return self.boundary_conditions.CreateSpringConstraints2( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(trans, "vector"), - coerce_optional_dispatch(rotation, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(trans, Vector), + check_and_coerce_optional(rotation, Vector), retract_time, ) @@ -229,22 +228,21 @@ def create_general_constraints( int: Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_general_constraints") - check_optional_type(nodes, EntList) - check_optional_type(trans, Vector) - check_optional_type(rotation, Vector) - check_optional_type(trans_types, Vector) - check_optional_type(rotation_types, Vector) + + + + analysis = get_enum_value(analysis, AnalysisType) trans_types = self._check_vector(trans_types) rotation_types = self._check_vector(rotation_types) return self.boundary_conditions.CreateGeneralConstraints2( - coerce_optional_dispatch(nodes, "ent_list"), + check_and_coerce_optional(nodes, EntList), analysis, - coerce_optional_dispatch(trans, "vector"), - coerce_optional_dispatch(rotation, "vector"), - coerce_optional_dispatch(trans_types, "vector"), - coerce_optional_dispatch(rotation_types, "vector"), + check_and_coerce_optional(trans, Vector), + check_and_coerce_optional(rotation, Vector), + check_and_coerce_optional(trans_types, Vector), + check_and_coerce_optional(rotation_types, Vector), ) # pylint: disable-next=R0913,R0917 @@ -277,20 +275,19 @@ def create_core_shift_general_constraints( locals(), name="create_core_shift_general_constraints", ) - check_optional_type(nodes, EntList) - check_optional_type(trans, Vector) - check_optional_type(rotation, Vector) - check_optional_type(trans_types, Vector) - check_optional_type(rotation_types, Vector) + + + + check_type(retract_time, (int, float)) trans_types = self._check_vector(trans_types) rotation_types = self._check_vector(rotation_types) return self.boundary_conditions.CreateGeneralConstraints3( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(trans, "vector"), - coerce_optional_dispatch(rotation, "vector"), - coerce_optional_dispatch(trans_types, "vector"), - coerce_optional_dispatch(rotation_types, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(trans, Vector), + check_and_coerce_optional(rotation, Vector), + check_and_coerce_optional(trans_types, Vector), + check_and_coerce_optional(rotation_types, Vector), retract_time, ) @@ -309,13 +306,12 @@ def create_nodal_loads( int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodal_loads") - check_optional_type(nodes, EntList) - check_optional_type(force, Vector) - check_optional_type(moment, Vector) + + return self.boundary_conditions.CreateNodalLoads( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(force, "vector"), - coerce_optional_dispatch(moment, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(force, Vector), + check_and_coerce_optional(moment, Vector), ) def create_edge_loads(self, nodes: EntList | None, force: Vector | None) -> int: @@ -330,10 +326,9 @@ def create_edge_loads(self, nodes: EntList | None, force: Vector | None) -> int: int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_edge_loads") - check_optional_type(nodes, EntList) - check_optional_type(force, Vector) + return self.boundary_conditions.CreateEdgeLoads( - coerce_optional_dispatch(nodes, "ent_list"), coerce_optional_dispatch(force, "vector") + check_and_coerce_optional(nodes, EntList), check_and_coerce_optional(force, Vector) ) def create_elemental_loads(self, tri: EntList | None, force: Vector | None) -> int: @@ -348,10 +343,9 @@ def create_elemental_loads(self, tri: EntList | None, force: Vector | None) -> i int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_elemental_loads") - check_optional_type(tri, EntList) - check_optional_type(force, Vector) + return self.boundary_conditions.CreateElementalLoads( - coerce_optional_dispatch(tri, "ent_list"), coerce_optional_dispatch(force, "vector") + check_and_coerce_optional(tri, EntList), check_and_coerce_optional(force, Vector) ) def create_pressure_loads(self, tri: EntList | None, pressure: float) -> int: @@ -366,10 +360,10 @@ def create_pressure_loads(self, tri: EntList | None, pressure: float) -> int: int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_pressure_loads") - check_optional_type(tri, EntList) + check_type(pressure, (float, int)) return self.boundary_conditions.CreatePressureLoads( - coerce_optional_dispatch(tri, "ent_list"), pressure + check_and_coerce_optional(tri, EntList), pressure ) def create_temperature_loads(self, tri: EntList | None, top: float, bottom: float) -> int: @@ -385,11 +379,11 @@ def create_temperature_loads(self, tri: EntList | None, top: float, bottom: floa int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_temperature_loads") - check_optional_type(tri, EntList) + check_type(top, (float, int)) check_type(bottom, (float, int)) return self.boundary_conditions.CreateTemperatureLoads( - coerce_optional_dispatch(tri, "ent_list"), top, bottom + check_and_coerce_optional(tri, EntList), top, bottom ) def create_volume_loads(self, tri: EntList | None, force: Vector | None) -> int: @@ -404,10 +398,9 @@ def create_volume_loads(self, tri: EntList | None, force: Vector | None) -> int: int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_volume_loads") - check_optional_type(tri, EntList) - check_optional_type(force, Vector) + return self.boundary_conditions.CreateVolumeLoads( - coerce_optional_dispatch(tri, "ent_list"), coerce_optional_dispatch(force, "vector") + check_and_coerce_optional(tri, EntList), check_and_coerce_optional(force, Vector) ) def create_critical_dimension( @@ -426,13 +419,13 @@ def create_critical_dimension( int: Number of loads created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_critical_dimension") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) + + check_type(upper, (float, int)) check_type(lower, (float, int)) return self.boundary_conditions.CreateCriticalDimension( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), upper, lower, ) @@ -454,12 +447,12 @@ def create_doe_critical_dimension( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="create_doe_critical_dimension" ) - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) + + check_type(name, str) return self.boundary_conditions.CreateDoeCriticalDimension( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), name, ) @@ -481,14 +474,13 @@ def create_ndbc( EntList: The list of NDBC that were created. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_ndbc") - check_optional_type(nodes, EntList) - check_optional_type(normal, Vector) + check_type(prop_type, int) - check_optional_type(prop, Property) - prop_disp = coerce_optional_dispatch(prop, "prop") + + prop_disp = check_and_coerce_optional(prop, Property) result = self.boundary_conditions.CreateNDBC( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(normal, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(normal, Vector), prop_type, prop_disp, ) @@ -514,14 +506,14 @@ def create_ndbc_at_xyz( EntList: The list of NDBC that were created. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_ndbc_at_xyz") - check_optional_type(coord, Vector) - check_optional_type(normal, Vector) + + check_type(prop_type, int) - check_optional_type(prop, Property) - prop_disp = coerce_optional_dispatch(prop, "prop") + + prop_disp = check_and_coerce_optional(prop, Property) result = self.boundary_conditions.CreateNDBCAtXYZ( - coerce_optional_dispatch(coord, "vector"), - coerce_optional_dispatch(normal, "vector"), + check_and_coerce_optional(coord, Vector), + check_and_coerce_optional(normal, Vector), prop_type, prop_disp, ) @@ -542,13 +534,11 @@ def move_ndbc(self, ndbc: EntList | None, nodes: EntList | None, normal: Vector bool: True if the NDBC was moved successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_ndbc") - check_optional_type(ndbc, EntList) - check_optional_type(nodes, EntList) - check_optional_type(normal, Vector) + return self.boundary_conditions.MoveNDBC( - coerce_optional_dispatch(ndbc, "ent_list"), - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(normal, "vector"), + check_and_coerce_optional(ndbc, EntList), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(normal, Vector), ) def move_ndbc_to_xyz( @@ -566,13 +556,12 @@ def move_ndbc_to_xyz( bool: True if successful; False if not """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_ndbc_to_xyz") - check_optional_type(ndbc, EntList) - check_optional_type(coord, Vector) - check_optional_type(normal, Vector) + + return self.boundary_conditions.MoveNDBCToXYZ( - coerce_optional_dispatch(ndbc, "ent_list"), - coerce_optional_dispatch(coord, "vector"), - coerce_optional_dispatch(normal, "vector"), + check_and_coerce_optional(ndbc, EntList), + check_and_coerce_optional(coord, Vector), + check_and_coerce_optional(normal, Vector), ) def find_property(self, prop_type: int, prop_id: int) -> Property: @@ -606,10 +595,10 @@ def set_prohibited_gate_nodes(self, nodes: EntList | None, analysis: AnalysisTyp int : Number of constraints created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_prohibited_gate_nodes") - check_optional_type(nodes, EntList) + analysis = get_enum_value(analysis, AnalysisType) return self.boundary_conditions.SetProhibitedGateNodes( - coerce_optional_dispatch(nodes, "ent_list"), analysis + check_and_coerce_optional(nodes, EntList), analysis ) # pylint: disable-next=R0913,R0917 @@ -638,29 +627,28 @@ def create_one_sided_constraints( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="create_one_sided_constraints" ) - check_optional_type(nodes, EntList) - check_optional_type(positive_trans, Vector) - check_optional_type(negative_trans, Vector) - check_optional_type(positive_trans_types, Vector) - check_optional_type(negative_trans_types, Vector) + + + + if retract_time != 0: check_type(retract_time, (float, int)) positive_trans_types = self._check_vector(positive_trans_types) negative_trans_types = self._check_vector(negative_trans_types) return self.boundary_conditions.CreateOneSidedConstraints2( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(positive_trans, "vector"), - coerce_optional_dispatch(negative_trans, "vector"), - coerce_optional_dispatch(positive_trans_types, "vector"), - coerce_optional_dispatch(negative_trans_types, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(positive_trans, Vector), + check_and_coerce_optional(negative_trans, Vector), + check_and_coerce_optional(positive_trans_types, Vector), + check_and_coerce_optional(negative_trans_types, Vector), retract_time, ) positive_trans_types = self._check_vector(positive_trans_types) negative_trans_types = self._check_vector(negative_trans_types) return self.boundary_conditions.CreateOneSidedConstraints( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(positive_trans, "vector"), - coerce_optional_dispatch(negative_trans, "vector"), - coerce_optional_dispatch(positive_trans_types, "vector"), - coerce_optional_dispatch(negative_trans_types, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(positive_trans, Vector), + check_and_coerce_optional(negative_trans, Vector), + check_and_coerce_optional(positive_trans_types, Vector), + check_and_coerce_optional(negative_trans_types, Vector), ) diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index 96e4b71..38ebaf0 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -9,7 +9,7 @@ from .ent_list import EntList from .vector import Vector from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch from .com_proxy import safe_com @@ -60,12 +60,12 @@ def modify_cad_surfaces_by_normal( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_cad_surfaces_by_normal" ) - check_optional_type(faces, EntList) - check_optional_type(transit_faces, EntList) + + check_type(distance, (float, int)) return self.cad_manager.ModifyCADSurfacesByNormal( - coerce_optional_dispatch(faces, "ent_list"), - coerce_optional_dispatch(transit_faces, "ent_list"), + check_and_coerce_optional(faces, EntList), + check_and_coerce_optional(transit_faces, EntList), distance, ) @@ -87,11 +87,9 @@ def modify_cad_surfaces_by_vector( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_cad_surfaces_by_vector" ) - check_optional_type(faces, EntList) - check_optional_type(transit_faces, EntList) - check_optional_type(vector, Vector) + return self.cad_manager.ModifyCADSurfacesByVector( - coerce_optional_dispatch(faces, "ent_list"), - coerce_optional_dispatch(transit_faces, "ent_list"), - coerce_optional_dispatch(vector, "vector"), + check_and_coerce_optional(faces, EntList), + check_and_coerce_optional(transit_faces, EntList), + check_and_coerce_optional(vector, Vector), ) diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index af02959..48b31d3 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -7,7 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com from .common import TransformFunctions, TransformOperations, TransformScalarOperations from .integer_array import IntegerArray @@ -53,16 +53,13 @@ def func( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="func") func_name = get_enum_value(func_name, TransformFunctions) - check_optional_type(label_in, IntegerArray) - check_optional_type(data_in, DoubleArray) - check_optional_type(label_out, IntegerArray) - check_optional_type(data_out, DoubleArray) + return self.data_transform.Func( func_name, - coerce_optional_dispatch(label_in, "integer_array"), - coerce_optional_dispatch(data_in, "double_array"), - coerce_optional_dispatch(label_out, "integer_array"), - coerce_optional_dispatch(data_out, "double_array"), + check_and_coerce_optional(label_in, IntegerArray), + check_and_coerce_optional(data_in, DoubleArray), + check_and_coerce_optional(label_out, IntegerArray), + check_and_coerce_optional(data_out, DoubleArray), ) # pylint: disable=R0913, R0917 @@ -92,21 +89,17 @@ def op( bool: True if the operation was applied successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="op") - check_optional_type(label_1, IntegerArray) - check_optional_type(data_1, DoubleArray) + op = get_enum_value(op, TransformOperations) - check_optional_type(label_2, IntegerArray) - check_optional_type(data_2, DoubleArray) - check_optional_type(label_out, IntegerArray) - check_optional_type(data_out, DoubleArray) + return self.data_transform.Op( - coerce_optional_dispatch(label_1, "integer_array"), - coerce_optional_dispatch(data_1, "double_array"), + check_and_coerce_optional(label_1, IntegerArray), + check_and_coerce_optional(data_1, DoubleArray), op, - coerce_optional_dispatch(label_2, "integer_array"), - coerce_optional_dispatch(data_2, "double_array"), - coerce_optional_dispatch(label_out, "integer_array"), - coerce_optional_dispatch(data_out, "double_array"), + check_and_coerce_optional(label_2, IntegerArray), + check_and_coerce_optional(data_2, DoubleArray), + check_and_coerce_optional(label_out, IntegerArray), + check_and_coerce_optional(data_out, DoubleArray), ) # pylint: disable=R0913, R0917 @@ -134,17 +127,15 @@ def scalar( bool: True if the scalar operation was applied successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scalar") - check_optional_type(label_in, IntegerArray) - check_optional_type(data_in, DoubleArray) + op = get_enum_value(op, TransformScalarOperations) check_type(scalar_value, (float, int)) - check_optional_type(label_out, IntegerArray) - check_optional_type(data_out, DoubleArray) + return self.data_transform.Scalar( - coerce_optional_dispatch(label_in, "integer_array"), - coerce_optional_dispatch(data_in, "double_array"), + check_and_coerce_optional(label_in, IntegerArray), + check_and_coerce_optional(data_in, DoubleArray), op, scalar_value, - coerce_optional_dispatch(label_out, "integer_array"), - coerce_optional_dispatch(data_out, "double_array"), + check_and_coerce_optional(label_out, IntegerArray), + check_and_coerce_optional(data_out, DoubleArray), ) diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index 4a08ab5..ce3b134 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -9,7 +9,7 @@ from .logger import process_log from .common import LogMessage -from .helper import check_type, check_optional_type, check_min_max, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, check_min_max, coerce_optional_dispatch from .com_proxy import safe_com from .ent_list import EntList from .mesh_summary import MeshSummary @@ -129,13 +129,13 @@ def show_connect( visible (bool): Show/hide the selected mesh diagnosis. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_connect") - check_optional_type(nodes, EntList) + check_type(ex_beam, bool) check_type(assign_layer, bool) check_type(show_txt, bool) check_type(visible, bool) self.diagnosis_manager.ShowConnect2( - coerce_optional_dispatch(nodes, "ent_list"), ex_beam, assign_layer, show_txt, visible + check_and_coerce_optional(nodes, EntList), ex_beam, assign_layer, show_txt, visible ) def show_edges( @@ -338,14 +338,13 @@ def get_thickness_diagnosis( check_type(max_value, (float, int)) check_min_max(min_value, max_value) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetThicknessDiagnosis2( min_value, max_value, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_aspect_ratio_diagnosis( @@ -377,15 +376,14 @@ def get_aspect_ratio_diagnosis( check_min_max(min_value, max_value) check_type(std_ar, bool) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetAspectRatioDiagnosis2( min_value, max_value, std_ar, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_connectivity_diagnosis( @@ -410,17 +408,16 @@ def get_connectivity_diagnosis( int: The number of connectivity diagnostics. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_connectivity_diagnosis") - check_optional_type(nodes, EntList) + check_type(ex_beam, bool) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetConnectivityDiagnosis2( - coerce_optional_dispatch(nodes, "ent_list"), + check_and_coerce_optional(nodes, EntList), ex_beam, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_edges_diagnosis( @@ -445,13 +442,12 @@ def get_edges_diagnosis( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_edges_diagnosis") check_type(non_manifold, bool) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetEdgesDiagnosis2( non_manifold, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_overlap_diagnosis( @@ -479,14 +475,13 @@ def get_overlap_diagnosis( check_type(overlap, bool) check_type(intersect, bool) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetOverlapDiagnosis2( overlap, intersect, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_occurrence_diagnosis( @@ -505,12 +500,11 @@ def get_occurrence_diagnosis( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_occurrence_diagnosis") check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetOccurrenceDiagnosis2( visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_match_info_diagnosis( @@ -527,11 +521,10 @@ def get_match_info_diagnosis( int: The number of mesh match diagnostics. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_match_info_diagnosis") - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetMatchInfoDiagnosis( - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_orientation_diagnosis( @@ -550,12 +543,11 @@ def get_orientation_diagnosis( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_orientation_diagnosis") check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetOrientationDiagnosis2( visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def show_zero_area_elements( @@ -601,13 +593,12 @@ def get_zero_area_elements_diagnosis( ) check_type(min_value, (float, int)) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetZeroAreaElementsDiagnosis2( min_value, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_mesh_summary( @@ -740,15 +731,14 @@ def get_surface_with_bad_trim_curve( check_type(inner_loop, bool) check_type(surf_def, bool) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetSurfWithBadTrimCurv( outer_loop, inner_loop, surf_def, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_surface_with_free_trim_curve( @@ -778,14 +768,13 @@ def get_surface_with_free_trim_curve( check_type(free, bool) check_type(non_manifold, bool) check_type(visible, bool) - check_optional_type(element_id, IntegerArray) - check_optional_type(value, DoubleArray) + return self.diagnosis_manager.GetSurfWithFreeTrimCurv( free, non_manifold, visible, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) # pylint: disable=R0913, R0917 @@ -977,10 +966,10 @@ def get_inverted_tetras(self, visible: bool, tetra_id: IntegerArray | None) -> i int: The number of inverted tetras. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_inverted_tetras") - check_optional_type(tetra_id, IntegerArray) + check_type(visible, bool) return self.diagnosis_manager.GetInvertedTetras( - visible, coerce_optional_dispatch(tetra_id, "integer_array") + visible, check_and_coerce_optional(tetra_id, IntegerArray) ) def get_collapsed_faces(self, visible: bool, tetra_id: IntegerArray | None) -> int: @@ -995,10 +984,10 @@ def get_collapsed_faces(self, visible: bool, tetra_id: IntegerArray | None) -> i int: The number of collapsed faces. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_collapsed_faces") - check_optional_type(tetra_id, IntegerArray) + check_type(visible, bool) return self.diagnosis_manager.GetCollapsedFaces( - visible, coerce_optional_dispatch(tetra_id, "integer_array") + visible, check_and_coerce_optional(tetra_id, IntegerArray) ) def get_insufficient_refinement_through_thickness( @@ -1022,10 +1011,10 @@ def get_insufficient_refinement_through_thickness( name="get_insufficient_refinement_through_thickness", ) check_type(min_layer, int) - check_optional_type(tetra_id, IntegerArray) + check_type(visible, bool) return self.diagnosis_manager.GetInsufficientRefinementThroughThickness( - min_layer, visible, coerce_optional_dispatch(tetra_id, "integer_array") + min_layer, visible, check_and_coerce_optional(tetra_id, IntegerArray) ) def get_internal_long_edges( @@ -1049,14 +1038,13 @@ def get_internal_long_edges( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_internal_long_edges") check_type(max_edge_length_ratio, (float, int)) - check_optional_type(tetra_id, IntegerArray) - check_optional_type(value, DoubleArray) + check_type(visible, bool) return self.diagnosis_manager.GetInternalLongEdges( max_edge_length_ratio, visible, - coerce_optional_dispatch(tetra_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(tetra_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_tetras_with_extremely_large_volume( @@ -1085,14 +1073,13 @@ def get_tetras_with_extremely_large_volume( name="get_tetras_with_extremely_large_volume", ) check_type(max_volume_ratio, (float, int)) - check_optional_type(tetra_id, IntegerArray) - check_optional_type(value, DoubleArray) + check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithExtremelyLargeVolume( max_volume_ratio, visible, - coerce_optional_dispatch(tetra_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(tetra_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_tetras_with_high_aspect_ratio( @@ -1118,14 +1105,13 @@ def get_tetras_with_high_aspect_ratio( __name__, LogMessage.FUNCTION_CALL, locals(), name="get_tetras_with_high_aspect_ratio" ) check_type(max_aspect_ratio, (float, int)) - check_optional_type(tetra_id, IntegerArray) - check_optional_type(value, DoubleArray) + check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithHighAspectRatio( max_aspect_ratio, visible, - coerce_optional_dispatch(tetra_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(tetra_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_tetras_with_extreme_min_angle_between_faces( @@ -1154,14 +1140,13 @@ def get_tetras_with_extreme_min_angle_between_faces( name="get_tetras_with_extreme_min_angle_between_faces", ) check_type(min_angle, (float, int)) - check_optional_type(tetra_id, IntegerArray) - check_optional_type(value, DoubleArray) + check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithExtremeMinAngleBetweenFaces( min_angle, visible, - coerce_optional_dispatch(tetra_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(tetra_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) def get_tetras_with_extreme_max_angle_between_faces( @@ -1190,12 +1175,11 @@ def get_tetras_with_extreme_max_angle_between_faces( name="get_tetras_with_extreme_max_angle_between_faces", ) check_type(max_angle, (float, int)) - check_optional_type(tetra_id, IntegerArray) - check_optional_type(value, DoubleArray) + check_type(visible, bool) return self.diagnosis_manager.GetTetrasWithExtremeMaxAngleBetweenFaces( max_angle, visible, - coerce_optional_dispatch(tetra_id, "integer_array"), - coerce_optional_dispatch(value, "double_array"), + check_and_coerce_optional(tetra_id, IntegerArray), + check_and_coerce_optional(value, DoubleArray), ) diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 69bb800..75d5997 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -6,7 +6,7 @@ EntList Class API Wrapper """ -from .helper import check_index, check_type, check_optional_type, coerce_optional_dispatch +from .helper import check_index, check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch from .com_proxy import safe_com, expose_oleobj from .predicate import Predicate from .common import LogMessage @@ -65,8 +65,8 @@ def select_from_predicate(self, predicate: Predicate | None) -> None: inclusion of an entity. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="select_from_predicate") - check_optional_type(predicate, Predicate) - self.ent_list.SelectFromPredicate(coerce_optional_dispatch(predicate, "predicate")) + + self.ent_list.SelectFromPredicate(check_and_coerce_optional(predicate, Predicate)) def convert_to_string(self) -> str: """ diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index 4d6fa10..ed5bb33 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -9,7 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .common import EntityType, DisplayOption -from .helper import get_enum_value, check_type, check_optional_type, check_range, coerce_optional_dispatch +from .helper import get_enum_value, check_type, check_optional_type, check_and_coerce_optional, check_range, coerce_optional_dispatch from .com_proxy import safe_com @@ -49,8 +49,8 @@ def create_child_layer(self, folder: EntList | None) -> EntList: EntList: The created child layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_child_layer") - check_optional_type(folder, EntList) - result = self.folder_manager.CreateChildLayer(coerce_optional_dispatch(folder, "ent_list")) + + result = self.folder_manager.CreateChildLayer(check_and_coerce_optional(folder, EntList)) if result is None: return None return EntList(result) @@ -66,8 +66,8 @@ def create_child_folder(self, folder: EntList | None) -> EntList: EntList: The created child folder. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_child_folder") - check_optional_type(folder, EntList) - result = self.folder_manager.CreateChildFolder(coerce_optional_dispatch(folder, "ent_list")) + + result = self.folder_manager.CreateChildFolder(check_and_coerce_optional(folder, EntList)) if result is None: return None return EntList(result) @@ -84,11 +84,11 @@ def add_objects_to_folder(self, objects: EntList | None, folder: EntList | None) bool: True if the objects were added successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_objects_to_folder") - check_optional_type(objects, EntList) - check_optional_type(folder, EntList) + + return self.folder_manager.AddObjectsToFolder( - coerce_optional_dispatch(objects, "ent_list"), - coerce_optional_dispatch(folder, "ent_list"), + check_and_coerce_optional(objects, EntList), + check_and_coerce_optional(folder, EntList), ) def remove_objects_from_folder(self, objects: EntList | None) -> bool: @@ -102,9 +102,9 @@ def remove_objects_from_folder(self, objects: EntList | None) -> bool: bool: True if the objects were removed successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="remove_objects_from_folder") - check_optional_type(objects, EntList) + return self.folder_manager.RemoveObjectsFromFolder( - coerce_optional_dispatch(objects, "ent_list") + check_and_coerce_optional(objects, EntList) ) def create_entity_list(self) -> EntList: @@ -133,10 +133,10 @@ def delete_folder(self, folder: EntList | None, move_layers: bool) -> bool: bool: True if the folder was deleted successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_folder") - check_optional_type(folder, EntList) + check_type(move_layers, bool) return self.folder_manager.DeleteFolder( - coerce_optional_dispatch(folder, "ent_list"), move_layers + check_and_coerce_optional(folder, EntList), move_layers ) def toggle_folder(self, folder: EntList | None) -> bool: @@ -150,8 +150,8 @@ def toggle_folder(self, folder: EntList | None) -> bool: bool: True if the folder was toggled successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="toggle_folder") - check_optional_type(folder, EntList) - return self.folder_manager.ToggleFolder(coerce_optional_dispatch(folder, "ent_list")) + + return self.folder_manager.ToggleFolder(check_and_coerce_optional(folder, EntList)) # pylint: disable-next=R0913, R0917 def expand_folder( @@ -180,7 +180,7 @@ def expand_folder( int: The number of entities affected. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="expand_folder") - check_optional_type(folder, EntList) + # pylint: disable=R0801 check_type(levels, int) check_type(expand_new_layer, bool) @@ -189,7 +189,7 @@ def expand_folder( check_type(inc_tetras, bool) check_type(inc_beams, bool) return self.folder_manager.ExpandFolder( - coerce_optional_dispatch(folder, "ent_list"), + check_and_coerce_optional(folder, EntList), levels, expand_new_layer, inc_nodes, @@ -210,9 +210,9 @@ def set_folder_name(self, folder: EntList | None, name: str) -> bool: bool: True if the folder name was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_folder_name") - check_optional_type(folder, EntList) + check_type(name, str) - return self.folder_manager.SetFolderName(coerce_optional_dispatch(folder, "ent_list"), name) + return self.folder_manager.SetFolderName(check_and_coerce_optional(folder, EntList), name) def show_all_folders(self) -> bool: """ @@ -236,9 +236,9 @@ def show_folders(self, folders: EntList | None, show: bool) -> bool: bool: True if the folders were shown/hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_folders") - check_optional_type(folders, EntList) + check_type(show, bool) - return self.folder_manager.ShowFolders(coerce_optional_dispatch(folders, "ent_list"), show) + return self.folder_manager.ShowFolders(check_and_coerce_optional(folders, EntList), show) # pylint: disable-next=R0913, R0917 def set_type_color( @@ -265,7 +265,7 @@ def set_type_color( int: The integer identifier for the color """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_color") - check_optional_type(folder, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(default, bool) check_type(red, int) @@ -275,7 +275,7 @@ def set_type_color( check_range(green, 0, 255, True, True) check_range(blue, 0, 255, True, True) return self.folder_manager.SetTypeColor( - coerce_optional_dispatch(folder, "ent_list"), entity_type, default, red, green, blue + check_and_coerce_optional(folder, EntList), entity_type, default, red, green, blue ) def set_type_visible( @@ -293,11 +293,11 @@ def set_type_visible( bool: True if the visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_visible") - check_optional_type(folder, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(visible, bool) return self.folder_manager.SetTypeVisible( - coerce_optional_dispatch(folder, "ent_list"), entity_type, visible + check_and_coerce_optional(folder, EntList), entity_type, visible ) def set_type_display_option( @@ -341,11 +341,11 @@ def set_type_display_option( bool: True if the display option was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_display_option") - check_optional_type(folder, EntList) + entity_type = get_enum_value(entity_type, EntityType) option = get_enum_value(option, DisplayOption) return self.folder_manager.SetTypeDisplayOption( - coerce_optional_dispatch(folder, "ent_list"), entity_type, option + check_and_coerce_optional(folder, EntList), entity_type, option ) def get_first(self) -> EntList: @@ -372,8 +372,8 @@ def get_next(self, folder: EntList | None) -> EntList: EntList: The next folder. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next") - check_optional_type(folder, EntList) - result = self.folder_manager.GetNext(coerce_optional_dispatch(folder, "ent_list")) + + result = self.folder_manager.GetNext(check_and_coerce_optional(folder, EntList)) if result is None: return None return EntList(result) @@ -389,8 +389,8 @@ def get_name(self, folder: EntList | None) -> str: str: The name of the folder. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_name") - check_optional_type(folder, EntList) - return self.folder_manager.GetName(coerce_optional_dispatch(folder, "ent_list")) + + return self.folder_manager.GetName(check_and_coerce_optional(folder, EntList)) def show_labels(self, folder: EntList | None, show: bool) -> bool: """ @@ -404,9 +404,9 @@ def show_labels(self, folder: EntList | None, show: bool) -> bool: bool: True if the labels were shown/hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_labels") - check_optional_type(folder, EntList) + check_type(show, bool) - return self.folder_manager.ShowLabels(coerce_optional_dispatch(folder, "ent_list"), show) + return self.folder_manager.ShowLabels(check_and_coerce_optional(folder, EntList), show) def show_glyphs(self, folder: EntList | None, show: bool) -> bool: """ @@ -420,9 +420,9 @@ def show_glyphs(self, folder: EntList | None, show: bool) -> bool: bool: True if the glyphs were shown/hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_glyphs") - check_optional_type(folder, EntList) + check_type(show, bool) - return self.folder_manager.ShowGlyphs(coerce_optional_dispatch(folder, "ent_list"), show) + return self.folder_manager.ShowGlyphs(check_and_coerce_optional(folder, EntList), show) def set_type_show_labels( self, folder: EntList | None, entity_type: EntityType | str, show: bool @@ -439,11 +439,11 @@ def set_type_show_labels( bool: True if the label visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_labels") - check_optional_type(folder, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.folder_manager.SetTypeShowLabels( - coerce_optional_dispatch(folder, "ent_list"), entity_type, show + check_and_coerce_optional(folder, EntList), entity_type, show ) def set_type_show_glyphs( @@ -461,11 +461,11 @@ def set_type_show_glyphs( bool: True if the glyph visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_glyphs") - check_optional_type(folder, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.folder_manager.SetTypeShowGlyphs( - coerce_optional_dispatch(folder, "ent_list"), entity_type, show + check_and_coerce_optional(folder, EntList), entity_type, show ) def create_folder_by_name(self, name: str) -> EntList: @@ -513,8 +513,8 @@ def hide_all_other_folders(self, folder: EntList | None) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="hide_all_other_folders") - check_optional_type(folder, EntList) - return self.folder_manager.HideAllOtherFolders(coerce_optional_dispatch(folder, "ent_list")) + + return self.folder_manager.HideAllOtherFolders(check_and_coerce_optional(folder, EntList)) def remove_empty_folders(self) -> bool: """ @@ -538,8 +538,8 @@ def allow_clipping(self, folder: EntList | None, checked: bool) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="allow_clipping") - check_optional_type(folder, EntList) + check_type(checked, bool) return self.folder_manager.AllowClipping( - coerce_optional_dispatch(folder, "ent_list"), checked + check_and_coerce_optional(folder, EntList), checked ) diff --git a/src/moldflow/helper.py b/src/moldflow/helper.py index 1c197ee..286e4f1 100644 --- a/src/moldflow/helper.py +++ b/src/moldflow/helper.py @@ -365,3 +365,70 @@ def coerce_optional_dispatch(value, attr_name: str | None = None): if attr_name: value = getattr(value, attr_name) return value + + +# Type to attribute name mapping for COM objects +_TYPE_TO_ATTR_MAP = { + 'EntList': 'ent_list', + 'Vector': 'vector', + 'Property': 'prop', + 'Predicate': 'predicate', + 'IntegerArray': 'integer_array', + 'DoubleArray': 'double_array', + 'BoundaryList': 'boundary_list', + 'VectorArray': 'vector_array', + 'StringArray': 'string_array', +} + + +def check_and_coerce_optional(value, expected_type: type): + """ + Check if the value is of the expected type or None, and coerce it for COM dispatch. + + This function combines type validation and COM coercion into a single operation, + providing standardized handling of optional COM object parameters. + + - If value is None, returns a null IDispatch VARIANT + - If value is not None, validates the type and unwraps the COM object attribute + - For primitive types (int, float, str, bool), returns the value as-is after validation + + Args: + value: The value to check and coerce. Can be None or of the expected type. + expected_type (type): The expected type to check against. + + Returns: + VARIANT or value: The coerced COM object (VARIANT) or the validated primitive value. + + Raises: + TypeError: If the value is not None and not of the expected type. + + Examples: + >>> nodes = EntList(...) + >>> coerced = check_and_coerce_optional(nodes, EntList) + >>> # Returns nodes.ent_list + + >>> check_and_coerce_optional(None, EntList) + >>> # Returns variant_null_idispatch() + + >>> check_and_coerce_optional(42, int) + >>> # Returns 42 (primitive types are passed through) + """ + # First validate the type + check_optional_type(value, expected_type) + + # If None, return null dispatch + if value is None: + return variant_null_idispatch() + + # Get the type name + type_name = expected_type.__name__ + + # Check if this is a COM object type that needs unwrapping + attr_name = _TYPE_TO_ATTR_MAP.get(type_name) + + if attr_name: + # COM object - unwrap the attribute + return getattr(value, attr_name) + else: + # Primitive type or unknown type - return as-is + return value diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index fce4938..b8c63b9 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -9,7 +9,7 @@ from .ent_list import EntList from .common import EntityType, DisplayOption from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, check_range, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, check_range, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com @@ -39,8 +39,8 @@ def active(self, layer: EntList | None) -> bool: bool: True if the layer is active, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="active") - check_optional_type(layer, EntList) - return self.layer_manager.Active(coerce_optional_dispatch(layer, "ent_list")) + + return self.layer_manager.Active(check_and_coerce_optional(layer, EntList)) def create_layer(self) -> bool: """ @@ -63,8 +63,8 @@ def activate_layer(self, layer: EntList | None) -> bool: bool: True if the layer was activated successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="activate_layer") - check_optional_type(layer, EntList) - return self.layer_manager.ActivateLayer(coerce_optional_dispatch(layer, "ent_list")) + + return self.layer_manager.ActivateLayer(check_and_coerce_optional(layer, EntList)) def create_entity_list(self) -> EntList: """ @@ -91,10 +91,10 @@ def assign_to_layer(self, elems: EntList | None, layer: EntList | None) -> int: int: The number of elements assigned to the layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="assign_to_layer") - check_optional_type(elems, EntList) - check_optional_type(layer, EntList) + + return self.layer_manager.AssignToLayer( - coerce_optional_dispatch(elems, "ent_list"), coerce_optional_dispatch(layer, "ent_list") + check_and_coerce_optional(elems, EntList), check_and_coerce_optional(layer, EntList) ) def delete_layer(self, layer: EntList | None, move_ent: bool) -> bool: @@ -110,9 +110,9 @@ def delete_layer(self, layer: EntList | None, move_ent: bool) -> bool: bool: True if the layer was deleted successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_layer") - check_optional_type(layer, EntList) + check_type(move_ent, bool) - return self.layer_manager.DeleteLayer(coerce_optional_dispatch(layer, "ent_list"), move_ent) + return self.layer_manager.DeleteLayer(check_and_coerce_optional(layer, EntList), move_ent) def toggle_layer(self, layer: EntList | None) -> bool: """ @@ -125,8 +125,8 @@ def toggle_layer(self, layer: EntList | None) -> bool: bool: True if the layer was toggled successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="toggle_layer") - check_optional_type(layer, EntList) - return self.layer_manager.ToggleLayer(coerce_optional_dispatch(layer, "ent_list")) + + return self.layer_manager.ToggleLayer(check_and_coerce_optional(layer, EntList)) # pylint: disable-next=R0913, R0917 def expand_layer( @@ -155,7 +155,7 @@ def expand_layer( int: The number of elements expanded. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="expand_layer") - check_optional_type(layer, EntList) + check_type(levels, int) check_type(expand_new_layer, bool) check_type(inc_nodes, bool) @@ -163,7 +163,7 @@ def expand_layer( check_type(inc_tetras, bool) check_type(inc_beams, bool) return self.layer_manager.ExpandLayer2( - coerce_optional_dispatch(layer, "ent_list"), + check_and_coerce_optional(layer, EntList), levels, expand_new_layer, inc_nodes, @@ -184,9 +184,9 @@ def set_layer_name(self, layer: EntList | None, name: str) -> bool: bool: True if the name was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_layer_name") - check_optional_type(layer, EntList) + check_type(name, str) - return self.layer_manager.SetLayerName(coerce_optional_dispatch(layer, "ent_list"), name) + return self.layer_manager.SetLayerName(check_and_coerce_optional(layer, EntList), name) def show_all_layers(self) -> bool: """ @@ -210,9 +210,9 @@ def show_layers(self, layers: EntList | None, show: bool) -> bool: bool: True if the layers were shown or hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_layers") - check_optional_type(layers, EntList) + check_type(show, bool) - return self.layer_manager.ShowLayers(coerce_optional_dispatch(layers, "ent_list"), show) + return self.layer_manager.ShowLayers(check_and_coerce_optional(layers, EntList), show) # pylint: disable-next=R0913, R0917 def set_type_color( @@ -239,14 +239,14 @@ def set_type_color( int: The integer identifier for the color """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_color") - check_optional_type(layer, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(default, bool) check_range(red, 0, 255, True, True) check_range(blue, 0, 255, True, True) check_range(green, 0, 255, True, True) return self.layer_manager.SetTypeColor( - coerce_optional_dispatch(layer, "ent_list"), entity_type, default, red, blue, green + check_and_coerce_optional(layer, EntList), entity_type, default, red, blue, green ) def set_type_visible( @@ -264,11 +264,11 @@ def set_type_visible( bool: True if the visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_visible") - check_optional_type(layer, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(visible, bool) return self.layer_manager.SetTypeVisible( - coerce_optional_dispatch(layer, "ent_list"), entity_type, visible + check_and_coerce_optional(layer, EntList), entity_type, visible ) def set_type_display_option( @@ -312,11 +312,11 @@ def set_type_display_option( bool: True if the display option was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_display_option") - check_optional_type(layer, EntList) + entity_type = get_enum_value(entity_type, EntityType) option = get_enum_value(option, DisplayOption) return self.layer_manager.SetTypeDisplayOption( - coerce_optional_dispatch(layer, "ent_list"), entity_type, option + check_and_coerce_optional(layer, EntList), entity_type, option ) def get_first(self) -> EntList: @@ -343,8 +343,8 @@ def get_next(self, layer: EntList | None) -> EntList: EntList: The next layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next") - check_optional_type(layer, EntList) - result = self.layer_manager.GetNext(coerce_optional_dispatch(layer, "ent_list")) + + result = self.layer_manager.GetNext(check_and_coerce_optional(layer, EntList)) if result is None: return None return EntList(result) @@ -360,8 +360,8 @@ def get_name(self, layer: EntList | None) -> str: str: The name of the layer. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_name") - check_optional_type(layer, EntList) - return self.layer_manager.GetName(coerce_optional_dispatch(layer, "ent_list")) + + return self.layer_manager.GetName(check_and_coerce_optional(layer, EntList)) def show_labels(self, layer: EntList | None, show: bool) -> bool: """ @@ -375,9 +375,9 @@ def show_labels(self, layer: EntList | None, show: bool) -> bool: bool: True if the labels were shown or hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_labels") - check_optional_type(layer, EntList) + check_type(show, bool) - return self.layer_manager.ShowLabels(coerce_optional_dispatch(layer, "ent_list"), show) + return self.layer_manager.ShowLabels(check_and_coerce_optional(layer, EntList), show) def show_glyphs(self, layer: EntList | None, show: bool) -> bool: """ @@ -391,9 +391,9 @@ def show_glyphs(self, layer: EntList | None, show: bool) -> bool: bool: True if the glyphs were shown or hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="show_glyphs") - check_optional_type(layer, EntList) + check_type(show, bool) - return self.layer_manager.ShowGlyphs(coerce_optional_dispatch(layer, "ent_list"), show) + return self.layer_manager.ShowGlyphs(check_and_coerce_optional(layer, EntList), show) def set_type_show_labels( self, layer: EntList | None, entity_type: EntityType | str, show: bool @@ -410,11 +410,11 @@ def set_type_show_labels( bool: True if the label visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_labels") - check_optional_type(layer, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.layer_manager.SetTypeShowLabels( - coerce_optional_dispatch(layer, "ent_list"), entity_type, show + check_and_coerce_optional(layer, EntList), entity_type, show ) def set_type_show_glyphs( @@ -432,11 +432,11 @@ def set_type_show_glyphs( bool: True if the glyphs visibility was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_type_show_glyphs") - check_optional_type(layer, EntList) + entity_type = get_enum_value(entity_type, EntityType) check_type(show, bool) return self.layer_manager.SetTypeShowGlyphs( - coerce_optional_dispatch(layer, "ent_list"), entity_type, show + check_and_coerce_optional(layer, EntList), entity_type, show ) def create_layer_by_name(self, name: str) -> EntList: @@ -484,8 +484,8 @@ def hide_all_other_layers(self, layer: EntList | None) -> bool: bool: True if all other layers were hidden successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="hide_all_other_layers") - check_optional_type(layer, EntList) - return self.layer_manager.HideAllOtherLayers(coerce_optional_dispatch(layer, "ent_list")) + + return self.layer_manager.HideAllOtherLayers(check_and_coerce_optional(layer, EntList)) def remove_empty_layers(self) -> bool: """ @@ -508,8 +508,8 @@ def get_activated(self, layer: EntList | None) -> bool: bool: True if the layer is visible, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_activated") - check_optional_type(layer, EntList) - return self.layer_manager.GetActivated(coerce_optional_dispatch(layer, "ent_list")) + + return self.layer_manager.GetActivated(check_and_coerce_optional(layer, EntList)) def get_type_visible(self, layer: EntList | None, entity_type: EntityType | str) -> bool: """ @@ -523,10 +523,10 @@ def get_type_visible(self, layer: EntList | None, entity_type: EntityType | str) bool: True if the entity type is visible, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_type_visible") - check_optional_type(layer, EntList) + entity_type = get_enum_value(entity_type, EntityType) return self.layer_manager.GetTypeVisible( - coerce_optional_dispatch(layer, "ent_list"), entity_type + check_and_coerce_optional(layer, EntList), entity_type ) def get_number_of_layers(self) -> int: @@ -551,8 +551,8 @@ def allow_clipping(self, layer: EntList | None, checked: bool) -> bool: bool: True if the clipping was set successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="allow_clipping") - check_optional_type(layer, EntList) + check_type(checked, bool) return self.layer_manager.AllowClipping( - coerce_optional_dispatch(layer, "ent_list"), checked + check_and_coerce_optional(layer, EntList), checked ) diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index 738b17b..c7feb9e 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -9,7 +9,7 @@ from .prop import Property from .common import MaterialDatabase, MaterialDatabaseType from .logger import process_log -from .helper import check_type, check_optional_type, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com from .common import LogMessage @@ -72,8 +72,8 @@ def get_next_material(self, material: Property | None) -> Property: Property: The next material. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_material") - check_optional_type(material, Property) - material_disp = coerce_optional_dispatch(material, "prop") + + material_disp = check_and_coerce_optional(material, Property) result = self.material_finder.GetNextMaterial(material_disp) if result is None: return None diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index 84f56d6..6a74979 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -13,7 +13,7 @@ from .ent_list import EntList from .vector import Vector from .prop import Property -from .helper import check_type, check_optional_type, check_range, check_is_non_negative, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, check_range, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com @@ -80,12 +80,12 @@ def swap_edge( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="swap_edges") - check_optional_type(tri1, EntList) - check_optional_type(tri2, EntList) + + check_type(feat_allow, bool) return self.mesh_editor.SwapEdge( - coerce_optional_dispatch(tri1, "ent_list"), - coerce_optional_dispatch(tri2, "ent_list"), + check_and_coerce_optional(tri1, EntList), + check_and_coerce_optional(tri2, EntList), feat_allow, ) @@ -102,9 +102,9 @@ def stitch_free_edges(self, nodes: EntList | None, tolerance: float) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="stitch_free_edges") check_type(tolerance, float) - check_optional_type(nodes, EntList) + return self.mesh_editor.StitchFreeEdges2( - coerce_optional_dispatch(nodes, "ent_list"), tolerance + check_and_coerce_optional(nodes, EntList), tolerance ) def insert_node(self, node1: EntList | None, node2: EntList | None) -> EntList: @@ -118,10 +118,10 @@ def insert_node(self, node1: EntList | None, node2: EntList | None) -> EntList: The new node. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) + + result = self.mesh_editor.InsertNode( - coerce_optional_dispatch(node1, "ent_list"), coerce_optional_dispatch(node2, "ent_list") + check_and_coerce_optional(node1, EntList), check_and_coerce_optional(node2, EntList) ) if result is None: return None @@ -144,22 +144,19 @@ def insert_node_in_tri( The new node at the centroid of triangle. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tri") - check_optional_type(node1, EntList) if node2 is None and node3 is None: check_range(node1.size, 3, 3, True, True) - result = self.mesh_editor.InsertNodeInTri2(coerce_optional_dispatch(node1, "ent_list")) + result = self.mesh_editor.InsertNodeInTri2(check_and_coerce_optional(node1, EntList)) if result is None: return None return EntList(result) - check_optional_type(node2, EntList) - check_optional_type(node3, EntList) result = self.mesh_editor.InsertNodeInTri( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(node3, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(node3, EntList), ) if result is None: @@ -188,21 +185,21 @@ def insert_node_in_tet( The new node at the centroid of tetrahedron. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tet") - check_optional_type(node1, EntList) + if node2 is None or node3 is None or node4 is None: check_range(node1.size, 4, 4, True, True) - result = self.mesh_editor.InsertNodeInTet(coerce_optional_dispatch(node1, "ent_list")) + result = self.mesh_editor.InsertNodeInTet(check_and_coerce_optional(node1, EntList)) if result is None: return None return EntList(result) - check_optional_type(node2, EntList) - check_optional_type(node3, EntList) - check_optional_type(node4, EntList) + + + result = self.mesh_editor.InsertNodeInTetByNodes( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(node3, "ent_list"), - coerce_optional_dispatch(node4, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(node3, EntList), + check_and_coerce_optional(node4, EntList), ) if result is None: return None @@ -231,15 +228,15 @@ def insert_node_in_tet_by_nodes( process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tet_by_nodes" ) - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) - check_optional_type(node3, EntList) - check_optional_type(node4, EntList) + + + + result = self.mesh_editor.InsertNodeInTetByNodes( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(node3, "ent_list"), - coerce_optional_dispatch(node4, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(node3, EntList), + check_and_coerce_optional(node4, EntList), ) if result is None: return None @@ -256,11 +253,11 @@ def insert_node_on_beam(self, beam: EntList | None, num_div: int = 2) -> EntList Entlist of the new node. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_on_beam") - check_optional_type(beam, EntList) + check_type(num_div, int) check_is_non_negative(num_div) result = self.mesh_editor.InsertNodeOnBeam( - coerce_optional_dispatch(beam, "ent_list"), num_div + check_and_coerce_optional(beam, EntList), num_div ) if result is None: return None @@ -278,12 +275,11 @@ def move_nodes(self, nodes: EntList | None, vector: Vector | None, loc: bool) -> True if successful; False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_nodes") - check_optional_type(nodes, EntList) - check_optional_type(vector, Vector) + check_type(loc, bool) return self.mesh_editor.MoveNodes( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(vector, "vector"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(vector, Vector), loc, ) @@ -303,13 +299,13 @@ def align_nodes( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_nodes") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) - check_optional_type(to_align, EntList) + + + return self.mesh_editor.AlignNodes( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(to_align, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(to_align, EntList), ) def smooth_nodes(self, nodes: EntList | None, feat: bool) -> bool: @@ -324,9 +320,9 @@ def smooth_nodes(self, nodes: EntList | None, feat: bool) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="smooth_nodes") - check_optional_type(nodes, EntList) + check_type(feat, bool) - return self.mesh_editor.SmoothNodes(coerce_optional_dispatch(nodes, "ent_list"), feat) + return self.mesh_editor.SmoothNodes(check_and_coerce_optional(nodes, EntList), feat) def orient(self, fusion: bool) -> bool: """ @@ -354,8 +350,8 @@ def flip_normals(self, tris: EntList | None) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="flip_normals") - check_optional_type(tris, EntList) - return self.mesh_editor.FlipNormals(coerce_optional_dispatch(tris, "ent_list")) + + return self.mesh_editor.FlipNormals(check_and_coerce_optional(tris, EntList)) def align_normals(self, seed_tri: EntList | None, tris: EntList | None) -> int: """ @@ -370,11 +366,11 @@ def align_normals(self, seed_tri: EntList | None, tris: EntList | None) -> int: Number of triangles whose normals were aligned """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_normals") - check_optional_type(seed_tri, EntList) - check_optional_type(tris, EntList) + + return self.mesh_editor.AlignNormals( - coerce_optional_dispatch(seed_tri, "ent_list"), - coerce_optional_dispatch(tris, "ent_list"), + check_and_coerce_optional(seed_tri, EntList), + check_and_coerce_optional(tris, EntList), ) def fill_hole(self, nodes: EntList | None, fill_type: int | None = None) -> bool: @@ -391,11 +387,11 @@ def fill_hole(self, nodes: EntList | None, fill_type: int | None = None) -> bool True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="fill_hole") - check_optional_type(nodes, EntList) + if fill_type is None: - return self.mesh_editor.FillHole(coerce_optional_dispatch(nodes, "ent_list")) + return self.mesh_editor.FillHole(check_and_coerce_optional(nodes, EntList)) check_type(fill_type, int) - return self.mesh_editor.FillHole2(coerce_optional_dispatch(nodes, "ent_list"), fill_type) + return self.mesh_editor.FillHole2(check_and_coerce_optional(nodes, EntList), fill_type) # pylint: disable-next=R0913, R0917 def create_tet( @@ -420,17 +416,13 @@ def create_tet( The new tetrahedron. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_tet") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) - check_optional_type(node3, EntList) - check_optional_type(node4, EntList) - check_optional_type(prop, Property) - prop_disp = coerce_optional_dispatch(prop, "prop") + + prop_disp = check_and_coerce_optional(prop, Property) result = self.mesh_editor.CreateTet( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(node3, "ent_list"), - coerce_optional_dispatch(node4, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(node3, EntList), + check_and_coerce_optional(node4, EntList), prop_disp, ) if result is None: @@ -457,15 +449,12 @@ def create_tri( The new triangle """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_tri") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) - check_optional_type(node3, EntList) - check_optional_type(prop, Property) - prop_disp = coerce_optional_dispatch(prop, "prop") + + prop_disp = check_and_coerce_optional(prop, Property) result = self.mesh_editor.CreateTri( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(node3, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(node3, EntList), prop_disp, ) if result is None: @@ -521,14 +510,14 @@ def refine_tetras_by_labels( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="refine_tetras_by_labels") - check_optional_type(nodes, EntList) + check_type(num_layer, int) check_is_non_negative(num_layer) check_type(isolate_refined_tet, bool) check_type(refine_surface, bool) check_type(surface_edge_length, (int, float)) return self.mesh_editor.RefineTetrasByLabels( - coerce_optional_dispatch(nodes, "ent_list"), + check_and_coerce_optional(nodes, EntList), num_layer, isolate_refined_tet, refine_surface, @@ -562,21 +551,15 @@ def create_wedge( The new wedge. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_wedge") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) - check_optional_type(node3, EntList) - check_optional_type(node4, EntList) - check_optional_type(node5, EntList) - check_optional_type(node6, EntList) - check_optional_type(prop, Property) + result = self.mesh_editor.CreateWedge( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), - coerce_optional_dispatch(node3, "ent_list"), - coerce_optional_dispatch(node4, "ent_list"), - coerce_optional_dispatch(node5, "ent_list"), - coerce_optional_dispatch(node6, "ent_list"), - coerce_optional_dispatch(prop, "prop"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), + check_and_coerce_optional(node3, EntList), + check_and_coerce_optional(node4, EntList), + check_and_coerce_optional(node5, EntList), + check_and_coerce_optional(node6, EntList), + check_and_coerce_optional(prop, Property), ) if result is None: @@ -595,11 +578,11 @@ def convert_wedges_to_tetras(self, wedges: EntList | None, num_layer: int) -> bo True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="convert_wedges_to_tetras") - check_optional_type(wedges, EntList) + check_type(num_layer, int) check_is_non_negative(num_layer) return self.mesh_editor.ConvertWedgesToTetras( - coerce_optional_dispatch(wedges, "ent_list"), num_layer + check_and_coerce_optional(wedges, EntList), num_layer ) def create_beams( @@ -618,16 +601,16 @@ def create_beams( The new beam. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_beams") - check_optional_type(node1, EntList) - check_optional_type(node2, EntList) + + check_type(num_beams, int) check_is_non_negative(num_beams) - check_optional_type(prop, Property) + result = self.mesh_editor.CreateBeams( - coerce_optional_dispatch(node1, "ent_list"), - coerce_optional_dispatch(node2, "ent_list"), + check_and_coerce_optional(node1, EntList), + check_and_coerce_optional(node2, EntList), num_beams, - coerce_optional_dispatch(prop, "prop"), + check_and_coerce_optional(prop, Property), ) if result is None: @@ -667,8 +650,8 @@ def delete(self, entities: EntList | None) -> EntList: You would need to delete the dependent entities first """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete") - check_optional_type(entities, EntList) - result = self.mesh_editor.Delete(coerce_optional_dispatch(entities, "ent_list")) + + result = self.mesh_editor.Delete(check_and_coerce_optional(entities, EntList)) if result is None: return None return EntList(result) @@ -689,13 +672,13 @@ def remesh_area( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="remesh_area") - check_optional_type(tris, EntList) + check_type(size, (int, float)) check_type(imprint, bool) check_type(smooth, (int, float)) check_range(smooth, 0.0, 1.0, True, True) return self.mesh_editor.RemeshArea2( - coerce_optional_dispatch(tris, "ent_list"), size, imprint, smooth + check_and_coerce_optional(tris, EntList), size, imprint, smooth ) def match_nodes(self, nodes: EntList | None, tris: EntList | None, layer: str) -> int: @@ -712,12 +695,12 @@ def match_nodes(self, nodes: EntList | None, tris: EntList | None, layer: str) - Number of nodes affected """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="match_notes") - check_optional_type(nodes, EntList) - check_optional_type(tris, EntList) + + check_type(layer, str) return self.mesh_editor.MatchNodes( - coerce_optional_dispatch(nodes, "ent_list"), - coerce_optional_dispatch(tris, "ent_list"), + check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(tris, EntList), layer, ) @@ -741,10 +724,10 @@ def make_region( check_type(tol, float) check_type(is_angular, bool) check_type(mesh, bool) - check_optional_type(prop, Property) + if prop is not None: return self.mesh_editor.MakeRegion2( - tol, is_angular, mesh, coerce_optional_dispatch(prop, "prop") + tol, is_angular, mesh, check_and_coerce_optional(prop, Property) ) return self.mesh_editor.MakeRegion(tol, is_angular) @@ -760,11 +743,10 @@ def move_beam_node(self, moving_node: EntList | None, target: Vector | None) -> True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_beam_node") - check_optional_type(moving_node, EntList) - check_optional_type(target, Vector) + return self.mesh_editor.MoveBeamNode( - coerce_optional_dispatch(moving_node, "ent_list"), - coerce_optional_dispatch(target, "vector"), + check_and_coerce_optional(moving_node, EntList), + check_and_coerce_optional(target, Vector), ) def move_node_to_edge( @@ -788,15 +770,15 @@ def move_node_to_edge( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_node_to_edge") - check_optional_type(node, EntList) - check_optional_type(edge_node1, EntList) - check_optional_type(edge_node2, EntList) + + + check_type(param_loc, (int, float)) check_range(param_loc, 0.0, 1.0, True, True) return self.mesh_editor.MoveNodeToEdge( - coerce_optional_dispatch(node, "ent_list"), - coerce_optional_dispatch(edge_node1, "ent_list"), - coerce_optional_dispatch(edge_node2, "ent_list"), + check_and_coerce_optional(node, EntList), + check_and_coerce_optional(edge_node1, EntList), + check_and_coerce_optional(edge_node2, EntList), param_loc, ) @@ -816,16 +798,16 @@ def create_beams_by_points( The new beam. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_beams_by_points") - check_optional_type(pt1, Vector) - check_optional_type(pt2, Vector) + + check_type(num, int) check_is_non_negative(num) - check_optional_type(prop, Property) + result = self.mesh_editor.CreateBeamsByPoints( - coerce_optional_dispatch(pt1, "vector"), - coerce_optional_dispatch(pt2, "vector"), + check_and_coerce_optional(pt1, Vector), + check_and_coerce_optional(pt2, Vector), num, - coerce_optional_dispatch(prop, "prop"), + check_and_coerce_optional(prop, Property), ) if result is None: return None @@ -842,8 +824,8 @@ def project_mesh(self, tris: EntList | None) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="project_mesh") - check_optional_type(tris, EntList) - return self.mesh_editor.ProjectMesh(coerce_optional_dispatch(tris, "ent_list")) + + return self.mesh_editor.ProjectMesh(check_and_coerce_optional(tris, EntList)) def convert_to_beams( self, start_node: EntList | None, prop: Property | None, junction: bool, num_branch: int @@ -861,14 +843,13 @@ def convert_to_beams( Number of beams created """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="convert_to_beams") - check_optional_type(start_node, EntList) - check_optional_type(prop, Property) + check_type(junction, bool) check_type(num_branch, int) check_is_non_negative(num_branch) return self.mesh_editor.ConvertToBeams( - coerce_optional_dispatch(start_node, "ent_list"), - coerce_optional_dispatch(prop, "prop"), + check_and_coerce_optional(start_node, EntList), + check_and_coerce_optional(prop, Property), junction, num_branch, ) @@ -923,13 +904,13 @@ def cut_triangles_by_plane( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="cut_triangles_by_plane") - check_optional_type(plane_normal, Vector) - check_optional_type(ref_point, Vector) + + check_type(fill, bool) check_type(smooth, bool) return self.mesh_editor.CutTrianglesByPlane( - coerce_optional_dispatch(plane_normal, "vector"), - coerce_optional_dispatch(ref_point, "vector"), + check_and_coerce_optional(plane_normal, Vector), + check_and_coerce_optional(ref_point, Vector), fill, smooth, ) @@ -950,12 +931,12 @@ def offset_triangles( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="offset_triangles") - check_optional_type(offset_tri, EntList) + check_type(offset_dist, (int, float)) check_type(falloff_dist, (int, float)) check_type(smooth_nb, bool) return self.mesh_editor.OffsetTriangles( - coerce_optional_dispatch(offset_tri, "ent_list"), offset_dist, falloff_dist, smooth_nb + check_and_coerce_optional(offset_tri, EntList), offset_dist, falloff_dist, smooth_nb ) # pylint: disable-next=R0913, R0917 @@ -983,19 +964,19 @@ def extrude_triangles( True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="extrude_triangles") - check_optional_type(offset_tri, EntList) + check_type(dist, (int, float)) check_type(scale, (int, float)) check_type(smooth_nb, bool) check_type(create_new_body, bool) - check_optional_type(prop, Property) + return self.mesh_editor.ExtrudeTriangles( - coerce_optional_dispatch(offset_tri, "ent_list"), + check_and_coerce_optional(offset_tri, EntList), dist, scale, smooth_nb, create_new_body, - coerce_optional_dispatch(prop, "prop"), + check_and_coerce_optional(prop, Property), ) def imprint_visible_triangles(self) -> bool: @@ -1019,8 +1000,8 @@ def imprint_selected_triangles(self, tri: EntList | None) -> bool: True if operation is successful; False otherwise """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="imprint_selected_triangles") - check_optional_type(tri, EntList) - return self.mesh_editor.ImprintSelectedTriangles(coerce_optional_dispatch(tri, "ent_list")) + + return self.mesh_editor.ImprintSelectedTriangles(check_and_coerce_optional(tri, EntList)) # pylint: disable=R0913, R0917 def global_merge( @@ -1079,13 +1060,13 @@ def merge_nodes( number of nodes merged """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="merge_nodes") - check_optional_type(target, EntList) - check_optional_type(nodes, EntList) + + check_type(fusion, bool) check_type(use_mid, bool) return self.mesh_editor.MergeNodes2( - coerce_optional_dispatch(target, "ent_list"), - coerce_optional_dispatch(nodes, "ent_list"), + check_and_coerce_optional(target, EntList), + check_and_coerce_optional(nodes, EntList), fusion, use_mid, ) diff --git a/src/moldflow/modeler.py b/src/moldflow/modeler.py index 1029d03..21af0db 100644 --- a/src/moldflow/modeler.py +++ b/src/moldflow/modeler.py @@ -52,8 +52,8 @@ def create_node_by_xyz(self, coord: Vector | None) -> EntList: int: The ID of the created node. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_node_by_xyz") - check_optional_type(coord, Vector) - result = self.modeler.CreateNodeByXYZ(coerce_optional_dispatch(coord, "vector")) + + result = self.modeler.CreateNodeByXYZ(check_and_coerce_optional(coord, Vector)) if result is None: return None return EntList(result) @@ -73,13 +73,13 @@ def create_nodes_between( EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_between") - check_optional_type(start, Vector) - check_optional_type(end, Vector) + + check_type(num_nodes, int) check_is_positive(num_nodes) result = self.modeler.CreateNodesBetween( - coerce_optional_dispatch(start, "vector"), - coerce_optional_dispatch(end, "vector"), + check_and_coerce_optional(start, Vector), + check_and_coerce_optional(end, Vector), num_nodes, ) if result is None: @@ -101,13 +101,13 @@ def create_nodes_by_offset( EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_by_offset") - check_optional_type(coord, Vector) - check_optional_type(offset, Vector) + + check_type(num_nodes, int) check_is_positive(num_nodes) result = self.modeler.CreateNodesByOffset( - coerce_optional_dispatch(coord, "vector"), - coerce_optional_dispatch(offset, "vector"), + check_and_coerce_optional(coord, Vector), + check_and_coerce_optional(offset, Vector), num_nodes, ) if result is None: @@ -127,12 +127,12 @@ def create_nodes_by_divide(self, curve: EntList | None, num_nodes: int, ends: bo EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_by_divide") - check_optional_type(curve, EntList) + check_type(num_nodes, int) check_is_positive(num_nodes) check_type(ends, bool) result = self.modeler.CreateNodesByDivide( - coerce_optional_dispatch(curve, "ent_list"), num_nodes, ends + check_and_coerce_optional(curve, EntList), num_nodes, ends ) if result is None: return None @@ -166,13 +166,11 @@ def create_node_by_intersect( EntList: The list of created nodes. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_node_by_intersect") - check_optional_type(curve, EntList) - check_optional_type(curve2, EntList) - check_optional_type(pt, Vector) + result = self.modeler.CreateNodeByIntersect( - coerce_optional_dispatch(curve, "ent_list"), - coerce_optional_dispatch(curve2, "ent_list"), - coerce_optional_dispatch(pt, "vector"), + check_and_coerce_optional(curve, EntList), + check_and_coerce_optional(curve2, EntList), + check_and_coerce_optional(pt, Vector), ) if result is None: return None @@ -202,15 +200,15 @@ def create_line( EntList: The list of created lines. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_line") - check_optional_type(coord, Vector) - check_optional_type(vec, Vector) + + check_type(relative, bool) - check_optional_type(prop_set, Property) + check_type(ends, bool) - prop_disp = coerce_optional_dispatch(prop_set, "prop") + prop_disp = check_and_coerce_optional(prop_set, Property) result = self.modeler.CreateLine( - coerce_optional_dispatch(coord, "vector"), - coerce_optional_dispatch(vec, "vector"), + check_and_coerce_optional(coord, Vector), + check_and_coerce_optional(vec, Vector), relative, prop_disp, ends, @@ -244,19 +242,19 @@ def create_arc_by_angle( EntList: The list of created arcs. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_arc_by_angle") - check_optional_type(center, Vector) + check_type(radius, (int, float)) check_is_positive(radius) check_type(start, (int, float)) check_type(end, (int, float)) - check_optional_type(prop_set, Property) + check_type(ends, bool) result = self.modeler.CreateArcByAngle( - coerce_optional_dispatch(center, "vector"), + check_and_coerce_optional(center, Vector), radius, start, end, - coerce_optional_dispatch(prop_set, "prop"), + check_and_coerce_optional(prop_set, Property), ends, ) if result is None: @@ -289,18 +287,18 @@ def create_arc_by_points( EntList: The list of created arcs. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_arc_by_points") - check_optional_type(pt1, Vector) - check_optional_type(pt2, Vector) - check_optional_type(pt3, Vector) + + + check_type(circle, bool) - check_optional_type(prop_set, Property) + check_type(ends, bool) result = self.modeler.CreateArcByPoints( - coerce_optional_dispatch(pt1, "vector"), - coerce_optional_dispatch(pt2, "vector"), - coerce_optional_dispatch(pt3, "vector"), + check_and_coerce_optional(pt1, Vector), + check_and_coerce_optional(pt2, Vector), + check_and_coerce_optional(pt3, Vector), circle, - coerce_optional_dispatch(prop_set, "prop"), + check_and_coerce_optional(prop_set, Property), ends, ) # pylint: disable=R0801 @@ -356,19 +354,19 @@ def create_curve_by_connect( EntList: The list of created curves. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_curve_by_connect") - check_optional_type(curve1, EntList) + end1 = get_enum_value(end1, CurveInitPosition) - check_optional_type(curve2, EntList) + end2 = get_enum_value(end2, CurveInitPosition) check_type(factor, (int, float)) - check_optional_type(prop_set, Property) + result = self.modeler.CreateCurveByConnect( - coerce_optional_dispatch(curve1, "ent_list"), + check_and_coerce_optional(curve1, EntList), end1, - coerce_optional_dispatch(curve2, "ent_list"), + check_and_coerce_optional(curve2, EntList), end2, factor, - coerce_optional_dispatch(prop_set, "prop"), + check_and_coerce_optional(prop_set, Property), ) if result is None: return None @@ -389,12 +387,11 @@ def create_spline( EntList: The list of created splines. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spline") - check_optional_type(coord, VectorArray) - check_optional_type(prop_set, Property) + check_type(ends, bool) result = self.modeler.CreateSpline( - coerce_optional_dispatch(coord, "vector_array"), - coerce_optional_dispatch(prop_set, "prop"), + check_and_coerce_optional(coord, VectorArray), + check_and_coerce_optional(prop_set, Property), ends, ) if result is None: @@ -413,11 +410,11 @@ def break_curves(self, curve1: EntList | None, curve2: EntList | None) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="break_curves") - check_optional_type(curve1, EntList) - check_optional_type(curve2, EntList) + + return self.modeler.BreakCurves( - coerce_optional_dispatch(curve1, "ent_list"), - coerce_optional_dispatch(curve2, "ent_list"), + check_and_coerce_optional(curve1, EntList), + check_and_coerce_optional(curve2, EntList), ) def set_property(self, ents: EntList | None, prop_set: Property | None) -> bool: @@ -432,10 +429,9 @@ def set_property(self, ents: EntList | None, prop_set: Property | None) -> bool: bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_property") - check_optional_type(ents, EntList) - check_optional_type(prop_set, Property) + return self.modeler.SetProperty( - coerce_optional_dispatch(ents, "ent_list"), coerce_optional_dispatch(prop_set, "prop") + check_and_coerce_optional(ents, EntList), check_and_coerce_optional(prop_set, Property) ) def create_region_by_boundary( @@ -452,10 +448,9 @@ def create_region_by_boundary( EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_boundary") - check_optional_type(curve, EntList) - check_optional_type(prop_set, Property) + result = self.modeler.CreateRegionByBoundary( - coerce_optional_dispatch(curve, "ent_list"), coerce_optional_dispatch(prop_set, "prop") + check_and_coerce_optional(curve, EntList), check_and_coerce_optional(prop_set, Property) ) if result is None: return None @@ -473,10 +468,9 @@ def create_region_by_nodes(self, nodes: EntList | None, prop_set: Property | Non EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_nodes") - check_optional_type(nodes, EntList) - check_optional_type(prop_set, Property) + result = self.modeler.CreateRegionByNodes( - coerce_optional_dispatch(nodes, "ent_list"), coerce_optional_dispatch(prop_set, "prop") + check_and_coerce_optional(nodes, EntList), check_and_coerce_optional(prop_set, Property) ) if result is None: return None @@ -497,13 +491,11 @@ def create_region_by_ruling( EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_ruling") - check_optional_type(curve1, EntList) - check_optional_type(curve2, EntList) - check_optional_type(prop_set, Property) + result = self.modeler.CreateRegionByRuling( - coerce_optional_dispatch(curve1, "ent_list"), - coerce_optional_dispatch(curve2, "ent_list"), - coerce_optional_dispatch(prop_set, "prop"), + check_and_coerce_optional(curve1, EntList), + check_and_coerce_optional(curve2, EntList), + check_and_coerce_optional(prop_set, Property), ) if result is None: return None @@ -524,13 +516,11 @@ def create_region_by_extrusion( EntList: The list of created regions. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_region_by_extrusion") - check_optional_type(curve, EntList) - check_optional_type(direction, Vector) - check_optional_type(prop_set, Property) + result = self.modeler.CreateRegionByExtrusion( - coerce_optional_dispatch(curve, "ent_list"), - coerce_optional_dispatch(direction, "vector"), - coerce_optional_dispatch(prop_set, "prop"), + check_and_coerce_optional(curve, EntList), + check_and_coerce_optional(direction, Vector), + check_and_coerce_optional(prop_set, Property), ) if result is None: return None @@ -548,11 +538,11 @@ def create_hole_by_boundary(self, region: EntList | None, curve: EntList | None) bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_boundary") - check_optional_type(region, EntList) - check_optional_type(curve, EntList) + + return self.modeler.CreateHoleByBoundary( - coerce_optional_dispatch(region, "ent_list"), - coerce_optional_dispatch(curve, "ent_list"), + check_and_coerce_optional(region, EntList), + check_and_coerce_optional(curve, EntList), ) def create_hole_by_nodes(self, region: EntList | None, nodes: EntList | None) -> bool: @@ -567,11 +557,11 @@ def create_hole_by_nodes(self, region: EntList | None, nodes: EntList | None) -> bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_nodes") - check_optional_type(region, EntList) - check_optional_type(nodes, EntList) + + return self.modeler.CreateHoleByNodes( - coerce_optional_dispatch(region, "ent_list"), - coerce_optional_dispatch(nodes, "ent_list"), + check_and_coerce_optional(region, EntList), + check_and_coerce_optional(nodes, EntList), ) def create_hole_by_ruling( @@ -589,13 +579,13 @@ def create_hole_by_ruling( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_ruling") - check_optional_type(region, EntList) - check_optional_type(curve1, EntList) - check_optional_type(curve2, EntList) + + + return self.modeler.CreateHoleByRuling( - coerce_optional_dispatch(region, "ent_list"), - coerce_optional_dispatch(curve1, "ent_list"), - coerce_optional_dispatch(curve2, "ent_list"), + check_and_coerce_optional(region, EntList), + check_and_coerce_optional(curve1, EntList), + check_and_coerce_optional(curve2, EntList), ) def create_hole_by_extrusion( @@ -613,13 +603,11 @@ def create_hole_by_extrusion( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_extrusion") - check_optional_type(region, EntList) - check_optional_type(curve, EntList) - check_optional_type(direction, Vector) + return self.modeler.CreateHoleByExtrusion( - coerce_optional_dispatch(region, "ent_list"), - coerce_optional_dispatch(curve, "ent_list"), - coerce_optional_dispatch(direction, "vector"), + check_and_coerce_optional(region, EntList), + check_and_coerce_optional(curve, EntList), + check_and_coerce_optional(direction, Vector), ) # pylint: disable=R0913, R0917 @@ -645,15 +633,14 @@ def reflect( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="reflect") - check_optional_type(ent, EntList) - check_optional_type(reference, Vector) - check_optional_type(plane, Vector) + + check_type(copy, bool) check_type(merge, bool) return self.modeler.Reflect( - coerce_optional_dispatch(ent, "ent_list"), - coerce_optional_dispatch(reference, "vector"), - coerce_optional_dispatch(plane, "vector"), + check_and_coerce_optional(ent, EntList), + check_and_coerce_optional(reference, Vector), + check_and_coerce_optional(plane, Vector), copy, merge, ) @@ -682,15 +669,14 @@ def scale( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scale") - check_optional_type(ent, EntList) - check_optional_type(reference, Vector) - check_optional_type(scale, Vector) + + check_type(copy, bool) check_type(merge, bool) return self.modeler.Scale( - coerce_optional_dispatch(ent, "ent_list"), - coerce_optional_dispatch(reference, "vector"), - coerce_optional_dispatch(scale, "vector"), + check_and_coerce_optional(ent, EntList), + check_and_coerce_optional(reference, Vector), + check_and_coerce_optional(scale, Vector), copy, merge, ) @@ -719,15 +705,14 @@ def translate( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="translate") - check_optional_type(ent, EntList) - check_optional_type(translation, Vector) + check_type(copy, bool) check_type(num_copies, int) check_is_non_negative(num_copies) check_type(merge, bool) return self.modeler.Translate( - coerce_optional_dispatch(ent, "ent_list"), - coerce_optional_dispatch(translation, "vector"), + check_and_coerce_optional(ent, EntList), + check_and_coerce_optional(translation, Vector), copy, num_copies, merge, @@ -761,9 +746,8 @@ def rotate( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="rotate") - check_optional_type(ent, EntList) - check_optional_type(center, Vector) - check_optional_type(axis, Vector) + + check_type(angle, (int, float)) check_is_non_negative(angle) check_type(copy, bool) @@ -771,9 +755,9 @@ def rotate( check_is_non_negative(num_copies) check_type(merge, bool) return self.modeler.Rotate( - coerce_optional_dispatch(ent, "ent_list"), - coerce_optional_dispatch(center, "vector"), - coerce_optional_dispatch(axis, "vector"), + check_and_coerce_optional(ent, EntList), + check_and_coerce_optional(center, Vector), + check_and_coerce_optional(axis, Vector), angle, copy, num_copies, @@ -806,17 +790,16 @@ def rotate_3_pts( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="rotate_3_pts") - check_optional_type(ents, EntList) - check_optional_type(pt1, Vector) - check_optional_type(pt2, Vector) - check_optional_type(pt3, Vector) + + + check_type(copy, bool) check_type(merge, bool) return self.modeler.Rotate3Pts( - coerce_optional_dispatch(ents, "ent_list"), - coerce_optional_dispatch(pt1, "vector"), - coerce_optional_dispatch(pt2, "vector"), - coerce_optional_dispatch(pt3, "vector"), + check_and_coerce_optional(ents, EntList), + check_and_coerce_optional(pt1, Vector), + check_and_coerce_optional(pt2, Vector), + check_and_coerce_optional(pt3, Vector), copy, merge, ) @@ -836,13 +819,13 @@ def create_lcs_by_points( EntList: The created local coordinate system. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_lcs_by_points") - check_optional_type(coord1, Vector) - check_optional_type(coord2, Vector) - check_optional_type(coord3, Vector) + + + result = self.modeler.CreateLCSByPoints( - coerce_optional_dispatch(coord1, "vector"), - coerce_optional_dispatch(coord2, "vector"), - coerce_optional_dispatch(coord3, "vector"), + check_and_coerce_optional(coord1, Vector), + check_and_coerce_optional(coord2, Vector), + check_and_coerce_optional(coord3, Vector), ) if result is None: return None @@ -862,10 +845,10 @@ def activate_lcs(self, lcs: EntList | None, active: bool, lcs_type: LCSType | st bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="activate_lcs") - check_optional_type(lcs, EntList) + check_type(active, bool) lcs_type = get_enum_value(lcs_type, LCSType) - return self.modeler.ActivateLCS(coerce_optional_dispatch(lcs, "ent_list"), active, lcs_type) + return self.modeler.ActivateLCS(check_and_coerce_optional(lcs, EntList), active, lcs_type) def create_boundary_list(self) -> BoundaryList: """ @@ -907,19 +890,18 @@ def set_mesh_size( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_mesh_size") check_type(global_size, (int, float)) check_is_non_negative(global_size) - check_optional_type(ents, EntList) - check_optional_type(boundaries, BoundaryList) + check_type(size, (int, float)) check_is_positive(size) - check_optional_type(cad_bodies, EntList) + check_type(num_layer, int) check_is_non_negative(num_layer) return self.modeler.SetMeshSize2( global_size, - coerce_optional_dispatch(ents, "ent_list"), - coerce_optional_dispatch(boundaries, "boundary_list"), + check_and_coerce_optional(ents, EntList), + check_and_coerce_optional(boundaries, BoundaryList), size, - coerce_optional_dispatch(cad_bodies, "ent_list"), + check_and_coerce_optional(cad_bodies, EntList), num_layer, ) @@ -938,13 +920,12 @@ def scale_mesh_density( bool: True if the operation was successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scale_mesh_density") - check_optional_type(ents, EntList) - check_optional_type(boundaries, BoundaryList) + check_type(scale, (int, float)) check_is_positive(scale) return self.modeler.ScaleMeshDensity( - coerce_optional_dispatch(ents, "ent_list"), - coerce_optional_dispatch(boundaries, "boundary_list"), + check_and_coerce_optional(ents, EntList), + check_and_coerce_optional(boundaries, BoundaryList), scale, ) @@ -961,8 +942,8 @@ def modified_with_inventor_fusion(self, ents: EntList | None) -> int: process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="modified_with_inventor_fusion" ) - check_optional_type(ents, EntList) - return self.modeler.ModifiedWithInventorFusion(coerce_optional_dispatch(ents, "ent_list")) + + return self.modeler.ModifiedWithInventorFusion(check_and_coerce_optional(ents, EntList)) def is_inventor_fusion_cad_edit_done(self, job_id: int) -> bool: """ diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index b5308ce..85e0b2a 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -7,7 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch from .com_proxy import safe_com from .vector import Vector @@ -85,8 +85,8 @@ def origin(self, value: Vector | None) -> None: value (Vector): The new origin of the mold surface. """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="origin", value=value) - check_optional_type(value, Vector) - self.mold_surface_generator.Origin = coerce_optional_dispatch(value, "vector") + + self.mold_surface_generator.Origin = check_and_coerce_optional(value, Vector) @property def dimensions(self) -> Vector: @@ -112,8 +112,8 @@ def dimensions(self, value: Vector | None) -> None: value (Vector): The new dimensions of the mold surface. """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="dimensions", value=value) - check_optional_type(value, Vector) - self.mold_surface_generator.Dimensions = coerce_optional_dispatch(value, "vector") + + self.mold_surface_generator.Dimensions = check_and_coerce_optional(value, Vector) @property def save_as_cad(self) -> bool: diff --git a/src/moldflow/plot.py b/src/moldflow/plot.py index 434b8f2..2a6c51e 100644 --- a/src/moldflow/plot.py +++ b/src/moldflow/plot.py @@ -1073,8 +1073,8 @@ def add_xy_plot_curve(self, curve: EntList | None) -> None: curve (EntList): The curve to add. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_xy_plot_curve") - check_optional_type(curve, EntList) - self.plot.AddXYPlotCurve(coerce_optional_dispatch(curve, "ent_list")) + + self.plot.AddXYPlotCurve(check_and_coerce_optional(curve, EntList)) def delete_xy_plot_curve(self, curve: EntList | None) -> None: """ @@ -1084,8 +1084,8 @@ def delete_xy_plot_curve(self, curve: EntList | None) -> None: curve (EntList): The curve to delete. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_xy_plot_curve") - check_optional_type(curve, EntList) - self.plot.DeleteXYPlotCurve(coerce_optional_dispatch(curve, "ent_list")) + + self.plot.DeleteXYPlotCurve(check_and_coerce_optional(curve, EntList)) @property def edge_display(self) -> int: @@ -1165,8 +1165,8 @@ def apply_best_fit(self, nodes: EntList | None) -> bool: bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="apply_best_fit") - check_optional_type(nodes, EntList) - return self.plot.ApplyBestFit(coerce_optional_dispatch(nodes, "ent_list")) + + return self.plot.ApplyBestFit(check_and_coerce_optional(nodes, EntList)) @property def deflection_scale_factor(self) -> float: @@ -1346,9 +1346,9 @@ def warp_query_node(self, node_id: int, return_values: DoubleArray | None) -> bo process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="warp_query_node") check_type(node_id, int) check_is_non_negative(node_id) - check_optional_type(return_values, DoubleArray) + return self.plot.WarpQueryNode( - node_id, coerce_optional_dispatch(return_values, "double_array") + node_id, check_and_coerce_optional(return_values, DoubleArray) ) @property @@ -1381,12 +1381,12 @@ def get_probe_plot_probe_line( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_probe_plot_probe_line") check_type(index, int) check_is_non_negative(index) - check_optional_type(start_pt, Vector) - check_optional_type(end_pt, Vector) + + return self.plot.GetProbePlotProbeLine( index, - coerce_optional_dispatch(start_pt, "vector"), - coerce_optional_dispatch(end_pt, "vector"), + check_and_coerce_optional(start_pt, Vector), + check_and_coerce_optional(end_pt, Vector), ) def add_probe_plot_probe_line(self, start_pt: Vector | None, end_pt: Vector | None) -> bool: @@ -1401,10 +1401,10 @@ def add_probe_plot_probe_line(self, start_pt: Vector | None, end_pt: Vector | No bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_probe_plot_probe_line") - check_optional_type(start_pt, Vector) - check_optional_type(end_pt, Vector) + + return self.plot.AddProbePlotProbeLine( - coerce_optional_dispatch(start_pt, "vector"), coerce_optional_dispatch(end_pt, "vector") + check_and_coerce_optional(start_pt, Vector), check_and_coerce_optional(end_pt, Vector) ) def set_probe_plot_probe_line( @@ -1424,12 +1424,12 @@ def set_probe_plot_probe_line( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_probe_plot_probe_line") check_type(index, int) check_is_non_negative(index) - check_optional_type(start_pt, Vector) - check_optional_type(end_pt, Vector) + + return self.plot.SetProbePlotProbeLine( index, - coerce_optional_dispatch(start_pt, "vector"), - coerce_optional_dispatch(end_pt, "vector"), + check_and_coerce_optional(start_pt, Vector), + check_and_coerce_optional(end_pt, Vector), ) @property @@ -1747,8 +1747,8 @@ def single_color(self, value: Vector | None) -> None: value (Vector): single color to set as RGB vector. """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="single_color", value=value) - check_optional_type(value, Vector) - self.plot.SetSingleColor(coerce_optional_dispatch(value, "vector")) + + self.plot.SetSingleColor(check_and_coerce_optional(value, Vector)) def set_plot_nodes_from_string(self, nodes: str) -> None: """ @@ -1771,8 +1771,8 @@ def set_plot_nodes_from_ent_list(self, ent_list: EntList | None) -> None: process_log( __name__, LogMessage.FUNCTION_CALL, locals(), name="set_plot_nodes_from_ent_list" ) - check_optional_type(ent_list, EntList) - self.plot.SetPlotNodesFromEntList(coerce_optional_dispatch(ent_list, "ent_list")) + + self.plot.SetPlotNodesFromEntList(check_and_coerce_optional(ent_list, EntList)) def add_probe_plane(self, normal: str, point: str) -> bool: """ @@ -2477,7 +2477,7 @@ def shrinkage_compensation_estimated_shrinkage(self, value: Vector | None) -> No name="shrinkage_compensation_estimated_shrinkage", value=value, ) - check_optional_type(value, Vector) + self.plot.SetShrinkageCompensationEstimatedShrinkage( - coerce_optional_dispatch(value, "vector") + check_and_coerce_optional(value, Vector) ) diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index b1856e7..4b64094 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -16,7 +16,7 @@ from .material_plot import MaterialPlot from .user_plot import UserPlot from .common import MaterialDatabase, MaterialIndex, PlotType, SystemUnits -from .helper import check_type, check_optional_type, get_enum_value, check_file_extension, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_file_extension, coerce_optional_dispatch from .com_proxy import safe_com from .errors import raise_save_error from .constants import XML_FILE_EXT, SDZ_FILE_EXT, FBX_FILE_EXT, ELE_FILE_EXT @@ -207,14 +207,12 @@ def get_scalar_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_scalar_data") check_type(ds_id, int) - check_optional_type(indp_values, DoubleArray) - check_optional_type(ent_ids, IntegerArray) - check_optional_type(scalar_data, DoubleArray) + return self.plot_manager.GetScalarData( ds_id, - coerce_optional_dispatch(indp_values, "double_array"), - coerce_optional_dispatch(ent_ids, "integer_array"), - coerce_optional_dispatch(scalar_data, "double_array"), + check_and_coerce_optional(indp_values, DoubleArray), + check_and_coerce_optional(ent_ids, IntegerArray), + check_and_coerce_optional(scalar_data, DoubleArray), ) # pylint: disable-next=R0913, R0917 @@ -243,18 +241,16 @@ def get_vector_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_vector_data") check_type(ds_id, int) - check_optional_type(indp_values, DoubleArray) - check_optional_type(ent_ids, IntegerArray) - check_optional_type(va, DoubleArray) - check_optional_type(vb, DoubleArray) - check_optional_type(vc, DoubleArray) + + + return self.plot_manager.GetVectorData( ds_id, - coerce_optional_dispatch(indp_values, "double_array"), - coerce_optional_dispatch(ent_ids, "integer_array"), - coerce_optional_dispatch(va, "double_array"), - coerce_optional_dispatch(vb, "double_array"), - coerce_optional_dispatch(vc, "double_array"), + check_and_coerce_optional(indp_values, DoubleArray), + check_and_coerce_optional(ent_ids, IntegerArray), + check_and_coerce_optional(va, DoubleArray), + check_and_coerce_optional(vb, DoubleArray), + check_and_coerce_optional(vc, DoubleArray), ) # pylint: disable-next=R0913, R0917 @@ -289,24 +285,22 @@ def get_tensor_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_tensor_data") check_type(ds_id, int) - check_optional_type(indp_values, DoubleArray) - check_optional_type(ent_ids, IntegerArray) - check_optional_type(t11, DoubleArray) - check_optional_type(t22, DoubleArray) - check_optional_type(t33, DoubleArray) - check_optional_type(t12, DoubleArray) - check_optional_type(t13, DoubleArray) - check_optional_type(t23, DoubleArray) + + + + + + return self.plot_manager.GetTensorData( ds_id, - coerce_optional_dispatch(indp_values, "double_array"), - coerce_optional_dispatch(ent_ids, "integer_array"), - coerce_optional_dispatch(t11, "double_array"), - coerce_optional_dispatch(t22, "double_array"), - coerce_optional_dispatch(t33, "double_array"), - coerce_optional_dispatch(t12, "double_array"), - coerce_optional_dispatch(t13, "double_array"), - coerce_optional_dispatch(t23, "double_array"), + check_and_coerce_optional(indp_values, DoubleArray), + check_and_coerce_optional(ent_ids, IntegerArray), + check_and_coerce_optional(t11, DoubleArray), + check_and_coerce_optional(t22, DoubleArray), + check_and_coerce_optional(t33, DoubleArray), + check_and_coerce_optional(t12, DoubleArray), + check_and_coerce_optional(t13, DoubleArray), + check_and_coerce_optional(t23, DoubleArray), ) def get_non_mesh_data( @@ -325,12 +319,12 @@ def get_non_mesh_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_non_mesh_data") check_type(ds_id, int) - check_optional_type(indp_values, DoubleArray) - check_optional_type(non_mesh_data, DoubleArray) + + return self.plot_manager.GetNonmeshData( ds_id, - coerce_optional_dispatch(indp_values, "double_array"), - coerce_optional_dispatch(non_mesh_data, "double_array"), + check_and_coerce_optional(indp_values, DoubleArray), + check_and_coerce_optional(non_mesh_data, DoubleArray), ) def get_highlight_data( @@ -349,12 +343,12 @@ def get_highlight_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_highlight_data") check_type(ds_id, int) - check_optional_type(indp_values, DoubleArray) - check_optional_type(highlight_data, DoubleArray) + + return self.plot_manager.GetHighlightData( ds_id, - coerce_optional_dispatch(indp_values, "double_array"), - coerce_optional_dispatch(highlight_data, "double_array"), + check_and_coerce_optional(indp_values, DoubleArray), + check_and_coerce_optional(highlight_data, DoubleArray), ) def create_user_plot(self) -> UserPlot: @@ -434,9 +428,9 @@ def get_indp_values(self, ds_id: int, values: DoubleArray | None) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_indp_values") check_type(ds_id, int) - check_optional_type(values, DoubleArray) + return self.plot_manager.GetIndpValues( - ds_id, coerce_optional_dispatch(values, "double_array") + ds_id, check_and_coerce_optional(values, DoubleArray) ) def get_data_nb_components(self, ds_id: int) -> int: @@ -488,9 +482,9 @@ def find_dataset_ids_by_name(self, name: str, ds_ids: IntegerArray | None) -> in """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="find_dataset_ids_by_name") check_type(name, str) - check_optional_type(ds_ids, IntegerArray) + return self.plot_manager.FindDatasetIdsByName( - name, coerce_optional_dispatch(ds_ids, "integer_array") + name, check_and_coerce_optional(ds_ids, IntegerArray) ) def create_anchor_plane( @@ -723,9 +717,9 @@ def warp_query_node( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="warp_query_node") check_type(node_id, int) check_type(anchor_index, int) - check_optional_type(ret_values, DoubleArray) + return self.plot_manager.WarpQueryNode( - node_id, anchor_index, coerce_optional_dispatch(ret_values, "double_array") + node_id, anchor_index, check_and_coerce_optional(ret_values, DoubleArray) ) def warp_query_begin(self, ds_id: int, indp_values: DoubleArray | None) -> bool: @@ -741,9 +735,9 @@ def warp_query_begin(self, ds_id: int, indp_values: DoubleArray | None) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="warp_query_begin") check_type(ds_id, int) - check_optional_type(indp_values, DoubleArray) + return self.plot_manager.WarpQueryBegin( - ds_id, coerce_optional_dispatch(indp_values, "double_array") + ds_id, check_and_coerce_optional(indp_values, DoubleArray) ) def export_to_sdz(self, file_name: str) -> bool: @@ -935,16 +929,16 @@ def fbx_export( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="fbx_export") check_type(file_name, str) file_name = check_file_extension(file_name, FBX_FILE_EXT) - check_optional_type(geo_list, EntList) - check_optional_type(mesh_list, EntList) + + check_type(export_type, int) check_type(wp_scale_factor, (float, int)) check_type(sm_scale_factor, (float, int)) unit_sys = get_enum_value(unit_sys, SystemUnits) result = self.plot_manager.FBXExport( file_name, - coerce_optional_dispatch(geo_list, "ent_list"), - coerce_optional_dispatch(mesh_list, "ent_list"), + check_and_coerce_optional(geo_list, EntList), + check_and_coerce_optional(mesh_list, EntList), export_type, wp_scale_factor, sm_scale_factor, diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index 12a48d9..bf0eea0 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -9,7 +9,7 @@ from .predicate import Predicate from .double_array import DoubleArray from .common import CrossSectionType, LogMessage -from .helper import check_type, check_optional_type, get_enum_value, check_range, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_range, coerce_optional_dispatch from .com_proxy import safe_com from .logger import process_log @@ -117,11 +117,11 @@ def create_bool_and_predicate( Predicate: The created AND predicate. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_and_predicate") - check_optional_type(predicate1, Predicate) - check_optional_type(predicate2, Predicate) + + result = self.predicate_manager.CreateBoolAndPredicate( - coerce_optional_dispatch(predicate1, "predicate"), - coerce_optional_dispatch(predicate2, "predicate"), + check_and_coerce_optional(predicate1, Predicate), + check_and_coerce_optional(predicate2, Predicate), ) if result is None: @@ -143,11 +143,11 @@ def create_bool_or_predicate( Predicate: The created OR predicate """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_or_predicate") - check_optional_type(predicate1, Predicate) - check_optional_type(predicate2, Predicate) + + result = self.predicate_manager.CreateBoolOrPredicate( - coerce_optional_dispatch(predicate1, "predicate"), - coerce_optional_dispatch(predicate2, "predicate"), + check_and_coerce_optional(predicate1, Predicate), + check_and_coerce_optional(predicate2, Predicate), ) if result is None: return None @@ -165,9 +165,9 @@ def create_bool_not_predicate(self, predicate: Predicate | None) -> Predicate: Predicate: The created NOT predicate. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_not_predicate") - check_optional_type(predicate, Predicate) + result = self.predicate_manager.CreateBoolNotPredicate( - coerce_optional_dispatch(predicate, "predicate") + check_and_coerce_optional(predicate, Predicate) ) if result is None: return None @@ -188,11 +188,11 @@ def create_bool_xor_predicate( Predicate: The created XOR predicate. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_xor_predicate") - check_optional_type(predicate1, Predicate) - check_optional_type(predicate2, Predicate) + + result = self.predicate_manager.CreateBoolXorPredicate( - coerce_optional_dispatch(predicate1, "predicate"), - coerce_optional_dispatch(predicate2, "predicate"), + check_and_coerce_optional(predicate1, Predicate), + check_and_coerce_optional(predicate2, Predicate), ) if result is None: @@ -234,12 +234,12 @@ def create_x_section_predicate( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_x_section_predicate") cross_section = get_enum_value(cross_section, CrossSectionType) - check_optional_type(min_value, DoubleArray) - check_optional_type(max_value, DoubleArray) + + result = self.predicate_manager.CreateXSectionPredicate( cross_section, - coerce_optional_dispatch(min_value, "double_array"), - coerce_optional_dispatch(max_value, "double_array"), + check_and_coerce_optional(min_value, DoubleArray), + check_and_coerce_optional(max_value, DoubleArray), ) if result is None: diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index aa5381e..78f6b60 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -9,7 +9,7 @@ from .double_array import DoubleArray from .string_array import StringArray from .logger import process_log -from .helper import check_type, check_optional_type, check_is_non_negative, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com from .common import LogMessage @@ -209,8 +209,8 @@ def set_field_values(self, field_id: int, values: DoubleArray | None) -> None: process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_field_values") check_type(field_id, int) check_is_non_negative(field_id) - check_optional_type(values, DoubleArray) - self.prop.SetFieldValues(field_id, coerce_optional_dispatch(values, "double_array")) + + self.prop.SetFieldValues(field_id, check_and_coerce_optional(values, DoubleArray)) def field_units(self, field_id: int) -> StringArray: """ diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index 04245bb..4f44156 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -9,7 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .prop import Property -from .helper import get_enum_value, check_type, check_optional_type, coerce_optional_dispatch +from .helper import get_enum_value, check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType @@ -116,10 +116,9 @@ def set_property(self, entities: EntList | None, prop: Property | None) -> bool: bool: True if the property was assigned successfully, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_property") - check_optional_type(entities, EntList) - check_optional_type(prop, Property) + return self.property_editor.SetProperty( - coerce_optional_dispatch(entities, "ent_list"), coerce_optional_dispatch(prop, "prop") + check_and_coerce_optional(entities, EntList), check_and_coerce_optional(prop, Property) ) def create_entity_list(self) -> EntList: @@ -210,8 +209,8 @@ def get_next_property(self, prop: Property | None) -> Property: Property: The next property in the list. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_property") - check_optional_type(prop, Property) - result = self.property_editor.GetNextProperty(coerce_optional_dispatch(prop, "prop")) + + result = self.property_editor.GetNextProperty(check_and_coerce_optional(prop, Property)) if result is None: return None return Property(result) @@ -227,8 +226,8 @@ def get_next_property_of_type(self, prop: Property | None) -> Property: Property: The next property of the same type. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_property_of_type") - check_optional_type(prop, Property) - result = self.property_editor.GetNextPropertyOfType(coerce_optional_dispatch(prop, "prop")) + + result = self.property_editor.GetNextPropertyOfType(check_and_coerce_optional(prop, Property)) if result is None: return None return Property(result) @@ -244,9 +243,9 @@ def get_entity_property(self, entities: EntList | None) -> Property: Property: The property of the entities. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_property") - check_optional_type(entities, EntList) + prop = self.property_editor.GetEntityProperty( - coerce_optional_dispatch(entities, "ent_list") + check_and_coerce_optional(entities, EntList) ) if prop is None: return None diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index 711bdb2..4cc06b8 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -155,8 +155,8 @@ def selection(self, value: EntList | None) -> None: Set selection """ process_log(__name__, LogMessage.PROPERTY_SET, locals(), name="selection", value=value) - check_optional_type(value, EntList) - self.study_doc.Selection = coerce_optional_dispatch(value, "ent_list") + + self.study_doc.Selection = check_and_coerce_optional(value, EntList) @property def number_of_analyses(self) -> int: @@ -312,8 +312,8 @@ def get_next_node(self, node: EntList | None) -> EntList: EntList: The next node in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_node") - check_optional_type(node, EntList) - result = self.study_doc.GetNextNode(coerce_optional_dispatch(node, "ent_list")) + + result = self.study_doc.GetNextNode(check_and_coerce_optional(node, EntList)) if result is None: return None return EntList(result) @@ -329,8 +329,8 @@ def get_node_coord(self, node: EntList | None) -> Vector: Vector: The coordinates of the node """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_node_coord") - check_optional_type(node, EntList) - result = self.study_doc.GetNodeCoord(coerce_optional_dispatch(node, "ent_list")) + + result = self.study_doc.GetNodeCoord(check_and_coerce_optional(node, EntList)) if result is None: return None return Vector(result) @@ -359,8 +359,8 @@ def get_next_tri(self, tri: EntList | None) -> EntList: EntList: The next triangle in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_tri") - check_optional_type(tri, EntList) - result = self.study_doc.GetNextTri(coerce_optional_dispatch(tri, "ent_list")) + + result = self.study_doc.GetNextTri(check_and_coerce_optional(tri, EntList)) if result is None: return None return EntList(result) @@ -389,8 +389,8 @@ def get_next_beam(self, beam: EntList | None) -> EntList: EntList: The next beam in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_beam") - check_optional_type(beam, EntList) - result = self.study_doc.GetNextBeam(coerce_optional_dispatch(beam, "ent_list")) + + result = self.study_doc.GetNextBeam(check_and_coerce_optional(beam, EntList)) if result is None: return None return EntList(result) @@ -419,8 +419,8 @@ def get_next_tet(self, tet: EntList | None) -> EntList: EntList: The next tetrahedral element in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_tet") - check_optional_type(tet, EntList) - result = self.study_doc.GetNextTet(coerce_optional_dispatch(tet, "ent_list")) + + result = self.study_doc.GetNextTet(check_and_coerce_optional(tet, EntList)) if result is None: return None return EntList(result) @@ -436,8 +436,8 @@ def get_elem_nodes(self, elem: EntList | None) -> EntList: EntList: The nodes of the element """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_elem_nodes") - check_optional_type(elem, EntList) - result = self.study_doc.GetElemNodes(coerce_optional_dispatch(elem, "ent_list")) + + result = self.study_doc.GetElemNodes(check_and_coerce_optional(elem, EntList)) if result is None: return None return EntList(result) @@ -453,8 +453,8 @@ def get_entity_layer(self, ent: EntList | None) -> EntList: EntList: The layer of the entity """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_layer") - check_optional_type(ent, EntList) - result = self.study_doc.GetEntityLayer(coerce_optional_dispatch(ent, "ent_list")) + + result = self.study_doc.GetEntityLayer(check_and_coerce_optional(ent, EntList)) if result is None: return None return EntList(result) @@ -470,8 +470,8 @@ def get_entity_id(self, ent: EntList | None) -> int: int: The ID of the entity """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_id") - check_optional_type(ent, EntList) - return self.study_doc.GetEntityID(coerce_optional_dispatch(ent, "ent_list")) + + return self.study_doc.GetEntityID(check_and_coerce_optional(ent, EntList)) def get_first_curve(self) -> EntList: """ @@ -497,8 +497,8 @@ def get_next_curve(self, curve: EntList | None) -> EntList: EntList: The next curve in the study """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_curve") - check_optional_type(curve, EntList) - result = self.study_doc.GetNextCurve(coerce_optional_dispatch(curve, "ent_list")) + + result = self.study_doc.GetNextCurve(check_and_coerce_optional(curve, EntList)) if result is None: return None return EntList(result) @@ -515,11 +515,11 @@ def get_curve_point(self, curve: EntList | None, pos_curve: float) -> Vector: Vector: The point on the curve """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_curve_point") - check_optional_type(curve, EntList) + check_type(pos_curve, (int, float)) check_range(pos_curve, 0, 1, True, True) result = self.study_doc.GetCurvePoint( - coerce_optional_dispatch(curve, "ent_list"), pos_curve + check_and_coerce_optional(curve, EntList), pos_curve ) if result is None: return None diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index be1079d..d18491b 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -10,7 +10,7 @@ from .double_array import DoubleArray from .common import SystemUnits from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, get_enum_value, check_is_non_negative, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com @@ -50,13 +50,12 @@ def get_data_message( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_data_message") check_type(msgid, int) - check_optional_type(preset_text, StringArray) - check_optional_type(preset_vals, DoubleArray) + check_is_non_negative(msgid) unit_sys = get_enum_value(unit_sys, SystemUnits) return self.system_message.GetDataMessage( msgid, - coerce_optional_dispatch(preset_text, "string_array"), - coerce_optional_dispatch(preset_vals, "double_array"), + check_and_coerce_optional(preset_text, StringArray), + check_and_coerce_optional(preset_vals, DoubleArray), unit_sys, ) diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index 957220b..33d163d 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -6,7 +6,7 @@ UserPlot Class API Wrapper """ -from .helper import check_type, check_optional_type, get_enum_value, coerce_optional_dispatch +from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com from .logger import process_log from .common import ( @@ -123,12 +123,11 @@ def add_scalar_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_scalar_data") check_type(indp_val, (int, float)) - check_optional_type(element_id, IntegerArray) - check_optional_type(data, DoubleArray) + return self.user_plot.AddScalarData( indp_val, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(data, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(data, DoubleArray), ) # pylint: disable=R0913, R0917 @@ -155,16 +154,15 @@ def add_vector_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_vector_data") check_type(indp_val, (int, float)) - check_optional_type(element_id, IntegerArray) - check_optional_type(vx, DoubleArray) - check_optional_type(vy, DoubleArray) - check_optional_type(vz, DoubleArray) + + + return self.user_plot.AddVectorData( indp_val, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(vx, "double_array"), - coerce_optional_dispatch(vy, "double_array"), - coerce_optional_dispatch(vz, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(vx, DoubleArray), + check_and_coerce_optional(vy, DoubleArray), + check_and_coerce_optional(vz, DoubleArray), ) # pylint: disable=R0913, R0917 @@ -197,22 +195,21 @@ def add_tensor_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_tensor_data") check_type(indp_val, (int, float)) - check_optional_type(element_id, IntegerArray) - check_optional_type(t_11, DoubleArray) - check_optional_type(t_22, DoubleArray) - check_optional_type(t_33, DoubleArray) - check_optional_type(t_12, DoubleArray) - check_optional_type(t_13, DoubleArray) - check_optional_type(t_23, DoubleArray) + + + + + + return self.user_plot.AddTensorData( indp_val, - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(t_11, "double_array"), - coerce_optional_dispatch(t_22, "double_array"), - coerce_optional_dispatch(t_33, "double_array"), - coerce_optional_dispatch(t_12, "double_array"), - coerce_optional_dispatch(t_13, "double_array"), - coerce_optional_dispatch(t_23, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(t_11, DoubleArray), + check_and_coerce_optional(t_22, DoubleArray), + check_and_coerce_optional(t_33, DoubleArray), + check_and_coerce_optional(t_12, DoubleArray), + check_and_coerce_optional(t_13, DoubleArray), + check_and_coerce_optional(t_23, DoubleArray), ) def build(self) -> Plot: @@ -265,11 +262,10 @@ def set_scalar_data(self, element_id: IntegerArray | None, data: DoubleArray | N bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_scalar_data") - check_optional_type(element_id, IntegerArray) - check_optional_type(data, DoubleArray) + return self.user_plot.SetScalarData( - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(data, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(data, DoubleArray), ) def set_vector_data( @@ -292,15 +288,14 @@ def set_vector_data( bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_vector_data") - check_optional_type(element_id, IntegerArray) - check_optional_type(vx, DoubleArray) - check_optional_type(vy, DoubleArray) - check_optional_type(vz, DoubleArray) + + + return self.user_plot.SetVectorData( - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(vx, "double_array"), - coerce_optional_dispatch(vy, "double_array"), - coerce_optional_dispatch(vz, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(vx, DoubleArray), + check_and_coerce_optional(vy, DoubleArray), + check_and_coerce_optional(vz, DoubleArray), ) # pylint: disable=R0913, R0917 @@ -330,21 +325,20 @@ def set_tensor_data( bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_tensor_data") - check_optional_type(element_id, IntegerArray) - check_optional_type(t_11, DoubleArray) - check_optional_type(t_22, DoubleArray) - check_optional_type(t_33, DoubleArray) - check_optional_type(t_12, DoubleArray) - check_optional_type(t_13, DoubleArray) - check_optional_type(t_23, DoubleArray) + + + + + + return self.user_plot.SetTensorData( - coerce_optional_dispatch(element_id, "integer_array"), - coerce_optional_dispatch(t_11, "double_array"), - coerce_optional_dispatch(t_22, "double_array"), - coerce_optional_dispatch(t_33, "double_array"), - coerce_optional_dispatch(t_12, "double_array"), - coerce_optional_dispatch(t_13, "double_array"), - coerce_optional_dispatch(t_23, "double_array"), + check_and_coerce_optional(element_id, IntegerArray), + check_and_coerce_optional(t_11, DoubleArray), + check_and_coerce_optional(t_22, DoubleArray), + check_and_coerce_optional(t_33, DoubleArray), + check_and_coerce_optional(t_12, DoubleArray), + check_and_coerce_optional(t_13, DoubleArray), + check_and_coerce_optional(t_23, DoubleArray), ) def add_xy_plot_data( @@ -363,12 +357,12 @@ def add_xy_plot_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_xy_plot_data") check_type(indp_val, (int, float)) - check_optional_type(x_value, DoubleArray) - check_optional_type(y_value, DoubleArray) + + return self.user_plot.AddXYPlotData( indp_val, - coerce_optional_dispatch(x_value, "double_array"), - coerce_optional_dispatch(y_value, "double_array"), + check_and_coerce_optional(x_value, DoubleArray), + check_and_coerce_optional(y_value, DoubleArray), ) def set_xy_plot_data(self, x_value: DoubleArray | None, y_value: DoubleArray | None) -> bool: @@ -383,11 +377,11 @@ def set_xy_plot_data(self, x_value: DoubleArray | None, y_value: DoubleArray | N bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_xy_plot_data") - check_optional_type(x_value, DoubleArray) - check_optional_type(y_value, DoubleArray) + + return self.user_plot.SetXYPlotData( - coerce_optional_dispatch(x_value, "double_array"), - coerce_optional_dispatch(y_value, "double_array"), + check_and_coerce_optional(x_value, DoubleArray), + check_and_coerce_optional(y_value, DoubleArray), ) def set_xy_plot_x_unit_name(self, unit_name: str) -> bool: @@ -443,8 +437,8 @@ def set_highlight_data(self, values: DoubleArray | None) -> bool: bool: True if successful, False otherwise. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_highlight_data") - check_optional_type(values, DoubleArray) - return self.user_plot.SetHighlightData(coerce_optional_dispatch(values, "double_array")) + + return self.user_plot.SetHighlightData(check_and_coerce_optional(values, DoubleArray)) def build_weldline_plot(self, plot_name: str, max_angle: float, for_overmolding: bool) -> Plot: """ diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index 5c7010c..19b9870 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -77,11 +77,11 @@ def reset_view(self, normal_view: Vector | None, up_view: Vector | None) -> None up_view (Vector | None): The up view vector. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="reset_view") - check_optional_type(normal_view, Vector) - check_optional_type(up_view, Vector) + + self.viewer.ResetView( - coerce_optional_dispatch(normal_view, "vector"), - coerce_optional_dispatch(up_view, "vector"), + check_and_coerce_optional(normal_view, Vector), + check_and_coerce_optional(up_view, Vector), ) def rotate(self, angle_x: float, angle_y: float, angle_z: float) -> None: @@ -477,10 +477,10 @@ def add_bookmark( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_bookmark") check_type(name, str) - check_optional_type(normal_view, Vector) - check_optional_type(up_view, Vector) - check_optional_type(focal_point, Vector) - check_optional_type(eye_position, Vector) + + + + check_type(clipping_range_min, (int, float)) check_is_non_negative(clipping_range_min) check_type(clipping_range_max, (int, float)) @@ -489,10 +489,10 @@ def add_bookmark( check_type(parallel_scale, (int, float)) self.viewer.AddBookmark( name, - coerce_optional_dispatch(normal_view, "vector"), - coerce_optional_dispatch(up_view, "vector"), - coerce_optional_dispatch(focal_point, "vector"), - coerce_optional_dispatch(eye_position, "vector"), + check_and_coerce_optional(normal_view, Vector), + check_and_coerce_optional(up_view, Vector), + check_and_coerce_optional(focal_point, Vector), + check_and_coerce_optional(eye_position, Vector), clipping_range_min, clipping_range_max, view_angle, @@ -575,8 +575,8 @@ def world_to_display(self, world_coord: Vector | None) -> Vector: Vector: The converted display coordinates. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="world_to_display") - check_optional_type(world_coord, Vector) - result = self.viewer.WorldToDisplay(coerce_optional_dispatch(world_coord, "vector")) + + result = self.viewer.WorldToDisplay(check_and_coerce_optional(world_coord, Vector)) if result is None: return None return Vector(result) @@ -593,10 +593,10 @@ def create_clipping_plane(self, normal: Vector | None, distance: float) -> EntLi EntList: Object containing created clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_clipping_plane") - check_optional_type(normal, Vector) + check_type(distance, (int, float)) result = self.viewer.CreateClippingPlane( - coerce_optional_dispatch(normal, "vector"), distance + check_and_coerce_optional(normal, Vector), distance ) if result is None: return None @@ -629,12 +629,11 @@ def modify_clipping_plane( distance (float): The new distance from the origin to the clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="modify_clipping_plane") - check_optional_type(plane, EntList) - check_optional_type(normal, Vector) + check_type(distance, (int, float)) self.viewer.ModifyClippingPlane( - coerce_optional_dispatch(plane, "ent_list"), - coerce_optional_dispatch(normal, "vector"), + check_and_coerce_optional(plane, EntList), + check_and_coerce_optional(normal, Vector), distance, ) @@ -653,10 +652,10 @@ def modify_clipping_plane_by_id( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_clipping_plane_by_id" ) check_type(plane_id, int) - check_optional_type(normal, Vector) + check_type(distance, (int, float)) self.viewer.ModifyClippingPlaneByID( - plane_id, coerce_optional_dispatch(normal, "vector"), distance + plane_id, check_and_coerce_optional(normal, Vector), distance ) def delete_clipping_plane(self, plane: EntList | None) -> None: @@ -667,8 +666,8 @@ def delete_clipping_plane(self, plane: EntList | None) -> None: plane (EntList | None): The clipping plane to delete. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="delete_clipping_plane") - check_optional_type(plane, EntList) - self.viewer.DeleteClippingPlane(coerce_optional_dispatch(plane, "ent_list")) + + self.viewer.DeleteClippingPlane(check_and_coerce_optional(plane, EntList)) def get_first_clipping_plane(self) -> EntList: """ @@ -694,8 +693,8 @@ def get_next_clipping_plane(self, plane: EntList | None) -> EntList: EntList: The next clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_clipping_plane") - check_optional_type(plane, EntList) - result = self.viewer.GetNextClippingPlane(coerce_optional_dispatch(plane, "ent_list")) + + result = self.viewer.GetNextClippingPlane(check_and_coerce_optional(plane, EntList)) if result is None: return None return EntList(result) @@ -709,9 +708,9 @@ def enable_clipping_plane(self, plane: EntList | None, enable: bool) -> None: enable (bool): Whether to enable or disable the clipping plane. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="enable_clipping_plane") - check_optional_type(plane, EntList) + check_type(enable, bool) - self.viewer.EnableClippingPlane(coerce_optional_dispatch(plane, "ent_list"), enable) + self.viewer.EnableClippingPlane(check_and_coerce_optional(plane, EntList), enable) @property def active_clipping_plane(self) -> EntList: @@ -736,8 +735,8 @@ def active_clipping_plane(self, plane: EntList | None) -> None: plane: The clipping plane to set as active. """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_active_clipping_plane") - check_optional_type(plane, EntList) - self.viewer.SetActiveClippingPlane(coerce_optional_dispatch(plane, "ent_list")) + + self.viewer.SetActiveClippingPlane(check_and_coerce_optional(plane, EntList)) def show_plot_frame(self, plot: Plot | None, frame: int) -> None: """ diff --git a/tests/core/test_helper.py b/tests/core/test_helper.py index 1d3c1ea..45c5c03 100644 --- a/tests/core/test_helper.py +++ b/tests/core/test_helper.py @@ -19,6 +19,7 @@ check_min_max, check_type, check_optional_type, + check_and_coerce_optional, check_range, check_expected_values, get_enum_value, @@ -369,3 +370,59 @@ def test_check_optional_type_invalid(self, value, types, _): with pytest.raises(TypeError) as e: check_optional_type(value, types) assert _("Invalid") in str(e.value) + + @pytest.mark.parametrize("value", [None, 42, 3.14, "test"]) + def test_check_and_coerce_optional_primitives(self, value, _, caplog): + """ + Test check_and_coerce_optional with primitive types. + For primitives (int, float, str), the function should return the value as-is. + """ + if value is None: + result = check_and_coerce_optional(value, int) + # For None, should return a VARIANT null dispatch + assert result is not None # Returns a VARIANT object + elif isinstance(value, int): + result = check_and_coerce_optional(value, int) + assert result == value + assert _("Valid") in caplog.text + elif isinstance(value, float): + result = check_and_coerce_optional(value, float) + assert result == value + assert _("Valid") in caplog.text + elif isinstance(value, str): + result = check_and_coerce_optional(value, str) + assert result == value + assert _("Valid") in caplog.text + + def test_check_and_coerce_optional_com_object(self, _): + """ + Test check_and_coerce_optional with a mock COM object. + For COM objects, the function should unwrap the internal attribute. + """ + # Create a mock COM object that mimics EntList + mock_ent_list = Mock() + mock_ent_list.__class__.__name__ = 'EntList' + mock_internal = Mock() + mock_ent_list.ent_list = mock_internal + + # The function should validate the type and return the internal attribute + result = check_and_coerce_optional(mock_ent_list, type(mock_ent_list)) + assert result == mock_internal + + def test_check_and_coerce_optional_none_com_object(self, _): + """ + Test check_and_coerce_optional with None for a COM object type. + Should return a VARIANT null dispatch. + """ + mock_type = type('EntList', (), {}) + result = check_and_coerce_optional(None, mock_type) + # Should return a VARIANT object, not None + assert result is not None + + def test_check_and_coerce_optional_invalid_type(self, _): + """ + Test check_and_coerce_optional with invalid type. + """ + with pytest.raises(TypeError) as e: + check_and_coerce_optional("string", int) + assert _("Invalid") in str(e.value) From 7eea883b029132a47a8428dcda9aa4d15f082a3f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:40:28 +0000 Subject: [PATCH 06/14] Clean up extra blank lines from refactoring Co-authored-by: sankalps0549 <230025240+sankalps0549@users.noreply.github.com> --- src/moldflow/boundary_conditions.py | 17 -------- src/moldflow/boundary_list.py | 1 - src/moldflow/cad_manager.py | 2 - src/moldflow/circuit_generator.py | 1 - src/moldflow/com_proxy.py | 7 ---- src/moldflow/common.py | 58 -------------------------- src/moldflow/data_transform.py | 1 - src/moldflow/diagnosis_manager.py | 1 - src/moldflow/double_array.py | 1 - src/moldflow/ent_list.py | 1 - src/moldflow/errors.py | 7 ---- src/moldflow/exceptions.py | 2 - src/moldflow/folder_manager.py | 2 - src/moldflow/helper.py | 18 -------- src/moldflow/i18n.py | 3 -- src/moldflow/import_options.py | 1 - src/moldflow/integer_array.py | 1 - src/moldflow/layer_manager.py | 2 - src/moldflow/localization.py | 2 - src/moldflow/logger.py | 5 --- src/moldflow/material_finder.py | 1 - src/moldflow/material_plot.py | 1 - src/moldflow/material_selector.py | 1 - src/moldflow/mesh_editor.py | 19 --------- src/moldflow/mesh_generator.py | 1 - src/moldflow/mesh_summary.py | 1 - src/moldflow/message_box.py | 11 ----- src/moldflow/model_duplicator.py | 1 - src/moldflow/modeler.py | 18 -------- src/moldflow/mold_surface_generator.py | 1 - src/moldflow/plot.py | 4 -- src/moldflow/plot_manager.py | 11 ----- src/moldflow/predicate.py | 1 - src/moldflow/predicate_manager.py | 5 --- src/moldflow/project.py | 1 - src/moldflow/prop.py | 1 - src/moldflow/property_editor.py | 1 - src/moldflow/runner_generator.py | 1 - src/moldflow/server.py | 1 - src/moldflow/string_array.py | 1 - src/moldflow/study_doc.py | 1 - src/moldflow/synergy.py | 1 - src/moldflow/system_message.py | 1 - src/moldflow/unit_conversion.py | 1 - src/moldflow/user_plot.py | 17 -------- src/moldflow/vector.py | 1 - src/moldflow/vector_array.py | 1 - src/moldflow/version_check.py | 9 ---- src/moldflow/viewer.py | 5 --- 49 files changed, 252 deletions(-) diff --git a/src/moldflow/boundary_conditions.py b/src/moldflow/boundary_conditions.py index 2b30c67..d39ccc6 100644 --- a/src/moldflow/boundary_conditions.py +++ b/src/moldflow/boundary_conditions.py @@ -15,7 +15,6 @@ from .vector import Vector from .prop import Property - class BoundaryConditions: """ Wrapper for BoundaryConditions class of Moldflow Synergy. @@ -164,7 +163,6 @@ def create_spring_constraints( analysis = get_enum_value(analysis, AnalysisType) - return self.boundary_conditions.CreateSpringConstraints( check_and_coerce_optional(nodes, EntList), analysis, @@ -194,7 +192,6 @@ def create_core_shift_spring_constraints( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_spring_constraints") - check_type(retract_time, (float, int)) return self.boundary_conditions.CreateSpringConstraints2( check_and_coerce_optional(nodes, EntList), @@ -229,9 +226,6 @@ def create_general_constraints( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_general_constraints") - - - analysis = get_enum_value(analysis, AnalysisType) trans_types = self._check_vector(trans_types) rotation_types = self._check_vector(rotation_types) @@ -276,9 +270,6 @@ def create_core_shift_general_constraints( name="create_core_shift_general_constraints", ) - - - check_type(retract_time, (int, float)) trans_types = self._check_vector(trans_types) rotation_types = self._check_vector(rotation_types) @@ -307,7 +298,6 @@ def create_nodal_loads( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodal_loads") - return self.boundary_conditions.CreateNodalLoads( check_and_coerce_optional(nodes, EntList), check_and_coerce_optional(force, Vector), @@ -420,7 +410,6 @@ def create_critical_dimension( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_critical_dimension") - check_type(upper, (float, int)) check_type(lower, (float, int)) return self.boundary_conditions.CreateCriticalDimension( @@ -448,7 +437,6 @@ def create_doe_critical_dimension( __name__, LogMessage.FUNCTION_CALL, locals(), name="create_doe_critical_dimension" ) - check_type(name, str) return self.boundary_conditions.CreateDoeCriticalDimension( check_and_coerce_optional(node1, EntList), @@ -507,7 +495,6 @@ def create_ndbc_at_xyz( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_ndbc_at_xyz") - check_type(prop_type, int) prop_disp = check_and_coerce_optional(prop, Property) @@ -557,7 +544,6 @@ def move_ndbc_to_xyz( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_ndbc_to_xyz") - return self.boundary_conditions.MoveNDBCToXYZ( check_and_coerce_optional(ndbc, EntList), check_and_coerce_optional(coord, Vector), @@ -628,9 +614,6 @@ def create_one_sided_constraints( __name__, LogMessage.FUNCTION_CALL, locals(), name="create_one_sided_constraints" ) - - - if retract_time != 0: check_type(retract_time, (float, int)) positive_trans_types = self._check_vector(positive_trans_types) diff --git a/src/moldflow/boundary_list.py b/src/moldflow/boundary_list.py index 78a09f4..b0364e9 100644 --- a/src/moldflow/boundary_list.py +++ b/src/moldflow/boundary_list.py @@ -11,7 +11,6 @@ from .logger import process_log from .common import LogMessage - class BoundaryList: """ Wrapper for BoundaryList class of Moldflow Synergy. diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index 38ebaf0..25474e6 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -12,7 +12,6 @@ from .helper import check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch from .com_proxy import safe_com - class CADManager: """ Wrapper for CADManager class of Moldflow Synergy. @@ -61,7 +60,6 @@ def modify_cad_surfaces_by_normal( __name__, LogMessage.FUNCTION_CALL, locals(), name="modify_cad_surfaces_by_normal" ) - check_type(distance, (float, int)) return self.cad_manager.ModifyCADSurfacesByNormal( check_and_coerce_optional(faces, EntList), diff --git a/src/moldflow/circuit_generator.py b/src/moldflow/circuit_generator.py index 5ab77cb..47af098 100644 --- a/src/moldflow/circuit_generator.py +++ b/src/moldflow/circuit_generator.py @@ -10,7 +10,6 @@ from .helper import check_type from .com_proxy import safe_com - class CircuitGenerator: """ Wrapper for CircuitGenerator class of Moldflow Synergy. diff --git a/src/moldflow/com_proxy.py b/src/moldflow/com_proxy.py index 9c10aea..f7e0ea7 100644 --- a/src/moldflow/com_proxy.py +++ b/src/moldflow/com_proxy.py @@ -13,12 +13,10 @@ from .common import LogMessage from .errors import raise_attribute_error - # ------------------------------------------------------------------ # Helper: Verify COM attribute existence # ------------------------------------------------------------------ - def _verify_com_attribute(obj, attribute: str): """ Raise *AttributeError* if *attribute* is not present on *obj*. @@ -35,7 +33,6 @@ def _verify_com_attribute(obj, attribute: str): raise_attribute_error(attribute) process_log(__name__, LogMessage.VALID_INPUT) - class SafeCOMProxy: """Lightweight proxy around a COM object that validates attribute access. @@ -115,7 +112,6 @@ def __hash__(self): """ return hash(self._com) - def safe_com(obj): """ Return a *SafeCOMProxy* wrapping *obj* if it isn’t already wrapped. @@ -125,12 +121,10 @@ def safe_com(obj): """ return obj if isinstance(obj, SafeCOMProxy) else SafeCOMProxy(obj) - # ------------------------------------------------------------------ # Helper to expose _oleobj_ on wrapper objects # ------------------------------------------------------------------ - def expose_oleobj(container, attr_name="_com"): """Attach `_oleobj_` to *container* by copying it from the wrapped COM object. @@ -159,7 +153,6 @@ def expose_oleobj(container, attr_name="_com"): # not be passable to COM until the attribute appears. pass - def flag_com_method(com_object, method_name: str): """ Ensure *method_name* on *com_object* is dispatched as a method. diff --git a/src/moldflow/common.py b/src/moldflow/common.py index d55b5cd..e3416c6 100644 --- a/src/moldflow/common.py +++ b/src/moldflow/common.py @@ -8,7 +8,6 @@ import logging from enum import Enum - class MaterialDatabase(Enum): """ Enum for different material database with IDs. @@ -26,7 +25,6 @@ class MaterialDatabase(Enum): MUCELL_MATERIAL_PROPERTIES = 21300 INJECTION_MOLDING_MACHINE = 30007 - class MaterialDatabaseType(Enum): """ Enum for different material database types. @@ -35,7 +33,6 @@ class MaterialDatabaseType(Enum): SYSTEM = "System" USER = "User" - class CrossSectionType(Enum): """ Enum for different cross-section type @@ -48,7 +45,6 @@ class CrossSectionType(Enum): U_SHAPE = "U-shape" TRAPEZOIDAL = "Trapezoidal" - class MeshType(Enum): """ Enum for different mesh types. @@ -58,7 +54,6 @@ class MeshType(Enum): MESH_FUSION = "Fusion" MESH_3D = "3D" - class ImportUnits(Enum): """ Enum for ImportUnits @@ -69,7 +64,6 @@ class ImportUnits(Enum): M = "m" IN = "in" - class ImportUnitIndex(Enum): """ Enum for ImportUnits @@ -80,7 +74,6 @@ class ImportUnitIndex(Enum): M = 2 IN = 3 - class MDLKernel(Enum): """ Enum for MDLKernel @@ -89,7 +82,6 @@ class MDLKernel(Enum): PARAMETRIC = "Parametric" PARASOLID = "Parasolid" - class MDLContactMeshType(Enum): """ Enum for MDLContactMeshType @@ -99,7 +91,6 @@ class MDLContactMeshType(Enum): FAULT_TOLERANCE = "Fault tolerant" IGNORE_CONTACT = "Ignore contact" - class CADBodyProperty(Enum): """ Enum for CADBodyProperty @@ -109,7 +100,6 @@ class CADBodyProperty(Enum): PROPERTY_3D_CHANNEL = 40915 PROPERTY_MOLD_COMPONENT = 40912 - class ItemType(Enum): """ Enum for ItemType @@ -119,7 +109,6 @@ class ItemType(Enum): REPORT = "Report" FOLDER = "Folder" - class DuplicateOption(Enum): """ Enum for DuplicateOption @@ -129,7 +118,6 @@ class DuplicateOption(Enum): NO_RESULTS_FILES_INCLUDED = 1 INCLUDE_RESULT_FILES_LINKED_TO_ORIGINAL = 2 - class SystemUnits(Enum): """ System of units @@ -139,7 +127,6 @@ class SystemUnits(Enum): ENGLISH = "English" STANDARD = "SI" - class ErrorMessage(Enum): """ Enum for error messages. @@ -152,7 +139,6 @@ class ErrorMessage(Enum): ATTRIBUTE_ERROR = "Invalid Attribute: {attribute} is not supported" SYNERGY_ERROR = "Failed to initialize Synergy: Synergy not found" - class LogMessage(Enum): """ Enum for translated messages. @@ -202,7 +188,6 @@ class LogMessage(Enum): NONE_LOGGER = ("Logger was not setup", logging.WARNING) # Critical logs - class ValueErrorReason(Enum): """Reasons for raising a ValueError.""" @@ -222,7 +207,6 @@ class ValueErrorReason(Enum): INVALID_VALUE = "found {value}, must be one of {expected_values}" BOTH_PARAMETERS_REQUIRED = "both {first} and {second} must be provided together" - class MoldingProcess(Enum): """Type of molding process""" @@ -246,7 +230,6 @@ class MoldingProcess(Enum): MULTIPLE_BARREL_REACTIVE_MOLDING = "Multiple-Barrel Reactive Molding" COOLANT_FLOW = "Coolant Flow" - class MaterialIndex(Enum): """ Enum for different material index. @@ -255,7 +238,6 @@ class MaterialIndex(Enum): FIRST = 0 SECOND = 1 - class EntityType(Enum): """ Enum for EntityType @@ -274,7 +256,6 @@ class EntityType(Enum): TET4 = "TE" STL = "STL" - class DisplayOption(Enum): """ Enum for DisplayOption @@ -292,7 +273,6 @@ class DisplayOption(Enum): SOLID_PLUS_NET = "Solid + Net" TRANSPARENT_PLUS_NET = "Transparent + Net" - class AnalysisType(Enum): """ Enum for AnalysisType @@ -303,7 +283,6 @@ class AnalysisType(Enum): STRESS_WARP = 3 CORE_SHIFT = 4 - class ConstraintType(Enum): """ Enum for ConstraintType @@ -313,7 +292,6 @@ class ConstraintType(Enum): FREE = 2 SPECIFIC = 3 - class TransformFunctions(Enum): """ Enum for TransformFunctions @@ -329,7 +307,6 @@ class TransformFunctions(Enum): LOGARITHM = "log" SQUARE_ROOT = "sqrt" - class TransformOperations(Enum): """ Enum for TransformOperations @@ -340,7 +317,6 @@ class TransformOperations(Enum): MULTIPLY = "*" DIVIDE = "/" - class TransformScalarOperations(Enum): """ Enum for TransformScalarOperations @@ -353,7 +329,6 @@ class TransformScalarOperations(Enum): POST_DIVIDE = "/=" POST_MINUS = "-=" - class CommitActions(Enum): """ Enum for CommitActions @@ -364,7 +339,6 @@ class CommitActions(Enum): PROCESS_CONDITIONS = "Process Conditions" REMOVE_UNUSED = "Remove Unused" - class NurbsAlgorithm(Enum): """ Enum for NurbsMesher @@ -373,7 +347,6 @@ class NurbsAlgorithm(Enum): DEFAULT = 0 ADVANCING_FRONT = 1 - class CoolType(Enum): """ Enum for CoolType @@ -382,7 +355,6 @@ class CoolType(Enum): BEM = 1 FEM = 2 - class TriClassification(Enum): """ Enum for TriClassification @@ -392,7 +364,6 @@ class TriClassification(Enum): PRESERVE_NOT_SLIVER = 1 PRESERVE_ALL = 2 - class GradingFactor(Enum): """ Enum for GradingFactor @@ -401,7 +372,6 @@ class GradingFactor(Enum): SLOW = 0 FAST = 1 - class GeomType(Enum): """ Enum for GeomType @@ -411,7 +381,6 @@ class GeomType(Enum): FUSION = "Fusion" MIDPLANE = "Midplane" - class Mesher3DType(Enum): """ Enum for Mesher3DType @@ -421,7 +390,6 @@ class Mesher3DType(Enum): LEGACY = "Legacy" ADVANCING_LAYERS = "AdvancingLayers" - class CADContactMesh(Enum): """ Enum for CADContactMesh @@ -431,7 +399,6 @@ class CADContactMesh(Enum): FAULT_TOLERANCE = "Fault tolerant" IGNORE_CONTACT = "Ignore contact" - class UserPlotType(Enum): """ Enum for UserPlotType @@ -441,7 +408,6 @@ class UserPlotType(Enum): NODE_DATA = "NDDT" NON_MESH_DATA = "NMDT" - class BirefringenceResultType(Enum): """ Enum for BirefringenceResultType @@ -452,7 +418,6 @@ class BirefringenceResultType(Enum): RETARDANCE_TENSOR = 2 FRINGE_PATTERN = 3 - class DeflectionType(Enum): """ Enum for DeflectionType @@ -463,7 +428,6 @@ class DeflectionType(Enum): DEFL_W = "DEFL_W" DEFL_W2 = "DEFL_W2" - class DisplayComponent(Enum): """ Enum for DisplayComponent @@ -483,7 +447,6 @@ class DisplayComponent(Enum): SECOND_TENSOR_PRINCIPAL_VALUE = 7 THIRD_TENSOR_PRINCIPAL_VALUE = 8 - class ScaleOptions(Enum): """ Enum for ScaleOption @@ -493,7 +456,6 @@ class ScaleOptions(Enum): AUTOMATIC_SCALING_WITH_COLORS_SCALED_PER_FRAME = 1 SPECIFIED_MANUAL_SCALING = 2 - class PlotMethod(Enum): """ Enum for PlotMethod @@ -509,7 +471,6 @@ class PlotMethod(Enum): DISPLAY_TENSOR_PRINCIPAL_VECTOR_AS_DARTS = 128 DISPLAY_TENSOR_PRINCIPAL_VECTOR_AS_SEGMENTS = 256 - class AnimationType(Enum): """ Enum for AnimationType @@ -518,7 +479,6 @@ class AnimationType(Enum): FRAME_ANIMATION = 0 MIN_MAX_ANIMATION = 1 - class ColorTableIDs(Enum): """ Enum for ColorTableIDs @@ -531,7 +491,6 @@ class ColorTableIDs(Enum): SINGLE_COLOR = 1000 TRAFFIC_LIGHT = 1100 - class EdgeDisplayOptions(Enum): """ Enum for EdgeDisplayOptions @@ -541,7 +500,6 @@ class EdgeDisplayOptions(Enum): FEATURE_EDGE = 1 MESH_EDGE = 2 - class DeflectionScaleDirections(Enum): """ Enum for DeflectionScaleDirections @@ -552,7 +510,6 @@ class DeflectionScaleDirections(Enum): Z = 2 ALL = 3 - class SliceAtProbeOptions(Enum): """ Enum for SliceAtProbeOptions @@ -562,7 +519,6 @@ class SliceAtProbeOptions(Enum): MINIMUM = "Minimum" MAXIMUM = "Maximum" - class TensorAxisRatioOptions(Enum): """ Enum for TensorAxisRatioOptions @@ -572,7 +528,6 @@ class TensorAxisRatioOptions(Enum): THREE_TWO_ONE = 1 PROPORTIONAL_TO_PRINCIPAL_VALUES = 2 - class ShrinkageCompensationOptions(Enum): """ Enum for ShrinkageCompensationOptions @@ -583,7 +538,6 @@ class ShrinkageCompensationOptions(Enum): ANISOTROPIC = "Anisotropic" NONE = "None" - class TraceModes(Enum): """ Enum for TraceModes @@ -592,7 +546,6 @@ class TraceModes(Enum): ALL_PATHLINES = 0 TERMINATING_IN_SELECTED_AREA = 1 - class TraceStyles(Enum): """ Enum for TraceStyles @@ -602,7 +555,6 @@ class TraceStyles(Enum): MARKERS = 1 TUBES = 2 - class ScaleTypes(Enum): """ Enum for ScaleTypes @@ -611,7 +563,6 @@ class ScaleTypes(Enum): DEFAULT = 0 SPECIFIED = 1 - class ColorScaleOptions(Enum): """ Enum for ColorScaleOptions @@ -620,7 +571,6 @@ class ColorScaleOptions(Enum): BLUE_TO_RED = True RED_TO_BLUE = False - class ViewModes(Enum): """ Enum for ViewModes projections @@ -629,7 +579,6 @@ class ViewModes(Enum): PARALLEL_PROJECTION = 0 PERSPECTIVE_PROJECTION = 1 - class StandardViews(Enum): """ Enum for StandardViews @@ -659,7 +608,6 @@ class StandardViews(Enum): BACK_BOTTOM_RIGHT = "BackBottomRight" ISOMETRIC = "Isometric" - class AnimationSpeed(Enum): """ Enum for AnimationSpeed @@ -669,7 +617,6 @@ class AnimationSpeed(Enum): MEDIUM = "Medium" FAST = "Fast" - class ClampForcePlotDirection(Enum): """ Enum for ClampForcePlotDirection @@ -679,7 +626,6 @@ class ClampForcePlotDirection(Enum): Y = 1 Z = 2 - class ModulusPlotDirection(Enum): """ Enum for ModulusPlotDirection @@ -689,7 +635,6 @@ class ModulusPlotDirection(Enum): EYY = 1 EZZ = 2 - class PlotType(Enum): """ Enum for PlotType @@ -718,7 +663,6 @@ class PlotType(Enum): PLOT_FUSION_SINK_MARK_PLOT = 24 PLOT_DOE_RESPONSE_SURFACE_PLOT = 25 - class LCSType(Enum): """ Enum for LCS_Type @@ -727,7 +671,6 @@ class LCSType(Enum): COORDINATE_SYSTEM = "LCS" MODELLING_PLANE = "Plane" - class CurveInitPosition(Enum): """ Enum for Curve_Init_Position @@ -736,7 +679,6 @@ class CurveInitPosition(Enum): START = 0 END = 1 - class PropertyType(Enum): """ Enum for PropertyType diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index 48b31d3..9b568ee 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -13,7 +13,6 @@ from .integer_array import IntegerArray from .double_array import DoubleArray - class DataTransform: """ Wrapper for DataTransform class of Moldflow Synergy. diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index ce3b134..47d30a3 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -16,7 +16,6 @@ from .integer_array import IntegerArray from .double_array import DoubleArray - class DiagnosisManager: """ Wrapper for DiagnosisManager class of Moldflow Synergy. diff --git a/src/moldflow/double_array.py b/src/moldflow/double_array.py index be3cd28..bd45a55 100644 --- a/src/moldflow/double_array.py +++ b/src/moldflow/double_array.py @@ -11,7 +11,6 @@ from .com_proxy import flag_com_method, safe_com from .common import LogMessage - class DoubleArray: """ Wrapper for DoubleArray class of Moldflow Synergy. diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 75d5997..8d21c6a 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -12,7 +12,6 @@ from .common import LogMessage from .logger import process_log - class EntList: """ Wrapper for EntList class of Moldflow Synergy. diff --git a/src/moldflow/errors.py b/src/moldflow/errors.py index a1209da..99c395f 100644 --- a/src/moldflow/errors.py +++ b/src/moldflow/errors.py @@ -8,7 +8,6 @@ from .common import ValueErrorReason, ErrorMessage from .exceptions import SaveError, SynergyError - def raise_type_error(variable, types: tuple | str) -> NoReturn: """ Raise a TypeError if the variable is not an instance of the specified type(s). @@ -33,7 +32,6 @@ def raise_type_error(variable, types: tuple | str) -> NoReturn: ) raise TypeError(localised_err_msg) - def raise_value_error(reason: ValueErrorReason | str, **kwargs) -> NoReturn: """ Raise a ValueError with a custom error message. @@ -53,7 +51,6 @@ def raise_value_error(reason: ValueErrorReason | str, **kwargs) -> NoReturn: localised_err_msg = _(err_msg).format(reason=localised_reason) raise ValueError(localised_err_msg) - def raise_index_error() -> NoReturn: """ Raise an IndexError if the index is out of range. @@ -65,12 +62,10 @@ def raise_index_error() -> NoReturn: err_msg = ErrorMessage.INDEX_ERROR.value raise IndexError(_(err_msg)) - def raise_save_error(saving: str, file_name: str) -> NoReturn: """ Raise a SaveError if the save operation fails. - Args: saving (str): The operation that failed. file_name (str): The name of the file that could not be saved. @@ -83,7 +78,6 @@ def raise_save_error(saving: str, file_name: str) -> NoReturn: localised_err_msg = _(err_msg).format(saving=saving, file_name=file_name) raise SaveError(localised_err_msg) - def raise_attribute_error(attribute: str) -> NoReturn: """Raise an AttributeError with a localised custom error message. @@ -95,7 +89,6 @@ def raise_attribute_error(attribute: str) -> NoReturn: localised_err_msg = _(err_msg).format(attribute=attribute) raise AttributeError(localised_err_msg) - def raise_synergy_error() -> NoReturn: """ Raise a SynergyError with a localised custom error message. diff --git a/src/moldflow/exceptions.py b/src/moldflow/exceptions.py index cf3d3c5..77fc799 100644 --- a/src/moldflow/exceptions.py +++ b/src/moldflow/exceptions.py @@ -5,7 +5,6 @@ from .common import ErrorMessage - class SaveError(Exception): """Exception raised when saving a file fails.""" @@ -19,7 +18,6 @@ def __init__(self, message: str) -> None: super().__init__(message) self.message = message - class SynergyError(Exception): """Exception raised when Synergy fails to initialize.""" diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index ed5bb33..b50ecc6 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -12,7 +12,6 @@ from .helper import get_enum_value, check_type, check_optional_type, check_and_coerce_optional, check_range, coerce_optional_dispatch from .com_proxy import safe_com - class FolderManager: """ Wrapper for FolderManager class of Moldflow Synergy. @@ -85,7 +84,6 @@ def add_objects_to_folder(self, objects: EntList | None, folder: EntList | None) """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_objects_to_folder") - return self.folder_manager.AddObjectsToFolder( check_and_coerce_optional(objects, EntList), check_and_coerce_optional(folder, EntList), diff --git a/src/moldflow/helper.py b/src/moldflow/helper.py index 286e4f1..2322cbd 100644 --- a/src/moldflow/helper.py +++ b/src/moldflow/helper.py @@ -13,7 +13,6 @@ from .common import ValueErrorReason, LogMessage from .logger import process_log - def get_enum_value(value, enum: Enum): """ Check if the value is part of the given enum class. @@ -44,7 +43,6 @@ def get_enum_value(value, enum: Enum): process_log(__name__, LogMessage.VALUE_NOT_IN_ENUM, locals(), value=value, enum_name=enum_name) return value - def check_type(value, types: tuple | type): """ Check if the value is of the specified type(s). @@ -75,7 +73,6 @@ def check_type(value, types: tuple | type): raise_type_error(value, types) process_log(__name__, LogMessage.VALID_INPUT) - def check_optional_type(value, types: tuple | type): """ Check if the value is of the specified type(s) or None. @@ -103,7 +100,6 @@ def check_optional_type(value, types: tuple | type): return check_type(value, types) - def _compare(value1, value2, inclusive): """ Compare two values @@ -122,7 +118,6 @@ def _compare(value1, value2, inclusive): return True return inclusive and value1 == value2 - def check_range( value: float, min_value: float = None, @@ -182,7 +177,6 @@ def check_range( raise_value_error(reason, **reason_format) process_log(__name__, LogMessage.VALID_INPUT) - def check_is_non_negative(value: float): """ Check if the value is non-negative. @@ -197,7 +191,6 @@ def check_is_non_negative(value: float): raise_value_error(ValueErrorReason.NON_NEGATIVE, value=value) process_log(__name__, LogMessage.VALID_INPUT) - def check_is_positive(value: float): """ Check if the value is posiive [0 not included]. @@ -212,7 +205,6 @@ def check_is_positive(value: float): raise_value_error(ValueErrorReason.POSITIVE, value=value) process_log(__name__, LogMessage.VALID_INPUT) - def check_is_negative(value: float): """ Check if the value is negative. @@ -227,7 +219,6 @@ def check_is_negative(value: float): raise_value_error(ValueErrorReason.NEGATIVE, value=value) process_log(__name__, LogMessage.VALID_INPUT) - def check_is_non_zero(value: float): """ Check if the value is non-zero. @@ -242,7 +233,6 @@ def check_is_non_zero(value: float): raise_value_error(ValueErrorReason.NON_ZERO, value=value) process_log(__name__, LogMessage.VALID_INPUT) - def check_index(index: int, min_value: int, max_value: int): """ Check if the index is within the specified range. @@ -262,7 +252,6 @@ def check_index(index: int, min_value: int, max_value: int): raise_index_error() process_log(__name__, LogMessage.VALID_INPUT) - def check_file_extension(file_name: str, extensions: tuple | str): """ Check if the file name has a valid extension. @@ -290,7 +279,6 @@ def check_file_extension(file_name: str, extensions: tuple | str): file_name = file_name + default return file_name - def check_expected_values(value, expected_values: tuple): """ Check if the value is in the expected values. @@ -308,7 +296,6 @@ def check_expected_values(value, expected_values: tuple): ValueErrorReason.INVALID_VALUE, value=value, expected_values=expected_values ) - def check_min_max(min_value: float, max_value: float): """ Check if the min_value is less than or equal to the max_value. @@ -326,7 +313,6 @@ def check_min_max(min_value: float, max_value: float): ValueErrorReason.MIN_MORE_THAN_MAX, min_value=min_value, max_value=max_value ) - def _mf_array_to_list(array_instance): """ Generic helper function to convert any array instance to a list. @@ -339,12 +325,10 @@ def _mf_array_to_list(array_instance): """ return [array_instance.val(i) for i in range(array_instance.size)] - def variant_null_idispatch(): """Return a VARIANT representing a null IDispatch pointer (VT_DISPATCH, None).""" return VARIANT(pythoncom.VT_DISPATCH, None) - def coerce_optional_dispatch(value, attr_name: str | None = None): """ Coerce an optional COM object argument declared as VTS_DISPATCH. @@ -366,7 +350,6 @@ def coerce_optional_dispatch(value, attr_name: str | None = None): value = getattr(value, attr_name) return value - # Type to attribute name mapping for COM objects _TYPE_TO_ATTR_MAP = { 'EntList': 'ent_list', @@ -380,7 +363,6 @@ def coerce_optional_dispatch(value, attr_name: str | None = None): 'StringArray': 'string_array', } - def check_and_coerce_optional(value, expected_type: type): """ Check if the value is of the expected type or None, and coerce it for COM dispatch. diff --git a/src/moldflow/i18n.py b/src/moldflow/i18n.py index 1768360..8a348e6 100644 --- a/src/moldflow/i18n.py +++ b/src/moldflow/i18n.py @@ -11,10 +11,8 @@ import gettext from typing import Callable - _translator: Callable[[str], str] | None = None - def install_translation( domain: str, localedir: str, languages: list[str] | None ) -> Callable[[str], str]: @@ -28,7 +26,6 @@ def install_translation( return _translator - def get_text() -> Callable[[str], str]: """ Return the active gettext function. diff --git a/src/moldflow/import_options.py b/src/moldflow/import_options.py index 175501c..a18e9f8 100644 --- a/src/moldflow/import_options.py +++ b/src/moldflow/import_options.py @@ -12,7 +12,6 @@ from .helper import get_enum_value, check_type, check_is_non_negative from .com_proxy import safe_com - class ImportOptions: """ Wrapper for ImportOptions class of Moldflow Synergy. diff --git a/src/moldflow/integer_array.py b/src/moldflow/integer_array.py index ab4c4a4..827f222 100644 --- a/src/moldflow/integer_array.py +++ b/src/moldflow/integer_array.py @@ -11,7 +11,6 @@ from .com_proxy import safe_com, flag_com_method from .common import LogMessage - class IntegerArray: """ Wrapper for IntegerArray class of Moldflow Synergy. diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index b8c63b9..2983e14 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -12,7 +12,6 @@ from .helper import check_type, check_optional_type, check_and_coerce_optional, check_range, get_enum_value, coerce_optional_dispatch from .com_proxy import safe_com - class LayerManager: """ Wrapper for LayerManager class of Moldflow Synergy. @@ -92,7 +91,6 @@ def assign_to_layer(self, elems: EntList | None, layer: EntList | None) -> int: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="assign_to_layer") - return self.layer_manager.AssignToLayer( check_and_coerce_optional(elems, EntList), check_and_coerce_optional(layer, EntList) ) diff --git a/src/moldflow/localization.py b/src/moldflow/localization.py index c51598f..9e9a8ba 100644 --- a/src/moldflow/localization.py +++ b/src/moldflow/localization.py @@ -22,7 +22,6 @@ from .i18n import install_translation, get_text from .logger import process_log - def get_locale(product_name: str = "Moldflow Synergy", version: str = ""): """ Get the locale of the specified Autodesk product from the Windows registry. @@ -95,7 +94,6 @@ def _fetch_registry_value( _process_locale("Default", "", DEFAULT_BCP_47_STD) return DEFAULT_THREE_LETTER_CODE - def set_language(product_name: str = "Moldflow Synergy", version: str = "", locale: str = ""): """ Set the language for the application based on the product name and version. diff --git a/src/moldflow/logger.py b/src/moldflow/logger.py index 697425c..6457b1d 100644 --- a/src/moldflow/logger.py +++ b/src/moldflow/logger.py @@ -23,7 +23,6 @@ }, } - class SafeStreamHandler(logging.StreamHandler): """Stream handler that falls back to backslash-escaping on encoding errors. @@ -52,7 +51,6 @@ def emit(self, record): # type: ignore[override] except Exception: # pragma: no cover - delegate to logging error handler self.handleError(record) - def set_is_logging(is_logging: bool): """ Enables or Disables moldflow API logging system @@ -62,7 +60,6 @@ def set_is_logging(is_logging: bool): global _IS_LOGGING _IS_LOGGING = is_logging - def configure_file_logging( command_line_logs: bool, log_file: bool, log_file_name: str = DEFAULT_LOG_FILE ): @@ -115,7 +112,6 @@ def configure_file_logging( moldflow_logger.setLevel(root_logger.getEffectiveLevel()) - def get_logger(name) -> logging.Logger | None: """ Retrieve or create a logger with the specified name. @@ -133,7 +129,6 @@ def get_logger(name) -> logging.Logger | None: return logger return None - def process_log(logger_name: str, message_log: LogMessage | str, dump=None, **kwargs): """ Processes a log entry with the message_log. diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index c7feb9e..78cd10b 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -13,7 +13,6 @@ from .com_proxy import safe_com from .common import LogMessage - class MaterialFinder: """ Wrapper for MaterialFinder class of Moldflow Synergy. diff --git a/src/moldflow/material_plot.py b/src/moldflow/material_plot.py index 0c9a64b..a9733b0 100644 --- a/src/moldflow/material_plot.py +++ b/src/moldflow/material_plot.py @@ -11,7 +11,6 @@ from .logger import process_log from .common import LogMessage - class MaterialPlot: """ Wrapper for MaterialPlot class of Moldflow Synergy. diff --git a/src/moldflow/material_selector.py b/src/moldflow/material_selector.py index ce3f45c..a708f9b 100644 --- a/src/moldflow/material_selector.py +++ b/src/moldflow/material_selector.py @@ -11,7 +11,6 @@ from .helper import check_type, check_is_non_negative, check_range, get_enum_value from .com_proxy import safe_com - class MaterialSelector: """ Wrapper for MaterialSelector class of Moldflow Synergy. diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index 6a74979..e71109f 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -16,7 +16,6 @@ from .helper import check_type, check_optional_type, check_and_coerce_optional, check_range, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com - class MeshEditor: """ Wrapper for MeshEditor class of Moldflow Synergy. @@ -81,7 +80,6 @@ def swap_edge( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="swap_edges") - check_type(feat_allow, bool) return self.mesh_editor.SwapEdge( check_and_coerce_optional(tri1, EntList), @@ -119,7 +117,6 @@ def insert_node(self, node1: EntList | None, node2: EntList | None) -> EntList: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node") - result = self.mesh_editor.InsertNode( check_and_coerce_optional(node1, EntList), check_and_coerce_optional(node2, EntList) ) @@ -152,7 +149,6 @@ def insert_node_in_tri( return None return EntList(result) - result = self.mesh_editor.InsertNodeInTri( check_and_coerce_optional(node1, EntList), check_and_coerce_optional(node2, EntList), @@ -193,8 +189,6 @@ def insert_node_in_tet( return None return EntList(result) - - result = self.mesh_editor.InsertNodeInTetByNodes( check_and_coerce_optional(node1, EntList), check_and_coerce_optional(node2, EntList), @@ -229,9 +223,6 @@ def insert_node_in_tet_by_nodes( __name__, LogMessage.FUNCTION_CALL, locals(), name="insert_node_in_tet_by_nodes" ) - - - result = self.mesh_editor.InsertNodeInTetByNodes( check_and_coerce_optional(node1, EntList), check_and_coerce_optional(node2, EntList), @@ -300,8 +291,6 @@ def align_nodes( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_nodes") - - return self.mesh_editor.AlignNodes( check_and_coerce_optional(node1, EntList), check_and_coerce_optional(node2, EntList), @@ -367,7 +356,6 @@ def align_normals(self, seed_tri: EntList | None, tris: EntList | None) -> int: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_normals") - return self.mesh_editor.AlignNormals( check_and_coerce_optional(seed_tri, EntList), check_and_coerce_optional(tris, EntList), @@ -602,7 +590,6 @@ def create_beams( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_beams") - check_type(num_beams, int) check_is_non_negative(num_beams) @@ -696,7 +683,6 @@ def match_nodes(self, nodes: EntList | None, tris: EntList | None, layer: str) - """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="match_notes") - check_type(layer, str) return self.mesh_editor.MatchNodes( check_and_coerce_optional(nodes, EntList), @@ -771,8 +757,6 @@ def move_node_to_edge( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="move_node_to_edge") - - check_type(param_loc, (int, float)) check_range(param_loc, 0.0, 1.0, True, True) return self.mesh_editor.MoveNodeToEdge( @@ -799,7 +783,6 @@ def create_beams_by_points( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_beams_by_points") - check_type(num, int) check_is_non_negative(num) @@ -905,7 +888,6 @@ def cut_triangles_by_plane( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="cut_triangles_by_plane") - check_type(fill, bool) check_type(smooth, bool) return self.mesh_editor.CutTrianglesByPlane( @@ -1061,7 +1043,6 @@ def merge_nodes( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="merge_nodes") - check_type(fusion, bool) check_type(use_mid, bool) return self.mesh_editor.MergeNodes2( diff --git a/src/moldflow/mesh_generator.py b/src/moldflow/mesh_generator.py index 25e6813..9dff5a0 100644 --- a/src/moldflow/mesh_generator.py +++ b/src/moldflow/mesh_generator.py @@ -21,7 +21,6 @@ from .helper import check_type, check_range, get_enum_value from .com_proxy import safe_com - class MeshGenerator: """ Wrapper for MeshGenerator class of Moldflow Synergy. diff --git a/src/moldflow/mesh_summary.py b/src/moldflow/mesh_summary.py index bb9a9ac..334b7e1 100644 --- a/src/moldflow/mesh_summary.py +++ b/src/moldflow/mesh_summary.py @@ -10,7 +10,6 @@ from .common import LogMessage from .com_proxy import safe_com - class MeshSummary: """ Wrapper for MeshSummary class of Moldflow Synergy. diff --git a/src/moldflow/message_box.py b/src/moldflow/message_box.py index 0817a51..adc223b 100644 --- a/src/moldflow/message_box.py +++ b/src/moldflow/message_box.py @@ -62,7 +62,6 @@ # pylint: disable=invalid-name INT_PTR = ctypes.c_ssize_t - # Win32 MessageBox flags (from winuser.h) WIN_MB_OK = 0x00000000 WIN_MB_OKCANCEL = 0x00000001 @@ -158,7 +157,6 @@ # Defaults DEFAULT_TITLE = "Moldflow" - class MessageBoxType(Enum): """ Message box types supported by the convenience API. @@ -186,7 +184,6 @@ class MessageBoxType(Enum): CANCEL_TRY_CONTINUE = auto() INPUT = auto() - class MessageBoxResult(Enum): """ Result of a message box interaction. @@ -205,11 +202,9 @@ class MessageBoxResult(Enum): TRY_AGAIN = auto() CONTINUE = auto() - # Public type alias for show() return value MessageBoxReturn: TypeAlias = Union[MessageBoxResult, Optional[str]] - class MessageBoxIcon(Enum): """ Icon to display on the message box. If not provided, a sensible default is @@ -222,7 +217,6 @@ class MessageBoxIcon(Enum): ERROR = auto() QUESTION = auto() - class MessageBoxModality(Enum): """Modality for the message box window.""" @@ -230,7 +224,6 @@ class MessageBoxModality(Enum): SYSTEM = auto() TASK = auto() - class MessageBoxDefaultButton(Enum): """Which button is the default (activated by Enter).""" @@ -239,7 +232,6 @@ class MessageBoxDefaultButton(Enum): BUTTON3 = auto() BUTTON4 = auto() - # Mapping dictionaries (module-level) for flags and results MAPPING_MESSAGEBOX_TYPE = { MessageBoxType.INFO: (WIN_MB_OK, MessageBoxIcon.INFORMATION, 1), @@ -283,7 +275,6 @@ class MessageBoxDefaultButton(Enum): WIN_IDCONTINUE: MessageBoxResult.CONTINUE, } - @dataclass(frozen=True) class MessageBoxOptions: # pylint: disable=too-many-instance-attributes """ @@ -352,7 +343,6 @@ def __post_init__(self) -> None: if self.char_limit is not None and self.char_limit < 0: object.__setattr__(self, "char_limit", 0) - class MessageBox: """ MessageBox convenience class. @@ -546,7 +536,6 @@ def _show_input_dialog(self) -> Optional[str]: dialog = _Win32InputDialog(self.title, self.text, self.options) return dialog.run() - class _Win32InputDialog: """ Modal input dialog using DialogBoxIndirectParamW with an in-memory DLGTEMPLATE. diff --git a/src/moldflow/model_duplicator.py b/src/moldflow/model_duplicator.py index f89ca45..95bf77b 100644 --- a/src/moldflow/model_duplicator.py +++ b/src/moldflow/model_duplicator.py @@ -10,7 +10,6 @@ from .helper import check_type from .com_proxy import safe_com - class ModelDuplicator: """ Wrapper for ModelDuplicator class of Moldflow Synergy. diff --git a/src/moldflow/modeler.py b/src/moldflow/modeler.py index 21af0db..02f26de 100644 --- a/src/moldflow/modeler.py +++ b/src/moldflow/modeler.py @@ -25,7 +25,6 @@ from .ent_list import EntList from .vector import Vector - class Modeler: """ Wrapper for Modeler class of Moldflow Synergy. @@ -74,7 +73,6 @@ def create_nodes_between( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_between") - check_type(num_nodes, int) check_is_positive(num_nodes) result = self.modeler.CreateNodesBetween( @@ -102,7 +100,6 @@ def create_nodes_by_offset( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_nodes_by_offset") - check_type(num_nodes, int) check_is_positive(num_nodes) result = self.modeler.CreateNodesByOffset( @@ -201,7 +198,6 @@ def create_line( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_line") - check_type(relative, bool) check_type(ends, bool) @@ -288,8 +284,6 @@ def create_arc_by_points( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_arc_by_points") - - check_type(circle, bool) check_type(ends, bool) @@ -411,7 +405,6 @@ def break_curves(self, curve1: EntList | None, curve2: EntList | None) -> bool: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="break_curves") - return self.modeler.BreakCurves( check_and_coerce_optional(curve1, EntList), check_and_coerce_optional(curve2, EntList), @@ -539,7 +532,6 @@ def create_hole_by_boundary(self, region: EntList | None, curve: EntList | None) """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_boundary") - return self.modeler.CreateHoleByBoundary( check_and_coerce_optional(region, EntList), check_and_coerce_optional(curve, EntList), @@ -558,7 +550,6 @@ def create_hole_by_nodes(self, region: EntList | None, nodes: EntList | None) -> """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_nodes") - return self.modeler.CreateHoleByNodes( check_and_coerce_optional(region, EntList), check_and_coerce_optional(nodes, EntList), @@ -580,8 +571,6 @@ def create_hole_by_ruling( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_ruling") - - return self.modeler.CreateHoleByRuling( check_and_coerce_optional(region, EntList), check_and_coerce_optional(curve1, EntList), @@ -634,7 +623,6 @@ def reflect( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="reflect") - check_type(copy, bool) check_type(merge, bool) return self.modeler.Reflect( @@ -670,7 +658,6 @@ def scale( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="scale") - check_type(copy, bool) check_type(merge, bool) return self.modeler.Scale( @@ -747,7 +734,6 @@ def rotate( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="rotate") - check_type(angle, (int, float)) check_is_non_negative(angle) check_type(copy, bool) @@ -791,8 +777,6 @@ def rotate_3_pts( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="rotate_3_pts") - - check_type(copy, bool) check_type(merge, bool) return self.modeler.Rotate3Pts( @@ -820,8 +804,6 @@ def create_lcs_by_points( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_lcs_by_points") - - result = self.modeler.CreateLCSByPoints( check_and_coerce_optional(coord1, Vector), check_and_coerce_optional(coord2, Vector), diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index 85e0b2a..bf5704d 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -11,7 +11,6 @@ from .com_proxy import safe_com from .vector import Vector - class MoldSurfaceGenerator: """ Wrapper for MoldSurfaceGenerator class of Moldflow Synergy. diff --git a/src/moldflow/plot.py b/src/moldflow/plot.py index 2a6c51e..8ce5c82 100644 --- a/src/moldflow/plot.py +++ b/src/moldflow/plot.py @@ -51,7 +51,6 @@ from .ent_list import EntList from .errors import raise_save_error - class Plot: """ Wrapper for Plot class of Moldflow Synergy. @@ -1382,7 +1381,6 @@ def get_probe_plot_probe_line( check_type(index, int) check_is_non_negative(index) - return self.plot.GetProbePlotProbeLine( index, check_and_coerce_optional(start_pt, Vector), @@ -1402,7 +1400,6 @@ def add_probe_plot_probe_line(self, start_pt: Vector | None, end_pt: Vector | No """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_probe_plot_probe_line") - return self.plot.AddProbePlotProbeLine( check_and_coerce_optional(start_pt, Vector), check_and_coerce_optional(end_pt, Vector) ) @@ -1425,7 +1422,6 @@ def set_probe_plot_probe_line( check_type(index, int) check_is_non_negative(index) - return self.plot.SetProbePlotProbeLine( index, check_and_coerce_optional(start_pt, Vector), diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index 4b64094..4274259 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -21,7 +21,6 @@ from .errors import raise_save_error from .constants import XML_FILE_EXT, SDZ_FILE_EXT, FBX_FILE_EXT, ELE_FILE_EXT - class PlotManager: """ Wrapper for PlotManager class of Moldflow Synergy. @@ -242,8 +241,6 @@ def get_vector_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_vector_data") check_type(ds_id, int) - - return self.plot_manager.GetVectorData( ds_id, check_and_coerce_optional(indp_values, DoubleArray), @@ -286,11 +283,6 @@ def get_tensor_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_tensor_data") check_type(ds_id, int) - - - - - return self.plot_manager.GetTensorData( ds_id, check_and_coerce_optional(indp_values, DoubleArray), @@ -320,7 +312,6 @@ def get_non_mesh_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_non_mesh_data") check_type(ds_id, int) - return self.plot_manager.GetNonmeshData( ds_id, check_and_coerce_optional(indp_values, DoubleArray), @@ -344,7 +335,6 @@ def get_highlight_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_highlight_data") check_type(ds_id, int) - return self.plot_manager.GetHighlightData( ds_id, check_and_coerce_optional(indp_values, DoubleArray), @@ -930,7 +920,6 @@ def fbx_export( check_type(file_name, str) file_name = check_file_extension(file_name, FBX_FILE_EXT) - check_type(export_type, int) check_type(wp_scale_factor, (float, int)) check_type(sm_scale_factor, (float, int)) diff --git a/src/moldflow/predicate.py b/src/moldflow/predicate.py index 844292b..89b9fdc 100644 --- a/src/moldflow/predicate.py +++ b/src/moldflow/predicate.py @@ -10,7 +10,6 @@ from .common import LogMessage from .com_proxy import safe_com, expose_oleobj - class Predicate: """ Wrapper for Predicate class of Moldflow Synergy. diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index bf0eea0..546d052 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -13,7 +13,6 @@ from .com_proxy import safe_com from .logger import process_log - class PredicateManager: """ Wrapper for PredicateManager class of Moldflow Synergy. @@ -118,7 +117,6 @@ def create_bool_and_predicate( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_and_predicate") - result = self.predicate_manager.CreateBoolAndPredicate( check_and_coerce_optional(predicate1, Predicate), check_and_coerce_optional(predicate2, Predicate), @@ -144,7 +142,6 @@ def create_bool_or_predicate( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_or_predicate") - result = self.predicate_manager.CreateBoolOrPredicate( check_and_coerce_optional(predicate1, Predicate), check_and_coerce_optional(predicate2, Predicate), @@ -189,7 +186,6 @@ def create_bool_xor_predicate( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_bool_xor_predicate") - result = self.predicate_manager.CreateBoolXorPredicate( check_and_coerce_optional(predicate1, Predicate), check_and_coerce_optional(predicate2, Predicate), @@ -235,7 +231,6 @@ def create_x_section_predicate( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_x_section_predicate") cross_section = get_enum_value(cross_section, CrossSectionType) - result = self.predicate_manager.CreateXSectionPredicate( cross_section, check_and_coerce_optional(min_value, DoubleArray), diff --git a/src/moldflow/project.py b/src/moldflow/project.py index bd0e2e7..bf0e68e 100644 --- a/src/moldflow/project.py +++ b/src/moldflow/project.py @@ -11,7 +11,6 @@ from .common import ItemType, DuplicateOption, ImportUnitIndex from .logger import process_log, LogMessage - class Project: """ Wrapper for Project class of Moldflow Synergy. diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index 78f6b60..4a469b6 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -13,7 +13,6 @@ from .com_proxy import safe_com from .common import LogMessage - class Property: """ Wrapper for Property class of Moldflow Synergy. diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index 4f44156..cda471c 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -13,7 +13,6 @@ from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType - class PropertyEditor: """ Wrapper for PropertyEditor class of Moldflow Synergy. diff --git a/src/moldflow/runner_generator.py b/src/moldflow/runner_generator.py index 4984665..4b52c60 100644 --- a/src/moldflow/runner_generator.py +++ b/src/moldflow/runner_generator.py @@ -11,7 +11,6 @@ from .com_proxy import safe_com from .common import LogMessage - class RunnerGenerator: """ Wrapper for RunnerGenerator class of Moldflow Synergy. diff --git a/src/moldflow/server.py b/src/moldflow/server.py index a5e09b1..4768264 100644 --- a/src/moldflow/server.py +++ b/src/moldflow/server.py @@ -10,7 +10,6 @@ from .common import LogMessage from .com_proxy import safe_com - class Server: """ Wrapper for Server class of Moldflow Synergy. diff --git a/src/moldflow/string_array.py b/src/moldflow/string_array.py index dcb953d..bc28ee8 100644 --- a/src/moldflow/string_array.py +++ b/src/moldflow/string_array.py @@ -11,7 +11,6 @@ from .com_proxy import safe_com, flag_com_method from .common import LogMessage - class StringArray: """ Wrapper for StringArray class of Moldflow Synergy. diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index 4cc06b8..6ade21e 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -24,7 +24,6 @@ from .vector import Vector from .string_array import StringArray - class StudyDoc: """ Wrapper for StudyDoc class of Moldflow Synergy. diff --git a/src/moldflow/synergy.py b/src/moldflow/synergy.py index d233978..d1fe1be 100644 --- a/src/moldflow/synergy.py +++ b/src/moldflow/synergy.py @@ -51,7 +51,6 @@ from .com_proxy import safe_com from .errors import raise_synergy_error - class Synergy: """ Wrapper for Synergy class of Moldflow Synergy. diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index d18491b..7a460fd 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -13,7 +13,6 @@ from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_is_non_negative, coerce_optional_dispatch from .com_proxy import safe_com - class SystemMessage: """ Wrapper for SystemMessage class of Moldflow Synergy. diff --git a/src/moldflow/unit_conversion.py b/src/moldflow/unit_conversion.py index a82f3c1..a5c1857 100644 --- a/src/moldflow/unit_conversion.py +++ b/src/moldflow/unit_conversion.py @@ -11,7 +11,6 @@ from .com_proxy import safe_com from .common import LogMessage, SystemUnits - class UnitConversion: """ Wrapper for UnitConversion class of Moldflow Synergy. diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index 33d163d..b30b1a8 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -21,7 +21,6 @@ from .double_array import DoubleArray from .plot import Plot - class UserPlot: """ Wrapper for UserPlot class of Moldflow Synergy. @@ -155,8 +154,6 @@ def add_vector_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_vector_data") check_type(indp_val, (int, float)) - - return self.user_plot.AddVectorData( indp_val, check_and_coerce_optional(element_id, IntegerArray), @@ -196,11 +193,6 @@ def add_tensor_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_tensor_data") check_type(indp_val, (int, float)) - - - - - return self.user_plot.AddTensorData( indp_val, check_and_coerce_optional(element_id, IntegerArray), @@ -289,8 +281,6 @@ def set_vector_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_vector_data") - - return self.user_plot.SetVectorData( check_and_coerce_optional(element_id, IntegerArray), check_and_coerce_optional(vx, DoubleArray), @@ -326,11 +316,6 @@ def set_tensor_data( """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_tensor_data") - - - - - return self.user_plot.SetTensorData( check_and_coerce_optional(element_id, IntegerArray), check_and_coerce_optional(t_11, DoubleArray), @@ -358,7 +343,6 @@ def add_xy_plot_data( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_xy_plot_data") check_type(indp_val, (int, float)) - return self.user_plot.AddXYPlotData( indp_val, check_and_coerce_optional(x_value, DoubleArray), @@ -378,7 +362,6 @@ def set_xy_plot_data(self, x_value: DoubleArray | None, y_value: DoubleArray | N """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="set_xy_plot_data") - return self.user_plot.SetXYPlotData( check_and_coerce_optional(x_value, DoubleArray), check_and_coerce_optional(y_value, DoubleArray), diff --git a/src/moldflow/vector.py b/src/moldflow/vector.py index 1b603b8..2179f0c 100644 --- a/src/moldflow/vector.py +++ b/src/moldflow/vector.py @@ -10,7 +10,6 @@ from .com_proxy import safe_com from .logger import process_log, LogMessage - class Vector: """ Wrapper for Vector class of Moldflow Synergy. diff --git a/src/moldflow/vector_array.py b/src/moldflow/vector_array.py index 3593e4c..c10ffb6 100644 --- a/src/moldflow/vector_array.py +++ b/src/moldflow/vector_array.py @@ -10,7 +10,6 @@ from .com_proxy import safe_com from .logger import process_log, LogMessage - class VectorArray: """ Wrapper for VectorArray class of Moldflow Synergy. diff --git a/src/moldflow/version_check.py b/src/moldflow/version_check.py index 032efda..7a9ec4e 100644 --- a/src/moldflow/version_check.py +++ b/src/moldflow/version_check.py @@ -18,7 +18,6 @@ from importlib.metadata import version, PackageNotFoundError from typing import Tuple, Optional - # Module-level constants to avoid repeated literals and improve maintainability PACKAGE_NAME = "moldflow" NO_UPDATE_ENV_VAR = "MOLDFLOW_API_NO_UPDATE_CHECK" @@ -27,7 +26,6 @@ PYPI_TIMEOUT_SECONDS = 0.5 WARNING_FOOTER = f"To disable this warning, set {NO_UPDATE_ENV_VAR}=1" - def _get_package_version() -> str: """ Get the current package version. @@ -53,7 +51,6 @@ def _get_package_version() -> str: "This likely indicates a build or packaging issue." ) from e - def _parse_version(ver: str) -> tuple: """ Parse version string into a tuple of (major, minor, patch). @@ -71,7 +68,6 @@ def _parse_version(ver: str) -> tuple: nums.append(0) return tuple(nums) - def _process_pypi_releases( releases: dict, current_parsed: tuple ) -> Tuple[Optional[str], Optional[str]]: @@ -130,7 +126,6 @@ def _process_pypi_releases( return latest_in_major_version, latest_overall_version - def _check_for_updates() -> Tuple[Optional[str], Optional[str]]: """ Check PyPI for newer versions of the package. @@ -159,7 +154,6 @@ def _check_for_updates() -> Tuple[Optional[str], Optional[str]]: # Any error (timeout, network issue, etc) should fail silently return None, None - def _pip_cmd(version_string: Optional[str] = None) -> str: """ Construct a pip command using the current Python executable. @@ -180,7 +174,6 @@ def _pip_cmd(version_string: Optional[str] = None) -> str: base += f"=={version_string}" return base - def _show_update_message(minor_update: Optional[str], major_update: Optional[str]) -> None: """ Show update notification message. @@ -232,7 +225,6 @@ def _show_update_message(minor_update: Optional[str], major_update: Optional[str warning_msg = f"{body}\n\n{footer}" warnings.warn(warning_msg, UserWarning) - def check_for_updates_on_import(): """ Perform version check and show update message if updates are available. @@ -247,7 +239,6 @@ def check_for_updates_on_import(): if minor or major: _show_update_message(minor, major) - def get_version() -> str: """ Get the current package version. diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index 19b9870..08e2a7f 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -38,7 +38,6 @@ from .plot import Plot from .vector import Vector - class Viewer: """ Wrapper for Viewer class of Moldflow Synergy. @@ -78,7 +77,6 @@ def reset_view(self, normal_view: Vector | None, up_view: Vector | None) -> None """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="reset_view") - self.viewer.ResetView( check_and_coerce_optional(normal_view, Vector), check_and_coerce_optional(up_view, Vector), @@ -478,9 +476,6 @@ def add_bookmark( process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_bookmark") check_type(name, str) - - - check_type(clipping_range_min, (int, float)) check_is_non_negative(clipping_range_min) check_type(clipping_range_max, (int, float)) From 865f7936b8ae56f5e476e667575b39b5fa451c4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 04:00:11 +0000 Subject: [PATCH 07/14] Merge main branch and resolve GradingFactor enum conflict Resolved merge conflict by accepting removal of GradingFactor enum from main branch. The enum was correctly removed because it restricted the cad_mesh_grading_factor property to discrete values when the COM API supports continuous float values (0.0-1.0). Changes from main branch: - Removed GradingFactor enum (incorrectly restricted API) - Updated MeshGenerator.cad_mesh_grading_factor to accept float values - Added proper range validation (0.0 to 1.0) - Updated CHANGELOG.md to document the breaking change - Removed grading_factor.rst documentation - Added Python 3.14 support Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- CHANGELOG.md | 7 +++--- .../components/enums/grading_factor.rst | 4 ---- src/moldflow/__init__.py | 1 - src/moldflow/common.py | 8 ------- src/moldflow/mesh_generator.py | 8 +++---- .../unit_tests/test_unit_mesh_generator.py | 22 ++++++------------- 6 files changed, 15 insertions(+), 35 deletions(-) delete mode 100644 docs/source/components/enums/grading_factor.rst diff --git a/CHANGELOG.md b/CHANGELOG.md index d094fcc..abf7328 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,19 +8,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- N/A +- Python 3.14 support ### Changed -- N/A +- `MeshGenerator.cad_mesh_grading_factor` now accepts `float` values in range 0.0 to 1.0 instead of enum/integer-coded options ### Deprecated - N/A ### Removed -- N/A +- `GradingFactor` enum - incorrectly restricted the API to discrete values when the COM API accepts continuous float values from 0.0 to 1.0 ### Fixed - Fixed `GeomType` enum not being exposed in package `__init__.py` - users can now import it directly with `from moldflow import GeomType` +- Fixed `MeshGenerator.cad_mesh_grading_factor` to properly accept float/double values matching the COM API signature instead of restricting to enum values ### Security - N/A diff --git a/docs/source/components/enums/grading_factor.rst b/docs/source/components/enums/grading_factor.rst deleted file mode 100644 index 159f4b3..0000000 --- a/docs/source/components/enums/grading_factor.rst +++ /dev/null @@ -1,4 +0,0 @@ -GradingFactor -============= - -.. autoclass:: moldflow.common::GradingFactor diff --git a/src/moldflow/__init__.py b/src/moldflow/__init__.py index d43f07a..b86ab31 100644 --- a/src/moldflow/__init__.py +++ b/src/moldflow/__init__.py @@ -68,7 +68,6 @@ from .common import DuplicateOption from .common import EdgeDisplayOptions from .common import EntityType -from .common import GradingFactor from .common import GeomType from .common import ImportUnitIndex from .common import ImportUnits diff --git a/src/moldflow/common.py b/src/moldflow/common.py index e3416c6..d2836f0 100644 --- a/src/moldflow/common.py +++ b/src/moldflow/common.py @@ -364,14 +364,6 @@ class TriClassification(Enum): PRESERVE_NOT_SLIVER = 1 PRESERVE_ALL = 2 -class GradingFactor(Enum): - """ - Enum for GradingFactor - """ - - SLOW = 0 - FAST = 1 - class GeomType(Enum): """ Enum for GeomType diff --git a/src/moldflow/mesh_generator.py b/src/moldflow/mesh_generator.py index 9dff5a0..e0c7eb9 100644 --- a/src/moldflow/mesh_generator.py +++ b/src/moldflow/mesh_generator.py @@ -13,7 +13,6 @@ NurbsAlgorithm, CoolType, TriClassification, - GradingFactor, GeomType, Mesher3DType, CADContactMesh, @@ -731,15 +730,16 @@ def cad_mesh_grading_factor(self) -> float: return self.mesh_generator.CadMeshGradingFactor @cad_mesh_grading_factor.setter - def cad_mesh_grading_factor(self, value: GradingFactor | int) -> None: + def cad_mesh_grading_factor(self, value: float) -> None: """ Set the CAD mesh grading factor option. """ process_log( __name__, LogMessage.PROPERTY_SET, locals(), name="cad_mesh_grading_factor", value=value ) - value = get_enum_value(value, GradingFactor) - self.mesh_generator.CadMeshGradingFactor = value + check_type(value, (int, float)) + check_range(value, 0, 1, True, True) + self.mesh_generator.CadMeshGradingFactor = float(value) @property def cad_mesh_minimum_curvature_percentage(self) -> float: diff --git a/tests/api/unit_tests/test_unit_mesh_generator.py b/tests/api/unit_tests/test_unit_mesh_generator.py index 3dda457..813f46a 100644 --- a/tests/api/unit_tests/test_unit_mesh_generator.py +++ b/tests/api/unit_tests/test_unit_mesh_generator.py @@ -12,7 +12,6 @@ NurbsAlgorithm, CoolType, TriClassification, - GradingFactor, Mesher3DType, CADContactMesh, ) @@ -134,8 +133,9 @@ def test_functions_no_args( ("cad_auto_size_scale", "CadAutoSizeScale", 50, (int, float)), ("cad_sliver_remove", "CadSliverRemove", True, bool), ("cad_sliver_remove", "CadSliverRemove", False, bool), - ("cad_mesh_grading_factor", "CadMeshGradingFactor", 0, int), - ("cad_mesh_grading_factor", "CadMeshGradingFactor", 1, int), + ("cad_mesh_grading_factor", "CadMeshGradingFactor", 0.0, (int, float)), + ("cad_mesh_grading_factor", "CadMeshGradingFactor", 0.5, (int, float)), + ("cad_mesh_grading_factor", "CadMeshGradingFactor", 1.0, (int, float)), ( "cad_mesh_minimum_curvature_percentage", "CadMeshMinimumCurvaturePercentage", @@ -312,8 +312,9 @@ def test_get_properties( ("cad_auto_size_scale", "CadAutoSizeScale", 50, (int, float)), ("cad_sliver_remove", "CadSliverRemove", True, bool), ("cad_sliver_remove", "CadSliverRemove", False, bool), - ("cad_mesh_grading_factor", "CadMeshGradingFactor", 0, int), - ("cad_mesh_grading_factor", "CadMeshGradingFactor", 1, int), + ("cad_mesh_grading_factor", "CadMeshGradingFactor", 0.0, (int, float)), + ("cad_mesh_grading_factor", "CadMeshGradingFactor", 0.5, (int, float)), + ("cad_mesh_grading_factor", "CadMeshGradingFactor", 1.0, (int, float)), ( "cad_mesh_minimum_curvature_percentage", "CadMeshMinimumCurvaturePercentage", @@ -450,7 +451,7 @@ def test_set_properties( + [("use_auto_size", x) for x in ["abc", -1, 1.0, 1, 1.5, None]] + [("cad_auto_size_scale", x) for x in ["abc", True, None]] + [("cad_sliver_remove", x) for x in ["abc", -1, 1.0, 1, 1.5, None]] - + [("cad_mesh_grading_factor", x) for x in ["abc", True, 1.5, None]] + + [("cad_mesh_grading_factor", x) for x in ["abc", True, None]] + [("cad_mesh_minimum_curvature_percentage", x) for x in ["abc", True, None]] + [("use_fallbacks", x) for x in ["abc", -1, 1.0, 1, 1.5, None]] + [("max_edge_length_in_thickness_direction", x) for x in ["abc", True, None]] @@ -505,7 +506,6 @@ def test_set_properties_invalid_value( "property_name, invalid_value", [("nurbs_mesher", x) for x in [-1, 10, 5]] + [("cad_contact_mesh_type", x) for x in ["abc", "Something"]] - + [("cad_mesh_grading_factor", x) for x in [-1, 10, 5]] + [("source_geom_type", x) for x in ["Hello", "abc"]] + [("cool_type", x) for x in [-1, 10, 5]] + [("tri_classification_opt", x) for x in [-1, 10, 5]], @@ -552,14 +552,6 @@ def test_gel_false(self, mock_mesh_generator, mock_object): ("tri_classification_opt", "TriClassificationOpt", x.value, x.value, int) for x in TriClassification ] - + [ - ("cad_mesh_grading_factor", "CadMeshGradingFactor", x, x.value, int) - for x in GradingFactor - ] - + [ - ("cad_mesh_grading_factor", "CadMeshGradingFactor", x.value, x.value, int) - for x in GradingFactor - ] + [("mesher_3d", "Mesher3D", x, x.value, str) for x in Mesher3DType] + [("mesher_3d", "Mesher3D", x.value, x.value, str) for x in Mesher3DType] + [("source_geom_type", "SourceGeomType", x, x.value, str) for x in GeomType] From 3254cf30aebde648f1760be5352524886e4fe358 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 04:08:13 +0000 Subject: [PATCH 08/14] Merge latest main branch (Sphinx versioning) and resolve whitespace conflict Merged commit 3a50df9 from main branch which introduces Sphinx versioning support. Conflict Resolution: - src/moldflow/common.py: Trivial whitespace conflict after TriClassification enum - Our branch had 1 blank line, main had 2 blank lines - Accepted main's formatting (2 blank lines) for consistency Changes from main: - Added Sphinx versioning support (#57) - New file: docs/source/_static/switcher.json for version switching - Updated docs/source/conf.py with versioning configuration - Enhanced run.py with version management logic - Updated README.md with versioning information - Updated requirements.txt with new dependencies Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- README.md | 4 ++ docs/source/_static/switcher.json | 38 +++++++++++ docs/source/conf.py | 43 ++++++++++++- docs/source/readme.rst | 7 ++- requirements.txt | 1 + run.py | 101 +++++++++++++++++++++++++----- src/moldflow/common.py | 1 + 7 files changed, 179 insertions(+), 16 deletions(-) create mode 100644 docs/source/_static/switcher.json diff --git a/README.md b/README.md index 3275017..cc71939 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,9 @@ python run.py build python run.py build-docs ``` +> ***Note: When releasing a new version, update ``switcher.json`` in ``docs/source/_static/`` + to include the new tag in the version dropdown for documentation.*** + Options: - `--skip-build` (`-s`): Skip building before generating docs @@ -159,6 +162,7 @@ We welcome contributions! Please see our [Contributing Guide](https://github.com We use [Semantic Versioning](https://semver.org/). For available versions, see the [tags on this repository](https://github.com/Autodesk/moldflow-api/tags). + ## License This project is licensed under the Apache License 2.0 - see the [LICENSE](https://github.com/Autodesk/moldflow-api/blob/main/LICENSE) file for details. diff --git a/docs/source/_static/switcher.json b/docs/source/_static/switcher.json new file mode 100644 index 0000000..33b7da0 --- /dev/null +++ b/docs/source/_static/switcher.json @@ -0,0 +1,38 @@ +[ + { + "version": "v26.0.5", + "name": "v26.0.5 (latest)", + "url": "../v26.0.5/", + "is_latest": true + }, + { + "version": "v26.0.4", + "name": "v26.0.4", + "url": "../v26.0.4/", + "is_latest": false + }, + { + "version": "v26.0.3", + "name": "v26.0.3", + "url": "../v26.0.3/", + "is_latest": false + }, + { + "version": "v26.0.2", + "name": "v26.0.2", + "url": "../v26.0.2/", + "is_latest": false + }, + { + "version": "v26.0.1", + "name": "v26.0.1", + "url": "../v26.0.1/", + "is_latest": false + }, + { + "version": "v26.0.0", + "name": "v26.0.0", + "url": "../v26.0.0/", + "is_latest": false + } +] \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index c9c2b29..71053fd 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,6 +8,7 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html import os import sys +from pathlib import Path sys.path.insert( 0, os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', 'src', 'moldflow') @@ -29,9 +30,15 @@ 'sphinx.ext.napoleon', # Supports Google-style/Numpy-style docstrings 'sphinx.ext.viewcode', 'sphinx_autodoc_typehints', + 'sphinx_multiversion', ] templates_path = ['_templates'] +smv_tag_whitelist = r'^v?\d+\.\d+\.\d+$' +smv_branch_whitelist = r'^$' +smv_remote_whitelist = r'^origin$' +smv_latest_version = 'latest' + exclude_patterns = [] # -- Options for autodoc ----------------------------------------------------- @@ -53,9 +60,14 @@ html_theme_options = { "back_to_top_button": False, "github_url": "https://github.com/Autodesk/moldflow-api", - "external_links": "", + "external_links": [ + {"name": "Changelog", "url": "https://github.com/Autodesk/moldflow-api/releases"} + ], "footer_end": "", "footer_start": "copyright", + "navbar_start": ["navbar-logo", "version-switcher"], + "navbar_end": ["theme-switcher", "navbar-icon-links"], + "switcher": {"json_url": "_static/switcher.json", "version_match": smv_latest_version}, } html_static_path = ['_static'] html_title = "Moldflow API" @@ -72,5 +84,34 @@ def skip_member(app, what, name, obj, skip, options): return skip +def set_context_switcher(app, pagename, templatename, context, doctree): + """Set version_match in the switcher to show the correct version label.""" + + # Try output directory name (e.g., v26.0.2) - most reliable for sphinx-multiversion + version_name = None + if hasattr(app, "builder") and hasattr(app.builder, "outdir"): + outdir_name = Path(app.builder.outdir).name + if outdir_name and outdir_name != "html": + version_name = outdir_name + + # Fallback to sphinx-multiversion context + if not version_name: + current = context.get("current_version") + if current: + version_name = getattr(current, "name", None) or ( + current.get("name") if isinstance(current, dict) else None + ) + + # Final fallback + if not version_name: + version_name = smv_latest_version + + # Update switcher config for this page + switcher = dict(app.config.html_theme_options.get("switcher", {})) + switcher["version_match"] = version_name + context["theme_switcher"] = switcher + + def setup(app): app.connect("autodoc-skip-member", skip_member) + app.connect("html-page-context", set_context_switcher) diff --git a/docs/source/readme.rst b/docs/source/readme.rst index 8abbc6c..5855a49 100644 --- a/docs/source/readme.rst +++ b/docs/source/readme.rst @@ -1255,7 +1255,12 @@ The project includes a ``run.py`` script with several useful commands: - ``python run.py test`` - Run tests - ``python run.py lint`` - Run code linting - ``python run.py format`` - Format code with black -- ``python run.py build-docs`` - Build documentation +- ``python run.py build-docs`` - Build versioned documentation (HTML uses git tags for the + navigation dropdown; run ``git fetch --tags`` locally before building) + +.. note:: + When releasing a new version, update ``switcher.json`` in ``docs/source/_static/`` + to include the new tag in the version dropdown. Contributing ============ diff --git a/requirements.txt b/requirements.txt index ee98e74..2e1dad7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,7 @@ pydata-sphinx-theme==0.16.1 pylint==3.3.4 pytest==8.3.4 sphinx==8.1.3 +sphinx-multiversion==0.2.4 sphinx-autodoc-typehints==3.0.1 twine==6.1.0 PyGithub==2.7.0 diff --git a/run.py b/run.py index 5c25149..c477948 100644 --- a/run.py +++ b/run.py @@ -62,10 +62,10 @@ import shutil import glob from urllib.parse import urlparse - import docopt from github import Github import polib +from packaging.version import InvalidVersion, Version WINDOWS = platform.system() == 'Windows' @@ -86,7 +86,9 @@ LOCALE_DIR = os.path.join(MOLDFLOW_DIR, 'locale') DOCS_DIR = os.path.join(ROOT_DIR, 'docs') DOCS_SOURCE_DIR = os.path.join(DOCS_DIR, 'source') +DOCS_STATIC_DIR = os.path.join(DOCS_SOURCE_DIR, '_static') DOCS_BUILD_DIR = os.path.join(DOCS_DIR, 'build') +DOCS_HTML_DIR = os.path.join(DOCS_BUILD_DIR, 'html') COVERAGE_HTML_DIR = os.path.join(ROOT_DIR, 'htmlcov') DIST_DIR = os.path.join(ROOT_DIR, 'dist') @@ -100,6 +102,7 @@ VERSION_FILE = os.path.join(ROOT_DIR, VERSION_JSON) DIST_FILES = os.path.join(ROOT_DIR, 'dist', '*') PYTHON_FILES = [MOLDFLOW_DIR, DOCS_SOURCE_DIR, TEST_DIR, "run.py"] +SWITCHER_JSON = os.path.join(DOCS_STATIC_DIR, 'switcher.json') def run_command(args, cwd=os.getcwd(), extra_env=None): @@ -325,6 +328,51 @@ def build_mo(): ) +def create_latest_alias(build_output: str) -> None: + """Create a 'latest' alias pointing to the newest version using symlinks when possible.""" + version_dirs = [d for d in os.listdir(build_output) if d.startswith('v')] + if not version_dirs: + return + + def version_key(v): + try: + return Version(v.lstrip('v')) + except InvalidVersion: + return Version("0.0.0") + + sorted_versions = sorted(version_dirs, key=version_key, reverse=True) + latest_version = sorted_versions[0] + latest_src = os.path.join(build_output, latest_version) + latest_dest = os.path.join(build_output, 'latest') + + # Verify source exists before proceeding + if not os.path.exists(latest_src): + logging.error("Source directory for 'latest' alias does not exist: %s", latest_src) + return + + # Clean up any existing 'latest' entry first + if os.path.islink(latest_dest): + os.unlink(latest_dest) + elif os.path.isdir(latest_dest): + shutil.rmtree(latest_dest) + elif os.path.exists(latest_dest): + os.remove(latest_dest) + + # Try creating a symbolic link first (most efficient) + logging.info("Creating 'latest' alias for %s", latest_version) + try: + os.symlink(latest_src, latest_dest, target_is_directory=True) + logging.info("Created symbolic link: latest -> %s", latest_version) + except (OSError, NotImplementedError) as err: + # Fall back to copying if symlinks aren't supported + logging.warning( + "Could not create symbolic link for 'latest' alias (%s); " + "falling back to copying documentation.", + err, + ) + shutil.copytree(latest_src, latest_dest) + + def build_docs(target, skip_build): """Build Documentation""" @@ -338,19 +386,44 @@ def build_docs(target, skip_build): shutil.rmtree(DOCS_BUILD_DIR) try: - run_command( - [ - sys.executable, - '-m', - 'sphinx', - 'build', - '-M', - target, - DOCS_SOURCE_DIR, - DOCS_BUILD_DIR, - ], - ROOT_DIR, - ) + if target == 'html': + build_output = os.path.join(DOCS_BUILD_DIR, 'html') + try: + # fmt: off + run_command( + [ + sys.executable, '-m', 'sphinx_multiversion', + DOCS_SOURCE_DIR, build_output + ], + ROOT_DIR, + ) + except Exception as err: + logging.error( + "Failed to build documentation with sphinx_multiversion.\n" + "This can happen if no Git tags or branches match your version pattern.\n" + "Try running 'git fetch --tags' and ensure version tags exist in the repo.\n" + "Underlying error: %s", + str(err), + ) + # Re-raise so the outer handler can log the general failure as well. + raise + # fmt: on + create_latest_alias(build_output) + else: + # For other targets such as latex, pdf, etc. + run_command( + [ + sys.executable, + '-m', + 'sphinx', + 'build', + '-M', + target, + DOCS_SOURCE_DIR, + DOCS_BUILD_DIR, + ], + ROOT_DIR, + ) logging.info('Sphinx documentation built successfully.') except Exception as err: logging.error( diff --git a/src/moldflow/common.py b/src/moldflow/common.py index d2836f0..d1b7c97 100644 --- a/src/moldflow/common.py +++ b/src/moldflow/common.py @@ -364,6 +364,7 @@ class TriClassification(Enum): PRESERVE_NOT_SLIVER = 1 PRESERVE_ALL = 2 + class GeomType(Enum): """ Enum for GeomType From 17f2639c49d314155b55633a8cd28175e898c963 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 04:37:53 +0000 Subject: [PATCH 09/14] Fix Black formatting violations across codebase Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/boundary_conditions.py | 1 + src/moldflow/boundary_list.py | 1 + src/moldflow/cad_manager.py | 8 +++- src/moldflow/circuit_generator.py | 1 + src/moldflow/com_proxy.py | 6 +++ src/moldflow/common.py | 56 ++++++++++++++++++++++++++ src/moldflow/data_transform.py | 9 ++++- src/moldflow/diagnosis_manager.py | 9 ++++- src/moldflow/double_array.py | 1 + src/moldflow/ent_list.py | 9 ++++- src/moldflow/errors.py | 6 +++ src/moldflow/exceptions.py | 2 + src/moldflow/folder_manager.py | 13 ++++-- src/moldflow/helper.py | 30 +++++++++++--- src/moldflow/i18n.py | 2 + src/moldflow/import_options.py | 1 + src/moldflow/integer_array.py | 1 + src/moldflow/layer_manager.py | 14 +++++-- src/moldflow/localization.py | 2 + src/moldflow/logger.py | 5 +++ src/moldflow/material_finder.py | 9 ++++- src/moldflow/material_plot.py | 1 + src/moldflow/material_selector.py | 1 + src/moldflow/mesh_editor.py | 13 ++++-- src/moldflow/mesh_generator.py | 1 + src/moldflow/mesh_summary.py | 1 + src/moldflow/message_box.py | 10 +++++ src/moldflow/model_duplicator.py | 1 + src/moldflow/modeler.py | 10 ++--- src/moldflow/mold_surface_generator.py | 8 +++- src/moldflow/plot.py | 1 + src/moldflow/plot_manager.py | 10 ++++- src/moldflow/predicate.py | 1 + src/moldflow/predicate_manager.py | 10 ++++- src/moldflow/project.py | 1 + src/moldflow/prop.py | 9 ++++- src/moldflow/property_editor.py | 17 +++++--- src/moldflow/runner_generator.py | 1 + src/moldflow/server.py | 1 + src/moldflow/string_array.py | 1 + src/moldflow/study_doc.py | 5 +-- src/moldflow/synergy.py | 1 + src/moldflow/system_message.py | 10 ++++- src/moldflow/unit_conversion.py | 1 + src/moldflow/user_plot.py | 9 ++++- src/moldflow/vector.py | 1 + src/moldflow/vector_array.py | 1 + src/moldflow/version_check.py | 8 ++++ src/moldflow/viewer.py | 1 + tests/core/test_helper.py | 2 +- 50 files changed, 281 insertions(+), 42 deletions(-) diff --git a/src/moldflow/boundary_conditions.py b/src/moldflow/boundary_conditions.py index d39ccc6..fb03be5 100644 --- a/src/moldflow/boundary_conditions.py +++ b/src/moldflow/boundary_conditions.py @@ -15,6 +15,7 @@ from .vector import Vector from .prop import Property + class BoundaryConditions: """ Wrapper for BoundaryConditions class of Moldflow Synergy. diff --git a/src/moldflow/boundary_list.py b/src/moldflow/boundary_list.py index b0364e9..78a09f4 100644 --- a/src/moldflow/boundary_list.py +++ b/src/moldflow/boundary_list.py @@ -11,6 +11,7 @@ from .logger import process_log from .common import LogMessage + class BoundaryList: """ Wrapper for BoundaryList class of Moldflow Synergy. diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index 25474e6..ef34b61 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -9,9 +9,15 @@ from .ent_list import EntList from .vector import Vector from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + coerce_optional_dispatch, +) from .com_proxy import safe_com + class CADManager: """ Wrapper for CADManager class of Moldflow Synergy. diff --git a/src/moldflow/circuit_generator.py b/src/moldflow/circuit_generator.py index 47af098..5ab77cb 100644 --- a/src/moldflow/circuit_generator.py +++ b/src/moldflow/circuit_generator.py @@ -10,6 +10,7 @@ from .helper import check_type from .com_proxy import safe_com + class CircuitGenerator: """ Wrapper for CircuitGenerator class of Moldflow Synergy. diff --git a/src/moldflow/com_proxy.py b/src/moldflow/com_proxy.py index f7e0ea7..7d48e3e 100644 --- a/src/moldflow/com_proxy.py +++ b/src/moldflow/com_proxy.py @@ -17,6 +17,7 @@ # Helper: Verify COM attribute existence # ------------------------------------------------------------------ + def _verify_com_attribute(obj, attribute: str): """ Raise *AttributeError* if *attribute* is not present on *obj*. @@ -33,6 +34,7 @@ def _verify_com_attribute(obj, attribute: str): raise_attribute_error(attribute) process_log(__name__, LogMessage.VALID_INPUT) + class SafeCOMProxy: """Lightweight proxy around a COM object that validates attribute access. @@ -112,6 +114,7 @@ def __hash__(self): """ return hash(self._com) + def safe_com(obj): """ Return a *SafeCOMProxy* wrapping *obj* if it isn’t already wrapped. @@ -121,10 +124,12 @@ def safe_com(obj): """ return obj if isinstance(obj, SafeCOMProxy) else SafeCOMProxy(obj) + # ------------------------------------------------------------------ # Helper to expose _oleobj_ on wrapper objects # ------------------------------------------------------------------ + def expose_oleobj(container, attr_name="_com"): """Attach `_oleobj_` to *container* by copying it from the wrapped COM object. @@ -153,6 +158,7 @@ def expose_oleobj(container, attr_name="_com"): # not be passable to COM until the attribute appears. pass + def flag_com_method(com_object, method_name: str): """ Ensure *method_name* on *com_object* is dispatched as a method. diff --git a/src/moldflow/common.py b/src/moldflow/common.py index d1b7c97..94791fe 100644 --- a/src/moldflow/common.py +++ b/src/moldflow/common.py @@ -8,6 +8,7 @@ import logging from enum import Enum + class MaterialDatabase(Enum): """ Enum for different material database with IDs. @@ -25,6 +26,7 @@ class MaterialDatabase(Enum): MUCELL_MATERIAL_PROPERTIES = 21300 INJECTION_MOLDING_MACHINE = 30007 + class MaterialDatabaseType(Enum): """ Enum for different material database types. @@ -33,6 +35,7 @@ class MaterialDatabaseType(Enum): SYSTEM = "System" USER = "User" + class CrossSectionType(Enum): """ Enum for different cross-section type @@ -45,6 +48,7 @@ class CrossSectionType(Enum): U_SHAPE = "U-shape" TRAPEZOIDAL = "Trapezoidal" + class MeshType(Enum): """ Enum for different mesh types. @@ -54,6 +58,7 @@ class MeshType(Enum): MESH_FUSION = "Fusion" MESH_3D = "3D" + class ImportUnits(Enum): """ Enum for ImportUnits @@ -64,6 +69,7 @@ class ImportUnits(Enum): M = "m" IN = "in" + class ImportUnitIndex(Enum): """ Enum for ImportUnits @@ -74,6 +80,7 @@ class ImportUnitIndex(Enum): M = 2 IN = 3 + class MDLKernel(Enum): """ Enum for MDLKernel @@ -82,6 +89,7 @@ class MDLKernel(Enum): PARAMETRIC = "Parametric" PARASOLID = "Parasolid" + class MDLContactMeshType(Enum): """ Enum for MDLContactMeshType @@ -91,6 +99,7 @@ class MDLContactMeshType(Enum): FAULT_TOLERANCE = "Fault tolerant" IGNORE_CONTACT = "Ignore contact" + class CADBodyProperty(Enum): """ Enum for CADBodyProperty @@ -100,6 +109,7 @@ class CADBodyProperty(Enum): PROPERTY_3D_CHANNEL = 40915 PROPERTY_MOLD_COMPONENT = 40912 + class ItemType(Enum): """ Enum for ItemType @@ -109,6 +119,7 @@ class ItemType(Enum): REPORT = "Report" FOLDER = "Folder" + class DuplicateOption(Enum): """ Enum for DuplicateOption @@ -118,6 +129,7 @@ class DuplicateOption(Enum): NO_RESULTS_FILES_INCLUDED = 1 INCLUDE_RESULT_FILES_LINKED_TO_ORIGINAL = 2 + class SystemUnits(Enum): """ System of units @@ -127,6 +139,7 @@ class SystemUnits(Enum): ENGLISH = "English" STANDARD = "SI" + class ErrorMessage(Enum): """ Enum for error messages. @@ -139,6 +152,7 @@ class ErrorMessage(Enum): ATTRIBUTE_ERROR = "Invalid Attribute: {attribute} is not supported" SYNERGY_ERROR = "Failed to initialize Synergy: Synergy not found" + class LogMessage(Enum): """ Enum for translated messages. @@ -188,6 +202,7 @@ class LogMessage(Enum): NONE_LOGGER = ("Logger was not setup", logging.WARNING) # Critical logs + class ValueErrorReason(Enum): """Reasons for raising a ValueError.""" @@ -207,6 +222,7 @@ class ValueErrorReason(Enum): INVALID_VALUE = "found {value}, must be one of {expected_values}" BOTH_PARAMETERS_REQUIRED = "both {first} and {second} must be provided together" + class MoldingProcess(Enum): """Type of molding process""" @@ -230,6 +246,7 @@ class MoldingProcess(Enum): MULTIPLE_BARREL_REACTIVE_MOLDING = "Multiple-Barrel Reactive Molding" COOLANT_FLOW = "Coolant Flow" + class MaterialIndex(Enum): """ Enum for different material index. @@ -238,6 +255,7 @@ class MaterialIndex(Enum): FIRST = 0 SECOND = 1 + class EntityType(Enum): """ Enum for EntityType @@ -256,6 +274,7 @@ class EntityType(Enum): TET4 = "TE" STL = "STL" + class DisplayOption(Enum): """ Enum for DisplayOption @@ -273,6 +292,7 @@ class DisplayOption(Enum): SOLID_PLUS_NET = "Solid + Net" TRANSPARENT_PLUS_NET = "Transparent + Net" + class AnalysisType(Enum): """ Enum for AnalysisType @@ -283,6 +303,7 @@ class AnalysisType(Enum): STRESS_WARP = 3 CORE_SHIFT = 4 + class ConstraintType(Enum): """ Enum for ConstraintType @@ -292,6 +313,7 @@ class ConstraintType(Enum): FREE = 2 SPECIFIC = 3 + class TransformFunctions(Enum): """ Enum for TransformFunctions @@ -307,6 +329,7 @@ class TransformFunctions(Enum): LOGARITHM = "log" SQUARE_ROOT = "sqrt" + class TransformOperations(Enum): """ Enum for TransformOperations @@ -317,6 +340,7 @@ class TransformOperations(Enum): MULTIPLY = "*" DIVIDE = "/" + class TransformScalarOperations(Enum): """ Enum for TransformScalarOperations @@ -329,6 +353,7 @@ class TransformScalarOperations(Enum): POST_DIVIDE = "/=" POST_MINUS = "-=" + class CommitActions(Enum): """ Enum for CommitActions @@ -339,6 +364,7 @@ class CommitActions(Enum): PROCESS_CONDITIONS = "Process Conditions" REMOVE_UNUSED = "Remove Unused" + class NurbsAlgorithm(Enum): """ Enum for NurbsMesher @@ -347,6 +373,7 @@ class NurbsAlgorithm(Enum): DEFAULT = 0 ADVANCING_FRONT = 1 + class CoolType(Enum): """ Enum for CoolType @@ -355,6 +382,7 @@ class CoolType(Enum): BEM = 1 FEM = 2 + class TriClassification(Enum): """ Enum for TriClassification @@ -374,6 +402,7 @@ class GeomType(Enum): FUSION = "Fusion" MIDPLANE = "Midplane" + class Mesher3DType(Enum): """ Enum for Mesher3DType @@ -383,6 +412,7 @@ class Mesher3DType(Enum): LEGACY = "Legacy" ADVANCING_LAYERS = "AdvancingLayers" + class CADContactMesh(Enum): """ Enum for CADContactMesh @@ -392,6 +422,7 @@ class CADContactMesh(Enum): FAULT_TOLERANCE = "Fault tolerant" IGNORE_CONTACT = "Ignore contact" + class UserPlotType(Enum): """ Enum for UserPlotType @@ -401,6 +432,7 @@ class UserPlotType(Enum): NODE_DATA = "NDDT" NON_MESH_DATA = "NMDT" + class BirefringenceResultType(Enum): """ Enum for BirefringenceResultType @@ -411,6 +443,7 @@ class BirefringenceResultType(Enum): RETARDANCE_TENSOR = 2 FRINGE_PATTERN = 3 + class DeflectionType(Enum): """ Enum for DeflectionType @@ -421,6 +454,7 @@ class DeflectionType(Enum): DEFL_W = "DEFL_W" DEFL_W2 = "DEFL_W2" + class DisplayComponent(Enum): """ Enum for DisplayComponent @@ -440,6 +474,7 @@ class DisplayComponent(Enum): SECOND_TENSOR_PRINCIPAL_VALUE = 7 THIRD_TENSOR_PRINCIPAL_VALUE = 8 + class ScaleOptions(Enum): """ Enum for ScaleOption @@ -449,6 +484,7 @@ class ScaleOptions(Enum): AUTOMATIC_SCALING_WITH_COLORS_SCALED_PER_FRAME = 1 SPECIFIED_MANUAL_SCALING = 2 + class PlotMethod(Enum): """ Enum for PlotMethod @@ -464,6 +500,7 @@ class PlotMethod(Enum): DISPLAY_TENSOR_PRINCIPAL_VECTOR_AS_DARTS = 128 DISPLAY_TENSOR_PRINCIPAL_VECTOR_AS_SEGMENTS = 256 + class AnimationType(Enum): """ Enum for AnimationType @@ -472,6 +509,7 @@ class AnimationType(Enum): FRAME_ANIMATION = 0 MIN_MAX_ANIMATION = 1 + class ColorTableIDs(Enum): """ Enum for ColorTableIDs @@ -484,6 +522,7 @@ class ColorTableIDs(Enum): SINGLE_COLOR = 1000 TRAFFIC_LIGHT = 1100 + class EdgeDisplayOptions(Enum): """ Enum for EdgeDisplayOptions @@ -493,6 +532,7 @@ class EdgeDisplayOptions(Enum): FEATURE_EDGE = 1 MESH_EDGE = 2 + class DeflectionScaleDirections(Enum): """ Enum for DeflectionScaleDirections @@ -503,6 +543,7 @@ class DeflectionScaleDirections(Enum): Z = 2 ALL = 3 + class SliceAtProbeOptions(Enum): """ Enum for SliceAtProbeOptions @@ -512,6 +553,7 @@ class SliceAtProbeOptions(Enum): MINIMUM = "Minimum" MAXIMUM = "Maximum" + class TensorAxisRatioOptions(Enum): """ Enum for TensorAxisRatioOptions @@ -521,6 +563,7 @@ class TensorAxisRatioOptions(Enum): THREE_TWO_ONE = 1 PROPORTIONAL_TO_PRINCIPAL_VALUES = 2 + class ShrinkageCompensationOptions(Enum): """ Enum for ShrinkageCompensationOptions @@ -531,6 +574,7 @@ class ShrinkageCompensationOptions(Enum): ANISOTROPIC = "Anisotropic" NONE = "None" + class TraceModes(Enum): """ Enum for TraceModes @@ -539,6 +583,7 @@ class TraceModes(Enum): ALL_PATHLINES = 0 TERMINATING_IN_SELECTED_AREA = 1 + class TraceStyles(Enum): """ Enum for TraceStyles @@ -548,6 +593,7 @@ class TraceStyles(Enum): MARKERS = 1 TUBES = 2 + class ScaleTypes(Enum): """ Enum for ScaleTypes @@ -556,6 +602,7 @@ class ScaleTypes(Enum): DEFAULT = 0 SPECIFIED = 1 + class ColorScaleOptions(Enum): """ Enum for ColorScaleOptions @@ -564,6 +611,7 @@ class ColorScaleOptions(Enum): BLUE_TO_RED = True RED_TO_BLUE = False + class ViewModes(Enum): """ Enum for ViewModes projections @@ -572,6 +620,7 @@ class ViewModes(Enum): PARALLEL_PROJECTION = 0 PERSPECTIVE_PROJECTION = 1 + class StandardViews(Enum): """ Enum for StandardViews @@ -601,6 +650,7 @@ class StandardViews(Enum): BACK_BOTTOM_RIGHT = "BackBottomRight" ISOMETRIC = "Isometric" + class AnimationSpeed(Enum): """ Enum for AnimationSpeed @@ -610,6 +660,7 @@ class AnimationSpeed(Enum): MEDIUM = "Medium" FAST = "Fast" + class ClampForcePlotDirection(Enum): """ Enum for ClampForcePlotDirection @@ -619,6 +670,7 @@ class ClampForcePlotDirection(Enum): Y = 1 Z = 2 + class ModulusPlotDirection(Enum): """ Enum for ModulusPlotDirection @@ -628,6 +680,7 @@ class ModulusPlotDirection(Enum): EYY = 1 EZZ = 2 + class PlotType(Enum): """ Enum for PlotType @@ -656,6 +709,7 @@ class PlotType(Enum): PLOT_FUSION_SINK_MARK_PLOT = 24 PLOT_DOE_RESPONSE_SURFACE_PLOT = 25 + class LCSType(Enum): """ Enum for LCS_Type @@ -664,6 +718,7 @@ class LCSType(Enum): COORDINATE_SYSTEM = "LCS" MODELLING_PLANE = "Plane" + class CurveInitPosition(Enum): """ Enum for Curve_Init_Position @@ -672,6 +727,7 @@ class CurveInitPosition(Enum): START = 0 END = 1 + class PropertyType(Enum): """ Enum for PropertyType diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index 9b568ee..110daa1 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -7,12 +7,19 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + get_enum_value, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .common import TransformFunctions, TransformOperations, TransformScalarOperations from .integer_array import IntegerArray from .double_array import DoubleArray + class DataTransform: """ Wrapper for DataTransform class of Moldflow Synergy. diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index 47d30a3..4d9f378 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -9,13 +9,20 @@ from .logger import process_log from .common import LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, check_min_max, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + check_min_max, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .ent_list import EntList from .mesh_summary import MeshSummary from .integer_array import IntegerArray from .double_array import DoubleArray + class DiagnosisManager: """ Wrapper for DiagnosisManager class of Moldflow Synergy. diff --git a/src/moldflow/double_array.py b/src/moldflow/double_array.py index bd45a55..be3cd28 100644 --- a/src/moldflow/double_array.py +++ b/src/moldflow/double_array.py @@ -11,6 +11,7 @@ from .com_proxy import flag_com_method, safe_com from .common import LogMessage + class DoubleArray: """ Wrapper for DoubleArray class of Moldflow Synergy. diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 8d21c6a..851683f 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -6,12 +6,19 @@ EntList Class API Wrapper """ -from .helper import check_index, check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch +from .helper import ( + check_index, + check_type, + check_optional_type, + check_and_coerce_optional, + coerce_optional_dispatch, +) from .com_proxy import safe_com, expose_oleobj from .predicate import Predicate from .common import LogMessage from .logger import process_log + class EntList: """ Wrapper for EntList class of Moldflow Synergy. diff --git a/src/moldflow/errors.py b/src/moldflow/errors.py index 99c395f..cefc4c0 100644 --- a/src/moldflow/errors.py +++ b/src/moldflow/errors.py @@ -8,6 +8,7 @@ from .common import ValueErrorReason, ErrorMessage from .exceptions import SaveError, SynergyError + def raise_type_error(variable, types: tuple | str) -> NoReturn: """ Raise a TypeError if the variable is not an instance of the specified type(s). @@ -32,6 +33,7 @@ def raise_type_error(variable, types: tuple | str) -> NoReturn: ) raise TypeError(localised_err_msg) + def raise_value_error(reason: ValueErrorReason | str, **kwargs) -> NoReturn: """ Raise a ValueError with a custom error message. @@ -51,6 +53,7 @@ def raise_value_error(reason: ValueErrorReason | str, **kwargs) -> NoReturn: localised_err_msg = _(err_msg).format(reason=localised_reason) raise ValueError(localised_err_msg) + def raise_index_error() -> NoReturn: """ Raise an IndexError if the index is out of range. @@ -62,6 +65,7 @@ def raise_index_error() -> NoReturn: err_msg = ErrorMessage.INDEX_ERROR.value raise IndexError(_(err_msg)) + def raise_save_error(saving: str, file_name: str) -> NoReturn: """ Raise a SaveError if the save operation fails. @@ -78,6 +82,7 @@ def raise_save_error(saving: str, file_name: str) -> NoReturn: localised_err_msg = _(err_msg).format(saving=saving, file_name=file_name) raise SaveError(localised_err_msg) + def raise_attribute_error(attribute: str) -> NoReturn: """Raise an AttributeError with a localised custom error message. @@ -89,6 +94,7 @@ def raise_attribute_error(attribute: str) -> NoReturn: localised_err_msg = _(err_msg).format(attribute=attribute) raise AttributeError(localised_err_msg) + def raise_synergy_error() -> NoReturn: """ Raise a SynergyError with a localised custom error message. diff --git a/src/moldflow/exceptions.py b/src/moldflow/exceptions.py index 77fc799..cf3d3c5 100644 --- a/src/moldflow/exceptions.py +++ b/src/moldflow/exceptions.py @@ -5,6 +5,7 @@ from .common import ErrorMessage + class SaveError(Exception): """Exception raised when saving a file fails.""" @@ -18,6 +19,7 @@ def __init__(self, message: str) -> None: super().__init__(message) self.message = message + class SynergyError(Exception): """Exception raised when Synergy fails to initialize.""" diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index b50ecc6..dfe9fa8 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -9,9 +9,17 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .common import EntityType, DisplayOption -from .helper import get_enum_value, check_type, check_optional_type, check_and_coerce_optional, check_range, coerce_optional_dispatch +from .helper import ( + get_enum_value, + check_type, + check_optional_type, + check_and_coerce_optional, + check_range, + coerce_optional_dispatch, +) from .com_proxy import safe_com + class FolderManager: """ Wrapper for FolderManager class of Moldflow Synergy. @@ -85,8 +93,7 @@ def add_objects_to_folder(self, objects: EntList | None, folder: EntList | None) process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="add_objects_to_folder") return self.folder_manager.AddObjectsToFolder( - check_and_coerce_optional(objects, EntList), - check_and_coerce_optional(folder, EntList), + check_and_coerce_optional(objects, EntList), check_and_coerce_optional(folder, EntList) ) def remove_objects_from_folder(self, objects: EntList | None) -> bool: diff --git a/src/moldflow/helper.py b/src/moldflow/helper.py index 2322cbd..19a3575 100644 --- a/src/moldflow/helper.py +++ b/src/moldflow/helper.py @@ -13,6 +13,7 @@ from .common import ValueErrorReason, LogMessage from .logger import process_log + def get_enum_value(value, enum: Enum): """ Check if the value is part of the given enum class. @@ -43,6 +44,7 @@ def get_enum_value(value, enum: Enum): process_log(__name__, LogMessage.VALUE_NOT_IN_ENUM, locals(), value=value, enum_name=enum_name) return value + def check_type(value, types: tuple | type): """ Check if the value is of the specified type(s). @@ -73,6 +75,7 @@ def check_type(value, types: tuple | type): raise_type_error(value, types) process_log(__name__, LogMessage.VALID_INPUT) + def check_optional_type(value, types: tuple | type): """ Check if the value is of the specified type(s) or None. @@ -100,6 +103,7 @@ def check_optional_type(value, types: tuple | type): return check_type(value, types) + def _compare(value1, value2, inclusive): """ Compare two values @@ -118,6 +122,7 @@ def _compare(value1, value2, inclusive): return True return inclusive and value1 == value2 + def check_range( value: float, min_value: float = None, @@ -177,6 +182,7 @@ def check_range( raise_value_error(reason, **reason_format) process_log(__name__, LogMessage.VALID_INPUT) + def check_is_non_negative(value: float): """ Check if the value is non-negative. @@ -191,6 +197,7 @@ def check_is_non_negative(value: float): raise_value_error(ValueErrorReason.NON_NEGATIVE, value=value) process_log(__name__, LogMessage.VALID_INPUT) + def check_is_positive(value: float): """ Check if the value is posiive [0 not included]. @@ -205,6 +212,7 @@ def check_is_positive(value: float): raise_value_error(ValueErrorReason.POSITIVE, value=value) process_log(__name__, LogMessage.VALID_INPUT) + def check_is_negative(value: float): """ Check if the value is negative. @@ -219,6 +227,7 @@ def check_is_negative(value: float): raise_value_error(ValueErrorReason.NEGATIVE, value=value) process_log(__name__, LogMessage.VALID_INPUT) + def check_is_non_zero(value: float): """ Check if the value is non-zero. @@ -233,6 +242,7 @@ def check_is_non_zero(value: float): raise_value_error(ValueErrorReason.NON_ZERO, value=value) process_log(__name__, LogMessage.VALID_INPUT) + def check_index(index: int, min_value: int, max_value: int): """ Check if the index is within the specified range. @@ -252,6 +262,7 @@ def check_index(index: int, min_value: int, max_value: int): raise_index_error() process_log(__name__, LogMessage.VALID_INPUT) + def check_file_extension(file_name: str, extensions: tuple | str): """ Check if the file name has a valid extension. @@ -279,6 +290,7 @@ def check_file_extension(file_name: str, extensions: tuple | str): file_name = file_name + default return file_name + def check_expected_values(value, expected_values: tuple): """ Check if the value is in the expected values. @@ -296,6 +308,7 @@ def check_expected_values(value, expected_values: tuple): ValueErrorReason.INVALID_VALUE, value=value, expected_values=expected_values ) + def check_min_max(min_value: float, max_value: float): """ Check if the min_value is less than or equal to the max_value. @@ -313,6 +326,7 @@ def check_min_max(min_value: float, max_value: float): ValueErrorReason.MIN_MORE_THAN_MAX, min_value=min_value, max_value=max_value ) + def _mf_array_to_list(array_instance): """ Generic helper function to convert any array instance to a list. @@ -325,10 +339,12 @@ def _mf_array_to_list(array_instance): """ return [array_instance.val(i) for i in range(array_instance.size)] + def variant_null_idispatch(): """Return a VARIANT representing a null IDispatch pointer (VT_DISPATCH, None).""" return VARIANT(pythoncom.VT_DISPATCH, None) + def coerce_optional_dispatch(value, attr_name: str | None = None): """ Coerce an optional COM object argument declared as VTS_DISPATCH. @@ -350,6 +366,7 @@ def coerce_optional_dispatch(value, attr_name: str | None = None): value = getattr(value, attr_name) return value + # Type to attribute name mapping for COM objects _TYPE_TO_ATTR_MAP = { 'EntList': 'ent_list', @@ -363,6 +380,7 @@ def coerce_optional_dispatch(value, attr_name: str | None = None): 'StringArray': 'string_array', } + def check_and_coerce_optional(value, expected_type: type): """ Check if the value is of the expected type or None, and coerce it for COM dispatch. @@ -388,26 +406,26 @@ def check_and_coerce_optional(value, expected_type: type): >>> nodes = EntList(...) >>> coerced = check_and_coerce_optional(nodes, EntList) >>> # Returns nodes.ent_list - + >>> check_and_coerce_optional(None, EntList) >>> # Returns variant_null_idispatch() - + >>> check_and_coerce_optional(42, int) >>> # Returns 42 (primitive types are passed through) """ # First validate the type check_optional_type(value, expected_type) - + # If None, return null dispatch if value is None: return variant_null_idispatch() - + # Get the type name type_name = expected_type.__name__ - + # Check if this is a COM object type that needs unwrapping attr_name = _TYPE_TO_ATTR_MAP.get(type_name) - + if attr_name: # COM object - unwrap the attribute return getattr(value, attr_name) diff --git a/src/moldflow/i18n.py b/src/moldflow/i18n.py index 8a348e6..c26b53b 100644 --- a/src/moldflow/i18n.py +++ b/src/moldflow/i18n.py @@ -13,6 +13,7 @@ _translator: Callable[[str], str] | None = None + def install_translation( domain: str, localedir: str, languages: list[str] | None ) -> Callable[[str], str]: @@ -26,6 +27,7 @@ def install_translation( return _translator + def get_text() -> Callable[[str], str]: """ Return the active gettext function. diff --git a/src/moldflow/import_options.py b/src/moldflow/import_options.py index a18e9f8..175501c 100644 --- a/src/moldflow/import_options.py +++ b/src/moldflow/import_options.py @@ -12,6 +12,7 @@ from .helper import get_enum_value, check_type, check_is_non_negative from .com_proxy import safe_com + class ImportOptions: """ Wrapper for ImportOptions class of Moldflow Synergy. diff --git a/src/moldflow/integer_array.py b/src/moldflow/integer_array.py index 827f222..ab4c4a4 100644 --- a/src/moldflow/integer_array.py +++ b/src/moldflow/integer_array.py @@ -11,6 +11,7 @@ from .com_proxy import safe_com, flag_com_method from .common import LogMessage + class IntegerArray: """ Wrapper for IntegerArray class of Moldflow Synergy. diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index 2983e14..888a968 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -9,9 +9,17 @@ from .ent_list import EntList from .common import EntityType, DisplayOption from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, check_range, get_enum_value, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + check_range, + get_enum_value, + coerce_optional_dispatch, +) from .com_proxy import safe_com + class LayerManager: """ Wrapper for LayerManager class of Moldflow Synergy. @@ -551,6 +559,4 @@ def allow_clipping(self, layer: EntList | None, checked: bool) -> bool: process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="allow_clipping") check_type(checked, bool) - return self.layer_manager.AllowClipping( - check_and_coerce_optional(layer, EntList), checked - ) + return self.layer_manager.AllowClipping(check_and_coerce_optional(layer, EntList), checked) diff --git a/src/moldflow/localization.py b/src/moldflow/localization.py index 9e9a8ba..c51598f 100644 --- a/src/moldflow/localization.py +++ b/src/moldflow/localization.py @@ -22,6 +22,7 @@ from .i18n import install_translation, get_text from .logger import process_log + def get_locale(product_name: str = "Moldflow Synergy", version: str = ""): """ Get the locale of the specified Autodesk product from the Windows registry. @@ -94,6 +95,7 @@ def _fetch_registry_value( _process_locale("Default", "", DEFAULT_BCP_47_STD) return DEFAULT_THREE_LETTER_CODE + def set_language(product_name: str = "Moldflow Synergy", version: str = "", locale: str = ""): """ Set the language for the application based on the product name and version. diff --git a/src/moldflow/logger.py b/src/moldflow/logger.py index 6457b1d..697425c 100644 --- a/src/moldflow/logger.py +++ b/src/moldflow/logger.py @@ -23,6 +23,7 @@ }, } + class SafeStreamHandler(logging.StreamHandler): """Stream handler that falls back to backslash-escaping on encoding errors. @@ -51,6 +52,7 @@ def emit(self, record): # type: ignore[override] except Exception: # pragma: no cover - delegate to logging error handler self.handleError(record) + def set_is_logging(is_logging: bool): """ Enables or Disables moldflow API logging system @@ -60,6 +62,7 @@ def set_is_logging(is_logging: bool): global _IS_LOGGING _IS_LOGGING = is_logging + def configure_file_logging( command_line_logs: bool, log_file: bool, log_file_name: str = DEFAULT_LOG_FILE ): @@ -112,6 +115,7 @@ def configure_file_logging( moldflow_logger.setLevel(root_logger.getEffectiveLevel()) + def get_logger(name) -> logging.Logger | None: """ Retrieve or create a logger with the specified name. @@ -129,6 +133,7 @@ def get_logger(name) -> logging.Logger | None: return logger return None + def process_log(logger_name: str, message_log: LogMessage | str, dump=None, **kwargs): """ Processes a log entry with the message_log. diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index 78cd10b..5268dcc 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -9,10 +9,17 @@ from .prop import Property from .common import MaterialDatabase, MaterialDatabaseType from .logger import process_log -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + get_enum_value, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .common import LogMessage + class MaterialFinder: """ Wrapper for MaterialFinder class of Moldflow Synergy. diff --git a/src/moldflow/material_plot.py b/src/moldflow/material_plot.py index a9733b0..0c9a64b 100644 --- a/src/moldflow/material_plot.py +++ b/src/moldflow/material_plot.py @@ -11,6 +11,7 @@ from .logger import process_log from .common import LogMessage + class MaterialPlot: """ Wrapper for MaterialPlot class of Moldflow Synergy. diff --git a/src/moldflow/material_selector.py b/src/moldflow/material_selector.py index a708f9b..ce3f45c 100644 --- a/src/moldflow/material_selector.py +++ b/src/moldflow/material_selector.py @@ -11,6 +11,7 @@ from .helper import check_type, check_is_non_negative, check_range, get_enum_value from .com_proxy import safe_com + class MaterialSelector: """ Wrapper for MaterialSelector class of Moldflow Synergy. diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index e71109f..83a57dc 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -13,9 +13,17 @@ from .ent_list import EntList from .vector import Vector from .prop import Property -from .helper import check_type, check_optional_type, check_and_coerce_optional, check_range, check_is_non_negative, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + check_range, + check_is_non_negative, + coerce_optional_dispatch, +) from .com_proxy import safe_com + class MeshEditor: """ Wrapper for MeshEditor class of Moldflow Synergy. @@ -357,8 +365,7 @@ def align_normals(self, seed_tri: EntList | None, tris: EntList | None) -> int: process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="align_normals") return self.mesh_editor.AlignNormals( - check_and_coerce_optional(seed_tri, EntList), - check_and_coerce_optional(tris, EntList), + check_and_coerce_optional(seed_tri, EntList), check_and_coerce_optional(tris, EntList) ) def fill_hole(self, nodes: EntList | None, fill_type: int | None = None) -> bool: diff --git a/src/moldflow/mesh_generator.py b/src/moldflow/mesh_generator.py index e0c7eb9..2d02a69 100644 --- a/src/moldflow/mesh_generator.py +++ b/src/moldflow/mesh_generator.py @@ -20,6 +20,7 @@ from .helper import check_type, check_range, get_enum_value from .com_proxy import safe_com + class MeshGenerator: """ Wrapper for MeshGenerator class of Moldflow Synergy. diff --git a/src/moldflow/mesh_summary.py b/src/moldflow/mesh_summary.py index 334b7e1..bb9a9ac 100644 --- a/src/moldflow/mesh_summary.py +++ b/src/moldflow/mesh_summary.py @@ -10,6 +10,7 @@ from .common import LogMessage from .com_proxy import safe_com + class MeshSummary: """ Wrapper for MeshSummary class of Moldflow Synergy. diff --git a/src/moldflow/message_box.py b/src/moldflow/message_box.py index adc223b..b4b831e 100644 --- a/src/moldflow/message_box.py +++ b/src/moldflow/message_box.py @@ -157,6 +157,7 @@ # Defaults DEFAULT_TITLE = "Moldflow" + class MessageBoxType(Enum): """ Message box types supported by the convenience API. @@ -184,6 +185,7 @@ class MessageBoxType(Enum): CANCEL_TRY_CONTINUE = auto() INPUT = auto() + class MessageBoxResult(Enum): """ Result of a message box interaction. @@ -202,9 +204,11 @@ class MessageBoxResult(Enum): TRY_AGAIN = auto() CONTINUE = auto() + # Public type alias for show() return value MessageBoxReturn: TypeAlias = Union[MessageBoxResult, Optional[str]] + class MessageBoxIcon(Enum): """ Icon to display on the message box. If not provided, a sensible default is @@ -217,6 +221,7 @@ class MessageBoxIcon(Enum): ERROR = auto() QUESTION = auto() + class MessageBoxModality(Enum): """Modality for the message box window.""" @@ -224,6 +229,7 @@ class MessageBoxModality(Enum): SYSTEM = auto() TASK = auto() + class MessageBoxDefaultButton(Enum): """Which button is the default (activated by Enter).""" @@ -232,6 +238,7 @@ class MessageBoxDefaultButton(Enum): BUTTON3 = auto() BUTTON4 = auto() + # Mapping dictionaries (module-level) for flags and results MAPPING_MESSAGEBOX_TYPE = { MessageBoxType.INFO: (WIN_MB_OK, MessageBoxIcon.INFORMATION, 1), @@ -275,6 +282,7 @@ class MessageBoxDefaultButton(Enum): WIN_IDCONTINUE: MessageBoxResult.CONTINUE, } + @dataclass(frozen=True) class MessageBoxOptions: # pylint: disable=too-many-instance-attributes """ @@ -343,6 +351,7 @@ def __post_init__(self) -> None: if self.char_limit is not None and self.char_limit < 0: object.__setattr__(self, "char_limit", 0) + class MessageBox: """ MessageBox convenience class. @@ -536,6 +545,7 @@ def _show_input_dialog(self) -> Optional[str]: dialog = _Win32InputDialog(self.title, self.text, self.options) return dialog.run() + class _Win32InputDialog: """ Modal input dialog using DialogBoxIndirectParamW with an in-memory DLGTEMPLATE. diff --git a/src/moldflow/model_duplicator.py b/src/moldflow/model_duplicator.py index 95bf77b..f89ca45 100644 --- a/src/moldflow/model_duplicator.py +++ b/src/moldflow/model_duplicator.py @@ -10,6 +10,7 @@ from .helper import check_type from .com_proxy import safe_com + class ModelDuplicator: """ Wrapper for ModelDuplicator class of Moldflow Synergy. diff --git a/src/moldflow/modeler.py b/src/moldflow/modeler.py index 02f26de..ada64d6 100644 --- a/src/moldflow/modeler.py +++ b/src/moldflow/modeler.py @@ -25,6 +25,7 @@ from .ent_list import EntList from .vector import Vector + class Modeler: """ Wrapper for Modeler class of Moldflow Synergy. @@ -406,8 +407,7 @@ def break_curves(self, curve1: EntList | None, curve2: EntList | None) -> bool: process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="break_curves") return self.modeler.BreakCurves( - check_and_coerce_optional(curve1, EntList), - check_and_coerce_optional(curve2, EntList), + check_and_coerce_optional(curve1, EntList), check_and_coerce_optional(curve2, EntList) ) def set_property(self, ents: EntList | None, prop_set: Property | None) -> bool: @@ -533,8 +533,7 @@ def create_hole_by_boundary(self, region: EntList | None, curve: EntList | None) process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_boundary") return self.modeler.CreateHoleByBoundary( - check_and_coerce_optional(region, EntList), - check_and_coerce_optional(curve, EntList), + check_and_coerce_optional(region, EntList), check_and_coerce_optional(curve, EntList) ) def create_hole_by_nodes(self, region: EntList | None, nodes: EntList | None) -> bool: @@ -551,8 +550,7 @@ def create_hole_by_nodes(self, region: EntList | None, nodes: EntList | None) -> process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="create_hole_by_nodes") return self.modeler.CreateHoleByNodes( - check_and_coerce_optional(region, EntList), - check_and_coerce_optional(nodes, EntList), + check_and_coerce_optional(region, EntList), check_and_coerce_optional(nodes, EntList) ) def create_hole_by_ruling( diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index bf5704d..811941c 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -7,10 +7,16 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .vector import Vector + class MoldSurfaceGenerator: """ Wrapper for MoldSurfaceGenerator class of Moldflow Synergy. diff --git a/src/moldflow/plot.py b/src/moldflow/plot.py index 8ce5c82..a44866a 100644 --- a/src/moldflow/plot.py +++ b/src/moldflow/plot.py @@ -51,6 +51,7 @@ from .ent_list import EntList from .errors import raise_save_error + class Plot: """ Wrapper for Plot class of Moldflow Synergy. diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index 4274259..1ccefb8 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -16,11 +16,19 @@ from .material_plot import MaterialPlot from .user_plot import UserPlot from .common import MaterialDatabase, MaterialIndex, PlotType, SystemUnits -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_file_extension, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + get_enum_value, + check_file_extension, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .errors import raise_save_error from .constants import XML_FILE_EXT, SDZ_FILE_EXT, FBX_FILE_EXT, ELE_FILE_EXT + class PlotManager: """ Wrapper for PlotManager class of Moldflow Synergy. diff --git a/src/moldflow/predicate.py b/src/moldflow/predicate.py index 89b9fdc..844292b 100644 --- a/src/moldflow/predicate.py +++ b/src/moldflow/predicate.py @@ -10,6 +10,7 @@ from .common import LogMessage from .com_proxy import safe_com, expose_oleobj + class Predicate: """ Wrapper for Predicate class of Moldflow Synergy. diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index 546d052..82a7407 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -9,10 +9,18 @@ from .predicate import Predicate from .double_array import DoubleArray from .common import CrossSectionType, LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_range, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + get_enum_value, + check_range, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .logger import process_log + class PredicateManager: """ Wrapper for PredicateManager class of Moldflow Synergy. diff --git a/src/moldflow/project.py b/src/moldflow/project.py index bf0e68e..bd0e2e7 100644 --- a/src/moldflow/project.py +++ b/src/moldflow/project.py @@ -11,6 +11,7 @@ from .common import ItemType, DuplicateOption, ImportUnitIndex from .logger import process_log, LogMessage + class Project: """ Wrapper for Project class of Moldflow Synergy. diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index 4a469b6..922e35d 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -9,10 +9,17 @@ from .double_array import DoubleArray from .string_array import StringArray from .logger import process_log -from .helper import check_type, check_optional_type, check_and_coerce_optional, check_is_non_negative, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + check_is_non_negative, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .common import LogMessage + class Property: """ Wrapper for Property class of Moldflow Synergy. diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index cda471c..9f1cf94 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -9,10 +9,17 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .prop import Property -from .helper import get_enum_value, check_type, check_optional_type, check_and_coerce_optional, coerce_optional_dispatch +from .helper import ( + get_enum_value, + check_type, + check_optional_type, + check_and_coerce_optional, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType + class PropertyEditor: """ Wrapper for PropertyEditor class of Moldflow Synergy. @@ -226,7 +233,9 @@ def get_next_property_of_type(self, prop: Property | None) -> Property: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_next_property_of_type") - result = self.property_editor.GetNextPropertyOfType(check_and_coerce_optional(prop, Property)) + result = self.property_editor.GetNextPropertyOfType( + check_and_coerce_optional(prop, Property) + ) if result is None: return None return Property(result) @@ -243,9 +252,7 @@ def get_entity_property(self, entities: EntList | None) -> Property: """ process_log(__name__, LogMessage.FUNCTION_CALL, locals(), name="get_entity_property") - prop = self.property_editor.GetEntityProperty( - check_and_coerce_optional(entities, EntList) - ) + prop = self.property_editor.GetEntityProperty(check_and_coerce_optional(entities, EntList)) if prop is None: return None return Property(prop) diff --git a/src/moldflow/runner_generator.py b/src/moldflow/runner_generator.py index 4b52c60..4984665 100644 --- a/src/moldflow/runner_generator.py +++ b/src/moldflow/runner_generator.py @@ -11,6 +11,7 @@ from .com_proxy import safe_com from .common import LogMessage + class RunnerGenerator: """ Wrapper for RunnerGenerator class of Moldflow Synergy. diff --git a/src/moldflow/server.py b/src/moldflow/server.py index 4768264..a5e09b1 100644 --- a/src/moldflow/server.py +++ b/src/moldflow/server.py @@ -10,6 +10,7 @@ from .common import LogMessage from .com_proxy import safe_com + class Server: """ Wrapper for Server class of Moldflow Synergy. diff --git a/src/moldflow/string_array.py b/src/moldflow/string_array.py index bc28ee8..dcb953d 100644 --- a/src/moldflow/string_array.py +++ b/src/moldflow/string_array.py @@ -11,6 +11,7 @@ from .com_proxy import safe_com, flag_com_method from .common import LogMessage + class StringArray: """ Wrapper for StringArray class of Moldflow Synergy. diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index 6ade21e..fa55f8e 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -24,6 +24,7 @@ from .vector import Vector from .string_array import StringArray + class StudyDoc: """ Wrapper for StudyDoc class of Moldflow Synergy. @@ -517,9 +518,7 @@ def get_curve_point(self, curve: EntList | None, pos_curve: float) -> Vector: check_type(pos_curve, (int, float)) check_range(pos_curve, 0, 1, True, True) - result = self.study_doc.GetCurvePoint( - check_and_coerce_optional(curve, EntList), pos_curve - ) + result = self.study_doc.GetCurvePoint(check_and_coerce_optional(curve, EntList), pos_curve) if result is None: return None return Vector(result) diff --git a/src/moldflow/synergy.py b/src/moldflow/synergy.py index d1fe1be..d233978 100644 --- a/src/moldflow/synergy.py +++ b/src/moldflow/synergy.py @@ -51,6 +51,7 @@ from .com_proxy import safe_com from .errors import raise_synergy_error + class Synergy: """ Wrapper for Synergy class of Moldflow Synergy. diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index 7a460fd..b017794 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -10,9 +10,17 @@ from .double_array import DoubleArray from .common import SystemUnits from .logger import process_log, LogMessage -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, check_is_non_negative, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + get_enum_value, + check_is_non_negative, + coerce_optional_dispatch, +) from .com_proxy import safe_com + class SystemMessage: """ Wrapper for SystemMessage class of Moldflow Synergy. diff --git a/src/moldflow/unit_conversion.py b/src/moldflow/unit_conversion.py index a5c1857..a82f3c1 100644 --- a/src/moldflow/unit_conversion.py +++ b/src/moldflow/unit_conversion.py @@ -11,6 +11,7 @@ from .com_proxy import safe_com from .common import LogMessage, SystemUnits + class UnitConversion: """ Wrapper for UnitConversion class of Moldflow Synergy. diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index b30b1a8..50a3cd6 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -6,7 +6,13 @@ UserPlot Class API Wrapper """ -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value, coerce_optional_dispatch +from .helper import ( + check_type, + check_optional_type, + check_and_coerce_optional, + get_enum_value, + coerce_optional_dispatch, +) from .com_proxy import safe_com from .logger import process_log from .common import ( @@ -21,6 +27,7 @@ from .double_array import DoubleArray from .plot import Plot + class UserPlot: """ Wrapper for UserPlot class of Moldflow Synergy. diff --git a/src/moldflow/vector.py b/src/moldflow/vector.py index 2179f0c..1b603b8 100644 --- a/src/moldflow/vector.py +++ b/src/moldflow/vector.py @@ -10,6 +10,7 @@ from .com_proxy import safe_com from .logger import process_log, LogMessage + class Vector: """ Wrapper for Vector class of Moldflow Synergy. diff --git a/src/moldflow/vector_array.py b/src/moldflow/vector_array.py index c10ffb6..3593e4c 100644 --- a/src/moldflow/vector_array.py +++ b/src/moldflow/vector_array.py @@ -10,6 +10,7 @@ from .com_proxy import safe_com from .logger import process_log, LogMessage + class VectorArray: """ Wrapper for VectorArray class of Moldflow Synergy. diff --git a/src/moldflow/version_check.py b/src/moldflow/version_check.py index 7a9ec4e..b088e27 100644 --- a/src/moldflow/version_check.py +++ b/src/moldflow/version_check.py @@ -26,6 +26,7 @@ PYPI_TIMEOUT_SECONDS = 0.5 WARNING_FOOTER = f"To disable this warning, set {NO_UPDATE_ENV_VAR}=1" + def _get_package_version() -> str: """ Get the current package version. @@ -51,6 +52,7 @@ def _get_package_version() -> str: "This likely indicates a build or packaging issue." ) from e + def _parse_version(ver: str) -> tuple: """ Parse version string into a tuple of (major, minor, patch). @@ -68,6 +70,7 @@ def _parse_version(ver: str) -> tuple: nums.append(0) return tuple(nums) + def _process_pypi_releases( releases: dict, current_parsed: tuple ) -> Tuple[Optional[str], Optional[str]]: @@ -126,6 +129,7 @@ def _process_pypi_releases( return latest_in_major_version, latest_overall_version + def _check_for_updates() -> Tuple[Optional[str], Optional[str]]: """ Check PyPI for newer versions of the package. @@ -154,6 +158,7 @@ def _check_for_updates() -> Tuple[Optional[str], Optional[str]]: # Any error (timeout, network issue, etc) should fail silently return None, None + def _pip_cmd(version_string: Optional[str] = None) -> str: """ Construct a pip command using the current Python executable. @@ -174,6 +179,7 @@ def _pip_cmd(version_string: Optional[str] = None) -> str: base += f"=={version_string}" return base + def _show_update_message(minor_update: Optional[str], major_update: Optional[str]) -> None: """ Show update notification message. @@ -225,6 +231,7 @@ def _show_update_message(minor_update: Optional[str], major_update: Optional[str warning_msg = f"{body}\n\n{footer}" warnings.warn(warning_msg, UserWarning) + def check_for_updates_on_import(): """ Perform version check and show update message if updates are available. @@ -239,6 +246,7 @@ def check_for_updates_on_import(): if minor or major: _show_update_message(minor, major) + def get_version() -> str: """ Get the current package version. diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index 08e2a7f..f77bcda 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -38,6 +38,7 @@ from .plot import Plot from .vector import Vector + class Viewer: """ Wrapper for Viewer class of Moldflow Synergy. diff --git a/tests/core/test_helper.py b/tests/core/test_helper.py index 45c5c03..ce08950 100644 --- a/tests/core/test_helper.py +++ b/tests/core/test_helper.py @@ -404,7 +404,7 @@ def test_check_and_coerce_optional_com_object(self, _): mock_ent_list.__class__.__name__ = 'EntList' mock_internal = Mock() mock_ent_list.ent_list = mock_internal - + # The function should validate the type and return the internal attribute result = check_and_coerce_optional(mock_ent_list, type(mock_ent_list)) assert result == mock_internal From ccf161c6173c6af0ef9f71abe8abd39666c518c0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 04:44:22 +0000 Subject: [PATCH 10/14] Fix missing import of check_and_coerce_optional in all modified files Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/cad_manager.py | 4 +--- src/moldflow/data_transform.py | 6 ++---- src/moldflow/diagnosis_manager.py | 6 ++---- src/moldflow/ent_list.py | 4 +--- src/moldflow/folder_manager.py | 6 ++---- src/moldflow/layer_manager.py | 6 ++---- src/moldflow/material_finder.py | 6 ++---- src/moldflow/mesh_editor.py | 6 ++---- src/moldflow/modeler.py | 6 ++---- src/moldflow/mold_surface_generator.py | 4 +--- src/moldflow/plot.py | 6 ++---- src/moldflow/plot_manager.py | 6 ++---- src/moldflow/predicate_manager.py | 6 ++---- src/moldflow/prop.py | 6 ++---- src/moldflow/property_editor.py | 4 +--- src/moldflow/study_doc.py | 6 ++---- src/moldflow/system_message.py | 6 ++---- src/moldflow/user_plot.py | 6 ++---- src/moldflow/viewer.py | 6 ++---- 19 files changed, 34 insertions(+), 72 deletions(-) diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index ef34b61..f008b33 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -11,10 +11,8 @@ from .logger import process_log, LogMessage from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - coerce_optional_dispatch, -) + check_and_coerce_optional,) from .com_proxy import safe_com diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index 110daa1..bb5f0a8 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -9,11 +9,9 @@ from .logger import process_log, LogMessage from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - get_enum_value, - coerce_optional_dispatch, -) + check_and_coerce_optional, + get_enum_value,) from .com_proxy import safe_com from .common import TransformFunctions, TransformOperations, TransformScalarOperations from .integer_array import IntegerArray diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index 4d9f378..855884f 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -11,11 +11,9 @@ from .common import LogMessage from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - check_min_max, - coerce_optional_dispatch, -) + check_and_coerce_optional, + check_min_max,) from .com_proxy import safe_com from .ent_list import EntList from .mesh_summary import MeshSummary diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 851683f..3b77b11 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -9,10 +9,8 @@ from .helper import ( check_index, check_type, - check_optional_type, check_and_coerce_optional, - coerce_optional_dispatch, -) + check_and_coerce_optional,) from .com_proxy import safe_com, expose_oleobj from .predicate import Predicate from .common import LogMessage diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index dfe9fa8..d17474b 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -12,11 +12,9 @@ from .helper import ( get_enum_value, check_type, - check_optional_type, check_and_coerce_optional, - check_range, - coerce_optional_dispatch, -) + check_and_coerce_optional, + check_range,) from .com_proxy import safe_com diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index 888a968..2e18e75 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -11,12 +11,10 @@ from .logger import process_log, LogMessage from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, check_and_coerce_optional, check_range, - get_enum_value, - coerce_optional_dispatch, -) + get_enum_value,) from .com_proxy import safe_com diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index 5268dcc..601658e 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -11,11 +11,9 @@ from .logger import process_log from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - get_enum_value, - coerce_optional_dispatch, -) + check_and_coerce_optional, + get_enum_value,) from .com_proxy import safe_com from .common import LogMessage diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index 83a57dc..8568dd1 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -15,12 +15,10 @@ from .prop import Property from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, check_and_coerce_optional, check_range, - check_is_non_negative, - coerce_optional_dispatch, -) + check_is_non_negative,) from .com_proxy import safe_com diff --git a/src/moldflow/modeler.py b/src/moldflow/modeler.py index ada64d6..880f070 100644 --- a/src/moldflow/modeler.py +++ b/src/moldflow/modeler.py @@ -14,10 +14,8 @@ check_is_non_negative, check_is_positive, check_type, - check_optional_type, - get_enum_value, - coerce_optional_dispatch, -) + check_and_coerce_optional, + get_enum_value,) from .com_proxy import safe_com from .boundary_list import BoundaryList from .prop import Property diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index 811941c..266fe85 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -9,10 +9,8 @@ from .logger import process_log, LogMessage from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - coerce_optional_dispatch, -) + check_and_coerce_optional,) from .com_proxy import safe_com from .vector import Vector diff --git a/src/moldflow/plot.py b/src/moldflow/plot.py index a44866a..7389f1b 100644 --- a/src/moldflow/plot.py +++ b/src/moldflow/plot.py @@ -11,14 +11,12 @@ from .logger import process_log, LogMessage from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, get_enum_value, check_range, check_is_non_negative, check_expected_values, - check_file_extension, - coerce_optional_dispatch, -) + check_file_extension,) from .common import ( DisplayComponent, ScaleOptions, diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index 1ccefb8..80f0c4d 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -18,12 +18,10 @@ from .common import MaterialDatabase, MaterialIndex, PlotType, SystemUnits from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, check_and_coerce_optional, get_enum_value, - check_file_extension, - coerce_optional_dispatch, -) + check_file_extension,) from .com_proxy import safe_com from .errors import raise_save_error from .constants import XML_FILE_EXT, SDZ_FILE_EXT, FBX_FILE_EXT, ELE_FILE_EXT diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index 82a7407..1c99091 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -11,12 +11,10 @@ from .common import CrossSectionType, LogMessage from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, check_and_coerce_optional, get_enum_value, - check_range, - coerce_optional_dispatch, -) + check_range,) from .com_proxy import safe_com from .logger import process_log diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index 922e35d..88d702f 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -11,11 +11,9 @@ from .logger import process_log from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - check_is_non_negative, - coerce_optional_dispatch, -) + check_and_coerce_optional, + check_is_non_negative,) from .com_proxy import safe_com from .common import LogMessage diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index 9f1cf94..71ec05f 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -12,10 +12,8 @@ from .helper import ( get_enum_value, check_type, - check_optional_type, check_and_coerce_optional, - coerce_optional_dispatch, -) + check_and_coerce_optional,) from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index fa55f8e..cf6070a 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -11,13 +11,11 @@ from .logger import process_log from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, check_file_extension, check_range, get_enum_value, - check_is_non_negative, - coerce_optional_dispatch, -) + check_is_non_negative,) from .com_proxy import safe_com from .common import LogMessage, MoldingProcess, MeshType from .constants import UDM_FILE_EXT diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index b017794..497f859 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -12,12 +12,10 @@ from .logger import process_log, LogMessage from .helper import ( check_type, - check_optional_type, + check_and_coerce_optional, check_and_coerce_optional, get_enum_value, - check_is_non_negative, - coerce_optional_dispatch, -) + check_is_non_negative,) from .com_proxy import safe_com diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index 50a3cd6..faf8505 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -8,11 +8,9 @@ from .helper import ( check_type, - check_optional_type, check_and_coerce_optional, - get_enum_value, - coerce_optional_dispatch, -) + check_and_coerce_optional, + get_enum_value,) from .com_proxy import safe_com from .logger import process_log from .common import ( diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index f77bcda..750d1bf 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -26,13 +26,11 @@ check_min_max, check_range, check_type, - check_optional_type, + check_and_coerce_optional, get_enum_value, check_is_positive, check_is_non_negative, - check_file_extension, - coerce_optional_dispatch, -) + check_file_extension,) from .errors import raise_value_error from .common import ValueErrorReason from .plot import Plot From 85263ff08ddf324decb0169e7eaef085f2522dfe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 05:12:20 +0000 Subject: [PATCH 11/14] Fix Black formatting violations in 19 modified files Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/cad_manager.py | 5 +---- src/moldflow/data_transform.py | 6 +----- src/moldflow/diagnosis_manager.py | 6 +----- src/moldflow/ent_list.py | 6 +----- src/moldflow/folder_manager.py | 3 ++- src/moldflow/layer_manager.py | 3 ++- src/moldflow/material_finder.py | 6 +----- src/moldflow/mesh_editor.py | 3 ++- src/moldflow/modeler.py | 3 ++- src/moldflow/mold_surface_generator.py | 5 +---- src/moldflow/plot.py | 3 ++- src/moldflow/plot_manager.py | 3 ++- src/moldflow/predicate_manager.py | 3 ++- src/moldflow/prop.py | 3 ++- src/moldflow/property_editor.py | 6 +----- src/moldflow/study_doc.py | 3 ++- src/moldflow/system_message.py | 3 ++- src/moldflow/user_plot.py | 6 +----- src/moldflow/viewer.py | 3 ++- 19 files changed, 30 insertions(+), 49 deletions(-) diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index f008b33..e1b3c4a 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -9,10 +9,7 @@ from .ent_list import EntList from .vector import Vector from .logger import process_log, LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - check_and_coerce_optional,) +from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional from .com_proxy import safe_com diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index bb5f0a8..4b4a4f9 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -7,11 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - check_and_coerce_optional, - get_enum_value,) +from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .common import TransformFunctions, TransformOperations, TransformScalarOperations from .integer_array import IntegerArray diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index 855884f..ae4fdb5 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -9,11 +9,7 @@ from .logger import process_log from .common import LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - check_and_coerce_optional, - check_min_max,) +from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, check_min_max from .com_proxy import safe_com from .ent_list import EntList from .mesh_summary import MeshSummary diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 3b77b11..641f550 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -6,11 +6,7 @@ EntList Class API Wrapper """ -from .helper import ( - check_index, - check_type, - check_and_coerce_optional, - check_and_coerce_optional,) +from .helper import check_index, check_type, check_and_coerce_optional, check_and_coerce_optional from .com_proxy import safe_com, expose_oleobj from .predicate import Predicate from .common import LogMessage diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index d17474b..9ea063b 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -14,7 +14,8 @@ check_type, check_and_coerce_optional, check_and_coerce_optional, - check_range,) + check_range, +) from .com_proxy import safe_com diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index 2e18e75..97f876e 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -14,7 +14,8 @@ check_and_coerce_optional, check_and_coerce_optional, check_range, - get_enum_value,) + get_enum_value, +) from .com_proxy import safe_com diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index 601658e..e9a43e6 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -9,11 +9,7 @@ from .prop import Property from .common import MaterialDatabase, MaterialDatabaseType from .logger import process_log -from .helper import ( - check_type, - check_and_coerce_optional, - check_and_coerce_optional, - get_enum_value,) +from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .common import LogMessage diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index 8568dd1..6a7e862 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -18,7 +18,8 @@ check_and_coerce_optional, check_and_coerce_optional, check_range, - check_is_non_negative,) + check_is_non_negative, +) from .com_proxy import safe_com diff --git a/src/moldflow/modeler.py b/src/moldflow/modeler.py index 880f070..7213d84 100644 --- a/src/moldflow/modeler.py +++ b/src/moldflow/modeler.py @@ -15,7 +15,8 @@ check_is_positive, check_type, check_and_coerce_optional, - get_enum_value,) + get_enum_value, +) from .com_proxy import safe_com from .boundary_list import BoundaryList from .prop import Property diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index 266fe85..0416a16 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -7,10 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - check_and_coerce_optional,) +from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional from .com_proxy import safe_com from .vector import Vector diff --git a/src/moldflow/plot.py b/src/moldflow/plot.py index 7389f1b..10fd6fd 100644 --- a/src/moldflow/plot.py +++ b/src/moldflow/plot.py @@ -16,7 +16,8 @@ check_range, check_is_non_negative, check_expected_values, - check_file_extension,) + check_file_extension, +) from .common import ( DisplayComponent, ScaleOptions, diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index 80f0c4d..df31cc5 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -21,7 +21,8 @@ check_and_coerce_optional, check_and_coerce_optional, get_enum_value, - check_file_extension,) + check_file_extension, +) from .com_proxy import safe_com from .errors import raise_save_error from .constants import XML_FILE_EXT, SDZ_FILE_EXT, FBX_FILE_EXT, ELE_FILE_EXT diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index 1c99091..e92140d 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -14,7 +14,8 @@ check_and_coerce_optional, check_and_coerce_optional, get_enum_value, - check_range,) + check_range, +) from .com_proxy import safe_com from .logger import process_log diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index 88d702f..db5e10e 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -13,7 +13,8 @@ check_type, check_and_coerce_optional, check_and_coerce_optional, - check_is_non_negative,) + check_is_non_negative, +) from .com_proxy import safe_com from .common import LogMessage diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index 71ec05f..c44b06d 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -9,11 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .prop import Property -from .helper import ( - get_enum_value, - check_type, - check_and_coerce_optional, - check_and_coerce_optional,) +from .helper import get_enum_value, check_type, check_and_coerce_optional, check_and_coerce_optional from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index cf6070a..8f3b47b 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -15,7 +15,8 @@ check_file_extension, check_range, get_enum_value, - check_is_non_negative,) + check_is_non_negative, +) from .com_proxy import safe_com from .common import LogMessage, MoldingProcess, MeshType from .constants import UDM_FILE_EXT diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index 497f859..9523cfa 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -15,7 +15,8 @@ check_and_coerce_optional, check_and_coerce_optional, get_enum_value, - check_is_non_negative,) + check_is_non_negative, +) from .com_proxy import safe_com diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index faf8505..28640bd 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -6,11 +6,7 @@ UserPlot Class API Wrapper """ -from .helper import ( - check_type, - check_and_coerce_optional, - check_and_coerce_optional, - get_enum_value,) +from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .logger import process_log from .common import ( diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index 750d1bf..21d9c13 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -30,7 +30,8 @@ get_enum_value, check_is_positive, check_is_non_negative, - check_file_extension,) + check_file_extension, +) from .errors import raise_value_error from .common import ValueErrorReason from .plot import Plot From 7da0baf8771fd95e38bf9532fd1b176fc5dee4a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 05:23:29 +0000 Subject: [PATCH 12/14] Fix pylint errors: remove duplicate/unused imports and fix style issue Co-authored-by: osinjoku <49887472+osinjoku@users.noreply.github.com> --- src/moldflow/boundary_conditions.py | 3 +-- src/moldflow/cad_manager.py | 2 +- src/moldflow/data_transform.py | 2 +- src/moldflow/diagnosis_manager.py | 2 +- src/moldflow/ent_list.py | 2 +- src/moldflow/folder_manager.py | 1 - src/moldflow/helper.py | 5 ++--- src/moldflow/layer_manager.py | 1 - src/moldflow/material_finder.py | 2 +- src/moldflow/mesh_editor.py | 1 - src/moldflow/mold_surface_generator.py | 2 +- src/moldflow/plot_manager.py | 3 ++- src/moldflow/predicate_manager.py | 1 - src/moldflow/prop.py | 1 - src/moldflow/property_editor.py | 2 +- src/moldflow/study_doc.py | 2 ++ src/moldflow/system_message.py | 1 - src/moldflow/user_plot.py | 2 +- src/moldflow/viewer.py | 2 ++ 19 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/moldflow/boundary_conditions.py b/src/moldflow/boundary_conditions.py index fb03be5..92c28da 100644 --- a/src/moldflow/boundary_conditions.py +++ b/src/moldflow/boundary_conditions.py @@ -6,9 +6,8 @@ BoundaryConditions Class API Wrapper """ -from .helper import coerce_optional_dispatch from .common import LogMessage, AnalysisType, ConstraintType -from .helper import check_type, check_optional_type, check_and_coerce_optional, get_enum_value +from .helper import check_type, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .logger import process_log from .ent_list import EntList diff --git a/src/moldflow/cad_manager.py b/src/moldflow/cad_manager.py index e1b3c4a..d0c05a2 100644 --- a/src/moldflow/cad_manager.py +++ b/src/moldflow/cad_manager.py @@ -9,7 +9,7 @@ from .ent_list import EntList from .vector import Vector from .logger import process_log, LogMessage -from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional +from .helper import check_type, check_and_coerce_optional from .com_proxy import safe_com diff --git a/src/moldflow/data_transform.py b/src/moldflow/data_transform.py index 4b4a4f9..04b7c59 100644 --- a/src/moldflow/data_transform.py +++ b/src/moldflow/data_transform.py @@ -7,7 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, get_enum_value +from .helper import check_type, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .common import TransformFunctions, TransformOperations, TransformScalarOperations from .integer_array import IntegerArray diff --git a/src/moldflow/diagnosis_manager.py b/src/moldflow/diagnosis_manager.py index ae4fdb5..0618415 100644 --- a/src/moldflow/diagnosis_manager.py +++ b/src/moldflow/diagnosis_manager.py @@ -9,7 +9,7 @@ from .logger import process_log from .common import LogMessage -from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, check_min_max +from .helper import check_type, check_and_coerce_optional, check_min_max from .com_proxy import safe_com from .ent_list import EntList from .mesh_summary import MeshSummary diff --git a/src/moldflow/ent_list.py b/src/moldflow/ent_list.py index 641f550..600e6f8 100644 --- a/src/moldflow/ent_list.py +++ b/src/moldflow/ent_list.py @@ -6,7 +6,7 @@ EntList Class API Wrapper """ -from .helper import check_index, check_type, check_and_coerce_optional, check_and_coerce_optional +from .helper import check_index, check_type, check_and_coerce_optional from .com_proxy import safe_com, expose_oleobj from .predicate import Predicate from .common import LogMessage diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index 9ea063b..bb8ac19 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -13,7 +13,6 @@ get_enum_value, check_type, check_and_coerce_optional, - check_and_coerce_optional, check_range, ) from .com_proxy import safe_com diff --git a/src/moldflow/helper.py b/src/moldflow/helper.py index 19a3575..4a5ae14 100644 --- a/src/moldflow/helper.py +++ b/src/moldflow/helper.py @@ -429,6 +429,5 @@ def check_and_coerce_optional(value, expected_type: type): if attr_name: # COM object - unwrap the attribute return getattr(value, attr_name) - else: - # Primitive type or unknown type - return as-is - return value + # Primitive type or unknown type - return as-is + return value diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index 97f876e..cb8c8ed 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -12,7 +12,6 @@ from .helper import ( check_type, check_and_coerce_optional, - check_and_coerce_optional, check_range, get_enum_value, ) diff --git a/src/moldflow/material_finder.py b/src/moldflow/material_finder.py index e9a43e6..5c1f06d 100644 --- a/src/moldflow/material_finder.py +++ b/src/moldflow/material_finder.py @@ -9,7 +9,7 @@ from .prop import Property from .common import MaterialDatabase, MaterialDatabaseType from .logger import process_log -from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, get_enum_value +from .helper import check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .common import LogMessage diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index 6a7e862..a394b12 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -16,7 +16,6 @@ from .helper import ( check_type, check_and_coerce_optional, - check_and_coerce_optional, check_range, check_is_non_negative, ) diff --git a/src/moldflow/mold_surface_generator.py b/src/moldflow/mold_surface_generator.py index 0416a16..d08c82a 100644 --- a/src/moldflow/mold_surface_generator.py +++ b/src/moldflow/mold_surface_generator.py @@ -7,7 +7,7 @@ """ from .logger import process_log, LogMessage -from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional +from .helper import check_type, check_and_coerce_optional from .com_proxy import safe_com from .vector import Vector diff --git a/src/moldflow/plot_manager.py b/src/moldflow/plot_manager.py index df31cc5..bd9f77e 100644 --- a/src/moldflow/plot_manager.py +++ b/src/moldflow/plot_manager.py @@ -18,7 +18,8 @@ from .common import MaterialDatabase, MaterialIndex, PlotType, SystemUnits from .helper import ( check_type, - check_and_coerce_optional, + check_optional_type, + coerce_optional_dispatch, check_and_coerce_optional, get_enum_value, check_file_extension, diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index e92140d..1856c88 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -12,7 +12,6 @@ from .helper import ( check_type, check_and_coerce_optional, - check_and_coerce_optional, get_enum_value, check_range, ) diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index db5e10e..1c81d32 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -12,7 +12,6 @@ from .helper import ( check_type, check_and_coerce_optional, - check_and_coerce_optional, check_is_non_negative, ) from .com_proxy import safe_com diff --git a/src/moldflow/property_editor.py b/src/moldflow/property_editor.py index c44b06d..58537ac 100644 --- a/src/moldflow/property_editor.py +++ b/src/moldflow/property_editor.py @@ -9,7 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .prop import Property -from .helper import get_enum_value, check_type, check_and_coerce_optional, check_and_coerce_optional +from .helper import get_enum_value, check_type, check_and_coerce_optional from .com_proxy import safe_com from .common import CommitActions, MaterialDatabaseType, PropertyType diff --git a/src/moldflow/study_doc.py b/src/moldflow/study_doc.py index 8f3b47b..2655172 100644 --- a/src/moldflow/study_doc.py +++ b/src/moldflow/study_doc.py @@ -11,6 +11,8 @@ from .logger import process_log from .helper import ( check_type, + check_optional_type, + coerce_optional_dispatch, check_and_coerce_optional, check_file_extension, check_range, diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index 9523cfa..a896c0b 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -13,7 +13,6 @@ from .helper import ( check_type, check_and_coerce_optional, - check_and_coerce_optional, get_enum_value, check_is_non_negative, ) diff --git a/src/moldflow/user_plot.py b/src/moldflow/user_plot.py index 28640bd..ad7679c 100644 --- a/src/moldflow/user_plot.py +++ b/src/moldflow/user_plot.py @@ -6,7 +6,7 @@ UserPlot Class API Wrapper """ -from .helper import check_type, check_and_coerce_optional, check_and_coerce_optional, get_enum_value +from .helper import check_type, check_and_coerce_optional, get_enum_value from .com_proxy import safe_com from .logger import process_log from .common import ( diff --git a/src/moldflow/viewer.py b/src/moldflow/viewer.py index 21d9c13..7cd88ad 100644 --- a/src/moldflow/viewer.py +++ b/src/moldflow/viewer.py @@ -26,6 +26,8 @@ check_min_max, check_range, check_type, + check_optional_type, + coerce_optional_dispatch, check_and_coerce_optional, get_enum_value, check_is_positive, From c2df0d6989237a060b836f42fe3201660be23e22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 06:47:19 +0000 Subject: [PATCH 13/14] Merge main branch and fix Black formatting violations - Merged latest main branch to bring the PR up to date - Fixed Black formatting violations in 6 files - All linting checks pass (9.94/10 rating) Co-authored-by: sankalps0549 <230025240+sankalps0549@users.noreply.github.com> --- src/moldflow/folder_manager.py | 7 +------ src/moldflow/layer_manager.py | 7 +------ src/moldflow/mesh_editor.py | 7 +------ src/moldflow/predicate_manager.py | 7 +------ src/moldflow/prop.py | 6 +----- src/moldflow/system_message.py | 7 +------ 6 files changed, 6 insertions(+), 35 deletions(-) diff --git a/src/moldflow/folder_manager.py b/src/moldflow/folder_manager.py index bb8ac19..0777386 100644 --- a/src/moldflow/folder_manager.py +++ b/src/moldflow/folder_manager.py @@ -9,12 +9,7 @@ from .logger import process_log, LogMessage from .ent_list import EntList from .common import EntityType, DisplayOption -from .helper import ( - get_enum_value, - check_type, - check_and_coerce_optional, - check_range, -) +from .helper import get_enum_value, check_type, check_and_coerce_optional, check_range from .com_proxy import safe_com diff --git a/src/moldflow/layer_manager.py b/src/moldflow/layer_manager.py index cb8c8ed..1595396 100644 --- a/src/moldflow/layer_manager.py +++ b/src/moldflow/layer_manager.py @@ -9,12 +9,7 @@ from .ent_list import EntList from .common import EntityType, DisplayOption from .logger import process_log, LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - check_range, - get_enum_value, -) +from .helper import check_type, check_and_coerce_optional, check_range, get_enum_value from .com_proxy import safe_com diff --git a/src/moldflow/mesh_editor.py b/src/moldflow/mesh_editor.py index a394b12..2287d09 100644 --- a/src/moldflow/mesh_editor.py +++ b/src/moldflow/mesh_editor.py @@ -13,12 +13,7 @@ from .ent_list import EntList from .vector import Vector from .prop import Property -from .helper import ( - check_type, - check_and_coerce_optional, - check_range, - check_is_non_negative, -) +from .helper import check_type, check_and_coerce_optional, check_range, check_is_non_negative from .com_proxy import safe_com diff --git a/src/moldflow/predicate_manager.py b/src/moldflow/predicate_manager.py index 1856c88..3bf2663 100644 --- a/src/moldflow/predicate_manager.py +++ b/src/moldflow/predicate_manager.py @@ -9,12 +9,7 @@ from .predicate import Predicate from .double_array import DoubleArray from .common import CrossSectionType, LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - get_enum_value, - check_range, -) +from .helper import check_type, check_and_coerce_optional, get_enum_value, check_range from .com_proxy import safe_com from .logger import process_log diff --git a/src/moldflow/prop.py b/src/moldflow/prop.py index 1c81d32..f64729a 100644 --- a/src/moldflow/prop.py +++ b/src/moldflow/prop.py @@ -9,11 +9,7 @@ from .double_array import DoubleArray from .string_array import StringArray from .logger import process_log -from .helper import ( - check_type, - check_and_coerce_optional, - check_is_non_negative, -) +from .helper import check_type, check_and_coerce_optional, check_is_non_negative from .com_proxy import safe_com from .common import LogMessage diff --git a/src/moldflow/system_message.py b/src/moldflow/system_message.py index a896c0b..cdcaf91 100644 --- a/src/moldflow/system_message.py +++ b/src/moldflow/system_message.py @@ -10,12 +10,7 @@ from .double_array import DoubleArray from .common import SystemUnits from .logger import process_log, LogMessage -from .helper import ( - check_type, - check_and_coerce_optional, - get_enum_value, - check_is_non_negative, -) +from .helper import check_type, check_and_coerce_optional, get_enum_value, check_is_non_negative from .com_proxy import safe_com From 8f6b3fd4bb37e46bba464ad991d998ea73dbda86 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 08:09:20 +0000 Subject: [PATCH 14/14] Fix test_check_optional_type_invalid to exclude None values Fixed failing tests for TestHelper.test_check_optional_type_invalid where None was incorrectly included in the test parameters. Since check_optional_type explicitly allows None values, the test should only verify that non-None invalid types raise TypeError. Changes: - Added `if x is not None` filter to test parametrization - Prevents None from being tested as an invalid value - Aligns test expectations with function behavior Co-authored-by: sankalps0549 <230025240+sankalps0549@users.noreply.github.com> --- tests/core/test_helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/core/test_helper.py b/tests/core/test_helper.py index ce08950..c7dd8f1 100644 --- a/tests/core/test_helper.py +++ b/tests/core/test_helper.py @@ -360,8 +360,8 @@ def test_check_optional_type(self, value, types, _, caplog): @pytest.mark.parametrize( "value, types", - [(x, (int, float)) for x in list_intersection(INVALID_FLOAT, INVALID_INT)] - + [(x, int) for x in INVALID_INT], + [(x, (int, float)) for x in list_intersection(INVALID_FLOAT, INVALID_INT) if x is not None] + + [(x, int) for x in INVALID_INT if x is not None], ) def test_check_optional_type_invalid(self, value, types, _): """