Make regulator activation less redundant

This commit is contained in:
Aaron Fenyes 2025-04-17 21:25:22 -07:00
parent 8dab223f6a
commit 5506ec1f43

View file

@ -148,7 +148,15 @@ pub trait Regulator: ProblemPoser + OutlineItem {
fn measurement(&self) -> ReadSignal<f64>; fn measurement(&self) -> ReadSignal<f64>;
fn set_point(&self) -> Signal<SpecifiedValue>; fn set_point(&self) -> Signal<SpecifiedValue>;
fn activate(&self, _assembly: &Assembly) {} // this method is used to responsively precondition the assembly for
// realization when the regulator becomes a constraint, or is edited while
// acting as a constraint. it should track the set point, do any desired
// preconditioning when the set point is present, and use its return value
// to report whether the set is present. the default implementation does no
// preconditioning
fn try_activate(&self, _assembly: &Assembly) -> bool {
self.set_point().with(|set_pt| set_pt.is_present())
}
} }
pub struct InversiveDistanceRegulator { pub struct InversiveDistanceRegulator {
@ -240,14 +248,18 @@ impl Regulator for HalfCurvatureRegulator {
self.set_point self.set_point
} }
fn activate(&self, assembly: &Assembly) { fn try_activate(&self, assembly: &Assembly) -> bool {
if let Some(half_curv) = self.set_point.with_untracked(|set_pt| set_pt.value) { match self.set_point.with(|set_pt| set_pt.value) {
let representation = assembly.elements.with_untracked( Some(half_curv) => {
|elts| elts[self.subject].representation let representation = assembly.elements.with_untracked(
); |elts| elts[self.subject].representation
representation.update( );
|rep| change_half_curvature(rep, half_curv) representation.update(
); |rep| change_half_curvature(rep, half_curv)
);
true
}
None => false
} }
} }
} }
@ -382,8 +394,7 @@ impl Assembly {
console::log_1(&JsValue::from( console::log_1(&JsValue::from(
format!("Updated regulator with subjects {:?}", regulator_rc.subjects()) format!("Updated regulator with subjects {:?}", regulator_rc.subjects())
)); ));
if regulator_rc.set_point().with(|set_pt| set_pt.is_present()) { if regulator_rc.try_activate(&self_for_effect) {
regulator_rc.activate(&self_for_effect);
self_for_effect.realize(); self_for_effect.realize();
} }
}); });