#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)
+ SMESH_Gen* gen)
: SMESH_2D_Algo(hypId, studyId, gen)
{
MESSAGE("StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D");
theHyp = hyps.front();
if(strcmp("QuadrangleParams", theHyp->GetName()) == 0) {
const StdMeshers_QuadrangleParams* theHyp1 =
- (const StdMeshers_QuadrangleParams*)theHyp;
+ (const StdMeshers_QuadrangleParams*)theHyp;
myTriaVertexID = theHyp1->GetTriaVertex();
myQuadranglePreference= false;
myTrianglePreference= false;
theHyp = hyps.front();
if(strcmp("QuadrangleParams", theHyp->GetName()) == 0) {
const StdMeshers_QuadrangleParams* theHyp1 =
- (const StdMeshers_QuadrangleParams*)theHyp;
+ (const StdMeshers_QuadrangleParams*)theHyp;
myTriaVertexID = theHyp1->GetTriaVertex();
theHyp = hyps.back();
if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) {
- myQuadranglePreference= true;
- myTrianglePreference= false;
+ myQuadranglePreference= true;
+ myTrianglePreference= false;
}
else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){
- myQuadranglePreference= false;
- myTrianglePreference= true;
+ myQuadranglePreference= false;
+ myTrianglePreference= true;
}
}
else {
if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) {
- myQuadranglePreference= true;
- myTrianglePreference= false;
+ myQuadranglePreference= true;
+ myTrianglePreference= false;
}
else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){
- myQuadranglePreference= false;
- myTrianglePreference= true;
+ myQuadranglePreference= false;
+ myTrianglePreference= true;
}
const StdMeshers_QuadrangleParams* theHyp2 =
- (const StdMeshers_QuadrangleParams*)hyps.back();
+ (const StdMeshers_QuadrangleParams*)hyps.back();
myTriaVertexID = theHyp2->GetTriaVertex();
}
}
d = quad->uv_grid[(j + 1) * nbhoriz + i].node;
SMDS_MeshFace* face = myTool->AddFace(a, b, c, d);
if(face) {
- meshDS->SetMeshElementOnShape(face, geomFaceID);
+ meshDS->SetMeshElementOnShape(face, geomFaceID);
}
}
}
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 nbFaces4 = (nbhoriz-1-kdh)*(nbvertic-1-kdv);
int nbFaces4 = (nbhoriz-1)*(nbvertic-1);
- 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[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[4] = nbFaces3 + aNbNodes[3] -1;
- aVec[6] = nbFaces4 - aNbNodes[3] +1;
+ 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[3] = nbFaces3 + aNbNodes[3] - 1;
- aVec[5] = nbFaces4 - aNbNodes[3] + 1;
+ aVec[SMDSEntity_Triangle] = nbFaces3 + aNbNodes[3] - 1;
+ aVec[SMDSEntity_Quadrangle] = nbFaces4 - aNbNodes[3] + 1;
}
}
SMESH_subMesh * sm = aMesh.GetSubMesh(aShape);
int nbSides = 0;
list< TopoDS_Edge >::iterator edgeIt = edges.begin();
- if ( nbEdgesInWire.front() == 3 ) { // exactly 3 edges
- if(myTriaVertexID>0) {
- SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();
+ 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 = 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;
- }
- quad->side.reserve(4);
- 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));
- std::vector<UVPtStruct> UVPSleft = quad->side[0]->GetUVPtStruct(true,0);
- std::vector<UVPtStruct> UVPStop = quad->side[1]->GetUVPtStruct(false,1);
- std::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 );
- StdMeshers_FaceSide* VertFS =
- new StdMeshers_FaceSide(aNode, aPnt2d, quad->side[1]);
- quad->side.push_back(VertFS);
- return quad;
+ 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 ? "]" : ", ");
}
- return 0;
+ error( comment );
+ delete quad;
+ return quad = 0;
}
else if ( nbEdgesInWire.front() == 4 ) { // exactly 4 edges
for ( ; edgeIt != edges.end(); ++edgeIt, nbSides++ )
//=============================================================================
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[0]-1)/2 + 2;
- else
- aNbNodes[0] = aVec[0] + 2;
- sm = aMesh.GetSubMesh(E2);
- anIt = aResMap.find(sm);
- if(anIt==aResMap.end()) return false;
- aVec = (*anIt).second;
- if(IsQuadratic)
- aNbNodes[1] = (aVec[0]-1)/2 + 2;
- else
- aNbNodes[1] = aVec[0] + 2;
- sm = aMesh.GetSubMesh(E3);
- anIt = aResMap.find(sm);
- if(anIt==aResMap.end()) return false;
- aVec = (*anIt).second;
- if(IsQuadratic)
- aNbNodes[2] = (aVec[0]-1)/2 + 2;
- else
- aNbNodes[2] = aVec[0] + 2;
- aNbNodes[3] = aNbNodes[1];
- aNbNodes.resize(5);
- nbSides = 4;
+ 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;
}
}
}
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;
}
}
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);
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),
// 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),
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),
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[4] = aNbNodes[3] - 1;
- aVec[6] = nbFaces - aNbNodes[3] + 1;
+ 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[3] = aNbNodes[3] - 1;
- aVec[5] = nbFaces - aNbNodes[3] + 1;
+ aVec[SMDSEntity_Triangle] = aNbNodes[3] - 1;
+ aVec[SMDSEntity_Quadrangle] = nbFaces - aNbNodes[3] + 1;
}
}
SMESH_subMesh * sm = aMesh.GetSubMesh(aShape);