Skip to content

Commit 2cd0f0f

Browse files
authored
MeshInfo.parts helper (#1374)
* Add MeshInfo.parts Signed-off-by: paul.profizi <[email protected]> * Add MeshInfo.parts testing and improve typehint Signed-off-by: paul.profizi <[email protected]> * Fix retro Signed-off-by: paul.profizi <[email protected]> * Fix QA Signed-off-by: paul.profizi <[email protected]> --------- Signed-off-by: paul.profizi <[email protected]>
1 parent 881234a commit 2cd0f0f

File tree

4 files changed

+56
-5
lines changed

4 files changed

+56
-5
lines changed

src/ansys/dpf/core/generic_data_container.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
GenericDataContainer
55
====================
66
"""
7+
from __future__ import annotations
78
import traceback
89
import warnings
910
import builtins
11+
from typing import Union, TYPE_CHECKING
12+
if TYPE_CHECKING: # pragma: no cover
13+
from ansys.dpf.core import Field, Scoping, StringField, GenericDataContainer
1014

1115
from ansys.dpf.core import server as server_module
1216
from ansys.dpf.core import errors
@@ -82,15 +86,19 @@ def __str__(self):
8286

8387
return _description(self._internal_obj, self._server)
8488

85-
def set_property(self, property_name, prop):
89+
def set_property(
90+
self,
91+
property_name: str,
92+
prop: Union[int, float, str, Field, StringField, GenericDataContainer, Scoping]
93+
):
8694
"""Register given property with the given name.
8795
8896
Parameters
8997
----------
90-
property_name : str
98+
property_name:
9199
Property name.
92-
prop : Int, String, Float, Field, StringField, GenericDataContainer, Scoping
93-
object instance.
100+
prop:
101+
Property object.
94102
"""
95103

96104
any_dpf = Any.new_from(prop, self._server)

src/ansys/dpf/core/mesh_info.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def __init__(
6060
raise ValueError(
6161
"Arguments generic_data_container and mesh_info are mutually exclusive."
6262
)
63+
self._part_map = None
6364
self._zone_map = None
6465
self._cell_zone_map = None
6566
self._face_zone_map = None
@@ -225,6 +226,29 @@ def part_names(self):
225226
else:
226227
return None
227228

229+
@property
230+
def parts(self) -> dict:
231+
"""Dictionary of available part IDs to part names.
232+
233+
Returns
234+
-------
235+
parts:
236+
Map of part IDs to part names.
237+
238+
.. warning:
239+
Currently unavailable for LegacyGrpc servers.
240+
"""
241+
if self._part_map:
242+
return self._part_map
243+
part_names = self.part_names
244+
part_map = {}
245+
if part_names:
246+
names = part_names.data
247+
for i, key in enumerate(part_names.scoping.ids):
248+
part_map[str(key)] = names[i]
249+
self._part_map = part_map
250+
return self._part_map
251+
228252
@property
229253
def part_scoping(self):
230254
"""

src/ansys/dpf/core/string_field.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
dpf_vector,
1717
integral_types,
1818
)
19+
from typing import List
1920

2021

2122
class StringField(_FieldBase):
@@ -198,7 +199,7 @@ def get_entity_data_by_id(self, id):
198199
data = self.get_entity_data(index)
199200
return data
200201

201-
def append(self, data, scopingid):
202+
def append(self, data: List[str], scopingid: int):
202203
string_list = integral_types.MutableListString(data)
203204
self._api.csstring_field_push_back(self, scopingid, _get_size_of_list(data), string_list)
204205

tests/test_mesh_info.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,3 +489,21 @@ def test_mesh_info_zones(fluent_multi_species, server_clayer):
489489
'7': 'velocity-inlet-7'
490490
}
491491
assert mesh_info.face_zones == ref_face_zones
492+
493+
494+
@pytest.mark.skipif(
495+
not SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_7_0, reason="Available for servers >=7.0"
496+
)
497+
def test_mesh_info_parts(server_type):
498+
parts = ["part_1", "part_2"]
499+
part_ids = list(range(1, len(parts)+1))
500+
part_names = dpf.StringField(nentities=len(part_ids))
501+
for part_id in part_ids:
502+
part_names.append(data=[parts[part_id-1]], scopingid=part_id)
503+
part_scoping = dpf.Scoping(location="part", ids=part_ids)
504+
gdc = dpf.GenericDataContainer()
505+
gdc.set_property(property_name="part_names", prop=part_names)
506+
gdc.set_property(property_name="part_scoping", prop=part_scoping)
507+
mesh_info = dpf.MeshInfo(generic_data_container=gdc, server=server_type)
508+
ref = """{'1': 'part_1', '2': 'part_2'}"""
509+
assert str(mesh_info.parts) == ref

0 commit comments

Comments
 (0)