Mantis issue 0021454: [CEA] non regression test fails : problem with group creation. A fix by Peter Kurnev.

This commit is contained in:
jfa 2012-01-26 11:41:17 +00:00
parent 03a8be76be
commit d394961f4a

View File

@ -18,16 +18,14 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: GEOMAlgo_FinderShapeOn1.cxx
// Created: Fri Mar 4 10:31:06 2005
// Author: Peter KURNEV
// <pkv@irinox>
//
#include <GEOMAlgo_FinderShapeOn1.ixx>
#include <math.h>
#include <GEOMAlgo_FinderShapeOn1.ixx>
#include <math.h>
#include <Precision.hxx>
#include <TColStd_Array1OfInteger.hxx>
@ -81,7 +79,7 @@
//=======================================================================
//function : GEOMAlgo_FinderShapeOn1
//purpose :
//purpose :
//=======================================================================
GEOMAlgo_FinderShapeOn1::GEOMAlgo_FinderShapeOn1()
:
@ -95,14 +93,14 @@ GEOMAlgo_FinderShapeOn1::GEOMAlgo_FinderShapeOn1()
}
//=======================================================================
//function : ~
//purpose :
//purpose :
//=======================================================================
GEOMAlgo_FinderShapeOn1::~GEOMAlgo_FinderShapeOn1()
{
}
//=======================================================================
//function : SetSurface
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::SetSurface(const Handle(Geom_Surface)& aS)
{
@ -110,7 +108,7 @@ void GEOMAlgo_FinderShapeOn1::SetSurface(const Handle(Geom_Surface)& aS)
}
//=======================================================================
//function : Surface
//purpose :
//purpose :
//=======================================================================
const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn1::Surface() const
{
@ -118,7 +116,7 @@ const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn1::Surface() const
}
//=======================================================================
//function : SetShapeType
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::SetShapeType(const TopAbs_ShapeEnum aType)
{
@ -126,7 +124,7 @@ void GEOMAlgo_FinderShapeOn1::SetShapeType(const TopAbs_ShapeEnum aType)
}
//=======================================================================
//function : ShapeType
//purpose :
//purpose :
//=======================================================================
TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn1::ShapeType()const
{
@ -134,7 +132,7 @@ TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn1::ShapeType()const
}
//=======================================================================
//function : SetState
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::SetState(const GEOMAlgo_State aState)
{
@ -142,7 +140,7 @@ void GEOMAlgo_FinderShapeOn1::SetState(const GEOMAlgo_State aState)
}
//=======================================================================
//function : State
//purpose :
//purpose :
//=======================================================================
GEOMAlgo_State GEOMAlgo_FinderShapeOn1::State() const
{
@ -150,7 +148,7 @@ GEOMAlgo_State GEOMAlgo_FinderShapeOn1::State() const
}
//=======================================================================
//function : SetNbPntsMin
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::SetNbPntsMin(const Standard_Integer aNb)
{
@ -158,7 +156,7 @@ void GEOMAlgo_FinderShapeOn1::SetNbPntsMin(const Standard_Integer aNb)
}
//=======================================================================
//function : NbPntsMin
//purpose :
//purpose :
//=======================================================================
Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMin()const
{
@ -166,7 +164,7 @@ Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMin()const
}
//=======================================================================
//function : SetNbPntsMax
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::SetNbPntsMax(const Standard_Integer aNb)
{
@ -174,7 +172,7 @@ void GEOMAlgo_FinderShapeOn1::SetNbPntsMax(const Standard_Integer aNb)
}
//=======================================================================
//function : NbPntsMax
//purpose :
//purpose :
//=======================================================================
Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMax()const
{
@ -182,7 +180,7 @@ Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMax()const
}
//=======================================================================
// function: MSS
// purpose:
// purpose:
//=======================================================================
const GEOMAlgo_IndexedDataMapOfShapeState& GEOMAlgo_FinderShapeOn1::MSS() const
{
@ -190,7 +188,7 @@ const GEOMAlgo_IndexedDataMapOfShapeState& GEOMAlgo_FinderShapeOn1::MSS() const
}
//=======================================================================
// function: Shapes
// purpose:
// purpose:
//=======================================================================
const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn1::Shapes() const
{
@ -211,7 +209,7 @@ const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn1::Shapes() const
}
//=======================================================================
//function : Perform
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::Perform()
{
@ -253,12 +251,12 @@ void GEOMAlgo_FinderShapeOn1::Perform()
}
//
// 4
ProcessSolids();
ProcessSolids();
//
}
//=======================================================================
//function : ProcessVertices
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::ProcessVertices()
{
@ -291,7 +289,7 @@ void GEOMAlgo_FinderShapeOn1::ProcessVertices()
}
//=======================================================================
//function : ProcessEdges
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::ProcessEdges()
{
@ -334,13 +332,13 @@ void GEOMAlgo_FinderShapeOn1::ProcessEdges()
}
//
if (BRep_Tool::Degenerated(aE)) {
myMSS.Add(aE, aSt);
myMSS.Add(aE, aSt);
continue;
}
//
if (myState==GEOMAlgo_ST_ON && aType1==GeomAbs_Sphere) {
Standard_Real aT1, aT2;
Handle(Geom_Curve) aC;
Handle(Geom_Curve) aC;
GeomAdaptor_Curve aGAC;
GeomAbs_CurveType aType2;
//
@ -355,7 +353,7 @@ void GEOMAlgo_FinderShapeOn1::ProcessEdges()
//
InnerPoints(aE, aLP);
if (myErrorStatus) {
return;
return;
}
//
bIsConformState=Standard_True;
@ -375,7 +373,7 @@ void GEOMAlgo_FinderShapeOn1::ProcessEdges()
}
}
//
aSt=aSC.State();
aSt=aSC.State();
//
bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
if (myShapeType==TopAbs_EDGE) {
@ -386,11 +384,11 @@ void GEOMAlgo_FinderShapeOn1::ProcessEdges()
else if (bIsConformState || aSt==TopAbs_ON) {
myMSS.Add(aE, aSt);
}
} // for (i=1; i<=aNb; ++i) next edge
} // for (i=1; i<=aNb; ++i) next edge
}
//=======================================================================
//function : ProcessFaces
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::ProcessFaces()
{
@ -465,7 +463,7 @@ void GEOMAlgo_FinderShapeOn1::ProcessFaces()
}
}
//
aSt=aSC.State();
aSt=aSC.State();
//
bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
if (myShapeType==TopAbs_FACE) {
@ -476,11 +474,11 @@ void GEOMAlgo_FinderShapeOn1::ProcessFaces()
else if (bIsConformState || aSt==TopAbs_ON) {
myMSS.Add(aF, aSt);
}
}// for (i=1; i<=aNb; ++i) next face
}// for (i=1; i<=aNb; ++i) next face
}
//=======================================================================
//function : ProcessSolids
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::ProcessSolids()
{
@ -516,7 +514,7 @@ void GEOMAlgo_FinderShapeOn1::ProcessSolids()
continue; // face has non-conformed state,skip solid
}
//
aSt=aSC.State();
aSt=aSC.State();
//
bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState);
if (bIsConformState) {
@ -527,7 +525,7 @@ void GEOMAlgo_FinderShapeOn1::ProcessSolids()
//
//=======================================================================
//function : InnerPoints
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
GEOMAlgo_ListOfPnt& aLP)
@ -585,24 +583,15 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
iCnt=aIt.Value();
if (iCnt==1) {
const GEOMAlgo_PassKey& aPK=aIt.Key();
//qf
/*
aNbMax=aPK.NbMax();
pIds=(Standard_Integer*)aPK.Key();
for (k=1; k<3; ++k) {
aNx=*(pIds+aNbMax-k);
aMBN.Add(aNx);
}
*/
//
aNx=(Standard_Integer)aPK.Id(1);
aMBN.Add(aNx);
aNx=(Standard_Integer)aPK.Id(2);
aMBN.Add(aNx);
//qt
}
}
//
// inner nodes=all_nodes - boundary_nodes
// inner nodes=all_nodes - boundary_nodes
j1=aNodes.Lower();
j2=aNodes.Upper();
for (j=j1; j<=j2; ++j) {
@ -614,7 +603,7 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
//
aNb=aLP.Extent();
//
if (!aNb && myNbPntsMin) {
if (!aNb && myNbPntsMin) {
// try to fill it yourself
Standard_Boolean bIsDone;
Standard_Integer aN1, aN2;
@ -635,17 +624,10 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
// take the first having occured inner link
// and discretize it
const GEOMAlgo_PassKey& aPK=aIt.Key();
//qf
/*
aNbMax=aPK.NbMax();
pIds=(Standard_Integer*)aPK.Key();
aN1=*(pIds+aNbMax-1);
aN2=*(pIds+aNbMax-2);
*/
//
aN1=(Standard_Integer)aPK.Id(1);
aN2=(Standard_Integer)aPK.Id(2);
//qt
//
aP1=aNodes(aN1).Transformed(aTrsf);
aP2=aNodes(aN2).Transformed(aTrsf);
//
@ -674,12 +656,144 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
break;
}// if (iCnt>1)
}// for (; aIt.More(); aIt.Next())
}// if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder)
}// if (!aNb && myNbPntsMin) {
}// if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder)
}// if (!aNb && myNbPntsMin) {
}
//modified by NIZNHY-PKV Thu Jan 26 09:56:20 2012f
//=======================================================================
//function : InnerPoints
//purpose :
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
GEOMAlgo_ListOfPnt& aLP)
{
Standard_Integer aNbPntsMin;
//
myErrorStatus=0;
aNbPntsMin=21;
//
aLP.Clear();
InnerPoints(aE, aNbPntsMin, aLP);
}
//modified by NIZNHY-PKV Thu Jan 26 09:56:32 2012t
//=======================================================================
//function : InnerPoints
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
const Standard_Integer aNbPntsMin,
GEOMAlgo_ListOfPnt& aLP)
{
Standard_Boolean bInf1, bInf2;
Standard_Integer j, aNbT;
Standard_Real dT, aT, aT1, aT2;
gp_Pnt aP;
Handle(Geom_Curve) aC3D;
//
aC3D=BRep_Tool::Curve(aE, aT1, aT2);
if (aC3D.IsNull()) {
return;
}
//
bInf1=Precision::IsNegativeInfinite(aT1);
bInf2=Precision::IsPositiveInfinite(aT2);
if (bInf1 || bInf2) {
return;
}
//
//modified by NIZNHY-PKV Thu Jan 26 09:51:20 2012f
/*
aNbT=myNbPntsMin+1;
dT=(aT2-aT1)/aNbT;
for (j=1; j<=aNbPntsMin; ++j) {
aT=aT1+j*dT;
aC3D->D0(aT, aP);
aLP.Append(aP);
}
*/
aNbT=aNbPntsMin+1;
dT=(aT2-aT1)/aNbT;
for (j=1; j<aNbT; ++j) {
aT=aT1+j*dT;
aC3D->D0(aT, aP);
aLP.Append(aP);
}
//modified by NIZNHY-PKV Thu Jan 26 09:51:24 2012t
}
//=======================================================================
//function : CheckData
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::CheckData()
{
myErrorStatus=0;
//
if(mySurface.IsNull()) {
myErrorStatus=10; // mySurface=NULL
return;
}
//
if (myShape.IsNull()) {
myErrorStatus=11; // myShape=NULL
return;
}
//
if (!(myShapeType==TopAbs_VERTEX ||
myShapeType==TopAbs_EDGE ||
myShapeType==TopAbs_FACE ||
myShapeType==TopAbs_SOLID)) {
myErrorStatus=12; // unallowed subshape type
return;
}
//
if (myState==GEOMAlgo_ST_UNKNOWN ||
myState==GEOMAlgo_ST_INOUT) {
myErrorStatus=13; // unallowed state type
return;
}
//
GeomAbs_SurfaceType aType;
//
myGAS.Load(mySurface);
aType=myGAS.GetType();
if (!(aType==GeomAbs_Plane ||
aType==GeomAbs_Cylinder ||
aType==GeomAbs_Sphere)) {
myErrorStatus=14; // unallowed surface type
}
}
//=======================================================================
//function : GetPointState
//purpose :
//=======================================================================
TopAbs_State GEOMAlgo_FinderShapeOn1::GetPointState(const gp_Pnt& aP)
{
TopAbs_State aSt;
GEOMAlgo_SurfaceTools::GetState(aP, myGAS, myTolerance, aSt);
return aSt;
}
//
// myErrorStatus :
//
// 10 -mySurface=NULL
// 11 -myShape=NULL
// 12 -unallowed type of subshapes
// 13 -unallowed state
// 14 -unallowed surface type
// 15 -unallowed surface type
// 20- no triangulation found
// 30- can not obtain the line from the link
//modified by NIZNHY-PKV Thu Jan 26 10:01:14 2012f
/*
//=======================================================================
//function : InnerPoints
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
GEOMAlgo_ListOfPnt& aLP)
@ -727,165 +841,11 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
}
//
aNb=aLP.Extent();
if (!aNb && myNbPntsMin) {
if (!aNb && myNbPntsMin) {
// try to fill it yourself
InnerPoints(aE, myNbPntsMin, aLP);
aNb=aLP.Extent();
}
}
//=======================================================================
//function : InnerPoints
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
const Standard_Integer aNbPntsMin,
GEOMAlgo_ListOfPnt& aLP)
{
// try to fill it yourself
Standard_Boolean bInf1, bInf2;
Standard_Integer j, aNbT;
Standard_Real dT, aT, aT1, aT2;
gp_Pnt aP;
Handle(Geom_Curve) aC3D;
//
aC3D=BRep_Tool::Curve(aE, aT1, aT2);
if (aC3D.IsNull()) {
return;
}
//
bInf1=Precision::IsNegativeInfinite(aT1);
bInf2=Precision::IsPositiveInfinite(aT2);
if (bInf1 || bInf2) {
return;
}
//
aNbT=myNbPntsMin+1;
dT=(aT2-aT1)/aNbT;
for (j=1; j<=aNbPntsMin; ++j) {
aT=aT1+j*dT;
aC3D->D0(aT, aP);
aLP.Append(aP);
}
}
//=======================================================================
//function : CheckData
//purpose :
//=======================================================================
void GEOMAlgo_FinderShapeOn1::CheckData()
{
myErrorStatus=0;
//
if(mySurface.IsNull()) {
myErrorStatus=10; // mySurface=NULL
return;
}
//
if (myShape.IsNull()) {
myErrorStatus=11; // myShape=NULL
return;
}
//
if (!(myShapeType==TopAbs_VERTEX ||
myShapeType==TopAbs_EDGE ||
myShapeType==TopAbs_FACE ||
myShapeType==TopAbs_SOLID)) {
myErrorStatus=12; // unallowed sub-shape type
return;
}
//
if (myState==GEOMAlgo_ST_UNKNOWN ||
myState==GEOMAlgo_ST_INOUT) {
myErrorStatus=13; // unallowed state type
return;
}
//
GeomAbs_SurfaceType aType;
//
myGAS.Load(mySurface);
aType=myGAS.GetType();
if (!(aType==GeomAbs_Plane ||
aType==GeomAbs_Cylinder ||
aType==GeomAbs_Sphere)) {
myErrorStatus=14; // unallowed surface type
}
}
//=======================================================================
//function : GetPointState
//purpose :
//=======================================================================
TopAbs_State GEOMAlgo_FinderShapeOn1::GetPointState(const gp_Pnt& aP)
{
TopAbs_State aSt;
GEOMAlgo_SurfaceTools::GetState(aP, myGAS, myTolerance, aSt);
return aSt;
}
//
// myErrorStatus :
//
// 10 -mySurface=NULL
// 11 -myShape=NULL
// 12 -unallowed type of sub-shapes
// 13 -unallowed state
// 14 -unallowed surface type
// 15 -unallowed surface type
// 20- no triangulation found
// 30- can not obtain the line from the link
/*
// Chronometer
#include <OSD_Chronometer.hxx>
#include <Standard_Static.hxx>
Standard_STATIC(OSD_Chronometer, x_S_Chrono);
static void x_StartChrono();
static void x_StopChrono();
static Standard_Boolean x_IsToShow();
//
//=======================================================================
//function : x_StartChrono
//purpose :
//=======================================================================
void x_StartChrono()
{
if (x_IsToShow()){
x_S_Chrono().Reset();
x_S_Chrono().Start();
}
}
//=======================================================================
//function : x_StopChrono
//purpose :
//=======================================================================
void x_StopChrono()
{
if (x_IsToShow()){
Standard_Real Chrono;
x_S_Chrono().Stop();
x_S_Chrono().Show(Chrono);
printf(" Tps: %lf\n", Chrono);
//cout << "Tps: " << Chrono << endl;
}
}
//=======================================================================
//function : x_IsToShow
//purpose :
//=======================================================================
Standard_Boolean x_IsToShow()
{
Standard_Boolean bFlag=Standard_False;
//
char *xr=getenv ("STDCHRONO");
if (xr!=NULL){
if (!strcmp (xr, "yes")) {
bFlag=!bFlag;
}
}
return bFlag;
}
*/
//modified by NIZNHY-PKV Thu Jan 26 10:01:17 2012t