diff --git a/src/AIS/AIS_Dimension.cxx b/src/AIS/AIS_Dimension.cxx index 77ab58a296..e11b3c4580 100755 --- a/src/AIS/AIS_Dimension.cxx +++ b/src/AIS/AIS_Dimension.cxx @@ -54,8 +54,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include #include @@ -1307,13 +1309,21 @@ void AIS_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSele gp_Trsf aLabelPlane; aLabelPlane.SetTransformation (aTextAxes, gp::XOY()); - TColgp_Array1OfPnt aRectanglePoints (1, 4); - aRectanglePoints.ChangeValue (1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue (2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue (3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue (4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); + TColgp_Array1OfPnt aRectanglePoints(1, 4); + aRectanglePoints.ChangeValue(1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); - aTextSensitive = new Select3D_SensitiveFace (aSensitiveOwner, aRectanglePoints); + Poly_Array1OfTriangle aTriangles(1, 2); + aTriangles.ChangeValue(1) = Poly_Triangle(1, 2, 3); + aTriangles.ChangeValue(2) = Poly_Triangle(1, 3, 4); + + Handle(Poly_Triangulation) aRectanglePoly = + new Poly_Triangulation(aRectanglePoints, aTriangles); + + aTextSensitive = + new Select3D_SensitiveTriangulation (aSensitiveOwner, aRectanglePoly, TopLoc_Location(), Standard_True); } else { diff --git a/src/AIS/AIS_Plane.cdl b/src/AIS/AIS_Plane.cdl index e1ede3f8e1..ef19cacd81 100644 --- a/src/AIS/AIS_Plane.cdl +++ b/src/AIS/AIS_Plane.cdl @@ -221,9 +221,9 @@ is -- Methods from SelectableObject - ComputeSelection(me : mutable; - aSelection : mutable Selection from SelectMgr; - aMode : Integer from Standard) is redefined virtual; + ComputeSelection (me : mutable; + theSelection : mutable Selection from SelectMgr; + theMode : Integer from Standard) is redefined virtual; -- Methods from InteractiveObject diff --git a/src/AIS/AIS_Plane.cxx b/src/AIS/AIS_Plane.cxx index 21ad41c5e0..2bdd60a59a 100644 --- a/src/AIS/AIS_Plane.cxx +++ b/src/AIS/AIS_Plane.cxx @@ -49,11 +49,13 @@ #include #include +#include #include #include -#include #include +#include + #include #include @@ -303,47 +305,57 @@ void AIS_Plane::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_G //function : ComputeSelection //purpose : //======================================================================= -void AIS_Plane::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) +void AIS_Plane::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer /*theMode*/) { - aSelection->Clear(); - Handle(SelectMgr_EntityOwner) eown = new SelectMgr_EntityOwner(this,10); - Handle(Select3D_SensitiveFace) sfac; + theSelection->Clear(); + Handle(SelectMgr_EntityOwner) aSensitiveOwner = new SelectMgr_EntityOwner (this, 10); + Handle(Poly_Triangulation) aSensitivePoly; - if (!myIsXYZPlane){ + if (!myIsXYZPlane) + { + // plane representing rectangle + Standard_Real aLengthX = myDrawer->PlaneAspect()->PlaneXLength() / 2.0; + Standard_Real aLengthY = myDrawer->PlaneAspect()->PlaneYLength() / 2.0; + Handle(Geom_Plane) aPlane = + Handle(Geom_Plane)::DownCast (myComponent->Translated (myComponent->Location(), myCenter)); - Handle(TColgp_HArray1OfPnt) harr = new TColgp_HArray1OfPnt(1,5); - TColgp_Array1OfPnt& arr = harr->ChangeArray1(); - Standard_Real lx = myDrawer->PlaneAspect()->PlaneXLength()/2.; - Standard_Real ly = myDrawer->PlaneAspect()->PlaneYLength()/2.; - const Handle(Geom_Plane)& pl = myComponent; - const Handle(Geom_Plane)& thegoodpl = Handle(Geom_Plane)::DownCast(pl->Translated(pl->Location(),myCenter)); - - thegoodpl->D0(lx,ly,arr(1)); - thegoodpl->D0(lx,-ly,arr(2)); - thegoodpl->D0(-lx,-ly,arr(3)); - thegoodpl->D0(-lx,ly,arr(4)); - arr(5) = arr(1); - sfac = new Select3D_SensitiveFace(eown,harr,myTypeOfSensitivity); + TColgp_Array1OfPnt aRectanglePoints (1, 4); + aPlane->D0 ( aLengthX, aLengthY, aRectanglePoints.ChangeValue (1)); + aPlane->D0 ( aLengthX, -aLengthY, aRectanglePoints.ChangeValue (2)); + aPlane->D0 (-aLengthX, -aLengthY, aRectanglePoints.ChangeValue (3)); + aPlane->D0 (-aLengthX, aLengthY, aRectanglePoints.ChangeValue (4)); + Poly_Array1OfTriangle aTriangles (1, 2); + aTriangles.ChangeValue (1) = Poly_Triangle (1, 2, 3); + aTriangles.ChangeValue (2) = Poly_Triangle (1, 3, 4); + + aSensitivePoly = new Poly_Triangulation (aRectanglePoints, aTriangles); } - else { - Handle(TColgp_HArray1OfPnt) harr1 = new TColgp_HArray1OfPnt(1,4); - TColgp_Array1OfPnt& arr1 = harr1->ChangeArray1(); - - arr1(1) = myCenter; - arr1(2) = myPmin; - arr1(3) = myPmax; - arr1(4) = myCenter; - sfac = new Select3D_SensitiveFace(eown,harr1,myTypeOfSensitivity); + else + { + // plane representing triangle + TColgp_Array1OfPnt aTrianglePoints (1, 3); + aTrianglePoints.ChangeValue (1) = myCenter; + aTrianglePoints.ChangeValue (2) = myPmin; + aTrianglePoints.ChangeValue (3) = myPmax; + Poly_Array1OfTriangle aTriangles (1, 1); + aTriangles.ChangeValue (1) = Poly_Triangle(1, 2, 3); + + aSensitivePoly = new Poly_Triangulation (aTrianglePoints, aTriangles); } - aSelection->Add(sfac); + + Standard_Boolean isSensitiveInterior = myTypeOfSensitivity == Select3D_TOS_INTERIOR; + + Handle(Select3D_SensitiveTriangulation) aSensitive = + new Select3D_SensitiveTriangulation (aSensitiveOwner, + aSensitivePoly, + TopLoc_Location(), + isSensitiveInterior); + + theSelection->Add(aSensitive); } - - - //======================================================================= //function : SetSize //purpose : diff --git a/tests/bugs/vis/bug24564 b/tests/bugs/vis/bug24564 new file mode 100644 index 0000000000..b7caab020a --- /dev/null +++ b/tests/bugs/vis/bug24564 @@ -0,0 +1,42 @@ +puts "============" +puts "CR24564" +puts "============" +puts "" + +####################################################################### +# Test for sensitivity of box located over AIS_Plane +####################################################################### + +set aV "Driver1/Viewer1/View1" +vinit name=$aV l=32 t=32 w=400 h=400 +vactivate $aV +vclear + +puts "Testing box selection over the plane in orthogonal projection:" +vpoint p1 0 0 0 +vpoint p2 1 0 0 +vpoint p3 0 1 0 + +vplane pl1 p1 p2 p3 0 +box b 50 50 50 +vdisplay b +vfit +vtop + +vmoveto 199 200 +checkcolor 199 200 0 1 1 + +if { $stat != 1 } { + puts "Error : The box is not selectable!" +} + +puts "Testing box selection over the plane in axonometry projection:" +vaxo +vfit + +vmoveto 199 200 +checkcolor 199 200 0 1 1 + +if { $stat != 1 } { + puts "Error : The box is not selectable!" +}