From 1188ed07e57f250ee6c92814e6fa2f524980c551 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Fri, 28 Mar 2025 09:11:09 +0100 Subject: [PATCH 1/4] Create gyroid_step_remesh.py --- examples/TPMS/gyroid/gyroid_step_remesh.py | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 examples/TPMS/gyroid/gyroid_step_remesh.py diff --git a/examples/TPMS/gyroid/gyroid_step_remesh.py b/examples/TPMS/gyroid/gyroid_step_remesh.py new file mode 100755 index 00000000..e6793220 --- /dev/null +++ b/examples/TPMS/gyroid/gyroid_step_remesh.py @@ -0,0 +1,40 @@ +from pathlib import Path +from microgen import Tpms, Phase, meshPeriodic, Rve +from microgen.remesh import remesh_keeping_periodicity_for_fem +from microgen.shape.surface_functions import gyroid +import cadquery as cq +import pyvista as pv + +geometry = Tpms( + surface_function=gyroid, + density=0.30, + resolution=30, +) + +listPhases = [] +listPhases.append(Phase(shape=geometry.generate())) +rve = Rve(dim=1) + +step_file = str(Path(__file__).parent / "gyroid.step") +cq.exporters.export(listPhases[0].shape, step_file) + +vtk_file = str(Path(__file__).parent / "gyroid.vtk") + +meshPeriodic( + mesh_file=step_file, + rve=rve, + listPhases=listPhases, + order=1, + size=0.03, + output_file=vtk_file, +) + +initial_gyroid = pv.UnstructuredGrid(vtk_file) + +max_element_edge_length = 0.02 +remeshed_gyroid = remesh_keeping_periodicity_for_fem( + initial_gyroid, + hmax=max_element_edge_length, +) +remeshed_vtk_file = str(Path(__file__).parent / "remeshed_gyroid_mesh.vtk") +# remeshed_gyroid.save(remeshed_vtk_file) From 0d38ba1124943c30c4d40e366faf9e2e6f280c4a Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Fri, 28 Mar 2025 09:59:31 +0100 Subject: [PATCH 2/4] Update run_examples.py --- examples/run_examples.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/run_examples.py b/examples/run_examples.py index 5db6b398..143b1ae7 100644 --- a/examples/run_examples.py +++ b/examples/run_examples.py @@ -134,7 +134,14 @@ def display_results(examples: list[str], failed: list[str]): EXCLUDE = parser.parse_args().exclude if parser.parse_args().no_mmg: - EXCLUDE.extend(["Mesh/mmg", "Mesh/mmg-voro", "Mesh/remesh"]) + EXCLUDE.extend( + [ + "Mesh/mmg", + "Mesh/mmg-voro", + "Mesh/remesh", + "TPMS/gyroid/gyroid_step_remesh.py", + ] + ) EXCLUDE.append("Fibers") EXCLUDE = [str(PARENT_DIR / exclude) for exclude in EXCLUDE] From 4bda78cddfe5fe398f16b46d328750a47b4b0077 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Fri, 28 Mar 2025 10:32:04 +0100 Subject: [PATCH 3/4] moved example --- examples/{TPMS => Mesh}/gyroid/gyroid_step_remesh.py | 0 examples/run_examples.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename examples/{TPMS => Mesh}/gyroid/gyroid_step_remesh.py (100%) diff --git a/examples/TPMS/gyroid/gyroid_step_remesh.py b/examples/Mesh/gyroid/gyroid_step_remesh.py similarity index 100% rename from examples/TPMS/gyroid/gyroid_step_remesh.py rename to examples/Mesh/gyroid/gyroid_step_remesh.py diff --git a/examples/run_examples.py b/examples/run_examples.py index 143b1ae7..046eb0ab 100644 --- a/examples/run_examples.py +++ b/examples/run_examples.py @@ -139,7 +139,7 @@ def display_results(examples: list[str], failed: list[str]): "Mesh/mmg", "Mesh/mmg-voro", "Mesh/remesh", - "TPMS/gyroid/gyroid_step_remesh.py", + "Mesh/gyroid", ] ) EXCLUDE.append("Fibers") From 940a850e785c421ecbf6660a5f83fb1a54e4e282 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 22 May 2025 08:21:37 +0200 Subject: [PATCH 4/4] Update gyroid_step_remesh.py --- examples/Mesh/gyroid/gyroid_step_remesh.py | 39 +++++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/examples/Mesh/gyroid/gyroid_step_remesh.py b/examples/Mesh/gyroid/gyroid_step_remesh.py index e6793220..109771ee 100755 --- a/examples/Mesh/gyroid/gyroid_step_remesh.py +++ b/examples/Mesh/gyroid/gyroid_step_remesh.py @@ -1,3 +1,26 @@ +""" +This script generates a gyroid-based TPMS (Triply Periodic Minimal Surface) structure +using *cadquery*, exports the geometry to a STEP file, performs periodic +meshing, and optionally remeshes the result for finite element method (FEM) simulations. + +Steps performed: +1. Generate a TPMS geometry using the gyroid surface function. +2. Wrap the geometry into a microgen Phase object. +3. Export the geometry as a STEP file. +4. Import the STEP file and create a mesh with periodic constraints and export as VTK. +5. Optionally remesh the mesh while preserving periodicity. + +Generated files: +- gyroid.step: CAD representation of the TPMS geometry. +- gyroid.vtk: Initial meshed structure. +- remeshed_gyroid_mesh.vtk (optional): Quality-improved periodic mesh for FEM. + +Dependencies: +- microgen +- cadquery +- pyvista +""" + from pathlib import Path from microgen import Tpms, Phase, meshPeriodic, Rve from microgen.remesh import remesh_keeping_periodicity_for_fem @@ -5,32 +28,38 @@ import cadquery as cq import pyvista as pv +# 1. Generate a TPMS geometry using the gyroid surface function. geometry = Tpms( surface_function=gyroid, density=0.30, resolution=30, ) -listPhases = [] -listPhases.append(Phase(shape=geometry.generate())) +# 2. Wrap the geometry into a microgen Phase object. +phases = [] +phases.append(Phase(shape=geometry.generate())) rve = Rve(dim=1) +# 3. Export the geometry as a STEP file. step_file = str(Path(__file__).parent / "gyroid.step") -cq.exporters.export(listPhases[0].shape, step_file) +cq.exporters.export(phases[0].shape, step_file) + +# 4. Import the STEP file and create a mesh with periodic constraints and export as VTK. vtk_file = str(Path(__file__).parent / "gyroid.vtk") meshPeriodic( mesh_file=step_file, rve=rve, - listPhases=listPhases, + listPhases=phases, order=1, size=0.03, output_file=vtk_file, ) -initial_gyroid = pv.UnstructuredGrid(vtk_file) +# 5. Optionally remesh the mesh while preserving periodicity. +initial_gyroid = pv.UnstructuredGrid(vtk_file) max_element_edge_length = 0.02 remeshed_gyroid = remesh_keeping_periodicity_for_fem( initial_gyroid,