Skip to content

[Doc](ai) Add example scenes and full user doc readme for MeshRefinement usage #432

[Doc](ai) Add example scenes and full user doc readme for MeshRefinement usage

[Doc](ai) Add example scenes and full user doc readme for MeshRefinement usage #432

Workflow file for this run

name: CI
on:
push:
branches:
- main
- master
tags:
- 'v*' #release tags in format of e.g: 'v25.12.00'
pull_request:
types: [opened, synchronize, reopened, labeled]
workflow_dispatch:
inputs:
full_build:
description: "Run full build (including macOS)"
required: false
default: false
type: boolean
env:
REGRESSION_REPO: sofa-framework/Regression
REGRESSION_BRANCH: master
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
os_list: ${{ steps.set.outputs.os_list }}
steps:
- id: set
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]] ||
[[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" != refs/tags/v* ]] ||
[[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.full_build }}" != "true" ]]; then
echo 'os_list=["ubuntu-22.04","windows-2022"]' >> $GITHUB_OUTPUT
else
echo 'os_list=["ubuntu-22.04","windows-2022","macos-14"]' >> $GITHUB_OUTPUT
fi
- name: Debug
run: echo '${{ steps.set.outputs.os_list }}'
build-and-test:
needs: prepare
name: Run on ${{ matrix.os }} with SOFA ${{ matrix.sofa_branch }} / MeshRefinement=${{ matrix.with_mesh_refinement }}
if: >
github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/v') ||
(
github.event_name == 'pull_request' &&
(
contains(github.event.pull_request.labels.*.name, 'pr: run ci') &&
(
github.event.action != 'labeled' ||
github.event.label.name == 'pr: run ci'
)
)
)
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.prepare.outputs.os_list) }}
sofa_branch: [master]
with_mesh_refinement: [ON, OFF]
steps:
####################### Setup SOFA #######################
- name: Setup SOFA and environment
id: sofa
uses: sofa-framework/sofa-setup-action@v5
with:
sofa_root: ${{ github.workspace }}/sofa
sofa_version: ${{ matrix.sofa_branch }}
sofa_scope: 'full'
############## Checkout MeshRefinement only if enabled ##############
- name: Checkout MeshRefinement source code
if: matrix.with_mesh_refinement == 'ON'
uses: actions/checkout@v4
with:
path: deps/MeshRefinement
repository: InfinyTech3D/MeshRefinement
token: ${{ secrets.MESH_REFINEMENT_DEPLOY_KEY }}
############### Build and install MeshRefinement only if enabled ##############
- name: Build and install MeshRefinement
if: matrix.with_mesh_refinement == 'ON'
shell: bash
run: |
mkdir -p deps/MeshRefinement/build
if [[ "$RUNNER_OS" == "Windows" ]]; then
cmd //c "${{ steps.sofa.outputs.vs_vsdevcmd }} \
&& cd /d %GITHUB_WORKSPACE%/deps/MeshRefinement/build \
&& cmake -GNinja \
-DCMAKE_PREFIX_PATH=$SOFA_ROOT/lib/cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%/deps/MeshRefinement/install \
.. \
&& ninja install"
# Temp hack
cp deps/MeshRefinement/install/bin/MeshRefinement.dll "$WORKSPACE_BUILD_PATH/"
else
cd deps/MeshRefinement/build
cmake \
-GNinja \
-DCMAKE_PREFIX_PATH="$SOFA_ROOT/lib/cmake" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$GITHUB_WORKSPACE/deps/MeshRefinement/install" \
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKSPACE_BUILD_PATH/lib" \
..
ninja install
fi
################# Checkout current repository ##############
- name: Checkout current source code
uses: actions/checkout@v4
with:
path: ${{ env.WORKSPACE_SRC_PATH }}
################ Build and install current plugin ##############
- name: Build and install
shell: bash
run: |
if [[ "$RUNNER_OS" == "Windows" ]]; then
cmd //c "${{ steps.sofa.outputs.vs_vsdevcmd }} \
&& cd /d %GITHUB_WORKSPACE%/build \
&& cmake -GNinja \
-DCMAKE_PREFIX_PATH=%SOFA_ROOT%/lib/cmake;%GITHUB_WORKSPACE%/deps/MeshRefinement/install \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%/install \
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=%WORKSPACE_BUILD_PATH% \
../src \
&& ninja install"
else
cd "$WORKSPACE_BUILD_PATH"
ccache -z
cmake \
-GNinja \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_PREFIX_PATH="$SOFA_ROOT/lib/cmake;$GITHUB_WORKSPACE/deps/MeshRefinement/install" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$WORKSPACE_INSTALL_PATH" \
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKSPACE_BUILD_PATH/lib" \
../src
ninja install
ccache -s
fi
- name: Deploy plugins into SOFA install tree
shell: bash
run: |
set -euo pipefail
mkdir -p "$SOFA_ROOT/plugins"
cp -r "$WORKSPACE_INSTALL_PATH" "$SOFA_ROOT/plugins/InfinyToolkit"
if [[ "${{ matrix.with_mesh_refinement }}" == "ON" ]]; then
cp -r "$GITHUB_WORKSPACE/deps/MeshRefinement/install" "$SOFA_ROOT/plugins/MeshRefinement"
if [[ "$RUNNER_OS" == "Windows" ]]; then
# Windows resolves dependent DLLs from the loading module's own
# directory, not from sibling plugin directories.
cp "$SOFA_ROOT/plugins/MeshRefinement/bin/"*.dll \
"$SOFA_ROOT/plugins/InfinyToolkit/bin/" 2>/dev/null || true
else
# Linux/macOS resolve via RPATH / LD_LIBRARY_PATH instead.
echo "LD_LIBRARY_PATH=$SOFA_ROOT/plugins/MeshRefinement/lib:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV
fi
fi
- name: Configure runtime library path
if: runner.os == 'Linux'
shell: bash
run: |
set -euo pipefail
LP="$SOFA_ROOT/lib"
[[ -d "$LP" ]] || { echo "::error::$LP not found"; exit 1; }
echo "libSofa.Component.Controller: $(ls "$LP"/libSofa.Component.Controller.so* 2>/dev/null || echo MISSING)"
echo "LD_LIBRARY_PATH=$LP:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV
####################### Setup Python #######################
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install dependencies
shell: bash
run: |
set -euo pipefail
python -m pip install --upgrade pip
python -m pip install numpy tqdm
- name: Configure python environment
shell: bash
run: |
set -euo pipefail
SP3="$SOFA_ROOT/plugins/SofaPython3"
SP="$SP3/lib/python3/site-packages"
[[ -d "$SP/Sofa" ]] || { echo "::error::Sofa package not found in $SP"; exit 1; }
if [[ "$RUNNER_OS" == "Windows" ]]; then
echo "PYTHONPATH=$(cygpath -w "$SP")" >> $GITHUB_ENV
echo "SOFAPYTHON3_ROOT=$(cygpath -w "$SP3")" >> $GITHUB_ENV
else
echo "PYTHONPATH=$SP" >> $GITHUB_ENV
echo "SOFAPYTHON3_ROOT=$SP3" >> $GITHUB_ENV
fi
################### Regression tests ###################
- name: Fetch SofaRegressionProgram
shell: bash
run: |
set -euo pipefail
cd "$GITHUB_WORKSPACE"
curl -fSL "https://github.com/${REGRESSION_REPO}/archive/refs/heads/${REGRESSION_BRANCH}.zip" -o regression.zip
python -c "import zipfile;zipfile.ZipFile('regression.zip').extractall('.')"
rm -rf Regression && mv Regression-* Regression
SCRIPT=$(find "$GITHUB_WORKSPACE/Regression" -name 'SofaRegressionProgram.py' | head -n1)
[[ -f "$SCRIPT" ]] || { echo "::error::SofaRegressionProgram.py not found"; exit 1; }
echo "resolved: $SCRIPT"
echo "REGRESSION_SCRIPT=$SCRIPT" >> $GITHUB_ENV
- name: Run regression
shell: bash
run: |
set -euo pipefail
cd "$WORKSPACE_SRC_PATH"
python "$REGRESSION_SCRIPT" --input ./examples
################### Artifact naming ##############
- name: Sanitize artifact name
id: sanitize
# This step removes special characters from the artifact name to ensure compatibility with upload-artifact
# Characters removed: " : < > | * ? \r \n \ /
# Spaces are replaced with underscores
# This sanitization prevents errors in artifact creation and retrieval
shell: pwsh
run: |
if ("${{ matrix.with_mesh_refinement }}" -eq "ON") {
$dependency = "with_meshrefinement"
}
else {
$dependency = "standalone"
}
$originalName = "InfinyToolkit_${dependency}_${{ steps.sofa.outputs.run_branch }}_for-SOFA-${{ steps.sofa.outputs.sofa_version }}_${{ runner.os }}"
$artifact_name = $originalName -replace '[":;<>|*?\r\n\\/]', '' -replace ' ', '_'
echo "artifact_name=$artifact_name" >> $env:GITHUB_OUTPUT
################### Create and upload artifact ##############
- name: Create artifact
id: create-artifact
uses: actions/upload-artifact@v4.4.0
with:
name: ${{ steps.sanitize.outputs.artifact_name }}
path: ${{ env.WORKSPACE_INSTALL_PATH }}
- name: Install artifact
uses: actions/download-artifact@v4.1.7
with:
name: ${{ steps.sanitize.outputs.artifact_name }}
path: ${{ env.WORKSPACE_ARTIFACT_PATH }}
################### Create plugin artifacts ##############
deploy:
name: Deploy artifacts
if: always() && startsWith(github.ref, 'refs/tags/v')
needs: [build-and-test]
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Get artifacts
uses: actions/download-artifact@v4.1.7
with:
path: artifacts
- name: Zip artifacts
shell: bash
run: |
cd $GITHUB_WORKSPACE/artifacts
for artifact in *; do
zip $artifact.zip -r $artifact/*
done
- name: Upload release
uses: softprops/action-gh-release@v1
with:
name: ${{ github.ref_name }}
tag_name: release-${{ github.ref_name }}
fail_on_unmatched_files: false
target_commitish: ${{ github.sha }}
files: |
artifacts/InfinyToolkit_*_Linux.zip
artifacts/InfinyToolkit_*_Windows.zip
artifacts/InfinyToolkit_*_macOS.zip