-// Copyright (C) 2007-2008 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
//
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
// File : SMESH_Mesh_i.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-//
-#include "SMESH_Mesh_i.hxx"
-#include "SMESH_Filter_i.hxx"
-#include "SMESH_Gen_i.hxx"
-#include "SMESH_Group_i.hxx"
-#include "SMESH_MEDMesh_i.hxx"
-#include "SMESH_MeshEditor_i.hxx"
-#include "SMESH_PythonDump.hxx"
-#include "SMESH_subMesh_i.hxx"
+#include "SMESH_Mesh_i.hxx"
#include "DriverMED_R_SMESHDS_Mesh.h"
#include "DriverMED_W_SMESHDS_Mesh.h"
+#include "SMDS_EdgePosition.hxx"
+#include "SMDS_ElemIterator.hxx"
+#include "SMDS_FacePosition.hxx"
+#include "SMDS_IteratorOnIterators.hxx"
+#include "SMDS_MeshGroup.hxx"
+#include "SMDS_SetIterator.hxx"
#include "SMDS_VolumeTool.hxx"
#include "SMESHDS_Command.hxx"
#include "SMESHDS_CommandType.hxx"
+#include "SMESHDS_Group.hxx"
#include "SMESHDS_GroupOnGeom.hxx"
+#include "SMESH_Filter_i.hxx"
+#include "SMESH_Gen_i.hxx"
#include "SMESH_Group.hxx"
+#include "SMESH_Group_i.hxx"
+#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_MeshEditor.hxx"
+#include "SMESH_MeshEditor_i.hxx"
+#include "SMESH_MeshPartDS.hxx"
#include "SMESH_MesherHelper.hxx"
-#include "SMDS_EdgePosition.hxx"
-#include "SMDS_FacePosition.hxx"
+#include "SMESH_PreMeshInfo.hxx"
+#include "SMESH_PythonDump.hxx"
+#include "SMESH_subMesh_i.hxx"
+
+#include <OpUtil.hxx>
+#include <SALOMEDS_Attributes_wrap.hxx>
+#include <SALOMEDS_wrap.hxx>
+#include <SALOME_NamingService.hxx>
+#include <Utils_ExceptHandlers.hxx>
+#include <Utils_SINGLETON.hxx>
+#include <utilities.h>
-#include "OpUtil.hxx"
-#include "SALOME_NamingService.hxx"
-#include "Utils_CorbaException.hxx"
-#include "Utils_ExceptHandlers.hxx"
-#include "Utils_SINGLETON.hxx"
-#include "utilities.h"
-#include "GEOMImpl_Types.hxx"
+#include <GEOMImpl_Types.hxx>
+#include <GEOM_wrap.hxx>
// OCCT Includes
#include <BRep_Builder.hxx>
#include <OSD_File.hxx>
#include <OSD_Path.hxx>
#include <OSD_Protection.hxx>
+#include <Standard_OutOfMemory.hxx>
#include <TColStd_MapIteratorOfMapOfInteger.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <TColStd_SequenceOfInteger.hxx>
#include <TCollection_AsciiString.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
+#include <TopTools_MapIteratorOfMapOfShape.hxx>
+#include <TopTools_MapOfShape.hxx>
#include <TopoDS_Compound.hxx>
+#include "SMESH_TryCatch.hxx" // include after OCCT headers!
+
// STL Includes
+#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>
+
#include <sys/stat.h>
#ifdef _DEBUG_
using namespace std;
using SMESH::TPythonDump;
-int SMESH_Mesh_i::myIdGenerator = 0;
-
-
+int SMESH_Mesh_i::_idGenerator = 0;
//=============================================================================
/*!
//=============================================================================
SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA,
- SMESH_Gen_i* gen_i,
- CORBA::Long studyId )
+ SMESH_Gen_i* gen_i,
+ CORBA::Long studyId )
: SALOME::GenericObj_i( thePOA )
{
MESSAGE("SMESH_Mesh_i");
- _impl = NULL;
- _gen_i = gen_i;
- _id = myIdGenerator++;
- _studyId = studyId;
+ _impl = NULL;
+ _gen_i = gen_i;
+ _id = _idGenerator++;
+ _studyId = studyId;
+ _preMeshInfo = NULL;
}
//=============================================================================
SMESH_Mesh_i::~SMESH_Mesh_i()
{
- INFOS("~SMESH_Mesh_i");
- map<int, SMESH::SMESH_GroupBase_ptr>::iterator it;
- for ( it = _mapGroups.begin(); it != _mapGroups.end(); it++ ) {
- SMESH_GroupBase_i* aGroup = dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( it->second ).in() );
- if ( aGroup ) {
- // this method is colled from destructor of group (PAL6331)
+ MESSAGE("~SMESH_Mesh_i");
+
+ // destroy groups
+ map<int, SMESH::SMESH_GroupBase_ptr>::iterator itGr;
+ for (itGr = _mapGroups.begin(); itGr != _mapGroups.end(); itGr++)
+ if (SMESH_GroupBase_i* aGroup = SMESH::DownCast<SMESH_GroupBase_i*>(itGr->second))
+ {
+ // _impl->RemoveGroup() is called by ~SMESH_GroupBase_i() (PAL6331)
//_impl->RemoveGroup( aGroup->GetLocalID() );
-
- aGroup->Destroy();
+ aGroup->myMeshServant = 0;
+ aGroup->UnRegister();
}
- }
_mapGroups.clear();
- delete _impl;
+
+ // destroy submeshes
+ map<int, SMESH::SMESH_subMesh_ptr>::iterator itSM;
+ for ( itSM = _mapSubMeshIor.begin(); itSM != _mapSubMeshIor.end(); itSM++ )
+ if ( SMESH_subMesh_i* aSubMesh = SMESH::DownCast<SMESH_subMesh_i*>( itSM->second ))
+ {
+ aSubMesh->UnRegister();
+ }
+ _mapSubMeshIor.clear();
+
+ // destroy hypotheses
+ map<int, SMESH::SMESH_Hypothesis_ptr>::iterator itH;
+ for ( itH = _mapHypo.begin(); itH != _mapHypo.end(); itH++ )
+ if ( SMESH_Hypothesis_i* aHypo = SMESH::DownCast<SMESH_Hypothesis_i*>( itH->second ))
+ {
+ aHypo->UnRegister();
+ }
+ _mapHypo.clear();
+
+ delete _impl; _impl = NULL;
+ delete _preMeshInfo; _preMeshInfo = NULL;
}
//=============================================================================
return aShapeObj._retn();
}
+//================================================================================
+/*!
+ * \brief Return false if the mesh is not yet fully loaded from the study file
+ */
+//================================================================================
+
+CORBA::Boolean SMESH_Mesh_i::IsLoaded() throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ return !_preMeshInfo;
+}
+
+//================================================================================
+/*!
+ * \brief Load full mesh data from the study file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::Load() throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+}
+
//================================================================================
/*!
* \brief Remove all nodes and elements
void SMESH_Mesh_i::Clear() throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetAllData();
+
try {
_impl->Clear();
CheckGeomGroupModif(); // issue 20145
catch(SALOME_Exception & S_ex) {
THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
}
+ _impl->GetMeshDS()->Modified();
+
TPythonDump() << _this() << ".Clear()";
}
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
try {
_impl->ClearSubMesh( ShapeID );
}
catch(SALOME_Exception & S_ex) {
THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
}
+ _impl->GetMeshDS()->Modified();
+
+ TPythonDump() << _this() << ".ClearSubMesh( " << ShapeID << " )";
}
//=============================================================================
/*!
- *
+ * Convert enum Driver_Mesh::Status to SMESH::DriverMED_ReadStatus
*/
//=============================================================================
res = SMESH::DRS_WARN_RENUMBER; break;
case DriverMED_R_SMESHDS_Mesh::DRS_WARN_SKIP_ELEM:
res = SMESH::DRS_WARN_SKIP_ELEM; break;
+ case DriverMED_R_SMESHDS_Mesh::DRS_WARN_DESCENDING:
+ res = SMESH::DRS_WARN_DESCENDING; break;
case DriverMED_R_SMESHDS_Mesh::DRS_FAIL:
default:
res = SMESH::DRS_FAIL; break;
return res;
}
+//=============================================================================
+/*!
+ * Convert ::SMESH_ComputeError to SMESH::ComputeError
+ */
+//=============================================================================
+
+static SMESH::ComputeError* ConvertComputeError( SMESH_ComputeErrorPtr errorPtr )
+{
+ SMESH::ComputeError_var errVar = new SMESH::ComputeError();
+ errVar->subShapeID = -1;
+ errVar->hasBadMesh = false;
+
+ if ( !errorPtr || errorPtr->IsOK() )
+ {
+ errVar->code = SMESH::COMPERR_OK;
+ }
+ else
+ {
+ errVar->code = ConvertDriverMEDReadStatus( errorPtr->myName );
+ errVar->comment = errorPtr->myComment.c_str();
+ }
+ return errVar._retn();
+}
+
//=============================================================================
/*!
* ImportMEDFile
int major, minor, release;
if( !MED::getMEDVersion( theFileName, major, minor, release ) )
major = minor = release = -1;
- myFileInfo = new SALOME_MED::MedFileInfo();
- myFileInfo->fileName = theFileName;
- myFileInfo->fileSize = 0;
+ _medFileInfo = new SALOME_MED::MedFileInfo();
+ _medFileInfo->fileName = theFileName;
+ _medFileInfo->fileSize = 0;
#ifdef WIN32
struct _stati64 d;
if ( ::_stati64( theFileName, &d ) != -1 )
struct stat64 d;
if ( ::stat64( theFileName, &d ) != -1 )
#endif
- myFileInfo->fileSize = d.st_size;
- myFileInfo->major = major;
- myFileInfo->minor = minor;
- myFileInfo->release = release;
+ _medFileInfo->fileSize = d.st_size;
+ _medFileInfo->major = major;
+ _medFileInfo->minor = minor;
+ _medFileInfo->release = release;
+
+ return ConvertDriverMEDReadStatus(status);
+}
+
+//================================================================================
+/*!
+ * \brief Imports mesh data from the CGNS file
+ */
+//================================================================================
+
+SMESH::DriverMED_ReadStatus SMESH_Mesh_i::ImportCGNSFile( const char* theFileName,
+ const int theMeshIndex,
+ std::string& theMeshName )
+ throw ( SALOME::SALOME_Exception )
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ int status;
+ try {
+ status = _impl->CGNSToMesh( theFileName, theMeshIndex, theMeshName );
+ }
+ catch( SALOME_Exception& S_ex ) {
+ THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+ }
+ catch ( ... ) {
+ THROW_SALOME_CORBA_EXCEPTION("ImportCGNSFile(): unknown exception", SALOME::BAD_PARAM);
+ }
+
+ CreateGroupServants();
return ConvertDriverMEDReadStatus(status);
}
char* SMESH_Mesh_i::GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits)
{
- std::string ver = DriverMED_W_SMESHDS_Mesh::GetVersionString(MED::EVersion(version),
+ string ver = DriverMED_W_SMESHDS_Mesh::GetVersionString(MED::EVersion(version),
nbDigits);
return CORBA::string_dup( ver.c_str() );
}
int SMESH_Mesh_i::ImportUNVFile( const char* theFileName )
throw ( SALOME::SALOME_Exception )
{
+ SMESH_TRY;
+
// Read mesh with name = <theMeshName> into SMESH_Mesh
_impl->UNVToMesh( theFileName );
CreateGroupServants();
+ SMESH_CATCH( SMESH::throwCorbaException );
+
return 1;
}
int SMESH_Mesh_i::ImportSTLFile( const char* theFileName )
throw ( SALOME::SALOME_Exception )
{
+ SMESH_TRY;
+
// Read mesh with name = <theMeshName> into SMESH_Mesh
_impl->STLToMesh( theFileName );
+ SMESH_CATCH( SMESH::throwCorbaException );
+
return 1;
}
-//=============================================================================
+//================================================================================
/*!
- * importMEDFile
- *
- * Imports mesh data from MED file
+ * \brief Function used in SMESH_CATCH by ImportGMFFile()
*/
-//=============================================================================
+//================================================================================
+
+namespace
+{
+ SMESH_ComputeErrorPtr exceptionToComputeError(const char* excText)
+ {
+ return SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, excText );
+ }
+}
+
+//================================================================================
+/*!
+ * \brief Imports data from a GMF file and returns an error description
+ */
+//================================================================================
+
+SMESH::ComputeError* SMESH_Mesh_i::ImportGMFFile( const char* theFileName,
+ bool theMakeRequiredGroups )
+ throw (SALOME::SALOME_Exception)
+{
+ SMESH_ComputeErrorPtr error;
+
+#undef SMESH_CAUGHT
+#define SMESH_CAUGHT error =
+ SMESH_TRY;
-// int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshName )
-// {
-// // Read mesh with name = <theMeshName> and all its groups into SMESH_Mesh
-// int status = _impl->MEDToMesh( theFileName, theMeshName );
-// CreateGroupServants();
+ error = _impl->GMFToMesh( theFileName, theMakeRequiredGroups );
-// return status;
-// }
+ SMESH_CATCH( exceptionToComputeError );
+#undef SMESH_CAUGHT
+#define SMESH_CAUGHT
+
+ CreateGroupServants();
+
+ return ConvertComputeError( error );
+}
//=============================================================================
/*!
*/
//=============================================================================
-SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
+SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
SMESH::SMESH_Hypothesis_ptr anHyp)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetOrLoad();
+
SMESH_Hypothesis::Hypothesis_Status status = addHypothesis( aSubShapeObject, anHyp );
if ( !SMESH_Hypothesis::IsStatusFatal(status) )
if(MYDEBUG) MESSAGE("addHypothesis");
if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh())
- THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
+ THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference",
SALOME::BAD_PARAM);
SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp);
status = _impl->AddHypothesis(myLocSubShape, hypId);
if ( !SMESH_Hypothesis::IsStatusFatal(status) ) {
_mapHypo[hypId] = SMESH::SMESH_Hypothesis::_duplicate( myHyp );
+ _mapHypo[hypId]->Register();
// assure there is a corresponding submesh
if ( !_impl->IsMainShape( myLocSubShape )) {
int shapeId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape );
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetOrLoad();
+
SMESH_Hypothesis::Hypothesis_Status status = removeHypothesis( aSubShapeObject, anHyp );
if ( !SMESH_Hypothesis::IsStatusFatal(status) )
*/
//=============================================================================
-SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
- SMESH::SMESH_Hypothesis_ptr anHyp)
+SMESH_Hypothesis::Hypothesis_Status
+SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
+ SMESH::SMESH_Hypothesis_ptr anHyp)
{
- if(MYDEBUG) MESSAGE("removeHypothesis()");
- // **** proposer liste de subShape (selection multiple)
+ if(MYDEBUG) MESSAGE("removeHypothesis()");
+ // **** proposer liste de sub-shape (selection multiple)
+
+ if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh())
+ THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM);
- if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh())
- THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
- SALOME::BAD_PARAM);
+ SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp);
+ if (CORBA::is_nil(myHyp))
+ THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference", SALOME::BAD_PARAM);
- SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp);
- if (CORBA::is_nil(myHyp))
- THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference",
- SALOME::BAD_PARAM);
+ SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK;
+ try
+ {
+ TopoDS_Shape myLocSubShape;
+ //use PseudoShape in case if mesh has no shape
+ if(HasShapeToMesh())
+ myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject);
+ else
+ myLocSubShape = _impl->GetShapeToMesh();
- SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK;
- try
- {
- TopoDS_Shape myLocSubShape;
- //use PseudoShape in case if mesh has no shape
- if(HasShapeToMesh())
- myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject);
- else
- myLocSubShape = _impl->GetShapeToMesh();
-
- int hypId = myHyp->GetId();
- status = _impl->RemoveHypothesis(myLocSubShape, hypId);
- if ( !SMESH_Hypothesis::IsStatusFatal(status) )
- _mapHypo.erase( hypId );
- }
- catch(SALOME_Exception & S_ex)
- {
- THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
- }
- return status;
+ int hypId = myHyp->GetId();
+ status = _impl->RemoveHypothesis(myLocSubShape, hypId);
+// if ( !SMESH_Hypothesis::IsStatusFatal(status) ) EAP: hyp can be used on many sub-shapes
+// _mapHypo.erase( hypId );
+ }
+ catch(SALOME_Exception & S_ex)
+ {
+ THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+ }
+ return status;
}
//=============================================================================
//=============================================================================
SMESH::ListOfHypothesis *
- SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject)
+ SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
if (MYDEBUG) MESSAGE("GetHypothesisList");
if (_impl->HasShapeToMesh() && CORBA::is_nil(aSubShapeObject))
- THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
- SALOME::BAD_PARAM);
+ THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM);
SMESH::ListOfHypothesis_var aList = new SMESH::ListOfHypothesis();
for ( list<const SMESHDS_Hypothesis*>::const_iterator anIt = aLocalList.begin(); i < n && anIt != aLocalList.end(); anIt++ ) {
SMESHDS_Hypothesis* aHyp = (SMESHDS_Hypothesis*)(*anIt);
if ( _mapHypo.find( aHyp->GetID() ) != _mapHypo.end() )
- aList[i++] = SMESH::SMESH_Hypothesis::_narrow( _mapHypo[aHyp->GetID()] );
+ aList[i++] = SMESH::SMESH_Hypothesis::_narrow( _mapHypo[aHyp->GetID()] );
}
aList->length( i );
return aList._retn();
}
+SMESH::submesh_array* SMESH_Mesh_i::GetSubMeshes() throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if (MYDEBUG) MESSAGE("GetSubMeshes");
+
+ SMESH::submesh_array_var aList = new SMESH::submesh_array();
+
+ // Python Dump
+ TPythonDump aPythonDump;
+ if ( !_mapSubMeshIor.empty() )
+ aPythonDump << "[ ";
+
+ try {
+ aList->length( _mapSubMeshIor.size() );
+ int i = 0;
+ map<int, SMESH::SMESH_subMesh_ptr>::iterator it = _mapSubMeshIor.begin();
+ for ( ; it != _mapSubMeshIor.end(); it++ ) {
+ if ( CORBA::is_nil( it->second )) continue;
+ aList[i++] = SMESH::SMESH_subMesh::_duplicate( it->second );
+ // Python Dump
+ if (i > 1) aPythonDump << ", ";
+ aPythonDump << it->second;
+ }
+ aList->length( i );
+ }
+ catch(SALOME_Exception & S_ex) {
+ THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+ }
+
+ // Update Python script
+ if ( !_mapSubMeshIor.empty() )
+ aPythonDump << " ] = " << _this() << ".GetSubMeshes()";
+
+ return aList._retn();
+}
+
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject,
- const char* theName )
+ const char* theName )
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
MESSAGE("SMESH_Mesh_i::GetSubMesh");
if (CORBA::is_nil(aSubShapeObject))
- THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
- SALOME::BAD_PARAM);
+ THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference",
+ SALOME::BAD_PARAM);
SMESH::SMESH_subMesh_var subMesh;
SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(_this());
//Get or Create the SMESH_subMesh object implementation
int subMeshId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape );
+
+ if ( !subMeshId && ! _impl->GetMeshDS()->IsGroupOfSubShapes( myLocSubShape ))
+ {
+ TopoDS_Iterator it( myLocSubShape );
+ if ( it.More() )
+ THROW_SALOME_CORBA_EXCEPTION("not sub-shape of the main shape", SALOME::BAD_PARAM);
+ }
subMesh = getSubMesh( subMeshId );
// create a new subMesh object servant if there is none for the shape
if ( subMesh->_is_nil() )
subMesh = createSubMesh( aSubShapeObject );
if ( _gen_i->CanPublishInStudy( subMesh )) {
- SALOMEDS::SObject_var aSO =
+ SALOMEDS::SObject_wrap aSO =
_gen_i->PublishSubMesh(_gen_i->GetCurrentStudy(), aMesh,
subMesh, aSubShapeObject, theName );
if ( !aSO->_is_nil()) {
//=============================================================================
void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh )
- throw (SALOME::SALOME_Exception)
+ throw (SALOME::SALOME_Exception)
{
- if(MYDEBUG) MESSAGE("SMESH_Mesh_i::RemoveSubMesh");
+ SMESH_TRY;
+
if ( theSubMesh->_is_nil() )
return;
GEOM::GEOM_Object_var aSubShapeObject;
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
if ( !aStudy->_is_nil() ) {
// Remove submesh's SObject
- SALOMEDS::SObject_var anSO = _gen_i->ObjectToSObject( aStudy, theSubMesh );
+ SALOMEDS::SObject_wrap anSO = _gen_i->ObjectToSObject( aStudy, theSubMesh );
if ( !anSO->_is_nil() ) {
long aTag = SMESH_Gen_i::GetRefOnShapeTag();
- SALOMEDS::SObject_var anObj, aRef;
- if ( anSO->FindSubObject( aTag, anObj ) && anObj->ReferencedObject( aRef ) )
- aSubShapeObject = GEOM::GEOM_Object::_narrow( aRef->GetObject() );
+ SALOMEDS::SObject_wrap anObj, aRef;
+ if ( anSO->FindSubObject( aTag, anObj.inout() ) &&
+ anObj->ReferencedObject( aRef.inout() ))
+ {
+ CORBA::Object_var obj = aRef->GetObject();
+ aSubShapeObject = GEOM::GEOM_Object::_narrow( obj );
+ }
+ // if ( aSubShapeObject->_is_nil() ) // not published shape (IPAL13617)
+ // aSubShapeObject = theSubMesh->GetSubShape();
- aStudy->NewBuilder()->RemoveObjectWithChildren( anSO );
+ SALOMEDS::StudyBuilder_var builder = aStudy->NewBuilder();
+ builder->RemoveObjectWithChildren( anSO );
// Update Python script
TPythonDump() << _this() << ".RemoveSubMesh( " << anSO << " )";
}
}
- removeSubMesh( theSubMesh, aSubShapeObject.in() );
-}
+ if ( removeSubMesh( theSubMesh, aSubShapeObject.in() ))
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetOrLoad();
-//=============================================================================
-/*!
- * ElementTypeString
- */
-//=============================================================================
-#define CASE2STRING(enum) case SMESH::enum: return "SMESH."#enum;
-inline TCollection_AsciiString ElementTypeString (SMESH::ElementType theElemType)
-{
- switch (theElemType) {
- CASE2STRING( ALL );
- CASE2STRING( NODE );
- CASE2STRING( EDGE );
- CASE2STRING( FACE );
- CASE2STRING( VOLUME );
- default:;
- }
- return "";
+ SMESH_CATCH( SMESH::throwCorbaException );
}
//=============================================================================
//=============================================================================
SMESH::SMESH_Group_ptr SMESH_Mesh_i::CreateGroup( SMESH::ElementType theElemType,
- const char* theName )
+ const char* theName )
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::SMESH_Group_var aNewGroup =
SMESH::SMESH_Group::_narrow( createGroup( theElemType, theName ));
if ( _gen_i->CanPublishInStudy( aNewGroup ) ) {
- SALOMEDS::SObject_var aSO =
+ SALOMEDS::SObject_wrap aSO =
_gen_i->PublishGroup(_gen_i->GetCurrentStudy(), _this(),
aNewGroup, GEOM::GEOM_Object::_nil(), theName);
if ( !aSO->_is_nil()) {
// Update Python script
TPythonDump() << aSO << " = " << _this() << ".CreateGroup( "
- << ElementTypeString(theElemType) << ", '" << theName << "' )";
+ << theElemType << ", '" << theName << "' )";
}
}
return aNewGroup._retn();
*
*/
//=============================================================================
-SMESH::SMESH_GroupOnGeom_ptr SMESH_Mesh_i::CreateGroupFromGEOM (SMESH::ElementType theElemType,
- const char* theName,
- GEOM::GEOM_Object_ptr theGeomObj)
+SMESH::SMESH_GroupOnGeom_ptr
+SMESH_Mesh_i::CreateGroupFromGEOM (SMESH::ElementType theElemType,
+ const char* theName,
+ GEOM::GEOM_Object_ptr theGeomObj)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::SMESH_GroupOnGeom_var aNewGroup;
TopoDS_Shape aShape = _gen_i->GeomObjectToShape( theGeomObj );
( createGroup( theElemType, theName, aShape ));
if ( _gen_i->CanPublishInStudy( aNewGroup ) ) {
- SALOMEDS::SObject_var aSO =
+ SALOMEDS::SObject_wrap aSO =
_gen_i->PublishGroup(_gen_i->GetCurrentStudy(), _this(),
aNewGroup, theGeomObj, theName);
if ( !aSO->_is_nil()) {
// Update Python script
TPythonDump() << aSO << " = " << _this() << ".CreateGroupFromGEOM("
- << ElementTypeString(theElemType) << ", '" << theName << "', "
- << theGeomObj << " )";
+ << theElemType << ", '" << theName << "', " << theGeomObj << " )";
}
}
}
return aNewGroup._retn();
}
+//================================================================================
+/*!
+ * \brief Creates a group whose contents is defined by filter
+ * \param theElemType - group type
+ * \param theName - group name
+ * \param theFilter - the filter
+ * \retval SMESH::SMESH_GroupOnFilter_ptr - group defined by filter
+ */
+//================================================================================
+
+SMESH::SMESH_GroupOnFilter_ptr
+SMESH_Mesh_i::CreateGroupFromFilter(SMESH::ElementType theElemType,
+ const char* theName,
+ SMESH::Filter_ptr theFilter )
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ if ( CORBA::is_nil( theFilter ))
+ THROW_SALOME_CORBA_EXCEPTION("NULL filter", SALOME::BAD_PARAM);
+
+ SMESH_PredicatePtr predicate = SMESH_GroupOnFilter_i::GetPredicate( theFilter );
+ if ( !predicate )
+ THROW_SALOME_CORBA_EXCEPTION("Invalid filter", SALOME::BAD_PARAM);
+
+ SMESH::SMESH_GroupOnFilter_var aNewGroup = SMESH::SMESH_GroupOnFilter::_narrow
+ ( createGroup( theElemType, theName, TopoDS_Shape(), predicate ));
+
+ TPythonDump pd;
+ if ( !aNewGroup->_is_nil() )
+ aNewGroup->SetFilter( theFilter );
+
+ if ( _gen_i->CanPublishInStudy( aNewGroup ) )
+ {
+ SALOMEDS::SObject_wrap aSO =
+ _gen_i->PublishGroup(_gen_i->GetCurrentStudy(), _this(), aNewGroup,
+ GEOM::GEOM_Object::_nil(), theName);
+ if ( !aSO->_is_nil()) {
+ // Update Python script
+ pd << aSO << " = " << _this() << ".CreateGroupFromFilter("
+ << theElemType << ", '" << theName << "', " << theFilter << " )";
+ }
+ }
+
+ return aNewGroup._retn();
+}
+
//=============================================================================
/*!
*
if ( theGroup->_is_nil() )
return;
+ SMESH_TRY;
+
SMESH_GroupBase_i* aGroup =
dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( theGroup ).in() );
if ( !aGroup )
return;
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
if ( !aStudy->_is_nil() ) {
- SALOMEDS::SObject_var aGroupSO = _gen_i->ObjectToSObject( aStudy, theGroup );
+ SALOMEDS::SObject_wrap aGroupSO = _gen_i->ObjectToSObject( aStudy, theGroup );
if ( !aGroupSO->_is_nil() ) {
// Update Python script
TPythonDump() << _this() << ".RemoveGroup( " << aGroupSO << " )";
// Remove group's SObject
- aStudy->NewBuilder()->RemoveObjectWithChildren( aGroupSO );
+ SALOMEDS::StudyBuilder_var builder = aStudy->NewBuilder();
+ builder->RemoveObjectWithChildren( aGroupSO );
}
}
// Remove the group from SMESH data structures
removeGroup( aGroup->GetLocalID() );
+
+ SMESH_CATCH( SMESH::throwCorbaException );
}
//=============================================================================
-/*! RemoveGroupWithContents
+/*!
* Remove group with its contents
*/
//=============================================================================
+
void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup )
throw (SALOME::SALOME_Exception)
{
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( theGroup->_is_nil() )
return;
SMESH::long_array_var anIds = aGroup->GetListOfID();
SMESH::SMESH_MeshEditor_var aMeshEditor = SMESH_Mesh_i::GetMeshEditor();
- // Update Python script
- TPythonDump() << _this() << ".RemoveGroupWithContents( " << theGroup << " )";
+ TPythonDump pyDump; // Supress dump from RemoveNodes/Elements() and RemoveGroup()
// Remove contents
if ( aGroup->GetType() == SMESH::NODE )
else
aMeshEditor->RemoveElements( anIds );
+ // Update Python script (theGroup must be alive for this)
+ pyDump << _this() << ".RemoveGroupWithContents( " << theGroup << " )";
+
// Remove group
RemoveGroup( theGroup );
- // Clear python lines, created by RemoveNodes/Elements() and RemoveGroup()
- _gen_i->RemoveLastFromPythonScript(_gen_i->GetCurrentStudy()->StudyId());
- _gen_i->RemoveLastFromPythonScript(_gen_i->GetCurrentStudy()->StudyId());
+ SMESH_CATCH( SMESH::throwCorbaException );
}
-
//================================================================================
/*!
* \brief Get the list of groups existing in the mesh
return aList._retn();
}
+
//=============================================================================
/*!
* Get number of groups existing in the mesh
const char* theName )
throw (SALOME::SALOME_Exception)
{
- try
- {
- if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
- theGroup1->GetType() != theGroup2->GetType() )
- return SMESH::SMESH_Group::_nil();
+ SMESH::SMESH_Group_var aResGrp;
- // Create Union
- SMESH::SMESH_Group_var aResGrp = CreateGroup( theGroup1->GetType(), theName );
- if ( aResGrp->_is_nil() )
- return SMESH::SMESH_Group::_nil();
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
- SMESH::long_array_var anIds1 = theGroup1->GetListOfID();
- SMESH::long_array_var anIds2 = theGroup2->GetListOfID();
+ if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
+ theGroup1->GetType() != theGroup2->GetType() )
+ return SMESH::SMESH_Group::_nil();
- TColStd_MapOfInteger aResMap;
+ TPythonDump pyDump;
- for ( int i1 = 0, n1 = anIds1->length(); i1 < n1; i1++ )
- aResMap.Add( anIds1[ i1 ] );
+ // Create Union
+ aResGrp = CreateGroup( theGroup1->GetType(), theName );
+ if ( aResGrp->_is_nil() )
+ return SMESH::SMESH_Group::_nil();
- for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
- aResMap.Add( anIds2[ i2 ] );
+ SMESH::long_array_var anIds1 = theGroup1->GetListOfID();
+ SMESH::long_array_var anIds2 = theGroup2->GetListOfID();
- SMESH::long_array_var aResIds = new SMESH::long_array;
- aResIds->length( aResMap.Extent() );
+ TColStd_MapOfInteger aResMap;
- int resI = 0;
- TColStd_MapIteratorOfMapOfInteger anIter( aResMap );
- for( ; anIter.More(); anIter.Next() )
- aResIds[ resI++ ] = anIter.Key();
+ for ( int i1 = 0, n1 = anIds1->length(); i1 < n1; i1++ )
+ aResMap.Add( anIds1[ i1 ] );
- aResGrp->Add( aResIds );
+ for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
+ aResMap.Add( anIds2[ i2 ] );
- // Clear python lines, created by CreateGroup() and Add()
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
- _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( aResMap.Extent() );
- // Update Python script
- TPythonDump() << aResGrp << " = " << _this() << ".UnionGroups( "
- << theGroup1 << ", " << theGroup2 << ", '"
- << theName << "' )";
+ int resI = 0;
+ TColStd_MapIteratorOfMapOfInteger anIter( aResMap );
+ for( ; anIter.More(); anIter.Next() )
+ aResIds[ resI++ ] = anIter.Key();
- return aResGrp._retn();
- }
- catch( ... )
- {
- return SMESH::SMESH_Group::_nil();
- }
+ aResGrp->Add( aResIds );
+
+ // Update Python script
+ pyDump << aResGrp << " = " << _this() << ".UnionGroups( "
+ << theGroup1 << ", " << theGroup2 << ", '"
+ << theName << "' )";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return aResGrp._retn();
}
//=============================================================================
/*!
\brief Union list of groups. New group is created. All mesh elements that are
- present in initial groups are added to the new one.
+ present in initial groups are added to the new one.
\param theGroups list of groups
\param theName name of group to be created
\return pointer on the group
//=============================================================================
SMESH::SMESH_Group_ptr SMESH_Mesh_i::UnionListOfGroups(const SMESH::ListOfGroups& theGroups,
const char* theName )
-throw (SALOME::SALOME_Exception)
+ throw (SALOME::SALOME_Exception)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( !theName )
return SMESH::SMESH_Group::_nil();
- try
+ SMESH::SMESH_Group_var aResGrp;
+
+ SMESH_TRY;
+
+ vector< int > anIds;
+ SMESH::ElementType aType = SMESH::ALL;
+ for ( int g = 0, n = theGroups.length(); g < n; g++ )
{
- NCollection_Map< int > anIds;
- SMESH::ElementType aType = SMESH::ALL;
- for ( int g = 0, n = theGroups.length(); g < n; g++ )
+ SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
+
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
{
- SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
- if ( CORBA::is_nil( aGrp ) )
- continue;
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
+ }
- // check type
- SMESH::ElementType aCurrType = aGrp->GetType();
- if ( aType == SMESH::ALL )
- aType = aCurrType;
- else
- {
- if ( aType != aCurrType )
- return SMESH::SMESH_Group::_nil();
- }
-
- // unite ids
- SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
- for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
- {
- int aCurrId = aCurrIds[ i ];
- anIds.Add( aCurrId );
- }
- }
-
- // Create group
- SMESH::SMESH_Group_var aResGrp = CreateGroup( aType, theName );
- if ( aResGrp->_is_nil() )
- return SMESH::SMESH_Group::_nil();
-
- // Create array of identifiers
- SMESH::long_array_var aResIds = new SMESH::long_array;
- aResIds->length( anIds.Extent() );
-
- NCollection_Map< int >::Iterator anIter( anIds );
- for ( int i = 0; anIter.More(); anIter.Next(), i++ )
+ // unite ids
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
{
- aResIds[ i ] = anIter.Value();
+ int aCurrId = aCurrIds[ i ];
+ anIds.push_back( aCurrId );
}
- aResGrp->Add( aResIds );
-
- // Clear python lines, created by CreateGroup() and Add()
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ }
- // Update Python script
-
- TPythonDump() << aResGrp << " = " << _this() << ".UnionListOfGroups( "
- << &theGroups << ", '" << theName << "' )";
+ TPythonDump pyDump;
- return aResGrp._retn();
- }
- catch( ... )
- {
+ // Create group
+ aResGrp = CreateGroup( aType, theName );
+ if ( aResGrp->_is_nil() )
return SMESH::SMESH_Group::_nil();
- }
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( anIds.size() );
+
+ for ( size_t i = 0; i<anIds.size(); i++ )
+ aResIds[ i ] = anIds[i];
+ aResGrp->Add( aResIds );
+
+ // Update Python script
+ pyDump << aResGrp << " = " << _this() << ".UnionListOfGroups( "
+ << &theGroups << ", '" << theName << "' )";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return aResGrp._retn();
}
//=============================================================================
//=============================================================================
SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
SMESH::SMESH_GroupBase_ptr theGroup2,
- const char* theName )
+ const char* theName )
throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_Group_var aResGrp;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
theGroup1->GetType() != theGroup2->GetType() )
return SMESH::SMESH_Group::_nil();
+ TPythonDump pyDump;
+
// Create Intersection
- SMESH::SMESH_Group_var aResGrp = CreateGroup( theGroup1->GetType(), theName );
+ aResGrp = CreateGroup( theGroup1->GetType(), theName );
if ( aResGrp->_is_nil() )
return aResGrp;
aMap1.Add( anIds1[ i1 ] );
TColStd_SequenceOfInteger aSeq;
-
for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
if ( aMap1.Contains( anIds2[ i2 ] ) )
aSeq.Append( anIds2[ i2 ] );
SMESH::long_array_var aResIds = new SMESH::long_array;
aResIds->length( aSeq.Length() );
-
- for ( int resI = 0, resN = aSeq.Length(); resI < resN; resI++ )
+ for ( size_t resI = 0, resN = aSeq.Length(); resI < resN; resI++ )
aResIds[ resI ] = aSeq( resI + 1 );
-
aResGrp->Add( aResIds );
- // Clear python lines, created by CreateGroup() and Add()
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
- _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
-
// Update Python script
- TPythonDump() << aResGrp << " = " << _this() << ".IntersectGroups( "
- << theGroup1 << ", " << theGroup2 << ", '" << theName << "')";
+ pyDump << aResGrp << " = " << _this() << ".IntersectGroups( "
+ << theGroup1 << ", " << theGroup2 << ", '" << theName << "')";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
return aResGrp._retn();
}
\return pointer on the group
*/
//=============================================================================
-SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectListOfGroups(
- const SMESH::ListOfGroups& theGroups, const char* theName )
-throw (SALOME::SALOME_Exception)
+SMESH::SMESH_Group_ptr
+SMESH_Mesh_i::IntersectListOfGroups(const SMESH::ListOfGroups& theGroups,
+ const char* theName )
+ throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_Group_var aResGrp;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( !theName )
return SMESH::SMESH_Group::_nil();
- try
+ NCollection_DataMap< int, int > anIdToCount;
+ SMESH::ElementType aType = SMESH::ALL;
+ for ( int g = 0, n = theGroups.length(); g < n; g++ )
{
- NCollection_DataMap< int, int > anIdToCount;
- SMESH::ElementType aType = SMESH::ALL;
- for ( int g = 0, n = theGroups.length(); g < n; g++ )
- {
- SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
- if ( CORBA::is_nil( aGrp ) )
- continue;
-
- // check type
- SMESH::ElementType aCurrType = aGrp->GetType();
- if ( aType == SMESH::ALL )
- aType = aCurrType;
- else
- {
- if ( aType != aCurrType )
- return SMESH::SMESH_Group::_nil();
- }
+ SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
- // calculates number of occurance ids in groups
- SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
- for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
- {
- int aCurrId = aCurrIds[ i ];
- if ( !anIdToCount.IsBound( aCurrId ) )
- anIdToCount.Bind( aCurrId, 1 );
- else
- anIdToCount( aCurrId ) = anIdToCount( aCurrId ) + 1;
- }
- }
-
- // create map of ids
- int nbGrp = theGroups.length();
- NCollection_Map< int > anIds;
- NCollection_DataMap< int, int >::Iterator anIter( anIdToCount );
- for ( ; anIter.More(); anIter.Next() )
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
{
- int aCurrId = anIter.Key();
- int aCurrNb = anIter.Value();
- if ( aCurrNb == nbGrp )
- anIds.Add( aCurrId );
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
}
- // Create group
- SMESH::SMESH_Group_var aResGrp = CreateGroup( aType, theName );
- if ( aResGrp->_is_nil() )
- return SMESH::SMESH_Group::_nil();
-
- // Create array of identifiers
- SMESH::long_array_var aResIds = new SMESH::long_array;
- aResIds->length( anIds.Extent() );
-
- NCollection_Map< int >::Iterator aListIter( anIds );
- for ( int i = 0; aListIter.More(); aListIter.Next(), i++ )
+ // calculates number of occurance ids in groups
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
{
- aResIds[ i ] = aListIter.Value();
+ int aCurrId = aCurrIds[ i ];
+ if ( !anIdToCount.IsBound( aCurrId ) )
+ anIdToCount.Bind( aCurrId, 1 );
+ else
+ anIdToCount( aCurrId ) = anIdToCount( aCurrId ) + 1;
}
- aResGrp->Add( aResIds );
+ }
- // Clear python lines, created by CreateGroup() and Add()
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ // create map of ids
+ int nbGrp = theGroups.length();
+ vector< int > anIds;
+ NCollection_DataMap< int, int >::Iterator anIter( anIdToCount );
+ for ( ; anIter.More(); anIter.Next() )
+ {
+ int aCurrId = anIter.Key();
+ int aCurrNb = anIter.Value();
+ if ( aCurrNb == nbGrp )
+ anIds.push_back( aCurrId );
+ }
- // Update Python script
-
- TPythonDump() << aResGrp << " = " << _this() << ".IntersectListOfGroups( "
- << &theGroups << ", '" << theName << "' )";
+ TPythonDump pyDump;
- return aResGrp._retn();
- }
- catch( ... )
- {
+ // Create group
+ aResGrp = CreateGroup( aType, theName );
+ if ( aResGrp->_is_nil() )
return SMESH::SMESH_Group::_nil();
- }
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( anIds.size() );
+
+ for ( size_t i = 0; i<anIds.size(); i++ )
+ aResIds[ i ] = anIds[i];
+ aResGrp->Add( aResIds );
+
+ // Update Python script
+ pyDump << aResGrp << " = " << _this() << ".IntersectListOfGroups( "
+ << &theGroups << ", '" << theName << "' )";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return aResGrp._retn();
}
//=============================================================================
//=============================================================================
SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
SMESH::SMESH_GroupBase_ptr theGroup2,
- const char* theName )
+ const char* theName )
throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_Group_var aResGrp;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
theGroup1->GetType() != theGroup2->GetType() )
return SMESH::SMESH_Group::_nil();
+ TPythonDump pyDump;
+
// Perform Cutting
- SMESH::SMESH_Group_var aResGrp = CreateGroup( theGroup1->GetType(), theName );
+ aResGrp = CreateGroup( theGroup1->GetType(), theName );
if ( aResGrp->_is_nil() )
return aResGrp;
for ( int resI = 0, resN = aSeq.Length(); resI < resN; resI++ )
aResIds[ resI ] = aSeq( resI + 1 );
-
aResGrp->Add( aResIds );
- // Clear python lines, created by CreateGroup() and Add()
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
- _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
-
// Update Python script
- TPythonDump() << aResGrp << " = " << _this() << ".CutGroups( "
- << theGroup1 << ", " << theGroup2 << ", '"
- << theName << "' )";
+ pyDump << aResGrp << " = " << _this() << ".CutGroups( "
+ << theGroup1 << ", " << theGroup2 << ", '"
+ << theName << "' )";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
return aResGrp._retn();
}
\return pointer on the group
*/
//=============================================================================
-SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutListOfGroups(
- const SMESH::ListOfGroups& theMainGroups,
- const SMESH::ListOfGroups& theToolGroups,
- const char* theName )
+SMESH::SMESH_Group_ptr
+SMESH_Mesh_i::CutListOfGroups(const SMESH::ListOfGroups& theMainGroups,
+ const SMESH::ListOfGroups& theToolGroups,
+ const char* theName )
throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_Group_var aResGrp;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( !theName )
return SMESH::SMESH_Group::_nil();
- try
+ set< int > aToolIds;
+ SMESH::ElementType aType = SMESH::ALL;
+ int g, n;
+ // iterate through tool groups
+ for ( g = 0, n = theToolGroups.length(); g < n; g++ )
{
- NCollection_Map< int > aToolIds;
- SMESH::ElementType aType = SMESH::ALL;
- int g, n;
- // iterate through tool groups
- for ( g = 0, n = theToolGroups.length(); g < n; g++ )
- {
- SMESH::SMESH_GroupBase_var aGrp = theToolGroups[ g ];
- if ( CORBA::is_nil( aGrp ) )
- continue;
-
- // check type
- SMESH::ElementType aCurrType = aGrp->GetType();
- if ( aType == SMESH::ALL )
- aType = aCurrType;
- else
- {
- if ( aType != aCurrType )
- return SMESH::SMESH_Group::_nil();
- }
+ SMESH::SMESH_GroupBase_var aGrp = theToolGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
- // unite tool ids
- SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
- for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
- {
- int aCurrId = aCurrIds[ i ];
- aToolIds.Add( aCurrId );
- }
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
+ {
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
}
- NCollection_Map< int > anIds; // result
-
- // Iterate through main group
- for ( g = 0, n = theMainGroups.length(); g < n; g++ )
+ // unite tool ids
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
{
- SMESH::SMESH_GroupBase_var aGrp = theMainGroups[ g ];
- if ( CORBA::is_nil( aGrp ) )
- continue;
+ int aCurrId = aCurrIds[ i ];
+ aToolIds.insert( aCurrId );
+ }
+ }
- // check type
- SMESH::ElementType aCurrType = aGrp->GetType();
- if ( aType == SMESH::ALL )
- aType = aCurrType;
- else
- {
- if ( aType != aCurrType )
- return SMESH::SMESH_Group::_nil();
- }
+ vector< int > anIds; // result
- // unite tool ids
- SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
- for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
- {
- int aCurrId = aCurrIds[ i ];
- if ( !aToolIds.Contains( aCurrId ) )
- anIds.Add( aCurrId );
- }
- }
+ // Iterate through main group
+ for ( g = 0, n = theMainGroups.length(); g < n; g++ )
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theMainGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
- // Create group
- SMESH::SMESH_Group_var aResGrp = CreateGroup( aType, theName );
- if ( aResGrp->_is_nil() )
- return SMESH::SMESH_Group::_nil();
-
- // Create array of identifiers
- SMESH::long_array_var aResIds = new SMESH::long_array;
- aResIds->length( anIds.Extent() );
-
- NCollection_Map< int >::Iterator anIter( anIds );
- for ( int i = 0; anIter.More(); anIter.Next(), i++ )
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
{
- aResIds[ i ] = anIter.Value();
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
}
- aResGrp->Add( aResIds );
- // Clear python lines, created by CreateGroup() and Add()
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ // unite tool ids
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ if ( !aToolIds.count( aCurrId ) )
+ anIds.push_back( aCurrId );
+ }
+ }
- // Update Python script
+ TPythonDump pyDump;
- TPythonDump() << aResGrp << " = " << _this() << ".CutListOfGroups( "
- << &theMainGroups << ", " << &theToolGroups << ", '"
- << theName << "' )";
-
- return aResGrp._retn();
- }
- catch( ... )
- {
+ // Create group
+ aResGrp = CreateGroup( aType, theName );
+ if ( aResGrp->_is_nil() )
return SMESH::SMESH_Group::_nil();
- }
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( anIds.size() );
+
+ for (int i=0; i<anIds.size(); i++ )
+ aResIds[ i ] = anIds[i];
+ aResGrp->Add( aResIds );
+
+ // Update Python script
+ pyDump << aResGrp << " = " << _this() << ".CutListOfGroups( "
+ << &theMainGroups << ", " << &theToolGroups << ", '"
+ << theName << "' )";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return aResGrp._retn();
}
//=============================================================================
/*!
\brief Create groups of entities from existing groups of superior dimensions
- System
+ System
1) extract all nodes from each group,
2) combine all elements of specified dimension laying on these nodes.
\param theGroups list of source groups
\param theElemType dimension of elements
\param theName name of new group
\return pointer on new group
+ *
+ IMP 19939
*/
//=============================================================================
-SMESH::SMESH_Group_ptr SMESH_Mesh_i::CreateDimGroup(
- const SMESH::ListOfGroups& theGroups,
- SMESH::ElementType theElemType,
- const char* theName )
+
+SMESH::SMESH_Group_ptr
+SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfGroups& theGroups,
+ SMESH::ElementType theElemType,
+ const char* theName )
throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_Group_var aResGrp;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS();
if ( !theName || !aMeshDS )
SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)theElemType;
- try
- {
- // Create map of nodes from all groups
+ // Create a group
- NCollection_Map< int > aNodeMap;
-
- for ( int g = 0, n = theGroups.length(); g < n; g++ )
- {
- SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
- if ( CORBA::is_nil( aGrp ) )
- continue;
+ TPythonDump pyDump;
- SMESH::ElementType aType = aGrp->GetType();
- if ( aType == SMESH::ALL )
- continue;
- else if ( aType == SMESH::NODE )
- {
- SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
- for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
- {
- int aCurrId = aCurrIds[ i ];
- const SMDS_MeshNode* aNode = aMeshDS->FindNode( aCurrId );
- if ( aNode )
- aNodeMap.Add( aNode->GetID() );
- }
- }
- else
- {
- SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
- for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
- {
- int aCurrId = aCurrIds[ i ];
- const SMDS_MeshElement* anElem = aMeshDS->FindElement( aCurrId );
- if ( !anElem )
- continue;
- SMDS_ElemIteratorPtr aNodeIter = anElem->nodesIterator();
- while( aNodeIter->more() )
- {
- const SMDS_MeshNode* aNode =
- dynamic_cast<const SMDS_MeshNode*>( aNodeIter->next() );
- if ( aNode )
- aNodeMap.Add( aNode->GetID() );
- }
- }
- }
- }
+ aResGrp = CreateGroup( theElemType, theName );
+ if ( aResGrp->_is_nil() )
+ return SMESH::SMESH_Group::_nil();
+
+ SMESHDS_GroupBase* groupBaseDS =
+ SMESH::DownCast<SMESH_GroupBase_i*>( aResGrp )->GetGroupDS();
+ SMDS_MeshGroup& resGroupCore = static_cast< SMESHDS_Group* >( groupBaseDS )->SMDSGroup();
- // Get result identifiers
+ for ( int g = 0, n = theGroups.length(); g < n; g++ ) // loop on theGroups
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
- NCollection_Map< int > aResultIds;
- if ( theElemType == SMESH::NODE )
+ groupBaseDS = SMESH::DownCast<SMESH_GroupBase_i*>( aGrp )->GetGroupDS();
+ SMDS_ElemIteratorPtr elIt = groupBaseDS->GetElements();
+
+ if ( theElemType == SMESH::NODE ) // get all nodes of elements
{
- NCollection_Map< int >::Iterator aNodeIter( aNodeMap );
- for ( ; aNodeIter.More(); aNodeIter.Next() )
- aResultIds.Add( aNodeIter.Value() );
+ while ( elIt->more() ) {
+ const SMDS_MeshElement* el = elIt->next();
+ SMDS_ElemIteratorPtr nIt = el->nodesIterator();
+ while ( nIt->more() )
+ resGroupCore.Add( nIt->next() );
+ }
}
- else
+ else // get elements of theElemType based on nodes of every element of group
{
- // Create list of elements of given dimension constructed on the nodes
- NCollection_Map< int > anElemList;
- NCollection_Map< int >::Iterator aNodeIter( aNodeMap );
- for ( ; aNodeIter.More(); aNodeIter.Next() )
- {
- const SMDS_MeshElement* aNode =
- dynamic_cast<const SMDS_MeshElement*>( aMeshDS->FindNode( aNodeIter.Value() ) );
- if ( !aNode )
- continue;
-
- SMDS_ElemIteratorPtr anElemIter = aNode->elementsIterator( anElemType );
- while( anElemIter->more() )
- {
- const SMDS_MeshElement* anElem =
- dynamic_cast<const SMDS_MeshElement*>( anElemIter->next() );
- if ( anElem && anElem->GetType() == anElemType )
- anElemList.Add( anElem->GetID() );
- }
- }
-
- // check whether all nodes of elements are present in nodes map
- NCollection_Map< int >::Iterator anIter( anElemList );
- for ( ; anIter.More(); anIter.Next() )
+ while ( elIt->more() )
{
- const SMDS_MeshElement* anElem = aMeshDS->FindElement( anIter.Value() );
- if ( !anElem )
- continue;
-
- bool isOk = true;
- SMDS_ElemIteratorPtr aNodeIter = anElem->nodesIterator();
- while( aNodeIter->more() )
+ const SMDS_MeshElement* el = elIt->next(); // an element of group
+ TIDSortedElemSet elNodes( el->begin_nodes(), el->end_nodes() );
+ TIDSortedElemSet checkedElems;
+ SMDS_ElemIteratorPtr nIt = el->nodesIterator();
+ while ( nIt->more() )
{
- const SMDS_MeshNode* aNode =
- dynamic_cast<const SMDS_MeshNode*>( aNodeIter->next() );
- if ( !aNode || !aNodeMap.Contains( aNode->GetID() ) )
+ const SMDS_MeshNode* n = static_cast<const SMDS_MeshNode*>( nIt->next() );
+ SMDS_ElemIteratorPtr elOfTypeIt = n->GetInverseElementIterator( anElemType );
+ // check nodes of elements of theElemType around el
+ while ( elOfTypeIt->more() )
{
- isOk = false;
- break;
+ const SMDS_MeshElement* elOfType = elOfTypeIt->next();
+ if ( !checkedElems.insert( elOfType ).second ) continue;
+
+ SMDS_ElemIteratorPtr nIt2 = elOfType->nodesIterator();
+ bool allNodesOK = true;
+ while ( nIt2->more() && allNodesOK )
+ allNodesOK = elNodes.count( nIt2->next() );
+ if ( allNodesOK )
+ resGroupCore.Add( elOfType );
}
- }
- if ( isOk )
- aResultIds.Add( anElem->GetID() );
+ }
}
}
+ }
- // Create group
-
- SMESH::SMESH_Group_var aResGrp = CreateGroup( theElemType, theName );
- if ( aResGrp->_is_nil() )
- return SMESH::SMESH_Group::_nil();
-
- // Create array of identifiers
- SMESH::long_array_var aResIds = new SMESH::long_array;
- aResIds->length( aResultIds.Extent() );
-
- NCollection_Map< int >::Iterator aResIter( aResultIds );
- for ( int i = 0; aResIter.More(); aResIter.Next(), i++ )
- aResIds[ i ] = aResIter.Value();
- aResGrp->Add( aResIds );
-
- // Remove strings corresponding to group creation
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
- _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ // Update Python script
+ pyDump << aResGrp << " = " << _this() << ".CreateDimGroup( "
+ << &theGroups << ", " << theElemType << ", '" << theName << "' )";
- // Update Python script
-
- TPythonDump() << aResGrp << " = " << _this() << ".CreateDimGroup( "
- << &theGroups << ", " << theElemType << ", '" << theName << "' )";
+ SMESH_CATCH( SMESH::throwCorbaException );
- return aResGrp._retn();
- }
- catch( ... )
- {
- return SMESH::SMESH_Group::_nil();
- }
+ return aResGrp._retn();
}
//================================================================================
if ( CORBA::is_nil( theGeomObj ) || theGeomObj->GetType() != GEOM_GROUP )
return;
// group SO
- SALOMEDS::Study_var study = _gen_i->GetCurrentStudy();
- SALOMEDS::SObject_var groupSO = _gen_i->ObjectToSObject( study, theGeomObj );
+ SALOMEDS::Study_var study = _gen_i->GetCurrentStudy();
+ SALOMEDS::SObject_wrap groupSO = _gen_i->ObjectToSObject( study, theGeomObj );
if ( groupSO->_is_nil() )
return;
// group indices
GEOM::GEOM_Gen_var geomGen = _gen_i->GetGeomEngine();
- GEOM::GEOM_IGroupOperations_var groupOp =
+ GEOM::GEOM_IGroupOperations_wrap groupOp =
geomGen->GetIGroupOperations( _gen_i->GetCurrentStudyID() );
GEOM::ListOfLong_var ids = groupOp->GetObjects( theGeomObj );
// get geom group
SALOMEDS::Study_var study = _gen_i->GetCurrentStudy();
if ( study->_is_nil() ) return newShape; // means "not changed"
- SALOMEDS::SObject_var groupSO = study->FindObjectID( groupData._groupEntry.c_str() );
+ SALOMEDS::SObject_wrap groupSO = study->FindObjectID( groupData._groupEntry.c_str() );
if ( !groupSO->_is_nil() )
{
CORBA::Object_var groupObj = _gen_i->SObjectToObject( groupSO );
// get indices of group items
set<int> curIndices;
GEOM::GEOM_Gen_var geomGen = _gen_i->GetGeomEngine();
- GEOM::GEOM_IGroupOperations_var groupOp =
+ GEOM::GEOM_IGroupOperations_wrap groupOp =
geomGen->GetIGroupOperations( _gen_i->GetCurrentStudyID() );
- GEOM::ListOfLong_var ids = groupOp->GetObjects( geomGroup );
+ GEOM::ListOfLong_var ids = groupOp->GetObjects( geomGroup );
for ( int i = 0; i < ids->length(); ++i )
curIndices.insert( ids[i] );
TCollection_AsciiString groupIOR = geomGen->GetStringFromIOR( geomGroup );
geomClient->RemoveShapeFromBuffer( groupIOR );
newShape = _gen_i->GeomObjectToShape( geomGroup );
- }
+ }
if ( newShape.IsNull() ) {
// geom group becomes empty - return empty compound
return newShape;
}
-namespace {
+namespace
+{
//=============================================================================
/*!
* \brief Storage of shape and index used in CheckGeomGroupModif()
*/
//=============================================================================
- struct TIndexedShape {
+ struct TIndexedShape
+ {
int _index;
TopoDS_Shape _shape;
TIndexedShape( int i, const TopoDS_Shape& s ):_index(i), _shape(s) {}
if ( newShape.IsNull() )
continue; // no changes
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetOrLoad();
+
if ( processedGroup ) { // update group indices
list<TGeomGroupData>::iterator data2 = data;
for ( --data2; data2->_groupEntry != data->_groupEntry; --data2) {}
if ( _mapGroups.find( oldID ) == _mapGroups.end() )
continue;
// get group name
- SALOMEDS::SObject_var groupSO = _gen_i->ObjectToSObject( study,_mapGroups[oldID] );
- CORBA::String_var name = groupSO->GetName();
+ SALOMEDS::SObject_wrap groupSO = _gen_i->ObjectToSObject( study,_mapGroups[oldID] );
+ CORBA::String_var name = groupSO->GetName();
// update
- SMESH_GroupBase_i* group_i = SMESH::DownCast<SMESH_GroupBase_i*>(_mapGroups[oldID] );
+ SMESH_GroupBase_i* group_i = SMESH::DownCast<SMESH_GroupBase_i*>(_mapGroups[oldID] );
int newID;
if ( group_i && _impl->AddGroup( geomType->second, name.in(), newID, geom._shape ))
group_i->changeLocalId( newID );
// Update icons
CORBA::Long newNbEntities = NbNodes() + NbElements();
- list< SALOMEDS::SObject_var > soToUpdateIcons;
+ list< SALOMEDS::SObject_wrap > soToUpdateIcons;
if ( newNbEntities != nbEntities )
{
- // Add all SObjects with icons
+ // Add all SObjects with icons to soToUpdateIcons
soToUpdateIcons.push_back( _gen_i->ObjectToSObject( study, _this() )); // mesh
for (map<int, SMESH::SMESH_subMesh_ptr>::iterator i_sm = _mapSubMeshIor.begin();
soToUpdateIcons.push_back( _gen_i->ObjectToSObject( study, i_gr->second ));
}
- list< SALOMEDS::SObject_var >::iterator so = soToUpdateIcons.begin();
+ list< SALOMEDS::SObject_wrap >::iterator so = soToUpdateIcons.begin();
for ( ; so != soToUpdateIcons.end(); ++so )
_gen_i->SetPixMap( *so, "ICON_SMESH_TREE_MESH_WARN" );
}
//=============================================================================
/*!
- * \brief Create standalone group instead if group on geometry
- *
+ * \brief Create standalone group from a group on geometry or filter
*/
//=============================================================================
-SMESH::SMESH_Group_ptr SMESH_Mesh_i::ConvertToStandalone( SMESH::SMESH_GroupOnGeom_ptr theGroup )
+SMESH::SMESH_Group_ptr SMESH_Mesh_i::ConvertToStandalone( SMESH::SMESH_GroupBase_ptr theGroup )
+ throw (SALOME::SALOME_Exception)
{
SMESH::SMESH_Group_var aGroup;
+
+ SMESH_TRY;
+
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
if ( theGroup->_is_nil() )
return aGroup._retn();
- Unexpect aCatch(SALOME_SalomeException);
-
SMESH_GroupBase_i* aGroupToRem =
dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( theGroup ).in() );
if ( !aGroupToRem )
return aGroup._retn();
+ const bool isOnFilter = ( SMESH::DownCast< SMESH_GroupOnFilter_i* > ( theGroup ));
+
int anId = aGroupToRem->GetLocalID();
if ( !_impl->ConvertToStandalone( anId ) )
return aGroup._retn();
_mapGroups.erase( anId );
SALOMEDS::StudyBuilder_var builder;
- SALOMEDS::SObject_var aGroupSO;
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
- if ( !aStudy->_is_nil() ) {
- builder = aStudy->NewBuilder();
+ SALOMEDS::SObject_wrap aGroupSO;
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
+ if ( !aStudy->_is_nil() ) {
+ builder = aStudy->NewBuilder();
aGroupSO = _gen_i->ObjectToSObject( aStudy, theGroup );
- if ( !aGroupSO->_is_nil() ) {
-
- // remove reference to geometry
- SALOMEDS::ChildIterator_var chItr = aStudy->NewChildIterator(aGroupSO);
- for ( ; chItr->More(); chItr->Next() )
- // Remove group's child SObject
- builder->RemoveObject( chItr->Value() );
+ if ( !aGroupSO->_is_nil() )
+ {
+ // remove reference to geometry
+ SALOMEDS::ChildIterator_wrap chItr = aStudy->NewChildIterator(aGroupSO);
+ for ( ; chItr->More(); chItr->Next() )
+ // Remove group's child SObject
+ builder->RemoveObject( chItr->Value() );
// Update Python script
TPythonDump() << aGroupSO << " = " << _this() << ".ConvertToStandalone( "
<< aGroupSO << " )";
+
+ // change icon of Group on Filter
+ if ( isOnFilter )
+ {
+ SMESH::array_of_ElementType_var elemTypes = aGroupImpl->GetTypes();
+ const int isEmpty = ( elemTypes->length() == 0 );
+ if ( !isEmpty )
+ {
+ SALOMEDS::GenericAttribute_wrap anAttr =
+ builder->FindOrCreateAttribute( aGroupSO, "AttributePixMap" );
+ SALOMEDS::AttributePixMap_wrap pm = anAttr;
+ pm->SetPixMap( "ICON_SMESH_TREE_GROUP" );
+ }
+ }
}
}
- // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
- SMESH_Gen_i::GetPOA()->activate_object( aGroupImpl );
- aGroupImpl->Register();
- // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
-
// remember new group in own map
aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() );
_mapGroups[anId] = SMESH::SMESH_GroupBase::_duplicate( aGroup );
// register CORBA object for persistence
- //int nextId = _gen_i->RegisterObject( aGroup );
- //if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
- builder->SetIOR( aGroupSO, _gen_i->GetORB()->object_to_string( aGroup ) );
+ _gen_i->RegisterObject( aGroup );
+
+ CORBA::String_var ior = _gen_i->GetORB()->object_to_string( aGroup );
+ builder->SetIOR( aGroupSO, ior.in() );
+
+ SMESH_CATCH( SMESH::throwCorbaException );
return aGroup._retn();
}
*/
//=============================================================================
-void SMESH_Mesh_i::removeSubMesh (SMESH::SMESH_subMesh_ptr theSubMesh,
+bool SMESH_Mesh_i::removeSubMesh (SMESH::SMESH_subMesh_ptr theSubMesh,
GEOM::GEOM_Object_ptr theSubShapeObject )
{
- MESSAGE("SMESH_Mesh_i::removeSubMesh()");
- if ( theSubMesh->_is_nil() || theSubShapeObject->_is_nil() )
- return;
+ bool isHypChanged = false;
+ if ( theSubMesh->_is_nil() /*|| theSubShapeObject->_is_nil()*/ )
+ return isHypChanged;
- try {
- SMESH::ListOfHypothesis_var aHypList = GetHypothesisList( theSubShapeObject );
- for ( int i = 0, n = aHypList->length(); i < n; i++ ) {
- removeHypothesis( theSubShapeObject, aHypList[i] );
+ if ( theSubShapeObject->_is_nil() ) // not published shape (IPAL13617)
+ {
+ CORBA::Long shapeId = theSubMesh->GetId();
+ if ( _mapSubMesh.find( shapeId ) != _mapSubMesh.end())
+ {
+ TopoDS_Shape S = _mapSubMesh[ shapeId ]->GetSubShape();
+ if ( !S.IsNull() )
+ {
+ list<const SMESHDS_Hypothesis*> hyps = _impl->GetHypothesisList( S );
+ isHypChanged = !hyps.empty();
+ list<const SMESHDS_Hypothesis*>::const_iterator hyp = hyps.begin();
+ for ( ; hyp != hyps.end(); ++hyp )
+ _impl->RemoveHypothesis(S, (*hyp)->GetID());
+ }
}
}
- catch( const SALOME::SALOME_Exception& ) {
- INFOS("SMESH_Mesh_i::removeSubMesh(): exception caught!");
+ else
+ {
+ try {
+ SMESH::ListOfHypothesis_var aHypList = GetHypothesisList( theSubShapeObject );
+ isHypChanged = ( aHypList->length() > 0 );
+ for ( int i = 0, n = aHypList->length(); i < n; i++ ) {
+ removeHypothesis( theSubShapeObject, aHypList[i] );
+ }
+ }
+ catch( const SALOME::SALOME_Exception& ) {
+ INFOS("SMESH_Mesh_i::removeSubMesh(): exception caught!");
+ }
+ removeGeomGroupData( theSubShapeObject );
}
- removeGeomGroupData( theSubShapeObject );
-
int subMeshId = theSubMesh->GetId();
_mapSubMesh.erase(subMeshId);
_mapSubMesh_i.erase(subMeshId);
_mapSubMeshIor.erase(subMeshId);
- if(MYDEBUG) MESSAGE("SMESH_Mesh_i::removeSubMesh() completed");
+
+ return isHypChanged;
}
//=============================================================================
*/
//=============================================================================
-SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType theElemType,
- const char* theName,
- const TopoDS_Shape& theShape )
+SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType theElemType,
+ const char* theName,
+ const TopoDS_Shape& theShape,
+ const SMESH_PredicatePtr& thePredicate )
{
+ std::string newName;
+ if ( !theName || strlen( theName ) == 0 )
+ {
+ std::set< std::string > presentNames;
+ std::map<int, SMESH::SMESH_GroupBase_ptr>::const_iterator i_gr = _mapGroups.begin();
+ for ( ; i_gr != _mapGroups.end(); ++i_gr )
+ presentNames.insert( i_gr->second->GetName() );
+ do {
+ newName = "noname_Group_" + SMESH_Comment( presentNames.size() + 1 );
+ } while ( !presentNames.insert( newName ).second );
+ theName = newName.c_str();
+ }
int anId;
SMESH::SMESH_GroupBase_var aGroup;
- if ( _impl->AddGroup( (SMDSAbs_ElementType)theElemType, theName, anId, theShape )) {
+ if ( _impl->AddGroup( (SMDSAbs_ElementType)theElemType, theName, anId, theShape, thePredicate ))
+ {
SMESH_GroupBase_i* aGroupImpl;
if ( !theShape.IsNull() )
aGroupImpl = new SMESH_GroupOnGeom_i( SMESH_Gen_i::GetPOA(), this, anId );
+ else if ( thePredicate )
+ aGroupImpl = new SMESH_GroupOnFilter_i( SMESH_Gen_i::GetPOA(), this, anId );
else
aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, anId );
- // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
- SMESH_Gen_i::GetPOA()->activate_object( aGroupImpl );
- aGroupImpl->Register();
- // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
-
aGroup = SMESH::SMESH_GroupBase::_narrow( aGroupImpl->_this() );
_mapGroups[anId] = SMESH::SMESH_GroupBase::_duplicate( aGroup );
{
if(MYDEBUG) MESSAGE("SMESH_Mesh_i::removeGroup()" );
if ( _mapGroups.find( theId ) != _mapGroups.end() ) {
- removeGeomGroupData( _mapGroups[theId] );
+ SMESH::SMESH_GroupBase_ptr group = _mapGroups[theId];
_mapGroups.erase( theId );
- _impl->RemoveGroup( theId );
+ removeGeomGroupData( group );
+ if (! _impl->RemoveGroup( theId ))
+ {
+ // it seems to be a call up from _impl caused by hyp modification (issue 0020918)
+ RemoveGroup( group );
+ }
}
}
-
//=============================================================================
/*!
*
//=============================================================================
SMESH::log_array * SMESH_Mesh_i::GetLog(CORBA::Boolean clearAfterGet)
-throw(SALOME::SALOME_Exception)
+ throw(SALOME::SALOME_Exception)
{
- if(MYDEBUG) MESSAGE("SMESH_Mesh_i::GetLog");
-
SMESH::log_array_var aLog;
- try{
- list < SMESHDS_Command * >logDS = _impl->GetLog();
- aLog = new SMESH::log_array;
- int indexLog = 0;
- int lg = logDS.size();
- SCRUTE(lg);
- aLog->length(lg);
- list < SMESHDS_Command * >::iterator its = logDS.begin();
- while(its != logDS.end()){
- SMESHDS_Command *com = *its;
- int comType = com->GetType();
- //SCRUTE(comType);
- int lgcom = com->GetNumber();
- //SCRUTE(lgcom);
- const list < int >&intList = com->GetIndexes();
- int inum = intList.size();
- //SCRUTE(inum);
- list < int >::const_iterator ii = intList.begin();
- const list < double >&coordList = com->GetCoords();
- int rnum = coordList.size();
- //SCRUTE(rnum);
- list < double >::const_iterator ir = coordList.begin();
- aLog[indexLog].commandType = comType;
- aLog[indexLog].number = lgcom;
- aLog[indexLog].coords.length(rnum);
- aLog[indexLog].indexes.length(inum);
- for(int i = 0; i < rnum; i++){
- aLog[indexLog].coords[i] = *ir;
- //MESSAGE(" "<<i<<" "<<ir.Value());
- ir++;
- }
- for(int i = 0; i < inum; i++){
- aLog[indexLog].indexes[i] = *ii;
- //MESSAGE(" "<<i<<" "<<ii.Value());
- ii++;
- }
- indexLog++;
- its++;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ list < SMESHDS_Command * >logDS = _impl->GetLog();
+ aLog = new SMESH::log_array;
+ int indexLog = 0;
+ int lg = logDS.size();
+ SCRUTE(lg);
+ aLog->length(lg);
+ list < SMESHDS_Command * >::iterator its = logDS.begin();
+ while(its != logDS.end()){
+ SMESHDS_Command *com = *its;
+ int comType = com->GetType();
+ //SCRUTE(comType);
+ int lgcom = com->GetNumber();
+ //SCRUTE(lgcom);
+ const list < int >&intList = com->GetIndexes();
+ int inum = intList.size();
+ //SCRUTE(inum);
+ list < int >::const_iterator ii = intList.begin();
+ const list < double >&coordList = com->GetCoords();
+ int rnum = coordList.size();
+ //SCRUTE(rnum);
+ list < double >::const_iterator ir = coordList.begin();
+ aLog[indexLog].commandType = comType;
+ aLog[indexLog].number = lgcom;
+ aLog[indexLog].coords.length(rnum);
+ aLog[indexLog].indexes.length(inum);
+ for(int i = 0; i < rnum; i++){
+ aLog[indexLog].coords[i] = *ir;
+ //MESSAGE(" "<<i<<" "<<ir.Value());
+ ir++;
}
- if(clearAfterGet)
- _impl->ClearLog();
- }
- catch(SALOME_Exception & S_ex){
- THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+ for(int i = 0; i < inum; i++){
+ aLog[indexLog].indexes[i] = *ii;
+ //MESSAGE(" "<<i<<" "<<ii.Value());
+ ii++;
+ }
+ indexLog++;
+ its++;
}
+ if(clearAfterGet)
+ _impl->ClearLog();
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
return aLog._retn();
}
void SMESH_Mesh_i::ClearLog() throw(SALOME::SALOME_Exception)
{
- if(MYDEBUG) MESSAGE("SMESH_Mesh_i::ClearLog");
- // ****
+ SMESH_TRY;
+ _impl->ClearLog();
+ SMESH_CATCH( SMESH::throwCorbaException );
}
//=============================================================================
CORBA::Long SMESH_Mesh_i::GetId()throw(SALOME::SALOME_Exception)
{
- if(MYDEBUG) MESSAGE("SMESH_Mesh_i::GetId");
return _id;
}
return _studyId;
}
+//=============================================================================
+namespace
+{
+ //!< implementation of struct used to call methods of SMESH_Mesh_i from SMESH_Mesh
+ // issue 0020918: groups removal is caused by hyp modification
+ // issue 0021208: to forget not loaded mesh data at hyp modification
+ struct TCallUp_i : public SMESH_Mesh::TCallUp
+ {
+ SMESH_Mesh_i* _mesh;
+ TCallUp_i(SMESH_Mesh_i* mesh):_mesh(mesh) {}
+ virtual void RemoveGroup (const int theGroupID) { _mesh->removeGroup( theGroupID ); }
+ virtual void HypothesisModified () { _mesh->onHypothesisModified(); }
+ virtual void Load () { _mesh->Load(); }
+ };
+}
+
+//================================================================================
+/*!
+ * \brief callback from _impl to forget not loaded mesh data (issue 0021208)
+ */
+//================================================================================
+
+void SMESH_Mesh_i::onHypothesisModified()
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetOrLoad();
+}
+
//=============================================================================
/*!
*
{
if(MYDEBUG) MESSAGE("SMESH_Mesh_i::SetImpl");
_impl = impl;
+ if ( _impl )
+ _impl->SetCallUp( new TCallUp_i(this));
}
//=============================================================================
//=============================================================================
SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor()
+ throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_MeshEditor_var aMeshEdVar;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
// Create MeshEditor
SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( this, false );
- SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this();
+ aMeshEdVar = aMeshEditor->_this();
// Update Python script
TPythonDump() << aMeshEditor << " = " << _this() << ".GetMeshEditor()";
- return aMesh._retn();
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return aMeshEdVar._retn();
}
//=============================================================================
//=============================================================================
SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditPreviewer()
+ throw (SALOME::SALOME_Exception)
{
+ SMESH::SMESH_MeshEditor_var aMeshEdVar;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( this, true );
- SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this();
- return aMesh._retn();
+ aMeshEdVar = aMeshEditor->_this();
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return aMeshEdVar._retn();
}
-//=============================================================================
+//================================================================================
/*!
- *
+ * \brief Return true if the mesh has been edited since a last total re-compute
+ * and those modifications may prevent successful partial re-compute
*/
+//================================================================================
+
+CORBA::Boolean SMESH_Mesh_i::HasModificationsToDiscard() throw(SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ return _impl->HasModificationsToDiscard();
+}
+
+//================================================================================
+/*!
+ * \brief Returns a random unique color
+ */
+//================================================================================
+
+static SALOMEDS::Color getUniqueColor( const std::list<SALOMEDS::Color>& theReservedColors )
+{
+ const int MAX_ATTEMPTS = 100;
+ int cnt = 0;
+ double tolerance = 0.5;
+ SALOMEDS::Color col;
+
+ bool ok = false;
+ while ( !ok ) {
+ // generate random color
+ double red = (double)rand() / RAND_MAX;
+ double green = (double)rand() / RAND_MAX;
+ double blue = (double)rand() / RAND_MAX;
+ // check existence in the list of the existing colors
+ bool matched = false;
+ std::list<SALOMEDS::Color>::const_iterator it;
+ for ( it = theReservedColors.begin(); it != theReservedColors.end() && !matched; ++it ) {
+ SALOMEDS::Color color = *it;
+ double tol = fabs( color.R - red ) + fabs( color.G - green ) + fabs( color.B - blue );
+ matched = tol < tolerance;
+ }
+ if ( (cnt+1) % 20 == 0 ) tolerance = tolerance/2;
+ ok = ( ++cnt == MAX_ATTEMPTS ) || !matched;
+ col.R = red;
+ col.G = green;
+ col.B = blue;
+ }
+ return col;
+}
+
//=============================================================================
+/*!
+ * Sets auto-color mode. If it is on, groups get unique random colors
+ */
+//=============================================================================
+
void SMESH_Mesh_i::SetAutoColor(CORBA::Boolean theAutoColor) throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
_impl->SetAutoColor(theAutoColor);
+
+ TPythonDump pyDump; // not to dump group->SetColor() from below code
+ pyDump<<_this()<<".SetAutoColor( "<<theAutoColor<<" )";
+
+ std::list<SALOMEDS::Color> aReservedColors;
+ map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.begin();
+ for ( ; it != _mapGroups.end(); it++ ) {
+ if ( CORBA::is_nil( it->second )) continue;
+ SALOMEDS::Color aColor = getUniqueColor( aReservedColors );
+ it->second->SetColor( aColor );
+ aReservedColors.push_back( aColor );
+ }
}
//=============================================================================
/*!
- *
+ * Returns true if auto-color mode is on
*/
//=============================================================================
+
CORBA::Boolean SMESH_Mesh_i::GetAutoColor() throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
return _impl->GetAutoColor();
}
-
//=============================================================================
/*!
- * Export in different formats
+ * Checks if there are groups with equal names
*/
//=============================================================================
return _impl->HasDuplicatedGroupNamesMED();
}
-void SMESH_Mesh_i::PrepareForWriting (const char* file)
+//================================================================================
+/*!
+ * \brief Care of a file before exporting mesh into it
+ */
+//================================================================================
+
+void SMESH_Mesh_i::PrepareForWriting (const char* file, bool overwrite)
{
TCollection_AsciiString aFullName ((char*)file);
OSD_Path aPath (aFullName);
// existing filesystem node
if (aFile.KindOfFile() == OSD_FILE) {
if (aFile.IsWriteable()) {
- aFile.Reset();
- aFile.Remove();
+ if (overwrite) {
+ aFile.Reset();
+ aFile.Remove();
+ }
if (aFile.Failed()) {
TCollection_AsciiString msg ("File ");
msg += aFullName + " cannot be replaced.";
}
}
-void SMESH_Mesh_i::ExportToMED (const char* file,
- CORBA::Boolean auto_groups,
- SMESH::MED_VERSION theVersion)
- throw(SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
+//================================================================================
+/*!
+ * \brief Prepares a file for export and pass names of mesh groups from study to mesh DS
+ * \param file - file name
+ * \param overwrite - to erase the file or not
+ * \retval string - mesh name
+ */
+//================================================================================
+string SMESH_Mesh_i::prepareMeshNameAndGroups(const char* file,
+ CORBA::Boolean overwrite)
+{
// Perform Export
- PrepareForWriting(file);
- const char* aMeshName = "Mesh";
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ PrepareForWriting(file, overwrite);
+ string aMeshName = "Mesh";
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
if ( !aStudy->_is_nil() ) {
- SALOMEDS::SObject_var aMeshSO = _gen_i->ObjectToSObject( aStudy, _this() );
+ SALOMEDS::SObject_wrap aMeshSO = _gen_i->ObjectToSObject( aStudy, _this() );
if ( !aMeshSO->_is_nil() ) {
- aMeshName = aMeshSO->GetName();
+ CORBA::String_var name = aMeshSO->GetName();
+ aMeshName = name;
// asv : 27.10.04 : fix of 6903: check for StudyLocked before adding attributes
if ( !aStudy->GetProperties()->IsLocked() )
- {
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
- SALOMEDS::AttributeExternalFileDef_var aFileName;
- anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeExternalFileDef");
- aFileName = SALOMEDS::AttributeExternalFileDef::_narrow(anAttr);
- ASSERT(!aFileName->_is_nil());
+ {
+ SALOMEDS::GenericAttribute_wrap anAttr;
+ SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
+ anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeExternalFileDef");
+ SALOMEDS::AttributeExternalFileDef_wrap aFileName = anAttr;
+ ASSERT(!aFileName->_is_nil());
aFileName->SetValue(file);
- SALOMEDS::AttributeFileType_var aFileType;
anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeFileType");
- aFileType = SALOMEDS::AttributeFileType::_narrow(anAttr);
+ SALOMEDS::AttributeFileType_wrap aFileType = anAttr;
ASSERT(!aFileType->_is_nil());
aFileType->SetValue("FICHIERMED");
- }
+ }
}
}
// Update Python script
// set name of mesh before export
- TPythonDump() << _gen_i << ".SetName(" << _this() << ", '" << aMeshName << "')";
-
+ TPythonDump() << _gen_i << ".SetName(" << _this() << ", '" << aMeshName.c_str() << "')";
+
// check names of groups
checkGroupNames();
- TPythonDump() << _this() << ".ExportToMED( '"
- << file << "', " << auto_groups << ", " << theVersion << " )";
+ return aMeshName;
+}
+
+//================================================================================
+/*!
+ * \brief Export to med file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportToMEDX (const char* file,
+ CORBA::Boolean auto_groups,
+ SMESH::MED_VERSION theVersion,
+ CORBA::Boolean overwrite)
+ throw(SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ string aMeshName = prepareMeshNameAndGroups(file, overwrite);
+ TPythonDump() << _this() << ".ExportToMEDX( r'"
+ << file << "', " << auto_groups << ", " << theVersion << ", " << overwrite << " )";
- _impl->ExportMED( file, aMeshName, auto_groups, theVersion );
+ _impl->ExportMED( file, aMeshName.c_str(), auto_groups, theVersion );
+}
+
+//================================================================================
+/*!
+ * \brief Export a mesh to a med file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportToMED (const char* file,
+ CORBA::Boolean auto_groups,
+ SMESH::MED_VERSION theVersion)
+ throw(SALOME::SALOME_Exception)
+{
+ ExportToMEDX(file,auto_groups,theVersion,true);
}
+//================================================================================
+/*!
+ * \brief Export a mesh to a med file
+ */
+//================================================================================
+
void SMESH_Mesh_i::ExportMED (const char* file,
- CORBA::Boolean auto_groups)
+ CORBA::Boolean auto_groups)
+ throw(SALOME::SALOME_Exception)
+{
+ ExportToMEDX(file,auto_groups,SMESH::MED_V2_2,true);
+}
+
+//================================================================================
+/*!
+ * \brief Export a mesh to a SAUV file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportSAUV (const char* file,
+ CORBA::Boolean auto_groups)
throw(SALOME::SALOME_Exception)
{
- ExportToMED(file,auto_groups,SMESH::MED_V2_1);
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ string aMeshName = prepareMeshNameAndGroups(file, true);
+ TPythonDump() << _this() << ".ExportSAUV( r'" << file << "', " << auto_groups << " )";
+ _impl->ExportSAUV(file, aMeshName.c_str(), auto_groups);
}
+
+//================================================================================
+/*!
+ * \brief Export a mesh to a DAT file
+ */
+//================================================================================
+
void SMESH_Mesh_i::ExportDAT (const char *file)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
// Update Python script
// check names of groups
checkGroupNames();
- TPythonDump() << _this() << ".ExportDAT( '" << file << "' )";
+ TPythonDump() << _this() << ".ExportDAT( r'" << file << "' )";
// Perform Export
PrepareForWriting(file);
_impl->ExportDAT(file);
}
+//================================================================================
+/*!
+ * \brief Export a mesh to an UNV file
+ */
+//================================================================================
+
void SMESH_Mesh_i::ExportUNV (const char *file)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
// Update Python script
// check names of groups
checkGroupNames();
- TPythonDump() << _this() << ".ExportUNV( '" << file << "' )";
+ TPythonDump() << _this() << ".ExportUNV( r'" << file << "' )";
// Perform Export
PrepareForWriting(file);
_impl->ExportUNV(file);
}
+//================================================================================
+/*!
+ * \brief Export a mesh to an STL file
+ */
+//================================================================================
+
void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
// Update Python script
// check names of groups
checkGroupNames();
- TPythonDump() << _this() << ".ExportSTL( '" << file << "', " << isascii << " )";
+ TPythonDump() << _this() << ".ExportSTL( r'" << file << "', " << isascii << " )";
// Perform Export
PrepareForWriting(file);
_impl->ExportSTL(file, isascii);
}
+//================================================================================
+/*!
+ * \brief Export a part of mesh to a med file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportPartToMED(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file,
+ CORBA::Boolean auto_groups,
+ ::SMESH::MED_VERSION version,
+ ::CORBA::Boolean overwrite)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file, overwrite);
+
+ string aMeshName = "Mesh";
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
+ if ( !aStudy->_is_nil() ) {
+ SALOMEDS::SObject_wrap SO = _gen_i->ObjectToSObject( aStudy, meshPart );
+ if ( !SO->_is_nil() ) {
+ CORBA::String_var name = SO->GetName();
+ aMeshName = name;
+ }
+ }
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportMED( file, aMeshName.c_str(), auto_groups, version, &partDS );
+
+ TPythonDump() << _this() << ".ExportPartToMED( " << meshPart << ", r'" << file << "', "
+ << auto_groups << ", " << version << ", " << overwrite << " )";
+}
+
+//================================================================================
+/*!
+ * \brief Export a part of mesh to a DAT file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportPartToDAT(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file);
+
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportDAT(file,&partDS);
+
+ TPythonDump() << _this() << ".ExportPartToDAT( " << meshPart << ", r'" << file << "' )";
+}
+//================================================================================
+/*!
+ * \brief Export a part of mesh to an UNV file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportPartToUNV(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file);
+
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportUNV(file, &partDS);
+
+ TPythonDump() << _this() << ".ExportPartToUNV( " << meshPart<< ", r'" << file << "' )";
+}
+//================================================================================
+/*!
+ * \brief Export a part of mesh to an STL file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportPartToSTL(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file,
+ ::CORBA::Boolean isascii)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file);
+
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportSTL(file, isascii, &partDS);
+
+ TPythonDump() << _this() << ".ExportPartToSTL( "
+ << meshPart<< ", r'" << file << "', " << isascii << ")";
+}
+
+//================================================================================
+/*!
+ * \brief Export a part of mesh to an STL file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportCGNS(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file,
+ CORBA::Boolean overwrite)
+ throw (SALOME::SALOME_Exception)
+{
+#ifdef WITH_CGNS
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file,overwrite);
+
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportCGNS(file, &partDS);
+
+ TPythonDump() << _this() << ".ExportCGNS( "
+ << meshPart<< ", r'" << file << "', " << overwrite << ")";
+#else
+ THROW_SALOME_CORBA_EXCEPTION("CGNS library is unavailable", SALOME::INTERNAL_ERROR);
+#endif
+}
+
+//================================================================================
+/*!
+ * \brief Export a part of mesh to a GMF file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportGMF(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file,
+ bool withRequiredGroups)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file,/*overwrite=*/true);
+
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportGMF(file, &partDS, withRequiredGroups);
+
+ TPythonDump() << _this() << ".ExportGMF( "
+ << meshPart<< ", r'"
+ << file << "', "
+ << withRequiredGroups << ")";
+}
+
//=============================================================================
/*!
- *
+ * Return implementation of SALOME_MED::MESH interfaces
*/
//=============================================================================
SALOME_MED::MESH_ptr SMESH_Mesh_i::GetMEDMesh()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH_MEDMesh_i *aMedMesh = new SMESH_MEDMesh_i(this);
SALOME_MED::MESH_var aMesh = aMedMesh->_this();
return aMesh._retn();
}
//=============================================================================
-/*!
- *
- */
-//=============================================================================
+
CORBA::Long SMESH_Mesh_i::NbNodes()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbNodes();
+
return _impl->NbNodes();
}
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
CORBA::Long SMESH_Mesh_i::NbElements()throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- return NbEdges() + NbFaces() + NbVolumes();
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbElements();
+
+ return Nb0DElements() + NbEdges() + NbFaces() + NbVolumes() + NbBalls();
+}
+
+CORBA::Long SMESH_Mesh_i::Nb0DElements()throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->Nb0DElements();
+
+ return _impl->Nb0DElements();
+}
+
+CORBA::Long SMESH_Mesh_i::NbBalls() throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbBalls();
+
+ return _impl->NbBalls();
}
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
CORBA::Long SMESH_Mesh_i::NbEdges()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbEdges();
+
return _impl->NbEdges();
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbEdges( (SMDSAbs_ElementOrder) order );
+
return _impl->NbEdges( (SMDSAbs_ElementOrder) order);
}
//=============================================================================
-/*!
- *
- */
-//=============================================================================
+
CORBA::Long SMESH_Mesh_i::NbFaces()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbFaces();
+
return _impl->NbFaces();
}
CORBA::Long SMESH_Mesh_i::NbTriangles()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbTriangles();
+
return _impl->NbTriangles();
}
CORBA::Long SMESH_Mesh_i::NbQuadrangles()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbQuadrangles();
+
return _impl->NbQuadrangles();
}
+CORBA::Long SMESH_Mesh_i::NbBiQuadQuadrangles()throw(SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbBiQuadQuadrangles();
+
+ return _impl->NbBiQuadQuadrangles();
+}
+
CORBA::Long SMESH_Mesh_i::NbPolygons()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbPolygons();
+
return _impl->NbPolygons();
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbFaces( (SMDSAbs_ElementOrder) order );
+
return _impl->NbFaces( (SMDSAbs_ElementOrder) order);
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbTriangles( (SMDSAbs_ElementOrder) order );
+
return _impl->NbTriangles( (SMDSAbs_ElementOrder) order);
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbQuadrangles( (SMDSAbs_ElementOrder) order );
+
return _impl->NbQuadrangles( (SMDSAbs_ElementOrder) order);
}
//=============================================================================
-/*!
- *
- */
-//=============================================================================
+
CORBA::Long SMESH_Mesh_i::NbVolumes()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbVolumes();
+
return _impl->NbVolumes();
}
CORBA::Long SMESH_Mesh_i::NbTetras()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbTetras();
+
return _impl->NbTetras();
}
CORBA::Long SMESH_Mesh_i::NbHexas()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbHexas();
+
return _impl->NbHexas();
}
+CORBA::Long SMESH_Mesh_i::NbTriQuadraticHexas()throw(SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbTriQuadHexas();
+
+ return _impl->NbTriQuadraticHexas();
+}
+
CORBA::Long SMESH_Mesh_i::NbPyramids()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbPyramids();
+
return _impl->NbPyramids();
}
CORBA::Long SMESH_Mesh_i::NbPrisms()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbPrisms();
+
return _impl->NbPrisms();
}
+CORBA::Long SMESH_Mesh_i::NbHexagonalPrisms()throw(SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbHexPrisms();
+
+ return _impl->NbHexagonalPrisms();
+}
+
CORBA::Long SMESH_Mesh_i::NbPolyhedrons()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbPolyhedrons();
+
return _impl->NbPolyhedrons();
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbVolumes( (SMDSAbs_ElementOrder) order );
+
return _impl->NbVolumes( (SMDSAbs_ElementOrder) order);
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbTetras( (SMDSAbs_ElementOrder) order);
+
return _impl->NbTetras( (SMDSAbs_ElementOrder) order);
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbHexas( (SMDSAbs_ElementOrder) order);
+
return _impl->NbHexas( (SMDSAbs_ElementOrder) order);
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbPyramids( (SMDSAbs_ElementOrder) order);
+
return _impl->NbPyramids( (SMDSAbs_ElementOrder) order);
}
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbPrisms( (SMDSAbs_ElementOrder) order);
+
return _impl->NbPrisms( (SMDSAbs_ElementOrder) order);
}
//=============================================================================
/*!
- *
+ * Returns nb of published sub-meshes
*/
//=============================================================================
+
CORBA::Long SMESH_Mesh_i::NbSubMesh()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
//=============================================================================
/*!
- *
+ * Dumps mesh into a string
*/
//=============================================================================
+
char* SMESH_Mesh_i::Dump()
{
- std::ostringstream os;
+ ostringstream os;
_impl->Dump( os );
return CORBA::string_dup( os.str().c_str() );
}
//=============================================================================
/*!
- *
+ * Method of SMESH_IDSource interface
*/
//=============================================================================
+
SMESH::long_array* SMESH_Mesh_i::GetIDs()
{
-// SMESH::long_array_var aResult = new SMESH::long_array();
-// SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
-// int aMinId = aSMESHDS_Mesh->MinElementID();
-// int aMaxId = aSMESHDS_Mesh->MaxElementID();
-
-// aResult->length(aMaxId - aMinId + 1);
-
-// for (int i = 0, id = aMinId; id <= aMaxId; id++ )
-// aResult[i++] = id;
-
-// return aResult._retn();
- // PAL12398
return GetElementsId();
}
//=============================================================================
/*!
- *
+ * Returns ids of all elements
*/
//=============================================================================
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_Mesh_i::GetElementsId");
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::long_array_var aResult = new SMESH::long_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
//=============================================================================
/*!
- *
+ * Returns ids of all elements of given type
*/
//=============================================================================
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetElementsByType");
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::long_array_var aResult = new SMESH::long_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
// No sense in returning ids of elements along with ids of nodes:
// when theElemType == SMESH::ALL, return node ids only if
// there are no elements
- if ( theElemType == SMESH::NODE || theElemType == SMESH::ALL && nbElements == 0 )
+ if ( theElemType == SMESH::NODE || (theElemType == SMESH::ALL && nbElements == 0) )
return GetNodesId();
aResult->length( nbElements );
//=============================================================================
/*!
- *
+ * Returns ids of all nodes
*/
//=============================================================================
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNodesId");
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::long_array_var aResult = new SMESH::long_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
long nbNodes = NbNodes();
aResult->length( nbNodes );
- SMDS_NodeIteratorPtr anIt = aSMESHDS_Mesh->nodesIterator();
+ SMDS_NodeIteratorPtr anIt = aSMESHDS_Mesh->nodesIterator(/*idInceasingOrder=*/true);
for ( int i = 0, n = nbNodes; i < n && anIt->more(); i++ )
aResult[i] = anIt->next()->GetID();
SMESH::ElementType SMESH_Mesh_i::GetElementType( const CORBA::Long id, const bool iselem )
throw (SALOME::SALOME_Exception)
{
- return ( SMESH::ElementType )_impl->GetElementType( id, iselem );
+ SMESH::ElementType type;
+ SMESH_TRY;
+
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ type = ( SMESH::ElementType ) _impl->GetElementType( id, iselem );
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return type;
}
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+SMESH::EntityType SMESH_Mesh_i::GetElementGeomType( const CORBA::Long id )
+ throw (SALOME::SALOME_Exception)
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ const SMDS_MeshElement* e = _impl->GetMeshDS()->FindElement(id);
+ if ( !e )
+ THROW_SALOME_CORBA_EXCEPTION( "invalid element id", SALOME::BAD_PARAM );
+
+ return ( SMESH::EntityType ) e->GetEntityType();
+}
//=============================================================================
/*!
{
SMESH::long_array_var aResult = new SMESH::long_array();
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID);
if(!SM) return aResult._retn();
aResult[i++] = eIt->next()->GetID();
}
+ SMESH_CATCH( SMESH::throwCorbaException );
+
return aResult._retn();
}
* returns only nodes on shapes.
*/
//=============================================================================
-SMESH::long_array* SMESH_Mesh_i::GetSubMeshNodesId(const CORBA::Long ShapeID, CORBA::Boolean all)
- throw (SALOME::SALOME_Exception)
+SMESH::long_array* SMESH_Mesh_i::GetSubMeshNodesId(const CORBA::Long ShapeID,
+ CORBA::Boolean all)
+ throw (SALOME::SALOME_Exception)
{
SMESH::long_array_var aResult = new SMESH::long_array();
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID);
if(!SM) return aResult._retn();
for ( itElem = theElems.begin(); itElem != theElems.end(); itElem++ )
aResult[i++] = *itElem;
+ SMESH_CATCH( SMESH::throwCorbaException );
+
return aResult._retn();
}
-
//=============================================================================
/*!
* Returns type of elements for given submesh
*/
//=============================================================================
+
SMESH::ElementType SMESH_Mesh_i::GetSubMeshElementType(const CORBA::Long ShapeID)
- throw (SALOME::SALOME_Exception)
+ throw (SALOME::SALOME_Exception)
{
+ SMESH::ElementType type;
+
+ SMESH_TRY;
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID);
if(!SM) return SMESH::ALL;
SMDS_ElemIteratorPtr eIt = SDSM->GetElements();
const SMDS_MeshElement* anElem = eIt->next();
- return ( SMESH::ElementType ) anElem->GetType();
+
+ type = ( SMESH::ElementType ) anElem->GetType();
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return type;
}
//=============================================================================
/*!
- *
+ * Returns pointer to _impl as an integer value. Is called from constructor of SMESH_Client
*/
//=============================================================================
CORBA::LongLong SMESH_Mesh_i::GetMeshPtr()
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
CORBA::LongLong pointeur = CORBA::LongLong(_impl);
if ( MYDEBUG )
MESSAGE("CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() "<<pointeur);
SMESH::double_array* SMESH_Mesh_i::GetNodeXYZ(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::double_array_var aResult = new SMESH::double_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
SMESH::long_array* SMESH_Mesh_i::GetNodeInverseElements(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::long_array_var aResult = new SMESH::long_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
SMESH::NodePosition* SMESH_Mesh_i::GetNodePosition(CORBA::Long NodeID)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::NodePosition* aNodePosition = new SMESH::NodePosition();
aNodePosition->shapeID = 0;
aNodePosition->shapeType = GEOM::SHAPE;
{
if ( SMDS_PositionPtr pos = aNode->GetPosition() )
{
- aNodePosition->shapeID = pos->GetShapeId();
+ aNodePosition->shapeID = aNode->getshapeId();
switch ( pos->GetTypeOfPosition() ) {
case SMDS_TOP_EDGE:
aNodePosition->shapeType = GEOM::EDGE;
aNodePosition->params.length(1);
aNodePosition->params[0] =
- static_cast<SMDS_EdgePosition*>( pos.get() )->GetUParameter();
+ static_cast<SMDS_EdgePosition*>( pos )->GetUParameter();
break;
case SMDS_TOP_FACE:
aNodePosition->shapeType = GEOM::FACE;
aNodePosition->params.length(2);
aNodePosition->params[0] =
- static_cast<SMDS_FacePosition*>( pos.get() )->GetUParameter();
+ static_cast<SMDS_FacePosition*>( pos )->GetUParameter();
aNodePosition->params[1] =
- static_cast<SMDS_FacePosition*>( pos.get() )->GetVParameter();
+ static_cast<SMDS_FacePosition*>( pos )->GetVParameter();
break;
case SMDS_TOP_VERTEX:
aNodePosition->shapeType = GEOM::VERTEX;
return aNodePosition;
}
+//=============================================================================
+/*!
+ * \brief Return position of an element on shape
+ */
+//=============================================================================
+
+SMESH::ElementPosition SMESH_Mesh_i::GetElementPosition(CORBA::Long ElemID)
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ SMESH::ElementPosition anElementPosition;
+ anElementPosition.shapeID = 0;
+ anElementPosition.shapeType = GEOM::SHAPE;
+
+ SMESHDS_Mesh* mesh = _impl->GetMeshDS();
+ if ( !mesh ) return anElementPosition;
+
+ if ( const SMDS_MeshElement* anElem = mesh->FindElement( ElemID ) )
+ {
+ anElementPosition.shapeID = anElem->getshapeId();
+ const TopoDS_Shape& aSp = mesh->IndexToShape( anElem->getshapeId() );
+ if ( !aSp.IsNull() ) {
+ switch ( aSp.ShapeType() ) {
+ case TopAbs_EDGE:
+ anElementPosition.shapeType = GEOM::EDGE;
+ break;
+ case TopAbs_FACE:
+ anElementPosition.shapeType = GEOM::FACE;
+ break;
+ case TopAbs_VERTEX:
+ anElementPosition.shapeType = GEOM::VERTEX;
+ break;
+ case TopAbs_SOLID:
+ anElementPosition.shapeType = GEOM::SOLID;
+ break;
+ case TopAbs_SHELL:
+ anElementPosition.shapeType = GEOM::SHELL;
+ break;
+ default:;
+ }
+ }
+ }
+ return anElementPosition;
+}
+
//=============================================================================
/*!
* If given element is node returns IDs of shape from position
CORBA::Long SMESH_Mesh_i::GetShapeID(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
return -1;
// try to find node
const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id);
if(aNode) {
- SMDS_PositionPtr pos = aNode->GetPosition();
- if(!pos)
- return -1;
- else
- return pos->GetShapeId();
+ return aNode->getshapeId();
}
return -1;
CORBA::Long SMESH_Mesh_i::GetShapeIDForElem(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
return -1;
if(!elem)
return -1;
- //SMESH::SMESH_MeshEditor_var aMeshEditor = SMESH_Mesh_i::GetMeshEditor();
::SMESH_MeshEditor aMeshEditor(_impl);
int index = aMeshEditor.FindShape( elem );
if(index>0)
CORBA::Long SMESH_Mesh_i::GetElemNbNodes(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
// try to find element
CORBA::Long SMESH_Mesh_i::GetElemNode(const CORBA::Long id, const CORBA::Long index)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
SMESH::long_array* SMESH_Mesh_i::GetElemNodes(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::long_array_var aResult = new SMESH::long_array();
if ( SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS() )
{
CORBA::Boolean SMESH_Mesh_i::IsMediumNode(const CORBA::Long ide, const CORBA::Long idn)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
// try to find node
CORBA::Boolean SMESH_Mesh_i::IsMediumNodeOfAnyElem(const CORBA::Long idn,
SMESH::ElementType theElemType)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
CORBA::Long SMESH_Mesh_i::ElemNbEdges(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
CORBA::Long SMESH_Mesh_i::ElemNbFaces(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
return elem->NbFaces();
}
+//=======================================================================
+//function : GetElemFaceNodes
+//purpose : Returns nodes of given face (counted from zero) for given element.
+//=======================================================================
+
+SMESH::long_array* SMESH_Mesh_i::GetElemFaceNodes(CORBA::Long elemId,
+ CORBA::Short faceIndex)
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ SMESH::long_array_var aResult = new SMESH::long_array();
+ if ( SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS() )
+ {
+ if ( const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(elemId) )
+ {
+ SMDS_VolumeTool vtool( elem );
+ if ( faceIndex < vtool.NbFaces() )
+ {
+ aResult->length( vtool.NbFaceNodes( faceIndex ));
+ const SMDS_MeshNode** nn = vtool.GetFaceNodes( faceIndex );
+ for ( int i = 0; i < aResult->length(); ++i )
+ aResult[ i ] = nn[ i ]->GetID();
+ }
+ }
+ }
+ return aResult._retn();
+}
+
+//=======================================================================
+//function : FindElementByNodes
+//purpose : Returns an element based on all given nodes.
+//=======================================================================
+
+CORBA::Long SMESH_Mesh_i::FindElementByNodes(const SMESH::long_array& nodes)
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ CORBA::Long elemID(0);
+ if ( SMESHDS_Mesh* mesh = _impl->GetMeshDS() )
+ {
+ vector< const SMDS_MeshNode * > nn( nodes.length() );
+ for ( int i = 0; i < nodes.length(); ++i )
+ if ( !( nn[i] = mesh->FindNode( nodes[i] )))
+ return elemID;
+
+ const SMDS_MeshElement* elem = mesh->FindElement( nn );
+ if ( !elem && ( _impl->NbEdges ( ORDER_QUADRATIC ) ||
+ _impl->NbFaces ( ORDER_QUADRATIC ) ||
+ _impl->NbVolumes( ORDER_QUADRATIC )))
+ elem = mesh->FindElement( nn, SMDSAbs_All, /*noMedium=*/true );
+
+ if ( elem ) elemID = CORBA::Long( elem->GetID() );
+ }
+ return elemID;
+}
//=============================================================================
/*!
CORBA::Boolean SMESH_Mesh_i::IsPoly(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
CORBA::Boolean SMESH_Mesh_i::IsQuadratic(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
return elem->IsQuadratic();
}
+//=============================================================================
+/*!
+ * Returns diameter of ball discrete element or zero in case of an invalid \a id
+ */
+//=============================================================================
+
+CORBA::Double SMESH_Mesh_i::GetBallDiameter(CORBA::Long id)
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ if ( const SMDS_BallElement* ball =
+ dynamic_cast<const SMDS_BallElement*>( _impl->GetMeshDS()->FindElement( id )))
+ return ball->GetDiameter();
+
+ return 0;
+}
//=============================================================================
/*!
SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
SMESH::double_array_var aResult = new SMESH::double_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
*/
//=============================================================================
-void SMESH_Mesh_i::CreateGroupServants()
+void SMESH_Mesh_i::CreateGroupServants()
{
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
+ set<int> addedIDs;
::SMESH_Mesh::GroupIteratorPtr groupIt = _impl->GetGroups();
while ( groupIt->more() )
{
map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.find(anId);
if ( it != _mapGroups.end() && !CORBA::is_nil( it->second ))
continue;
+ addedIDs.insert( anId );
SMESH_GroupBase_i* aGroupImpl;
TopoDS_Shape shape;
aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, anId );
}
- // To ensure correct mapping of servant and correct reference counting in GenericObj_i
- SMESH_Gen_i::GetPOA()->activate_object( aGroupImpl );
- aGroupImpl->Register();
-
SMESH::SMESH_GroupBase_var groupVar =
SMESH::SMESH_GroupBase::_narrow( aGroupImpl->_this() );
_mapGroups[anId] = SMESH::SMESH_GroupBase::_duplicate( groupVar );
int nextId = _gen_i->RegisterObject( groupVar );
if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
- // publishing of the groups in the study
+ // publishing the groups in the study
if ( !aStudy->_is_nil() ) {
GEOM::GEOM_Object_var shapeVar = _gen_i->ShapeToGeomObject( shape );
_gen_i->PublishGroup( aStudy, _this(), groupVar, shapeVar, groupVar->GetName());
}
}
+ if ( !addedIDs.empty() )
+ {
+ // python dump
+ set<int>::iterator id = addedIDs.begin();
+ for ( ; id != addedIDs.end(); ++id )
+ {
+ map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.find(*id);
+ int i = std::distance( _mapGroups.begin(), it );
+ TPythonDump() << it->second << " = " << _this() << ".GetGroups()[ "<< i << " ]";
+ }
+ }
}
//=============================================================================
SALOME_MED::MedFileInfo* SMESH_Mesh_i::GetMEDFileInfo()
{
- SALOME_MED::MedFileInfo_var res( myFileInfo );
+ SALOME_MED::MedFileInfo_var res( _medFileInfo );
if ( !res.operator->() ) {
res = new SALOME_MED::MedFileInfo;
res->fileName = "";
//=============================================================================
/*!
- * \brief Check and correct names of mesh groups
+ * \brief Pass names of mesh groups from study to mesh DS
*/
//=============================================================================
if ( !nbGrp )
return;
- SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
if ( aStudy->_is_nil() )
return; // nothing to do
SMESH::SMESH_GroupBase_ptr aGrp = (*grpList)[ gIndx ];
if ( !aGrp )
continue;
- SALOMEDS::SObject_var aGrpSO = _gen_i->ObjectToSObject( aStudy, aGrp );
+ SALOMEDS::SObject_wrap aGrpSO = _gen_i->ObjectToSObject( aStudy, aGrp );
if ( aGrpSO->_is_nil() )
continue;
// correct name of the mesh group if necessary
//=============================================================================
void SMESH_Mesh_i::SetParameters(const char* theParameters)
{
- SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Mesh::_narrow(_this()),
- CORBA::string_dup(theParameters));
+ // SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Mesh::_narrow(_this()),
+ // CORBA::string_dup(theParameters));
+ SMESH_Gen_i::GetSMESHGen()->UpdateParameters(theParameters);
}
//=============================================================================
SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
if(gen) {
char *aParameters = GetParameters();
- SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
+ SALOMEDS::Study_var aStudy = gen->GetCurrentStudy();
if(!aStudy->_is_nil()) {
SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters);
if(aSections->length() > 0) {
}
return aResult._retn();
}
+
+//=======================================================================
+//function : GetTypes
+//purpose : Returns types of elements it contains
+//=======================================================================
+
+SMESH::array_of_ElementType* SMESH_Mesh_i::GetTypes()
+{
+ if ( _preMeshInfo )
+ return _preMeshInfo->GetTypes();
+
+ SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType;
+
+ types->length( 5 );
+ int nbTypes = 0;
+ if (_impl->NbEdges()) types[nbTypes++] = SMESH::EDGE;
+ if (_impl->NbFaces()) types[nbTypes++] = SMESH::FACE;
+ if (_impl->NbVolumes()) types[nbTypes++] = SMESH::VOLUME;
+ if (_impl->Nb0DElements()) types[nbTypes++] = SMESH::ELEM0D;
+ if (_impl->NbBalls()) types[nbTypes++] = SMESH::BALL;
+ types->length( nbTypes );
+
+ return types._retn();
+}
+
+//=======================================================================
+//function : GetMesh
+//purpose : Returns self
+//=======================================================================
+
+SMESH::SMESH_Mesh_ptr SMESH_Mesh_i::GetMesh()
+{
+ return SMESH::SMESH_Mesh::_duplicate( _this() );
+}
+
+//=======================================================================
+//function : IsMeshInfoCorrect
+//purpose : * Returns false if GetMeshInfo() returns incorrect information that may
+// * happen if mesh data is not yet fully loaded from the file of study.
+//=======================================================================
+
+bool SMESH_Mesh_i::IsMeshInfoCorrect()
+{
+ return _preMeshInfo ? _preMeshInfo->IsMeshInfoCorrect() : true;
+}
+
+//=============================================================================
+/*!
+ * \brief Returns statistic of mesh elements
+ */
+//=============================================================================
+
+SMESH::long_array* SMESH_Mesh_i::GetMeshInfo()
+{
+ if ( _preMeshInfo )
+ return _preMeshInfo->GetMeshInfo();
+
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::Entity_Last);
+ for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++)
+ aRes[i] = 0;
+ SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS();
+ if (!aMeshDS)
+ return aRes._retn();
+ const SMDS_MeshInfo& aMeshInfo = aMeshDS->GetMeshInfo();
+ for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++)
+ aRes[i] = aMeshInfo.NbEntities((SMDSAbs_EntityType)i);
+ return aRes._retn();
+}
+
+//=============================================================================
+/*!
+ * \brief Collect statistic of mesh elements given by iterator
+ */
+//=============================================================================
+
+void SMESH_Mesh_i::CollectMeshInfo(const SMDS_ElemIteratorPtr theItr,
+ SMESH::long_array& theInfo)
+{
+ if (!theItr) return;
+ while (theItr->more())
+ theInfo[ theItr->next()->GetEntityType() ]++;
+}
+
+//=============================================================================
+namespace // Finding concurrent hypotheses
+//=============================================================================
+{
+
+/*!
+ * \brief mapping of mesh dimension into shape type
+ */
+TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
+{
+ TopAbs_ShapeEnum aType = TopAbs_SOLID;
+ switch ( theDim ) {
+ case 0: aType = TopAbs_VERTEX; break;
+ case 1: aType = TopAbs_EDGE; break;
+ case 2: aType = TopAbs_FACE; break;
+ case 3:
+ default:aType = TopAbs_SOLID; break;
+ }
+ return aType;
+}
+
+//-----------------------------------------------------------------------------
+/*!
+ * \brief Internal structure used to find concurent submeshes
+ *
+ * It represents a pair < submesh, concurent dimension >, where
+ * 'concurrent dimension' is dimension of shape where the submesh can concurent
+ * with another submesh. In other words, it is dimension of a hypothesis assigned
+ * to submesh.
+ */
+class SMESH_DimHyp
+{
+ public:
+ //! fileds
+ int _dim; //!< a dimension the algo can build (concurrent dimension)
+ int _ownDim; //!< dimension of shape of _subMesh (>=_dim)
+ TopTools_MapOfShape _shapeMap;
+ SMESH_subMesh* _subMesh;
+ list<const SMESHDS_Hypothesis*> _hypotheses; //!< algo is first, then its parameters
+
+ //-----------------------------------------------------------------------------
+ // Return the algorithm
+ const SMESH_Algo* GetAlgo() const
+ { return _hypotheses.empty() ? 0 : dynamic_cast<const SMESH_Algo*>( _hypotheses.front() ); }
+
+ //-----------------------------------------------------------------------------
+ //! Constructors
+ SMESH_DimHyp(const SMESH_subMesh* theSubMesh,
+ const int theDim,
+ const TopoDS_Shape& theShape)
+ {
+ _subMesh = (SMESH_subMesh*)theSubMesh;
+ SetShape( theDim, theShape );
+ }
+
+ //-----------------------------------------------------------------------------
+ //! set shape
+ void SetShape(const int theDim,
+ const TopoDS_Shape& theShape)
+ {
+ _dim = theDim;
+ _ownDim = (int)SMESH_Gen::GetShapeDim(theShape);
+ if (_dim >= _ownDim)
+ _shapeMap.Add( theShape );
+ else {
+ TopExp_Explorer anExp( theShape, shapeTypeByDim(theDim) );
+ for( ; anExp.More(); anExp.Next() )
+ _shapeMap.Add( anExp.Current() );
+ }
+ }
+
+ //-----------------------------------------------------------------------------
+ //! Check sharing of sub-shapes
+ static bool isShareSubShapes(const TopTools_MapOfShape& theToCheck,
+ const TopTools_MapOfShape& theToFind,
+ const TopAbs_ShapeEnum theType)
+ {
+ bool isShared = false;
+ TopTools_MapIteratorOfMapOfShape anItr( theToCheck );
+ for (; !isShared && anItr.More(); anItr.Next() )
+ {
+ const TopoDS_Shape aSubSh = anItr.Key();
+ // check for case when concurrent dimensions are same
+ isShared = theToFind.Contains( aSubSh );
+ // check for sub-shape with concurrent dimension
+ TopExp_Explorer anExp( aSubSh, theType );
+ for ( ; !isShared && anExp.More(); anExp.Next() )
+ isShared = theToFind.Contains( anExp.Current() );
+ }
+ return isShared;
+ }
+
+ //-----------------------------------------------------------------------------
+ //! check algorithms
+ static bool checkAlgo(const SMESHDS_Hypothesis* theA1,
+ const SMESHDS_Hypothesis* theA2)
+ {
+ if ( !theA1 || !theA2 ||
+ theA1->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ||
+ theA2->GetType() == SMESHDS_Hypothesis::PARAM_ALGO )
+ return false; // one of the hypothesis is not algorithm
+ // check algorithm names (should be equal)
+ return strcmp( theA1->GetName(), theA2->GetName() ) == 0;
+ }
+
+
+ //-----------------------------------------------------------------------------
+ //! Check if sub-shape hypotheses are concurrent
+ bool IsConcurrent(const SMESH_DimHyp* theOther) const
+ {
+ if ( _subMesh == theOther->_subMesh )
+ return false; // same sub-shape - should not be
+
+ // if ( <own dim of either of submeshes> == <concurrent dim> &&
+ // any of the two submeshes is not on COMPOUND shape )
+ // -> no concurrency
+ bool meIsCompound = (_subMesh->GetSubMeshDS() &&
+ _subMesh->GetSubMeshDS()->IsComplexSubmesh());
+ bool otherIsCompound = (theOther->_subMesh->GetSubMeshDS() &&
+ theOther->_subMesh->GetSubMeshDS()->IsComplexSubmesh());
+ if ( (_ownDim == _dim || theOther->_ownDim == _dim ) && (!meIsCompound || !otherIsCompound))
+ return false;
+
+// bool checkSubShape = ( _dim >= theOther->_dim )
+// ? isShareSubShapes( _shapeMap, theOther->_shapeMap, shapeTypeByDim(theOther->_dim) )
+// : isShareSubShapes( theOther->_shapeMap, _shapeMap, shapeTypeByDim(_dim) ) ;
+ bool checkSubShape = isShareSubShapes( _shapeMap, theOther->_shapeMap, shapeTypeByDim(_dim));
+ if ( !checkSubShape )
+ return false;
+
+ // check algorithms to be same
+ if ( !checkAlgo( this->GetAlgo(), theOther->GetAlgo() ))
+ return true; // different algorithms -> concurrency !
+
+ // check hypothesises for concurrence (skip first as algorithm)
+ int nbSame = 0;
+ // pointers should be same, because it is referened from mesh hypothesis partition
+ list <const SMESHDS_Hypothesis*>::const_iterator hypIt = _hypotheses.begin();
+ list <const SMESHDS_Hypothesis*>::const_iterator otheEndIt = theOther->_hypotheses.end();
+ for ( hypIt++ /*skip first as algo*/; hypIt != _hypotheses.end(); hypIt++ )
+ if ( find( theOther->_hypotheses.begin(), otheEndIt, *hypIt ) != otheEndIt )
+ nbSame++;
+ // the submeshes are concurrent if their algorithms has different parameters
+ return nbSame != theOther->_hypotheses.size() - 1;
+ }
+
+ // Return true if algorithm of this SMESH_DimHyp is used if no
+ // sub-mesh order is imposed by the user
+ bool IsHigherPriorityThan( const SMESH_DimHyp* theOther ) const
+ {
+ // NeedDiscreteBoundary() algo has a higher priority
+ if ( this ->GetAlgo()->NeedDiscreteBoundary() !=
+ theOther->GetAlgo()->NeedDiscreteBoundary() )
+ return !this->GetAlgo()->NeedDiscreteBoundary();
+
+ return ( this->_subMesh->GetId() < theOther->_subMesh->GetId() );
+ }
+
+}; // end of SMESH_DimHyp
+//-----------------------------------------------------------------------------
+
+typedef list<const SMESH_DimHyp*> TDimHypList;
+
+//-----------------------------------------------------------------------------
+
+void addDimHypInstance(const int theDim,
+ const TopoDS_Shape& theShape,
+ const SMESH_Algo* theAlgo,
+ const SMESH_subMesh* theSubMesh,
+ const list <const SMESHDS_Hypothesis*>& theHypList,
+ TDimHypList* theDimHypListArr )
+{
+ TDimHypList& listOfdimHyp = theDimHypListArr[theDim];
+ if ( listOfdimHyp.empty() || listOfdimHyp.back()->_subMesh != theSubMesh ) {
+ SMESH_DimHyp* dimHyp = new SMESH_DimHyp( theSubMesh, theDim, theShape );
+ dimHyp->_hypotheses.push_front(theAlgo);
+ listOfdimHyp.push_back( dimHyp );
+ }
+
+ SMESH_DimHyp* dimHyp = const_cast<SMESH_DimHyp*>( listOfdimHyp.back() );
+ dimHyp->_hypotheses.insert( dimHyp->_hypotheses.end(),
+ theHypList.begin(), theHypList.end() );
+}
+
+//-----------------------------------------------------------------------------
+void addInOrderOfPriority( const SMESH_DimHyp* theDimHyp,
+ TDimHypList& theListOfConcurr)
+{
+ if ( theListOfConcurr.empty() )
+ {
+ theListOfConcurr.push_back( theDimHyp );
+ }
+ else
+ {
+ TDimHypList::iterator hypIt = theListOfConcurr.begin();
+ while ( hypIt != theListOfConcurr.end() &&
+ !theDimHyp->IsHigherPriorityThan( *hypIt ))
+ ++hypIt;
+ theListOfConcurr.insert( hypIt, theDimHyp );
+ }
+}
+
+//-----------------------------------------------------------------------------
+void findConcurrents(const SMESH_DimHyp* theDimHyp,
+ const TDimHypList& theListOfDimHyp,
+ TDimHypList& theListOfConcurrHyp,
+ set<int>& theSetOfConcurrId )
+{
+ TDimHypList::const_reverse_iterator rIt = theListOfDimHyp.rbegin();
+ for ( ; rIt != theListOfDimHyp.rend(); rIt++ )
+ {
+ const SMESH_DimHyp* curDimHyp = *rIt;
+ if ( curDimHyp == theDimHyp )
+ break; // meet own dimHyp pointer in same dimension
+
+ if ( theDimHyp->IsConcurrent( curDimHyp ) &&
+ theSetOfConcurrId.insert( curDimHyp->_subMesh->GetId() ).second )
+ {
+ addInOrderOfPriority( curDimHyp, theListOfConcurrHyp );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void unionLists(TListOfInt& theListOfId,
+ TListOfListOfInt& theListOfListOfId,
+ const int theIndx )
+{
+ TListOfListOfInt::iterator it = theListOfListOfId.begin();
+ for ( int i = 0; it != theListOfListOfId.end(); it++, i++ ) {
+ if ( i < theIndx )
+ continue; //skip already treated lists
+ // check if other list has any same submesh object
+ TListOfInt& otherListOfId = *it;
+ if ( find_first_of( theListOfId.begin(), theListOfId.end(),
+ otherListOfId.begin(), otherListOfId.end() ) == theListOfId.end() )
+ continue;
+
+ // union two lists (from source into target)
+ TListOfInt::iterator it2 = otherListOfId.begin();
+ for ( ; it2 != otherListOfId.end(); it2++ ) {
+ if ( find( theListOfId.begin(), theListOfId.end(), (*it2) ) == theListOfId.end() )
+ theListOfId.push_back(*it2);
+ }
+ // clear source list
+ otherListOfId.clear();
+ }
+}
+//-----------------------------------------------------------------------------
+
+//! free memory allocated for dimension-hypothesis objects
+void removeDimHyps( TDimHypList* theArrOfList )
+{
+ for (int i = 0; i < 4; i++ ) {
+ TDimHypList& listOfdimHyp = theArrOfList[i];
+ TDimHypList::const_iterator it = listOfdimHyp.begin();
+ for ( ; it != listOfdimHyp.end(); it++ )
+ delete (*it);
+ }
+}
+
+//-----------------------------------------------------------------------------
+/*!
+ * \brief find common submeshes with given submesh
+ * \param theSubMeshList list of already collected submesh to check
+ * \param theSubMesh given submesh to intersect with other
+ * \param theCommonSubMeshes collected common submeshes
+ */
+void findCommonSubMesh (list<const SMESH_subMesh*>& theSubMeshList,
+ const SMESH_subMesh* theSubMesh,
+ set<const SMESH_subMesh*>& theCommon )
+{
+ if ( !theSubMesh )
+ return;
+ list<const SMESH_subMesh*>::const_iterator it = theSubMeshList.begin();
+ for ( ; it != theSubMeshList.end(); it++ )
+ theSubMesh->FindIntersection( *it, theCommon );
+ theSubMeshList.push_back( theSubMesh );
+ //theCommon.insert( theSubMesh );
+}
+
+} // namespace
+
+//=============================================================================
+/*!
+ * \brief Return submesh objects list in meshing order
+ */
+//=============================================================================
+
+SMESH::submesh_array_array* SMESH_Mesh_i::GetMeshOrder()
+{
+ SMESH::submesh_array_array_var aResult = new SMESH::submesh_array_array();
+
+ SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS();
+ if ( !aMeshDS )
+ return aResult._retn();
+
+ ::SMESH_Mesh& mesh = GetImpl();
+ TListOfListOfInt anOrder = mesh.GetMeshOrder(); // is there already defined order?
+ if ( !anOrder.size() ) {
+
+ // collect submeshes and detect concurrent algorithms and hypothesises
+ TDimHypList dimHypListArr[4]; // dimHyp list for each shape dimension
+
+ map<int, ::SMESH_subMesh*>::iterator i_sm = _mapSubMesh.begin();
+ for ( ; i_sm != _mapSubMesh.end(); i_sm++ ) {
+ ::SMESH_subMesh* sm = (*i_sm).second;
+ // shape of submesh
+ const TopoDS_Shape& aSubMeshShape = sm->GetSubShape();
+
+ // list of assigned hypothesises
+ const list <const SMESHDS_Hypothesis*>& hypList = mesh.GetHypothesisList(aSubMeshShape);
+ // Find out dimensions where the submesh can be concurrent.
+ // We define the dimensions by algo of each of hypotheses in hypList
+ list <const SMESHDS_Hypothesis*>::const_iterator hypIt = hypList.begin();
+ for( ; hypIt != hypList.end(); hypIt++ ) {
+ SMESH_Algo* anAlgo = 0;
+ const SMESH_Hypothesis* hyp = dynamic_cast<const SMESH_Hypothesis*>(*hypIt);
+ if ( hyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO )
+ // hyp it-self is algo
+ anAlgo = (SMESH_Algo*)dynamic_cast<const SMESH_Algo*>(hyp);
+ else {
+ // try to find algorithm with help of sub-shapes
+ TopExp_Explorer anExp( aSubMeshShape, shapeTypeByDim(hyp->GetDim()) );
+ for ( ; !anAlgo && anExp.More(); anExp.Next() )
+ anAlgo = mesh.GetGen()->GetAlgo( mesh, anExp.Current() );
+ }
+ if (!anAlgo)
+ continue; // no algorithm assigned to a current submesh
+
+ int dim = anAlgo->GetDim(); // top concurrent dimension (see comment to SMESH_DimHyp)
+ // the submesh can concurrent at <dim> (or lower dims if !anAlgo->NeedDiscreteBoundary())
+
+ // create instance of dimension-hypothesis for found concurrent dimension(s) and algorithm
+ for ( int j = anAlgo->NeedDiscreteBoundary() ? dim : 1, jn = dim; j <= jn; j++ )
+ addDimHypInstance( j, aSubMeshShape, anAlgo, sm, hypList, dimHypListArr );
+ }
+ } // end iterations on submesh
+
+ // iterate on created dimension-hypotheses and check for concurrents
+ for ( int i = 0; i < 4; i++ ) {
+ const TDimHypList& listOfDimHyp = dimHypListArr[i];
+ // check for concurrents in own and other dimensions (step-by-step)
+ TDimHypList::const_iterator dhIt = listOfDimHyp.begin();
+ for ( ; dhIt != listOfDimHyp.end(); dhIt++ ) {
+ const SMESH_DimHyp* dimHyp = *dhIt;
+ TDimHypList listOfConcurr;
+ set<int> setOfConcurrIds;
+ // looking for concurrents and collect into own list
+ for ( int j = i; j < 4; j++ )
+ findConcurrents( dimHyp, dimHypListArr[j], listOfConcurr, setOfConcurrIds );
+ // check if any concurrents found
+ if ( listOfConcurr.size() > 0 ) {
+ // add own submesh to list of concurrent
+ addInOrderOfPriority( dimHyp, listOfConcurr );
+ list<int> listOfConcurrIds;
+ TDimHypList::iterator hypIt = listOfConcurr.begin();
+ for ( ; hypIt != listOfConcurr.end(); ++hypIt )
+ listOfConcurrIds.push_back( (*hypIt)->_subMesh->GetId() );
+ anOrder.push_back( listOfConcurrIds );
+ }
+ }
+ }
+
+ removeDimHyps(dimHypListArr);
+
+ // now, minimise the number of concurrent groups
+ // Here we assume that lists of submeshes can have same submesh
+ // in case of multi-dimension algorithms, as result
+ // list with common submesh has to be united into one list
+ int listIndx = 0;
+ TListOfListOfInt::iterator listIt = anOrder.begin();
+ for(; listIt != anOrder.end(); listIt++, listIndx++ )
+ unionLists( *listIt, anOrder, listIndx + 1 );
+ }
+ // convert submesh ids into interface instances
+ // and dump command into python
+ convertMeshOrder( anOrder, aResult, false );
+
+ return aResult._retn();
+}
+
+//=============================================================================
+/*!
+ * \brief Set submesh object order
+ * \param theSubMeshArray submesh array order
+ */
+//=============================================================================
+
+::CORBA::Boolean SMESH_Mesh_i::SetMeshOrder(const SMESH::submesh_array_array& theSubMeshArray)
+{
+ if ( _preMeshInfo )
+ _preMeshInfo->ForgetOrLoad();
+
+ bool res = false;
+ ::SMESH_Mesh& mesh = GetImpl();
+
+ TPythonDump aPythonDump; // prevent dump of called methods
+ aPythonDump << "isDone = " << _this() << ".SetMeshOrder( [ ";
+
+ TListOfListOfInt subMeshOrder;
+ for ( int i = 0, n = theSubMeshArray.length(); i < n; i++ )
+ {
+ const SMESH::submesh_array& aSMArray = theSubMeshArray[i];
+ TListOfInt subMeshIds;
+ aPythonDump << "[ ";
+ // Collect subMeshes which should be clear
+ // do it list-by-list, because modification of submesh order
+ // take effect between concurrent submeshes only
+ set<const SMESH_subMesh*> subMeshToClear;
+ list<const SMESH_subMesh*> subMeshList;
+ for ( int j = 0, jn = aSMArray.length(); j < jn; j++ )
+ {
+ const SMESH::SMESH_subMesh_var subMesh = SMESH::SMESH_subMesh::_duplicate(aSMArray[j]);
+ if ( j > 0 )
+ aPythonDump << ", ";
+ aPythonDump << subMesh;
+ subMeshIds.push_back( subMesh->GetId() );
+ // detect common parts of submeshes
+ if ( _mapSubMesh.find(subMesh->GetId()) != _mapSubMesh.end() )
+ findCommonSubMesh( subMeshList, _mapSubMesh[ subMesh->GetId() ], subMeshToClear );
+ }
+ aPythonDump << " ]";
+ subMeshOrder.push_back( subMeshIds );
+
+ // clear collected submeshes
+ set<const SMESH_subMesh*>::iterator clrIt = subMeshToClear.begin();
+ for ( ; clrIt != subMeshToClear.end(); clrIt++ )
+ if ( SMESH_subMesh* sm = (SMESH_subMesh*)*clrIt )
+ sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
+ }
+ aPythonDump << " ])";
+
+ mesh.SetMeshOrder( subMeshOrder );
+ res = true;
+
+ return res;
+}
+
+//=============================================================================
+/*!
+ * \brief Convert submesh ids into submesh interfaces
+ */
+//=============================================================================
+
+void SMESH_Mesh_i::convertMeshOrder (const TListOfListOfInt& theIdsOrder,
+ SMESH::submesh_array_array& theResOrder,
+ const bool theIsDump)
+{
+ int nbSet = theIdsOrder.size();
+ TPythonDump aPythonDump; // prevent dump of called methods
+ if ( theIsDump )
+ aPythonDump << "[ ";
+ theResOrder.length(nbSet);
+ TListOfListOfInt::const_iterator it = theIdsOrder.begin();
+ int listIndx = 0;
+ for( ; it != theIdsOrder.end(); it++ ) {
+ // translate submesh identificators into submesh objects
+ // takeing into account real number of concurrent lists
+ const TListOfInt& aSubOrder = (*it);
+ if (!aSubOrder.size())
+ continue;
+ if ( theIsDump )
+ aPythonDump << "[ ";
+ // convert shape indeces into interfaces
+ SMESH::submesh_array_var aResSubSet = new SMESH::submesh_array();
+ aResSubSet->length(aSubOrder.size());
+ TListOfInt::const_iterator subIt = aSubOrder.begin();
+ for( int j = 0; subIt != aSubOrder.end(); subIt++ ) {
+ if ( _mapSubMeshIor.find(*subIt) == _mapSubMeshIor.end() )
+ continue;
+ SMESH::SMESH_subMesh_var subMesh =
+ SMESH::SMESH_subMesh::_duplicate( _mapSubMeshIor[*subIt] );
+ if ( theIsDump ) {
+ if ( j > 0 )
+ aPythonDump << ", ";
+ aPythonDump << subMesh;
+ }
+ aResSubSet[ j++ ] = subMesh;
+ }
+ if ( theIsDump )
+ aPythonDump << " ]";
+ theResOrder[ listIndx++ ] = aResSubSet;
+ }
+ // correct number of lists
+ theResOrder.length( listIndx );
+
+ if ( theIsDump ) {
+ // finilise python dump
+ aPythonDump << " ]";
+ aPythonDump << " = " << _this() << ".GetMeshOrder()";
+ }
+}
+
+//================================================================================
+//
+// Implementation of SMESH_MeshPartDS
+//
+SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart):
+ SMESHDS_Mesh( /*meshID=*/-1, /*isEmbeddedMode=*/true)
+{
+ SMESH::SMESH_Mesh_var mesh = meshPart->GetMesh();
+ SMESH_Mesh_i* mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
+
+ _meshDS = mesh_i->GetImpl().GetMeshDS();
+
+ SetPersistentId( _meshDS->GetPersistentId() );
+
+ if ( mesh_i == SMESH::DownCast<SMESH_Mesh_i*>( meshPart ))
+ {
+ // <meshPart> is the whole mesh
+ myInfo = _meshDS->GetMeshInfo(); // copy mesh info;
+ // copy groups
+ set<SMESHDS_GroupBase*>& myGroupSet = const_cast<set<SMESHDS_GroupBase*>&>( GetGroups() );
+ myGroupSet = _meshDS->GetGroups();
+ }
+ else
+ {
+ TMeshInfo tmpInfo;
+ SMESH::long_array_var anIDs = meshPart->GetIDs();
+ SMESH::array_of_ElementType_var types = meshPart->GetTypes();
+ if ( types->length() == 1 && types[0] == SMESH::NODE ) // group of nodes
+ {
+ for (int i=0; i < anIDs->length(); i++)
+ if ( const SMDS_MeshNode * n = _meshDS->FindNode(anIDs[i]))
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ else
+ {
+ for (int i=0; i < anIDs->length(); i++)
+ if ( const SMDS_MeshElement * e = _meshDS->FindElement(anIDs[i]))
+ if ( _elements[ e->GetType() ].insert( e ).second )
+ {
+ tmpInfo.Add( e );
+ SMDS_ElemIteratorPtr nIt = e->nodesIterator();
+ while ( nIt->more() )
+ {
+ const SMDS_MeshNode * n = (const SMDS_MeshNode*) nIt->next();
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ }
+ }
+ myInfo = tmpInfo;
+
+ _meshDS = 0; // to enforce iteration on _elements and _nodes
+ }
+}
+// -------------------------------------------------------------------------------------
+SMESH_MeshPartDS::SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & meshPart):
+ SMESHDS_Mesh( /*meshID=*/-1, /*isEmbeddedMode=*/true), _meshDS(0)
+{
+ TMeshInfo tmpInfo;
+ list< const SMDS_MeshElement* >::const_iterator partIt = meshPart.begin();
+ for ( ; partIt != meshPart.end(); ++partIt )
+ if ( const SMDS_MeshElement * e = *partIt )
+ if ( _elements[ e->GetType() ].insert( e ).second )
+ {
+ tmpInfo.Add( e );
+ SMDS_ElemIteratorPtr nIt = e->nodesIterator();
+ while ( nIt->more() )
+ {
+ const SMDS_MeshNode * n = (const SMDS_MeshNode*) nIt->next();
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ }
+ myInfo = tmpInfo;
+}
+// -------------------------------------------------------------------------------------
+SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementGeomIterator(SMDSAbs_GeometryType geomType) const
+{
+ if ( _meshDS ) return _meshDS->elementGeomIterator( geomType );
+
+ typedef SMDS_SetIterator
+ <const SMDS_MeshElement*,
+ TIDSortedElemSet::const_iterator,
+ SMDS::SimpleAccessor<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator>,
+ SMDS_MeshElement::GeomFilter
+ > TIter;
+
+ SMDSAbs_ElementType type = SMDS_MeshCell::toSmdsType( geomType );
+
+ return SMDS_ElemIteratorPtr( new TIter( _elements[type].begin(),
+ _elements[type].end(),
+ SMDS_MeshElement::GeomFilter( geomType )));
+}
+// -------------------------------------------------------------------------------------
+SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementEntityIterator(SMDSAbs_EntityType entity) const
+{
+ if ( _meshDS ) return _meshDS->elementEntityIterator( entity );
+
+ typedef SMDS_SetIterator
+ <const SMDS_MeshElement*,
+ TIDSortedElemSet::const_iterator,
+ SMDS::SimpleAccessor<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator>,
+ SMDS_MeshElement::EntityFilter
+ > TIter;
+
+ SMDSAbs_ElementType type = SMDS_MeshCell::toSmdsType( entity );
+
+ return SMDS_ElemIteratorPtr( new TIter( _elements[type].begin(),
+ _elements[type].end(),
+ SMDS_MeshElement::EntityFilter( entity )));
+}
+// -------------------------------------------------------------------------------------
+SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementsIterator(SMDSAbs_ElementType type) const
+{
+ typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator > TIter;
+ if ( type == SMDSAbs_All && !_meshDS )
+ {
+ typedef vector< SMDS_ElemIteratorPtr > TIterVec;
+ TIterVec iterVec;
+ for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
+ if ( !_elements[i].empty() && i != SMDSAbs_Node )
+ iterVec.push_back
+ ( SMDS_ElemIteratorPtr( new TIter( _elements[i].begin(), _elements[i].end() )));
+
+ typedef SMDS_IteratorOnIterators<const SMDS_MeshElement*, TIterVec > TIterOnIters;
+ return SMDS_ElemIteratorPtr( new TIterOnIters( iterVec ));
+ }
+ return _meshDS ? _meshDS->elementsIterator(type) : SMDS_ElemIteratorPtr
+ ( new TIter( _elements[type].begin(), _elements[type].end() ));
+}
+// -------------------------------------------------------------------------------------
+#define _GET_ITER_DEFINE( iterType, methName, elem, elemType) \
+ iterType SMESH_MeshPartDS::methName( bool idInceasingOrder) const \
+ { \
+ typedef SMDS_SetIterator<const elem*, TIDSortedElemSet::const_iterator > TIter; \
+ return _meshDS ? _meshDS->methName(idInceasingOrder) : iterType \
+ ( new TIter( _elements[elemType].begin(), _elements[elemType].end() )); \
+ }
+// -------------------------------------------------------------------------------------
+_GET_ITER_DEFINE( SMDS_NodeIteratorPtr, nodesIterator, SMDS_MeshNode, SMDSAbs_Node )
+_GET_ITER_DEFINE( SMDS_EdgeIteratorPtr, edgesIterator, SMDS_MeshEdge, SMDSAbs_Edge )
+_GET_ITER_DEFINE( SMDS_FaceIteratorPtr, facesIterator, SMDS_MeshFace, SMDSAbs_Face )
+_GET_ITER_DEFINE( SMDS_VolumeIteratorPtr, volumesIterator, SMDS_MeshVolume, SMDSAbs_Volume)
+#undef _GET_ITER_DEFINE
+//
+// END Implementation of SMESH_MeshPartDS
+//
+//================================================================================
+
+