1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-16 10:54:53 +03:00

0026959: Visualization - cannot select edge of the shape

- polygonal representation of the edge is used for sensitive entity computation regardless of requested deflection;
- test case for issue #26959

Adjusting test case
This commit is contained in:
vpa 2015-12-11 11:35:59 +03:00 committed by bugmaster
parent 47e3009da9
commit 3667907665
3 changed files with 63 additions and 46 deletions

View File

@ -323,40 +323,31 @@ void StdSelect_BRepSelectionTool
// Function: GetPointsFromPolygon // Function: GetPointsFromPolygon
// Purpose : // Purpose :
//================================================== //==================================================
static Handle(TColgp_HArray1OfPnt) GetPointsFromPolygon (const TopoDS_Edge& theEdge, static Handle(TColgp_HArray1OfPnt) GetPointsFromPolygon (const TopoDS_Edge& theEdge)
const Standard_Real theDeflection)
{ {
Handle(TColgp_HArray1OfPnt) aResultPoints; Handle(TColgp_HArray1OfPnt) aResultPoints;
Standard_Real fi, la;
Handle(Geom_Curve) CC3d = BRep_Tool::Curve (theEdge, fi, la);
TopLoc_Location aLocation; TopLoc_Location aLocation;
Handle(Poly_Polygon3D) aPolygon = BRep_Tool::Polygon3D (theEdge, aLocation); Handle(Poly_Polygon3D) aPolygon = BRep_Tool::Polygon3D (theEdge, aLocation);
if (!aPolygon.IsNull()) if (!aPolygon.IsNull())
{ {
Standard_Boolean isOK = aPolygon->Deflection() <= theDeflection; const TColgp_Array1OfPnt& aNodes = aPolygon->Nodes();
isOK = isOK || (CC3d.IsNull()); aResultPoints = new TColgp_HArray1OfPnt (1, aNodes.Length());
if (isOK) if (aLocation.IsIdentity())
{ {
const TColgp_Array1OfPnt& aNodes = aPolygon->Nodes(); for (Standard_Integer aNodeId (aNodes.Lower()), aPntId (1); aNodeId <= aNodes.Upper(); ++aNodeId, ++aPntId)
aResultPoints = new TColgp_HArray1OfPnt (1, aNodes.Length());
if (aLocation.IsIdentity())
{ {
for (Standard_Integer aNodeId (aNodes.Lower()), aPntId (1); aNodeId <= aNodes.Upper(); ++aNodeId, ++aPntId) aResultPoints->SetValue (aPntId, aNodes.Value (aNodeId));
{
aResultPoints->SetValue (aPntId, aNodes.Value (aNodeId));
}
} }
else
{
for (Standard_Integer aNodeId (aNodes.Lower()), aPntId (1); aNodeId <= aNodes.Upper(); ++aNodeId, ++aPntId)
{
aResultPoints->SetValue (aPntId, aNodes.Value (aNodeId).Transformed (aLocation));
}
}
return aResultPoints;
} }
else
{
for (Standard_Integer aNodeId (aNodes.Lower()), aPntId (1); aNodeId <= aNodes.Upper(); ++aNodeId, ++aPntId)
{
aResultPoints->SetValue (aPntId, aNodes.Value (aNodeId).Transformed (aLocation));
}
}
return aResultPoints;
} }
Handle(Poly_Triangulation) aTriangulation; Handle(Poly_Triangulation) aTriangulation;
@ -364,31 +355,26 @@ static Handle(TColgp_HArray1OfPnt) GetPointsFromPolygon (const TopoDS_Edge& theE
BRep_Tool::PolygonOnTriangulation (theEdge, anHIndices, aTriangulation, aLocation); BRep_Tool::PolygonOnTriangulation (theEdge, anHIndices, aTriangulation, aLocation);
if (!anHIndices.IsNull()) if (!anHIndices.IsNull())
{ {
Standard_Boolean isOK = anHIndices->Deflection() <= theDeflection; const TColStd_Array1OfInteger& anIndices = anHIndices->Nodes();
isOK = isOK || (CC3d.IsNull()); const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes();
if (isOK)
aResultPoints = new TColgp_HArray1OfPnt (1, anIndices.Length());
if (aLocation.IsIdentity())
{ {
const TColStd_Array1OfInteger& anIndices = anHIndices->Nodes(); for (Standard_Integer anIndex (anIndices.Lower()), aPntId (1); anIndex <= anIndices.Upper(); ++anIndex, ++aPntId)
const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes();
aResultPoints = new TColgp_HArray1OfPnt (1, anIndices.Length());
if (aLocation.IsIdentity())
{ {
for (Standard_Integer anIndex (anIndices.Lower()), aPntId (1); anIndex <= anIndices.Upper(); ++anIndex, ++aPntId) aResultPoints->SetValue (aPntId, aNodes (anIndices (anIndex)));
{
aResultPoints->SetValue (aPntId, aNodes (anIndices (anIndex)));
}
} }
else
{
for (Standard_Integer anIndex (anIndices.Lower()), aPntId (1); anIndex <= anIndices.Upper(); ++anIndex, ++aPntId)
{
aResultPoints->SetValue (aPntId, aNodes (anIndices (anIndex)).Transformed (aLocation));
}
}
return aResultPoints;
} }
else
{
for (Standard_Integer anIndex (anIndices.Lower()), aPntId (1); anIndex <= anIndices.Upper(); ++anIndex, ++aPntId)
{
aResultPoints->SetValue (aPntId, aNodes (anIndices (anIndex)).Transformed (aLocation));
}
}
return aResultPoints;
} }
return aResultPoints; return aResultPoints;
} }
@ -474,7 +460,7 @@ void StdSelect_BRepSelectionTool
} }
// try to get points from existing polygons // try to get points from existing polygons
Handle(TColgp_HArray1OfPnt) aPoints = GetPointsFromPolygon (anEdge, theDeflection); Handle(TColgp_HArray1OfPnt) aPoints = GetPointsFromPolygon (anEdge);
if (!aPoints.IsNull() && aPoints->Length() > 0) if (!aPoints.IsNull() && aPoints->Length() > 0)
{ {
theSensitive = new Select3D_SensitiveCurve (theOwner, aPoints); theSensitive = new Select3D_SensitiveCurve (theOwner, aPoints);

View File

@ -28,7 +28,7 @@ set y_edge_new 240
set x_wire_obj 298 set x_wire_obj 298
set y_wire_obj 209 set y_wire_obj 209
set x_wire_new 55 set x_wire_new 56
set y_wire_new 236 set y_wire_new 236
set x_face_obj 169 set x_face_obj 169

31
tests/bugs/vis/bug26959 Normal file
View File

@ -0,0 +1,31 @@
puts "============"
puts "CR26959"
puts "Visualization - cannot select edge of the shape"
puts "============"
puts ""
pload VISUALIZATION MODELING
restore [locate_data_file bug26959.brep] aFace
vinit
vdisplay aFace
fixshape aFace1 aFace
vremove aFace
vdisplay aFace1
vaspects aFace1 -setWidth 3
vselmode aFace1 2 1
vfit
vmoveto 142 127
if {[vreadpixel 142 127 name] == "CYAN1 1"} {
puts "OK"
} elseif {[vreadpixel 142 127 name] == "GREEN 1"} {
puts "ERROR: the upper edge cannot be highlighted!"
} else {
puts "ERROR: the shape was not displayed correctly!"
}
set only_screen 1