52863: Convert To Bi-Quadratic incorrectly locate in-face central nodes

52865: Wrong order of children under a sub-mesh in the Object Browser
This commit is contained in:
eap 2015-09-08 17:24:05 +03:00
parent 293c27e277
commit 6f7386be59
3 changed files with 47 additions and 25 deletions

View File

@ -1044,7 +1044,7 @@ module SMESH
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Return type of submesh element * Returns type of mesh element (same as SMESH_Mesh::GetElementType() )
*/ */
ElementType GetElementType( in long id, in boolean iselem ) ElementType GetElementType( in long id, in boolean iselem )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);

View File

@ -1359,23 +1359,34 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetCentralNode(const SMDS_MeshNode* n1,
bool toCheck = true; bool toCheck = true;
if ( !F.IsNull() && !force3d ) if ( !F.IsNull() && !force3d )
{ {
gp_XY uv[8] = { Handle(ShapeAnalysis_Surface) surface = GetSurface( F );
GetNodeUV( F,n1, n3, &toCheck ), if ( HasDegeneratedEdges() || surface->HasSingularities( 1e-7 ))
GetNodeUV( F,n2, n4, &toCheck ), {
GetNodeUV( F,n3, n1, &toCheck ), gp_Pnt center = calcTFI (0.5, 0.5, // IPAL0052863
GetNodeUV( F,n4, n2, &toCheck ), SMESH_TNodeXYZ(n1), SMESH_TNodeXYZ(n2),
GetNodeUV( F,n12, n3 ), SMESH_TNodeXYZ(n3), SMESH_TNodeXYZ(n4),
GetNodeUV( F,n23, n4 ), SMESH_TNodeXYZ(n12), SMESH_TNodeXYZ(n23),
GetNodeUV( F,n34, n2 ), SMESH_TNodeXYZ(n34), SMESH_TNodeXYZ(n41));
GetNodeUV( F,n41, n2 ) gp_Pnt2d uv12 = GetNodeUV( F, n12, n3, &toCheck );
}; uvAvg = surface->NextValueOfUV( uv12, center, BRep_Tool::Tolerance( F )).XY();
AdjustByPeriod( F, uv, 8 ); // put uv[] within a period (IPAL52698) }
else
{
gp_XY uv[8] = {
GetNodeUV( F,n1, n3, &toCheck ),
GetNodeUV( F,n2, n4, &toCheck ),
GetNodeUV( F,n3, n1, &toCheck ),
GetNodeUV( F,n4, n2, &toCheck ),
GetNodeUV( F,n12, n3 ),
GetNodeUV( F,n23, n4 ),
GetNodeUV( F,n34, n2 ),
GetNodeUV( F,n41, n2 )
};
AdjustByPeriod( F, uv, 8 ); // put uv[] within a period (IPAL52698)
uvAvg = calcTFI (0.5, 0.5, uv[0],uv[1],uv[2],uv[3], uv[4],uv[5],uv[6],uv[7] ); uvAvg = calcTFI (0.5, 0.5, uv[0],uv[1],uv[2],uv[3], uv[4],uv[5],uv[6],uv[7] );
}
TopLoc_Location loc; P = surface->Value( uvAvg );
Handle( Geom_Surface ) S = BRep_Tool::Surface( F, loc );
P = S->Value( uvAvg.X(), uvAvg.Y() ).Transformed( loc );
centralNode = meshDS->AddNode( P.X(), P.Y(), P.Z() ); centralNode = meshDS->AddNode( P.X(), P.Y(), P.Z() );
// if ( mySetElemOnShape ) node is not elem! // if ( mySetElemOnShape ) node is not elem!
meshDS->SetNodeOnFace( centralNode, faceID, uvAvg.X(), uvAvg.Y() ); meshDS->SetNodeOnFace( centralNode, faceID, uvAvg.X(), uvAvg.Y() );

View File

@ -265,14 +265,17 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy,
SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
SALOMEDS::SObject_wrap objAfter; SALOMEDS::SObject_wrap objAfter;
bool isNewSO = false;
if ( SO->_is_nil() ) if ( SO->_is_nil() )
{ {
if ( theTag == 0 ) { if ( theTag == 0 ) {
SO = aStudyBuilder->NewObject( theFatherObject ); SO = aStudyBuilder->NewObject( theFatherObject );
isNewSO = true;
} }
else if ( !theFatherObject->FindSubObject( theTag, SO.inout() )) else if ( !theFatherObject->FindSubObject( theTag, SO.inout() ))
{ {
SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag ); SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag );
isNewSO = true;
// define the next tag after given one in the data tree to insert SObject // define the next tag after given one in the data tree to insert SObject
SALOMEDS::SObject_wrap curObj; SALOMEDS::SObject_wrap curObj;
@ -314,18 +317,19 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy,
// add object to the use case tree // add object to the use case tree
// (to support tree representation customization and drag-n-drop) // (to support tree representation customization and drag-n-drop)
if ( !CORBA::is_nil( objAfter ) ) { if ( isNewSO )
useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag {
} else if ( !useCaseBuilder->IsUseCaseNode( SO ) ) { if ( !CORBA::is_nil( objAfter ) )
useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag
else if ( !useCaseBuilder->IsUseCaseNode( SO ) )
useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list
} }
return SO._retn(); return SO._retn();
} }
//======================================================================= //=======================================================================
//function : setName //function : setName
//purpose : //purpose :
//======================================================================= //=======================================================================
void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject,
@ -421,7 +425,14 @@ static void addReference (SALOMEDS::Study_ptr theStudy,
// add reference to the use case tree // add reference to the use case tree
// (to support tree representation customization and drag-n-drop) // (to support tree representation customization and drag-n-drop)
SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
SALOMEDS::UseCaseIterator_wrap useCaseIter = useCaseBuilder->GetUseCaseIterator(theSObject);
for ( ; useCaseIter->More(); useCaseIter->Next() )
{
SALOMEDS::SObject_wrap curSO = useCaseIter->Value();
if ( curSO->Tag() == theTag )
return;
}
useCaseBuilder->AppendTo( theSObject, aReferenceSO ); useCaseBuilder->AppendTo( theSObject, aReferenceSO );
} }
} }
@ -940,7 +951,7 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy
CORBA::String_var hypEntry = aHypSO->GetID(); CORBA::String_var hypEntry = aHypSO->GetID();
// Find a mesh or submesh refering to theShape // Find a mesh or sub-mesh referring to theShape
SALOMEDS::SObject_wrap aMeshOrSubMesh = SALOMEDS::SObject_wrap aMeshOrSubMesh =
GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); GetMeshOrSubmeshByShape( theStudy, theMesh, theShape );
if ( aMeshOrSubMesh->_is_nil() ) if ( aMeshOrSubMesh->_is_nil() )