diff --git a/hydrolib/core/io/dflowfm/xyz/serializer.py b/hydrolib/core/io/dflowfm/xyz/serializer.py index bd1d7d8e3..0485a2639 100644 --- a/hydrolib/core/io/dflowfm/xyz/serializer.py +++ b/hydrolib/core/io/dflowfm/xyz/serializer.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Dict +from typing import Dict, Generator from hydrolib.core.basemodel import SerializerConfig @@ -16,9 +16,21 @@ def serialize(path: Path, data: Dict, config: SerializerConfig) -> None: config (SerializerConfig): The serialization configuration. """ path.parent.mkdir(parents=True, exist_ok=True) + + space = 1 * " " + format_float = lambda x: f"{x:{config.float_format}}" + with path.open("w") as f: for point in data["points"]: + geometry: str = space.join([format_float(p) for p in XYZSerializer._get_point_values(point)]) if point.comment: - f.write(f"{point.x} {point.y} {point.z} # {point.comment}\n") + f.write(f"{geometry} # {point.comment}\n") else: - f.write(f"{point.x} {point.y} {point.z}\n") + f.write(f"{geometry}\n") + + @staticmethod + def _get_point_values(point) -> Generator[float, None, None]: + yield point.x + yield point.y + yield point.z + diff --git a/tests/data/reference/xyz/test.xyz b/tests/data/reference/xyz/test.xyz new file mode 100644 index 000000000..79baabbc5 --- /dev/null +++ b/tests/data/reference/xyz/test.xyz @@ -0,0 +1,2 @@ +1.23 2.34 3.45 +4.57 5.68 6.79 # Some comment diff --git a/tests/io/dflowfm/test_xyz.py b/tests/io/dflowfm/test_xyz.py new file mode 100644 index 000000000..87011db3a --- /dev/null +++ b/tests/io/dflowfm/test_xyz.py @@ -0,0 +1,23 @@ +from tests.utils import test_output_dir, test_reference_dir, assert_files_equal +from hydrolib.core.io.dflowfm.xyz.models import XYZPoint +from hydrolib.core.io.dflowfm.xyz.serializer import XYZSerializer +from hydrolib.core.basemodel import SerializerConfig + +class TestXYZSerializer: + def test_serialize(self): + output_file = test_output_dir / "test.xyz" + reference_file = test_reference_dir / "xyz" / "test.xyz" + + data = { + "points" : [ + XYZPoint(x=1.232, y=2.343, z= 3.454), + XYZPoint(x=4.565, y=5.676, z= 6.787, comment="Some comment")] + } + + config = SerializerConfig(float_format=".2f") + + XYZSerializer.serialize(output_file, data, config) + + assert_files_equal(output_file, reference_file) + +