BlockSubstitutions* BlockSubstitutions::clone() const { BlockSubstitutions* newVector = new BlockSubstitutions(); int i; for(i=0;i<size();i++) { newVector->push_back(this->at(i)->clone()); } return newVector; }
void Optimization::createSubExecs(QList<QList<ModModelPlus*> > & subModels, QList<BlockSubstitutions*> & subBlocks) { subModels.clear(); subBlocks.clear(); QMultiMap<QString,QString> map; // <orgComponent,subcomponent> QMap<QString,QString> mapModel; //<orgComponent,model> // fill map for(int i=0; i < _blockSubstitutions->getSize();i++) { BlockSubstitution *curBlockSub = _blockSubstitutions->getAt(i); if(!curBlockSub->_subComponent.isEmpty()) { map.insert(curBlockSub->_orgComponent,curBlockSub->_subComponent); mapModel.insert(curBlockSub->_orgComponent,curBlockSub->_model); } } int nbOrgs = map.uniqueKeys().size(); //adding non-moving cases for each orgComponent for(int i = 0; i<nbOrgs; i ++) { map.insert(map.uniqueKeys().at(i),map.uniqueKeys().at(i)); } //build first index and maximum index QList<int> index, maxIndex; nbOrgs = map.uniqueKeys().size(); for(int i = 0; i<nbOrgs; i ++) { index.push_back(0); QList<QString> subs = map.values(map.uniqueKeys().at(i)); maxIndex.push_back(subs.size()-1); } QStringList models = mapModel.values(); models.removeDuplicates(); // storing genuine mo file paths QStringList oldMoFilePaths; for(int iM=0;iM<models.size();iM++) { oldMoFilePaths.push_back(_omProject->modModelPlus(models.at(iM))->moFilePath()); } int iCase=0; bool oneChange; while(!index.isEmpty()) { // Display case (for debug) QString msg = "CASE " + QString::number(iCase) + "\n"; for(int i=0; i < index.size(); i++) { msg += map.uniqueKeys().at(i); msg += " -> "; msg += map.values(map.uniqueKeys().at(i)).at(index.at(i)); msg+=","; } msg.remove(msg.size()-1,1); msg +="\n \n"; InfoSender::instance()->debug(msg); // create folder QString newName = "case_"+QString::number(iCase); QString newFolder = saveFolder()+ QDir::separator() + "SubModels" + QDir::separator() + newName; QDir dir(saveFolder()); dir.mkpath(newFolder); QDir newDir(newFolder); // clone mo files and load them // and create corresponding modmodelplus QStringList newMoPaths; QStringList newMmoPaths; QMap<QString,ModModelPlus*> newModModels; for(int iM=0;iM<oldMoFilePaths.size();iM++) { QFileInfo oldMoFileInfo(oldMoFilePaths.at(iM)); QFile oldMoFile(oldMoFilePaths.at(iM)); QString newMoPath = newDir.filePath(oldMoFileInfo.fileName()); QString newMmoPath = newMoPath; newMmoPath = newMmoPath.replace(".mo",".mmo"); newDir.remove(newMoPath); oldMoFile.copy(newMoPath); newMoPaths.append(newMoPath); newMmoPaths.append(newMmoPath); // load file (! will replace previously loaded) _omProject->loadMoFile(newMoPath,false,true); // create new modModelPlus ModModelPlus* newModModelPlus = new ModModelPlus(_omProject,models.at(iM)); newModModelPlus->setMmoFilePath(newMmoPath); newModModels.insert(models.at(iM),newModModelPlus); } // apply blocksubs BlockSubstitutions *curSubBlocks = new BlockSubstitutions(); QMap<QString,bool> changes; // <model,hasChanged> changes.clear(); for(int i=0; i<index.size();i++) { QString replacedComp = map.uniqueKeys().at(i); QString replacingComp = map.values(map.uniqueKeys().at(i)).at(index.at(i)); if(replacedComp != replacingComp) { BlockSubstitution* blockSub = _blockSubstitutions->find(replacedComp,replacingComp); if(blockSub) { ModModelPlus* corrNewModModelPlus = newModModels.value(blockSub->_model); oneChange = corrNewModModelPlus->applyBlockSub(blockSub,true) || oneChange ; curSubBlocks->push_back(blockSub); changes.insert(blockSub->_model,true); } } } QStringList modelsToCompile = changes.keys(true);// those which have been modified bool compilationOk = true; for(int iM=0;iM<modelsToCompile.size();iM++) { ModModelPlus* modelPlus = newModModels.value(modelsToCompile.at(iM)); compilationOk = modelPlus->compile(ctrl(modelsToCompile.at(iM))) && compilationOk; } if(compilationOk) { // store subModel and subBlocks subModels.push_back(newModModels.values()); subBlocks.push_back(curSubBlocks); _foldersToCopy << newFolder; InfoSender::instance()->send( Info(ListInfo::SUBMODELADDED,newName)); } else { InfoSender::instance()->send( Info(ListInfo::SUBMODELNOTADDED,newName)); } iCase++; index = LowTools::nextIndex(index,maxIndex); } // reload genuine mo file if(iCase>0) { for(int i=0;i<oldMoFilePaths.size();i++) _omProject->loadMoFile(oldMoFilePaths.at(i),false,true); } }