+//================================================================================
+/*!
+ * \brief Find SObject for an algo
+ */
+//================================================================================
+
+SALOMEDS::SObject_ptr SMESH_Gen_i::GetAlgoSO(const ::SMESH_Algo* algo)
+{
+ if ( algo ) {
+ if ( !myCurrentStudy->_is_nil() ) {
+ // find algo in the study
+ SALOMEDS::SComponent_var father = SALOMEDS::SComponent::_narrow
+ ( myCurrentStudy->FindComponent( ComponentDataType() ) );
+ if ( !father->_is_nil() ) {
+ SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( father );
+ for ( ; itBig->More(); itBig->Next() ) {
+ SALOMEDS::SObject_var gotBranch = itBig->Value();
+ if ( gotBranch->Tag() == GetAlgorithmsRootTag() ) {
+ SALOMEDS::ChildIterator_var algoIt = myCurrentStudy->NewChildIterator( gotBranch );
+ for ( ; algoIt->More(); algoIt->Next() ) {
+ SALOMEDS::SObject_var algoSO = algoIt->Value();
+ CORBA::Object_var algoIOR = SObjectToObject( algoSO );
+ if ( !CORBA::is_nil( algoIOR )) {
+ SMESH_Hypothesis_i* impl = SMESH::DownCast<SMESH_Hypothesis_i*>( algoIOR );
+ if ( impl && impl->GetImpl() == algo )
+ return algoSO._retn();
+ }
+ } // loop on algo SO's
+ break;
+ } // if algo tag
+ } // SMESH component iterator
+ }
+ }
+ }
+ return SALOMEDS::SObject::_nil();
+}
+
+//================================================================================
+/*!
+ * \brief Return errors of mesh computation
+ */
+//================================================================================
+
+SMESH::compute_error_array* SMESH_Gen_i::GetComputeErrors( SMESH::SMESH_Mesh_ptr theMesh,
+ GEOM::GEOM_Object_ptr theSubObject )
+ throw ( SALOME::SALOME_Exception )
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if(MYDEBUG) MESSAGE( "SMESH_Gen_i::GetComputeErrors()" );
+
+ if ( CORBA::is_nil( theSubObject ) )
+ THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference", SALOME::BAD_PARAM );
+
+ if ( CORBA::is_nil( theMesh ) )
+ THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference",SALOME::BAD_PARAM );
+
+ SMESH::compute_error_array_var error_array = new SMESH::compute_error_array;
+ try {
+ if ( SMESH_Mesh_i* meshServant = SMESH::DownCast<SMESH_Mesh_i*>( theMesh ))
+ {
+ TopoDS_Shape shape = GeomObjectToShape( theSubObject );
+ ::SMESH_Mesh& mesh = meshServant->GetImpl();
+
+ error_array->length( mesh.GetMeshDS()->MaxShapeIndex() );
+ int nbErr = 0;
+
+ SMESH_subMesh *sm = mesh.GetSubMesh(shape);
+ const bool includeSelf = true, complexShapeFirst = true;
+ SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(includeSelf,
+ complexShapeFirst);
+ while ( smIt->more() )
+ {
+ sm = smIt->next();
+ if ( sm->GetSubShape().ShapeType() == TopAbs_VERTEX )
+ break;
+ SMESH_ComputeErrorPtr error = sm->GetComputeError();
+ if ( error && !error->IsOK() && error->myAlgo )
+ {
+ SMESH::ComputeError & errStruct = error_array[ nbErr++ ];
+ errStruct.code = -( error->myName < 0 ? error->myName + 1: error->myName ); // -1 -> 0
+ errStruct.comment = error->myComment.c_str();
+ errStruct.subShapeID = sm->GetId();
+ SALOMEDS::SObject_var algoSO = GetAlgoSO( error->myAlgo );
+ if ( !algoSO->_is_nil() )
+ errStruct.algoName = algoSO->GetName();
+ else
+ errStruct.algoName = error->myAlgo->GetName();
+ }
+ }
+ error_array->length( nbErr );
+ }
+ }
+ catch ( SALOME_Exception& S_ex ) {
+ INFOS( "catch exception "<< S_ex.what() );
+ }
+
+ return error_array._retn();
+}
+