X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSHAPERGUI%2FSHAPERGUI_DataModel.cpp;h=a8856b26ddaf8d409a251f534d63dddb062ca753;hb=refs%2Fheads%2FCR35150;hp=2aa2ef034201050593351f25e32326d2be521f1b;hpb=4d84ccf9dfa30be18dea333e6a77495e0516ba92;p=modules%2Fshaper.git diff --git a/src/SHAPERGUI/SHAPERGUI_DataModel.cpp b/src/SHAPERGUI/SHAPERGUI_DataModel.cpp index 2aa2ef034..a8856b26d 100644 --- a/src/SHAPERGUI/SHAPERGUI_DataModel.cpp +++ b/src/SHAPERGUI/SHAPERGUI_DataModel.cpp @@ -1,4 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// Copyright (C) 2014-2023 CEA, EDF +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "SHAPERGUI_DataModel.h" #include "SHAPERGUI.h" @@ -6,6 +23,9 @@ #include #include +#include +#include +#include #include #include @@ -15,6 +35,10 @@ #include #include +#include + +#define DUMP_NAME "shaper_dump.py" + SHAPERGUI_DataModel::SHAPERGUI_DataModel(SHAPERGUI* theModule) : LightApp_DataModel(theModule), myStudyPath(""), myModule(theModule) @@ -36,7 +60,7 @@ bool SHAPERGUI_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStr // If the file is Multi(contain all module files inside), the open SALOME functionality creates // these files in a temporary directory. After the open functionality is finished, it removes // these files (in the full SALOME mode). - // The postponed loading of the files is realized in the NewGEOM module. So, it is important do + // The postponed loading of the files is realized in the SHAPER module. So, it is important do // not remove the opened files. // The following code creates a new tmp directory with a copy of files. QString aTmpDir = theFiles.first(); @@ -44,7 +68,6 @@ bool SHAPERGUI_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStr LightApp_Study* aStudy = dynamic_cast( myModule->application()->activeStudy() ); QString aNewTmpDir = aStudy->GetTmpDir("", false).c_str(); - bool isDone = true; QDir aDir(aTmpDir); QStringList aFiles = aDir.entryList(QDir::Files); QStringList::const_iterator anIt = aFiles.begin(), aLast = aFiles.end(); @@ -52,26 +75,19 @@ bool SHAPERGUI_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStr QString aFileName = *anIt; QString aCurrentFile = SUIT_Tools::addSlash(aTmpDir) + aFileName; - QString aNewFile = SUIT_Tools::addSlash(aNewTmpDir) + aFileName; - if (!QFile::copy(aCurrentFile, aNewFile)) - isDone = false; - } - if (isDone) { - myTmpDirectory = aNewTmpDir; - } - else { - removeDirectory(aNewTmpDir); - myTmpDirectory = ""; + XGUI_Workshop* aWorkShop = myModule->workshop(); + aWorkShop->openFile(aCurrentFile); } - SessionPtr aMgr = ModelAPI_Session::get(); - aMgr->load(qPrintable(aNewTmpDir)); myModule->setIsOpened(true); return true; } bool SHAPERGUI_DataModel::save(QStringList& theFiles) { + // Publish to study before saving of the data model + myModule->publishToStudy(); + LightApp_DataModel::save( theFiles ); XGUI_Workshop* aWorkShop = myModule->workshop(); std::list aFileNames; @@ -86,17 +102,21 @@ bool SHAPERGUI_DataModel::save(QStringList& theFiles) bool isMultiFile = aResMgr ? aResMgr->booleanValue("Study", "multi_file", false) : false; std::string aTmpDir = aStudy->GetTmpDir(qPrintable(myStudyPath), isMultiFile); - //std::string aTmpDir = aStudy->GetTmpDir("", false);//true ); - theFiles.append(QString(aTmpDir.c_str())); - - aWorkShop->saveDocument(QString(aTmpDir.c_str()), aFileNames); - std::list::iterator aIt; - for (aIt = aFileNames.begin(); aIt != aFileNames.end(); ++aIt) { - QString aName((*aIt).c_str()); - aName.replace(QChar('\\'), QChar('/')); - int aN = aName.lastIndexOf('/'); - theFiles.append(aName.right(aName.length() - aN - 1)); - } + QString aTmp = QString(aTmpDir.c_str()); + theFiles.append(aTmp); + + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->isAutoUpdateBlocked()) + aMgr->blockAutoUpdate(false); + + //aWorkShop->saveDocument(QString(aTmpDir.c_str()), aFileNames); + aWorkShop->setCurrentDataFile(aTmp + "shaper.shaper"); + aWorkShop->onSave(); + QString aName = aWorkShop->currentDataFile(); + aName.replace(QChar('\\'), QChar('/')); + int aN = aName.lastIndexOf('/'); + theFiles.append(aName.right(aName.length() - aN - 1)); + return true; } @@ -109,8 +129,6 @@ bool SHAPERGUI_DataModel::saveAs(const QString& thePath, CAM_Study* theStudy, QS bool SHAPERGUI_DataModel::close() { myModule->workshop()->closeDocument(); - removeDirectory(myTmpDirectory); - myTmpDirectory = ""; return LightApp_DataModel::close(); } @@ -153,3 +171,81 @@ void SHAPERGUI_DataModel::removeDirectory(const QString& theDirectoryName) Qtx::rmDir(theDirectoryName); } +bool SHAPERGUI_DataModel::dumpPython(const QString& thePath, CAM_Study* theStudy, + bool isMultiFile, QStringList& theListOfFiles) +{ + LightApp_Study* aStudy = dynamic_cast(theStudy); + if (!aStudy) + return false; + + myModule->publishToStudy(); + + std::shared_ptr aDoc = ModelAPI_Session::get()->activeDocument(); + ModelAPI_Session::get()->startOperation(ExchangePlugin_Dump::ID()); + FeaturePtr aFeature = aDoc->addFeature(ExchangePlugin_Dump::ID()); + if (aFeature.get()) { + // keep path to the true dumping directory for external files dumping + AttributeStringPtr aAttr = aFeature->string(ExchangePlugin_Dump::DUMP_DIR_ID()); + if (aAttr.get()) { + QString aDirPath = QFileInfo(thePath).path(); + aAttr->setValue(aDirPath.toStdString()); + } + + // tmp path to write the script + std::string aTmpDir = aStudy->GetTmpDir(thePath.toStdString().c_str(), isMultiFile); + std::string aFileName = aTmpDir + DUMP_NAME; + + if (QFile::exists(aFileName.c_str())) { + QFile::remove(aFileName.c_str()); + } + + aAttr = aFeature->string(ExchangePlugin_Dump::FILE_PATH_ID()); + if (aAttr.get()) + aAttr->setValue(aFileName); + + aAttr = aFeature->string(ExchangePlugin_Dump::FILE_FORMAT_ID()); + if (aAttr.get()) + aAttr->setValue(".py"); + +#ifdef HAVE_SALOME + aFeature->boolean(ExchangePlugin_Dump::EXPORT_VARIABLES_ID())->setValue(true); +#endif + + ModelAPI_Session::get()->finishOperation(); + + if (QFile::exists(aFileName.c_str())) { + QFile aInFile(aFileName.c_str()); + if (!aInFile.open(QIODevice::ReadOnly | QIODevice::Text)) + return false; + QTextStream aText(&aInFile); + QString aTrace(aText.readAll()); + aInFile.close(); + + if (isMultiFile) { + QStringList aBuffer; + aBuffer.push_back(QString("def RebuildData():")); + QStringList aList(aTrace.split("\n")); + foreach(QString aStr, aList) { + QString s = " " + aStr; + aBuffer.push_back(s); + } + aTrace = aBuffer.join("\n"); + } + + QFile aOutFile(aFileName.c_str()); + // binary for SALOME, issue 16931 + if (!aOutFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + return false; + + QTextStream aOut(&aOutFile); + aOut << aTrace << "\n"; + aOut.flush(); + aOutFile.close(); + + theListOfFiles.append(aTmpDir.c_str()); + theListOfFiles.append(DUMP_NAME); + return true; + } + } + return false; +}