Skip to content

Commit 3f12979

Browse files
committed
Keep existing items by default
1 parent 512eef0 commit 3f12979

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

mikeio/generic.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,24 @@ def transform(
10701070
infilename: str | pathlib.Path,
10711071
outfilename: str | pathlib.Path,
10721072
vars: Sequence[DerivedItem],
1073+
keep_existing_items: bool = True,
10731074
) -> None:
1075+
"""Transform a dfs file by applying functions to items.
1076+
1077+
Parameters
1078+
----------
1079+
infilename: str | pathlib.Path
1080+
full path to the input file
1081+
outfilename: str | pathlib.Path
1082+
full path to the output file
1083+
vars: Sequence[DerivedItem]
1084+
List of derived items to compute.
1085+
keep_existing_items: bool, optional
1086+
If True, existing items in the input file will be kept in the output file.
1087+
If False, only the derived items will be written to the output file.
1088+
Default is True.
1089+
1090+
"""
10741091
dfs_i = DfsFileFactory.DfsGenericOpen(str(infilename))
10751092

10761093
item_numbers = _valid_item_numbers(dfs_i.ItemInfo)
@@ -1079,6 +1096,15 @@ def transform(
10791096
items = [v.item for v in vars]
10801097
funcs = {v.item.name: v.func for v in vars}
10811098

1099+
if keep_existing_items:
1100+
existing_items = [
1101+
ItemInfo.from_mikecore_dynamic_item_info(
1102+
dfs_i.ItemInfo[i],
1103+
)
1104+
for i in item_numbers
1105+
]
1106+
items = existing_items + items
1107+
10821108
dfs = _clone(
10831109
str(infilename),
10841110
str(outfilename),

tests/test_generic.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ def test_change_datatype_dfs0(tmp_path: Path) -> None:
674674
assert np.allclose(org, new, rtol=1e-08, atol=1e-10, equal_nan=True)
675675

676676

677-
def test_derived_variables(tmp_path: Path) -> None:
677+
def test_transform_variables(tmp_path: Path) -> None:
678678
from mikeio.generic import DerivedItem, transform
679679

680680
infilename = "tests/testdata/oresundHD_run1.dfsu"
@@ -688,7 +688,7 @@ def test_derived_variables(tmp_path: Path) -> None:
688688
)
689689
]
690690

691-
transform(infilename, outfilename, vars=items)
691+
transform(infilename, outfilename, vars=items, keep_existing_items=False)
692692
dfs = mikeio.Dfsu2DH(outfilename)
693693
assert dfs.items[0].type == mikeio.EUMType.Current_Speed
694694
assert len(dfs.items) == 1
@@ -703,9 +703,29 @@ def test_derived_variables(tmp_path: Path) -> None:
703703

704704
outfilename2 = tmp_path / "existing_and_speed.dfsu"
705705

706-
transform(infilename, outfilename2, vars=sel_items)
706+
transform(infilename, outfilename2, vars=sel_items, keep_existing_items=False)
707707
dfs2 = mikeio.Dfsu2DH(outfilename2)
708708
assert dfs2.items[0].name == "Total water depth" # existing item
709709
assert dfs2.items[1].name == "U velocity" # existing item
710710
assert dfs2.items[2].name == "V velocity" # existing item
711711
assert dfs2.items[3].name == "Current Speed" # derived item
712+
713+
714+
def test_transform_can_include_existing_items(tmp_path: Path) -> None:
715+
from mikeio.generic import DerivedItem, transform
716+
717+
infilename = "tests/testdata/oresundHD_run1.dfsu"
718+
outfilename = tmp_path / "need_for_speed.dfsu"
719+
720+
items = [
721+
DerivedItem(
722+
name="Current Speed",
723+
type=mikeio.EUMType.Current_Speed,
724+
func=lambda x: np.sqrt(x["U velocity"] ** 2 + x["V velocity"] ** 2),
725+
)
726+
]
727+
728+
transform(infilename, outfilename, vars=items, keep_existing_items=True)
729+
dfs = mikeio.Dfsu2DH(outfilename)
730+
assert dfs.items[-1].type == mikeio.EUMType.Current_Speed
731+
assert len(dfs.items) == 5

0 commit comments

Comments
 (0)