-// Copyright (C) 2014-2020 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
//
#include <Model_ResultPart.h>
+
#include <ModelAPI_Data.h>
#include <Model_Data.h>
#include <ModelAPI_AttributeDocRef.h>
#include <Model_Application.h>
#include <Events_Loop.h>
#include <ModelAPI_Events.h>
+#include <ModelAPI_Tools.h>
#include <GeomAPI_Trsf.h>
+#include <GeomAlgoAPI_Transform.h>
+
+#include <Locale_Convert.h>
+
#include <TNaming_Tool.hxx>
#include <TNaming_NamedShape.hxx>
#include <TDataStd_Name.hxx>
#include <BRep_Builder.hxx>
#include <TopExp_Explorer.hxx>
+#include <Basics_OCCTVersion.hxx>
+
#define baseRef() \
std::dynamic_pointer_cast<Model_ResultPart>(data()->reference(BASE_REF_ID())->value())
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;
}
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<TopoDS_Shape>();
+ if (!aShape.IsNull()) {
+#if OCC_VERSION_LARGE < 0x07070000
+ aShape.Move(theTrsf);
+#else
+ aShape.Move(theTrsf, Standard_False);
+#endif
+ aResult->setImpl(new TopoDS_Shape(aShape));
+ }
+ }
+ else {
+ // all other transformations will modify the shape
+ GeomTrsfPtr aTrsf = std::make_shared<GeomAPI_Trsf>(new gp_Trsf(theTrsf));
+ GeomAlgoAPI_Transform aTransform(theShape, aTrsf);
+ aResult = aTransform.shape();
+ }
+ return aResult;
+}
+
std::shared_ptr<GeomAPI_Shape> Model_ResultPart::shape()
{
std::shared_ptr<GeomAPI_Shape> aResult(new GeomAPI_Shape);
ResultPtr anOrigResult = baseRef();
std::shared_ptr<GeomAPI_Shape> anOrigShape = anOrigResult->shape();
if (anOrigShape.get()) {
- TopoDS_Shape aShape = anOrigShape->impl<TopoDS_Shape>();
- if (!aShape.IsNull()) {
- aShape.Move(*(myTrsf.get()));
- myShape = aShape;
- aResult->setImpl(new TopoDS_Shape(aShape));
- }
+ aResult = transformShape(anOrigShape, *myTrsf);
+ myShape = aResult->impl<TopoDS_Shape>();
}
if (!myShape.IsNull() && aToSendUpdate) {
static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
return true;
}
-std::string Model_ResultPart::nameInPart(const std::shared_ptr<GeomAPI_Shape>& theShape,
+std::wstring Model_ResultPart::nameInPart(const std::shared_ptr<GeomAPI_Shape>& theShape,
int& theIndex)
{
theIndex = 0; // not initialized
TopExp_Explorer anExp(anOrigMain, aSelection.ShapeType());
for(; anExp.More(); anExp.Next()) {
if (anExp.Current().IsPartner(aSelection)) {
+#if OCC_VERSION_LARGE < 0x07070000
TopoDS_Shape anOrigMoved = anExp.Current().Moved(*(myTrsf.get()));
+#else
+ TopoDS_Shape anOrigMoved = anExp.Current().Moved(*(myTrsf.get()), Standard_False);
+#endif
//if (anOrigMoved.IsSame(aSelection)) {
if (IsEqualTrsf(aSelTrsf, anOrigMoved.Location().Transformation())) {
std::shared_ptr<GeomAPI_Shape> anOrigSel(new GeomAPI_Shape);
}
}
// something is not right
- return "";
+ return L"";
}
TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
if (aShape.IsNull())
- return "";
+ return L"";
// getting an access to the document of part
std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(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();
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<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(partDoc());
if (aDoc.get()) {
}
std::shared_ptr<GeomAPI_Shape> 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<GeomAPI_Shape> aResult;
aResult = aSelAttr->value(theIndex - 1)->value();
if (myTrsf.get() && aResult.get() && !aResult->isNull()) {
gp_Trsf aSumTrsf = sumTrsf();
+#if OCC_VERSION_LARGE < 0x07070000
TopoDS_Shape anOrigMoved = aResult->impl<TopoDS_Shape>().Moved(aSumTrsf);
+#else
+ TopoDS_Shape anOrigMoved = aResult->impl<TopoDS_Shape>().Moved(aSumTrsf, Standard_False);
+#endif
aResult->setImpl(new TopoDS_Shape(anOrigMoved));
}
return aResult;
aResult = aSelAttr->value(theIndex - 1)->value();
if (myTrsf.get() && aResult.get() && !aResult->isNull()) {
gp_Trsf aSumTrsf = sumTrsf();
+#if OCC_VERSION_LARGE < 0x07070000
TopoDS_Shape anOrigMoved = aResult->impl<TopoDS_Shape>().Moved(aSumTrsf);
+#else
+ TopoDS_Shape anOrigMoved = aResult->impl<TopoDS_Shape>().Moved(aSumTrsf, Standard_False);
+#endif
aResult->setImpl(new TopoDS_Shape(anOrigMoved));
}
return aResult;