public static void Add(MotorMove mv)
        {
            Add(new BeginGroupeInstruction(mv.ToString()));
            Add(new IHMCubeMoveInstruction(mv));

            using (var state = GlobalState.GetState())
            {
                var remainQuarters = new int[] { mv.MidMinMovesCount, mv.MidMaxMovesCount, mv.MaxMovesCount };

                // cas particulier de l'axe Z Max qui pour fonctionner correctement doit être après un mouvement de son voisin qui remet de l'ordre
                //if(mv.Axe== Axe.Z && mv.MaxMovesCount != 0)
                //{
                //    // Ajouter un quart de tour de ZMidMax dans un sens, puis dans l'autre en finissant par le même sens que Z mAx pour limiter le nombre de mouvement
                //    var sensZMax = Math.Sign(mv.MaxMovesCount);
                //    AddWithAnticollision(state, new int[] { 0, -sensZMax, 0 }, -sensZMax, Axe.Z);
                //    AddWithAnticollision(state, new int[] { 0, sensZMax, 0 }, sensZMax, Axe.Z);
                //}

                // Mouvement de multiple courronnes simultanée
                //if (mv.PotentialNegativeQuarters > mv.PotentialPositiveQuarters)
                //{ // commencer par tourner dans le sens négatif car c'est ce qu'il y a de plus à faire

                //    // dans le cas d'un sens négatif, faire les demi tour dans l'autre sens
                //    for (int i = 0; i < remainQuarters.Length; i++)
                //    {
                //        if (remainQuarters[i] == 2) remainQuarters[i] = -2;
                //    }

                //    AddWithAnticollision(state, remainQuarters, -1, mv.Axe);
                //    AddWithAnticollision(state, remainQuarters, -1, mv.Axe);// il y a au plus 2 quarts de tour à faire pour chanque sens
                //    AddWithAnticollision(state, remainQuarters, 1, mv.Axe);
                //    AddWithAnticollision(state, remainQuarters, 1, mv.Axe);
                //}
                //else
                //{
                //    AddWithAnticollision(state, remainQuarters, 1, mv.Axe);
                //    AddWithAnticollision(state, remainQuarters, 1, mv.Axe);
                //    AddWithAnticollision(state, remainQuarters, -1, mv.Axe);
                //    AddWithAnticollision(state, remainQuarters, -1, mv.Axe);
                //}

                // mouvement couronne par courrone
                AddWithAnticollision(state, mv.MidMinMovesCount, Couronne.MidMin, mv.Axe);
                AddWithAnticollision(state, mv.MidMaxMovesCount, Couronne.MidMax, mv.Axe);
                AddWithAnticollision(state, mv.MaxMovesCount, Couronne.Max, mv.Axe);

                //AddInitBlock();
            }
        }
        public void Add(Axe a, Couronne c, Sens s)
        {
            Add(new Move(a, c, s));

            var motorMove = new MotorMove(a, c, s);

            if (MotorMoves.Count > 0 && MotorMoves.Last().Axe == a)
            {
                MotorMoves.Last().Add(c, s);
            }
            else
            {
                MotorMoves.Add(motorMove);
            }
        }
 public IHMCubeMoveInstruction(MotorMove move)
 {
     this.Move = move;
 }