forked from StudioInfinity/dyna3
Compare commits
3 commits
620a6be918
...
99a9c3ec55
Author | SHA1 | Date | |
---|---|---|---|
![]() |
99a9c3ec55 | ||
![]() |
5506ec1f43 | ||
![]() |
8dab223f6a |
1 changed files with 27 additions and 21 deletions
|
@ -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 {
|
||||||
|
@ -172,11 +180,7 @@ impl InversiveDistanceRegulator {
|
||||||
|
|
||||||
let set_point = create_signal(SpecifiedValue::from_empty_spec());
|
let set_point = create_signal(SpecifiedValue::from_empty_spec());
|
||||||
|
|
||||||
InversiveDistanceRegulator {
|
InversiveDistanceRegulator { subjects, measurement, set_point }
|
||||||
subjects: subjects,
|
|
||||||
measurement: measurement,
|
|
||||||
set_point: set_point
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,11 +231,7 @@ impl HalfCurvatureRegulator {
|
||||||
|
|
||||||
let set_point = create_signal(SpecifiedValue::from_empty_spec());
|
let set_point = create_signal(SpecifiedValue::from_empty_spec());
|
||||||
|
|
||||||
HalfCurvatureRegulator {
|
HalfCurvatureRegulator { subject, measurement, set_point }
|
||||||
subject: subject,
|
|
||||||
measurement: measurement,
|
|
||||||
set_point: set_point
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,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) {
|
||||||
|
Some(half_curv) => {
|
||||||
let representation = assembly.elements.with_untracked(
|
let representation = assembly.elements.with_untracked(
|
||||||
|elts| elts[self.subject].representation
|
|elts| elts[self.subject].representation
|
||||||
);
|
);
|
||||||
representation.update(
|
representation.update(
|
||||||
|rep| change_half_curvature(rep, half_curv)
|
|rep| change_half_curvature(rep, half_curv)
|
||||||
);
|
);
|
||||||
|
true
|
||||||
|
}
|
||||||
|
None => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -387,11 +391,13 @@ impl Assembly {
|
||||||
// edited while acting as a constraint
|
// edited while acting as a constraint
|
||||||
let self_for_effect = self.clone();
|
let self_for_effect = self.clone();
|
||||||
create_effect(move || {
|
create_effect(move || {
|
||||||
|
/* DEBUG */
|
||||||
|
// log the regulator update
|
||||||
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()) {
|
|
||||||
regulator_rc.activate(&self_for_effect);
|
if regulator_rc.try_activate(&self_for_effect) {
|
||||||
self_for_effect.realize();
|
self_for_effect.realize();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue