OptionalModelObject ReverseTranslator::translateScheduleDayHourly(const WorkspaceObject & workspaceObject){ if (workspaceObject.iddObject().type() != IddObjectType::Schedule_Day_Hourly){ LOG(Error, "WorkspaceObject is not IddObjectType: Schedule:Day:Hourly"); return boost::none; } // create the schedule ScheduleDay scheduleDay(m_model); OptionalString s = workspaceObject.name(); if (s){ scheduleDay.setName(*s); } OptionalWorkspaceObject target = workspaceObject.getTarget(Schedule_Day_HourlyFields::ScheduleTypeLimitsName); if (target){ OptionalModelObject scheduleTypeLimits = translateAndMapWorkspaceObject(*target); if (scheduleTypeLimits){ scheduleDay.setPointer(OS_Schedule_DayFields::ScheduleTypeLimitsName, scheduleTypeLimits->handle()); } } for(unsigned i = 0; i < 24; ++i){ OptionalDouble d = workspaceObject.getDouble(Schedule_Day_HourlyFields::Hour1 + i, true); if (d){ scheduleDay.addValue(openstudio::Time(0,i+1,0,0), *d); } } return scheduleDay; }
void SchedulesTabController::addWinterProfile(model::ScheduleRuleset & scheduleRuleset) { model::ScheduleDay scheduleDay(scheduleRuleset.model()); scheduleDay.addValue(Time(1,0),defaultStartingValue(scheduleDay)); scheduleRuleset.setWinterDesignDaySchedule(scheduleDay); scheduleDay.remove(); m_schedulesView->showWinterScheduleDay(scheduleRuleset); }
OptionalModelObject ReverseTranslator::translateScheduleDayInterval(const WorkspaceObject & workspaceObject){ if (workspaceObject.iddObject().type() != IddObjectType::Schedule_Day_Interval){ LOG(Error, "WorkspaceObject is not IddObjectType: Schedule:Day:Interval"); return boost::none; } // create the schedule ScheduleDay scheduleDay(m_model); OptionalString s = workspaceObject.name(); if (s){ scheduleDay.setName(*s); } OptionalWorkspaceObject target = workspaceObject.getTarget(Schedule_Day_IntervalFields::ScheduleTypeLimitsName); if (target){ OptionalModelObject scheduleTypeLimits = translateAndMapWorkspaceObject(*target); if (scheduleTypeLimits){ scheduleDay.setPointer(OS_Schedule_DayFields::ScheduleTypeLimitsName, scheduleTypeLimits->handle()); } } s = workspaceObject.getString(2,true); if (s){ if (openstudio::istringEqual(*s,"yes")){ scheduleDay.setInterpolatetoTimestep(true); } else if (openstudio::istringEqual(*s,"yes")){ scheduleDay.setInterpolatetoTimestep(false); } } //get extensible groups std::vector<IdfExtensibleGroup> extensibleGroups = workspaceObject.extensibleGroups(); //loop over extensible groups boost::regex timeRegex("(\\d?\\d:\\d\\d)"); boost::smatch m; unsigned n = extensibleGroups.size(); for (unsigned i = 0; i < n; ++i){ //read in extensible groups boost::optional<std::string> timeString = extensibleGroups[i].getString(Schedule_Day_IntervalExtensibleFields::Time); boost::optional<double> valueUntilTime = extensibleGroups[i].getDouble(Schedule_Day_IntervalExtensibleFields::ValueUntilTime); if (timeString && valueUntilTime) { // Time string may be prefixed with "Until: ". Extract time in HH:MM format. if (boost::regex_search(*timeString,m,timeRegex)) { timeString = std::string(m[1].first,m[1].second); } try { openstudio::Time time(*timeString); scheduleDay.addValue(time,*valueUntilTime); } catch (std::exception& e) { LOG(Warn,"Could not add value (" << *timeString << ", " << *valueUntilTime << ") to ScheduleDay being created from " << workspaceObject.briefDescription() << ", because " << e.what() << "."); } } else { LOG(Warn,"Encountered extensible group with incomplete or improperly formatted data in " << workspaceObject.briefDescription() << ". Therefore, a corresponding value is not " << "being added to the ScheduleDay object under construction."); } } return scheduleDay; }
boost::optional<openstudio::model::ModelObject> ReverseTranslator::translateScheduleDay(const QDomElement& element, const QDomDocument& doc, openstudio::model::Model& model) { QDomElement nameElement = element.firstChildElement("Name"); QDomElement typeElement = element.firstChildElement("Type"); OS_ASSERT(!nameElement.isNull()); std::string name = escapeName(nameElement.text()); model::ScheduleDay scheduleDay(model); scheduleDay.setName(name); OS_ASSERT(!typeElement.isNull()); std::string type = escapeName(typeElement.text()); boost::optional<model::ScheduleTypeLimits> scheduleTypeLimits = model.getModelObjectByName<model::ScheduleTypeLimits>(type); bool isTemperature = false; if (type == "Temperature"){ isTemperature = true; } if (!scheduleTypeLimits){ if (type == "Fraction"){ scheduleTypeLimits = model::ScheduleTypeLimits(model); scheduleTypeLimits->setName("Fraction"); scheduleTypeLimits->setLowerLimitValue(0); scheduleTypeLimits->setUpperLimitValue(1); scheduleTypeLimits->setNumericType("Continuous"); scheduleTypeLimits->setUnitType("Dimensionless"); }else if (type == "Temperature"){ scheduleTypeLimits = model::ScheduleTypeLimits(model); scheduleTypeLimits->setName("Temperature"); scheduleTypeLimits->setUnitType("Temperature"); }else if (type == "OnOff"){ scheduleTypeLimits = model::ScheduleTypeLimits(model); scheduleTypeLimits->setName("OnOff"); scheduleTypeLimits->setLowerLimitValue(0); scheduleTypeLimits->setUpperLimitValue(1); scheduleTypeLimits->setNumericType("Discrete"); scheduleTypeLimits->setUnitType("Availability"); }else{ LOG(Error, "Unknown schedule type '" << type << "'"); } } if (scheduleTypeLimits){ scheduleDay.setScheduleTypeLimits(*scheduleTypeLimits); } QDomNodeList hrElements = element.elementsByTagName("Hr"); OS_ASSERT(hrElements.count() == 24); for (int i = 0; i < hrElements.count(); i++){ QDomElement hrElement = hrElements.at(i).toElement(); double value = hrElement.text().toDouble(); if (isTemperature){ value = (value-32.0)/1.8; // deg F to deg C } scheduleDay.addValue(openstudio::Time(0, i+1, 0, 0), value); } return scheduleDay; }