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

@ -1358,6 +1358,19 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetCentralNode(const SMDS_MeshNode* n1,
gp_Pnt P; gp_Pnt P;
bool toCheck = true; bool toCheck = true;
if ( !F.IsNull() && !force3d ) if ( !F.IsNull() && !force3d )
{
Handle(ShapeAnalysis_Surface) surface = GetSurface( F );
if ( HasDegeneratedEdges() || surface->HasSingularities( 1e-7 ))
{
gp_Pnt center = calcTFI (0.5, 0.5, // IPAL0052863
SMESH_TNodeXYZ(n1), SMESH_TNodeXYZ(n2),
SMESH_TNodeXYZ(n3), SMESH_TNodeXYZ(n4),
SMESH_TNodeXYZ(n12), SMESH_TNodeXYZ(n23),
SMESH_TNodeXYZ(n34), SMESH_TNodeXYZ(n41));
gp_Pnt2d uv12 = GetNodeUV( F, n12, n3, &toCheck );
uvAvg = surface->NextValueOfUV( uv12, center, BRep_Tool::Tolerance( F )).XY();
}
else
{ {
gp_XY uv[8] = { gp_XY uv[8] = {
GetNodeUV( F,n1, n3, &toCheck ), GetNodeUV( F,n1, n3, &toCheck ),
@ -1372,10 +1385,8 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetCentralNode(const SMDS_MeshNode* n1,
AdjustByPeriod( F, uv, 8 ); // put uv[] within a period (IPAL52698) 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,12 +317,13 @@ 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 )
{
if ( !CORBA::is_nil( objAfter ) )
useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag
} else if ( !useCaseBuilder->IsUseCaseNode( SO ) ) { else if ( !useCaseBuilder->IsUseCaseNode( SO ) )
useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list
} }
return SO._retn(); return SO._retn();
} }
@ -422,6 +426,13 @@ 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() )