- DocumentPtr aDoc = Model_ResultPart::partDoc();
- if (aDoc.get()) {
- const std::string& aBodyGroup = ModelAPI_ResultBody::group();
- TopoDS_Compound aResultComp;
- BRep_Builder aBuilder;
- aBuilder.MakeCompound(aResultComp);
- int aNumSubs = 0;
- for(int a = aDoc->size(aBodyGroup) - 1; a >= 0; a--) {
- ResultPtr aBody = std::dynamic_pointer_cast<ModelAPI_Result>(aDoc->object(aBodyGroup, a));
- if (aBody.get() && aBody->shape().get()) {
- TopoDS_Shape aShape = *(aBody->shape()->implPtr<TopoDS_Shape>());
- if (!aShape.IsNull()) {
- aBuilder.Add(aResultComp, aShape);
- aNumSubs++;
+ std::shared_ptr<GeomAPI_Shape> aResult(new GeomAPI_Shape);
+ if (myTrsf.get()) { // get shape of the base result and apply the transformation
+ 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()));
+ aResult->setImpl(new TopoDS_Shape(aShape));
+ }
+ }
+ return aResult;
+ }
+ if (myShape.IsNull()) { // shape is not produced yet, create it
+ DocumentPtr aDoc = Model_ResultPart::partDoc();
+ if (aDoc.get() && aDoc->isOpened()) {
+ const std::string& aBodyGroup = ModelAPI_ResultBody::group();
+ TopoDS_Compound aResultComp;
+ BRep_Builder aBuilder;
+ aBuilder.MakeCompound(aResultComp);
+ int aNumSubs = 0;
+ for(int a = aDoc->size(aBodyGroup) - 1; a >= 0; a--) {
+ ResultPtr aBody = std::dynamic_pointer_cast<ModelAPI_Result>(aDoc->object(aBodyGroup, a));
+ // "object" method filters out disabled and concealed anyway, so don't check
+ if (aBody.get() && aBody->shape().get()) {
+ TopoDS_Shape aShape = *(aBody->shape()->implPtr<TopoDS_Shape>());
+ if (!aShape.IsNull()) {
+ aBuilder.Add(aResultComp, aShape);
+ aNumSubs++;
+ }
+ }
+ }
+ if (aNumSubs) {
+ myShape = aResultComp;
+ }
+ }
+ }
+ if (!myShape.IsNull())
+ aResult->setImpl(new TopoDS_Shape(myShape));
+ return aResult;
+}
+
+// Returns true is transformation matrices are equal
+static bool IsEqualTrsf(gp_Trsf& theT1, gp_Trsf theT2) {
+ for(int aRow = 1; aRow < 4; aRow++) {
+ for(int aCol = 1; aCol < 5; aCol++) {
+ double aDiff = theT1.Value(aRow, aCol) - theT2.Value(aRow, aCol);
+ if (Abs(aDiff) > 1.e-9)
+ return false;
+ }
+ }
+ return true;
+}
+
+std::string Model_ResultPart::nameInPart(const std::shared_ptr<GeomAPI_Shape>& theShape,
+ int& theIndex)
+{
+ theIndex = 0; // not initialized
+
+ if (myTrsf.get()) { // if this is moved copy of part => return the name of original shape
+ ResultPartPtr anOrigResult = baseRef();
+ // searching in the origin the shape equal to the given but with myTrsf
+ TopoDS_Shape aSelection = theShape->impl<TopoDS_Shape>();
+ gp_Trsf aSelTrsf = aSelection.Location().Transformation();
+ TopoDS_Shape anOrigMain = anOrigResult->shape()->impl<TopoDS_Shape>();
+ if (!aSelection.IsNull() && !anOrigMain.IsNull()) {
+ TopExp_Explorer anExp(anOrigMain, aSelection.ShapeType());
+ for(; anExp.More(); anExp.Next()) {
+ if (anExp.Current().IsPartner(aSelection)) {
+ TopoDS_Shape anOrigMoved = anExp.Current().Moved(*(myTrsf.get()));
+ //if (anOrigMoved.IsSame(aSelection)) {
+ if (IsEqualTrsf(aSelTrsf, anOrigMoved.Location().Transformation())) {
+ std::shared_ptr<GeomAPI_Shape> anOrigSel(new GeomAPI_Shape);
+ anOrigSel->setImpl(new TopoDS_Shape(anExp.Current()));
+ return anOrigResult->nameInPart(anOrigSel, theIndex);
+ }