Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        private static void AttachProbeToLink(ColliderViewModel vm)
        {
            var avm = GetFirstAncestorWithPneumaticLink(vm);

            if (avm != null)
            {
                var link = avm.LinkToParent as IPneumaticColliderExtensionProvider;

                AttachActionToCollider(vm, link);
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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();
                }
            };
        }
Exemplo n.º 5
0
 private static Action GetGripperOnCollideAction(ColliderViewModel vm)
 {
     return(null);
 }