mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-10 18:51:21 +03:00
0026473: Offset API fails to create offset shape
Tolerance of map building changed. Added possibility to work 0.0 offset value. Added test cases bugs/modalg_6/bug26473_1 bug26473_2
This commit is contained in:
parent
c5d8782cfd
commit
03383c97c3
src/BRepOffset
tests/bugs/modalg_6
@ -171,7 +171,7 @@ void BRepOffset_Analyse::Perform (const TopoDS_Shape& S,
|
||||
myShape = S;
|
||||
|
||||
angle = Angle;
|
||||
Standard_Real SinTol = sin(Angle);
|
||||
Standard_Real SinTol = Sin(Angle);
|
||||
|
||||
// Build ancestors.
|
||||
BuildAncestors (S,ancestors);
|
||||
|
@ -666,7 +666,7 @@ static void EvalMax(const TopoDS_Shape& S, Standard_Real& Tol)
|
||||
|
||||
void BRepOffset_MakeOffset::MakeOffsetShape()
|
||||
{
|
||||
myDone = Standard_False;
|
||||
myDone = Standard_False;
|
||||
//------------------------------------------
|
||||
// Construction of myShape without caps.
|
||||
//------------------------------------------
|
||||
@ -674,20 +674,40 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
|
||||
{
|
||||
RemoveCorks (myShape,myFaces);
|
||||
}
|
||||
|
||||
|
||||
if (! IsConnectedShell(myShape))
|
||||
Standard_ConstructionError::Raise("BRepOffset_MakeOffset : Incorrect set of faces to remove, the remaining shell is not connected");
|
||||
|
||||
if (Abs(myOffset) < myTol) return;
|
||||
if (Abs(myOffset) <= myTol)
|
||||
{
|
||||
// Check for face with non-null offset value.
|
||||
Standard_Boolean isFound = Standard_False;
|
||||
TopTools_DataMapIteratorOfDataMapOfShapeReal anIter(myFaceOffset);
|
||||
for( ; anIter.More(); anIter.Next())
|
||||
{
|
||||
if (Abs(anIter.Value()) > myTol)
|
||||
{
|
||||
isFound = Standard_True;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isFound)
|
||||
{
|
||||
// No face with non-null offset found.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
TopAbs_State Side = TopAbs_IN;
|
||||
if (myOffset < 0.) Side = TopAbs_OUT;
|
||||
|
||||
// ------------
|
||||
// Preanalyse.
|
||||
// ------------
|
||||
EvalMax(myShape,myTol);
|
||||
// There are possible second variant: analytical continuation of arcsin.
|
||||
Standard_Real TolAngleCoeff = Min(myTol/Abs(myOffset*0.5), 1.0);
|
||||
Standard_Real TolAngleCoeff = Min(myTol / (Abs(myOffset * 0.5) + Precision::Confusion()), 1.0);
|
||||
Standard_Real TolAngle = 4*ASin(TolAngleCoeff);
|
||||
myAnalyse.Perform(myShape,TolAngle);
|
||||
//---------------------------------------------------
|
||||
@ -1033,12 +1053,12 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
|
||||
// Extension of neighbor edges of new edges and intersection between neighbors.
|
||||
//--------------------------------------------------------------------------------
|
||||
Handle(BRepAlgo_AsDes) AsDes2d = new BRepAlgo_AsDes();
|
||||
for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) {
|
||||
for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next())
|
||||
{
|
||||
const TopoDS_Face& FI = TopoDS::Face(Exp.Current());
|
||||
// Modified by skv - Mon Jan 12 11:50:02 2004 OCC4455 Begin
|
||||
// BRepOffset_Inter2d::ConnexIntByInt (FI,MapSF(FI),MES,Build,AsDes2d,myTol);
|
||||
BRepOffset_Inter2d::ConnexIntByInt (FI,MapSF(FI),MES,Build,AsDes2d,myOffset, myTol);
|
||||
// Modified by skv - Mon Jan 12 11:50:03 2004 OCC4455 End
|
||||
Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(FI);
|
||||
BRepOffset_Inter2d::ConnexIntByInt (FI, MapSF(FI), MES, Build,
|
||||
AsDes2d, myOffset, aCurrFaceTol);
|
||||
}
|
||||
//-----------------------------------------------------------
|
||||
// Great restriction of new edges and update of AsDes.
|
||||
@ -1114,17 +1134,21 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
|
||||
}
|
||||
|
||||
TopTools_ListIteratorOfListOfShape itLFE(LFE);
|
||||
for (; itLFE.More(); itLFE.Next()) {
|
||||
for (; itLFE.More(); itLFE.Next())
|
||||
{
|
||||
const TopoDS_Face& NEF = TopoDS::Face(itLFE.Value());
|
||||
BRepOffset_Inter2d::Compute(AsDes,NEF,NewEdges,myTol);
|
||||
Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(NEF);
|
||||
BRepOffset_Inter2d::Compute(AsDes, NEF, NewEdges, aCurrFaceTol);
|
||||
}
|
||||
//----------------------------------------------
|
||||
// Intersections 2d on caps.
|
||||
//----------------------------------------------
|
||||
Standard_Integer i;
|
||||
for (i = 1; i <= myFaces.Extent(); i++) {
|
||||
for (i = 1; i <= myFaces.Extent(); i++)
|
||||
{
|
||||
const TopoDS_Face& Cork = TopoDS::Face(myFaces(i));
|
||||
BRepOffset_Inter2d::Compute(AsDes,Cork,NewEdges,myTol);
|
||||
Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(Cork);
|
||||
BRepOffset_Inter2d::Compute(AsDes, Cork, NewEdges, aCurrFaceTol);
|
||||
}
|
||||
|
||||
//-------------------------------
|
||||
|
15
tests/bugs/modalg_6/bug26473_1
Normal file
15
tests/bugs/modalg_6/bug26473_1
Normal file
@ -0,0 +1,15 @@
|
||||
puts "=========="
|
||||
puts "OCC26473"
|
||||
puts "=========="
|
||||
puts ""
|
||||
################################################
|
||||
# Offset API fails to create offset shape
|
||||
################################################
|
||||
|
||||
restore [locate_data_file bug26473_offset_shape.input.brep] i
|
||||
offsetparameter 1e-7 c i
|
||||
offsetload i 1
|
||||
offsetperform result
|
||||
|
||||
set square 605144
|
||||
set 2dviewer 1
|
17
tests/bugs/modalg_6/bug26473_2
Normal file
17
tests/bugs/modalg_6/bug26473_2
Normal file
@ -0,0 +1,17 @@
|
||||
puts "=========="
|
||||
puts "OCC26473"
|
||||
puts "=========="
|
||||
puts ""
|
||||
################################################
|
||||
# Offset API fails to create offset shape
|
||||
################################################
|
||||
|
||||
box b1 0.0 0.0 0.0 1.0 1.0 1.0
|
||||
explode b1 F
|
||||
offsetparameter 1e-7 c i
|
||||
offsetload b1 0.0
|
||||
offsetonface b1_1 1.0
|
||||
offsetperform result
|
||||
|
||||
set square 10
|
||||
set 2dviewer 1
|
Loading…
x
Reference in New Issue
Block a user