private ScheduleRulesetAbridged ToAbridged(ScheduleRuleset obj)
        {
            var abridged = new ScheduleRulesetAbridged(obj.Identifier, obj.DaySchedules, obj.DefaultDaySchedule, obj.DisplayName, obj.UserData,
                                                       obj.ScheduleRules, obj.HolidaySchedule, obj.SummerDesigndaySchedule, obj.WinterDesigndaySchedule, obj.ScheduleTypeLimit?.Identifier);

            //_typeLimits.Add(obj.ScheduleTypeLimit);
            return(abridged);
        }
        public static ScheduleRuleset ToLadybugTools_ActivityLevel(this Profile profile, double value)
        {
            if (profile == null || double.IsNaN(value))
            {
                return(null);
            }

            string uniqueName = Core.LadybugTools.Query.UniqueName(profile);

            if (string.IsNullOrWhiteSpace(uniqueName))
            {
                return(null);
            }

            uniqueName = Core.LadybugTools.Query.UniqueName(typeof(ActivityLevel), uniqueName);

            ScheduleDay scheduleDay = new ScheduleDay(
                identifier: uniqueName,
                values: new List <double>()
            {
                value
            },
                displayName: profile.Name,
                times: new List <List <int> >()
            {
                new List <int>()
                {
                    0, 0
                }
            });

            ScheduleRuleAbridged scheduleRuleAbridged = new ScheduleRuleAbridged(
                scheduleDay: scheduleDay.Identifier,
                applySunday: true,
                applyMonday: true,
                applyTuesday: true,
                applyWednesday: true,
                applyThursday: true,
                applyFriday: true,
                applySaturday: true);

            ScheduleRuleset scheduleRulset = new ScheduleRuleset(
                identifier: uniqueName,
                daySchedules: new List <ScheduleDay>()
            {
                scheduleDay
            },
                defaultDaySchedule: scheduleDay.Identifier,
                displayName: profile.Name,
                userData: null,
                scheduleRules: new List <ScheduleRuleAbridged>()
            {
                scheduleRuleAbridged
            });

            return(scheduleRulset);
        }
        private ScheduleRuleset AbridgedToReal(ScheduleRulesetAbridged obj)
        {
            var typeLimit = _typeLimits.FirstOrDefault(_ => _.Identifier == obj.ScheduleTypeLimit);

            var realObj = new ScheduleRuleset(obj.Identifier, obj.DaySchedules, obj.DefaultDaySchedule, obj.DisplayName, obj.UserData,
                                              obj.ScheduleRules, obj.HolidaySchedule, obj.SummerDesigndaySchedule, obj.WinterDesigndaySchedule, typeLimit);

            return(realObj);
        }
        public static HoneybeeSchema.ScheduleRuleset CreateSchedule(Control parent = default)
        {
            var dialog    = new Dialog_ScheduleTypeLimit();
            var dialog_rc = dialog.ShowModal(parent);

            if (dialog_rc == null)
            {
                return(null);
            }
            var typeLimit = dialog_rc;

            var dayId   = Guid.NewGuid().ToString();
            var dayName = $"New Schedule Day {dayId.Substring(0, 5)}";
            var newDay  = new ScheduleDay(
                dayId,
                new List <double> {
                0.3
            },
                dayName,
                new List <List <int> >()
            {
                new List <int> {
                    0, 0
                }
            }
                );

            var id     = Guid.NewGuid().ToString();
            var newSch = new ScheduleRuleset(
                id,
                new List <ScheduleDay> {
                newDay
            },
                dayId,
                $"New Schedule Ruleset {id.Substring(0, 5)}"
                );

            newSch.ScheduleTypeLimit = typeLimit;

            var dialog_sch    = new Honeybee.UI.Dialog_Schedule(newSch);
            var dialog_sch_rc = dialog_sch.ShowModal(parent);

            return(dialog_sch_rc);
        }
        public static ScheduleRuleset ToLadybugTools(this Profile profile, ProfileType profileType = ProfileType.Undefined)
        {
            if (profile == null)
            {
                return(null);
            }

            string uniqueName = Core.LadybugTools.Query.UniqueName(profile);

            if (string.IsNullOrWhiteSpace(uniqueName))
            {
                return(null);
            }

            //TODO: Add more sophisticated Method to create ScheduleRulesetAbridged
            List <Profile> profiles = profile.GetProfiles()?.ToList();

            if (profiles == null)
            {
                profiles = new List <Profile>();
            }

            if (profiles.Count == 0)
            {
                profiles.Add(profile);
            }

            profiles.RemoveAll(x => x == null);

            if (profiles.Count == 0)
            {
                return(null);
            }

            Dictionary <System.Guid, ScheduleDay> dictionary_ScheduleDay = new Dictionary <System.Guid, ScheduleDay>();

            foreach (Profile profile_Temp in profiles)
            {
                System.Guid guid = profile_Temp.Guid;

                if (dictionary_ScheduleDay.ContainsKey(guid))
                {
                    continue;
                }

                ScheduleDay scheduleDay = profile_Temp.ToLadybugTools_ScheduleDay();
                if (scheduleDay == null)
                {
                    continue;
                }

                dictionary_ScheduleDay[guid] = scheduleDay;
            }

            if (dictionary_ScheduleDay == null || dictionary_ScheduleDay.Count == 0)
            {
                return(null);
            }

            int index = 0;

            while (profiles.Count < 7)
            {
                profiles.Add(profiles[index]);
                index++;
            }

            Dictionary <System.Guid, ScheduleRuleAbridged> dictionary_ScheduleRuleAbridged = new Dictionary <System.Guid, ScheduleRuleAbridged>();

            for (int i = 0; i < 7; i++)
            {
                System.Guid guid = profiles[i].Guid;
                if (!dictionary_ScheduleDay.ContainsKey(guid))
                {
                    continue;
                }

                ScheduleDay scheduleDay = dictionary_ScheduleDay[guid];

                ScheduleRuleAbridged scheduleRuleAbridged;
                if (!dictionary_ScheduleRuleAbridged.TryGetValue(guid, out scheduleRuleAbridged))
                {
                    scheduleRuleAbridged = new ScheduleRuleAbridged(scheduleDay.Identifier);
                    dictionary_ScheduleRuleAbridged[guid] = scheduleRuleAbridged;
                }

                switch (i)
                {
                case 0:
                    scheduleRuleAbridged.ApplyMonday = true;
                    break;

                case 1:
                    scheduleRuleAbridged.ApplyTuesday = true;
                    break;

                case 2:
                    scheduleRuleAbridged.ApplyWednesday = true;
                    break;

                case 3:
                    scheduleRuleAbridged.ApplyThursday = true;
                    break;

                case 4:
                    scheduleRuleAbridged.ApplyFriday = true;
                    break;

                case 5:
                    scheduleRuleAbridged.ApplySaturday = true;
                    break;

                case 6:
                    scheduleRuleAbridged.ApplySunday = true;
                    break;
                }
            }

            List <ScheduleDay>          scheduleDays           = dictionary_ScheduleDay.Values.ToList();
            List <ScheduleRuleAbridged> scheduleRuleAbridgedes = dictionary_ScheduleRuleAbridged.Values.ToList();
            ScheduleRuleset             result = new ScheduleRuleset(
                identifier: uniqueName,
                daySchedules: scheduleDays,
                defaultDaySchedule: scheduleDays.First().Identifier,
                displayName: profile.Name,
                userData: null,
                scheduleRules: scheduleRuleAbridgedes);

            return(result);
        }
        public static ProgramType ToLadybugTools(this Space space, AdjacencyCluster adjacencyCluster, ProfileLibrary profileLibrary)
        {
            InternalCondition internalCondition = space.InternalCondition;

            if (internalCondition == null)
            {
                return(null);
            }

            string uniqueName = Core.LadybugTools.Query.UniqueName(internalCondition);

            if (string.IsNullOrWhiteSpace(uniqueName))
            {
                return(null);
            }

            People            people            = null;
            Lighting          lighting          = null;
            ElectricEquipment electricEquipment = null;
            Infiltration      infiltration      = null;
            Setpoint          setpoint          = null;

            if (profileLibrary != null)
            {
                double area = double.NaN;
                if (!space.TryGetValue(SpaceParameter.Area, out area))
                {
                    area = double.NaN;
                }

                Dictionary <ProfileType, Profile> dictionary = internalCondition.GetProfileDictionary(profileLibrary);

                if (dictionary.ContainsKey(ProfileType.Occupancy))
                {
                    Profile profile = dictionary[ProfileType.Occupancy];
                    if (profile != null)
                    {
                        double gain = Analytical.Query.OccupancyGain(space);
                        if (double.IsNaN(gain))
                        {
                            gain = 0;
                        }

                        ScheduleRuleset scheduleRuleset = profile.ToLadybugTools();
                        if (scheduleRuleset != null)
                        {
                            double gainPerPeople = gain;
                            if (double.IsNaN(gainPerPeople))
                            {
                                gainPerPeople = 0;
                            }

                            double occupancy = Analytical.Query.CalculatedOccupancy(space);
                            if (!double.IsNaN(occupancy) && occupancy != 0)
                            {
                                gainPerPeople = gainPerPeople / occupancy;
                            }

                            ScheduleRuleset scheduleRuleset_ActivityLevel = profile.ToLadybugTools_ActivityLevel(gainPerPeople);
                            if (scheduleRuleset_ActivityLevel != null)
                            {
                                double peoplePerArea = Analytical.Query.CalculatedPeoplePerArea(space);
                                if (double.IsNaN(peoplePerArea))
                                {
                                    peoplePerArea = 0;
                                }

                                double latentFraction        = double.NaN;
                                double sensibleOccupancyGain = Analytical.Query.OccupancySensibleGain(space);
                                double latentOccupancyGain   = Analytical.Query.OccupancyLatentGain(space);
                                if (!double.IsNaN(sensibleOccupancyGain) || !double.IsNaN(latentOccupancyGain))
                                {
                                    latentFraction = latentOccupancyGain / (latentOccupancyGain + sensibleOccupancyGain);
                                }

                                if (!internalCondition.TryGetValue(Analytical.InternalConditionParameter.OccupancyRadiantProportion, out double occuplancyRadiantProportion))
                                {
                                    occuplancyRadiantProportion = 0.3;
                                }

                                if (double.IsNaN(latentFraction))
                                {
                                    latentFraction = 0;
                                }


                                people = new People(
                                    identifier: string.Format("{0}_People", uniqueName),
                                    peoplePerArea: peoplePerArea,
                                    occupancySchedule: scheduleRuleset,
                                    displayName: profile.Name,
                                    userData: null,
                                    activitySchedule: scheduleRuleset_ActivityLevel,
                                    radiantFraction: occuplancyRadiantProportion,
                                    latentFraction: latentFraction);
                            }
                        }
                    }
                }

                if (dictionary.ContainsKey(ProfileType.Lighting))
                {
                    Profile profile = dictionary[ProfileType.Lighting];
                    if (profile != null)
                    {
                        double gain = Analytical.Query.CalculatedLightingGain(space);
                        if (double.IsNaN(gain))
                        {
                            gain = 0;
                        }

                        ScheduleRuleset scheduleRuleset = profile.ToLadybugTools();
                        if (scheduleRuleset != null)
                        {
                            double gainPerArea = gain;
                            if (double.IsNaN(gainPerArea))
                            {
                                gainPerArea = 0;
                            }

                            if (!double.IsNaN(area) && area != 0)
                            {
                                gainPerArea = gainPerArea / area;
                            }

                            if (!internalCondition.TryGetValue(Analytical.InternalConditionParameter.LightingRadiantProportion, out double lightingRadiantProportion))
                            {
                                lightingRadiantProportion = 0.32;
                            }

                            if (!internalCondition.TryGetValue(Analytical.InternalConditionParameter.LightingViewCoefficient, out double lightingViewCoefficient))
                            {
                                lightingViewCoefficient = 0.25;
                            }

                            lighting = new Lighting(
                                identifier: string.Format("{0}_Lighting", uniqueName),
                                wattsPerArea: gainPerArea,
                                schedule: scheduleRuleset,
                                visibleFraction: lightingViewCoefficient,
                                radiantFraction: lightingRadiantProportion,
                                displayName: profile.Name);
                        }
                    }
                }

                if (dictionary.ContainsKey(ProfileType.EquipmentSensible))
                {
                    double gain = Analytical.Query.CalculatedEquipmentSensibleGain(space);
                    if (double.IsNaN(gain))
                    {
                        gain = 0;
                    }

                    Profile profile = dictionary[ProfileType.EquipmentSensible];
                    if (profile != null)
                    {
                        ScheduleRuleset scheduleRuleset = profile.ToLadybugTools();
                        if (scheduleRuleset != null)
                        {
                            double gainPerArea = gain;
                            if (double.IsNaN(gainPerArea))
                            {
                                gainPerArea = 0;
                            }

                            if (!double.IsNaN(area) && area != 0)
                            {
                                gainPerArea = gainPerArea / area;
                            }

                            if (!internalCondition.TryGetValue(Analytical.InternalConditionParameter.EquipmentRadiantProportion, out double equipmentRadiantProportion))
                            {
                                equipmentRadiantProportion = 0;
                            }

                            electricEquipment = new ElectricEquipment(
                                identifier: string.Format("{0}_ElectricEquipment", uniqueName),
                                wattsPerArea: gainPerArea,
                                schedule: scheduleRuleset,
                                radiantFraction: equipmentRadiantProportion,
                                displayName: profile.Name);
                        }
                    }
                }

                if (dictionary.ContainsKey(ProfileType.Infiltration))
                {
                    Profile profile = dictionary[ProfileType.Infiltration];
                    if (profile != null)
                    {
                        ScheduleRuleset scheduleRuleset = profile.ToLadybugTools();
                        if (scheduleRuleset != null)
                        {
                            double airFlowPerExteriorArea = Query.InfiltrationAirFlowPerExteriorArea(adjacencyCluster, space);

                            infiltration = new Infiltration(
                                identifier: string.Format("{0}_Infiltration", uniqueName),
                                flowPerExteriorArea: airFlowPerExteriorArea,
                                schedule: scheduleRuleset,
                                displayName: profile.Name);
                        }
                    }
                }

                if (dictionary.ContainsKey(ProfileType.Cooling) && dictionary.ContainsKey(ProfileType.Heating))
                {
                    Profile profile_Cooling = dictionary[ProfileType.Cooling];
                    Profile profile_Heating = dictionary[ProfileType.Heating];
                    if (profile_Cooling != null && profile_Heating != null)
                    {
                        ScheduleRuleset scheduleRuleset_Cooling = profile_Cooling.ToLadybugTools();
                        ScheduleRuleset scheduleRuleset_Heating = profile_Heating.ToLadybugTools();
                        if (scheduleRuleset_Cooling != null && scheduleRuleset_Heating != null)
                        {
                            setpoint = new Setpoint(string.Format("{0}_Setpoint", uniqueName), scheduleRuleset_Cooling, scheduleRuleset_Heating, string.Format("Heating {0} Cooling {1}", profile_Heating.Name, profile_Cooling.Name));

                            Profile profile;

                            if (dictionary.TryGetValue(ProfileType.Humidification, out profile))
                            {
                                ScheduleRuleset scheduleRuleset = profile.ToLadybugTools();
                                if (scheduleRuleset != null)
                                {
                                    setpoint.HumidifyingSchedule = scheduleRuleset;
                                }
                            }

                            if (dictionary.TryGetValue(ProfileType.Dehumidification, out profile))
                            {
                                ScheduleRuleset scheduleRuleset = profile.ToLadybugTools();
                                if (scheduleRuleset != null)
                                {
                                    setpoint.DehumidifyingSchedule = scheduleRuleset;
                                }
                            }
                        }
                    }
                }
            }

            ProgramType result = new ProgramType(
                identifier: uniqueName,
                displayName: internalCondition.Name,
                userData: null,
                people: people,
                lighting: lighting,
                electricEquipment: electricEquipment,
                infiltration: infiltration,
                setpoint: setpoint);

            return(result);
        }