From a292212b67a03fa594a27ef95e753b887d61c295 Mon Sep 17 00:00:00 2001 From: Irakli Kourtis Date: Tue, 13 Oct 2026 17:49:31 -0400 Subject: [PATCH] Toolbars for every capability, VectorCraft icons, coming soon for planned ones (#20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(engine): capability catalogue — every toolbar entry, ready or coming soon, and docs/features.md Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * feat: 98 toolbar icons drawn with VectorCraft from recipes (cargo xtask icons), attributed Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * feat(ui): toolbar of tabs and panels from the catalogue, VectorCraft icons recoloured per theme, coming-soon entries greyed with their milestone; ui.toolbar Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * refactor: ready entries are their command; one tooltip; tabs and panels as catalogue runs; icon cache per theme and size; ui.toolbar read-only Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * docs: roadmap notes the toolbar and icons Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * feat(ui): deck entries run deck.write with their format, ready when the writer is in FORMATS; file and edit entries; compact and collapsed panels instead of scrolling Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * docs: features page after the Nastran writer (#24) made its deck entry ready Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * docs: features page after the LS-DYNA writer (#25) made its deck entry ready Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm * feat: solve.static, solve.frequency and solve.probe on the toolbar (Solve and Results tabs) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm --------- Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 --- ATTRIBUTION.md | 102 +++- Cargo.lock | 147 +++++- Cargo.toml | 2 + ROADMAP.md | 2 +- THIRD-PARTY-LICENSES.txt | 434 ++++++++++++++--- apps/modelcraft-cli/src/main.rs | 7 + assets/icons/assembly.instance.svg | 11 + assets/icons/assembly.instance.vectorcraft | Bin 0 -> 1781 bytes assets/icons/deck.read.svg | 10 + assets/icons/deck.read.vectorcraft | Bin 0 -> 1735 bytes assets/icons/deck.write.abaqus.svg | 11 + assets/icons/deck.write.abaqus.vectorcraft | Bin 0 -> 1908 bytes assets/icons/deck.write.lsdyna.svg | 11 + assets/icons/deck.write.lsdyna.vectorcraft | Bin 0 -> 1772 bytes assets/icons/deck.write.nastran.svg | 11 + assets/icons/deck.write.nastran.vectorcraft | Bin 0 -> 1815 bytes assets/icons/edit.redo.svg | 8 + assets/icons/edit.redo.vectorcraft | Bin 0 -> 1705 bytes assets/icons/edit.undo.svg | 8 + assets/icons/edit.undo.vectorcraft | Bin 0 -> 1696 bytes assets/icons/file.open.svg | 8 + assets/icons/file.open.vectorcraft | Bin 0 -> 1693 bytes assets/icons/file.recover.svg | 9 + assets/icons/file.recover.vectorcraft | Bin 0 -> 1979 bytes assets/icons/file.save.svg | 8 + assets/icons/file.save.vectorcraft | Bin 0 -> 1658 bytes assets/icons/file.save_as.svg | 9 + assets/icons/file.save_as.vectorcraft | Bin 0 -> 1735 bytes assets/icons/flow.boundary.svg | 10 + assets/icons/flow.boundary.vectorcraft | Bin 0 -> 1737 bytes assets/icons/flow.domain.svg | 9 + assets/icons/flow.domain.vectorcraft | Bin 0 -> 1885 bytes assets/icons/geometry.bodies.svg | 10 + assets/icons/geometry.bodies.vectorcraft | Bin 0 -> 1727 bytes assets/icons/geometry.datum.svg | 10 + assets/icons/geometry.datum.vectorcraft | Bin 0 -> 1897 bytes assets/icons/geometry.import.mesh.svg | 10 + assets/icons/geometry.import.mesh.vectorcraft | Bin 0 -> 1751 bytes assets/icons/geometry.midsurface.svg | 9 + assets/icons/geometry.midsurface.vectorcraft | Bin 0 -> 1693 bytes assets/icons/geometry.open.svg | 9 + assets/icons/geometry.open.vectorcraft | Bin 0 -> 1724 bytes assets/icons/geometry.partition.svg | 10 + assets/icons/geometry.partition.vectorcraft | Bin 0 -> 1733 bytes assets/icons/geometry.tessellate.svg | 9 + assets/icons/geometry.tessellate.vectorcraft | Bin 0 -> 1857 bytes assets/icons/interaction.bolt.svg | 11 + assets/icons/interaction.bolt.vectorcraft | Bin 0 -> 1823 bytes assets/icons/interaction.connector.svg | 10 + .../icons/interaction.connector.vectorcraft | Bin 0 -> 2038 bytes assets/icons/interaction.contact.find.svg | 10 + .../interaction.contact.find.vectorcraft | Bin 0 -> 1960 bytes assets/icons/interaction.contact.general.svg | 11 + .../interaction.contact.general.vectorcraft | Bin 0 -> 1940 bytes assets/icons/interaction.contact.pair.svg | 9 + .../interaction.contact.pair.vectorcraft | Bin 0 -> 1855 bytes assets/icons/interaction.fsi.svg | 11 + assets/icons/interaction.fsi.vectorcraft | Bin 0 -> 2314 bytes assets/icons/interaction.mass.svg | 9 + assets/icons/interaction.mass.vectorcraft | Bin 0 -> 1886 bytes assets/icons/interaction.rigid_wall.svg | 11 + .../icons/interaction.rigid_wall.vectorcraft | Bin 0 -> 1917 bytes assets/icons/interaction.spring.svg | 9 + assets/icons/interaction.spring.vectorcraft | Bin 0 -> 1897 bytes assets/icons/interaction.tie.svg | 11 + assets/icons/interaction.tie.vectorcraft | Bin 0 -> 1805 bytes assets/icons/mesh.delaunay.points.svg | 12 + assets/icons/mesh.delaunay.points.vectorcraft | Bin 0 -> 2173 bytes assets/icons/mesh.element.add.svg | 12 + assets/icons/mesh.element.add.vectorcraft | Bin 0 -> 2065 bytes assets/icons/mesh.hex.decompose.svg | 8 + assets/icons/mesh.hex.decompose.vectorcraft | Bin 0 -> 1716 bytes assets/icons/mesh.hex.dominant.svg | 9 + assets/icons/mesh.hex.dominant.vectorcraft | Bin 0 -> 1758 bytes assets/icons/mesh.hex.generate.svg | 9 + assets/icons/mesh.hex.generate.vectorcraft | Bin 0 -> 1767 bytes assets/icons/mesh.hex.mapped.svg | 9 + assets/icons/mesh.hex.mapped.vectorcraft | Bin 0 -> 1813 bytes assets/icons/mesh.hex.polycube.svg | 12 + assets/icons/mesh.hex.polycube.vectorcraft | Bin 0 -> 1798 bytes assets/icons/mesh.hex.sweep.svg | 10 + assets/icons/mesh.hex.sweep.vectorcraft | Bin 0 -> 1789 bytes assets/icons/mesh.import.orphan.svg | 9 + assets/icons/mesh.import.orphan.vectorcraft | Bin 0 -> 1816 bytes assets/icons/mesh.layers.svg | 9 + assets/icons/mesh.layers.vectorcraft | Bin 0 -> 1689 bytes assets/icons/mesh.node.add.svg | 11 + assets/icons/mesh.node.add.vectorcraft | Bin 0 -> 2070 bytes assets/icons/mesh.node.merge.svg | 12 + assets/icons/mesh.node.merge.vectorcraft | Bin 0 -> 2083 bytes assets/icons/mesh.order.quadratic.svg | 13 + assets/icons/mesh.order.quadratic.vectorcraft | Bin 0 -> 2246 bytes assets/icons/mesh.quad.faces.svg | 8 + assets/icons/mesh.quad.faces.vectorcraft | Bin 0 -> 1737 bytes assets/icons/mesh.quality.svg | 10 + assets/icons/mesh.quality.vectorcraft | Bin 0 -> 1952 bytes assets/icons/mesh.region.remesh.svg | 10 + assets/icons/mesh.region.remesh.vectorcraft | Bin 0 -> 1898 bytes assets/icons/mesh.size.adapt.svg | 15 + assets/icons/mesh.size.adapt.vectorcraft | Bin 0 -> 2658 bytes assets/icons/mesh.size.global.svg | 11 + assets/icons/mesh.size.global.vectorcraft | Bin 0 -> 1824 bytes assets/icons/mesh.size.seed.svg | 13 + assets/icons/mesh.size.seed.vectorcraft | Bin 0 -> 2311 bytes assets/icons/mesh.smooth.svg | 8 + assets/icons/mesh.smooth.vectorcraft | Bin 0 -> 1675 bytes assets/icons/mesh.surface.check.svg | 9 + assets/icons/mesh.surface.check.vectorcraft | Bin 0 -> 1718 bytes assets/icons/mesh.tag.svg | 9 + assets/icons/mesh.tag.vectorcraft | Bin 0 -> 1859 bytes assets/icons/mesh.tet.generate.svg | 8 + assets/icons/mesh.tet.generate.vectorcraft | Bin 0 -> 1674 bytes assets/icons/mesh.transition.svg | 10 + assets/icons/mesh.transition.vectorcraft | Bin 0 -> 1785 bytes assets/icons/mesh.untangle.svg | 9 + assets/icons/mesh.untangle.vectorcraft | Bin 0 -> 1759 bytes assets/icons/mesh.verify.svg | 9 + assets/icons/mesh.verify.vectorcraft | Bin 0 -> 1765 bytes assets/icons/model.activity.svg | 10 + assets/icons/model.activity.vectorcraft | Bin 0 -> 1887 bytes assets/icons/model.amplitude.svg | 8 + assets/icons/model.amplitude.vectorcraft | Bin 0 -> 1884 bytes .../icons/model.boundary_condition.create.svg | 9 + ...odel.boundary_condition.create.vectorcraft | Bin 0 -> 1916 bytes assets/icons/model.check.svg | 9 + assets/icons/model.check.vectorcraft | Bin 0 -> 1934 bytes assets/icons/model.coupling.create.svg | 14 + .../icons/model.coupling.create.vectorcraft | Bin 0 -> 2312 bytes assets/icons/model.info.svg | 9 + assets/icons/model.info.vectorcraft | Bin 0 -> 1913 bytes assets/icons/model.load.create.svg | 10 + assets/icons/model.load.create.vectorcraft | Bin 0 -> 1798 bytes assets/icons/model.material.create.svg | 9 + .../icons/model.material.create.vectorcraft | Bin 0 -> 1888 bytes assets/icons/model.material.damage.svg | 8 + .../icons/model.material.damage.vectorcraft | Bin 0 -> 1726 bytes assets/icons/model.material.eos.svg | 9 + assets/icons/model.material.eos.vectorcraft | Bin 0 -> 1867 bytes assets/icons/model.material.hyperelastic.svg | 8 + .../model.material.hyperelastic.vectorcraft | Bin 0 -> 1691 bytes assets/icons/model.material.plasticity.svg | 9 + .../model.material.plasticity.vectorcraft | Bin 0 -> 1710 bytes assets/icons/model.material.thermal.svg | 10 + .../icons/model.material.thermal.vectorcraft | Bin 0 -> 1922 bytes assets/icons/model.orientation.svg | 10 + assets/icons/model.orientation.vectorcraft | Bin 0 -> 1870 bytes assets/icons/model.reference_point.create.svg | 9 + .../model.reference_point.create.vectorcraft | Bin 0 -> 1931 bytes assets/icons/model.section.composite.svg | 12 + .../icons/model.section.composite.vectorcraft | Bin 0 -> 1773 bytes assets/icons/model.section.create.svg | 7 + assets/icons/model.section.create.vectorcraft | Bin 0 -> 1649 bytes assets/icons/model.set.create.svg | 11 + assets/icons/model.set.create.vectorcraft | Bin 0 -> 2126 bytes assets/icons/model.step.activate.svg | 8 + assets/icons/model.step.activate.vectorcraft | Bin 0 -> 1928 bytes assets/icons/model.step.create.svg | 8 + assets/icons/model.step.create.vectorcraft | Bin 0 -> 1652 bytes assets/icons/model.step.explicit.svg | 10 + assets/icons/model.step.explicit.vectorcraft | Bin 0 -> 1968 bytes assets/icons/model.step.heat.svg | 7 + assets/icons/model.step.heat.vectorcraft | Bin 0 -> 1707 bytes assets/icons/model.step.nonlinear.svg | 11 + assets/icons/model.step.nonlinear.vectorcraft | Bin 0 -> 2046 bytes assets/icons/model.units.svg | 8 + assets/icons/model.units.vectorcraft | Bin 0 -> 1729 bytes assets/icons/results.animate.svg | 9 + assets/icons/results.animate.vectorcraft | Bin 0 -> 1860 bytes assets/icons/results.contour.svg | 10 + assets/icons/results.contour.vectorcraft | Bin 0 -> 1785 bytes assets/icons/results.convergence.svg | 12 + assets/icons/results.convergence.vectorcraft | Bin 0 -> 2082 bytes assets/icons/results.cut.svg | 9 + assets/icons/results.cut.vectorcraft | Bin 0 -> 1715 bytes assets/icons/results.deformed.svg | 8 + assets/icons/results.deformed.vectorcraft | Bin 0 -> 1765 bytes assets/icons/results.display_group.svg | 8 + .../icons/results.display_group.vectorcraft | Bin 0 -> 1823 bytes assets/icons/results.free_body.svg | 10 + assets/icons/results.free_body.vectorcraft | Bin 0 -> 1772 bytes assets/icons/results.modes.svg | 11 + assets/icons/results.modes.vectorcraft | Bin 0 -> 1967 bytes assets/icons/results.path.svg | 12 + assets/icons/results.path.vectorcraft | Bin 0 -> 2242 bytes assets/icons/results.reactions.svg | 10 + assets/icons/results.reactions.vectorcraft | Bin 0 -> 1748 bytes assets/icons/results.read.svg | 11 + assets/icons/results.read.vectorcraft | Bin 0 -> 1810 bytes assets/icons/results.streamlines.svg | 11 + assets/icons/results.streamlines.vectorcraft | Bin 0 -> 1760 bytes assets/icons/results.xy.svg | 11 + assets/icons/results.xy.vectorcraft | Bin 0 -> 1990 bytes assets/icons/solve.blast.svg | 8 + assets/icons/solve.blast.vectorcraft | Bin 0 -> 1964 bytes assets/icons/solve.explicit.svg | 10 + assets/icons/solve.explicit.vectorcraft | Bin 0 -> 1892 bytes assets/icons/solve.flow.svg | 10 + assets/icons/solve.flow.vectorcraft | Bin 0 -> 1880 bytes assets/icons/solve.frequency.svg | 11 + assets/icons/solve.frequency.vectorcraft | Bin 0 -> 1950 bytes assets/icons/solve.fsi.svg | 12 + assets/icons/solve.fsi.vectorcraft | Bin 0 -> 2342 bytes assets/icons/solve.probe.svg | 11 + assets/icons/solve.probe.vectorcraft | Bin 0 -> 1984 bytes assets/icons/solve.static.svg | 11 + assets/icons/solve.static.vectorcraft | Bin 0 -> 1815 bytes assets/icons/src/assembly.instance.json | 1 + assets/icons/src/deck.read.json | 1 + assets/icons/src/deck.write.abaqus.json | 1 + assets/icons/src/deck.write.lsdyna.json | 1 + assets/icons/src/deck.write.nastran.json | 1 + assets/icons/src/edit.redo.json | 1 + assets/icons/src/edit.undo.json | 1 + assets/icons/src/file.open.json | 1 + assets/icons/src/file.recover.json | 1 + assets/icons/src/file.save.json | 1 + assets/icons/src/file.save_as.json | 1 + assets/icons/src/flow.boundary.json | 1 + assets/icons/src/flow.domain.json | 1 + assets/icons/src/geometry.bodies.json | 1 + assets/icons/src/geometry.datum.json | 1 + assets/icons/src/geometry.import.mesh.json | 1 + assets/icons/src/geometry.midsurface.json | 1 + assets/icons/src/geometry.open.json | 1 + assets/icons/src/geometry.partition.json | 1 + assets/icons/src/geometry.tessellate.json | 1 + assets/icons/src/interaction.bolt.json | 1 + assets/icons/src/interaction.connector.json | 1 + .../icons/src/interaction.contact.find.json | 1 + .../src/interaction.contact.general.json | 1 + .../icons/src/interaction.contact.pair.json | 1 + assets/icons/src/interaction.fsi.json | 1 + assets/icons/src/interaction.mass.json | 1 + assets/icons/src/interaction.rigid_wall.json | 1 + assets/icons/src/interaction.spring.json | 1 + assets/icons/src/interaction.tie.json | 1 + assets/icons/src/mesh.delaunay.points.json | 1 + assets/icons/src/mesh.element.add.json | 1 + assets/icons/src/mesh.hex.decompose.json | 1 + assets/icons/src/mesh.hex.dominant.json | 1 + assets/icons/src/mesh.hex.generate.json | 1 + assets/icons/src/mesh.hex.mapped.json | 1 + assets/icons/src/mesh.hex.polycube.json | 1 + assets/icons/src/mesh.hex.sweep.json | 1 + assets/icons/src/mesh.import.orphan.json | 1 + assets/icons/src/mesh.layers.json | 1 + assets/icons/src/mesh.node.add.json | 1 + assets/icons/src/mesh.node.merge.json | 1 + assets/icons/src/mesh.order.quadratic.json | 1 + assets/icons/src/mesh.quad.faces.json | 1 + assets/icons/src/mesh.quality.json | 1 + assets/icons/src/mesh.region.remesh.json | 1 + assets/icons/src/mesh.size.adapt.json | 1 + assets/icons/src/mesh.size.global.json | 1 + assets/icons/src/mesh.size.seed.json | 1 + assets/icons/src/mesh.smooth.json | 1 + assets/icons/src/mesh.surface.check.json | 1 + assets/icons/src/mesh.tag.json | 1 + assets/icons/src/mesh.tet.generate.json | 1 + assets/icons/src/mesh.transition.json | 1 + assets/icons/src/mesh.untangle.json | 1 + assets/icons/src/mesh.verify.json | 1 + assets/icons/src/model.activity.json | 1 + assets/icons/src/model.amplitude.json | 1 + .../src/model.boundary_condition.create.json | 1 + assets/icons/src/model.check.json | 1 + assets/icons/src/model.coupling.create.json | 1 + assets/icons/src/model.info.json | 1 + assets/icons/src/model.load.create.json | 1 + assets/icons/src/model.material.create.json | 1 + assets/icons/src/model.material.damage.json | 1 + assets/icons/src/model.material.eos.json | 1 + .../src/model.material.hyperelastic.json | 1 + .../icons/src/model.material.plasticity.json | 1 + assets/icons/src/model.material.thermal.json | 1 + assets/icons/src/model.orientation.json | 1 + .../src/model.reference_point.create.json | 1 + assets/icons/src/model.section.composite.json | 1 + assets/icons/src/model.section.create.json | 1 + assets/icons/src/model.set.create.json | 1 + assets/icons/src/model.step.activate.json | 1 + assets/icons/src/model.step.create.json | 1 + assets/icons/src/model.step.explicit.json | 1 + assets/icons/src/model.step.heat.json | 1 + assets/icons/src/model.step.nonlinear.json | 1 + assets/icons/src/model.units.json | 1 + assets/icons/src/results.animate.json | 1 + assets/icons/src/results.contour.json | 1 + assets/icons/src/results.convergence.json | 1 + assets/icons/src/results.cut.json | 1 + assets/icons/src/results.deformed.json | 1 + assets/icons/src/results.display_group.json | 1 + assets/icons/src/results.free_body.json | 1 + assets/icons/src/results.modes.json | 1 + assets/icons/src/results.path.json | 1 + assets/icons/src/results.reactions.json | 1 + assets/icons/src/results.read.json | 1 + assets/icons/src/results.streamlines.json | 1 + assets/icons/src/results.xy.json | 1 + assets/icons/src/solve.blast.json | 1 + assets/icons/src/solve.explicit.json | 1 + assets/icons/src/solve.flow.json | 1 + assets/icons/src/solve.frequency.json | 1 + assets/icons/src/solve.fsi.json | 1 + assets/icons/src/solve.probe.json | 1 + assets/icons/src/solve.static.json | 1 + crates/engine/src/catalogue.rs | 450 ++++++++++++++++++ crates/engine/src/lib.rs | 1 + crates/ui-egui/Cargo.toml | 1 + crates/ui-egui/build.rs | 23 + crates/ui-egui/src/control.rs | 19 + crates/ui-egui/src/icons.rs | 132 +++++ crates/ui-egui/src/lib.rs | 61 ++- crates/ui-egui/src/theme.rs | 4 + crates/ui-egui/src/toolbar.rs | 283 +++++++++++ docs/control-protocol.md | 5 +- docs/features.md | 158 ++++++ xtask/src/assets.rs | 2 +- xtask/src/icons.rs | 156 ++++++ xtask/src/main.rs | 5 + 320 files changed, 2990 insertions(+), 88 deletions(-) create mode 100644 assets/icons/assembly.instance.svg create mode 100644 assets/icons/assembly.instance.vectorcraft create mode 100644 assets/icons/deck.read.svg create mode 100644 assets/icons/deck.read.vectorcraft create mode 100644 assets/icons/deck.write.abaqus.svg create mode 100644 assets/icons/deck.write.abaqus.vectorcraft create mode 100644 assets/icons/deck.write.lsdyna.svg create mode 100644 assets/icons/deck.write.lsdyna.vectorcraft create mode 100644 assets/icons/deck.write.nastran.svg create mode 100644 assets/icons/deck.write.nastran.vectorcraft create mode 100644 assets/icons/edit.redo.svg create mode 100644 assets/icons/edit.redo.vectorcraft create mode 100644 assets/icons/edit.undo.svg create mode 100644 assets/icons/edit.undo.vectorcraft create mode 100644 assets/icons/file.open.svg create mode 100644 assets/icons/file.open.vectorcraft create mode 100644 assets/icons/file.recover.svg create mode 100644 assets/icons/file.recover.vectorcraft create mode 100644 assets/icons/file.save.svg create mode 100644 assets/icons/file.save.vectorcraft create mode 100644 assets/icons/file.save_as.svg create mode 100644 assets/icons/file.save_as.vectorcraft create mode 100644 assets/icons/flow.boundary.svg create mode 100644 assets/icons/flow.boundary.vectorcraft create mode 100644 assets/icons/flow.domain.svg create mode 100644 assets/icons/flow.domain.vectorcraft create mode 100644 assets/icons/geometry.bodies.svg create mode 100644 assets/icons/geometry.bodies.vectorcraft create mode 100644 assets/icons/geometry.datum.svg create mode 100644 assets/icons/geometry.datum.vectorcraft create mode 100644 assets/icons/geometry.import.mesh.svg create mode 100644 assets/icons/geometry.import.mesh.vectorcraft create mode 100644 assets/icons/geometry.midsurface.svg create mode 100644 assets/icons/geometry.midsurface.vectorcraft create mode 100644 assets/icons/geometry.open.svg create mode 100644 assets/icons/geometry.open.vectorcraft create mode 100644 assets/icons/geometry.partition.svg create mode 100644 assets/icons/geometry.partition.vectorcraft create mode 100644 assets/icons/geometry.tessellate.svg create mode 100644 assets/icons/geometry.tessellate.vectorcraft create mode 100644 assets/icons/interaction.bolt.svg create mode 100644 assets/icons/interaction.bolt.vectorcraft create mode 100644 assets/icons/interaction.connector.svg create mode 100644 assets/icons/interaction.connector.vectorcraft create mode 100644 assets/icons/interaction.contact.find.svg create mode 100644 assets/icons/interaction.contact.find.vectorcraft create mode 100644 assets/icons/interaction.contact.general.svg create mode 100644 assets/icons/interaction.contact.general.vectorcraft create mode 100644 assets/icons/interaction.contact.pair.svg create mode 100644 assets/icons/interaction.contact.pair.vectorcraft create mode 100644 assets/icons/interaction.fsi.svg create mode 100644 assets/icons/interaction.fsi.vectorcraft create mode 100644 assets/icons/interaction.mass.svg create mode 100644 assets/icons/interaction.mass.vectorcraft create mode 100644 assets/icons/interaction.rigid_wall.svg create mode 100644 assets/icons/interaction.rigid_wall.vectorcraft create mode 100644 assets/icons/interaction.spring.svg create mode 100644 assets/icons/interaction.spring.vectorcraft create mode 100644 assets/icons/interaction.tie.svg create mode 100644 assets/icons/interaction.tie.vectorcraft create mode 100644 assets/icons/mesh.delaunay.points.svg create mode 100644 assets/icons/mesh.delaunay.points.vectorcraft create mode 100644 assets/icons/mesh.element.add.svg create mode 100644 assets/icons/mesh.element.add.vectorcraft create mode 100644 assets/icons/mesh.hex.decompose.svg create mode 100644 assets/icons/mesh.hex.decompose.vectorcraft create mode 100644 assets/icons/mesh.hex.dominant.svg create mode 100644 assets/icons/mesh.hex.dominant.vectorcraft create mode 100644 assets/icons/mesh.hex.generate.svg create mode 100644 assets/icons/mesh.hex.generate.vectorcraft create mode 100644 assets/icons/mesh.hex.mapped.svg create mode 100644 assets/icons/mesh.hex.mapped.vectorcraft create mode 100644 assets/icons/mesh.hex.polycube.svg create mode 100644 assets/icons/mesh.hex.polycube.vectorcraft create mode 100644 assets/icons/mesh.hex.sweep.svg create mode 100644 assets/icons/mesh.hex.sweep.vectorcraft create mode 100644 assets/icons/mesh.import.orphan.svg create mode 100644 assets/icons/mesh.import.orphan.vectorcraft create mode 100644 assets/icons/mesh.layers.svg create mode 100644 assets/icons/mesh.layers.vectorcraft create mode 100644 assets/icons/mesh.node.add.svg create mode 100644 assets/icons/mesh.node.add.vectorcraft create mode 100644 assets/icons/mesh.node.merge.svg create mode 100644 assets/icons/mesh.node.merge.vectorcraft create mode 100644 assets/icons/mesh.order.quadratic.svg create mode 100644 assets/icons/mesh.order.quadratic.vectorcraft create mode 100644 assets/icons/mesh.quad.faces.svg create mode 100644 assets/icons/mesh.quad.faces.vectorcraft create mode 100644 assets/icons/mesh.quality.svg create mode 100644 assets/icons/mesh.quality.vectorcraft create mode 100644 assets/icons/mesh.region.remesh.svg create mode 100644 assets/icons/mesh.region.remesh.vectorcraft create mode 100644 assets/icons/mesh.size.adapt.svg create mode 100644 assets/icons/mesh.size.adapt.vectorcraft create mode 100644 assets/icons/mesh.size.global.svg create mode 100644 assets/icons/mesh.size.global.vectorcraft create mode 100644 assets/icons/mesh.size.seed.svg create mode 100644 assets/icons/mesh.size.seed.vectorcraft create mode 100644 assets/icons/mesh.smooth.svg create mode 100644 assets/icons/mesh.smooth.vectorcraft create mode 100644 assets/icons/mesh.surface.check.svg create mode 100644 assets/icons/mesh.surface.check.vectorcraft create mode 100644 assets/icons/mesh.tag.svg create mode 100644 assets/icons/mesh.tag.vectorcraft create mode 100644 assets/icons/mesh.tet.generate.svg create mode 100644 assets/icons/mesh.tet.generate.vectorcraft create mode 100644 assets/icons/mesh.transition.svg create mode 100644 assets/icons/mesh.transition.vectorcraft create mode 100644 assets/icons/mesh.untangle.svg create mode 100644 assets/icons/mesh.untangle.vectorcraft create mode 100644 assets/icons/mesh.verify.svg create mode 100644 assets/icons/mesh.verify.vectorcraft create mode 100644 assets/icons/model.activity.svg create mode 100644 assets/icons/model.activity.vectorcraft create mode 100644 assets/icons/model.amplitude.svg create mode 100644 assets/icons/model.amplitude.vectorcraft create mode 100644 assets/icons/model.boundary_condition.create.svg create mode 100644 assets/icons/model.boundary_condition.create.vectorcraft create mode 100644 assets/icons/model.check.svg create mode 100644 assets/icons/model.check.vectorcraft create mode 100644 assets/icons/model.coupling.create.svg create mode 100644 assets/icons/model.coupling.create.vectorcraft create mode 100644 assets/icons/model.info.svg create mode 100644 assets/icons/model.info.vectorcraft create mode 100644 assets/icons/model.load.create.svg create mode 100644 assets/icons/model.load.create.vectorcraft create mode 100644 assets/icons/model.material.create.svg create mode 100644 assets/icons/model.material.create.vectorcraft create mode 100644 assets/icons/model.material.damage.svg create mode 100644 assets/icons/model.material.damage.vectorcraft create mode 100644 assets/icons/model.material.eos.svg create mode 100644 assets/icons/model.material.eos.vectorcraft create mode 100644 assets/icons/model.material.hyperelastic.svg create mode 100644 assets/icons/model.material.hyperelastic.vectorcraft create mode 100644 assets/icons/model.material.plasticity.svg create mode 100644 assets/icons/model.material.plasticity.vectorcraft create mode 100644 assets/icons/model.material.thermal.svg create mode 100644 assets/icons/model.material.thermal.vectorcraft create mode 100644 assets/icons/model.orientation.svg create mode 100644 assets/icons/model.orientation.vectorcraft create mode 100644 assets/icons/model.reference_point.create.svg create mode 100644 assets/icons/model.reference_point.create.vectorcraft create mode 100644 assets/icons/model.section.composite.svg create mode 100644 assets/icons/model.section.composite.vectorcraft create mode 100644 assets/icons/model.section.create.svg create mode 100644 assets/icons/model.section.create.vectorcraft create mode 100644 assets/icons/model.set.create.svg create mode 100644 assets/icons/model.set.create.vectorcraft create mode 100644 assets/icons/model.step.activate.svg create mode 100644 assets/icons/model.step.activate.vectorcraft create mode 100644 assets/icons/model.step.create.svg create mode 100644 assets/icons/model.step.create.vectorcraft create mode 100644 assets/icons/model.step.explicit.svg create mode 100644 assets/icons/model.step.explicit.vectorcraft create mode 100644 assets/icons/model.step.heat.svg create mode 100644 assets/icons/model.step.heat.vectorcraft create mode 100644 assets/icons/model.step.nonlinear.svg create mode 100644 assets/icons/model.step.nonlinear.vectorcraft create mode 100644 assets/icons/model.units.svg create mode 100644 assets/icons/model.units.vectorcraft create mode 100644 assets/icons/results.animate.svg create mode 100644 assets/icons/results.animate.vectorcraft create mode 100644 assets/icons/results.contour.svg create mode 100644 assets/icons/results.contour.vectorcraft create mode 100644 assets/icons/results.convergence.svg create mode 100644 assets/icons/results.convergence.vectorcraft create mode 100644 assets/icons/results.cut.svg create mode 100644 assets/icons/results.cut.vectorcraft create mode 100644 assets/icons/results.deformed.svg create mode 100644 assets/icons/results.deformed.vectorcraft create mode 100644 assets/icons/results.display_group.svg create mode 100644 assets/icons/results.display_group.vectorcraft create mode 100644 assets/icons/results.free_body.svg create mode 100644 assets/icons/results.free_body.vectorcraft create mode 100644 assets/icons/results.modes.svg create mode 100644 assets/icons/results.modes.vectorcraft create mode 100644 assets/icons/results.path.svg create mode 100644 assets/icons/results.path.vectorcraft create mode 100644 assets/icons/results.reactions.svg create mode 100644 assets/icons/results.reactions.vectorcraft create mode 100644 assets/icons/results.read.svg create mode 100644 assets/icons/results.read.vectorcraft create mode 100644 assets/icons/results.streamlines.svg create mode 100644 assets/icons/results.streamlines.vectorcraft create mode 100644 assets/icons/results.xy.svg create mode 100644 assets/icons/results.xy.vectorcraft create mode 100644 assets/icons/solve.blast.svg create mode 100644 assets/icons/solve.blast.vectorcraft create mode 100644 assets/icons/solve.explicit.svg create mode 100644 assets/icons/solve.explicit.vectorcraft create mode 100644 assets/icons/solve.flow.svg create mode 100644 assets/icons/solve.flow.vectorcraft create mode 100644 assets/icons/solve.frequency.svg create mode 100644 assets/icons/solve.frequency.vectorcraft create mode 100644 assets/icons/solve.fsi.svg create mode 100644 assets/icons/solve.fsi.vectorcraft create mode 100644 assets/icons/solve.probe.svg create mode 100644 assets/icons/solve.probe.vectorcraft create mode 100644 assets/icons/solve.static.svg create mode 100644 assets/icons/solve.static.vectorcraft create mode 100644 assets/icons/src/assembly.instance.json create mode 100644 assets/icons/src/deck.read.json create mode 100644 assets/icons/src/deck.write.abaqus.json create mode 100644 assets/icons/src/deck.write.lsdyna.json create mode 100644 assets/icons/src/deck.write.nastran.json create mode 100644 assets/icons/src/edit.redo.json create mode 100644 assets/icons/src/edit.undo.json create mode 100644 assets/icons/src/file.open.json create mode 100644 assets/icons/src/file.recover.json create mode 100644 assets/icons/src/file.save.json create mode 100644 assets/icons/src/file.save_as.json create mode 100644 assets/icons/src/flow.boundary.json create mode 100644 assets/icons/src/flow.domain.json create mode 100644 assets/icons/src/geometry.bodies.json create mode 100644 assets/icons/src/geometry.datum.json create mode 100644 assets/icons/src/geometry.import.mesh.json create mode 100644 assets/icons/src/geometry.midsurface.json create mode 100644 assets/icons/src/geometry.open.json create mode 100644 assets/icons/src/geometry.partition.json create mode 100644 assets/icons/src/geometry.tessellate.json create mode 100644 assets/icons/src/interaction.bolt.json create mode 100644 assets/icons/src/interaction.connector.json create mode 100644 assets/icons/src/interaction.contact.find.json create mode 100644 assets/icons/src/interaction.contact.general.json create mode 100644 assets/icons/src/interaction.contact.pair.json create mode 100644 assets/icons/src/interaction.fsi.json create mode 100644 assets/icons/src/interaction.mass.json create mode 100644 assets/icons/src/interaction.rigid_wall.json create mode 100644 assets/icons/src/interaction.spring.json create mode 100644 assets/icons/src/interaction.tie.json create mode 100644 assets/icons/src/mesh.delaunay.points.json create mode 100644 assets/icons/src/mesh.element.add.json create mode 100644 assets/icons/src/mesh.hex.decompose.json create mode 100644 assets/icons/src/mesh.hex.dominant.json create mode 100644 assets/icons/src/mesh.hex.generate.json create mode 100644 assets/icons/src/mesh.hex.mapped.json create mode 100644 assets/icons/src/mesh.hex.polycube.json create mode 100644 assets/icons/src/mesh.hex.sweep.json create mode 100644 assets/icons/src/mesh.import.orphan.json create mode 100644 assets/icons/src/mesh.layers.json create mode 100644 assets/icons/src/mesh.node.add.json create mode 100644 assets/icons/src/mesh.node.merge.json create mode 100644 assets/icons/src/mesh.order.quadratic.json create mode 100644 assets/icons/src/mesh.quad.faces.json create mode 100644 assets/icons/src/mesh.quality.json create mode 100644 assets/icons/src/mesh.region.remesh.json create mode 100644 assets/icons/src/mesh.size.adapt.json create mode 100644 assets/icons/src/mesh.size.global.json create mode 100644 assets/icons/src/mesh.size.seed.json create mode 100644 assets/icons/src/mesh.smooth.json create mode 100644 assets/icons/src/mesh.surface.check.json create mode 100644 assets/icons/src/mesh.tag.json create mode 100644 assets/icons/src/mesh.tet.generate.json create mode 100644 assets/icons/src/mesh.transition.json create mode 100644 assets/icons/src/mesh.untangle.json create mode 100644 assets/icons/src/mesh.verify.json create mode 100644 assets/icons/src/model.activity.json create mode 100644 assets/icons/src/model.amplitude.json create mode 100644 assets/icons/src/model.boundary_condition.create.json create mode 100644 assets/icons/src/model.check.json create mode 100644 assets/icons/src/model.coupling.create.json create mode 100644 assets/icons/src/model.info.json create mode 100644 assets/icons/src/model.load.create.json create mode 100644 assets/icons/src/model.material.create.json create mode 100644 assets/icons/src/model.material.damage.json create mode 100644 assets/icons/src/model.material.eos.json create mode 100644 assets/icons/src/model.material.hyperelastic.json create mode 100644 assets/icons/src/model.material.plasticity.json create mode 100644 assets/icons/src/model.material.thermal.json create mode 100644 assets/icons/src/model.orientation.json create mode 100644 assets/icons/src/model.reference_point.create.json create mode 100644 assets/icons/src/model.section.composite.json create mode 100644 assets/icons/src/model.section.create.json create mode 100644 assets/icons/src/model.set.create.json create mode 100644 assets/icons/src/model.step.activate.json create mode 100644 assets/icons/src/model.step.create.json create mode 100644 assets/icons/src/model.step.explicit.json create mode 100644 assets/icons/src/model.step.heat.json create mode 100644 assets/icons/src/model.step.nonlinear.json create mode 100644 assets/icons/src/model.units.json create mode 100644 assets/icons/src/results.animate.json create mode 100644 assets/icons/src/results.contour.json create mode 100644 assets/icons/src/results.convergence.json create mode 100644 assets/icons/src/results.cut.json create mode 100644 assets/icons/src/results.deformed.json create mode 100644 assets/icons/src/results.display_group.json create mode 100644 assets/icons/src/results.free_body.json create mode 100644 assets/icons/src/results.modes.json create mode 100644 assets/icons/src/results.path.json create mode 100644 assets/icons/src/results.reactions.json create mode 100644 assets/icons/src/results.read.json create mode 100644 assets/icons/src/results.streamlines.json create mode 100644 assets/icons/src/results.xy.json create mode 100644 assets/icons/src/solve.blast.json create mode 100644 assets/icons/src/solve.explicit.json create mode 100644 assets/icons/src/solve.flow.json create mode 100644 assets/icons/src/solve.frequency.json create mode 100644 assets/icons/src/solve.fsi.json create mode 100644 assets/icons/src/solve.probe.json create mode 100644 assets/icons/src/solve.static.json create mode 100644 crates/engine/src/catalogue.rs create mode 100644 crates/ui-egui/build.rs create mode 100644 crates/ui-egui/src/icons.rs create mode 100644 crates/ui-egui/src/toolbar.rs create mode 100644 docs/features.md create mode 100644 xtask/src/icons.rs diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index e6d5a0f..1db11fa 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -15,6 +15,106 @@ is committed and listed here with its exports. | File | Author | Source | Licence | |---|---|---|---| | crates/decks/tests/golden/nastran/*.bdf | ModelCraft contributors | Written by our Nastran writer from our own test models (crates/decks/tests/nastran.rs) | MIT OR Apache-2.0 | +| assets/icons/assembly.instance.svg, assets/icons/assembly.instance.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/assembly.instance.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/deck.read.svg, assets/icons/deck.read.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/deck.read.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/deck.write.abaqus.svg, assets/icons/deck.write.abaqus.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/deck.write.abaqus.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/deck.write.lsdyna.svg, assets/icons/deck.write.lsdyna.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/deck.write.lsdyna.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/deck.write.nastran.svg, assets/icons/deck.write.nastran.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/deck.write.nastran.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/edit.redo.svg, assets/icons/edit.redo.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/edit.redo.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/edit.undo.svg, assets/icons/edit.undo.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/edit.undo.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/file.open.svg, assets/icons/file.open.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/file.open.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/file.recover.svg, assets/icons/file.recover.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/file.recover.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/file.save_as.svg, assets/icons/file.save_as.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/file.save_as.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/file.save.svg, assets/icons/file.save.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/file.save.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/flow.boundary.svg, assets/icons/flow.boundary.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/flow.boundary.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/flow.domain.svg, assets/icons/flow.domain.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/flow.domain.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.bodies.svg, assets/icons/geometry.bodies.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.bodies.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.datum.svg, assets/icons/geometry.datum.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.datum.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.import.mesh.svg, assets/icons/geometry.import.mesh.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.import.mesh.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.midsurface.svg, assets/icons/geometry.midsurface.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.midsurface.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.open.svg, assets/icons/geometry.open.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.open.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.partition.svg, assets/icons/geometry.partition.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.partition.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/geometry.tessellate.svg, assets/icons/geometry.tessellate.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/geometry.tessellate.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.bolt.svg, assets/icons/interaction.bolt.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.bolt.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.connector.svg, assets/icons/interaction.connector.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.connector.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.contact.find.svg, assets/icons/interaction.contact.find.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.contact.find.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.contact.general.svg, assets/icons/interaction.contact.general.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.contact.general.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.contact.pair.svg, assets/icons/interaction.contact.pair.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.contact.pair.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.fsi.svg, assets/icons/interaction.fsi.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.fsi.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.mass.svg, assets/icons/interaction.mass.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.mass.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.rigid_wall.svg, assets/icons/interaction.rigid_wall.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.rigid_wall.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.spring.svg, assets/icons/interaction.spring.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.spring.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/interaction.tie.svg, assets/icons/interaction.tie.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/interaction.tie.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.delaunay.points.svg, assets/icons/mesh.delaunay.points.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.delaunay.points.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.element.add.svg, assets/icons/mesh.element.add.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.element.add.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.hex.decompose.svg, assets/icons/mesh.hex.decompose.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.hex.decompose.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.hex.dominant.svg, assets/icons/mesh.hex.dominant.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.hex.dominant.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.hex.generate.svg, assets/icons/mesh.hex.generate.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.hex.generate.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.hex.mapped.svg, assets/icons/mesh.hex.mapped.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.hex.mapped.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.hex.polycube.svg, assets/icons/mesh.hex.polycube.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.hex.polycube.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.hex.sweep.svg, assets/icons/mesh.hex.sweep.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.hex.sweep.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.import.orphan.svg, assets/icons/mesh.import.orphan.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.import.orphan.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.layers.svg, assets/icons/mesh.layers.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.layers.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.node.add.svg, assets/icons/mesh.node.add.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.node.add.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.node.merge.svg, assets/icons/mesh.node.merge.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.node.merge.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.order.quadratic.svg, assets/icons/mesh.order.quadratic.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.order.quadratic.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.quad.faces.svg, assets/icons/mesh.quad.faces.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.quad.faces.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.quality.svg, assets/icons/mesh.quality.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.quality.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.region.remesh.svg, assets/icons/mesh.region.remesh.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.region.remesh.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.size.adapt.svg, assets/icons/mesh.size.adapt.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.size.adapt.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.size.global.svg, assets/icons/mesh.size.global.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.size.global.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.size.seed.svg, assets/icons/mesh.size.seed.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.size.seed.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.smooth.svg, assets/icons/mesh.smooth.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.smooth.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.surface.check.svg, assets/icons/mesh.surface.check.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.surface.check.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.tag.svg, assets/icons/mesh.tag.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.tag.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.tet.generate.svg, assets/icons/mesh.tet.generate.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.tet.generate.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.transition.svg, assets/icons/mesh.transition.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.transition.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.untangle.svg, assets/icons/mesh.untangle.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.untangle.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/mesh.verify.svg, assets/icons/mesh.verify.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/mesh.verify.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.activity.svg, assets/icons/model.activity.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.activity.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.amplitude.svg, assets/icons/model.amplitude.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.amplitude.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.boundary_condition.create.svg, assets/icons/model.boundary_condition.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.boundary_condition.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.check.svg, assets/icons/model.check.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.check.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.coupling.create.svg, assets/icons/model.coupling.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.coupling.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.info.svg, assets/icons/model.info.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.info.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.load.create.svg, assets/icons/model.load.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.load.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.material.create.svg, assets/icons/model.material.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.material.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.material.damage.svg, assets/icons/model.material.damage.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.material.damage.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.material.eos.svg, assets/icons/model.material.eos.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.material.eos.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.material.hyperelastic.svg, assets/icons/model.material.hyperelastic.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.material.hyperelastic.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.material.plasticity.svg, assets/icons/model.material.plasticity.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.material.plasticity.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.material.thermal.svg, assets/icons/model.material.thermal.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.material.thermal.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.orientation.svg, assets/icons/model.orientation.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.orientation.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.reference_point.create.svg, assets/icons/model.reference_point.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.reference_point.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.section.composite.svg, assets/icons/model.section.composite.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.section.composite.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.section.create.svg, assets/icons/model.section.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.section.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.set.create.svg, assets/icons/model.set.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.set.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.step.activate.svg, assets/icons/model.step.activate.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.step.activate.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.step.create.svg, assets/icons/model.step.create.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.step.create.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.step.explicit.svg, assets/icons/model.step.explicit.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.step.explicit.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.step.heat.svg, assets/icons/model.step.heat.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.step.heat.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.step.nonlinear.svg, assets/icons/model.step.nonlinear.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.step.nonlinear.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/model.units.svg, assets/icons/model.units.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/model.units.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.animate.svg, assets/icons/results.animate.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.animate.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.contour.svg, assets/icons/results.contour.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.contour.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.convergence.svg, assets/icons/results.convergence.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.convergence.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.cut.svg, assets/icons/results.cut.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.cut.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.deformed.svg, assets/icons/results.deformed.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.deformed.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.display_group.svg, assets/icons/results.display_group.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.display_group.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.free_body.svg, assets/icons/results.free_body.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.free_body.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.modes.svg, assets/icons/results.modes.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.modes.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.path.svg, assets/icons/results.path.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.path.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.probe.svg, assets/icons/solve.probe.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.probe.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.reactions.svg, assets/icons/results.reactions.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.reactions.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.read.svg, assets/icons/results.read.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.read.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.streamlines.svg, assets/icons/results.streamlines.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.streamlines.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/results.xy.svg, assets/icons/results.xy.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/results.xy.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.blast.svg, assets/icons/solve.blast.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.blast.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.explicit.svg, assets/icons/solve.explicit.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.explicit.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.flow.svg, assets/icons/solve.flow.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.flow.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.frequency.svg, assets/icons/solve.frequency.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.frequency.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.fsi.svg, assets/icons/solve.fsi.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.fsi.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | +| assets/icons/solve.static.svg, assets/icons/solve.static.vectorcraft | ModelCraft contributors | Original toolbar icon drawn with VectorCraft from `assets/icons/src/solve.static.json` (`cargo xtask icons`) | MIT OR Apache-2.0 | ## Adapted code @@ -25,7 +125,7 @@ is committed and listed here with its exports. | clippy.toml, rustfmt.toml | SolidCraft | MIT OR Apache-2.0 | | crates/geometry/src/tagged_mesh.rs (package and part reading, transforms, units, caps) | SolidCraft `crates/io/src/threemf.rs` | MIT OR Apache-2.0 | | crates/render/src/camera.rs, crates/render/src/raster.rs | SolidCraft `crates/render/src/camera.rs`, `raster.rs` | MIT OR Apache-2.0 | -| crates/ui-egui/src/gpu.rs, crates/ui-egui/src/theme.rs, crates/ui-egui/src/control.rs, crates/ui-egui/src/lib.rs (input injection, screenshots) | SolidCraft `crates/ui-egui/src/` | MIT OR Apache-2.0 | +| crates/ui-egui/src/gpu.rs, crates/ui-egui/src/theme.rs, crates/ui-egui/src/control.rs, crates/ui-egui/src/lib.rs (input injection, screenshots), crates/ui-egui/src/toolbar.rs (tabs of panels of buttons) | SolidCraft `crates/ui-egui/src/` | MIT OR Apache-2.0 | | crates/io/src/fs.rs (atomic writes) | SolidCraft `crates/io/src/safe_write.rs` | MIT OR Apache-2.0 | | crates/io/src/recovery.rs (recovery folder, entries, locks) | SolidCraft `crates/engine/src/recovery.rs` | MIT OR Apache-2.0 | | apps/modelcraft/src/control_server.rs | SolidCraft `apps/solidcraft/src/control_server.rs` | MIT OR Apache-2.0 | diff --git a/Cargo.lock b/Cargo.lock index b5f52d9..2de351c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -218,6 +218,12 @@ version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "220a2c618ab466efe41d0eace94dfeff1c35e3aa47891bdb95e1c0fefffd3c99" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.8" @@ -799,6 +805,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + [[package]] name = "derive_arbitrary" version = "1.5.0" @@ -1084,7 +1096,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1166,6 +1178,12 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + [[package]] name = "foldhash" version = "0.2.0" @@ -1541,6 +1559,12 @@ dependencies = [ "tiff", ] +[[package]] +name = "imagesize" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b27460c2c92b037f3f94c538ed9a3342f3fdf923606781629ccb35f82d042a" + [[package]] name = "indexmap" version = "2.14.2" @@ -1965,6 +1989,7 @@ dependencies = [ "modelcraft-engine", "modelcraft-model", "modelcraft-render", + "resvg", "serde", "serde_json", ] @@ -2560,6 +2585,12 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" version = "1.1.13" @@ -2898,12 +2929,45 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "resvg" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e3803f97b999e80cbf7c6ecdd07a8102204d92e1633cf48783720c521196bd" +dependencies = [ + "bytemuck", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] + [[package]] name = "robust" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" +[[package]] +name = "roxmltree" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb" +dependencies = [ + "memchr", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2948,7 +3012,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3093,6 +3157,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + [[package]] name = "siphasher" version = "1.0.4" @@ -3325,6 +3398,25 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "svgtypes" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b5790b3131dafa99b3bbfd25a216edb3d216dad9ca208d4657bfb8f2abc3d" +dependencies = [ + "kurbo", + "siphasher", +] + [[package]] name = "syn" version = "1.0.109" @@ -3367,7 +3459,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix 1.1.5", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3433,6 +3525,32 @@ dependencies = [ "zune-jpeg", ] +[[package]] +name = "tiny-skia" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47ffee5eaaf5527f630fb0e356b90ebdec84d5d18d937c5e440350f88c5a91ea" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca365c3faccca67d06593c5980fa6c57687de727a03131735bb85f01fdeeb9" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tokio" version = "1.53.2" @@ -3675,7 +3793,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3702,6 +3820,25 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "usvg" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "977d0a4abdef933f424a99fe09f95576e089b90aebc6f016a3bc813762493e91" +dependencies = [ + "data-url", + "imagesize", + "kurbo", + "log", + "pico-args", + "roxmltree", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", +] + [[package]] name = "uuid" version = "1.28.0" @@ -4177,7 +4314,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a3e232f..93f2e69 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,8 @@ sha2 = "0.10" # images (PNG snapshots and screenshots) png = "0.18" +# SVG toolbar icons rasterised in the UI (no text, fonts or raster images in icons) +resvg = { version = "0.48", default-features = false } # ui: the same egui/eframe/egui-wgpu line as SolidCraft egui = "0.36" diff --git a/ROADMAP.md b/ROADMAP.md index 40316c2..b513f7e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -33,4 +33,4 @@ hex meshes today and it gives the best elements where stresses are read. | M12 CFD: lattice Boltzmann | D3Q19/D3Q27 on grids voxelised from the face-tagged surface; TRT, regularised and cumulant collision; interpolated walls, inlets and outlets; LES; octree refinement shared with the hex mesher; wgpu backend (deterministic per device, checked against the CPU) | planned | | M13 Fluid–structure interaction | Immersed-boundary coupling of the lattice Boltzmann fluid with the explicit or implicit structure; interface force transfer; sub-cycling; Aitken then interface quasi-Newton coupling; free-surface flow | planned | | M14 Blast and impact fluids | EOS-driven fluids in the explicit solver: ALE multi-material or SPH, with fluid–structure contact | planned | -| Continuous: desktop and agents | Desktop app (viewport, model tree, commands, control channel: done), MCP server, browser build, command schema as the public API | started | +| Continuous: desktop and agents | Desktop app (viewport, model tree, commands, control channel: done; toolbar of every capability from the catalogue, ready or coming soon with its milestone, icons drawn with VectorCraft, docs/features.md: done), MCP server, browser build, command schema as the public API | started | diff --git a/THIRD-PARTY-LICENSES.txt b/THIRD-PARTY-LICENSES.txt index c23199e..0d7cdb5 100644 --- a/THIRD-PARTY-LICENSES.txt +++ b/THIRD-PARTY-LICENSES.txt @@ -1,6 +1,6 @@ Third-party software in ModelCraft -ModelCraft (the desktop app, modelcraft-cli and the web app) is built from the 427 crates below. +ModelCraft (the desktop app, modelcraft-cli and the web app) is built from the 441 crates below. Generated by `cargo xtask licences` from Cargo.lock and the crates' own licence files. ModelCraft's own licence is in LICENSE-MIT and LICENSE-APACHE, and NOTICE. @@ -23,6 +23,7 @@ approx 0.4.0 (Apache-2.0) arbitrary 1.5.0 (MIT OR Apache-2.0) arboard 3.6.1 (MIT OR Apache-2.0) array-macro 2.1.8 (MIT OR Apache-2.0) +arrayref 0.3.9 (BSD-2-Clause) arrayvec 0.7.8 (MIT OR Apache-2.0) as-raw-xcb-connection 1.0.1 (MIT OR Apache-2.0) ash 0.38.0+1.3.281 (MIT OR Apache-2.0) @@ -80,6 +81,7 @@ crossbeam-utils 0.8.23 (MIT OR Apache-2.0) crunchy 0.2.4 (MIT) crypto-common 0.1.7 (MIT OR Apache-2.0) cursor-icon 1.2.0 (MIT OR Apache-2.0 OR Zlib) +data-url 0.3.2 (MIT OR Apache-2.0) derive_arbitrary 1.5.0 (MIT OR Apache-2.0) derive_more 0.99.20 (MIT) digest 0.10.7 (MIT OR Apache-2.0) @@ -113,6 +115,7 @@ fax 0.2.7 (MIT) fdeflate 0.3.7 (MIT OR Apache-2.0) fearless_simd 0.4.1 (Apache-2.0 OR MIT) flate2 1.1.10 (MIT OR Apache-2.0) +float-cmp 0.9.0 (MIT) foldhash 0.2.0 (Zlib) font-types 0.12.6 (MIT OR Apache-2.0) foreign-types 0.5.0 (MIT/Apache-2.0) @@ -147,6 +150,7 @@ hex 0.4.3 (MIT OR Apache-2.0) iana-time-zone 0.1.65 (MIT OR Apache-2.0) iana-time-zone-haiku 0.1.2 (MIT OR Apache-2.0) image 0.25.10 (MIT OR Apache-2.0) +imagesize 0.15.0 (MIT) indexmap 2.14.2 (Apache-2.0 OR MIT) itertools 0.13.0 (MIT OR Apache-2.0) itertools 0.15.0 (MIT OR Apache-2.0) @@ -226,6 +230,7 @@ phf 0.13.1 (MIT) phf_generator 0.13.1 (MIT) phf_macros 0.13.1 (MIT) phf_shared 0.13.1 (MIT) +pico-args 0.5.0 (MIT) pin-project 1.1.13 (Apache-2.0 OR MIT) pin-project-internal 1.1.13 (Apache-2.0 OR MIT) pin-project-lite 0.2.17 (Apache-2.0 OR MIT) @@ -264,7 +269,10 @@ redox_syscall 0.4.1 (MIT) redox_syscall 0.5.18 (MIT) redox_syscall 0.9.4 (MIT) renderdoc-sys 1.1.0 (MIT OR Apache-2.0) +resvg 0.48.1 (Apache-2.0 OR MIT) +rgb 0.8.53 (MIT) robust 1.2.0 (MIT OR Apache-2.0) +roxmltree 0.21.1 (MIT OR Apache-2.0) rustc-hash 1.1.0 (Apache-2.0/MIT) rustc-hash 2.1.3 (Apache-2.0 OR MIT) rustix 0.38.44 (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) @@ -283,6 +291,7 @@ signal-hook-registry 1.4.8 (MIT OR Apache-2.0) simd-adler32 0.3.10 (MIT) simd_cesu8 1.2.0 (Apache-2.0 OR MIT) simdutf8 0.1.5 (MIT OR Apache-2.0) +simplecss 0.2.2 (Apache-2.0 OR MIT) siphasher 1.0.4 (MIT OR Apache-2.0) skrifa 0.44.0 (MIT OR Apache-2.0) slab 0.4.12 (MIT) @@ -302,6 +311,8 @@ solidcraft-sketch 0.8.0 (MIT OR Apache-2.0) spade 2.15.1 (MIT OR Apache-2.0) spirv 0.4.0+sdk-1.4.341.0 (Apache-2.0) static_assertions 1.1.0 (MIT OR Apache-2.0) +strict-num 0.1.1 (MIT) +svgtypes 0.16.1 (Apache-2.0 OR MIT) syn 1.0.109 (MIT OR Apache-2.0) syn 2.0.119 (MIT OR Apache-2.0) syn 3.0.9 (MIT OR Apache-2.0) @@ -312,6 +323,8 @@ thiserror 2.0.21 (MIT OR Apache-2.0) thiserror-impl 1.0.69 (MIT OR Apache-2.0) thiserror-impl 2.0.21 (MIT OR Apache-2.0) tiff 0.11.3 (MIT) +tiny-skia 0.12.0 (BSD-3-Clause) +tiny-skia-path 0.12.0 (BSD-3-Clause) tokio 1.53.2 (MIT) toml_datetime 1.1.2+spec-1.1.0 (MIT OR Apache-2.0) toml_edit 0.25.17+spec-1.1.0 (MIT OR Apache-2.0) @@ -337,6 +350,7 @@ unicode-general-category 1.1.0 (Apache-2.0) unicode-ident 1.0.27 ((MIT OR Apache-2.0) AND Unicode-3.0) unicode-segmentation 1.13.3 (MIT OR Apache-2.0) unicode-width 0.2.2 (MIT OR Apache-2.0) +usvg 0.48.1 (Apache-2.0 OR MIT) uuid 1.28.0 (Apache-2.0 OR MIT) vello_common 0.1.0 (Apache-2.0 OR MIT) vello_cpu 0.1.0 (Apache-2.0 OR MIT) @@ -732,20 +746,21 @@ ahash 0.8.12, arbitrary 1.5.0, arrayvec 0.7.8, async-channel 2.5.0, async-execut 4.7.1, atomic-waker 1.1.2, bitflags 1.3.2, bitflags 2.13.2, blocking 1.7.0, bumpalo 3.20.3, cfg-if 1.0.5, cgl 0.3.2, concurrent-queue 2.5.0, core-foundation 0.9.4, core-foundation-sys 0.8.7, core-graphics 0.23.2, core-graphics-types 0.1.3, crossbeam-deque 0.8.8, crossbeam-epoch 0.9.21, -crossbeam-utils 0.8.23, derive_arbitrary 1.5.0, either 1.19.0, equivalent 1.0.2, errno 0.3.14, -euclid 0.22.14, event-listener 5.4.2, event-listener-strategy 0.5.4, fastrand 2.5.0, flate2 1.1.10, -futures-lite 2.6.1, gethostname 1.1.0, glow 0.17.0, hashbrown 0.16.1, hashbrown 0.17.1, hermit-abi -0.5.3, indexmap 2.14.2, itertools 0.13.0, itertools 0.15.0, js-sys 0.3.106, khronos-egl 6.0.0, -linux-raw-sys 0.12.1, linux-raw-sys 0.4.15, lock_api 0.4.14, log 0.4.34, num-complex 0.4.6, -num-traits 0.2.19, once_cell 1.21.4, ordered-stream 0.2.0, parking 2.2.1, parking_lot 0.12.5, -parking_lot_core 0.9.12, percent-encoding 2.3.2, piper 0.2.5, plain 0.2.3, png 0.18.1, polling -3.11.0, pollster 1.0.1, rayon 1.12.0, rayon-core 1.13.0, renderdoc-sys 1.1.0, robust 1.2.0, -rustc-hash 1.1.0, rustix 0.38.44, rustix 1.1.5, scoped-tls 1.0.1, scopeguard 1.2.0, -signal-hook-registry 1.4.8, simd_cesu8 1.2.0, smallvec 1.16.3, smol_str 0.2.2, syn 1.0.109, tempfile -3.27.0, ttf-parser 0.25.1, unicode-segmentation 1.13.3, unicode-width 0.2.2, uuid 1.28.0, wasi -0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-bindgen 0.2.129, wasm-bindgen-futures -0.4.79, wasm-bindgen-macro 0.2.129, wasm-bindgen-macro-support 0.2.129, wasm-bindgen-shared 0.2.129, -web-sys 0.3.106, weezl 0.1.12, wit-bindgen 0.57.1 +crossbeam-utils 0.8.23, data-url 0.3.2, derive_arbitrary 1.5.0, either 1.19.0, equivalent 1.0.2, +errno 0.3.14, euclid 0.22.14, event-listener 5.4.2, event-listener-strategy 0.5.4, fastrand 2.5.0, +flate2 1.1.10, futures-lite 2.6.1, gethostname 1.1.0, glow 0.17.0, hashbrown 0.16.1, hashbrown +0.17.1, hermit-abi 0.5.3, indexmap 2.14.2, itertools 0.13.0, itertools 0.15.0, js-sys 0.3.106, +khronos-egl 6.0.0, linux-raw-sys 0.12.1, linux-raw-sys 0.4.15, lock_api 0.4.14, log 0.4.34, +num-complex 0.4.6, num-traits 0.2.19, once_cell 1.21.4, ordered-stream 0.2.0, parking 2.2.1, +parking_lot 0.12.5, parking_lot_core 0.9.12, percent-encoding 2.3.2, piper 0.2.5, plain 0.2.3, png +0.18.1, polling 3.11.0, pollster 1.0.1, rayon 1.12.0, rayon-core 1.13.0, renderdoc-sys 1.1.0, robust +1.2.0, roxmltree 0.21.1, rustc-hash 1.1.0, rustix 0.38.44, rustix 1.1.5, scoped-tls 1.0.1, +scopeguard 1.2.0, signal-hook-registry 1.4.8, simd_cesu8 1.2.0, simplecss 0.2.2, smallvec 1.16.3, +smol_str 0.2.2, svgtypes 0.16.1, syn 1.0.109, tempfile 3.27.0, ttf-parser 0.25.1, +unicode-segmentation 1.13.3, unicode-width 0.2.2, uuid 1.28.0, wasi 0.11.1+wasi-snapshot-preview1, +wasip2 1.0.4+wasi-0.2.12, wasm-bindgen 0.2.129, wasm-bindgen-futures 0.4.79, wasm-bindgen-macro +0.2.129, wasm-bindgen-macro-support 0.2.129, wasm-bindgen-shared 0.2.129, web-sys 0.3.106, weezl +0.1.12, wit-bindgen 0.57.1 ================================================================================ Apache License @@ -1169,10 +1184,11 @@ android-activity 0.6.1, arboard 3.6.1, color 0.3.3, fdeflate 0.3.7, fearless_sim image 0.25.10, linebender_resource_handle 0.1.1, miniz_oxide 0.8.9, miniz_oxide 0.9.1, naga 30.0.1, naga-types 30.0.1, pin-project 1.1.13, pin-project-internal 1.1.13, pin-project-lite 0.2.17, portable-atomic 1.15.0, portable-atomic-util 0.2.8, range-alloc 0.1.5, raw-window-handle 0.6.2, -simdutf8 0.1.5, truck-meshalgo 0.4.0, truck-shapeops 0.4.0, truck-stepio 0.3.0, vello_common 0.1.0, -vello_cpu 0.1.0, wgpu 30.0.1, wgpu-core 30.0.1, wgpu-core-deps-apple 30.0.1, -wgpu-core-deps-emscripten 30.0.1, wgpu-core-deps-wasm 30.0.1, wgpu-core-deps-windows-linux-android -30.0.1, wgpu-hal 30.0.1, wgpu-naga-bridge 30.0.1, wgpu-types 30.0.1 +resvg 0.48.1, simdutf8 0.1.5, truck-meshalgo 0.4.0, truck-shapeops 0.4.0, truck-stepio 0.3.0, usvg +0.48.1, vello_common 0.1.0, vello_cpu 0.1.0, wgpu 30.0.1, wgpu-core 30.0.1, wgpu-core-deps-apple +30.0.1, wgpu-core-deps-emscripten 30.0.1, wgpu-core-deps-wasm 30.0.1, +wgpu-core-deps-windows-linux-android 30.0.1, wgpu-hal 30.0.1, wgpu-naga-bridge 30.0.1, wgpu-types +30.0.1 ================================================================================ Apache License @@ -1712,6 +1728,37 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +arrayref 0.3.9 +================================================================================ + +Copyright (c) 2015 David Roundy +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ================================================================================ arrayvec 0.7.8 ================================================================================ @@ -3927,6 +3974,36 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +data-url 0.3.2, percent-encoding 2.3.2 +================================================================================ + +Copyright (c) 2013-2025 The rust-url developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + ================================================================================ derive_more 0.99.20 ================================================================================ @@ -4651,6 +4728,30 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +float-cmp 0.9.0 +================================================================================ + +Copyright (c) 2014-2020 Optimal Computing (NZ) Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + ================================================================================ foldhash 0.2.0 ================================================================================ @@ -6225,6 +6326,32 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +imagesize 0.15.0 +================================================================================ + +MIT License + +Copyright (c) 2017 Maiddog + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ================================================================================ indexmap 2.14.2 ================================================================================ @@ -7876,36 +8003,6 @@ http://www.apache.org/licenses/LICENSE-2.0> or the MIT license option. All files in the project carrying such notice may not be copied, modified, or distributed except according to those terms. -================================================================================ -percent-encoding 2.3.2 -================================================================================ - -Copyright (c) 2013-2025 The rust-url developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - ================================================================================ phf 0.13.1, phf_generator 0.13.1, phf_macros 0.13.1, phf_shared 0.13.1 ================================================================================ @@ -7931,6 +8028,30 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +pico-args 0.5.0 +================================================================================ + +Copyright (c) 2019 Yevhenii Reizner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ================================================================================ plain 0.2.3 ================================================================================ @@ -9187,6 +9308,62 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +resvg 0.48.1, usvg 0.48.1 +================================================================================ + +Copyright 2017 the Resvg Authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +================================================================================ +rgb 0.8.53 +================================================================================ + +MIT License + +Copyright (c) 2019 Kornel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ================================================================================ robust 1.2.0 ================================================================================ @@ -9218,6 +9395,32 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +roxmltree 0.21.1 +================================================================================ + +The MIT License (MIT) + +Copyright (c) 2018 Yevhenii Reizner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ================================================================================ rustix 0.38.44, rustix 1.1.5 ================================================================================ @@ -9714,6 +9917,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +simplecss 0.2.2 +================================================================================ + +The MIT License (MIT) + +Copyright (c) 2018 Reizner Evgeniy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ================================================================================ siphasher 1.0.4 ================================================================================ @@ -9890,6 +10119,54 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +strict-num 0.1.1 +================================================================================ + +Copyright (c) 2022 Yevhenii Reizner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +================================================================================ +svgtypes 0.16.1, ttf-parser 0.25.1 +================================================================================ + +Copyright (c) 2018 Yevhenii Reizner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ================================================================================ tempfile 3.27.0 ================================================================================ @@ -9946,6 +10223,41 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +tiny-skia 0.12.0, tiny-skia-path 0.12.0 +================================================================================ + +Copyright (c) 2011 Google Inc. All rights reserved. +Copyright (c) 2020 Yevhenii Reizner All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ================================================================================ tokio 1.53.2 ================================================================================ @@ -10232,30 +10544,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -================================================================================ -ttf-parser 0.25.1 -================================================================================ - -Copyright (c) 2018 Yevhenii Reizner - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ================================================================================ type-map 0.5.1 ================================================================================ diff --git a/apps/modelcraft-cli/src/main.rs b/apps/modelcraft-cli/src/main.rs index acefeef..c2ca1f3 100644 --- a/apps/modelcraft-cli/src/main.rs +++ b/apps/modelcraft-cli/src/main.rs @@ -1,5 +1,6 @@ //! modelcraft-cli commands //! modelcraft-cli run +//! modelcraft-cli features #![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)] #![forbid(unsafe_code)] @@ -13,6 +14,8 @@ usage: modelcraft-cli commands list every command with its parameters modelcraft-cli run run a script (a JSON array of {\"command\", \"params\"}) and print the model summary + modelcraft-cli features print docs/features.md (every capability, ready or + coming soon) from the capability catalogue "; /// Largest script accepted (bytes). @@ -27,6 +30,10 @@ fn main() -> ExitCode { } Ok(()) } + Some("features") => { + print!("{}", modelcraft_engine::catalogue::features_page()); + Ok(()) + } Some("run") => args.get(1).ok_or_else(|| format!("run needs a script\n\n{USAGE}")).and_then(|p| run(p)), Some("-h" | "--help" | "help") | None => { print!("{USAGE}"); diff --git a/assets/icons/assembly.instance.svg b/assets/icons/assembly.instance.svg new file mode 100644 index 0000000..053b890 --- /dev/null +++ b/assets/icons/assembly.instance.svg @@ -0,0 +1,11 @@ + + + assembly.instance + + + + + + + + diff --git a/assets/icons/assembly.instance.vectorcraft b/assets/icons/assembly.instance.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..43057ebd185bd48ebee149d3403140e0fed787e2 GIT binary patch literal 1781 zcmVMdzW1%XZ&^+}C7lcOg7$?U|3u{qD$H7#M0+q-#a>NTt>D9j;sP1lQJbHd8H zA!SBkPFu33hQ1H%h88t6WW3;FzUH}{alTwY6A{gV6OqHXFSj1c)uJU?%MmZTz6pYX z0zgUOH@it_a@_>J( zqG-R0dhBXyf-gvM zmnBua>4EK5`Md&EJE=)6O(av!c;2zKtFc6((u!dw85j$O@A3d+4df6;FxF0EkZ6xKoM3G{)<|Bh;iO&U z2S&6AEEEVbJ08|_*xT%{loSU-2>pR=!1+Ym2c%1m>=pB8E9jxdq2enx{+a~JUPo;Dtt$eg zwp(Nh9cZQu)8y^OZ>*8LDRZ{uu2^)HB{GJpJtjzuW`Yi!HJVS17qoFiV^E+$C{xeVPtQr=a7cGZnZko zh##{KovPVuhLx^~^8KWBXd+>vLaM#@3V!Vx$`b9qcd40r4opn7-{72ssZmFyA_d-U zDmqcK59j>ylDb;Py`0_Th}ta1=Im!H4zft&TnI5lEOn|e*!6XqW)J2gDP41)WDq=t z^_UQkw9zvTMGV*DLp)GVI4C{@IuWvuV&`q`8qx3N$bpU@#!yV&YK`PGDazJ)cZmik z89a2{(Fe^}bp@9xwd>9s3~UAKP;ZRZ*S0c(7+Lw4P97^oECtD#yd9g~eLdZkx!$o7 zs%6kuH@wni83+yfo=EOG zKY@0eC_=hMv`ZLOjvb9SbSfYR6yxu(s146gN8cKC7>-d(96|_nWpON!L&|8wZK^8) zjK96pKn|)~rGxUjNw#KI*G1~86fD15v20#9n__6aKhjIm7E)ts#N?wK;XU7LSbHx* zk98%!_qKC)|Lvt^ys z7090P9XsoK@3-J4>~Rx3!Hqm%tPWB4@orp?MT_;NcSjZOQ58O*N@ld1^@10Y3>i;a zmQ(XxF!jnvEwkqmq$OA?qiz>D`^w~tvM?}(r3I~3~tBRSiYz=j67 + + deck.read + + + + + + + diff --git a/assets/icons/deck.read.vectorcraft b/assets/icons/deck.read.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..3f188bd7ed98eaef1fffd6e57b57242f0989f172 GIT binary patch literal 1735 zcmV;&1~~a2iwFP!00000|K(b3Z`(Ey{wsz)8;0Ir0`xXx=(wcw-Hr zm2(k}odvEiL(mDMK8aD6eALLDWD^(07BufxxB?;fyYG2przLHP;X4J+Zzc?*0>*X~ zX&Y$!K<;qaKtoPT%BCw?@R3)G88ji*&M0C9jQeu$kU|Kn(29?Esrp793}gU?E4_1_ z3wPpQzM+2@Z~wq>g8?Up(Bf5Hq84ve*NjvxnsJ_5)c@A$5%rLsgEsJOV-_BB|M#ld=SbH6qdm3P?jsQtSiaB$v>^1j~$5B^T>{w? z=*&^g9fNiim;NUu)%JCBy?MZXjo_PO`2np>H{*|zE+BA8l`%o+mlXUXn7G&c=ka$h zK4|c{FC~W!zPHzsZX3W^@{%^Vkd_2+f;Vo$z}AEnt+4ZdrT+olq9HlT{~oz&YVOz# z|D)`>&&w`X;JN$sCfk+=bdDbr5IhhN3=1&J`5VTS?UH^pe!1D!id_U zvhy2G7oT$%?Xj6{8%(SbPrQtC9|cDQjQ7U`lQ4P2K=2Rk%`Iy4C6=<)a`@#p;Qsni zn*fI;ouP8K$oeRL^{2ZQ1+s* z5tNs!nMmcVkfdSY1=>b&=6YG|DIh-Y@uSEX$RD^Y>8&*q$mt>-#Cg_;xPO9P>d zUNa0is^v=AbC)#XOj+Z3M^?7Z5{1Glnwg~MEIvH*Y}gpcDUA5OoHQDVoY9&SUpkL5 zl2Z$`c`kZqGMhGs360c_?}LSBGpjM%!s}%pxk_ z83Vaoqw1t7qZx@sbklJp7K8+YVA%2z3tRXahw=smL}k0?hWWc=_*CZ*@zvM!H3@{j z4p{U%TLhk1Zauwg_A=p^Iy2Ps#u&+)svrw$i$!kPBkibi#srDBOrXFSqxnQ=iCarF z8im&jrDE15=7fCcSY28N^B89(QRAi!N9?t1}j%_{TAZOP(qI8R)Is4_3f-clrZ?!cM3z=&4R(+YKnS=R= zD%;#A=>?Dejz9DV`sgKvB8KhuA?}$c>{XKjnFyIjv8%4JjpzqCave>RuuGHA8EDu6(RW{q{xX4vF?)mo>EC2!}Ne_g5S`uq5$p9^}wU&5*mdIL5G(byettA|wC9u{K4AA0RYw-tY@vOD{Tk3P&+s%>1 zvVCmU%3ka932(cIdY-HiZ4*Y3V@CrvodU=S#rPc-vEaGs;8P=o;T*NZK7>$K7KZ{k zrHs~Jrc?=F`01Sla#GzY?UmnkvXvPf7m1@%@cep7@@dnq%f9#ijOVB;xy8hY(MLYQ zdA>V6M-M{JbtHcDv~zc%K`i3xniRk2HJ#BrbsOg3v~~2pYfDIRobThP-}HC+PyDW5 zF#5V4y%7bnXS}dwT<`rB+=P4F1W$0oHyF!P%zeHS*K^TgeCVyH^7p6;A5g_J+VyHi zOHKxlCmkuUer8168EJU-T!FTPUj^ZpMGEqj@Y|L!Fa^;JHT-HLhN@uRHq*K$dMsH% d9UDg7!>9`1wNoxJ-t2d5{sEP2okj~P005D=Qx5 + + deck.write.abaqus + + + + + + + + diff --git a/assets/icons/deck.write.abaqus.vectorcraft b/assets/icons/deck.write.abaqus.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..3aa772012da43dc0fb82add29578875b85ed3c95 GIT binary patch literal 1908 zcmV-)2aEV0iwFP!00000|K(ciZre5#eicK%4MWsj0rsQoimqt47Rk_J2m*taXq$^H zs=6fc0>AqXZ;oX<8AT^W*98b{krdD8?_79z$a`nb>J@ICGv|h6EvvH{&s%26`^)XF*C*W9WoYpT(%xeALLDq!Sm$<}B-0q=ZTCAKpV_r=@K{;GLXg*OS|twq$~5 z_-og|J6%cJ2KqkHJ5un5j1{b&u2|0BIA6@53D@n6;W~$Lm-i0M#iS)(@e!|7-w46L z8bER3cdm2hPTaAx)?eF;$!GtI(Q^B^x!N4CUtxH2EI**N>1O<^qzedKGNnwI^pe|$ zKXI@4&*RU?+i!@VA>MEB&`wLRZ2)7*3f7QZY7)Q+-na^VTNRe9B+idY{~_JpF}mYD za+Pa7up9hG*>zu(U7&4@++8yLZOZ|h<44~258n3&y&vtqkG3sOX*2vjwCTHP;`*tt z)EOb6L9I^N`7M1VX^b;hOKvER6YPf~nLWJUxd#OGv3jLQn=kz02{PMdw7Y+@s`qyz!PzQDk|1hk% z#cj4EQt>LMy!;(v*wv%44J@=^Gh966trcr`d|u7+WeLt`>pfNp2}K_0j-bU9ZJLJEk-d%Q3-2J$C(F}t-! z0vn@HFA}LQ{sPU3vZaAgMsI5Z8$HW(vu7?z%$c&r^MS5xjU^0(Rx~ql&saS8&bO4t zKu%%A^Q6;gB+{cbC!RDOV95V$?tfE_(| zZ}U*{>T8E>s|#Bym2{WbQ5y$)FPJ6i-uEVoFPo=_?bQ|H~wHTT|{-P(q- zSi0{+Y9^k29aGI0IO|}l)e(wF;cXWcnW&kEb2gt7Tg%wX*>#R6&0=WI{(8wk7H+Kz z8JdWNOf`C|zD(21!Cc_dHus5p!J}VK3A}+e`kFzR$#(k?_0$veO0vF8gv_JZdDqxR z^t~L}m+?aziq2b&k$k~L*;%hHVQ(kn^&NNcM)OTm!SPmOyYl)yTk&M5*GB6~TNywM zuY8P0kCh@8HO?tNuN*&oJ=+!$KhP5Dnb6m?tdeCJ2o3V&PSolLl}(@uRpE@bYt_7> zdBp@AFb57<&yAj*`&e=0>A89R3O4`zL{Sblvu@x67o(FHlym%F8NBGq=4j6MQf6mZ z9(g_<4fCLvAopWNjwT8($F133?fJ+x+z&k;xmUUdJzdnSt9pg#w>4h#%NfUt)bD>v z-67E)^s6CyQjoQje@lI?db>HgShkOOt?acvpFrD16d_q7+9r%5#|{TEJTo(?Go_0Rm3KEOBx@*X9OHOC(P906}owklX zc5MMEj`Mw7nKAuc-V?v;SAuWWqj#b}_JX$_jqAPNf}3E68~+Jz_y%Knin^cg#Pzvo zF+TKGRCzm81qW2|jCQ@6v4WGq<4H$zqQBQv+{kHo_FRIrm|r&JS8;NBL;2NZ7?{A+ uHE#I*U; + + deck.write.lsdyna + + + + + + + + diff --git a/assets/icons/deck.write.lsdyna.vectorcraft b/assets/icons/deck.write.lsdyna.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..5124c40dad7b68befa549ff9c31f74453a4eed5c GIT binary patch literal 1772 zcmV%>nwM%ZjdOw-)KpVkiQGmKd9h zENYb0#0&i2cO*sIa-58!?V{@f1eW-AkDfaok4HW@H;gZF<6JmjN!Bo)aeUJ_F1+!Y zveLN-U1v^8!ZB1rt534krD!$s#*?uJZF82jOH#rh58Hme>ol|}2=vKGc00b~v?1f7 z&Q~RdK5a>x8tOjKds5U;kg5}E5$JKlWMVL1;hItO{zC1WImxGpgDO$Yj>P9{^ zuc93@QUz5K;DT8iQ<-)xj@mZDp4VO=noU+A2_KA;1m!VvaAZ+kd5ey)3U)c!B@ju zD99GH$T=xDA_E|#stD$|%!n8d_*^PPO0si9ivk2zm?~X#Kx$S%{~aKL$SU)RX3d75=&`mEdG*CTAIc|5=Nb{Ne2al zId?Q~7C`nGDl=RO!(eSGM*ox1a`U>rUO!^L!qC%IKTuk?Gx4bC0s=y+7PD!{a0AtAtR+C(562M8`gbIz$Qdpw0EYT{6+8Qt5Aa;`*zyl98cz~7XZsKZak{zT9pp+iHsy;f)(CeLdrKIfuj#{G|~=@bN@ zzM_$vj)Sd|qH&@M4lOzG55@HzZn6bY!*&tNm)~H9Tt7K;;QI?U!^Ji#s#vpQQQat? z7och@s-?%9cfT|FyEc{jQ-QNvO9gwKX1z|Q=2EXnZYgsTOhPauy&Cw+jDik{ z-qEG4u|%QNie@J18A|}qV#8t#wq2*O! z?bLfoCttc%Kiwda{FqPNUoqq<8(Sw5gWCpy$zF_z1j5MNRIeZkw_R#gq!B-59V%2a z*9F1JfEbbaa7Rz2BIX?DRGfyn+sBJdis~ILAzKD@b;Bx^ zmI2qG&V^(qcu?BJby$Tn+N`?bCCw`);ea^^$a-x5`LPcrN1h*BWVc}RFV3q}V>9ap zK5#KQia|BT|CPayZCM|T`Oal_hUt;h@n{$aorB!>895jzoR3?xz1r!>HQW!Kj@)aV zgPzVgYpY%&`ZdQZarA#EN&WW4#2e!6K`$#Pzm*1S?8@K1NUf!$1EeI@Qj!5uVrwb! z04b5RlxTpI&{|43Knk*!f(A$ltfd44r1;iS{w?&m?(OF2e9=5LYgMiF`Gmh&M15c7 zh&BPEjIpBun@$Pjh-Ca0i(K%$bnvNBhv5{t#6E;jWfq45IVO$PU#7Yg!0^*M1>~r_ zRoY9x>tJhQbX+7)O2P801+Nm5Ph8&@hFeIj+U+QvzARtf{9}MRi-cggiF1dVp3Xxo@Uo#ALl& OvHl15%`#QCD*yn^r)X^e literal 0 HcmV?d00001 diff --git a/assets/icons/deck.write.nastran.svg b/assets/icons/deck.write.nastran.svg new file mode 100644 index 0000000..2098161 --- /dev/null +++ b/assets/icons/deck.write.nastran.svg @@ -0,0 +1,11 @@ + + + deck.write.nastran + + + + + + + + diff --git a/assets/icons/deck.write.nastran.vectorcraft b/assets/icons/deck.write.nastran.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..3bd00915818fcd012da456c1b94b11885708c423 GIT binary patch literal 1815 zcmV+y2k7`8iwFP!00000|K(b3Z`(Ey{wsz)8-}QN2k3{cE4rfHTBJjZp$H6GqHQj+ zs8Lc9FYtfg@y)RuC!^@3=(+%bCBEIG=Z?qYk+&5B*mazIQ#Am*3e*#eghF%_IO&1{7!Z*;}> zV(gW8L-;Wu??r_~aY?H}plCO>sE|F(hl%o!oHPV*3J5J(*ClSrPIS#_)#AAztmPdP z<(TnocsT_r~UlhJDTy1m%mW534GbF6-#wCU#JQPBkiu9#LP4Ej~rM>z2> z#OH~36dV>LP>>!L1Zb}$+7*DYpr3AKvR94(gxm_eZ;u$Fv!LAKDE4Y37I1P^&XR zQiDdFs`6XTl~|A$@6j2cU5Sl4P&PqRL4O<`8)DpR6;7h`aV;g!xhUCj|D$R;kzO(G zYw2D=wpSp#$b$Q85JWKaN@}QCVF^YAO}JW?g0E|sZ^93)^e@K+r7)t1q4xe^*qenA zv{!6qvx2r2#sSTmYux55qCQ7QN?(72nR)Txj0N6HHpk^%G*+{A&yw{hUshmZPAZn3 zcBy~o@^@=1^`{c&myU+zYm4%=E!j&wCxxTTX)ukzfXym|l=%i40g9w?XVySI!2Dj4 z(Fu5>SU`wOfEf#XC&F=sl9(k~LWxb}tDx*H&{j}huIDn!cS4dyAqtI-lBtiT3DQ6U zQ4_?mHIP3@S+Z+qBoOY$#`R4@`4<^Zv@H#UGJ3-asa%7op1EYHV9FWKd%AWtmN=4H zG0dbrV+r6{Y?Q2loWe*Ds7Ygxs2OcI36$|zBYC}sEqz&>=+R=ZP$0-ew}GO=-e!L% zxI7U;*8L ztqQtiu2@tyCpLzvW=xnG&4e19HJZ?iK87!stds}o7UZG*t{AVv%Y!r0za&mq`%U20XNkvwD_Dpa%A46R%P<-?%0 zZz54DU8?=;-i2oJJv2Vmet~m#rbZpH^c2BvQBi@Ky*p=%1#z{EgP7gK zh{`O6#_X?F3}oTfd3$b%SgKH?x9Y1f%^u7rT)DFS-HWL|#M^^jHc);k4c6L~zk886OUVXENu8yn1EeI*Qj!5uVrMDw04b5P zlxTpI&{;}2KuX{&B^V$DIZOGs(C4DJo1@EB`_Qaawa(`gXt#(Wq;f>NfKkTS@qkUI z1ad+${tk;=@ceA>sgcI;6uHDcgh*u;hXOezjn-eLbP8bj>74>{Qr;@-rQc1kHMKe} zk_WP2`SptCv!>mYee3<1EO1u}jmZ|HPojnQd?)Ki4?>^n82#vJ=iOZwxrpl*zz*mJs52-^WD|+wTe<`L16GzS@l5$^_Xn-sQ8-_kIg*qCIZHN4OCi zjMXXXe!3Iar=rFB&|6a#>`@inqe?`yoAsQPf(+qLI$99(%&EL*(unA}0%@tZLMJYm z6!eOU8@bRh+lq@FjkxtnAS;-+&8)7eX-n6T$A(t7(5fOg?M#fAZucv;{{Rv7Nfj?F F0002vim(6x literal 0 HcmV?d00001 diff --git a/assets/icons/edit.redo.svg b/assets/icons/edit.redo.svg new file mode 100644 index 0000000..102d14d --- /dev/null +++ b/assets/icons/edit.redo.svg @@ -0,0 +1,8 @@ + + + edit.redo + + + + + diff --git a/assets/icons/edit.redo.vectorcraft b/assets/icons/edit.redo.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..9569c94667f9e2982cc050e12c39d4de38e09e4d GIT binary patch literal 1705 zcmV;a23GkWiwFP!00000|Lt0BZ`(Ey{wsz)3x-I&2k3{cE4rfHS|me@AqWiGVr(w5 zs8LcAFYtfgkrb6Ebux-hh5=iEz!G`lJ$mkVJRWuHU2?G{t#{&mqpOySl^~a`=fj<7 z7_YpO$oJN?qJlstNPSUKZ=}>LnCJ5VWDCCPwzPslZttE$zSpw0r0@(aSUVTA;2_&o ztZks}GrOT>0}U%)a%|IyQcy_5m3MMU%7&T_!JB5WAxt!V$Ns|iO0uKk z5Ri|uL!r20RUuKdyIOXrC(Mh<_RoSg6mUuiE#1~7Y3ZQ47OZN?Qu5S_4jNV)Ru+O* zgGvm9)HNl7R4XdSV=#zDq&0h&tSmucO_;Vp52WH1_4a#zkZW4Oujm2EhL@n}9%N~b z5;}ykhmfR(L7oL+9)df_+XSIBiBjKN%DY^5f->)#73~Iynx`=gNNQ z+x^A2AxQ7zU2^S;=3evaMP+o7BYQb_sl0_j3jg68#KzV|CAXxU`IJO4z z8!bzI?TjSDVQivM9;&~{aMJtIL@2X&g2GDd1}Gc3OO{Heobh~QTUTd^BV`rCOgeHF z4A(I*XAR^SMljZs#vsu%+Hiuk^H?K!yM?5*ERKw5F?c8t6dMql4tt;dm6GyE2vIQd z4UA$rz3oHE>pwc;2muY#GZn8ii6dYg2ndK6j!norAhjt%0bpin0NT;>UjC z{!Czt-?|2o1j05bOdsTkp+p$lyXq;V;jT-q&NPz8yhEpI_LgClYoh!xX&t*rl&X+w zKYIngb`52zp1yafnYs^6OtoL&oP((`N30?R9u^gysM&{eetAhx;nZgNEJ7E^Qf zHyaMRNb9^)Hbks-sxeyib(&@m=8ROXxlcL@9^(yrgeUsw8xA!H*X=_xGEZc7HQGEn z5weeBr(NS3(I4c&hFBd^lKs2Olc7rWkyTLag1)BZwJys*Xwaoqx#~T@yL&9U{SeQeh1Ugz@(G%TVB=^D|HFsd9op0MduK#nNJ z-(gV;UXV>bHR>@uM=fy-A<~t_sX&e?qm7rTz63D+^iBggs&18y%I_xG%B_xz)KMvT ze!XF(AR|T?{GVYXm??1s!bdQ_x32x*DV{?qT zpYO!=xoELI^zNy`_o#}#qe^D9yX}&fk_;J7I#y6~EtvY^qmkKj1=><9jnQ<=f_-E1 zn=%m0U}!-a`2iP&s^F?^7In>xEZagI8>DVQs-idTLZR5-@7VtZLg9|!@g@KOR_Q{% literal 0 HcmV?d00001 diff --git a/assets/icons/edit.undo.svg b/assets/icons/edit.undo.svg new file mode 100644 index 0000000..53521ee --- /dev/null +++ b/assets/icons/edit.undo.svg @@ -0,0 +1,8 @@ + + + edit.undo + + + + + diff --git a/assets/icons/edit.undo.vectorcraft b/assets/icons/edit.undo.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..5a09ea7b016ba0d600a0859e6ba9db606b2fdd90 GIT binary patch literal 1696 zcmV;R24DFfiwFP!00000|Lt0BZ`(Ey{wsz)3x=q71?Yz^E4rfHS|me@p)d^EqHQj+ zs8Lc9FYtfgkrb6EaWaZ_h5=iEz!G`lJ$mkVJRWuDtQgXjT)5*k zWuq z%$s_yv(p#1$T{;v+0SZwm2g?iHby9k!^CwK;x1F2pv<|Ud9wkcrbz??;!0SRf$?FS-x)3Y z+x=|+gt`jDqptda*1BDYOZBes_8Zn&0tWpafpNk8X5#(CJqo)9*I{iV8scdZqtFkM zFhfz0#qm%cZd~yYJRo3o4QT2IX_Ul%ya8vj54TGyN9M<(4r3J^+NW2MV47 zLJtw8T3-0wvS2mIdq><$I|_FQ{&$B%?jXpErcqC3IE~yV6kjJ)APm{$%ithYi5f@+98OvqpBGb zB-%1T2hJGHSIP>~SfbG=&>)n`S(}&>@}=cfVI9=9Y6V1wRh0HfBtPa8_h$^d`o=bh z#1OVYVe%+P33kN$b!>!bFBt^V!SUjcq7P z)bzbi&E$QcW2*TAXB|wnIU*S;{C-hUiJEyhXR8&l^^8Y3yUr1nTa3-w&o>No;l_HK ztch5wRAaE}t2E6V%q1>ubDv}oJchgV&>!ie=L`xEw%dnzV4hI#YLt0YB4i%LF522Q zqCd)!0~J5Cqv*WV7|AzWl&$sZ5)F1T{&3=s-e|t7D=0bEwkvNi@D*Q$dhN8H@|6+9 zh{}gMd9D<(<~XOKcI@6?p7kZFPqc(e7xdK)t5jJALW8QNidAP^*#s(i6<*S2*EMfx zUNH#=+(AIrW22YHK2#ied2CVKg3Z6E@+x67?*=|_F*%AsHO7CH!OOO+59WNY<#vYU zk<;;Lm&C&Iyd2ZIKUhDG-)Gwk4sTxtAFv=V|8nNk=K#nNJ-(!&ro|le3 zHR>>&qLw&>5UR@JSRlug(T2-ZR{|J+dZ&OKRkun9<#(NIWk$zE@~9L%zuM5{yl!^I z(0hL*E8G^sVp3vqDI^@*(`n0t&{G{}A3W{s&#pbWh?3wEnM*m!)}I{Dl- z1*AC6zvGzR^u7ES-s>lVuXmFVvOxA)#vN1d{U^8yA8-@Az>U~oY>qMa=}ufvMT_yF zcSn`~fU58bRU)I^Z5ON%WQcgu(wyjPPUYtwwaA`J(3beZ7 + + file.open + + + + + diff --git a/assets/icons/file.open.vectorcraft b/assets/icons/file.open.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..7f963d5a1b5224ac4cf98de135e47be4add3dae4 GIT binary patch literal 1693 zcmV;O24eXiiwFP!00000|K(b1Z`(E${VRq(8-d=B0Q=BoMOU<2i*#r)6oElYw9SPU zHA-sY1^(~5d^wiuWEAZT16H7jMbf;-=N?{OUh2VHFuq2ecjiwqj+!#x+dx@c6x8>UE@}7{0S06ko6g*D$uP zN!LQ#M{TS%2`@p*lW7(uXZKqzlVt2C=fMPI+_^o%jK(xiCgR{1stq|d@?%3W;J&HD% z9|Q7UbVwApq^<;tZqtYk`3>{KMEggMTMRe_gbuG8iaNYA-EdNOXfAl_cn=NbiqMJ! zSH@%rgftCC9MvTj^AVUtAySqFzZ48Mh$tUuAT6Wt{XHOpWC|TzvdjflL6*jupMsCY zQ{*Rk9!Bsu7msmNgh7&Rx7+E?R@-rQiyf`ysrZ*^Yk8iAS)6ENg@yvgygO2LDIaYXI?-l(o20o&~UyN8!@Q)ulD7v3E9iM1GO`Q4wi>q=9sS z@rUXhxFdU6e*~c*Z=YY);vdkd7U%TH1kptjP2o#>vN@uUk)>hX9$-DomlZhN$!S87!dvq1T>jnKTK$ot^43u* zzSfAZ)nRY-8dr`si?E16k|taPN|2#O5X4fhxiydvu-cY*asr+>5fEY%EE9q6L^!Tc zQWHBRl*B}F1!XUiT0wcWp35D}2}vGDL1cWC7Jg8qfd&$ao-j$Qf&7jsWp~agfn4%TFy)NrJz2YoC5fe13^Un4EFpXro4z%WQy2+D zwP*|ywW19tp%RZZlGkgGINg-^5 z!R#PMj0D2OUaHrShP!UHD$_`xQin>_>^(zj*F^a+X&p)=&SXfnU%i~&xrVY#E#Jq~ zOg={@rrK|C&cW2UBax9J+-)im2?L5!$;Oeas3 zB9ahluq}%A`HK`gV;eZ?j zWHWd0{M^TiBhSw*%4Bf(7d2ls*iPNR2cnac7*uooUm5(=*X_}q@13$gF~`z*6LyVsZe2e+-04}C`=#qs_d z7yh=tD}3g6{fyDK&E%~tkiFo0Dc1Gge}kKNkDKTjZo~m&b&9*scjJ04TC6XlZ6*iwakuQ$4B73gES|;Ay5O0iBZ*XC# n3YJ|vYZ_w4k~P$^VblYRs_}g{lPI?P9oxSF9lyKZ@+JTP$um9( literal 0 HcmV?d00001 diff --git a/assets/icons/file.recover.svg b/assets/icons/file.recover.svg new file mode 100644 index 0000000..5addee1 --- /dev/null +++ b/assets/icons/file.recover.svg @@ -0,0 +1,9 @@ + + + file.recover + + + + + + diff --git a/assets/icons/file.recover.vectorcraft b/assets/icons/file.recover.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..46b014330e2400979ceec9cc2466e2d7a85b750d GIT binary patch literal 1979 zcmV;s2SoTEiwFP!00000|Lt0BZ`-yO{wsz)3j*I?0_;O?@31?pcP-js!%zf)Y%{hN zS<)oAiC6f)?~oFeD04E2PKN=Tfgln|@jQIa3y%)NN%X(F(*KHKT zUEO455nZr2+L*%BDRjc9AKj?ecGLnTIzcdYU9R>!Q@|vj@1MhQ)MjmN;F;?zH%V<) zC3M2@eUY^dG{4L4Ox{4ls?5v!YFDo9;P;y)G^KUBEYo@o<34_lvbCG9NOyL`tG;i6 zVIWNF;hyjdv+eI{(-^>MA+%;!y9UGr zWmIrZI9CMvdBUmGln_P~2%dwfE#QwL z(F!9@Bw<1dN?43l!Zl_JA)+M_n6Lo`roaXP1d?EhFhwLLV3GoJAv8cyn2Afj^60~^ zEMc(&DwQavK$1{YVT}>BYd}nL0FPikrn&I2uuK>dL~*JaM@UL(aS^Go1W;N^fJX;h z0D@>F0fVHNN(M9IL}8&RBa#Y=HL&v}E|D;T87x6+ju93yPhc%bD28AHss$TRX@H;! z=A3aY1jn&T0J%k_ga%QHKjexFDl~Lb#9_rGra*w89QX(OLY&d3L4jIEKNSN?^zes0 zD4hr@5usXgCKbmzhKRs`23U>Y3}Y~uOY82dyll*R@c*N8AM1tmUoSl6g*0J6r5M~w zLdXRz4EH<{F}NCeo?Q0#AXf?dlRdXe2_hNy+&ZF>_$$e^;mvx_ebBNEF6a#{+_o^= za*|;9gZAb&ZC6{<&D`%_AHN6gE}!HSNXW}&n&0n{RoVKP<6)McwxFsYy0P7yH~s&m z`+uA&^*?#Kx(QS=>eY*S#ZH&{-mC*=NN-uV^Hb6zz|48EnhfME_{qjB&cFlv z1wddu9?C7gGvS0n5#G%l6yAB6hw{MbCP8_%Te{pU2#I2LWAu?#Bdi7Pfe_mRd&FcQ zKbt%+Z-bF2NJ4y!*VO%(=cKo#nNSwr)CQ8uz`!^%7bPuI!Fb+eyHI1{%xT3lBS*$U z;F<$-lYyMW2xN`UX*`n7qdh02GoHyvzTUwrR=z$nqCv)K3GzD@>FAhlvp<+LKNA8& zBin#1(7N~ZQ1a^6eHsV>4{mZwBYnV|4CM78EzWWo&xml*&Bqbp2%)oJgz_PrE{Mm` zTSE_|Pj03w=C^%q&NU7fUy1iuNu9mU*!1_I2(a63;jN|Lf3-7ApEi5HnT+JyVx4Wu zP%KUllzT(%JcdfI8QO!JjONFz%uO4J#-qTaQ0lx^PABBuzOM4%pzcL?KwMbGYCz)n zneMp%PoZGdh6WJM>!(32>EnVeGh4P=vLch8saJI=u)-mn#qdLMEP;jIyMm| zT}Ykoy>)pT8p>qnzW1q_yQe;;PT$~ygQ-^scaee&n@X3cO%Lbg^|cALj7K@U&k;Mb zn47b|-j*OMZG-C&o`_ACYK(UME=`*b=0jS9=00*1JjUe^MrPXR>k^6(p|1~Oq#iaZ z9?&iknjXd8@0-ww{wPPLUHtHd;`7$YNPbH5VjsM_@X?zL89VOm7tODm3QFls=*~+= zwnDm4?~N99wlaelTlt6=Pn9Azb-K>%u}FM>c`=l!-ed(-yP&UW%c?8OKxpVr3GA*j zuWSP4)GA$N?V)epW$UVRaKIcaWIs24e(qDnk>}^O1ul5`x2G4~;Az$ke5Co}EC#zd z{;3Rp*cZ*oobOAS-Nf?9%keld5Bd`1zFnDsz%gWyv|>hHeNXil^Ty&RzZ#u@D7Q2yOlDp-n|Aw>pDku#)-U@2mT6do*v z&yd1`rLY-NXs{GILkbC&LS{(8!BYM#^|>6q&1IWy`;^yqy}{=bc-TZS?rKCs!sv2r zKI5g+0Xd@>e~-m&cu37YHR>_EL@jX)fpwL|xj@b-qm8$zz63D;^sWPPR^3XC%I`ke z(vyyh+)*i5eznb3S514!$JYB_bDi#Ut1&lX@xhLWLQkjz4?}ZZ-G@kzPg@sn_iYX-PW1OUs-LlPX*dM5}8SP=WEOSeSjVJqTZTxkexlcYCn>`mG zP1^4^?6)54>{DjHkc5E>rmoY*ev4?JD!6K!tE$TU*lY)NY#8+!Miu6+y|OdfjQqai N_&Y8_qsG4}006ax*`)vg literal 0 HcmV?d00001 diff --git a/assets/icons/file.save.svg b/assets/icons/file.save.svg new file mode 100644 index 0000000..55b90ce --- /dev/null +++ b/assets/icons/file.save.svg @@ -0,0 +1,8 @@ + + + file.save + + + + + diff --git a/assets/icons/file.save.vectorcraft b/assets/icons/file.save.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..ab12ae02dd8ba1898be3db86084daaca9e0d7b5e GIT binary patch literal 1658 zcmV-=28H<_iwFP!00000|K(b3Z`(Ey{wsz)8-_%^*#Y{Y%ZjdOw-)KpVh93*mS~#` zEozjM#0&i2cO*r}N|lVFouWVk1eVAX@6mI|7kuD!D*W)(3Vf>+gijj5>Gj@{MRV|YtM zACM2SL!r2)MJ`d)+fsI@C(Mh<_D_OT1aL|SHQAI5*JQ7{6tt-ELh@9L1{$(8Ww{{5 zUL^uT%93D#i;T$eC=8+zY0Z*f1`10|wGCPz1uuxV+l}{fRW0~6>5;5B15F2zr8yXM z2xSi;Nu4J0F9mNLy^=3z8jyd`fP&r@{ScToW4t2y z-qt%sm1I2pF&Gd1+0+kbVM}=uD3%T7y7PN79w1;ZJfKrG1aU8&UU?W^%sV-Ye!Glm1`267A|2NZtdYFgK+eeWBO_W29ts4RL<4C$?0xo6 zg4vM}BERDsD2V0swhtw*|7oxzgkV2S`Yh50JZm85TU;D9Weg*Uif$&3B#Mx55DZs7 z5@icyaJ1gg0%>znd&B(O2y(1*sQ8M^d`&~;uLBnS#uY)JmfIjP>+eiCrb!RYys<{| zuE^<%yJAsx2xH@@dd7sQu}s*4vqtlUaz<)LGzLY`38iY*ruKwKlT&%cMLo5+BJwI5Vk>K`Y1;XCBoR=RWBe7cU@|Arjb159XeIBw+t;@6XnNA zYu81hRE1Rg*(><1YbZkc?gO%&b z8+LpJ=}>Q+*4Mr=fEZc%7>}MRMXUtQsjTykA1=@KwXP4efRY*XRW&blSq4Ibu6)W> zXIR-}?C}z3wBEMO8=99~!2x%Wkj>b^^JDiFN1h*BR>@%VFDtTI*v`9w56nhKF{sD* zSsDD?6jg7|_fl?WSspnZkCu7ROOX39BfW{j%W-SBS34cKmiwX8k$Yuo(DRkxP1z|# zzZG~Z54ZY?)bC%-{2|dE?6QUSYvr)kq5S=;sk4^p04=GrmUMuY#92!+KuhebB_5z9 za@GJ`wB}(IC(@qJ6@sa_o4( zrc(hqq8R^xMJ;&#bnvNBi{TWt#4dzLR~Cl?Ii`%(U8dR+!0^*M4dkf0)wEN7H_6t_ z>bOW9m4fG&Ynsigdds@r`zu-EhDnPliP2{%;kh1jJ066d>Ri0{v~zz5?yE(-{Z>PM zZ8Bf*JNS|t=)X35e)UiS89;6C#SI-rS-C@V>KP%NM+K?sy E06hOIhyVZp literal 0 HcmV?d00001 diff --git a/assets/icons/file.save_as.svg b/assets/icons/file.save_as.svg new file mode 100644 index 0000000..5233574 --- /dev/null +++ b/assets/icons/file.save_as.svg @@ -0,0 +1,9 @@ + + + file.save_as + + + + + + diff --git a/assets/icons/file.save_as.vectorcraft b/assets/icons/file.save_as.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..4989edc6ff079b73caac9a059bdbcc84431fa89c GIT binary patch literal 1735 zcmV;&1~~a2iwFP!00000|K(ciZre5#eicK%1w+)`0rsQIimqt47U|GpC<23)7@LbM zYLt}33;gaoyg63tWEAZb1r{K%L{dDTzH{N>q3*pa#@D#>&b%8^bc`1qUv-`jcf6&n z_ReD8Taub^44p9QvmA9UMooh0Y#PAWk`?`$)G*2Y!*j^@I@(nPp1GnGnYQ?b%yA3D z`W=ND?^Sq1 z_#q(gMTbOjP3uyi=r)b$kWZKw6YU>4X$jyI5IVAMD%_Es=!Vm}!wW%G$9rffRHAuiRs!rQNy)&xxYH3H=#(CejmLDLWhdkrBv*rFZ+)fN?N zNx9SYR#GJxkA4isqhOW?(Ja!Gr%1AFC|8}|lX38OKiXqc+@s_mnf|v=C)3UA1Gwxi(}?c@!jh9!9C=JdS1|O0wESv>smZE`z z!2(fXzMBqCTjw_VZtZfoXVj_Zq zvbWM%L3y=a$ZWs~NghWiGCE3CKrrD!^n^)b4dhQ!RqWOo353DKtVFX&{+URHv@MN< zGI_%Zq&be+$iQ6kOfcn)=RIA!8cPyOtr%vqfw6?K3hCBBj$tGWmDB7N6Y0?hRud~E zuh)?DSLKlrEddJ!f=rqiDmv_K_78%qBO%1Wz&2q07Vd2yN?!flW7k|_=O%|Vq63~a zkn;_$k8&BqNGhY7i6f~bBpL<7m5)^FA~ZO(HE1AuM`5p+e|k=iH4YhHL*uVmB<*#? zqTjnBKytZ7CecJQX_zLtH-2M{W6zt)Ij9dd0Z4{bl<$y8e(W9hHw-0|&NYan5Vk>J_9#b;1j5ALR4*V4 zcU@{#rjb5n9V%6`*9@&)6XnNA>(E5vOomi@@8#^)HI!w_eIHUYc^{dWYQMla2UDYt zL`I5mx2UK@%|4v7t1IGa8IN*ylOrm#7@M=7uNcU}opZIs5V2IL#$eS~X_`HlPq=o? zeX>FD7#3~faHNf%GpKa9ZXeQtdg4LFE>ek*eH6RsTi1yGC`XP|{4j=M@>XjkUvO3T z&Z|o@*vW)L#~r=VeBCxs+-+S~-e_Pep$hfJXai*{BZv`|4}bDhDPqZSNkyUFf4Dr` z)v?~w8cJ%=*LJK?Wf=$!s%|Y-opEIo-(w9fXt&YLYg#r;!U1y-kj>oa`MD1jN1mTs zl)zx~FY4)Pu$^@SAGn$v#h{ww|H|N}zHSfZd@p5omgSMt@o1R`y#%=*3UV+}csXwE z_G+gi*K$8}I&v>f4SK%htZxQ|=r@^`?WM!>rnpgr`%ae zK0-?7EF~KuC3TjPj*yZ#OG!pZiJhgyBcw#mQlb%3LT4%A2r0-}%73LkmxJ9LU9P&P zyjJx(pHHCOB8rfz5$zI2nPVp-Hk}g45ykiiEONmM^3kV88pA1Si9-mnsw|ELa!eU* zxJ>C1!1&WU1>~r@RX!-cn`CQdbzCG*O2P7*6)om%x2cBK`wO|keI+y|M@&A65#Gxk zgC9HyJ=K}_!PCy&33nhDas8!@_*Q7XV0ZfT_|a+W!FObSJK-`~1W5&|6a#?okzgLzT#AH|qtf z1Q{Zp^t2@Anp62vNGr1E8l+{RP)6G?N_s=ZH+wKJhp9Pk#n*8Js)9w=&YOmsv2+b} dY#4P9qiS;3&Bcr&BY)`F{tK+NbY4*?004InNlyR( literal 0 HcmV?d00001 diff --git a/assets/icons/flow.boundary.svg b/assets/icons/flow.boundary.svg new file mode 100644 index 0000000..62755a1 --- /dev/null +++ b/assets/icons/flow.boundary.svg @@ -0,0 +1,10 @@ + + + flow.boundary + + + + + + + diff --git a/assets/icons/flow.boundary.vectorcraft b/assets/icons/flow.boundary.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..930f96c9d0b419387b96ad8e36d0650c69b76eaa GIT binary patch literal 1737 zcmV;)1~&O0iwFP!00000|Lt0BZ`(Ey{wsz)3x-6!2k3_`E4rfHTBJjZp$H6GqHQj+ zs8LcAFYtfgkrbWCaZ-wQiUMnZz!G`lJ-X+3JRWuHEEr$o);V*&lDuU+=XlXNF5K~k zvdTFNU1v!u!ZCD$)F&x*E~F;jG@E)LTd=%alL`j8y?f4gotCyGfoB#ayPnQjR~49V zK)$PJ+d%sVdPB+v8gf=LK3lUwNM9`H(1dwAXP6ft_vO~1g&eTLYa#Kn@0<7_$N`X0 zeB(K1-qdrQjlQ_?oih~5rv7T{I?ak*&vF1uKq2N=&e;N&4bdH(HO*{=DR26Y?WOCK zctiLhAn!znL~%u{LZE0jwdjyf=ob_1A2?|U;1m#AvaUdc}T%gSJv)KR6RAkd=XUk0An=lbi z{mk{j`oY8J-FqU*G)tc5Cj80GBaR;Kk)s;S*@^er8H}i8&^P&sehhvBFH5~33wnZL zU&byS$W-TdB*>41J<)?ugiJ%3pGx}&(U)y3hFwBH!B@WyrO@yVa@w}sJTW5(v$%?j2GH@0Ys%6<2$T1c{NKKkuLLg`KfsDWi z$*VQ&#>(Qzh!%l|f`N4Uj+8mfefCd+%OfF#-oQ7IABpL09!g&R(_u>p{%)EaVx$jv z#z4+DxH@XeXp6)$y6HF)OM?WXVA$FtmRul>qxXg$NWarFC+6RdlVhDj##f~0YZ6F* z9kJ+lwg`N=-1@Oze>3TrIz80$#u&+)s-R0|i$(GfMA}i+j0qCWOwfZfM)QfXlC+j+ zGzxzZO69Cg%nkCP<8^5r)U|2_M21yA-64_oF`u} zy?`{_cBxgFM*Ns}s8r3I8CuyU%KJ&{&_%*ThE(&}%h|PUC`;7zy-UsHeV}8i`2uGh zOf?;mj1*|MsHjBEJe;$|g4lY-Ue2y_MCBG^bN2HU16{ba-fwF|ELEy8SoKw!W)9{f zu55FkWDq=t+x`%Z^wDz$l?>bMLp-1-98^*Rl?a(fv5T&;jp%zha-iaeb`+hr8YB6P z%c`?pU82EG1`Q|f=#A#9riP+>W4rPO17ATZ)N7~pl&_31jHrCLlgCOCOO6XFPEg#t z%d=gr>m9A2WCndr%W74YfzY7N6U3@Bu598utj0NQH+}P(7B!P_z#Rl+J+}Y!*oTTE zPme9iWU%=c=NwAd%)7xJxSSkiK{dwz)q)?psyUeRJ(t@VmPbx!N5eemIgI;0CkGRS z=d-QZUhQh?=k^1e6%o`K!ffsQceI*^%IF!GA zky>j>M`%f`wIn07#MWBk5n3W^Ezt-qp|zH9gqFZsOE5wUvetq|Xz{JJd@J?29PH-k za@9UIYgMoH`Gmh)M15b?h;|91%(0^pn@$Pjh+_O57P;Vg>F86V9>XbWi9-mXsw|EL za!eU*xJ>mWfbpky3dm7)t8`F)*U469bX+8lO2PB%70qW&yD5j>`zu-Ct`v+(iOEMH z;n*H?TONd->RkNbY3J?`+>?uV{{@uzhHExwH|mq6{nOUT`>rh^#c_U&^M2F!LQlNc zZv=ncOy0->*>jOQrr!HKY!lwIP4I+m#0Fz^4Be+YaXsB9Jcftfy{XVWQ-u#qB{JI0 zdd^B=3=vN{S`dBBsr+!H5!rJE+7cwlXu5epzf$orB?zW4G{=qjYLP%yFmIb#T~jSf f*HFg>saue$$W1#FBgWhN9ozo^0rHM;>L~yK{r_4u literal 0 HcmV?d00001 diff --git a/assets/icons/flow.domain.svg b/assets/icons/flow.domain.svg new file mode 100644 index 0000000..7c362ae --- /dev/null +++ b/assets/icons/flow.domain.svg @@ -0,0 +1,9 @@ + + + flow.domain + + + + + + diff --git a/assets/icons/flow.domain.vectorcraft b/assets/icons/flow.domain.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..60bc6ad5b638c2f7fedad632f5de855d3a04222f GIT binary patch literal 1885 zcmV-j2cq~NiwFP!00000|K(b3Z`(Ey{wsz)8-dBvWC#_J_%opa}oPFr42Ycgw{G2GP+ zZE^ySyJ-F zI|W(M`Vf$h*db8dvNA^$?W)2K@q~UcZ2w%-h5}B6(9&g9kd|&lS2ZhJGC@tXbq5X8 z1uOEJmK%{iD5R<=sYyAdI3I&aBqAx<5 zuIPY$#KoQv zujwp1zhjI-_6qxt9h_C(hi73L`KcEqp&z7C;z2L(TGgGMMP8VA;D=EXd!e6QYXr{K zl5-H+V<(bZO}_V}>XdWui&fpvOdjt*7Y&ENsp;eAUhM_&f|`2%eSE503fO-;)x9&n zNo1!*!Ky~Z^-P6z@mn#fVtNq25Y5q0BCM>@k6=`DPul5%O3SPK;M=bdsIQ+5;6TxW zPe}2UgH*iT@@_TD*9CZ^l{bh`Jy*XI@w+ya`eQ++x0XKWD(7>R+nGzfq`9Tc%+Esb zb-j#v($jr~zzanjNR5Gff>1c8qa*Ny5kd%c*ozR~k#KCG#ClB^P$C_VC6uid-U!N@ ziHg0mrA}Zh+1G!j{ z@+gK_Y~gDhiVX^g`jRp?%wJtik0pnQufF!zBoKTZu;_QT z2t2XedOFSbGC@q8cx%5gM)JPQ*__*Ak>41RCaUz9Akmfy6gXovUl=cFYl%jq@Oq(C zcx_^?kk4IR71lw$_X*~Su3T32#qfMT%nF&;fvikM>s9(SF_PnYMLD&j|0 zLO~PynwD3xECZoI?!t%?_Mox}6rn0IW$j8eFIir30SD-SkoDZ&%X1$pj=VfKmapU{ zgc@wdZqNrQMn`E-&hdZM;8j;P2XnsHqMc!R6^@kracSy7cyR4x7RuI-Wlz;dkwU&|&kdjzS zNd`!Xt);{Rq(s(Iq5)DuYboIXDS@?=V1N|gT8ckFif1k5pHiRe-q#$PFWTq4R`y!& zPk5U})bnJGXp=CC96K8D(J6o&QH+1WA{IP19lUF#Fr1>6*oP3x%HmKU$CT0f%akes z4Bx$zK#rdIPPQ_m?ILm90GMAb*z~4pS4E$_KhYWK3bdFQF}lJL&g&gQIJgmd zsuKqXcRQaB%ZNo>og2fGZ#NVEpmwHrc3VfEy0(B6$N6`h3o?B#|AqJZnUcHJ=)EYA zz2XTI<9hG+&`r3do8SfA;0MOy7;~R)$MsZdG2Zl6s`9r~74E4DGuqX1!V6Re#*>ca zRA1Lj9LZ@gdoDp*g2zelEKbhu7#=`{f$17g={0!PlR{N++BP>;#q?OVggQ2idW2CW XeQ0lRM$E{cI@W&!z)_4Z9xDI<>P?uX literal 0 HcmV?d00001 diff --git a/assets/icons/geometry.bodies.svg b/assets/icons/geometry.bodies.svg new file mode 100644 index 0000000..1d326aa --- /dev/null +++ b/assets/icons/geometry.bodies.svg @@ -0,0 +1,10 @@ + + + geometry.bodies + + + + + + + diff --git a/assets/icons/geometry.bodies.vectorcraft b/assets/icons/geometry.bodies.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f2f0e08bdf3d64d6336dc9cebc179ebaa265d068 GIT binary patch literal 1727 zcmV;w20-~AiwFP!00000|Lt0BZ`(Ey{wsz)8-b{I2k3_`E4rfHTBJjZp$H6GqHQj+ zs8LcAFYtfg@y)RuC!=VmD7FR&ERhuN(R0VU<573sobeTIy>ss?$y>&Aj_0j6hCAL+ zR(a>q*jtc_a15O=>XRIGAx4e-v&oqcV+)pdD^kHEclXbsvDebJB=F3FuoY?f`fSDu zN*Z{gt7zLm&j)%-O3{$BlJV(^6=MA5Vg^l^w=;%$0pq^hd9;vIR(K^wywrUo1Oquh z5~6Q?@7zE0$KKjp+#>Hhh-8z#+Kjzs$!?}Oz$G9M^K0*Xj?0Fa4$hipy2O+>x?^)S z_DZ}a{1A|LqC=v%rd1(OwCh@Q$S2H;iS`eiGz4%82rXIFC2q-9bj@ki;+bHpE5}w}yB1kTwgG-jVpbDi) zl==y1THJ+xoMk}>w=;1Yg_8iq>1MMTZ)G(tXV=70T9$~vR7=aUBuJxJ3!7*tAk4d= zMY{yD&!98MwJ;3URbuu(8LhUro2$(O_G=7Jj@1veHr-5ID!PEcCDY1;Nxy&%kFzuX zO1z%9M=>-Y^q^&TjCdy49TM)32)C1f`Q#;QNTGBKa3zyMsiCVlCd;VU14<6sqPV{|fC-f(oA5KE8o&-sa81<;mZ>SwXpZg86~iJDc%t}njsdC61(43^QrZSOT~fsjD@RV;BhnwP*|ywW19tfifOzB(GMm!zzm- zJz5MF3Iv(lEl_mW+wAWImq$W~{GM&V&Ot11dsp)EuMWHJVz$fVkVdq_vj%dp#??_v z#xRmd?`Hf+A_)lx!Eogxk-7*B4s8t@h)(nE74vt;$+5;E{cB*>YZ^*>9T4<8R|H6g zTV%GlXd(^MBz0!pSR;8;6?DN|v8erZYz$Scm@qY(2{kxtG@mFdN$ZHlpg=uWDpzf4 zPsoRk*QK*l@0A~rbgL-aB9Z*qFWg@-)T>%oCz62M27&2bju;ArvAwBYLK^NGYE`C@ zJZ2p#RkPO&ty~l3{iL;TB2g+`s{QKa?8eoVrE2-!r)Kg#G(Ocnz&SfpqmEd5ieMX5 zRHA0@&e?oUTrFcSXE!;bGK--(`^A!hEZjQpk_{0Hm1^{&zDm>V!Fc)+Gp0y&}>e~(25JU<(JYNRooqL$c)5UI-IP$0*Y(fVOZmjH&J z-YFnQ)vdB#`Q0R26RYDQc~lCPUoUAsZQ6C&x89%09CxMAm>e + + geometry.datum + + + + + + + diff --git a/assets/icons/geometry.datum.vectorcraft b/assets/icons/geometry.datum.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f5ad7a74b4c97918c4f858c08fe7716193e46802 GIT binary patch literal 1897 zcmV-v2bTCBiwFP!00000|K(b3Z`(Ey{wsz)8-^t6%>nwM%ZjdOw-(9JVh93*wrHD+ zENYaL#0&i2cYJd!$H^$#DTXybV2N+{=(*$Zc;tgOXMBYl@65X;vxe~*$MeP;!W*wC zE4{O5=q*S|IEG4S^;Nby7p(^VXgu}g0s4wEHUM^uGm}; zy#lWZKLq5HsE{abXqgKX&AJj5vWNLFQT~OKngC7#p&_fPzzx}ot~f0lJQZX$yoG|< zk`_59nb6ON2u)BE#8nHXIY5gbt+yXG!BC}-E20)t*pA??1nf>L;g7P(HLoQNg%~*X=7Ch!n`}0 zH%lOU6vKG95{ALrQjGp5qviH>bG>=OeubguQ2jt@-A=`$q6-LIGObJ)^a_D}1o6nf z7T+fdz@~@eo%b-4`ED?XHCOgZLFpXkE zwpRRiWIG52ci}FZq6F=csb=2rKz}rf(J&rm!GQrx0T^wn+dLU_M?=wT&M7-9x6!h) zhg}UFtpp#mER`_ygl@M5S(rs(8iY|ACBYbKS=(%@1Mm~z2*NCl!x#a%27`CGVhqG~ z6e9X;hu`mNYW48@f=%@^!=rul=oxr=c=XK2y@Vd^pnnPv?V^ABap(~Gr>+9l6?!WT zuU=xQL{b#As)Z5Ufddf>*HZsh6zZ?Us)iC@e)|1f2!{e+{|B0N#onWt$Nx)51W^aB zrKy9R!&)vi1$~rVu=!lAwt_oc&_y|!F%c#h*LS#?Er}XP zM-f-Q0n^tnO#MZ{rnq>FR4Uf&_((mP3*3MDa< zQbLJMRH&frOi?Q+Z&y08?c8H)7##ay#1@i zuKUUDG&!UZ?eMIDoUd_t)RZxdB+|PXKaxm7P%jv+d?ZpAp~0c8K?BjDkiBC5ZaF#D zIHZ3K&3sLfwAUVse(Q=Lkjrggk`2LF8m8G8nR#Q40XS81j5+fR4-WVykk+3M)I6>s8G#bGqiLKl=p+yu8F{|RJc_8*~{6Tt1C;@^nDD? z=5|^&APug)F-Go;Z_O#J+1}O{I?L*R0Pt-{@AQcGNd$EhQcJ=6cF)~vA z!x)N*Tdk3N!$sLTuP$+CClhujZtsoeySjn{joNkPMIBoSm8&;K>nmI7L5#?J3X$Zw)Ki6Lv{~!o70oLq;ea^^$Y$)| z<*^SXM_wLV{~xK5#KOia|BTkILX>Th<3-zSlB4%k;?Uc(jazUW44v zGjcFccs*|I_G+gi*K$8}I&!Z~4tlcStgSkU==U72#c}+hB=yHPW518L2feJJ{6-qA zwJZPlCUcgO^^lS}OG$f3Nt~r5J*33WQsN#`B4;U44=Ko53hE&xbe0nKkP7Ba-otSmc7|XT492G=@{;61xy0 zm09cyDfc~d<3dm7;tE`iLH^J7}>bOWAm4fA0OFEm>&ARAX@6Tk8+d^ne zwisNB7T)V!+c%;%Y}uZ>hMc3Jo(Dn&VpB2qlmeoHg~N js;Fs8SCGesRu9msB=^lkjF@b8D>nZCMj#n_M=JmTczlrk literal 0 HcmV?d00001 diff --git a/assets/icons/geometry.import.mesh.svg b/assets/icons/geometry.import.mesh.svg new file mode 100644 index 0000000..ce11283 --- /dev/null +++ b/assets/icons/geometry.import.mesh.svg @@ -0,0 +1,10 @@ + + + geometry.import.mesh + + + + + + + diff --git a/assets/icons/geometry.import.mesh.vectorcraft b/assets/icons/geometry.import.mesh.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..aefa82a63d19a7b0b684970f2bef40dcca0b71e5 GIT binary patch literal 1751 zcmV;|1}OO-iwFP!00000|K(ciZre5#eicK%4MWsj0rsQoimqt47U|GpC<23)7@LbM zYLwK(3;gaoyg8QRWE7or9Tp&oMN&MUzjNW?A#c4)#@D#>&b+Ur=ol|JzU;gyJn@#Y z+B=J;-jdXWW9WoYpX8{QV${T+;GHF5Ytr$}jIJBT zyV;twD|oH1Y1cyc2YN%Q78(jxF+N|jQoMA&TtE}%-GX6W!niND9xdg(HC~GmFLd7o z!9WhUg!~)dJM(A$)Z3U3H^@5+BH5%rZKqzlV%PHmFcT1n`IUEeiK~{F4$j(kzQUBZ zx?_7W^(wp}{1}jTqC=v%qID@ybel$W$T!Rv6YU>3X$jyI5IVAMD%_Es=!Vm}!wW%K z$9rffRDtLbnh#U`YccyDjMlry?Zx&U`wi|^5}laf)@%EP_^9Xt0#{5c6DIu< zf_)(Pb0NN;Xg~q9o#pN&ylpw!qchGTg9k53Qc%^9pqBq%RrImiqrf{@>b4{jtKu zm7|sT+B|%181_=nN$Dsv5Aq1C(L@KNY%$OXP$Vrivj*}W9BoM^C*X-<0UtOR#0B77c#wbLXt%x3XP7E+(&tWG>|~_1aWK)jqP{w18b5(g_M2o>ffgqE01d0xOoBfU8>O=^UKd=qhpa}Q2 z4<#@D?6K=+Y3C-#G@=8ZHISDZT%Y7JhLJ=@Hxow^Nk}*fhASV5)J0%$Xlu|wbb@NH zn7?{XPBji0UjyT>X(;V=#G>E3B0zGvMP?_Ba%q?*H8g%>jpR*T(j{}nqPFp|F;wL- zVQMrJYH-$QK2cVY&Jm44fd-*edTnY?$cLUcm2*%ZR5_3gt0>zck^I;@?k^Z>W1VXd zNg!;4!1N$T38?Ri=?VWF0D1v)2r*T@&TQq;+T_Q7S{Kz4vlnuv=7AqGlh?+2tj1wTy$D-QTW5toj=N1(**!+tF5;fS)x`7W|O-^D^&GCO_@MB-MM{~aCGCRxi z$kXv?nFl=wx$g^dG*NgyZteDJPe-ohe(34Qy)ZTC`I57~85E*lbG#8}&Buz=Z-2=B zG0`6MvVrz1X|UFz{Ou2!vy^Ovl+;;DIzmd~EF~EsC3cn)kB|~MONmBE37w^cBcue* zQi2gukh7G3N_{Q{yE(dCbq{&1>UBP!K)Xd0Ayp&VC5$r1jz?@dC6E(}@po9{g6C(W zPmMH&r>G?kAw;UOI2On$WwhZkrAq+gPwy0vlj>I4p!{xGiZ)Ab&882~J*L%MOH_;w9;UnCL4aVvebwAyS>r>HU zedw*J3ihaq?olN&+Rb{wDnW*bCp|5R`OK-jGt!Fexdv&exVIrLi + + geometry.midsurface + + + + + + diff --git a/assets/icons/geometry.midsurface.vectorcraft b/assets/icons/geometry.midsurface.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..7acbc931107e58e5d1589eb605c65dc1703f5e53 GIT binary patch literal 1693 zcmV;O24eXiiwFP!00000|Lt0BZ`(Ey{wsz)8-b{I1=xo!E4rfHTBJjZp$H6GqHQj+ zs8LiCFYtfgkrbWCaWaZ_iUC`Iz!FLE9zFNM<573sg7GyL-nsXU6oT=BdP}Mn8VXi1K3lU=K6AO8Llfp=&M+@w+}AsgmTKA>ujPnWecuGZ zKn}2^_*>sQ_s{&Pw=oyD$U6@r)zn{Yr(U~aH?smD6A*~`wRgV2RZC0L!r2)btzGZO(Q$h6XwNa`$tY%0yrfELDo%$1=)#iIIRVqOU4B6 zprKgNs^p~Ji41^{rXiT)8W@E6C`_UeY02J#Ruu?rFxA@Vfz+%f-gZ0PjcWyG*W|#+ zmQ^6>0c5F;3Ocyb2bZK~iTq2!F4SF?1Zfmcy}7*0QJO@lpMWs$hL&OlM4drrfg7n* z*41+MKNzidx7(}jBjy?mPfqm@w6@(`Ug}qcmtV175isf35OfQ6cqLy?-oy1YdT<}0 zy#^GUCqS!3#adEo$^nTYNpc;!a&5z4Pg2id=*L+Wgh@|f6y^bn)9uOh75aJRhk4kG zOOO(86s9}Bv%XNYr?7lqVfnto^drw`Ec)L&o??67J*J?SCv56$fj7R8Ea zNqr>z`YTX*^(4i>NyX;4x{tOE6DGn=ce8w1f##gpmv16@SHE-hyS0`2V}*-rN1gk< zw*6ku_EIlN=_oS~@(4WH7#h-k9P|iKq`W+{2J!*iW=SST;E7@hAu>TNmiUf@;|e7) zUZR8dvM5BM(NU87C{IuiB#=Ep99skVom3UOaYh15Ol;PG zJXC*?;iR{vkx(XYIDz!UF-{K5B}*k!&UoI_wX3njkveBr3X@IFcwr!cj0>`AC#50)wNsh8{?t>)0#iua1*r zjYGxP!1!w#DtjHV=y$FNkXmk$N#aqi4AZ35#&4{Vysb;RWUg5B4k9*&sy!x5jb_3g zoHd%ylvPAHqA@7YAe1VvP3;N!*zu-v4(fvq7E)mqWjiE_AA86B1w#cyxCW5~!Zrv@ z_j1HgB8=@#^%Amh*QHix8p%`Ep;I+`&CuF4QQl8lhb9uGDx}(bFK0Kdp)A$zd!L%A z`_RNx`vuN9m>PA&DpCZyMMWoS_Tii@7R1#u_HuTUBWkl4o3mf67|6oHxlUn-Sn5<` zuB)FfQD56M71(V&(P>O{ysid}ZCYee76kwYCn zjG>sk)f&kcT-BZP>JkrjGQrSsM{hJ=w+$3!Ti2C09N0>rL%lItU)#zEVr1oGI(e!T zvE;a>JU_QAc){jh*1`2)JL?8Ma5XuKK|RNRmBCM4-5$*OUdrq&%Oj`b(J~Ku z335LaUTfn{+MVFdf7nx zwK7=iQ2y?R%vnk{LQ3i^B^@Cpah8&dkPL=u@K}!zpTs zLkN+sERF?oOc`ysO!Xyz@uznh$We8xY*2nT$yRQ4T%=A)!Sb6GEoQCQR730ii7aqe zNsXxylTUJl_i~>Y96Sg;)d}~()6U&-wyzfP{tFrTjn8b(Zu`^Yz0=mohfY+G;&}g# zlY86u3Z8kdp9%i9nY>j6vKRb*#Jb-5J-CS;a1%bmjoe_Yj#2mNPFzn#i}j&*PgU@M zs^}3_GNawB=d6-s$avDxl9+2w)h8gW%${qImIhK8Z8tCJH!455gMk@L&2cNgY9mk; nEJQnN8fwPUHPo?T)E$hf$*q{l8D&O(-?9B05qVmh5GViu7BD#? literal 0 HcmV?d00001 diff --git a/assets/icons/geometry.open.svg b/assets/icons/geometry.open.svg new file mode 100644 index 0000000..de5321d --- /dev/null +++ b/assets/icons/geometry.open.svg @@ -0,0 +1,9 @@ + + + geometry.open + + + + + + diff --git a/assets/icons/geometry.open.vectorcraft b/assets/icons/geometry.open.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..3be04922375cd751d57e1970311c57766e4d3853 GIT binary patch literal 1724 zcmV;t21EHDiwFP!00000|K(b3Z`(Ey{wsz)3x?ib0_;PV6xp2PWqNA)}Xwf+?+_9F> z+PR2aXNhaf5OjjnXCZaTr6%4qpL!r$(xPAE8V0$4c+Pj7j&v1#0NnJfVkp2 z&$;lXp6hJ%#hve51d(V`S6kO`FI2dk%**bXF;k86gG%RJ18J6t>F1RAe`h1I+$RYajN_@iBc~C zJM+8Hi?b{U;dah%qc9KrINffy?oL`POM*0tm9ktx0cFlDDZ3Sr zJ%!E!HQX_1U-Qxbprqd2Zm+kG*l!R#>B=8yZTmUDlym`sE2@kMgMRfxaFAr`UGw+j z4FUI^d>RiM{B*BHJQMhP4<&~pi5>*pr>JO)OKDqxE12X)4Q-8D(;7SfRf8l4^b4~2 ze@85|N3NW#?h^(cJilkYM+5AcC;C3j6MA{(g?Xs#lla0U+CH*#V4n14?Ze62XEPVZ z@XU-6PvJ$fssH$Cbq{?m7ka`p@DJMCThtXREQeL0`0KC0`t_660QM?6N7X~PZ)mp% zRE_dw1xB_ql+V|hrTU$V->s?EA1hScSh|O&{K8WnVXpNGmzFy7AdkQeb;$6g69x)_ z9|;%DjDdWB8Mefe6YxYahY;x%Eav!5gkuXO(eYD2iS^Pdq3lIdBPg%dbCE_^A<3f9 z54DYw-1GCqS3m;Z6U4DGkl%4t(OYXIkWa)qfaRh1i!>+7mqtRFykS`6l2$9;z+JMG zGi8nEJz3j2OB@NSXlBxZvjlL>GcjWzr!W!(a?)rdaz<-T0_i-)NM5gDyHJ%UMzk0_ z6bRC(NFeDj_u1bts!oIuc>~{oM3_%+^HB2Y&mP$(<-2Ke%pxk_83Vc8p!%dKqZvs= zbklJp5rl-JVA%4J2wMaihw=smL}jh!hWV>!_*CZ*@iox%H4TNoj#%`2TLivXZhgID z^K;>tIw#cg#u&-lx+F_#i$!i1W9_JN#)PT1OsK#aqxno|g*!_$8ihXyrDE2m=7fCg zSyNdD^}%l17h%=Uc1Q$2<`ef91jU!mHi#q;wn1TfkRyg1VQlWISCEF=F10e#NS^Wz znW~vvhSau+@?p|Cbde|(A=P~LGJ0zp%2GLfA5t@MAL^KDzQ9=rQ*Dk|M2cXysK`Xk zJe1zo7K-ehYcmNL~CtokxdGY9ht)wa1$ItU)ay?zvo z^wCQSOfa0d zqc@tb+Xkw_t?kMi4tyn$pwHmZ3|%7zL!;0_$J9@~F@>|@1|=f~!yG1&a`LcA0< z^KRe+Rg;q#lwzwBe)mJ}jfwVPmkqSv2!}NexRrl1amA%&I6aH=y z^?g|*+9ix4$BsvAIt7puit!Iv#DeE#qfd<#hI7;shY%uJSsV-Glrq|InNlTy@uznZ z$VqjpY*2pJ$yRQ3TqKT4!SkCHDQ0cAsfOPB6JDUc;uaGUlTTd2dAaXNjvj=b>oEN2 zY3J_b+Y^hp`b39+WHg)8JN4bg!D;K{L*G@9;yB;OA;0N+1<$err(tsPI?dK)=M)=o$Aeh0>47L2TIt*38qHAYOL$oYeLmeBW?m?=?cioJS S$TRYXj_u#ss7ES`C;$MN3sar| literal 0 HcmV?d00001 diff --git a/assets/icons/geometry.partition.svg b/assets/icons/geometry.partition.svg new file mode 100644 index 0000000..b567193 --- /dev/null +++ b/assets/icons/geometry.partition.svg @@ -0,0 +1,10 @@ + + + geometry.partition + + + + + + + diff --git a/assets/icons/geometry.partition.vectorcraft b/assets/icons/geometry.partition.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..186cccee0c8f4ae3666f75972263f65299d23678 GIT binary patch literal 1733 zcmV;$20Hm4iwFP!00000|Lt0BZ`(Ey{wsz)8-b{I1=xo!E4rfHTBJjZp$H6GVr(w5 zs8LcAFYtfg@y)SZC#7g-D7FO%Eb;9gJ$F1FkG%J;8DHVfJNLejqGP<^_`36^@Wxxp zYVSOndJ9q$j-e7-eUz;(M5~E^mY@01wq!-WA~g(h|IiOjy^eMjfj$euR;1(Wvj%f0 z6V+3%uW8pp<$HQZsul_gRxv(Xu~KxoT+E>en$H>LCA9l|@6l3@TH}>y@j};45H#d~ zN=U!+y>tJ}pL%QaaEH9}Ad*G;X*2cOCA*y!fS73M6e1*JAWP7_GOjo2$)N>^B&CPSp>Tw*6c@D!PEcCDY1;K|iAa3?w}B zuf+F>f6iN+Um0Gi!c>h*~M0@m0 zvJpC{p&fG7WSu^u;6eW#^?fzKj(Vc+Lp`CNXMUK6T0aSrDlz&|l>_yp&#Rvd$cuN` z1hb#!*4o&%-tCUE){3|eb^(dpj zK*i>`dRTrN*6rwBkMd~=igF?wiFJRWf9LXdV=MK?3KutyD)zN*eXUh{sh6a5l$i&4 z1g2zMI8ufbXap#dW|mn4c?Yv(K_*AwiDCgEG7&{A@Er-q6-r{(GYKU&p^k#Gv$|P9 zd9j+yu+9ld7KJD@I!baM1Vtkwg*_j)LLJM^Try<>$;>1=88pa-(zE_YQ}`A(M+hpS)=(#Sw%WWGzJA4 zxKcT5Q+q<*_q?f`o%$fVfuvhS*%pc9$A04ef*~W;xjK;q+%^bI_hQ6QAdKxz^%BBx z*QHiP8p&hUp+Yr#&CuF4P~Hz(hb9uG(xuwZUe0b^U0JH8??Y%N-$Ub5?H4#_XKK_D zOHUDO7Znw#*}HRgeN9{~V=rbmF`_byu`&C_l7TGTId7B=5epS+3|4&=rrCq}fNR&- zCmlGC;eI^|M%w5FgA|18_8}RlCmLkwLKO(vd$G&Db@k|bF>pPNf*6tcm`)x`MJzZjsW^9;K0Kap zlT>eM4Y@9;YdhAcv<$cgbpRn&opEWCsmB^z&~B}ZSF~)HgahUvAe*t#(_jyyfK zNN>UBUmT36#&*^XeBf$w6oYDv|0;tY`no+B^F5c@S*Ax$$D?H&^c>{AE6Bk>;rY0= z+pC?9T+98?>Bzk@Iq2Dfv%VQ5qF-^m7H77Ba-nCSmc7|XQNMzG=@{;5{D2Xm027MdH^EkJbzCHmO2P7*B`s!cx2}fP`xCjweI+y|TTDKP7T)vS z?>Tr7da48MgQuO_(`#QY;`+*zxb!ufvpancX799h@~-bH2ywjct}+$ ztS7H!g6tVDZ&~Mi{|RoQ9d5!WxDgwSH*MR7GD=B_i7OYR)P_ zhVUmnEs1&NR9^UKMf6;Qv{YPZ5;r|c`h|)sn9wkTp*e2FHAezj!J=ztO+!svx`I45 bw7Q2@HM#3%V#H*#Te0~Yt1RJsASwU=%s4^j literal 0 HcmV?d00001 diff --git a/assets/icons/geometry.tessellate.svg b/assets/icons/geometry.tessellate.svg new file mode 100644 index 0000000..7111335 --- /dev/null +++ b/assets/icons/geometry.tessellate.svg @@ -0,0 +1,9 @@ + + + geometry.tessellate + + + + + + diff --git a/assets/icons/geometry.tessellate.vectorcraft b/assets/icons/geometry.tessellate.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f03e24c1569d483d5555c9310bef1ccd7c369aec GIT binary patch literal 1857 zcmV-H2fp|piwFP!00000|Lt0BZ`(Ey{wsz)8;0Ir0`x=I6&57x=&L_-0$NlToxY4A=q$mPqRE(cQ!2@u){s-uH*&=6{LOmZq_vgppE~DJY=K zxhF-t1Y=L2Ge?{dY>L?d|4fb71`%!INY81FcOr5WFXr%)-%fQukq<3-NgG^9 zx(g4MdJ;8cC1!QM$2Dq;}1B9OikG7uACP~Jr65Z@OOUA>o zk%TRGECqxU-#ZC`5Rjbs27&zxNE;pput&-8e@Y&s)*nig z-&zvGRg7>I7tFO@;=)pA2CE1VP^So za*9QKUrrj0M9ye!6JL_Y7|Ht;>`BYw#E2FFL%~3L>)}gtm~-}5jLH)sgl>-;u+QSt z+dP!K{i8#+d%o>7Ipz@+@Qi`HTchfvDWfeCi|D4~NGuEz41!^6k68G^*Ekd#6cDvb zHFwOP9mA)RL&R5K&(|and>ydpceV&TvD|vPAmC+!m^vHO^Trs-$EqL;YKuiyBO*;y zIb(uEdnQoejM01}w8X6?8jZs1g;FtV6LW)n?O0t}2lZaD#uH)HOSedbeat8B&j>1f zt!)sAA#8)f{jVbM|*j3c65h zy}j0kSjbePx9ZC@%^b`Xs%&$gq!&E;yZq1}$kBHc3KzE9hq&jSuvY~RWFll9#V)(X zHljbtkpme&G*NWkYK-JNDyzOqR)q+=D)f~`}lT0Cnlf0z2)^mcP(v2354wX)axe8Sry7+vuZ&g*@ybo3zfT*u%?Pdj&K-eM6~Ux4v%*rqf3piYmUoVJd> zbZrSKj`Qz0-ZyvLmhi7O_y-~dxg-3OQW%(m vXoed8)h33jVBR* + + interaction.bolt + + + + + + + + diff --git a/assets/icons/interaction.bolt.vectorcraft b/assets/icons/interaction.bolt.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..50142c25704cf8706f52fbe7a81c18a6bc72deef GIT binary patch literal 1823 zcmV+)2jKW0iwFP!00000|Lt0BZ`(Ey{wsz)8-}QN2k3_`E4rfHTBJjZAqWgwqHQj+ zsOcq%7x=&L_@-EnlTmcs6<7l}miTs$?>QciN8URNR;_X4oH;inZCI67c+ogxc&lp4 z3g;{sJ4;fK3PUBd`XXAL^Hw8wGM%{4He+eKCIt*~|IiPOorX3!fj+copnuvx`DD&= zK73oyriQ9d^p4~;6r?O?)ojf&-r-_7hay}xbB3!7+Fjl|G!tVMc+Fe9R&^r;4J*LJ zW#75ZnLBaE&PG4nA?M5sM3H*hj-7hNZf7aspk`}aT{~wBoYzEGRIILND@?0eRcx=u zPL4OEIt1hcuMjA%X_0Xh&8FlPqKE!ry!=x|Y63Vpgodok950asul{; z70t7X6rD&96jGK1SGY(CACJNy5|NbbENGsCz!FnQg#uEu9QyA7;Y!Y-q7quJxT;Vb z1+g0e)%?wO!zA&1c%Adtz@K_3jJMnExRX^k6}u*u(vpb(#Y$R|L|z<(O4w9E0b$N9 z&6*V`djgdyF1cZ_w&0`x$!O8NZm+hFv|nQAIhJ2gTDNolDAffDTrou^40;)ZefSgi zivK+Rjt&;YI|bc4SVo$&nq-nTKq8dH`SO48bt1l|F#awZC^%H$p`DUxSMZoInB4S6 zFjTLw0K@$WE|xjh*R69Fa{s}9mvAH%&M1W;xqsRDz_@n{E_0fPk}5u^9`85GXdi zsf(r&`i3)eN+R{v1WgxCH4Rfg%B(pV5PZ+0O1CTpST!OG4RM9*v;9UeCo|zzRtc_{i5B zMbcwv|G{g#Ff<182g!4GYmEeg%+OazroQ;ot_&$#8VF_dwj!{}u?%5)=90u*Q`UGs z(6z0xgn?j1YbNd)ix)_rZw%xZjd-4%G~H?=X7qvO#t6xqHEi4S>`0Fmf`x*DbZqHK zb(q`i?*!*ZLI~WRZNTn`Pj7Qq^7^k9+wRo5X>y1WbX)eYh!bTd}^yQw|45i z6blk=6(t=Kp&#>!`zwYdYGdm}B5>OvFy4z1eU30RH`NOW!)=#Z8EHgMS%(bO%$cEu zZJ@j#wDwITh=ofvpS=~kwRL5&oW2jCnRxfLPc>iQtevT*BNU#(>lPImsF}NSwpb8b z%h-$Ab&M#@Vra~MzG5H?H@0AWt%#)zHF~SQ4AacPe8z=s>=XB#MrdRl8_hR$ z2}e7%?aJ%-Y{iqVUK_0|ZDoLBc;;g~dMXvMs)*vz^?A2=T! zr9nBy|5byZ+oC=g^PS4<4AUbor$@s$=oHHRn398m!s&EtwpV*O4*WSYucI{#9ZvB^e+kww4kPkP=x-i3Ugs zt)+wmqy*Mdf&o%|YbpK!DW0_yZ-5kJE#==rpR3+(jxJZtQ?pjqTAxp#ZV^RD=7_q0 zQN-BcfK8_Wazrxz0gG7h++^^nk;3p2xx_w%KxP()0y!p))?cPn3Sju@odj}J-YV&( z-*vDxH99U5N2Or-<%*`Wy4mD?>;0K5aGP_+M2pd9-oiQEC8L7}p)YkPe(<#O;iidL z#MM1Jep7HZXLstp&faP3=wsXD5aKxB$6>$e@A97cUB3`~vl+b;39=L3AT!SQehb|M zJG$|o(GA~Vtd61k + + interaction.connector + + + + + + + diff --git a/assets/icons/interaction.connector.vectorcraft b/assets/icons/interaction.connector.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..089c8ee45c7c50b3e1e53870b3252353e0d238dc GIT binary patch literal 2038 zcmVt2y-h_TWl3;_i;VE`C=4PINzTqK&2wN_Vk-5afYdC9?{|Q3A?HA-gp?~T zswCpS81yaPk_g2?ICf_IE%o9kh~4P<`FXtIRW}v8BR$*-RuBhf_(12)5(EVjzj;0o zPKkjymVcnNZfE>a&IabUWJ=a0{EsGR>?IQyv_OmPdzuEGhr%F@(lGFW$l69z8x6p@UNHtd`AqoO+%&vsg7nz_-iJt2<={b=D@rxFfAnyYxVt~EGmjo> z4{pi0cccRe9GPP}Ni^S{Nl2<>)guB)-WwfSvYgdqE-hAQIj8r+H0vc6Y9@J3%bJ_X zgLC0eqRt##FtFuevj|XPb)p!r0y<*+nki`=F`8W%t90 z9YG%NyU&K#0n)y%N@NFf?(2JQFX8U6>~|hRFA=H^I$jdkdWp1K6AM3|Kkax45Hnoz z1c9{$AN?=J)u>)ib)i5C%e~RI;|UQ4yk$p^GA9`KxS$xo-5Ed_U)1~kjyA&YLmR%E zCa$0QN*$3WG@#WXi5+dkud9xfM|ZT13*z0MghAw|F-p@AMF?%(Q;^+B5P~zH*mZ;0 zkK>nDem?Rz-HB)ipDL9-+l+5xjC{TFLE}+`F2ZC zvS!ES)hJ(=;G$M;#({GG5`SlMkl^F}1aVQ#a35S*U~A#gjkfxM8rw|OXe^LL9aA$S`%>C=b`c*a03*SI*z zWwb;h5#4kgiG)D>K`?CP5eZ!&jYC<30;0AU=8E~Jt;ngyA>u32{u=wjUI#4ttt|pi zEVo{y*WXkarq1ZK-xwo#U(D%(*T9ARi~s#mPGt^~+T zBYMd?WU6Ma8CuvT%KJ%c*F=I?gj93yt=NNYD2t{0Zc{Vy?(3LpzQ9=rQ>~6rL<+Q7 zRAi!N9?seAEwQzXy_{X=h|(;E=IobC2E1@%T_VwfSjbePv+Bz<%^b`%E^Kq3xD!0O zm6`wzw9!ij#V6bCL)1}E&?({hG7&P5VpnZ#8`1Z2WM9S)Z74c#HAeCk=S6G1x`dsb z4C*@W;Em?nx`dO%+IHpjJGO#ksMkj8N?REq7+(1pk6tQ8EGj&w{5W{LeZ1I|CqL2x zs+>Tp8&=A)41@-GD9TrzVPzAjNtHOG&000D=)7bC4wwUntjG3_kKI=sIX*ToU%}>| zAJ)pwX4Vbz!1?GT3Cb~kR0&?UMcte8y_VS-mPgJfN5eemHH7;qBfW{j>&ez^uXaA+ z8t#YAC)^udgPtxb)|Q<@^t%eL`MsCEBK3!#Qg=wS2feJJ{Z1IHaVY=rQ)0~}8NemB z<`NI!5?OPJ2538Xh2b2v#4dzDRu+c>Ii-x&U8YnC zVEE~s1aeZ{D(RHpb+VNj9T$l^2w?f;l4jGoS?68r{e|4(Hs=}>Jx15Ohx2;3sd^7W z&vlid_q22Gu9dpR$uFW#XY5g(Oz)kxjy|?b zl{2sR{vWalc4XrpkqzHqEKgDQ`A%HVB^KjDZzU?UBdXv)R6L_yuVyUg!r<|wrE{X6 zD=Mz~)I57GfLqLOp71+9b9ztt&2Z?Lz|a-0`PFLzRl%&Or)5cXU%G-iHuQReUIlq< UrhLTcd6)3~F9SB7B)2XA0EH{)Q2+n{ literal 0 HcmV?d00001 diff --git a/assets/icons/interaction.contact.find.svg b/assets/icons/interaction.contact.find.svg new file mode 100644 index 0000000..0a7781f --- /dev/null +++ b/assets/icons/interaction.contact.find.svg @@ -0,0 +1,10 @@ + + + interaction.contact.find + + + + + + + diff --git a/assets/icons/interaction.contact.find.vectorcraft b/assets/icons/interaction.contact.find.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..065baf0ce49ddbd98b9244633f9bd661250873df GIT binary patch literal 1960 zcmV;Z2UqwXiwFP!00000|Lt0BZ{xTT{wsz)8-_^gHNbt?ZV%VPZM%!z;ts_kFld>! z*~p@*mrdM-|9gjTw&ge}MLUNUZGgZMNpT*|JRA;({2r`Cv!z{d7kpzyCz_(6t1g(r zThnq;1$WUjShI>X6e^+Bud3C1*=iEb@>vLNm!jymtb$IyAHPG>pyOT1;2U0b@O{xi z`K%CC2amHAua@v>U-7PmCZG5dD_bZiL@Ap2RxIU*pVtd0qD{9Dv{^#Cuipc{RDD-; zD_guXbrS>)8^9(pJcYqsI18u2&OSV$;0{Ns$UN<*LAw!;^MXlm^DS*2g1Z$hTV^X7 z(YEsqH68V=JX<3%w zG>VO|+&}?g!6RRG8&LKPDhpamVu)VR=kJ17hu8i6{+ae`3SUn350tk3LOyDBfdV(e z7!x}EN`N2PECegdPSq<4XK8{WOwuSvG0Bq*YDM3f>Uf4p7N-f0!z@Zdg6}PW;LBDB zkSSFq`-Xm}m*K<#|ppK`A-<7*&sFX&zw+ zp`^uwr&&W|&(K)XUFv7H^pu(7JOcXI^%80FV1ocfidva7kdH7k)@*VGo+y?OA{#Bl z65o|@e4!*Zcu-Jc8^&lTC!vHBly}>O+VprK$s&S?wNa9XC{K_9f@KYkV`m_L1J5WP zy^%od7F)-Y6ZIEaofs~SgfjW5VX&L?4EF|f$x^8)Z#*CP)|V`Cq^x2!lMcv&;aNt# z&Oolw2*!HSSR{HzTb*D{9%m#!ZXr)mF0b@xF)$PqWaDtG)#1+BzcN~02_Xsx+<;Ao zoZjxPbn6tOp{9%F%Hie$on0wu9`AdBZ=~E){i7gA!HN`UwtIX7TDr2Y%oB~ zmd)KT|LhxfEjg5b#df}?MDcaRqTl->Kx(-~c6W?&MNAvZ*?HrP;SD4jrnwTZUJ@f%19KI;2RHDwpa$dmHiS z>&j9+eUG7;dMDPWx-W3v&eWPCR-OVM78M<+xw~_*S}|W{oW<-mM%1(z8?(RP2#`fP z@6EAQ#9D_MgH>OLY3^XY(8@RVNe9kjxJQrhNRGZ2kaqChJ|qM4M1zzl(SeY=7yI0| zz8?K7Mkd;SSfbdt)fvfew5)pX)g>P6Wbkm}j^1eg*w%1{)%vcyWWW`yUA-l3sJSvi zF*5TpoxGHaSj(KSJe!;zAMXx{sSmt@{1();ov3wM23&(ao>O_GQE3xM?bWp4-Odzm z`LY%Y4$whDwtb`5`@WPMdA)C$)6!XS)7XvOpbuJ3uF|0H<9}6yU;3)O81uaq?Hto1 zx6`9z9P}2-{aCPzfx_GA)@`qLJLNj=hi<3bdz*uvuN%?VgGBUC4c*Bb7?+aNzx7530Ro*Haq~C3@l{+05siRV0e!bzvyzO@7 zkiCCoE83URVyeaDi)<0R-QAsw2cfq*#J+gidAPk1szuyfD3n(s=L_*4aVjgbKma7^;T+e zKJ-3b=s2h(-IJy#$tRhL8BezD}=xV)we4YR$x uH`dBazznj2Mc2;jn%lN~3wdm4^&MJO?5Uf}9+UlP#r|KZguRPIEdT(%SIa>F literal 0 HcmV?d00001 diff --git a/assets/icons/interaction.contact.general.svg b/assets/icons/interaction.contact.general.svg new file mode 100644 index 0000000..3d2839a --- /dev/null +++ b/assets/icons/interaction.contact.general.svg @@ -0,0 +1,11 @@ + + + interaction.contact.general + + + + + + + + diff --git a/assets/icons/interaction.contact.general.vectorcraft b/assets/icons/interaction.contact.general.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..10a2287b1ecece48b1f63a5b8e5775d5d2688038 GIT binary patch literal 1940 zcmV;F2W$8riwFP!00000|Lt0BZ`(Ey{wsz)8-^(AHNZY}UC|Zo)}kF+3_)PfGGlX* zMNKbByukl`$2ZwZoQ$HAVZa)|vBbA~{M_+)Jo3)Fa`=*LM2lCt zZi1j;4e$hvTi-kLXa3aNnulBDoduyR(oego*R1)?Jf{NRd_(Fh@9dHk4K)=tZ<_g< zu)5I|yNjt;kS(o`0r?;*B#J9mE(MBqTZszU!~8H&{;8%71)KsxOE*VlFERi^s)~}DlsOgSF&IQ4Qj)z(RtRbRnUhKw2JcES`X8K?{p;>x_kjJ1K+mcAg3_j2h(|>i5V+=AnK0-% z2Kz{7K4@7CDqoR5OJWoTI0-Wp;Ve#}mUpeLj%EQ)qa+R@KMi9a2Nwo__hrL5$P`qG zv0>aP-jDsDqpnm#Ka{GgkB^P+0Y{HP)1yE7!ybo@4zM3VhYry{{B7tcdML>Y-q58o zb*a6AT}zv8)s)c=AmNH;#@r9*p~usF9kd(@bw2N)+Kw&Y{d-1 z-)GPZ&L9*CvbF65=xB-f*O%bFz{Vnkk0<4-FgB5Dn~24CO_q#lqd53HWf}@xZyVuv z+jt?{K%tq4hnDc5K+NsFMD|f74{f8@S>&p-l9$wbHomc+r9RHECOk%xV?(&AJm5PJ z2K$11$DmK(5BGjKnS}r-h~q3pQHaA-RL6eeCn(GOD8g};^vq}b-qPu(vnaq(g0YX% zFp495wDW1!q0OZ`ljjxw_# z3&C=Xb4AK-0*wHL(yCHxARl2;tmxzfJYggtgl1`p1ilmDxI&4|N+Y2}X3bMj4%Qtj zD6cjPxqEU#l7<*zqoX+UQ5GW&BoH-06j=lL9YRrliwF*X>OOPUC#obh~M8&_kALa7zQOfoQ*0G>sNWDVpLMuI?18iPd5Xv0aMjK>v>>+TmFP zdA%j&NmIr!5=-x9{75Vb!J}Zf@)1j21O|t;1`R~V_x6hUtE=g$#v%P{VCHLrrM-?= z^gCAsNG`X?Y^6{p4by~iX5LsMc~>skio0S_`?$y$s+uu4F`B^|oHd%Sj2EHnAt!EJ-U7Y}SDP_Et>t*>ll1TiA>F`Yb?idc!{vN-3Q?jO(k zoYV(aLTU@@nwD28Ed#DWo%6{Q(x|ivr0gn^vv#YCH*8sP2?xwUKsIBer^h~)9C>G}>^P z(kX!Pr*{g-NqMVukbXD8R%UfvB#%nL@~bt==S{mUhSvKNy(C>BG$vb2zK9my%U$$1 zdJy_t=hsJ1JNqjfzFfrh%|vmxa=zfV`o_e))7Htyt}P(M@%|g<^0vP#c;a{cOv&|j z@=hkmUho!=b-wrC;3hoa20y`#*kG(rQTOwmxIPyx)`#BvyBs}L;RC8fM7!NAcp=CT z{-k3|YMyH*FL*Q}dM-g)BJYJX-D1hEnYi){4bz>tfYylH#1yiEdE3mZikY@-19@y{ abqB3VdfU#$h{^7-V)r+*0}C3EEdT(ug}cZA literal 0 HcmV?d00001 diff --git a/assets/icons/interaction.contact.pair.svg b/assets/icons/interaction.contact.pair.svg new file mode 100644 index 0000000..c2cc8ec --- /dev/null +++ b/assets/icons/interaction.contact.pair.svg @@ -0,0 +1,9 @@ + + + interaction.contact.pair + + + + + + diff --git a/assets/icons/interaction.contact.pair.vectorcraft b/assets/icons/interaction.contact.pair.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..edd52108621bf3c9d3348553772314eaba6f57f5 GIT binary patch literal 1855 zcmV-F2f+9riwFP!00000|Lt0BZ`(Ey{wsz)8;0Ir0`x=I6 z7%!c(aO$jRNoxX~FzTBa^#(^x+*vkrVeFFU-G-JRGkn@7q^9^6(gI`t)Xd-pH;G|x{xbr)QErsloY;eSD z)i?2AU=7$1!>#L_xifd_Z1u&h=bZVWXi`_Zsne|a%{-?FZoVP)m2-AUiiYZrnm5gS z4KN$kvAdW$1=-U27?6+HAy8bga)~I~ZG|1;3H`&c{c}wl3OEr$OE*O@|ybIhYP5l6F7kC>6neRo(ZnvBEx|+7;SJYBl8slH0w54h6Ct;+N zWeN%?b8gtOU4yY_(3z78iNU)PrT@-Z+28Iib`Pvy5qNSczo5107I-Pm1qNJmj1&esj+pc74n zvO$nL4fev*!zWdzlH%bvgvkoNK)!c*N+!NVV?x)0<- zOJ4AXE+yH8{|a_3Slz6Na3C!TRyD}58(;t;an|~xVld(yCwLIMLc#4N!h;4^eegO~ zrkBLUITZXqhhAt71)3_FJid3d1^@LeLEm7)2#oTiTosxVsp15>*{R8rF-3}dpU0@N zhud=_wB<(0OX@tEUjsKw-5?8;V`ESFQae_5-t((J^Iz7n>7g6FxNo`VHMLNJIpG8C z%?)YuHI;JIQhELhSnA?Y3&Jlh_<|Js<+$RlmOSmHd|!iOtc;6}N2`kOh4|i?YW<-g z`IV(hUFAzxdC^?!7rM06nfX}=)Y0+5lf>~A0xuM_N{xYhf?2VmlN0cS5kd%cbc_(+ ziEwP8#5!0CD3K1^63V^MX$0l#3gVnd@b+q)H$@_V`g`4CFUhG5L)( z5?HGu9dxol{Ds;kic2G*Oy1QL@>k2{Z9tbaK}%WV`N%f5WQjuI6>XVhKo%daag{d) za*9QKUrrj0M9ye!6JL_Y7|GiW?97Vgi4iRVhJt}~-r-Agm~-}5N{SO9gzkVFkYwTX zHV-AQ|LBNq!q-oeV;)ff<#?Eh$f$GTI`sh;BNL#KIuKC>XZ(h=nhFjYF|P0Z}Qc zxnut9YI-U;M11x2d`$wu*Aa_;XN$lS%dMw(170SGsq;8JZ;X+=FPCh^ZL!F$NTi7> zXH1Z2&jbpbF`93T7qqoRqfvN+P%36^Vs4PnU0oH{L4B}O^F&zn(jJMhkNL#?nLwSa zwGARMgl$lm9OQ@rB8<$b`h_>vJ4u;o#E-EOqR)q-EUvN@Xby%g;X%OlTc zN5eemC5-zir$-Zom$R+eUhVmeYq%eJKI2~K8uWZs^R5~cqTkhIi)YTqiqs!oW$u`0 z4}RG~`;{Q9aVY=rDz(;hvsU(6pHF!GBISBEMmcP)6u6! z3d3{M5{D2%Sy>zlY_-m^{cgl%wxu|CD!&v)YbTxKyo z^zL8g*qbVRU@FXLx0?ko&=?p`I<} + + interaction.fsi + + + + + + + + diff --git a/assets/icons/interaction.fsi.vectorcraft b/assets/icons/interaction.fsi.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..69a04f267dcd625aefb8da1d7ab75b83955cb0b4 GIT binary patch literal 2314 zcmV+l3HA0LiwFP!00000|Lt3CZ{s!+{wsz)8-j+^Yk+>(+beoS_ih)vhZcuLV92%- z>mo}&y=>xJ_`i2Zii$}pS&2@H7Hxna)`;djoEbiPG*Z4gH&wk)Tj$F8l5N_m-qh($ z>n!o8Zt|*huKcBQo0VCe;z=C!GavPqjaqna;(9oCTWz|1R^lXIAHN4nr_I|U!|&u} zi{Ib0Xm@X#9KX?(dE4Nb5BWn@G-%jVMOCl%)s~I_c)LbZTDR*et+zPt^H(R|@+r%7 z&qloI&n*B4)(DBYe(;Vb=G8vlR;>+{h>(P zY;b+3F-GZ{MXRklG;DTxv8}Uma7i#AheMXuX}QVRd^t`c5DCxDOW)K%euudY0F!$=8E=q7kflEDzUK+qCI zXBHZuC8lSVAYR6}kTXjRXd#b?@wAT?nw(ikgcd(Kvjk{3|4u~p5lN`dlDLqlo)Xt5 zDw@O%HN=S<$LgxUb3t7>S}0Y5gO(sv1Bj+5QKJmtdPGeHnuwM!H2JZbR5V4PW*$w6 zua*Z8oLMO$w3uT;qRm9ySSwe+oe^uOs7pb^PTj!QR!H3_(&FIDU4~4!DXJ#h4%B!$ zu~Cem=wAf&1VLeXG=}2Upi&g88I7aRq>~huq|Q>TN;R4SPv`2(%(#IfmsWWlzQvGrAQc-dCQn7RTQdh|NOO1mdFeO-m!PJln3R5F5I805D zATc$Mg2mKy3mQ|aLhzVcJc7uS65~u}j0%Z98|O03D00UEj zfhoa2*I;0ZFfdgZm@*7Z9R{Wl15=5CA;rMZVql6fFx42Catus82BshbQ<1@lBm+~E z!H6h>5mg2wvJ6Ia8H@-s7*S?0BF(_iW-uboU__n4h&+Q4eFh@}4Mr3im=X=XsnLSp z2cyLy`-yr&i{p?)ejo{rvzr&5F&bf+d`(JYfm;$RB8*+twbFv=d8|dk8VZyTVV*y; zs$VAG3V8U34ESqbLRer$yocz*U>OZ3{-V9PPutBd6BG3fn9u*hNL@b}L0ocCt<&PM z$#bY$IrDOu<(C~M#wxfBI14NPyXJpSQ@#GJNH=$uDfRkfdVLzFd;OSgEqx{=@lk!q zIs&0RNRI$~u1w;|K;Gl7xXl(9;PC?n!SC_VfZ@9kjxCf>ZYmBX5PM2OIoo2BpuE|y zdGpW;N$gXgGDl(JK@vg_gs?Lt2qpvhPgWGwy)}}U&_L?egz_I>#-y*MnNSu#)ERa~ zEoo3GmpEdPvc~f+-`f^T;Pb4=$V5u95d0iq~#!qpyY@NH1lkC+7cMon2ZSoL`CDuMy?-I^&|> z*&+abxrI<(e-mDqvK1ir&157$mfQTcvcfb4k6X1XC^Ogg|aSM)e`X|PN~y(Z(ZHnQduOn@1r#1$5e9a^b4FdnaXqo zoGHj~Q4vCII-OTHH<@i^XqsJWL{S!VHT&CLg}&0(y0d$niz`0;9J zO1;ZV>}}z>rmYU5ErZk`UUOkroq25&Y`z`RP2L`R^FH4mDh>zBfkBpY!}D{GHAkMG zoAtBs=AXTOBL+{aZj47-EG~+mnB&hH!B1V;jB38uD!Ym8k(Z0(L>=@R!F|8UMuo!b z#dg}g+RFuZ;{DLe1@~I^pjWqb)g6>Z^bd7Eu8zXvRNc;TJqFp8eFQ$M6!pL=}QBI*W6G zT+&8UFH?OBVE)rP0py~-Rjjn%rPxX)Juc#pO0n_}yL_{1+GC+s@87eVv@2M~_=v?P zHo~!e9&Py`^raqPk3Q`jo>qJOBHq84&;GSwwXPn-oAmnA*2Vj-El}b(zmEs=Q`beF zS=T?Z^viMaBX5wsR&wX`dw+}A_-C=9&%}n^VC*hQ_sczTeW|cae&{{CJ@XhU-v|{` zw8#CrDp)WWpLF>)lb`FHzv0m^^<1L2h_GZd-FlmU$=QGT;J_HCuG5D7GfjqF!A;w& k4u@Qh&G*>H#!+8!RGB@rD>h?vIzMsx6$!~Vbb~Yi0JNxhFaQ7m literal 0 HcmV?d00001 diff --git a/assets/icons/interaction.mass.svg b/assets/icons/interaction.mass.svg new file mode 100644 index 0000000..b4111b2 --- /dev/null +++ b/assets/icons/interaction.mass.svg @@ -0,0 +1,9 @@ + + + interaction.mass + + + + + + diff --git a/assets/icons/interaction.mass.vectorcraft b/assets/icons/interaction.mass.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..47cfda1e0499bd2de31fd9dff7dbc53ceb5e4921 GIT binary patch literal 1886 zcmV-k2ch^MiwFP!00000|K(ciZre5#eicK%4MUWuTY&!Px}q!Etwl1l7=pl{ZN}yz zi<&M;yuk0i!<%e5PDatmHedk)OC-hf={px59_qon=GB@s-kEnx=MAss6}fJ_G2B%( zr)Gzj5#CT?+<1t?0k+wHiMRW}vCp^nnhSo|egTAIc|f+H;~(@;Q| zcgGgZ3do*7=bV(nFnC*t*?;G(=x(=H+ehq|1fCqLA84)HnYdJR0f8&7l?jtxMqnQS zn)p}Z{X|0o4cXp3deo40kAQ8=b6(ShQXF8BGzpD`t{N+NLA`&E?c{ao&NP{0kGGA! zPbMJ_5ss3`kNhMKc1#D*8_UrG!X@(iBT=S%)m$i?#8I3^IKUasf-u#+n#YSZ=YX)A zJnEpR$)m?mP#X1=tRuos%lI|@GW4_553^7!FGf;dMtQ2!&M%cs^|XAdB9REOg0ns4 zKtnu1K8|AGKZ|1&rSVQXvOk=pS%e|R_n4R>ItVijEJ z-;zQ9rBFv0`*QmGYatyPeEl!3jlz6k@9+=f>O0cRS5#SnUIQN#CF%FKccLliLK z9H|%(Xaoq$2$5O?`2t~UNk=E(!I6M~P3jN{d?&(jg%X>!O+txGPNSggt#npU-mYgd ze{({T!V(f19mScCvKVO~f#?aM$QsCR;KuyU83`nEky$^oQ2t@ViMFMIP(~jr3W=#> zHqtYfG!aZW*B}C0Qz0-p$Pq(66L97=tqdSWR6fR|r%DmaiY%BoUK#H$&$^1=XI4P* z5&G(em#QoSp+TKAh*f7;*#zoPC7H8kqnp=kQE~|f%t1glbED_yK2{uger{2~g3Z4; z0a1hPtQ+_s`RF7D)g1p<1~1y8KAQ8rmf2aBM_!Ic%RJ~c$o(>>M-zqD(U?dI5W)jZ|3s@M5^ z0(FZhLaIj8C5$r1js|QxC6E(}@jEPX!SmC>r$!pXOVkqk5U{E&4h3>b8Lhue=@P*3 z(>n#^q`FnwE5Dm$E3-N-lAi{E<(DfqpVrML?_2MW^qRD}(3l)Cx)3A0*ZW}L=t1a9 zeMfTiw6pu1z?X}-{x(W{-8G%@dwn*2aN0Wh(l$AyINpEb`xx8z3Z8kdpD4NAj6TW& z*(-jfWnJ(6C%D0T+=S0?BQ_YTQ`G%(C$29=i}j(mrYhK@3O}MsWVD<0jOT(35l>pS zpys+_^7EWpWX}aiOT-r?;=7y$yJg}_OBk5K)D@}4_ly*(g7c=HmL)S|*&6EDFzNwD Y74*KDiWx;lzU$cj1-hG4PX{Uh01s}Kga7~l literal 0 HcmV?d00001 diff --git a/assets/icons/interaction.rigid_wall.svg b/assets/icons/interaction.rigid_wall.svg new file mode 100644 index 0000000..db9a8d8 --- /dev/null +++ b/assets/icons/interaction.rigid_wall.svg @@ -0,0 +1,11 @@ + + + interaction.rigid_wall + + + + + + + + diff --git a/assets/icons/interaction.rigid_wall.vectorcraft b/assets/icons/interaction.rigid_wall.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..ce34f3cc000aef71699479b6b5618e824f82b2b9 GIT binary patch literal 1917 zcmV-@2ZHz?iwFP!00000|K(b3Z`(Ey{wsz)8-}QN1=xqKE4rfHS|me@AqWiGW^699 zsOcq%7x=&L_$FJ9l2UZswO9bh7D?Sbx_fv$9`)c{vvQ4V=ghe!^O}|O5?|NO7_Q2S zvfMcf#?F%Dq{Pq(qdtpKulcBvJ4q)lj9svKvnDwRdDz{D#!gM^jKDoKui^fA4egVX zF6m-=hqDZBY;syxFyIrtCs_pzbC$7kx@HT0+xc<^O}MOQ43`TSclqGZg^--%H6QUx z^^Fh=ECCruaPK;2?!+BC8~x)RIcHuVn$)lD*r`_RZaOC%+H{S}8|UmAXBE*MC9A6G z3e&Pu9owt1li>|1`+$7l9RkG-%@-U+y(xHyxI;e}Z~s)1iU3Xyp(g7h!!>DD7bTbq z&$!X*vVn&Aie`(FfvI$e0+O?wINR;G9aq&Q zyCFRzE0%$#J;>Z08FZAwA0;v^ucaG&3v{ucG|CEmk55Ho{5g_yuC7{5cxL5r7+6E8t z7I51ZL#O=x9?Z_Q;Kk^<42!;uW z9tlW#1?=%5u;qh^mz5)xmwh)(63>s6n*%@fP#ACjJ5HUJQoeTS*x^#;bujVV6!}S- zroQK+ID}r-)T%q3#HpJ^$aUQ)juMaeD$87~83U!-yRqV%k{ul0s5+(S^iZkl?H7&E z0dUdK2Te*x=&1*L8oFSr68{*T>XqUjKbq=3kiJK9zK{s-W%O2Xx>{l3K9Xg$s5rmw zoHIUSoR#`6DD+?QrPGgGA^!fFKN~c->Vss!mD9YPKjHTgPtyPa!$ZaWSj@CQaozop6T2w#6u%`4i6@^Z#L=h;e5WJnvV6T=au3dZ$exJTa|z<_z?;k%zc5 z!o9owwxQP(@PYQ~4%hP)kz!OLdHFjS`RYmIgS9d?!`UubEm*w=OiB5&0-sv>MVNW1 zzGvclYpV6<49{;Y+2AT3xQYShTF=SCHcWUTP-qGwH%(kvh7|%Nf=G}U1NjIOYDq>% z;0ZzwAeNL-*_)k4P+qNPViRPABnf=vYac~2dh1xud%Q3- z2J$DYdF;*_3FK>`uaKm^_|wY@Qd}AcW%RZru)DL2pdGp-F}IX8o)2_wOO`MYUeT6` zJ7n@Y)Rt&83e*XuV%Emy2Km&KMP?n;JJkv#!YWEyB*H%C z6Zba^HRRehh(r*!L1BE5Bl;X+Xin90R#|UWWTp{4#SWROnR|xjwu$m#(%Pj+5Q~s% zK6^`cXB*05IemAjnYi|KOf_HNtb?g`M<^nN*DfkDQ8N$c?E0G6GUFg;*Eyo3#n7Dn z^@@QmT-$>2wIP-=)#$AHGEFlFbAfZ)+$Zh?k4TbKyT=>I(bo*B6}H=lsNV$fIBtdM0H2o3VMPL!Vpl}(^# zTi`jZH>!C}7X=e=fDRn8mW`g5-B%oWUN$d;`+_Y;=?brHucp1uvSs z>dpC1MLWat$jjN$Fb_I~aX-#UZ=!HI+nVjwUe36N`=OUJ?v<`VPnRWYicTT=ZHYJh zjf}n`_4}VvcSy7czigoWMiACGl)wKevDT6d&=Ol~i3ezjthGb~w1n1L!U0+WYc0V5 zExxrDe}ERxT8lS83$oVowbbXTvzw#KRsGbgmA%&I6R2H85t22cHenPwb~s?uDS#YN zjNf4q3!a+{J~dJpUZR%Rg%HTf;!q&Rl+n7&lqvxXKfRMcj;dQFo$|X*wo;?xB5_m- z%r91SKCS9a)@AQ6v52b|4EZaP(;2&0 zFLE55wvIkFbp|Pp^L?D@n?9HK%ya!p@a<;wP87&a_%fDpz4u$#CfKu$|BP+;24i)M zyI=0a_2u5xF+B9%y-M1eDtKfnp3!dBGnR2<@OaYD1<}7tDqaq$c=nuwwphHDS~ar; zy`}u6Wf+)%=n_}_rC + + interaction.spring + + + + + + diff --git a/assets/icons/interaction.spring.vectorcraft b/assets/icons/interaction.spring.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..caf2653700d3422f798bf1cd7f63d6fae5caa7ce GIT binary patch literal 1897 zcmV-v2bTCBiwFP!00000|K(b3Z`(Ey{wsz)3x-6!2iS)$E4rfHS|me@p$H6GqHQj+ zsOcq%7x=&LNQzFRC@w`O!+;uaVv!W@(cN>$<5Bn4id9?OSZCG^NgGzB6<#%#4Odl7 zSz(>|wzVb&sW5cHs4rsFIUhB1=E>ZFu^CI-Eh%7<`-l5n+iGZ&6S#*K4cwnL&_1ur ziWY0QsV!(zL+59DNAemPQkJu7v1J**}4CT1=0mXCPT_03!u zSOF?7{m!w@oVjCLJN4tvwa$<)nz~-2Vs&S8@&=mC$m< zRTYQ)6M?bCRUD$o4{U46uM#&3{m2RT`@MaTRW}v8CL_`cRuBuG@RnxH1{4JvzuG@h zPKlw@mj9r&ZkPP0d>VMZ4eNAW!e4ieY!}TPumUX}u9L)fT@?69m;^owp_jFd>ISh+ z5XbNkj_3G6bfpkjms`d_D1Q__xd+^EojFpIqrr`?ue#;z-au}wy2q#Y=W!3axE=u~ zC+|i-eX=9iy?K=MK1$RG(y_5p^4MdKjUE7jmNaKI$s}uqrE_{C=vi;DFg3|@TGpH@ zx7L|A5BhV4wzU~=E-BpojeD^dIzoeYD`8&8cDk=CzDSxt(vy3N_rrQhGIW*XJHC=k zau(zcy~P>a+IJQh-;?YecNT;O-Xa^Gbr&^W*Iy+3XB}n)?GcB0`sA$sNZB(dWqUguk(E8I!>mh9X=b{O!x6qh_-U~R!?|BG=;c9*Am zlL)Vzjfy|vupt5j(W7fnYhb&*7H>Etd@>{+PAhpTS{@OmOGUtH@P+pJ7B}gJNW5J# z^6hsp$kmZpv(DKP=MM=_$r?4YeVFCz2JCNSLk^r9PyAoXn5HZB=NzZkhRks~$~YZa z^rc>q%ur^6c(91nO5jR!QIHpiSwJZuK zfm{_8l*1ya3FXapDH3TTB(d+gp0ZJxIBpWU9T3EOP!MPX`4d7jyER4~E%C(1 zS32pqG!e?|T}5DrV3^4C=n_Xbi+Ca{CxH!pWltw}k-BcV2g+jbZFiiCk3R@tBqhmt{q}z<>8|I(3BBzo= z#8;&JHSz>sCoKA{DFRn4w{ED`-$W2orHjgMw2{0oGP-7_ScDzCKoM1Xj29`(cpW%x zG+!voNn?mcp>TVlRCsNquaM7eRp!P)U5S=JL|Ap>0}`PheaHO`Lk+Sq4I&|gZ4ej@ zazu|K4D_jb!D>@^(epJRti)$}bx3)4h-n6&mO;zuH+>U(d+ZcRg3B;EHRH51pK zimCbwoN+K!<_JWjK!-&|CTjZOoUK;Glo^AZUFC?97E^Qf^9=)8xG~;;D@Ckjs?l5Z zWtyfB<`NgCxlhy!9{nXpmUvXZv#;Z%v+sUB5<4)dazJ((pQrD&{uh-)WlA&Ia){$J9pcr2HuxHPeBGwho zC_m}4AAX)4YF{5|0VOo(s~c9zvJ8XqIFy(j!J>~<%Xt + + interaction.tie + + + + + + + + diff --git a/assets/icons/interaction.tie.vectorcraft b/assets/icons/interaction.tie.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..be400d5a0effb8caca4e78fde448745339209d0c GIT binary patch literal 1805 zcmV+o2lDtIiwFP!00000|Lt0BZ`(Ey{wsz)8-d&57x=&L_-0#)lTozY6<7lVmPm^C=e|8+bO>dgUt7$WW8RGH?o?R(Hm?jEsgnKqNJs1>?dKQgk=f}2y^a8 z(JnyQXV96WniGR|6`%c2N~+E6`g;9D`!#|m$MOeSn{LW4rMf_Y3#yC>lU@bD4`9YM ze?5Nh`TH7tcc&%TGypg9k~X-Ih7(vyaw{y>51|w$VPLJ?p7L(b-uL z^m!m#j3!7Q14xGh@WQh==_620FGY*^`(Q-iW~m!wfucn02^MHd$j%)`_@`#X3(N0b zZNfjaH+QJb7g)}tlC!JdKvCDvDiB_{q*GLG6Tq6bJEm5%d|iNDtaK}!XRdyy;&*K- z^`{c$H0eHfQLkRV9 z8F73E!m))C>nJOrM0y>UPCsvzz9f$^k~d2z0hGmo5iJ6Sf`W9y;!AaybM|+P$^#*UZjT#~ zb#wPN4<)bv>X7XYVB;qHETRIQF_4QDst$4)t&vznHyuY}p^#t@3|oD~!WO>9q1d2+ zsNB}vFn@OpA4(1pUw!SbNg((-VA1bv5qM&`_4M}8%LFlX8mIln7|FY;AaiPqMea=_ zO;qVIL82`aC~(GTz7SgC))I|I;q^kP@Y=*&A)h){m)1eOw{`bKSoP8k5}_Y+$Nd#S zLAJFGA~A$*5STp55d)4eGNW0%Zx`kyUr0MEr#ao7Yhoq zP;0#}){2Sy&A=V>jpnm7{|+DChXUYVdPcHG6ZuQ_;?_ zJaRle8sUpw8v`H96jvWoybP6B`6yvv8#DeFh zgHMeVhGWzc`w&7|SsV)FkTP0-nNlTy;iq>J$U$|hv{!!D$yR1`TqKT4f%)}<^}WM|=FU!^xE1tFJ&FowklX zc5MkMj`Mw-%bUKJ|H6Cyg3;}2^iCAWPWWY#alQ9j=qB9JP4I$l_y%Kfh`En<;(9E# z7$16XzvbAdDtw|Up3$zBQ(AIm@OaXZ0_$r=#0MS?&z>ugmWb~{nr>Qm0f4{b421@pF<)HTs#$r9?=FzNwDRrtQ0@EMc!ZpZo`QcK@MpDX|X{IhpG literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.delaunay.points.svg b/assets/icons/mesh.delaunay.points.svg new file mode 100644 index 0000000..96103ae --- /dev/null +++ b/assets/icons/mesh.delaunay.points.svg @@ -0,0 +1,12 @@ + + + mesh.delaunay.points + + + + + + + + + diff --git a/assets/icons/mesh.delaunay.points.vectorcraft b/assets/icons/mesh.delaunay.points.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f5bec51cac7867e3fd12d429a4ca71e6e71969f3 GIT binary patch literal 2173 zcmV-@2!i(?iwFP!00000|K(fTj@vd9eicL4h9Od-4h!@mfBvE^nl?dFv?zkbg0{J~ zy0WP1kX<+MyLWi9C0lkWdbcSM1Boq?;(VIdI_?;CFl zS5=+y!n+Bl-ij5hqR@!wQ(>^Wi=;^_r~78QimB^?J5s zIc*ENos~Q*ni_6viwwSRym#3X%SFS2=e)Yx@TIuv{b~+Pv})#@R!bQ7@w1mL<-7&m zh!L-J-vq(H3UCSePri5K&-|&kH9ww^cY{OOq<`(EUcKgzcMHJGKp?FiyqkNP*UWTO zysq!oG^=XevAdmmIo+~q2*?}JAyGVJ#ZsVXwx#HhcbEqg?e8j9Gr%bzG;CAmv|)SE zWd(|%bD^@PYN27V&hll&ioHk-3MorQD_Sg=m@k7#6e1Y=FmV2UNCRB zo9@TeO~oJBz{r~CAgKdcm?MXdO4_3mN=+j1iGdjMDv59$lBqWrS1F34F!m!5<~?T1 zW(|rGx?j*z7?rn$nEemn!2WV~yF1ZbN#V|^`hwQFor|C9QQ_g&TpI!={YYSb6wmxy z@qD5I35ij+Ar(W2XaPGea$d8gQnDEF&+{E_H!Xrs7#&ThnX;3L7WNAM8}g?GIlNU8uFiWN=m<4I?1Bw(fRBt?s{W!tM50fbIQIbF}ZyVhW_DC^` zla!zUr3tz!RWN`KX%AsMJo*f-bQWGv zf$Sc5NG)34JftCOB>;8tUfAiA=x!zMR4uyuNZPSy36kX5C&~MIO(jcMo@Zq(c>D-F zBPY1L^>A~U!QCH4I1eKDA4EOf3+T|`>wn_6;KqOz4h|W*I^^?(MH{D9?%#9B>wS)> zptkoid7a=S#4*BQ97ZVZI2rUtGZZ5d<0K}S1Q)!FsPMRVr10oQ)2ZerM?y{S@Z8Z6 z?&u6MHFtF8sV?A74!BQ|B^}(SPn8Ve9_T3(ZLyw;;Fc`b3r9o#3#;x6u!r;5KA zuZ4NS9<8IVmevr*h{`&R8Fj-MYOC(hn%pv}4LU4IP6AxerAc}c9fJ$}#{Lm{)exRz zxEXItafv?apg)Bdb|GPL9!&Gw}BNhT(_1fF9!x`V)A%S5JTPaJu`8@LX6*Y7fW-|6pAG zNSno)DeLR<$;Y38RJRw%w#xaO=7$nZ$s4oTp6+M)Z4DmdW*Z$~hPqdf%o-G|^rZ^2@`)@)4Qk#FQ5ui|(1`=x^Zy{W**yIX4ArTNljVB-i z-<5D&p+qJwN+?8yMFXW%*0O@~YBQImKPMzf7@)w|C`x^lMo0s}q6ZUV4di!lWB%xj zB*6hOg`+f(pU~(;b7>@$$#)flnx^AQ)}u=j3r#uWd6R8i$wESD6{DHBM;3_8J^{^H z1Gz>c7%QhSNR&q#onS>CYb4)ppwgc&uZ(E0{s;w`6ay=D*mL$5M)NBngno}37!l## z_Mzm}pDlHSfc9=OWDyuStpg_G)D!n$gSIE1zDs$(cZbT~}GOVIxk3{On-f@4T@ZPj> z4I+@)3xV-bju;4p#Gb0}dF}j`Ph}d>Id-U2&E7Iu;hHEPC#`*oz&1#PRD18O_@iqm ziP?zDp9i!=luSjxiaG@XE!;bqQ%&p{q>rIEZR7~ z+%$?Z>%(9?S&hGSxPn!vH>C9yS4JpC zR6eGYbESw?MVFa4oijcByxCX!-ed(79igvoc&W-V5E|4W6?txBRM`Z|P$gYt%~m&W zvZXxkBk3R@o4L{Dxrd4)m**A*EZF>u!!v5I9lJpvG@o3hK{dzMs=*I!Q4i*PFGV}c z^2qb)(J~Ku3FW?Bu)##(<#cPeS9?C?TJDFQPr0|I27R}xcw6=g(ce{cE6yPf6{&yx zCiTZed$7wE+8-ogtwZ^b-z3gbk`Yp3XDRUrDUq|3XoM8vEQO4a5;{u>M@R{rr353S zU}q_KgcRf~<)2cY+um+2TdkXOUaNYY-%p_ZB8rfz5$zL3nPZa?n@$Pjiemf$i(K&h zWb|7jjo~?JiG2v6sw|ELa!nbnzf9>8!1%X!3dmJ;tE5+cH_29N^}0x&9tP%@>uhmX zH`~0=-v6_E+UCMya>V3=7~#F#L4m;+q0e;)dGKxL;e@zc#PzXy@rMC-bN+NVqTPMl zI(geRIixt=f8%hq?Q`J^&-Fc{pSF`9WP$AEPJ!6hd;bmHgdN=k7jz>w80%}y{d{j+ zpGz&)FTJ&@a7R_)iK;|KyWPxrE|ekSNt-R1`CVo5SWYdn=K`d~SQw*j=gaIAIS%gl_;Hc-cgQJ-N{!Je8sF{8NU(6Rd)RiButMl=8bE`Kgi literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.element.add.svg b/assets/icons/mesh.element.add.svg new file mode 100644 index 0000000..a83fd8a --- /dev/null +++ b/assets/icons/mesh.element.add.svg @@ -0,0 +1,12 @@ + + + mesh.element.add + + + + + + + + + diff --git a/assets/icons/mesh.element.add.vectorcraft b/assets/icons/mesh.element.add.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..720312aad48c24e3afec063fb663ff6894fbbc4b GIT binary patch literal 2065 zcmV+s2=4bEiwFP!00000|K(e4Z`(Ey{wsz)8-d;>2iS+M8@8d{TC_upp$G!nVr(w5 zsOhDNSNOm0jxV-k%N|81>wpGGY?0L6qq~R4<5BtI-0^Bn8t2;iOcxEW78SW`oGDyY zHRFYI9ZsDkEoeoc6GnXyqh8{uiF-A>a$#)77wwuBAmq#bK5yzYtjQ_dv!?axislr@ zT#+n;TiSv(HFUjYk2J5LVZn1=-L83tH@sWUp@~$@oRcbpai6|8EE6&dvc?fFRNusd zffZmv-H)zw?OwT4XQRJ7dd{^UiYE1KJ9X+6f4E%$777YUb?;o?k-Vn5qvCaayCSTr zRmb*b>f~fYt05q-u|uG^XGMl6noWrv;tu^_*#5SnH3ggqp`q(CCk@@HE-O|vWRB)) zsumg+E0$*!Ep{q>Fi2TaQjuaoQ62*!5|PyG+_5|dg(YFq6$(hrbCz|1ppkRvsDza( zG?kacVdBQ%YP<^EC{6tUF6Vd|1~cD_lI?ao-RY{Eir-U9ZE1`@iPDy)v7dyIQZ`di zK$-KvvStOwzJksLDUlewEl~QOoE5vv?alVc`Xzxor}6_@>voP`rMbX>E3TXgLO%t- zkL1d|!N_cIPsk1rkcX$RDe2+xlbu1{nUu%ax^wdQ zxuUN}ZuF7gV|Vn;vO54PV`Sa*(q2mK;G=i+l~s`dMvEbc8y z;VL$`iU;Oe-_guc=ggmlKt3IfJxM)ZA@D*$%+wgj8<z^vHc?y}31#wAMWK#mnN0NPk|t;=Ydo*n+LkO)D7>OAlk~^}3#F)-83Vb* zBEBytjYcA8w6=*a$zzP<$2C-T^X$Ti2KfLQNN0JzG>187f2SnB5JKqoxB&%AoZjZ4 z8dWNGzh8jw7)!NH7Y9tvzDl3t!_uITKg1%T`7iC^VwVR2is7V z$mzRJ&BS$}W2*TAXB|wnJ0cM&{N17=6E*X2&hPH1Ei(>scAXXlB8~Od zS{q_1Q;puLFVi%0Fz-oWoBJfa;L+dVhyF;8zT{A}u-!hyJ@s?vvH7lSx27PtIOIenI&>&w-z*T2l*#xSBC0Vd$qng(& zE4hFJbU?^jws&6kP;unEY%GYu<{w{}kb}+G4fY`U5OZ*A9_0D-sl?i?Xu!+*(*fBYc25zEs?dBXoQx~T1z-WOJJ=f7@@_t z*5Z%Q;#q6?x76pRx0_?jRdZ_A%3ka932(QEdY-Hi?Gi?jV@D%4odU=O#rQoIvEaGs z=u;zw;VEi~eF&kfERF?oNg1ubOsNvU_|rQH( zllR&C1HB_{jvf;uChu{C^L+1W3?76&)e-pMY3J^|+ZBtrdX*Yq2EU#2NA<42!D;K{ zP21#<;yC}0qkYro^3Oci&y;-LOnwmsvS)m$+qmBQU)Uz>*d{n*8{A;5E^+tMowz=g zS&R?8m8txWslp>uVMe=I&v}l + + mesh.hex.decompose + + + + + diff --git a/assets/icons/mesh.hex.decompose.vectorcraft b/assets/icons/mesh.hex.decompose.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..249ea4f5eae518ebf4d260bb4c9f30211dc47f4c GIT binary patch literal 1716 zcmV;l221%LiwFP!00000|K(b3Z`(Ey{wsz)8-_%^IzT^kSBR3_)Pf5^Zy# zMU9e@c!B@>j-=>ViIY*ZGYn{ez!Kl?(R0V+@yL5`!NnRk-kEnp@`j6C;6>w&;Z4+( zm)==4_Lih10z)OV`lec)%T^P7)H z6o5)fzw^B_f8vk5jd{2WyfYN3qV8!s_UaYCo#lX-fIuv+y|V>oH8B-}*Y#|Lsi?b( z?bX<0ctgY?AfIG~LUB#YLZWCkm8?)b%!kSHFM`wra7qXbSyv1=aj zEiIZAkUfFQ99PmXcw5TR|KzmXy>73zPuQ<8^c?FSD6QMMeAILSfh*oA69&Bu!9Kt; zuH@&*_aHb_5TLyhbhrfhdnMtn0PH7cVE2VqF5p#EO09;jS}l1=ypw4p^rx90PQy+m zNuab~RH7?;8cAPP33vruE9QZAm}kq0%0~vg=&@(|!Ow8!AoaJ1U<0?Q7j=u#<9i{-;r=!p(Mu7Dk!n>_!`Qd*R_K3c0E_Cn-h{O3WLz- zD4F`fGzmH&NY9foh|lEows$3O|7x*othk#dhcwbTJZm858(bbWWeg*U@@~eD zB#Mx55DZs75~T}daCFwt0qLS!d&T_S3UaJ*DF2Ggd`&}TuLBnS))hgZmfOH=B!a0j zOcO|&d1H;_Ls`%zcg3Q2F|jdJJ!8VuXeR8yS)=(zIU|iD8iOL}xl%Q2Q+qd6adjdIxNQ)aK8g`Ti7>V|)eD_Xa9V10q>(&l9XeFA z*9<1t1C`aY1V&y5&Zc)*Jn!P)R zEhcfbj7KrMi4nC~42{{(R~%&F#(8IMh*;`SqqpkoFwGv!S6sTrK55T+^b-UT8fc^E z9C9A6+lQp5o~V~S3Uwf4@5L_K+SQ{!ijhO@Ka8Q6xYZiTcg)Jxd3A|}MyMJxp_s7ybPA0E$kS+P&Fgyb63)eWz7 zTBetM8kRPJ)K!IZ+HAVwH7zQx;D9+u$Y$)|<*^SXM_wLV=EGp~FZ08?v7L1TADE4f zVo;CqqcZrlE$f3Z-)otjWqRavJX*#wcHP#j@&DggPtt~ zZ>wG+`n|v#dDM0&N&WH7)F0yQK`$F9zg7lo?aDvC$(*HR1Ei$RQqloZ5@#vN04cGv zlz4!Y$XQA>KuYK=B^)3HIZHtUqy)}V{w?&m>h0#}a@9OHYjv&j`9!c=M1w%*h;{*^ zim~GXn@$Dfh-CZ&7Pa8{+2B*74#O#OiG2u>&MXcEa!eYnzf5&0fZ?Zi8pu(3tE`uP zH^J7_>bOW9m4fA0E1J*hX2bf{`!iYKmPw7N7Nf7Sh4*^b91b3Yp6Ues;A!XXxZGEZ zcz1I|-hG+P`CWG#;L&O8=yTgJ2ywjs$ISrS??Nwp*DnO$Y(^hcg6tLVuvq7N{|j!S zJ#NAmxRD!-)iLTm-HGd|Xt6%@?x;e0R7Fpyk`e7@J?Bi4A^k~93u2xHRX0Rx89kRE zEtQu{ + + mesh.hex.dominant + + + + + + diff --git a/assets/icons/mesh.hex.dominant.vectorcraft b/assets/icons/mesh.hex.dominant.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..dd3bce1578d020327a071c75aa1e8e2fafaa86db GIT binary patch literal 1758 zcmV<41|j($iwFP!00000|K(b3Z`(Ey{wsz)8-d&57x=&L_~uxSlTmcM6=(p*65sCe-NWPY$a`l&*$Q>expRZ_jmbk_YK_#^MB3fPWRulIuJ9D9JLGylvYZ&DIp`SN(I?`1b`mAtUo|X9Ste`7W zqneN3*Q9Hq?i0DgRSN|zuo1?$lZ9hda+X_d`*no;FjbE$Qtn2f!EvB6jVZFHqHDUBPJE&PqgBt132E zQ>Q{}%nkwhz$*lbYf={+MYnEvh3KJw7%%_CaEk#ahtT0wQ=txTMK_Gp9h!4}b*zVi zyd+h@aJ?1jgF>1HBZlf6^YI7_A`wZ+&Vp1G2y76MwopJ?T0#FEAY926R4}1s##QAd zahSL<*qXluZj`2e0IzfY8U~r~MagEfnQmpZ9i!LSQd%1GzeGt()7VeKND0dn6cFaz zlA*i|nNc#Tb+rENdwk5XNrz>+Fs!l2&*;0JuJ z_|N0-zIUjA|J#-X+XCQ5UeOj8(r^MxMQ((J+7bycoS&#(R$O1V@Ox5D$WlKrR1gAV za>DL>VBot26ni_x3YY{Z%)yxv*fOK0HFo|#tGXw(YPM&@?2yUi{GLAU?L~XtMS*#L zZl!FWLfM$!T;Q;~EP2#_hY8{L!GyrgQa8u~MTOWC*4I>!l>;XDr=8%!c8~RGZq00e z{_l)<&>rxC^7a;Wd5PsXYQ6aO8>sr~NfUs|Dmq8i!nfCqx!C@4sWI=)ngIcI;zs5%lt z=nl96(K?^r=C0)RUp=zjIc%rNA&V%7XAIII%3i9Z4r24x%Kq6(#r%fbs(tcjWLpUbwQTY z7K_}|Mw+N{#srDBOrXFSqxnK;g*!_$8ihA-rDE15<_h`Lv!=3k>Vqx6C)}!+ZjlK6 zm`~ha5oC!vTPG5O+XjKjUW^!UgpoN_FCh%KU20{d5kJKa8LF9EhSau!@_x`dq)3`=522ZO542A;U*N2rsWwL>JcYkqRAiuL?#}6Afo++w7qjaaQPN^; z%zjZ)kcB$yowZiPQid9XRbPf_=3qXf+BWt{2F_!+!4LhB9KE2Bv#{Mh!~^q$gRD~^ z10i!ScGmBHZm;(u0dwyMLKd++GOg` z2IZt%tKtS3r_-(3UhUZB#@)>R_P%9u7j=2=(tE6l>+md zlH{|tTUSH&{)`u>ueilTi^*r+!a3cgmxBkPFLeTb@U-*c;)7Vk)jcA96KXc6ck2Gg z-f8RPW8YN};yB;O$-e3D@}K!#zhHE;p1czYvJ>8DGS2t@7rF^|bQ3(I8@|CPk1_Yl zow&Y~T8t09m8$$5RfUgK#UtAFYECPz4DL^QQegeeh`1rr^60q+X^GE`(f0F#+z@^( z5gMi&e&ed;cmFVC1@o?*H4V{i$qMq=(CQvq)%dQP@ez4M{!p>`2cu-Sz%(fU04tbu Aj{pDw literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.hex.generate.svg b/assets/icons/mesh.hex.generate.svg new file mode 100644 index 0000000..d83bdbe --- /dev/null +++ b/assets/icons/mesh.hex.generate.svg @@ -0,0 +1,9 @@ + + + mesh.hex.generate + + + + + + diff --git a/assets/icons/mesh.hex.generate.vectorcraft b/assets/icons/mesh.hex.generate.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..8625d883b1c85e196fb5cb8fc7bc983a49cc8a58 GIT binary patch literal 1767 zcmV2k3_`E4rfHTBJjZp$H6GqAf16 zsOcq%7x=&LjxUatI2lDJTY&~}Eb;9g-#t7YkGyr3yjhdZId!gR*6}85$g*>$@Yb}9 zSI%iTbyl>Z4S`B%^+mKg!&VdbWOm|0+ni_pnpQB#?Oi`_>U69tDfC&>wm2#1&50U_ zLZ7~3T?=)e*bOaPD9CupoB5jO*yDV)fFja#3r?CG+I_oqSS|*w$QoO`R&^5(8a4n5 zh2OZ&se9s1osE9D@tjjX6h-Q3J9XNEU(YiDOhF)NE}hdQDO;*58s4_^g0QAl72Auc zQ<4pB4gvXq6#~U2t8zrqZECC#J@gO5@=pzIDd0p19bMNYYC?;y8&-8>f%@v29tyI8 zm3c#}ok$-PQrDC;q{=9c$6yeNNJ@5=tSmubO_;QW0@Csl`tJcjC6`dq2rW0LDldt{ z#Erq$_!hWPn)(5}F7P!BX1*6C+wFF`lht+&zoeGZ(ir~|B`r;3KM5lxY^I=qFz1@( zT>;8Ify#{3NDSUrIQpNQRlC>i#rA>rYXUu|@(W7aeu0ltU7)~%D`Uc--vZzVd@k_k z;k)l0D!_lcl3-T=+{jAa(p(x&U@6&^uuxkN0S5U=s#S^lx`yAAA|VU?(2$%l7!wJ* z_kn?LmQd{N6)Rv8oG=G6Bd}#g#VhLke^&Kh)~ud?&y1qrfz{*`pB|BP+z+xPZHl(2)s~Ci_{p% zN0`+sIynMQ7$JmEFSQZkI}(m9lvw*{0VUEgfP}K=v5la-UN1zvV}&FQ1251vif67j zi#-Lz#~MG1jDh??%aUJPBZ0st(oS<0h`&(lL~&^(l*!wMLLg_kst)LqCa5WEJRjKF zmMl>ytfDoO49MccGlq=DK#tLf@5@P}k;oaXb>d6%7$bSJhAl~%AL-E|U??a^hdaJh zhdF0|r=&a*Lg)^-0TDY+Z*y1j`mdhY?jCm21>@y3~n0)Cih~*01-y!R6U0<+;*vzkw*L&J7lP4ZW&hD z2Fmw?)*(g0M7UJ*+1v1ITUVCI>3bKNiT6PJRPzPS+L>x|M8Z?}yG2C?YUb{oFPGGo z8TVp#9V1FwjE&jP3J$VJXT7o4ide}|W3cMWFwGpyXHwb5KFPp&4D$=2Ka!(o98xB> z+lP2yo^X(P3S=N;?#0gg*4Crni;)BAKQvKv+-i*ED=DkqdUc5gI~jjCaYt`7-?TNP zuUp%dHyCimm#$uu)|Fftp%~13Oec?}B377D#q)^i-Q(#lsrG?Ykeh?Lw&S%-%YbW; znR$@|8o%%*&GMQHI6w!4tjG4A9{W&o({g}~%fx^q_)@-l#e9AT44?Ul9FLVxizG`@1 z4-(OD8?wQ}*F#C__pfH|7;g`D*+BWFAgr+~fB!1AmXeN;l2}VgMo5XRrNkqoMAlNG z5mG{HDd7kyfwh!igcRReia$b%XD#L5LZ6GlZjP;r?y*@bYpu^Gyxk(|c``?|3m8R= z9gWy@3Lr-$3LHb<> zTQj5MB5_m-%&!ZU&D(BM4%z!NU6Q^;i-{JK&)C9wxr;9c4?>^o0RG@<=iO<$Sj5#` zBD@VXU+^1shveRA>*QnKl@Q`M-^axQ)8FMk@wB>lb+>NKQ~O=P-!uGu0UFX z_criqO3tnrUQL9C=@xHYwRr!JLRK*A+Id|w-IlE(j}5JEp;bk1x;c)B5&2!k_8({O JE)6&-004qGSw;W= literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.hex.mapped.svg b/assets/icons/mesh.hex.mapped.svg new file mode 100644 index 0000000..3dc91d9 --- /dev/null +++ b/assets/icons/mesh.hex.mapped.svg @@ -0,0 +1,9 @@ + + + mesh.hex.mapped + + + + + + diff --git a/assets/icons/mesh.hex.mapped.vectorcraft b/assets/icons/mesh.hex.mapped.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..9408d67d8a776338db728be77016a2279a5c0223 GIT binary patch literal 1813 zcmV+w2kQ7AiwFP!00000|K(b3Z`(Ey{wsz)8-`w}w*dRlWkpxCTZ?pPF%*G8ON`A$ z7Bxz0;syTiJCdR;IZj5=&QNRtlGr45_vpFf@p$BebHn%=H_nCgjbshu8OJw`Glg%w zrmS=>(9~Iyl5h;2FzT}$bty(o+*vwvVQkK_c1=nU^00r-n>r0`3IflpNxhn_$o*`M ztBU0CL|f9PhMte~o)k4SWUOF(zGk@?f3;jd6Xwl=VV=XduMZB*rN|Pm#fVp3-^7D~ z93TnR_pWo{&fKZ9(I4(T=fX#_sr$5@I`xX(%`<>YKq2P0&czKbYN9(htLym+Q(ku+ z+v}-Q;0@u&fV>wS62&bobAh7SRH8#Zp$vDB7C;wSF3B}wGRDD0G_9TZUJ z+|j&Q0ogO?%y14_fPXAwDX)fWQ^&j0r-&dOkQv zFmtcP`-ui$_)dJ-;6=R_`HX1ZwV=ZxNDBe?$qH73-%Hy9T*;&`YG7;Bl9j~yuNnj$ z&@ajMyrUNCk*g-_^a%qGp6{9Ok$|3g(Dz}Uz)cf3NQ2Hkkta=}?V~ye=5b%tJn1Y5 zrU?G*>5N5FBAbj1f@a`t0}+vEF_+LA-WMQ&m`RZH)qUh;$k?gmJEZVuFF`hWiEJ}> zO!O$yxTYZFONWm!q~;K$=>{UCea$8GhW7=Gph21f-P{d&pRsC^q_T8zN{eHSVasO0G8eVh5WxY z)%s(Bvs=qJ<#qwe?Lw2e)+?D5+UQLE6hS=HYnP{@q2D3!kc^dyF^~@s>X&440v;3! z2uP<=p}=<{99t-nUdSbsQ0I6GN^e;=g7Rv;kol|?k^}`_pluYTu9rq$2gDaWei#}9 z`JEI6yR$|DiEXG?(ln4iNORKp(nu(iH=IDCZkc)w+$D(xQ`UIi)3vR$gh*ONGZPP- z#fQ&gOJEG-6h?esO&X0v&1lVuubjsi$?G-jT#Nj~h!%o}0zo<__7xrGKKmQN#fcD* zJMazIk%{ST9!g&Q*<#z>;cl87vq%^4jDcKkaCy>{(Tqegy6HF)NkW2AFl_mVq%C}n zqw|IiNVk15H_TrxC#O1xjIX|)uW=y#b;P3I+9L4ea_i~RftO0h)SDAMZ;X+=EpxhL zwpdi%BGitmW=s%k%LE-bV>F*BD@bFBMx*csp;XS=*qo4$Ew2jepgt(;crvVd$qtF+ z$9&@cf}sxB*andZ!Zs+34|2pnAPmi2^$OB(+oe`z8qrhUp;9$-%h1v`Q9evshc1F* z8B)z>FK2hQp)6L@cb}Tc?}3h~<_ny4FxBP=Wu)+Ti;7Cr%)>dmxgoZmagej?98tN& z*qr@x#XuKstgAhmh^0z32CKeG)6Btq!liBQ6AyyNu;_&Rkv@9KppIs{eTW9;L4)#S zpb{bTD0bD>wh{dxM-Ei{(2k<>R%0Yza8b6_t4lc8$@s&GJ9?w}x~|}OqPAUmgMqL3 zD%5MIb(OD-AVyR^rjw^i5lfD9Do&fG`;Qm9O6z-CLctdL>V{RSECZoIoxI4x=%}*E z)L|9QXtU{>*EFw~gahs%AZyv)^RkZ>N1m50inOr#7bik$u$gxQAGnyD#GsP#e`WAf zTh>Q&zL#=4!}7@acr?s|UV_{Y89ACLyd1Y?d$seCYq%deAGz1M20dSL)>eZ;^c#*h z;&A;~k^0>asXHdxgIzYzek&c;IF!HpA+gqyjL;HWYl%l_iLA9mBeaCpTEY=pkhK;x zLQ7z+B^aT_x7Om1(BfHZ`KQ$9da#?L%T@E#tW~|%=M&y;5%oM(Bibd5GRF=_Y&s>7 z6N>SBEONnflhLO}9fot%5{D3wsw|ELa!MI(xJ-2=fbpky3dl)yt7K4q*U46DbX+8l zO2PB170u>#vnht&`xCjrZ6PcsM@&A65zfn9Y&v=ndahd;M^8KVS1{xv-rW@wx83Fo zcHdn9Iyh~ed}x~jQXJ>|xNTzkUj8%h^)tcWHj}rqK=y*S){N`D{{}ax$4&4IH)4aa zI>p@QJ8?Z1Eyjo59aVmhD)fjdkA5F3Ih`m&2cU6cM_-yW=%b>DyqlQHPo?T)B}tv$$c{y5=BP7@7Vqgx9C%l7ApV% De13*% literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.hex.polycube.svg b/assets/icons/mesh.hex.polycube.svg new file mode 100644 index 0000000..121c916 --- /dev/null +++ b/assets/icons/mesh.hex.polycube.svg @@ -0,0 +1,12 @@ + + + mesh.hex.polycube + + + + + + + + + diff --git a/assets/icons/mesh.hex.polycube.vectorcraft b/assets/icons/mesh.hex.polycube.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..3eddbcacf2f1b0b76cd22c8bf5dc36286a971a64 GIT binary patch literal 1798 zcmV+h2l@CPiwFP!00000|Lt1qZre5#eicK%jX>1h0rsQIimqt47U|GpC<23)Xq$^H zYLwK(3;gaoBt=`Yos6QLqUahRu*KW?{GAIA5B1>88DHVrxpcmev}QczcwReWc;Xdh zg>xBDSmKRHMe^Ii0 zoi;N9bDDzI74*HQ_av{NA!Rw^(-q6ajO)b=nlP_t4D$@eeSUCgCKoO6N{o2X_Kgq> zs-!pUJ>2FSyfG!nDVOa z*xZbr9IpvK2IQ^ikSK0xkqH#_x)dF9hW=rq{XHiY0h|ItO;%-&YqAwxa$3}QCitp( z0}bht<{2l&R-^}nlqJC&7by|zQCLJFQj(oH&2tb~Vybk}0;yOI^E*HU$vJdz$ubvI zp*RX+Hv(OYC*KW|#Pi{CCLRNS;-N6!Y&PSqtg7bhmRL$lBJmfu(vl?d;vj5=Oi>3Wo$)N?v?I0l)xUHHT8 zjw$6p2a56FxSmWL?{I;R5}$It==*U!-<>3`Kk-{}5t8DynpNl5)UpQ(@Vgp`p&{&Q zT{IxK+al(m?xceu+eMymyZGC1yKhV(2lNZFlcNeUa=C-)JLMhqIQWP5>JHcGlBjjs z-1hVD!28Xk`T+iNHpBTYe=b?wLDsJFX$fk!Qk94`LPzp*COAZ3PLivR`ENE2fq@4&|vWOM?aAQTV+9VA16??gDZP$IoE zN+_X@-U>=*pEQEg!hq*gRDanD#h_%1ekV<4w6;(5wx zG!o^}niEeMk1>*$E2zQb*@+P?1PcX%bdu>QI?QeM4}$X(Ap~yEHXzp$?rk1QUi{r) z+q`e?=Cfy z&%TbS<{O-KFxBb^Wu)-7n~F-*%)>dG&xx&N?B(n_M^t7pG-tnBGLVI9>tnViVxdxv z-mb6GG;=T?aABMK#J%9rKkWzJKpVYcP{6P~K14nB1igBnuM#2iD0bacwh?_VNA^|x z(1xP(R%0Zea9%XlyGz(R$#{Lo9emJyS(R|jR@v^ne$Q4s73#Ioy2@4t5F;udBWsV&VICM%NClup%SmcK1CWCK{S`6o? zCH5f%sUG|?-e1TZ zH@VQ595MPJMmW#+%EHl$&~sgfAHD6|-hI1r6K~&n6mM-#XY9Vc+TXiv9ldMn98w(T z+qmX8{axM@zw1|mzpO{EWr6G&-$ya7_kIm-f(|$S6WoXc#_|+(pYO)?T(lTpdbd=0 z9jbx@szgS+Ud>o8$Pn?Qp&8NNIhF5=R3dvWKw2!`(hx6-Wb_LauTaCl1eWHw67MM! os0yZaH7!f3$I=zlv0>B$j4H@|Jryg8DZ7r%zjW&|hTts#0GnfE?f?J) literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.hex.sweep.svg b/assets/icons/mesh.hex.sweep.svg new file mode 100644 index 0000000..4a5494e --- /dev/null +++ b/assets/icons/mesh.hex.sweep.svg @@ -0,0 +1,10 @@ + + + mesh.hex.sweep + + + + + + + diff --git a/assets/icons/mesh.hex.sweep.vectorcraft b/assets/icons/mesh.hex.sweep.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..82fb4de6a5cf4d43495a74c78183b3a5797660eb GIT binary patch literal 1789 zcmV&57x=&L_~uxNlTozOb(jIe;){5X?;akHN8UM0%GRiJ&YWwUca-G}EjwolCDsyJ zJ7?k4S>YNp1dY(^v*>lsdrjO~HglnGLGyl%YZ&D2{ylH%bfl{=ytBq_IV)scJy(e1Z!JaOgOWZ`dx_Mt*O)>E0kYZ^2AjHaTPVprC#8| zQfB67A@ET<7f-U$R|vdNa5Xgs@&TsW3Qvx}6Gj|Ds6&^C<2w?LEtFV$S^*`}F_na} z=XZ^uyjm|r{Ah(F4FfOGHi|RX%VJLf@p+3MMaDpW$5lmdtdT$<8EH?J1>zHGohUAi zgfe-k^xzKc;+FvF_2?4;`?&aXe4q*Yn}L# zJjO^~uVJHD6-Ros2p9?q(m{(a)nU%r-!Q6Rel0*1cU(eSh z5PTi6==Zh=Jh9w*daLebf|xou)bqv|$=kXhD{6~H<_RKAR5@dUL|Z0M;Ed6HCbYtx zB^r&w8@N(2YZG&YeC%0MSv&PX8pRWC)k}9sgnrB??k@<^Zk??YiNS4yz~n)U7;uD< zIaMzp47XisWuy^5#SR&&nOla`wt@1)pmj)*FcB`*eD*SWW9!NiIeqU#Gf@t-Pc>iQ ztevSgM2ir}neiZI*D<1`#n_nryrdutb=JFWt%#KjH3qA`4AacP zd_uKt?2`BNW3kAJfTGsfZQNQS-x{ z>HXu`F4Og%)Q~WPwzi{xwK9I_tUdw%Rg z$&u&B=1DS{q*tBI*bVwX)#NA*$}#@08vNAP?ZKGurD$iE9yy&J4dbAfQ0|8u9}E;; zPPb-zwbLora6fc9^nAr=-wYDbZy4I}!|X#z>UTe6?ig6U|QUYr!!3Zh7wG@AZ6wg}9KZQP*gWVii zmEBXbR<>H7Pk6gU)bnJHXcsVw7&{uV=@dYYNXFk|5euH1jy^R~7*3H(96|_XW^pW# zW725DWlE(0#-H9vAV=k`(n0!N2V0rZagjJG1?D#;$>(jisfO(R2`^D!af^u_lTW;d z^Kuu74jzP_>QwyTY3KcQ60wM@yIK5p*?d87)t#INr>&C@eOEz<<9r{d{igrRf98Mv zjM4RG@>V3sUhtNfalZFk=qB9LP4J9v_y(gq#@wenaXpng(?65W0q#E literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.import.orphan.svg b/assets/icons/mesh.import.orphan.svg new file mode 100644 index 0000000..c821fab --- /dev/null +++ b/assets/icons/mesh.import.orphan.svg @@ -0,0 +1,9 @@ + + + mesh.import.orphan + + + + + + diff --git a/assets/icons/mesh.import.orphan.vectorcraft b/assets/icons/mesh.import.orphan.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..ccfeb6fa74ddb67822011e412100430de789a19d GIT binary patch literal 1816 zcmV+z2j}=7iwFP!00000|K(b3Z`(Ey{wsz)8-^t6H9$XfSBR3`Jnj5^Zyl zMU9e@c!B@>j-+T?j+0TeGjwQxBr-|gJ-mB(JRbGn%o$(d#<_5AN!Bo)aXfFFF?`}R zWu+NFz(xfLvty$#49o4b=NoY zU?2xnLi@ezT(}c=?5y>}z2{u`fo$rYHe;t=vb$*phzTgf{KmPM|OIqZdlv|ZP7^JEQ=D5s=kVip?LZmc1b6OOju)FVroLJ!*Nb2$P{$j`vt-G zb7=PVn#J=Duk?s;Ec%~1)_qaOriX4!k2y`P&+!wyK$9pwAckr(k>G`g2xQAZ2=N4= z0|=_gZW24I*da)V*#I4`oOIX((nk~6v#POx-VBrg^C_f{53E=);MZ z9uc4$&?H3Nn4=zoUuduIaFZ>GlHDa0-+lw*Uq9&-Fk-=GxY#8w6>Ij;c2d4B!Pi#) zlEHn^{h!JI8&j=66*#-GWQp6+!|jM+uJwxKmO4{E4SBd0USzNh~a7jpqYh*^(s; zq*t_M;vQLicn-mG#z0Q7i0`XKqmif;t!?5f@)#p|vx3uak)IgRLSQHuNGH_3GKV>5 ze=IwuInqm&q}YbOFy8$mJTBCoLImkw`{29Y-Q*5Htve ztvw>?3t!{t*w6v#&R*t@`Mc%hRC37p>g)9yBgxkRn|^DHz?0jp7wP>smBiGkpT`*fL(hn%qL{%#W#o9Bd180op3uOgqEYWBbUN4l&RU4Zd3g zq_t0xAeJH3eD!j6XB*05wS0G}nf#1&Of}!&tb?g`M<^qOzui<+qGle>*?dlHnQ@S_ z>l{(hVrb5Oxn!UVH`ZruZHR?RHF~?gO4H22e8#11?i2TdNB_tl_yak5$)Jj1dwhs` z?g@IeO{5Yb^C))J*0vG-AV)?jerTfTyww=VS6q~>_3je(PBMOf;SN4%zNss?->7YO zUex1?uR^^ht*f{)z%ZinF&;ftidcxEy|}R&?;bCMzgmM}5)eWmuSq4Iby1J1? z??GjgvBN5y(PrH>uV`K|2?yvPAZyv)^RkZ>N1m50DrD;3q8n_+ZmaSKnkc-SZOzVV=QFP1dFXt`z1B78>4LMi>J_5j za=aF|^T&$R?_Z_vkZ2EnSws7cB&=~LfB!16){+d+5?gDD2WW|`wL}B7gw|TZ0a^lU zEx`aS$XW{;pvAY=;t$Z`S!?;X)aSZ)nxl(l^VF(Uz1H^=-gXo9JXIswCX6!24hI}M zC6E(}@jEPX!*i3tw?-X?bJP<15CTPi5^Z|@Y4lj>GUul%l)t<>nc zNM4l!^Q$GzrggI}`t1Fg%yC-?kI50E&timQd&O;e5qhpW@uRn$yVq;vCf>blCSI4D z&e(nTn$p2->*!Ad`B=JgA~x9ib6Ss;5U=MJg&{uj0h_H2Wmv5h!j zEKhOw`EFd#WftR0@6J^Io~eRIrV<(LdNpH(FouXHEzOC3=2X5jQj6@l1Z}Z+Z$rE+ zlG9r%US5TP$ws``SBn=!2~-8Mrk++6)nn-j>ew*q0Y;VNzL^S%A|u~*Z2kdbsm`Zb GD*yoffqk|B literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.layers.svg b/assets/icons/mesh.layers.svg new file mode 100644 index 0000000..92c4687 --- /dev/null +++ b/assets/icons/mesh.layers.svg @@ -0,0 +1,9 @@ + + + mesh.layers + + + + + + diff --git a/assets/icons/mesh.layers.vectorcraft b/assets/icons/mesh.layers.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..802f16be08150145577eb860aea740d1ca6da0ea GIT binary patch literal 1689 zcmV;K24?vmiwFP!00000|K(ciZre5#eicK%4MU>t0s5oMimqt47Rk_J2m*taXq$^H zYLt}33;gaoBt<)NoRp%Sp~C_MmUug#zH{Nxp&pz$<15@aXU;9j8pbn@=Z!OlJ6=;( zI%mPyS&))&44p9Qs~mMMMvdG_I&ooa&a!qzN?7D!H_sb84Q&bnb5^8YP71t+E*RaG zw5g%>3%w_WXvkQ>_;kf`G4^6HgC@+I8N)n>aaRux&E;|>UWpNJyS|YJ13ADEV((q& z%$>MnXRR;pJ?9JsvZ=e;jGcPP?xq<)B_I&<8|Q3}i<;;T&gy!)#1wF3}~4 z@=0_^6gRZY1&U@}i4HkKKbUC$!bwd4r-0CqRaM}IY(-a`mJOZ>rW)QtL$;(v&Plly ziGYx*BADYcBVs)Yizq}&vNNYe0Rk&bl@>Z6B`b-u*^Ia2>V~r$a$sc53Xt>&vQS3> z9bD>z3sRFv{Ka4o@-B%`9E4+MChk%%j)K^YK$vq!^JWRCCkT2oTnVkRwiL_%$!NK~ z-CS>;P*-7?I#xf>TDLQCsh$;{e#tsbz@k?^C>MdQuf+q32IOs9KyO*WYLagixsf~w zI{hDmPTx%v*H8V9&&ZP$YCcuxBRa*iy*8U(JW2X&s+K2gj-QzyPW-+3vc-5ldNLmk znV(F;{&d-3Iy=}mrQmy(6#OS0^R+E0-QzNS-YXAi0xYIKT{gVn)$kAP^&M`qB~j~i z0s87Up!xb)`hl;4&2X{X1S-}%Le{PFZ3$Yn(u^c}(f!Wk@5WT>PX*3yEbYPVEWzz; zz+CDD$t`83C=DQjX(RMh{6ZZ9FObnKF$VG(Txvl^N8kxU0U_w{_@TgeBph2Pk@iRl zB~%Wnp*-?WBPefIGnrgiAxQ$?^RwqB9gTl}l$RDIA*qt?!1o@%f`%+*2 z1)7u2mIgu@z2^k7Cd(MwGnXV5Oj+akL|3-P5(ZK$nwhv~EC{YcV9prGF^nLjoJJ#2 z9<4b+%6N>Cyj#I5M3EmE(L%6LAV_a+NYP<#v%eEu90?(Cd$xhRP`I~wD0%x=i!C8| zTQ@nRkuKmF136#g@+gh+EA6p__5ZE-+?nm z^OdrKG?r*I3a=MRrPs#hgnVgvRagggEm{GQVbx2vNF+bzj{7Tyf=pu@L?Q^=ATZv` z5q*I$G&j`?NW*QnT9s);&sm2`)yy?ROWQmHIw(g zj;ZDwoOLkO>Ih||K-*14C2Hp3oXzLN)-v{TcAX`&22}=^1*kz~ld;1poY7|8HLqx1F$o9EK|t1P zdoQnjs5tWS+M*Z+FaM%EuLhf0H}HXr(NPSlHU6&*Ubba@Fz0(MvokD@oQ_AsJm@vZ z{hX15iNfn~Yxb^oI&ux)hfYWCwXQ)=7o4?KuMqv7HJXECq_$GCSM0?Q78rpB9 z!5WA1k8cudDaimSv9*+VfRxBuN;E)9Xe}iiASJMt5)6>yTTAf=NI}+8&;Ti(wUqCr zKG(gsIl5Rj&v~utwLYKlwwtKusT$EXVU#&`IN+sI0y&}>zr!LoJU1D9YSdvkMJ=%p zAyAdYp+Jr)qxH9`t^_dr^iBaes&19^%I`YaN{x<-(i|n}sX)zMYsM}diZ>jhK5C$f&G{?30*p5I|Fl*{* jRZ%^buAq($qaI*XN$#7eSW#r;yN=C2IY!V+pC|wT+Xpb7 literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.node.add.svg b/assets/icons/mesh.node.add.svg new file mode 100644 index 0000000..30221ef --- /dev/null +++ b/assets/icons/mesh.node.add.svg @@ -0,0 +1,11 @@ + + + mesh.node.add + + + + + + + + diff --git a/assets/icons/mesh.node.add.vectorcraft b/assets/icons/mesh.node.add.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..d8703f0b9355f0987dc2a86ff88335ea17356f9b GIT binary patch literal 2070 zcmV+x2wx{NFo#vn^XmDcU(4a0Z-MB*l3+^UP>C)c4>)G#lClx4}2I>_oF{=tCFG z;Hqi4sDfKE3s$UR4TVk^^{X27UXHp6=lMK@v4vRn8&<(2-w*epSYc~tpwRpN;0$2tDY4aG|KG3pdwxbbkd%vc< zX-&uOZWfeu%bGDDA7qC@@yM$}qUg4@>`-^ug~|3$4Qm~^#LxVCG= zBO4jnijo({kfk|F=xCHZ8mZJQk)IS8p{}wdN=ZBm7V;`bX+qL40b#)tFS<1-O6q<| zYiU%`S911$3tsIncXzup&D9j{oauki+V%_iQ!f=3zZS+2FzHte^P_kk-pTdJh71~# zqiZCskFab3GcHTfvSM%7ol=X`F80;#^>pT9A#KZJ?Ov+DWKNX6W`VSdxy&-0#BrSG zX_QAP^ohPRo$(x@1QSBSFiOJ|qdO};__7fKBpzFW%!!>jJ-yL%>Z!96nWl4m=6s%n z#~*aOg7eNX$Xe>yL}zP%d3EW@?O|*|oGoW`s0MMan9;!}FpkJ91BRkO$-gP?wri?* zz{-->t>n=YFnk`JtTkAxRv-$8(O+f2#7U?$`TQVV2O2{2Mar#+GRwhh$e-0~5U4_h z9b<2E{es`9UUFjQ7ny~1z}h=bbaJEZ)N|vZ&?G0ee|&Z_PX@@<^$0dSyBY216AF1U zPwd=d*mSp^{d{G*_j0PEeDFyv*H1mbk@?DictHL5Evb*gJPUD-4fhkI=x({MJ9k%m zq`OHwa-aB3AL$55(%~cLLYkvEib;lXp2s=P!vjfmKm39CfD#CuBuv6Qevzg+B?u2Z zMbYWKw%Z7ZPi5Qw7X&1lFNYPVhB1UjK%yhW`3hfK0iYVvd@pVU@7Q1?d}Q@wqc8PJ zGEawdDyJN2b#+Q*c4>!$S0;aqBzdw&rEly~G59Qe_gQg-Y{OYnJR7+^gVE8^?W!Rg zy$Vc$06}!0r4~ZoN zV({Qt;=2%zFOjC^tVf3`!WD`Tu|}St>Qv_i$|_bf>3}Q| z{Ek6$&Ok2FNEB(Ou}HK>Tb)FjJkCgd+(1RIEG~>_F)$PqWH)A!R);%h|H){1Ap{Z* zxDlaPy0?2MdH0{5dO|>ZHyN{t33$#x-fwAjk;_<(Br3YuIFcxZ;7Kri^^quBL>7l( zg8^dp@a~5BZ{M&>$)VzFWc@Y8imwwM`n@j#q#m~@vCrRJ5z}UY)^D7V{9F}$C48|c zJK)$7ReKCht!1zQ=Zxl8E=tyUqOmB@Ae1VvP2Cmpsc-7iJE&XH8i)$3DBB}Z`f+#M zzf(9L>3oAo0%02jrYAWfmIz~as(u!&cTrzw8p%uS(5afcWq9SAD4!;+LyC}8g;aO% zZN!srC`+~b9#S)PjcrVIf53SMQ)`Y`MT%(uP|=B+dpH*l56qVtCpo*#5j8EQ=Irm+ z0%Xz7ds}T4vC^r=;Hj_EG1!bt2>* z#Xk3~Z$v-Ik+F^+mMAuFbw=_VEvw%9=@JiiGSSd+CvP-=Y->2UZGE4-c)*oNhk8re zP;+I1Vr1oGcJopxV%5-s%TxH-;pgqXr1gPUP#J^1wiC53%Rp$*XVU7Jc2d~{%7-;w z@@{LIH@v8Yf&+ArknP;)^|{B2Bd^abi(#<&muKaAup7HUAGEx=NP~KgKdT16^i?~W z^Su@A9Lpou)1zY^^cKqfxMZV=!rSTAZLfAcEy7TO;bVVy(yFF$17QnCqBQg12g1SyHPlw^XG*jq|GK??DfLMBMT z-cs-cDUr97Xo3{vE#?2EK6iuN9AB-wm%LW@dY@0A{X-NXT_f5jj4H>DCu}+ukPC|O z2Q2D=7iN=BjSPls)Dnjfh^{P71#(FlZTOfnC4lLtcN)k=b*pSpez(b1?sQzFj!J>~ z^_nm5+iqJ9+51=aK>Jc!OpUntB1Z&o_m0WvLFl!Pzei6yPhP$ za@uqqDWJbH)EJP`lA>&EU3ub>eT)iIB%IvuUX=x;l(e{gif8+9n zd>EL))D3Oro9_&&g3GSGuWN3{@(t9nVbpgRRk7#pUe1{Ajyrb$1D?YNgf1`u00Xl7 A^#A|> literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.node.merge.svg b/assets/icons/mesh.node.merge.svg new file mode 100644 index 0000000..8818316 --- /dev/null +++ b/assets/icons/mesh.node.merge.svg @@ -0,0 +1,12 @@ + + + mesh.node.merge + + + + + + + + + diff --git a/assets/icons/mesh.node.merge.vectorcraft b/assets/icons/mesh.node.merge.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..d37a3f7adb659dfd412e64502cf5a575484af03b GIT binary patch literal 2083 zcmV+;2;BD{iwFP!00000|Lt3QkJ~m9|0;(5HUyEPUJLY(T(0O9&0T`z(4q*81#NR} zb!Ac2BfD*@Qm^BIf%nxAhk}tXqD}l+^!+mJ#wRu}GxM#zfwO{fj z^Ea$sF}R~E^R@xXhy0lp4Gb)J!Rz}C%z@F5t2qqOx}9@cFJa#2uU@{CEK9l(Gu~+0 z1i{1_APLdWfp-`9!PMKDAJ53U!$c10U%RQ-tohUZ0^l+bNb5)M?tvB!GlZHq&Hb9@ zb)yNp+0-lOmeoT*-U)(4@tBuOfuh}3f*|iO4<^Px)U08EQ$T3hrYdO5_M)pgFIzen z+G^_#1{UkQSk|oEi^QOis$#UJ<$?)*IWSR(lw|KAFA5M?(Og+V11WjQyxnfPpVzcC ze`EtQ8(x5Hcm3O6J{|nE{{pD`9d!f3D!mU&F1*1(j7eCdr!qcz0wgfQ!EQ}lZ!Av}#xX%1& ziUL2H39Bs%-ms-Hw(mdrwPm&;5XYztqS9W{}|_-aZq+@ozT`g zLiZ^4qh#Rz>5%~u@yTWT5Lf%$PU|){R^HIF&$TANK9TV;^@LsZWtxU@6h&E<;0z}~ z<6WzX#78I&2_Zp%lOPFaM!NTD!#M~vnisYWLGPMzcygbnDaPbPq9zVAj=<_ih{fdq zD8*RKeepQw5yuegn(+%zil!L9cpODMVSMCrB5O-q75NwGVa=LKW3i&ht43J+3G#%G zvfc;0W<5My<#6|Bv5JLpAl32w00RgH0{tg`3!4dT9(+CeTl>09H%HD6*F7`GanIdR zI>z5oa>3y>@r=i7>Uozx1}?ADOHM!dSm%LbSkih9mY$7*!Kr70VsP%C6(ixO7?Juv z1WEjwK@tX88iWF%jFK41z%Wswh`XCD`gYQe0_}Cze5js4+xXzjY5;On7-b{~NfyOH z5J!8jQgra7m;_N4M*#`JxaZS2unM4N+Xo^-r?+aVW=~EfYw{WH5M9CX2lXFjfII|U z%O03Lq=*X-3h+-@?4i7Tu))b1%1bQ`&b~H!BOjkUu?XIQQOnqs-jVfUH~FX79t=FW zF5shT8%qVsk-_2^{$RX$qU~bM6eGQ>{ro>r)$GEmy(;*e7Kfd4#oMDoUUT_r4VH1z zt^h9dD!=FQduJ>4UjuPqbbIAOPO}r+d^w$xKe&>n+$>kQsX8p~iW10<=i5qJq z-GZn>ZMW{wTZn#K6G_eI45-@S^<%1 z6{UM5Qa|>A`(FwtS*>dli6L!+z~rPx3*H#(B%3DvkJ@cc@a$-ZFXVS}30u zt$i0EiA<^X(OdH;*Ho6M@I91f@;Wp*)qa6~B87DQn zsS%Z1jIG(O(Qk|qJkm$sa_Bj@ZXe>F zc}TBU5UN7RK8tZ2N%UrxKF+Kde+jphjfuekthj^&?jRr=-sm##q2|bC-lCrcn}6|6gPLsT-JlOzOs>+P z;_-LY;HR!^25Y|8ay!fR$nErKSqHs_a^El5V4?7Oy0zP@-A=id`=Q$@cV>Ff_p6$B zRj(2KT}`**^{}BP^$*`?|c7AtiE_ z5{-~ToTZQvQbK1b;Rq?%SqdH@1vyLkqta*A+s);xb$c#q71jBC0__)3gjA1cUogrV zI~uX+lt8X%#vicA1usZPpBiZlx9BDIArRGB91G-{Hd=p~(k+1Tr*{g-Reh_p*M2v} zR%UfvB#%nL^Q(2fxNq8R(f8hevj^H0!eVm98=1?c5(%2XYbD zZ##?kweRQrS-%Ewa@sn1-?aslINo35WZw3<@P+6452IhUlka7N?DgIhvhVl)8M+}y zx(P4nMr<(F*O>cuC$6_ri}j(mRuw){6?vg5QPFNUb6yB#hI%m{qdp_Fixlw;Tw& N-vQH~Z#dX7002@p7r6ic literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.order.quadratic.svg b/assets/icons/mesh.order.quadratic.svg new file mode 100644 index 0000000..8ec3ba6 --- /dev/null +++ b/assets/icons/mesh.order.quadratic.svg @@ -0,0 +1,13 @@ + + + mesh.order.quadratic + + + + + + + + + + diff --git a/assets/icons/mesh.order.quadratic.vectorcraft b/assets/icons/mesh.order.quadratic.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..d2ee7287441821c64ef92d7d8ab20165ce0b655f GIT binary patch literal 2246 zcmV;%2s!s3iwFP!00000|K(e4Z{s!+{wsz)8-_^gH9$Y??G?SEd$)_-LyKY&1hmcA zYGhHB{ZGDkR14hl<}spZf>YM#UW zEg-_kIS49gDAIRW0M|oat@mwoea;u@eSdBg~H!c4r3>R~aI}8tBEyL43#na0iPe+klJw4kj_xq8qLvrZf3zHW)j&TpY zYB!siss=An1qfC zDX;O2BqR#MFim5e;^U)UO2rH!5(I(oC{kzov-&K+=H+D>ZH}u%LG-# zq8)uKeyu)+f}WG9hO=I##MW+xB8X=#&q87E&W>k6;2Ysu;)&6PE*s7|kP=(_jD&vP zO-`|1@RQSN|0DcFE_T;Zl2_{}P*>^ZT)H7?vmlDv+vY%KHI|-&Rnir-x6M7yDCu$E z+~c1TpWQe|Jr;B(Gaw#-e%MqGjCE>Wz9MH{RUpg_i=#2UzZ z2#_l_xdKlR3J8HI@rDB5m2h04L}vFZp@gRPte~{&zgAG*Z054g?t~->2qI>UqSQxe zgftK=BsdJMf&2@$$qyBS0|duFjh`ukSLEfHo=NK)=0kJz_D7syfUIenL!xH6q2wq zhdpQi&uD%nguw4`15S#Bd)tSSH*hTIdTMoWlc5#S0nZx9+Z`>gav5WhNJcjkM)3Kjlaf3@^!>Rf9r|>$;T}+N17;=#5Bpj z@f&L-KNibu#a*$e^VHA~Re21F&B_oB&Kk|n8P8ech{m8molq*hHnum&hiz5n&OyC% z+>B&cMacn)w2!^x{+F)cFyA$ZKmk`MjC(mE5eP$js($3P^KrP!G@^6tP^p^z%4CIW zqTEkfyA*+Hw+N~B-dpiU*H9KK_dTX&@|u{KYX5+94yI-~LK!LW;h~}uHT!VR@9&u_ zGkQ6@$q^MT#^&sA*Bo@w#uW@PhFGaoqw~~PX_`HlPqc8&ed12==oWPXJd&etIaHrq zw+~Tgd4kTF9#M&qeH8n+tz9E}FGnUSei)*dyww`XFElT<&QF)Hvy;JH#~r=V{Jt(L zR@bgiUee(TR-xXI)>m8^VHi>Qm`=`>B32b$X5v-2>GA8$p|z z$yF9qW4u-ie%coGV9xhaw6iRaJf9sc^Prb7?)wEBOcY+uwsw29=QFP5e(3p(duwXY zcdLqT%T6Kshl=jROTR-!>Yu(#{V~xV)@29n50bFfq5P-s5@#*R2raR*mUx7g$XQD? zLQCkZB^;q8aMlux&_bNGkP%w2vlcu;3v$--SEQUkI5&|!+W_`69x}LpX=8ZgQuN` z7Z-f_5ZAw95x>H@oAW1qaNRp?oxI;RIixtwhET`KfA_rbg?asl(J#BnkFr4ag1@G* zuJ`^Owh3CcAs1{THW=$`mizfmT%XG<)`#BORJdiT;KWoSqup)hJQv0g@noAVnfYF2 z@=c&xWX}a?i^Xdx;uWA}_9YX)ii3^`3|-M${O*iFRdCVNcV(HGzS#!q*wE`M^eWg> Ub0 + + mesh.quad.faces + + + + + diff --git a/assets/icons/mesh.quad.faces.vectorcraft b/assets/icons/mesh.quad.faces.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..cf06eb91cce2bc5c567aef76f7d8f6a8101d8d2a GIT binary patch literal 1737 zcmV;)1~&O0iwFP!00000|K(b3Z`(Ey{wsz)8;0H`2k3_`E4rfHTBJjZAqWgwqHQj; zs8Lc9FYtfg@y)RkC!=U*7|;NYCBEI`yNAc)k@wz$@il6_Gw%i$E#n18i`E;%8*d1! zyt8=hEpdf8f=X!hO}080tw#Q2I`N@x$%<}`D;VVdpNY_G;1 zMH|cy0r?~$Y(sYQkCVSbn>|H5&D0jGe_;&n|?i+7@HPO28og|=GWK|!%1 zwB)$ji3~v@b&U~6Re{BL1O`!vlw@x~CI+JnZY~~`xVf)V^g)shN*-NNrl1tC}FfuoWT7*hz@ z`@q0=3n&iuiUS2qfs^JC%!pi>QLzepC$nmvioZ-7HP6#9ixXp1O|YI-{a3Z>bP`29 zE6Rc=MpH9X*#HN1`Pe2*_0945^1hP*bf-ZV8f?x!EpuD+7ZLz{?B<-gz ze*guxtIETF2A?7Qh%bTxOQZvuleX}CfZBA zz@?+iX*i9+r zj)Jo1C9I&lUC-qj>x3kaqaZRiN~eA>O#=-i6g6RzSOfV3Q_60gk-%b`nALC^$-mg> zM005%l+k;RA$V}~wrbSb43uyr$&Cjr2Kos8G$`GNf`1lphDJeTu}HbgA~Um$O?}SC*;i`w*JR_sIBE z`vuO~nHqB>(o=-HMMVW__U@c57TA>;k79NcBPv=9joHsv3}m6!Ib&lKu~eZ(Z`D^} znmw4WsB(>cvYzwkCywH9AV<#`WKCSR4{6UlaWC5usX)lyi(Pb$t4DtnBS*@A7^0ZC z)f&lnM61qubxC?VnXo@`2X8drH8rG68`qUL>TxAhuHKN=S6msO7?JrHkDg0KEJYSi zWWdJ{k7v8Q+9y&$dJgKEmendP1Fk`3gJl|QP}*edu^JVm-RR;qDQhO-038HmGj{Ou z*oTrMFOMx!aw?Ij8{4rP^nvK;C=IGHepC&9?W*Qr%=cQfvrLbiPLGyx&}%67bAb;A z3a_VIyS>`!lxw*kI-PQ_Ob&XsPL(g9KuXDP`5DY3JZcz~41SxPiOO6V*l93Uldmhx|*&sA?X zN0zJhxml}fozEwN-69$UDo3;n7-fu|4A^u^AV(zQAF#*;&(8;+8fgrt$R+k6#458m z6v#1YwEi-sQvkzH?-Y=u@>Y2-{ceJ-snv0jJSqj|*DF%Yns!6`?EM)pP)CKuWQ);P z(ZYMZ%N7R@LQi!DfAF;P;lN!k;`;uIxPdd9vpaon;n8X9=yTUn2ywjs$K3+k-xa>_ zyMDpwW;6OA6J)P=lg2vV`(NlL-qTI=f^NhHV|9$VPj}*aDz#W2dTUjMd#Z|`s7ge% zoAsPgp$y?qI#Ocu%!$0D(unA}0%=(&jL~%SlH3q+84eoeTXEB;5qHioWCe@1nbkEh fZOIz)*wE@8T2=V2ok + + mesh.quality + + + + + + + diff --git a/assets/icons/mesh.quality.vectorcraft b/assets/icons/mesh.quality.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..8115d5dd18abca7182f120d32d4b04277765fe3f GIT binary patch literal 1952 zcmV;R2VeLfiwFP!00000|K(b3Z`(Ey{wsz)8-_@|2iS+ME4rfHTC_upAqWE6W^699 zsOhDNSNOm0juaKkaWaZdh7L0j#3m`;qr2yh$0NUaSF+l$#yj)A@`S#Ghp|AI2`_qTTQUCi!;v9GQBJXmSqEYOBbPY%<7y5~tZL?xRZAFm{>>9hHDAFtIO0XuHz6>v z0z4@9*7wf*nLqWm=F2Vd&S@KEW&bGWd2IL)fC=}PCSR#sMTVjWL!n_!^f2erP0VhIe_@>NR!+X(XC5nd4QB_UV zLc?M$@@2(~UL*yDlqF{sD;6B*6EKNJq$PV-BF{l!$%HmT2c(b%_jbE!Kdx>ndCiZE ztYr?8_8_ANC;>wW#^hGa$hhA6p(%XXvWVr&E%RNwo3y)p@eU{24VKrr2m2 zvMeNoMqw6bQ5f9$f$EOIPogx1(BKDt2wZ)L`r07TjP}!$gGWtoH$5E+rm^XNVE$m1 z4Bcw@GDo_PVDDrfo$H<+9(&PrmiD5Lyov7aq}^A9?mn1*kF~gRD0}DPt0HN=X3F3^ z&qY}yVQwHY%%X!pGxgTk91lVpL@=)u@bo#Zq(ST}t=(QBG-&X3;aah75RN_jr0Jo;)HStqFh7Uf-~0vF3WB zF7Y}46%2LpNDNx#a?bL*FANkTzW=1hmB!Q9vVf~Kz@giEpMEWq%??3I*|qH z6B?a#Tp9^w^19-%8*z-n1G=OMYRVbUJF#&k3oNy06{DGCKo$z$VZEi+Ku*yJrP^r> z67A7OCsdQi8p*2-?9KD#i4iSIFc^b`zXZeW`LVv&wN+NV``%v-%Dh!Sg zNbe@cEYbx$YalPTtT@SKj7DM=-Ao*bl|q71FkJN!D_c;5qhmt{q|2o24f9u9@l(m6 z;wv@&ngoikBNqME6#-GpEs4$gn<-+N9h&hQYb0-qrC3Q?|=RbHFeE9664mAP|JH=;EV6;?^wBT@RXcidkXR5}~iAQD5^27$>z zju;@q$eyYnW$nD-(V0g45Ic0LW^Wl$xF*VnN$ZdzVWL8+z4un~#x;~B+I{a*Gxa+# zG1Y#7a}K7)9Fd9?v|m(oqGlh?<<%8;WyV3yZgNCTi?KQT%e4eqtZ}Xj8bz#hsxesg zb(&@m<`XMibDv}oJcgCGkdEZ&O9>SZ*X=_*Fi$wBR0KK^vX5dP+uAjvALPh^jvt07 zCU3Py@`dF^>%6)|gPjZ=I_~I==Bv7dGnm?S9gWy@Dj+8m + + mesh.region.remesh + + + + + + + diff --git a/assets/icons/mesh.region.remesh.vectorcraft b/assets/icons/mesh.region.remesh.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f6f9993e610f73906181a89aed1475f65f23030e GIT binary patch literal 1898 zcmV-w2bK6AiwFP!00000|K(b3Z`(Ey{wsz)8-d&57x=&L_@-F4lTmciby$Ja65sC8-NWPY$a`l=*&4OZxpRXTEoBRamaQ{|H`WkZ zIp^WjS>XyZ1eMV0vuO32x0<+T*_jJ%bGqo(xPn3MANqMyrzLHPq0bsO#TmmZD2E^Z z2A#T!v<*~#B6qlKpkP5u%4Tbt^DY;wITRt*&M9I!wEKGRkX(#fp*3&uO4Us~XvhE+ zmwx9u=kA$1bvF9p&U4QFP!y@B?bK-sdOKSHVhjQiyLQf(sBEyVV6Cw0K>YsKveLnvtqSbFQ$Kbx^P< zNSQNS^&)*xNL^#ZP_@8(JOYDAL{hS|BxMN#Yeb|m6p)6N(0>OAS8@pzOlX;LRe4Dq zCTzu!aLFRi=vfXZ{y{x8X^cq`AOJn{oQPR>h_LDGD!ZHN~ggLh) zZwpZN8B{J%&51#~ijV#WB~|~rz1kjVzea5#(D4E8ou-@fN2xAQU_q5JVbHGu@B{v? z_~-F=-#b>o|LaSFz5uwfC~1RpX*hwUBsaoBO@Ra$&QDaWO0KV4_@0y#vd|9<<%GbP zoUl88F!0?HioKm;1x$hy=HSc-Y?)Ef3OoOvRoxf0s^{-nQ4|~)P0sM?aaQmyLl(#q ztNsswOuG*#C%T)9-)Vk8YvcX{08f4Y4jaSogN=ckrEZV~ijJ`-7^vweE5D(Sk>-fc zB2XP4Ru!aYSsMAN7bKw{q)`I3v}^lnSg*V=@n9-NN$iDwcBMf$mupHvZqE)FS{g@> zf6!M~D*^kWb@lP_rSW(0%YtJ7<@mDx$oD;gU(ikCKftGI75u}`Q}uh}oA_s3mZWZ! zcg~b^7QZ#Y$}US=Fx295mEYafHk`t~XgR5v@ zF7*QEmNGLx3xRt&Jn$s*e1*UZ1us)$ARl2`t?=XoJYmEkggWGnIKC6%*g}bQtR$dB zIu@5ub|NPuD6iIYvG1@#l7;~|T^EQ1|-s6D+|QG zQ0qi-X(W`%TZUmnWf|QL=#nN}Q`UGskhLvYqEJ{xYbF_x#fN9Ubu$KXibi~2P8y9w z&SqKI3+aNI6 zixC5kFfym=1#PSoNix!iA7h6M)yyqJD%(JLKWH6NBus=$HJ`nV-rBmdL{8s_&`i7s z+NYW?aMsRLn^er2v=|$+zb+`qLap`AS}S5DLyf_z zFT*r*Fqf#ZjeU}V^B8XMLw_VkUsK3g*lr)^MXufG`I7Vu0SKeU26<@k~O$_G-_kT*Lj)^C|aA=b&dRM!R~DhmZX0FL*|b0_F$I{lwS+N z8oToMKcv=D(h*V;YbnVHDY3Pbc!ZS5T1qrRN@y)593dsJmJ*DR;#*7cM@aFkrTkOq zb2Zq_kyX(?Hfv?A_4$O?FQT3&b3}c>C}Qkr#HLdKIUyPUfJH2LZaVtZNMU%6T;dQy zC^L&=ft->?8!l5S1u*{fP69b8ZgAZjE;-MQ7JILF34imw3~9s-ke+VTj(a-(M|A#ZukbHIK|x0cjEe7YB4_aR;u!MR23em zibu4Y^_-Sm8QhGd^Ox-L2UE4Y(G58^J690QpIu-T(jq literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.size.adapt.svg b/assets/icons/mesh.size.adapt.svg new file mode 100644 index 0000000..402fbf9 --- /dev/null +++ b/assets/icons/mesh.size.adapt.svg @@ -0,0 +1,15 @@ + + + mesh.size.adapt + + + + + + + + + + + + diff --git a/assets/icons/mesh.size.adapt.vectorcraft b/assets/icons/mesh.size.adapt.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..af263a70cf87eda1a429d0bbca274314fe0b262c GIT binary patch literal 2658 zcmV-o3Z3;IiwFP!00000|K(h5Z=*;O{woomEkwW4MA{E?bF018&fSb=PP;lqQG{(0 zbHU&PJc)PY|9;ioG%t4B)8J$^QX)mM>7wiDr(U`!Am6CAgb@}!Jm5Tt%rQtzeIRp3W{0J6(sv0W!QO!BQe56!$ft+NEqStr%X zuhKsgKVHTgIr}zG>k39brO!!L!GT4Q73JN!SW5ZN4|6yam-W1e%O%L&eDl(!nlg{q zQsP}Rc7;H&1V~c#bKqSEelYWP=EF1ct}#`Inos+gSFMVty9K~aKw(@yde`@HRwZVj zEUM~m6{ls@4D4@bUKa0?(gx&%98f48(|jpW)VqxwP-mEh$>X2Oq)Gs%git5zO%~Tl zt9nzWc^%IsTXngG1B+FfEz2ZtRbn7yvq|DI&KHTCFNH}oBCXlGPqPdZZsJs1q5+Z@ zdE)K&vsSLE%i=MyNLED#ntG6>IWib1l|4#Hs^Ib`1fNjf1jiv|GjA@xMJVJn3^*wB zp3-H#0-}5vT*Mn`)MA^<+5cOldHZ#LyFX%X6T_J^{RfU#+qwLxmkNtt6^$Wa(i;M{ z#b9bMQL(L?14tf_3ziZX!4aw?q~04jsJ=_HF0!IZmaU!liYCc6naZ{cha`wZKqAtR z$dTgBkf;auP8QR)?X!I;p~x48P)(Qq&ZV6ZkD@T*5hE?#au`KEAt7dh1OX06K*L)D z!TYi<3eakdp{yf(VP?mNXL2)atT|MSsTsG=PklTFFEs=ty* zu%6zsx@P=f{+=hw=vOw((yz+#s#UCvm}FVHsiYG;K{D`ZF!+Hay^@DX)c+A2te(Qz zH`3_|*UUWME5ik|p!r4WS7>Ux7@%)82CyGQAx5m_kX{vGC{4Na%-l43;(8WR0bc>9a}yc#&-Pu|r#SVb0!em`7Y740(_E3<*Jn zu>tOa$cRuM3B*KXoTnetMh5$WaTM^zXV{s5LG3AIpqX^e$^u4&nTwu~HIV~*jNmOe zVi&f90pCzyS`TDr2(bxUmaSpggl#;2k0k1cc9JaXw#k|lcf_bo_|*dX_^@+8M<>0d z3uFFP!x;P|0D{6c-^~ydS)7TWJ;XbQvB*YPFd7~0)fQP;Id~3lU5K3vs^Q5@U6l+_ z^)^RNc|_Z3L%XaAD#-2>w|J3V*bWQ!XJ@V~vbObWRMv@)h;`=*!o|*&W%)K)W5Oe1 zZNis_{BW~|1zZ^NR^K}`au@sITaA4NaDdk~A);9X6(M0_iMovtTV?G?BB-s; z6VOW7mS+HnlN^1A0O$w})QV2+;i7D!#sY_A*<@dB7d}4h7^FSVIkZ<7o6(!?6az&Z zK_+9I_i|vn%{AlP$5`~6q+Rb=3s6`H>2*m@_nDx0!|DVw(5S9BjY<}Y{#k~z+cq58WC`(dW!Nt|>yta}e#LpeA+w;65PVCe8ZN;7<7 zc5vo1i)n@}U>j|6+`8B^i(x(*s%y0!W4FmRs*icF3BUAqCOg0vMwfH|tZ(taFNjr7 zalKe2+Qph1+Bg3K$Gtt{&<|NLkF)Nk`KGAN4b)jX%O5L<%1JROk;>pxf9LA&-c{@0 zvUu@0G4g{Zj4=s`pit@>8}TSW5$sVK2$myoU&R^7 ze;~$-r^!eJCd}+j5m7(XaMJkFNGMmolu43LeHdimE+UjnO~&&fT~Bou=rT&H7-qtO zvtanlfH`L%moS2{4jO|*N3`JtYv*xB^7A?=<7|0hMq}WiK#+M#2WvXqefHl;oLvZk z1_R%KyOT1!-BZcC|83)m5KtQ?Hj6X~&l$-3U7TMOGKLXVZ!nWbxFUp%f-#j3u55t~ zj>a1rAk70^?uPkuTPBw}hsv+m#A`^DzmC}Sw^I=ywcR3a_TNZ3rYZML+&CloHD9I= z#Z)ZH4uly;)e%ENV;Rzbb4K%fT4YH*5sg8C2B}mSI3{~13dc|A3Wa7f#rFg&OciA2cUUG;NOO@8iDR~r13cj!{h-7;xDwNO4RT8Az| zLzPn9qqi)crlzt`hi_M!sqe((RQC;TaxyjMU@BAKc2m)XntM7g?(dVSo^epKn;KEO z#n_tt{i*<6aXl3bF+@D*Qe&{|>oUz9%$GQyTKj~9)++LTFEP2G9P zz*n$N^~Pxf?JFaQk)4m()u~p*Lm4kq`KrXM`*_`U6F;OmG&W(Zs*8LLd9 z9B-AuFWbDb)_kw!c8=|lm*df~4tfo8KQ0n$q40X#x?QWi9J!9yLoY|}t?5DEJ(R_E zGiXHrQpP*^W|*x>{o7AbFeclBU3PH%Q8}!0D*x>#Fe0#fCs4bIBBXmnZNaE& zY&PPeQvtc48Q)=18(ttr-!*D5yhJZ?2!ZO(;#eS;w9$s!RMP?&fA>xUxu|a?2JLrK zY(-ADi_{yT;Q5QzSL{H*1MhUqY8oA z#G4nL<*V9v^WwR=aeZ*N_3Goc&Y;BcevH?XUDt)rtm_|1{B?Krt7?$F-jgQo{ocQV z8`|TBoZ&`ZV5}}N_siXJeJNU;Z+bUW;T~1=h$>mp?$+}nlVr$zvQ3wX`CO*z*`G>Q z&pBudu{1`toiEd`sr;`AASht!GOpx5CrF?xxTveU%_cRn=^FajAoUHT^5nU`Q$dRM Q{gM6u0VXJYv(!NV0Byq}hX4Qo literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.size.global.svg b/assets/icons/mesh.size.global.svg new file mode 100644 index 0000000..b5f9d5f --- /dev/null +++ b/assets/icons/mesh.size.global.svg @@ -0,0 +1,11 @@ + + + mesh.size.global + + + + + + + + diff --git a/assets/icons/mesh.size.global.vectorcraft b/assets/icons/mesh.size.global.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..6da7c55b8426303b5ba677280cd90bc60f93ec56 GIT binary patch literal 1824 zcmV+*2jBP~iwFP!00000|Lt0BZ`(Ey{wsz)8;0Ir0`x&58~DHP_~uxNlTx(Zb=U#~miTs$?j9bGN8UMe%2ud#&YWwUx0K}!&0A*-Z>%A- za?ZlBv%nQ*2r8k~C(-Jhw;H*VY~n)Og67={S1`!keLrvPw4^OD^jYC%IcdmOJXw@< zhDzwtRitg8>I1pOWdj8{Eh(F>Xu&&NEM`!ISUaPL70~X>okI#SW`$O~#Yzuh0ckHb7!>#9>`JpIMPn)sREa}ZO2fP>rB6j7R%~9E4UBPJ6OqYnTMpbMs z$4-gXnC%1dj#mg2SEMR9igsP|3eiJ<7%%_8aDxFShtT3xU7{9mMc0f}Et+w4wXB1J zd`ZfJ;c6?=2Zhu%MhsOs=Hn33m6-;QEaaDOq z942lIrsi*f8>Oiq!0U{^hC$|gQL@==##>oU%jgxhl$OT)FHzFcH1?A)Qo=F?1%x>_ zq-d9*>YXoWdAGXh&?RJ6j*KWA0Xi_ zSs+VH`g`F7l(7pymJCFYJVKD{?Z3l^@WQor&L#snnlJlwVo0#8vcg6*0`EUf{w~X69!huu(7Rp5&sh5O|?r zYHAGRJxsI(9vy%uj5vf)hp7?AcOV>FD6x)j1e8d}&l1W`v||M2USTCyGl0p^RQL44WX!h_pwSG~t@E z#`BJ>Y{?RZ!YW!bNslZ(JoD|AF_1$v;`?&aXe4q*Yn}L#JjO^~tspH>76*E?2p9?q z(pv>zs>7VKzhhJ$2qAQP+<@IKpWf!K#cw)KrbXvyC z1Tl4JsOOC_k~dXB7StAt%n3!BsB*>xiMC9jz!{_YL}-ayOEemV*K?&})+Xi(`OvYt zw07#fl$j^os+Vq&2>qB(++PtSSzB8t5`)_YfysjyG2jRzbE;lI7;d}N%19%AiXAdk zGq((>Yy;(oL2I8PVIo|r`Rrx%#@3Z3a{AtfX5u~2KGl4Ivv#K19Fg!8{&rE3fttBH zr}H_sWyXV;UB`%$7DHq9^CbmYsI}f}Yeg(%sL@;XWte6T<|C?XW1pnwJo;Py&>zUr za|&4u+wDW#Gf&vd+6FQZGWTK^U1RIfAH>Lk^dFiiI&L*a@)?y?XT7>ay`7BTpSXiJ zny;D~j(!^3l{e^d#h0#Llh&178K4-R`52F$N<}RAX#_vY8{a>kZS!33NCoLKsB2nU z%d`x*26?I_()okZCS!-zC@1Y&6|YE9QvnC)z#;3gz30c?mmGP1Y@Q*L2QsR$8M{Fr zs2m-nK{>{MRf8Y9s@WU!or-pb>5=2<(J&4=g>v8LcyFL^I^CM>)sClJ!~M|llzXXj z(9;E@UENDWzh-F7FD~p$QontXxkJ1?*kujnSAwv{uKewb)LKe9KuTgQB^e+kww4kP zkP=x-i3Ugst)+wmqy*Mdf&o%|YbpK!DW0{IZ-qXWz1jK4z@C*<05fX3e2yUB%e0zy6m&}XFNw;$t@;Yj6U)f&gm|V?L7!R)|vR;)6V;g zLt+tE_we{l!s(3Os{2!RUHDdLt5KC%h48obUY} zx(Ro56Fj3EzQI@?V(#OexE@O_#)sZYRsN2u!bhs&5$$?4qa{}c_a_}GuzqGl+!<+j z^jv|oMBGnox>-T43BT0~4bu(3vDomtvlz01dD~3un&`G<1$k^}bqB2~eA`a>h{ + + mesh.size.seed + + + + + + + + + + diff --git a/assets/icons/mesh.size.seed.vectorcraft b/assets/icons/mesh.size.seed.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..ec5854b84a9f8ffb4043a13fbd9f1a2ca2d4f712 GIT binary patch literal 2311 zcmV+i3HbIOiwFP!00000|K(fjZre5#eicK%4M8Gx4X__wH*CYYwP=S8Ll6YA&DdIG zNzLTRh_V_?-)n4&^V_Ls4y$#=5aSlVwv>%PM(jtT}wE z>a@tM8*gr{NlvN+20`j~CiRv|%^W+n9gtlW%XUk0nB>dhK6h?4X_FDSXG`jhU8nyL zyC!4>H?(=$)G+WNeI{8A7nVgHxEfx6FE>7b$!1{ z(yA5%`@6Z7B|B27fV`sv48>!buPBOUSJDA?hg=xF{-Gi@0h|;G^A5qR%zZO z3rbc~wQym%NwZZ&@=hfJLdudPRgy0WoiBw+I3ljudPuVj6qZTK4IzN!MNX{!e%{H| zO;tP+g=Af1>8cNznj?dOirJ&0q(%Y#3&ADWwT%|;^|MaV&MgnZ=2ad;;ISf92<0Xn5E zn6W}TlyjrujX~teVLm%PQtJkCTs^;M;{kT|U4f3zE~G~*JB=NI>EzrBY+{(tu2`EG zKbpVig*5V+{j&5kbGmwyFawe-OUs%%z!M|_+m8o-!Q9%=%YoDXb0KY)DcpTaGa(Kf z#>?{qvzjw^#6K1u)QXhYga3Q4)&D&^L|%_ZG(6tap{$<&N>=+dSD+kQuZVvS;$ z>mE}ihF>fi$CovuQQ;`eT!-NFUu$qi00#}IiJ<7{)7&}4STwc+tlY#@vw{QnlK1Jz zj6r|@UOW$BHYK9ic4M#Sg050j?5jXLihE!^rLYq zK*b%X@#>Yr9MzatrSSi>?K-}8ppX4-Y~w@F2d}mwMRpiP)P+&!ApFv?^Y!XddC$<5 z&%_Ko8b|>$#kW3G<#y+-thPKai`Rl4iLf+&4sf`Sw@vxVtl+xXy}2k{w#u zWzooX=DeHbj}3&AQSeZxG-}xY3-qmCJV4^cdu?ML^ z_O@M~7?42VdMs^3+CbhzE?bk?1$aE4LhuA0>{EOf!ZC#s$VNYd;`2VggwkvKYe9Ll zU9h7OBP5ZBT`X-B#Eu&Wt^k7Q2=aYxAb&!T7f;4WB7}Xpsl=H5d6E<1OB12Yey9kX z`4}F}4BRCODO1LH-lbbpXYoB|70FCEa25ogePB)-$R&&*#Dhj6;Snu4LEL$?k$k^} zGtg{xVMg=8LxCW9W`;N&`ab&`NwNzec+S8#kn7X%)=wpG{%#XP2yPc9DvOAOrw!!o zF3B$n8Ocb%vYX5!0V4!Yf?>)>z-)me4&e;~h&W!=H_Sh6MJ{y?mS2&K*AO#*ov`V* zrU+cN-NHed*neZ@n6gfnaifjor+k&J3sWr24%nBD$|DAc(lS_p(?;`qT4ba#L?cnS zgH+0*Hqc^rs zehY$E8o?>=;H8?rWzyWVP(ChNhc4oUET!s4Z&f^*rm~QS@1Znf-?7Z8`Wu{aGL`1= zS*AeUrosy~{d8VDJP=dQII7uYjmX_%YR&$3Q-H3dF$IGq5o=y*40e59rs;$El;ozh zPdG>(!~TnhCi>{x0vbi8j}O7XJl^2-CCm#U{VevetxYrfQH_jw{*aC$>sD6NsUmkNNCWD`H(GtCYUCI6r*6 z>Dqwr(i}RHFjhB3$=foJ8u&|mbk~{IHi0HpnJm+0CoXT(Rar1N;0_eBoZCG=x2idE zes0>{f`@Mi^KRfH$z~TZ$me*i41Q|!T3PeGl-p^xN3O@CW*zhrYu-fohjKK?6QOFkIZ4UQ~A%| zM8;a830gv9E#U+$fw7igf)?Lci$6h&XRO7WpamOi!4tF~V=ZWc7S~wIf0aIWgQvN4 zy=hKGEgv;LpK!ZP)OC4}s4Ey*jqOi(=wv`HXvQC~uno_NCZ8G!4Akc;|O(V+b+AexQP8e13bUnq|5ud*=0lT{f;~&ZALA|Bxawe zg!OW75hxErul1uEz%k>ix%xeZ$TC6QRR)Oq806K zyC^bB2F)jJx+3y(m9m$1YFa(#pe;ny7VCpKV=}!d-bOo19eP5QT hluftL#|Eh{AeEEn=AO + + mesh.smooth + + + + + diff --git a/assets/icons/mesh.smooth.vectorcraft b/assets/icons/mesh.smooth.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..de79eb43663df3b9246f4c4c73826f5c5ac6987c GIT binary patch literal 1675 zcmV;626Xu!iwFP!00000|K(b3Z`(Ey{wsz)8-YZ<+CV>aSj-=>VsgqH(GZa{Wz!G`lJ$mkVJRbGnEf`;8;Z40;k_*Ojju*lk!yRuZ ztGsD6_Lig~9788aeN|HDQflO%P0oCfEm+>JNd<#EJU$nUJwZiD;F&dPR%gwcF|h*a zwxXhe)-Uv)lnpfGtYmz)W`&f!Sk9pdb1`R_7a(`_;L$=2SK+mkc-!@j0ubZ?N2a|JPLzoL|U`Apk)aPYfQBjIv^FRh_~I2cXEy3?1mhWY*-1J_8?1h zl+eMIJ-8$_OXOb){-Ex%1f@|t_U7_#5~N9#`UxoW?q~sqo(5+KdUIS$tFpF|!~e-> zwY%M3Z@;6i#>z+3541MzTwdyTg|}a^&Jr-_RS3of2fUW=C+`!ukN55~xDSH826;11 z_8a67fxq7(2Z{C?kbEYS4d4oS$r@7Zd}FJql@FZl4NP)bu$68@bf}YYVNe2Zaq>Z@}gCvm65_C7a{& zamv?Bn32c3QNFFfbWZfkH<7%n-?{qT+G_o&#QBY*(f!WaerIQUtrw(l)Hy+u2%O8r zfJS8xa=gqM$Y+>0OENkFPZUcCQHLjtCB7r!xI#%xU{p|I9TyFhy)bD7RPH+2A^7gM5J3LBxe1cD91FJo|!k+NIp~rT{2fJ$_`;{997SlFg2D5J8;%$zEV~a;fThd2zsGZ z&DzwSkS{H-OXr|&RBIqAtOnT*iQ>n8;{J+Z`z>69NCIIS6sAvd#84uP?OpW((s0+M zR%aT?bKap-HG9j@$~94bnzZ&^BuZ6CwV%D5-MNOcR8QZ>)J)xnCZ^giaL&Qhm?Kt^ z0__$Rov7J|bGBFzSI>Bovzr`IyT#C){d~nh7Z%Q2XG6qNry9LgU#DsIU@mdxn){@^ z;L+c~M`)mro--&)xNaYko_V5PxhK?#kbM-pXdBmv{v<~Zb^I`nV)9mNB;RmZwa%+c z+}p{Z{=^-;(R|m`P#J7oSKhGaD@ccWx-a%Ex&0Tq$D7aY1E~cl>xc-Ic9A z(F&?x(ANl7>#_`l23_=&tIn{p36zU!oKvysn%A_bnSulEAR(KvgO|rXR2+GEY+3Mv z&A%+hYGFI?20m~(I*LI(#{ZSU%eHC`=6tW^c9!Ll)A4AT2fYTlpL23BQFuLW?e=P? zBiC|2bUJdcO$~asXi1#4Bm=a>&RXIDS|VpH(Eu%>vzBmx7UZl24bT!eYx%d-=eoC>qsx_eZr18v z=ktkRw}=LTt`Y4LMwMg712&xs$PvZ(M=WZ=^RvOHMjeJz)Drs;B3)S=3gnnFT7Q}9 zN&v%8?=+C3>Q-5={BDx1iPdqDIw}RvuU9mmHDXitz4vFbz-=ilrX)s}Qo?gRv35KN zJ=GES!PCy&dA6?>@$NGX`Ju^d&hGVh6;DrFN1t0!LW<-47)STE?}c7?uU`nh-Hbk{ z0@-UBcSybWzu+d?<0gE88@a()9b@j(ow%Ng7VAUrjw-ZARrDQIGNawB=d6@u$avDy zf|zSg)h8g0%$_UImLh44rkxk`mdfwFKrn-$Id0^qRRpSnxoBo}O^qyFLmeBW9zd!h V_hP0{Z1+31{{VcTs4|Tv002ESJd6MU literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.surface.check.svg b/assets/icons/mesh.surface.check.svg new file mode 100644 index 0000000..366142c --- /dev/null +++ b/assets/icons/mesh.surface.check.svg @@ -0,0 +1,9 @@ + + + mesh.surface.check + + + + + + diff --git a/assets/icons/mesh.surface.check.vectorcraft b/assets/icons/mesh.surface.check.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..e4380242357841f561dd91af70c6d5cef7139d1d GIT binary patch literal 1718 zcmV;n21)rJiwFP!00000|K(ciZre5#eicK%4MX=!fd1&RqAS|1MLM(?iol>H+U6pQ z8YLz10>AqXZ?@$)8AUrou?7e%krdCT?_79zs0U|G*$TDJg>#GZma?3odFzbfjx~f< z&P6zO7P!I;K_`s*B1T>EQ6qPfOMN;v-(GzL5t5 z8KC0Q?_KA@ow#FXtuO99=fV#~le*fBon}ezra2(SAP}(|=VFe^2I~$+n`XL1gf*&T zb3JxSw8rchkPo~=ptvDb!BMp9nsJOUezUP@m6%rNY$blC#+>1 zG~`QC77SNgkvt% z#J%S4CmIrHh$m6M!3+0W_%mL*_fT*+B+!$9`Q#;Sa3OUIa0QcGse!FhD_UXa|EiGS zkbXh7dsIVvrDnqW^o;rF4Qz|B%O$O5IG*b^$z`jMSI^&~IsFaa0< zSHX_YnDd$K>CE?}KRm@S{6l+lhgw(?QeI|#POX7#}-Pg!=Qi?=@n8!*$awBP+qTQA{($ml7@j7XdT6w z>t(U0fcU(}k0N6rf8esDch*QCEr@g+$^!8hYEG0b4TLg!%P^!lmJ3(UT+)OyWsT

xEL`wTU?)pE_2T)D){)(WG(%J@*7{WFPOb&9yfFq2|P4x=WaNDI;W*YHR)*(|hbIp*- zHc>uITKgsvCL*ModoQDRwxKMM?z>CP#C@P+s`&zE9Za=4A`vP4?V=(RHS=&z=W}dp z83#GL&Jm?q49(dumlR~7)_Sk3iCD-~qqpkIG|e2$XH?ndK1nZl^tbGxKhQ=mDO4eB zw-0eoJz=l76Uao!Jc?a)jcr6f$dLmXKeVCfyww=VS5#J=_39G!b~1k7aR+ZS-!wH8 zcN^Q4H|W`lFGIaHT36c20AhIMV?27Q6tQ5aAiP{Z-d$d7>r@{|1?4X2Yg$^%vJ8X< zS-0k^&akq{*r7GbNxN3fD^k={zyWjMkoDZ&^K&07jyyj%uW-TUpV!mnU^D9mK2SM2 zi9tEXkILZZu4<0vd@p5ohUJm-@o1O_y#%=*b9^*WcsXv(_G;%N*Kj{{K60;h4SKp@ zw5xlC=(h~5`O)ODBK7-MnL8xfgI?Cqej^OlIF!GCm0C+l2S`b*r6dES#MV;c0a7As zDbWBap|zB7fRw;mN-#i*Z!N_iAjPwm@^7inb#FIE7R&Z2ua&*l=M&y`5%oM-Bibg6 zBFByfY&r#y6N>RWEMmcP)4``k3d1>SiG2v6tSk-%a!MJkzf7qT!0^*M3FM@@RoW}R z>tri4IxZ4NrC|B>lH}8-U6+09{Ta_uS8|Ps5u?w1g!6Krg&aKyJ=dA`(bLZD0k$g^ zarLDQ|5j)^qxb6biG$PD(Z{YWA;odNkF$Ey_wt{4uU{~_U60<00@(|G^J84^{V%u) z_qYk3;f8N8mZzxud?&8wqQ&^oTT$ijQ58O-if6Rz)r^*$3?5H9Qeb_}i1_BC;n{Nq z(h{F5qv>V^xh4F|Js6n6)C@KJ>o^Qm!MtszbxrhGvVuA`jCz1k6~1q$d`6y;?>aXB M0C4)7QdcMd08I5m-v9sr literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.tag.svg b/assets/icons/mesh.tag.svg new file mode 100644 index 0000000..9bafef1 --- /dev/null +++ b/assets/icons/mesh.tag.svg @@ -0,0 +1,9 @@ + + + mesh.tag + + + + + + diff --git a/assets/icons/mesh.tag.vectorcraft b/assets/icons/mesh.tag.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..5dc23a94aee1cdcc235c9d8a94ff1bbec3abc3b5 GIT binary patch literal 1859 zcmV-J2fX+niwFP!00000|K(ciZre5#eicK%4MX=!fc@yYqAS|1MKZJ)g213{+U6pQ znl4Ga!0*0uc(Ehf$tc<>HY`9AiKKWwedof%Lp?fkUad&uTsU`h+VE;xk$K|`;jXF~ zFPw{T=qzYKD*~M`>Z=&_7Do--Q8sd6?2J#_6)j+r$K7+@&}mqcQ+Q@Y>*c5+3mDoK ztf`^t3wxk>4GmMC^J=`}GaPuim_QS$nh7V>48~nQI&3E9D#!{)yit7v4+d6%1!X?C z&V@U2ht67GJb2E9ABrY*wHZ3~lHZS~fRlniQr$WibCTCocT~Kt$4kPhT6Ju0hE7h_ zv^oal6Lts`x2%{Uie_D6hj>E27`A_@XiWhpLTKo!%t=GHqRWaE4VfTKP1Qofbjk8r zMT@OS9|$Q+N-9!JDbB}W5{XDkcIGV4L10OkRDl9g^BkUk0t89Up`#KkS4fqY#9`vb zpkllW+$c@`0B$FE8wQ#0MagEf8E$3OO~r4irL@4!Qa8u~B`)@acqJ{9ogmD)XR~Gr zWRD`4kCbQ_ye)9{KR7G4x0{>I0sAF^Cx`MMwASqeFC|?-;F2q4!lc&$*a!UH;OpVN z=kGQ69yDNUcL+9bTY~Knu$F1gYdVvv1ayKp)L~$&!-5yoIUE0Jj6aE@KTTsl2_sFv zGKKHRe>BR5$tZH4{&>J5iV&UYC`f}iilQt_{LD|FkGGBLjKO~5APhs-^%FM<@JU6| z)rxbFuT^v)V+hY{IS13IPAO;~f$BUiCmVTta-My=!=cAsM`Ab}dxRI$H$Rw6BRY7~ zV>5MxVtbOKZe z{6c$uPnzkH%8Ar6d;KeLeenS-kg!CdMkomtAv{49heSzDqf7i3={@ItX%r^Y}&gI_J^-~>Ejgb+fV zokWQ5L^!rkV(pd!N~F^!3FV2C8bNupnurw93P~CUUZ8apXRepUo&w@yj~_+GKz@ga z%kQm`K&}|+WG)NDPpCOjw$u~K;C)3Q_q7b99dk(&WXc-PC$_RRmM9cj(aaCu`KUmA}wl6NcE1?IC8BU%I&3IypD&X;tU+w5M`;M&_n^$!qI9i_A3Q=d44fYUY|@g>9m|pR{&OBuqp|HTT|% z-`j?=M7r-TH52!Nj;ZDgoOLkO>WD<7@VASKOw`Q7IiJs|t!3=x>^eu3X3;lif4k%$ zi!{~+M@_^+rW&19U#4m1V6I4EoBJf4;L)vnhJH^QeaoR}VY_{ZJL(BL#fCs8LgrEI zvaM|+`d*G4$oQcRMdz)?NWPK0XsuV5sI!ytyN=s?qxr5bq2gcLuDn6VR(u)iwb8oL zR(cSFm5<@zxl+WUA~S|3H^bfK#kQ>Vi4{;CgTA`qr7X)pXpn~)xa#yPn?U)nBvaO` zRr89?N-p4lIUr;`xA*eg$BH8_&y58!*!<%miyUlb-M|OQ2PZKo=lH)ec-0p5(VXwK z%+9bpay}jn^Ptxt_w$qEq%9)zCj2>j@2=k~nY6^pp~{0cuH8&CLy`ix-j zv~}>gZE{F)oPWpBzUh1UFTB^!l-#WcA4Gxd6+Z+suJ?WqZo((r1TS!d8;s>C>OS9z z>$zw#KJ->p`A?_{52(V7cD6w;kQuvU_z@=z xOkwJZ)cDCHg{t7RsmEo>^jNlnIyQ`Ygi!^3XvR1rX5_n$&EKq%tS@3J007uBj|cz& literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.tet.generate.svg b/assets/icons/mesh.tet.generate.svg new file mode 100644 index 0000000..c16964f --- /dev/null +++ b/assets/icons/mesh.tet.generate.svg @@ -0,0 +1,8 @@ + + + mesh.tet.generate + + + + + diff --git a/assets/icons/mesh.tet.generate.vectorcraft b/assets/icons/mesh.tet.generate.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..d66ab150d86b96a950778152a11656a0ef78dedd GIT binary patch literal 1674 zcmV;526g!#iwFP!00000|K(b3Z`(Ey{wsz)8-d0-20A8PFcy&f_qbVV;!N5 zcOFl@C2lZ7PzkNR$W|Ak)x&l-2DGmiP09tcC9 zz9GDWx=-X5*Bum;w5Dvfrj_V%xtv20Vth^!tDxPtJC9Uy&<3qVi`Tkt5%grKW(R8x1u+*5&&Zmh}gAvzCd+{O$DP}H(MdXI$g27ntCtWT$82}DEOuo6|#rn3sTo0uth}aLIde&4gL3k2$E~4V3K7fs0y+)&ioW~ zE#4wO$@4IR*SUC&qaqBFY`fh~cd|Op=rwkfmZ#z`)6()h4YN4W!U_!qgn2il;wvEg z3@S_13d5j%BS!y|l4ke1z1luvzeUh*wN8(FFvqs8%Kn`Yi~-K%z7MN_?Lv zfahsY>=lH;t^{nMtZ9cUr6`asX%QNVTs73t274!CH}Z?zkBUgsn+B3mL$9hFup9nh zdIK>b#eV}f)l{24?*B*|Bm3_u&td?fPxuGr-3{X93af$iZ2$HfsOsuT6$0fooum5R zqqLOoLDQprT@mi4UGXVGt@3v+f48<$f2vV=?PycJHYQ)2k-gMQTsg`t!XgISHEtqM zmK$mWK`iY$w+8YNrsWb(j=&Qq0zzz@WFqh#3C9&mYJ8@Ik{Iu;pzL{2D=4qmbGcGE zA<5$?h>VWX!Viix&_F^_6DEl@kUwx;(;H_buw*61>lKmwiw!5*mPSIEyk!`cV8>N% zU@mzkm~zJRfvjDPC5fe03^UolSVDLfi@i0FV;BiTHE9eIHKPqDp)ww8ByZLbOxD$r z9xVY21%gcY5h^LVe<{=haM))Ld(-j%%mt4FSJ-)@>5(uj6=)<7;cs5xrN z7)Da*-HabeB_Yu$7_NMzQWv4Yp{+p!(UGdXV*c(KKGry-e+|ui%_3>9BNqMM6+s}E z+rVrJfCcK3WV&v*k#|jdh`b|a-{r+F%%QGS|j<2>ZW&IU6R30 zCLB)O(HqS-T?>iF&UNLD2DTC^S8t5gSGF>O7?JsyPM%6dEE%eZ$RtniAJ2DLu@9ty z>_f?s=f@WLG}!!$ zT(4?uXWhUDswYP=sK)reGWfY~x`Q#_OPQTzdgOFGTE;;yLGH&A9}E;;j$6CE+Udx( z+z*|O+$)oVo-G;e+d(4wEkhe|Y<4I~{r*+qkMZ`PmkpF(OM|s`L z*$64Avy^m%l*Cy|GD1r1EF~TxC32P$jgS&LO9@9v37n<;Tj+B&*v*mUia#}LRju>+ zM6g>#gFxkob^)V|v6B&-P6_0QWc)oAx#0Qv=u;z&;S{;VA%s|E7RLfPCXF^+rgREm z{OO$na#Y?bAEe(+uvJ(c7s;biu>5vK%2~%Z_0W2M#tYQfLSwSU + + mesh.transition + + + + + + + diff --git a/assets/icons/mesh.transition.vectorcraft b/assets/icons/mesh.transition.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..e0a32a84c7acbfd51660679d427c4a8c207d10f7 GIT binary patch literal 1785 zcmVbiwFP!00000|Lt0BZ`(Ey{wsz)8-d;>2iS)$E4rfHTBJjZp$H6GqHQj+ zsOcq%7x=&LjxUat*cnATU4bn?VDUw~N6#IP$0P5ZIj>iwb z#kR52m8@-`UPFSokPE`_YTX&kR@4Rk5{T~V}#(&2&jv-Kd7m z)z~S>n%4V(yvGKC;+mB?qG;C@Hi$R$hhhE4nl==0B7~N%s)Dq1E4r##*^(Ku)z%$U zWJ^}$H7&OyeITT&C;=8TisLaDL?V)sojEHC5Lgi=HKBksyny$2fFQ{QG}MCS8maP< zI859aG>xUejndQ)pg6-~7)*RGN;aF#cq^-EYko~FrKK_cB}!VF#(ok;O4vj}0b$N9 z%iAT8eFlvgsn9TZSK{b@a8_=Mo2$(e_A3H!j^z*3Hr)&#C0#(^k}GAxpkD*953r0Y z{5&lC-o6Uo-Khz-6<`}#!5f-O#R)70yAc{{mPCL-`y}O}K)!C_dr~w={ID1wYLYVs zW1_+C{KLR^bEx)qs_}V?R;U9lBe1oMl9$x^_q6K1s8$oOnq4Jg`H9Np{2uSOiOE?I zY+v{MZH?*sUU(KK{Q*?flM!~b8UC-$J=zrPJ(-hFHPq*PXX2VD?a&B^v^F-y8SX`} zqx9(eP9+ zkU{w3g3n0t5DQei-O;le<;xNjV@0l*APe<76Tcf%sXrDZyS7xRt90oqEt*Tcq`9Tc zi9ZR!bhPvEq~Z7qffow1N{xYhfLXDiqa*Ny5kd%ccoQMMBjMOWiM1ycP$C_7Nhmvh z)diutRn>9NKk{Hw3$YZ3^1 z9kA$kwg^12+Nrl%8)GDI%bYE^Ef$$eh_s=~851O0Gl2qUjOH`r1#KwfBMwDhTG-kh8a*#z@>y5D{Vj)9~-l{LdG;=VY zNNF4UBt7TR-=By6KpVZ_kaDoyKEyrsguVPwAOj(DFLv2AwjTXaj2uY+p$$dHt;R^c zkfQ9YSC^=_lkxi#cko8@byLBSL1Vk}20dHxrK{IQ>q=W0Kn!L+#-l^2hy`Y`@dRl6 z@OZvWO1)<#<=F#(Xbjc82MZ)A48+2fYNjA2PZ(P!)kdMAM#mA6WJ>31D$O^l9<#8D|&ezj!Tv}xBx-+F(dbJ7*4G0|i6341s% zciCv~LFlOtu=k#JK3q`{i@3VKg*VWqGk&M;?L0bd9ewE90zw?;`#6|4{VxBR@A{dN zoAv0eNRYkYO)}$r@3-J4+~Fp8h8x^qERRw5=}ufvMT_yFx1!45p(=br6-Kn{)r=QN z2KtkZRWaR{tssvL bz3!n`N$=Vzju>xt8#aFf)=w-=sww~g;8 + + mesh.untangle + + + + + + diff --git a/assets/icons/mesh.untangle.vectorcraft b/assets/icons/mesh.untangle.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..0d1e5c31626de5ae2747db97fc2cefd168802015 GIT binary patch literal 1759 zcmV<51|az#iwFP!00000|K(ciZre5#eicK%jX-zF2KJ-Nimqt47U|GpC<23)Xq$^H zYPuxx0>Ast;l;L6C!=U*D7FBtC6eO#^qmV25B15$)a_}a91~s zm(DaCJ4;&9nm{Lv`Yc9W;;4~(F}ZMIY|gW8O-q>MVgH;rc3RdJ6rNerW_8h(Eh(39 zKX$s3wGFg?WcRdapdsT0uV-tXSRH6iw=CJ9e5Cznf(MmV!W1-#F6+DH^IfYTh)n6=8LwI=0ti zryv_z9|Q6pI|PawR_2JJ-Bj2ip3pCb?H_B}P{4^0TDq?dI~cIJ3D@sc=9+!%y8cPwvLK-7f~y&0)ctGp|5 z`ad`;cemT??Kjj_1RfpBA82j5IbOzp73wABv`V~Y_b}O{htcU=FL0hi|cg_?o%UP-4n&gbZlo-Pg{=u~O3zT%w zEP(CtZqY(uTysa-Y(?cesZjm(S8&biCtViEFZi4k`{khG?SU<;S-z~m&aCu|P*K6+ zcP@Unrc!?_NOogsU9K`KR~eMK)GL}>%AEL<5Ug0Q6P~nTUm@^9Vd1GUkPqPGOFB9M zPZ%MDP&;&l_)dgl3nkWzrhpRZNF$*fETKkFUajXM&9Fj}hJhDo9mNyZo5Y?1;$x2= zMaDpWr$xc+hYuHW{`H2xN0t*F#bpGi}I?QeMH%f{V zA%t$vHXtuR_cjkDum0?aZH}^YlVciD0nZr7<%X0exr}Bc7ST<|kysEC41!_HM=W&V zYaGfN6cDvlF;~oAT}@9l4iR5{?XO87>~+AR-`OJY#B%HD1lF4f!_+CI_8Vg)Z_Au5 zxh)o%JxAJ5rN;z`)=Z$l8Ke2kctKlBG#Z813#Gzq6LUg7c6C))2ld|O!V_WDOLs^F zKjx163xVQHYa2vj2-_eqd6Xjth%hoY)ho#MZI@b^X~a)ihfLMXHN#5VMEP;j+BcCf z5h2ywdux7Y8_E*tzWdZn+y^?QnlEtH!Bndw5|P5+Eh;imGY{u{v7ok=@hE54IifU+ zp*j2Iii0fDTJO;{5lfkB^j3YDrkR8JL`vJ-C+P)`eyJez2ioW*hYE`A_95=6C+w91 z1DOb!N3pA}v5n}Da^yh94{azqZ#72pg%o9Hy}Crbos8di+`${o*G&agUS!6Sh2{&KpjkG*Fll*6)>5JYQbKDf;Q%Rt zwUl6h6yI8kKR}9SE#;q5pX=UkjxAU1Q(h~3t# z_gKV&=ca>CjTDA+)Drs;LRncH3gnbBT7Q{RC4k|lcM`}+b*r>je%Hy?#OSz4oXCRZ zS1Xpyns!t4t@kIoAYFkP6C*~SaD?-6$LmKALeF)Ue)P0+cW~~CMO=NtgC8Ny=KNlr zQa?Iv9ewE90#Y33`}h*X^u7FN-s@*dZa1U1qCob7-%c3Ud;bk?!UJxCXSl%)#_AMx zpYO!=T(lS;dMm2@1FFJrsKShPv!3$;$-sEhv7GAbnu(818qA(cke1+QJ@}PL&Tbig z4G06%Eq>Y2;AeLfs)AYD%&Lm%v1|=>Y#8+bqe^<;&TvM|$oC!FzX45J_#LY#008Y( BTH*iz literal 0 HcmV?d00001 diff --git a/assets/icons/mesh.verify.svg b/assets/icons/mesh.verify.svg new file mode 100644 index 0000000..a7ce1e0 --- /dev/null +++ b/assets/icons/mesh.verify.svg @@ -0,0 +1,9 @@ + + + mesh.verify + + + + + + diff --git a/assets/icons/mesh.verify.vectorcraft b/assets/icons/mesh.verify.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..2c414dbc8e0be8388b4b0072b20382098087198b GIT binary patch literal 1765 zcmV&57x=&L_~uxtlTmcM6_^3r5=rqM-90=WkG%I5jIUAWoqIR9>=-XOT6EqN?s!XB z?VZO{Z;5Nn5mZ8}&$88pXf^TAiZdVDR;=vTxQ0&dAD#=QUPn5L;h8mVS7%T`78_{Y z*Q9Hq^dq^$w1t9_QO0L$R*ANk%Q+Mw-pv`}6}0<$?~zJ&SEIFP@k-ZC0%*tqju3n2 zd*}X{KlL`|;x6#c!&nyStL@ZlSL}9H0#pnF5x@4%7l^jlRB+a|vlSw|)fL;TsYlTU z^Fu)1iwcS2n$(p*(QO)0A)hcWCdxl@++x5fAar=$P}Jd_=!TQJLvx|2j`vVdt_ZC- zu6H6sP)O5Y#8F*h(I0_M6e1q92H@ZWZUg_x|7v*oLyr_X?ZF>nU#b&#ole6#zF%%3540!$~ZZ+(-+xD z$9D@Me6KiAz!W%X4#AAbl^HdwvG?Cu)jz3Ki$_K*4w+1i@9AMq6ptxTxIVqZV*Bub zY{eMS#UbF)n5PG_pLy>+2FBk910%o4{iujE1=B#X&QMTQ4j7o7*0BT;c&;GZS7#~| zT%0All2D9;AbwKA@P+dB7IozctFHCT^YvFy-qn*z1tm~6NAzKKYgo5udfm&H71+v2 z-*Nyi_5WP{Z*8UiNKtw1Xk}lU*Vl%%mwJgSN0~)f#K0!w+ycd=P$LLp$+X-W$OjlG zOFTIOPn-w{v6-+Ff$vB-u253r=_QoJL=p0D>ageR zZy3=dA;kWG8xZ%4;cf3qUj5l4*EPs)m>jZ*c6io6E;gt>YRDLkq|&LZo52n`O+1`R~V*Y<|_tLOMwa!CIgn(>-NlCL8s{oWNpAg9~FEKq|&64QisX53gK zd0SUx$y~9h)p25oszywd8OuZ(oHd%ygi+i%qA@6ffh(1xHnUgA$DTLT*{Khb2Z3~} zLB2yG^Rg>j3T_(&W{+aTNFYq?sd@=vxa(A_B8~JZcBoLz-ZG?i4U``T ztwV~$nRKc4qnEQ=S67y);rkGp$@|FoRQn0e*_j%1B+^rayGca_YWD7&Ef(078INLi z6C)~GjE&hZRt#jJ&UvkD6tPsH#$eW0VVXUdPpEc{eX@b`7%ti4a3n`B7-S(_mk;T{ zJnm8^p%{_*m`LR_td?A1=>#d8+rMhIALywH<3zS_WK$%J0j> z=BTvE)ME`QNw?9(Yf?2#!T~x6$fob$`MwV&N1pFnWVlpnS~s?1H|PV=$x#|qef(cF z_^GekgE8N!XlI!oc{x2=#zCi0?uQZ|3=~eMTf4Q|%PH4#J@j(Qy)rrI*^;xq86=|L zaI_IyxQCL|?|vx!G2R~RBDROGC1I^y`MV!-XDRszDVejBY=o55SxP!WO5!Xf86hQh zmJ*MU5;;qWMo0;rrGz7-1kO_aDfGD-tmepa)jc(8Rju>>M6jDggFxkob^)V|v6B&t zP6_0QWc&jbIpO*F=v^a?;U#j3LkO|TERF?oOd4%CP3aWC_}x1Nr1J{ded90D%?|5{EezaM7vqf85PP9{-h@rHrJfUGas#po@ + + model.activity + + + + + + + diff --git a/assets/icons/model.activity.vectorcraft b/assets/icons/model.activity.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..4276310b0deafdfe91a29a7ed2ca4bdfa6e8a291 GIT binary patch literal 1887 zcmV-l2cY;LiwFP!00000|K(b3Z`(Ey{wsz)8-XP1H9$XfSBR3_)Pf5^Zyl zMNKbByukl`$2VJYos6QBVnYKYk@$9x?w&iIj(TtwtX|{RId^VJ*0MUQ@uGF6a91~! zmCkuEb(W+gHHJ(+PKq;}we*&@ z8<^0Qv~8f{6TK%z0}UA~SUuz8p!IS&hbCONbB602#$7!)G#4wDc+E$=R(%r>2G)Rx zOTKrVbN9@hIvag)?>XmwAez+GcIq@Mb~noaEdhbJzH!bMxM+y(s9Dp@R+!d}>eyaS zodR!2eGJG4-XT!j&@$&J+D*kf#0>ply!}&68Ui>ugqEzU0=Hx*x~gf};yG7VTX)cq zt!R zU;R%;%iZnvdi#y$DhxBH@*lJ|-JD;_M}>!9F=Yr?^orXSe!)U~(JOQo1aa(ze&~8p z>bnsVz5L<%Xy4rpXI(2B!qE4VAP&+5xp8_h-h=VsetB^p9LR`=!@ab>zG^uTG6cl` z>?C{(NObE7!G64yaO8;x6VM)#($JHD(C&ft@<$&S`m=&HB$sp*RxIeP;AOMI!i?N2 zak(rw)9!!?33o$IiHKj+IHwc@2nFqbVd49QYIfBxzedV%TR~**59ojD5AKWl1J_e} z$Y9aXGntHP)8n(f;4C~~v}iGzpK2>j_xF;GCbPZpV7h2{WPXncfh`kE?2FtqaS^zo zG;rhzn`#5g&aDxfB=7o6IMvvm@Q%K>d%^J*)U&Cag$`_L>c)ZcV#EWxc4D{Zt?uJa z+{3#wUiiZrkB32EcsSe)jD(%J{Z^B;Wk?l`AjMwy7~SVxMzWtnI}FwaV8O(7?**BET-y|GBi3snnkeoZVPb%~c$86}!x(UXt8WX6mN_ zP+D(3o+Pxd5O{&0dtwaaBlzHwOisWPgd9Sk@Su?6I}wg8lt}Ny0!k=1VhyFYFB?I5 zy`GC)-U>+)AP;F9MXBqhk*9$8yvGkiV<3N!qF{H{ND?1~IvA!%`~+Gjic2G*Oy1T6 zUQ#S`rvY7(m}|-!&j-4;B}*6xt7y%{1G4yV9fIbJft;cd-!>Z}U*{`mYXKLhyEOa?Bzs;28tC z*x>Rcm(d!DM0C?}BoYciqhQ$TBNDdoH4eoF1w_67m>cHrt|q6FL&R5K`)iB@Uq@{E zoh<@SY`0#d_uo_yQ|Fi3Z;X+=D|5PJwpfH6P^gJ2JqE?vGDv|lM)QTTg0z-sGzxDJ zN`=?P<_h`L)m32~)U{{{M1)l@*&z}7F?ZZwF_b`C+aMA_*am^|L5_$x!qA+mmyqq- zZnZMgh#q5yOx4USLrdF4`7mi6QUpp;Jfxa?Z_Vy(Ls=}{cb}Sxd!%Ek`37elOtm>e z5h?uLrXmwH^Ki}<3u4QRgPdLGh>{j#bM}iB16jDW1%tFAmNL~C?D{fIGY9h-m$tc2 zJP01cxgSP4Z@_bjm z`anylq(NWPvPza^AT-ERCsBAFRW^Y$fC^{)yiPW+X$Sb7*FIJpd3tSL z%93R(HQ0>ZpbuP3PST)U<44ut=dNsy=6o+jJHztG^Xbtr4|)mZe$2?xMB(LhYxb`8 ze9AR^A9_CJUh5k4Y+19e8Wf`6)_B7|EI3xAe*Y?U$3%Ou3;$^0MiACGl)rzKSW8Jp zNQteb#3Q6c)>5JoQbKDf;Rq>#wUl6l6l5(0jgaD7OYuiY@vNo%Tk3N?c$=fkRr{FN z%3ka932(QFdY-Hi?Gi?jV}~PNIt7puit&3aV#9Nj(WgcV!*kRUhY$i;SsV-Glrq|I zn^Gl!@uznZ$VqjpWKe$B$yRD~TqI6pf%(;nX0xW<6hrp@OcuB+xW&YX$!9*odAZZ? zqX(hS_0`MK)6RplarK=X|I%+ZXZPxq`rx#6^08|RNO7G1#@9Ti&*eYyT)z-}yP3Qb z1+tg>w86aI`#p3M^mK!s&<%gVSe;_-=R0wIF0~jRdMj1=JyiwYsETK_oAsO(Tp2u` zbTlXWx~Ae|lZI!{B}j{XZj7dz=k%8HZ*E~=vgKcPH2m9E0#(7RZDv(P^;o)wIyQ`Y ZfKes6Z)bePXxs1D{sY%ZkmV69005S#tZ)DT literal 0 HcmV?d00001 diff --git a/assets/icons/model.amplitude.svg b/assets/icons/model.amplitude.svg new file mode 100644 index 0000000..4d61587 --- /dev/null +++ b/assets/icons/model.amplitude.svg @@ -0,0 +1,8 @@ + + + model.amplitude + + + + + diff --git a/assets/icons/model.amplitude.vectorcraft b/assets/icons/model.amplitude.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..e39cd498d1224fafa6874cecab69be20b512720c GIT binary patch literal 1884 zcmV-i2c!5OiwFP!00000|K(b3Z`(Ey{wsz)3xY_!2iS)$E4rfHTBJjZp$H7xVr(t4 zsOhDN7x=&LNQ$;3I~heMMS%qfEFCG{qvwvt(~%F>4XZY!u`aA{blI?KS&^H@vf-|( zGgep^zHO~&K`R1{(Cf44b;*0pTqki{=$o=-yP*XP@^E+#*;bP^IfZ97ETy?aHf5eQ zZA#&Zw#b?qT0Um?G_OIhWI3zmydy}jRtpf3s#!2nrO@x|gO#OX$bxKmk5^sW3_-^V zAaT|Au65x$u5E4A#XYhvurEa2)y}r+HM^TH0WJlFq`I{(Zb)8J)ljjzp07z()m_8x z+O~4CrPV1Q?|Fkjahnw>N6~Cc-XNY(FUI8`D_T>)$ssfpxF8MPt1hdoXvl)I)l@AA zmg_7}D_ZPTVj!d}DXB=YqAr6+pU zEC)?J$ii;WPziffoYXkve-ZeExQjy^`GIXM_+5gc(2v{@lv#IK+N^;n&i#^<+^DQA z_~?JJtk~b~u6IYwl?0x&{QbB9qrC*ow#->g zQ)Nf{^z(l2aej~8lTTmo1c}@h-j87m&rM?2OT5k)Arky6W5~vVEu!H28pCtE*hb(c zUQYxd5+~XVd$4DiMrO#hW)j%E1T$(Wi%P~$l$>WKgj@}0v|Fb3d3f#VHi&?|JX z-xmQUkR{1MhBzt&@cq7w1LJRSkYSE2?jZvShc@mN9gXG*a6_%$F*r|v8@_`tzzts2 z7uW`bz(XU}_%LIS0@=u=PZk$ZvU$iJQndpvN#KgjDl(k$0h&e(1N`}#Y?r0Yjx6~vaDEl7S?Bum!x z0%|wPmoq@@lgX$(Iq5 z*!Pg9Y!oIgNC!H@%gfe?mQOGI{lfQwx z#1Uu87|;7`W9lq{FRY@Ni3ZMs;W_~3w1J$%2*z^KC?s-5D^9R<9&IGAH}IL2r)NgA z06Y{3Qdv2cbm;r+AC%;0Lh#*zZ(tPg>8&41Uj5w?LkMU;O-@;)3wYW&>-Xs{Ne1yUlSmEfrp##!=!08+2pSGgsI){j_Sk2eS6aG43(Qi!=AhFz{ zP_4g-a7^{Zq~?t_lD9>gt(YkmVFxczjw)x27b(kl9XM??pEH)z#t@A{fd-*e%-Tqw zkdJLu=Egx?sg^)QSVi$3iQq?n;{HaUXw{eokr2W*D2zrqqQ?;i`mTBfX}IZ9D>IGo zG4GJ6n!aVS!ZcAHC#^#l@gosZ^=EIz?o2~jB&Y8oH52!qimCbwoN+K!<_JWj!23l- zCTjZOoZZ||Q_mRX>?%i;ZZS1yzg#oWMH=H0lp95Blh9)VqgA!pA}F= zhPJw4r7X)pXpq|kqH;c|Y+_riB+IPXcH&KzmQ26_ci@oK*y!o8PZdX=9vkXVPz_%3 z?F-pi&%1#SlF!a!P>%6`W$;s5)F*SkmvTGJ^2qb?sF?@71i2rU^kky&a@^{Dt34mN zn%_guNA9(%LC;qeYs*0)`b|Z)d?)x+k^0?Fi903QgI%^DzZDLv9m?PR6dP-aCuoU` zwL}xNgvMIJ30eYUEx`mWzOfd6f)>wMi#I_FHr9eCXhFtW{wwvl9(>JZt9A3(td*_C z`x9uth$19wMEitM%{Cu;?=SR*v^lq!=rQ}mdswC?KMXfQ zpX;c|$=%Mw86B~RcL$sJ(X9D`-OH0mjBQUz}g`aq@Un%*voxK$W zvX?UMlzQ*?;KuK9<2}I*|G-$EWA5kMaeXdYv^Tvws&J1g|A;D{(QY>jmUA+AJZZC( zs_QBfN2zL_Jr|%Y;)iYc8LBknMLuLtN= W(EDaCQ0)2*yMF;6c|o_sDF6V}L6{c+ literal 0 HcmV?d00001 diff --git a/assets/icons/model.boundary_condition.create.svg b/assets/icons/model.boundary_condition.create.svg new file mode 100644 index 0000000..2bd4d4c --- /dev/null +++ b/assets/icons/model.boundary_condition.create.svg @@ -0,0 +1,9 @@ + + + model.boundary_condition.create + + + + + + diff --git a/assets/icons/model.boundary_condition.create.vectorcraft b/assets/icons/model.boundary_condition.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..0fbeaff9df5f374c3eaf0aa9c88fcdf628b8ce7d GIT binary patch literal 1916 zcmV-?2ZQ(@iwFP!00000|K(b3Z`(Ey{wsz)8-_%^2k3{cE4rfHTC_upp$H7xW^699 zsOhDN7x=&LjxUa7I~heM#ef+IBJu4WJ$F1FkG%7)M7^f1cj0|!^H$XJnqIZu7~blJ zi_*J@#@>>Ztfo*2t-i=sudvm~pX3uC+AhSrTeA`dxx4QdjJ=k(1%p0ov0%kyCc1J# z>&M%a8n)6%7>3MIq`bc7)PT%NZ2Wx}6DHFQDDGJC84< zh?1_c#Y&Ua!?65g%^C(c5kkw>Re?+x z(N)dMmd=p9w(g){zT(BAX5~&K0Ya*Z(VCWXhU0MMu=DH!HY!OPw2_Hui~enp|@Sp9?2rkmlTq6-LI z39U>R^jko{K$3}niQk6>@H`Io3xaG{0=6(OM8g(JQ6O8=f*J~+Q$u!~*=VQ~CG&dh zo=u=XA(FtchiWnJc^(A;iK9Hpmj;6Oc`XD;-I0&# zi6&$>dT`KHSL(sZf!st_KQMSWN%P*X_aVo%r*Lb@r-nM_;E|6^Cz-$h3wAh;Kk8Il zjpK-)Q*94m9Gf-xJpNspakHY*Bv?`KszH;w0b`%U{f`B2vBKh{C(4JZTXE?94gGPL z_>$b)E5r!}zW&2!X%?uf`xzCv&M0N$Pvx(&1b?ZXdRdkb;MPn%?K*#;zryt_$oJe6 z@pmPAdQ@xI__%+3*gu2<0;uh}XNTRBLEVGkuzxIHi0&nS4Es?4^EU3rCqbK_8l$c^s%klV}7%B$w388psFmN=r660}nW8 zfDoCeD@J^0!f}O?7^fzo#3me6Q1)D$6_l6jnGAiMkYrI9ghoe6?gx1iXdnb@NE}-O z`2&_LapQ~xV&K>WTzM#ek>Nz!(m*JqH#LKp-fVg;? z+8Q(v9ZK3O=I^d%=NgCfuf)vPG?ex_VA1bf5d?C%4NR6H$faSLJ*=5G)=1t$QfVn% zv8WVBYz$S+m@qY(2{kxtG+($VSnG(!pa^=dRLOjLrE2=#hi39UG(OdSfpd1IMjf&A6lAxks6fr$or|k0=4u%SF}sNom01jp z*skB^P{MA-b};gM==XWhUDEk6Adu zNXFk|kqe%m4L&u}7@i`R*oP3Q%;HcW=cLj4%al$53_rb7K+eirWxe#f3AS>p<05%f z3YK53_^6{s=UV)PkXc+Ypk=Hx->Q(Yi9dD^+VE#S*VTwg20i*eJL zxYhSC4o+J~AG)@H5Xbv(T#T^&F7n8C{le(?&FHO6kUirCH|u=wkKiWS<0gEB8{A;5 z&QbT%owz;~E!KzLnkuqKRdhrZMzovtOcY24`jd_?n0cZitRsZC8EtyD*yoR C&b{~m literal 0 HcmV?d00001 diff --git a/assets/icons/model.check.svg b/assets/icons/model.check.svg new file mode 100644 index 0000000..c47e755 --- /dev/null +++ b/assets/icons/model.check.svg @@ -0,0 +1,9 @@ + + + model.check + + + + + + diff --git a/assets/icons/model.check.vectorcraft b/assets/icons/model.check.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..1afe2b6616f9fa66fa88c744fdd0c728c84ae9ba GIT binary patch literal 1934 zcmV;92XXixiwFP!00000|Lt0PZ`(Ey|0;(5HVlb+2k0MNR&+(XwMd5+Ll6YC&DdIG zNz)^V7x=sHjt|*%oQ$HKVZc_vjYXdCe!LftM?E?>Wxb-UbLQN!SzFe#n%=a|7@q1T zD+}i=7&{AAu$saoP<`W6=SVejC+Wlm+IczaR;&OfkK5mQW2ep9oWXBa<(%b{*^+v*#pZP7?_oLSzjX&j9x6JFhuKiTGDzBbeE4#Hs|aLxb1B6=wCTgzb8dc@R zQ4qTkSQ(#uH%t=Z!{Zbm13x8R7;iS4aWAWB>++UaN=qXA7fWeL5|KCvrLa^&0b$O4 zHgA`p>fIoN! zSQ(jKhLb3U<&q>0N$4jYpTngitrz#iW!K_BGVw_gkk}(Z97JBKlS6Eb!%3)k^XFhs zfKCnngy~*7CHLYJ=mWIFgikvUurtfGF&SxX6FNpA8z=tJ9g#AFvQJ3<-Ew9Hfcw#;LE< zqbdEJVB-EbNi`9XuhR#+{Dq6Ux(pr9Zm>Ru6Yj!s_Z^f@&9`Mu zRkn)rxaabH38u1AH!cPB%>PdL-;Jr%A9Bj;KN};v(z>p+tGUz*Hn)_Sk~9EkQW@40 zu0$jPFW`=r7z6nXak5~eBk%+vLI~9U5+c4M;n+fn)ON$6glgjxPx(kY9L!f**w#L=mOS(m zdq4*I=y?fE2;1XBq?sqsnrOZ#gv_(pMc3G7^t~F{7x_auimF?Uk$k6l(OK^

~oX zdf*N|XufMIxcz8scV1uf6(Ul-a#~mT$^gY+=VLs2t`)JsrWjsijkjOV`Zm?4tblG8 z%r$LUiM9-+263^2yUwt-3H0|WI?LL%9A0Jfs^oCM9T2kO?Y+$VP;=yE-q_$0T|r4~ z=G~wVnvagspy2Ue)!^5zXb#qVujO`z?UB>z(XbAB4ds5Gv4e%e>*?0)tadu(8lHzv zr`#*mgT7wWWmjp9==U{U!S?1g0r@{uBuGYW-I7p1Jxr?73`tC UMvhpKZznc?0q3hj?r|#s0FU6nzW@LL literal 0 HcmV?d00001 diff --git a/assets/icons/model.coupling.create.svg b/assets/icons/model.coupling.create.svg new file mode 100644 index 0000000..5681727 --- /dev/null +++ b/assets/icons/model.coupling.create.svg @@ -0,0 +1,14 @@ + + + model.coupling.create + + + + + + + + + + + diff --git a/assets/icons/model.coupling.create.vectorcraft b/assets/icons/model.coupling.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..a51d006ebec6757c697df7e63118dcfa3b0ab781 GIT binary patch literal 2312 zcmV+j3HSCNiwFP!00000|K(eIZ{s!+|0;q0HUv?mUIF^Y-d@owx_7(SJ+wFkK_J_V zt&1$_^w`9=$anAXWs9=xQncMJ5CcIha>)5{UK|ePZ_Z;`Z_?Jeb-vO?Th@y@eQcc> zJk?EB7S1i1IV)PwI)zT4`ju0?XH++yo46j(F3Ux?p#@CxZ9fjpoHlE73S&0qlIHHB z?5aE~R_>yvX-i>TS7dDi{hzWInm5p}DD$#@VC2yHc{PWov~K5RS}%d_?wgY>`NT!K zVHEFV-wgu78h|kXFP?Mjx!%m#sxL3dx%CNelHXouPO~nb9~JiX^a&8~fyrHV2 zE}Q0Ioo00-J6`W+PM&UQJqF|h>)6>8wxlXgqCiqoJm5l zuIj94(>aq_TX)c~SZDdNrp1n>4+5zwn$~HtplrSjCJ~4PXXi1?b6{Adnb3y>Qj`UC zUSDTBx~8qmCptpelsRzfLFU?nj+*PEWC*~ z(&a3~#2$s^_HF5GbMd6Wl<%?U&_x~z!h|GA7@{DKcFxPYu^T4=!Cv5b7{>(p;l0A( zeA$#Gu+`L$wdwV-ME1(*@qlwEyN}FH2H?ptbaHxfWN|0JN4@C}(M5gmhii+*!1wHs zZ6#cTdG?i?U9(QP3Td8aRl`i+8H|&KjJ5n@I zHErB%+xcs39J^SA0I5g*oVbW#L}8LdNtgt9r$^o$xiOCXAjY2Od)On#t%S$d$i@5F z2O~q(Ev63!jL~lR`22wjl>LvkmXY2u=!*3L@t7D+tTS<=J?F!9h;AjuLpg~4bN#`0 zvA&FeyT`B@+|$%sq{?y6Tf(>MEfJGNxVLBdoM_4>J2mreFs#0=gQG^ovk9;qum3@N zR=UZ={`^ELdno0- z*Fi+k|}zV4owau5RbDM!$^Ua<`KDa|mZys+OV{d|x%4)8d|93S#*Eo25^_9OynA_`w zO~126fcSQcLbd-U+%VNWo$?!FBtI9+Y*pG~;d;P!6u@*phSVi#;373z#FT@M9dHd=BE0& zY^-1M5Sd1J%sND>X0Dm6uuYVQNvm!mB;p~}+Mo@wTwZ|u5v_S7E^Qf_v;dPrLFa=F-j0Ck!onWzDU!|!F)*z z+uSG8f`|V81@R}^==%~1Mz+U?P*V@lNy6h^g5dBk~ZrN+-V@2v;en`A2(H``&h4v?Iu*RYM zmmgwlF7X5|ku{fS0+-O5OE`f`V9h0%z=c?IArrV@Yc6;K7vGwTKY-!0`+e8r(HKJX@$aCyq!l9D`IincA$HF%}FP?mBBr#l~mZ(D@qOv#@ z$T?*+eVdXcfa$k)0?1i)t5_?)t7I!Nx-R0s7XZtz*4g5rX}7s{VX_qsNaf+KS zjKaCz+XSN*p_lpz%jj+A;9Udxt19-pu!nj1B5$q-x2-oHyEcau$N4^fnq#^y|HQif zLDR3>o1b}s?0T + + model.info + + + + + + diff --git a/assets/icons/model.info.vectorcraft b/assets/icons/model.info.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..8f279e7d6e2c2246dc782d877f7cb9ef5722e73d GIT binary patch literal 1913 zcmV-<2Zs0`iwFP!00000|K(b3Z`(Ey{wsz)8-_^gHNZY}UC|Zo)}kF+3`G#oHf?i} zMNKbByukl`$2Z$boQ$HKVZZ_emPqRE(cQ!2@u>S?A?h`4gNxvX&00~CUN@#=dpQmY zx?%M(ARlChLUGN@xkS-!D%qi)urDUtKh>;ZfKx(f*}5ud%XX@(nwKq|N<+1E2Mx0o zFXlBXcPcR$q^cOLX*pw39tR;Bk=7h6cu|1DigN7)1EdiJJbwU0IRZLrW#w9$3Z+Su zh6y-X-jOiQGECrhDsLl_V-%;`?RLD=)wH#^W}e!zME<2lTb3m_jbfuLH&8%XaLecI z3XDC0&Ka#FF+^8N>3;}b?ryi2+eg-~C_FjVKhWBAQ+cV)1qNIR<4h3xod7=&o`m3L zDOKMmlROP$i7boK6h#DjMc10{bQ0n`A}NkhjByrcmli?rWi13Km9~D00xt2N!ng=6#px@tHEPK(#$kG<`ih@^-QGv5qZg3 zM8Z4^Nlpy06QsCoiLE=`W>G0h7W8JosU$}s%%XG>?>s5*vkAdjgj0m0G)hpu=b`LP zCP@nO9%pHcW0IlgX_6eU1VKPKeA09p*?5xmw3^;0WRnND$#G;xHaY%Q&*07va6dwp zAL4%WR{2?|O$@Wi0Ad^e95OrdWwz$pxnjH99M~~idf+8vyK*s-F{tNsl**O^SDA$# z%nAR{-rUl5wqjb4S?a(43YNNjX0|R1F{Q;mov1`>C69MfzOBG9UdEMV+hW2qM-;Ngkp+K?VqxJvfe?f&30Z zQQUeXfqXT#K_@5bFS0fv^tNV@e|x65J-TG6w3IiV4}9%QmN-&gv6e}DWPw#q zW%|xQPO%8adeT@VdPZBDU`-xpByZNR7cJ%|Ml@K=rGf0;18Z}*bM`kzixVM4VUHWI z(UQ~KJ(Rrqv!lM7zTGrA<`EO{oPoUF(DI}yV=a=X=w{lq+J|JkHJ=XC&{+IbRB2EV>*K zTcYY2LsIJ*V!%10`N~DXT2C|<1?q)THEUCMgM8}hs_+i#y=o0oVHIUNB+5SS6ZaPi zmA%$Ch`=sMDoh{bh(scc-KqLnG~U%DooOUbu|ub7?w;YLZ=(D#Y3)-4wv;lYy3gKP z-1>&HR8QZ1YNqaqjj8SnoOdv_?ub>Sz`I37Cu;8DTr3vMml+RocAFz=S`5wEU#|q{ zqOJGF*cxJ~Q;puLuhTSlFkfitoBO1_;L+coM|dDdUkfNX_--GPo_nHR8JOrq$UTaE z?i$~S{vbytI(}H9*u2#l$v0Y*o%iYz_jWS4KXC_dG~YB8oH{hVD=+DB1?y06NgHae z3^0tWe2hm=l_HikopX79G~Qoc?21w!cnP&F=xbV0>9P!j27RESYDk01CQ#F>=!~}; z)4b;MN+>u$2MO8AM$gMWRvdX=wybBt=3gH4=)rF627AzAbdm+NjQ^_zzjS4DH0OIM z+Bud-&Syu*Jm@8i`*FsOCJHZSTerR1`HbthA3C3LFKrF_YFUe}>J_5j)^sD!%#RhR z-~W(@L!v$SWdrTkim=Y1{QVD^x0Y;xmegBIIzUU}ttALZZ z04>;C3m%{ad29Kn)aSCdo8!w>`_!z}z24^&Xt#(Wq-#XGgi+<#@qkUI0&+qzevd^h zcwsj9)W~2sM=h}rA<~t_p+HV4qxF|5Qvw)%dZ&S$RJY1{<#(HGZlZ$U#vyF*RcJMUDtw?n{fK2chRWz&?7~x%&qjNWWU?^J>81wTe}uJ`^MwuugGL!PmX++eIuargO7 zT+d||=R@!P#~eFTMUPA+Guq91Dhg=~8BaPsXZE`0>I;uXX3r&POVx)VO*ftM8!kU3 zg@GA}u4yAb+hkA`oVCqWRdG9(uc3|&qwZl;$?n=KDN$zR`;P73T%Ag4=qdmJj&_u1 literal 0 HcmV?d00001 diff --git a/assets/icons/model.load.create.svg b/assets/icons/model.load.create.svg new file mode 100644 index 0000000..6598812 --- /dev/null +++ b/assets/icons/model.load.create.svg @@ -0,0 +1,10 @@ + + + model.load.create + + + + + + + diff --git a/assets/icons/model.load.create.vectorcraft b/assets/icons/model.load.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f576b435a1cae3458417a8929e6bd4b825688a53 GIT binary patch literal 1798 zcmV+h2l@CPiwFP!00000|Lt0BZ`(Ey{wsz)8;0H`2k3_`E4rfHTBJjZp$H6GqHQj; zs8Lc9FYtfg@y)RkC#7g-*sujiVjU^o@9JHIf6#$^+onN7rjRQWIFMoZ^?>ojVl=B?*6@C?6st&7~Wa464MD~sGJlW zqZY$ET}9dk+CGt6OdAjsj50nGT|s)WoP!AQcFqtlq2ISVkCbxI3av$t*Sc*KKt~Rs zgz{V8JM$<0*xQ&7w}E#S#!{p|ZO2}-VmGq_0Ao;y_?36IK(xW8fwQKWtq|djZrEOq zJ&HD%9|H10G)NRzq$&l9c2kQ6`G)yoLjH;41_Mq3p~dT(3QHK(H78Yz=E7br??6zj z2rW6Tb}B}Ih{3u_jQ%?#)$Vb7xqW2)8o`@m^$(;?Hy0n3xxj!crkx3cev5z~K|1j- z#rG3}FgPd){XI#v69793${JiM*GV*#TuUD{DF_i_iCPr9%WaB3Euytis;O{5p*T@Lr<*nn@PL+OOf%52k6*b8Ggp zehorpt)0)LAc!A0P0jJ~f%jo1gk$(SjSdZAB+(?zO|M78?l~#`cRDG2StkLJ$Jw4a z(?KqZCt&(uk_QLg*Me*knl8_IC;8tyho(^ez&%nhU<##=9JDurkxakiBKQS)bA#Gq zh1KAC_5Jn>SpV`#uYegTnkkwaSB^CC zH9>q$4STH@xOAmvD9LG-?ZBVrK4b#N5XN1 zlA0VwLP<W=qI3s}+GKn;j zX(WG4C<`=~20|IVqQmpl`ea>nz4tX;{H#L_FqGFgu-VXR`lHIQR05{7Eh z>{c5&qYo@MR!H8gVV6kDBO_V@3ye(;8_DX-=ONKDPt^>%IId|NGc5y4T9lnk5u|1G&nRHG!VUWw0F#(9mmI# zL&n$8%-1ZEd>ydpcdiHmx!eY3lO9YZF*6Os%o}SY@2Zk4nJX4mAxI2S)r^TU_Ltg351C~RWBe7cU@{#rjb6y4wb6edxli5iSomwwNH^alOff9_HuUP8p<*?eeY8< z`5c*;YQMla2UFvYL`I5mx2UK@%|4v7#R9uB<3Y}DazsUop*j2cih(ZFx`K&}A(krD z=&kxHO|u8{8C9;iPu2?_sUoRyPdJdH=M2giuG@#S=bpG%nT=E;WFN&Yy2dr4Kgf|I z6+aA7Ox|jZj3X(a}*BRAc;CE%>>snu9stOVQ4Z`SxY!TOW>^K zd#TT5Z#PGltM;i`t6H7UCxYD~8U(6Fv`ZLej-3qHbV?vc6yxu)$OX^O2cH^g45z3i z_94WovN#mTF=e#=GNnrZ!%y!NkfZ8Wd9VC#lC7!LagjVK1?JZ)Qp}omL;LLg5id|j zg~w!%(Pz=ad$}t_2M{<#bj`z`1;WOXsCycH)qj$1E_Ja4rtn0mhhi&3L+eFXUMr<%v$GH1+C$6WvA7XjvtxXl~ znJRu{Dv{A{)^kRMF+@D+NQup7PUNkTMr6+wXv@UaCvjb*B-cb-@`R50R$O0e#7#;J oRl%ZdW_3+WU$TZeHuSoKUKPG=XJW*3yWg<=3;1>{fPyLj03hvKE&u=k literal 0 HcmV?d00001 diff --git a/assets/icons/model.material.create.svg b/assets/icons/model.material.create.svg new file mode 100644 index 0000000..2b8d775 --- /dev/null +++ b/assets/icons/model.material.create.svg @@ -0,0 +1,9 @@ + + + model.material.create + + + + + + diff --git a/assets/icons/model.material.create.vectorcraft b/assets/icons/model.material.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..36d400ebfaee9db72957f000d3f604e0df748ea5 GIT binary patch literal 1888 zcmV-m2cP&KiwFP!00000|K(ciZre5#eicK%4MU>t0s5osimqt47Rk_J2m*taX`72I zYLt}33;gaoyxCFWWEAZT1!lmoL{dDTzjNW?q3*o}<7?b{XWk7dTE+{G7p*sjJKj)M zd1uksTat=!44p9Qn;i8{j2iiqeB#5{IV-v~sbG@({d2+CYiU~&cxKJ!q?~{h!YM8% z1t)L`&vg}T8|eQ^??~A|L%~YMr(!s?o-b$6gn2t-n9pI{<-JGea^ecF#fZ1MZxp~l z4!{I}JKsC=C;r&mn2Wo>J42Cd(pTHD*R0s>v;fcq1Y&;eoh@+L5Yxd~(@a;G@z696xXzx3l#0979H{l^T$N{S56uNI0b~3tm{%RVMN!QRxO?h&RX6< zL$RXeoRexN5&Zpo zI&W7%_5?Z$TnocsT_tA!lhJB-yS>^zVZX-k>dQRq!GQq_n zhz7>c0u>98Mi4|YQe@UZzJS{-$><0?Q7j-tCN+o!z9ZqdLP?C*Nhq<&Srn89K4=By z?RqBjGbbcj6b7NuQIh*Xo&*{Q5w)toMwD;Bj6kBy-!j|o$wnNWkXM)QrblC+L!42qx^ zN~PDP_Jn-xcwIUN^Y_Ky22hU!-98blHZ+aNG~lp}@$VQg=z=d5ww zlBi50dCodis%EblTDd05kCWEEiA1RksrKH>*{y3ROO^ZXQ!{xVnwV<8z&Qs~qmEcc z3bb2PRH9}d&e>u?TrJ~K&Teuo7ztRjScj^;Mc?59R__uDMUz z3m*NFON0j6=sN~A3D@mI(o;{=t0jag5weeB=Uw9((I4f=p^6{IP)y!xjpREntIm0K ziF-R4)OXy$8_oAk4dwR6b>$6vwt`fsH%99#TNyx%sCtz)!0|>L79T27e|nSqL!v$CWdrTk(qOGa`KLFTvy^Or zl+;;DIzUR|EF~ErC3cn)50DZ$ONjG_NAw;UOI26b+Wwib> zrAq+APwy0vqv}>!ul#P3t=#IkNFJ4f<<~1(Oq+I7_O174vcO#_G$u!kF2o4$^%IR4H_-!b!WXy^8;sR4>OS3x>#1n5KJ?a9p$Ak&PpA?Z?Pfh=r65DZ zla9`bx#m>90@8@=xdLgac;!mG`!T0CRJ=|J12dSK<3_x%NT4cMw9T}xsToVxP{)Q* a_b{p=ckNWnC^GVW$Mzp6oQhNIDF6V3yO4PR literal 0 HcmV?d00001 diff --git a/assets/icons/model.material.damage.svg b/assets/icons/model.material.damage.svg new file mode 100644 index 0000000..a952f6a --- /dev/null +++ b/assets/icons/model.material.damage.svg @@ -0,0 +1,8 @@ + + + model.material.damage + + + + + diff --git a/assets/icons/model.material.damage.vectorcraft b/assets/icons/model.material.damage.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..2c581de79630b40a52ec29aa1352d93445a142b7 GIT binary patch literal 1726 zcmV;v20{5BiwFP!00000|K(b3Z`(Ey{wsz)8-d&57x=&Ljuag$bux-}h5-!_m?A0OqvwvtMUtR1%XEB^+oo&z+MygEIV_dZ^83!O)D7W{^31u>a?saDZI1h1uf4&3Kfi$ zX9Zc4C5898inR^2e`0sEY@j0NB^NX74z-udIaCqR&N&eU^!s-2utE-8ku~;s-M39V z=qLaf0=RRXbN9@hIvZWM^PF=(lvRCcJ9U~Bzn$d(nu0(guATD*DI2OA1aF$ziZIdi z4cn`!Q<4o8hk$&*28rUDRRyAGH#IiMH}r>L{U<>i3OEr$OV@P?r0hi3f>kYsDyKLegFzG`CD~c9vIK!OVM-r8kcOA={vHsi6KD{UWr0+A zNgO6_4En~Wz>U(>58!c*k71DcUX*ON+v!eL(+Yk~Ev2O~{w2M%G>!cvjCx^N4+Vrd zx2$MaK=v6l=A=f$;9Z5I|H)akd)!`azhl29@a9zgKyA~_v8d<*0$03OCJg!w?ISpI zukiEm*>?|B_}*SkxT^r$$V=YPLMcvSDcOzGP_rTu4B98DmL>9a3*Qr?LE?v{SP-OO z48}wud;c)--2$q;y=pA)&`NcnWdydCQSpj8C(~-+W~m!wL9f=>lbY0ORgD9!CNHbj z^pO@lWG~yR$dFNgzej*I@qUeeNYTAl01d!D)Hk=J%~w>3?)}2I-+O)Tx>{n z)RfVT#L~NIKN3qqf>AJR`G}=1e2t^Gh8{>C)0!*h?@rKTjYIlZU(eShkoG!a(eG># zcyhV*^!CBaq+#mNPtO};B=4$%Ex9cgwRefMp{f}ZBw8~;56&3P7sgB4TB6Y?yn!o~ zvo5;c7vLNoasXrF4nz*##}t&T`~ z3V*k#s6fr!o%6+l+FHh=m|e$+$}Gml>=!EzvPf&am)1lqRj4so^;MW=4(2ndY-68f z;5>#~`p_R~qZb^q6t>%kc%YtekTVKYAY|^vF1yCoqd$s~1LZ%oq3F2P7|B;sR-N_g z5)F1T{&3=s-e|sQYDiHwwkvNiuoYjqdTq3>vXv3UVCG{wc`6mL#H<7gTQX*?9(FiG_wUls#l)zd_FhYuNEyW)p#j}?3Z=uiCU^mB>tM;i`t6Htk zC%oMv>Uk%j`jd_o zRF?&lcS0JBo-2@+;4KZj3{tQghF8#_W4gtgH4WbJqL3BL+h$hRO!sAY4GntTL$8Y7 UwKIugyWg<=2f%7O3?L@}00b6JApigX literal 0 HcmV?d00001 diff --git a/assets/icons/model.material.eos.svg b/assets/icons/model.material.eos.svg new file mode 100644 index 0000000..e8c8f72 --- /dev/null +++ b/assets/icons/model.material.eos.svg @@ -0,0 +1,9 @@ + + + model.material.eos + + + + + + diff --git a/assets/icons/model.material.eos.vectorcraft b/assets/icons/model.material.eos.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..1d4783e904e1078bbd1a340d21cfe05ddb627011 GIT binary patch literal 1867 zcmV-R2ekMfiwFP!00000|K(b3Z`(Ey{wsz)8-_@|I>0`3Sj-;qqiJMZiGZdJCAQDOO9zA!wJ0A7mExFi`+B@@Z>7wRhA;_}!#&9Pp z#tZK(9D6HTP(h#*MtxDE&gH0)KbcN^7@P4$v!Mk{^6>Z^8hbUXa|+LFct-OHNTGs} zd_s8z4>bj=E9m^p?rAO?7Ch%-CdWeS#cB>sMAUOmLeecYl_+xKtF7A`+gb7nALu1+6IHln`pVDRW??6I}{c)MPFRt3?A1 zi#5wLL5of#213e`56<&VLTSdU6S5mjZ#J`rWXYR4T*ML#i0%~03 zyrNmB*PWt8vK#yu><0cc^@C~9(iO41P&CC6PT?)_wZY?EZa4=BMmJMfdkEMtlc$rY z_oV66lfzB8FE&g~|KZsI2!7#BboU{!tvJ@P{4tc3yf({j+|BZJ4a>}F zQAwn7IjR41^?zq8_2--{ZXB1g-!5XmUB32GFKFiKKCp5iCdMJ{c5#aUDd!TV)<8ai zk6Y2v5qQE#LI_(tK_u}V3C9&mYy!T566ttvpzMWzD=2R^bCn`FAxXmk1x81)_UgvR z%N`s>)Sw|YYHevCl+imuA@_4k(R${RCXy*>rfm zM?!$$xo;a7MRIxDyOKA5H^dPF>XykNjkFHW8p!#U6h|!?!$_>WoAD#DA|x0D!i)Ztu?ej+HID-V*Y6aJ=Qpsf5m3KCV{fo0YSfUMSxVeMX`y$Q)QTD7i89rHIny5 z##Y=Fi_$|78AH`8CP<8Cf)<=LnlFs!w01;eP@tYGRjW3!C**S@%G}wh8_^nwa;qrq zkSKoa7w&Has!O%26N$lXgTUlTju=RUk-e#2@XEOwqBD*7Th^gdHG9pl!ZlHTnzZ&! zButb`wO_r0-?_T7L@(dR)J)w6#;4i`IA>>S)DbC9fxDoh6E%Bx&X-H-Y8g**c9SD& zvlyDQpRYN{BDHf_$q=#9sYWmA>om^k6&d20lnWI*LI($N!bV z%ciIf=6tVZc9!Ll)A4AT2fYTlpBD6BqVRg$+U?a&N3P|5=yc>>n;P_NC3sWz3eoQb z*~;_ULq+NjKTZ81-X8R_h4vd|u-2~p!%wNRlyrcU#92x*KuYW^B_1Fpa+VSekP_1^!2n{bbt;012v z24j7Ux=(lFdMaA154~He@E%p+Gpb}pyWPxrF3FJoq+uB~*Mg~!c`BJb7a%RcQW;e< z&)6-KpEJV16s8uWlAjDxs0uFXYF3uajAa|BW5cKi7*){wdM0O-8Tn(!?qAF}WV>uB F001@(jIsa# literal 0 HcmV?d00001 diff --git a/assets/icons/model.material.hyperelastic.svg b/assets/icons/model.material.hyperelastic.svg new file mode 100644 index 0000000..8ccd91f --- /dev/null +++ b/assets/icons/model.material.hyperelastic.svg @@ -0,0 +1,8 @@ + + + model.material.hyperelastic + + + + + diff --git a/assets/icons/model.material.hyperelastic.vectorcraft b/assets/icons/model.material.hyperelastic.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..b6d6c475707a2c0f0fcf3c33cc4f7fd5ec2c6c6a GIT binary patch literal 1691 zcmV;M24wjkiwFP!00000|K(b3Z`(Ey{wsz)3x?h$2k3_`E4rfHS|me@AqWgwqHQj; zs8Lc9FYtfgkrWjxbux-}h5`!^SRzlnN6#IP$D&0pTO^7!OhIj#TR}T&;aKRKQ?J?GJO}6)6e51(oGlTpvF_lkuIFn+ zc-?jEu3d+sE#`-Sd=ecJ#SJM7fueyog%0_IelgMhh2t6nP6468n~DN8z3PgSvOx>M zT*F&v$k&7x9GAVy00^lnj5sQDEXE@+h(e?^J4-?-D69}sR_TD0ti;Z4=k{`S!`Tf! zAXzgCn)V<|8$t({_TYllED?Vx_=mj9k|2#@*I9_WnV%+6>LsAexg$lh2BN0WnWIV= zm9?c9{ZB^9{&si0`;NH^!IQ4~f!4ZRh)eaV@bYWc83G2q61EMe-nDo=eIIyx4T0ac zfEjbjYFzYo-AP&myWx+)Zs^T2FPw!Py@@Xw)%2>)0lVqz(<{ky9oE9jTxHPUM|=E= z8`lq{h){gx3&Q*D)|>4CEL_f8~Re{ni$NFPB?C(d+L_I;Kt*^}I1g@}VrqirHe3b_iqbsA|T9skThm zfip()l`x7MOEemVKM19A)~4o!d}(<_t%JH&t$@g|>SsL?$&dNO{T0D(ys-@;350D> zm_Er7LxC_hchw6>!)=#Zm1!i;d522X%q>Go+eGXj#x&DpkGu}qGle>*>Z_(J>yBvu5(1?7Grbv^ECrqsIlICYa&)E z)flY$Dory7bBRjZ+$S9bk6{rY3P$?qIfJ@}?e-xVm?s)kdqR~6nMbjUwziGvPjci? z#SiT$I&U>b@(t0lwO(D~!A>R^PTbKO&3APLg~8f(WnL!K=r6XIcc_C^M(`^lW@Qt z1Y|w7|MJ*}iX$(NEox@4`4_cVC2Z#1zz3p}qZm|U{9hToY|Hv!&i7hwXILIN9gl{2 z&})$UImZVRh1cWOY_E1Yat-%Grz7`T*P!Ps&f02Fh`DpG%ZGxNqod$7wE z+Ha)88i(?aZ!&8w*$6GEwU%^*mc&|1GD1sittB3zC9>8MjnEQWYY9ha39PjQBeeL| zTK+BdxgPB1$ZFj@H)~a|_4$O~FQUG$YD9g)D0A$1#HLdMIieWU zIQ=($ui%CE`URug?c{?jkiC|1$JBfO3vQx4Zo(J15gUy4G3GwqiR-CoF+TL}s0#L| zioT;tWVGAOf>A++h$k&6u)gL*ennD??70MOX&{VIw~K<@67l&L2xc%eN45B}3PV*e lZ|Zqf5iLtLP{#(T2aqc9eKVIRcKaQ>e*l@|_}ZK%002CTG(i9W literal 0 HcmV?d00001 diff --git a/assets/icons/model.material.plasticity.svg b/assets/icons/model.material.plasticity.svg new file mode 100644 index 0000000..0b1ab62 --- /dev/null +++ b/assets/icons/model.material.plasticity.svg @@ -0,0 +1,9 @@ + + + model.material.plasticity + + + + + + diff --git a/assets/icons/model.material.plasticity.vectorcraft b/assets/icons/model.material.plasticity.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..af32a116b7e8f557aae25497ec9d160e72ff4821 GIT binary patch literal 1710 zcmV;f22uGRiwFP!00000|K(b3Z`(Ey{wsz)8-_%^I>0`3SBR3_)Pf5^Zy# zMU9f0c!B@>j-+TuspCa!YkDMyX`$#mkw*n;Qnnv^if!~VHo>@~Du1fE&*g0KllA%bEy zsTi&sn$uUsJKl|}8^LeM zfsr+5An6fgr9tQrN*_X!nkDit1?y0ES%T6i9(!|nHx1GxO8o?cd3UsERzTDQI&)k} zrSi6vv;Vt@*PcL7$I?72ay?YjQ;39YTW)&_8~;#T9FJ4L$pzRfI}cn;9{ZUft&?1x-4fo z7bV%pol~`Elx1`iM8|yr{-M3T!%e;-dYUfEUH=L^-#p7d5XSf%vwbA3cw=TB?`HY3 z0<}7+MlrqYe&_0UYb*6fhVxrTgYY|3@H->0mwH7CN10PJjll1X6$aYtQHLOiR7}XM zfqVd;T9VNTc%oQBh&nuBEb*NP#}!IqTv9=awMQB#j~vtr%B%HUtE2$A2j4HU%Ez3oHEt3O-p2qDDD^w`D<>+!c$`Ll_%F)gBY3Ml)dt&Kk{U${A@K(HIm#FO({;P3;N!*ould2X!M_ z15sf$$aY8+KlYCM3x*m;;~GQ~2-_eqeUc-F5@Bp_s#lPPyDqgl(@37P4xOsmYlfDt ziSpB=wQnL(szR#0_X>XJ8p=}bzWdZn-G?To+AnaGP$xq6QS7R%T_gIF968kS!x)OmTdk3N!K`eZSC_cAlR6KA7{pl-XI9N6yEiWgher!9?NZxV77>osV40{m}Wyy)iZD*;4Sf>J_5j z2)vQUg@=mN?|zv2L!v$CMIJ@oDucBSPL(g9KuXDP`5DY3JZcz~41 zSxPiOO6V*l93TZbOF;vq1kO_aDfPMO?dIrm)ja35y4U%9BG@gWL7;0yyM$5Y*ztf( zrvh?9F@BFlEqH!5_|&MwaE@AHA3~%ni$j5&Qby}9Q(XyQ`01Sna#GzY>y_V4vNg3j zE>cIOVENUG=Ciulu)g*FL>9PZQe$ew=#w1bxt?Y_9)zCj`1{~#=l-l)E#lqRFY^1H z*__|&&sCnDwvIlu4TBWN`#z5KZQlzWd9R-d{<;~xRRyw_Qtps?@4vxK^oX1A2sd(r zu{uTF=R0vd7cJI@-W^rw5mnJQRLP8Xvz~J%$&m4+r3Eq9f~xO3YMDKkAT32w8Ff1^ z=vOK~s)K9)sRg(K=CTElx`MzWOH>}J;f$}E+ E0KC9QT>t<8 literal 0 HcmV?d00001 diff --git a/assets/icons/model.material.thermal.svg b/assets/icons/model.material.thermal.svg new file mode 100644 index 0000000..f08a9b4 --- /dev/null +++ b/assets/icons/model.material.thermal.svg @@ -0,0 +1,10 @@ + + + model.material.thermal + + + + + + + diff --git a/assets/icons/model.material.thermal.vectorcraft b/assets/icons/model.material.thermal.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..a0baada2b5476283d0828222576ff2681dce9cbd GIT binary patch literal 1922 zcmV-|2YvV-iwFP!00000|K(cgZW}iceidPV3&LL9!$5wdZjc5^o4_s-6ow#B5+$)- zEw_8vRt>#-hu2CgOD>nPi?lUhNa8ggXFd*xLq0kSR<3dFTsU`RRk4lo%?Z)mPE#lD8VTqjcm#+c}#xYm&ntkGp=}(5Y#i5$LmKbCQif3Mnbh zM)it-$P79*Ijt*b@P$5*tb&3W%UC(#?VDSdIkdZZbm&}+oZ~fb@mAFh zJZM+~GLGQEbuQeIJ9IYs%Y)}!_@O9L-?l@iTCw}d3{Vpgh|62&Vu7=Y=!%k6)ntWf zS*eQcc<5w!L&{@7KJf~H;+E!fj-uWayh8NQ6XWGyN>UNP$syEaU1Xq@R&-I)yv9?m zw7P7dV78*!yd-%m(g%eU1;HiGXM~SOVGxN(N_G}Bq$A+YsO$6tuRi;@UVR=Iy?f^kH($ea<tjX6~UTdJ54APqe*Gg1VI zU6dq#s0iSvu9rsM_P@%u1jhH`5z_V&ztd3|_?!!V7`kyBCoNS(H5#EP=BA7hN`3e{ z%?(aOZsI*Ay4}9Ix}{>;6|L(}2tWt;Wx+9oN&q@F!DnXRdwVl@icnSW*5<(sRsDg0 zJ-T!MC=8j=JHhU1g@q+ameHc(RJ(UBV(#=;>a(Cwe`|!F(i>_S;+zPMibh&_Z-{<;9ehK|cw=n;e_pk`G7wxMv(FISmIXuxlJ?x(L z>dp<=?JrA?S`+@Eyt>ErY(?ZiDj2%?1q?MlX+Y3;#-OE*`ly58Gg_Ujj zBIZ^VpHuOk@q76f})JH%;6i^%Vk7IE*kc2J#se z<&q4}z!M@4Ayjw*#POX8#}-PY*R+6wBz}Mbg(MBcpWZ?|#igE52JcG(ClpIB+@VVnb4^*}`9#;YWI>^@ ziq=frA&Vc%z1A4WIU4bOxoFy5UaaUN+q@BycWXGgXY(^X8Ulubg7o(2OLdrY_E&9q1d2+s7T7(Fn=~BIhP#5zxsN;#)05#k4?X^Mc|3;){FH1n+jsa3W#1e#z;Qo zbGl@^h;XZ3 z(jpQ1F<-bpW5|QnwoW7hw+#a0gBUU32$4BeuUKV$;E|C=bc!7^R5P~>&20na!=SZG zkuVl6)qM4q?B3Ru#d7)XLNoC@&_30CgR^#~+8juD3cuY{WT0m5&e>u?Y?*Nov+Ed9 z(xPw7ez{^G3)i+_04jb5OvHG zb}|)#41~6dh~-BIgtKC6Gg|Z#z?;5EN`rL7t}e)_}zuu`=I%*D&StGvfX)u z4p)5X>NROy$(0_8;hB%&;8ZGNS>ie6w{64S*NZkM_KD_@T7$Z(W`#`4fNPLfP9h=L zD{TT9+5*pLy-~$$Ixm=j19ae!_1NC?V;@V7JU=$irorK#UxmrWX6y!i;B0V~2IUz4 zR}Ee_d37}Ado9`-rbk{*kA`v3Ybf{gj2sOVUQf4XXSJ78uHkv;<&-ja~W2H;J{Bq=%H)T1wnQN@Oi1>LCSLOF=!P zgw|5R9#R5pDM1e@zO@v;hZN6R%HM@PJ}^j03GeVr~m)} literal 0 HcmV?d00001 diff --git a/assets/icons/model.orientation.svg b/assets/icons/model.orientation.svg new file mode 100644 index 0000000..3a4e481 --- /dev/null +++ b/assets/icons/model.orientation.svg @@ -0,0 +1,10 @@ + + + model.orientation + + + + + + + diff --git a/assets/icons/model.orientation.vectorcraft b/assets/icons/model.orientation.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..1076f3fcb4a8f6509e9189acbe779e62317339aa GIT binary patch literal 1870 zcmV-U2eJ4ciwFP!00000|Lt0BZ`(Ey{wsz)3x-6!2iS)$E4rfHS|me@AqWiGqHQj+ zs8Lc9FYtfgkrW-vaZ-wQiUM1K)DlVY9^G?yJRbGn%o$(d#yN9t$*f^~#__yyT)5*k zWugk$K0QD5Y!b1`b#lhvst960gLFH(lSzhk+bG z3E}sibLNdb*IDa}d*3-jp=|1|Hm*}I+1+FYUF zodT~3KLq5X=#VIGXqgKX&AJjD@(KN7qWv=`H36IgLPJ(nfg7?FU2zJ^nF@V1yoH9@ zk`_59`Io~W+E@TjYPptWwN;!?dUy#11OOu(d9DUj>OWA9qLplCqewgq^b6|5$? zCenTSyq}Ey%!U7>;LsFqZ&WxAlLOOUZ=`w!OTmx9QW}eYNk>we#wZCRO_F5Hi+e16 zXOcuiU`kO2+_=#=^`Ac8-N(R7H{vC7!vD!JAqO<;BHxsqU@YAy3l2QLrN>KLaH?<6 z6WP*pI;ERXtc+ooo?{t^fnmvj>j+-;eTvc$B|Zw1F!nR(WNo8+qp_d(QG(JWLQw#Q zuK_rhE5<iPSUx~FLh&}n%_j9o}K!ex) ziEGJ^P#c&N{K2sL4mYzUQG|DS!`1I#M%OQx*P>ukTs-C`6>E09u$$%U5`4tUBLq_6 z3-Wg=e>bL5e=hLs#?lYH&I7&9_speUkla#chO!Xy6z%-J%2H5=zz<~(lNtm01OaM6 zMn~WYBLN}o@C1>-cO)EJD6x)&5=x{3p@y=v7#Tr%vzp4B*9u7*27aJ9iZjp8V!s1| zL=TE0V<3Nm7qdHSBq<6ao#AGI{1wrbSwMF2|<<^h&`kP6^)I|gBH^xZb zmpNT9TP%`?Akv1aJSIpqGeHN=7|j>T3es4j(J1_0D3xBDm@DLS%d5gVsB6&*hzzTK zx{_UIPI&jLc2-g4Nc0bCqet&sm2`)y$cprEQ|TpS1Q( z1U5k;q?&s#XLq)tEK%Z>%(9LyyyZF8Tb7d-mK;1CV8(Q^jXAKUFi+@mM# z)pr7w2$@H*i?+6n=zBSGpyG!%6rHykBl(JpvbA1aqTWsh^&NNcM)Pf5!4XDnyYdD- zTR|$+Yoqm)tqf3%sC>Ai=SmR^j&pI|1YO(9vu$nfBQ2rK2z_?wVILub6}b<{%*Jx&4>tK2#ied2Ug^g3Z4;HBy7ktQ+)!i_uXURCD}S zHF(*U^}(F)wam`2JaRfc8s8n^)lR2e!~M|dlzXjf(31scZPhD8 zzvFl<4&Vk{q5Q*7skM}JfRw~qN-{u7Y%L`oASJSv5)F_N zT1yEBNC~W^1OucXYbj`e6yI9Pw^E<$-foUAmd$fst9q@^C;aUq>ieojv`rXgjvWoy zbV?vc6yqPU$OX?!2cH^s7*0`3>_Z4uWpOBwW6Eg#WvVLy3_rb7K#rdIPPQ_m z<0APH09bytq_augtc$+&{zB%sEd*n7#OP9ta9;1zfP)92r~1_6;A!Xf!vRk&;@$UT z;)}S+l-+kn(|f0_qfc#9K#Jr17@x41z88Aoy?!P5c0GD83uLeN-G_O-_j~9j+|f<& zf^NhHV|fhSr#o>ym0FAsy*pK*9aV)-R3$Rn^=irrp$rjETACAm&8hqnrxw|B3DOcI z$f(<{9 literal 0 HcmV?d00001 diff --git a/assets/icons/model.reference_point.create.svg b/assets/icons/model.reference_point.create.svg new file mode 100644 index 0000000..7780238 --- /dev/null +++ b/assets/icons/model.reference_point.create.svg @@ -0,0 +1,9 @@ + + + model.reference_point.create + + + + + + diff --git a/assets/icons/model.reference_point.create.vectorcraft b/assets/icons/model.reference_point.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..17add916111480194a5d071295cec6ba1a5b1e1d GIT binary patch literal 1931 zcmV;62Xy!!iwFP!00000|Lt0BZ`(Ey{wsz)8-`w}w*dRlbwyXSTZ?vRF$94@%e2i! z7Bxyr;syTiJH9!VW2Y3I3s@#^q-Ys0I9{~g7~Xh8 zS>;`zv9}}@;TS5R)mPc-wP-c+C;7yOwsTf=Yf^!b`-gtP*lTH966mvLb5c$?SrAUD zf=p{ht9DXwf?ERJyNb3AH2XyFNZCL^!Ai!bq8F5YUe2Hh^LEBCpF_LLdymeg{0gr{ zi&wgC6hK1`_ymqS-@EW9{@B}?hr7VL2$3w(PusEAtk~_e0PF-5Vt(yiEO6NnQ^8r& zOjnrlMptaF#$JgxgdYR)K~zW-*R+}o6z!%K6|#pJm?;0mNkagqfY6e4T?$JW)inq6 z;F&O8%R4A2R2@kZFi2e!%rTf#$fF=cAyS&X1uaWZSYxWDMFXi=MZE2HyldCA zoL!S6EgM#Xraj1V5}|_2`QXB+St9;YAc%a+k}yT_*qe#BJV+Ci`UxoWZt1*TfuSZ) zS>ResD(fmC{SRQm?sa>$ePp>BL(j4Lfzqa%iAOb582pOqi2$LO3CIt^i4RjGq^kFL z;zwzmBteM$B#)99YFXFn>THrHA&R0bjq}J)B2lX?^JUE#C>6F6!iC^5bTPso_0*M0 z_G7iW`h@WG0J_vnuPclgKFf|%$~_=Ucc2FvZul-jq)C%OljXujV+41`1*0ip5Q zrhj6XZKprmHP`)x>Qe#)8{i+xn_Ju#E20GH(Btw~nCPn~JkYXaGh9A|H#KYbplK=J zRw zKgg3n0|`Y<7{}H?eg~({Zk>^2VHBHSB9G)BGB(j%8VF_dmJ>J+IC}9OU9wbI${EiG zx^^W?jO45s%cMQBgzy}L<*b36W05dai^d>PE85s3ROGQn@@5UE<#K+eM~i`>U?8)- zhRPiFoc)d9@=OTG?{OmxVzIpKUCFCIJM0J{*e#P|Gol@yHIUaET%EOKj71XZ-Habe zq(P!VFkJ1C$him&4$TG)L`P!w6Z2Qc$+_f^{xvk~HH{=+2WX-{72`shN&gdWvwjsi;8B-kr0> zg19o{AZ9l)qN2snnEmyNfiB#-f{BbFmMYZf?fNQAvj_79SFW*7+H)TLyc-G!a`ZKW zjEU>Sa126$sgTvCm!O>d_Bkp z23&)>;1Rpdu(SzeC2L&JcB6~ebS^K2OV>j3X zm!q>RsAT+CE%>FYnxiq_OVQ3UJ@R~Zw2XsZ!nhv`ax_qQIosNu)t=9|mgk}8Gwzki zK~I;Qb#*Th{g&g6xWhk|q<;TH?hohTG9bp5@#*R z04=ezmUw^``s5FaB$l?`q;H4ggD;6t}**HluekLH2T=2HEF( z{|VcmJ=;W2*hU;MR_9Fj^WC^UmszYYy|t;rJyW4arVN%&Gi9 zr4i9{1=>>am5BH + + model.section.composite + + + + + + + + + diff --git a/assets/icons/model.section.composite.vectorcraft b/assets/icons/model.section.composite.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..255a931c8d1fc42631a041e1af37b98d1a729bc3 GIT binary patch literal 1773 zcmVdaue-Vt zf`%Lf2nhGCbKy?hv9r<-_sF^M0$J2Ot;bHiV0Y6DU=t9C`K@ztgNvHz3eM_!y1=bxK_#q%4M1@3gOUqoKXjYY|kUjK=iSkdJ)C6z}2n|_Q1qLRx=!(;_!85^H z!&@lG7PQDYDK{cLAf&1Y=D5s=7!QbCDnv@Mb3=;)1Xh?TjdVb2RzUw9AW|z(!6nOF zP=(?sh}{S@F5Y}MOcKwB*O_&o*WPJN>nz(-IcZ5esa;yngl|8=Qv+@nB zjl)T}<i5`MWli`cr|kTT6|)ohsc>AYP>Ks2J#0f3U+6W1cIwj`<&F5e}U$tv!#JhMsGQR?U-de)-#tR7ED>= z`9PPp#u5fnE1H?OXDl8(i?Gxf$T5s~o|-foiJH-x6HghBF_Je+$Ws*gksd7s3k8C7 zpzJ9+%x(5}f{P;|1a8kZU{@ffx4A2M{a1@^cPN`_a!4bc!!rhQxx(d9Q${lqN$;lp zNF)jI2f?uABa*uCG>*<1Iw0Mi%3Lvjx11bn9MZpfdcMZKwATTPert;W$>kR5?JG*9 zVd^kW&l_VT@5-FcnJpHzcMi3osu|#(ukh24i&1I zYlfD#f%1OP+BcCPmM+zN_HuS->&jv^eYc^ReD}3aHDBPYovBtwC_RO@SyWV@X70|} z%?+`&jJ=p$$B4=-hQ{od3kI@qW4$ldM9fvF(OdOZm}U;8#<$w_^nC8V~Xu5MVR z(lX#0)cKlBAq`5Kj2%|tj5e#TcuDh$NjP8*08bUYHViR zzy~fyM=_|z_`fpvxh?C1G2gk&&M-Z4Ivx$F(U^9h4XQ1wpTkHxrY0p(~*0v zbI{W{XKmF>M8D;DC9Y5$N>aanmAXT`J?Lcx<+svcja~WsSBbThWPp^|T1q@XN@Oi1 z8XzUKmJ$w-5?D(K21xO(rT7D+c-B(90aB2)lplpY*S*~woiCcFX058VKA%9FMHC^G zBiaOvGR6)EY&s>7Ba-o3EONnflfkD(9fnin68jJWm027Lxg9_h)j0+d^newitaDEu8aRt~q!RdaCp5gQuO_ z!)m#RcQ*pXoyO^m-FLTC_D)+zAKRvY5Xbp%oXeYjm-ozf{X+2f)##l}ke%`7lyScI z-{2JA}3=I<)n&VpB;w6w3%$j;yRaCd7OUPqGs|RRRlKW;VMigDP P73+ThzjAd21T6pn-w<70 literal 0 HcmV?d00001 diff --git a/assets/icons/model.section.create.svg b/assets/icons/model.section.create.svg new file mode 100644 index 0000000..bf81b24 --- /dev/null +++ b/assets/icons/model.section.create.svg @@ -0,0 +1,7 @@ + + + model.section.create + + + + diff --git a/assets/icons/model.section.create.vectorcraft b/assets/icons/model.section.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..5e17ef7892a5bdcbd8041281aa786f74ae0d8f0f GIT binary patch literal 1649 zcmV-%29Eh3iwFP!00000|K(a+Z`(E${ws!_4MX=!fIf6t(G~61A{|-`MPSepZF7-D zjiQ=(f&cpsZ%*X88AUsNX@I~IN%4I8`0?=YQ1{-FvJK+ih4&SgoU)RkCHJOq$2vkA z?;@UhE8Jj)pb}brlC3U9tBF4=WJQ`&*Bum;w5Dt>T0`m8Y5_%v@dZV!f_7i-JyOYj8?+HEUh29@01X-R zF6`g=-i1H&r{30F+y&l67|SAkwVQg~n%>S!z>L8lVmIE!64f0x6^wS>e2oa}bj9v^ z>eXnA*)bsRM1@3gLz+sU;M-PI$S2H;iSiE&cNlOA2pn(PS}`jJ1NZVq>P*Y;jAAwF3B4ycIlDY#@=0;1onGe%_FQ3|?NGOxn48vmL1}GoMCC>y?&UoIDjjLFaSdNNeCL4$)gln;E zSpzwRkuX$~#voBM+Hevo@mM2ywSf?;u1@r52`Cf@N(=}^hrMS1#Hc}|* zUHgIgw`cfNaY+9fn)#YVQm-Qx{oWNpAeY;~gttKeyW@I7_&Kk`pLTk(&(HIoLz?I5bo7ofcp=WLF?9>Nak3hQBAm1aA{Mb+2-w|wB zxvLXN!EJ-V>>x&r1j58#s#g$&yDqgV(n!Cj4i&1|j|^#C1Leb@btsWIlP=YM_A+|w z>dG=TeIG(Ic^?^{YQMlaJ5w_piS!iVeo;|@n!P)x%O!SI#zD+(Vnij2u`&DQnu0CF zopWiCe9ad`5NCJFhOuU?&p}C+_Ht=BuuS6k6xH@BHs4K700#G?2)Hx{lLUrDec1sO+Fvb;hMlrXFokN%&S5 zZ%EZr2?yjLAe+8}r~5vZ9C^BLk$8j6zsOpu#&+rkK2SY5i9yxJ&&uG(zUhv}e9t92 z%k;?kc(jazo`c-?B|aJ`JRi4qd$seCYq=jfAGy~i2R&ag+P8y5^lOH;;sEGalKSn7 z!XM-9VO+LQej^2I?aJT2$epd^Bdlc3R76O!={Smc7| z=c7-JG=_8J5{D3Cm027M!>vr-+Cdi)g%L?m!?~mXne#A}m1UF)Xu|8$E&v)W_ zE?TS)y){+gBdX$Ws1gzFcC(bUeGa^4l=|uG0fVC_XgVFViihL#F3n^%r vL)Q#-;u|CkS;3Nb^R^|XE!jXG8(Q5%s|Mfkxg4 + + model.set.create + + + + + + + + diff --git a/assets/icons/model.set.create.vectorcraft b/assets/icons/model.set.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..bdad8b686a5b0ed672aca9c8131b572804397a66 GIT binary patch literal 2126 zcmV-U2(kAciwFP!00000|K(e4Z{xTT{wsz)8-_%^2e=R0?csX3ZFjL-+@S~pgSHu) zjV!8?yotN;fA0)mY|EB?6rCJ;*Z@H!lA3uqd}cTrD&M?EQLkz1-FaWxycPAlrjM;R zhP%4qqV(>fvA1L;t0{ECs9)u%_c&_gPx6TmV;5q+S+f#^d^m7vH<{C;r&mnv0jfyCaco(pS5&*Q~_zbPjkKD5Uk1clSt(hMA69G|hBH zdEMxa-NV=`=$6%eKt5oHMDfJS1)^xT6?Vuc%*3$$Q_a8x01P0sY+V&-38T8IdD+q# znyalh&@f-|Vo|eluaba4s*2H?mUD*kI0#XQlxFXd7X>J+C|66Nfi$9k=Z}EM<$#V_ zTDeA31!)qcegaF4ccC9=842NbhPP3elORrayWM!Nt7&WT#2mGSexCVZ9%^+-Ak}Ma zx#|RE-ZNjcD=_vX26?nXVu($N(*G@Zd33v=%?fo@w1q`Qn~@0_lZg*2CmtV_*^vdb z;LCD47j?-F%e#Bnovj{7TFKe9QgE}G;iWP+EWk==G61Oi7$m1s7gwtNaiDc?K=FMB z4eDMS@5@>Ukc;NT=Ltf~4gvyvAUqO4q{#4!2-G)5IeQs7HUvjP5GA&r%Yc@7AsV(& z+yisSl}6HqZ%Mi=!JkyKAj=YxMzLXmW~3eIN>MVeLzr9FG@V4_{9sOXn`L1V$8nyg zBq!lu$`HEwS4rJwMI{YbQShok8a)HSC*)+R-m15? z;_&P}dTN*`KYMvZTS0@be*?9&a+MA)6n(EQ1OY4Rgf(@4!HHyVda~xhWwv8DOAdY% zM5lB~jvNU_pAav(=1IvU=>W(3K4@CF8gA(z5_o>eLC%5Z7ain$%K4wbLF76o9S@1W zTMr4q7O;#5rs;-DJ|eqA+pPvO2FyebPD0LNDmnI&@GLx&Yi<&qZ4;fj^mK<8x13&C zwk{>-8DI3N^J&GGo$A~~@t?t~Br{0It&;E6trE0Fd|;x!zu;7fayd(%%5(@jB!(y3 zg6TC$%qjK4D;|}fJHgR3@;(>2;7`4hEZs>?5%#o0ih4Q+)oGI7GXtpZ|2G#&RP2-< z0>3b-_ycfQ}DWXu2%Kj24HIK_y!A9y#7i`EA8px0ho?iasU(&g9>n zt=7L3bpGV%&%X9#U;D7V*3WF=s52*d1h4)khy?1zpJ)U@B+CMsHIR=G=$34B1D+^G z2$89R#E9=kIId6<6Hz6U*pz1!lzn`)gz|1ZlcgvpBv}*&p;@CO_k%nMG!TM4B#y0t z{0lr>JUb(SnpA9xMtLZIB4ZQHrGZdJKh+FsY>sT~&i<3p;zkIO z-{A%nQ_;QcL&>}UY^ZBtckd>BE20CQHIVmPTHfR`#v+M~ZYGW-(jeg=7_Rn6!u)qrvs=j_<0~=#nue0E12+AQD}q37w}Gkp2e~Asslyw;u}1Q9x!_CT zibWkc#D=KKW5U#|OsK(GqxqGKg0+rl42qx=N~PDP_6GU1sjI>{sCQ0e0vT3=Y>!0R z$KG-OPT>r%bqyj3gl$lmp5%xjB8=^+`dKut*2q+*kz8VjO4aOFhL^61@@dlArAU;@ zkZSL}wRm<7WvO!CLuw}PLlaZ&H#p~DYL+9Gk%H_u6_u#jhjTchW3J3N$=OYgsAw@X zXMevEpo_N72b;zaOOuyGz`8lObKl9sHvCV^h_vXSu)`Ii zLcJlauedV6Fj)B*k1mxWmNi{){8D6mxV+of2tV)=%9YU9w4zdFna=6`u(AnMs46<= z?N&Fh`JxgM4$uK18`;5i*?q;4>$0)71uy^jF^3v#$8N9(Ek-w4P|5gSE%;?qHoZCD zThY$4Jo0*Ww9JFv!nhyjtT$13JKNg5tG%9aE#HS;&$th!20dNYVpDYr(LdF6i{Hid z6{&yuA@_$wdsvq(v_DD0T8Hvqe#o4)WCOIM&RWs|S`ue1$p9^}vzB;(mdII4G(bz} ztR)4k;d>EwZtxjNL3bx0=cD(*4?Ib31Il?odR-G-74#p-%YZWTOAiY;C2Me zuU33MZQ5N?FE?@hnKyo@KAnjd zeQbSl+B*8UX$wekoDHFlmH+5@kt_518>3&hqn~Ag> + + model.step.activate + + + + + diff --git a/assets/icons/model.step.activate.vectorcraft b/assets/icons/model.step.activate.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..7feaa96ebc1731ba91355fd938e7a5e397027dbc GIT binary patch literal 1928 zcmV;32Y2`%iwFP!00000|K(b3Z`(Ey{wsz)8-_^gHNZY}UC|Zo)}kF+3_%dkHe+*< zMNKbByu$x|$2Z4vl#HU2ep!IP5_#f1IzD$i9`!xA67`0*!C7#_7OkikHN9$sDcsc! z7iDl3O@kFHSxuo6q`oSt*HUT{&hl9ZvP-e(Hmrm}zTZEGra{Zwg26Kzv1G-pX<0R+ ziK(!N%ePOa2C$OX|S~ycPKc+k!mtmyJ^s@#qH$+ATv-%>+9g`iWUvC9kpnh%QfY7 zV>)&h)1aVRRu2LBAUhO_YhErTigsJc4)uh6G1>m9W(@x3kqATU-e+gdhZ+92F2iC7BJUP`r(Aso!d8y3>23!j>nK0;i z2K-28AG!sIMf+`hd^@{)d3jA)@SFTq}6^zCC$z^aA8*IOG^V8Gc{rUlgKY zOHFt+hXub;%x>0HO``N`TCNJovs>VSgdRvjDBrH>l5>SWoF4qcz;{>D3~(Eoe|b&J zylEOsk0LMWQ6$W>kmSUWJVA=rmgKtg`8>)^+Yj?7AVAh5jcy>onv@`f@;r*OIJ);C z)g1y$aFS(N7{(Eb5`1An1Yb5nfZiVGvstzuK01EX^qS$*BgLlok->qj;o%?Yzsf-O z5OSk>KzhIoPrN3Ik48XyBoAI|P}Tr>Xre*sBP1?v%8G(ljd9Xs7WKx&%44AwsKY_} zT>2wP!p9v|kwH!nxCi`$SaVC;#hPh;nRWO4cTuv70e2~(9V{5E3Nfd}{n}oM)~@H% z{V3noy!G=riBvk9`kkxaovYTL3%a=W^z_iUcxas4UF&DI^wgQ-Jc5W~7i^^C2{s5& zq@qpc4CEsO+!dRgfG3J2gvh2VvBY;G9A7Aj&0Z9g*yd3h%0VvU1m)Fcu5v~%Bw0id zv2&EE7<4ZqHG! zh-uS%>o?9w-jz$f624e;Z6LNp)gD7qJ2S+9b4K%(i-NVDXeguZS z4(h$q2~uGdWqTybKJJeD8-;pX>l;K82-~1AJ<1V@L>RkM^|NTaOFKH#NFHN{PSxCJ zhL^sH@^RAIr%05lkm~NewYc>SWvO=G`_xR`6B|?A7dY==YNsPskpk}*6`iQLhjVdt z#eA7@l(X9$QPW~<&i;BWKo@Pj>m}9@E1hceR(+kOxr6yaOW)il?FEm1*(SmxIr>^a zHOqJVko2Y}>eXb4PK4Z}*ypbCjp#=?GSTtF62<1N&Pcw|qU^j^m$+)tTO3p6zRuA9x96Q|N12QR%V_ zga&=OAy=JoWfLe-Rdm7It!duyWhE3Gpo4^L$3{<&JyaZddTd$E(gkKC?8a`e2Q4Ni zSx}Ghf3@J3u51Q#zL%n%V|nEH?C6*Wy@YW;F4$nA@N%|w+p9gFaUJ(V&u82VTZ6t_ z)uO9B{0*Ag7ek`pc9l0gOMr(?CwDTV=iS zyG^!or{f~^?F2BtTJyza({77Cdw*e9v@7I{DT&D!DG|Kfrw)S$q0jYQ!{BM>{v(D^ zE#l^TEcr#*cgK# zX3r&POR=1crkgMM4VNEyf?&3jUtl%z8%hRM!A09#Ru#9hd;@iCkopc%CA(`c6^h+q O$L?R2bPpGPDgXd&XuJIY literal 0 HcmV?d00001 diff --git a/assets/icons/model.step.create.svg b/assets/icons/model.step.create.svg new file mode 100644 index 0000000..c035dc4 --- /dev/null +++ b/assets/icons/model.step.create.svg @@ -0,0 +1,8 @@ + + + model.step.create + + + + + diff --git a/assets/icons/model.step.create.vectorcraft b/assets/icons/model.step.create.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..dd088a4b6533a269d95fad87b6b962ce09a98dac GIT binary patch literal 1652 zcmV-)28;P0iwFP!00000|K(b3Z`(Ey{wsz)3xVDx2k3_`E4rfHTBJjZp$H6GqHQj; zs8LiCFYtfgkrW*(bux-}iUJJ~SRyIjqvu|DJnGI{Fuq2@JNLfgQZQa}v=E*Tcf2L6 z_RbUETjCmX1f4MIlNxm)M@@pW=~)0{D^_-ET*D-H_s@mCCy1aJo>{XB)3a9K=B(rx z2@KD4H4!cJeIU1(w$M;A%J@tUh1SdE9GVapbB1^YKyP1^$7=u8>uf6jHqAfNZoVD$2g$Qr^j_sB2 zQMAGQ5RiAWL!r1PbtO@VO(Q$h6XwNa`v;C&3^*kOf!7U{Oc>D(C$&Ix$(P_AG?Xhs zD~{`($Os5&8jLuqODyLjFo{N_C3_1(DF|#3(Yok?)U3wdcI)rPwSu#2d|+hDC`j6a ztTYE5TLQsZD+1o1Qmvyiu080J}$``%pMO?4*-^KM8bRzTEQp2CEvky>S4EvNsR zk$QK#z1n_5U4!6JU;jXB+s);reph(=73(ztlYWUoxe@64O1_|MC=NA*$zDSkA8aZ1 z8;U~>v1|ZiC@E`kwX=?`B3J4t{xNh^Wb!ZXRa6vNlqacCka6xKlAgG(*(N+L8*3zQ>WVCx zD;A}PI5mc4HJVR^Q7jzM7!=_klq#>y?FsqN@rF7Fbt75>QDHSKc1RRI z_Ky2If*rbW4I&wYZ4j70$Pr_SFts<;OGv|Ams*`^WRF>gPSxx+Lu%JV`C-yJG?64% zA=Tb{IlFNUWx00W`_xR`$0nxQFL2Jm)Tkp>ks{hHDmqcK59e&Lz^<0@AZIr@qBe`M zIs3(mfh;7PD<6i4rA{>ltG-Ut?7@6QwQKH^4}!w5^OFMpi!j$z!F6B}WyJbzuMg@_bj(dPiy~j6q*3Sfk4_5E^tvR285`l}&t) zHK-(F(>Je4)i4DI%t1mnbB9mQeW*C{^xU!-2Ah9bsnvt+tQ+`1baE7fdXAr!!H-?t z9?bck%j_)6Bd6ohG7owVa^IKuV50DR+}iEcPDifge&}@MUYQ#7Y{^;I3<}Y&IoilW zuR}%Zw=br_m}n1r*+BcXGFatVLzLFlPYzYm^v-XC?VMZEupLw!FO zbSJK-qQ&~qyQeDJqbm7^Dw)x4)^kQB88V)9q{8N!6ZLsWE3@Ysq~(!RM%&FR@|DO> y!eC$lQ*+eH@2)UZ1xwM+nueIMWDRv}7 + + model.step.explicit + + + + + + + diff --git a/assets/icons/model.step.explicit.vectorcraft b/assets/icons/model.step.explicit.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..9f84780690ab8086e7b2eaef1750c4125a9e72c9 GIT binary patch literal 1968 zcmV;h2T%APiwFP!00000|K(bHZ`(Ey|0;(5HUyD+2iPB7S9C?YwMd2*Ll6YC&DdOI zQPU%d7x=sH_;Mmg@hCbOiY-7AiI2OV?#1Jg_udt+*QE7Myc;@ic|EVmRqIXRt!@}E zy_0C_Eon(>0-Z4Gs~q)KjG6>~?gub-!ROtYmO$kGVIG=#Eo%!3bJl!83%_Y;<5X(Xwg8!oEN;l6oaAlbUA}2Qnxcs>IIBDzxUWek}b(vjCiB_CI|-B z086mH3%rxS52oJ6JlrAg1V^$-KW(R8v*NdxbAU{NA*rvulPgj*)O6ImX)afU)s61h zUQE4$Y-l|MOHCUJI0b~3uB(EybjP}?S=o}AkXT!H z&@f-IVo}p_#}b1;s)~}DlyfTRF(9H4DbC&%D+*v(5vH`Efi%2;`Hz4|jX*~&rCbY9 zp)`roAOUTQw=jsa42SSK6R%O2V-%;`?RL83)wDIgrjFdQMEsVI%n?q0VS+b7bm2+W+Sf6&@=Gx4az1p-`gtxO<#9szw6 z`Z1_kP*v}#pF|jiae~7%406%QyH@w+ei)}&5`}4klRSv>3j@GATXPOPg{TB=gu(a{ zKQOdYKkLoRbf=fUE)=X=0q!w@!2J%8rI4nW7~0sB*Qx>u2Z`f0j*k36)@ z3*OL$GIgoFg55})ZdOF9j}`^18ew0zp#NAn@X959Jp^9!9vD3!i9=r+`B|UB4$0H+8XBvC3HW<8S|7AGWG6r#}R2(mwvCrAUqq6f#ZHIU!I z#rdr>64<%KX06IY`4btLXj>WyW%9nJuoH7k_j=}%r9x89cs{YUtFgq9)QXWz+A|gm z&tlJK4dfV!V62?RAW2vN|p z4cKxE_qGouZ~p9v>-K-=CPNz00nZx9+YKp?av39$L`F9gM-nNJa1;zzc_dO7*x=CC zpn>Quo4sQG>S}tdame_JjlZU$wAT@fe&>n+$>kQA+7Qa6VVd;c_>DD^59NX_xhob` zn2L>|Dvt?MqnS{Hvqtlk@q)IFXbcL}3#HO)Q+t7Y>FTO*4(h$S9g<-cWjiENKK73L z3xQ&9>l#E72;0Cg-OCX}fiSi=)l=R$S5{P}kvwM|Dpj-B3@cp|<^80!Zz54DL#n;^ z*8J8rl%>jjA5t^<9-5eHzrZ;MQ=^VpMhd)JR8*p7AI|yJ6?L_Yy`0_Th{`O+=In1* z9C(q|x#(mBu~ex>Z`D_6nmw2^Qo80oX)k#6%Q_JrX`^pB)Sq0p4@plwQLiK#szk^> zik)_iYee76kwXsk)f&k+Qk0$Z>Js;MGPv)!qc@uGnhMUJ8rPLK?AZ!dq23s6 zploG?U_|9(I(e=Xv8>60i6h17!{f=Wy7-BeQ0Rodrsb6?%Rp#QM{8o$8CN!eid9A6 zOmd@}*KAR72?xwUKsL0|VcJ8*k;Ak_aSJy8;>b@8wzF=K2Pq~;Nl?-Fze@0|E1SWb z@3qX%vOMx~aZYu;78LiGEZY{cz} zp(6FiAM#*Kv@v#xJ1req7hs| zXD;CgF4&n19>E1UbNQ##=c2cpW6M?hoY$&e=kp1)TSO63HKJX@D0A$1#HLdMIieW< zfJH8NK{oo-NMm@3T4EnUq$-PJfgDpt>n~Hf1Tg;eP60WpZk6@Q?z!pt#O>IpcTw z+-J z6Ss?DUpU3)1gCfmmy+rI&-u%pcTEC2wj CZq8Q# literal 0 HcmV?d00001 diff --git a/assets/icons/model.step.heat.svg b/assets/icons/model.step.heat.svg new file mode 100644 index 0000000..37326c0 --- /dev/null +++ b/assets/icons/model.step.heat.svg @@ -0,0 +1,7 @@ + + + model.step.heat + + + + diff --git a/assets/icons/model.step.heat.vectorcraft b/assets/icons/model.step.heat.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..b1fb2147e203f449e98e11f5a2d1287818bc38e2 GIT binary patch literal 1707 zcmV;c22}YUiwFP!00000|K(a+Z`(E${ws!_jX-zF0s7EoMOU<2i)3gq1c5)Qp$T zWjJ;gw4{Q-Ak6wKXIc=Vi0Ka`~IYBP4~C4ZP^0G9$oBJQ2bIVozY2L!L{>5?!}cLSTdu~U#W z6~};lzyXQko|QSGXx0@D$QAm*kp4-~ngULQ(9l&?kcMtqSAvxdnW3~A(E=e`vLY9> z+_LmRAXP<)AZ12zKL(p9M2fRBXGH-FE5ei}Iv_PKVErBtsSOwqQpy5FH3>a0i6hW7 z-X(67ratI>hIjtN^(L{m*=)vJR&^uzJ+)+(#`u?X%+fUWlQ8O-O#nuixG^wu9$4Ni zLDm;An2`$Yg105^{x@gk_I7i(`9}B^ft6$R1Jt^m;iZxm$ZyFzUBaffo)7jBT)3cR z-1XM;;69f3yls#W0U-eb3P7$%fq>NQk_i&r{WS?vCi{z!jqmL(3U>sxXtE=8a=uw{ z4v(Psh!6P2nu*>)68vX&Ko;q41Nk8P5bz=ed*A4JLkvz?1$Trp7=%LKs@m(Fu6M z2qA3L_vpS639QD5xmZp20|IV6%-PhWzy)GOPZjhtnqwcD_diULa7xknWSed zeyCEXF_2Rv;`_>Jwn(V;boKo-vTCH7QSW87+}mMmHTtVkwYd5DZ&+#8MZ&#?e_r z2c#?f%oX!*E9j}lA>*sB{WS@sy$(qFtt|pirdu!8`FA1>GwFb6zcEJguFTnj+hUP= z2qJB$%432=YbNNx8Ke2kctIOWG#Z813#HO)6LW!lYDHC82X)O_0g++VOSed*e9Rs9 zcLMLrjcpK#A#4M~~)D!j^D}gG6 z%%j+KTiZtTgBm$d@k1Mmu3L?fd?7{IT4$H2_a@`_9e41H=9{{LHePL;d4ry<_$t(E zqji<73=j-Xu~&>_vLh!cgHKN}Nvc^NG zV@>M!uO{x0Xb*Z>1N~katZ^uR|0=cSk`CaKSaV4RaEYzC!~?iQ)?A_iTtaIu;Q%gy zHJ4xj7vGwTKY)v8&E@|}pS#}M99t}#?|H2nwLYKlwn^0URF7y|Fv=P`8t~F7ft=8c z-(isn&rJuP8g&@X(M#+@2vuisD3DXyX#F(RwE%{n-YFm_^{vug`&}1X6QkoIc~T0N zUoBZSt($exx87groU{dMOwJhH;0)*GJ^(m+5PGiT{-dXz+p~RFCh_i@3j8W$I^&Ps z>G8p7>*!jj3+J2slFCWeh*V)^;`nC1i#V14`Fil zmEi|kFfoO#1*!2nC< + + model.step.nonlinear + + + + + + + + diff --git a/assets/icons/model.step.nonlinear.vectorcraft b/assets/icons/model.step.nonlinear.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..374fc276e522ca8c2cd625cb05507516d2f0dd8a GIT binary patch literal 2046 zcmV0>AqXNl~_JC8cO*C{P1IB$DF!_?-)n4)x&N@N!LR=fe3$=QS_qCAq1cDcqG6 z~)wFPP zo@Xqlq=d(soYfU{e`NPGtDs@dGhSYc(a`#7IfEur)-z7Z1&q6VaM(i5o0GK|@v`lk zAQ)HzE+PNkb1ppBn>rhPagUq}9LT2jYCCnR6~DWl17->WNqOsB+>orIx})S(b-g02 ztlEz4)zrzzhL%G>-ir>2;+EwLfui0NqC-BR7be<2mb9XPQ$VQcy2waPJJChS@|w&9 zWp&v=!+gcEMM?8cBnCo?0@x$@oQnAvOrj7e$<7VSG7wl0rqs~_0otjv-A=o4RbBF1 zIxw>08A#fLER_cxrPN0$NKGQ~i@`ADT@v9q2&c|W+@&avg4l~dm~+P#^$Lh`p>s|O zp;X@FV)nl|%e&j{)%J+Fg20ng^$%LBW+pDxQep8c-YNnny%f6jUGGXPPv2v2uK}a3 z1=KjtctsbTUbm7K!LI*ful@&nnuZ$M&Nv2a}GkaG7_Pkz{Ps<*v0)P1Kq8rPu#dC7whif=~LJ5VVCzq z=+x}8dthl#V2|8HPdppx`y1f{(BQRy$~|I5?9KtgpVk2oazT~I^}C268z83i z)xC>3vfp#VeSOD|+7ZkYis9bg{0A1QyW9Ew0~5u%{}BPc8>hWre>nr)1K>N^M}vo$ zcxtI&n0vC1mZG{lDvzj8{ii!k*k4D~I?Zvjq0?x!dwX6J{k&ciLJUcEk-fc7hqn#c z8@qwwwt-?9q>{d>x-c(dc+Y%?$F`#5gSb6B_z@rpY#IBj6!$~xXl1G4so4f2SDEg1 zuVbXDvz_~B(W>{{yNlRHR>PZ)siO#G50DJD3V-labw}#?iYjAj-&-#K02{q}!giM# zpOI|$ZdCAE=W)|+mai*tKr43>z=fm9|1o!o2P+iM-$T*gkuXO(qUFY300KUQ1;#@ zji9_-&*VF|6_O`Qwc zvFSIq2$0-vQKa|ZR2rr(t7*S6M)EdauqC&}BK6>h+EA6p__5ZE--0tn^M&z@)|O~A z3e*dw(raULLOwQSky!_IEm{GQVHG7E63LIb3gq_uA%K`cY6x%Za*&Nh_A%6)gKnY{OPOf}!&tb?gm zM<^o&?lu*bsF{azese=@E#n|(*Eymxi?KQTs}%=Xq_#e%&_pa%s?po^RhniF<}=A{ zbDy{uJo?8a0Ul|iuQ-&JY+oOuo_c~_@yJ(+ka-mQ)Ks<+{UAs7Rs7I~qVrZ`BwtCE zH`cpL*n5+~ea9XBqWQWi;0U#{-Ff|u7YF?>P_3cW{ZMLIA9I}vYs0~J@-&?@^`>ixs<52$YMPe-_ z86hRMmJ*MU5?M=$Mo0;*rGz7-1lCf55mJ0>DgFp4*jfr6Aq81W`CjUC)q9&`%T@iD z*Q#FY^9j^#q6n!PQI{~v96KEG(kX$QP>kPUksF?uj6OALF`T28*oP3P%Hmicr$3^nPG_d?)#pc&ly~+C4`zyU6O(rxZM@&A85zg~{ zcQAMmdamyY2Twb@uM#}DiMQXgiZ61nXZ*fB$38f1oqT9&@$s(nV|*uRx-R_0x_+bN z+h+1s7Ra9OqZ0Fa@BhI~u*Z%61UKRZV|9wU&v)W_E?SHay<4jA9#z2+RU)I^tY cY#8+bqjGv*UyB*z?S9AhKa^LlY`-r606tg%6aWAK literal 0 HcmV?d00001 diff --git a/assets/icons/model.units.svg b/assets/icons/model.units.svg new file mode 100644 index 0000000..fa2622b --- /dev/null +++ b/assets/icons/model.units.svg @@ -0,0 +1,8 @@ + + + model.units + + + + + diff --git a/assets/icons/model.units.vectorcraft b/assets/icons/model.units.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..edaf7f79057717d0ad9fbab393ee77fe67a0675f GIT binary patch literal 1729 zcmV;y20r;8iwFP!00000|K(b3Z`(Ey{wsz)8;0Ir0_;PV6s&bBXx?&>3v$ysQ@9ch zlYg)l150CeGQ>SHZN#UL~FK9XID%LhI zT76zPAK5)Eu_5Or7jqm0tyjwhG!fA*I1vSm`}*LpLQYqaHI8`I_f0$)C;$$cy?31p zcjiu=js9})ITwB?oBD6tsne|Z-8=`V6buq^>s;KBvZ1;|@TQrs2op`;vAv!;CD~AM z49I)zkSK0hRUnFXQ)7p`L;o;r|0rlf0VhIe>AEgSOLwMg!K#)lkf~O5(2%cKSqNI~ zO!`1bT~i`Rl~bIL!6XWivh3WjvIK)QVaf|VkcO9V{~i$O3Fr`#Wr0+ANgO6_3|_{o zz>U(>58!fvmtm0kUX*ON+v(0$(+Yk|Ev=<7{w2M&G>!cvjCx~P4+V@lcdTevK=uqe zb5f%)cvs=v&1UdiFqq69C-9^K+yi$$ zeZP+eBWX|15F)BrqB5G|P+=b6fhmvOj*5bRXm9RFo3E&vrjI{ge+98zKPe(`ddU~0 ze2j55Z}))pvwT^BHm&r9D+7fkKNs?IYijk!lH|9Rs&;!hyS(q`soA*>!9 zxIDFX{2qZ9%9WKG1Ni`fVM!+^;0Ysy5bCfUA-)sg*g}bQ6qisUy`Ly3dokSz%B%H4 z?wwXh(lGD>?V~tzy)5>6AU^i^QDh9{cUqSG&Ke19qLGffSs?#H%}KANkx(XY1cju) za^D@uB~6eiYdr7S+Ey%4D7~VYNd{u^;X9@u#z0PC#P`*r(MZ&a)|~iCJjO^~uOUM& zixVSS1PTR$bVB4SI?Ofu8ztq55JGpL4aoj*d7FolSATZIHWS?~lVcv~1D-LE%MGbc zS~8lESVlJ;M`B4xFbak(AF=d>uW|Hh=z;XPv$I6Mi95TN8dc7ur)a!^%zq3W) z$?ewDk11Xzg{f0ny>5(=ysZkh!3b(g!E)s_0k;@$&dNM{e?iip|uSnF@$X}m>lGY0V0gdrFsQvxb0S} zGL85tb*NO$+%v4QO_UFl)}chgM21xJ)hqa&Z756B@_kIr z3`-QDKT@NY9I7t1j}P&{J>j4>6{tkWJc?a)jcr6f$dLmTKeSME-fE2G3n{D4dUuHi zPcr^+;f{XLeBIPg3T}^eiXJ@t zWA#}LHd8n7LCVQV45~T)uMB?bs^)0U_foPmERURzN5eemCCL4d)1!&P%W-S=tad(f z4WEb3NA9(*LC=?hclDqU{YH=t9^@S>Qos8lbH_w`@XH3;Z>3<3L;1TOQfn*e2rG%T zm1KmK*xE`w!b)UqB^qHRw6+qCuo75X2}W4)t*!VYta#Q|{wejj9z4yl<*I#Z)v8|W z^9gUaiF%%@5$zI2nPW#I9y%qE6N>SVSmcK1rlU`ddJN~NB@Q8ksB)gnQfs&v1he7^_pIWoxKo!>9)s XRnhx)E>UdvJGOrVQUnA!ekT9`=LJDx literal 0 HcmV?d00001 diff --git a/assets/icons/results.animate.svg b/assets/icons/results.animate.svg new file mode 100644 index 0000000..ef3990d --- /dev/null +++ b/assets/icons/results.animate.svg @@ -0,0 +1,9 @@ + + + results.animate + + + + + + diff --git a/assets/icons/results.animate.vectorcraft b/assets/icons/results.animate.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..4d2b7b7fcc51c1caaf5fed858884ad1c92f32ca2 GIT binary patch literal 1860 zcmV-K2fO$miwFP!00000|K(bHZ`(Ey|0;(5HUhmL0rp3i651b z)bvQ=1^({4}P2*EdT(#rBu;2^5jKop4f5q21M^!=_@$k}R>s8&x;*pkWP= zQ1pZAoV#c4*jed^2hTb8Ls6uj)?=qx@cWw_;8GAs>Rac0Mv8{&ikdgg&4RGHQ5Ea! zu~U#0tq%eDh!q0GEi0#pqFq&3A$sT!!}8C-0tK81p{2{JKqj>4s%B+NCdgJ>cTkWo zSTU_>xe@6DAyq|5P0F0&cnk)Sh@@m^#)<+2R)k4SC?E|lp#KgKB)LGX2$pN4%1h!f zabwUlz6EZSrhWjg6MPMW%=e;XyF8V2u59Q_Z@%FXNgdi{j`ia^h?`~#&;H^E0q7ZAAMN|`X|RRs0{KhQD` zdKH|dSrh^Xt{Vht==rgz#gE60WDNbcH2{ET@GGz=u7+!XMFz~|+iGf#F{qQ+Z zij#(nb1HbvITg5B>IPY$%slplWot8+m8Y9iX41afobr(LT^sTukm&ilB|`(|r$@4(i?$FCE-r z`Dh97gYxE{wE2R{fz;xA^(!d(`dQ_JwhBHW#dd+Oc)J5ljq+{5T06TCYM!gV6Y+O# zD)q;LP2Q3nkY6KtPFfFeRbvcn2dWZ+BOV}b7(<41v1QrSe>7~_|beP-hZv#-%HbIUxmc0%s41fviG_F5ek2xz1cPAM@(~MN_!@_@ z1_eY#VdjeYtE=g;#v%NxujgwL2zwo{=y$dVJh9w*dXMg9!Z3A&ujh?1lK175&ABZW znIMR?p~@K(Bw90p0%wfoE8_)iEzxKcUeA?^S(}&>^0}+4!rH0#@+Y2ft6sW6BKR?% zxW5ocxV5%UBnGz)0+YQMF+hZoxv5@47;d}N%19%A&N^hMX091l+6Kz|L2KVc!bG@K z^VwVTds|nQ$mzQc&BS}4eX98aXYEY2IwIjI{LP{w12uDZ&Sx`fYZ-enyN(g1SqzQY zFBTkRk=8n8qKTNxP@}i%%P`Fx%okGH#y&~UdGs?kp+C?@FF0gNY_|__Pd#BT%Mr*x z$lQxvc8#q^-;0q0=|8lg=(yDw$v0Azo%QMx^>#9Tf8q|_XufSKI0tBKSKgp!E53B~ z+Gt&AD+7qZ%*S~2Tq90X)6G#?U zBxmhP6))Me;sOqs147ngdoPcDC^_=-*qDlwIcC+^%({UOQjCsbP>%6`W$;T^HV0$A z*D^c9^vLOWG>n5@gWOL!Js2pw9=B$DwbPMnxF0$lxz{=eeKW6lSM?In?`pEbQ|v=Y z>JL9;?htPedRamFtuR<)SN`FL)LKe9KuTgQB^e+kww4kPkP=x-i3Ugst)+wmqy*Md zf&o%|YbpK!DW0{Ie+qrBd%HO{U$oE7T3Ks-KH+T^QO}b(qD{akV(e(Zrc(epA{oEM zA{IP19eiq}Fq|Tn*oP3x%;HcW$E4Bv%alq13_rb-K#s~=rM>jK4z@C*<05fX3YK3j zSbo#AtD&z;U0Xni%Rej(wDw}DgXf9M}!^# literal 0 HcmV?d00001 diff --git a/assets/icons/results.contour.svg b/assets/icons/results.contour.svg new file mode 100644 index 0000000..ad0c658 --- /dev/null +++ b/assets/icons/results.contour.svg @@ -0,0 +1,10 @@ + + + results.contour + + + + + + + diff --git a/assets/icons/results.contour.vectorcraft b/assets/icons/results.contour.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..ccf6b284ac9c05fe8716b50a7f5f475b9214fa90 GIT binary patch literal 1785 zcmVbiwFP!00000|Lt0BZ`(Ey{wsz)8-b{I2k3_`E4rfHTBJjZAqWgwrfn{? zsOcq%7x=&L_@-Enn^Cm071#nemPm^C__^cV@u&xH!K*cHymRlCZ^8hZ_G7=dRhQn#$B&vITg zyshAgwxCT7J)h`3VKp@5obhV9=5sOrayf%0Ts1R}t2vCjdhqC6PFdi!81Y*7jSvj1 z0Fn@W?|bL|nLqY6=HecC=RqW!^woCk)hm8C%>ga}fw;Qy&KH=~#B@}=uBR(Zt6Fz# zug4z48&Vwt@yqJybfU|O77d;WwwkJi zhI~cYydp&>G5|u#lHdv#IT7#Doto0HD~br4iG^y6IzihSAr^( zCQ<4qplNXz`f-*8A>7WyZ4^!d6sOzmcHGITn~L8MM`>9i{!%S1%aS0CVl8ZmEt58MsKBt>J=`P`R5HTmQ3(<2frs12Dvg96`oTH za|(mq`M|{Y3us0=%^H{jC)FV=BYa8Am_!IP5^G(h(lR2gt6<`zNrLPQqu>ScdP+To z-X@YL-h!knxE?3_YEuJ*wOk?b0D4x_9l1}{+R+`oB;BDu$^38oYouU3H>Z`romAUycnvFsi=8O}--P_vmnY z^$RHM`WbUyGCsrXF{GEgF=2e%&GK~x_Ti*s0aR#Le$V9h)>i5d4CgnFmgQ@k^0hVD zOT8p>SJxj%=WomzDen_#1V{#kD6nY3ptL8NjjYaquk5(H||blIF-(NEGj zOC)dBuqkBoBRyIS777HJFc~O1>}~c}g4vM}BEM%Fu-OsI+uoJD{-edN8?SDe9MXt( zc-BBJHn=!y$rwfw>D`PUNhBfRAQ-NEBvKcF!J(}|1JN0ky<+}sD{`!HNdFp`^_qs# zUIzsI))fJg;TD-)IhshrG@AjlZmf~KE9P{`U9qT=Kx_tkU_0vuJ}?^{#h{wwzslg}wx|#0d@p5omgSMt@o1R`y#%=*b8;|IcsXwE z_G+gi*K$8}I&!Z~4SKq)cw6=g(Qhlf5$D#2iq!94P5dF=9`v$-_8V!i)~@{htISzS zHb6@1EF~QvC2^LL43H8#ONj?aiJYZG1Ehq`Qo;dJ0%s|~04c~>%HO3v*S*~wU9OsM ztykQ=Ow9Jnifb&3zff^=nw-MY8FP-|JKAz0=mw$F^aR;&|W3`vJDUD|qI2{Y3EX zX7o-L$X@V;Fzb5nKfz73!%g@MH)4aaI!4{6J8?Y~E!KzLnyO%js^|$-BBR}`XPgN# zggUK7#w^Y2-2?MjOc(0=tuTB!E3g%5cElX;~(lykv bVblYRD#(2^6*DH=-Hz>Fy`d;FaVh`+< + + results.convergence + + + + + + + + + diff --git a/assets/icons/results.convergence.vectorcraft b/assets/icons/results.convergence.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..755d4d81ffb29257bfc38ce729e2f9f8ca2311b4 GIT binary patch literal 2082 zcmV+-2;KJ|iwFP!00000|K(flZre5#eHBB$4MU9cDfEV5ZDqa-otYbFUd>gi*w7%6{(#o=QB-fUZy3vt(`Gk zl@;T;a}|u81{JE}PBCO4NAP zmW@29SOP3z{=s#w+=)AO*80bT=Ukyc-fDks#!j{5_tO+0Q!q%%JLl?_WEIr~C9kUK zlCZLB3pO`nCnIZG_5pb#3M7gdR>SD`GoG6xc?5Apny|AsOhT6NKLnU_ddn3B1uaUcV z19{s!;KnrL6`gPWx{;r9F79tVn)pfQ6Lxyi zSKJ3(+3u^|L&J%FMpBj1bWca3JtVDvHt>%+HX^}=Hwku%f@?JK zI=)4F62c-B;f`;UM@5t9$knzUAFIOM6HRiUDP7v%I20b}xzm%r;y&ccbYJa08cy^R z6sc_=cSIHHcz(o!Dn5T~LOKM^JQ@c3T|O?29-VD^D)+Ha7Af56- ziVkzl{y|B0CWOH4Xajkn7~bZgQGBHbI-8c zcAGr&gv_JZ`=+vu=m%?LU&RkC6uoXWM)HYdd1F1hgq@uX>JHq&8_gG0 z0mtB#?ab?Uw1QNq*P?ZmRt69wG9Tm7W2uNmN#;zv*)ZPyyxQg%->@9golsWQyijSG z&VlN%vRt0amFx`DBbVdRa2@m%7wLK z(Md$VEXi8D#MPIie*IJ84vF^Qmo?nKlY%u4<*$E=t*yiZtVGsUq5)R0wG}+TN@#5* z9AG7|wh|1m;#*ts2UtPYR?q+|p0$;)Eq!h}yE(R4){l)^Rcd`c;cX{T&r>;~?SfIR zvBLqIP6_0UWc&_`obcRu@TpOY;S#yTE`&g37KZ{kCymyfrrH$1@Y6d5mQJgBopsgw3%w;xCOjr + + results.cut + + + + + + diff --git a/assets/icons/results.cut.vectorcraft b/assets/icons/results.cut.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..ce401b5b38f90d8f8064c5ec2e90c765bf8dcf48 GIT binary patch literal 1715 zcmV;k22A-MiwFP!00000|K(ciZre5#eicK%jX-zF0s5oMimqt47U|GpC<23)7@G?% zYLwK(3;gaoyxErHWE5==!xkX0L{dDTzH{N>p&q?k#+Rt|F1_!#Xc;d!x^2BN-0_C6 z%Darm-W*q$Bj|)tU*xDOF>2&rOfGyFTe6~C;tD2t+&&kKy_U2T!!sN=9c`P7q7yTB z6=@r2{X`xxZJ?oGl=113m16Amdien=#KTx*rRBL z`5_=5M2AFiN2*ewXjir9kWZKw6YZaX0Sq_=gcdJridwu8U2{^kXeO9yc?S)}g3yxV zY9lfPLh2eLj;aES`3Ov+5Gl#tEujKj~T3Vi`VHPJ^*hE7CVctC{+Xaw) z0i6Y^g<-I+60`r#NVU0L->jdoUn6*OtbU-i>1N_m(FFu9m{ulC`Yi~-K%xu(M!cVB z2!-ur`wc<5(;}Y{&6}2Ze@JX50rM#+YjCM_3veZqLaC9fQY%(r@4u>$c#nQbb`TuY z&a)aW<3og(S~)^c{-o7leVK`|Ewy`_gqfg z2l1|kQlX)6zeQ>BkVnBkG&lFCEf!b_(jofWFW@XU&pHt>LfH(_?J`iacE_6ZEMFI( zd?)fHmvj9)lfP?QsXtIu+&QY;*Shw#mhGipAc&>e<<>wx zg6GZg=mMUbm9k- zG|)go(Gw<#HIUyhrR?4r3FH}x2}+Yl{>6q9ZA$~8jNWn#d6VNx*fWi67M0vE~Bvi&@jpWS|HW9QuGNL75p+JyHQ9?zB zz0LlL5j_$@?DuQ~5@g}t_MznUA02W{);Df)NFzGnSp&IRq3S4?F^r@#x|ukVN90~Y&RkPO&sazA~ z{iL;TB5@`|s=fDecJCU>GUdM8)J)z-CZ^giaL&Qhs3Vb)BHS!0Dp9i!=j`?tyIRIx z&TeuUM)DQWs&igllHN`x>^tt@jpm!ChH7!+ zy7ERnTM1RDH%99#TNyx%sCR(P%T3Yh1F4{X27OJ-YE_nj(4Y$8 zvc@#1Y%=y(jSAAPbn}vwHIs0_90X)DckuGuhl(RF&n@a*u=y7SdNtV2x`7WwM@KQJ z=J>xd__?c^gE`;1%+9hraylL@^PqE(`?0_W6NU3}YqwWB9l4hKq0^CjV`|XTIcHtn zD@4ELXeG`%4;883znb_%qCMzk1?_jzV68*>`&YTMlzf1c%vnk{KuYQ?B^@9oah8${ zkPwG>DY!=ZVP&J}W!YFg> zWWc6V0y&}>zr`XKJU<_NYNRooqL$c)5Ua}KP$0*Y(fZ4jE&&Wby;DGrs$1o~^1Dg4 zCRWEq@}v|jzh01H+O#X$x85J|E$XPym>ed1??1s!yu(fO z0ykoVu{cKEr#o>y6)o0>-kPd#hpPAqRU)HZEoY1hGDJM-NQuogC-MuBMr6+wNXx{B zHR98cl6)uP8$cMC!_*u#;&VF;Rl%ZdrgcrsSh9pVHjH|NQ5Ak@r(#Btk#9TJe*tE7 J + + results.deformed + + + + + diff --git a/assets/icons/results.deformed.vectorcraft b/assets/icons/results.deformed.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..673130a52a763b179a3687f07fed2cbf0da88539 GIT binary patch literal 1765 zcmV zHHk{%1^(~5eA!m&WEAZT0~R2#OwznZ=N?{OUFy-hVeJZW@7%k?C1-8fq8si_;al4g zR(t31)LY;hw+K36)K@v`LX4XDXT_NhV=GqnD_p}QkGtOmQ;!o)G5n^*T~B#;R$*Zb zSMZa*CcJ~L&*TBq4jM{ESvy;?O8nq*F^4A9@;O6o1>>$BJyOXzYqSz0-srwb00UdV zBy2zU-noC~PrbFdcnG}nFqTdFYBTk^CA*)MfER;7)ZTjMH;8uFbhNDNW=llcPIqjs zryfOX+#Uk*QFKTYx1_EF3chYchx~=PG12}RXuyC|K;U@QP{i@pbkmZWqq(4qw>>nJ zOG2v_*ISbz5YjXlwWuz!n2*3D3X!tx-4IH_V1tNqg$7cy8he|~bUUu&ExW}BMs|#n zY9F$22Ne#K{%8fMc`E)g5QY4fr(qT+Q*SQ56+xE9nV*6&@19hA2}B9*OVkLbvc49x z|G`MT_q9UZQrKz`2ZxCJ4bGA&`~&Ok=0;H_WRHL!8t+`Qx!!!oJj}F|cgN+# zT|XC>iYg#)$+RN@)KvsCr)U1PphtWUgF_8LxYrVG8vtQRSqFlaPLo(Dxs%@MmZ(wM zFFC3gRPcQdeB|O*09PtLTT~GOQ;PfB`-gcSZX^-AW^ug*E4?X15xI)O#?{)J+SQSt z;stF9t&8UF9`SOC6;vICu6~6@e*Ns?2Tm!QBf5)p4dZ4B zO}DdrTY`L?+$Wd$LVwQX=f>9Rj}(=+j-v6kT70b&d#jgn8*;H(ghdSEG$Alh(hN0% zAeO?-t$}=kwY$KRBk;tDfDoH?nh1PH!f}O?n*BgRNlXAyQ1*5QD=2SPbGd^$A<5$? zh>VZY!Viix&_F`b6DEl@kl!(-?A{p(M9sv6wIY&#vEf8(X(W`%yB0%g;JAYiXalx;vApd=$(uiWrf(bCPS+I>TTJ*YbeXq^4+Co@_S@rs{ID%988Tn5*aDN?WUpF&NZSx$&n)!Ka5aJ-fE5H8=`gZyt^cWCz)`#a7RCA zzU>+)h<2_!Z#2+Ks6xFFt*^8)f*4Wxm`zp#lee9cPUy z%M1#a9t;KQPp(6E%9}0g=v;GIa|p_SV^6&q$8{(&Q_8U zR$^x>@dzuCvz2IsmC)HrIKoQcY~`O)pX`h*f2AERbW$Xv1wvmjK3}-YFnQ)vfYD`Q0R2 zh1GG9JShd`H%n5^I=-eu_5Or!P)~)&RpoSRUi<)1A1UiWcibZ%tLWM^*eCRU)HZujY&jGDJM-NrlaIOXNEwoyeYRu$G0w z8C^fG$Q=>yy1~GFBVOj|#2aN8s)8l&W=%uPSh9jTHjH|NQ8j+xGl^oe-?8}{gb*PK Hi6;O6$wg18 literal 0 HcmV?d00001 diff --git a/assets/icons/results.display_group.svg b/assets/icons/results.display_group.svg new file mode 100644 index 0000000..404d301 --- /dev/null +++ b/assets/icons/results.display_group.svg @@ -0,0 +1,8 @@ + + + results.display_group + + + + + diff --git a/assets/icons/results.display_group.vectorcraft b/assets/icons/results.display_group.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..b7546484322b507aa4fb84a0de594f05c082f8d3 GIT binary patch literal 1823 zcmV+)2jKW0iwFP!00000|K(cSZsRr({S`ychN1f#wt@Pu# zLk7S&fJfK4a3}8AS?h;K&$;kJQKX(WW2afthiML=F$hHL&bgSQvcbB7(WaR$5n+w0 z*xZgCz>e85AfI`KKygQ^f}?2HHLnmo^oQ~CufPQcoE$=nS3pOLx1wuCsus;SXD#cX zAYYQQV7S_f^nsAN#)zRR$9y~jgGfYDvNI=T2?A?Gq&^gohL+HO2M8y*RJL+Esk?zbL7;ubbP=0sA$Ao@4m~rA;^EkCHARa7mRiVbB{N#`pY* z3u@-0-o#)pUOI{3op!A%h~S-nzv$rY^?=s0h3+8=#2DOo@{%^VkeUUsf=8~>;4M`e zxLN83S)f>sJwdEySyrA;rDoE8m`c+<1&Q}yk_CR2#jziTZjvPFR$ZbR97deDZV)6< zl=<*?t06eoD@sAC);}M4EDc1e|Dfx5*L)5ItLhg?7_K6xNBaj-Og5E>V7GIS*Ym0bMoq%%xu8!cu1DXCcgY?aw_q+kJ(=3xzL8 zje&dtceuc#6Yzu)hY;%3EaLc1gkuXO){C2f66s}DLfKjBjG(+*%|u9Hg(M9FFVH%Q zGuO*vPXY0HjUPqEK>mbDOdqU~Kx`4|l_CqoU#K}zwlomR=mWzLD_MpkJ#$GD&XhHt z&tzq5EKw-5qM1p0#^S>>kIIaJoWh9j%Soe=$Qi9U@ul$?BYD4qEks$I=+PpuP#{Rh ziN2)6+-Cp4s5}t@tc|<20YNdJ-sZ04-QOLu4bZpKwH4bGB3W(ZLm@DR=j^R^{L-o95nAHb5{*XT^<1f#wTU?)UprQp z)=s^*v-X5r_0la8!H@aG{S84vrnPkfl>&g;2eV;=!@g8WOYQDf(J5#NWNO%f=yQs)O&D@>S z`5fC?#$L>>V?=2dLu2;KB?Vciwa#W}A{H{#=&kxPOfv^_jVjyNC+Rtleo`g$2ioW* zg)aNhc*-)w;Ch)j>@XDUR|QzPR8#~+`${o z_e~8M;>LF64SKfXOINRr)|Iw0fEb?n7>`~`MJyO92v7TupC2!_nZ(bef}|$YH7%`W zS_WK$On&oKXIR<ti2Fj=VlLPhY|2pC{#IV>9ap zK2SM2i9tEW|CPb(u4<0Pd~aoThUt;>@n{$ay#={na(pyUcsp**_G;%N*Kj{{K5}n$ z4q6^>_7c$_7+Ul5&0|UGPd{bu5N{89Sws1qFj!+({^_UGT1q-VN@6V~86YLLmJ$z; z5?M=$21p65rGx{d1lCf50aAQxDgFQ{p0$+!3Vm*SyE(F0wlB?ES!;bh;cXXD&yzW# zZNMmE>}bHIQvf+38UKt$EO>4@_|!;YI7cqA4Nu%|bDU|{ketIW?oRqgp zd+B!_Y-L8rMdHQ*Sbn`E`Lt=*W#4*#!E@A=Tw|ie=$f~1-tHp8(Sy))-8wjW+PS@A z;EF|DUDx3kj;1sEs7|K$PFqJ`y0(N6$C?Ovto)OgUC$8tB#rV)$QRVMY6&_H + + results.free_body + + + + + + + diff --git a/assets/icons/results.free_body.vectorcraft b/assets/icons/results.free_body.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..8230e0ce12b39664944446eee9f060419748d466 GIT binary patch literal 1772 zcmV98DF8+yY#-|qGi0`Xx@5bxZ@3B zm3JABy#=l?N6-nQKFLv6V${gLm|XZUwq!-O!WB&NuzM~Tdo5`xhG#f#I@&fDbB^(J z#>zE3(^aHxpzi~@$FzZlf>Fk&D^`jpt`{?CLcEu1R{RxUCt40u<78eX{Jj=c%wTu zH)D^YHRi{Fyb~P~#Vx5yfudd4qC-Amewb+g06bv8DIm0XRa4aBt>~JQszo!wSIawS zD3*kl99LVBArMm67;#h;SjW!_62kns1}C7x=PIcCnMGNc5}1&hW#4BlVkM-txY!*mx?YRaLKeXVbU)V*hhNd z--w?l?t`NZLB7|rYXI9QC~I)36bD!&O+sUltHvr;Vef2gNB$)Dqe-OcP6NrXp<8wK z*!G`f8~hzLl2l+6Tu4}`&=7op3pSrCBNwwEN*2|$V7$URXF63|QW^1~c0&I^8QODq z+K7J)ZA@apf1;IRTeEf#uAb%d5|r(vFd3{C`gxm?YLf{=k&7J7*-2!X;+apG5M{gt9=}(m*Jq*O0}~dUjOd9FV!vk_u=fz|Z68Wr{?#GZebClTj%h>(JZm6VYgC=&GKP^< zMmG~jQb|ZO2!<;ksnkViaA<4LK=jVdUNL`n9G_|&GQNh!U$aQs>wrbSb43uyb(L+Aj4{qZ;?oT>>c-41U0YLHHf4Twn1QakRwI{VPbEp*N}$0F10GtNFTEf zm8#imhE%SJ@?p~2H<37#A=Tb{IlFTWWtno{U1}!pBNJ2Y7dYo&YSfX)ND*!q6_u#j zhjXa0U{}jH$k|PfsLWz$&VIFIAPcq5l_^8SLZuqLRbQoP_Fz7u$~E`NdcmV#AdAC+ zHhRUNjN!U{NPFsudzH~hB|`R5?7C}QBly zywQBs)KG|TTvy(xXDgu!^~Pv@Wh(=S5tWbe=&@47f}@g%la=xA@^V|~dPgd#mqB0C zvRaj8dga$)WfQ2~)~F!uS~ssqSu+U-%t1gla|ch)eXKb0^xUFI2Ah9z_MrybSvT;3 z=;$N{)g1p-20wOHb2R6BF0->NkDQN3%RJ~g$bDbnqlv=vacj3%J0H20`=RrZdt++Q z(*L*#If2vy^mz zl*Cy|GC)e~EF~TwC32P$4UiH#O9=-^37n<;Tk3Pu+s%>1vVF{JRj>2;M6g{%gFw}Y zwh5!mv6BItP6_0MV*Cz^T=4vS@Trl;aE@AHA404ui$j5&Qby}9Q@R8&{Pa!%IjL@y z_sZ`k*_v1#7s;biu>5*SifPlXY2SK(#>Bp)omP^ihoPp6?Z&qX(hqIut*8+PQmO zL@wg`ttjzc*L242_1iE9r>&#+T}vUw@qUcMe%s#_KJmML!RYIH^hOrQp7H%G>w53^ z;3nSVCVGM!vB6lLqVDsZxSsF*5X(bvO;xx@Rs0QABBNceW{e6lL_Fz8iOn@9^0kph zWX}~y%R-@yrkj=ID-kbQ!oVD+=BN>GGGeF-7Hu=FYhuQd71Xg|)B}vF@O?WKGp3vU Oj?F(mBV{K7DgXd*NMZf} literal 0 HcmV?d00001 diff --git a/assets/icons/results.modes.svg b/assets/icons/results.modes.svg new file mode 100644 index 0000000..6f557f8 --- /dev/null +++ b/assets/icons/results.modes.svg @@ -0,0 +1,11 @@ + + + results.modes + + + + + + + + diff --git a/assets/icons/results.modes.vectorcraft b/assets/icons/results.modes.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..4f75900cdada361de28c4bf60f1e60a4da44076b GIT binary patch literal 1967 zcmV;g2T=GQiwFP!00000|K(ciZre5#eicK%4MU>t0s5osimqt47Rk_J2m*taXq$^H zYPuxx0>AqXNzt|(#iMAa>rewhB$DF!^qmWj4*6)!S-HZsbz$9+q-JGO;(2Y2;jXMG z%dHDWdilhL0NAlXzmo*pwyBisUfK$kVvSKNz zV0@F)x`Ou4^nql&Az>LSr@R|lFBdat!eu>UxJ+T(^`k{oF=38Ze8lUvZ{)zh5&&_* z54Lq-PwcU^Ru>PBb%8w5)Lw1IR<&gJ(*(d05QxiL>tc?xil~l~Rn>HfX<4-$o13wf z;Wa7yfPCZ~0>v%OQ;wou7ra9}pDIr#nF1S)zlk?gC zWHjHqO>wp4vI<;-LiqbS6MqbUz&e}HC1rdToY6%-O<0+eooY5Wn`MRt4IKK?ZV6sn%Fm-AKrkRZ3_TMGFFjvYX=)aBiDxeeQ3kAj-jp64?7cM@i~K+BaBAe)`sZV-Ilb87p66g_bjVCv3A?VxeY|WwfZc zo!mo=pEz;n2llq)&8RC1%!0zh*L;<70~xv==0dgh*lz!X6HQwFcU}_wxLy(;x=DQ8 zPvSw2BBR#6r`Shb1;%$RFgWfi2u=KsaYUV$>Fa*hk^1M-^eg$I&pKA$dmV8s`@iul z_f*e{_goA9U|e;N>tso!!L`Zy^>1LuH%IJyk+B)hb{_-^b4FiGQh5);DetoHzBsG*7qu7IVR7D?0CZniD;CLccjkJM$f(W@F zqZ9CWK8N77cwC?3I}wg4lt6`I0mYY*SV7s#0kxpKUd_aZrV*0Ja~)UdD2Qz*4xAPU z;yuXswSoKrKF;oqkwnP#)rU;%il3)AX>DmBl+nAAz!$XP;@L5mDCA5TQ0;MpD9K#tGdTR)V%{;R=;5S*=>^l79Gc-lbTtZ{yl%P2+y5#3ZA2?QbTAQ+~6 z1VR@`;b^U)1=1$K`il9xDaonEA>u1i{u;W%UI#4tjVS_0EVoXe*56ndrm77oztKkW zK2Pa_nPL%oaD8Q{(qr6EX~u2AX`}f`sZxh8A_dwmDl$>i59d(CC#IHhkh7~C zQJTfjoc+y`fh=4b7uyvP3z=$kR(+YK>4Uk#xoPebc7jK@=I^0_Hu{D^`N{P2A?T>b z>lBz=nF#4evCF11jpzqCvMb|6RVG%c8b1LnXXtGS)ybN3ZTj?c}jTk!GEw`%2JJ?jQOa5g%LK{>~d%HUO# zSG_skOPQT!dE|UNYUV*NLGGu7^d<@~$F1JC+WE-U{2n?Vxi_i?JzbQnDLRGdcO_o) zQ!jl*>JP7Cdq}hgy{w`ARv4^yDF5&(GL{kzkP;e82?t0CjHLtvr1-{C`~gxtV=3MM zDXy^;cYqXRECmga;uuT$x76pR^EF2o%lbL5mA%IM6V7%KbsSkE+9r%5$My$&bP6CR z6ytYT#DZr>gLjQu4CkmNb|HAOvN#mTDP^?oGS!v+qb=I}spUE6I8P}K?F}mU-td~2R(7O?Ot`k5PY{Dy%z0Xz+VyJ2GEN4MCk;)Bx-O|W2~_dyIR|MWKk3Pj0HySf z^7G&@FoLN|T=9d~1ge5bT}_LEs92H&kN003uS B$~XW3 literal 0 HcmV?d00001 diff --git a/assets/icons/results.path.svg b/assets/icons/results.path.svg new file mode 100644 index 0000000..fb93125 --- /dev/null +++ b/assets/icons/results.path.svg @@ -0,0 +1,12 @@ + + + results.path + + + + + + + + + diff --git a/assets/icons/results.path.vectorcraft b/assets/icons/results.path.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..12be6161f66c41ae103c169fcf5f9f5942ffc907 GIT binary patch literal 2242 zcmV;z2tD^7iwFP!00000|K(e4Z{xTT{wsz)8-^(AHNbt?ZV%VPZM%!z;toX+1hUQ8 zYGhHBEgD`es`ROG zrf^l&884hWf9kAQ!KxHGLF!i_^&X`r?kt(PAiLy??S>UF$hX6NWa>0olQX!dV)Zs} z>RFjKYY^WSSyMyvr|gyGH8d=E&a1}_U!w5m)f}4As+se&T7umDHz!+)@rrbV67N*s zgn(cLcu?=F>)g3Bck1l)hgag5f%HKt5oHK=GUvOGMG^O6(AK=!s$bColm6oCu*|n=(%u)~YV6tZ33X znyRU`(6Cr%`Lbd~tI`95lqE~6v{*14FM~lOBB|MV%JLi(mT4xJK>?|G4)-4cK_ln5 zB*MxSnuBx%L@7G{3$f%#lN2opa^!jJ@USKcEa z9~_1k*L@vbc~o*xfGvG3T|_9$ATKoxOu2IdJwQ?>x(JB2GuFco&lm(2 zIj`ALI=xuOJo_rVyI!ZIj2nw4Emk@D+6(wXjAUNx4^_I%GMq62I{d=GuTN+hxOCO8 zG`n0n>B`6|YRjsE7tFaCBdD9iE={PSL`Vb+G$mx`@5qP{?G+z8Jz6k1Zor_5e-16U zAR#s!Evt&32YdT(8O6-3XtHKCb9NRN@#g(2(#643l`p@;obR6|LyZ6TynkNM~$x(J}+^ zd*l@j-SZ(!I07!ufkVOf%Apu+akLA`%kHALD~z47DSt$Giw^urPHt3va%AG3I$Csr zJ%pUNJUO1iKyQ4GJA)(jW`ALV@aJTJ7DjJMgR&Aw&p3m!H=xeRWF?V$t%f{8e~3CX z3cptx5f5XEf8>R#;S7~zH#H`cNDaILn|inEUNyYmb3X49p@JR_I&&H5re`TNIF>1= z#5{wuoa#?2ILoO469s<)Qc2J7I<$(uTUx;`EfQeu0P^}Asj#<~hMae{Smpxl;HN2; z>QsaGaw^q*X7FC_)0s!VcL=xAJT#Okp<=NMpJs?Hj{c+ug%yyfzlRS9U(cw1X17*} zpDBsZ6MV@b_yw{0C2baKCS6O_neP7q4*PJykykmNr}?3lRq{qZe@)v_ep>?@t+RggYW+)|E}ktJ?<%Uhisa^6KeMH!&csW6h%CB5MPyv@6awOls1q9l`3RwK z#U@wa@dJe5>+)QH_^yOw3nkRmIsqlnbwdf|sCH)r<=tj3YNS?3VxJPK*Cp^%*H^jv54nM(r6@-(b^`SbRJ_QKW^YCBwt<`(E{*LFpw^Md(s@{ zKKoCW=2t@S-HvZSl^^MC9!lQ*XPerdIJ7hwS`iiSjDfu0rNvd0(H03sbklJp6b7NA zVA$Ft6l>vW9LgIM5OqdkzA*pYR_t2m5b@R1e2u8^*Abik))oN~+bz+@Q6v$LsndMT z8)GCt7t3tLZL!F+us}PiWDJe;%1{N)7|pL4&sk%MMx!8|P%2m(nH%KOwkmV$px!wu zBqFSmxJ4rDV@}+^r*N>`*andh!Zs+3PI5$w2m^Ch{mg6YqfD7;gy+0NrfTLZlNGj! z@@dlAbrC-jA=R9{6@Re}Ws#)sAvF`%RL4~F4bD24>g5PTr108JMJ8(I;haA`F)j>jJjr-n;*NgM{IM=8 zR@b&WFYWk>Cqun&rkidf;B1o-;W^ziYnts;KN3MgnoU)}IhmSrF` z$hUcL*BMtfff7}jF0y8)nm5_9 zpd90SwcwX+Q4i*PZ{>D|<&oRj(J&8s3*&xVu)##(?QCoItadx&8a@x*&bSY{2K~6I z__pj6qJOH=9lo$RRHXjphr}Hd?O|PZ(EcnO);N^^@FE?cdebF7uU*5?zX-9!nIHKI0Q z6ghS<;-OOjxuO_eHfBK#TwzU;HizGnDMCJ>DG_-%t4zca+3D!6Fs$Fj_{Y_@?qHb{K~se-*Wk2oUU Qa_HFq55$T@5N9<2089Z@W&i*H literal 0 HcmV?d00001 diff --git a/assets/icons/results.reactions.svg b/assets/icons/results.reactions.svg new file mode 100644 index 0000000..a428db9 --- /dev/null +++ b/assets/icons/results.reactions.svg @@ -0,0 +1,10 @@ + + + results.reactions + + + + + + + diff --git a/assets/icons/results.reactions.vectorcraft b/assets/icons/results.reactions.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..c3f78ca404685c17edaa78e9595909aaf10d9e1a GIT binary patch literal 1748 zcmV;_1}pg=iwFP!00000|K(b3Z`(Ey{wsz)8-}QN2k3_`E4rfHTBJjZp$H6GVr(w5 zs8LcAFYtfg@y)gpC!=Vm2(|!$Et29re(rd8Jo3)FVtj>L@67v7@|N+O@7$|IEGFb^+k?47o$f0WIFL-Y{BwwMJkx&ZucGHRh-8!gwi$cPlHJU508Bt2=GWfY6)qcMIyh^Z*%DLU=#I_h z*emgx@Iyd8hz^P3npTBC(XMOJA>S}ROtgOj9thwR5L&XTOWcyJ=$g~2#dE<|%R6Yu zm$WQ6skR~mAf&Dd=D5mP>;;?2iWR9o1!5+$mRIq+u07)IErW-9jK8gYmLR*;=3xAn7!s%o@l?SV#*pIs#7=3kZ>k;IY7W zBpg>Li3vFpN^DXK1!XS)SwVTdn#(lG2}u@(C^R}sl(#m%Tl55RYz^cOQkLw-842W5 zvGG&WQ2v=Pg0w9Sgfe=|3FL>4NkY$DvQ#kTjOPPgxf)9xNv#-W(w?ydk&3t0K#pM~ z2-Kq4MtZrT4}^LvByU!*Wh#p!Jz5MF3Iv(#El_mW+wAWImq$W~{GM&VMnEiYdsp)M zuMWFzO18`7kVdq_vj%d$#??_v#xRmd?`Hf+A_)lx!Eogxk-7*B4s8t@h)(qF74vt; z$+5;E{cB*>YZ^*>9T4<8R|H6gTV!^uXetfUq<&`ISR;8?6?DN|v8e5GYz$Scm@qY( z2{kxtG+!tyN$ZHlpg=uWDpzf4Pspc^*QK*l?^P3!bgL-aB9Z*qFWg@-6rfsHCz62M z27&3l95ECKV|!D*fHd4S)T&G)dCWRgs%EblTDd05_mkGXiA1S%srIXvvl~}ema65u zOU>kSXnd-DfOB@HMjf&A6u~yAs6@@)owKVe;%XW9a(0s=Dzg}xv!5>+$il7jUfK|` zP^m^Q>Z>%(9?WN4x#m7;&w2E>^ieR-M$Z{kDO|S?Nl!gduaFk1M9AKYU387BN57XN zhsu8#Los=)HIlEmtUBlD68Cm8L4V;6-e|sQYN(1gu8}wF*-D^Xy)jx}*~$Q7MCD^V zdaM+&;JBdTm}9*AdbX`&eV`ST!=SHeS*^-4;2KoHUqqc@Ws|YTYMj${t(#Z0sF{QV z<{%)OxzW>eA1aPKJ+~-osL|~{m|*iy)-rG*@CmK?iHfna=aF2x`&F??_W**A>JPJ zvWE6+X|UF={QaxUSxPoQO6n{n9UvufmXZvR5<5$Y2S|yWr9=aygw9gJ0a5~IDZv0K z$XUw2r9PLv-5gyk+s9U|>UBP!K-(aSkg5@F6GoY1#{)K<637w7_#GA*@ceA>sgcHT zidteHLZm8-LxCJqM(c+uT>=<>dZ&OKRkzA|<#&^8O|6cL4?<6M=6&$Ab9=z;%OI|=D2Yo}vpKufS5@wvwvIk_Z3!uk z_cG4%ZGTtr#P9lr;P30vJ6Rxm#>-OH_1+)BO|-{N_yjj%gRwkD-KRToJ>A_L%R_HX zRj@}@^nfan(XLl>RthqNKj~;e%y&-ZrI1Es&lN~Z#U&FD$X(KN+o@FpK$BnpF qNT4d1x6Q1ssToUGP{)Q*cQC3Vx9v>Km~8etHva%m3Y}$-DF6ULKv4n! literal 0 HcmV?d00001 diff --git a/assets/icons/results.read.svg b/assets/icons/results.read.svg new file mode 100644 index 0000000..bab61a7 --- /dev/null +++ b/assets/icons/results.read.svg @@ -0,0 +1,11 @@ + + + results.read + + + + + + + + diff --git a/assets/icons/results.read.vectorcraft b/assets/icons/results.read.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..04934faec1b3d76c1fdef8381b62feb2a59d9db6 GIT binary patch literal 1810 zcmV+t2krPDiwFP!00000|K(b3Z`(Ey{wsz)8;0Ir0_;PV6fvu`aAznl`*jD>84aFLnyz?;ov#)%Xd+cJ*l)2q{ZSDpI5r$73*vL?kU+bC%~|up~^np#xI$oMrn!kmMX)B3Q1FDklp4 z$PU5Hc;(qa9J?M|&hXOr64wc$&1N&++Nzt1-%vwqafp9WXDyCHH}ZqdSkgfOW7ZwZ znkA4uftx8QQ5d`}aP+@8E4G)L>&+wfO9D@hBY0Az$(wo;MEY`{-IECf-Hn|dgWmC$c)!Kjwmg%8#$h--Ro{$_CvSx)wRmZA#i*l(pVeF2bg0EIywQ5 zA0Px@rFsG4I}wg4lu)G}0!pBAPzhx(5z&J3YBdx2wh@xp_Z(08C`@c837rmzi+9{0 z&<64+&2xTdj06(zK!vcx6Mw$qq|?$sD5EzOg^h$^ve=VL93fN2c;2&>saOJEcttT2 z^~B=BciggQ1385e*Oik-A(1m$apFqxXd`*Of^Bu4ofy#qP$&?jvUpe0p|9CLD9KNR z;M+ZIz>X28w|*#j^><55cdy%Na?B%Lz|#hDxhBO)Q${fois+`|NGJ&L2Ej1pBNV=H z6^>2~9guFrr|+15+KQek4iR5nHD4o7=ykxN-o^PL2qxPP|1T z_|c!ZzY!=>Hl{%&gs=?;qk|mLLxh38RIeZnH(hFFrV&1+4w`)nDL@gQ;>yAR>jkT~uVErXSAvd`?Z3agejC98t<* zXwH7Q8@_`QOv zClew4D0bD>rV;%hNA_g=P(o38t2UA^BrjUy)g|cdWZeG59lX(eU6*itQk$;4UQa8o z4E0L1w$#c1VzBZt9z9ixSYSyFkHW^guNT`A*Lzk#r3~)X4KHO`210{88NyX(SlMK3 z@sgyhS$EAVmX%z<0XZOKHMaBo*vE<^&yS7OFn~GX31Il?odj}H-74;t-&L}eXdM@cqf$_Q zxn$|IZq|8Uy}!^oX>;_L=rQ_)J*<~|HR0$%=(&!=kDhjJ&%SN3h + + results.streamlines + + + + + + + + diff --git a/assets/icons/results.streamlines.vectorcraft b/assets/icons/results.streamlines.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..e491014663c4c3043d35860218a3068ef759a7a4 GIT binary patch literal 1760 zcmV<61|Rt!iwFP!00000|Lt0BZ`(Ey{wsz)8-}QN1=xo!E4rfHS|me@AqWiGqHQj+ zs8LcAFYtfgkrd^~aT1Dlh5~DV))Gna9zFNM<5Bm{g7G!3oipbfnb(ZZIbPJx818sQ zS>c=oV`oVU!ZCEhs4sHVxfnHaC+Wn6u^F2;Yf``@_q*rN*r{oq6L^M`s>$nWQq`Q` zbxsRX!Bb5^>k4{5(>s!jhB?a_pRQRZp1D}gpb7JO#xT!d+||89GdXR6*J8w*wr_-B zAO~1N{GIEZxf6HnZ1lw)a?ZR!HnmsVu~V(s?Q{;12?)ge#yMNyydt`Tv#Oe|Fy&R- zvArHUIo=R{2*^j#AyM4WA`>X;O({C$6Z*wO`)6Q+08Rm+ChIcCHR(i`oE9~n3C3#P zK*M}R^Nf?C6X^jVWl1o{#hi%wC`_UdDap=)<~ax~F;&`VffTGD&UQQQ#(^f-4LLBf zVmU~909mLb7dn*s;DS`&O%vBoeJ~7h8zB@&K|FS5;x1L4Ak4X?S-k?HCLzp+OQBTO z6k_(j7%jTn?e+E%b0vl+$La@Kt7axH)vLnGuUM-HnDojA-Nq9aG{hQsm8-P97q2V& zkr)uj0Ya+m4<3w1ao5nYbGc>=1nUVr)Jc#N$OohZXqo4%B3Wl9TgkFemj6RpPbdp{ zd)kr>J$0phb*202N?%e}D`TfGCF41T1wRz_l*0Di3qA5LwC7;xk%yrdT@3B}7<$pk z!XG+2pfi+AVs8xpd*StChC98fQQ;&GpC>u`K1fa?@fWuoCrRYRL8v*Fgu79XWcSq_ zLy+2MShXBv6aGPab&Koyil}+o1mfyDd_@TgeBph2Pk@hJGB~&h@p*-*~BPegyGnxEaAxQ!s`C3O&>Y_A4Ef7!i zcwuM^d-f;q1y=4^anM)E2rmXRNq-$Ga2?MDW z%}m@g77wmNV9prGF^qVgavF_9d9>!lQ^sSAub%eT*q8P?V9{@E5g@tTqDZg5sWeQTD{H?oM)JPM z=#trDk$Uh$ZK%p){8($oZ^0R(`9fJvYD+X41?q)T>9w&rA)gyw=GH-7i&j8nSVc*P zMDk*~M^7=hn z@l>eSM(ZkD89yTTAf=Nb#(tcmt#$Ybh_KKG(h799^#Jr@U76TAxp#ZV^RD)rh);QRdj;fK8_a zazrtHhea-UZZi1PsKs!KT4EnUpel<)fgDpt>n~Gn31Il?odR-H-74vo-*vK;8XXtO zqf)T^az*FUs@~*%>-~i+aFYv-$q}PVF~YGujeHXVoxZeYGxVz zM#Yz^Fff6sIj+RVpaiOd^SYXrCDmi;8tT|E>K;ZF{na> literal 0 HcmV?d00001 diff --git a/assets/icons/results.xy.svg b/assets/icons/results.xy.svg new file mode 100644 index 0000000..7210e5e --- /dev/null +++ b/assets/icons/results.xy.svg @@ -0,0 +1,11 @@ + + + results.xy + + + + + + + + diff --git a/assets/icons/results.xy.vectorcraft b/assets/icons/results.xy.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..dd31cf1280f9a0040a10861bb70bec2664ee8a70 GIT binary patch literal 1990 zcmV;%2RZm3iwFP!00000|K(ciZre5#eicK%4MP-l4X__wS9C?YwMd2*Ll6YC&DdOI zQPU-f7x>+GNQ$;)%PvJbMT-UqY?Bnv$M0Ntc&KORju#73ITy|Yom9M-6y&aQhVZK> z8PA*xf9T9;MhgO+FzT}$^;(P?xT9p`!q_RF)C-!yB+r}Y(9o$^l~Q=7pk+Y% zgX@e{B{Y6wPc$u|VZu{h+%EW3485F>!AXIdbr=+55(RsnLii`zORZ&C3 zWX{rQL9?|;4+zO~N(z!qsF;tzBnpv|?A)<51%WwXN(l{+jAztYt%mDyWmWKd+A*@^ zDM;FaEYy(-)k%F6g48$^e-W62{1t~@@3jN3pL74N%rqvvX8bRlTEgrcyVtM+v=WaE4Xx##8 zoTR*@)3sh#k`}=({yx~nZW6mV!4173l8kD4Rp&QkHvsNXw8ds38oaFrghk7?2E_Pb zw5x&OYYOmf6>vUUO_ZqAy{&*#IgUo5qIBp8&FSA!gi#WQeiDTkA?W0FrF+rH^TOCg zIB-22#&LY35ja;1&OvBPU$9_3dA$3i?p3oVJ7RTj_vFxtlh$8rAzj^F$d%~s$@W+{ zvP`@?fd;a_s;;35Mh8J%gLhzT8McVt(j-#$AnmxE6KNAPO<7(Fn|g#`K8ki0>&!b_ za|X{|i@gkouH^RVPOt?HZu5_%zlBOy8;1&hR)+#33sp$chS)S5a4FU88T*t9d1&KQ z`_Jm`MgZP3Ky=Kl{C!W@UX9=7CQY-Zj`Blfd{DY3wMUwvmc$Tsb)N-xx zr**9W$OuQt0ecX=(Lpy;&l-DKB(sK%lkGg3G@Z@lyJDN(19QhC|Hv{_??I0e-I1{i ziDkqGJ!lVheAt2Z2#9|K_YqnTl=r|t3@aZ=HJMXoRLvpk`cE*`n`&MW5i1 ziYQ)#0QoZB#Ku5ALJ*wM!3lW$KtS*tJU9^ePK09%CDg}R2_;acSq)|DaBBqR)nY6Q z09Ht1A0w=F6ecc8Lev29M2{B)#z6iC59g28NMa8MdN)e2{PQ&@jV<+rGI(21sBBmk zAX?@UM}jG9JRjJ?)>r~xYDF^>wT#7s?*TAp4CE9>JWn}|Mxs1gbK)uEF-G!c0ad{fBb2)EG>*m^8X!#((OfbA)dfA(IAnbFw7*7J+G~$ZzqUny zLO3AgSr;2fXJ|l;x!VGoc;BjgDg^6Uz%tlW-8Ta?fNQBGY4};GTYoIY6XvW z;l}rR+URQz6(-x`L)cP}-@2s3DiJb|VwZJk8_{=iWUS(cHWZz=8YB5a(yX@LU4qt0 z#%nun?}O%>GKc%z(st*?EnD$asMkj8DqHD6jHrAJ2Zu@#vw}>SxS1brzFw^BhaXr5 zrA+86E1s*e41@-CRV{X%eq|FVSLI~Fs%6u>VAGsSIA9I}vYs0qpS!C#a(r%4+k(Tt zxI$Nh&8!>vAnD*F2GtxtD}z^cR(9rmFJ*Ry<&pF8XqX4R1i2q4v@=n7Id09)YUd-@ z@H})ra&L4E`gT_EI&T%C-xg#k-bU&wQosKtar;Dj(2ID}>0TPFaVUTPOKdGA?ja?z zmJ;=l5?V_Mdq@ear35{s_|{VV9#XKi6x>6KXD!9+Aq81W`C968(>l$u*}OXBwW`

Ww9@iQ_5)VZK^2& z^uN7RKu)S##jWzYPPP)G>mvD599VunXOr8qTBdF5{f*v{Iu#m|BL-Jug!6K*A9P-X zp6lht&fCuQ%L%UB#G99E#p}VhWB$}!TkqVq4nEdZ3Mr2BeY~`3x-Rd?x_+nRVL5mw z3uG_%Zi#ul_giq|Z*hZBGPnrY=Y+UWlhq6`WM%ZJskdmMx%;4Wpi6 YR7RhwTQOs_+U{8W4 literal 0 HcmV?d00001 diff --git a/assets/icons/solve.blast.svg b/assets/icons/solve.blast.svg new file mode 100644 index 0000000..dfe35ce --- /dev/null +++ b/assets/icons/solve.blast.svg @@ -0,0 +1,8 @@ + + + solve.blast + + + + + diff --git a/assets/icons/solve.blast.vectorcraft b/assets/icons/solve.blast.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..28bd93836b41a62b131fa4139c65285e9a2413c2 GIT binary patch literal 1964 zcmV;d2UGYTiwFP!00000|K(a+Z{s!={ws!_4MDt03ebny*`ix?c4siNXi*G;fVLT1 zjV!9VByk7+?>)TPQR1W$o%E#v0^20T^YQRI7ary(s=3;#l^*+fy?`dsbPFY#6^#4(Eh<)Kx=L*IhggT~Tv ze6Lg`qajz%rla;;dPhM!n&qy6#3+GX%4rTtMJ(gct@`fJ50;bzu@aU5aWjhOrAHBc z*(wEshipj(0vk(s9Vj3JBW-rxNO{KT|oa=y&Z&G1>Ik3>Clk4f8=y;H3%ewe;C)^ ziEg=(mIW@feElDg>+%KCtxL5Ke)L3mgULl|QrY?h>`rx>Pj9W$70g2Jic*Fg#fKpNy>O{Cc zcBWbSC`Tk3AsbKC&#DbBU)W58KgSN6s*T^7q6$rvA1AFtiooGryVUX4+o-!xSC(4y zJ*H;nH}O7oe1HpfrhYq^@f7$FRBWO)-kq!KYZ=OnM>)IC5iKpI=Irk`3S@~c6b$i- zSld)%5cO@EHXh6uQHAC{>A-n#OH#i*cp^vNE2s&D9v}E%d+4C-?ueXx!cglO9ouQ*42B`CYCD`6r(F2 z^VxHyh;<`Yg}$(uAHQB4Dt;e|3W|@=*LJG5Wf^b{wt%mr&a|=#)S+szEV`X*-WID` z88|=(4cX6)UY`3@apdK>bpZL*HiAu^U&)l_tMv(uhxy~>p>y?G3)4K!+fTkgX9N5=N6_vk8Yz1LTZi{1J-@cu6+- z*2rOajauRm0=1RJsX)#tqYcB9D*;Tuy|X~hs#|4)^1DyA@=@1C=FI?Le!VG{S8cZ| zhwS~gycT__cg&2KebFPLw|imW%uRr>pxQ5?q)xl0@)kB4Kljk`*-MuKF|$$K{xt2C zwbU~D(%Y#DKTs8YqAH!y?zRh6YGr7D(ibb~zc+<>J*U;#a|O~;{YHs?FK1QU7W&;q y7?{D-jcE02f)c8N%dWku>%xyMwou20QQu%xCGWc{gJS=%WB(`jbiVdkDF6U1+QV)D literal 0 HcmV?d00001 diff --git a/assets/icons/solve.explicit.svg b/assets/icons/solve.explicit.svg new file mode 100644 index 0000000..ae7c14a --- /dev/null +++ b/assets/icons/solve.explicit.svg @@ -0,0 +1,10 @@ + + + solve.explicit + + + + + + + diff --git a/assets/icons/solve.explicit.vectorcraft b/assets/icons/solve.explicit.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..e82e6f7011f9b5dcb091a9fc96f4612fe839152c GIT binary patch literal 1892 zcmV-q2b=gGiwFP!00000|K(ciZre5#eicK%4MWsj0s5oMimqt47Rk_J2m*t)X`72I zYPuxx0>AqXZ?fe$8AaPghXn{MkrdCT?_79zs3&L6$`!7i3+J9pYgSH6Jg=Q0+?5q& zxpNT=odwBBiJ=oleHEiF`KWf9IyC@x2kV|U|Q%OqKlH|HJ)&?>au}` z>5^u%lH{#O4+tp=f=irF37?O`BodL7?96GFfxrS&sR#umXE|{;n_)Yys!Mi94vYjX zfutSCTpby7ltLdRCpC%qUkoN8?vluhgK+3f_+5(PD2Uw%ggFm%RxbfH=YEO{u2k0K zeD*&X&D-0}?dBPC1%@Yw@&{V0X2LJ!tHR4KnNkEydV|3JhW^OCvNjyJNBn5uzp)lT@Oe4OVCa$0QN?e45c&!rIxuX#@ z3eT#M2>3^!c3_{+D({1l=cdR{(lqrwAH^Z`vZhwu=_pR!Btow1MsbvQyjL-EyCT{Ij5r=|~HdbL-;qiART=lE2&6!84*RQKNe zJBH4KhtOa~?}c4gODt4KvWylLx3LH3BH>=SRKEp<{u_?Xk6bbRqs%b z^`YQD8IjP)JFf$H!f3V;Db)AR;?eLxJOl3(Ca9kd+6I%yxoi~f36~A8MZ@sN&}16$ z*cB>G#v*P8N|RpdqBKI^Q<0oEY4X~EW9bKmstmQecb-Sdi`syHXs;e{JzWwxk;*b| zegmR!UsM1vmaz%WwwX-9>K$lmmTybYtCene0N`2?zZ3DhF_rpLhNpLy7U3#eaFrF9 zOT8j9TPyU09qNFB27Kz};+;M-!P*|*OgGdBn8wAFCIik-IhUTVv z#VYHqr_3~>m#jmkYUY}uxox7npR{&OB#1>wHTT|Ig-o@Y+R1CTiy4oXzLN)-v{TcAXdHLS~aietY88Tm;;Bb=SHv3eW*C{ z`rN!62Ah9=#v})uSvT;3v%yge$~pe83|=>Rbui~Um)RMXM^4A1VIFi2az9VW!9?MF z+?wsxPDifce&}@M-s&3kcu}&Z=oF&gmw3&O>kk#FKfX!bKG7cZvWE6MVX(%b{NtO% zT1wJGN^C79?ja?zmJ;=l5?V_Mdq@ear35{s_|{VV9#TAODP9jL$Xd$3r9QWv-5gyk z>zBM%_FA7$pmq^ONY;qjgi++!VUJCx0CGezev3sccy7}B)JS1CMJ=%lA&`~DzCeyC zqji@lRRZXLdMAM#Rkuny<#(NIrAEg^;;0lXzgW`gxT@D#*Lr^@bKGQHV`9YMnvZbK z_i@j`gV0l*e;+*UY)`vgv52d$&-nLq;|Y6IUwrJHwhlfwbp|Pp^JARro4%L#%6t7n z@cnx5K@`Z&_~n*yz4v=?6YOx~zrqdQU@VVO_vubtPxmQ^;i32TJHwW$;2Bjsqg}5i zEaPPGc+$`r(bpvvABa>ud(J^xEWTN+n#qjbQ~o6@3`}6^5?B0-Q36%LXq}gjL~MdWAhK6jp`j|D*yn8#-m68 literal 0 HcmV?d00001 diff --git a/assets/icons/solve.flow.svg b/assets/icons/solve.flow.svg new file mode 100644 index 0000000..2de5b8b --- /dev/null +++ b/assets/icons/solve.flow.svg @@ -0,0 +1,10 @@ + + + solve.flow + + + + + + + diff --git a/assets/icons/solve.flow.vectorcraft b/assets/icons/solve.flow.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..f4ae3963d5a135a5817f765bc5b97a0529fa8de5 GIT binary patch literal 1880 zcmV-e2dDTSiwFP!00000|Lt0BZ`(Ey{wsz)8-YZ<2k3_`E4rfHS|me@AqWiGrfn{= zsOcq%7x=&L_$FI^$tc<>2CM-BOC-g6boboxc+|5qW91Up&ZYA}CN(Q3C7#vJ5bnx~ zvfQ~0hR&Siq{Pq(qrQq!SA5jKy+|)y7&~Q?W=V3GEN){)1*T=CI@WhX zC&MdJ9s=@-cL)^sG@o)5^{U_<;tBm?y!}f_Dgrn;gqkdi4A-O;U6eGh@t7;BE*of= zENC_@N#2S?ppc>UN@9_K<5U%75I!dAClB>## zqab!8FfzaM-7raz54U4}8~7>m!g#%24_jGPU9x*(DJ_ZkU#z4hNrd7cRKijP1%x?| zbXqS!*%#0`!38GA_I5A8=MS|4_5rGHC1C&kRR4|uXqjZJB2!6u zVa1F-2yRykEX+ueUE&A4=EaMiyj6)*HB$;*054wtk8a2t~eTN3Yh6QPR+tNxm9Oe=7 zS_zUyk(RK<0~KyJ#tMEI>xi+uWXD>fq3gA2*Iw#=%V4VI1&b*$8R3}7|3UEsyP{)fF}q!gg|F{A;)(j99t-nPW%LvP^X|0%2pa^1m*2=EYfW&BuU_V zzP3@6x?UQ23JBsoC=88(`~f+O*y7kBfxJ7^F)Q`OU!ZlOxYQHM;C)G8A7PoQcj%JD zTvOI~KGCHuS;9bAMQbMRkOjdt-?112IYlD~NvF|Bq(^I=AW0r$B=456r_QD)MzjzZ z3JTJDC?wTk&e`7y&Q62?TY+tEz=n~#w|OXe`&WZ)H?OUm9I}WCc*a1kRyaS&Wwb^j z5#4kgiG)J@UNCI+5eZu$jYF|P0a4p+bHn`Il;l)$i1>=MzsA1cYmY_0u|?pC<<`@c z4KEeM)M=ph8)GCN@+qA&TP(7y5^ADKkAZEnLgOoN#%R7$mXX>LjYi>hLaFfD*jyoB znzG2OgL7f{2`4|q4l_KUPo>G1eHr!lZwl%F!G>6g{^i?%0 zWLXA6gFG1Gt4_bN2~_h6JfZbUH81J3U;+-%fkW1FdoRy@s5tWS+`JqHn}2>_B?p_a z8}xy*!ATmFbNpX5c+=$7!JO~4XlGa+IiDU4^PtyI?&k?Pm?*rSZq4>;=TolXe&~G4 zz0)=5(Y$0$(J4f~FY$_>{U0h)e|(d=eWE?sWd-f`g0RM+{NtO%T1wJGN^C79?ja?z zmJ;=l5?V_Mdq@ear35{s_|{VV9#W9C6x2hCXD#L5QlGodZjR0u^)auNz1HUwUb~2T zo~#kI38Tod!ycPX0px^Y{056y@Z6;Lsgc5Pj#^?DLLe)PeSw@(M(Zw9sszyg^iBdf zscw~Y%I`YaN{x<-#8D|QzgW=8sH#_4m%Tre8E!IeF)?Cr!$&x;_ubXOgV1xGe;+*U zY!AC#v52cr+4#qJqcM9@AL8tswhlfwbp|Pp^WQkvH+?Vk!h8Kf@WX2GK@`Yd@uNE9 zdhhqpO|YdK{{`Lf4aVXWbD!_T^;~K(KJ-?qLR+c|_Eg0)+SPK*GOi3BPZ~NU`nsgz z1Cfen&pAko`G+|C%aAF3p!}0q7?{A+C9e4Arv$2kle!ue1=VBe66)A6>KR7m + + solve.frequency + + + + + + + + diff --git a/assets/icons/solve.frequency.vectorcraft b/assets/icons/solve.frequency.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..0672d01e774a0c0e989e5fd25fda40f7ea95a783 GIT binary patch literal 1950 zcmV;P2VwXhiwFP!00000|K(ciZre5#eicK%4MU>t0s5oMimqt47Rk_J2m*taXq$^H zs=6fc0>AqXNzt(!#ieLx?N9?jB$49z^qmV25BXrtS-HZsb!Od?q-JGO;(2Y2;jXMG z%dInSY%NGmN(_zA>$B)}&U=mQNj$NkZ_1KpMRFMA;qg6ZY}K^R2)t9V?3PUCCHdNr zJXymVO-}0yT0YTxl2z~^VHqo@E0*&97mFD@!eu>UxJ;qn)q_P-F=UQcyvOUdZR9}5 z5+HHW_qKIrPwcU^Ru}hf(x!x z*5rKjzZuPUZc|(>xvT=$pb-AO&cq+XAF$5mb4eK=1!r`TPZL(=&+A9VWg$_ zx>^ieH8XxGsRHtrtW_j{x^iJ;2Tkm2&JTZpob3|;kYubP>DCT5f<~?l_s7tNYsZo8 z#%`;Qz!4fy>X3~cZG`?ob)1Y&&|L!`a}~k^x0l|rMTN4rJr2?B{ZEY_eFwTZ#oypt zb~!}2Z%X*-Xw*@fRBwmyV>xvuUY9U=A4P89`+gjUC`RFyaM9{a94Bx+&$De5+M#=` z09cnR#z3ahhR~Ni@zmI8??u%p$9B6ygV#6ry^%V<$?JGp}hJ#pgB5A1EpAET}) zFbfJVU-3D{4QxT*{amQl9^37o@S;h}|D%@#Kd+a>`)(2+_LF#!qsXwe>nZj@SAqUr z3k(js3PKaVV;oWEWBQt(b)^2WH2q3`=(CR1_gx1Z%l@p{*vM3#xM}r zZ3wVi=hv5dK~h7RF^WA%CROxtWGabT1db;X%}5)_M~ILMGCBf}=W_^Ni^ugjz9Zq7 zLJ3qT7EpW{i4~NcEKm!|>(xvw6OE8Wp6j?uM?q{map1H-5N|=guMOlc@Nsr$j3h#? zua+UPD}J8hq_w4iP)2V{0_$JH$+KfFQOKDx#`A%$OpV3&gjN(YVaHeyT>HSBHjrZ& zK}b4{LLxm{ae}1rXd`*Ef`U+%9vRVmuuvdKWi?3Bp>MN)5}X|g!LvKIfgGQ^w|*#j z{k6e{5S*=>^l79Gc-lbD*Em1QWfUWUh;Ay51cDHE5DZg30-+0}aJ1IY0%;RqeZ~CK zl;l|B5b+f$e+^w>uLCCi#uR}grduaa^KUE+Q&o19-)JLwm#1{WOtA<(xV|z}=`n7o zG~>45w9$N~EF-lc8im5?gi_(Pp*|s>nzG1@gSrwefrzl`L|Y_+AAQID9YcA&HVq;H zgl!NQ?&XLsN9gOD>IJKei()d<2%fVJnX2h)hUTV;@_y3VH4!fqAywadOLk`(%0lVB zkExlscU4T)pWuvxsZxh8A_dw`Dl$>i59d&VC#IIMm$R!JQJTfjoc(;sKo+izOXZ4) zg-kU%v%XBz^ub)>+%)$IJHew{vG>qG8$D-GellG?1ReEwodT096CwR5cF|O(5q&R5 zc4hofhNALTZ6sfCmN&+;i{DwvpswQ%UTD6l3fT3lOlMxVV=G98dS$e>w3PwG@XE({ z^js-oQR0;HP2BP0<=M8l_<`n7=Y+PZW`!)vbav;4l}(^xRp5ly>-O=ArUeslz#KSa zHMVnj?7rg2;jwvj3l{%;qg8g+vu@x6XQQJSlwPDifhdgyfIUaK1PbWyUV=oF&gmUzw2tn?MB-@l6OA<-W6!q3Cp z2!quQP3rJw;)9Ahcp zN`0<7t2w$@*3WsZY&G7WaJG}E#i2lsDWi3#skQ_#eD_WQIjU|Ib;|E5*^0Hci^N$Su>4|4lWA42v#$02O6Iu9 zxW+_}(IxL;z1-P^-i^>xow4fO?R-21K;%ynC-Ko!rPbC4Dyu8gXgrSz8a^W4xef}u-X@nh2js)9*f kO^br6zH|k3Z0Pj>y>fD2Px*-9X18JUFE@g+=4~zj0K)grkN^Mx literal 0 HcmV?d00001 diff --git a/assets/icons/solve.fsi.svg b/assets/icons/solve.fsi.svg new file mode 100644 index 0000000..1c85402 --- /dev/null +++ b/assets/icons/solve.fsi.svg @@ -0,0 +1,12 @@ + + + solve.fsi + + + + + + + + + diff --git a/assets/icons/solve.fsi.vectorcraft b/assets/icons/solve.fsi.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..6336af757b44de22d6669afec45530ee344ab4a9 GIT binary patch literal 2342 zcmV+>3EB1^iwFP!00000|LvP?Z`(K$$G=LT*M=eLfusWLi(YTBx7gmbXb-zM6hR={ zjIE0-`6RiCukd%j8B(-GQAs5_S@f`5U^mu?=8XO`{E?#Muijl*ZPUiP_P&T^Q&!6= zy=%M~994Bz7T$F<^VXseRSGAe)vvPETWodZ&y%?iZCB-TzZC^^^7Z^ZGV_|O$pw6; zF7q#9ephGEc3)&o4Ym*2qsVJ8EX%yCZnxzMTYg+Gz?4?aqD-q5wEO(k%T}_pBHdz( zH|@DA0u3t&2Aw|o-nBpXXWl`7cqHC+5J^+}={WQ1P5E%Ugg^y2OsjkE`Yz3Dp-)t0 zUEglftg71+$D5g#rw36D1@aD0$SCf!VuevOhaH}f-_RF^_79b)1;mLVG-A8U(?**_PfnI-PJ&qk=8h#KVBw@=iNU}+ z$20*0?Y7_?Eb-YBIH71E9ZP`Sbelv`zX=Wc-Ed;M0#%G)C@N!wOHmr*lBklVbJ^6A zhAL?~@-dXgkeHz~-7GLrrkf^)%FubxF@P`-(AhIbVIUyZu>{x)i#rxj1_B}-3n;_j zs~rm{10kM!23mn3>>PtKtm`{LW!OB5I~Gs|EZsJs44ZeGfG|cA;-fM~KVS-p=?qM< z5f2z>VulPR&duv0Ll z$fWR3COyF<)X#(xYHU&o6VbyGrmM##nN$-@nED=>pg{U)!kRJJ1ePA0u+(~V!gB24 z2~9mdp~(bPzYz_rt~lvAL`E4wNl2N2OG=rSM_Z}-oHC`NtyFzdnX*e%8M#4L8R?U- z0!xopVCmxuOnqK~sShkL^@&A73t1%WGYc#|XrZM?Eim=5g{B_2z|;em*+`Mg>`S4` zbSc?o#HHY62CwL4UZcX7DTU&fsh9$oDXb!xslP&)ktNA6mC5HI7X1mary#~Hh%pOd z%!U}VA;xToF&kpkh8VRVMlFa@8)DRk7_}irEr?MYV$_BhwID_F>XVQ+YsY6#1b1~i3PF5f>>fhEU_V$*bqxBh$RCMO9mj8 z*bqx>h$RCMO9mju2O!1=AjStE#s?tAEr{`NK`j2igjj%5y(Yy74ED(BBlCejkE!ivL)vH|I29QLOcr;`{V>oHcNcS9%-jD$8?nvhPFA zB*Kb~TRE8@a~?#koI&D~gc3u|*Dl{km!ejaJz1Nx!Rm+TflhRwgITu?SfeKr1pk4( zen^|;MyS5qt*_7j0PSy{%n68?my0w%Z?EmjrW0-3%WoSIIM(Z5 z@^pFcSR{U19)4RGd8=I1w9=~hk>I)d9z)}ZCj^EcodRQ=ZGp^XnNq8AdW`|@-LC+<%4r1 zJP2bw4JV=er$I*ATACQj)lZdx{bS}6|D?2iY15?@ka-8 zi6TLu2F+=%kt2FwvKbZ0k6U;&ldmo$S_~Bm0_g=rpyU`|v;P!neqjiaZ`4LWVjSM% zQS#8EJtxI*_-Aw76)t3V`H2|q<5^%*~K|DM8w z?#2}&6tE2rS#OOPVubPdQvC?aaM!6;tu*LU)uEPZ<1>>Lt_$V&zP(wGt@Q>!S5l ztxOOGcRprUPi;l4t8|s&>r}Jz$LrHJ*SoBM-7+{=H|0)k%K#eG3r0BWOxrer-O*jT z%$h@M-e#*^DZ_zsz>sy{2>pl{bzx!)NZ(LYt` z0pB4V+NA#Fhs2*kd&tWH?Dw)@N2C0gAGos@KEVrf_QEE3q0V0D1TV3(mw1Ag$k|IY z!At1uC7j?TaP|^R@Isuud~4}*W8BSU>rM02s8wg3pHGm}Bua?dBRVY@?N8ZL~3VoY9N75GXqJ1lFY`^QpRx;{w zk$hANmA~6$%iFp+eCU08z3D7fWJ!f9+QW8H<|qd8WS^~s{#<49osk+>&jom6 z_!=0#EV9bJWcbS}Xvm@KDy{KnOagWVmrZ@U+hw|KwuOCcX!R9Z72>hE#UAl1=M%^O M0hU~%X7@D!0F#|=+yDRo literal 0 HcmV?d00001 diff --git a/assets/icons/solve.probe.svg b/assets/icons/solve.probe.svg new file mode 100644 index 0000000..6bd270c --- /dev/null +++ b/assets/icons/solve.probe.svg @@ -0,0 +1,11 @@ + + + solve.probe + + + + + + + + diff --git a/assets/icons/solve.probe.vectorcraft b/assets/icons/solve.probe.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..718be5baca66d5661f3a00e5ecd9ff98e22f7716 GIT binary patch literal 1984 zcmV;x2S4~9iwFP!00000|K(ciZre5#eicK%4MU{v0s5osimqt47Rk_J2!epN8JmkN zYPuxx0>AqXZ?fe&8AZoihXn|1ku=Z8?_79zs7LRHS1ZzZXWkv1HN2WtR$|0!-8VuoumU(j z?1S%}`4fNat<9GQQV>Y0Tkq_Kd2v^lKQ9wsc9_!60isPl*Tv-qp>#?PZ>($F!5s$=H0V-vjn0h3G~iLDYVMl zLQMZVXGQn8x!Qa~T}j}lWAy>8bvqSb)mmZoORhBmlU@d(T#P3El~|x?Ktk~-6fK~) zSQMkBNW6tiR@zqNr^+@xam9;R0 zdkDHBZY}j^$)NvIU<+bjPXBNtz(Iqr|Hb#zu)nqR@RXLWJzg6+kdUT0h_$7ML55M3 zZ2rCAbK2O00uT`NOfgPi!8lDK90e(ooto?;LAywf!I94$sz4pN50G)$X|M zq2=1Rkw^$gvB&E# zG)RdAL1wqdiVl05{gsmZNC=_dvkl1eg?rnFlGlH<#P!V4xyd1o=zwPpv;-{=b zrE2z?VTEg=yq~o8O$1KrBBa`TZ^iFjLs_EScbl5Y=fK2N`wh-Hm>P9NGE(4fQ&EYU zeK_YgH`LWK_HuTUBPz2PnzO%Ia*#zD=X0?kVxdxv-mb6GG^Is5rPDAL5>R!d~GeP>GOz6gzKg*NDECBL^ye7(+36t2L6ZBrjU$-6iUsWN_bc z2Ol)w)+OAQ)vh~l(6be+LcK9sU)jn4VnpR*JbJ1Wu@DtSaq&6cem(1IQXg3Xr7h^I z8(yli41@-C5hyEigUTjQ9WBX>HEZ3xV)K$qIA9I}vY8t_Klh>H$n$fHYL+Ug>cMu_ z4SbM%bQFVXj{hrz7j01=%=u1bc9!Llm*deg4>|?8pJw!6qHsEH?apd1N3P|0=;g@0 zGBxPyMaA2)SBQRBk+pc&<4}?M!>i06674}RYiPff25TM4KfFqvrKAI-B+gQj0a9XT zDe(X)k+YO&fRxZ#N;p7D;4CE=AO$;1!2_fqXDNS|`dsx+b8N9}p7L7N>wG_fx=j=z zRU_&WMww$r0}h=M$PvZ(Ef%@q`RU+WBaPuDYKeUap{gtn1#(Oot-np_62S1=I|byZ zx>edMznf$$v$`&lSEXS2<&w>=>t>zzt@lTIL)u(uOpX{`h!NiDUY9v|5&Ba1*9UJq zw|D + + solve.static + + + + + + + + diff --git a/assets/icons/solve.static.vectorcraft b/assets/icons/solve.static.vectorcraft new file mode 100644 index 0000000000000000000000000000000000000000..83ae54689520c8ab7bd452f787426c0fce93d44e GIT binary patch literal 1815 zcmV+y2k7`8iwFP!00000|K(b3Z`(Ey{wsz)8-}QN2k3_`E4rfHTBJjZp$H6GqHQj+ zs8Lc9FYtfgkrZvqRZ@y}if#)K*d|ZBNB10$$0Hw{1>XVeZ6jCF1GM%^}o3XT6lL7{L*guEHPEG5az%v!gZ^@*paZOVY zZwgvh(ENekle~h4l;w=i)+`gkSIapxVP4M}<{8L+d2nbZ$1Ct!NW5(OMhFBs;1PQ7 zUFX7`xMOFdzuY6|!V6?m`)xaRsujDNrGS-yLd#>vL z4dH!2-iZ#0;)WKPKv8c>(IKDEFDBYQa8eP#DInBjUFNtZJJltpMUCgeR5fp)Azjft z5&AEK+^$a zK}QZ9T=Kz%QIkmg#o!R~R}y(~5RRR>_%%gw6vS=>%A7lz)hj?PY@gy%kjk1ujQ%I1 z#qQ_!di#~-N(@hq)d#dz&0Ks{uL>`}Vl5Fc=ocTx2Uf4e>*?P}HUMd9&MK1aSlmh@ z2wVF9N?W4uV9W5pmO@|LYszu|!^zRZ$Q|-DLdTE$-{LX&Px1)C6jzci;0l6NA?*>4 z;UA2_77Gr)N#glY z%R=B!Jru^h)VlX5F0N#G-2a}=qF zq2q_>@xss;$R8xn*_|~KSlU9p_Dp^Gr$ZTPeQ6++(Q8g%w_%w8b=)P1g{7?VyrXMd zX9)wzindJLaTYI7G2a--DHicOHEDLMjhxXv%Z(9|S8LdN=h=x7Ed&n*1L@4vQ|2)D z+20AyPlOP-9p8YQOiXX{Q1bGx2HWO`yJ^zLNE`5sfn08Ianh907KvnZ({Ut{2Jr{M zu(d}dx$rcO)*D(N?Iy;Yn7zHc3z*z@VO-Cprg|}N&RH9}c&Y`$NY(3*B zXV*ERa*Lrk`{jy(E?isJN3rULk8_ic$31=*o z?aJ$Se8p3tUOTO;d}V-PMCD^VdaM+&5SS*gl0ox1O^ zvI!LQN}SSq(>AYZRx$|(+(AIrW22|X?kkQwJ+>&4!RB8aYbjwf?*@C|d~}ip)foR* z3w~^hsyF9*F1Ir*kDSkrhI!C)825cjdJ~1`v#r@)?R>^H+z*}4xYxP{JzH|tl$}EK zYmPVKhCpAD`t6IUJ0#izFB@pTkq&Dd%HO_7thFQqw8Yk0;sIJBYc0_LEupoRaDbM; zT1zlMi*K#PAE3pv*5VD&f~>WCEA_eV?B?ilRX;XsRj>8=1lld42&o#;E@6~8b~s?u zDS@0&jNfCC3!a+{J~e7FoTHZ5g%GI9;!q%`l+n7&R9gZVetM^XoK&|;I^}nrY)y@h zi{w!$cz(H}>8z?ZdDnY?CJWr;f-xyE`Y0rv=eyd_dk}iAL-F3z&iy?VxrnzH-o%x? z*__?C2mD8;t)ur%okNP_{1}J*rtjrF@m{|We7hOFkp;46ytiUp@BJRO2@Y)IKVciO z!C0L__xVm-&v!q>@X&jIwQ*;v;44#!jCQl0vs@TM#FK_*M1SX0UK^=I_FRCrSYDH? znt4WVskk}|f(Z=GaV0LP5~vEMbu}wXs%7aK>ewLl08$0HuV-S!czf8f{Rf|vqU_i! F001%Cfhqt1 literal 0 HcmV?d00001 diff --git a/assets/icons/src/assembly.instance.json b/assets/icons/src/assembly.instance.json new file mode 100644 index 0000000..bcb5451 --- /dev/null +++ b/assets/icons/src/assembly.instance.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M8 10 L13 12.5 L13 17.5 L8 20 L3 17.5 L3 12.5 Z", "fill": "soft", "stroke": "line"}, {"d": "M3 12.5 L8 15 L13 12.5 M8 15 L8 20", "stroke": "line"}, {"d": "M16 4 L21 6.5 L21 11.5 L16 14 L11 11.5 L11 6.5 Z", "stroke": "accent"}, {"d": "M11 6.5 L16 9 L21 6.5 M16 9 L16 14", "stroke": "accent"}, {"d": "M10 8 L13.5 6 M12.19 8.13 L13.5 6 L11 6.05", "stroke": "line", "width": 1.25}]} diff --git a/assets/icons/src/deck.read.json b/assets/icons/src/deck.read.json new file mode 100644 index 0000000..c71ed73 --- /dev/null +++ b/assets/icons/src/deck.read.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M8 3 L16 3 L20 7 L20 21 L8 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M16 3 L16 7 L20 7", "stroke": "line"}, {"d": "M11 10 L17 10 M11 13 L17 13 M11 16 L15 16", "stroke": "line", "width": 1}, {"d": "M2 15 L9 15 M6.19 16.53 L9 15 L6.19 13.47", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/deck.write.abaqus.json b/assets/icons/src/deck.write.abaqus.json new file mode 100644 index 0000000..7854b3e --- /dev/null +++ b/assets/icons/src/deck.write.abaqus.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L12 3 L16 7 L16 21 L4 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M12 3 L12 7 L16 7", "stroke": "line"}, {"d": "M7 10 L13 10 M7 13 L13 13 M7 16 L11 16", "stroke": "line", "width": 1}, {"d": "M15 15 L21 15 M18.19 16.53 L21 15 L18.19 13.47", "stroke": "accent", "width": 1.5}, {"circle": [18.5, 6, 2.5], "fill": "accent", "stroke": "accent"}]} diff --git a/assets/icons/src/deck.write.lsdyna.json b/assets/icons/src/deck.write.lsdyna.json new file mode 100644 index 0000000..540af5e --- /dev/null +++ b/assets/icons/src/deck.write.lsdyna.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L12 3 L16 7 L16 21 L4 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M12 3 L12 7 L16 7", "stroke": "line"}, {"d": "M7 10 L13 10 M7 13 L13 13 M7 16 L11 16", "stroke": "line", "width": 1}, {"d": "M15 15 L21 15 M18.19 16.53 L21 15 L18.19 13.47", "stroke": "accent", "width": 1.5}, {"d": "M18.5 3 L21.3 8.2 L15.7 8.2 Z", "fill": "accent", "stroke": "accent"}]} diff --git a/assets/icons/src/deck.write.nastran.json b/assets/icons/src/deck.write.nastran.json new file mode 100644 index 0000000..fbeb8e8 --- /dev/null +++ b/assets/icons/src/deck.write.nastran.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L12 3 L16 7 L16 21 L4 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M12 3 L12 7 L16 7", "stroke": "line"}, {"d": "M7 10 L13 10 M7 13 L13 13 M7 16 L11 16", "stroke": "line", "width": 1}, {"d": "M15 15 L21 15 M18.19 16.53 L21 15 L18.19 13.47", "stroke": "accent", "width": 1.5}, {"rect": [16, 3.5, 5, 5], "fill": "accent", "stroke": "accent"}]} diff --git a/assets/icons/src/edit.redo.json b/assets/icons/src/edit.redo.json new file mode 100644 index 0000000..3dc08c3 --- /dev/null +++ b/assets/icons/src/edit.redo.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M19 9 H10 A5 5 0 0 0 10 19 H16", "stroke": "accent", "width": 1.75}, {"d": "M16 5.5 L19.5 9 L16 12.5", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/edit.undo.json b/assets/icons/src/edit.undo.json new file mode 100644 index 0000000..cc938dd --- /dev/null +++ b/assets/icons/src/edit.undo.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M5 9 H14 A5 5 0 0 1 14 19 H8", "stroke": "accent", "width": 1.75}, {"d": "M8 5.5 L4.5 9 L8 12.5", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/file.open.json b/assets/icons/src/file.open.json new file mode 100644 index 0000000..86e3410 --- /dev/null +++ b/assets/icons/src/file.open.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 5 L9 5 L11 7 L20 7 L20 19 L3 19 Z", "fill": "soft", "stroke": "line"}, {"d": "M12 17 L12 10 M13.53 12.81 L12 10 L10.47 12.81", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/file.recover.json b/assets/icons/src/file.recover.json new file mode 100644 index 0000000..dd08e92 --- /dev/null +++ b/assets/icons/src/file.recover.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4.5 12 A7.5 7.5 0 1 0 7 6.4", "stroke": "accent", "width": 1.75}, {"d": "M3.4 4.6 L7 6.4 L5.6 10.2", "stroke": "accent", "width": 1.75}, {"d": "M12 8 L12 12 L15 14", "stroke": "line", "width": 1.75}]} diff --git a/assets/icons/src/file.save.json b/assets/icons/src/file.save.json new file mode 100644 index 0000000..18e89ef --- /dev/null +++ b/assets/icons/src/file.save.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 14 L3 20 L21 20 L21 14", "stroke": "line", "width": 1.75}, {"d": "M12 3 L12 15 M10.47 12.19 L12 15 L13.53 12.19", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/file.save_as.json b/assets/icons/src/file.save_as.json new file mode 100644 index 0000000..0f962cb --- /dev/null +++ b/assets/icons/src/file.save_as.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 14 L3 20 L21 20 L21 14", "stroke": "line", "width": 1.75}, {"d": "M9 3 L9 15 M5.8 12 L9 15 L12.2 12", "stroke": "accent", "width": 1.75}, {"d": "M14 12 L19.5 6.5 L21.5 8.5 L16 14 L13.5 14.5 Z", "fill": "soft", "stroke": "warm", "width": 1.25}]} diff --git a/assets/icons/src/flow.boundary.json b/assets/icons/src/flow.boundary.json new file mode 100644 index 0000000..5dd2e0a --- /dev/null +++ b/assets/icons/src/flow.boundary.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 5 L21 5 M3 19 L21 19", "stroke": "line"}, {"d": "M3 9.5 L9 9.5 M6.19 11.03 L9 9.5 L6.19 7.97", "stroke": "warm", "width": 1.5}, {"d": "M3 14.5 L9 14.5 M6.19 16.03 L9 14.5 L6.19 12.97", "stroke": "warm", "width": 1.5}, {"d": "M15 12 L21 12 M18.19 13.53 L21 12 L18.19 10.47", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/flow.domain.json b/assets/icons/src/flow.domain.json new file mode 100644 index 0000000..a1559d8 --- /dev/null +++ b/assets/icons/src/flow.domain.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 18, 18], "stroke": "line"}, {"d": "M7.5 3 L7.5 21 M3 7.5 L21 7.5 M12 3 L12 21 M3 12 L21 12 M16.5 3 L16.5 21 M3 16.5 L21 16.5", "stroke": "line", "width": 1}, {"circle": [12, 12, 4.5], "fill": "soft", "stroke": "accent"}]} diff --git a/assets/icons/src/geometry.bodies.json b/assets/icons/src/geometry.bodies.json new file mode 100644 index 0000000..f01f712 --- /dev/null +++ b/assets/icons/src/geometry.bodies.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M9 8 L15 11 L15 18 L9 21 L3 18 L3 11 Z", "fill": "soft", "stroke": "line"}, {"d": "M3 11 L9 14 L15 11 M9 14 L9 21", "stroke": "line"}, {"d": "M14 4 L19 6.5 L19 13 L16 14.5", "stroke": "accent"}, {"d": "M14 4 L9 6.5 L9 7", "stroke": "accent"}]} diff --git a/assets/icons/src/geometry.datum.json b/assets/icons/src/geometry.datum.json new file mode 100644 index 0000000..4d8a486 --- /dev/null +++ b/assets/icons/src/geometry.datum.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 15 L9 9 L21 9 L15 15 Z", "fill": "soft", "stroke": "accent"}, {"d": "M12 12 L12 3 M13.53 5.81 L12 3 L10.47 5.81", "stroke": "line", "width": 1.5}, {"circle": [12, 12, 1.5], "fill": "accent", "stroke": null}, {"d": "M12 15 L12 21", "stroke": "line", "dash": [1.5, 2]}]} diff --git a/assets/icons/src/geometry.import.mesh.json b/assets/icons/src/geometry.import.mesh.json new file mode 100644 index 0000000..88e789a --- /dev/null +++ b/assets/icons/src/geometry.import.mesh.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 13 L12 9 L21 13 L12 17 Z", "fill": "soft", "stroke": "line"}, {"d": "M7.5 11 L16.5 15 M7.5 15 L16.5 11 M12 9 L12 17", "stroke": "line", "width": 1}, {"d": "M3 13 L3 16 L12 20 L21 16 L21 13", "stroke": "line"}, {"d": "M12 2 L12 8 M10.47 5.19 L12 8 L13.53 5.19", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/geometry.midsurface.json b/assets/icons/src/geometry.midsurface.json new file mode 100644 index 0000000..3c5ef07 --- /dev/null +++ b/assets/icons/src/geometry.midsurface.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 9 L9 4 L21 4 L15 9 Z", "stroke": "line"}, {"d": "M3 14 L9 9 L21 9 L15 14 Z", "fill": "soft", "stroke": "accent"}, {"d": "M3 19 L9 14 L21 14 L15 19 Z", "stroke": "line"}]} diff --git a/assets/icons/src/geometry.open.json b/assets/icons/src/geometry.open.json new file mode 100644 index 0000000..cfad45d --- /dev/null +++ b/assets/icons/src/geometry.open.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M13 6 L20 9.5 L20 17.5 L13 21 L6 17.5 L6 9.5 Z", "fill": "soft", "stroke": "line"}, {"d": "M6 9.5 L13 13 L20 9.5 M13 13 L13 21", "stroke": "line"}, {"d": "M3 3 L9 9 M5.93 8.1 L9 9 L8.1 5.93", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/geometry.partition.json b/assets/icons/src/geometry.partition.json new file mode 100644 index 0000000..ba320ae --- /dev/null +++ b/assets/icons/src/geometry.partition.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 3 L20 7 L20 16 L12 20 L4 16 L4 7 Z", "fill": "soft", "stroke": "line"}, {"d": "M4 7 L12 11 L20 7 M12 11 L12 20", "stroke": "line"}, {"d": "M8 5 L16 9 M16 9 L16 18 M16 9 L16 9", "stroke": "accent", "width": 1.75}, {"d": "M8 5 L8 14 L16 18", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/geometry.tessellate.json b/assets/icons/src/geometry.tessellate.json new file mode 100644 index 0000000..2e645a9 --- /dev/null +++ b/assets/icons/src/geometry.tessellate.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 12, 9], "fill": "soft", "stroke": "line"}, {"d": "M12 12 L19.79 16.5 M12 12 L12 21 M12 12 L4.21 16.5 M12 12 L4.21 7.5 M12 12 L12 3 M12 12 L19.79 7.5", "stroke": "accent", "width": 1}, {"d": "M19.79 16.5 L12 21 L4.21 16.5 L4.21 7.5 L12 3 L19.79 7.5 Z", "stroke": "accent", "width": 1}]} diff --git a/assets/icons/src/interaction.bolt.json b/assets/icons/src/interaction.bolt.json new file mode 100644 index 0000000..28c4593 --- /dev/null +++ b/assets/icons/src/interaction.bolt.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M7 3 L17 3 L17 7 L7 7 Z", "fill": "soft", "stroke": "line"}, {"rect": [9.5, 7, 5, 14], "fill": "soft", "stroke": "line"}, {"d": "M9.5 11 L14.5 12.5 M9.5 14 L14.5 15.5 M9.5 17 L14.5 18.5", "stroke": "line", "width": 1}, {"d": "M4 13 L4 6 M5.2 8.19 L4 6 L2.8 8.19", "stroke": "warm", "width": 1.5}, {"d": "M20 13 L20 20 M18.8 17.81 L20 20 L21.2 17.81", "stroke": "warm", "width": 1.5}]} diff --git a/assets/icons/src/interaction.connector.json b/assets/icons/src/interaction.connector.json new file mode 100644 index 0000000..57789d2 --- /dev/null +++ b/assets/icons/src/interaction.connector.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [4, 18, 1.8], "fill": "line", "stroke": null}, {"circle": [20, 6, 1.8], "fill": "line", "stroke": null}, {"d": "M4 18 L10 14 M14 10 L20 6", "stroke": "line", "width": 1.5}, {"circle": [12, 12, 2.8], "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/interaction.contact.find.json b/assets/icons/src/interaction.contact.find.json new file mode 100644 index 0000000..c237534 --- /dev/null +++ b/assets/icons/src/interaction.contact.find.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [8, 8, 5], "fill": "soft", "stroke": "line"}, {"rect": [3, 13, 10, 8], "fill": "soft", "stroke": "line"}, {"circle": [16, 15, 4], "stroke": "accent"}, {"d": "M18.83 17.83 L21.83 20.83", "stroke": "accent", "width": 2}]} diff --git a/assets/icons/src/interaction.contact.general.json b/assets/icons/src/interaction.contact.general.json new file mode 100644 index 0000000..2fc1b05 --- /dev/null +++ b/assets/icons/src/interaction.contact.general.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [8, 8, 5], "fill": "soft", "stroke": "line"}, {"rect": [3, 15, 18, 6], "fill": "soft", "stroke": "line"}, {"d": "M14 3 L21 3 L21 10 L14 10 Z", "fill": "soft", "stroke": "line"}, {"d": "M6.5 14.3 A5 5 0 0 0 9.5 14.3", "stroke": "accent", "width": 2}, {"d": "M13 6 L13 10", "stroke": "accent", "width": 2}]} diff --git a/assets/icons/src/interaction.contact.pair.json b/assets/icons/src/interaction.contact.pair.json new file mode 100644 index 0000000..ab8652a --- /dev/null +++ b/assets/icons/src/interaction.contact.pair.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 9, 6], "fill": "soft", "stroke": "line"}, {"rect": [3, 15, 18, 6], "fill": "soft", "stroke": "line"}, {"d": "M8 15 L16 15", "stroke": "accent", "width": 2.25}]} diff --git a/assets/icons/src/interaction.fsi.json b/assets/icons/src/interaction.fsi.json new file mode 100644 index 0000000..9111f38 --- /dev/null +++ b/assets/icons/src/interaction.fsi.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 7 L3.23 6.71 L3.46 6.43 L3.69 6.17 L3.92 5.94 L4.15 5.75 L4.38 5.61 L4.6 5.53 L4.83 5.5 L5.06 5.53 L5.29 5.61 L5.52 5.75 L5.75 5.94 L5.98 6.17 L6.21 6.43 L6.44 6.71 L6.67 7 L6.9 7.29 L7.12 7.57 L7.35 7.83 L7.58 8.06 L7.81 8.25 L8.04 8.39 L8.27 8.47 L8.5 8.5 L8.73 8.47 L8.96 8.39 L9.19 8.25 L9.42 8.06 L9.65 7.83 L9.88 7.57 L10.1 7.29 L10.33 7 L10.56 6.71 L10.79 6.43 L11.02 6.17 L11.25 5.94 L11.48 5.75 L11.71 5.61 L11.94 5.53 L12.17 5.5 L12.4 5.53 L12.62 5.61 L12.85 5.75 L13.08 5.94 L13.31 6.17 L13.54 6.43 L13.77 6.71 L14 7", "stroke": "accent", "width": 1.5}, {"d": "M3 12 L3.23 11.71 L3.46 11.43 L3.69 11.17 L3.92 10.94 L4.15 10.75 L4.38 10.61 L4.6 10.53 L4.83 10.5 L5.06 10.53 L5.29 10.61 L5.52 10.75 L5.75 10.94 L5.98 11.17 L6.21 11.43 L6.44 11.71 L6.67 12 L6.9 12.29 L7.12 12.57 L7.35 12.83 L7.58 13.06 L7.81 13.25 L8.04 13.39 L8.27 13.47 L8.5 13.5 L8.73 13.47 L8.96 13.39 L9.19 13.25 L9.42 13.06 L9.65 12.83 L9.88 12.57 L10.1 12.29 L10.33 12 L10.56 11.71 L10.79 11.43 L11.02 11.17 L11.25 10.94 L11.48 10.75 L11.71 10.61 L11.94 10.53 L12.17 10.5 L12.4 10.53 L12.62 10.61 L12.85 10.75 L13.08 10.94 L13.31 11.17 L13.54 11.43 L13.77 11.71 L14 12", "stroke": "accent", "width": 1.5}, {"d": "M3 17 L3.23 16.71 L3.46 16.43 L3.69 16.17 L3.92 15.94 L4.15 15.75 L4.38 15.61 L4.6 15.53 L4.83 15.5 L5.06 15.53 L5.29 15.61 L5.52 15.75 L5.75 15.94 L5.98 16.17 L6.21 16.43 L6.44 16.71 L6.67 17 L6.9 17.29 L7.12 17.57 L7.35 17.83 L7.58 18.06 L7.81 18.25 L8.04 18.39 L8.27 18.47 L8.5 18.5 L8.73 18.47 L8.96 18.39 L9.19 18.25 L9.42 18.06 L9.65 17.83 L9.88 17.57 L10.1 17.29 L10.33 17 L10.56 16.71 L10.79 16.43 L11.02 16.17 L11.25 15.94 L11.48 15.75 L11.71 15.61 L11.94 15.53 L12.17 15.5 L12.4 15.53 L12.62 15.61 L12.85 15.75 L13.08 15.94 L13.31 16.17 L13.54 16.43 L13.77 16.71 L14 17", "stroke": "accent", "width": 1.5}, {"d": "M17 21 C17 15 18 9 20 3", "stroke": "line", "width": 2.25}, {"d": "M15 21 L21 21", "stroke": "line", "width": 1.5}]} diff --git a/assets/icons/src/interaction.mass.json b/assets/icons/src/interaction.mass.json new file mode 100644 index 0000000..8b6ee18 --- /dev/null +++ b/assets/icons/src/interaction.mass.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M5 21 L7 9 L17 9 L19 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M9 9 A3 3 0 0 1 15 9", "stroke": "line", "width": 1.75}, {"circle": [12, 15, 2], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/interaction.rigid_wall.json b/assets/icons/src/interaction.rigid_wall.json new file mode 100644 index 0000000..eb05c46 --- /dev/null +++ b/assets/icons/src/interaction.rigid_wall.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M18 3 L18 21", "stroke": "line", "width": 2}, {"d": "M18 4 L21 6.5 M18 8 L21 10.5 M18 12 L21 14.5 M18 16 L21 18.5", "stroke": "line", "width": 1.25}, {"circle": [7, 12, 4], "fill": "soft", "stroke": "line"}, {"d": "M11.5 12 L15.5 12 M13.22 13.25 L15.5 12 L13.22 10.75", "stroke": "warm", "width": 1.5}, {"d": "M2 9 L4 9 M1.5 15 L3.5 15", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/interaction.spring.json b/assets/icons/src/interaction.spring.json new file mode 100644 index 0000000..b40d168 --- /dev/null +++ b/assets/icons/src/interaction.spring.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [3, 12, 1.8], "fill": "line", "stroke": null}, {"circle": [21, 12, 1.8], "fill": "line", "stroke": null}, {"d": "M3 12 L6 12 L7.5 7 L10.5 17 L13.5 7 L16.5 17 L18 12 L21 12", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/interaction.tie.json b/assets/icons/src/interaction.tie.json new file mode 100644 index 0000000..57a8262 --- /dev/null +++ b/assets/icons/src/interaction.tie.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 4, 9, 16], "fill": "soft", "stroke": "line"}, {"d": "M7.5 4 L7.5 20 M3 12 L12 12", "stroke": "line", "width": 1}, {"rect": [12, 4, 9, 16], "fill": "soft", "stroke": "line"}, {"d": "M15 4 L15 20 M12 9.33 L21 9.33 M18 4 L18 20 M12 14.67 L21 14.67", "stroke": "line", "width": 1}, {"d": "M12 4 L12 20", "stroke": "accent", "width": 2}]} diff --git a/assets/icons/src/mesh.delaunay.points.json b/assets/icons/src/mesh.delaunay.points.json new file mode 100644 index 0000000..500e0f0 --- /dev/null +++ b/assets/icons/src/mesh.delaunay.points.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M5 17 L11 6 L19 15 Z M5 17 L19 15 L14 21", "stroke": "line", "width": 1}, {"circle": [11.6, 13.4, 7.8], "stroke": "accent", "width": 1.25}, {"circle": [5, 17, 1.5], "fill": "line", "stroke": null}, {"circle": [11, 6, 1.5], "fill": "line", "stroke": null}, {"circle": [19, 15, 1.5], "fill": "line", "stroke": null}, {"circle": [14, 21, 1.5], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/mesh.element.add.json b/assets/icons/src/mesh.element.add.json new file mode 100644 index 0000000..43cc39f --- /dev/null +++ b/assets/icons/src/mesh.element.add.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 7 L13 4 L15 15 L5 17 Z", "fill": "soft", "stroke": "line"}, {"circle": [3, 7, 1.5], "fill": "line", "stroke": null}, {"circle": [13, 4, 1.5], "fill": "line", "stroke": null}, {"circle": [15, 15, 1.5], "fill": "line", "stroke": null}, {"circle": [5, 17, 1.5], "fill": "line", "stroke": null}, {"d": "M15.5 18.5 L21.5 18.5 M18.5 15.5 L18.5 21.5", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/mesh.hex.decompose.json b/assets/icons/src/mesh.hex.decompose.json new file mode 100644 index 0000000..b6a51fa --- /dev/null +++ b/assets/icons/src/mesh.hex.decompose.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 4 L11 4 L11 12 L21 12 L21 20 L3 20 Z", "fill": "soft", "stroke": "line"}, {"d": "M11 12 L11 20 M3 12 L11 12", "stroke": "accent", "width": 1.75, "dash": [2, 2.5]}]} diff --git a/assets/icons/src/mesh.hex.dominant.json b/assets/icons/src/mesh.hex.dominant.json new file mode 100644 index 0000000..76bb513 --- /dev/null +++ b/assets/icons/src/mesh.hex.dominant.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 18, 18], "fill": "soft", "stroke": "line"}, {"d": "M9 3 L9 21 M15 3 L15 21 M3 9 L21 9 M3 15 L21 15", "stroke": "line", "width": 1}, {"d": "M15 15 L21 21 M9 21 L15 15", "stroke": "accent", "width": 1.25}]} diff --git a/assets/icons/src/mesh.hex.generate.json b/assets/icons/src/mesh.hex.generate.json new file mode 100644 index 0000000..1bb734c --- /dev/null +++ b/assets/icons/src/mesh.hex.generate.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 18, 18], "fill": "soft", "stroke": "line"}, {"d": "M12 3 L12 21 M3 12 L21 12", "stroke": "line", "width": 1.25}, {"d": "M16.5 3 L16.5 12 M12 7.5 L21 7.5 M14.25 3 L14.25 7.5 M12 5.25 L16.5 5.25", "stroke": "accent", "width": 1}]} diff --git a/assets/icons/src/mesh.hex.mapped.json b/assets/icons/src/mesh.hex.mapped.json new file mode 100644 index 0000000..28cebe7 --- /dev/null +++ b/assets/icons/src/mesh.hex.mapped.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 3 L20 7 L20 16 L12 20 L4 16 L4 7 Z", "fill": "soft", "stroke": "line"}, {"d": "M4 7 L12 11 L20 7 M12 11 L12 20", "stroke": "line"}, {"d": "M9.33 4.33 L17.33 8.33 M14.67 4.33 L6.67 8.33 M6.67 8.33 L6.67 17.33 M4 10 L12 14 M14.67 9.67 L14.67 18.67 M12 14 L20 10 M6.67 5.67 L14.67 9.67 M17.33 5.67 L9.33 9.67 M9.33 9.67 L9.33 18.67 M4 13 L12 17 M17.33 8.33 L17.33 17.33 M12 17 L20 13", "stroke": "accent", "width": 1}]} diff --git a/assets/icons/src/mesh.hex.polycube.json b/assets/icons/src/mesh.hex.polycube.json new file mode 100644 index 0000000..a5682dd --- /dev/null +++ b/assets/icons/src/mesh.hex.polycube.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M8 9 L13 11.5 L13 16.5 L8 19 L3 16.5 L3 11.5 Z", "fill": "soft", "stroke": "line"}, {"d": "M3 11.5 L8 14 L13 11.5 M8 14 L8 19", "stroke": "line"}, {"d": "M16 9 L21 11.5 L21 16.5 L16 19 L11 16.5 L11 11.5 Z", "fill": "soft", "stroke": "line"}, {"d": "M11 11.5 L16 14 L21 11.5 M16 14 L16 19", "stroke": "line"}, {"d": "M12 3 L17 5.5 L17 10.5 L12 13 L7 10.5 L7 5.5 Z", "fill": "soft", "stroke": "accent"}, {"d": "M7 5.5 L12 8 L17 5.5 M12 8 L12 13", "stroke": "accent"}]} diff --git a/assets/icons/src/mesh.hex.sweep.json b/assets/icons/src/mesh.hex.sweep.json new file mode 100644 index 0000000..571b39a --- /dev/null +++ b/assets/icons/src/mesh.hex.sweep.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 8, 9, 9], "fill": "soft", "stroke": "line"}, {"d": "M7.5 8 L7.5 17 M3 12.5 L12 12.5", "stroke": "line", "width": 1}, {"d": "M3 8 L8 4 L21 4 L21 13 L12 17 M12 8 L21 4", "stroke": "line", "width": 1.25}, {"d": "M14 13 L20 10 M18.17 12.63 L20 10 L16.8 9.88", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/mesh.import.orphan.json b/assets/icons/src/mesh.import.orphan.json new file mode 100644 index 0000000..599efdf --- /dev/null +++ b/assets/icons/src/mesh.import.orphan.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 10, 18, 11], "stroke": "line"}, {"d": "M9 10 L9 21 M3 13.67 L21 13.67 M15 10 L15 21 M3 17.33 L21 17.33 M3 13.67 L9 10 M3 17.33 L9 13.67 M3 21 L9 17.33 M9 13.67 L15 10 M9 17.33 L15 13.67 M9 21 L15 17.33 M15 13.67 L21 10 M15 17.33 L21 13.67 M15 21 L21 17.33", "stroke": "line", "width": 1}, {"d": "M12 2 L12 8 M10.47 5.19 L12 8 L13.53 5.19", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/mesh.layers.json b/assets/icons/src/mesh.layers.json new file mode 100644 index 0000000..7b3bfea --- /dev/null +++ b/assets/icons/src/mesh.layers.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 20 L21 20", "stroke": "line", "width": 2.25}, {"d": "M3 17.8 L21 17.8 M3 15.3 L21 15.3 M3 12.3 L21 12.3 M3 8.5 L21 8.5 M3 4 L21 4", "stroke": "accent", "width": 1}, {"d": "M9 4 L9 20 M15 4 L15 20", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/mesh.node.add.json b/assets/icons/src/mesh.node.add.json new file mode 100644 index 0000000..8cf2f44 --- /dev/null +++ b/assets/icons/src/mesh.node.add.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 15 L8 6 L14 13", "stroke": "line", "width": 1}, {"circle": [8, 6, 1.6], "fill": "line", "stroke": null}, {"circle": [3, 15, 1.6], "fill": "line", "stroke": null}, {"circle": [14, 13, 2.4], "fill": "accent", "stroke": "accent"}, {"d": "M15.5 5.5 L21.5 5.5 M18.5 2.5 L18.5 8.5", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/mesh.node.merge.json b/assets/icons/src/mesh.node.merge.json new file mode 100644 index 0000000..904171d --- /dev/null +++ b/assets/icons/src/mesh.node.merge.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 5 L9.5 10.5 M6.43 9.6 L9.5 10.5 L8.6 7.43", "stroke": "line", "width": 1.25}, {"d": "M4 19 L9.5 13.5 M8.6 16.57 L9.5 13.5 L6.43 14.4", "stroke": "line", "width": 1.25}, {"circle": [4, 5, 1.6], "fill": "line", "stroke": null}, {"circle": [4, 19, 1.6], "fill": "line", "stroke": null}, {"circle": [13, 12, 2.6], "fill": "accent", "stroke": "accent"}, {"d": "M15.6 12 L21 12", "stroke": "line", "width": 1.25}]} diff --git a/assets/icons/src/mesh.order.quadratic.json b/assets/icons/src/mesh.order.quadratic.json new file mode 100644 index 0000000..9283df9 --- /dev/null +++ b/assets/icons/src/mesh.order.quadratic.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 4 L3 19 L21 19 Z", "fill": "soft", "stroke": "line"}, {"circle": [12, 4, 1.5], "fill": "line", "stroke": null}, {"circle": [3, 19, 1.5], "fill": "line", "stroke": null}, {"circle": [21, 19, 1.5], "fill": "line", "stroke": null}, {"circle": [7.5, 11.5, 1.6], "fill": "accent", "stroke": null}, {"circle": [16.5, 11.5, 1.6], "fill": "accent", "stroke": null}, {"circle": [12, 19, 1.6], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/mesh.quad.faces.json b/assets/icons/src/mesh.quad.faces.json new file mode 100644 index 0000000..fd4a0e2 --- /dev/null +++ b/assets/icons/src/mesh.quad.faces.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [4, 4, 16, 16], "fill": "soft", "stroke": "accent"}, {"d": "M9.33 4 L9.33 20 M4 9.33 L20 9.33 M14.67 4 L14.67 20 M4 14.67 L20 14.67", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/mesh.quality.json b/assets/icons/src/mesh.quality.json new file mode 100644 index 0000000..bbb8ec1 --- /dev/null +++ b/assets/icons/src/mesh.quality.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 17 A9 9 0 0 1 21 17", "stroke": "line"}, {"d": "M12 17 L17 10", "stroke": "accent", "width": 2}, {"circle": [12, 17, 1.8], "fill": "accent", "stroke": null}, {"d": "M5.5 12.5 L7 13.5 M12 8 L12 9.8 M18.5 12.5 L17 13.5", "stroke": "line", "width": 1.25}]} diff --git a/assets/icons/src/mesh.region.remesh.json b/assets/icons/src/mesh.region.remesh.json new file mode 100644 index 0000000..47d3e7d --- /dev/null +++ b/assets/icons/src/mesh.region.remesh.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 18, 18], "fill": "soft", "stroke": "line"}, {"d": "M12 3 L12 21 M3 12 L21 12 M3 12 L12 3 M3 21 L12 12 M12 12 L21 3 M12 21 L21 12", "stroke": "line", "width": 1}, {"circle": [16.5, 16.5, 4.5], "stroke": "accent"}, {"d": "M12 16.5 L21 16.5 M16.5 12 L16.5 21", "stroke": "accent", "width": 1}]} diff --git a/assets/icons/src/mesh.size.adapt.json b/assets/icons/src/mesh.size.adapt.json new file mode 100644 index 0000000..7753dce --- /dev/null +++ b/assets/icons/src/mesh.size.adapt.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 20 C3 10 10 4 21 4", "stroke": "line"}, {"circle": [3, 20, 1.2], "fill": "accent", "stroke": null}, {"circle": [3.2972159999999997, 16.576255999999997, 1.2], "fill": "accent", "stroke": null}, {"circle": [4.168128, 13.518848000000002, 1.2], "fill": "accent", "stroke": null}, {"circle": [5.3096879999999995, 11.265807999999996, 1.2], "fill": "accent", "stroke": null}, {"circle": [6.810048000000001, 9.293568, 1.2], "fill": "accent", "stroke": null}, {"circle": [8.651208, 7.614127999999999, 1.2], "fill": "accent", "stroke": null}, {"circle": [12.261, 5.566000000000001, 1.2], "fill": "accent", "stroke": null}, {"circle": [21.0, 4.0, 1.2], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/mesh.size.global.json b/assets/icons/src/mesh.size.global.json new file mode 100644 index 0000000..1fdf482 --- /dev/null +++ b/assets/icons/src/mesh.size.global.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [4, 9, 16, 12], "fill": "soft", "stroke": "line"}, {"d": "M9.33 9 L9.33 21 M4 13 L20 13 M14.67 9 L14.67 21 M4 17 L20 17", "stroke": "line", "width": 1}, {"d": "M4 3 L4 7 M20 3 L20 7", "stroke": "accent"}, {"d": "M12 5 L5.2 5 M8.01 3.47 L5.2 5 L8.01 6.53", "stroke": "accent", "width": 1.25}, {"d": "M12 5 L18.8 5 M15.99 6.53 L18.8 5 L15.99 3.47", "stroke": "accent", "width": 1.25}]} diff --git a/assets/icons/src/mesh.size.seed.json b/assets/icons/src/mesh.size.seed.json new file mode 100644 index 0000000..af09642 --- /dev/null +++ b/assets/icons/src/mesh.size.seed.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 19 C7 5 17 5 21 19", "stroke": "line"}, {"circle": [3, 19, 1.3], "fill": "accent", "stroke": null}, {"circle": [6.024000000000002, 12.280000000000001, 1.3], "fill": "accent", "stroke": null}, {"circle": [9.912000000000003, 8.919999999999998, 1.3], "fill": "accent", "stroke": null}, {"circle": [14.088000000000001, 8.92, 1.3], "fill": "accent", "stroke": null}, {"circle": [17.976000000000003, 12.280000000000001, 1.3], "fill": "accent", "stroke": null}, {"circle": [21.0, 19.0, 1.3], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/mesh.smooth.json b/assets/icons/src/mesh.smooth.json new file mode 100644 index 0000000..a69af5b --- /dev/null +++ b/assets/icons/src/mesh.smooth.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 9 L6 5 L8 11 L11 6 L13 10 L16 4 L21 8", "stroke": "line", "width": 1.25}, {"d": "M3 17 C8 12 16 22 21 16", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/mesh.surface.check.json b/assets/icons/src/mesh.surface.check.json new file mode 100644 index 0000000..cae0223 --- /dev/null +++ b/assets/icons/src/mesh.surface.check.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M10 3 L17 6.5 L17 14.5 L10 18 L3 14.5 L3 6.5 Z", "fill": "soft", "stroke": "line"}, {"d": "M3 6.5 L10 10 L17 6.5 M10 10 L10 18", "stroke": "line"}, {"d": "M13.5 17 L16 19.5 L21 14", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/mesh.tag.json b/assets/icons/src/mesh.tag.json new file mode 100644 index 0000000..f72c765 --- /dev/null +++ b/assets/icons/src/mesh.tag.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 3 L12 3 L21 12 L12 21 L3 12 Z", "fill": "soft", "stroke": "accent"}, {"circle": [7.5, 7.5, 1.6], "stroke": "line"}, {"d": "M10 12 L14 16 M12 10 L16 14", "stroke": "line", "width": 1.25}]} diff --git a/assets/icons/src/mesh.tet.generate.json b/assets/icons/src/mesh.tet.generate.json new file mode 100644 index 0000000..7ecd4cb --- /dev/null +++ b/assets/icons/src/mesh.tet.generate.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 3 L3 19 L21 19 Z", "fill": "soft", "stroke": "line"}, {"d": "M12 3 L14 14 M3 19 L14 14 M21 19 L14 14", "stroke": "accent", "width": 1.25}]} diff --git a/assets/icons/src/mesh.transition.json b/assets/icons/src/mesh.transition.json new file mode 100644 index 0000000..569ba12 --- /dev/null +++ b/assets/icons/src/mesh.transition.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 4, 18, 16], "fill": "soft", "stroke": "line"}, {"d": "M7.5 4 L7.5 20 M3 9.33 L12 9.33 M3 14.67 L12 14.67", "stroke": "line", "width": 1}, {"d": "M12 4 L21 9.33 L12 14.67 L21 20 M12 14.67 L21 14.67 M12 4 L21 4", "stroke": "line", "width": 1}, {"d": "M12 4 L12 20", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/mesh.untangle.json b/assets/icons/src/mesh.untangle.json new file mode 100644 index 0000000..53113f3 --- /dev/null +++ b/assets/icons/src/mesh.untangle.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 4 L11 11 L11 4 L3 11 Z", "stroke": "line", "width": 1.25}, {"d": "M8 14 L12 18 M8.93 17.1 L12 18 L11.1 14.93", "stroke": "accent", "width": 1.5}, {"rect": [13, 12, 8, 8], "fill": "soft", "stroke": "accent"}]} diff --git a/assets/icons/src/mesh.verify.json b/assets/icons/src/mesh.verify.json new file mode 100644 index 0000000..dc9e79c --- /dev/null +++ b/assets/icons/src/mesh.verify.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 12, 12], "fill": "soft", "stroke": "line"}, {"d": "M9 3 L9 15 M3 9 L15 9 M3 9 L9 3 M3 15 L9 9 M9 9 L15 3 M9 15 L15 9", "stroke": "line", "width": 1}, {"d": "M13.5 17 L16 19.5 L21 14", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/model.activity.json b/assets/icons/src/model.activity.json new file mode 100644 index 0000000..01ccf0a --- /dev/null +++ b/assets/icons/src/model.activity.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 4, 18, 16], "radius": 1, "stroke": "line"}, {"d": "M3 9 L21 9 M3 14.5 L21 14.5 M9 4 L9 20 M15 4 L15 20", "stroke": "line", "width": 1}, {"rect": [10, 10, 4, 3.5], "fill": "accent", "stroke": null}, {"rect": [16, 15.5, 4, 3.5], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/model.amplitude.json b/assets/icons/src/model.amplitude.json new file mode 100644 index 0000000..a0964cc --- /dev/null +++ b/assets/icons/src/model.amplitude.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 12 L21 12 M3 4 L3 20", "stroke": "line", "width": 1}, {"d": "M3 12 L3.38 10.83 L3.75 9.7 L4.12 8.67 L4.5 7.76 L4.88 7.01 L5.25 6.46 L5.62 6.12 L6 6 L6.38 6.12 L6.75 6.46 L7.12 7.01 L7.5 7.76 L7.88 8.67 L8.25 9.7 L8.62 10.83 L9 12 L9.38 13.17 L9.75 14.3 L10.12 15.33 L10.5 16.24 L10.88 16.99 L11.25 17.54 L11.62 17.88 L12 18 L12.38 17.88 L12.75 17.54 L13.12 16.99 L13.5 16.24 L13.88 15.33 L14.25 14.3 L14.62 13.17 L15 12 L15.38 10.83 L15.75 9.7 L16.12 8.67 L16.5 7.76 L16.88 7.01 L17.25 6.46 L17.62 6.12 L18 6 L18.38 6.12 L18.75 6.46 L19.12 7.01 L19.5 7.76 L19.88 8.67 L20.25 9.7 L20.62 10.83 L21 12", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/model.boundary_condition.create.json b/assets/icons/src/model.boundary_condition.create.json new file mode 100644 index 0000000..4a454b6 --- /dev/null +++ b/assets/icons/src/model.boundary_condition.create.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 6 L6 16 L18 16 Z", "fill": "soft", "stroke": "accent"}, {"circle": [12, 6, 1.8], "fill": "accent", "stroke": null}, {"d": "M4 19 L20 19 M5 19 L3 21.5 M8 19 L6 21.5 M11 19 L9 21.5 M14 19 L12 21.5 M17 19 L15 21.5 M20 19 L18 21.5", "stroke": "line"}]} diff --git a/assets/icons/src/model.check.json b/assets/icons/src/model.check.json new file mode 100644 index 0000000..8609be7 --- /dev/null +++ b/assets/icons/src/model.check.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [5, 4, 14, 17], "radius": 1.5, "fill": "soft", "stroke": "line"}, {"rect": [9, 2.5, 6, 3], "radius": 1, "fill": "soft", "stroke": "line"}, {"d": "M8.5 13.5 L11 16 L16 10.5", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/model.coupling.create.json b/assets/icons/src/model.coupling.create.json new file mode 100644 index 0000000..c6ee9e2 --- /dev/null +++ b/assets/icons/src/model.coupling.create.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 20 C8 15 16 15 21 20", "stroke": "line", "width": 1.25}, {"d": "M12 5 L4.5 18.5 M12 5 L8.5 16.3 M12 5 L12 15.8 M12 5 L15.5 16.3 M12 5 L19.5 18.5", "stroke": "accent", "width": 1}, {"circle": [12, 5, 2], "fill": "accent", "stroke": null}, {"circle": [4.5, 18.5, 1.2], "fill": "line", "stroke": null}, {"circle": [8.5, 16.3, 1.2], "fill": "line", "stroke": null}, {"circle": [12, 15.8, 1.2], "fill": "line", "stroke": null}, {"circle": [15.5, 16.3, 1.2], "fill": "line", "stroke": null}, {"circle": [19.5, 18.5, 1.2], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/model.info.json b/assets/icons/src/model.info.json new file mode 100644 index 0000000..fbea847 --- /dev/null +++ b/assets/icons/src/model.info.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 12, 9], "fill": "soft", "stroke": "line"}, {"circle": [12, 7.5, 1.5], "fill": "accent", "stroke": null}, {"d": "M12 11 L12 17", "stroke": "accent", "width": 2}]} diff --git a/assets/icons/src/model.load.create.json b/assets/icons/src/model.load.create.json new file mode 100644 index 0000000..de7097b --- /dev/null +++ b/assets/icons/src/model.load.create.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 16, 18, 4], "fill": "soft", "stroke": "line"}, {"d": "M12 3 L12 14 M10.32 10.93 L12 14 L13.68 10.93", "stroke": "warm", "width": 1.75}, {"d": "M6 7 L6 14 M4.8 11.81 L6 14 L7.2 11.81", "stroke": "warm", "width": 1.25}, {"d": "M18 7 L18 14 M16.8 11.81 L18 14 L19.2 11.81", "stroke": "warm", "width": 1.25}]} diff --git a/assets/icons/src/model.material.create.json b/assets/icons/src/model.material.create.json new file mode 100644 index 0000000..85e2b03 --- /dev/null +++ b/assets/icons/src/model.material.create.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 12, 9], "fill": "soft", "stroke": "line"}, {"d": "M7 9 A6 6 0 0 1 12 6", "stroke": "accent", "width": 1.75}, {"d": "M3.5 13 C8 16 16 16 20.5 13", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/model.material.damage.json b/assets/icons/src/model.material.damage.json new file mode 100644 index 0000000..e54217a --- /dev/null +++ b/assets/icons/src/model.material.damage.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [4, 3, 16, 18], "fill": "soft", "stroke": "line"}, {"d": "M8 3 L11 9 L9 12 L13 16 L12 21", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/model.material.eos.json b/assets/icons/src/model.material.eos.json new file mode 100644 index 0000000..a497848 --- /dev/null +++ b/assets/icons/src/model.material.eos.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L4 20 L21 20", "stroke": "line"}, {"d": "M6 4 C7 13 11 17 21 18", "stroke": "accent", "width": 1.75}, {"circle": [9.5, 12.6, 1.7], "fill": "warm", "stroke": null}]} diff --git a/assets/icons/src/model.material.hyperelastic.json b/assets/icons/src/model.material.hyperelastic.json new file mode 100644 index 0000000..d2385d8 --- /dev/null +++ b/assets/icons/src/model.material.hyperelastic.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L4 20 L21 20", "stroke": "line"}, {"d": "M4 20 C8 14 11 13 14 12 C17 11 19 7 20.5 3", "stroke": "accent", "width": 1.75}]} diff --git a/assets/icons/src/model.material.plasticity.json b/assets/icons/src/model.material.plasticity.json new file mode 100644 index 0000000..4ec7e0f --- /dev/null +++ b/assets/icons/src/model.material.plasticity.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L4 20 L21 20", "stroke": "line"}, {"d": "M4 20 L9 8 C11 5 14 5 21 4.5", "stroke": "accent", "width": 1.75}, {"d": "M9 8 L14 20", "stroke": "line", "width": 1, "dash": [1.5, 2]}]} diff --git a/assets/icons/src/model.material.thermal.json b/assets/icons/src/model.material.thermal.json new file mode 100644 index 0000000..bf016f5 --- /dev/null +++ b/assets/icons/src/model.material.thermal.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M10 15 V5 A2 2 0 0 1 14 5 V15", "stroke": "line"}, {"circle": [12, 17.5, 3.5], "fill": "warm", "stroke": "line"}, {"d": "M12 9 L12 15", "stroke": "warm", "width": 2}, {"d": "M16 6 L18 6 M16 9 L18 9 M16 12 L18 12", "stroke": "line", "width": 1.25}]} diff --git a/assets/icons/src/model.orientation.json b/assets/icons/src/model.orientation.json new file mode 100644 index 0000000..2b7151d --- /dev/null +++ b/assets/icons/src/model.orientation.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M8 16 L20 16 M17.19 17.53 L20 16 L17.19 14.47", "stroke": "accent", "width": 1.75}, {"d": "M8 16 L8 3 M9.53 5.81 L8 3 L6.47 5.81", "stroke": "line"}, {"d": "M8 16 L3 21 M3.9 17.93 L3 21 L6.07 20.1", "stroke": "line"}, {"circle": [8, 16, 1.5], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/model.reference_point.create.json b/assets/icons/src/model.reference_point.create.json new file mode 100644 index 0000000..638c3dc --- /dev/null +++ b/assets/icons/src/model.reference_point.create.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 12, 5.5], "stroke": "line"}, {"circle": [12, 12, 2], "fill": "accent", "stroke": null}, {"d": "M12 2.5 L12 6 M12 18 L12 21.5 M2.5 12 L6 12 M18 12 L21.5 12", "stroke": "line", "width": 1.5}]} diff --git a/assets/icons/src/model.section.composite.json b/assets/icons/src/model.section.composite.json new file mode 100644 index 0000000..683c0f4 --- /dev/null +++ b/assets/icons/src/model.section.composite.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 8 L9 4 L21 4 L15 8 Z", "fill": "soft", "stroke": "line"}, {"d": "M3 13 L9 9 L21 9 L15 13 Z", "fill": "soft", "stroke": "line"}, {"d": "M3 18 L9 14 L21 14 L15 18 Z", "fill": "soft", "stroke": "line"}, {"d": "M8 5.5 L12 5.5 M11 7 L15 4.5", "stroke": "accent", "width": 1}, {"d": "M7 16.5 L16 16.5 M10 15 L13 15", "stroke": "accent", "width": 1}, {"d": "M7 11 L14 11", "stroke": "accent", "width": 1}]} diff --git a/assets/icons/src/model.section.create.json b/assets/icons/src/model.section.create.json new file mode 100644 index 0000000..e8f4649 --- /dev/null +++ b/assets/icons/src/model.section.create.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M5 3 L19 3 L19 7 L14 7 L14 17 L19 17 L19 21 L5 21 L5 17 L10 17 L10 7 L5 7 Z", "fill": "soft", "stroke": "accent"}]} diff --git a/assets/icons/src/model.set.create.json b/assets/icons/src/model.set.create.json new file mode 100644 index 0000000..3908301 --- /dev/null +++ b/assets/icons/src/model.set.create.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M5 7 C8 2 18 3 20 8 C22 13 19 21 12 20 C5 19 2 12 5 7 Z", "fill": "soft", "stroke": "accent", "dash": [2.2, 2]}, {"circle": [9, 9, 1.6], "fill": "line", "stroke": null}, {"circle": [15, 8, 1.6], "fill": "line", "stroke": null}, {"circle": [13, 14, 1.6], "fill": "line", "stroke": null}, {"circle": [8, 15, 1.6], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/model.step.activate.json b/assets/icons/src/model.step.activate.json new file mode 100644 index 0000000..6faebde --- /dev/null +++ b/assets/icons/src/model.step.activate.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 7, 18, 10], "radius": 5, "fill": "soft", "stroke": "line"}, {"circle": [16, 12, 3.2], "fill": "accent", "stroke": "accent"}]} diff --git a/assets/icons/src/model.step.create.json b/assets/icons/src/model.step.create.json new file mode 100644 index 0000000..8df36a3 --- /dev/null +++ b/assets/icons/src/model.step.create.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 20 L8 20 L8 14 L13 14 L13 8 L18 8 L18 3", "stroke": "accent", "width": 1.75}, {"d": "M3 20 L21 20 M3 20 L3 3", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/model.step.explicit.json b/assets/icons/src/model.step.explicit.json new file mode 100644 index 0000000..183ab62 --- /dev/null +++ b/assets/icons/src/model.step.explicit.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 13.5, 7.5], "fill": "soft", "stroke": "line"}, {"d": "M10 3 L14 3 M12 3 L12 6", "stroke": "line", "width": 1.5}, {"d": "M12 13.5 L15.5 9.5", "stroke": "accent", "width": 1.75}, {"circle": [12, 13.5, 1.4], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/model.step.heat.json b/assets/icons/src/model.step.heat.json new file mode 100644 index 0000000..7d66578 --- /dev/null +++ b/assets/icons/src/model.step.heat.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 3 C15 7 19 10 18 15 C17 19 14 21 12 21 C9 21 6 19 6 15 C6 12 8 11 9 8 C10 10 11 11 12 11 C12 8 11 6 12 3 Z", "fill": "warm", "stroke": "line"}]} diff --git a/assets/icons/src/model.step.nonlinear.json b/assets/icons/src/model.step.nonlinear.json new file mode 100644 index 0000000..03822a0 --- /dev/null +++ b/assets/icons/src/model.step.nonlinear.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L4 20 L21 20", "stroke": "line"}, {"d": "M4 20 C10 12 14 8 21 6", "stroke": "accent", "width": 1.75}, {"circle": [8, 15.5, 1.3], "fill": "line", "stroke": null}, {"circle": [12.5, 11.3, 1.3], "fill": "line", "stroke": null}, {"circle": [17, 8.2, 1.3], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/model.units.json b/assets/icons/src/model.units.json new file mode 100644 index 0000000..bb7aeb0 --- /dev/null +++ b/assets/icons/src/model.units.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 15 L15 3 L21 9 L9 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M6 12 L8.5 14.5 M8.25 9.75 L9.75 11.25 M10.5 7.5 L13 10 M12.75 5.25 L14.25 6.75 M15 3 L17.5 5.5", "stroke": "accent", "width": 1.25}]} diff --git a/assets/icons/src/results.animate.json b/assets/icons/src/results.animate.json new file mode 100644 index 0000000..d3d2a81 --- /dev/null +++ b/assets/icons/src/results.animate.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 5, 18, 14], "radius": 2, "fill": "soft", "stroke": "line"}, {"d": "M10 9 L15.5 12 L10 15 Z", "fill": "accent", "stroke": "accent"}, {"d": "M3 8 L6 8 M3 16 L6 16 M18 8 L21 8 M18 16 L21 16", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/results.contour.json b/assets/icons/src/results.contour.json new file mode 100644 index 0000000..f6ffb4f --- /dev/null +++ b/assets/icons/src/results.contour.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 18, 18], "fill": "soft", "stroke": "line"}, {"d": "M3 9 C9 6 13 13 21 9 L21 3 L3 3 Z", "fill": "warm", "stroke": null}, {"d": "M3 15 C9 12 13 19 21 15 L21 9 C13 13 9 6 3 9 Z", "fill": "accent", "stroke": null}, {"rect": [3, 3, 18, 18], "stroke": "line"}]} diff --git a/assets/icons/src/results.convergence.json b/assets/icons/src/results.convergence.json new file mode 100644 index 0000000..03cbf92 --- /dev/null +++ b/assets/icons/src/results.convergence.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L4 20 L21 20", "stroke": "line"}, {"d": "M4 7 L21 7", "stroke": "line", "width": 1, "dash": [1.5, 1.5]}, {"d": "M5 19 C8 10 12 8 21 7.5", "stroke": "accent", "width": 1.5}, {"circle": [6, 15.6, 1.4], "fill": "accent", "stroke": null}, {"circle": [9, 11.4, 1.4], "fill": "accent", "stroke": null}, {"circle": [14, 8.6, 1.4], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/results.cut.json b/assets/icons/src/results.cut.json new file mode 100644 index 0000000..4a6b178 --- /dev/null +++ b/assets/icons/src/results.cut.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M12 3 L20 7 L20 16 L12 20 L4 16 L4 7 Z", "fill": "soft", "stroke": "line"}, {"d": "M4 7 L12 11 L20 7 M12 11 L12 20", "stroke": "line"}, {"d": "M8 3 L8 14 L16 22 L16 11 Z", "fill": "accent", "stroke": "accent", "width": 1}]} diff --git a/assets/icons/src/results.deformed.json b/assets/icons/src/results.deformed.json new file mode 100644 index 0000000..e5a02fe --- /dev/null +++ b/assets/icons/src/results.deformed.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 6, 18, 6], "dash": [1.5, 1.5], "stroke": "line", "width": 1}, {"d": "M3 6 C9 6 15 8 21 13 L21 19 C15 14 9 12 3 12 Z", "fill": "soft", "stroke": "accent"}]} diff --git a/assets/icons/src/results.display_group.json b/assets/icons/src/results.display_group.json new file mode 100644 index 0000000..c03ebbc --- /dev/null +++ b/assets/icons/src/results.display_group.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M2.5 12 C6 5.5 18 5.5 21.5 12 C18 18.5 6 18.5 2.5 12 Z", "fill": "soft", "stroke": "line"}, {"circle": [12, 12, 3.5], "fill": "accent", "stroke": "accent"}]} diff --git a/assets/icons/src/results.free_body.json b/assets/icons/src/results.free_body.json new file mode 100644 index 0000000..a461ccc --- /dev/null +++ b/assets/icons/src/results.free_body.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 6 L13 6 L13 18 L3 18 Z", "fill": "soft", "stroke": "line"}, {"d": "M13 4 L13 20", "stroke": "accent", "width": 1, "dash": [1.5, 1.5]}, {"d": "M13 9 L20 9 M17.81 10.2 L20 9 L17.81 7.8", "stroke": "warm", "width": 1.5}, {"d": "M13 15 L20 15 M17.81 16.2 L20 15 L17.81 13.8", "stroke": "warm", "width": 1.5}]} diff --git a/assets/icons/src/results.modes.json b/assets/icons/src/results.modes.json new file mode 100644 index 0000000..e31ef99 --- /dev/null +++ b/assets/icons/src/results.modes.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 12 L21 12", "stroke": "line", "width": 1, "dash": [1.5, 1.5]}, {"d": "M3 12 C6 4 9 4 12 12 C15 20 18 20 21 12", "stroke": "accent", "width": 1.75}, {"d": "M3 12 C7 6 17 6 21 12", "stroke": "line", "width": 1.25}, {"circle": [3, 12, 1.6], "fill": "line", "stroke": null}, {"circle": [21, 12, 1.6], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/results.path.json b/assets/icons/src/results.path.json new file mode 100644 index 0000000..ec00f13 --- /dev/null +++ b/assets/icons/src/results.path.json @@ -0,0 +1 @@ +{"shapes": [{"rect": [3, 3, 18, 18], "radius": 2, "fill": "soft", "stroke": "line"}, {"d": "M6 18 L10 9 L14 14 L18 6", "stroke": "accent", "width": 1.5}, {"circle": [6, 18, 1.6], "fill": "accent", "stroke": null}, {"circle": [10, 9, 1.6], "fill": "accent", "stroke": null}, {"circle": [14, 14, 1.6], "fill": "accent", "stroke": null}, {"circle": [18, 6, 1.6], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/results.reactions.json b/assets/icons/src/results.reactions.json new file mode 100644 index 0000000..b0831eb --- /dev/null +++ b/assets/icons/src/results.reactions.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M7 12 L3 19 L11 19 Z", "fill": "soft", "stroke": "line"}, {"d": "M2 21 L12 21", "stroke": "line", "width": 1.5}, {"d": "M7 11 L7 3 M8.34 5.46 L7 3 L5.66 5.46", "stroke": "warm", "width": 1.75}, {"d": "M20 4 L14 4 L17.5 8.5 L14 13 L20 13", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/results.read.json b/assets/icons/src/results.read.json new file mode 100644 index 0000000..89864ab --- /dev/null +++ b/assets/icons/src/results.read.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M8 3 L16 3 L20 7 L20 21 L8 21 Z", "fill": "soft", "stroke": "line"}, {"d": "M16 3 L16 7 L20 7", "stroke": "line"}, {"rect": [11, 13, 2, 5], "fill": "accent", "stroke": null}, {"rect": [14, 10, 2, 8], "fill": "accent", "stroke": null}, {"d": "M2 9 L9 9 M6.19 10.53 L9 9 L6.19 7.47", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/results.streamlines.json b/assets/icons/src/results.streamlines.json new file mode 100644 index 0000000..a014aef --- /dev/null +++ b/assets/icons/src/results.streamlines.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 7 C9 7 9 4 13 4 C17 4 17 7 21 7", "stroke": "accent", "width": 1.5}, {"d": "M3 12 C9 12 9 9 13 9 C17 9 17 12 21 12", "stroke": "accent", "width": 1.5}, {"d": "M3 17 C9 17 9 14 13 14 C17 14 17 17 21 17", "stroke": "accent", "width": 1.5}, {"d": "M18.72 18.25 L21 17 L18.72 15.75", "stroke": "accent"}, {"d": "M3 21 L21 21", "stroke": "line", "width": 1}]} diff --git a/assets/icons/src/results.xy.json b/assets/icons/src/results.xy.json new file mode 100644 index 0000000..bf5a98c --- /dev/null +++ b/assets/icons/src/results.xy.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M4 3 L4 20 L21 20", "stroke": "line"}, {"d": "M5 17 L9 12 L13 13 L17 7 L21 5", "stroke": "accent", "width": 1.5}, {"circle": [9, 12, 1.4], "fill": "accent", "stroke": null}, {"circle": [13, 13, 1.4], "fill": "accent", "stroke": null}, {"circle": [17, 7, 1.4], "fill": "accent", "stroke": null}]} diff --git a/assets/icons/src/solve.blast.json b/assets/icons/src/solve.blast.json new file mode 100644 index 0000000..3a56940 --- /dev/null +++ b/assets/icons/src/solve.blast.json @@ -0,0 +1 @@ +{"shapes": [{"star": [12, 12, 9.5, 4.5, 9], "fill": "warm", "stroke": "line", "width": 1.25}, {"circle": [12, 12, 2], "fill": "soft", "stroke": null}]} diff --git a/assets/icons/src/solve.explicit.json b/assets/icons/src/solve.explicit.json new file mode 100644 index 0000000..94baf45 --- /dev/null +++ b/assets/icons/src/solve.explicit.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M19 3 L19 21", "stroke": "line", "width": 2}, {"circle": [10, 12, 4], "fill": "soft", "stroke": "accent"}, {"d": "M2 9 L5 9 M1.5 12 L4.5 12 M2 15 L5 15", "stroke": "line", "width": 1.25}, {"d": "M15 8 L17 6 M15 16 L17 18", "stroke": "warm", "width": 1.25}]} diff --git a/assets/icons/src/solve.flow.json b/assets/icons/src/solve.flow.json new file mode 100644 index 0000000..05a3415 --- /dev/null +++ b/assets/icons/src/solve.flow.json @@ -0,0 +1 @@ +{"shapes": [{"circle": [12, 12, 3.5], "fill": "soft", "stroke": "line"}, {"d": "M3 6 C8 6 9 4.5 12 4.5 C15 4.5 16 6 21 6", "stroke": "accent", "width": 1.5}, {"d": "M3 18 C8 18 9 19.5 12 19.5 C15 19.5 16 18 21 18", "stroke": "accent", "width": 1.5}, {"d": "M3 12 L7 12 M17 12 L21 12", "stroke": "accent", "width": 1.5}]} diff --git a/assets/icons/src/solve.frequency.json b/assets/icons/src/solve.frequency.json new file mode 100644 index 0000000..66c5b4b --- /dev/null +++ b/assets/icons/src/solve.frequency.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 12 L21 12", "stroke": "line", "width": 1, "dash": [1.5, 1.5]}, {"d": "M3 12 C7 3 17 3 21 12", "stroke": "accent", "width": 1.75}, {"d": "M3 12 C7 21 17 21 21 12", "stroke": "line", "width": 1.25}, {"circle": [3, 12, 1.6], "fill": "line", "stroke": null}, {"circle": [21, 12, 1.6], "fill": "line", "stroke": null}]} diff --git a/assets/icons/src/solve.fsi.json b/assets/icons/src/solve.fsi.json new file mode 100644 index 0000000..0714e67 --- /dev/null +++ b/assets/icons/src/solve.fsi.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 6 L3.19 5.8 L3.38 5.61 L3.56 5.43 L3.75 5.25 L3.94 5.09 L4.12 4.94 L4.31 4.81 L4.5 4.7 L4.69 4.61 L4.88 4.55 L5.06 4.51 L5.25 4.5 L5.44 4.51 L5.62 4.55 L5.81 4.61 L6 4.7 L6.19 4.81 L6.38 4.94 L6.56 5.09 L6.75 5.25 L6.94 5.43 L7.12 5.61 L7.31 5.8 L7.5 6 L7.69 6.2 L7.88 6.39 L8.06 6.57 L8.25 6.75 L8.44 6.91 L8.62 7.06 L8.81 7.19 L9 7.3 L9.19 7.39 L9.38 7.45 L9.56 7.49 L9.75 7.5 L9.94 7.49 L10.12 7.45 L10.31 7.39 L10.5 7.3 L10.69 7.19 L10.88 7.06 L11.06 6.91 L11.25 6.75 L11.44 6.57 L11.62 6.39 L11.81 6.2 L12 6", "stroke": "accent", "width": 1.5}, {"d": "M3 12 L3.19 11.8 L3.38 11.61 L3.56 11.43 L3.75 11.25 L3.94 11.09 L4.12 10.94 L4.31 10.81 L4.5 10.7 L4.69 10.61 L4.88 10.55 L5.06 10.51 L5.25 10.5 L5.44 10.51 L5.62 10.55 L5.81 10.61 L6 10.7 L6.19 10.81 L6.38 10.94 L6.56 11.09 L6.75 11.25 L6.94 11.43 L7.12 11.61 L7.31 11.8 L7.5 12 L7.69 12.2 L7.88 12.39 L8.06 12.57 L8.25 12.75 L8.44 12.91 L8.62 13.06 L8.81 13.19 L9 13.3 L9.19 13.39 L9.38 13.45 L9.56 13.49 L9.75 13.5 L9.94 13.49 L10.12 13.45 L10.31 13.39 L10.5 13.3 L10.69 13.19 L10.88 13.06 L11.06 12.91 L11.25 12.75 L11.44 12.57 L11.62 12.39 L11.81 12.2 L12 12", "stroke": "accent", "width": 1.5}, {"d": "M3 18 L3.19 17.8 L3.38 17.61 L3.56 17.43 L3.75 17.25 L3.94 17.09 L4.12 16.94 L4.31 16.81 L4.5 16.7 L4.69 16.61 L4.88 16.55 L5.06 16.51 L5.25 16.5 L5.44 16.51 L5.62 16.55 L5.81 16.61 L6 16.7 L6.19 16.81 L6.38 16.94 L6.56 17.09 L6.75 17.25 L6.94 17.43 L7.12 17.61 L7.31 17.8 L7.5 18 L7.69 18.2 L7.88 18.39 L8.06 18.57 L8.25 18.75 L8.44 18.91 L8.62 19.06 L8.81 19.19 L9 19.3 L9.19 19.39 L9.38 19.45 L9.56 19.49 L9.75 19.5 L9.94 19.49 L10.12 19.45 L10.31 19.39 L10.5 19.3 L10.69 19.19 L10.88 19.06 L11.06 18.91 L11.25 18.75 L11.44 18.57 L11.62 18.39 L11.81 18.2 L12 18", "stroke": "accent", "width": 1.5}, {"d": "M15 21 C15 15 16 8 19 3", "stroke": "accent", "width": 2.25}, {"d": "M13 21 L19 21", "stroke": "line", "width": 1.5}, {"d": "M14 8 L17 8 M15.24 8.96 L17 8 L15.24 7.04", "stroke": "warm", "width": 1.25}]} diff --git a/assets/icons/src/solve.probe.json b/assets/icons/src/solve.probe.json new file mode 100644 index 0000000..e1156eb --- /dev/null +++ b/assets/icons/src/solve.probe.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 21 L10 14", "stroke": "line", "width": 1.75}, {"circle": [10, 14, 2], "fill": "accent", "stroke": null}, {"rect": [12, 3, 9, 7], "radius": 1.5, "fill": "soft", "stroke": "line"}, {"d": "M10 14 L13 10", "stroke": "line", "width": 1}, {"d": "M14.5 6.5 L18.5 6.5", "stroke": "accent", "width": 1.25}]} diff --git a/assets/icons/src/solve.static.json b/assets/icons/src/solve.static.json new file mode 100644 index 0000000..4387abb --- /dev/null +++ b/assets/icons/src/solve.static.json @@ -0,0 +1 @@ +{"shapes": [{"d": "M3 4 L3 14", "stroke": "line", "width": 2}, {"d": "M3 5 L1 7 M3 8 L1 10 M3 11 L1 13", "stroke": "line", "width": 1}, {"d": "M3 7 L21 7 L21 11 L3 11", "stroke": "line", "width": 1, "dash": [1.5, 1.5]}, {"d": "M3 7 C10 7 16 9 21 13 L21 17 C16 13 10 11 3 11 Z", "fill": "soft", "stroke": "accent"}, {"d": "M21 15 L21 21 M19.8 18.81 L21 21 L22.2 18.81", "stroke": "warm", "width": 1.5}]} diff --git a/crates/engine/src/catalogue.rs b/crates/engine/src/catalogue.rs new file mode 100644 index 0000000..5ef2803 --- /dev/null +++ b/crates/engine/src/catalogue.rs @@ -0,0 +1,450 @@ +//! The capability catalogue: everything ModelCraft does or will do, in one table. +//! +//! Each [`Capability`] is a toolbar entry: its tab and panel, its label and one-line tip, and +//! either the command of the same id it runs ([`Status::Ready`]) or the milestone that brings it +//! ([`Status::Planned`], shown greyed as "Coming soon"). Planned entries are not commands: a +//! command always runs. The icon of an entry is `assets/icons/.svg`. +//! +//! Every registered command is claimed here, as an entry's command or as one of its related +//! commands ([`Capability::more`], the entry's drop-down); the tests check it. A new command +//! claims its place by turning its planned entry into a ready one (or by adding an entry with +//! an icon), see `docs/features.md`. + +use std::fmt::Write; + +use serde::{Deserialize, Serialize}; + +/// The toolbar tabs, in the order of an analyst's workflow. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum Tab { + #[default] + Geometry, + Mesh, + Properties, + Assembly, + Steps, + Loads, + Interactions, + Solve, + Results, + Tools, +} + +impl Tab { + pub const ALL: [Tab; 10] = + [Tab::Geometry, Tab::Mesh, Tab::Properties, Tab::Assembly, Tab::Steps, Tab::Loads, Tab::Interactions, Tab::Solve, Tab::Results, Tab::Tools]; + + pub fn label(self) -> &'static str { + match self { + Tab::Geometry => "Geometry", + Tab::Mesh => "Mesh", + Tab::Properties => "Properties", + Tab::Assembly => "Assembly", + Tab::Steps => "Steps", + Tab::Loads => "Loads & BCs", + Tab::Interactions => "Interactions", + Tab::Solve => "Solve", + Tab::Results => "Results", + Tab::Tools => "Tools", + } + } +} + +/// Whether an entry runs today. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Status { + /// Runs the command whose id is the entry's. + Ready, + /// Coming in this roadmap milestone (`M2`…). + Planned { milestone: &'static str }, + /// Runs `deck.write` with this `format` once `modelcraft_decks::FORMATS` has a writer for it; + /// until then coming in `milestone`. + Deck { format: &'static str, milestone: &'static str }, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Capability { + /// Our own dotted id; also the icon's file name. + pub id: &'static str, + pub label: &'static str, + pub tab: Tab, + pub panel: &'static str, + /// One line: what it does. + pub tip: &'static str, + pub status: Status, + /// Related commands in the entry's drop-down (edit, delete…). + pub more: &'static [&'static str], +} + +impl Capability { + /// The command it runs; `None` while it is coming soon. + pub fn command(&self) -> Option<&'static str> { + match self.status { + Status::Ready => Some(self.id), + Status::Planned { .. } => None, + Status::Deck { format, .. } => modelcraft_decks::format(format).map(|_| crate::cmd::deck::WRITE.id), + } + } + + /// The parameters its command starts with (an object; empty for most entries). + pub fn preset(&self) -> serde_json::Value { + match self.status { + Status::Deck { format, .. } => serde_json::json!({ "format": format }), + Status::Ready | Status::Planned { .. } => serde_json::json!({}), + } + } + + /// The milestone that brings it, while it is coming soon. + pub fn milestone(&self) -> Option<&'static str> { + match self.status { + Status::Planned { milestone } => Some(milestone), + Status::Deck { milestone, .. } if self.command().is_none() => Some(milestone), + Status::Ready | Status::Deck { .. } => None, + } + } + + /// The hover text: label, tip and command, or when it comes. + pub fn tooltip(&self) -> String { + match (self.command(), self.milestone()) { + (Some(command), _) => format!("{}\n{}\n{command}", self.label, self.tip), + (None, m) => format!("{} — coming soon ({})\n{}", self.label, m.unwrap_or("later"), self.tip), + } + } +} + +const fn ready(id: &'static str, label: &'static str, tab: Tab, panel: &'static str, tip: &'static str) -> Capability { + Capability { id, label, tab, panel, tip, status: Status::Ready, more: &[] } +} + +const fn ready_more( + id: &'static str, + label: &'static str, + tab: Tab, + panel: &'static str, + tip: &'static str, + more: &'static [&'static str], +) -> Capability { + Capability { more, ..ready(id, label, tab, panel, tip) } +} + +const fn soon(id: &'static str, label: &'static str, tab: Tab, panel: &'static str, milestone: &'static str, tip: &'static str) -> Capability { + Capability { id, label, tab, panel, tip, status: Status::Planned { milestone }, more: &[] } +} + +const fn deck(id: &'static str, label: &'static str, format: &'static str, tip: &'static str) -> Capability { + Capability { id, label, tab: Tab::Solve, panel: "Decks", tip, status: Status::Deck { format, milestone: "M3" }, more: &[] } +} + +use Tab::*; + +/// Every capability in toolbar order: grouped by tab (in [`Tab::ALL`] order), then by panel. +pub static CATALOGUE: &[Capability] = &[ + // ---- Geometry ---- + ready("geometry.open", "Open Design", Geometry, "Import", "Open a SolidCraft design: its bodies with persistent face names"), + ready("geometry.import.mesh", "Tagged Mesh", Geometry, "Import", "Read a face-tagged surface mesh (3MF)"), + ready("geometry.bodies", "Bodies", Geometry, "Inspect", "List the open design's bodies, volumes and named faces"), + ready("geometry.tessellate", "Tessellate", Geometry, "Inspect", "Tessellate a body into a face-tagged boundary surface"), + ready( + "mesh.surface.check", + "Check Surface", + Geometry, + "Inspect", + "Weld, closed, manifold, orientation and self-intersection checks; feature edges", + ), + soon("geometry.partition", "Partition", Geometry, "Prepare", "M5", "Split bodies and faces as SolidCraft features"), + soon("geometry.datum", "Datum Plane", Geometry, "Prepare", "M5", "Construction planes for partitions"), + soon("geometry.midsurface", "Midsurface", Geometry, "Prepare", "M8", "Extract midsurfaces of thin parts for shell meshes"), + // ---- Mesh ---- + soon("mesh.size.global", "Global Size", Mesh, "Size", "M2", "One element size for the whole part"), + soon("mesh.size.seed", "Seed Edges", Mesh, "Size", "M2", "Element counts, sizes and bias per edge and face"), + soon("mesh.size.adapt", "Curvature", Mesh, "Size", "M2", "Refine by curvature and proximity"), + soon("mesh.tet.generate", "Tet Mesh", Mesh, "Tet", "M2", "Delaunay tetrahedral mesh of a body, boundary recovered and refined"), + soon("mesh.order.quadratic", "Quadratic", Mesh, "Tet", "M2", "Second-order elements with mid-side nodes on the geometry"), + ready("mesh.delaunay.points", "Delaunay Points", Mesh, "Tet", "Delaunay tetrahedralization of a point list (debugging aid)"), + soon("mesh.quad.faces", "Quad Faces", Mesh, "Structured Hex", "M5", "All-quad meshes of faces on shared edge nodes"), + soon("mesh.hex.mapped", "Mapped Hex", Mesh, "Structured Hex", "M5", "Mapped hex mesh of six-sided regions"), + soon("mesh.hex.sweep", "Sweep Hex", Mesh, "Structured Hex", "M5", "Hex mesh swept along extrusions and revolutions"), + soon("mesh.hex.decompose", "Decompose", Mesh, "Structured Hex", "M5", "Find sweepable and mappable regions and propose the splits"), + soon("mesh.transition", "Transition", Mesh, "Structured Hex", "M5", "Conforming tet–hex interfaces with pyramids"), + soon("mesh.hex.generate", "All-Hex", Mesh, "Automatic Hex", "M6", "Octree dual all-hex mesh of any part"), + soon("mesh.hex.dominant", "Hex-Dominant", Mesh, "Automatic Hex", "M6", "Hex-dominant mesh by recombining tets"), + soon("mesh.hex.polycube", "Polycube", Mesh, "Automatic Hex", "M6", "Polycube hex mesh of blocky parts"), + soon("mesh.smooth", "Smooth", Mesh, "Improve", "M6", "Smooth node positions, keeping every element valid"), + soon("mesh.untangle", "Untangle", Mesh, "Improve", "M6", "Repair inverted elements"), + soon("mesh.layers", "Layers", Mesh, "Improve", "M6", "Boundary padding and layers through thin walls"), + ready_more("mesh.node.add", "Node", Mesh, "Edit", "Add a node", &["mesh.node.remove"]), + ready_more("mesh.element.add", "Element", Mesh, "Edit", "Add an element on existing nodes", &["mesh.element.remove"]), + soon("mesh.node.merge", "Merge Nodes", Mesh, "Edit", "M6", "Merge coincident nodes"), + soon("mesh.region.remesh", "Remesh Region", Mesh, "Edit", "M6", "Remesh a region in place; split and collapse elements"), + soon("mesh.import.orphan", "Orphan Mesh", Mesh, "Edit", "M6", "Import a mesh without geometry"), + ready("mesh.quality", "Quality", Mesh, "Verify", "Quality metrics and the certified validity check, failing elements listed"), + soon("mesh.verify", "Verify Set", Mesh, "Verify", "M2", "Quality and validity per set"), + ready_more("mesh.tag", "Tag Geometry", Mesh, "Verify", "Tag elements, faces, edges and nodes with the geometry they mesh", &["mesh.tag.clear"]), + // ---- Properties ---- + ready_more( + "model.material.create", + "Material", + Properties, + "Materials", + "Elastic (isotropic, orthotropic) material with density", + &["model.material.edit", "model.material.delete"], + ), + soon("model.material.plasticity", "Plasticity", Properties, "Materials", "M8", "Plastic hardening data"), + soon("model.material.hyperelastic", "Hyperelastic", Properties, "Materials", "M8", "Hyperelastic material models"), + soon("model.material.damage", "Damage", Properties, "Materials", "M8", "Damage initiation and evolution"), + soon("model.material.thermal", "Thermal", Properties, "Materials", "M8", "Conductivity, specific heat and expansion"), + soon( + "model.material.eos", + "Equation of State", + Properties, + "Materials", + "M11", + "Polynomial, ideal gas, Mie–Grüneisen, JWL and tabulated equations of state", + ), + ready_more( + "model.section.create", + "Section", + Properties, + "Sections", + "Solid, shell, beam or rod section assigned to a set, with its element formulation", + &["model.section.edit", "model.section.delete"], + ), + soon("model.section.composite", "Composite", Properties, "Sections", "M8", "Composite layups and continuum shells"), + soon("model.orientation", "Orientation", Properties, "Sections", "M8", "Material orientations"), + ready_more( + "model.set.create", + "Set", + Properties, + "Sets", + "A set of nodes, elements and faces, or of named geometry that survives remeshing", + &["model.set.edit", "model.set.delete", "model.set.resolve"], + ), + ready("model.units", "Units", Properties, "Model", "The model's unit system (never converted)"), + // ---- Assembly ---- + soon("assembly.instance", "Instances", Assembly, "Instances", "M7", "Part instances placed from SolidCraft occurrences"), + // ---- Steps ---- + ready_more( + "model.step.create", + "Step", + Steps, + "Steps", + "A linear static or frequency step with its output", + &["model.step.edit", "model.step.delete"], + ), + ready("model.step.activate", "Activate", Steps, "Steps", "Choose which loads and boundary conditions act in a step"), + ready("model.activity", "Step Table", Steps, "Steps", "The step by load and boundary condition table"), + soon("model.amplitude", "Amplitude", Steps, "Procedures", "M7", "Time and frequency amplitudes"), + soon("model.step.nonlinear", "Nonlinear", Steps, "Procedures", "M7", "Nonlinear static steps"), + soon("model.step.explicit", "Explicit", Steps, "Procedures", "M8", "Explicit dynamic steps"), + soon("model.step.heat", "Heat Transfer", Steps, "Procedures", "M8", "Heat transfer steps"), + // ---- Loads & BCs ---- + ready_more( + "model.boundary_condition.create", + "Boundary Condition", + Loads, + "Boundary Conditions", + "Fixed, displacement or symmetry condition on a set or reference point", + &["model.boundary_condition.edit", "model.boundary_condition.delete"], + ), + ready_more( + "model.load.create", + "Load", + Loads, + "Loads", + "Force, moment, pressure, traction, gravity or body force", + &["model.load.edit", "model.load.delete"], + ), + soon("flow.domain", "Fluid Domain", Loads, "Flow", "M12", "The fluid grid voxelised from the face-tagged surface"), + soon("flow.boundary", "Inlet & Outlet", Loads, "Flow", "M12", "Velocity inlets, pressure outlets and walls"), + // ---- Interactions ---- + ready_more( + "model.reference_point.create", + "Reference Point", + Interactions, + "Constraints", + "A reference point for couplings, loads and boundary conditions", + &["model.reference_point.edit", "model.reference_point.delete"], + ), + ready_more( + "model.coupling.create", + "Coupling", + Interactions, + "Constraints", + "Kinematic or distributing coupling of a set to a reference point", + &["model.coupling.edit", "model.coupling.delete"], + ), + soon("interaction.tie", "Tie", Interactions, "Constraints", "M7", "Tie non-matching meshes together"), + soon("interaction.contact.general", "General Contact", Interactions, "Contact", "M7", "Contact between everything that touches, with friction"), + soon("interaction.contact.pair", "Contact Pair", Interactions, "Contact", "M7", "Contact between two surfaces"), + soon("interaction.contact.find", "Find Contacts", Interactions, "Contact", "M7", "Detect contact pairs automatically"), + soon("interaction.rigid_wall", "Rigid Wall", Interactions, "Contact", "M10", "Rigid walls for explicit dynamics"), + soon("interaction.bolt", "Bolt Load", Interactions, "Connectors", "M7", "Bolt pretension"), + soon("interaction.spring", "Spring", Interactions, "Connectors", "M7", "Springs and dashpots"), + soon("interaction.mass", "Point Mass", Interactions, "Connectors", "M7", "Point masses and inertia"), + soon("interaction.connector", "Connector", Interactions, "Connectors", "M7", "Connector elements between points"), + soon("interaction.fsi", "FSI Interface", Interactions, "Coupled", "M13", "The fluid–structure interface"), + // ---- Solve ---- + ready("model.check", "Check Model", Solve, "Check", "Name every missing or bad definition before writing or solving"), + deck("deck.write.abaqus", "Abaqus Input", "abaqus", "Write an Abaqus input file (.inp)"), + deck("deck.write.nastran", "Nastran Deck", "nastran", "Write Nastran bulk data (SOL 101, 103)"), + deck("deck.write.lsdyna", "LS-DYNA Deck", "lsdyna", "Write an LS-DYNA keyword file"), + soon("deck.read", "Read Deck", Solve, "Decks", "M9", "Read a deck, keeping keywords ModelCraft does not know"), + ready("solve.static", "Static", Solve, "Implicit", "Linear static solve of a step with ModelCraft's own solver"), + ready("solve.frequency", "Frequency", Solve, "Implicit", "Natural frequencies and mode shapes of a frequency step"), + soon("solve.explicit", "Explicit", Solve, "Explicit", "M10", "Explicit dynamics: central differences, contact, erosion"), + soon("solve.blast", "Blast & Impact", Solve, "Explicit", "M14", "EOS-driven fluids with fluid–structure contact (ALE or SPH)"), + soon("solve.flow", "Lattice Boltzmann", Solve, "Fluids", "M12", "Lattice Boltzmann flow on the CPU or the GPU"), + soon("solve.fsi", "Fluid–Structure", Solve, "Fluids", "M13", "Coupled fluid and structure solve"), + // ---- Results ---- + soon("results.deformed", "Deformed", Results, "Display", "M4", "The deformed shape"), + soon("results.contour", "Contours", Results, "Display", "M4", "Contour plots of stress, strain and displacement"), + soon("results.modes", "Mode Shapes", Results, "Display", "M4", "Mode shapes of a frequency step"), + soon("results.animate", "Animate", Results, "Display", "M9", "Animate modes and time histories"), + ready("solve.probe", "Probe", Results, "Query", "Displacement, reaction and stress at nodes, or a mode shape"), + soon("results.reactions", "Reactions", Results, "Query", "M4", "Reaction force and moment sums"), + soon("results.free_body", "Free Body", Results, "Query", "M9", "Free-body forces across a cut"), + soon("results.xy", "XY Plot", Results, "Plots", "M9", "Plot a quantity against time or another"), + soon("results.path", "Path Plot", Results, "Plots", "M9", "Plot a quantity along a path"), + soon("results.cut", "Cut", Results, "Plots", "M9", "Section cuts through the model"), + soon("results.display_group", "Display Group", Results, "Plots", "M9", "Show and hide parts of the model"), + soon("results.streamlines", "Streamlines", Results, "Plots", "M12", "Streamlines and flow fields"), + soon("results.read", "Read Results", Results, "Files", "M9", "Read results in public formats"), + soon("results.convergence", "Convergence", Results, "Files", "M9", "Mesh convergence studies"), + // ---- Tools ---- + ready("model.info", "Model Info", Tools, "Model", "Node and element counts and the model summary"), + ready("file.open", "Open Model", Tools, "File", "Open a .modelcraft model"), + ready("file.save", "Save", Tools, "File", "Save the model to its .modelcraft file"), + ready("file.save_as", "Save As", Tools, "File", "Save the model to a new .modelcraft file"), + ready_more( + "file.recover", + "Recover", + Tools, + "File", + "Open a model autosaved by an app that crashed or closed with unsaved changes", + &["file.recovery.list", "file.recovery.discard"], + ), + ready("edit.undo", "Undo", Tools, "History", "Undo the last command that changed the model"), + ready("edit.redo", "Redo", Tools, "History", "Redo the command undone last"), +]; + +/// The catalogue entry with this id. +pub fn find(id: &str) -> Option<&'static Capability> { + CATALOGUE.iter().find(|c| c.id == id) +} + +/// The entries of a tab (one run of the catalogue). +pub fn tab_entries(tab: Tab) -> &'static [Capability] { + let start = CATALOGUE.iter().position(|c| c.tab == tab).unwrap_or(CATALOGUE.len()); + let rest = CATALOGUE.get(start..).unwrap_or_default(); + rest.get(..rest.iter().take_while(|c| c.tab == tab).count()).unwrap_or_default() +} + +/// The panels of a tab in order, each the run of its entries (never empty). +pub fn panels(tab: Tab) -> impl Iterator { + tab_entries(tab).chunk_by(|a, b| a.panel == b.panel) +} + +/// `docs/features.md`: every capability by tab and panel, ready or coming soon. +pub fn features_page() -> String { + let ready = CATALOGUE.iter().filter(|c| c.command().is_some()).count(); + let mut md = String::from( + "# Features\n\n\ + Generated from the capability catalogue (`crates/engine/src/catalogue.rs`) by\n\ + `cargo run -p modelcraft-cli -- features > docs/features.md`; a test fails when it is out of date.\n\ + Every entry is a toolbar button. **Ready** entries run their command; **coming soon** entries are\n\ + shown greyed with the roadmap milestone that brings them (ROADMAP.md).\n\n", + ); + let _ = writeln!(md, "{ready} ready, {} coming soon.", CATALOGUE.len() - ready); + for tab in Tab::ALL { + let _ = write!(md, "\n## {}\n\n| Panel | Capability | Status | Command |\n|---|---|---|---|\n", tab.label()); + for c in tab_entries(tab) { + let status = c.milestone().map_or_else(|| "ready".to_string(), |m| format!("coming soon ({m})")); + let preset = c.preset(); + let main = + c.command().map(|id| if preset.as_object().is_some_and(|o| !o.is_empty()) { format!("`{id} {preset}`") } else { format!("`{id}`") }); + let commands: Vec = main.into_iter().chain(c.more.iter().map(|id| format!("`{id}`"))).collect(); + let _ = writeln!(md, "| {} | {} — {} | {status} | {} |", c.panel, c.label, c.tip, commands.join(", ")); + } + } + md +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{commands, find_command}; + + #[test] + fn every_command_is_claimed_and_every_ready_entry_runs_a_command() { + let mut claimed: Vec<&str> = Vec::new(); + for c in CATALOGUE { + if let Some(command) = c.command() { + assert!(find_command(command).is_some(), "{}: `{command}` is not a registered command", c.id); + claimed.push(command); + } else { + assert!(c.more.is_empty(), "{}: a planned entry has no commands", c.id); + } + for m in c.more { + assert!(find_command(m).is_some(), "{}: `{m}` is not a registered command", c.id); + claimed.push(m); + } + } + for spec in commands() { + let n = claimed.iter().filter(|c| **c == spec.id).count(); + assert!(n >= 1, "command `{}` has no catalogue entry (a ready entry or an entry's `more`)", spec.id); + } + } + + /// Deck entries follow the writers: one entry per format, ready exactly when its writer is in + /// `modelcraft_decks::FORMATS`, running `deck.write` with its format. + #[test] + fn deck_entries_follow_the_writers() { + let decks: Vec<(&Capability, &str)> = + CATALOGUE.iter().filter_map(|c| if let Status::Deck { format, .. } = c.status { Some((c, format)) } else { None }).collect(); + for f in modelcraft_decks::FORMATS { + assert!(decks.iter().any(|(_, name)| *name == f.name), "deck format `{}` has no catalogue entry", f.name); + } + for (c, format) in decks { + let written = modelcraft_decks::format(format).is_some(); + assert_eq!(c.command(), written.then_some("deck.write"), "{}", c.id); + assert_eq!(c.milestone().is_none(), written, "{}", c.id); + assert_eq!(c.preset(), serde_json::json!({"format": format})); + } + assert_eq!(find("deck.write.abaqus").and_then(Capability::command), Some("deck.write")); + } + + #[test] + fn entries_are_well_formed() { + let mut ids: Vec<&str> = CATALOGUE.iter().map(|c| c.id).collect(); + for c in CATALOGUE { + assert!(c.id.split('.').count() >= 2 && c.id.chars().all(|ch| ch.is_ascii_lowercase() || ch == '.' || ch == '_'), "{}", c.id); + assert!(!c.label.is_empty() && !c.panel.is_empty() && !c.tip.is_empty(), "{}", c.id); + if let Some(m) = c.milestone() { + assert!(m.strip_prefix('M').is_some_and(|n| n.parse::().is_ok_and(|n| (1..=14).contains(&n))), "{}: {m}", c.id); + } + } + ids.sort_unstable(); + let n = ids.len(); + ids.dedup(); + assert_eq!(ids.len(), n, "catalogue ids are unique"); + // Tabs are runs in Tab::ALL order, and each panel is one run within its tab. + let total: usize = Tab::ALL.iter().map(|t| tab_entries(*t).len()).sum(); + assert_eq!(total, CATALOGUE.len(), "every tab's entries are together, in Tab::ALL order"); + let order: Vec = + CATALOGUE.iter().map(|c| c.tab).collect::>().chunk_by(|a, b| a == b).filter_map(|r| r.first().copied()).collect(); + assert_eq!(order, Tab::ALL); + for tab in Tab::ALL { + let names: Vec<&str> = panels(tab).filter_map(|p| p.first().map(|c| c.panel)).collect(); + assert!(!names.is_empty(), "{tab:?} has no entries"); + assert!(names.iter().enumerate().all(|(i, n)| !names[..i].contains(n)), "{tab:?}: a panel's entries are together: {names:?}"); + } + } + + #[test] + fn features_page_is_current() { + let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../../docs/features.md"); + let committed = std::fs::read_to_string(&path).unwrap_or_default().replace("\r\n", "\n"); + assert!(committed == features_page(), "docs/features.md is out of date: run `cargo run -p modelcraft-cli -- features > docs/features.md`"); + } +} diff --git a/crates/engine/src/lib.rs b/crates/engine/src/lib.rs index 1dab7e5..6f2f318 100644 --- a/crates/engine/src/lib.rs +++ b/crates/engine/src/lib.rs @@ -13,6 +13,7 @@ #![forbid(unsafe_code)] pub mod autosave; +pub mod catalogue; pub mod cmd; pub mod history; pub mod sample; diff --git a/crates/ui-egui/Cargo.toml b/crates/ui-egui/Cargo.toml index 91cd008..b8aeb7a 100644 --- a/crates/ui-egui/Cargo.toml +++ b/crates/ui-egui/Cargo.toml @@ -17,3 +17,4 @@ egui-wgpu = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } log = { workspace = true } +resvg = { workspace = true } diff --git a/crates/ui-egui/build.rs b/crates/ui-egui/build.rs new file mode 100644 index 0000000..31e05fd --- /dev/null +++ b/crates/ui-egui/build.rs @@ -0,0 +1,23 @@ +//! Embeds the toolbar icons: `assets/icons/*.svg` become `ICONS`, a sorted `(id, svg)` table +//! (`src/icons.rs`). + +use std::fmt::Write; +use std::path::PathBuf; + +fn main() -> Result<(), Box> { + let manifest = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR")?); + let dir = manifest.join("../../assets/icons"); + println!("cargo:rerun-if-changed={}", dir.display()); + let mut ids: Vec = + std::fs::read_dir(&dir)?.flatten().filter_map(|e| e.file_name().to_str().and_then(|n| n.strip_suffix(".svg")).map(str::to_string)).collect(); + ids.sort(); + let mut out = String::from("/// Every toolbar icon by catalogue id, sorted by id.\npub static ICONS: &[(&str, &str)] = &[\n"); + for id in &ids { + let path = dir.join(format!("{id}.svg")); + println!("cargo:rerun-if-changed={}", path.display()); + let _ = writeln!(out, " ({id:?}, include_str!({:?})),", path.display().to_string()); + } + out.push_str("];\n"); + std::fs::write(PathBuf::from(std::env::var("OUT_DIR")?).join("icons.rs"), out)?; + Ok(()) +} diff --git a/crates/ui-egui/src/control.rs b/crates/ui-egui/src/control.rs index 880f5d0..3b1f079 100644 --- a/crates/ui-egui/src/control.rs +++ b/crates/ui-egui/src/control.rs @@ -114,6 +114,7 @@ pub fn handle(app: &mut ModelApp, ctx: &egui::Context, req: &ControlRequest) -> "model": {"nodes": app.session.model.nodes().len(), "elements": app.session.model.elements().len()}, "version": crate::VERSION, })), + "ui.toolbar" => ok(crate::toolbar::describe(app)), "ui.set" => { let mut cur = serde_json::to_value(&app.ui).unwrap_or(json!({})); if let (Some(o), Some(src)) = (cur.as_object_mut(), p.as_object()) { @@ -367,6 +368,8 @@ mod tests { json!({"width": 1e12, "height": -5, "path": ""}), json!({"command": 5, "params": "x", "commands": {"a": 1}}), json!({"key": "NoSuchKey", "text": 7, "view": null, "points": [[1], "x", null]}), + json!({"tab": "nope", "command": "mesh.tet.generate"}), + json!({"tab": 3}), ]; for method in [ "engine.execute", @@ -384,6 +387,7 @@ mod tests { "ui.worldToScreen", "ui.resize", "ui.render", + "ui.toolbar", ] { for p in &hostile { let _ = call(&mut app, method, p.clone()); @@ -392,6 +396,21 @@ mod tests { assert!(app.synthetic.len() < 1000); } + #[test] + fn the_toolbar_lists_every_entry_and_switches_tabs() { + let mut app = ModelApp::new(Session::default()); + assert_eq!(call(&mut app, "ui.set", json!({"tab": "mesh"}))["ok"], true); + let r = call(&mut app, "ui.toolbar", json!({})); + assert_eq!(r["result"]["tab"], "mesh", "{r}"); + let entries = r["result"]["entries"].as_array().unwrap(); + assert_eq!(entries.len(), modelcraft_engine::catalogue::CATALOGUE.len()); + let tet = entries.iter().find(|e| e["id"] == "mesh.tet.generate").unwrap(); + assert_eq!((tet["coming_soon"].as_str(), tet["command"].is_null()), (Some("M2"), true)); + assert_eq!(call(&mut app, "ui.set", json!({"tab": "nope"}))["ok"], false); + let r = call(&mut app, "ui.start", json!({"command": "mesh.tet.generate"})); + assert_eq!((r["ok"].as_bool(), r["error"].as_str()), (Some(false), Some("Tet Mesh is coming soon (M2)"))); + } + #[test] fn screenshots_are_saved_as_png() { let image = egui::ColorImage::filled([4, 3], egui::Color32::RED); diff --git a/crates/ui-egui/src/icons.rs b/crates/ui-egui/src/icons.rs new file mode 100644 index 0000000..5cf1ee6 --- /dev/null +++ b/crates/ui-egui/src/icons.rs @@ -0,0 +1,132 @@ +//! Toolbar icons: original artwork drawn with VectorCraft (`assets/icons`, `cargo xtask icons`), +//! embedded at build time and rasterised with resvg. +//! +//! Icons are drawn in four palette roles, each in one fixed colour (the dark theme's). Before +//! rasterising, every role colour is replaced by the theme token it stands for, so the same SVG +//! serves the dark and light themes and the greyed "coming soon" state. Textures are cached per +//! icon, theme, state and pixel size. + +use std::collections::HashMap; + +use egui::{Color32, TextureHandle}; +use resvg::{tiny_skia, usvg}; + +use crate::theme::Tokens; + +include!(concat!(env!("OUT_DIR"), "/icons.rs")); + +/// The palette roles' colours in the SVG files. Keep in step with `PALETTE` in +/// `xtask/src/icons.rs`. +pub const PALETTE: [&str; 4] = ["#dde2ea", "#4f9ce8", "#2d4e70", "#f0b44a"]; + +/// Largest icon side rasterised (pixels). +const MAX_PX: u32 = 256; + +/// The icon's SVG text. +pub fn svg(id: &str) -> Option<&'static str> { + ICONS.binary_search_by(|(k, _)| (*k).cmp(id)).ok().and_then(|i| ICONS.get(i)).map(|(_, s)| *s) +} + +/// The colours the palette roles (line, accent, soft, warm) take in a theme, greyed when the +/// entry is not available yet. +pub fn colours(t: &Tokens, enabled: bool) -> [Color32; 4] { + if enabled { [t.text, t.accent, t.accent_soft, t.warm] } else { [t.text_dim, t.text_dim, t.panel_header, t.text_dim] } +} + +/// The SVG with each palette colour replaced by its role's colour. +pub fn recolour(svg: &str, colours: [Color32; 4]) -> String { + let mut out = svg.to_string(); + for (from, to) in PALETTE.iter().zip(colours) { + let hex = format!("#{:02x}{:02x}{:02x}", to.r(), to.g(), to.b()); + out = out.replace(&format!("\"{from}\""), &format!("\"{hex}\"")); + } + out +} + +/// Rasterise an SVG to a `px` × `px` image. +pub fn rasterise(svg: &str, px: u32) -> Result { + let px = px.clamp(1, MAX_PX); + let tree = usvg::Tree::from_str(svg, &usvg::Options::default()).map_err(|e| e.to_string())?; + let mut pixmap = tiny_skia::Pixmap::new(px, px).ok_or("empty icon")?; + let size = tree.size(); + let scale = px as f32 / size.width().max(size.height()).max(f32::EPSILON); + resvg::render(&tree, tiny_skia::Transform::from_scale(scale, scale), &mut pixmap.as_mut()); + Ok(egui::ColorImage::from_rgba_premultiplied([px as usize, px as usize], pixmap.data())) +} + +/// Icon textures by (id, enabled) for one theme and pixel size; `None` when the icon is missing +/// or does not rasterise, so it is not tried again every frame. A change of theme or size +/// (zoom) drops the old textures. +#[derive(Default)] +pub struct IconCache { + theme_px: Option<(bool, u32)>, + textures: HashMap<(&'static str, bool), Option>, +} + +impl IconCache { + pub fn get(&mut self, ctx: &egui::Context, id: &'static str, dark: bool, enabled: bool, px: u32) -> Option { + if self.theme_px != Some((dark, px)) { + self.textures.clear(); + self.theme_px = Some((dark, px)); + } + self.textures + .entry((id, enabled)) + .or_insert_with(|| { + let svg = svg(id)?; + let image = rasterise(&recolour(svg, colours(&Tokens::get(dark), enabled)), px).map_err(|e| log::warn!("icon {id}: {e}")).ok()?; + Some(ctx.load_texture(format!("icon:{id}:{dark}:{enabled}:{px}"), image, egui::TextureOptions::LINEAR)) + }) + .clone() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use modelcraft_engine::catalogue::CATALOGUE; + + #[test] + fn every_catalogue_entry_has_an_icon_and_every_icon_an_entry() { + for c in CATALOGUE { + assert!(svg(c.id).is_some(), "no icon assets/icons/{}.svg", c.id); + } + for (id, _) in ICONS { + assert!(CATALOGUE.iter().any(|c| c.id == *id), "assets/icons/{id}.svg belongs to no catalogue entry"); + } + assert!(ICONS.windows(2).all(|w| w[0].0 < w[1].0), "sorted for the binary search"); + } + + /// Icons use only the palette, so recolouring reaches every colour, and they rasterise. + #[test] + fn icons_use_only_palette_colours_and_rasterise() { + for (id, text) in ICONS { + for part in text.split('"').skip(1).step_by(2) { + if part.starts_with('#') { + assert!(PALETTE.contains(&part), "{id}: colour {part} is not in the palette"); + } + } + let image = rasterise(text, 24).unwrap(); + assert!(image.pixels.iter().any(|p| p.a() > 0), "{id} draws nothing"); + } + } + + /// The SVG colours are the dark theme's own, so the dark theme draws icons as authored. + #[test] + fn the_palette_is_the_dark_themes_colours() { + let hex: Vec = colours(&Tokens::dark(), true).iter().map(|c| format!("#{:02x}{:02x}{:02x}", c.r(), c.g(), c.b())).collect(); + assert_eq!(hex, PALETTE); + } + + #[test] + fn recolouring_follows_the_theme_and_greys_planned_entries() { + let svg = r##""##; + let light = Tokens::light(); + let out = recolour(svg, colours(&light, true)); + assert!(out.contains("stroke=\"#1f6fc4\"") && out.contains("fill=\"#c6dcf4\""), "{out}"); + let grey = recolour(svg, colours(&light, false)); + let dim = light.text_dim; + assert!(grey.contains(&format!("stroke=\"#{:02x}{:02x}{:02x}\"", dim.r(), dim.g(), dim.b())), "{grey}"); + assert!(rasterise("not svg", 24).is_err()); + assert_eq!(rasterise(svg, 100_000).unwrap().size, [MAX_PX as usize; 2]); + } +} diff --git a/crates/ui-egui/src/lib.rs b/crates/ui-egui/src/lib.rs index b9be209..c42e30b 100644 --- a/crates/ui-egui/src/lib.rs +++ b/crates/ui-egui/src/lib.rs @@ -13,14 +13,17 @@ pub mod control; pub mod gpu; +pub mod icons; pub mod panels; pub mod scene; pub mod theme; +pub mod toolbar; pub mod viewport; use std::sync::mpsc::{Receiver, Sender}; use modelcraft_engine::Session; +use modelcraft_engine::catalogue::{self, Tab}; use modelcraft_render::{Camera, DisplayMesh, Scene, StandardView}; use serde::{Deserialize, Serialize}; use serde_json::{Value, json}; @@ -41,11 +44,21 @@ pub struct UiState { pub dark: bool, pub show_tree: bool, pub show_commands: bool, + /// The toolbar tab shown. + pub tab: Tab, } impl Default for UiState { fn default() -> Self { - UiState { style: Style::ShadedEdges, show_nodes: false, perspective: false, dark: true, show_tree: true, show_commands: true } + UiState { + style: Style::ShadedEdges, + show_nodes: false, + perspective: false, + dark: true, + show_tree: true, + show_commands: true, + tab: Tab::default(), + } } } @@ -102,6 +115,9 @@ pub struct ModelApp { pub status: Option, pub dialog: Option, pub viewport: Viewport, + pub icons: icons::IconCache, + /// The toolbar's buttons drawn last frame, by catalogue id (for the control channel). + pub toolbar_rects: Vec<(&'static str, egui::Rect, toolbar::Fit)>, /// The GPU adapter, for the status bar and diagnostics. pub gpu_info: Option, /// Bumped whenever the model may have changed. @@ -131,6 +147,8 @@ impl ModelApp { status: None, dialog: None, viewport: Viewport::default(), + icons: icons::IconCache::default(), + toolbar_rects: Vec::new(), gpu_info: None, revision: 0, display: (None, DisplayMesh::default()), @@ -200,15 +218,29 @@ impl ModelApp { r } - /// What clicking a command in the Commands panel does: a command without parameters runs, - /// one with parameters opens its form. Programmatic calls use [`ModelApp::run`] instead. + /// What clicking a toolbar entry or a command in the Commands panel does: a command without + /// parameters runs, one with parameters opens its form. `id` is a command or a catalogue + /// entry; an entry that is coming soon does nothing and says when it comes. Programmatic calls + /// use [`ModelApp::run`] instead. pub fn start(&mut self, id: &str) -> Result<(), String> { - let spec = modelcraft_engine::find_command(id).ok_or_else(|| format!("unknown command `{id}`"))?; + let (command, preset) = match catalogue::find(id) { + Some(c) => match c.command() { + Some(command) => (command, c.preset()), + None => { + let e = format!("{} is coming soon ({})", c.label, c.milestone().unwrap_or("later")); + self.set_status(e.clone(), false); + return Err(e); + } + }, + None => (id, json!({})), + }; + let spec = modelcraft_engine::find_command(command).ok_or_else(|| format!("unknown command `{command}`"))?; if spec.params.trim() == "{}" { self.dialog = None; self.run(spec.id, json!({})).map(|_| ()) } else { - self.dialog = Some(ParamsDialog { command: spec.id, text: "{}".into(), error: None }); + // The form starts with the entry's preset; the rest (a path…) is filled in there. + self.dialog = Some(ParamsDialog { command: spec.id, text: preset.to_string(), error: None }); Ok(()) } } @@ -360,6 +392,7 @@ impl ModelApp { pub fn ui(&mut self, ui: &mut egui::Ui) { self.show_gpu_errors(); panels::menu_bar(self, ui); + toolbar::toolbar(self, ui); panels::status_bar(self, ui); if self.ui.show_tree { panels::model_tree(self, ui); @@ -480,6 +513,24 @@ mod tests { assert!(app.start("no.such").is_err()); } + #[test] + fn toolbar_entries_start_their_command_and_planned_ones_do_nothing() { + let mut app = ModelApp::new(Session::default()); + app.start("model.material.create").unwrap(); + assert_eq!(app.dialog.as_ref().map(|d| d.command), Some("model.material.create")); + app.dialog = None; + let journal = app.session.journal.len(); + let err = app.start("mesh.tet.generate").unwrap_err(); + assert_eq!(err, "Tet Mesh is coming soon (M2)"); + assert!(app.dialog.is_none()); + assert_eq!(app.session.journal.len(), journal); + assert_eq!(app.status.as_ref().map(|s| s.error), Some(false)); + // A deck entry opens deck.write's form with its format filled in. + app.start("deck.write.abaqus").unwrap(); + let d = app.dialog.as_ref().unwrap(); + assert_eq!((d.command, d.text.as_str()), ("deck.write", r#"{"format":"abaqus"}"#)); + } + #[test] fn the_sample_fills_the_view_and_renders() { let mut app = ModelApp::new(Session::default()); diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 053aa9c..9f25a60 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -22,6 +22,8 @@ pub struct Tokens { pub hover: Color32, pub error: Color32, pub ok: Color32, + /// Loads and heat in icons. + pub warm: Color32, // ---- viewport ---- /// Background gradient, top and bottom. pub viewport_top: Color32, @@ -62,6 +64,7 @@ impl Tokens { hover: Color32::from_rgb(0x3c, 0x43, 0x4f), error: Color32::from_rgb(0xf0, 0x6c, 0x64), ok: Color32::from_rgb(0x8c, 0xc8, 0x8c), + warm: Color32::from_rgb(0xf0, 0xb4, 0x4a), viewport_top: Color32::from_rgb(0x3a, 0x41, 0x4d), viewport_bottom: Color32::from_rgb(0x1e, 0x22, 0x28), overlay: Color32::from_rgba_unmultiplied_const(0x1c, 0x20, 0x26, 0xd0), @@ -93,6 +96,7 @@ impl Tokens { hover: Color32::from_rgb(0xd8, 0xde, 0xe6), error: Color32::from_rgb(0xc0, 0x30, 0x28), ok: Color32::from_rgb(0x2c, 0x7a, 0x3a), + warm: Color32::from_rgb(0xc0, 0x7a, 0x14), viewport_top: Color32::from_rgb(0xf0, 0xf3, 0xf7), viewport_bottom: Color32::from_rgb(0xc8, 0xd0, 0xdc), overlay: Color32::from_rgba_unmultiplied_const(0xea, 0xee, 0xf3, 0xe0), diff --git a/crates/ui-egui/src/toolbar.rs b/crates/ui-egui/src/toolbar.rs new file mode 100644 index 0000000..0d40cbb --- /dev/null +++ b/crates/ui-egui/src/toolbar.rs @@ -0,0 +1,283 @@ +//! The toolbar: one tab per stage of the analyst's workflow, each a row of panels of icon buttons, +//! all from the capability catalogue (`modelcraft_engine::catalogue`). +//! +//! When the window is too narrow for labelled buttons, every panel goes icon-only (the label is +//! in the tooltip), then panels collapse from the right into one drop-down button each. +//! +//! A ready entry starts its command (the same as the Commands panel: a command without +//! parameters runs, one with parameters opens its form); its related commands (edit, delete…) +//! are in the drop-down beside it. A planned entry is drawn greyed with its milestone and does +//! nothing; its tooltip says when it comes. Structure follows SolidCraft's +//! `crates/ui-egui/src/toolbar.rs` (MIT OR Apache-2.0), see ATTRIBUTION.md. + +use std::sync::Arc; + +use egui::{Align2, FontId, Galley, Rect, RichText, Sense, Stroke, vec2}; +use modelcraft_engine::catalogue::{self, Capability, Tab}; +use serde::Serialize; + +use crate::ModelApp; +use crate::theme::Tokens; + +/// Icon side (points). +const ICON: f32 = 24.0; +/// Button height with its label, and the width the label wraps at (points). +const BUTTON_H: f32 = 60.0; +const LABEL_W: f32 = 64.0; +/// A button without its label (compact panels). +const COMPACT: f32 = ICON + 12.0; +/// The drop-down strip beside a button with related commands. +const ARROW_W: f32 = 12.0; +/// A collapsed panel: one button that opens the list of its entries. +const COLLAPSED_W: f32 = COMPACT + ARROW_W; +/// Room a panel separator takes. +const PANEL_GAP: f32 = 13.0; +/// Room between buttons of a panel. +const BUTTON_GAP: f32 = 2.0; + +/// How a panel is drawn on a toolbar that may be too narrow for every labelled button. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum Fit { + /// Icon and label. + Full, + /// Icon only; the label is in the tooltip. + Compact, + /// One button that lists the panel's entries. + Collapsed, +} + +/// Fit panels into `room`: every panel in full when they all fit; otherwise every panel compact, +/// then panels wider than a collapsed one collapse from the right until the row fits. Nothing is +/// dropped. +pub fn fit(full: &[f32], compact: &[f32], room: f32) -> Vec { + let total = |widths: &mut dyn Iterator| -> f32 { widths.map(|w| w + PANEL_GAP).sum() }; + if total(&mut full.iter().copied()) <= room { + return vec![Fit::Full; full.len()]; + } + let mut fits = vec![Fit::Compact; compact.len()]; + for i in (0..fits.len()).rev() { + let width = total(&mut compact.iter().zip(&fits).map(|(w, f)| if *f == Fit::Collapsed { COLLAPSED_W } else { *w })); + if width <= room { + break; + } + if let (Some(f), Some(w)) = (fits.get_mut(i), compact.get(i)) + && *w > COLLAPSED_W + { + *f = Fit::Collapsed; + } + } + fits +} + +/// An entry's label laid out under its icon (at most two lines). +fn label(ui: &egui::Ui, t: &Tokens, c: &Capability) -> Arc { + let colour = if c.command().is_some() { t.text } else { t.text_dim }; + let mut job = egui::text::LayoutJob::simple(c.label.to_string(), FontId::proportional(11.0), colour, LABEL_W); + job.wrap.max_rows = 2; + job.halign = egui::Align::Center; + ui.painter().layout_job(job) +} + +fn arrow_w(c: &Capability) -> f32 { + if c.command().is_some() && !c.more.is_empty() { ARROW_W } else { 0.0 } +} + +fn panel_width(widths: impl Iterator) -> f32 { + let (sum, n) = widths.fold((0.0, 0usize), |(s, n), w| (s + w, n + 1)); + sum + BUTTON_GAP * n.saturating_sub(1) as f32 +} + +pub fn toolbar(app: &mut ModelApp, ui: &mut egui::Ui) { + let t = Tokens::get(app.ui.dark); + let mut action = None; + egui::Panel::top("mc_toolbar").frame(egui::Frame::NONE.fill(t.panel).inner_margin(egui::Margin::symmetric(8, 4))).show(ui, |ui| { + ui.horizontal(|ui| { + for tab in Tab::ALL { + let text = RichText::new(tab.label()).color(if app.ui.tab == tab { t.accent } else { t.text }); + if ui.selectable_label(app.ui.tab == tab, text).clicked() { + app.ui.tab = tab; + } + } + }); + ui.add_space(2.0); + app.toolbar_rects.clear(); + let panels: Vec<&'static [Capability]> = catalogue::panels(app.ui.tab).collect(); + let labels: Vec>> = panels.iter().map(|p| p.iter().map(|c| label(ui, &t, c)).collect()).collect(); + let full: Vec = panels + .iter() + .zip(&labels) + .map(|(p, l)| panel_width(p.iter().zip(l).map(|(c, g)| g.size().x.max(ICON + 12.0) + 8.0 + arrow_w(c)))) + .collect(); + let compact: Vec = panels.iter().map(|p| panel_width(p.iter().map(|c| COMPACT + arrow_w(c)))).collect(); + let fits = fit(&full, &compact, ui.available_width()); + ui.horizontal(|ui| { + for (i, ((entries, galleys), fit)) in panels.iter().zip(labels).zip(&fits).enumerate() { + let Some(panel) = entries.first().map(|c| c.panel) else { continue }; + if i > 0 { + ui.separator(); + } + ui.vertical(|ui| { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = BUTTON_GAP; + let clicked = match fit { + Fit::Collapsed => collapsed(app, ui, &t, panel, entries), + Fit::Full | Fit::Compact => { + let mut clicked = None; + for (c, galley) in entries.iter().zip(galleys) { + let galley = (*fit == Fit::Full).then_some(galley); + clicked = button(app, ui, &t, c, galley).or(clicked); + } + clicked + } + }; + action = clicked.or(action); + }); + let width = ui.min_rect().width(); + ui.allocate_ui(vec2(width, 14.0), |ui| { + ui.centered_and_justified(|ui| ui.add(egui::Label::new(RichText::new(panel).small().color(t.text_dim)).truncate())); + }); + }); + } + }); + }); + if let Some(id) = action { + // Errors already show in the status bar. + let _ = app.start(id); + } +} + +fn icon(app: &mut ModelApp, ui: &egui::Ui, t: &Tokens, c: &'static Capability, rect: Rect) { + let px = (ICON * ui.ctx().pixels_per_point()).round() as u32; + let p = ui.painter(); + match app.icons.get(ui.ctx(), c.id, app.ui.dark, c.command().is_some(), px) { + Some(tex) => p.image(tex.id(), rect, Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)), egui::Color32::WHITE), + None => p.rect_stroke(rect.shrink(3.0), 3.0, Stroke::new(1.0, t.text_dim), egui::StrokeKind::Inside), + }; +} + +/// One entry's button, with its label when `label` is given; returns the id to start when it +/// (or its drop-down) was clicked. +fn button(app: &mut ModelApp, ui: &mut egui::Ui, t: &Tokens, c: &'static Capability, label: Option>) -> Option<&'static str> { + let enabled = c.command().is_some(); + let size = match &label { + Some(g) => vec2(g.size().x.max(ICON + 12.0) + 8.0, BUTTON_H), + None => vec2(COMPACT, COMPACT), + }; + let (rect, resp) = ui.allocate_exact_size(size, if enabled { Sense::click() } else { Sense::hover() }); + app.toolbar_rects.push((c.id, rect, if label.is_some() { Fit::Full } else { Fit::Compact })); + if resp.hovered() && enabled { + ui.painter().rect_filled(rect, 4.0, t.hover); + } + let icon_rect = Rect::from_center_size(egui::pos2(rect.center().x, rect.top() + 6.0 + ICON / 2.0), vec2(ICON, ICON)); + icon(app, ui, t, c, icon_rect); + let p = ui.painter(); + if let Some(g) = label { + p.galley(egui::pos2(rect.center().x, icon_rect.bottom() + 4.0), g, t.text); + } + if let Some(m) = c.milestone() { + let text = p.layout_no_wrap(m.to_string(), FontId::proportional(9.0), t.text); + let badge = Rect::from_min_size(egui::pos2(rect.right() - text.size().x - 4.0, rect.top()), text.size() + vec2(4.0, 0.0)); + p.rect_filled(badge, 3.0, t.panel_header); + p.rect_stroke(badge, 3.0, Stroke::new(1.0, t.border), egui::StrokeKind::Inside); + p.galley(badge.min + vec2(2.0, 0.0), text, t.text); + } + let resp = resp.on_hover_ui(|ui| { + ui.label(c.tooltip()); + }); + let mut action = resp.clicked().then_some(c.id); + if enabled && !c.more.is_empty() { + let (arrow, arrow_resp) = ui.allocate_exact_size(vec2(ARROW_W, size.y), Sense::click()); + if arrow_resp.hovered() { + ui.painter().rect_filled(arrow, 4.0, t.hover); + } + ui.painter().text(arrow.center(), Align2::CENTER_CENTER, "▾", FontId::proportional(11.0), t.text_dim); + let arrow_resp = arrow_resp.on_hover_text(format!("More {} commands", c.label)); + egui::Popup::menu(&arrow_resp).show(|ui| { + for id in c.more { + if ui.button(crate::command_label(id)).clicked() { + action = Some(*id); + } + } + }); + } + action +} + +/// A collapsed panel: its first entry's icon and a drop-down listing every entry (and their +/// related commands), coming-soon ones greyed with their milestone. +fn collapsed(app: &mut ModelApp, ui: &mut egui::Ui, t: &Tokens, panel: &str, entries: &'static [Capability]) -> Option<&'static str> { + let first = entries.first()?; + let (rect, resp) = ui.allocate_exact_size(vec2(COLLAPSED_W, COMPACT), Sense::click()); + for c in entries { + app.toolbar_rects.push((c.id, rect, Fit::Collapsed)); + } + if resp.hovered() { + ui.painter().rect_filled(rect, 4.0, t.hover); + } + icon(app, ui, t, first, Rect::from_min_size(rect.min + vec2(6.0, 6.0), vec2(ICON, ICON))); + ui.painter().text(egui::pos2(rect.right() - ARROW_W / 2.0, rect.center().y), Align2::CENTER_CENTER, "▾", FontId::proportional(11.0), t.text_dim); + let resp = resp.on_hover_text(panel); + let mut action = None; + egui::Popup::menu(&resp).show(|ui| { + for c in entries { + match c.milestone() { + Some(m) => { + ui.add_enabled(false, egui::Button::new(format!("{} — coming soon ({m})", c.label))); + } + None => { + if ui.button(c.label).on_hover_text(c.tip).clicked() { + action = Some(c.id); + } + for id in c.more { + if ui.button(format!(" {}", crate::command_label(id))).clicked() { + action = Some(*id); + } + } + } + } + } + }); + action +} + +/// The toolbar as the control channel reports it: the tabs, the current tab, and every entry +/// with its status and, on the current tab, its button (screen points, last frame). +pub fn describe(app: &ModelApp) -> serde_json::Value { + let entries: Vec = catalogue::CATALOGUE + .iter() + .map(|c| { + let shown = app.toolbar_rects.iter().find(|(id, ..)| *id == c.id); + let rect = shown.map(|(_, r, _)| [r.left(), r.top(), r.width(), r.height()]); + serde_json::json!({ + "id": c.id, + "label": c.label, + "tab": c.tab, + "panel": c.panel, + "command": c.command(), + "more": c.more, + "coming_soon": c.milestone(), + "rect": rect, + "fit": shown.map(|(.., f)| f), + }) + }) + .collect(); + serde_json::json!({"tab": app.ui.tab, "tabs": Tab::ALL, "entries": entries}) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn panels_go_compact_then_collapse_from_the_right() { + let full = [200.0, 300.0, 100.0]; + let compact = [80.0, 120.0, 40.0]; + assert_eq!(fit(&full, &compact, 700.0), vec![Fit::Full; 3]); + assert_eq!(fit(&full, &compact, 400.0), vec![Fit::Compact; 3]); + // The last panel is narrower compact than collapsed, so the middle one goes first. + assert_eq!(fit(&full, &compact, 230.0), vec![Fit::Compact, Fit::Collapsed, Fit::Compact]); + assert_eq!(fit(&full, &compact, 10.0), vec![Fit::Collapsed, Fit::Collapsed, Fit::Compact], "nothing is dropped"); + assert!(fit(&[], &[], 0.0).is_empty()); + } +} diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 86dfb27..e53d285 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -35,9 +35,10 @@ Commands never open forms when run this way. `modelcraft-cli commands` prints th | Method | Params | Notes | |---|---|---| | `ui.inspect` | — | view settings (`ui`), camera, viewport rect (points), renderer (`gpu`/`cpu`) and adapter, open command form, status bar, node and element counts, version | -| `ui.set` | any view setting: `style` (`shaded_edges`, `shaded`, `wireframe`), `show_nodes`, `perspective`, `dark`, `show_tree`, `show_commands` | an unknown setting or value is an error; returns the settings | +| `ui.set` | any view setting: `style` (`shaded_edges`, `shaded`, `wireframe`), `show_nodes`, `perspective`, `dark`, `show_tree`, `show_commands`, `tab` (the toolbar tab: `geometry`, `mesh`, `properties`, `assembly`, `steps`, `loads`, `interactions`, `solve`, `results`, `tools`) | an unknown setting or value is an error; returns the settings | | `ui.view` | `view`: `front`, `back`, `left`, `right`, `top`, `bottom`, `iso`, `home` (iso and fit), `fit` | returns the camera | -| `ui.start` | `command` | like clicking the command in the Commands panel: a command without parameters runs, one with parameters opens its form | +| `ui.toolbar` | — | the toolbar (`ui.set {tab}` switches tabs): `tab`, `tabs`, and every catalogue entry (docs/features.md) with `id`, `label`, `tab`, `panel`, `command` (null while coming soon), `more` (its drop-down's commands), `coming_soon` (the milestone, or null), `rect` (its button in screen points last frame, on the shown tab; a collapsed panel's entries share its drop-down button) and `fit` (`full`, `compact` icon-only, or `collapsed` into the panel's drop-down, by window width) | +| `ui.start` | `command`: a command or toolbar entry id | like clicking it on the toolbar or in the Commands panel: a command without parameters runs, one with parameters opens its form; an entry that is coming soon is an error naming its milestone | | `ui.dialog` | `params?` (JSON object, fills the form), `run?`, `cancel?` | drives the open command form; `run` returns the command's result and closes the form on success | | `ui.click` | `x`, `y` (screen points), `button?`: `left`/`right`/`middle`, `shift?`, `ctrl?`, `alt?`, `double?` | real pointer input | | `ui.move` | `x`, `y` | | diff --git a/docs/features.md b/docs/features.md new file mode 100644 index 0000000..3468cc0 --- /dev/null +++ b/docs/features.md @@ -0,0 +1,158 @@ +# Features + +Generated from the capability catalogue (`crates/engine/src/catalogue.rs`) by +`cargo run -p modelcraft-cli -- features > docs/features.md`; a test fails when it is out of date. +Every entry is a toolbar button. **Ready** entries run their command; **coming soon** entries are +shown greyed with the roadmap milestone that brings them (ROADMAP.md). + +35 ready, 65 coming soon. + +## Geometry + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Import | Open Design — Open a SolidCraft design: its bodies with persistent face names | ready | `geometry.open` | +| Import | Tagged Mesh — Read a face-tagged surface mesh (3MF) | ready | `geometry.import.mesh` | +| Inspect | Bodies — List the open design's bodies, volumes and named faces | ready | `geometry.bodies` | +| Inspect | Tessellate — Tessellate a body into a face-tagged boundary surface | ready | `geometry.tessellate` | +| Inspect | Check Surface — Weld, closed, manifold, orientation and self-intersection checks; feature edges | ready | `mesh.surface.check` | +| Prepare | Partition — Split bodies and faces as SolidCraft features | coming soon (M5) | | +| Prepare | Datum Plane — Construction planes for partitions | coming soon (M5) | | +| Prepare | Midsurface — Extract midsurfaces of thin parts for shell meshes | coming soon (M8) | | + +## Mesh + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Size | Global Size — One element size for the whole part | coming soon (M2) | | +| Size | Seed Edges — Element counts, sizes and bias per edge and face | coming soon (M2) | | +| Size | Curvature — Refine by curvature and proximity | coming soon (M2) | | +| Tet | Tet Mesh — Delaunay tetrahedral mesh of a body, boundary recovered and refined | coming soon (M2) | | +| Tet | Quadratic — Second-order elements with mid-side nodes on the geometry | coming soon (M2) | | +| Tet | Delaunay Points — Delaunay tetrahedralization of a point list (debugging aid) | ready | `mesh.delaunay.points` | +| Structured Hex | Quad Faces — All-quad meshes of faces on shared edge nodes | coming soon (M5) | | +| Structured Hex | Mapped Hex — Mapped hex mesh of six-sided regions | coming soon (M5) | | +| Structured Hex | Sweep Hex — Hex mesh swept along extrusions and revolutions | coming soon (M5) | | +| Structured Hex | Decompose — Find sweepable and mappable regions and propose the splits | coming soon (M5) | | +| Structured Hex | Transition — Conforming tet–hex interfaces with pyramids | coming soon (M5) | | +| Automatic Hex | All-Hex — Octree dual all-hex mesh of any part | coming soon (M6) | | +| Automatic Hex | Hex-Dominant — Hex-dominant mesh by recombining tets | coming soon (M6) | | +| Automatic Hex | Polycube — Polycube hex mesh of blocky parts | coming soon (M6) | | +| Improve | Smooth — Smooth node positions, keeping every element valid | coming soon (M6) | | +| Improve | Untangle — Repair inverted elements | coming soon (M6) | | +| Improve | Layers — Boundary padding and layers through thin walls | coming soon (M6) | | +| Edit | Node — Add a node | ready | `mesh.node.add`, `mesh.node.remove` | +| Edit | Element — Add an element on existing nodes | ready | `mesh.element.add`, `mesh.element.remove` | +| Edit | Merge Nodes — Merge coincident nodes | coming soon (M6) | | +| Edit | Remesh Region — Remesh a region in place; split and collapse elements | coming soon (M6) | | +| Edit | Orphan Mesh — Import a mesh without geometry | coming soon (M6) | | +| Verify | Quality — Quality metrics and the certified validity check, failing elements listed | ready | `mesh.quality` | +| Verify | Verify Set — Quality and validity per set | coming soon (M2) | | +| Verify | Tag Geometry — Tag elements, faces, edges and nodes with the geometry they mesh | ready | `mesh.tag`, `mesh.tag.clear` | + +## Properties + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Materials | Material — Elastic (isotropic, orthotropic) material with density | ready | `model.material.create`, `model.material.edit`, `model.material.delete` | +| Materials | Plasticity — Plastic hardening data | coming soon (M8) | | +| Materials | Hyperelastic — Hyperelastic material models | coming soon (M8) | | +| Materials | Damage — Damage initiation and evolution | coming soon (M8) | | +| Materials | Thermal — Conductivity, specific heat and expansion | coming soon (M8) | | +| Materials | Equation of State — Polynomial, ideal gas, Mie–Grüneisen, JWL and tabulated equations of state | coming soon (M11) | | +| Sections | Section — Solid, shell, beam or rod section assigned to a set, with its element formulation | ready | `model.section.create`, `model.section.edit`, `model.section.delete` | +| Sections | Composite — Composite layups and continuum shells | coming soon (M8) | | +| Sections | Orientation — Material orientations | coming soon (M8) | | +| Sets | Set — A set of nodes, elements and faces, or of named geometry that survives remeshing | ready | `model.set.create`, `model.set.edit`, `model.set.delete`, `model.set.resolve` | +| Model | Units — The model's unit system (never converted) | ready | `model.units` | + +## Assembly + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Instances | Instances — Part instances placed from SolidCraft occurrences | coming soon (M7) | | + +## Steps + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Steps | Step — A linear static or frequency step with its output | ready | `model.step.create`, `model.step.edit`, `model.step.delete` | +| Steps | Activate — Choose which loads and boundary conditions act in a step | ready | `model.step.activate` | +| Steps | Step Table — The step by load and boundary condition table | ready | `model.activity` | +| Procedures | Amplitude — Time and frequency amplitudes | coming soon (M7) | | +| Procedures | Nonlinear — Nonlinear static steps | coming soon (M7) | | +| Procedures | Explicit — Explicit dynamic steps | coming soon (M8) | | +| Procedures | Heat Transfer — Heat transfer steps | coming soon (M8) | | + +## Loads & BCs + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Boundary Conditions | Boundary Condition — Fixed, displacement or symmetry condition on a set or reference point | ready | `model.boundary_condition.create`, `model.boundary_condition.edit`, `model.boundary_condition.delete` | +| Loads | Load — Force, moment, pressure, traction, gravity or body force | ready | `model.load.create`, `model.load.edit`, `model.load.delete` | +| Flow | Fluid Domain — The fluid grid voxelised from the face-tagged surface | coming soon (M12) | | +| Flow | Inlet & Outlet — Velocity inlets, pressure outlets and walls | coming soon (M12) | | + +## Interactions + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Constraints | Reference Point — A reference point for couplings, loads and boundary conditions | ready | `model.reference_point.create`, `model.reference_point.edit`, `model.reference_point.delete` | +| Constraints | Coupling — Kinematic or distributing coupling of a set to a reference point | ready | `model.coupling.create`, `model.coupling.edit`, `model.coupling.delete` | +| Constraints | Tie — Tie non-matching meshes together | coming soon (M7) | | +| Contact | General Contact — Contact between everything that touches, with friction | coming soon (M7) | | +| Contact | Contact Pair — Contact between two surfaces | coming soon (M7) | | +| Contact | Find Contacts — Detect contact pairs automatically | coming soon (M7) | | +| Contact | Rigid Wall — Rigid walls for explicit dynamics | coming soon (M10) | | +| Connectors | Bolt Load — Bolt pretension | coming soon (M7) | | +| Connectors | Spring — Springs and dashpots | coming soon (M7) | | +| Connectors | Point Mass — Point masses and inertia | coming soon (M7) | | +| Connectors | Connector — Connector elements between points | coming soon (M7) | | +| Coupled | FSI Interface — The fluid–structure interface | coming soon (M13) | | + +## Solve + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Check | Check Model — Name every missing or bad definition before writing or solving | ready | `model.check` | +| Decks | Abaqus Input — Write an Abaqus input file (.inp) | ready | `deck.write {"format":"abaqus"}` | +| Decks | Nastran Deck — Write Nastran bulk data (SOL 101, 103) | ready | `deck.write {"format":"nastran"}` | +| Decks | LS-DYNA Deck — Write an LS-DYNA keyword file | ready | `deck.write {"format":"lsdyna"}` | +| Decks | Read Deck — Read a deck, keeping keywords ModelCraft does not know | coming soon (M9) | | +| Implicit | Static — Linear static solve of a step with ModelCraft's own solver | ready | `solve.static` | +| Implicit | Frequency — Natural frequencies and mode shapes of a frequency step | ready | `solve.frequency` | +| Explicit | Explicit — Explicit dynamics: central differences, contact, erosion | coming soon (M10) | | +| Explicit | Blast & Impact — EOS-driven fluids with fluid–structure contact (ALE or SPH) | coming soon (M14) | | +| Fluids | Lattice Boltzmann — Lattice Boltzmann flow on the CPU or the GPU | coming soon (M12) | | +| Fluids | Fluid–Structure — Coupled fluid and structure solve | coming soon (M13) | | + +## Results + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Display | Deformed — The deformed shape | coming soon (M4) | | +| Display | Contours — Contour plots of stress, strain and displacement | coming soon (M4) | | +| Display | Mode Shapes — Mode shapes of a frequency step | coming soon (M4) | | +| Display | Animate — Animate modes and time histories | coming soon (M9) | | +| Query | Probe — Displacement, reaction and stress at nodes, or a mode shape | ready | `solve.probe` | +| Query | Reactions — Reaction force and moment sums | coming soon (M4) | | +| Query | Free Body — Free-body forces across a cut | coming soon (M9) | | +| Plots | XY Plot — Plot a quantity against time or another | coming soon (M9) | | +| Plots | Path Plot — Plot a quantity along a path | coming soon (M9) | | +| Plots | Cut — Section cuts through the model | coming soon (M9) | | +| Plots | Display Group — Show and hide parts of the model | coming soon (M9) | | +| Plots | Streamlines — Streamlines and flow fields | coming soon (M12) | | +| Files | Read Results — Read results in public formats | coming soon (M9) | | +| Files | Convergence — Mesh convergence studies | coming soon (M9) | | + +## Tools + +| Panel | Capability | Status | Command | +|---|---|---|---| +| Model | Model Info — Node and element counts and the model summary | ready | `model.info` | +| File | Open Model — Open a .modelcraft model | ready | `file.open` | +| File | Save — Save the model to its .modelcraft file | ready | `file.save` | +| File | Save As — Save the model to a new .modelcraft file | ready | `file.save_as` | +| File | Recover — Open a model autosaved by an app that crashed or closed with unsaved changes | ready | `file.recover`, `file.recovery.list`, `file.recovery.discard` | +| History | Undo — Undo the last command that changed the model | ready | `edit.undo` | +| History | Redo — Redo the command undone last | ready | `edit.redo` | diff --git a/xtask/src/assets.rs b/xtask/src/assets.rs index b446d1d..e62655b 100644 --- a/xtask/src/assets.rs +++ b/xtask/src/assets.rs @@ -1,5 +1,5 @@ //! `cargo xtask assets`: every non-code asset in the repository must have a row in -//! ATTRIBUTION.md (author, source, licence). Icons are drawn in code and need no file. +//! ATTRIBUTION.md (author, source, licence), toolbar icons (`assets/icons`) included. use std::path::Path; diff --git a/xtask/src/icons.rs b/xtask/src/icons.rs new file mode 100644 index 0000000..7ef4724 --- /dev/null +++ b/xtask/src/icons.rs @@ -0,0 +1,156 @@ +//! `cargo xtask icons [ID…]`: draw the toolbar icons with VectorCraft. +//! +//! Each icon is a recipe, `assets/icons/src/.json`: a list of shapes on a 24 × 24 pixel +//! artboard, each a path (`d`), `circle` `[cx, cy, r]`, `rect` `[x, y, w, h]` (optional +//! `radius`), `line` `[x1, y1, x2, y2]` or `star` `[cx, cy, outer, inner, points]`, painted with +//! palette roles (`fill`, `stroke`: `line`, `accent`, `soft`, `warm`; a shape with neither is +//! stroked with `line`), an optional stroke `width` (default 1.5; round caps and joins) and +//! `dash` (`[dash, gap]`). The task turns every recipe into VectorCraft +//! commands, runs them headlessly with `vectorcraft-cli run` (`VECTORCRAFT_CLI`, else +//! `vectorcraft-cli` on the PATH) and writes `assets/icons/.vectorcraft` (the editable +//! source) and `assets/icons/.svg` (what the app draws). The roles' colours are the dark +//! theme's; the app recolours each role with its theme tokens (`crates/ui-egui/src/icons.rs`). + +use std::path::Path; +use std::process::Command; + +use serde_json::{Value, json}; + +/// Palette roles and the colour each is drawn in (the dark theme's tokens). Keep in step with +/// `PALETTE` in `crates/ui-egui/src/icons.rs`. +pub const PALETTE: &[(&str, &str)] = &[("line", "#dde2ea"), ("accent", "#4f9ce8"), ("soft", "#2d4e70"), ("warm", "#f0b44a")]; + +/// The artboard side (pixels) and the default stroke weight. +const SIZE: f64 = 24.0; +const STROKE: f64 = 1.5; + +pub fn run(root: &Path, only: &[&str]) -> Result<(), String> { + let dir = root.join("assets/icons"); + let src = dir.join("src"); + let mut recipes: Vec = std::fs::read_dir(&src) + .map_err(|e| format!("{}: {e}", src.display()))? + .flatten() + .filter_map(|e| e.file_name().to_str().and_then(|n| n.strip_suffix(".json")).map(str::to_string)) + .filter(|id| only.is_empty() || only.contains(&id.as_str())) + .collect(); + recipes.sort(); + if recipes.is_empty() { + return Err("no icon recipes to draw".into()); + } + let cli = std::env::var("VECTORCRAFT_CLI").unwrap_or_else(|_| "vectorcraft-cli".into()); + for id in &recipes { + let path = src.join(format!("{id}.json")); + let text = std::fs::read_to_string(&path).map_err(|e| format!("{}: {e}", path.display()))?; + let recipe: Value = serde_json::from_str(&text).map_err(|e| format!("{}: {e}", path.display()))?; + let steps = commands(id, &recipe, &dir.join(format!("{id}.vectorcraft"))).map_err(|e| format!("{id}: {e}"))?; + let mut c = Command::new(&cli); + c.arg("run"); + for (cmd, params) in &steps { + c.args(["--cmd", cmd, "--params", ¶ms.to_string()]); + } + c.arg("--export").arg(dir.join(format!("{id}.svg"))); + let out = c.output().map_err(|e| format!("{cli}: {e} (set VECTORCRAFT_CLI to the vectorcraft-cli binary)"))?; + if !out.status.success() { + return Err(format!("{id}: vectorcraft-cli failed:\n{}{}", String::from_utf8_lossy(&out.stdout), String::from_utf8_lossy(&out.stderr))); + } + } + println!("icons: drew {} icon(s) into assets/icons", recipes.len()); + Ok(()) +} + +fn colour(role: &Value) -> Result { + match role { + Value::Null => Ok(json!({"none": true})), + Value::String(r) => { + PALETTE.iter().find(|(name, _)| name == r).map(|(_, hex)| json!({"color": hex})).ok_or_else(|| format!("unknown role `{r}`")) + } + other => Err(format!("a role is a name, not {other}")), + } +} + +fn numbers(v: &Value) -> Result<[f64; N], String> { + let a = v.as_array().filter(|a| a.len() == N).ok_or_else(|| format!("expected {N} numbers, got {v}"))?; + let mut out = [0.0; N]; + for (o, x) in out.iter_mut().zip(a) { + *o = x.as_f64().filter(|x| x.is_finite()).ok_or_else(|| format!("expected numbers, got {v}"))?; + } + Ok(out) +} + +/// The VectorCraft commands that draw one recipe and save it to `source`. +fn commands(id: &str, recipe: &Value, source: &Path) -> Result, String> { + let shapes = recipe.get("shapes").and_then(Value::as_array).ok_or("a recipe is {\"shapes\": [...]}")?; + let mut out = vec![("file.new".to_string(), json!({"width": SIZE, "height": SIZE, "units": "Pixels", "name": id, "created": null}))]; + for s in shapes { + let create = if let Some(d) = s.get("d").and_then(Value::as_str) { + ("path.create", json!({"d": d})) + } else if let Some(c) = s.get("circle") { + let [cx, cy, r] = numbers::<3>(c)?; + ("shape.ellipse", json!({"x": cx - r, "y": cy - r, "width": 2.0 * r, "height": 2.0 * r})) + } else if let Some(r) = s.get("rect") { + let [x, y, width, height] = numbers::<4>(r)?; + let radius = s.get("radius").and_then(Value::as_f64).unwrap_or(0.0); + ("shape.rectangle", json!({"x": x, "y": y, "width": width, "height": height, "radius": radius})) + } else if let Some(l) = s.get("line") { + let [x1, y1, x2, y2] = numbers::<4>(l)?; + ("shape.line", json!({"x1": x1, "y1": y1, "x2": x2, "y2": y2})) + } else if let Some(st) = s.get("star") { + let [cx, cy, radius1, radius2, points] = numbers::<5>(st)?; + ("shape.star", json!({"cx": cx, "cy": cy, "radius1": radius1, "radius2": radius2, "points": points})) + } else { + return Err(format!("a shape needs `d`, `circle`, `rect`, `line` or `star`: {s}")); + }; + out.push((create.0.to_string(), create.1)); + let (fill, stroke) = match (s.get("fill"), s.get("stroke")) { + (None, None) => (Value::Null, json!("line")), + (f, st) => (f.cloned().unwrap_or(Value::Null), st.cloned().unwrap_or(Value::Null)), + }; + out.push(("paint.setFill".into(), colour(&fill)?)); + out.push(("paint.setStroke".into(), colour(&stroke)?)); + if !stroke.is_null() { + let width = s.get("width").and_then(Value::as_f64).unwrap_or(STROKE); + let dash = s.get("dash").cloned().unwrap_or(Value::Null); + out.push(("stroke.set".into(), json!({"weight": width, "cap": "round", "join": "round", "dash": dash}))); + } + } + out.push(("document.save".into(), json!({"path": source, "compress": true, "modified": null}))); + Ok(out) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_recipe_becomes_vectorcraft_commands() { + let recipe = json!({"shapes": [ + {"d": "M4 4 L20 20"}, + {"circle": [12, 12, 3], "fill": "accent"}, + {"rect": [2, 2, 4, 4], "radius": 1, "fill": "soft", "stroke": "line", "width": 1}, + ]}); + let steps = commands("x.y", &recipe, Path::new("/tmp/x.y.vectorcraft")).unwrap(); + let ids: Vec<&str> = steps.iter().map(|(c, _)| c.as_str()).collect(); + assert_eq!( + ids, + [ + "file.new", + "path.create", + "paint.setFill", + "paint.setStroke", + "stroke.set", + "shape.ellipse", + "paint.setFill", + "paint.setStroke", + "shape.rectangle", + "paint.setFill", + "paint.setStroke", + "stroke.set", + "document.save" + ] + ); + assert_eq!(steps[5].1, json!({"x": 9.0, "y": 9.0, "width": 6.0, "height": 6.0})); + assert_eq!(steps[3].1, json!({"color": "#dde2ea"})); + assert!(commands("x", &json!({"shapes": [{"d": "M0 0", "fill": "pink"}]}), Path::new("x")).is_err()); + assert!(commands("x", &json!({"shapes": [{"circle": [1, 2]}]}), Path::new("x")).is_err()); + } +} diff --git a/xtask/src/main.rs b/xtask/src/main.rs index c13f9cf..9804a6b 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -6,6 +6,7 @@ #![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)] mod assets; +mod icons; mod layers; mod licences; mod test; @@ -19,6 +20,9 @@ usage: cargo xtask commands: layers enforce the crate dependency layering (docs/architecture.md) assets check that every non-code asset file is attributed in ATTRIBUTION.md + icons [ID…] draw the toolbar icons from their recipes (assets/icons/src/*.json) with + VectorCraft (VECTORCRAFT_CLI, else vectorcraft-cli on the PATH): writes each + icon's .vectorcraft source and .svg export licences [--check] write THIRD-PARTY-LICENSES.txt (the licences of every shipped crate); --check fails when it is out of date @@ -39,6 +43,7 @@ fn main() -> ExitCode { let result = match args.first().map(String::as_str) { Some("layers") => cmd_layers(), Some("assets") => assets::run(&root()), + Some("icons") => icons::run(&root(), &rest), Some("licences") => licences::run(&root(), rest.contains(&"--check")), Some("test") => { let (cargo_args, test_args) = rest.iter().position(|a| *a == "--").map_or((&rest[..], &[][..]), |i| (&rest[..i], &rest[i + 1..]));