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);
/*!
* Return type of submesh element
* Returns type of mesh element (same as SMESH_Mesh::GetElementType() )
*/
ElementType GetElementType( in long id, in boolean iselem )
raises (SALOME::SALOME_Exception);

View File

@ -1359,23 +1359,34 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetCentralNode(const SMDS_MeshNode* n1,
bool toCheck = true;
if ( !F.IsNull() && !force3d )
{
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)
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] = {
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] );
TopLoc_Location loc;
Handle( Geom_Surface ) S = BRep_Tool::Surface( F, loc );
P = S->Value( uvAvg.X(), uvAvg.Y() ).Transformed( loc );
uvAvg = calcTFI (0.5, 0.5, uv[0],uv[1],uv[2],uv[3], uv[4],uv[5],uv[6],uv[7] );
}
P = surface->Value( uvAvg );
centralNode = meshDS->AddNode( P.X(), P.Y(), P.Z() );
// if ( mySetElemOnShape ) node is not elem!
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::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
SALOMEDS::SObject_wrap objAfter;
bool isNewSO = false;
if ( SO->_is_nil() )
{
if ( theTag == 0 ) {
SO = aStudyBuilder->NewObject( theFatherObject );
isNewSO = true;
}
else if ( !theFatherObject->FindSubObject( theTag, SO.inout() ))
{
SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag );
isNewSO = true;
// define the next tag after given one in the data tree to insert SObject
SALOMEDS::SObject_wrap curObj;
@ -314,12 +317,13 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy,
// add object to the use case tree
// (to support tree representation customization and drag-n-drop)
if ( !CORBA::is_nil( objAfter ) ) {
useCaseBuilder->InsertBefore( SO, objAfter ); // insert at given tag
} else if ( !useCaseBuilder->IsUseCaseNode( SO ) ) {
useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list
if ( isNewSO )
{
if ( !CORBA::is_nil( objAfter ) )
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();
}
@ -421,7 +425,14 @@ static void addReference (SALOMEDS::Study_ptr theStudy,
// add reference to the use case tree
// (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 );
}
}
@ -940,7 +951,7 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy
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 =
GetMeshOrSubmeshByShape( theStudy, theMesh, theShape );
if ( aMeshOrSubMesh->_is_nil() )