public List <Workout> Generate(GainzDBContext dbContext) { Workout workout = new Workout(); //Find an Exercise in the database that works the current muscle and isn't used yet. //if prefercompound find one. else go for exercises that have a high muscle involvment List <Exercise> Exercises = dbContext.Exercises .Include(x => x.ExerciseMuscles) .ThenInclude(x => x.Muscle) .Where(e => e.ExerciseMuscles.FirstOrDefault(em => em.Muscle == MuscleToWork) != null && GeneratorSettings.ExerciseTypes.Contains(e.ExerciseType) && !UsedExercises.Any(x => x.ExerciseID == e.ExerciseID) ) .ToList(); var rnd = new Random(); if (Exercises.Any(x => x.IsCompound)) { Exercises = Exercises.Where(x => x.IsCompound).OrderBy(x => rnd.Next()).Take(ExerciseCount).ToList(); } else { Exercises = Exercises.OrderBy(x => rnd.Next()).Take(ExerciseCount).ToList(); } if (Exercises.Count() == 0) { var message = "Ran out of exercises to match current settings. "; if (this.GeneratorSettings.ExerciseTypes.Count == 1 && this.GeneratorSettings.ExerciseTypes[0] == Enums.ExerciseType.BodyweightNoEquipment) { message += " Pick a frequency of 3 and try again for bodyweight workouts. There aren't enough bodyweight exercises " + "in our system to generate more complex bodyweight routines."; } else { message += " Try picking a different frequency, selecting more equipment, increasing rep range, or lowering volume"; } throw new Exception(message); } Workouts = new List <Workout>(); foreach (var exercise in Exercises) { Workouts.Add(new Workout { Exercise = exercise, RepScheme = RepScheme }); } UsedExercises.AddRange(Exercises); return(Workouts); }
public WorkoutRoutine Generate(GainzDBContext dbContext) { WorkoutRoutine workoutRoutine = new WorkoutRoutine { WorkoutDays = new List <WorkoutDay>() }; int frequency = (int)this.GeneratorSettings.Frequency; RepScheme repScheme = this.GeneratorSettings.RepScheme; workoutRoutine.Frequency = frequency; workoutRoutine.Volume = this.GeneratorSettings.Volume; workoutRoutine.RepScheme = repScheme; workoutRoutine.ExerciseTypes = this.GeneratorSettings.ExerciseTypes.Select(x => EnumLabelLookup.ExerciseTypeLabels[x]).ToList(); workoutRoutine.Name = NameGenerator.NameGenerator.getName(); var splits = dbContext.Splits .Include(x => x.SplitDays) .ThenInclude(x => x.Day) .ThenInclude(x => x.DaysMuscles) .ThenInclude(x => x.Muscle) .Where(x => x.Frequency == frequency).ToList(); if (splits.Count() == 0) { throw new Exception("No workout split available with selected Frequency"); } Random r = new Random(); Split split = splits.ElementAt(r.Next(splits.Count())); workoutRoutine.SplitName = split.Name; List <SplitDay> splitDays = split.SplitDays.OrderBy(x => x.ID).ToList(); Dictionary <string, WorkoutDay> likeDays = new Dictionary <string, WorkoutDay>(); foreach (SplitDay splitDay in splitDays) { WorkoutDayGenerator workoutDayGenerator = new WorkoutDayGenerator(repScheme, splitDay, GeneratorSettings); WorkoutDay workoutDay = likeDays.ContainsKey(splitDay.Day.Name) ? likeDays[splitDay.Day.Name] : workoutDayGenerator.Generate(dbContext); likeDays[splitDay.Day.Name] = workoutDay; workoutRoutine.WorkoutDays.Add(workoutDay); } return(workoutRoutine); }
public WorkoutDay Generate(GainzDBContext dbContext) { WorkoutDay workoutDay = new WorkoutDay(SplitDay.Day.IsRest, SplitDay.Day.Name) { Workouts = new List <Workout>() }; List <Exercise> usedExercises = new List <Exercise>(); //Rest Day if (VolumeMuscleMap.Count == 0) { return(workoutDay); } WorkoutGenerator workoutGenerator = new WorkoutGenerator(RepScheme, VolumeMuscleMap.First().Key, GeneratorSettings); while (VolumeMuscleMap.Count > 0) { var muscle = VolumeMuscleMap.First().Key; var count = VolumeMuscleMap[muscle] / RepScheme.TotalReps(); workoutGenerator.ExerciseCount = count == 0 ? 1 : count; workoutGenerator.MuscleToWork = muscle; var workouts = workoutGenerator.Generate(dbContext); foreach (var workout in workouts) { foreach (var workedMuscle in workout.Exercise.ExerciseMuscles.Select(x => x.Muscle)) { if (VolumeMuscleMap.ContainsKey(workedMuscle)) { VolumeMuscleMap[workedMuscle] -= workout.TotalReps(); if (VolumeMuscleMap[workedMuscle] <= 0) { VolumeMuscleMap.Remove(workedMuscle); } } } } workoutDay.Workouts.AddRange(workouts); } return(workoutDay); }
public ExerciseMusclesController(GainzDBContext context) { _context = context; }
public MusclesController(GainzDBContext context) { _context = context; }
public SplitsController(GainzDBContext context) { _context = context; }
public DaysController(GainzDBContext context) { _context = context; }
public GeneratorController(GainzDBContext context) { _context = context; }