fj-text 0.2.0

A crate for creating text in fornjot.
Documentation
use fj::{
    core::{
        objects::{Region, Sketch, Solid},
        operations::{
            build::{BuildSketch, BuildSolid},
            insert::Insert,
            merge::Merge,
            sweep::SweepSketch,
            update::UpdateSketch,
        },
    },
    math::Vector,
};
use fj_text::GlyphRegionBuilder;

use test_case::test_case;

fn extrude(glyph_regions: Vec<Region>, core: &mut fj::core::Core) -> Solid {
    let mut solids = vec![];
    for region in glyph_regions {
        let bottom_surface = core.layers.objects.surfaces.xy_plane();
        let sweep_path: Vector<3> = Vector::from([0., 0., 0.1]);

        let polygon = region.insert(core);
        solids.push(
            Sketch::empty()
                .add_regions(vec![polygon], core)
                .sweep_sketch(bottom_surface, sweep_path, core),
        );
    }

    let mut all = Solid::empty();

    for solid in solids {
        all = all.merge(&solid, core);
    }

    all
}

#[test_case("tests/fonts/AllertaStencil/AllertaStencil-Regular.ttf")]
#[test_case("tests/fonts/NotoSans/NotoSans-Regular.ttf")]
fn test_font(font_file: &str) {
    let fj = fj::Instance::new();
    let mut core = fj.core;
    let mut file = font::File::open(font_file).unwrap();
    let mut font = &mut file[0];
    for c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".chars() {
        let glyph_regions = GlyphRegionBuilder::try_new(&mut font, c)
            .unwrap()
            .build(&mut core);
        let solid = extrude(glyph_regions, &mut core);
        assert!(solid.shells().len() > 0, "Failed on character: {c}");
    }
}