Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ed52992
Documentation to the OpenAlea guidelines: doc/ (renamed from docs/), …
GeraultTr Nov 2, 2026
c9256a7
FspmTF.jl, the Julia codec (bindings/julia/FspmTF): the GLB container…
GeraultTr Nov 2, 2026
f7e1d80
Python codec: the buffer's byteLength counts the binary chunk's paddi…
GeraultTr Nov 2, 2026
f738c5d
FspmTF.jl under the MIT licence, as VirtualPlantLab
GeraultTr Nov 2, 2026
7ea08e8
FspmTF.jl, MTGs from other platforms' graphs: ids from 0 or sparse nu…
GeraultTr Nov 2, 2026
f94f227
The C++ codec (bindings/cpp): the GLB container, the data model, read…
GeraultTr Nov 2, 2026
2b7a6a1
FspmTF.jl and VirtualPlantLab's own graphs: package extensions for Pl…
GeraultTr Nov 2, 2026
36e9c8a
The Java codec (bindings/java: Java 17, Maven, Jackson): the GLB cont…
GeraultTr Nov 2, 2026
f986f28
Each binding under its platform's licence: bindings/cpp GPL-3.0 (CPla…
GeraultTr Nov 2, 2026
70f9479
Specification 0.2 (draft, additive): from the bindings' points as the…
GeraultTr Nov 2, 2026
92c98d5
FspmTF.jl to specification 0.2: missing values in integer, text and b…
GeraultTr Nov 2, 2026
b660357
The C++ codec to specification 0.2: a column's missing mask (integers…
GeraultTr Nov 2, 2026
f969cc3
FspmTF.jl, MTG attributes named as a reserved column (e.g. order) are…
GeraultTr Nov 2, 2026
596adef
The Java codec to specification 0.2: a column's missing mask (integer…
GeraultTr Nov 2, 2026
5f5a2a7
Reading the specification (doc/reading_the_specification.md): what sp…
GeraultTr Nov 2, 2026
2142d98
CPlantBox's adapter: a soil solver's values per cell (add_cell_values…
GeraultTr Nov 2, 2026
9333fac
The reserved column order renamed sibling_order (D-14, user): order u…
GeraultTr Nov 2, 2026
632a2e0
GroIMP's fspm-TF plugin (bindings/java/groimp-plugin, GroIMP 3.0, D-8…
GeraultTr Nov 2, 2026
879f0a6
Coupling platforms (specification §11, draft for 0.3, D-13): partial …
GeraultTr Nov 3, 2026
b5e6a60
Specification 0.3 (draft) and coupling's next steps: frames say 0.3 (…
GeraultTr Nov 3, 2026
ef8fec0
Frame views (specification §8.1, draft for 0.3): views.json, an optio…
GeraultTr Nov 3, 2026
fcd2620
Lazy reading (read(path, lazy=True)): the file mapped in memory, its …
GeraultTr Nov 3, 2026
4f355eb
Docs in line with 0.3: the spec's §3 names update (partial frames); t…
GeraultTr Nov 3, 2026
754f400
Selection by scale in ParaView: the macros select_at_scale (SCALE, MO…
GeraultTr Nov 3, 2026
d063831
Selection by scale as a filter of the plugin (fspm-TF Select at scale…
GeraultTr Nov 3, 2026
203ecad
check_in_paraview --design finds the sections layer by its source (a …
GeraultTr Nov 4, 2026
a4f94f4
Renamed fspm-TF to encoding3d everywhere: the Python package openalea…
GeraultTr Nov 4, 2026
d3f91fe
check_in_paraview: the picked item shown in a render view before its …
GeraultTr Nov 4, 2026
e20c4e1
ParaView: the plugin is plugin_encoding3d.py and draws each layer at …
GeraultTr Nov 4, 2026
2b495f5
Put Back (and Show In Panel after Isolate) shows the legends Isolate …
GeraultTr Nov 5, 2026
295ba13
The ParaView reader's Time Unit (days by default): the frames' times …
GeraultTr Nov 5, 2026
0ce7e27
encoding3d depends on no platform: the CI jobs installing CPlantBox, …
GeraultTr Nov 5, 2026
64633c0
Tutorial 1, encoding3d on its own (tutorials/01_encoding3d_alone): a …
GeraultTr Nov 5, 2026
6d2d6a7
Tutorials 2a (metafspm: a scene recorded as frames, read by encoding3…
GeraultTr Nov 5, 2026
77cdd32
Tutorial 2c (CPlantBox: a plant with shoot and roots written day by d…
GeraultTr Nov 5, 2026
3364017
Tutorial 2d (GroIMP: node classes with managed fields, a plant grown …
GeraultTr Nov 5, 2026
a1e9a72
Tutorial 3 (metafspm and VirtualPlantLab on one plant: metafspm's sug…
GeraultTr Nov 5, 2026
968e570
Tutorial 4, four platforms on one plant: CPlantBox's roots and GroIMP…
GeraultTr Nov 5, 2026
4d88aaa
Tutorial 2d: the frames drawable: GroIMP's graph module has no geomet…
GeraultTr Nov 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .github/actions/conformance/action.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Checks a codec against fspm-TF's conformance files, in a codec's own CI, once the codec has run:
# Checks a codec against encoding3d's conformance files, in a codec's own CI, once the codec has run:
#
# - uses: ./.github/actions/conformance (in this repository; elsewhere openalea/fspm-TF/.github/actions/conformance@main)
# - uses: ./.github/actions/conformance (in this repository; elsewhere openalea/encoding3d/.github/actions/conformance@main)
# with:
# dumps: out/dumps # what the codec read: one JSON dump per conformance GLB, x.json for x.expected.json
# written: out/written # what the codec wrote: the conformance scenes, as .glb files (optional)
#
# Reading passes when every dump equals its expected values; writing, when every written file passes fspm-tf validate
# Reading passes when every dump equals its expected values; writing, when every written file passes encoding3d validate
# and Khronos' glTF-Validator with no error.
name: fspm-TF conformance
name: encoding3d conformance
description: Compare a codec's reading of the conformance files with their expected values, and validate what it wrote
inputs:
dumps:
Expand All @@ -17,8 +17,8 @@ inputs:
description: the folder of the .glb files the codec wrote for the conformance scenes (empty to skip)
required: false
default: ""
fspm-tf:
description: the path of an fspm-TF checkout (its conformance folder and Python package)
encoding3d:
description: the path of an encoding3d checkout (its conformance folder and Python package)
required: false
default: "."
gltf-validator:
Expand All @@ -31,16 +31,16 @@ runs:
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install openalea.fspm_tf
- name: Install openalea.encoding3d
shell: bash
run: python -m pip install numpy jsonschema "${{ inputs.fspm-tf }}"
run: python -m pip install numpy jsonschema "${{ inputs.encoding3d }}"
- name: Reading
shell: bash
run: fspm-tf compare-all "${{ inputs.dumps }}" "${{ inputs.fspm-tf }}/conformance"
- name: Writing, fspm-TF validator
run: encoding3d compare-all "${{ inputs.dumps }}" "${{ inputs.encoding3d }}/conformance"
- name: Writing, encoding3d validator
if: inputs.written != ''
shell: bash
run: find "${{ inputs.written }}" -name "*.glb" -print0 | xargs -0 fspm-tf validate
run: find "${{ inputs.written }}" -name "*.glb" -print0 | xargs -0 encoding3d validate
- name: Writing, Khronos' glTF-Validator
if: inputs.written != '' && runner.os == 'Linux'
shell: bash
Expand Down
20 changes: 12 additions & 8 deletions .github/workflows/conformance.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# The conformance files are valid glTF for every viewer (Khronos' glTF-Validator) and valid fspm-TF (our validator)
# The conformance files are valid glTF for every viewer (Khronos' glTF-Validator) and valid encoding3d (our validator)
name: Conformance

on:
Expand All @@ -17,16 +17,16 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install openalea.fspm_tf (its dependencies, conda-only in pyproject.toml, given here), and VTK for the ParaView reader's tests
run: python -m pip install numpy jsonschema pytest vtk .
- name: Install openalea.encoding3d (its dependencies, conda-only in pyproject.toml, given here), and VTK for the ParaView reader's tests
run: python -m pip install numpy jsonschema pytest pyzmq vtk .
- name: Tests, the ParaView reader's conversion included
run: pytest bindings/python/test -v
- name: The committed files are the generated ones
run: |
python conformance/generate.py
git diff --exit-code -- conformance
- name: fspm-TF validator
run: fspm-tf validate conformance/*.glb conformance/growing_sequence/scene.fspm.json
- name: encoding3d validator
run: encoding3d validate conformance/*.glb conformance/growing_sequence/scene.fspm.json
- name: Khronos glTF-Validator
run: |
curl -sSL -o validator.tar.xz "https://github.com/KhronosGroup/glTF-Validator/releases/download/${GLTF_VALIDATOR}/gltf_validator-${GLTF_VALIDATOR}-linux64.tar.xz"
Expand All @@ -42,10 +42,14 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install openalea.fspm_tf and the documentation's tools
run: python -m pip install numpy jsonschema sphinx pydata-sphinx-theme myst-parser sphinx-favicon sphinx-copybutton .
- name: Install openalea.encoding3d and the documentation's tools
run: |
sudo apt-get install -y pandoc
python -m pip install numpy jsonschema pytest sphinx ".[doc]"
- name: The notebooks run
run: python -m pytest --nbmake doc/notebooks tutorials/01_encoding3d_alone
- name: Build the documentation, warnings as errors
run: python -m sphinx -b html docs docs/_build -W --keep-going
run: python -m sphinx -b html doc doc/_build -W --keep-going

# The reference codec through the action other codecs use: its dumps of the conformance files, and the files it writes
python-codec-conformance:
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/cpp-codec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# The C++ codec (bindings/cpp): its tests on Linux, macOS and Windows; the conformance check other codecs run (its
# dumps of the conformance files compared with their expected values, the files it writes validated); the coupling
# conformance sessions. No platform: CPlantBox's adapter (bindings/cpp/cplantbox), a proposal for CPlantBox, is tested
# by hand (bindings/cpp/cplantbox/README.md). OpenAlea's conda CI builds the Python package only.
name: C++ codec

on:
push:
branches:
- main
pull_request:

jobs:
test:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- name: Configure (nlohmann_json fetched)
run: cmake -S bindings/cpp -B build -DCMAKE_BUILD_TYPE=Release
- name: Build
run: cmake --build build --config Release
- name: Tests
run: ctest --test-dir build -C Release --output-on-failure

conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Dump and write the conformance scenes with the C++ codec
run: |
cmake -S bindings/cpp -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target encoding3d_conformance_run
./build/encoding3d_conformance_run conformance out
- uses: ./.github/actions/conformance
with:
dumps: out/dumps
written: out/written
# the coupling conformance sessions (specification §9, §11): the C++ participant, over ZeroMQ (libzmq) and a folder
- name: The coupling conformance sessions
run: |
sudo apt-get install -y -q libzmq3-dev
cmake -S bindings/cpp -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target encoding3d_coupling_conformance
python -m pip install numpy jsonschema pyzmq .
encoding3d couple-conformance conformance/coupling --participant "$PWD/build/encoding3d_coupling_conformance"

53 changes: 53 additions & 0 deletions .github/workflows/java-codec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# The Java codec (bindings/java): its tests on Linux, macOS and Windows; the conformance check other codecs run; the
# coupling conformance sessions. No platform: GroIMP's adapter and plugin (bindings/java/groimp, groimp-plugin),
# proposals for GroIMP, are tested by hand (their README.md). OpenAlea's conda CI builds the Python package only.
name: Java codec

on:
push:
branches:
- main
pull_request:

jobs:
test:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
cache: maven
- name: Tests, the conformance files included
run: mvn -B -f bindings/java/pom.xml verify

conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
cache: maven
- name: Dump and write the conformance scenes with the Java codec
run: |
mvn -B -q -f bindings/java/pom.xml package -DskipTests dependency:copy-dependencies -DincludeScope=runtime
java -cp "bindings/java/target/encoding3d-0.1.0.jar:bindings/java/target/dependency/*" org.openalea.encoding3d.ConformanceRun conformance out
- uses: ./.github/actions/conformance
with:
dumps: out/dumps
written: out/written
# the coupling conformance sessions (specification §9, §11): the Java participant, over ZeroMQ (JeroMQ) and a folder
- name: The coupling conformance sessions
run: |
python -m pip install pyzmq
encoding3d couple-conformance conformance/coupling --participant \
"java -cp $PWD/bindings/java/target/encoding3d-0.1.0.jar:$PWD/bindings/java/target/dependency/* org.openalea.encoding3d.coupling.ConformanceParticipant"

86 changes: 86 additions & 0 deletions .github/workflows/julia-codec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# The Julia codec (bindings/julia/encoding3d): its tests, on the oldest supported Julia and the latest release, and the
# conformance check other codecs run (its dumps of the conformance files compared with their expected values, the files
# it writes validated by encoding3d validate and Khronos' glTF-Validator); its coupling participant. No platform: the
# package extensions for VirtualPlantLab (PlantGraphs, PlantGeomTurtle) and MTG.jl, proposals for those platforms, are
# tested by hand in their own projects (test/plantgraphs, test/multiscaletreegraph; bindings/julia/README.md). OpenAlea's
# conda CI builds the Python package only.
name: Julia codec

on:
push:
branches:
- main
pull_request:

jobs:
test:
name: Julia ${{ matrix.julia-version }}, ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
julia-version: ["1.10", "1"]
os: [ubuntu-latest]
include:
- julia-version: "1"
os: windows-latest
- julia-version: "1"
os: macos-latest
steps:
- uses: actions/checkout@v4
- uses: julia-actions/setup-julia@v2
with:
version: ${{ matrix.julia-version }}
- uses: julia-actions/cache@v2
- uses: julia-actions/julia-buildpkg@v1
with:
project: bindings/julia/encoding3d
- uses: julia-actions/julia-runtest@v1
with:
project: bindings/julia/encoding3d

conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: julia-actions/setup-julia@v2
with:
version: "1"
- uses: julia-actions/cache@v2
- name: Dump and write the conformance scenes with the Julia codec
run: |
julia --project=bindings/julia/encoding3d -e 'using Pkg; Pkg.instantiate()'
julia --project=bindings/julia/encoding3d bindings/julia/conformance_run.jl conformance out
- uses: ./.github/actions/conformance
with:
dumps: out/dumps
written: out/written

# encoding3d.jl as a participant of coupling sessions run by the Python coordinator (specification §11), over ZeroMQ
# and over a folder
coupling:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: julia-actions/setup-julia@v2
with:
version: "1"
- uses: julia-actions/cache@v2
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: The Python coordinator
run: pip install -e . pytest pyzmq jsonschema
- name: A Julia project with encoding3d and ZMQ
run: |
mkdir -p coupling-env
julia --project=coupling-env -e 'using Pkg; Pkg.develop(path="bindings/julia/encoding3d"); Pkg.add("ZMQ")'
- name: The coupling tests, with the Julia participant
env:
ENCODING3D_JULIA: julia --project=coupling-env
run: pytest -v bindings/python/test/test_coupling.py
- name: The coupling conformance sessions, the Julia participant
run: |
julia --project=coupling-env -e 'using Pkg; Pkg.add("JSON")'
encoding3d couple-conformance conformance/coupling --participant \
"julia --project=$PWD/coupling-env $PWD/bindings/julia/coupling_conformance.jl"
7 changes: 5 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -116,5 +116,8 @@ examples/**/outputs/
*.report.json

# the documentation build, and its pages generated from spec/vocabulary
docs/_build/
docs/_generated/
doc/_build/
doc/_generated/

# Julia: environments resolved locally (the codec is a library: no committed manifest)
bindings/julia/**/Manifest*.toml
2 changes: 1 addition & 1 deletion .readthedocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ conda:
environment: conda/environment.yml

sphinx:
configuration: docs/conf.py
configuration: doc/conf.py
Loading
Loading