private static void AttachProbeToLinkForPresser(ColliderViewModel vm) { var apvm = GetFirstAncestorWithPneumaticLink(vm); if (apvm != null) { var pnLink = apvm.LinkToParent as IPneumaticPresserExtensionProvider; var lpvm = GetFirstAncestorWithLinearPositionLink(vm, pnLink.Direction); if (lpvm != null) { var lpLink = lpvm.LinkToParent as LinearPositionViewModel; var sign = Math.Sign(pnLink.OnPos - pnLink.OffPos); var direction = GetDirectionVector(pnLink.Direction) * sign; AttachActionToCollider(vm, pnLink); lpLink.ValueChanged += (s, e) => { var t = vm.CheckPanelIntersectionAsync(pnLink.Value, direction).Result; //var t = vm.CheckPanelIntersection(pnLink.Value, direction); if (t.Item1) { double intersectValue = t.Item2; if (intersectValue <= 0) { pnLink.HasCollision = true; vm.Collided = true; pnLink.Pos = pnLink.Pos - intersectValue; } else if (vm.Collided) { pnLink.Pos = pnLink.Pos - intersectValue; //verifico se il link si sia esteso completamente bool b = (sign > 0) ? (pnLink.Pos > pnLink.OnPos) : (pnLink.Pos < pnLink.OnPos); if (b) { pnLink.HasCollision = false; vm.Collided = false; pnLink.Pos = pnLink.OnPos; } } } }; } else { AttachActionToCollider(vm, pnLink); } } }
private static void AttachProbeToLink(ColliderViewModel vm) { var avm = GetFirstAncestorWithPneumaticLink(vm); if (avm != null) { var link = avm.LinkToParent as IPneumaticColliderExtensionProvider; AttachActionToCollider(vm, link); } }
public static Collider ToModel(this ColliderViewModel vm) { if (vm != null) { if (vm is PointColliderViewModel pvm) { var m = new PointsCollider(); m.Type = vm.Type; m.Radius = pvm.Radius; m.Points.Add(pvm.Position.ToVector()); if (vm is TwoPointsColliderViewModel pvm2) { m.Points.Add(pvm2.Position2.ToVector()); } if (vm is ThreePointsColliderViewModel pvm3) { m.Points.Add(pvm3.Position3.ToVector()); } if (vm is FourPointsColliderViewModel pvm4) { m.Points.Add(pvm4.Position4.ToVector()); } if (vm is SixPointsColliderViewModel pvm6) { m.Points.Add(pvm6.Position5.ToVector()); m.Points.Add(pvm6.Position6.ToVector()); } if (vm is EightPointsColliderViewModel pvm8) { m.Points.Add(pvm8.Position7.ToVector()); m.Points.Add(pvm8.Position8.ToVector()); } return(m); } else { throw new ArgumentException("Invalid view model!"); } } else { return(null); } }
private static void AttachActionToCollider(ColliderViewModel vm, IPneumaticColliderExtensionProvider link) { var s = Math.Sign(link.OnPos - link.OffPos); var max = Math.Abs(link.OnPos - link.OffPos); var direction = GetDirectionVector(link.Direction) * s; link.EvaluateCollision = (e) => { double intersectValue = link.OnPos; bool state = link.Value; //var t = vm.CheckPanelIntersection(state, direction); var t = vm.CheckPanelIntersectionAsync(state, direction).Result; if (t.Item1 && (t.Item2 < max)) { intersectValue = t.Item2; link.HasCollision = true; link.CollisionOnPos = intersectValue * s; vm.Collided = true; } else { link.HasCollision = false; vm.Collided = false; } }; link.OnMovementCompleted = (e) => { if (e.Value) { vm.EvaluateOnState(); } }; link.OnMovementStarting = (e) => { if (!e.Value) { vm.EvaluateOffState(); } }; }
private static Action GetGripperOnCollideAction(ColliderViewModel vm) { return(null); }