Skip to content

Commit 3eba401

Browse files
Refactor material mapping interface
1 parent 8ec856b commit 3eba401

File tree

5 files changed

+55
-57
lines changed

5 files changed

+55
-57
lines changed

flow360/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149
MovingStatistic,
150150
Observer,
151151
ProbeOutput,
152+
RenderOutputGroup,
152153
RenderOutput,
153154
SliceOutput,
154155
StreamlineOutput,

flow360/component/simulation/outputs/output_render_types.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from flow360.component.types import Color, Vector
1111

1212

13-
1413
class StaticCamera(Flow360BaseModel):
1514
position: LengthType.Point = pd.Field(description="Position of the camera in the scene")
1615
target: LengthType.Point = pd.Field(description="Target point of the camera")
@@ -243,7 +242,7 @@ def rainbow(cls, field, min=0, max=1, alpha=1):
243242
)
244243

245244

246-
AllMaterialTypes = Union[PBRMaterial, FieldMaterial]
245+
AnyMaterial = Union[PBRMaterial, FieldMaterial]
247246

248247

249248
class Transform(Flow360BaseModel):

flow360/component/simulation/outputs/outputs.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
get_field_values,
3434
)
3535
from flow360.component.simulation.outputs.output_render_types import (
36-
AllMaterialTypes,
36+
AnyMaterial,
3737
RenderCameraConfig,
3838
RenderEnvironmentConfig,
3939
RenderLightingConfig,
@@ -672,6 +672,19 @@ def allow_only_simulation_surfaces_or_imported_surfaces(cls, value):
672672
return value
673673

674674

675+
class RenderOutputGroup(Flow360BaseModel):
676+
surfaces: Optional[EntityList[Surface]] = pd.Field(
677+
None, description="List of of :class:`~flow360.Surface` entities."
678+
)
679+
slices: Optional[EntityList[Slice]] = pd.Field(
680+
None, description="List of of :class:`~flow360.Slice` entities."
681+
)
682+
isosurfaces: Optional[UniqueItemList[Isosurface]] = pd.Field(
683+
None, description="List of :class:`~flow360.Isosurface` entities."
684+
)
685+
material: AnyMaterial = pd.Field()
686+
687+
675688
class RenderOutput(_AnimationSettings):
676689
"""
677690
@@ -701,23 +714,14 @@ class RenderOutput(_AnimationSettings):
701714
====
702715
"""
703716

704-
name: Optional[str] = pd.Field("Render output", description="Name of the `IsosurfaceOutput`.")
705-
surfaces: Optional[EntityList[Surface]] = pd.Field(
706-
None, description="List of of :class:`~flow360.Surface` entities."
707-
)
708-
slices: Optional[EntityList[Slice]] = pd.Field(
709-
None, description="List of of :class:`~flow360.Slice` entities."
710-
)
711-
isosurfaces: Optional[UniqueItemList[Isosurface]] = pd.Field(
712-
None, description="List of :class:`~flow360.Isosurface` entities."
713-
)
717+
name: str = pd.Field("Render output", description="Name of the `RenderOutput`.")
718+
groups: List[RenderOutputGroup] = pd.Field("Render groups")
714719
output_fields: UniqueItemList[Union[CommonFieldNames, str]] = pd.Field(
715720
[], description="List of output variables."
716721
)
717722
camera: RenderCameraConfig = pd.Field(description="Camera settings", default_factory=RenderCameraConfig.orthographic)
718723
lighting: RenderLightingConfig = pd.Field(description="Lighting settings", default_factory=RenderLightingConfig.default)
719724
environment: RenderEnvironmentConfig = pd.Field(description="Environment settings", default_factory=RenderEnvironmentConfig.simple)
720-
materials: Dict[str, AllMaterialTypes] = pd.Field(description="Material settings per entity")
721725
transform: Optional[Transform] = pd.Field(None, description="Optional model transform to apply to all entities")
722726
output_type: Literal["RenderOutput"] = pd.Field("RenderOutput", frozen=True)
723727

flow360/component/simulation/translator/solver_translator.py

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
TimeAverageSurfaceProbeOutput,
8383
TimeAverageVolumeOutput,
8484
UserDefinedField,
85-
VolumeOutput,
85+
VolumeOutput, RenderOutputGroup,
8686
)
8787
from flow360.component.simulation.primitives import (
8888
BOUNDARY_FULL_NAME_WHEN_NOT_FOUND,
@@ -113,7 +113,6 @@
113113
replace_dict_key,
114114
translate_setting_and_apply_to_all_entities,
115115
translate_value_or_expression_object,
116-
update_dict_recursively,
117116
)
118117
from flow360.component.simulation.unit_system import LengthType
119118
from flow360.component.simulation.user_code.core.types import (
@@ -596,56 +595,51 @@ def translate_render_output(
596595
exclude_none=True, exclude_unset=True, by_alias=True
597596
)
598597

599-
materials = {}
600-
601-
for name, material in render.materials.items():
602-
material = material.model_dump(exclude_none=True, exclude_unset=True, by_alias=True)
603-
materials[name] = material
604-
598+
for render_group in render.groups:
599+
material = render_group.material.model_dump(exclude_none=True, exclude_unset=True, by_alias=True)
605600
if "outputField" in material and material["outputField"] not in render.output_fields:
606-
print(f"Adding material field: {material['outputField']}")
607-
render.output_fields.append(material["outputField"])
608-
609-
print(f"Render output fields are: {render.output_fields}")
610-
611-
print(f"Materials are: {materials}")
601+
render.output_fields.append(material["outputField"])
612602

613603
translated_output = {
604+
"name": render.name,
614605
"animationFrequency": render.frequency,
615606
"animationFrequencyOffset": render.frequency_offset,
616-
"surfaces": translate_setting_and_apply_to_all_entities(
617-
[render],
618-
RenderOutput,
619-
translation_func=translate_output_fields,
620-
to_list=False,
621-
entity_type_to_include=Surface,
622-
entity_list_attribute_name="surfaces"
623-
),
624-
"slices": translate_setting_and_apply_to_all_entities(
625-
[render],
626-
RenderOutput,
627-
translation_func=translate_output_fields,
628-
to_list=False,
629-
entity_injection_func=slice_injection_function,
630-
entity_type_to_include=Slice,
631-
entity_list_attribute_name="slices"
632-
),
633-
"isoSurfaces": translate_setting_and_apply_to_all_entities(
634-
[render],
635-
RenderOutput,
636-
translation_func=translate_output_fields,
637-
to_list=False,
638-
entity_injection_func=isosurface_injection_function,
639-
entity_type_to_include=Isosurface,
640-
entity_list_attribute_name="isosurfaces",
641-
entity_injection_input_params=input_params,
642-
),
607+
"groups": [],
643608
"camera": remove_units_in_dict(camera),
644609
"lighting": remove_units_in_dict(lighting),
645610
"environment": remove_units_in_dict(environment),
646-
"materials": remove_units_in_dict(materials),
611+
"outputFields": translate_output_fields(render)["outputFields"]
647612
}
648613

614+
for render_group in render.groups:
615+
material = render_group.material.model_dump(exclude_none=True, exclude_unset=True, by_alias=True)
616+
translated_output["groups"].append({
617+
"surfaces": translate_setting_and_apply_to_all_entities(
618+
[render_group],
619+
RenderOutputGroup,
620+
to_list=False,
621+
entity_type_to_include=Surface,
622+
entity_list_attribute_name="surfaces"
623+
),
624+
"slices": translate_setting_and_apply_to_all_entities(
625+
[render_group],
626+
RenderOutputGroup,
627+
to_list=False,
628+
entity_injection_func=slice_injection_function,
629+
entity_type_to_include=Slice,
630+
entity_list_attribute_name="slices"
631+
),
632+
"isoSurfaces": translate_setting_and_apply_to_all_entities(
633+
[render_group],
634+
RenderOutputGroup,
635+
to_list=False,
636+
entity_injection_func=isosurface_injection_function,
637+
entity_type_to_include=Isosurface,
638+
entity_list_attribute_name="isosurfaces",
639+
entity_injection_input_params=input_params,
640+
),
641+
"material": remove_units_in_dict(material)
642+
})
649643
if render.transform:
650644
transform = render.transform.model_dump(
651645
exclude_none=True, exclude_unset=True, by_alias=True

flow360/component/simulation/translator/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ def _get_key_name(entity: EntityBase):
278278
def translate_setting_and_apply_to_all_entities(
279279
obj_list: list,
280280
class_type,
281-
translation_func,
281+
translation_func=lambda x, **kwargs: {},
282282
to_list: bool = False,
283283
entity_injection_func=lambda x, **kwargs: {},
284284
pass_translated_setting_to_entity_injection=False,

0 commit comments

Comments
 (0)