mirror of https://github.com/hannobraun/Fornjot
Add `cuboid` example model
This doesn't look great right now, as the usability of the kernel APIs is lacking, and this model includes a lot of code adapted from the former `fj-operations` crate.
This commit is contained in:
parent
33e3b8e2aa
commit
fa1031aff4
|
@ -612,6 +612,17 @@ dependencies = [
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cuboid"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
|
"fj-kernel",
|
||||||
|
"fj-math",
|
||||||
|
"fj-window",
|
||||||
|
"itertools",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "d3d12"
|
name = "d3d12"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
|
|
@ -8,6 +8,8 @@ members = [
|
||||||
"crates/fj-viewer",
|
"crates/fj-viewer",
|
||||||
"crates/fj-window",
|
"crates/fj-window",
|
||||||
|
|
||||||
|
"models/cuboid",
|
||||||
|
|
||||||
"tools/autolib",
|
"tools/autolib",
|
||||||
"tools/automator",
|
"tools/automator",
|
||||||
"tools/cross-compiler",
|
"tools/cross-compiler",
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
[package]
|
||||||
|
name = "cuboid"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = "1.0.71"
|
||||||
|
itertools = "0.10.5"
|
||||||
|
|
||||||
|
[dependencies.fj-kernel]
|
||||||
|
path = "../../crates/fj-kernel"
|
||||||
|
|
||||||
|
[dependencies.fj-math]
|
||||||
|
path = "../../crates/fj-math"
|
||||||
|
|
||||||
|
[dependencies.fj-window]
|
||||||
|
path = "../../crates/fj-window"
|
|
@ -0,0 +1,52 @@
|
||||||
|
use fj_kernel::{
|
||||||
|
algorithms::sweep::Sweep,
|
||||||
|
geometry::region::Region,
|
||||||
|
objects::{Cycle, HalfEdge, Sketch, Solid},
|
||||||
|
operations::{BuildCycle, BuildHalfEdge, Insert, UpdateCycle},
|
||||||
|
services::Services,
|
||||||
|
storage::Handle,
|
||||||
|
};
|
||||||
|
use fj_math::{Point, Vector};
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
pub fn cuboid(x: f64, y: f64, z: f64) -> Handle<Solid> {
|
||||||
|
let mut services = Services::new();
|
||||||
|
|
||||||
|
let sketch = {
|
||||||
|
let exterior = {
|
||||||
|
#[rustfmt::skip]
|
||||||
|
let rectangle = [
|
||||||
|
[-x / 2., -y / 2.],
|
||||||
|
[ x / 2., -y / 2.],
|
||||||
|
[ x / 2., y / 2.],
|
||||||
|
[-x / 2., y / 2.],
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut cycle = Cycle::empty();
|
||||||
|
|
||||||
|
let segments = rectangle
|
||||||
|
.into_iter()
|
||||||
|
.map(Point::from)
|
||||||
|
.circular_tuple_windows();
|
||||||
|
|
||||||
|
for (start, end) in segments {
|
||||||
|
let half_edge =
|
||||||
|
HalfEdge::line_segment([start, end], None, &mut services)
|
||||||
|
.insert(&mut services);
|
||||||
|
|
||||||
|
cycle = cycle.add_half_edges([half_edge]);
|
||||||
|
}
|
||||||
|
|
||||||
|
cycle.insert(&mut services)
|
||||||
|
};
|
||||||
|
|
||||||
|
let region = Region::new(exterior, Vec::new(), None);
|
||||||
|
|
||||||
|
Sketch::new([region]).insert(&mut services)
|
||||||
|
};
|
||||||
|
|
||||||
|
let surface = services.objects.surfaces.xy_plane();
|
||||||
|
|
||||||
|
let path = Vector::from([0., 0., z]);
|
||||||
|
(sketch, surface).sweep(path, &mut services)
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
use fj_kernel::algorithms::{approx::Tolerance, triangulate::Triangulate};
|
||||||
|
|
||||||
|
fn main() -> anyhow::Result<()> {
|
||||||
|
let cuboid = cuboid::cuboid(3., 2., 1.);
|
||||||
|
|
||||||
|
// The tolerance makes no difference for this model, as there aren't any
|
||||||
|
// curves.
|
||||||
|
let tolerance = Tolerance::from_scalar(1.)?;
|
||||||
|
|
||||||
|
let mesh = (cuboid.deref(), tolerance).triangulate();
|
||||||
|
fj_window::run(mesh, false)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
Reference in New Issue