Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 72 additions & 35 deletions src/ansys/fluent/core/solver/flobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import pickle
import string
import sys
import types
from typing import Any, Dict, Generic, List, NewType, Optional, Tuple, TypeVar, Union
import weakref

Expand All @@ -47,6 +48,7 @@ class _InlineConstants:
max = "max"
user_creatable = "user-creatable?"
allowed_values = "allowed-values"
file_purpose = "file-purpose"


# Type hints
Expand Down Expand Up @@ -377,12 +379,20 @@ class Filename(SettingsBase[str], Textual):

_state_type = str

def file_purpose(self):
"""Specifies whether this file is used as input or output by Fluent."""
return self.get_attr(_InlineConstants.file_purpose)


class FilenameList(SettingsBase[StringListType], Textual):
"""A FilenameList object represents a list of file names."""

_state_type = StringListType

def file_purpose(self):
"""Specifies whether these files are used as input or output by Fluent."""
return self.get_attr(_InlineConstants.file_purpose)


class Boolean(SettingsBase[bool], Property):
"""A ``Boolean`` object representing a Boolean value setting."""
Expand Down Expand Up @@ -757,6 +767,10 @@ def _create_child_object(self, cname: str):
cls = self.__class__.child_object_type
ret = self._objects[cname] = cls(cname, self)
ret._setattr("_python_name", f'["{cname}"]')
ret._setattr(
"rename",
types.MethodType(lambda obj, name: _rename(self, name, cname), ret),
)
return ret

def _update_objects(self):
Expand All @@ -768,21 +782,6 @@ def _update_objects(self):
if name not in self._objects:
self._create_child_object(name)

def rename(self, new: str, old: str):
"""Rename a named object.

Parameters
----------
new: str
New name.
old : str
Current name.
"""
self.flproxy.rename(self.path, new, old)
if old in self._objects:
del self._objects[old]
self._create_child_object(new)

def __delitem__(self, name: str):
self.flproxy.delete(self.path, name)
if name in self._objects:
Expand Down Expand Up @@ -864,6 +863,24 @@ def __getitem__(self, name: str) -> ChildTypeT:
return obj


def _rename(obj: NamedObject, new: str, old: str):
"""Rename a named object.

Parameters
----------
obj: NamedObject
named-object to be renamed
new: str
New name.
old : str
Current name.
"""
obj.flproxy.rename(obj.path, new, old)
if old in obj._objects:
del obj._objects[old]
obj._create_child_object(new)


class ListObject(SettingsBase[ListStateType], Generic[ChildTypeT]):
"""A ``ListObject`` container is a container object, similar to a Python list
object. Generally, many such objects can be created.
Expand All @@ -877,9 +894,6 @@ class ListObject(SettingsBase[ListStateType], Generic[ChildTypeT]):
-------
get_size()
Get the size of the list.

resize(size)
Resize the list.
"""

# New objects could get inserted by other operations, so we cannot assume
Expand Down Expand Up @@ -934,16 +948,6 @@ def get_size(self) -> int:
"""
return self.flproxy.get_list_size(self.path)

def resize(self, size: int):
"""Resize the list object.

Parameters
----------
size: int
New size
"""
self.flproxy.resize_list_object(self.path, size)

def __getitem__(self, index: int) -> ChildTypeT:
size = self.get_size()
if index >= size:
Expand All @@ -961,10 +965,22 @@ class Map(SettingsBase[DictStateType]):
"""A ``Map`` object representing key-value settings."""


def _get_new_keywords(obj, kwds):
def _get_new_keywords(obj, args, kwds):
newkwds = {}
argNames = []
argumentNames = []
if args:
argNames = obj.argument_names[:]
for i, arg in enumerate(args):
ccls = getattr(obj, argNames[0])
newkwds[ccls.fluent_name] = ccls.to_scheme_keys(arg)
argNames.pop(0)
if kwds:
argumentNames = obj.argument_names[:]
if argNames:
argumentNames = argNames
for k, v in kwds.items():
if k in obj.argument_names:
if k in argumentNames:
ccls = getattr(obj, k)
newkwds[ccls.fluent_name] = ccls.to_scheme_keys(v)
else:
Expand Down Expand Up @@ -1012,7 +1028,29 @@ class Command(Action):

def __call__(self, **kwds):
"""Call a query with the specified keyword arguments."""
newkwds = _get_new_keywords(self, kwds)
newkwds = _get_new_keywords(self, [], kwds)
if self.flproxy.is_interactive_mode():
prompt = self.flproxy.get_command_confirmation_prompt(
self._parent.path, self.obj_name, **newkwds
)
if prompt:
while True:
response = input(prompt + ": y[es]/n[o] ")
if response in ["y", "Y", "n", "N", "yes", "no"]:
break
else:
print("Enter y[es]/n[o]")
if response in ["n", "N", "no"]:
return
return self.flproxy.execute_cmd(self._parent.path, self.obj_name, **newkwds)


class CommandWithPositionalArgs(Action):
"""Command Object."""

def __call__(self, *args, **kwds):
"""Call a query with the specified keyword arguments."""
newkwds = _get_new_keywords(self, args, kwds)
if self.flproxy.is_interactive_mode():
prompt = self.flproxy.get_command_confirmation_prompt(
self._parent.path, self.obj_name, **newkwds
Expand All @@ -1034,7 +1072,7 @@ class Query(Action):

def __call__(self, **kwds):
"""Call a query with the specified keyword arguments."""
newkwds = _get_new_keywords(self, kwds)
newkwds = _get_new_keywords(self, [], kwds)
return self.flproxy.execute_query(self._parent.path, self.obj_name, **newkwds)


Expand Down Expand Up @@ -1184,6 +1222,8 @@ def get_cls(name, info, parent=None, version=None):
pname = to_python_name(name)
obj_type = info["type"]
base = _baseTypes.get(obj_type)
if obj_type == "command" and name in ["rename", "delete", "resize"]:
base = CommandWithPositionalArgs
if base is None:
settings_logger.warning(
f"Unable to find base class for '{name}' "
Expand Down Expand Up @@ -1292,9 +1332,6 @@ def _process_cls_names(info_dict, names, write_doc=False):
cls.child_object_type = get_cls(
"child-object-type", object_type, cls, version=version
)
cls.child_object_type.rename = lambda self, name: self._parent.rename(
name, self._name
)
cls.child_object_type.get_name = lambda self: self._name
except Exception:
print(
Expand Down
2 changes: 1 addition & 1 deletion tests/parametric/test_parametric_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ def test_parametric_workflow():
)
study2 = solver_session.parametric_studies[study2_name]
assert len(study2.design_points) == 2
solver_session.parametric_studies.rename("New Study", study2_name)
solver_session.parametric_studies[study2_name].rename("New Study")
assert "New Study" in solver_session.parametric_studies
del solver_session.parametric_studies[study1_name]
assert len(solver_session.parametric_studies) == 1
Expand Down
21 changes: 12 additions & 9 deletions tests/test_flobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -455,11 +455,9 @@ def test_named_object():
r.n_1["n1"] = {}
r.n_1["n2"] = {}
assert r.n_1.get_object_names() == ["n1", "n2"]
r.n_1.rename("n3", "n1")
assert r.n_1.get_object_names() == ["n3", "n2"]
r.n_1.create("n4")
assert r.n_1.get_object_names() == ["n3", "n2", "n4"]
del r.n_1["n3"]
assert r.n_1.get_object_names() == ["n1", "n2", "n4"]
del r.n_1["n1"]
assert r.n_1.get_object_names() == ["n2", "n4"]
r.n_1["n1"] = {"rl_1": [1.2, 3.4], "sl_1": ["foo", "bar"]}
assert r.n_1["n1"]() == {"rl_1": [1.2, 3.4], "sl_1": ["foo", "bar"]}
Expand All @@ -471,11 +469,7 @@ def test_named_object():
def test_list_object():
r = flobject.get_root(Proxy())
assert r.l_1.get_size() == 0
r.l_1.resize(3)
assert r.l_1.get_size() == 3
r.l_1.resize(2)
assert r.l_1.get_size() == 2
assert r.l_1() == [
r.l_1 = [
{"il_1": None, "bl_1": None},
{"il_1": None, "bl_1": None},
]
Expand Down Expand Up @@ -707,6 +701,15 @@ def test_accessor_methods_on_settings_object(load_static_mixer_settings_only):
else:
assert not mesh.name.is_read_only()

assert solver.results.graphics.mesh.get_object_names() == ["mesh-1"]

solver.results.graphics.mesh["mesh-1"].rename("mesh_new")
assert solver.results.graphics.mesh.get_object_names() == ["mesh_new"]

if solver.get_fluent_version() >= "24.2.0":
solver.results.graphics.mesh.rename(new="mesh_242", old="mesh_new")
assert solver.results.graphics.mesh.get_object_names() == ["mesh_242"]


@pytest.mark.fluent_version("latest")
def test_accessor_methods_on_settings_object_types(load_static_mixer_settings_only):
Expand Down