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=2f208950957e1f9f039777b22cb411fa563daf36;hpb=a9bdd72e4748283ea455fef89e11eb0eae3b7b48;p=modules%2Fshaper.git diff --git a/src/SHAPERGUI/SHAPERGUI_DataModel.cpp b/src/SHAPERGUI/SHAPERGUI_DataModel.cpp index 2f2089509..a8856b26d 100644 --- a/src/SHAPERGUI/SHAPERGUI_DataModel.cpp +++ b/src/SHAPERGUI/SHAPERGUI_DataModel.cpp @@ -1,11 +1,31 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -#include "NewGeom_DataModel.h" -#include "NewGeom_Module.h" +// 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" #include #include +#include +#include +#include #include #include @@ -15,17 +35,21 @@ #include #include +#include + +#define DUMP_NAME "shaper_dump.py" + -NewGeom_DataModel::NewGeom_DataModel(NewGeom_Module* theModule) +SHAPERGUI_DataModel::SHAPERGUI_DataModel(SHAPERGUI* theModule) : LightApp_DataModel(theModule), myStudyPath(""), myModule(theModule) { } -NewGeom_DataModel::~NewGeom_DataModel() +SHAPERGUI_DataModel::~SHAPERGUI_DataModel() { } -bool NewGeom_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStringList theFiles) +bool SHAPERGUI_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStringList theFiles) { LightApp_DataModel::open( thePath, theStudy, theFiles ); if (theFiles.size() == 0) @@ -36,7 +60,7 @@ bool NewGeom_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStrin // 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 NewGeom_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStrin 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 NewGeom_DataModel::open(const QString& thePath, CAM_Study* theStudy, QStrin 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 NewGeom_DataModel::save(QStringList& theFiles) +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,58 +102,60 @@ bool NewGeom_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; } -bool NewGeom_DataModel::saveAs(const QString& thePath, CAM_Study* theStudy, QStringList& theFiles) +bool SHAPERGUI_DataModel::saveAs(const QString& thePath, CAM_Study* theStudy, QStringList& theFiles) { myStudyPath = thePath; return save(theFiles); } -bool NewGeom_DataModel::close() +bool SHAPERGUI_DataModel::close() { myModule->workshop()->closeDocument(); - removeDirectory(myTmpDirectory); - myTmpDirectory = ""; return LightApp_DataModel::close(); } -bool NewGeom_DataModel::create(CAM_Study* theStudy) +bool SHAPERGUI_DataModel::create(CAM_Study* theStudy) { return true; } -bool NewGeom_DataModel::isModified() const +bool SHAPERGUI_DataModel::isModified() const { SessionPtr aMgr = ModelAPI_Session::get(); return aMgr->isModified(); } -bool NewGeom_DataModel::isSaved() const +bool SHAPERGUI_DataModel::isSaved() const { return !isModified(); } -void NewGeom_DataModel::update(LightApp_DataObject* theObj, LightApp_Study* theStudy) +void SHAPERGUI_DataModel::update(LightApp_DataObject* theObj, LightApp_Study* theStudy) { // Nothing to do here: we always keep the data tree in the up-to-date state // The only goal of this method is to hide default behavior from LightApp_DataModel return; } -void NewGeom_DataModel::initRootObject() +void SHAPERGUI_DataModel::initRootObject() { LightApp_Study* study = dynamic_cast( module()->application()->activeStudy() ); CAM_ModuleObject *aModelRoot = dynamic_cast(root()); @@ -148,8 +166,86 @@ void NewGeom_DataModel::initRootObject() } } -void NewGeom_DataModel::removeDirectory(const QString& theDirectoryName) +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; +}