- // Rotating each object.
- int aResultIndex = 0;
- std::list<ResultPtr>::iterator aContext = aContextes.begin();
- for(ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end();
- anObjectsIt++, aContext++) {
- std::shared_ptr<GeomAPI_Shape> aBaseShape = *anObjectsIt;
- bool isPart = (*aContext)->groupName() == ModelAPI_ResultPart::group();
-
- // Setting result.
- if (isPart) {
- std::shared_ptr<GeomAPI_Trsf> aTrsf(new GeomAPI_Trsf());
- aTrsf->setRotation(anAxis, anAngle);
- ResultPartPtr anOrigin = std::dynamic_pointer_cast<ModelAPI_ResultPart>(*aContext);
- ResultPartPtr aResultPart = document()->copyPart(anOrigin, data(), aResultIndex);
- aResultPart->setTrsf(*aContext, aTrsf);
- setResult(aResultPart);
- } else {
- GeomAlgoAPI_Rotation aRotationAlgo(aBaseShape, anAxis, anAngle);
-
- // Checking that the algorithm worked properly.
- if(!aRotationAlgo.isDone()) {
- static const std::string aFeatureError = "Error: Rotation algorithm failed.";
- setError(aFeatureError);
- break;
- }
- if(aRotationAlgo.shape()->isNull()) {
- static const std::string aShapeError = "Error: Resulting shape is Null.";
- setError(aShapeError);
- break;
- }
- if(!aRotationAlgo.isValid()) {
- std::string aFeatureError = "Error: Resulting shape is not valid.";
- setError(aFeatureError);
- break;
- }
-
- ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
- loadNamingDS(aRotationAlgo, aResultBody, aBaseShape);
- setResult(aResultBody, aResultIndex);
+ GeomTrsfPtr aTrsf(new GeomAPI_Trsf());
+ aTrsf->setRotation(anAxis, anAngle);
+ return aTrsf;
+}
+
+//=================================================================================================
+GeomTrsfPtr FeaturesPlugin_Rotation::rotationByThreePoints()
+{
+ // Getting the center point and two points (start and end)
+ std::shared_ptr<GeomAPI_Pnt> aCenterPoint;
+ std::shared_ptr<GeomAPI_Pnt> aStartPoint;
+ std::shared_ptr<GeomAPI_Pnt> anEndPoint;
+ std::shared_ptr<ModelAPI_AttributeSelection> aCenterRef =
+ selection(FeaturesPlugin_Rotation::CENTER_POINT_ID());
+ std::shared_ptr<ModelAPI_AttributeSelection> aStartPointRef =
+ selection(FeaturesPlugin_Rotation::START_POINT_ID());
+ std::shared_ptr<ModelAPI_AttributeSelection> anEndPointRef =
+ selection(FeaturesPlugin_Rotation::END_POINT_ID());
+ if ((aCenterRef.get() != NULL) &&
+ (aStartPointRef.get() != NULL) &&
+ (anEndPointRef.get() != NULL)) {
+ GeomShapePtr aCenterShape = aCenterRef->value();
+ if (!aCenterShape.get() && aCenterRef->context().get())
+ aCenterShape = aCenterRef->context()->shape();
+ GeomShapePtr aStartShape = aStartPointRef->value();
+ if (!aStartShape.get() && aStartPointRef->context().get())
+ aStartShape = aStartPointRef->context()->shape();
+ GeomShapePtr anEndShape = anEndPointRef->value();
+ if (!anEndShape.get() && anEndPointRef->context().get())
+ anEndShape = anEndPointRef->context()->shape();
+ if (aStartShape && anEndShape && aCenterShape) {
+ aCenterPoint = GeomAlgoAPI_PointBuilder::point(aCenterShape);
+ aStartPoint = GeomAlgoAPI_PointBuilder::point(aStartShape);
+ anEndPoint = GeomAlgoAPI_PointBuilder::point(anEndShape);