const Standard_Integer iCheckExtend)
{
Standard_Boolean bIsVertexOnLine;
- Standard_Real aT, aTol, aTolNew;
- BOPDS_Pave aPave;
+ Standard_Real aT, aTolV;
//
- const TopoDS_Vertex aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
+ const TopoDS_Vertex& aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
const IntTools_Curve& aIC = aNC.Curve();
//
bIsVertexOnLine=myContext->IsVertexOnLine(aV, aIC, aTolR3D, aT);
if (!bIsVertexOnLine && iCheckExtend) {
- aTol = BRep_Tool::Tolerance(aV);
+ aTolV = BRep_Tool::Tolerance(aV);
//
- ExtendedTolerance(nV, aMI, aTol, iCheckExtend);
- bIsVertexOnLine=myContext->IsVertexOnLine(aV, aTol, aIC, aTolR3D, aT);
+ ExtendedTolerance(nV, aMI, aTolV, iCheckExtend);
+ bIsVertexOnLine=myContext->IsVertexOnLine(aV, aTolV, aIC, aTolR3D, aT);
}
//
if (bIsVertexOnLine) {
- aPave.SetIndex(nV);
- aPave.SetParameter(aT);
+ // check if aPB contains the parameter aT
+ Standard_Boolean bExist;
+ Standard_Integer nVToUpdate;
+ Standard_Real aPTol, aDist, aTolVNew, aTolV2, aDTol;
+ TopoDS_Vertex aVToUpdate;
+ gp_Pnt aP1, aP2;
//
- aPB->AppendExtPave(aPave);
+ aTolV2 = 0.;
+ aDTol = 1.e-12;
//
- aTol = BRep_Tool::Tolerance(aV);
+ GeomAdaptor_Curve aGAC(aIC.Curve());
+ aPTol = aGAC.Resolution(aTolR3D);
//
- BOPTools_AlgoTools::UpdateVertex (aIC, aT, aV);
+ bExist = aPB->ContainsParameter(aT, aPTol, nVToUpdate);
+ if (bExist) {
+ // use existing pave
+ aP1 = BRep_Tool::Pnt(aV);
+ aTolV2 = BRep_Tool::Tolerance(aV);
+ aVToUpdate = (*(TopoDS_Vertex *)(&myDS->Shape(nVToUpdate)));
+ }
+ else {
+ // add new pave
+ BOPDS_Pave aPave;
+ aPave.SetIndex(nV);
+ aPave.SetParameter(aT);
+ aPB->AppendExtPave(aPave);
+ //
+ aP1 = aGAC.Value(aT);
+ nVToUpdate = nV;
+ aVToUpdate = aV;
+ }
//
- if (!aMVTol.IsBound(nV)) {
- aTolNew = BRep_Tool::Tolerance(aV);
- if (aTolNew > aTol) {
- aMVTol.Bind(nV, aTol);
+ aTolV = BRep_Tool::Tolerance(aVToUpdate);
+ aP2 = BRep_Tool::Pnt(aVToUpdate);
+ aDist = aP1.Distance(aP2);
+ aTolVNew = aDist - aTolV2;
+ //
+ if (aTolVNew > aTolV) {
+ BRep_Builder aBB;
+ aBB.UpdateVertex(aVToUpdate, aTolVNew+aDTol);
+ //
+ if (!aMVTol.IsBound(nVToUpdate)) {
+ aMVTol.Bind(nVToUpdate, aTolV);
}
+ //
+ BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nVToUpdate);
+ Bnd_Box& aBoxDS=aSIDS.ChangeBox();
+ BRepBndLib::Add(aVToUpdate, aBoxDS);
}
- //
- BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV);
- Bnd_Box& aBoxDS=aSIDS.ChangeBox();
- BRepBndLib::Add(aV, aBoxDS);
}
}
}
//
if (bRebuild) {
- nSp = SplitEdge(aPB->Edge(), nV[0], aT[0], nV[1], aT[1]);
+ nSp = SplitEdge(aPB->OriginalEdge(), nV[0], aT[0], nV[1], aT[1]);
if (bCB) {
aCB->SetEdge(nSp);
}
const Handle(BOPDS_PaveBlock)& aPBD)
{
Standard_Boolean bXDir, bIsDone;
- Standard_Integer nE, aNbPoints, j;
+ Standard_Integer nE, aNbPoints, j, anInd;
Standard_Real aTD1, aTD2, aT1, aT2, aTolInter, aX, aDT;
Standard_Real aTolCmp;
gp_Pnt2d aP2d1, aP2d2, aP2D;
continue;
}
//
- if (aPBD->ContainsParameter(aX, aDT)) {
+ if (aPBD->ContainsParameter(aX, aDT, anInd)) {
continue;
}
aPave.SetParameter(aX);
//purpose :
//=======================================================================
Standard_Boolean BOPDS_PaveBlock::ContainsParameter(const Standard_Real theT,
- const Standard_Real theTol)const
+ const Standard_Real theTol,
+ Standard_Integer& theInd) const
{
Standard_Boolean bRet;
- Standard_Real dT;
BOPDS_ListIteratorOfListOfPave aIt;
//
- bRet=Standard_False;
+ bRet = Standard_False;
aIt.Initialize(myExtPaves);
for (; aIt.More(); aIt.Next()) {
- dT=aIt.Value().Parameter()-theT;
- if (dT<0.) {
- dT=-dT;
- }
- if (dT<theTol) {
- bRet=!bRet;
+ const BOPDS_Pave& aPave = aIt.Value();
+ bRet = (Abs(aPave.Parameter() - theT) < theTol);
+ if (bRet) {
+ theInd = aPave.Index();
break;
}
}
//! Selector
//! Returns the pave indices <theIndex1,theIndex2>
//! of the pave block
- Standard_EXPORT void Indices (Standard_Integer& theIndex1, Standard_Integer& theIndex2) const;
+ Standard_EXPORT void Indices (Standard_Integer& theIndex1,
+ Standard_Integer& theIndex2) const;
//! Query
//! to create new pave blocks <theLPB>.
//! <theFlag> - if true, the first pave and the second
//! pave are used to produce new pave blocks.
- Standard_EXPORT void Update (BOPDS_ListOfPaveBlock& theLPB, const Standard_Boolean theFlag = Standard_True);
+ Standard_EXPORT void Update (BOPDS_ListOfPaveBlock& theLPB,
+ const Standard_Boolean theFlag = Standard_True);
//! Query
//! Returns true if the extra paves contain the pave
//! with given value of the parameter <thePrm>
//! <theTol> - the value of the tolerance to compare
- Standard_EXPORT Standard_Boolean ContainsParameter (const Standard_Real thePrm, const Standard_Real theTol) const;
+ //! <theInd> - index of the found pave
+ Standard_EXPORT Standard_Boolean ContainsParameter (const Standard_Real thePrm,
+ const Standard_Real theTol,
+ Standard_Integer& theInd) const;
//! Modifier
//! Sets the shrunk data for the pave block
//! <theTS1>, <theTS2> - shrunk range
//! <theBox> - the bounding box
- Standard_EXPORT void SetShrunkData (const Standard_Real theTS1, const Standard_Real theTS2, const Bnd_Box& theBox);
+ Standard_EXPORT void SetShrunkData (const Standard_Real theTS1,
+ const Standard_Real theTS2,
+ const Bnd_Box& theBox);
//! Selector
//! Returns the shrunk data for the pave block
//! <theTS1>, <theTS2> - shrunk range
//! <theBox> - the bounding box
- Standard_EXPORT void ShrunkData (Standard_Real& theTS1, Standard_Real& theTS2, Bnd_Box& theBox) const;
+ Standard_EXPORT void ShrunkData (Standard_Real& theTS1,
+ Standard_Real& theTS2,
+ Bnd_Box& theBox) const;
//! Query
# cone cylinder plane
# Error status: 102
-puts "TODO OCC26020 ALL: Error status"
-puts "TODO OCC26020 ALL: TEST INCOMPLETE"
-
# conical face
cone con_f1 -59.814698440000001 384.36473473000001 127 0.41716766026590824 -0.90882954575006414 -5.4874902763032048e-016 89.995898744693349 0
erase con_f1
--- /dev/null
+puts "========"
+puts "OCC26444"
+puts "========"
+puts ""
+####################################################################################
+# Boolean operation "bcut" gives invalid result between solid and halfspace solid.
+####################################################################################
+
+restore [locate_data_file bug26444_cutting_shape.brep] a
+restore [locate_data_file bug26444_shape_to_cut.brep] b
+restore [locate_data_file bug26444_ref_out.brep] p2
+dump p2
+halfspace s1 a -0.541421905726473 0.200000002980232 0.00899999961256981
+bcut result b s1
+
+set square 0.106547
+set 2dviewer 1
-puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done."
-puts "TODO OCC23547 ALL: TEST INCOMPLETE"
+puts "TODO OCC23748 ALL: Faulty shapes in variables faulty_1 to faulty_"
+puts "TODO OCC23547 ALL: Error : The volume of the resulting shape is"
psphere s 15 270
OFFSETSHAPE 1 {s_2} $calcul $type