//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+// File : GEOMAlgo_Builder_3.cxx
+// Created :
+// Author : Peter KURNEV
-// File: GEOMAlgo_Builder_3.cxx
-// Created:
-// Author: Peter KURNEV
-//
#include <GEOMAlgo_Builder.hxx>
#include <TopAbs_State.hxx>
//=======================================================================
//function : FillImagesSolids
-//purpose :
+//purpose :
//=======================================================================
void GEOMAlgo_Builder::FillImagesSolids()
{
}
//=======================================================================
//function : BuildDraftSolid
-//purpose :
+//purpose :
//=======================================================================
- void GEOMAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
+void GEOMAlgo_Builder::BuildDraftSolid (const TopoDS_Shape& theSolid,
TopoDS_Shape& theDraftSolid,
TopTools_ListOfShape& theLIF)
{
Standard_Integer iFlag;
TopAbs_Orientation aOrF, aOrSh, aOrSd;
TopoDS_Iterator aIt1, aIt2;
- TopTools_ListIteratorOfListOfShape aItS;
+ TopTools_ListIteratorOfListOfShape aItS;
BRep_Builder aBB;
TopoDS_Shell aShD;
TopoDS_Shape aFSDx, aFx;
theLIF.Append(aFSDx);
}
else {
- bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx);
+ bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx);
if (bToReverse) {
aFSDx.Reverse();
}
}
//=======================================================================
//function : FillIn3DParts
-//purpose :
+//purpose :
//=======================================================================
void GEOMAlgo_Builder::FillIn3DParts()
{
IntTools_Context& aCtx= pPF->ChangeContext();
//
Standard_Boolean bIsIN, bHasImage;
- Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;// k,
- TopAbs_ShapeEnum aType;
+ Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;
+ TopAbs_ShapeEnum aType;
TopAbs_State aState;
TopTools_IndexedMapOfShape aMSolids, aMS, aMFaces, aMFIN;
TopTools_MapOfShape aMFDone;
TopTools_IndexedDataMapOfShapeListOfShape aMEF;
- TopTools_ListIteratorOfListOfShape aItS;
+ TopTools_ListIteratorOfListOfShape aItS;
TopoDS_Iterator aIt, aItF;
BRep_Builder aBB;
- TopoDS_Solid aSolidSp;
+ TopoDS_Solid aSolidSp;
TopoDS_Face aFP;
//
myDraftSolids.Clear();
const TopoDS_Shape& aS=aDS.Shape(i);
//
aType=aS.ShapeType();
- if (aType==TopAbs_SOLID) {
+ if (aType==TopAbs_SOLID) {
// all solids from DS
aMSolids.Add(aS);
}
else {
//aMS.Add(aShell);
TopExp::MapShapes(aShell, TopAbs_FACE, aMS);
+ //modified by NIZNHY-PKV Fri Dec 03 11:18:45 2010f
+ TopExp::MapShapes(aShell, TopAbs_EDGE, aMS);
+ //modified by NIZNHY-PKV Fri Dec 03 11:18:51 2010t
TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
}
}
}
//
// among all faces from aMEFP select these that have same edges
- // with the solid (i.e aMEF). These faces will be treated first
+ // with the solid (i.e aMEF). These faces will be treated first
// to prevent the usage of 3D classifier.
- // The full list of faces to process is aLFP1.
+ // The full list of faces to process is aLFP1.
aNbEFP=aMEFP.Extent();
for (j=1; j<=aNbEFP; ++j) {
const TopoDS_Shape& aE=aMEFP.FindKey(j);
if (!aMFDone.Add(aSP)) {
continue;
}
-
+
//
// first face to process
aFP=TopoDS::Face(aSP);
}
}
//
- // Connexity Block that spreads from aFP the Bound
+ // Connexity Block that spreads from aFP the Bound
// or till the end of the block itself
aLCBF.Clear();
GEOMAlgo_Tools3D::MakeConnexityBlock(aLFP, aMS, aLCBF);
//
- // fill states for the Connexity Block
+ // fill states for the Connexity Block
aItS.Initialize(aLCBF);
for (; aItS.More(); aItS.Next()) {
const TopoDS_Shape& aSx=aItS.Value();
}
//=======================================================================
//function : BuildSplitSolids
-//purpose :
+//purpose :
//=======================================================================
void GEOMAlgo_Builder::BuildSplitSolids()
{
myErrorStatus=0;
- //
+ //
const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
NMTTools_PaveFiller* pPF=myPaveFiller;
IntTools_Context& aCtx= pPF->ChangeContext();
GEOMAlgo_DataMapOfShapeShapeSet aMSS;
GEOMAlgo_ShapeSet aSSi;
//
- //modified by NIZNHY-PKV Wed Dec 6 17:08:03 2006f
- //
// 0. Find same domain solids for non-interferred solids
aNbS=aDS.NumberOfShapesOfTheObject();
for (i=1; i<=aNbS; ++i) {
aSSi.Add(aS, TopAbs_FACE);
//
aMSS.Bind(aS, aSSi);
- } //for (i=1; i<=aNbS; ++i)
- //
- //modified by NIZNHY-PKV Wed Dec 6 17:08:09 2006t
+ } //for (i=1; i<=aNbS; ++i)
//
// 1. Build solids for interferred source solids
- //
aSB.SetContext(aCtx);
aNbS=myDraftSolids.Extent();
for (i=1; i<=aNbS; ++i) {
//
// 1.1 Fill Shell Faces Set
aSFS.Clear();
-
+
aExp.Init(aSD, TopAbs_FACE);
for (; aExp.More(); aExp.Next()) {
const TopoDS_Shape& aF=aExp.Current();
aNbSFS=aSFS.Extent();
//
// 1.2
- // Check whether aSFS contains a subsets of faces
- // of solids that have been already built.
+ // Check whether aSFS contains a subsets of faces
+ // of solids that have been already built.
// If yes, shrink aSFS by these subsets.
aSSi.Clear();
aSSi.Add(aSFS);
//
aItSS.Initialize(aMSS);
for (; aItSS.More(); aItSS.Next()) {
- const TopoDS_Shape& aSR=aItSS.Key();
+ const TopoDS_Shape& aSR=aItSS.Key();
const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
if (aSSi.Contains(aSSR)) {
// the aSR is SD solid for aS
}
const TopTools_ListOfShape& aSFS1=aSSi.GetSet();
aNbSFS=aSFS1.Extent();
+ //modified by NIZNHY-PKV Wed Oct 27 09:53:15 2010f
+ if (!aNbSFS) {
+ continue;
+ }
+ //modified by NIZNHY-PKV Wed Oct 27 09:53:18 2010t
//
// 1.3 Build new solids
aSB.SetShapes(aSFS1);
//
const TopTools_ListOfShape& aLSR=aSB.Areas();
//
- // 1.4 Collect resulting solids and theirs set of faces
+ // 1.4 Collect resulting solids and theirs set of faces
aIt.Initialize(aLSR);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aSR=aIt.Value();
myImages.Bind(aS, aLSR);
}
} // for (i=1; i<=aNbS; ++i) {
- //modified by NIZNHY-PKV Wed Dec 6 17:07:47 2006f
- /*
- //
- // 2. Find same domain solids for non-interferred solids
- aNbS=aDS.NumberOfShapesOfTheObject();
- for (i=1; i<=aNbS; ++i) {
- const TopoDS_Shape& aS=aDS.Shape(i);
- if (aS.ShapeType()!=TopAbs_SOLID) {
- continue;
- }
- if (!aMFence.Add(aS)) {
- continue;
- }
- if(myImages.HasImage(aS)) {
- continue;
- }
- //
- aSSi.Clear();
- aSSi.Add(aS, TopAbs_FACE);
- //
- aItSS.Initialize(aMSS);
- for (; aItSS.More(); aItSS.Next()) {
- const TopoDS_Shape& aSR=aItSS.Key();
- const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
- if (aSSi.Contains(aSSR)) {
- myImages.Bind(aS, aSR);
- break;
- }
- }
- } //for (i=1; i<=aNbS; ++i)
- */
- //modified by NIZNHY-PKV Wed Dec 6 17:07:55 2006t
}
//=======================================================================
-//function :FillInternalShapes
-//purpose :
+//function :FillInternalShapes
+//purpose :
//=======================================================================
void GEOMAlgo_Builder::FillInternalShapes()
{
//
// 1. Shapes to process
//
- // 1.1 Shapes from pure arguments aMSI
+ // 1.1 Shapes from pure arguments aMSI
// 1.1.1 vertex, edge
for (i=0; i<2; ++i) {
jT=(Standard_Integer)aT[i];
}
}
// 1.1.2 wire
- {
+ {
jT=(Standard_Integer)TopAbs_WIRE;
const TopTools_ListOfShape &aLW=myShapes1[jT];
aIt.Initialize(aLW);
}
}
}
- // 1.1.3 theirs images/sources
+ // 1.1.3 theirs images/sources
aIt1.Initialize(aLSI);
for (; aIt1.More(); aIt1.Next()) {
const TopoDS_Shape& aS=aIt1.Value();
aIt.Initialize(aLSp);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aSp=aIt.Value();
- if (aMFence.Add(aSp)) {
+ if (aMFence.Add(aSp)) {
TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_FACE, aMSx);
TopExp::MapShapesAndAncestors(aSp, TopAbs_EDGE , TopAbs_FACE, aMSx);
TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_FACE, aMSx);
TopExp::MapShapesAndAncestors(aS, TopAbs_EDGE , TopAbs_FACE, aMSx);
aLSd.Append(aS);
- aMSOr.Add(aS);
+ aMSOr.Add(aS);
}
}
}//if (aType==TopAbs_SOLID)
//
aNbSd=aLSd.Extent();
//
- // 3. Some shapes of aMSI can be already tied with faces of
+ // 3. Some shapes of aMSI can be already tied with faces of
// split solids
- aItM.Initialize(aMSI);
+ aItM.Initialize(aMSI);
for (; aItM.More(); aItM.Next()) {
const TopoDS_Shape& aSI=aItM.Key();
if (aMSx.Contains(aSI)) {
for (; aIt.More(); aIt.Next()) {
TopoDS_Solid aSd=TopoDS::Solid(aIt.Value());
//
- aItM.Initialize(aMSI);
+ aItM.Initialize(aMSI);
for (; aItM.More(); aItM.Next()) {
TopoDS_Shape aSI=aItM.Key();
aSI.Orientation(TopAbs_INTERNAL);
}
//=======================================================================
//function : OwnInternalShapes
-//purpose :
+//purpose :
//=======================================================================
void OwnInternalShapes(const TopoDS_Shape& theS,
TopTools_IndexedMapOfShape& theMx)
//
// ErrorStatus
// 30 - SolidBuilder failed
-
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+// File : GEOMAlgo_Tools3D.cxx
+// Created :
+// Author : Peter KURNEV
-// File: GEOMAlgo_Tools3D.cxx
-// Created:
-// Author: Peter KURNEV
-//
#include <GEOMAlgo_Tools3D.ixx>
#include <Precision.hxx>
const gp_Dir& );
static
- void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aE,
- const TopoDS_Face& aF,
- Standard_Real aT,
- gp_Pnt& aPF,
+ void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aE,
+ const TopoDS_Face& aF,
+ Standard_Real aT,
+ gp_Pnt& aPF,
gp_Dir& aDNF,
IntTools_Context& aCtx);
//=======================================================================
//function : IsInternalFace
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
const TopoDS_Solid& theSolid,
if (!theMEF.Contains(aE)) {
continue;
}
- //
+ //
const TopTools_ListOfShape& aLF=theMEF.FindFromKey(aE);
aNbF=aLF.Extent();
if (!aNbF) {
}
//=======================================================================
//function : IsInternalFace
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
const TopoDS_Edge& theEdge,
}
//=======================================================================
//function : IsInternalFace
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::IsInternalFace(const TopoDS_Face& theFace,
const TopoDS_Edge& theEdge,
aDt2D=BOPTools_Tools3D::MinStepIn2d();
aDt2Dx=10.*aDt2D;
BOPTools_Tools3D::PointNearEdge (theEdge, theFace, aT, aDt2Dx, aPF2D, aPF);
- //
+ //
// 2. E1, E2
GEOMAlgo_Tools3D::GetEdgeOnFace(theEdge, theFace1, aE1);
if (aE1.Orientation()==TopAbs_INTERNAL) {
if (aA12<0.) {
aA12=aA12+aTwoPI;
}
-
+
aA1x=AngleWithRef(aDBF1, aDBF , aDTF1);
if (aA1x<0.) {
aA1x=aA1x+aTwoPI;
}
//=======================================================================
//function : GetFaceOff
-//purpose :
+//purpose :
//=======================================================================
void GEOMAlgo_Tools3D::GetFaceOff(const TopoDS_Edge& theE1,
const TopoDS_Face& theF1,
}
//=======================================================================
//function : GetEdgeOnFace
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOnFace(const TopoDS_Edge& theE1,
const TopoDS_Face& theF2,
}
//=======================================================================
//function : GetEdgeOff
-//purpose :
+//purpose :
//=======================================================================
- Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOff(const TopoDS_Edge& theE1,
+Standard_Boolean GEOMAlgo_Tools3D::GetEdgeOff (const TopoDS_Edge& theE1,
const TopoDS_Face& theF2,
TopoDS_Edge& theE2)
-
+
{
Standard_Boolean bFound;
TopAbs_Orientation aOr1, aOr1C, aOr2;
}
//=======================================================================
// function: ComputeState
-// purpose:
+// purpose:
//=======================================================================
TopAbs_State GEOMAlgo_Tools3D::ComputeState(const TopoDS_Face& theF,
const TopoDS_Solid& theRef,
IntTools_Context& theCtx)
{
TopAbs_State aState;
- TopExp_Explorer aExp;
+ TopExp_Explorer aExp;
TopoDS_Edge aE1;
gp_Pnt2d aP2D;
- gp_Pnt aP3D;
+ gp_Pnt aP3D;
//
aState=TopAbs_UNKNOWN;
//
}
//=======================================================================
// function: ComputeStateByOnePoint
-// purpose:
+// purpose:
//=======================================================================
TopAbs_State GEOMAlgo_Tools3D::ComputeStateByOnePoint(const TopoDS_Shape& theS,
const TopoDS_Solid& theRef,
}
//=======================================================================
// function: ComputeState
-// purpose:
+// purpose:
//=======================================================================
TopAbs_State GEOMAlgo_Tools3D::ComputeState(const TopoDS_Vertex& theV,
const TopoDS_Solid& theRef,
IntTools_Context& theCtx)
{
TopAbs_State aState;
- gp_Pnt aP3D;
+ gp_Pnt aP3D;
//
aP3D=BRep_Tool::Pnt(theV);
aState=GEOMAlgo_Tools3D::ComputeState(aP3D, theRef, theTol, theCtx);
}
//=======================================================================
// function: ComputeState
-// purpose:
+// purpose:
//=======================================================================
TopAbs_State GEOMAlgo_Tools3D::ComputeState(const TopoDS_Edge& theE,
const TopoDS_Solid& theRef,
Standard_Real aT1, aT2, aT = 0.;
TopAbs_State aState;
Handle(Geom_Curve) aC3D;
- gp_Pnt aP3D;
+ gp_Pnt aP3D;
//
aC3D = BRep_Tool::Curve(theE, aT1, aT2);
//
}
//=======================================================================
// function: ComputeState
-// purpose:
+// purpose:
//=======================================================================
TopAbs_State GEOMAlgo_Tools3D::ComputeState(const gp_Pnt& theP,
const TopoDS_Solid& theRef,
}
//=======================================================================
// function: IsSplitToReverse
-// purpose:
+// purpose:
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::IsSplitToReverse(const TopoDS_Shape& theSp,
const TopoDS_Shape& theSr,
}
//=======================================================================
//function :IsSplitToReverse
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::IsSplitToReverse(const TopoDS_Face& theFSp,
const TopoDS_Face& theFSr,
aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
BOPTools_Tools3D::GetApproxNormalToFaceOnEdge(aESp, theFSp, aT, aPFSp, aDNFSp);
//
- // Parts of theContext.ComputeVS(..)
+ // Parts of theContext.ComputeVS(..)
GeomAPI_ProjectPointOnSurf& aProjector=theContext.ProjPS(theFSr);
aProjector.Perform(aPFSp);
if (!aProjector.IsDone()) {
}
//
aSr->D1(aU, aV, aPFSr, aD1U, aD1V);
- gp_Dir aDD1U(aD1U);
+ gp_Dir aDD1U(aD1U);
gp_Dir aDD1V(aD1V);
- gp_Dir aDNFSr=aDD1U^aDD1V;
+ gp_Dir aDNFSr=aDD1U^aDD1V;
if (theFSr.Orientation()==TopAbs_REVERSED){
aDNFSr.Reverse();
}
}
//=======================================================================
//function :IsSplitToReverse
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_Tools3D::IsSplitToReverse(const TopoDS_Edge& theSplit,
const TopoDS_Edge& theEdge,
//
bRet=Standard_False;
//
- bIsDegenerated=(BRep_Tool::Degenerated(theSplit) ||
+ bIsDegenerated=(BRep_Tool::Degenerated(theSplit) ||
BRep_Tool::Degenerated(theEdge));
if (bIsDegenerated) {
return bRet;
//=======================================================================
// function: Sense
-// purpose:
+// purpose:
//=======================================================================
Standard_Integer GEOMAlgo_Tools3D::Sense (const TopoDS_Face& theF1,
const TopoDS_Face& theF2)
}
//=======================================================================
// function: CopyFace
-// purpose:
+// purpose:
//=======================================================================
void GEOMAlgo_Tools3D::CopyFace (const TopoDS_Face& theF1,
TopoDS_Face& theF2)
}
//=======================================================================
// function: MakeContainer
-// purpose:
+// purpose:
//=======================================================================
void GEOMAlgo_Tools3D::MakeContainer(const TopAbs_ShapeEnum theType,
TopoDS_Shape& theC)
TopoDS_Solid aSolid;
aBB.MakeSolid(aSolid);
theC=aSolid;
- }
+ }
break;
//
//
TopoDS_Shell aShell;
aBB.MakeShell(aShell);
theC=aShell;
- }
+ }
break;
//
case TopAbs_WIRE: {
}
//=======================================================================
// function: MakeConnexityBlock.
-// purpose:
+// purpose:
//=======================================================================
void GEOMAlgo_Tools3D::MakeConnexityBlock (const TopTools_ListOfShape& theLFIn,
const TopTools_IndexedMapOfShape& theMEAvoid,
aNbF=theLFIn.Extent();
aIt.Initialize(theLFIn);
for (; aIt.More(); aIt.Next()) {
- const TopoDS_Shape& aF=aIt.Value();
+ const TopoDS_Shape& aF=aIt.Value();
TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, aMEF);
}
//
}
//
}//while(1) {
-
+
//
aNbF=aMCB.Extent();
aItM.Initialize(aMCB);
}
//=======================================================================
//function : FindFacePairs
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean FindFacePairs (const TopoDS_Edge& theE,
const TopTools_ListOfShape& thLF,
//
// Preface aLCEF
aItLF.Initialize(thLF);
- for (; aItLF.More(); aItLF.Next()) {
+ for (; aItLF.More(); aItLF.Next()) {
const TopoDS_Face& aFL=TopoDS::Face(aItLF.Value());
//
bFound=GEOMAlgo_Tools3D::GetEdgeOnFace(theE, aFL, aEL);
//
//=======================================================================
//function : AngleWithRef
-//purpose :
+//purpose :
//=======================================================================
Standard_Real AngleWithRef(const gp_Dir& theD1,
const gp_Dir& theD2,
}
//=======================================================================
//function : GetApproxNormalToFaceOnEdge
-//purpose :
+//purpose :
//=======================================================================
-void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
- const TopoDS_Face& aFx,
- Standard_Real aT,
- gp_Pnt& aPF,
+void GetApproxNormalToFaceOnEdge (const TopoDS_Edge& aEx,
+ const TopoDS_Face& aFx,
+ Standard_Real aT,
+ gp_Pnt& aPF,
gp_Dir& aDNF,
- IntTools_Context& )//aCtx)
+ IntTools_Context& aCtx)
{
Standard_Boolean bReverse;
- Standard_Real aT1, aT2, dT;//, aU, aV;
+ Standard_Real aT1, aT2, dT, aU, aV;
gp_Dir aDTT, aDNFT, aDBT;
gp_Pnt aPFT, aPFx;
Handle(Geom_Curve) aC3D;
//
// Normal at aT
BOPTools_Tools3D::GetNormalToFaceOnEdge (aE, aF, aT, aDNFT);
-
+
// Tangent at aT
BOPTools_Tools3D::GetTangentToEdge(aE, aT, aDTT);
//
aTS=aGAS.GetType();
if (aTS==GeomAbs_BSplineSurface ||
aTS==GeomAbs_BezierSurface ||
- aTS==GeomAbs_Plane) {
+ aTS==GeomAbs_Plane){
Standard_Real aTolEx, aTolFx, aTol, dUR, dVR, dR;
//
aTolEx=BRep_Tool::Tolerance(aEx);
dT=dR;
}
}
+ //modified by NIZNHY-PKV Thu Dec 02 10:39:09 2010f
+ else if (GeomAbs_Torus ||
+ aTS==GeomAbs_Cylinder){
+ Standard_Real aTolEx, aTolFx, aTol;
+ //
+ aTolEx=BRep_Tool::Tolerance(aEx);
+ aTolFx=BRep_Tool::Tolerance(aFx);
+ aTol=2.*aTolEx+aTolFx;
+ if (aTol>dT) {
+ dT=aTol;
+ }
+ }
+ //modified by NIZNHY-PKV Thu Dec 02 10:39:13 2010t
}
//----------------------------------------------
//
aDNF.Reverse();
}
//
- //modified by NIZNHY-PKV Wed Sep 22 10:52:54 2010f
- /*
GeomAPI_ProjectPointOnSurf& aProjector=aCtx.ProjPS(aF);
//
aProjector.Perform(aPFx);
aDNF.Reverse();
}
}
- */
- //modified by NIZNHY-PKV Wed Sep 22 10:52:59 2010t
}