- return GEOMUtils::ConvertClickToPoint( x, y, aView );
-}
-
-
-//#define USE_COMPOUND
-#include "CurveCreator_Curve.hxx" // TODO - remove
-void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve,
- const int theISection, TopoDS_Shape& theShape,
- std::vector<Handle_AIS_InteractiveObject>& aSectionRepresentation )
-{
- CurveCreator::SectionType aSectType = theCurve->getSectionType( theISection );
-
-
- int aPointSize = theCurve->getNbPoints( theISection );
- bool aSectIsClosed = theCurve->isClosed( theISection );
- if( aSectType == CurveCreator::Polyline )
- {
-#ifdef USE_COMPOUND
- BRep_Builder aBuilder;
- TopoDS_Compound aComp;
- aBuilder.MakeCompound(aComp);
-
- int iPoint = 0;
- gp_Pnt aPrevPoint, aPoint;
- if ( aPointSize == 1 ) {
- CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPrevPoint );
- TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex();
- aBuilder.Add( aComp, aVertex );
- }
- else if ( aPointSize > 1 ) {
- TopoDS_Edge aPointEdge;
- TopoDS_Vertex aVertex;
- CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPrevPoint );
- aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex();
- aBuilder.Add( aComp, aVertex );
- iPoint++;
- for( ; iPoint < aPointSize; iPoint++ ) {
- CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
- aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
- aBuilder.Add( aComp, aVertex );
- aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
- aBuilder.Add( aComp, aPointEdge );
- aPrevPoint = aPoint;
- }
- if( aSectIsClosed && ( aPointSize > 2 ) ) {
- CurveCreator_UtilsICurve::getPoint( theCurve, theISection, 0, aPoint );
- aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
- aBuilder.Add( aComp, aVertex );
- aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
- aBuilder.Add( aComp, aPointEdge );
- }
- theShape = aComp;
- }
-#endif
+ // the 3D point, that is a projection of the pixels to the XYZ view plane
+ //return GEOMUtils::ConvertClickToPoint( x, y, aView );
+
+ // we need the projection to the XOY plane
+ // 1. find a point in the plane of the eye and the normal to the plane
+ Standard_Real X, Y, Z;
+ Quantity_Parameter Vx, Vy, Vz;
+ aView->ConvertWithProj( x, y, X, Y, Z, Vx, Vy, Vz );
+
+ // 2. build a ray from the point by the normal to the XOY plane and intersect it
+ // The ray equation is the following : p(x,y,z) = p0(x,y,z) + t*V(x,y,z)
+ // X,Y,Z - defines p0(x,y,z), Vx,Vy,Vz - defines V(x,y,z)
+ // p(x,y,z) - is a searched point, t - should to be calculated by the condition of XOY plane
+ // The system of equations is the following:
+ // p(x) = p0(x)+t*V(x)
+ // p(y) = p0(y)+t*V(y)
+ // p(z) = p0(z)+t*V(z)
+ // p(z) = 0
+
+ Standard_Real aXp, aYp, aZp;
+ //It is not possible to use Precision::Confusion(), because it is e-0.8, but V is sometimes e-6
+ Standard_Real aPrec = LOCAL_SELECTION_TOLERANCE;
+ if ( fabs( Vz ) > aPrec ) {
+ Standard_Real aT = -Z/Vz;
+ aXp = X + aT*Vx;
+ aYp = Y + aT*Vy;
+ aZp = Z + aT*Vz;