mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-16 10:08:36 +03:00
0025814: Visualization, Prs3d_WFShape::AddPolygon() - always use polygonal representation from edge regardless from requested deflection
This commit is contained in:
parent
20f319cdb8
commit
2c12770c38
@ -67,35 +67,29 @@ namespace
|
|||||||
// purpose :
|
// purpose :
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
Standard_Boolean Prs3d_WFShape::AddPolygon (const TopoDS_Edge& theEdge,
|
Standard_Boolean Prs3d_WFShape::AddPolygon (const TopoDS_Edge& theEdge,
|
||||||
const Standard_Real theDeflection,
|
|
||||||
TColgp_SequenceOfPnt& thePoints)
|
TColgp_SequenceOfPnt& thePoints)
|
||||||
{
|
{
|
||||||
TopLoc_Location aLocation;
|
TopLoc_Location aLocation;
|
||||||
Standard_Real aFirst, aLast;
|
|
||||||
Handle(Geom_Curve) aCurve3d = BRep_Tool::Curve (theEdge, aFirst, aLast);
|
|
||||||
Handle(Poly_Polygon3D) aPolygon = BRep_Tool::Polygon3D (theEdge, aLocation);
|
Handle(Poly_Polygon3D) aPolygon = BRep_Tool::Polygon3D (theEdge, aLocation);
|
||||||
if (!aPolygon.IsNull())
|
if (!aPolygon.IsNull())
|
||||||
{
|
{
|
||||||
if ((aPolygon->Deflection() <= theDeflection) || aCurve3d.IsNull())
|
const TColgp_Array1OfPnt& aPoints = aPolygon->Nodes();
|
||||||
|
Standard_Integer anIndex = aPoints.Lower();
|
||||||
|
if (aLocation.IsIdentity())
|
||||||
{
|
{
|
||||||
const TColgp_Array1OfPnt& aPoints = aPolygon->Nodes();
|
for (; anIndex <= aPoints.Upper(); ++anIndex)
|
||||||
Standard_Integer anIndex = aPoints.Lower();
|
|
||||||
if (aLocation.IsIdentity())
|
|
||||||
{
|
{
|
||||||
for (; anIndex <= aPoints.Upper(); ++anIndex)
|
thePoints.Append (aPoints.Value (anIndex));
|
||||||
{
|
|
||||||
thePoints.Append (aPoints.Value (anIndex));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
for (; anIndex <= aPoints.Upper(); ++anIndex)
|
|
||||||
{
|
|
||||||
thePoints.Append (aPoints.Value (anIndex).Transformed (aLocation));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Standard_True;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (; anIndex <= aPoints.Upper(); ++anIndex)
|
||||||
|
{
|
||||||
|
thePoints.Append (aPoints.Value (anIndex).Transformed (aLocation));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Standard_True;
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle(Poly_Triangulation) aTriangulation;
|
Handle(Poly_Triangulation) aTriangulation;
|
||||||
@ -103,28 +97,25 @@ Standard_Boolean Prs3d_WFShape::AddPolygon (const TopoDS_Edge& theEdge,
|
|||||||
BRep_Tool::PolygonOnTriangulation (theEdge, aHIndices, aTriangulation, aLocation);
|
BRep_Tool::PolygonOnTriangulation (theEdge, aHIndices, aTriangulation, aLocation);
|
||||||
if (!aHIndices.IsNull())
|
if (!aHIndices.IsNull())
|
||||||
{
|
{
|
||||||
if ((aHIndices->Deflection() <= theDeflection) || aCurve3d.IsNull())
|
const TColStd_Array1OfInteger& anIndices = aHIndices->Nodes();
|
||||||
{
|
const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes();
|
||||||
const TColStd_Array1OfInteger& anIndices = aHIndices->Nodes();
|
|
||||||
const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes();
|
|
||||||
|
|
||||||
Standard_Integer anIndex = anIndices.Lower();
|
Standard_Integer anIndex = anIndices.Lower();
|
||||||
if (aLocation.IsIdentity())
|
if (aLocation.IsIdentity())
|
||||||
|
{
|
||||||
|
for (; anIndex <= anIndices.Upper(); ++anIndex)
|
||||||
{
|
{
|
||||||
for (; anIndex <= anIndices.Upper(); ++anIndex)
|
thePoints.Append (aNodes (anIndices (anIndex)));
|
||||||
{
|
|
||||||
thePoints.Append (aNodes (anIndices (anIndex)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
for (; anIndex <= anIndices.Upper(); ++anIndex)
|
|
||||||
{
|
|
||||||
thePoints.Append (aNodes (anIndices (anIndex)).Transformed (aLocation));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Standard_True;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (; anIndex <= anIndices.Upper(); ++anIndex)
|
||||||
|
{
|
||||||
|
thePoints.Append (aNodes (anIndices (anIndex)).Transformed (aLocation));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Standard_True;
|
||||||
}
|
}
|
||||||
return Standard_False;
|
return Standard_False;
|
||||||
}
|
}
|
||||||
@ -429,7 +420,7 @@ void Prs3d_WFShape::Add (const Handle (Prs3d_Presentation)& thePresentation,
|
|||||||
{
|
{
|
||||||
OCC_CATCH_SIGNALS
|
OCC_CATCH_SIGNALS
|
||||||
const Handle(TColgp_HSequenceOfPnt)& aPoints = new TColgp_HSequenceOfPnt;
|
const Handle(TColgp_HSequenceOfPnt)& aPoints = new TColgp_HSequenceOfPnt;
|
||||||
if (!AddPolygon (anEdge, aDeflection, aPoints->ChangeSequence()))
|
if (!AddPolygon (anEdge, aPoints->ChangeSequence()))
|
||||||
{
|
{
|
||||||
if (BRep_Tool::IsGeometric (anEdge))
|
if (BRep_Tool::IsGeometric (anEdge))
|
||||||
{
|
{
|
||||||
@ -465,7 +456,7 @@ void Prs3d_WFShape::Add (const Handle (Prs3d_Presentation)& thePresentation,
|
|||||||
{
|
{
|
||||||
OCC_CATCH_SIGNALS
|
OCC_CATCH_SIGNALS
|
||||||
const Handle(TColgp_HSequenceOfPnt)& aPoints = new TColgp_HSequenceOfPnt;
|
const Handle(TColgp_HSequenceOfPnt)& aPoints = new TColgp_HSequenceOfPnt;
|
||||||
if (!AddPolygon (anEdge, aDeflection, aPoints->ChangeSequence()))
|
if (!AddPolygon (anEdge, aPoints->ChangeSequence()))
|
||||||
{
|
{
|
||||||
if (BRep_Tool::IsGeometric (anEdge))
|
if (BRep_Tool::IsGeometric (anEdge))
|
||||||
{
|
{
|
||||||
@ -500,7 +491,7 @@ void Prs3d_WFShape::Add (const Handle (Prs3d_Presentation)& thePresentation,
|
|||||||
{
|
{
|
||||||
OCC_CATCH_SIGNALS
|
OCC_CATCH_SIGNALS
|
||||||
const Handle(TColgp_HSequenceOfPnt)& aPoints = new TColgp_HSequenceOfPnt;
|
const Handle(TColgp_HSequenceOfPnt)& aPoints = new TColgp_HSequenceOfPnt;
|
||||||
if (!AddPolygon (anEdge, aDeflection, aPoints->ChangeSequence()))
|
if (!AddPolygon (anEdge, aPoints->ChangeSequence()))
|
||||||
{
|
{
|
||||||
if (BRep_Tool::IsGeometric (anEdge))
|
if (BRep_Tool::IsGeometric (anEdge))
|
||||||
{
|
{
|
||||||
|
@ -105,7 +105,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
static Standard_Boolean AddPolygon (const TopoDS_Edge& theEdge,
|
static Standard_Boolean AddPolygon (const TopoDS_Edge& theEdge,
|
||||||
const Standard_Real theDeflection,
|
|
||||||
TColgp_SequenceOfPnt& thePoints);
|
TColgp_SequenceOfPnt& thePoints);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
43
tests/bugs/vis/bug25814
Normal file
43
tests/bugs/vis/bug25814
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "CR25814"
|
||||||
|
puts "Check that the discretization of the sub-shape is identical in shaded and wireframe modes"
|
||||||
|
puts "if the whole shape was already displayed"
|
||||||
|
puts "============"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
set aSubShapeTriang $imagedir/${casename}_subshape_triangulation.png
|
||||||
|
set aShapeTriang $imagedir/${casename}_shape_triangulation.png
|
||||||
|
set aDiff $imagedir/${casename}_diff.png
|
||||||
|
|
||||||
|
pcylinder c 100 350
|
||||||
|
explode c f
|
||||||
|
|
||||||
|
vinit View1 w=900 h=900
|
||||||
|
vclear
|
||||||
|
vsetdispmode 1
|
||||||
|
|
||||||
|
vdisplay c_3
|
||||||
|
vfit
|
||||||
|
vzoom 4
|
||||||
|
vtranslateview 70 20 0
|
||||||
|
vmoveto 200 200
|
||||||
|
vdump $aSubShapeTriang
|
||||||
|
|
||||||
|
vclear
|
||||||
|
tclean c_3
|
||||||
|
|
||||||
|
vdisplay c
|
||||||
|
vfit
|
||||||
|
vclear
|
||||||
|
|
||||||
|
vdisplay c_3
|
||||||
|
vfit
|
||||||
|
vzoom 4
|
||||||
|
vtranslateview 70 20 0
|
||||||
|
vmoveto 200 200
|
||||||
|
vdump $aShapeTriang
|
||||||
|
|
||||||
|
set aDiffRes [diffimage $aSubShapeTriang $aShapeTriang 0.1 0 0 $aDiff]
|
||||||
|
if {$aDiffRes != 0} {
|
||||||
|
puts "ERROR : Test failed: there is a difference between images. Discretization of the sub-shape in wireframe mode is incorrect"
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user