mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-26 09:20:34 +05:00
Merge branch 'master' of https://codev-tuleap.cea.fr/plugins/git/salome/smesh
This commit is contained in:
commit
eb9d56943a
@ -4272,6 +4272,8 @@ struct ElementsOnShape::OctreeClassifier : public SMESH_Octree
|
||||
std::vector< ElementsOnShape::Classifier >& cls );
|
||||
void GetClassifiersAtPoint( const gp_XYZ& p,
|
||||
std::vector< ElementsOnShape::Classifier* >& classifiers );
|
||||
size_t GetSize();
|
||||
|
||||
protected:
|
||||
OctreeClassifier() {}
|
||||
SMESH_Octree* newChild() const { return new OctreeClassifier; }
|
||||
@ -4297,6 +4299,21 @@ ElementsOnShape::~ElementsOnShape()
|
||||
|
||||
Predicate* ElementsOnShape::clone() const
|
||||
{
|
||||
size_t size = sizeof( *this );
|
||||
if ( myOctree )
|
||||
size += myOctree->GetSize();
|
||||
if ( !myClassifiers.empty() )
|
||||
size += sizeof( myClassifiers[0] ) * myClassifiers.size();
|
||||
if ( !myWorkClassifiers.empty() )
|
||||
size += sizeof( myWorkClassifiers[0] ) * myWorkClassifiers.size();
|
||||
if ( size > 1e+9 ) // 1G
|
||||
{
|
||||
#ifdef _DEBUG_
|
||||
std::cout << "Avoid ElementsOnShape::clone(), too large: " << size << " bytes " << std::endl;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
ElementsOnShape* cln = new ElementsOnShape();
|
||||
cln->SetAllNodes ( myAllNodesFlag );
|
||||
cln->SetTolerance( myToler );
|
||||
@ -4453,6 +4470,8 @@ bool ElementsOnShape::IsSatisfy (const SMDS_MeshElement* elem)
|
||||
for ( size_t i = 0; i < myClassifiers.size(); ++i )
|
||||
myWorkClassifiers[ i ] = & myClassifiers[ i ];
|
||||
myOctree = new OctreeClassifier( myWorkClassifiers );
|
||||
|
||||
SMESHUtils::FreeVector( myWorkClassifiers );
|
||||
}
|
||||
|
||||
for ( int i = 0, nb = elem->NbNodes(); i < nb && (isSatisfy == myAllNodesFlag); ++i )
|
||||
@ -4624,6 +4643,16 @@ void ElementsOnShape::Classifier::Init( const TopoDS_Shape& theShape,
|
||||
{
|
||||
Bnd_Box box;
|
||||
BRepBndLib::Add( myShape, box );
|
||||
if ( myShape.ShapeType() == TopAbs_FACE )
|
||||
{
|
||||
BRepAdaptor_Surface SA( TopoDS::Face( myShape ), /*useBoundaries=*/false );
|
||||
if ( SA.GetType() == GeomAbs_BSplineSurface )
|
||||
{
|
||||
box.SetVoid();
|
||||
BRepBndLib::AddOptimal( myShape, box,
|
||||
/*useTriangulation=*/true, /*useShapeTolerance=*/true );
|
||||
}
|
||||
}
|
||||
myBox.Clear();
|
||||
myBox.Add( box.CornerMin() );
|
||||
myBox.Add( box.CornerMax() );
|
||||
@ -4643,19 +4672,19 @@ ElementsOnShape::Classifier::~Classifier()
|
||||
delete mySolidClfr; mySolidClfr = 0;
|
||||
}
|
||||
|
||||
bool ElementsOnShape::Classifier::isOutOfSolid (const gp_Pnt& p)
|
||||
bool ElementsOnShape::Classifier::isOutOfSolid( const gp_Pnt& p )
|
||||
{
|
||||
if ( isOutOfBox( p )) return true;
|
||||
mySolidClfr->Perform( p, myTol );
|
||||
return ( mySolidClfr->State() != TopAbs_IN && mySolidClfr->State() != TopAbs_ON );
|
||||
}
|
||||
|
||||
bool ElementsOnShape::Classifier::isOutOfBox (const gp_Pnt& p)
|
||||
bool ElementsOnShape::Classifier::isOutOfBox( const gp_Pnt& p )
|
||||
{
|
||||
return myBox.IsOut( p.XYZ() );
|
||||
}
|
||||
|
||||
bool ElementsOnShape::Classifier::isOutOfFace (const gp_Pnt& p)
|
||||
bool ElementsOnShape::Classifier::isOutOfFace( const gp_Pnt& p )
|
||||
{
|
||||
if ( isOutOfBox( p )) return true;
|
||||
myProjFace.Perform( p );
|
||||
@ -4672,19 +4701,19 @@ bool ElementsOnShape::Classifier::isOutOfFace (const gp_Pnt& p)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ElementsOnShape::Classifier::isOutOfEdge (const gp_Pnt& p)
|
||||
bool ElementsOnShape::Classifier::isOutOfEdge( const gp_Pnt& p )
|
||||
{
|
||||
if ( isOutOfBox( p )) return true;
|
||||
myProjEdge.Perform( p );
|
||||
return ! ( myProjEdge.NbPoints() > 0 && myProjEdge.LowerDistance() <= myTol );
|
||||
}
|
||||
|
||||
bool ElementsOnShape::Classifier::isOutOfVertex(const gp_Pnt& p)
|
||||
bool ElementsOnShape::Classifier::isOutOfVertex( const gp_Pnt& p )
|
||||
{
|
||||
return ( myVertexXYZ.Distance( p ) > myTol );
|
||||
}
|
||||
|
||||
bool ElementsOnShape::Classifier::isBox (const TopoDS_Shape& theShape)
|
||||
bool ElementsOnShape::Classifier::isBox(const TopoDS_Shape& theShape )
|
||||
{
|
||||
TopTools_IndexedMapOfShape vMap;
|
||||
TopExp::MapShapes( theShape, TopAbs_VERTEX, vMap );
|
||||
@ -4766,6 +4795,19 @@ OctreeClassifier::GetClassifiersAtPoint( const gp_XYZ& point,
|
||||
}
|
||||
}
|
||||
|
||||
size_t ElementsOnShape::OctreeClassifier::GetSize()
|
||||
{
|
||||
size_t res = sizeof( *this );
|
||||
if ( !myClassifiers.empty() )
|
||||
res += sizeof( myClassifiers[0] ) * myClassifiers.size();
|
||||
|
||||
if ( !isLeaf() )
|
||||
for (int i = 0; i < nbChildren(); i++)
|
||||
res += ((OctreeClassifier*) myChildren[i])->GetSize();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void ElementsOnShape::OctreeClassifier::buildChildrenData()
|
||||
{
|
||||
// distribute myClassifiers among myChildren
|
||||
@ -4840,8 +4882,13 @@ BelongToGeom::BelongToGeom()
|
||||
|
||||
Predicate* BelongToGeom::clone() const
|
||||
{
|
||||
BelongToGeom* cln = new BelongToGeom( *this );
|
||||
cln->myElementsOnShapePtr.reset( static_cast<ElementsOnShape*>( myElementsOnShapePtr->clone() ));
|
||||
BelongToGeom* cln = 0;
|
||||
if ( myElementsOnShapePtr )
|
||||
if ( ElementsOnShape* eos = static_cast<ElementsOnShape*>( myElementsOnShapePtr->clone() ))
|
||||
{
|
||||
cln = new BelongToGeom( *this );
|
||||
cln->myElementsOnShapePtr.reset( eos );
|
||||
}
|
||||
return cln;
|
||||
}
|
||||
|
||||
@ -5011,8 +5058,13 @@ LyingOnGeom::LyingOnGeom()
|
||||
|
||||
Predicate* LyingOnGeom::clone() const
|
||||
{
|
||||
LyingOnGeom* cln = new LyingOnGeom( *this );
|
||||
cln->myElementsOnShapePtr.reset( static_cast<ElementsOnShape*>( myElementsOnShapePtr->clone() ));
|
||||
LyingOnGeom* cln = 0;
|
||||
if ( myElementsOnShapePtr )
|
||||
if ( ElementsOnShape* eos = static_cast<ElementsOnShape*>( myElementsOnShapePtr->clone() ))
|
||||
{
|
||||
cln = new LyingOnGeom( *this );
|
||||
cln->myElementsOnShapePtr.reset( eos );
|
||||
}
|
||||
return cln;
|
||||
}
|
||||
|
||||
|
@ -92,18 +92,18 @@ namespace MED
|
||||
{
|
||||
#ifdef WIN32
|
||||
#ifdef UNICODE
|
||||
int size_needed = MultiByteToWideChar(CP_UTF8, 0, fileName.c_str(), strlen(fileName.c_str()), NULL, 0);
|
||||
wchar_t* path = new wchar_t[size_needed + 1];
|
||||
MultiByteToWideChar(CP_UTF8, 0, fileName.c_str(), strlen(fileName.c_str()), path, size_needed);
|
||||
path[size_needed] = '\0';
|
||||
int size_needed = MultiByteToWideChar(CP_UTF8, 0, fileName.c_str(), strlen(fileName.c_str()), NULL, 0);
|
||||
wchar_t* path = new wchar_t[size_needed + 1];
|
||||
MultiByteToWideChar(CP_UTF8, 0, fileName.c_str(), strlen(fileName.c_str()), path, size_needed);
|
||||
path[size_needed] = '\0';
|
||||
#else
|
||||
cosnt char* path = xmlPath.c_str();
|
||||
cosnt char* path = xmlPath.c_str();
|
||||
#endif
|
||||
bool res = (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES);
|
||||
bool res = (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES);
|
||||
#ifdef UNICODE
|
||||
delete path;
|
||||
delete path;
|
||||
#endif
|
||||
return res;
|
||||
return res;
|
||||
#else
|
||||
return (access(fileName.c_str(), F_OK) == 0);
|
||||
#endif
|
||||
@ -148,7 +148,7 @@ namespace MED
|
||||
ok = true;
|
||||
else {
|
||||
int medVersion = 10*major + minor;
|
||||
for (int ii=0; ii < sizeof(medVersionsOK)/sizeof(int); ii++)
|
||||
for (size_t ii=0; ii < sizeof(medVersionsOK)/sizeof(int); ii++)
|
||||
if (medVersionsOK[ii] == medVersion) {
|
||||
ok =true;
|
||||
break;
|
||||
@ -205,39 +205,39 @@ namespace MED
|
||||
{
|
||||
bool isCreated = false;
|
||||
if (!CheckCompatibility(fileName, true))
|
||||
{
|
||||
remove(fileName.c_str());
|
||||
isCreated = true;
|
||||
}
|
||||
{
|
||||
remove(fileName.c_str());
|
||||
isCreated = true;
|
||||
}
|
||||
int minor = -1;
|
||||
if (isCreated)
|
||||
{
|
||||
med_int wantedMajor = MED_MAJOR_NUM;
|
||||
med_int wantedMinor = MED_MINOR_NUM;
|
||||
if (theVersion > 0)
|
||||
{
|
||||
med_int wantedMajor = MED_MAJOR_NUM;
|
||||
med_int wantedMinor = MED_MINOR_NUM;
|
||||
if (theVersion > 0)
|
||||
{
|
||||
wantedMajor = theVersion/10;
|
||||
wantedMinor = theVersion%10;
|
||||
}
|
||||
if (wantedMajor == MED_MAJOR_NUM) // the med file will be actually created
|
||||
{
|
||||
if (wantedMinor < MED_MINOR_NUM)
|
||||
minor = wantedMinor;
|
||||
}
|
||||
else // an empty existing med file of the right version will be used for append
|
||||
{
|
||||
int medVersionsOK[] = MED_VERSIONS_APPEND_COMPATIBLE;
|
||||
bool isVersionOK = false;
|
||||
for (int ii=0; ii < sizeof(medVersionsOK)/sizeof(int); ii++)
|
||||
if (medVersionsOK[ii] == theVersion)
|
||||
{
|
||||
isVersionOK =true;
|
||||
break;
|
||||
}
|
||||
if (isVersionOK) // copy an empty existing med file of the right version, for append
|
||||
CreateEmptyMEDFile(fileName, theVersion);
|
||||
}
|
||||
wantedMajor = theVersion/10;
|
||||
wantedMinor = theVersion%10;
|
||||
}
|
||||
if (wantedMajor == MED_MAJOR_NUM) // the med file will be actually created
|
||||
{
|
||||
if (wantedMinor < MED_MINOR_NUM)
|
||||
minor = wantedMinor;
|
||||
}
|
||||
else // an empty existing med file of the right version will be used for append
|
||||
{
|
||||
int medVersionsOK[] = MED_VERSIONS_APPEND_COMPATIBLE;
|
||||
bool isVersionOK = false;
|
||||
for (size_t ii=0; ii < sizeof(medVersionsOK)/sizeof(int); ii++)
|
||||
if (medVersionsOK[ii] == theVersion)
|
||||
{
|
||||
isVersionOK =true;
|
||||
break;
|
||||
}
|
||||
if (isVersionOK) // copy an empty existing med file of the right version, for append
|
||||
CreateEmptyMEDFile(fileName, theVersion);
|
||||
}
|
||||
}
|
||||
return new MED::TWrapper(fileName, minor);
|
||||
}
|
||||
}
|
||||
|
@ -188,8 +188,8 @@ namespace MED
|
||||
//---------------------------------------------------------------
|
||||
TWrapper
|
||||
::TWrapper(const std::string& theFileName, TInt theMinor):
|
||||
myMinor(theMinor),
|
||||
myFile(new TFile(theFileName, theMinor))
|
||||
myFile(new TFile(theFileName, theMinor)),
|
||||
myMinor(theMinor)
|
||||
{
|
||||
TErr aRet;
|
||||
myFile->Open(eLECTURE_ECRITURE, &aRet);
|
||||
|
@ -82,10 +82,10 @@ bool SMESH_File::open()
|
||||
{
|
||||
#ifdef WIN32
|
||||
#ifdef UNICODE
|
||||
std::wstring aName = Kernel_Utils::utf8_decode_s(_name);
|
||||
const wchar_t* name = aName.c_str();
|
||||
std::wstring aName = Kernel_Utils::utf8_decode_s(_name);
|
||||
const wchar_t* name = aName.c_str();
|
||||
#else
|
||||
char* name = name.data();
|
||||
char* name = _name.data();
|
||||
#endif
|
||||
_file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ,
|
||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
@ -321,12 +321,12 @@ bool SMESH_File::openForWriting()
|
||||
{
|
||||
#ifdef WIN32
|
||||
#ifdef UNICODE
|
||||
std::wstring aName = Kernel_Utils::utf8_decode_s(_name);
|
||||
const wchar_t* name = aName.c_str();
|
||||
std::wstring aName = Kernel_Utils::utf8_decode_s(_name);
|
||||
const wchar_t* name = aName.c_str();
|
||||
#else
|
||||
char* name = name.data();
|
||||
char* name = _name.data();
|
||||
#endif
|
||||
_file = CreateFile( name, // name of the write
|
||||
_file = CreateFile( name, // name of the write
|
||||
GENERIC_WRITE, // open for writing
|
||||
0, // do not share
|
||||
NULL, // default security
|
||||
|
Loading…
Reference in New Issue
Block a user