mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-05 18:16:23 +03:00
0025242: Wrong result of cut operation.
1. class BOPDS_Iterator method: void BOPDS_Iterator::Intersect() The ttreatment of solid/* interferences has been added. 2 class BOPAlgo_PaveFiller protected methods: void BOPAlgo_PaveFiller::PerformVZ() void BOPAlgo_PaveFiller::PerformEZ() void BOPAlgo_PaveFiller::PerformFZ() void BOPAlgo_PaveFiller::PerformZZ() has been added. The methods are to Compute Vertex/Solid Edge/Solid Face/Solid Solid/Solid interferences. 3. class BOPAlgo_PaveFiller protected method: void BOPAlgo_PaveFiller::PerformFF() Empty interferences has not been added in the interferences' table 4. class BOPAlgo_CheckerSI protected methods: void BOPAlgo_CheckerSI::PerformVZ() void BOPAlgo_CheckerSI:PerformEZ() void BOPAlgo_CheckerSI::PerformFZ() void BOPAlgo_CheckerSI::PerformZZ() has been removed. 5. class BOPAlgo_BOP protected method: void BOPAlgo_BOP::BuildRC() void BOPAlgo_BOP::BuildSolid() changed to treat non-interferred solids and keep it in the result as they were Test case for issue #25242
This commit is contained in:
parent
418864aea1
commit
955b3e7102
@ -39,6 +39,18 @@
|
||||
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <NCollection_IncAllocator.hxx>
|
||||
//
|
||||
#include <BOPTools_Set.hxx>
|
||||
#include <BOPTools_SetMapHasher.hxx>
|
||||
#include <NCollection_DataMap.hxx>
|
||||
|
||||
typedef NCollection_DataMap
|
||||
<BOPTools_Set,
|
||||
TopoDS_Shape,
|
||||
BOPTools_SetMapHasher> BOPTools_DataMapOfSetShape;
|
||||
//
|
||||
typedef BOPTools_DataMapOfSetShape::Iterator
|
||||
BOPTools_DataMapIteratorOfDataMapOfSetShape;
|
||||
|
||||
static
|
||||
TopAbs_ShapeEnum TypeToExplore(const Standard_Integer theDim);
|
||||
@ -479,7 +491,10 @@ void BOPAlgo_BOP::BuildRC()
|
||||
BRep_Builder aBB;
|
||||
TopExp_Explorer aExp;
|
||||
BOPCol_DataMapOfShapeShape aDMSSA;
|
||||
BOPCol_ListIteratorOfListOfShape aItLS, aItIm;
|
||||
BOPCol_ListIteratorOfListOfShape aItLS, aItIm;
|
||||
Standard_Boolean bHasInterf;
|
||||
Standard_Integer iX;
|
||||
BOPTools_DataMapOfSetShape aDMSTS;
|
||||
//
|
||||
myErrorStatus=0;
|
||||
//
|
||||
@ -531,6 +546,17 @@ void BOPAlgo_BOP::BuildRC()
|
||||
for (; aExp.More(); aExp.Next()) {
|
||||
const TopoDS_Shape aSIm=aExp.Current();
|
||||
aDMSSA.Bind(aSIm, aSIm);
|
||||
if (aTmin==TopAbs_SOLID) {
|
||||
iX=myDS->Index(aSIm);
|
||||
bHasInterf=myDS->HasInterf(iX);
|
||||
if (!bHasInterf) {
|
||||
BOPTools_Set aST;
|
||||
//
|
||||
aST.Add(aSIm, TopAbs_FACE);
|
||||
//
|
||||
aDMSTS.Bind(aST, aSIm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} //for (; aItLS.More(); aItLS.Next())
|
||||
@ -569,7 +595,7 @@ void BOPAlgo_BOP::BuildRC()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}// if (myImages.IsBound(aST)){
|
||||
else {
|
||||
aExp.Init(aST, aTmin);
|
||||
for (; aExp.More(); aExp.Next()) {
|
||||
@ -587,10 +613,32 @@ void BOPAlgo_BOP::BuildRC()
|
||||
const TopoDS_Shape& aSImA=aDMSSA.Find(aSIm);
|
||||
aBB.Add(aC, aSImA);
|
||||
}
|
||||
else {
|
||||
if (aTmin==TopAbs_SOLID) {
|
||||
BOPTools_Set aST;
|
||||
//
|
||||
aST.Add(aSIm, TopAbs_FACE);
|
||||
//
|
||||
if (aDMSTS.IsBound(aST)) {
|
||||
const TopoDS_Shape& aSImA=aDMSTS.Find(aST);
|
||||
aBB.Add(aC, aSImA);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {// ie cut or cut21
|
||||
if (!bIsBound) {
|
||||
aBB.Add(aC, aSIm);
|
||||
if (aTmin==TopAbs_SOLID) {
|
||||
BOPTools_Set aST;
|
||||
//
|
||||
aST.Add(aSIm, TopAbs_FACE);
|
||||
//
|
||||
bIsBound=aDMSTS.IsBound(aST);
|
||||
}
|
||||
//
|
||||
if (!bIsBound) {
|
||||
aBB.Add(aC, aSIm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -739,7 +787,8 @@ void BOPAlgo_BOP::BuildShape()
|
||||
//=======================================================================
|
||||
void BOPAlgo_BOP::BuildSolid()
|
||||
{
|
||||
Standard_Integer i, aNbF, aNbSx, iX, iErr;
|
||||
Standard_Boolean bHasInterf, bHasSharedFaces;
|
||||
Standard_Integer i, aNbF, aNbSx, iX, iErr, aNbZ;
|
||||
TopAbs_Orientation aOr, aOr1;
|
||||
TopoDS_Iterator aIt;
|
||||
TopoDS_Shape aRC;
|
||||
@ -749,13 +798,73 @@ void BOPAlgo_BOP::BuildSolid()
|
||||
BOPCol_IndexedDataMapOfShapeListOfShape aMFS, aMEF;
|
||||
BOPCol_ListIteratorOfListOfShape aItLS;
|
||||
BOPCol_ListOfShape aSFS;
|
||||
BOPAlgo_BuilderSolid aSB;
|
||||
BOPAlgo_BuilderSolid aSB;
|
||||
BOPCol_MapOfShape aMSA, aMZ;
|
||||
BOPTools_DataMapOfSetShape aDMSTS;
|
||||
BOPTools_DataMapIteratorOfDataMapOfSetShape aItDMSTS;
|
||||
//
|
||||
myErrorStatus=0;
|
||||
//
|
||||
// Map of of Solids of Arguments
|
||||
for (i=0; i<2; ++i) {
|
||||
const BOPCol_ListOfShape& aLSA=(i) ? myArguments : myTools;
|
||||
aItLS.Initialize(aLSA);
|
||||
for (; aItLS.More(); aItLS.Next()) {
|
||||
const TopoDS_Shape& aSA=aItLS.Value();
|
||||
aExp.Init(aSA, TopAbs_SOLID);
|
||||
for (; aExp.More(); aExp.Next()) {
|
||||
const TopoDS_Shape& aZA=aExp.Current();
|
||||
aMSA.Add(aZA);
|
||||
//
|
||||
BOPTools::MapShapesAndAncestors(aZA,
|
||||
TopAbs_FACE,
|
||||
TopAbs_SOLID,
|
||||
aMFS);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
aNbF=aMFS.Extent();
|
||||
for (i=1; i<aNbF; ++i) {
|
||||
//const TopoDS_Shape& aFA=aMFZA.FindKey(i);
|
||||
const BOPCol_ListOfShape& aLZA=aMFS(i);
|
||||
aNbZ=aLZA.Extent();
|
||||
if (aNbZ > 1) {
|
||||
aItLS.Initialize(aLZA);
|
||||
for(; aItLS.More(); aItLS.Next()) {
|
||||
const TopoDS_Shape& aZA=aItLS.Value();
|
||||
aMZ.Add(aZA);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
aMFS.Clear();
|
||||
//
|
||||
aIt.Initialize(myRC);
|
||||
for (; aIt.More(); aIt.Next()) {
|
||||
const TopoDS_Shape& aSx=aIt.Value();
|
||||
if (aMSA.Contains(aSx)) {
|
||||
iX=myDS->Index(aSx);
|
||||
bHasInterf=myDS->HasInterf(iX);
|
||||
bHasSharedFaces=aMZ.Contains(aSx);
|
||||
//
|
||||
if (!bHasInterf && !bHasSharedFaces) {
|
||||
// It means that the solid aSx will be added
|
||||
// to the result as is.
|
||||
// The solid aSx will not participate
|
||||
// in creation of a new solid(s).
|
||||
BOPTools_Set aST;
|
||||
//
|
||||
aST.Add(aSx, TopAbs_FACE);
|
||||
//
|
||||
if (!aDMSTS.IsBound(aST)) {
|
||||
aDMSTS.Bind(aST, aSx);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//
|
||||
aExp.Init(aSx, TopAbs_FACE);
|
||||
for (; aExp.More(); aExp.Next()) {
|
||||
const TopoDS_Shape& aFx=aExp.Current();
|
||||
@ -783,7 +892,7 @@ void BOPAlgo_BOP::BuildSolid()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // for (; aIt.More(); aIt.Next()) {
|
||||
//faces that will be added in the end;
|
||||
BOPCol_ListOfShape aLF, aLFx;
|
||||
// SFS
|
||||
@ -845,6 +954,13 @@ void BOPAlgo_BOP::BuildSolid()
|
||||
const TopoDS_Shape& aSR=aItLS.Value();
|
||||
aBB.Add(aRC, aSR);
|
||||
}
|
||||
//
|
||||
aItDMSTS.Initialize(aDMSTS);
|
||||
for (; aItDMSTS.More(); aItDMSTS.Next()) {
|
||||
const TopoDS_Shape& aSx=aItDMSTS.Value();
|
||||
aBB.Add(aRC, aSx);
|
||||
}
|
||||
//
|
||||
myShape=aRC;
|
||||
}
|
||||
//=======================================================================
|
||||
|
@ -65,28 +65,14 @@ is
|
||||
PostTreat (me:out)
|
||||
is protected;
|
||||
---Purpose: Provides post-treatment actions
|
||||
|
||||
PerformVZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Vertex/Solid interferences
|
||||
|
||||
PerformEZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Edge/Solid interferences
|
||||
|
||||
PerformFZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Face/Solid interferences
|
||||
PerformZZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Solid/Solid interferences
|
||||
|
||||
|
||||
PrepareCopy(me:out)
|
||||
is virtual protected;
|
||||
|
||||
PostTreatCopy (me:out)
|
||||
is protected;
|
||||
---Purpose: Provides post-treatment actions for the copy
|
||||
|
||||
|
||||
fields
|
||||
myLevelOfCheck: Integer from Standard is protected;
|
||||
|
@ -146,26 +146,6 @@ void BOPAlgo_CheckerSI::Perform()
|
||||
BOPAlgo_PaveFiller::Perform();
|
||||
iErr=myErrorStatus;
|
||||
//
|
||||
PerformVZ();
|
||||
if (myErrorStatus) {
|
||||
iErr=myErrorStatus;
|
||||
}
|
||||
//
|
||||
PerformEZ();
|
||||
if (myErrorStatus) {
|
||||
iErr=myErrorStatus;
|
||||
}
|
||||
//
|
||||
PerformFZ();
|
||||
if (myErrorStatus) {
|
||||
iErr=myErrorStatus;
|
||||
}
|
||||
//
|
||||
PerformZZ();
|
||||
if (myErrorStatus) {
|
||||
iErr=myErrorStatus;
|
||||
}
|
||||
//
|
||||
PostTreat();
|
||||
if (myErrorStatus) {
|
||||
iErr=myErrorStatus;
|
||||
|
@ -127,7 +127,23 @@ is
|
||||
PerformFF(me:out)
|
||||
is virtual protected;
|
||||
|
||||
|
||||
--modified by NIZNHY-PKV Fri Sep 12 07:05:37 2014f
|
||||
PerformVZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Vertex/Solid interferences
|
||||
|
||||
PerformEZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Edge/Solid interferences
|
||||
|
||||
PerformFZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Face/Solid interferences
|
||||
PerformZZ(me:out)
|
||||
is virtual protected;
|
||||
--Purpose: Computes Solid/Solid interferences
|
||||
--modified by NIZNHY-PKV Fri Sep 12 07:05:45 2014t
|
||||
|
||||
TreatVerticesEE(me:out)
|
||||
is protected;
|
||||
|
||||
|
@ -243,4 +243,27 @@ void BOPAlgo_PaveFiller::PerformInternal()
|
||||
if (myErrorStatus) {
|
||||
return;
|
||||
}
|
||||
//
|
||||
//modified by NIZNHY-PKV Fri Sep 12 07:06:50 2014f
|
||||
// 03
|
||||
PerformVZ();
|
||||
if (myErrorStatus) {
|
||||
return;
|
||||
}
|
||||
// 13
|
||||
PerformEZ();
|
||||
if (myErrorStatus) {
|
||||
return;
|
||||
}
|
||||
// 23
|
||||
PerformFZ();
|
||||
if (myErrorStatus) {
|
||||
return;
|
||||
}
|
||||
// 33
|
||||
PerformZZ();
|
||||
if (myErrorStatus) {
|
||||
return;
|
||||
}
|
||||
//modified by NIZNHY-PKV Fri Sep 12 07:06:52 2014t
|
||||
}
|
||||
|
@ -1,10 +1,9 @@
|
||||
// Created by: Peter KURNEV
|
||||
// Copyright (c) 2010-2012 OPEN CASCADE SAS
|
||||
// Copyright (c) 2010-2014 OPEN CASCADE SAS
|
||||
// Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
|
||||
// Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
|
||||
// EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||
//
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
@ -16,27 +15,28 @@
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <BOPAlgo_CheckerSI.ixx>
|
||||
#include <BOPAlgo_PaveFiller.ixx>
|
||||
|
||||
#include <gp_Pnt.hxx>
|
||||
|
||||
#include <TopAbs_State.hxx>
|
||||
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <TopoDS_Solid.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BRepClass3d_SolidClassifier.hxx>
|
||||
|
||||
#include <IntTools_Context.hxx>
|
||||
|
||||
#include <BOPDS_DS.hxx>
|
||||
#include <BOPDS_IteratorSI.hxx>
|
||||
#include <IntTools_Context.hxx>
|
||||
|
||||
#include <BOPDS_Interf.hxx>
|
||||
#include <TopoDS_Solid.hxx>
|
||||
#include <BRepClass3d_SolidClassifier.hxx>
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <gp_Pnt.hxx>
|
||||
#include <TopAbs_State.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BOPDS_VectorOfInterfVZ.hxx>
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : PerformVZ
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_CheckerSI::PerformVZ()
|
||||
void BOPAlgo_PaveFiller::PerformVZ()
|
||||
{
|
||||
Standard_Boolean bJustAdd;
|
||||
Standard_Integer iSize, nV, nZ, i;
|
||||
@ -85,15 +85,14 @@ void BOPAlgo_CheckerSI::PerformVZ()
|
||||
myDS->AddInterf(nV, nZ);
|
||||
}
|
||||
}
|
||||
//
|
||||
}
|
||||
//=======================================================================
|
||||
//function : PerformEZ
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_CheckerSI::PerformEZ()
|
||||
void BOPAlgo_PaveFiller::PerformEZ()
|
||||
{
|
||||
Standard_Boolean bJustAdd, bHasInterf;
|
||||
Standard_Boolean bJustAdd, bHasInterf;
|
||||
Standard_Integer iSize, nE, nZ, i;
|
||||
//
|
||||
myErrorStatus=0;
|
||||
@ -136,7 +135,7 @@ void BOPAlgo_CheckerSI::PerformEZ()
|
||||
//function : PerformFZ
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_CheckerSI::PerformFZ()
|
||||
void BOPAlgo_PaveFiller::PerformFZ()
|
||||
{
|
||||
Standard_Boolean bJustAdd, bHasInterf;
|
||||
Standard_Integer iSize, nF, nZ, i;
|
||||
@ -181,7 +180,7 @@ void BOPAlgo_CheckerSI::PerformFZ()
|
||||
//function : PerformZZ
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_CheckerSI::PerformZZ()
|
||||
void BOPAlgo_PaveFiller::PerformZZ()
|
||||
{
|
||||
Standard_Boolean bJustAdd, bHasInterf, bFlag;
|
||||
Standard_Integer iSize, nZ1, nZ, i;
|
@ -300,7 +300,9 @@ void BOPAlgo_PaveFiller::PerformFF()
|
||||
aNbCurves=aCvsX.Length();
|
||||
aNbPoints=aPntsX.Length();
|
||||
//
|
||||
myDS->AddInterf(nF1, nF2);
|
||||
if (aNbCurves || aNbPoints) {
|
||||
myDS->AddInterf(nF1, nF2);
|
||||
}
|
||||
//
|
||||
iX=aFFs.Append()-1;
|
||||
BOPDS_InterfFF& aFF=aFFs(iX);
|
||||
|
@ -6,6 +6,8 @@ BOPAlgo_PaveFiller_5.cxx
|
||||
BOPAlgo_PaveFiller_6.cxx
|
||||
BOPAlgo_PaveFiller_7.cxx
|
||||
BOPAlgo_PaveFiller_8.cxx
|
||||
BOPAlgo_PaveFiller_9.cxx
|
||||
BOPAlgo_PaveFiller_10.cxx
|
||||
BOPAlgo_Builder_1.cxx
|
||||
BOPAlgo_Builder_2.cxx
|
||||
BOPAlgo_Builder_3.cxx
|
||||
@ -13,5 +15,5 @@ BOPAlgo_Builder_4.cxx
|
||||
BOPAlgo_BOP_1.cxx
|
||||
BOPAlgo_WireSplitter_1.cxx
|
||||
BOPAlgo_ListOfCheckResult.hxx
|
||||
BOPAlgo_CheckerSI_1.cxx
|
||||
BOPAlgo_PaveFiller_9.cxx
|
||||
|
||||
|
||||
|
@ -278,7 +278,7 @@ void BOPDS_Iterator::Intersect()
|
||||
//
|
||||
for (i=0; i<aNb; ++i) {
|
||||
const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
|
||||
bFlag=aSI.HasBRep();
|
||||
bFlag=aSI.IsInterfering();
|
||||
//
|
||||
BOPDS_TSR& aTSR=aVTSR.Append1();
|
||||
//
|
||||
@ -308,7 +308,7 @@ void BOPDS_Iterator::Intersect()
|
||||
for (i=i1; i<=i2; ++i) {
|
||||
const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
|
||||
//
|
||||
if (!aSI.HasBRep()){
|
||||
if (!aSI.IsInterfering()){
|
||||
continue;
|
||||
}
|
||||
//
|
||||
|
23
tests/bugs/modalg_5/bug25242
Normal file
23
tests/bugs/modalg_5/bug25242
Normal file
@ -0,0 +1,23 @@
|
||||
puts "================"
|
||||
puts "OCC25242"
|
||||
puts "================"
|
||||
puts ""
|
||||
#################################
|
||||
# Wrong result of cut operation
|
||||
#################################
|
||||
|
||||
box a 0 0 0 10 10 10
|
||||
box b 20 0 0 10 10 10
|
||||
|
||||
bfuse r0 a b
|
||||
bcut result r0 a
|
||||
|
||||
set nb_v_good 8
|
||||
set nb_e_good 12
|
||||
set nb_w_good 6
|
||||
set nb_f_good 6
|
||||
set nb_sh_good 1
|
||||
set nb_sol_good 1
|
||||
set nb_compsol_good 0
|
||||
set nb_compound_good 1
|
||||
set nb_shape_good 35
|
Loading…
x
Reference in New Issue
Block a user