-// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 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
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: GEOMAlgo_WireSplitter.cxx
-// Created:
// Author: Peter KURNEV
-// <pkv@irinox>
-//
-#include <GEOMAlgo_WireSplitter.ixx>
+
+#include <GEOMAlgo_WireSplitter.hxx>
#include <TColStd_SequenceOfReal.hxx>
#include <Precision.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Iterator.hxx>
-
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepAdaptor_Curve2d.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
-
-
#include <TopTools_SequenceOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
const TopoDS_Face& aF);
static
Standard_Real Tolerance2D (const TopoDS_Vertex& aV,
- const GeomAdaptor_Surface& aGAS);
+ const GeomAdaptor_Surface& aGAS);
+
+//modified by NIZNHY-PKV Thu Apr 19 09:04:59 2012f
static
- Standard_Integer NbWaysOut(const BOP_ListOfEdgeInfo& );
-//
+ Standard_Integer NbWaysOut(const TopoDS_Edge& aEOuta,
+ const BOP_ListOfEdgeInfo& aLEInfo);
+//static
+// Standard_Integer NbWaysOut(const BOP_ListOfEdgeInfo& );
+//modified by NIZNHY-PKV Thu Apr 19 09:04:53 2012t
//=======================================================================
-// function:
-// purpose:
+// function:
+// purpose:
//=======================================================================
GEOMAlgo_WireSplitter::GEOMAlgo_WireSplitter()
:
}
//=======================================================================
// function: ~
-// purpose:
+// purpose:
//=======================================================================
GEOMAlgo_WireSplitter::~GEOMAlgo_WireSplitter()
{
}
//=======================================================================
// function: SetFace
-// purpose:
+// purpose:
//=======================================================================
void GEOMAlgo_WireSplitter::SetFace(const TopoDS_Face& aFace)
{
}
//=======================================================================
// function: Face
-// purpose:
+// purpose:
//=======================================================================
const TopoDS_Face& GEOMAlgo_WireSplitter::Face()const
{
}
//=======================================================================
// function: SetEdges
-// purpose:
+// purpose:
//=======================================================================
void GEOMAlgo_WireSplitter::SetEdges(const TopTools_ListOfShape& aLE)
{
}
//=======================================================================
// function: Edges
-// purpose:
+// purpose:
//=======================================================================
const TopTools_ListOfShape& GEOMAlgo_WireSplitter::Edges()const
{
}
//=======================================================================
// function: IsNothingToDo
-// purpose:
+// purpose:
//=======================================================================
Standard_Boolean GEOMAlgo_WireSplitter::IsNothingToDo()const
{
}
//=======================================================================
// function: Shapes
-// purpose:
+// purpose:
//=======================================================================
const BOPTColStd_ListOfListOfShape& GEOMAlgo_WireSplitter::Shapes()const
{
}
//=======================================================================
// function: Perform
-// purpose:
+// purpose:
//=======================================================================
void GEOMAlgo_WireSplitter::Perform()
{
Standard_Integer index, i, aNb, aCntIn, aCntOut;
Standard_Boolean anIsIn;
Standard_Real anAngle;
-
+
BOP_ListOfEdgeInfo emptyInfo;
TopTools_ListIteratorOfListOfShape anItList;
//
if (!index) {
index=mySmartMap.Add(aVertex, emptyInfo);
}
-
+
BOP_ListOfEdgeInfo& aListOfEInfo=mySmartMap(index);
BOP_EdgeInfo aEInfo;
aEInfo.SetEdge(anEdge);
-
+
TopAbs_Orientation anOr=aVertex.Orientation();
if (anOr==TopAbs_FORWARD) {
//
aNb=mySmartMap.Extent();
//
- // 2. myNothingToDo
+ // 2. myNothingToDo
myNothingToDo=Standard_True;
-
+
for (i=1; i<=aNb; i++) {
aCntIn=0;
aCntOut=0;
// Each vertex has one edge In and one - Out. Good. But it is not enought
// to consider that nothing to do with this. We must check edges on TShape
// coinsidence. If there are such edges there is something to do with.
- //
+ //
if (myNothingToDo) {
Standard_Integer aNbE, aNbMapEE;
TopTools_IndexedDataMapOfShapeListOfShape aMapEE;
aNbE=myEdges.Extent();
-
+
anItList.Initialize(myEdges);
for (; anItList.More(); anItList.Next()) {
const TopoDS_Shape& aE = anItList.Value();
-
+
if (!aMapEE.Contains(aE)) {
TopTools_ListOfShape aLEx;
aLEx.Append(aE);
aLEx.Append(aE);
}
}
-
+
Standard_Boolean bFlag;
bFlag=Standard_True;
aNbMapEE=aMapEE.Extent();
}
myNothingToDo=myNothingToDo && bFlag;
}
- //
+ //
//
if (myNothingToDo) {
myErrorStatus=0;
aVV.Orientation(TopAbs_REVERSED);
anAngle=Angle2D (aVV, aE, myFace, aGAS, Standard_True);
}
- //
+ //
else { // OUT
//
aVV.Orientation(TopAbs_FORWARD);
anAngle=Angle2D (aVV, aE, myFace, aGAS, Standard_False);
}
anEdgeInfo.SetAngle(anAngle);
-
+
}
}
//
// 4. Do
//
Standard_Boolean anIsOut, anIsNotPassed;
-
+
TopTools_SequenceOfShape aLS, aVertVa;
TColgp_SequenceOfPnt2d aCoordVa;
-
+
BOP_ListIteratorOfListOfEdgeInfo anIt;
for (i=1; i<=aNb; i++) {
const TopoDS_Vertex aVa=TopoDS::Vertex (mySmartMap.FindKey(i));
const BOP_ListOfEdgeInfo& aLEInfo=mySmartMap(i);
-
+
anIt.Initialize(aLEInfo);
for (; anIt.More(); anIt.Next()) {
BOP_EdgeInfo& anEdgeInfo=anIt.Value();
const TopoDS_Edge& aEOuta=anEdgeInfo.Edge();
-
+
anIsOut=!anEdgeInfo.IsIn();
anIsNotPassed=!anEdgeInfo.Passed();
-
+
if (anIsOut && anIsNotPassed) {
//
aLS.Clear();
aVertVa.Clear();
aCoordVa.Clear();
//
- Path(aGAS, myFace, aVa, aEOuta, anEdgeInfo, aLS,
+ Path(aGAS, myFace, aVa, aEOuta, anEdgeInfo, aLS,
aVertVa, aCoordVa, myShapes, mySmartMap);
}
}
TopoDS_Vertex aV1, aV2;
BOPTColStd_ListOfListOfShape aShapes;
BOPTColStd_ListIteratorOfListOfListOfShape anItW(myShapes);
-
+
for (; anItW.More(); anItW.Next()) {
TopTools_IndexedMapOfShape aMV, aME;
const TopTools_ListOfShape& aLE=anItW.Value();
}
//=======================================================================
// function: Path
-// purpose:
+// purpose:
//=======================================================================
void Path (const GeomAdaptor_Surface& aGAS,
const TopoDS_Face& myFace,
TColgp_SequenceOfPnt2d& aCoordVa,
BOPTColStd_ListOfListOfShape& myShapes,
BOP_IndexedDataMapOfVertexListEdgeInfo& mySmartMap)
-
{
- Standard_Integer i,j, aNb, aNbj;
+ Standard_Integer i,j, aNb, aNbj, iCnt;
Standard_Real aTol, anAngleIn, anAngleOut, anAngle, aMinAngle;
Standard_Real aTol2D, aTol2D2;
- Standard_Real aTol2, aD2;//, aTolUVb, aTolVVb;
+ Standard_Real aTol2, aD2;
Standard_Boolean anIsSameV2d, anIsSameV, anIsFound, anIsOut, anIsNotPassed;
BOP_ListIteratorOfListOfEdgeInfo anIt;
TopoDS_Vertex aVb;
//
// append block
//
- // Do not escape through edge from which you enter
+ // Do not escape through edge from which you enter
aNb=aLS.Length();
if (aNb==1) {
const TopoDS_Shape& anEPrev=aLS(aNb);
anEdgeInfo.SetPassed(Standard_True);
aLS.Append(aEOuta);
aVertVa.Append(aVa);
-
+
TopoDS_Vertex pVa=aVa;
pVa.Orientation(TopAbs_FORWARD);
gp_Pnt2d aPa=Coord2d(pVa, aEOuta, myFace);
aCoordVa.Append(aPa);
-
+
GetNextVertex (pVa, aEOuta, aVb);
gp_Pnt2d aPb=Coord2d(aVb, aEOuta, myFace);
-
- //const BOP_ListOfEdgeInfo& aLEInfoVb=mySmartMap.FindFromKey(aVb);
//
aTol=2.*Tolerance2D(aVb, aGAS);
aTol2=10.*aTol*aTol;
aMinAngle=100.;
anIsFound=Standard_False;
-
- Standard_Integer aCurIndexE = 0;
-
+ //
+ //modified by NIZNHY-PKV Thu Apr 19 09:05:09 2012f
+ iCnt=NbWaysOut (aEOuta, aLEInfo);
+ //iCnt=NbWaysOut (aLEInfo);
+ //modified by NIZNHY-PKV Thu Apr 19 09:05:12 2012t
+ if (!iCnt) { // no way to go . (Error)
+ return ;
+ }
+ //
anIt.Initialize(aLEInfo);
for (; anIt.More(); anIt.Next()) {
BOP_EdgeInfo& anEI=anIt.Value();
const TopoDS_Edge& aE=anEI.Edge();
anIsOut=!anEI.IsIn();
anIsNotPassed=!anEI.Passed();
-
+ //
if (anIsOut && anIsNotPassed) {
- aCurIndexE++;
- //
- // Is there one way to go out of the vertex
- // we have to use it only.
- Standard_Integer iCnt;
- iCnt=NbWaysOut (aLEInfo);
- //
- if (!iCnt) {
- // no way to go . (Error)
- return ;
+ if (aE.IsSame(aEOuta)) {
+ continue;
}
//
if (iCnt==1) {
continue;
}
//
- //
anAngleOut=anEI.Angle();
//
anAngle=ClockWiseAngle(anAngleIn, anAngleOut);
anIsFound=Standard_True;
}
}
- } // for (; anIt.More(); anIt.Next())
+ } // for (; anIt.More(); anIt.Next())
//
if (!anIsFound) {
// no way to go . (Error)
return;
}
-
+ //
aEOutb=pEdgeInfo->Edge();
//
- Path (aGAS, myFace, aVb, aEOutb, *pEdgeInfo, aLS,
+ Path (aGAS, myFace, aVb, aEOutb, *pEdgeInfo, aLS,
aVertVa, aCoordVa, myShapes, mySmartMap);
}
//=======================================================================
// purpose:
//=======================================================================
Standard_Real Tolerance2D (const TopoDS_Vertex& aV,
- const GeomAdaptor_Surface& aGAS)
+ const GeomAdaptor_Surface& aGAS)
{
Standard_Real aTol2D, anUr, aVr, aTolV3D;
GeomAbs_SurfaceType aType;
Standard_Real ClockWiseAngle(const Standard_Real aAngleIn,
const Standard_Real aAngleOut)
{
- Standard_Real aTwoPi=Standard_PI+Standard_PI;
+ Standard_Real aTwoPi = M_PI+M_PI;
Standard_Real dA, A1, A2, AIn, AOut ;
AIn=aAngleIn;
if (AIn >= aTwoPi) {
AIn=AIn-aTwoPi;
}
-
+
if (AOut >= aTwoPi) {
AOut=AOut-aTwoPi;
}
- A1=AIn+Standard_PI;
-
+ A1 = AIn + M_PI;
+
if (A1 >= aTwoPi) {
A1=A1-aTwoPi;
}
-
+
A2=AOut;
-
+
dA=A1-A2;
if (dA <= 0.) {
dA=aTwoPi+dA;
- //modified by NIZNHY-PKV Thu Feb 17 08:26:39 2011f
if (dA <= 1.e-14) {
dA=aTwoPi;
}
- //modified by NIZNHY-PKV Thu Feb 17 08:26:42 2011t
}
//xx
else if (dA <= 1.e-14) {
}
//=======================================================================
// function: GetNextVertex
-// purpose:
+// purpose:
//=======================================================================
void GetNextVertex(const TopoDS_Vertex& aV,
const TopoDS_Edge& aE,
}
//=======================================================================
// function: Angle2D
-// purpose:
+// purpose:
//=======================================================================
Standard_Real Angle2D (const TopoDS_Vertex& aV,
const TopoDS_Edge& anEdge,
return 0.;
}
//
- BOPTools_Tools2D::CurveOnSurface (anEdge, myFace, aC2D,
+ BOPTools_Tools2D::CurveOnSurface (anEdge, myFace, aC2D,
aFirst, aLast, aToler, Standard_True);
//dt=1.e-7;
dt=2.*Tolerance2D(aV, aGAS);
if(dt > aTX) {
// to save direction of the curve as much as it possible
// in the case of big tolerances
- dt = aTX;
+ dt = aTX;
}
//
if (fabs (aTV-aFirst) < fabs(aTV - aLast)) {
}
//=======================================================================
// function: Angle
-// purpose:
+// purpose:
//=======================================================================
Standard_Real Angle (const gp_Dir2d& aDir2D)
{
Standard_Real anAngle = aRefDir.Angle(aDir2D);
if (anAngle < 0.)
- anAngle += Standard_PI + Standard_PI;
+ anAngle += M_PI + M_PI;
return anAngle;
}
-//
+//modified by NIZNHY-PKV Thu Apr 19 09:02:04 2012f
//=======================================================================
// function: NbWaysOut
-// purpose:
+// purpose:
+//=======================================================================
+Standard_Integer NbWaysOut(const TopoDS_Edge& aEOuta,
+ const BOP_ListOfEdgeInfo& aLEInfo)
+{
+ Standard_Boolean bIsOut, bIsNotPassed;
+ Standard_Integer iCnt=0;
+ BOP_ListIteratorOfListOfEdgeInfo anIt;
+ //
+ anIt.Initialize(aLEInfo);
+ for (; anIt.More(); anIt.Next()) {
+ BOP_EdgeInfo& aEI=anIt.Value();
+ const TopoDS_Edge& aE=aEI.Edge();
+ bIsOut=!aEI.IsIn();
+ bIsNotPassed=!aEI.Passed();
+ if (bIsOut && bIsNotPassed) {
+ if (!aE.IsSame(aEOuta)) {
+ iCnt++;
+ }
+ }
+ }
+ return iCnt;
+}
+/*
+//=======================================================================
+// function: NbWaysOut
+// purpose:
//=======================================================================
Standard_Integer NbWaysOut(const BOP_ListOfEdgeInfo& aLEInfo)
{
}
return iCnt;
}
+*/
+//modified by NIZNHY-PKV Thu Apr 19 09:01:57 2012t