mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-19 13:40:49 +03:00
0031301: Data Exchange - Export to STEP corrupts the shape
For small edges fully covered by tolerances of vertices BSpline periodic curves are converted to not periodic BSpline curves by cutting segment before writing. In the class TopoDSToStep_MakeStepEdge permute of edge vertices for closed curves was added for the case when the range obtained from the vertex projection contradicts the edge range in order to avoid computation of the invalid edge range after reading.
This commit is contained in:
@@ -42,6 +42,7 @@
|
|||||||
#include <StepGeom_Conic.hxx>
|
#include <StepGeom_Conic.hxx>
|
||||||
#include <StepGeom_Curve.hxx>
|
#include <StepGeom_Curve.hxx>
|
||||||
#include <StepGeom_Line.hxx>
|
#include <StepGeom_Line.hxx>
|
||||||
|
#include <Geom2d_TrimmedCurve.hxx>
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
// Creation d' une Curve de prostep a partir d' une Curve de Geom
|
// Creation d' une Curve de prostep a partir d' une Curve de Geom
|
||||||
@@ -162,6 +163,10 @@ GeomToStep_MakeCurve::GeomToStep_MakeCurve ( const Handle(Geom2d_Curve)& C)
|
|||||||
GeomToStep_MakeBoundedCurve MkBoundedC(L);
|
GeomToStep_MakeBoundedCurve MkBoundedC(L);
|
||||||
theCurve = MkBoundedC.Value();
|
theCurve = MkBoundedC.Value();
|
||||||
}
|
}
|
||||||
|
else if (C->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) {
|
||||||
|
GeomToStep_MakeCurve aMaker = (Handle(Geom2d_TrimmedCurve)::DownCast(C)->BasisCurve());
|
||||||
|
theCurve = aMaker.Value();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
done = Standard_False;
|
done = Standard_False;
|
||||||
}
|
}
|
||||||
|
@@ -53,6 +53,8 @@
|
|||||||
#include <Transfer_FinderProcess.hxx>
|
#include <Transfer_FinderProcess.hxx>
|
||||||
#include <TransferBRep.hxx>
|
#include <TransferBRep.hxx>
|
||||||
#include <TransferBRep_ShapeMapper.hxx>
|
#include <TransferBRep_ShapeMapper.hxx>
|
||||||
|
#include <BRepTools.hxx>
|
||||||
|
#include <ShapeAnalysis_Curve.hxx>
|
||||||
|
|
||||||
// Processing of non-manifold topology (ssv; 11.11.2010)
|
// Processing of non-manifold topology (ssv; 11.11.2010)
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -185,6 +187,55 @@ void TopoDSToStep_MakeStepEdge::Init(const TopoDS_Edge& aEdge,
|
|||||||
Handle(Geom_Curve) C = CA.Curve().Curve();
|
Handle(Geom_Curve) C = CA.Curve().Curve();
|
||||||
if (!C.IsNull()) {
|
if (!C.IsNull()) {
|
||||||
C = Handle(Geom_Curve)::DownCast(C->Copy());
|
C = Handle(Geom_Curve)::DownCast(C->Copy());
|
||||||
|
|
||||||
|
if (C->IsPeriodic())
|
||||||
|
{
|
||||||
|
Standard_Real dpar = CA.LastParameter() - CA.FirstParameter();
|
||||||
|
|
||||||
|
Standard_Real aTolV1 = BRep_Tool::Tolerance(Vfirst);
|
||||||
|
Standard_Real aTolV2 = BRep_Tool::Tolerance(Vlast);
|
||||||
|
gp_Pnt aP1 = BRep_Tool::Pnt(Vfirst);
|
||||||
|
gp_Pnt aP2 = BRep_Tool::Pnt(Vlast);
|
||||||
|
gp_Pnt pproj;
|
||||||
|
gp_Pnt aP11 = CA.Value(CA.FirstParameter());
|
||||||
|
gp_Pnt aP12 =CA.Value(CA.LastParameter());
|
||||||
|
ShapeAnalysis_Curve sac;
|
||||||
|
sac.Project (C, aP1, Tolerance(), pproj, U1, Standard_False);
|
||||||
|
sac.Project (C, aP2, Tolerance(), pproj, U2, Standard_False);
|
||||||
|
Standard_Real dU = U2 - U1;
|
||||||
|
|
||||||
|
if (dpar <= 0)
|
||||||
|
dpar += (ceil(fabs(dpar) / C->Period()) *C->Period());
|
||||||
|
|
||||||
|
if (dU <= 0)
|
||||||
|
dU += (ceil(fabs(dU) / C->Period()) *C->Period());
|
||||||
|
// if range obtained from projection of vertices is contradicted with range of the edge
|
||||||
|
//tnen vertices should be permuted
|
||||||
|
|
||||||
|
if ((dU > Precision::PConfusion() && dU <= 0.1 * C->Period() && dpar > 0.5 * C->Period()) ||
|
||||||
|
(dpar > Precision::PConfusion() && dpar <= 0.1 * C->Period() && dU > 0.5 * C->Period()))
|
||||||
|
{
|
||||||
|
Handle(StepShape_Vertex) aVtemp = V1;
|
||||||
|
V1 = V2; V2 = aVtemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
gp_Pnt aPm = CA.Value((CA.FirstParameter() + CA.LastParameter()) *0.5);
|
||||||
|
Standard_Real aDist11 = aP11.Distance(aP12);
|
||||||
|
Standard_Real aDist1m = aP11.Distance(aPm);
|
||||||
|
Standard_Real aDist2m = aP12.Distance(aPm);
|
||||||
|
Standard_Real aDistMax = Max(Max(aDist1m, aDist2m), aDist11);
|
||||||
|
Standard_Boolean isSmallCurve = (aDistMax <= aTolV1 || aDistMax <= aTolV2);
|
||||||
|
//for small edge lying BSpline periodic curve segment of the BSpline periodic curve is used to avoid invalid computation of the edge range duriring reading
|
||||||
|
if (BRepTools::Compare(Vfirst, Vlast) && isSmallCurve && C->IsPeriodic() && dpar > Precision::PConfusion() && dpar <= 0.1 * C->Period())
|
||||||
|
{
|
||||||
|
if (C->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
|
||||||
|
{
|
||||||
|
Handle(Geom_BSplineCurve) aBspl1 = Handle(Geom_BSplineCurve)::DownCast(C->Copy());
|
||||||
|
aBspl1->Segment (CA.FirstParameter(), CA.LastParameter());
|
||||||
|
C = aBspl1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
gp_Trsf Tr1 = CA.Trsf();
|
gp_Trsf Tr1 = CA.Trsf();
|
||||||
C->Transform(Tr1);
|
C->Transform(Tr1);
|
||||||
GeomToStep_MakeCurve MkCurve(C);
|
GeomToStep_MakeCurve MkCurve(C);
|
||||||
|
5
tests/bugs/step/bug31301
Normal file
5
tests/bugs/step/bug31301
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
testreadstep [locate_data_file bug31301.stp] s
|
||||||
|
testwritestep bug31301_1.stp s
|
||||||
|
testreadstep bug31301_1.stp s1
|
||||||
|
checkshape s1 f
|
||||||
|
checkmaxtol s1 -ref 0.0078
|
@@ -1,17 +1,16 @@
|
|||||||
# !!!! This file is generated automatically, do not edit manually! See end script
|
# !!!! This file is generated automatically, do not edit manually! See end script
|
||||||
puts "TODO CR23096 ALL: CHECKSHAPE : Faulty"
|
puts "TODO CR23096 ALL: CHECKSHAPE : Faulty"
|
||||||
puts "TODO CR23096 ALL: TOLERANCE : Faulty"
|
|
||||||
|
|
||||||
|
|
||||||
set filename trj7_pm5-ug-214.stp
|
set filename trj7_pm5-ug-214.stp
|
||||||
|
|
||||||
set ref_data {
|
set ref_data {
|
||||||
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
||||||
TPSTAT : Faulties = 0 ( 0 ) Warnings = 5 ( 184 ) Summary = 5 ( 184 )
|
TPSTAT : Faulties = 0 ( 0 ) Warnings = 3 ( 184 ) Summary = 3 ( 184 )
|
||||||
CHECKSHAPE : Wires = 2 ( 0 ) Faces = 2 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
CHECKSHAPE : Wires = 1 ( 0 ) Faces = 1 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
||||||
NBSHAPES : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 236 ( 236 )
|
NBSHAPES : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 236 ( 236 )
|
||||||
STATSHAPE : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 236 ( 236 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 236 ( 236 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 0.9036712735 ( 0.01854047103 ) AvgTol = 0.002850040066 ( 0.0006030086632 )
|
TOLERANCE : MaxTol = 0.004380869792 ( 0.01854047103 ) AvgTol = 0.000165684279 ( 0.0006030086632 )
|
||||||
LABELS : N0Labels = 1 ( 1 ) N1Labels = 34 ( 34 ) N2Labels = 0 ( 0 ) TotalLabels = 35 ( 35 ) NameLabels = 1 ( 1 ) ColorLabels = 35 ( 35 ) LayerLabels = 1 ( 1 )
|
LABELS : N0Labels = 1 ( 1 ) N1Labels = 34 ( 34 ) N2Labels = 0 ( 0 ) TotalLabels = 35 ( 35 ) NameLabels = 1 ( 1 ) ColorLabels = 35 ( 35 ) LayerLabels = 1 ( 1 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 11 ( 11 )
|
NCOLORS : NColors = 11 ( 11 )
|
||||||
|
@@ -6,11 +6,11 @@ set filename test-m020306-v1.stp
|
|||||||
|
|
||||||
set ref_data {
|
set ref_data {
|
||||||
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
||||||
TPSTAT : Faulties = 0 ( 0 ) Warnings = 153 ( 114 ) Summary = 153 ( 114 )
|
TPSTAT : Faulties = 1 ( 0 ) Warnings = 153 ( 114 ) Summary = 154 ( 114 )
|
||||||
CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
||||||
NBSHAPES : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 742 ( 742 )
|
NBSHAPES : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 742 ( 742 )
|
||||||
STATSHAPE : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 742 ( 742 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 742 ( 742 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 0.008481946718 ( 0.01167623167 ) AvgTol = 0.000132472064 ( 0.0003097606769 )
|
TOLERANCE : MaxTol = 0.008481946718 ( 0.01167623167 ) AvgTol = 0.0001322682241 ( 0.0003097606769 )
|
||||||
LABELS : N0Labels = 1 ( 1 ) N1Labels = 0 ( 0 ) N2Labels = 0 ( 0 ) TotalLabels = 1 ( 1 ) NameLabels = 1 ( 1 ) ColorLabels = 0 ( 0 ) LayerLabels = 0 ( 0 )
|
LABELS : N0Labels = 1 ( 1 ) N1Labels = 0 ( 0 ) N2Labels = 0 ( 0 ) TotalLabels = 1 ( 1 ) NameLabels = 1 ( 1 ) ColorLabels = 0 ( 0 ) LayerLabels = 0 ( 0 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 0 ( 0 )
|
NCOLORS : NColors = 0 ( 0 )
|
||||||
|
@@ -1,13 +1,16 @@
|
|||||||
# !!!! This file is generated automatically, do not edit manually! See end script
|
# !!!! This file is generated automatically, do not edit manually! See end script
|
||||||
|
puts "TODO CR23096 ALL: TPSTAT : Faulty"
|
||||||
|
|
||||||
|
|
||||||
set filename test-m020306-v2.stp
|
set filename test-m020306-v2.stp
|
||||||
|
|
||||||
set ref_data {
|
set ref_data {
|
||||||
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
||||||
TPSTAT : Faulties = 0 ( 0 ) Warnings = 61 ( 157 ) Summary = 61 ( 157 )
|
TPSTAT : Faulties = 1 ( 0 ) Warnings = 63 ( 157 ) Summary = 64 ( 157 )
|
||||||
CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
||||||
NBSHAPES : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 956 ( 956 )
|
NBSHAPES : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 956 ( 956 )
|
||||||
STATSHAPE : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 956 ( 956 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 1 ( 1 ) Shell = 1 ( 1 ) Face = 956 ( 956 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 0.008481946718 ( 0.05394823207 ) AvgTol = 0.0001239210367 ( 0.0004089750747 )
|
TOLERANCE : MaxTol = 0.008481946718 ( 0.01167623167 ) AvgTol = 0.000123986292 ( 0.0003770309367 )
|
||||||
LABELS : N0Labels = 1 ( 1 ) N1Labels = 0 ( 0 ) N2Labels = 0 ( 0 ) TotalLabels = 1 ( 1 ) NameLabels = 1 ( 1 ) ColorLabels = 0 ( 0 ) LayerLabels = 0 ( 0 )
|
LABELS : N0Labels = 1 ( 1 ) N1Labels = 0 ( 0 ) N2Labels = 0 ( 0 ) TotalLabels = 1 ( 1 ) NameLabels = 1 ( 1 ) ColorLabels = 0 ( 0 ) LayerLabels = 0 ( 0 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 0 ( 0 )
|
NCOLORS : NColors = 0 ( 0 )
|
||||||
|
@@ -1,13 +1,16 @@
|
|||||||
# !!!! This file is generated automatically, do not edit manually! See end script
|
# !!!! This file is generated automatically, do not edit manually! See end script
|
||||||
|
puts "TODO CR23096 ALL: TPSTAT : Faulty"
|
||||||
|
|
||||||
|
|
||||||
set filename Inventor_Engine.stp
|
set filename Inventor_Engine.stp
|
||||||
|
|
||||||
set ref_data {
|
set ref_data {
|
||||||
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
||||||
TPSTAT : Faulties = 0 ( 0 ) Warnings = 456 ( 560 ) Summary = 456 ( 560 )
|
TPSTAT : Faulties = 1 ( 0 ) Warnings = 455 ( 560 ) Summary = 456 ( 560 )
|
||||||
CHECKSHAPE : Wires = 6 ( 6 ) Faces = 6 ( 6 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
CHECKSHAPE : Wires = 6 ( 6 ) Faces = 6 ( 6 ) Shells = 0 ( 0 ) Solids = 0 ( 0 )
|
||||||
NBSHAPES : Solid = 47 ( 47 ) Shell = 47 ( 47 ) Face = 4454 ( 4454 )
|
NBSHAPES : Solid = 47 ( 47 ) Shell = 47 ( 47 ) Face = 4454 ( 4454 )
|
||||||
STATSHAPE : Solid = 80 ( 80 ) Shell = 80 ( 80 ) Face = 5356 ( 5356 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 80 ( 80 ) Shell = 80 ( 80 ) Face = 5356 ( 5356 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 2.37122237 ( 2.449305641 ) AvgTol = 0.002570949956 ( 0.002589629313 )
|
TOLERANCE : MaxTol = 2.371238233 ( 2.449305641 ) AvgTol = 0.001672277308 ( 0.002589629313 )
|
||||||
LABELS : N0Labels = 52 ( 52 ) N1Labels = 86 ( 86 ) N2Labels = 0 ( 0 ) TotalLabels = 138 ( 138 ) NameLabels = 136 ( 136 ) ColorLabels = 47 ( 47 ) LayerLabels = 0 ( 0 )
|
LABELS : N0Labels = 52 ( 52 ) N1Labels = 86 ( 86 ) N2Labels = 0 ( 0 ) TotalLabels = 138 ( 138 ) NameLabels = 136 ( 136 ) ColorLabels = 47 ( 47 ) LayerLabels = 0 ( 0 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 11 ( 11 )
|
NCOLORS : NColors = 11 ( 11 )
|
||||||
|
@@ -7,11 +7,11 @@ set filename Z8INV5.stp
|
|||||||
|
|
||||||
set ref_data {
|
set ref_data {
|
||||||
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 )
|
||||||
TPSTAT : Faulties = 0 ( 0 ) Warnings = 120 ( 620 ) Summary = 120 ( 620 )
|
TPSTAT : Faulties = 0 ( 0 ) Warnings = 121 ( 620 ) Summary = 121 ( 620 )
|
||||||
CHECKSHAPE : Wires = 15 ( 16 ) Faces = 17 ( 18 ) Shells = 1 ( 1 ) Solids = 0 ( 0 )
|
CHECKSHAPE : Wires = 15 ( 16 ) Faces = 18 ( 18 ) Shells = 1 ( 1 ) Solids = 0 ( 0 )
|
||||||
NBSHAPES : Solid = 22 ( 22 ) Shell = 25 ( 24 ) Face = 1520 ( 1519 )
|
NBSHAPES : Solid = 22 ( 22 ) Shell = 25 ( 24 ) Face = 1521 ( 1519 )
|
||||||
STATSHAPE : Solid = 22 ( 22 ) Shell = 25 ( 24 ) Face = 1520 ( 1519 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 22 ( 22 ) Shell = 25 ( 24 ) Face = 1521 ( 1519 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 7.499684301 ( 7.499684301 ) AvgTol = 0.03452373473 ( 0.03544461059 )
|
TOLERANCE : MaxTol = 7.499684301 ( 7.499684301 ) AvgTol = 0.03357316863 ( 0.03544461059 )
|
||||||
LABELS : N0Labels = 25 ( 25 ) N1Labels = 23 ( 23 ) N2Labels = 0 ( 0 ) TotalLabels = 48 ( 48 ) NameLabels = 48 ( 48 ) ColorLabels = 0 ( 0 ) LayerLabels = 0 ( 0 )
|
LABELS : N0Labels = 25 ( 25 ) N1Labels = 23 ( 23 ) N2Labels = 0 ( 0 ) TotalLabels = 48 ( 48 ) NameLabels = 48 ( 48 ) ColorLabels = 0 ( 0 ) LayerLabels = 0 ( 0 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 0 ( 0 )
|
NCOLORS : NColors = 0 ( 0 )
|
||||||
|
Reference in New Issue
Block a user