Skip to content

Commit

Permalink
0025415: Data Exchange - Invalid result of loading a STEP file
Browse files Browse the repository at this point in the history
Handling of special case found on some STEP files produced by FPX Expert 2013 (PCB design system):
edge curve is line displaced from its true position but with correct direction;
we shift the line in this case so that it passes through vertices correcty.

Protection against possible exception in writing XDE.
  • Loading branch information
a-betenev authored and dpasukhi committed Mar 31, 2024
1 parent c7fd6ca commit 689b596
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/STEPCAFControl/STEPCAFControl_Writer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -983,7 +983,7 @@ static Standard_Integer FindEntities(const Handle(Transfer_FinderProcess)& theFP
//Handle(Transfer_TransientListBinder)::DownCast( bnd->Next(Standard_True) );
Handle(Transfer_TransientListBinder)::DownCast(aBinder);
Standard_Integer aResCount = 0;
if (aTransientListBinder.IsNull() && theShape.ShapeType() == TopAbs_COMPOUND)
if (aTransientListBinder.IsNull())
{
for (TopoDS_Iterator anIter(theShape); anIter.More(); anIter.Next())
{
Expand Down
19 changes: 18 additions & 1 deletion src/StepToTopoDS/StepToTopoDS_TranslateEdge.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,24 @@ void StepToTopoDS_TranslateEdge::MakeFromCurve3D
temp1 = pU1.Distance ( pv1 );
temp2 = pU2.Distance ( pv2 );
if ( temp1 > preci || temp2 > preci ) {
TP->AddWarning (C3D,"Poor result from projection vertex / curve 3d");
// #25415: handling of special case found on some STEP files produced by FPX Expert 2013 (PCB design system):
// edge curve is line displaced from its true position but with correct direction;
// we can shift the line in this case so that it passes through vertices correcty
if (Abs (temp1 - temp2) < preci && Abs (U2 - U1 - pnt1.Distance(pnt2)) < Precision::Confusion() &&
C1->IsKind(STANDARD_TYPE(Geom_Line)))
{
Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (C1);
gp_Lin aLin = aLine->Lin();
gp_Pnt anOrigin = pnt1.XYZ() - aLin.Position().Direction().XYZ() * U1;
aLin.SetLocation (anOrigin);
C1 = new Geom_Line (aLin);

TP->AddWarning (C3D,"Poor result from projection vertex / line 3d, line shifted");
}
else
{
TP->AddWarning (C3D,"Poor result from projection vertex / curve 3d");
}
}
B.UpdateVertex ( V1, 1.000001*temp1 ); //:h6 abv 14 Jul 98: PRO8845 #2746: *=1.0001
B.UpdateVertex ( V2, 1.000001*temp2 ); //:h6
Expand Down
11 changes: 11 additions & 0 deletions tests/bugs/step/bug25415
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
puts "========"
puts "OCC25415"
puts "========"
puts ""
##########################################################################
# Invalid result of loading a STEP file
##########################################################################

stepread [locate_data_file bug25415_part_of_hdrv8w64p254_4x2_1016x502h838p.stp] a *

checkshape a_1

0 comments on commit 689b596

Please sign in to comment.