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",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cuboid"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"fj-kernel",
|
||||
"fj-math",
|
||||
"fj-window",
|
||||
"itertools",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "d3d12"
|
||||
version = "0.6.0"
|
||||
|
|
|
@ -8,6 +8,8 @@ members = [
|
|||
"crates/fj-viewer",
|
||||
"crates/fj-window",
|
||||
|
||||
"models/cuboid",
|
||||
|
||||
"tools/autolib",
|
||||
"tools/automator",
|
||||
"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