Skip to content

Commit 4f18158

Browse files
authored
feat: exposing quantity types in PyDPF Core (#1965)
* feat: exposing quantity types in PyDPF Core * feat: Update after PR Review * feat: Update after PR Review (2) * feat: Update after PR Review (3) * feat: Update after PR Review (4) * feat: Added Fields Container to `any` cast * feat: exposing quantity_type in the GRPC API * feat: using right name for quantity_types * feat: fixing exposure of quantity types * feat: Added gRPC methods for Any cast for FieldsContainer * feat: removed an useless comment * feat: fixed style check
1 parent 3e08d26 commit 4f18158

File tree

7 files changed

+131
-4
lines changed

7 files changed

+131
-4
lines changed

src/ansys/dpf/core/any.py

+6
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ def _new_from_string_as_bytes_on_client(self, client, str):
114114
def _type_to_new_from_get_as_method(self, obj):
115115
from ansys.dpf.core import (
116116
field,
117+
fields_container,
117118
property_field,
118119
generic_data_container,
119120
string_field,
@@ -156,6 +157,11 @@ def _type_to_new_from_get_as_method(self, obj):
156157
self._api.any_new_from_property_field,
157158
self._api.any_get_as_property_field,
158159
)
160+
elif issubclass(obj, fields_container.FieldsContainer):
161+
return (
162+
self._api.any_new_from_fields_container,
163+
self._api.any_get_as_fields_container,
164+
)
159165
elif issubclass(obj, string_field.StringField):
160166
return (
161167
self._api.any_new_from_string_field,

src/ansys/dpf/core/field_definition.py

+53
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,59 @@ def dimensionality(self):
150150
self._api.csfield_definition_fill_dimensionality(self, dim, nature, dim.internal_size)
151151
return Dimensionality(dim.tolist(), natures(int(nature)))
152152

153+
@property
154+
def quantity_types(self):
155+
"""Getter for Quantity Types.
156+
157+
Returns
158+
-------
159+
str
160+
All quantity types of the elementary data for this FieldDefinition.
161+
"""
162+
quantity_types = []
163+
for i in range(self.num_quantity_types()):
164+
qt = self._api.csfield_definition_get_quantity_type(self, i)
165+
quantity_types.append(str(qt))
166+
167+
return quantity_types
168+
169+
def add_quantity_type(self, quantity_type_to_add):
170+
"""Add a new Quantity Type.
171+
172+
Parameters
173+
----------
174+
quantity_type_to_add: str
175+
Quantity type to add
176+
"""
177+
self._api.csfield_definition_set_quantity_type(self, quantity_type_to_add)
178+
179+
def num_quantity_types(self):
180+
"""Return number of available quantity types.
181+
182+
Returns
183+
-------
184+
num_quantity_types : int
185+
Number of quantity types
186+
"""
187+
num_quantity_types = self._api.csfield_definition_get_num_available_quantity_types(self)
188+
return num_quantity_types
189+
190+
def is_of_quantity_type(self, quantity_type):
191+
"""Check if the field definition is of a given quantity type.
192+
193+
Parameters
194+
----------
195+
quantity_type: str
196+
Quantity type to check
197+
198+
Returns
199+
-------
200+
is_of_quantity_type : bool
201+
True if the field definition is of the given quantity type
202+
"""
203+
is_of_quantity_type = self._api.csfield_definition_is_of_quantity_type(self, quantity_type)
204+
return is_of_quantity_type
205+
153206
@unit.setter
154207
def unit(self, value):
155208
self._api.csfield_definition_set_unit(self, value, None, 0, 0, 0)

src/ansys/dpf/gate/any_grpcapi.py

+10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def _type_to_message_type():
3434
from ansys.dpf.gate import dpf_vector
3535
from ansys.dpf.core import (
3636
field,
37+
fields_container,
3738
property_field,
3839
generic_data_container,
3940
string_field,
@@ -50,6 +51,7 @@ def _type_to_message_type():
5051
(float, base_pb2.Type.DOUBLE),
5152
(bytes, base_pb2.Type.STRING),
5253
(field.Field, base_pb2.Type.FIELD),
54+
(fields_container.FieldsContainer, base_pb2.Type.COLLECTION, base_pb2.Type.FIELD),
5355
(property_field.PropertyField, base_pb2.Type.PROPERTY_FIELD),
5456
(string_field.StringField, base_pb2.Type.STRING_FIELD),
5557
(custom_type_field.CustomTypeField, base_pb2.Type.CUSTOM_TYPE_FIELD),
@@ -114,6 +116,10 @@ def any_get_as_field(any):
114116
@staticmethod
115117
def any_get_as_property_field(any):
116118
return AnyGRPCAPI._get_as(any).field
119+
120+
@staticmethod
121+
def any_get_as_fields_container(any):
122+
return AnyGRPCAPI._get_as(any).collection
117123

118124
@staticmethod
119125
def any_get_as_string_field(any):
@@ -213,6 +219,10 @@ def any_new_from_field(any):
213219
def any_new_from_property_field(any):
214220
return AnyGRPCAPI._new_from(any, any._server)
215221

222+
@staticmethod
223+
def any_new_from_fields_container(any):
224+
return AnyGRPCAPI._new_from(any, any._server)
225+
216226
@staticmethod
217227
def any_new_from_string_field(any):
218228
return AnyGRPCAPI._new_from(any, any._server)

src/ansys/dpf/gate/field_definition_grpcapi.py

+21-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,27 @@ def init_field_definition_environment(object):
2222
def csfield_definition_fill_unit(fieldDef, symbol, size, homogeneity, factor, shift):
2323
symbol.set_str(_get_stub(fieldDef._server).List(fieldDef._internal_obj).unit.symbol)
2424

25+
26+
@staticmethod
27+
def csfield_definition_get_quantity_type(fieldDef, index):
28+
return _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_types.quantity_types[index]
29+
30+
@staticmethod
31+
def csfield_definition_set_quantity_type(fieldDef, quantityType):
32+
FieldDefinitionGRPCAPI._modify_field_def(fieldDef, quantity_type=quantityType)
33+
34+
@staticmethod
35+
def csfield_definition_get_num_available_quantity_types(fieldDef):
36+
return len(_get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_types.quantity_types)
37+
38+
@staticmethod
39+
def csfield_definition_is_of_quantity_type(fieldDef, quantityType):
40+
return quantityType in _get_stub(fieldDef._server).List(fieldDef._internal_obj).quantity_types.quantity_types
41+
2542
@staticmethod
2643
def csfield_definition_get_shell_layers(fieldDef):
2744
return _get_stub(fieldDef._server).List(fieldDef._internal_obj).shell_layers - 1
28-
45+
2946
@staticmethod
3047
def csfield_definition_fill_location(fieldDef, location, size):
3148
out = _get_stub(fieldDef._server).List(fieldDef._internal_obj)
@@ -73,7 +90,7 @@ def field_definition_new_on_client(client):
7390

7491
@staticmethod
7592
def _modify_field_def(
76-
fieldDef, unit=None, location=None, dimensionality=None, shell_layer=None, name=None
93+
fieldDef, unit=None, location=None, dimensionality=None, shell_layer=None, name=None, quantity_type=None
7794
):
7895
from ansys.grpc.dpf import field_definition_pb2
7996
request = field_definition_pb2.FieldDefinitionUpdateRequest()
@@ -89,5 +106,7 @@ def _modify_field_def(
89106
request.shell_layers = shell_layer
90107
if name != None:
91108
request.name.string = name
109+
if quantity_type != None:
110+
request.quantity_types.quantity_types.append(quantity_type)
92111

93112
_get_stub(fieldDef._server).Update(request)

src/ansys/dpf/gate/generated/field_definition_capi.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -351,5 +351,4 @@ def dimensionality_get_num_comp_for_object(api_to_use, nature, size, vsize):
351351
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))
352352
if errorSize.value != 0:
353353
raise errors.DPFServerException(sError.value)
354-
return res
355-
354+
return res

tests/test_any.py

+12
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,15 @@ def test_cast_operator_any(server_type):
144144
new_entity = any_dpf.cast()
145145

146146
assert entity.name == new_entity.name
147+
148+
149+
@pytest.mark.skipif(
150+
not conftest.SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_10_0,
151+
reason="any does not support operator below 10.0",
152+
)
153+
def test_cast_fields_container_any(server_type):
154+
entity = dpf.FieldsContainer(server=server_type)
155+
any_dpf = dpf.Any.new_from(entity)
156+
new_entity = any_dpf.cast()
157+
158+
assert entity.name == new_entity.name

tests/test_field.py

+28
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,34 @@ def test_create_and_update_field_definition(server_type):
517517
assert fieldDef.location == locations.nodal
518518

519519

520+
def test_field_definition_quantity_type(server_type):
521+
fieldDef = FieldDefinition(server=server_type)
522+
523+
# Testing the setter
524+
qt = "my_quantity_type"
525+
fieldDef.add_quantity_type(qt)
526+
527+
# Testing the getter
528+
assert fieldDef.quantity_types[0] == qt
529+
530+
# Adding a second quantity type
531+
qt2 = "another_quantity_type"
532+
fieldDef.add_quantity_type(qt2)
533+
534+
# Testing the getter again
535+
assert fieldDef.quantity_types[1] == qt2
536+
537+
# Testing the getter with an index out of range
538+
with pytest.raises(Exception):
539+
fieldDef.quantity_types[2]
540+
541+
# Getting the number of available quantity types
542+
assert fieldDef.num_quantity_types() == 2
543+
544+
# Checking if the field definition is of a given quantity type
545+
assert fieldDef.is_of_quantity_type(qt)
546+
547+
520548
@conftest.raises_for_servers_version_under("4.0")
521549
def test_create_and_set_get_name_field_definition(server_type):
522550
fieldDef = FieldDefinition(server=server_type)

0 commit comments

Comments
 (0)