OptionalModelObject ReverseTranslator::translateZoneList( const WorkspaceObject & workspaceObject ) { if( workspaceObject.iddObject().type() != IddObjectType::Zone ){ LOG(Error, "WorkspaceObject is not IddObjectType: Zone"); return boost::none; } openstudio::model::SpaceType spaceType( m_model ); OptionalString s = workspaceObject.name(); if(s){ spaceType.setName(*s); } for (const IdfExtensibleGroup& idfGroup : workspaceObject.extensibleGroups()){ WorkspaceExtensibleGroup workspaceGroup = idfGroup.cast<WorkspaceExtensibleGroup>(); OptionalWorkspaceObject target = workspaceGroup.getTarget(0); if (target){ OptionalModelObject modelObject = translateAndMapWorkspaceObject(*target); if (modelObject){ if (modelObject->optionalCast<Space>()){ Space space = modelObject->cast<Space>(); if (space.spaceType()){ LOG(Warn, "Overriding previously assigned SpaceType for Space '" << space.name().get() << "'"); } space.setSpaceType(spaceType); } } } } return spaceType; }
bool CreateDesertSpace(Space &sp, Element &e, UdmDesertMap &des_map, DesertUdmMap &inv_des_map, UdmElementSet &elements, bool root) { static long parent; //id of the parent element long old_parent; //save old parent static long space; //id of the space short decomposition; //0:leaf, 1: and, 2: or //element.decomposition(): // has no children: leaf // has children and decomposition is false: or node // has children and decomposition is true: and node set<Element> ev_set; //static and non-static variables //for progress indication //(this is weird in case of a recursive function) //CDesertStatusDlg * st_dlg = GetStatusDlg(NULL); static short percent_done; static short percent_to_do; short percent_to_do_save; if (root) { percent_done = 0; percent_to_do = 100; } if (root) { //compute decomposition value //mapping from boolean decomposition value //to desert style short decomposition set<Element> e_children = sp.Element_kind_children(); set<Element>::iterator i; if (e_children.empty()) decomposition = 0; else { if (sp.decomposition()) decomposition = 1; else decomposition = 2; } //debug trace TRACE ("CreateDesertSpace invoked: parent: %d, Space: %s , decomposition: %d\n", parent, ((string)sp.name()).c_str(), decomposition); // //create the space & the root element in the space // space = CreateSpace(utf82cstring((string)sp.name())); //space = CreateSpace(((string)sp.name()).c_str(), sp.id(), sp.externalID()); /* parent = CreateElement( ((string)sp.name()).c_str(), space, decomposition, -1, sp.id(), sp.externalID()); */ parent = CreateElement( utf82cstring((string)sp.name()), space, decomposition, -1, sp.externalID()); //map the UDM, desert object pairs DoMap(sp, des_map, inv_des_map, parent); //recursion here //update progress bar if (e_children.empty()) { //leaf node percent_done += percent_to_do; //st_dlg->StepInState(percent_done); }//eo if (e_children.empty()) else { //recursive hack for overall performance //percent to done is always smaller int no_of_children = e_children.size(); percent_to_do_save = percent_to_do; percent_to_do = (short)((float)percent_to_do / (float)no_of_children); //recursive step for (i = e_children.begin(); i != e_children.end(); i++) { Element new_e = *i; CreateDesertSpace(sp, new_e, des_map, inv_des_map, elements, false); };//eo for (i...) //still part of the recursive hack //set back the percent_to_do when a recursive loop is done percent_to_do = percent_to_do_save; }//eo else if (e_children.begin() == e_children.end() ) }//eo if (root) else { //compute decomposition value //mapping boolean decomposition value //to desert style decomposition value set<Element> e_children = e.Element_kind_children(); set<Element>::iterator i; if (e_children.empty()) decomposition = 0; else { if (e.decomposition()) decomposition = 1; else decomposition = 2; } //debug trace TRACE ("CreateDesertSpace invoked: parent: %d, Element: %s \n", parent, ((string)e.name()).c_str()); //create new elenent long new_parent = CreateElement( utf82cstring((string)e.name()), space, decomposition, parent, e.externalID()); /* long new_parent = CreateElement( ((string)e.name()).c_str(), space, decomposition, parent, e.id(), e.externalID());*/ //insert association in the map DoMap(e, des_map, inv_des_map, new_parent); //2nd set of elements, we need when mapping associations elements.insert(e); //recursion here if (e_children.empty() ) { //leaf node percent_done += percent_to_do; //st_dlg->StepInState(percent_done); }//eo if (e_children.empty()) else { //recursive hack for overall performance //percent to done is always smaller int no_of_children = e_children.size(); percent_to_do_save = percent_to_do; percent_to_do = (short)((float)percent_to_do / (float)no_of_children); //saving old parent and setting the new parent for Create() calls //when invoking myself recursively old_parent = parent; parent = new_parent; //check recursively all the children for (i = e_children.begin(); i != e_children.end(); i++) { Element new_e = *i; CreateDesertSpace(sp, new_e, des_map, inv_des_map, elements, false); };//eo for (i...) //recursive & static hack //setting back parent&percent_to_do parent = old_parent; percent_to_do = percent_to_do_save; }//eo else if (e_children.empty()) }//eo else if (root) return true; };
BOOL CDesertToolApp::InitInstance() { // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif //this hack is offered gratiously by our very talented grad. student, Tihamer Levendovszky) SetRegistryKey(_T("ISIS")); CString str(m_pszHelpFilePath); WriteProfileString(_T("Data"),_T("Path"), str.Left(str.GetLength()-3) +CString(_T("exe"))); //end of the hack offered by our very gifted, talented, and I could continue... grad student //check for command line //if an argument is received, and actually ends up with stg. like // "xml", "mga", or "mem", we will use that one. bool command_arg_ok = false; bool cancel_input = false; bool cancel_output = false; bool isSilent= false; bool multiRun = false; CString consList; TCHAR** consGroupNames = NULL; TCHAR** consGroups = NULL; int numConsGroups = 0; TCHAR input_file[_MAX_PATH]; TCHAR output_file[_MAX_PATH]; tstring desert_config_info_file = _T(""); FILE* fdDcif = 0; static TCHAR szFilterUDM[] = _T("XML Backend Files (*.xml)|*.xml|MEM Backend Files (*.mem)|*.mem|MGA Backend Files (*.mga)|*.mga|All Files (*.*)|*.*||"); bool hasInputFile = false; bool hasOutputFile = false; if (m_lpCmdLine) { if (_tcslen(m_lpCmdLine)) { if (_tcsstr(m_lpCmdLine, _T("/?")) || _tcsstr(m_lpCmdLine, _T("/help")) || _tcsstr(m_lpCmdLine, _T("--help")) || _tcsstr(m_lpCmdLine, _T("/h"))) { CString usage(_T("Usage: deserttool.exe [<DesertInput xml>] [/o <Output Filename>] [/c \"constraint1:constraint2\"] [/m \"__CG__GroupA:constraint1:constraint2:__CG__GroupB:constraint1:constraint3\"\r\n\r\nArgument details:\r\n")); usage.Append(_T("DesertInput xml: input desert xml file\r\n")); usage.Append(_T("/c \"constraint1 : constraint2\": apply the constraint list directly without GUI shown up\r\n")); usage.Append(_T("/c \"applyAll\": apply all constraints directly without GUI shown up\r\n")); usage.Append(_T("/c \"none\": does not apply any constraint and computes total no. of configurations, without GUI shown up\r\n")); usage.Append(_T("/m : when used calls desert process for \"none\", \"applyAll\", and all given constraint groups (with names using '__CG__' prefix) one by one, without GUI shown up\r\n")); std::cout << usage; AfxMessageBox(usage,MB_ICONINFORMATION); return TRUE; } if (_tcsstr(m_lpCmdLine, _T(".xml")) || _tcsstr(m_lpCmdLine, _T(".mem")) || _tcsstr(m_lpCmdLine, _T(".mga")) || _tcsstr(m_lpCmdLine, _T(".XML")) || _tcsstr(m_lpCmdLine, _T(".MEM")) || _tcsstr(m_lpCmdLine, _T(".MGA"))) { CWzdCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); //seems to be a valid file name command_arg_ok = true; _tcscpy(input_file, cmdInfo.desert_file); hasInputFile = !(cmdInfo.desert_file).IsEmpty(); _tcscpy(output_file, cmdInfo.desert_output_file); hasOutputFile = !(cmdInfo.desert_output_file).IsEmpty(); isSilent = cmdInfo.silent; if (cmdInfo.applyCons) consList = cmdInfo.consList; if(cmdInfo.multiRun) { int ncgs = cmdInfo.consGroupNames.GetCount(); numConsGroups = ncgs; if(ncgs > 0) { consGroupNames = new TCHAR* [ncgs]; consGroups = new TCHAR* [ncgs]; } POSITION p1 = cmdInfo.consGroupNames.GetHeadPosition(); int cIdx = 0; while (p1 != NULL) { CString s = cmdInfo.consGroupNames.GetNext(p1); consGroupNames[cIdx++] = _tcsdup(s); } POSITION p2 = cmdInfo.consGroups.GetHeadPosition(); cIdx = 0; while (p2 != NULL) { CString s = cmdInfo.consGroups.GetNext(p2); consGroups[cIdx++] = _tcsdup(s); } multiRun = true; isSilent = true; } } }//eo if (_tcslen(m_lpCmdLine)) }//eo if (m_lpCmdLine) if (!command_arg_ok && !hasInputFile) { CFileDialog Open( TRUE, //construct a file open dialog _T("xml"), //default file name extension NULL, //default file name OFN_FILEMUSTEXIST |OFN_HIDEREADONLY , //default behaviour szFilterUDM, //no filter NULL //no parent windows ); if (Open.DoModal() == IDOK) { _tcscpy(input_file, Open.GetPathName()); } else { cancel_input = true; return TRUE; } } tstring infile= stripQuotes( input_file); infile.copy( input_file, infile.length(), 0); input_file[ infile.length()]= 0; // If output_file name is given, use it, else tack an _back at the end // (i.e., output has the same name, but sufxed by _back.[xml|mga|mem]) if(hasOutputFile) { tstring outFile = stripQuotes( output_file ); outFile.copy( output_file, outFile.length(), 0); output_file[ outFile.length() ] = 0; tstring strOutFName = output_file; std::size_t dotPos = strOutFName.find_last_of('.'); if(dotPos != std::string::npos) { desert_config_info_file = strOutFName.substr(0, dotPos) + _T("_configs.xml"); } else { desert_config_info_file = strOutFName + _T("_configs.xml"); } fdDcif = _tfopen(desert_config_info_file.c_str(), _T("w+")); } else { _tcsncpy(output_file, input_file, _tcslen(input_file)-4); *(output_file+_tcslen(input_file)-4)='\0'; desert_config_info_file = output_file; desert_config_info_file += _T("_configs.xml"); fdDcif = _tfopen(desert_config_info_file.c_str(), _T("w+")); if (_tcsstr(input_file, _T(".xml")) || _tcsstr(input_file, _T(".XML"))) _tcscat(output_file, _T("_back.xml")); if (_tcsstr(input_file, _T(".mem")) || _tcsstr(input_file, _T(".MEM"))) _tcscat(output_file, _T("_back.mem")); if (_tcsstr(input_file, _T(".mga")) || _tcsstr(input_file, _T(".MGA"))) _tcscat(output_file, _T("_back.mga")); } if (!cancel_input) { CStatusDlg s_dlg( 0, isSilent); s_dlg.Create(IDD_DIALOG1); GetStatusDlg(&s_dlg); DesertSystem ds; Udm::SmartDataNetwork nw(diagram); try { s_dlg.SetStatus(SD_INIT); s_dlg.SetStatus(SD_PARSE); nw.OpenExisting(std::string(CStringA(input_file)), "", Udm::CHANGES_LOST_DEFAULT); ds = DesertSystem::Cast(nw.GetRootObject()); DesertInit(CString(((std::string)ds.SystemName()).c_str())); s_dlg.SetStatus(SD_SPS); //spaces, elements set<Space> spaces = ds.Space_kind_children(); set<Space>::iterator sp_iterator; ASSERT(spaces.begin() != spaces.end()); UdmDesertMap des_map; DesertUdmMap inv_des_map; UdmElementSet elements; UdmMemberSet custom_members; CStatusDlg * st_dlg = GetStatusDlg(NULL); std::function<void(short)> UpdateStatus = [&st_dlg](short status) { st_dlg->StepInState(status); }; //Build spaces if (!spaces.empty()) { Space sp; Element dummy; for (sp_iterator = spaces.begin(); sp_iterator != spaces.end(); sp_iterator++) { Space sp = *(sp_iterator); TRACE("Creating space: %s\n", ((string)sp.name()).c_str()); CreateDesertSpace(sp, dummy, des_map, inv_des_map, elements, true, UpdateStatus); }//eo for (sp_iterator) }//if (!spaces.empty()) //create relations s_dlg.SetStatus(SD_ERS); CreateElementRelations(ds, des_map, inv_des_map, UpdateStatus); //create constrains s_dlg.SetStatus(SD_CTS); CreateConstraints(ds, des_map, inv_des_map); //create foumulas CreateCustomFormulas(ds, des_map, inv_des_map); //create natural domains s_dlg.SetStatus(SD_NDS); CreateNaturalDomains(ds, des_map, inv_des_map, UpdateStatus); //create custom domains s_dlg.SetStatus(SD_CDS); CreateCustomDomains(ds, des_map, inv_des_map, custom_members, UpdateStatus); //create custom domain relations s_dlg.SetStatus(SD_MRS); CreateMemberRelations(ds, des_map, inv_des_map, UpdateStatus); //create variable properties s_dlg.SetStatus(SD_VPS); CreateVariableProperties(des_map, inv_des_map, elements, UpdateStatus); //create constant properties s_dlg.SetStatus(SD_CPS); CreateConstantProperties(des_map, inv_des_map, elements, custom_members, UpdateStatus); //create simpleformula for properties CreateSimpleFormulas(ds, des_map, inv_des_map); //create assignments for VariableProperties s_dlg.SetStatus(SD_ASS); CreateAssignments(des_map, inv_des_map, elements, custom_members, UpdateStatus); //invoking Desert UI s_dlg.SetStatus(SD_GUI); using namespace BackIfaceFunctions; fprintf(fdDcif, "<?xml version=\"1.1\"?>\n"); fprintf(fdDcif, "<DesertConfigurations>\n"); if (multiRun) { // Initialize std::cout << "Starting Multirun" << std::endl; DesertFinitWithMultirun_Pre(numConsGroups, consGroupNames, consGroups); // First run with no constraints applied int numCfgs = DesertFinitWithMultirun_Exec(true, CString(((std::string) ds.SystemName()).c_str()), _T("NONE"), _T("")); std::cout << "Group: NONE\tConfigs: " << numCfgs << std::endl; fprintf(fdDcif, "\t<None NumConfigs=\"%d\"/>\n", numCfgs); ReInitializeManager(&ds, &des_map, &inv_des_map); // Next run with all constraints applied numCfgs = DesertFinitWithMultirun_Exec(true, CString(((std::string) ds.SystemName()).c_str()), _T("ALL"), _T("applyAll")); std::cout << "Group: NONE\tConfigs: " << numCfgs << std::endl; fprintf(fdDcif, "\t<All NumConfigs=\"%d\"/>\n", numCfgs); ReInitializeManager(&ds, &des_map, &inv_des_map); // Next run for all groups fprintf(fdDcif, "\t<Groups>\n"); for (int j = 0; j < numConsGroups; j++) { numCfgs = DesertFinitWithMultirun_Exec(true, CString(((std::string) ds.SystemName()).c_str()), consGroupNames[j], consGroups[j]); std::cout << "Group: NONE\tConfigs: " << numCfgs << std::endl; fprintf(fdDcif, "\t\t<Group Name=\"%S\" NumConfigs=\"%d\">\n", consGroupNames[j], numCfgs); std::vector<tstring> splittedCons = splitConstraints(consGroups[j]); for (std::vector<tstring>::iterator conIt = splittedCons.begin(); conIt != splittedCons.end(); ++conIt) fprintf(fdDcif, "\t\t\t<Constraint Name=\"%S\"/>\n", conIt->c_str()); fprintf(fdDcif, "\t\t</Group>\n"); if (j < numConsGroups) { ReInitializeManager(&ds, &des_map, &inv_des_map); } } fprintf(fdDcif, "\t</Groups>\n"); // Finalize DesertFinitWithMultirun_Post(); std::cout << "Finished Multirun" << std::endl; std::cout.flush(); } else { // AfxMessageBox(CString("Calling DESERT Finit w/:") + consList ); std::cout << "Running with constraint set: \t" << consList << std::endl; DBConfigurations * confs = (DBConfigurations *)DesertFinit(true, isSilent, consList == "" ? NULL : (LPCTSTR)consList); int numCfgs = (confs) ? confs->GetCount() : 0; tstring strConsList = trimSpaces(tstring(consList)); if (strConsList.length() == 0 || strConsList.compare(_T("None")) == 0 || strConsList.compare(_T("none")) == 0) { fprintf(fdDcif, "\t<None NumConfigs=\"%d\"/>\n", numCfgs); } else if(strConsList.compare(_T("applyAll")) == 0) { fprintf(fdDcif, "\t<All NumConfigs=\"%d\"/>\n", numCfgs); } else { fprintf(fdDcif, "\t<ConstraintSet NumConfigs=\"%d\">\n", numCfgs); std::vector<tstring> allStrCons = splitConstraints(strConsList); for (std::vector<tstring>::iterator strCIt = allStrCons.begin(); strCIt != allStrCons.end(); ++strCIt) fprintf(fdDcif, "\t\t<Constraint Name=\"%S\"/>\n", strCIt->c_str()); fprintf(fdDcif, "\t</ConstraintSet>\n"); } std::cout << "Configs: " << numCfgs << std::endl; std::cout.flush(); if (confs) { //open file dialog to write out configurations if (!command_arg_ok || !isSilent) { CFileDialog SaveAs( FALSE, //construct a file open dialog _T("xml"), //default file name extension output_file, //default file name OFN_HIDEREADONLY , //default behaviour szFilterUDM, //no filter NULL //no parent windows ); if (SaveAs.DoModal() == IDOK) { _tcscpy(output_file, SaveAs.GetPathName()); } else cancel_output = true; } if (!cancel_output) { //create data network Udm::SmartDataNetwork bw(DesertIfaceBack::diagram); DesertIfaceBack::DesertBackSystem dbs; bw.CreateNew( //(LPCTSTR)SaveAs.GetFileName(), std::string(CStringA(output_file)), "DesertIfaceBack", DesertIfaceBack::DesertBackSystem::meta, Udm::CHANGES_PERSIST_ALWAYS); //get&take care of the root object dbs = DesertIfaceBack::DesertBackSystem::Cast(bw.GetRootObject()); dbs.SystemName() = ds.SystemName(); //elements, custommembers and natural members will be created //on the fly, as it they are participating in an assignment int confn = confs->GetCount(); POSITION pos = confs->GetHeadPosition(); int count = 0; s_dlg.SetStatus(SD_PREP); while (pos) { DBConfiguration * config = confs->GetNext(pos); if (config) { DesertIfaceBack::Configuration dummy; //check for the existence of elements, properties, //and values which will be associated then POSITION pos1 = config->assignments.GetHeadPosition(); while (pos1) { long valid_ass = config->assignments.GetNext(pos1); BackIfaceFunctions::CreatePropertyAssignment(dbs, dummy, inv_des_map, des_map, valid_ass, false); } POSITION pos2 = config->alt_assignments.GetStartPosition(); while (pos2) { long alt, alt_of; config->alt_assignments.GetNextAssoc(pos2, alt_of, alt); BackIfaceFunctions::CreateAlternativeAssignment(dbs, dummy, inv_des_map, alt_of, alt, false); }; }//eo if (config) s_dlg.StepInState((double)(((double)(++count)) / ((double)(confs->GetCount())))*100.0); //progress bar }//eo while(pos) pos = confs->GetHeadPosition(); s_dlg.SetStatus(SD_BACK); count = 0; while (pos) { DBConfiguration * config = confs->GetNext(pos); if (config) { //create configuration DesertIfaceBack::Configuration dib_conf = DesertIfaceBack::Configuration::Create(dbs); CString s; s.Format(_T("Conf. no: %d"), config->id); dib_conf.name() = static_cast<LPCSTR>(CStringA(s)); dib_conf.id() = config->id; POSITION pos1 = config->assignments.GetHeadPosition(); while (pos1) { long valid_ass = config->assignments.GetNext(pos1); BackIfaceFunctions::CreatePropertyAssignment(dbs, dib_conf, inv_des_map, des_map, valid_ass, true); } POSITION pos2 = config->alt_assignments.GetStartPosition(); while (pos2) { long alt, alt_of; config->alt_assignments.GetNextAssoc(pos2, alt_of, alt); BackIfaceFunctions::CreateAlternativeAssignment(dbs, dib_conf, inv_des_map, alt_of, alt, true); }; TRACE("Got %d of configurations!\n", confs->GetCount()); delete config; }//eo if (config) s_dlg.StepInState((double)(((double)(++count)) / ((double)(confs->GetCount())))*100.0); //progress bar }//eo while(pos) delete confs; set<DesertIfaceBack::Configuration> cfgs = dbs.Configuration_kind_children(); for (set<DesertIfaceBack::Configuration>::iterator it = cfgs.begin(); it != cfgs.end(); ++it) { DesertIfaceBack::Configuration cfg = *it; std::string cfgid = cfg.cfgId(); boost::crc_32_type id_hash; id_hash.process_bytes(cfgid.c_str(), cfgid.length()); int uid = id_hash.checksum(); std::stringstream sstream; sstream << std::hex << uid; cfg.cfgId() = sstream.str(); } }//eo if DoModal() == IDOK }//eo if (configs) //all done s_dlg.SetStatus(SD_FINIT); /*{ //debug test set<ConstraintSet> ts_set = ds.ConstraintSet_kind_children(); set<ConstraintSet>::iterator i = ts_set.begin(); ConstraintSet cts = *i; Constraint ct = Constraint::Create(cts); ct.id() = 1234567890; ct.externalID() = -1234567890; ct.name() = "f**k name"; ct.expression() = "f**k expression"; set<Space> sp_set = ds.Space_kind_children(); set<Space> :: iterator j = sp_set.begin(); Space sp = *j; set<Element> e_set = sp.Element_kind_children(); set<Element> :: iterator k = e_set.begin(); Element e = *k; ct.context() = e; }*/ } // eo multiRun fprintf(fdDcif, "</DesertConfigurations>\n"); fflush(fdDcif); fclose(fdDcif); }//eo try catch (CDesertException *e) { fprintf(fdDcif, "</DesertConfigurations>\n"); fflush(fdDcif); fclose(fdDcif); e->ReportError(); // throw e; return FALSE; } catch (udm_exception e) { fprintf(fdDcif, "</DesertConfigurations>\n"); fflush(fdDcif); fclose(fdDcif); if (m_lpCmdLine && command_arg_ok) std::cerr << std::string("Udm exception: ") + e.what(); else AfxMessageBox(CString("Udm exception: ") + CString(e.what())); // throw e; return FALSE; } }//eo if (Open.DoModal()) // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return TRUE; }