PortableServer::ObjectId* contId,
const char* instanceName,
const char* interfaceName )
- : Engines_Component_i( orb, poa, contId, instanceName, interfaceName )
+ : Engines_Component_i( orb, poa, contId, instanceName, interfaceName )
{
MESSAGE( "SMESH_Gen_i::SMESH_Gen_i : standard constructor" );
SMESH_Hypothesis_i* myHypothesis_i = 0;
SMESH::SMESH_Hypothesis_var hypothesis_i;
std::string aPlatformLibName;
- typedef GenericHypothesisCreator_i* (*GetHypothesisCreator)(const char* );
- GenericHypothesisCreator_i* aCreator = getHypothesisCreator(theHypName, theLibName, aPlatformLibName);
- // create a new hypothesis object, store its ref. in studyContext
- if(MYDEBUG) MESSAGE("Create Hypothesis " << theHypName);
- myHypothesis_i =
- myHypCreatorMap[string(theHypName)]->Create(myPoa, GetCurrentStudyID(), &myGen);
- myHypothesis_i->SetLibName(aPlatformLibName.c_str()); // for persistency assurance
+ GenericHypothesisCreator_i* aCreator =
+ getHypothesisCreator(theHypName, theLibName, aPlatformLibName);
- if (!myHypothesis_i)
- return hypothesis_i._retn();
-
- // activate the CORBA servant of hypothesis
- hypothesis_i = myHypothesis_i->_this();
- int nextId = RegisterObject( hypothesis_i );
- if(MYDEBUG) { MESSAGE( "Add hypo to map with id = "<< nextId ); }
- else { nextId = 0; } // avoid "unused variable" warning in release mode
+ // create a new hypothesis object, store its ref. in studyContext
+ myHypothesis_i = aCreator->Create(myPoa, GetCurrentStudyID(), &myGen);
+ if (myHypothesis_i)
+ {
+ myHypothesis_i->SetLibName(aPlatformLibName.c_str()); // for persistency assurance
+ myHypCreatorMap[ myHypothesis_i->GetName() ] = aCreator;
+ // activate the CORBA servant of hypothesis
+ hypothesis_i = myHypothesis_i->_this();
+ int nextId = RegisterObject( hypothesis_i );
+ if(MYDEBUG) { MESSAGE( "Add hypo to map with id = "<< nextId ); }
+ else { nextId = 0; } // avoid "unused variable" warning in release mode
+ }
return hypothesis_i._retn();
}
*/
//=============================================================================
SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh()
- throw ( SALOME::SALOME_Exception )
+ throw ( SALOME::SALOME_Exception )
{
Unexpect aCatch(SALOME_SalomeException);
if(MYDEBUG) MESSAGE( "SMESH_Gen_i::createMesh" );
SALOMEDS::Study_ptr SMESH_Gen_i::GetCurrentStudy()
{
if(MYDEBUG) MESSAGE( "SMESH_Gen_i::GetCurrentStudy: study Id = " << GetCurrentStudyID() );
+ if ( GetCurrentStudyID() < 0 )
+ return SALOMEDS::Study::_nil();
return SALOMEDS::Study::_duplicate( myCurrentStudy );
}
StudyContext* SMESH_Gen_i::GetCurrentStudyContext()
{
if ( !CORBA::is_nil( myCurrentStudy ) &&
- myStudyContextMap.find( GetCurrentStudyID() ) != myStudyContextMap.end() )
+ myStudyContextMap.find( GetCurrentStudyID() ) != myStudyContextMap.end() )
return myStudyContextMap[ myCurrentStudy->StudyId() ];
else
return 0;
SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::CreateHypothesis( const char* theHypName,
const char* theLibName )
- throw ( SALOME::SALOME_Exception )
+ throw ( SALOME::SALOME_Exception )
{
Unexpect aCatch(SALOME_SalomeException);
// Create hypothesis/algorithm
return SMESH::SMESH_Hypothesis::_nil();
}
+//=============================================================================
+/*!
+ * Returns \c True if a hypothesis is assigned to a sole sub-mesh in a current Study
+ * \param [in] theHyp - the hypothesis of interest
+ * \param [out] theMesh - the sole mesh using \a theHyp
+ * \param [out] theShape - the sole geometry \a theHyp is assigned to
+ * \return boolean - \c True if \a theMesh and \a theShape are sole using \a theHyp
+ *
+ * If two meshes on same shape have theHyp assigned to the same sub-shape, they are
+ * considered as SAME sub-mesh => result is \c true.
+ * This method ids used to initialize SMESHGUI_GenericHypothesisCreator with
+ * a shape to which an hyp being edited is assigned.
+ */
+//=============================================================================
+
+CORBA::Boolean SMESH_Gen_i::GetSoleSubMeshUsingHyp( SMESH::SMESH_Hypothesis_ptr theHyp,
+ SMESH::SMESH_Mesh_out theMesh,
+ GEOM::GEOM_Object_out theShape)
+{
+ if ( GetCurrentStudyID() < 0 || CORBA::is_nil( theHyp ))
+ return false;
+
+ // get Mesh component SO
+ CORBA::String_var compDataType = ComponentDataType();
+ SALOMEDS::SComponent_wrap comp = myCurrentStudy->FindComponent( compDataType.in() );
+ if ( CORBA::is_nil( comp ))
+ return false;
+
+ // look for child SO of meshes
+ SMESH::SMESH_Mesh_var foundMesh;
+ TopoDS_Shape foundShape;
+ bool isSole = true;
+ SALOMEDS::ChildIterator_wrap meshIter = myCurrentStudy->NewChildIterator( comp );
+ for ( ; meshIter->More() && isSole; meshIter->Next() )
+ {
+ SALOMEDS::SObject_wrap curSO = meshIter->Value();
+ CORBA::Object_var obj = SObjectToObject( curSO );
+ SMESH_Mesh_i* mesh_i = SMESH::DownCast< SMESH_Mesh_i* >( obj );
+ if ( ! mesh_i )
+ continue;
+
+ // look for a sole shape where theHyp is assigned
+ bool isHypFound = false;
+ const ShapeToHypothesis & s2hyps = mesh_i->GetImpl().GetMeshDS()->GetHypotheses();
+ ShapeToHypothesis::Iterator s2hypsIt( s2hyps );
+ for ( ; s2hypsIt.More() && isSole; s2hypsIt.Next() )
+ {
+ const THypList& hyps = s2hypsIt.Value();
+ THypList::const_iterator h = hyps.begin();
+ for ( ; h != hyps.end(); ++h )
+ if ( (*h)->GetID() == theHyp->GetId() )
+ break;
+ if ( h != hyps.end()) // theHyp found
+ {
+ isHypFound = true;
+ if ( ! foundShape.IsNull() &&
+ ! foundShape.IsSame( s2hypsIt.Key() )) // not a sole sub-shape
+ {
+ foundShape.Nullify();
+ isSole = false;
+ break;
+ }
+ foundShape = s2hypsIt.Key();
+ }
+ } // loop on assigned hyps
+
+ if ( isHypFound && !foundShape.IsNull() ) // a mesh using theHyp is found
+ {
+ if ( !foundMesh->_is_nil() ) // not a sole mesh
+ {
+ GEOM::GEOM_Object_var s1 = mesh_i ->GetShapeToMesh();
+ GEOM::GEOM_Object_var s2 = foundMesh->GetShapeToMesh();
+ if ( ! ( isSole = s1->IsSame( s2 )))
+ break;
+ }
+ foundMesh = SMESH::SMESH_Mesh::_narrow( obj );
+ }
+
+ } // loop on meshes
+
+ if ( isSole &&
+ ! foundMesh->_is_nil() &&
+ ! foundShape.IsNull() )
+ {
+ theMesh = foundMesh._retn();
+ theShape = ShapeToGeomObject( foundShape );
+ return ( !theMesh->_is_nil() && !theShape->_is_nil() );
+ }
+ return false;
+}
+
//=============================================================================
/*!
* Sets number of segments per diagonal of boundary box of geometry by which
aPythonDump << "([";
if (theStatus == SMESH::DRS_OK) {
- SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
- aStudyBuilder->NewCommand(); // There is a transaction
+ SALOMEDS::StudyBuilder_var aStudyBuilder;
+ if ( GetCurrentStudyID() > -1 )
+ {
+ aStudyBuilder = myCurrentStudy->NewBuilder();
+ aStudyBuilder->NewCommand(); // There is a transaction
+ }
aResult->length( aNames.size() );
int i = 0;
// Iterate through all meshes and create mesh objects
- for ( list<string>::iterator it = aNames.begin(); it != aNames.end(); it++ ) {
+ for ( list<string>::iterator it = aNames.begin(); it != aNames.end(); it++ )
+ {
// Python Dump
if (i > 0) aPythonDump << ", ";
aResult[i++] = SMESH::SMESH_Mesh::_duplicate( mesh );
meshServant->GetImpl().GetMeshDS()->Modified();
}
- aStudyBuilder->CommitCommand();
+ if ( !aStudyBuilder->_is_nil() )
+ aStudyBuilder->CommitCommand();
}
// Update Python script
// if ( sm->GetSubShape().ShapeType() == TopAbs_VERTEX )
// break;
SMESH_ComputeErrorPtr error = sm->GetComputeError();
- if ( error && !error->IsOK() && error->myAlgo )
+ if ( error && !error->IsOK() )
{
+ if ( !( error->myAlgo ) &&
+ !( error->myAlgo = sm->GetAlgo() ))
+ continue;
SMESH::ComputeError & errStruct = error_array[ nbErr++ ];
errStruct.code = -( error->myName < 0 ? error->myName + 1: error->myName ); // -1 -> 0
errStruct.comment = error->myComment.c_str();
myLocMesh.ShapeToMesh( nullShape ); // remove shape referring data
}
- if ( !mySMESHDSMesh->SubMeshes().empty() )
+ SMESHDS_SubMeshIteratorPtr smIt = mySMESHDSMesh->SubMeshes();
+ if ( smIt->more() )
{
// Store submeshes
// ----------------
// each element belongs to one or none submesh,
// so for each node/element, we store a submesh ID
- // Make maps of submesh IDs of elements sorted by element IDs
- // typedef int TElemID;
- // typedef int TSubMID;
- // map< TElemID, TSubMID > eId2smId, nId2smId;
- const map<int,SMESHDS_SubMesh*>& aSubMeshes = mySMESHDSMesh->SubMeshes();
- map<int,SMESHDS_SubMesh*>::const_iterator itSubM ( aSubMeshes.begin() );
- // SMDS_NodeIteratorPtr itNode;
- // SMDS_ElemIteratorPtr itElem;
- // for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ )
- // {
- // TSubMID aSubMeID = itSubM->first;
- // SMESHDS_SubMesh* aSubMesh = itSubM->second;
- // if ( aSubMesh->IsComplexSubmesh() )
- // continue; // sub-mesh containing other sub-meshes
- // // nodes
- // for ( itNode = aSubMesh->GetNodes(); itNode->more(); ++hint)
- // nId2smId.insert( nId2smId.back(), make_pair( itNode->next()->GetID(), aSubMeID ));
- // // elements
- // for ( itElem = aSubMesh->GetElements(); itElem->more(); ++hint)
- // hint = eId2smId.insert( eId2smId.back(), make_pair( itElem->next()->GetID(), aSubMeID ));
- // }
-
- // // Care of elements that are not on submeshes
- // if ( mySMESHDSMesh->NbNodes() != nId2smId.size() ) {
- // for ( itNode = mySMESHDSMesh->nodesIterator(); itNode->more(); )
- // /* --- stl_map.h says : */
- // /* A %map relies on unique keys and thus a %pair is only inserted if its */
- // /* first element (the key) is not already present in the %map. */
- // nId2smId.insert( make_pair( itNode->next()->GetID(), 0 ));
- // }
- // int nbElems = mySMESHDSMesh->GetMeshInfo().NbElements();
- // if ( nbElems != eId2smId.size() ) {
- // for ( itElem = mySMESHDSMesh->elementsIterator(); itElem->more(); )
- // eId2smId.insert( make_pair( itElem->next()->GetID(), 0 ));
- // }
-
// Store submesh IDs
for ( int isNode = 0; isNode < 2; ++isNode )
{
- // map< TElemID, TSubMID >& id2smId = isNode ? nId2smId : eId2smId;
- // if ( id2smId.empty() ) continue;
- // map< TElemID, TSubMID >::const_iterator id_smId = id2smId.begin();
- // // make and fill array of submesh IDs
- // int* smIDs = new int [ id2smId.size() ];
- // for ( int i = 0; id_smId != id2smId.end(); ++id_smId, ++i )
- // smIDs[ i ] = id_smId->second;
SMDS_ElemIteratorPtr eIt =
mySMESHDSMesh->elementsIterator( isNode ? SMDSAbs_Node : SMDSAbs_All );
int nbElems = isNode ? mySMESHDSMesh->NbNodes() : mySMESHDSMesh->GetMeshInfo().NbElements();
int nbEdgeNodes = 0, nbFaceNodes = 0;
list<SMESHDS_SubMesh*> aEdgeSM, aFaceSM;
// loop on SMESHDS_SubMesh'es
- for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ )
+ while ( smIt->more() )
{
- SMESHDS_SubMesh* aSubMesh = (*itSubM).second;
+ SMESHDS_SubMesh* aSubMesh = const_cast< SMESHDS_SubMesh* >( smIt->next() );
if ( aSubMesh->IsComplexSubmesh() )
continue; // submesh containing other submeshs
int nbNodes = aSubMesh->NbNodes();
if ( nbNodes == 0 ) continue;
- int aShapeID = (*itSubM).first;
+ int aShapeID = aSubMesh->GetID();
if ( aShapeID < 1 || aShapeID > mySMESHDSMesh->MaxShapeIndex() )
continue;
int aShapeType = mySMESHDSMesh->IndexToShape( aShapeID ).ShapeType();
useCaseBuilder->AppendTo( where, sobj ); // append to the end of list
}
}
-//=================================================================================
-// function : IsApplicable
-// purpose : Return true if algorithm can be applied
-//=================================================================================
+//================================================================================
+/*!
+ * \brief Returns true if algorithm can be used to mesh a given geometry
+ * \param [in] theAlgoType - the algorithm type
+ * \param [in] theLibName - a name of the Plug-in library implementing the algorithm
+ * \param [in] theGeomObject - the geometry to mesh
+ * \param [in] toCheckAll - if \c True, returns \c True if all shapes are meshable,
+ * else, returns \c True if at least one shape is meshable
+ * \return CORBA::Boolean - can or can't
+ */
+//================================================================================
+
CORBA::Boolean SMESH_Gen_i::IsApplicable ( const char* theAlgoType,
const char* theLibName,
GEOM::GEOM_Object_ptr theGeomObject,
std::string aPlatformLibName;
typedef GenericHypothesisCreator_i* (*GetHypothesisCreator)(const char*);
- GenericHypothesisCreator_i* aCreator = getHypothesisCreator(theAlgoType, theLibName, aPlatformLibName);
+ GenericHypothesisCreator_i* aCreator =
+ getHypothesisCreator(theAlgoType, theLibName, aPlatformLibName);
if (aCreator)
{
TopoDS_Shape shape = GeomObjectToShape( theGeomObject );