X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModelHighAPI%2FModelHighAPI_Services.cpp;h=fd564548bca2015e115be069c8dbf4f69317cae2;hb=3f64d388410efbb72edbd800e1dd404695ee1aba;hp=98f7aff84a47776b899e98ace3ca43a7e521f335;hpb=02d4727c710ceb94f1d680a8776d5cba19c73c04;p=modules%2Fshaper.git diff --git a/src/ModelHighAPI/ModelHighAPI_Services.cpp b/src/ModelHighAPI/ModelHighAPI_Services.cpp index 98f7aff84..fd564548b 100644 --- a/src/ModelHighAPI/ModelHighAPI_Services.cpp +++ b/src/ModelHighAPI/ModelHighAPI_Services.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -42,17 +43,17 @@ std::shared_ptr activeDocument() } //-------------------------------------------------------------------------------------- -std::shared_ptr defaultPlane( const std::string& theName ) +std::shared_ptr defaultPlane( const std::wstring& theName ) { std::shared_ptr o(new GeomAPI_Pnt(0, 0, 0)); std::shared_ptr n, x; - if (theName == "XOY") { + if (theName == L"XOY") { n.reset(new GeomAPI_Dir(0, 0, 1)); x.reset(new GeomAPI_Dir(1, 0, 0)); - } else if (theName == "XOZ") { + } else if (theName == L"XOZ") { n.reset(new GeomAPI_Dir(0, -1, 0)); x.reset(new GeomAPI_Dir(1, 0, 0)); - } else if (theName == "YOZ") { + } else if (theName == L"YOZ") { n.reset(new GeomAPI_Dir(1, 0, 0)); x.reset(new GeomAPI_Dir(0, 1, 0)); } @@ -60,35 +61,35 @@ std::shared_ptr defaultPlane( const std::string& theName ) return std::shared_ptr(new GeomAPI_Ax3(o, x, n)); } -std::string defaultPlane(const std::shared_ptr& theOrigin, +std::wstring defaultPlane(const std::shared_ptr& theOrigin, const std::shared_ptr& theNormal, const std::shared_ptr& theDirX) { static const double aTol = 1.e-10; if (fabs(theOrigin->x()) > aTol || fabs(theOrigin->y()) > aTol || fabs(theOrigin->z()) > aTol) - return std::string(); + return std::wstring(); // XOY or XOZ if (fabs(theNormal->x()) < aTol && fabs(theDirX->x() - 1.0) < aTol && fabs(theDirX->y()) < aTol && fabs(theDirX->z()) < aTol) { // XOY if (fabs(theNormal->y()) < aTol && fabs(theNormal->z() - 1.0) < aTol) - return std::string("XOY"); + return std::wstring(L"XOY"); else if (fabs(theNormal->y() + 1.0) < aTol && fabs(theNormal->z()) < aTol) - return std::string("XOZ"); + return std::wstring(L"XOZ"); } // YOZ else if (fabs(theNormal->x() - 1.0) < aTol && fabs(theNormal->y()) < aTol && fabs(theNormal->z()) < aTol && fabs(theDirX->x()) < aTol && fabs(theDirX->y() - 1.0) < aTol && fabs(theDirX->z()) < aTol) - return std::string("YOZ"); + return std::wstring(L"YOZ"); - return std::string(); + return std::wstring(); } -std::shared_ptr standardPlane(const std::string & theName){ +std::shared_ptr standardPlane(const std::wstring & theName){ DocumentPtr aPartSet = ModelAPI_Session::get()->moduleDocument(); // searching for the construction element return std::dynamic_pointer_cast( @@ -99,9 +100,42 @@ std::shared_ptr standardPlane(const std::string & theName){ void begin() { static int aTransactionID = 0; + static int aNbTransactions = -1; + int aNbUndo = (int)ModelAPI_Session::get()->undoList().size(); + if (aNbUndo != aNbTransactions) { + // the last transaction was not empty, thus increase the ID + aNbTransactions = aNbUndo; + ++aTransactionID; + } std::ostringstream aTransactionName; - aTransactionName << "Operation_" << ++aTransactionID; - ModelAPI_Session::get()->startOperation(aTransactionName.str()); + aTransactionName << "Operation_" << aTransactionID; + + // check the first transaction and part, automatically created on start of PartSet + std::shared_ptr aSession = ModelAPI_Session::get(); + if (aSession->undoList().empty() && aSession->redoList().empty() && // no undo/redo available + aSession->moduleDocument()->size(ModelAPI_ResultPart::group()) == 1 && // only one part + aSession->moduleDocument()->size(ModelAPI_Feature::group()) == 1) // only part feature + { + ResultPartPtr aPartRes = std::dynamic_pointer_cast + (aSession->moduleDocument()->object(ModelAPI_ResultPart::group(), 0)); + if (aPartRes.get() && aPartRes->isActivated()) + { + DocumentPtr aPartDoc = aPartRes->partDoc(); + if (aPartDoc.get() && aPartDoc->size(ModelAPI_Feature::group()) == 0) // no features in part + { + // remove the automtically created part + aSession->startOperation("Delete automatic part"); + FeaturePtr aPartFeature = std::dynamic_pointer_cast( + aSession->moduleDocument()->object(ModelAPI_Feature::group(), 0)); + aSession->setActiveDocument(aSession->moduleDocument()); + aSession->moduleDocument()->removeFeature(aPartFeature); + aSession->finishOperation(); + aSession->clearUndoRedo(); + } + } + } + + aSession->startOperation(aTransactionName.str()); } void end() @@ -123,6 +157,7 @@ void apply() { auto aSession = ModelAPI_Session::get(); aSession->finishOperation(); + // start the next operation begin(); }