2024-09-26 15:02:51 -07:00
|
|
|
mod add_remove;
|
2024-09-13 00:40:34 -07:00
|
|
|
mod assembly;
|
2024-09-13 14:53:12 -07:00
|
|
|
mod display;
|
2024-09-13 15:15:55 -07:00
|
|
|
mod outline;
|
2024-09-13 00:40:34 -07:00
|
|
|
|
2024-09-13 15:15:55 -07:00
|
|
|
use nalgebra::DVector;
|
2024-09-27 14:33:49 -07:00
|
|
|
use rustc_hash::FxHashSet;
|
2024-09-26 19:10:34 -07:00
|
|
|
use std::collections::BTreeSet;
|
2024-09-13 00:40:34 -07:00
|
|
|
use sycamore::prelude::*;
|
2024-09-12 15:24:41 -07:00
|
|
|
|
2024-09-26 15:02:51 -07:00
|
|
|
use add_remove::AddRemove;
|
2024-09-22 14:40:31 -07:00
|
|
|
use assembly::{Assembly, Constraint, Element};
|
2024-09-13 14:53:12 -07:00
|
|
|
use display::Display;
|
2024-09-13 15:15:55 -07:00
|
|
|
use outline::Outline;
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
struct AppState {
|
2024-09-19 16:08:55 -07:00
|
|
|
assembly: Assembly,
|
2024-09-27 14:33:49 -07:00
|
|
|
selection: Signal<FxHashSet<usize>>
|
2024-09-13 15:15:55 -07:00
|
|
|
}
|
2024-09-12 15:24:41 -07:00
|
|
|
|
2024-09-22 14:40:31 -07:00
|
|
|
impl AppState {
|
|
|
|
fn new() -> AppState {
|
|
|
|
AppState {
|
|
|
|
assembly: Assembly::new(),
|
2024-09-27 14:33:49 -07:00
|
|
|
selection: create_signal(FxHashSet::default())
|
2024-09-22 14:40:31 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-12 15:24:41 -07:00
|
|
|
fn main() {
|
|
|
|
sycamore::render(|| {
|
2024-09-22 14:40:31 -07:00
|
|
|
let state = AppState::new();
|
2024-09-28 13:28:53 -07:00
|
|
|
let assemb = &state.assembly;
|
|
|
|
let _ = assemb.try_insert_element(
|
|
|
|
Element {
|
|
|
|
id: String::from("wing_a"),
|
|
|
|
label: String::from("Wing A"),
|
|
|
|
color: [1.00_f32, 0.25_f32, 0.00_f32],
|
|
|
|
rep: DVector::<f64>::from_column_slice(&[0.5, 0.5, 0.0, 0.5, -0.25]),
|
|
|
|
constraints: BTreeSet::default()
|
|
|
|
}
|
2024-09-22 02:38:17 -07:00
|
|
|
);
|
2024-09-28 13:28:53 -07:00
|
|
|
let _ = assemb.try_insert_element(
|
|
|
|
Element {
|
|
|
|
id: String::from("wing_b"),
|
|
|
|
label: String::from("Wing B"),
|
|
|
|
color: [0.00_f32, 0.25_f32, 1.00_f32],
|
|
|
|
rep: DVector::<f64>::from_column_slice(&[-0.5, -0.5, 0.0, 0.5, -0.25]),
|
|
|
|
constraints: BTreeSet::default()
|
|
|
|
}
|
2024-09-22 02:38:17 -07:00
|
|
|
);
|
2024-09-28 13:28:53 -07:00
|
|
|
let _ = assemb.try_insert_element(
|
|
|
|
Element {
|
|
|
|
id: String::from("central"),
|
|
|
|
label: String::from("Central"),
|
|
|
|
color: [0.75_f32, 0.75_f32, 0.75_f32],
|
|
|
|
rep: DVector::<f64>::from_column_slice(&[0.0, 0.0, 0.0, 0.4, -0.625]),
|
|
|
|
constraints: BTreeSet::default()
|
|
|
|
}
|
|
|
|
);
|
|
|
|
assemb.insert_constraint(
|
|
|
|
Constraint {
|
|
|
|
args: (
|
|
|
|
assemb.elements_by_id.with(|elts_by_id| elts_by_id["wing_a"]),
|
|
|
|
assemb.elements_by_id.with(|elts_by_id| elts_by_id["wing_b"])
|
|
|
|
),
|
|
|
|
rep: 0.5
|
|
|
|
}
|
2024-09-22 02:38:17 -07:00
|
|
|
);
|
2024-09-19 16:08:55 -07:00
|
|
|
provide_context(state);
|
2024-09-13 15:15:55 -07:00
|
|
|
|
2024-09-12 15:24:41 -07:00
|
|
|
view! {
|
2024-09-26 15:02:51 -07:00
|
|
|
div(id="sidebar") {
|
|
|
|
AddRemove {}
|
|
|
|
Outline {}
|
|
|
|
}
|
2024-09-13 14:53:12 -07:00
|
|
|
Display {}
|
2024-09-12 15:24:41 -07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|