private bool IsSourcePrivate(IDataConsumer dc, IMeasurements m) { if (l.Contains(dc)) { return(false); } l.Add(dc); if (dc == null) { return(false); } int count = dc.Count; for (int i = 0; i < count; i++) { IMeasurements x = dc[i]; if (x is RelativeMeasurements) { RelativeMeasurements rm = x as RelativeMeasurements; IPosition[] positions = new IPosition[] { rm.Source, rm.Target }; foreach (IPosition position in positions) { if (position == null) { continue; } List <IPosition> path = position.GetPath(); foreach (IPosition pos in path) { if (pos != dc) { if (IsSource(pos, m)) { return(true); } } } } } if (m == x) { return(true); } if (x is IDataConsumer) { if (x != dc) { if (IsSourcePrivate(x as IDataConsumer, m)) { return(true); } } } } return(false); }
private void Process(List <object> l, List <RelativeMeasurements> rm, RelativeMeasurements m, int priority, string reason) { List <object> ladd = new List <object>(); if (rm.Contains(m)) { return; } rm.Add(m); Process(l, rm, m.Source, ladd, priority, reason); Process(l, rm, m.Target, ladd, priority, reason); foreach (object o in ladd) { if (!l.Contains(o)) { l.Add(o); } } }
/// <summary> /// Prepares itself /// </summary> protected override void Prepare() { ClearAll(); IComponentCollection cc = factory.CreateCollection(consumer, 0, null); IEnumerable <object> en = cc.AllComponents; foreach (object o in en) { if (o is IRuntimeUpdate) { runtimeUpdate.Add(o as IRuntimeUpdate); } if (o is IDataConsumer) { IDataConsumer dc = o as IDataConsumer; for (int i = 0; i < dc.Count; i++) { IMeasurements m = dc[i]; if (m is RelativeMeasurements) { RelativeMeasurements rm = m as RelativeMeasurements; AddFrameDependent(rm.Source); AddFrameDependent(rm.Target); } if (m is IRuntimeUpdate) { IRuntimeUpdate st = m as IRuntimeUpdate; if (!st.ShouldRuntimeUpdate) { if (!runtimeUpdate.Contains(st)) { runtimeUpdate.Add(st); } } } } } if (o is IPosition) { frames.Add(o as IPosition); } if (o is IMeasurements) { IMeasurements m = o as IMeasurements; if (!measurements.Contains(m)) { measurements.Add(m); } } if (o is IStep) { steps.Add(o as IStep); } if (o is IUpdatableObject) { IUpdatableObject up = o as IUpdatableObject; if (up == null) { continue; } if (up is IDynamical) { continue; } if (up.ShouldUpdate) { if (up.Update != null) { updatable.Add(up.Update); } } } } foreach (object obj in en) { if (obj is IDynamical) { IDynamical dyn = obj as IDynamical; if (dyn == null) { continue; } dynamical.Add(dyn); } } measurements.SortMeasurements(); updateAll = null; Action um = UpdateMeasurements; Action uu = () => { foreach (Action up in updatable) { up(); } }; Action upd = null; if (updatable.Count > 0) { upd = () => { foreach (Action up in updatable) { up(); } }; } frames.SortPositions(); Action uf = null; if (frames != null) { if (frames.Count > 0) { uf = () => { frames.UpdateFrames(); }; } } if (uf == null & upd == null) { updateAll = UpdateMeasurements; } else if (upd == null) { updateAll = UpdateMeasurements + uf; } else if (uf == null) { updateAll = UpdateMeasurements + upd + UpdateMeasurements; } else { updateAll = UpdateMeasurements + upd + uf + UpdateMeasurements + upd; } }