Skip to content

Commit a9e1f63

Browse files
Refactor material mapping interface
1 parent 8ec856b commit a9e1f63

File tree

5 files changed

+54
-55
lines changed

5 files changed

+54
-55
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: 15 additions & 11 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
@@ -702,22 +715,13 @@ class RenderOutput(_AnimationSettings):
702715
"""
703716

704717
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-
)
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 & 41 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,
@@ -596,56 +596,51 @@ def translate_render_output(
596596
exclude_none=True, exclude_unset=True, by_alias=True
597597
)
598598

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-
599+
for render_group in render.groups:
600+
material = render_group.material.model_dump(exclude_none=True, exclude_unset=True, by_alias=True)
605601
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}")
602+
render.output_fields.append(material["outputField"])
612603

613604
translated_output = {
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)
647612
}
648613

614+
material = render_group.material.model_dump(exclude_none=True, exclude_unset=True, by_alias=True)
615+
616+
for render_group in render.groups:
617+
translated_output["groups"].append({
618+
"surfaces": translate_setting_and_apply_to_all_entities(
619+
[render_group],
620+
RenderOutputGroup,
621+
to_list=False,
622+
entity_type_to_include=Surface,
623+
entity_list_attribute_name="surfaces"
624+
),
625+
"slices": translate_setting_and_apply_to_all_entities(
626+
[render_group],
627+
RenderOutputGroup,
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_group],
635+
RenderOutputGroup,
636+
to_list=False,
637+
entity_injection_func=isosurface_injection_function,
638+
entity_type_to_include=Isosurface,
639+
entity_list_attribute_name="isosurfaces",
640+
entity_injection_input_params=input_params,
641+
),
642+
"material": remove_units_in_dict(material)
643+
})
649644
if render.transform:
650645
transform = render.transform.model_dump(
651646
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)