- TopoDS_Shape aTEdge1 = aShape1->impl<TopoDS_Shape>();
- TopoDS_Shape aTEdge2 = aShape2->impl<TopoDS_Shape>();
-
- TopoDS_Edge aEdge1 = TopoDS::Edge(aTEdge1);
- TopoDS_Edge aEdge2 = TopoDS::Edge(aTEdge2);
- SetMeasuredGeometry(aEdge1, aEdge2);
-
- // Compute intersection point
- TopoDS_Vertex aV1, aV2;
- TopExp::Vertices(aEdge1, aV1, aV2);
- gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1);
- gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2);
- std::shared_ptr<GeomAPI_Lin> aL1(new GeomAPI_Lin(aPnt1.X(), aPnt1.Y(), aPnt1.Z(),
- aPnt2.X(), aPnt2.Y(), aPnt2.Z()));
- TopExp::Vertices(aEdge2, aV1, aV2);
- aPnt1 = BRep_Tool::Pnt(aV1);
- aPnt2 = BRep_Tool::Pnt(aV2);
- std::shared_ptr<GeomAPI_Lin> aL2(new GeomAPI_Lin(aPnt1.X(), aPnt1.Y(), aPnt1.Z(),
- aPnt2.X(), aPnt2.Y(), aPnt2.Z()));
-
- std::shared_ptr<GeomAPI_Pnt> aInter = aL1->intersect(aL2);
- gp_Pnt aCenter = aInter->impl<gp_Pnt>();
-
- gp_Pnt aFLyPnt(aFlyoutPnt->x(), aFlyoutPnt->y(), aFlyoutPnt->z());
- double aDist = aCenter.Distance(aFLyPnt);
+ std::shared_ptr<GeomDataAPI_Point2D> aFlyoutAttr =
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+ (aData->attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT()));
+ std::shared_ptr<GeomAPI_Pnt> aFlyoutPnt =
+ plane()->to3D(aFlyoutAttr->x(), aFlyoutAttr->y());
+ myFlyOutPoint = aFlyoutPnt->impl<gp_Pnt>();
+ }
+
+ DataPtr aData = myConstraint->data();
+ std::shared_ptr<ModelAPI_AttributeInteger> aTypeAttr = std::dynamic_pointer_cast<
+ ModelAPI_AttributeInteger>(aData->attribute(SketchPlugin_ConstraintAngle::TYPE_ID()));
+ SketcherPrs_Tools::AngleType anAngleType = (SketcherPrs_Tools::AngleType)(aTypeAttr->value());
+
+ double aDist = -1;
+ switch (anAngleType) {
+ case SketcherPrs_Tools::ANGLE_DIRECT: {
+#ifndef COMPILATION_CORRECTION
+ SetArrowsVisibility(AIS_TOAV_Second);
+#endif
+ SetMeasuredGeometry(myFirstPoint, myCenterPoint, mySecondPoint);
+#ifndef COMPILATION_CORRECTION
+ bool isReversedPlanes = isAnglePlaneReversedToSketchPlane();
+ SetType(!isReversedPlanes ? AIS_TOA_Exterior : AIS_TOA_Interior);
+#endif
+ }
+ break;
+ case SketcherPrs_Tools::ANGLE_COMPLEMENTARY: {
+ double anEdge1Length = aCenterPoint.Distance(myFirstPoint);
+ //aDist = calculateDistanceToFlyoutPoint();
+ gp_Pnt aFirstPoint = aCenterPoint.Translated(
+ gp_Vec(myCenterPoint, myFirstPoint).Normalized() * (-anEdge1Length));
+ SetMeasuredGeometry(aFirstPoint, myCenterPoint, mySecondPoint);
+#ifndef COMPILATION_CORRECTION
+ SetType(AIS_TOA_Interior);
+#endif
+ }
+ break;
+ case SketcherPrs_Tools::ANGLE_BACKWARD: {
+#ifndef COMPILATION_CORRECTION
+ SetArrowsVisibility(AIS_TOAV_Second);
+#endif
+ SetMeasuredGeometry(myFirstPoint, myCenterPoint, mySecondPoint);
+ bool isReversedPlanes = isAnglePlaneReversedToSketchPlane();
+#ifndef COMPILATION_CORRECTION
+ SetType(isReversedPlanes ? AIS_TOA_Exterior : AIS_TOA_Interior);
+#endif
+ }
+ break;
+ default:
+ break;
+ }
+ if (aDist < 0) /// it was not calculated yet
+ aDist = calculateDistanceToFlyoutPoint();