mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-28 18:30:35 +05:00
Updated for feature 0016220 from Mantis.
This commit is contained in:
parent
5291ea1e65
commit
9d559b75b8
@ -875,6 +875,42 @@ static gp_UV CalcUV(double x0, double x1, double y0, double y1,
|
|||||||
return uv;
|
return uv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : CalcUV2
|
||||||
|
//purpose : auxilary function for ComputeQuadPref
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
static gp_UV CalcUV2(double x, double y,
|
||||||
|
FaceQuadStruct* quad,
|
||||||
|
const gp_UV& a0, const gp_UV& a1,
|
||||||
|
const gp_UV& a2, const gp_UV& a3)
|
||||||
|
{
|
||||||
|
const vector<UVPtStruct>& uv_eb = quad->side[0]->GetUVPtStruct(true,0 );
|
||||||
|
const vector<UVPtStruct>& uv_er = quad->side[1]->GetUVPtStruct(false,1);
|
||||||
|
const vector<UVPtStruct>& uv_et = quad->side[2]->GetUVPtStruct(true,1 );
|
||||||
|
const vector<UVPtStruct>& uv_el = quad->side[3]->GetUVPtStruct(false,0);
|
||||||
|
|
||||||
|
//double x = (x0 + y0 * (x1 - x0)) / (1 - (y1 - y0) * (x1 - x0));
|
||||||
|
//double y = y0 + x * (y1 - y0);
|
||||||
|
|
||||||
|
double param_b = uv_eb[0].normParam + x * (uv_eb.back().normParam - uv_eb[0].normParam);
|
||||||
|
double param_t = uv_et[0].normParam + x * (uv_et.back().normParam - uv_et[0].normParam);
|
||||||
|
double param_r = uv_er[0].normParam + y * (uv_er.back().normParam - uv_er[0].normParam);
|
||||||
|
double param_l = uv_el[0].normParam + y * (uv_el.back().normParam - uv_el[0].normParam);
|
||||||
|
|
||||||
|
gp_UV p0 = quad->side[BOTTOM_SIDE]->Value2d(param_b).XY();
|
||||||
|
gp_UV p1 = quad->side[RIGHT_SIDE ]->Value2d(param_r).XY();
|
||||||
|
gp_UV p2 = quad->side[TOP_SIDE ]->Value2d(param_t).XY();
|
||||||
|
gp_UV p3 = quad->side[LEFT_SIDE ]->Value2d(param_l).XY();
|
||||||
|
|
||||||
|
gp_UV uv = p0 * (1 - y) + p1 * x + p2 * y + p3 * (1 - x);
|
||||||
|
|
||||||
|
uv -= (1 - x) * (1 - y) * a0 + x * (1 - y) * a1 + x * y * a2 + (1 - x) * y * a3;
|
||||||
|
|
||||||
|
return uv;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
/*!
|
/*!
|
||||||
* Create only quandrangle faces
|
* Create only quandrangle faces
|
||||||
@ -885,6 +921,11 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh,
|
|||||||
const TopoDS_Shape& aShape,
|
const TopoDS_Shape& aShape,
|
||||||
FaceQuadStruct* quad)
|
FaceQuadStruct* quad)
|
||||||
{
|
{
|
||||||
|
// Auxilary key in order to keep old variant
|
||||||
|
// of meshing after implementation new variant
|
||||||
|
// for bug 0016220 from Mantis.
|
||||||
|
bool OldVersion = false;
|
||||||
|
|
||||||
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
const TopoDS_Face& F = TopoDS::Face(aShape);
|
const TopoDS_Face& F = TopoDS::Face(aShape);
|
||||||
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
|
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
|
||||||
@ -938,6 +979,7 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh,
|
|||||||
int addh = 0;
|
int addh = 0;
|
||||||
int addv = 0;
|
int addv = 0;
|
||||||
|
|
||||||
|
// ----------- Old version ---------------
|
||||||
// orientation of face and 3 main domain for future faces
|
// orientation of face and 3 main domain for future faces
|
||||||
// 0 top 1
|
// 0 top 1
|
||||||
// 1------------1
|
// 1------------1
|
||||||
@ -951,6 +993,20 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh,
|
|||||||
// 0------------0
|
// 0------------0
|
||||||
// 0 bottom 1
|
// 0 bottom 1
|
||||||
|
|
||||||
|
// ----------- New version ---------------
|
||||||
|
// orientation of face and 3 main domain for future faces
|
||||||
|
// 0 top 1
|
||||||
|
// 1------------1
|
||||||
|
// | |____| |
|
||||||
|
// |L / \ R|
|
||||||
|
// | / C \ |
|
||||||
|
// left |/________\| rigth
|
||||||
|
// | |
|
||||||
|
// | |
|
||||||
|
// | |
|
||||||
|
// 0------------0
|
||||||
|
// 0 bottom 1
|
||||||
|
|
||||||
if(dh>dv) {
|
if(dh>dv) {
|
||||||
addv = (dh-dv)/2;
|
addv = (dh-dv)/2;
|
||||||
nbv = nbv + addv;
|
nbv = nbv + addv;
|
||||||
@ -984,19 +1040,22 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh,
|
|||||||
npl.Append(uv_el[i].normParam);
|
npl.Append(uv_el[i].normParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dl,dr;
|
||||||
|
if(OldVersion) {
|
||||||
// add some params to right and left after the first param
|
// add some params to right and left after the first param
|
||||||
// insert to right
|
// insert to right
|
||||||
int dr = nbv - nr;
|
dr = nbv - nr;
|
||||||
double dpr = (npr.Value(2) - npr.Value(1))/(dr+1);
|
double dpr = (npr.Value(2) - npr.Value(1))/(dr+1);
|
||||||
for(i=1; i<=dr; i++) {
|
for(i=1; i<=dr; i++) {
|
||||||
npr.InsertAfter(1,npr.Value(2)-dpr);
|
npr.InsertAfter(1,npr.Value(2)-dpr);
|
||||||
}
|
}
|
||||||
// insert to left
|
// insert to left
|
||||||
int dl = nbv - nl;
|
dl = nbv - nl;
|
||||||
dpr = (npl.Value(2) - npl.Value(1))/(dl+1);
|
dpr = (npl.Value(2) - npl.Value(1))/(dl+1);
|
||||||
for(i=1; i<=dl; i++) {
|
for(i=1; i<=dl; i++) {
|
||||||
npl.InsertAfter(1,npl.Value(2)-dpr);
|
npl.InsertAfter(1,npl.Value(2)-dpr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//cout<<"npb:";
|
//cout<<"npb:";
|
||||||
//for(i=1; i<=npb.Length(); i++) {
|
//for(i=1; i<=npb.Length(); i++) {
|
||||||
// cout<<" "<<npb.Value(i);
|
// cout<<" "<<npb.Value(i);
|
||||||
@ -1017,6 +1076,7 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh,
|
|||||||
TColgp_SequenceOfXY UVL;
|
TColgp_SequenceOfXY UVL;
|
||||||
TColgp_SequenceOfXY UVR;
|
TColgp_SequenceOfXY UVR;
|
||||||
|
|
||||||
|
if(OldVersion) {
|
||||||
// step1: create faces for left domain
|
// step1: create faces for left domain
|
||||||
StdMeshers_Array2OfNode NodesL(1,dl+1,1,nl);
|
StdMeshers_Array2OfNode NodesL(1,dl+1,1,nl);
|
||||||
// add left nodes
|
// add left nodes
|
||||||
@ -1221,6 +1281,194 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else { // New version (!OldVersion)
|
||||||
|
// step1: create faces for bottom rectangle domain
|
||||||
|
StdMeshers_Array2OfNode NodesBRD(1,nb,1,nnn-1);
|
||||||
|
// fill UVL and UVR using c2d
|
||||||
|
for(j=0; j<nb; j++) {
|
||||||
|
NodesBRD.SetValue(j+1,1,uv_eb[j].node);
|
||||||
|
}
|
||||||
|
for(i=1; i<nnn-1; i++) {
|
||||||
|
NodesBRD.SetValue(1,i+1,uv_el[i].node);
|
||||||
|
NodesBRD.SetValue(nb,i+1,uv_er[i].node);
|
||||||
|
double du = uv_er[i].u - uv_el[i].u;
|
||||||
|
double dv = uv_er[i].v - uv_el[i].v;
|
||||||
|
for(j=2; j<nb; j++) {
|
||||||
|
double u = uv_el[i].u + du*npb.Value(j);
|
||||||
|
double v = uv_el[i].v + dv*npb.Value(j);
|
||||||
|
gp_Pnt P = S->Value(u,v);
|
||||||
|
SMDS_MeshNode* N = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(N, geomFaceID, u, v);
|
||||||
|
NodesBRD.SetValue(j,i+1,N);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(j=1; j<nnn-1; j++) {
|
||||||
|
for(i=1; i<nb; i++) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int drl = abs(nr-nl);
|
||||||
|
// create faces for region C
|
||||||
|
StdMeshers_Array2OfNode NodesC(1,nb,1,drl+1+addv);
|
||||||
|
// add nodes from previous region
|
||||||
|
for(j=1; j<=nb; j++) {
|
||||||
|
NodesC.SetValue(j,1,NodesBRD.Value(j,nnn-1));
|
||||||
|
}
|
||||||
|
if( (drl+addv) > 0 ) {
|
||||||
|
int n1,n2;
|
||||||
|
if(nr>nl) {
|
||||||
|
n1 = 1;
|
||||||
|
n2 = drl + 1;
|
||||||
|
TColgp_SequenceOfXY UVtmp;
|
||||||
|
double drparam = npr.Value(nr) - npr.Value(nnn-1);
|
||||||
|
double dlparam = npl.Value(nnn) - npl.Value(nnn-1);
|
||||||
|
double y0,y1;
|
||||||
|
for(i=1; i<=drl; i++) {
|
||||||
|
// add existed nodes from right edge
|
||||||
|
NodesC.SetValue(nb,i+1,uv_er[nnn+i-2].node);
|
||||||
|
//double dtparam = npt.Value(i+1);
|
||||||
|
y1 = npr.Value(nnn+i-1); // param on right edge
|
||||||
|
double dpar = (y1 - npr.Value(nnn-1))/drparam;
|
||||||
|
y0 = npl.Value(nnn-1) + dpar*dlparam; // param on left edge
|
||||||
|
double dy = y1 - y0;
|
||||||
|
for(j=1; j<nb; j++) {
|
||||||
|
double x = npt.Value(i+1) + npb.Value(j)*(1-npt.Value(i+1));
|
||||||
|
double y = y0 + dy*x;
|
||||||
|
gp_UV UV = CalcUV2(x, y, quad, a0, a1, a2, a3);
|
||||||
|
gp_Pnt P = S->Value(UV.X(),UV.Y());
|
||||||
|
SMDS_MeshNode* N = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(N, geomFaceID, UV.X(), UV.Y());
|
||||||
|
NodesC.SetValue(j,i+1,N);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double dy0 = (1-y0)/(addv+1);
|
||||||
|
double dy1 = (1-y1)/(addv+1);
|
||||||
|
for(i=1; i<=addv; i++) {
|
||||||
|
double yy0 = y0 + dy0*i;
|
||||||
|
double yy1 = y1 + dy1*i;
|
||||||
|
double dyy = yy1 - yy0;
|
||||||
|
for(j=1; j<=nb; j++) {
|
||||||
|
double x = npt.Value(i+1+drl) +
|
||||||
|
npb.Value(j) * ( npt.Value(nt-i) - npt.Value(i+1+drl) );
|
||||||
|
double y = yy0 + dyy*x;
|
||||||
|
gp_UV UV = CalcUV2(x, y, quad, a0, a1, a2, a3);
|
||||||
|
gp_Pnt P = S->Value(UV.X(),UV.Y());
|
||||||
|
SMDS_MeshNode* N = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(N, geomFaceID, UV.X(), UV.Y());
|
||||||
|
NodesC.SetValue(j,i+drl+1,N);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // nr<nl
|
||||||
|
n2 = 1;
|
||||||
|
n1 = drl + 1;
|
||||||
|
TColgp_SequenceOfXY UVtmp;
|
||||||
|
double dlparam = npl.Value(nl) - npl.Value(nnn-1);
|
||||||
|
double drparam = npr.Value(nnn) - npr.Value(nnn-1);
|
||||||
|
double y0 = npl.Value(nnn-1);
|
||||||
|
double y1 = npr.Value(nnn-1);
|
||||||
|
for(i=1; i<=drl; i++) {
|
||||||
|
// add existed nodes from right edge
|
||||||
|
NodesC.SetValue(1,i+1,uv_el[nnn+i-2].node);
|
||||||
|
y0 = npl.Value(nnn+i-1); // param on left edge
|
||||||
|
double dpar = (y0 - npl.Value(nnn-1))/dlparam;
|
||||||
|
y1 = npr.Value(nnn-1) + dpar*drparam; // param on right edge
|
||||||
|
double dy = y1 - y0;
|
||||||
|
for(j=2; j<=nb; j++) {
|
||||||
|
double x = npb.Value(j)*npt.Value(nt-i);
|
||||||
|
double y = y0 + dy*x;
|
||||||
|
gp_UV UV = CalcUV2(x, y, quad, a0, a1, a2, a3);
|
||||||
|
gp_Pnt P = S->Value(UV.X(),UV.Y());
|
||||||
|
SMDS_MeshNode* N = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(N, geomFaceID, UV.X(), UV.Y());
|
||||||
|
NodesC.SetValue(j,i+1,N);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double dy0 = (1-y0)/(addv+1);
|
||||||
|
double dy1 = (1-y1)/(addv+1);
|
||||||
|
for(i=1; i<=addv; i++) {
|
||||||
|
double yy0 = y0 + dy0*i;
|
||||||
|
double yy1 = y1 + dy1*i;
|
||||||
|
double dyy = yy1 - yy0;
|
||||||
|
for(j=1; j<=nb; j++) {
|
||||||
|
double x = npt.Value(i+1) +
|
||||||
|
npb.Value(j) * ( npt.Value(nt-i-drl) - npt.Value(i+1) );
|
||||||
|
double y = yy0 + dyy*x;
|
||||||
|
gp_UV UV = CalcUV2(x, y, quad, a0, a1, a2, a3);
|
||||||
|
gp_Pnt P = S->Value(UV.X(),UV.Y());
|
||||||
|
SMDS_MeshNode* N = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(N, geomFaceID, UV.X(), UV.Y());
|
||||||
|
NodesC.SetValue(j,i+drl+1,N);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// create faces
|
||||||
|
for(j=1; j<=drl+addv; j++) {
|
||||||
|
for(i=1; i<nb; i++) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // end nr<nl
|
||||||
|
|
||||||
|
StdMeshers_Array2OfNode NodesLast(1,nt,1,2);
|
||||||
|
for(i=1; i<=nt; i++) {
|
||||||
|
NodesLast.SetValue(i,2,uv_et[i-1].node);
|
||||||
|
}
|
||||||
|
int nnn=0;
|
||||||
|
for(i=n1; i<drl+addv+1; i++) {
|
||||||
|
nnn++;
|
||||||
|
NodesLast.SetValue(nnn,1,NodesC.Value(1,i));
|
||||||
|
}
|
||||||
|
for(i=1; i<=nb; i++) {
|
||||||
|
nnn++;
|
||||||
|
NodesLast.SetValue(nnn,1,NodesC.Value(i,drl+addv+1));
|
||||||
|
}
|
||||||
|
for(i=drl+addv; i>=n2; i--) {
|
||||||
|
nnn++;
|
||||||
|
NodesLast.SetValue(nnn,1,NodesC.Value(nb,i));
|
||||||
|
}
|
||||||
|
for(i=1; i<nt; i++) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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( (drl+addv) > 0 )
|
||||||
|
|
||||||
|
} // end new version implementation
|
||||||
|
|
||||||
bool isOk = true;
|
bool isOk = true;
|
||||||
return isOk;
|
return isOk;
|
||||||
|
Loading…
Reference in New Issue
Block a user