+
+ //NPAL18620: performance problem: multiple locations are accumulated
+ // in shape and need a great time to process
+ //BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False);
+ //aShape = aTransformation.Shape();
+ TopLoc_Location aLocOrig = anOriginal.Location();
+ gp_Trsf aTrsfOrig = aLocOrig.Transformation();
+ //TopLoc_Location aLocRes (aTrsf * aTrsfOrig); // gp_Trsf::Multiply() has a bug
+ aTrsfOrig.PreMultiply(aTrsf);
+ TopLoc_Location aLocRes (aTrsfOrig);
+ aShape = anOriginal.Located(aLocRes);
+ }
+ else if (aType == ROTATE_THREE_POINTS || aType == ROTATE_THREE_POINTS_COPY) {
+ Handle(GEOM_Function) aCentPoint = RI.GetCentPoint();
+ Handle(GEOM_Function) aPoint1 = RI.GetPoint1();
+ Handle(GEOM_Function) aPoint2 = RI.GetPoint2();
+ if(aCentPoint.IsNull() || aPoint1.IsNull() || aPoint2.IsNull()) return 0;
+ TopoDS_Shape aCV = aCentPoint->GetValue();
+ TopoDS_Shape aV1 = aPoint1->GetValue();
+ TopoDS_Shape aV2 = aPoint2->GetValue();
+ if(aCV.IsNull() || aCV.ShapeType() != TopAbs_VERTEX) return 0;
+ if(aV1.IsNull() || aV1.ShapeType() != TopAbs_VERTEX) return 0;
+ if(aV2.IsNull() || aV2.ShapeType() != TopAbs_VERTEX) return 0;
+
+ aCP = BRep_Tool::Pnt(TopoDS::Vertex(aCV));
+ aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aV1));
+ aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aV2));
+
+ gp_Vec aVec1 (aCP, aP1);
+ gp_Vec aVec2 (aCP, aP2);
+ gp_Dir aDir (aVec1 ^ aVec2);
+ gp_Ax1 anAx1 (aCP, aDir);
+ Standard_Real anAngle = aVec1.Angle(aVec2);
+ if (fabs(anAngle) < Precision::Angular()) anAngle += 2*PI; // NPAL19665
+ aTrsf.SetRotation(anAx1, anAngle);
+ //NPAL18620: performance problem: multiple locations are accumulated
+ // in shape and need a great time to process
+ //BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False);
+ //aShape = aTransformation.Shape();
+ TopLoc_Location aLocOrig = anOriginal.Location();
+ gp_Trsf aTrsfOrig = aLocOrig.Transformation();
+ //TopLoc_Location aLocRes (aTrsf * aTrsfOrig); // gp_Trsf::Multiply() has a bug
+ aTrsfOrig.PreMultiply(aTrsf);
+ TopLoc_Location aLocRes (aTrsfOrig);
+ aShape = anOriginal.Located(aLocRes);