#include "SMESH_ProxyMesh.hxx"
#include "SMESH_subMesh.hxx"
#include "SMESH_subMeshEventListener.hxx"
+#include "StdMeshers_FaceSide.hxx"
#include <BRepAdaptor_Curve2d.hxx>
#include <BRep_Tool.hxx>
bool isConcave( const TopoDS_Face& F, SMESH_MesherHelper& helper )
{
+ // if ( helper.Count( F, TopAbs_WIRE, /*useMap=*/false) > 1 )
+ // return true;
gp_Vec2d drv1, drv2;
gp_Pnt2d p;
TopExp_Explorer eExp( F.Oriented( TopAbs_FORWARD ), TopAbs_EDGE );
for ( ; eExp.More(); eExp.Next() )
{
const TopoDS_Edge& E = TopoDS::Edge( eExp.Current() );
- if ( BRep_Tool::Degenerated( E )) continue;
+ if ( SMESH_Algo::isDegenerated( E )) continue;
// check if 2D curve is concave
BRepAdaptor_Curve2d curve( E, F );
const int nbIntervals = curve.NbIntervals( GeomAbs_C2 );
double u1 = intervals( i );
double u2 = intervals( i+1 );
curve.D2( 0.5*( u1+u2 ), p, drv1, drv2 );
- double cross = drv2 ^ drv1;
+ double cross = drv2 * drv1; //drv2 ^ drv1;
if ( E.Orientation() == TopAbs_REVERSED )
cross = -cross;
- isConvex = ( cross < 1e-9 );
+ isConvex = ( cross > -1e-9 );
}
// check if concavity is strong enough to care about it
//const double maxAngle = 5 * Standard_PI180;
// }
}
}
+ // check angles at VERTEXes
+ TError error;
+ TSideVector wires = StdMeshers_FaceSide::GetFaceWires( F, *helper.GetMesh(), 0, error );
+ for ( size_t iW = 0; iW < wires.size(); ++iW )
+ {
+ const int nbEdges = wires[iW]->NbEdges();
+ if ( nbEdges < 2 && SMESH_Algo::isDegenerated( wires[iW]->Edge(0)))
+ continue;
+ for ( int iE1 = 0; iE1 < nbEdges; ++iE1 )
+ {
+ if ( SMESH_Algo::isDegenerated( wires[iW]->Edge( iE1 ))) continue;
+ int iE2 = ( iE1 + 1 ) % nbEdges;
+ while ( SMESH_Algo::isDegenerated( wires[iW]->Edge( iE2 )))
+ iE2 = ( iE2 + 1 ) % nbEdges;
+ double angle = helper.GetAngle( wires[iW]->Edge( iE1 ),
+ wires[iW]->Edge( iE2 ), F );
+ if ( angle < -5. * M_PI / 180. )
+ return true;
+ }
+ }
return false;
}
//--------------------------------------------------------------------------------
const char* fname = "/tmp/viscous.py";
cout << "execfile('"<<fname<<"')"<<endl;
py = new ofstream(fname);
- *py << "from smesh import *" << endl
- << "meshSO = GetCurrentStudy().FindObjectID('0:1:2:3')" << endl
- << "mesh = Mesh( meshSO.GetObject() )"<<endl;
+ *py << "import SMESH" << endl
+ << "from salome.smesh import smeshBuilder" << endl
+ << "smesh = smeshBuilder.New(salome.myStudy)" << endl
+ << "meshSO = smesh.GetCurrentStudy().FindObjectID('0:1:2:3')" << endl
+ << "mesh = smesh.Mesh( meshSO.GetObject() )"<<endl;
}
void Finish() {
if (py)
if ( F.IsNull() ) // 3D
{
+ if ( data._edges[iFrom]->_2neibors->_nodes[0] ==
+ data._edges[iTo-1]->_2neibors->_nodes[1] )
+ return true; // closed EDGE - nothing to do
+
return false; // TODO ???
}
else // 2D
= isConcaveFace ? _SmoothNode::CENTROIDAL : _SmoothNode::LAPLACIAN;
while ( shrinked )
{
+ shriStep++;
// Move boundary nodes (actually just set new UV)
// -----------------------------------------------
- dumpFunction(SMESH_Comment("moveBoundaryOnF")<<f2sd->first<<"_st"<<shriStep++ ); // debug
+ dumpFunction(SMESH_Comment("moveBoundaryOnF")<<f2sd->first<<"_st"<<shriStep ); // debug
shrinked = false;
for ( unsigned i = 0; i < lEdges.size(); ++i )
{
}
if ( badNb > 0 )
return error(SMESH_Comment("Can't shrink 2D mesh on face ") << f2sd->first );
+ if ( shriStep > 200 )
+ return error(SMESH_Comment("Infinite loop at shrinking 2D mesh on face ") << f2sd->first );
}
// No wrongly shaped faces remain; final smooth. Set node XYZ.