/// <summary>
        ///		Clona hasta una variación
        /// </summary>
        public MovementVariationModel CloneTo(MovementBaseModel parent, MovementVariationModel target, MovementFigureModel movement)
        {
            MovementVariationModel variation = new MovementVariationModel(parent);

            // Clona los movimientos
            variation.Movements.AddRange(Movements.CloneTo(variation, target, movement));
            // Devuelve la variación clonada
            return(variation);
        }
        /// <summary>
        ///		Clona una variación
        /// </summary>
        public MovementVariationModel Clone(MovementBaseModel parent)
        {
            MovementVariationModel target = new MovementVariationModel(parent);

            // Clona las propiedades
            target.Id = Id;
            // Clona los movimientos
            target.Movements.AddRange(Movements.Clone());
            // Devuelve la variación clonada
            return(target);
        }
        /// <summary>
        ///		Clona los movimientos hasta una variación
        /// </summary>
        internal MovementModelCollection CloneTo(MovementVariationModel variation, MovementVariationModel targetVariation,
                                                 MovementFigureModel targetMovement)
        {
            MovementModelCollection movements = new MovementModelCollection();
            bool variationFound = false;

            // Clona los datos
            foreach (MovementBaseModel movement in this)
            {
                if (!variationFound)
                {
                    // Busca la variación entre las variaciones del movimiento
                    foreach (MovementVariationModel variationChild in movement.Variations)
                    {
                        if (variationChild.Id == targetVariation.Id)
                        {
                            // Añade los movimientos de la variación
                            foreach (MovementBaseModel movementBase in variationChild.Movements)
                            {
                                movements.Add(movementBase.Clone());
                            }
                            // Indica que se ha encontrado la variación y no se debe seguir clonando
                            variationFound = true;
                        }
                    }
                    // Si no se ha encontrado la variación, se sigue clonando, si se ha encontrado, se sustituye el
                    // movimiento por el destino y se deja de clonar
                    if (!variationFound)
                    {
                        movements.Add(movement.Clone());
                    }
                }
            }
            // Devuelve la colección clonada
            return(movements);
        }