#include "StdMeshers_FaceSide.hxx"
+#include "StdMeshers_QuadrangleParams.hxx"
+
#include "SMESH_Gen.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_subMesh.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx"
-#include <BRepTools_WireExplorer.hxx>
#include <BRep_Tool.hxx>
#include <Geom_Surface.hxx>
#include <NCollection_DefineArray2.hxx>
#include <TColStd_SequenceOfReal.hxx>
#include <TColgp_SequenceOfXY.hxx>
#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopTools_MapOfShape.hxx>
#include <TopoDS.hxx>
#include "utilities.h"
*/
//=============================================================================
-StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D (int hypId, int studyId, SMESH_Gen* gen)
+StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D (int hypId, int studyId,
+ SMESH_Gen* gen)
: SMESH_2D_Algo(hypId, studyId, gen)
{
MESSAGE("StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D");
_name = "Quadrangle_2D";
_shapeType = (1 << TopAbs_FACE);
+ _compatibleHypothesis.push_back("QuadrangleParams");
_compatibleHypothesis.push_back("QuadranglePreference");
_compatibleHypothesis.push_back("TrianglePreference");
myTool = 0;
bool isOk = true;
aStatus = SMESH_Hypothesis::HYP_OK;
-
- const list <const SMESHDS_Hypothesis * >&hyps = GetUsedHypothesis(aMesh, aShape, false);
+ const list <const SMESHDS_Hypothesis * >&hyps =
+ GetUsedHypothesis(aMesh, aShape, false);
const SMESHDS_Hypothesis *theHyp = 0;
- if(hyps.size() > 0){
- theHyp = *hyps.begin();
+ if( hyps.size() == 1 ) {
+ myTriaVertexID = -1;
+ theHyp = hyps.front();
+ if(strcmp("QuadrangleParams", theHyp->GetName()) == 0) {
+ const StdMeshers_QuadrangleParams* theHyp1 =
+ (const StdMeshers_QuadrangleParams*)theHyp;
+ myTriaVertexID = theHyp1->GetTriaVertex();
+ myQuadranglePreference= false;
+ myTrianglePreference= false;
+ }
if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) {
myQuadranglePreference= true;
myTrianglePreference= false;
+ myTriaVertexID = -1;
}
else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){
myQuadranglePreference= false;
myTrianglePreference= true;
+ myTriaVertexID = -1;
}
}
+
+ else if( hyps.size() > 1 ) {
+ theHyp = hyps.front();
+ if(strcmp("QuadrangleParams", theHyp->GetName()) == 0) {
+ const StdMeshers_QuadrangleParams* theHyp1 =
+ (const StdMeshers_QuadrangleParams*)theHyp;
+ myTriaVertexID = theHyp1->GetTriaVertex();
+ theHyp = hyps.back();
+ if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) {
+ myQuadranglePreference= true;
+ myTrianglePreference= false;
+ }
+ else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){
+ myQuadranglePreference= false;
+ myTrianglePreference= true;
+ }
+ }
+ else {
+ if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) {
+ myQuadranglePreference= true;
+ myTrianglePreference= false;
+ }
+ else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){
+ myQuadranglePreference= false;
+ myTrianglePreference= true;
+ }
+ const StdMeshers_QuadrangleParams* theHyp2 =
+ (const StdMeshers_QuadrangleParams*)hyps.back();
+ myTriaVertexID = theHyp2->GetTriaVertex();
+ }
+ }
+
else {
myQuadranglePreference = false;
myTrianglePreference = false;
+ myTriaVertexID = -1;
}
+
return isOk;
}
c = quad->uv_grid[(j + 1) * nbhoriz + i + 1].node;
d = quad->uv_grid[(j + 1) * nbhoriz + i].node;
SMDS_MeshFace* face = myTool->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) {
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
+ }
}
}
}
if (near == g) { // make triangle
- //SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
SMDS_MeshFace* face = myTool->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else { // make quadrangle
if (near - 1 < ilow)
if(!myTrianglePreference){
SMDS_MeshFace* face = myTool->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else {
SplitQuad(meshDS, geomFaceID, a, b, c, d);
d = uv_e3[1].node;
else
d = quad->uv_grid[nbhoriz + k - 1].node;
- //SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
SMDS_MeshFace* face = myTool->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
}
if (near == g) { // make triangle
- //SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
SMDS_MeshFace* face = myTool->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else { // make quadrangle
if (near + 1 > iup)
//SMDS_MeshFace* face = meshDS->AddFace(a, b, c, d);
if(!myTrianglePreference){
SMDS_MeshFace* face = myTool->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else {
SplitQuad(meshDS, geomFaceID, a, b, c, d);
d = uv_e1[nbright - 2].node;
else
d = quad->uv_grid[nbhoriz*(nbvertic - 2) + k + 1].node;
- //SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
SMDS_MeshFace* face = myTool->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
}
if (near == g) { // make triangle
- //SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
SMDS_MeshFace* face = myTool->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else { // make quadrangle
if (near - 1 < jlow)
if(!myTrianglePreference){
SMDS_MeshFace* face = myTool->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else {
SplitQuad(meshDS, geomFaceID, a, b, c, d);
d = uv_e0[nbdown - 2].node;
else
d = quad->uv_grid[nbhoriz*k - 2].node;
- //SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
SMDS_MeshFace* face = myTool->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
}
if (near == g) { // make triangle
- //SMDS_MeshFace* face = meshDS->AddFace(a, b, c);
SMDS_MeshFace* face = myTool->AddFace(a, b, c);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else { // make quadrangle
if (near + 1 > jup)
//SMDS_MeshFace* face = meshDS->AddFace(a, b, c, d);
if(!myTrianglePreference){
SMDS_MeshFace* face = myTool->AddFace(a, b, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
else {
SplitQuad(meshDS, geomFaceID, a, b, c, d);
d = uv_e2[1].node;
else
d = quad->uv_grid[nbhoriz*(k + 1) + 1].node;
- //SMDS_MeshFace* face = meshDS->AddFace(a, c, d);
SMDS_MeshFace* face = myTool->AddFace(a, c, d);
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ if(face) meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
g = near;
bool StdMeshers_Quadrangle_2D::Evaluate(SMESH_Mesh& aMesh,
const TopoDS_Shape& aShape,
- MapShapeNbElems& aResMap)
+ MapShapeNbElems& aResMap)
{
aMesh.GetSubMesh(aShape);
std::vector<int> aNbNodes(4);
bool IsQuadratic = false;
if( !CheckNbEdgesForEvaluate( aMesh, aShape, aResMap, aNbNodes, IsQuadratic ) ) {
- std::vector<int> aResVec(17);
- for(int i=0; i<17; i++) aResVec[i] = 0;
+ std::vector<int> aResVec(SMDSEntity_Last);
+ for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aResVec[i] = 0;
SMESH_subMesh * sm = aMesh.GetSubMesh(aShape);
aResMap.insert(std::make_pair(sm,aResVec));
SMESH_ComputeErrorPtr& smError = sm->GetComputeError();
int dh = Max(nbdown, nbup) - nbhoriz;
int dv = Max(nbright, nbleft) - nbvertic;
- int kdh = 0;
- if(dh>0) kdh = 1;
- int kdv = 0;
- if(dv>0) kdv = 1;
+ //int kdh = 0;
+ //if(dh>0) kdh = 1;
+ //int kdv = 0;
+ //if(dv>0) kdv = 1;
int nbNodes = (nbhoriz-2)*(nbvertic-2);
- int nbFaces3 = dh + dv + kdh*(nbvertic-1)*2 + kdv*(nbhoriz-1)*2;
- if( kdh==1 && kdv==1 ) nbFaces3 -= 2;
- int nbFaces4 = (nbhoriz-1-kdh)*(nbvertic-1-kdv);
-
- std::vector<int> aVec(17);
- for(int i=0; i<17; i++) aVec[i] = 0;
+ //int nbFaces3 = dh + dv + kdh*(nbvertic-1)*2 + kdv*(nbhoriz-1)*2;
+ int nbFaces3 = dh + dv;
+ //if( kdh==1 && kdv==1 ) nbFaces3 -= 2;
+ //if( dh>0 && dv>0 ) nbFaces3 -= 2;
+ //int nbFaces4 = (nbhoriz-1-kdh)*(nbvertic-1-kdv);
+ int nbFaces4 = (nbhoriz-1)*(nbvertic-1);
+
+ std::vector<int> aVec(SMDSEntity_Last);
+ for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aVec[i] = 0;
if(IsQuadratic) {
- aVec[4] = nbFaces3;
- aVec[6] = nbFaces4;
+ aVec[SMDSEntity_Quad_Triangle] = nbFaces3;
+ aVec[SMDSEntity_Quad_Quadrangle] = nbFaces4;
int nbbndedges = nbdown + nbup + nbright + nbleft -4;
int nbintedges = ( nbFaces4*4 + nbFaces3*3 - nbbndedges ) / 2;
- aVec[0] = nbNodes + nbintedges;
+ aVec[SMDSEntity_Node] = nbNodes + nbintedges;
+ if( aNbNodes.size()==5 ) {
+ aVec[SMDSEntity_Quad_Triangle] = nbFaces3 + aNbNodes[3] -1;
+ aVec[SMDSEntity_Quad_Quadrangle] = nbFaces4 - aNbNodes[3] +1;
+ }
}
else {
- aVec[0] = nbNodes;
- aVec[3] = nbFaces3;
- aVec[5] = nbFaces4;
+ aVec[SMDSEntity_Node] = nbNodes;
+ aVec[SMDSEntity_Triangle] = nbFaces3;
+ aVec[SMDSEntity_Quadrangle] = nbFaces4;
+ if( aNbNodes.size()==5 ) {
+ aVec[SMDSEntity_Triangle] = nbFaces3 + aNbNodes[3] - 1;
+ aVec[SMDSEntity_Quadrangle] = nbFaces4 - aNbNodes[3] + 1;
+ }
}
SMESH_subMesh * sm = aMesh.GetSubMesh(aShape);
aResMap.insert(std::make_pair(sm,aVec));
int nbSides = 0;
list< TopoDS_Edge >::iterator edgeIt = edges.begin();
- if ( nbEdgesInWire.front() == 4 ) { // exactly 4 edges
+ if ( nbEdgesInWire.front() == 3 ) // exactly 3 edges
+ {
+ SMESH_Comment comment;
+ SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();
+ if ( myTriaVertexID == -1)
+ {
+ comment << "No Base vertex parameter provided for a trilateral geometrical face";
+ }
+ else
+ {
+ TopoDS_Vertex V = TopoDS::Vertex(meshDS->IndexToShape(myTriaVertexID));
+ if ( !V.IsNull() ) {
+ TopoDS_Edge E1,E2,E3;
+ for(; edgeIt != edges.end(); ++edgeIt) {
+ TopoDS_Edge E = *edgeIt;
+ TopoDS_Vertex VF, VL;
+ TopExp::Vertices(E, VF, VL, true);
+ if( VF.IsSame(V) )
+ E1 = E;
+ else if( VL.IsSame(V) )
+ E3 = E;
+ else
+ E2 = E;
+ }
+ if ( !E1.IsNull() && !E2.IsNull() && !E3.IsNull() )
+ {
+ quad->side.push_back( new StdMeshers_FaceSide(F, E1, &aMesh, true, ignoreMediumNodes));
+ quad->side.push_back( new StdMeshers_FaceSide(F, E2, &aMesh, true, ignoreMediumNodes));
+ quad->side.push_back( new StdMeshers_FaceSide(F, E3, &aMesh, false,ignoreMediumNodes));
+ const vector<UVPtStruct>& UVPSleft = quad->side[0]->GetUVPtStruct(true,0);
+ /* vector<UVPtStruct>& UVPStop = */quad->side[1]->GetUVPtStruct(false,1);
+ /* vector<UVPtStruct>& UVPSright = */quad->side[2]->GetUVPtStruct(true,1);
+ const SMDS_MeshNode* aNode = UVPSleft[0].node;
+ gp_Pnt2d aPnt2d( UVPSleft[0].u, UVPSleft[0].v );
+ quad->side.push_back( new StdMeshers_FaceSide(aNode, aPnt2d, quad->side[1]));
+ return quad;
+ }
+ }
+ comment << "Invalid Base vertex parameter: " << myTriaVertexID << " is not among [";
+ TopTools_MapOfShape vMap;
+ for ( TopExp_Explorer v( aShape, TopAbs_VERTEX ); v.More(); v.Next())
+ if ( vMap.Add( v.Current() ))
+ comment << meshDS->ShapeToIndex( v.Current() ) << ( vMap.Extent()==3 ? "]" : ", ");
+ }
+ error( comment );
+ delete quad;
+ return quad = 0;
+ }
+ else if ( nbEdgesInWire.front() == 4 ) { // exactly 4 edges
for ( ; edgeIt != edges.end(); ++edgeIt, nbSides++ )
quad->side.push_back( new StdMeshers_FaceSide(F, *edgeIt, &aMesh,
nbSides<TOP_SIDE, ignoreMediumNodes));
//=============================================================================
bool StdMeshers_Quadrangle_2D::CheckNbEdgesForEvaluate(SMESH_Mesh& aMesh,
- const TopoDS_Shape & aShape,
- MapShapeNbElems& aResMap,
- std::vector<int>& aNbNodes,
- bool& IsQuadratic)
+ const TopoDS_Shape & aShape,
+ MapShapeNbElems& aResMap,
+ std::vector<int>& aNbNodes,
+ bool& IsQuadratic)
{
const TopoDS_Face & F = TopoDS::Face(aShape);
return false;
}
std::vector<int> aVec = (*anIt).second;
- IsQuadratic = (aVec[2] > aVec[1]);
+ IsQuadratic = (aVec[SMDSEntity_Quad_Edge] > aVec[SMDSEntity_Edge]);
+ if ( nbEdgesInWire.front() == 3 ) { // exactly 3 edges
+ if(myTriaVertexID>0) {
+ SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();
+ TopoDS_Vertex V = TopoDS::Vertex(meshDS->IndexToShape(myTriaVertexID));
+ if(!V.IsNull()) {
+ TopoDS_Edge E1,E2,E3;
+ for(; edgeIt != edges.end(); ++edgeIt) {
+ TopoDS_Edge E = TopoDS::Edge(*edgeIt);
+ TopoDS_Vertex VF, VL;
+ TopExp::Vertices(E, VF, VL, true);
+ if( VF.IsSame(V) )
+ E1 = E;
+ else if( VL.IsSame(V) )
+ E3 = E;
+ else
+ E2 = E;
+ }
+ SMESH_subMesh * sm = aMesh.GetSubMesh(E1);
+ MapShapeNbElemsItr anIt = aResMap.find(sm);
+ if(anIt==aResMap.end()) return false;
+ std::vector<int> aVec = (*anIt).second;
+ if(IsQuadratic)
+ aNbNodes[0] = (aVec[SMDSEntity_Node]-1)/2 + 2;
+ else
+ aNbNodes[0] = aVec[SMDSEntity_Node] + 2;
+ sm = aMesh.GetSubMesh(E2);
+ anIt = aResMap.find(sm);
+ if(anIt==aResMap.end()) return false;
+ aVec = (*anIt).second;
+ if(IsQuadratic)
+ aNbNodes[1] = (aVec[SMDSEntity_Node]-1)/2 + 2;
+ else
+ aNbNodes[1] = aVec[SMDSEntity_Node] + 2;
+ sm = aMesh.GetSubMesh(E3);
+ anIt = aResMap.find(sm);
+ if(anIt==aResMap.end()) return false;
+ aVec = (*anIt).second;
+ if(IsQuadratic)
+ aNbNodes[2] = (aVec[SMDSEntity_Node]-1)/2 + 2;
+ else
+ aNbNodes[2] = aVec[SMDSEntity_Node] + 2;
+ aNbNodes[3] = aNbNodes[1];
+ aNbNodes.resize(5);
+ nbSides = 4;
+ }
+ }
+ }
if ( nbEdgesInWire.front() == 4 ) { // exactly 4 edges
for(; edgeIt != edges.end(); edgeIt++) {
SMESH_subMesh * sm = aMesh.GetSubMesh( *edgeIt );
MapShapeNbElemsItr anIt = aResMap.find(sm);
if(anIt==aResMap.end()) {
- return false;
+ return false;
}
std::vector<int> aVec = (*anIt).second;
if(IsQuadratic)
- aNbNodes[nbSides] = (aVec[0]-1)/2 + 2;
+ aNbNodes[nbSides] = (aVec[SMDSEntity_Node]-1)/2 + 2;
else
- aNbNodes[nbSides] = aVec[0] + 2;
+ aNbNodes[nbSides] = aVec[SMDSEntity_Node] + 2;
nbSides++;
}
}
list<TopoDS_Edge>::iterator ite = sideEdges.begin();
aNbNodes[nbSides] = 1;
for(; ite!=sideEdges.end(); ite++) {
- SMESH_subMesh * sm = aMesh.GetSubMesh( *ite );
- MapShapeNbElemsItr anIt = aResMap.find(sm);
- if(anIt==aResMap.end()) {
- return false;
- }
- std::vector<int> aVec = (*anIt).second;
- if(IsQuadratic)
- aNbNodes[nbSides] += (aVec[0]-1)/2 + 1;
- else
- aNbNodes[nbSides] += aVec[0] + 1;
+ SMESH_subMesh * sm = aMesh.GetSubMesh( *ite );
+ MapShapeNbElemsItr anIt = aResMap.find(sm);
+ if(anIt==aResMap.end()) {
+ return false;
+ }
+ std::vector<int> aVec = (*anIt).second;
+ if(IsQuadratic)
+ aNbNodes[nbSides] += (aVec[SMDSEntity_Node]-1)/2 + 1;
+ else
+ aNbNodes[nbSides] += aVec[SMDSEntity_Node] + 1;
}
++nbSides;
}
sideEdges.splice( sideEdges.begin(), edges, --edges.end());
}
}
- list<TopoDS_Edge>::iterator ite = sideEdges.begin();
- aNbNodes[nbSides] = 1;
- for(; ite!=sideEdges.end(); ite++) {
- SMESH_subMesh * sm = aMesh.GetSubMesh( *ite );
- MapShapeNbElemsItr anIt = aResMap.find(sm);
- if(anIt==aResMap.end()) {
- return false;
- }
- std::vector<int> aVec = (*anIt).second;
- if(IsQuadratic)
- aNbNodes[nbSides] += (aVec[0]-1)/2 + 1;
- else
- aNbNodes[nbSides] += aVec[0] + 1;
- }
+ list<TopoDS_Edge>::iterator ite = sideEdges.begin();
+ aNbNodes[nbSides] = 1;
+ for(; ite!=sideEdges.end(); ite++) {
+ SMESH_subMesh * sm = aMesh.GetSubMesh( *ite );
+ MapShapeNbElemsItr anIt = aResMap.find(sm);
+ if(anIt==aResMap.end()) {
+ return false;
+ }
+ std::vector<int> aVec = (*anIt).second;
+ if(IsQuadratic)
+ aNbNodes[nbSides] += (aVec[SMDSEntity_Node]-1)/2 + 1;
+ else
+ aNbNodes[nbSides] += aVec[SMDSEntity_Node] + 1;
+ }
++nbSides;
}
}
}
// normalized 2d values on grid
- for (int i = 0; i < nbhoriz; i++)
- {
- for (int j = 0; j < nbvertic; j++)
- {
+ for (int i = 0; i < nbhoriz; i++) {
+ for (int j = 0; j < nbvertic; j++) {
int ij = j * nbhoriz + i;
// --- droite i cste : x = x0 + y(x1-x0)
- double x0 = uv_e0[i].normParam; // bas - sud
- double x1 = uv_e2[i].normParam; // haut - nord
+ double x0 = uv_e0[i].normParam; // bas - sud
+ double x1 = uv_e2[i].normParam; // haut - nord
// --- droite j cste : y = y0 + x(y1-y0)
- double y0 = uv_e3[j].normParam; // gauche-ouest
- double y1 = uv_e1[j].normParam; // droite - est
+ double y0 = uv_e3[j].normParam; // gauche-ouest
+ double y1 = uv_e1[j].normParam; // droite - est
// --- intersection : x=x0+(y0+x(y1-y0))(x1-x0)
double x = (x0 + y0 * (x1 - x0)) / (1 - (y1 - y0) * (x1 - x0));
double y = y0 + x * (y1 - y0);
gp_UV a2( uv_e2.back().u, uv_e2.back().v );
gp_UV a3( uv_e2.front().u, uv_e2.front().v );
- for (int i = 0; i < nbhoriz; i++)
- {
- for (int j = 0; j < nbvertic; j++)
- {
+ for (int i = 0; i < nbhoriz; i++) {
+ for (int j = 0; j < nbvertic; j++) {
int ij = j * nbhoriz + i;
double x = uv_grid[ij].x;
double y = uv_grid[ij].y;
SMDS_MeshFace* F =
myTool->AddFace(NodesL.Value(i,j), NodesL.Value(i+1,j),
NodesL.Value(i+1,j+1), NodesL.Value(i,j+1));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
else {
SMDS_MeshFace* F =
myTool->AddFace(NodesL.Value(i,j), NodesL.Value(i,j+1),
NodesL.Value(i+1,j+1), NodesL.Value(i+1,j));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
}
SMDS_MeshFace* F =
myTool->AddFace(NodesR.Value(i,j), NodesR.Value(i+1,j),
NodesR.Value(i+1,j+1), NodesR.Value(i,j+1));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
else {
SMDS_MeshFace* F =
myTool->AddFace(NodesR.Value(i,j), NodesR.Value(i,j+1),
NodesR.Value(i+1,j+1), NodesR.Value(i+1,j));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
}
SMDS_MeshFace* F =
myTool->AddFace(NodesC.Value(i,j), NodesC.Value(i+1,j),
NodesC.Value(i+1,j+1), NodesC.Value(i,j+1));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
else {
SMDS_MeshFace* F =
myTool->AddFace(NodesC.Value(i,j), NodesC.Value(i,j+1),
NodesC.Value(i+1,j+1), NodesC.Value(i+1,j));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
}
int nbf=0;
for(j=1; j<nnn-1; j++) {
for(i=1; i<nb; i++) {
- nbf++;
+ nbf++;
if(WisF) {
SMDS_MeshFace* F =
myTool->AddFace(NodesBRD.Value(i,j), NodesBRD.Value(i+1,j),
NodesBRD.Value(i+1,j+1), NodesBRD.Value(i,j+1));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
else {
SMDS_MeshFace* F =
myTool->AddFace(NodesBRD.Value(i,j), NodesBRD.Value(i,j+1),
NodesBRD.Value(i+1,j+1), NodesBRD.Value(i+1,j));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
}
// create faces
for(j=1; j<=drl+addv; j++) {
for(i=1; i<nb; i++) {
- nbf++;
+ nbf++;
if(WisF) {
SMDS_MeshFace* F =
myTool->AddFace(NodesC.Value(i,j), NodesC.Value(i+1,j),
NodesC.Value(i+1,j+1), NodesC.Value(i,j+1));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
else {
SMDS_MeshFace* F =
myTool->AddFace(NodesC.Value(i,j), NodesC.Value(i,j+1),
NodesC.Value(i+1,j+1), NodesC.Value(i+1,j));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
} // end nr<nl
NodesLast.SetValue(nnn,1,NodesC.Value(nb,i));
}
for(i=1; i<nt; i++) {
- nbf++;
+ nbf++;
if(WisF) {
SMDS_MeshFace* F =
myTool->AddFace(NodesLast.Value(i,1), NodesLast.Value(i+1,1),
NodesLast.Value(i+1,2), NodesLast.Value(i,2));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
else {
SMDS_MeshFace* F =
myTool->AddFace(NodesLast.Value(i,1), NodesLast.Value(i,2),
NodesLast.Value(i+1,2), NodesLast.Value(i+1,2));
- meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if(F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
} // if( (drl+addv) > 0 )
bool StdMeshers_Quadrangle_2D::EvaluateQuadPref(SMESH_Mesh & aMesh,
const TopoDS_Shape& aShape,
std::vector<int>& aNbNodes,
- MapShapeNbElems& aResMap,
- bool IsQuadratic)
+ MapShapeNbElems& aResMap,
+ bool IsQuadratic)
{
// Auxilary key in order to keep old variant
// of meshing after implementation new variant
nbFaces += (drl+addv)*(nb-1) + (nt-1);
} // end new version implementation
- std::vector<int> aVec(17);
- for(int i=0; i<17; i++) aVec[i] = 0;
+ std::vector<int> aVec(SMDSEntity_Last);
+ for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aVec[i] = 0;
if(IsQuadratic) {
- aVec[6] = nbFaces;
- aVec[0] = nbNodes + nbFaces*4;
+ aVec[SMDSEntity_Quad_Quadrangle] = nbFaces;
+ aVec[SMDSEntity_Node] = nbNodes + nbFaces*4;
+ if( aNbNodes.size()==5 ) {
+ aVec[SMDSEntity_Quad_Triangle] = aNbNodes[3] - 1;
+ aVec[SMDSEntity_Quad_Quadrangle] = nbFaces - aNbNodes[3] + 1;
+ }
}
else {
- aVec[0] = nbNodes;
- aVec[5] = nbFaces;
+ aVec[SMDSEntity_Node] = nbNodes;
+ aVec[SMDSEntity_Quadrangle] = nbFaces;
+ if( aNbNodes.size()==5 ) {
+ aVec[SMDSEntity_Triangle] = aNbNodes[3] - 1;
+ aVec[SMDSEntity_Quadrangle] = nbFaces - aNbNodes[3] + 1;
+ }
}
SMESH_subMesh * sm = aMesh.GetSubMesh(aShape);
aResMap.insert(std::make_pair(sm,aVec));
SMDS_MeshFace* face;
if(a.Distance(c) > b.Distance(d)){
face = myTool->AddFace(theNode2, theNode4 , theNode1);
- theMeshDS->SetMeshElementOnShape(face, theFaceID );
+ if(face) theMeshDS->SetMeshElementOnShape(face, theFaceID );
face = myTool->AddFace(theNode2, theNode3, theNode4);
- theMeshDS->SetMeshElementOnShape(face, theFaceID );
+ if(face) theMeshDS->SetMeshElementOnShape(face, theFaceID );
}
else{
face = myTool->AddFace(theNode1, theNode2 ,theNode3);
- theMeshDS->SetMeshElementOnShape(face, theFaceID );
+ if(face) theMeshDS->SetMeshElementOnShape(face, theFaceID );
face = myTool->AddFace(theNode1, theNode3, theNode4);
- theMeshDS->SetMeshElementOnShape(face, theFaceID );
+ if(face) theMeshDS->SetMeshElementOnShape(face, theFaceID );
}
}
+
+