From d1a7e888b78c6c3a0d941d55fa3786f4e59e2959 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Thu, 12 Dec 2024 08:50:56 +0100 Subject: [PATCH 01/12] feat: exposing quantity types in PyDPF Core --- src/ansys/dpf/core/field_definition.py | 55 +++++++++++++++++++ .../gate/generated/field_definition_capi.py | 38 +++++++++++++ tests/test_field.py | 31 +++++++++++ 3 files changed, 124 insertions(+) diff --git a/src/ansys/dpf/core/field_definition.py b/src/ansys/dpf/core/field_definition.py index 185048b6ba..a10f92f6d2 100644 --- a/src/ansys/dpf/core/field_definition.py +++ b/src/ansys/dpf/core/field_definition.py @@ -153,6 +153,61 @@ def dimensionality(self): self._api.csfield_definition_fill_dimensionality(self, dim, nature, dim.internal_size) return Dimensionality(dim.tolist(), natures(int(nature))) + def get_quantity_type(self, index=0): + """Getter for Quantity Type + + Parameters + ---------- + index: Index of the quantity type to return + + Returns + ------- + quantity_type : Quantity Type + Quantity type of the elementary data at a given index. + """ + if index < 0: + raise ValueError("Index must be greater than or equal to 0") + + quantity_type = self._api.csfield_definition_get_quantity_type(self, index) + return str(quantity_type) + + def set_quantity_type(self, quantity_type): + """Setter for Quantity Type + + Parameters + ---------- + quantity_type: Quantity Type + Quantity type to set + """ + self._api.csfield_definition_set_quantity_type(self, quantity_type) + + def get_num_available_quantity_types(self): + """Getter for the number of available quantity types + + Returns + ------- + num_quantity_types : int + Number of quantity types + """ + num_quantity_types = self._api.csfield_definition_get_num_available_quantity_types(self) + return num_quantity_types + + def is_of_quantity_type(self, quantity_type): + """Check if the field definition is of a given quantity type + + Parameters + ---------- + quantity_type: Quantity Type + Quantity type to check + + Returns + ------- + is_of_quantity_type : bool + True if the field definition is of the given quantity type + """ + is_of_quantity_type = self._api.csfield_definition_is_of_quantity_type(self, quantity_type) + return is_of_quantity_type + @unit.setter def unit(self, value): self._api.csfield_definition_set_unit(self, value, None, 0, 0, 0) diff --git a/src/ansys/dpf/gate/generated/field_definition_capi.py b/src/ansys/dpf/gate/generated/field_definition_capi.py index 97ef4bae29..29d808f360 100644 --- a/src/ansys/dpf/gate/generated/field_definition_capi.py +++ b/src/ansys/dpf/gate/generated/field_definition_capi.py @@ -184,6 +184,35 @@ def csfield_definition_get_shell_layers(res): if errorSize.value != 0: raise errors.DPFServerException(sError.value) return res + + @staticmethod + def csfield_definition_get_quantity_type(res, index): + errorSize = ctypes.c_int(0) + sError = ctypes.c_wchar_p() + res = capi.dll.CSFieldDefinition_GetQuantityType(res._internal_obj if res is not None else None, index, ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) + if errorSize.value != 0: + raise errors.DPFServerException(sError.value) + newres = ctypes.cast(res, ctypes.c_char_p).value.decode("utf-8") if res else None + capi.dll.DataProcessing_String_post_event(res, ctypes.byref(errorSize), ctypes.byref(sError)) + return newres + + @staticmethod + def csfield_definition_get_num_available_quantity_types(fieldDef): + errorSize = ctypes.c_int(0) + sError = ctypes.c_wchar_p() + res = capi.dll.CSFieldDefinition_GetNumAvailableQuantityTypes(fieldDef._internal_obj if fieldDef is not None else None, ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) + if errorSize.value != 0: + raise errors.DPFServerException(sError.value) + return res + + @staticmethod + def csfield_definition_is_of_quantity_type(fieldDef, quantityType): + errorSize = ctypes.c_int(0) + sError = ctypes.c_wchar_p() + res = capi.dll.CSFieldDefinition_GetNumAvailableQuantityTypes(fieldDef._internal_obj if fieldDef is not None else None, utils.to_char_ptr(quantityType), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) + if errorSize.value != 0: + raise errors.DPFServerException(sError.value) + return res @staticmethod def csfield_definition_get_location(res): @@ -241,6 +270,15 @@ def csfield_definition_set_shell_layers(fieldDef, shellLayers): raise errors.DPFServerException(sError.value) return res + @staticmethod + def csfield_definition_set_quantity_type(fieldDef, quantityType): + errorSize = ctypes.c_int(0) + sError = ctypes.c_wchar_p() + res = capi.dll.CSFieldDefinition_SetQuantityType(fieldDef._internal_obj if fieldDef is not None else None, utils.to_char_ptr(quantityType), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) + if errorSize.value != 0: + raise errors.DPFServerException(sError.value) + return res + @staticmethod def csfield_definition_set_location(fieldDef, location): errorSize = ctypes.c_int(0) diff --git a/tests/test_field.py b/tests/test_field.py index 640ab83bfc..14febba7c3 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -517,6 +517,37 @@ def test_create_and_update_field_definition(server_type): assert fieldDef.location == locations.nodal +def test_field_definition_quantity_type(server_type): + fieldDef = FieldDefinition(server=server_type) + + # Testing the setter + qt = "my_quantity_type" + fieldDef.set_quantity_type(qt) + + # Testing the getter + assert fieldDef.get_quantity_type(0) == qt + + # Adding a second quantity type + qt2 = "another_quantity_type" + fieldDef.set_quantity_type(qt2) + + # Testing the getter again + assert fieldDef.get_quantity_type(1) == qt2 + + # Testing the getter with an index out of range + assert fieldDef.get_quantity_type(2) == None + + # Testing the getter with a negative index + with pytest.raises(Exception): + fieldDef.get_quantity_type(-1) + + # Getting the number of available quantity types + assert fieldDef.get_num_available_quantity_types() == 2 + + # Checking if the field definition is of a given quantity type + assert fieldDef.is_of_quantity_type(qt) + + @conftest.raises_for_servers_version_under("4.0") def test_create_and_set_get_name_field_definition(server_type): fieldDef = FieldDefinition(server=server_type) From 0c06eabb3d9968ce993b8c0f689808fe8e13859f Mon Sep 17 00:00:00 2001 From: aboutheo Date: Fri, 13 Dec 2024 10:31:02 +0100 Subject: [PATCH 02/12] feat: Update after PR Review --- src/ansys/dpf/core/field_definition.py | 39 +++++++++--------- .../gate/generated/field_definition_capi.py | 41 +------------------ tests/test_field.py | 15 +++---- 3 files changed, 26 insertions(+), 69 deletions(-) diff --git a/src/ansys/dpf/core/field_definition.py b/src/ansys/dpf/core/field_definition.py index a10f92f6d2..a979bee973 100644 --- a/src/ansys/dpf/core/field_definition.py +++ b/src/ansys/dpf/core/field_definition.py @@ -153,36 +153,35 @@ def dimensionality(self): self._api.csfield_definition_fill_dimensionality(self, dim, nature, dim.internal_size) return Dimensionality(dim.tolist(), natures(int(nature))) - def get_quantity_type(self, index=0): - """Getter for Quantity Type - - Parameters - ---------- - index: Index of the quantity type to return + @property + def quantity_type(self): + """Getter for Quantity Types Returns ------- - quantity_type : Quantity Type - Quantity type of the elementary data at a given index. + str + All quantity types of the elementary data for this FieldDefinition. """ - if index < 0: - raise ValueError("Index must be greater than or equal to 0") + quantity_types = [] + for i in range(self.num_quantity_types()): + qt = self._api.csfield_definition_get_quantity_type(self, i) + print(qt) + quantity_types.append(str(qt)) - quantity_type = self._api.csfield_definition_get_quantity_type(self, index) - return str(quantity_type) + return quantity_types - def set_quantity_type(self, quantity_type): - """Setter for Quantity Type + def add_quantity_type(self, quantity_type_to_add): + """Add a new Quantity Type Parameters ---------- - quantity_type: Quantity Type - Quantity type to set + quantity_type_to_add: str + Quantity type to add """ - self._api.csfield_definition_set_quantity_type(self, quantity_type) + self._api.csfield_definition_set_quantity_type(self, quantity_type_to_add) - def get_num_available_quantity_types(self): - """Getter for the number of available quantity types + def num_quantity_types(self): + """Number of available quantity types Returns ------- @@ -197,7 +196,7 @@ def is_of_quantity_type(self, quantity_type): Parameters ---------- - quantity_type: Quantity Type + quantity_type: str Quantity type to check Returns diff --git a/src/ansys/dpf/gate/generated/field_definition_capi.py b/src/ansys/dpf/gate/generated/field_definition_capi.py index 29d808f360..7a4a8a66da 100644 --- a/src/ansys/dpf/gate/generated/field_definition_capi.py +++ b/src/ansys/dpf/gate/generated/field_definition_capi.py @@ -184,35 +184,6 @@ def csfield_definition_get_shell_layers(res): if errorSize.value != 0: raise errors.DPFServerException(sError.value) return res - - @staticmethod - def csfield_definition_get_quantity_type(res, index): - errorSize = ctypes.c_int(0) - sError = ctypes.c_wchar_p() - res = capi.dll.CSFieldDefinition_GetQuantityType(res._internal_obj if res is not None else None, index, ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) - if errorSize.value != 0: - raise errors.DPFServerException(sError.value) - newres = ctypes.cast(res, ctypes.c_char_p).value.decode("utf-8") if res else None - capi.dll.DataProcessing_String_post_event(res, ctypes.byref(errorSize), ctypes.byref(sError)) - return newres - - @staticmethod - def csfield_definition_get_num_available_quantity_types(fieldDef): - errorSize = ctypes.c_int(0) - sError = ctypes.c_wchar_p() - res = capi.dll.CSFieldDefinition_GetNumAvailableQuantityTypes(fieldDef._internal_obj if fieldDef is not None else None, ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) - if errorSize.value != 0: - raise errors.DPFServerException(sError.value) - return res - - @staticmethod - def csfield_definition_is_of_quantity_type(fieldDef, quantityType): - errorSize = ctypes.c_int(0) - sError = ctypes.c_wchar_p() - res = capi.dll.CSFieldDefinition_GetNumAvailableQuantityTypes(fieldDef._internal_obj if fieldDef is not None else None, utils.to_char_ptr(quantityType), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) - if errorSize.value != 0: - raise errors.DPFServerException(sError.value) - return res @staticmethod def csfield_definition_get_location(res): @@ -270,15 +241,6 @@ def csfield_definition_set_shell_layers(fieldDef, shellLayers): raise errors.DPFServerException(sError.value) return res - @staticmethod - def csfield_definition_set_quantity_type(fieldDef, quantityType): - errorSize = ctypes.c_int(0) - sError = ctypes.c_wchar_p() - res = capi.dll.CSFieldDefinition_SetQuantityType(fieldDef._internal_obj if fieldDef is not None else None, utils.to_char_ptr(quantityType), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) - if errorSize.value != 0: - raise errors.DPFServerException(sError.value) - return res - @staticmethod def csfield_definition_set_location(fieldDef, location): errorSize = ctypes.c_int(0) @@ -389,5 +351,4 @@ def dimensionality_get_num_comp_for_object(api_to_use, nature, size, vsize): res = capi.dll.Dimensionality_GetNumComp_for_object(api_to_use._internal_obj if api_to_use is not None else None, utils.to_int32(nature), utils.to_int32_ptr(size), utils.to_int32(vsize), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) if errorSize.value != 0: raise errors.DPFServerException(sError.value) - return res - + return res \ No newline at end of file diff --git a/tests/test_field.py b/tests/test_field.py index 14febba7c3..2b69f9f7f7 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -522,27 +522,24 @@ def test_field_definition_quantity_type(server_type): # Testing the setter qt = "my_quantity_type" - fieldDef.set_quantity_type(qt) + fieldDef.add_quantity_type(qt) # Testing the getter - assert fieldDef.get_quantity_type(0) == qt + assert fieldDef.quantity_type[0] == qt # Adding a second quantity type qt2 = "another_quantity_type" - fieldDef.set_quantity_type(qt2) + fieldDef.add_quantity_type(qt2) # Testing the getter again - assert fieldDef.get_quantity_type(1) == qt2 + assert fieldDef.quantity_type[1] == qt2 # Testing the getter with an index out of range - assert fieldDef.get_quantity_type(2) == None - - # Testing the getter with a negative index with pytest.raises(Exception): - fieldDef.get_quantity_type(-1) + fieldDef.quantity_type[2] # Getting the number of available quantity types - assert fieldDef.get_num_available_quantity_types() == 2 + assert fieldDef.num_quantity_types() == 2 # Checking if the field definition is of a given quantity type assert fieldDef.is_of_quantity_type(qt) From adf46c5b20027b651f56d0c9a232d4c867dcfcdb Mon Sep 17 00:00:00 2001 From: aboutheo Date: Fri, 13 Dec 2024 10:32:15 +0100 Subject: [PATCH 03/12] feat: Update after PR Review (2) --- src/ansys/dpf/gate/generated/field_definition_capi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ansys/dpf/gate/generated/field_definition_capi.py b/src/ansys/dpf/gate/generated/field_definition_capi.py index 7a4a8a66da..24b1469979 100644 --- a/src/ansys/dpf/gate/generated/field_definition_capi.py +++ b/src/ansys/dpf/gate/generated/field_definition_capi.py @@ -351,4 +351,5 @@ def dimensionality_get_num_comp_for_object(api_to_use, nature, size, vsize): res = capi.dll.Dimensionality_GetNumComp_for_object(api_to_use._internal_obj if api_to_use is not None else None, utils.to_int32(nature), utils.to_int32_ptr(size), utils.to_int32(vsize), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) if errorSize.value != 0: raise errors.DPFServerException(sError.value) - return res \ No newline at end of file + return res + \ No newline at end of file From ba084f2836ff7d2b12c863db76700c20ba2f802a Mon Sep 17 00:00:00 2001 From: aboutheo Date: Fri, 13 Dec 2024 10:32:49 +0100 Subject: [PATCH 04/12] feat: Update after PR Review (3) --- src/ansys/dpf/gate/generated/field_definition_capi.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ansys/dpf/gate/generated/field_definition_capi.py b/src/ansys/dpf/gate/generated/field_definition_capi.py index 24b1469979..ea1c903c58 100644 --- a/src/ansys/dpf/gate/generated/field_definition_capi.py +++ b/src/ansys/dpf/gate/generated/field_definition_capi.py @@ -352,4 +352,3 @@ def dimensionality_get_num_comp_for_object(api_to_use, nature, size, vsize): if errorSize.value != 0: raise errors.DPFServerException(sError.value) return res - \ No newline at end of file From bb05ddb8b0a012f62bac94a51fe11ead92800f23 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Fri, 13 Dec 2024 10:33:41 +0100 Subject: [PATCH 05/12] feat: Update after PR Review (4) --- src/ansys/dpf/gate/generated/field_definition_capi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/dpf/gate/generated/field_definition_capi.py b/src/ansys/dpf/gate/generated/field_definition_capi.py index ea1c903c58..7a4a8a66da 100644 --- a/src/ansys/dpf/gate/generated/field_definition_capi.py +++ b/src/ansys/dpf/gate/generated/field_definition_capi.py @@ -351,4 +351,4 @@ def dimensionality_get_num_comp_for_object(api_to_use, nature, size, vsize): res = capi.dll.Dimensionality_GetNumComp_for_object(api_to_use._internal_obj if api_to_use is not None else None, utils.to_int32(nature), utils.to_int32_ptr(size), utils.to_int32(vsize), ctypes.byref(utils.to_int32(errorSize)), ctypes.byref(sError)) if errorSize.value != 0: raise errors.DPFServerException(sError.value) - return res + return res \ No newline at end of file From dd7ed4f054fbee2eed42e0f68175a940c91a8b35 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Wed, 18 Dec 2024 16:52:18 +0100 Subject: [PATCH 06/12] feat: Added Fields Container to `any` cast --- src/ansys/dpf/core/any.py | 6 ++++++ tests/test_any.py | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/ansys/dpf/core/any.py b/src/ansys/dpf/core/any.py index 0ae1f8b530..3fae9c557f 100644 --- a/src/ansys/dpf/core/any.py +++ b/src/ansys/dpf/core/any.py @@ -115,6 +115,7 @@ def _new_from_string_as_bytes_on_client(self, client, str): def _type_to_new_from_get_as_method(self, obj): from ansys.dpf.core import ( field, + fields_container, property_field, generic_data_container, string_field, @@ -157,6 +158,11 @@ def _type_to_new_from_get_as_method(self, obj): self._api.any_new_from_property_field, self._api.any_get_as_property_field, ) + elif issubclass(obj, fields_container.FieldsContainer): + return ( + self._api.any_new_from_fields_container, + self._api.any_get_as_fields_container, + ) elif issubclass(obj, string_field.StringField): return ( self._api.any_new_from_string_field, diff --git a/tests/test_any.py b/tests/test_any.py index 468cccd301..8957fbaff5 100644 --- a/tests/test_any.py +++ b/tests/test_any.py @@ -144,3 +144,15 @@ def test_cast_operator_any(server_type): new_entity = any_dpf.cast() assert entity.name == new_entity.name + + +@pytest.mark.skipif( + not conftest.SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_10_0, + reason="any does not support operator below 10.0", +) +def test_cast_fields_container_any(server_type): + entity = dpf.FieldsContainer(server=server_type) + any_dpf = dpf.Any.new_from(entity) + new_entity = any_dpf.cast() + + assert entity.name == new_entity.name From 2a1477d2d8a46560cbc675afb216ff67a89bef78 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Wed, 18 Dec 2024 17:24:43 +0100 Subject: [PATCH 07/12] feat: exposing quantity_type in the GRPC API --- src/ansys/dpf/core/field_definition.py | 4 ++++ .../dpf/gate/field_definition_grpcapi.py | 23 +++++++++++++++++-- tests/test_field.py | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/ansys/dpf/core/field_definition.py b/src/ansys/dpf/core/field_definition.py index a979bee973..1b8e89e598 100644 --- a/src/ansys/dpf/core/field_definition.py +++ b/src/ansys/dpf/core/field_definition.py @@ -153,6 +153,7 @@ def dimensionality(self): self._api.csfield_definition_fill_dimensionality(self, dim, nature, dim.internal_size) return Dimensionality(dim.tolist(), natures(int(nature))) + # @version_requires("4.0") #TODO @property def quantity_type(self): """Getter for Quantity Types @@ -170,6 +171,7 @@ def quantity_type(self): return quantity_types + # @version_requires("4.0") #TODO def add_quantity_type(self, quantity_type_to_add): """Add a new Quantity Type @@ -180,6 +182,7 @@ def add_quantity_type(self, quantity_type_to_add): """ self._api.csfield_definition_set_quantity_type(self, quantity_type_to_add) + # @version_requires("4.0") #TODO def num_quantity_types(self): """Number of available quantity types @@ -191,6 +194,7 @@ def num_quantity_types(self): num_quantity_types = self._api.csfield_definition_get_num_available_quantity_types(self) return num_quantity_types + # @version_requires("4.0") #TODO def is_of_quantity_type(self, quantity_type): """Check if the field definition is of a given quantity type diff --git a/src/ansys/dpf/gate/field_definition_grpcapi.py b/src/ansys/dpf/gate/field_definition_grpcapi.py index e585204a59..c86ed997ef 100644 --- a/src/ansys/dpf/gate/field_definition_grpcapi.py +++ b/src/ansys/dpf/gate/field_definition_grpcapi.py @@ -22,10 +22,27 @@ def init_field_definition_environment(object): def csfield_definition_fill_unit(fieldDef, symbol, size, homogeneity, factor, shift): symbol.set_str(_get_stub(fieldDef._server).List(fieldDef._internal_obj).unit.symbol) + + @staticmethod + def csfield_definition_get_quantity_type(fieldDef, index): + return _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_type[index] + + @staticmethod + def csfield_definition_set_quantity_type(fieldDef, quantityType): + FieldDefinitionGRPCAPI._modify_field_def(fieldDef, quantity_type=quantityType) + + @staticmethod + def csfield_definition_get_num_available_quantity_types(fieldDef): + return len(_get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_type) + + @staticmethod + def csfield_definition_is_of_quantity_type(fieldDef, quantityType): + return quantityType in _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_type + @staticmethod def csfield_definition_get_shell_layers(fieldDef): return _get_stub(fieldDef._server).List(fieldDef._internal_obj).shell_layers - 1 - + @staticmethod def csfield_definition_fill_location(fieldDef, location, size): out = _get_stub(fieldDef._server).List(fieldDef._internal_obj) @@ -73,7 +90,7 @@ def field_definition_new_on_client(client): @staticmethod def _modify_field_def( - fieldDef, unit=None, location=None, dimensionality=None, shell_layer=None, name=None + fieldDef, unit=None, location=None, dimensionality=None, shell_layer=None, name=None, quantity_type=None ): from ansys.grpc.dpf import field_definition_pb2 request = field_definition_pb2.FieldDefinitionUpdateRequest() @@ -89,5 +106,7 @@ def _modify_field_def( request.shell_layers = shell_layer if name != None: request.name.string = name + if quantity_type != None: + request.quantity_type = quantity_type _get_stub(fieldDef._server).Update(request) diff --git a/tests/test_field.py b/tests/test_field.py index 2b69f9f7f7..f749d43025 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -517,6 +517,7 @@ def test_create_and_update_field_definition(server_type): assert fieldDef.location == locations.nodal +# @conftest.raises_for_servers_version_under("7.0") # TODO def test_field_definition_quantity_type(server_type): fieldDef = FieldDefinition(server=server_type) From 0b18c4bbf75ce53d1b6dd26a45f8f62d409523bc Mon Sep 17 00:00:00 2001 From: aboutheo Date: Thu, 19 Dec 2024 09:02:15 +0100 Subject: [PATCH 08/12] feat: using right name for quantity_types --- src/ansys/dpf/gate/field_definition_grpcapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/dpf/gate/field_definition_grpcapi.py b/src/ansys/dpf/gate/field_definition_grpcapi.py index c86ed997ef..9988fb421d 100644 --- a/src/ansys/dpf/gate/field_definition_grpcapi.py +++ b/src/ansys/dpf/gate/field_definition_grpcapi.py @@ -107,6 +107,6 @@ def _modify_field_def( if name != None: request.name.string = name if quantity_type != None: - request.quantity_type = quantity_type + request.quantity_types.quantity_types = quantity_type _get_stub(fieldDef._server).Update(request) From 329f94a85b98a659ff10c9abf3f98ff825e22d16 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Thu, 19 Dec 2024 10:20:12 +0100 Subject: [PATCH 09/12] feat: fixing exposure of quantity types --- src/ansys/dpf/core/field_definition.py | 3 +-- src/ansys/dpf/gate/field_definition_grpcapi.py | 8 ++++---- tests/test_field.py | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ansys/dpf/core/field_definition.py b/src/ansys/dpf/core/field_definition.py index 547aef932f..4796c9ab7b 100644 --- a/src/ansys/dpf/core/field_definition.py +++ b/src/ansys/dpf/core/field_definition.py @@ -155,7 +155,7 @@ def dimensionality(self): # @version_requires("4.0") #TODO @property - def quantity_type(self): + def quantity_types(self): """Getter for Quantity Types Returns @@ -166,7 +166,6 @@ def quantity_type(self): quantity_types = [] for i in range(self.num_quantity_types()): qt = self._api.csfield_definition_get_quantity_type(self, i) - print(qt) quantity_types.append(str(qt)) return quantity_types diff --git a/src/ansys/dpf/gate/field_definition_grpcapi.py b/src/ansys/dpf/gate/field_definition_grpcapi.py index 9988fb421d..70814b665f 100644 --- a/src/ansys/dpf/gate/field_definition_grpcapi.py +++ b/src/ansys/dpf/gate/field_definition_grpcapi.py @@ -25,7 +25,7 @@ def csfield_definition_fill_unit(fieldDef, symbol, size, homogeneity, factor, sh @staticmethod def csfield_definition_get_quantity_type(fieldDef, index): - return _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_type[index] + return _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_types.quantity_types[index] @staticmethod def csfield_definition_set_quantity_type(fieldDef, quantityType): @@ -33,11 +33,11 @@ def csfield_definition_set_quantity_type(fieldDef, quantityType): @staticmethod def csfield_definition_get_num_available_quantity_types(fieldDef): - return len(_get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_type) + return len(_get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_types.quantity_types) @staticmethod def csfield_definition_is_of_quantity_type(fieldDef, quantityType): - return quantityType in _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_type + return quantityType in _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_types.quantity_types @staticmethod def csfield_definition_get_shell_layers(fieldDef): @@ -107,6 +107,6 @@ def _modify_field_def( if name != None: request.name.string = name if quantity_type != None: - request.quantity_types.quantity_types = quantity_type + request.quantity_types.quantity_types.append(quantity_type) _get_stub(fieldDef._server).Update(request) diff --git a/tests/test_field.py b/tests/test_field.py index f749d43025..5fe917039a 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -526,18 +526,18 @@ def test_field_definition_quantity_type(server_type): fieldDef.add_quantity_type(qt) # Testing the getter - assert fieldDef.quantity_type[0] == qt + assert fieldDef.quantity_types[0] == qt # Adding a second quantity type qt2 = "another_quantity_type" fieldDef.add_quantity_type(qt2) # Testing the getter again - assert fieldDef.quantity_type[1] == qt2 + assert fieldDef.quantity_types[1] == qt2 # Testing the getter with an index out of range with pytest.raises(Exception): - fieldDef.quantity_type[2] + fieldDef.quantity_types[2] # Getting the number of available quantity types assert fieldDef.num_quantity_types() == 2 From 58b007cebcf690423f5b77c1feb1ae4ef9dea710 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Thu, 19 Dec 2024 12:14:03 +0100 Subject: [PATCH 10/12] feat: Added gRPC methods for Any cast for FieldsContainer --- src/ansys/dpf/gate/any_grpcapi.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ansys/dpf/gate/any_grpcapi.py b/src/ansys/dpf/gate/any_grpcapi.py index c263e904ff..fbdbd99f4e 100644 --- a/src/ansys/dpf/gate/any_grpcapi.py +++ b/src/ansys/dpf/gate/any_grpcapi.py @@ -34,6 +34,7 @@ def _type_to_message_type(): from ansys.dpf.gate import dpf_vector from ansys.dpf.core import ( field, + fields_container, property_field, generic_data_container, string_field, @@ -50,6 +51,7 @@ def _type_to_message_type(): (float, base_pb2.Type.DOUBLE), (bytes, base_pb2.Type.STRING), (field.Field, base_pb2.Type.FIELD), + (fields_container.FieldsContainer, base_pb2.Type.COLLECTION, base_pb2.Type.FIELD), (property_field.PropertyField, base_pb2.Type.PROPERTY_FIELD), (string_field.StringField, base_pb2.Type.STRING_FIELD), (custom_type_field.CustomTypeField, base_pb2.Type.CUSTOM_TYPE_FIELD), @@ -114,6 +116,10 @@ def any_get_as_field(any): @staticmethod def any_get_as_property_field(any): return AnyGRPCAPI._get_as(any).field + + @staticmethod + def any_get_as_fields_container(any): + return AnyGRPCAPI._get_as(any).collection @staticmethod def any_get_as_string_field(any): @@ -213,6 +219,10 @@ def any_new_from_field(any): def any_new_from_property_field(any): return AnyGRPCAPI._new_from(any, any._server) + @staticmethod + def any_new_from_fields_container(any): + return AnyGRPCAPI._new_from(any, any._server) + @staticmethod def any_new_from_string_field(any): return AnyGRPCAPI._new_from(any, any._server) From 85c0130c4fa01d79209011e3a4f1676146ff23c9 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Wed, 22 Jan 2025 15:23:42 +0100 Subject: [PATCH 11/12] feat: removed an useless comment --- tests/test_field.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_field.py b/tests/test_field.py index fef29e4c4e..a25b768313 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -517,7 +517,6 @@ def test_create_and_update_field_definition(server_type): assert fieldDef.location == locations.nodal -# @conftest.raises_for_servers_version_under("7.0") # TODO def test_field_definition_quantity_type(server_type): fieldDef = FieldDefinition(server=server_type) From a6749ace9fe732e0094982e8db82cc8fb54e7780 Mon Sep 17 00:00:00 2001 From: aboutheo Date: Wed, 22 Jan 2025 15:41:45 +0100 Subject: [PATCH 12/12] feat: fixed style check --- src/ansys/dpf/core/field_definition.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/ansys/dpf/core/field_definition.py b/src/ansys/dpf/core/field_definition.py index 17dc415a7b..4a55f324e8 100644 --- a/src/ansys/dpf/core/field_definition.py +++ b/src/ansys/dpf/core/field_definition.py @@ -150,10 +150,9 @@ def dimensionality(self): self._api.csfield_definition_fill_dimensionality(self, dim, nature, dim.internal_size) return Dimensionality(dim.tolist(), natures(int(nature))) - # @version_requires("4.0") #TODO @property def quantity_types(self): - """Getter for Quantity Types + """Getter for Quantity Types. Returns ------- @@ -167,9 +166,8 @@ def quantity_types(self): return quantity_types - # @version_requires("4.0") #TODO def add_quantity_type(self, quantity_type_to_add): - """Add a new Quantity Type + """Add a new Quantity Type. Parameters ---------- @@ -178,9 +176,8 @@ def add_quantity_type(self, quantity_type_to_add): """ self._api.csfield_definition_set_quantity_type(self, quantity_type_to_add) - # @version_requires("4.0") #TODO def num_quantity_types(self): - """Number of available quantity types + """Return number of available quantity types. Returns ------- @@ -190,9 +187,8 @@ def num_quantity_types(self): num_quantity_types = self._api.csfield_definition_get_num_available_quantity_types(self) return num_quantity_types - # @version_requires("4.0") #TODO def is_of_quantity_type(self, quantity_type): - """Check if the field definition is of a given quantity type + """Check if the field definition is of a given quantity type. Parameters ----------