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; }
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 );
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 )
{
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() );
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 );
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 );
}
}
+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
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;
}
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;
}
{
#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
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;
{
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
+ 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)
{
- 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);
+ 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);
}
}
//---------------------------------------------------------------
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);
{
#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);
{
#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