X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultPart.cpp;h=fb3eb3bed05b69273ecb6673fa0f0f6bdf2578dd;hb=81baa77e52cb1ade2bfbe5b21e893cc34b03c323;hp=044893237ec599e8bef4d356bc5b6b0f19da9d8c;hpb=52b0fdb3bbe3b4ca84519c9dd752f89a73bf6c05;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultPart.cpp b/src/Model/Model_ResultPart.cpp index 044893237..fb3eb3bed 100644 --- a/src/Model/Model_ResultPart.cpp +++ b/src/Model/Model_ResultPart.cpp @@ -32,9 +32,14 @@ #include #include #include +#include #include +#include + +#include + #include #include #include @@ -90,7 +95,7 @@ void Model_ResultPart::activate() SessionPtr aMgr = ModelAPI_Session::get(); if (!aMgr->isOperation()) { // open transaction even document is not created to set current docs in setActiveDocument - std::string aMsg = "Activation " + data()->name(); + std::string aMsg = "Activation " + Locale::Convert::toString(data()->name()); aMgr->startOperation(aMsg); isNewTransaction = true; } @@ -184,6 +189,26 @@ bool Model_ResultPart::setDisabled(std::shared_ptr theThis, return false; } +static GeomShapePtr transformShape(const GeomShapePtr theShape, const gp_Trsf& theTrsf) +{ + GeomShapePtr aResult(new GeomAPI_Shape); + if (theTrsf.ScaleFactor() > 0) { + // just update the location of the shape in case of affine transformation + TopoDS_Shape aShape = theShape->impl(); + if (!aShape.IsNull()) { + aShape.Move(theTrsf); + aResult->setImpl(new TopoDS_Shape(aShape)); + } + } + else { + // all other transformations will modify the shape + GeomTrsfPtr aTrsf = std::make_shared(new gp_Trsf(theTrsf)); + GeomAlgoAPI_Transform aTransform(theShape, aTrsf); + aResult = aTransform.shape(); + } + return aResult; +} + std::shared_ptr Model_ResultPart::shape() { std::shared_ptr aResult(new GeomAPI_Shape); @@ -194,12 +219,8 @@ std::shared_ptr Model_ResultPart::shape() ResultPtr anOrigResult = baseRef(); std::shared_ptr anOrigShape = anOrigResult->shape(); if (anOrigShape.get()) { - TopoDS_Shape aShape = anOrigShape->impl(); - if (!aShape.IsNull()) { - aShape.Move(*(myTrsf.get())); - myShape = aShape; - aResult->setImpl(new TopoDS_Shape(aShape)); - } + aResult = transformShape(anOrigShape, *myTrsf); + myShape = aResult->impl(); } if (!myShape.IsNull() && aToSendUpdate) { static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); @@ -253,7 +274,7 @@ static bool IsEqualTrsf(gp_Trsf& theT1, gp_Trsf theT2) { return true; } -std::string Model_ResultPart::nameInPart(const std::shared_ptr& theShape, +std::wstring Model_ResultPart::nameInPart(const std::shared_ptr& theShape, int& theIndex) { theIndex = 0; // not initialized @@ -279,21 +300,21 @@ std::string Model_ResultPart::nameInPart(const std::shared_ptr& t } } // something is not right - return ""; + return L""; } TopoDS_Shape aShape = theShape->impl(); if (aShape.IsNull()) - return ""; + return L""; // getting an access to the document of part std::shared_ptr aDoc = std::dynamic_pointer_cast(partDoc()); if (!aDoc.get()) // the part document is not presented for the moment - return ""; + return L""; MAYBE_UNUSED TDF_Label anAccessLabel = aDoc->generalLabel(); // make the selection attribute anyway: // otherwise just by name it is not stable to search the result - std::string aName; + std::wstring aName; // for this the context result is needed ResultPtr aContext; const std::string& aBodyGroup = ModelAPI_ResultBody::group(); @@ -327,7 +348,11 @@ bool Model_ResultPart::updateInPart(const int theIndex) AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); AttributeSelectionPtr aThisAttr = aSelAttr->value(theIndex - 1); if (aThisAttr.get()) { - return aThisAttr->update(); + if (aThisAttr->update()) { + bool aRemove = false; + aThisAttr->updateInHistory(aRemove); + return true; // it was updated + } } } return false; // something is wrong @@ -342,7 +367,7 @@ gp_Trsf Model_ResultPart::sumTrsf() { return aResult; } -bool Model_ResultPart::combineGeometrical(const int theIndex, std::string& theNewName) +bool Model_ResultPart::combineGeometrical(const int theIndex, std::wstring& theNewName) { std::shared_ptr aDoc = std::dynamic_pointer_cast(partDoc()); if (aDoc.get()) { @@ -361,7 +386,7 @@ bool Model_ResultPart::combineGeometrical(const int theIndex, std::string& theNe } std::shared_ptr Model_ResultPart::shapeInPart( - const std::string& theName, const std::string& theType, int& theIndex) + const std::wstring& theName, const std::string& theType, int& theIndex) { theIndex = 0; // not found yet std::shared_ptr aResult;