{
MESSAGE("StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D");
_name = "Quadrangle_2D";
- // _shapeType = TopAbs_FACE;
_shapeType = (1 << TopAbs_FACE);
+ _compatibleHypothesis.push_back("QuadranglePreference");
}
//=============================================================================
//=============================================================================
bool StdMeshers_Quadrangle_2D::CheckHypothesis
- (SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
+ (SMESH_Mesh& aMesh,
+ const TopoDS_Shape& aShape,
SMESH_Hypothesis::Hypothesis_Status& aStatus)
{
- //MESSAGE("StdMeshers_Quadrangle_2D::CheckHypothesis");
-
bool isOk = true;
aStatus = SMESH_Hypothesis::HYP_OK;
- // nothing to check
+ // there is only one compatible Hypothesis so far
+ const list <const SMESHDS_Hypothesis * >&hyps = GetUsedHypothesis(aMesh, aShape);
+ myQuadranglePreference = hyps.size() > 0;
return isOk;
}
int nbdown = quad->nbPts[0];
int nbup = quad->nbPts[2];
-// bool isDownOut = (nbdown > nbup);
-// bool isUpOut = (nbdown < nbup);
int nbright = quad->nbPts[1];
int nbleft = quad->nbPts[3];
-// bool isRightOut = (nbright > nbleft);
-// bool isLeftOut = (nbright < nbleft);
int nbhoriz = Min(nbdown, nbup);
int nbvertic = Min(nbright, nbleft);
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
// internal mesh nodes
- int i, j;
+ int i, j, geomFaceID = meshDS->ShapeToIndex( F );
for (i = 1; i < nbhoriz - 1; i++) {
for (j = 1; j < nbvertic - 1; j++) {
int ij = j * nbhoriz + i;
double v = quad->uv_grid[ij].v;
gp_Pnt P = S->Value(u, v);
SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(node, F);
+ meshDS->SetNodeOnFace(node, geomFaceID, u, v);
quad->uv_grid[ij].node = node;
- SMDS_FacePosition* fpos =
- dynamic_cast<SMDS_FacePosition*>(node->GetPosition().get());
- fpos->SetUParameter(u);
- fpos->SetVParameter(v);
}
}
if (quad->isEdgeOut[0]) { jlow++; } else { if (quad->isEdgeOut[2]) jup--; }
// regular quadrangles
- // bool isQuadForward = ( faceIsForward == quad->isEdgeForward[0]);
for (i = ilow; i < iup; i++) {
for (j = jlow; j < jup; j++) {
const SMDS_MeshNode *a, *b, *c, *d;
b = quad->uv_grid[j * nbhoriz + i + 1].node;
c = quad->uv_grid[(j + 1) * nbhoriz + i + 1].node;
d = quad->uv_grid[(j + 1) * nbhoriz + i].node;
- // if (isQuadForward) faceId = meshDS->AddFace(a,b,c,d);
- // else faceId = meshDS->AddFace(a,d,c,b);
SMDS_MeshFace * face = meshDS->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
if (near == g) { // make triangle
SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
} else { // make quadrangle
if (near - 1 < ilow)
d = uv_e3[1].node;
else
d = quad->uv_grid[nbhoriz + near - 1].node;
SMDS_MeshFace* face = meshDS->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
// if node d is not at position g - make additional triangles
if (near - 1 > g) {
else
d = quad->uv_grid[nbhoriz + k - 1].node;
SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
if (near == g) { // make triangle
SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
} else { // make quadrangle
if (near + 1 > iup)
d = uv_e1[nbright - 2].node;
else
d = quad->uv_grid[nbhoriz*(nbvertic - 2) + near + 1].node;
SMDS_MeshFace* face = meshDS->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
if (near + 1 < g) { // if d not is at g - make additional triangles
for (int k = near + 1; k < g; k++) {
else
d = quad->uv_grid[nbhoriz*(nbvertic - 2) + k + 1].node;
SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
if (near == g) { // make triangle
SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
} else { // make quadrangle
if (near - 1 < jlow)
d = uv_e0[nbdown - 2].node;
else
d = quad->uv_grid[nbhoriz*near - 2].node;
SMDS_MeshFace* face = meshDS->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
if (near - 1 > g) { // if d not is at g - make additional triangles
for (int k = near - 1; k > g; k--) {
else
d = quad->uv_grid[nbhoriz*k - 2].node;
SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
if (near == g) { // make triangle
SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
} else { // make quadrangle
if (near + 1 > jup)
d = uv_e2[1].node;
else
d = quad->uv_grid[nbhoriz*(near + 1) + 1].node;
SMDS_MeshFace* face = meshDS->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
if (near + 1 < g) { // if d not is at g - make additional triangles
for (int k = near + 1; k < g; k++) {
else
d = quad->uv_grid[nbhoriz*(k + 1) + 1].node;
SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, F);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
{
Unexpect aCatch(SalomeException);
- //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
-
const TopoDS_Face & F = TopoDS::Face(aShape);
// verify 1 wire only, with 4 edges
{
//MESSAGE("StdMeshers_Quadrangle_2D::LoadEdgePoints");
- //SMDS_Mesh* meshDS = aMesh.GetMeshDS();
-
// --- IDNodes of first and last Vertex
TopoDS_Vertex VFirst, VLast;