- for (i = 1; i < nr; i++) { // layer by layer
- // left
- NodesBRD.SetValue(1, i+1, uv_el[i].node);
- next_base.SetValue(++next_base_len, 1);
- // right
- NodesBRD.SetValue(nb, i+1, uv_er[i].node);
-
- next_par_u.SetValue(next_base_len, uv_el[i].u);
- next_par_v.SetValue(next_base_len, uv_el[i].v);
-
- // to stop reducing, if number of nodes reaches nt
- int delta = curr_base_len - nt;
-
- //double du = uv_er[i].u - uv_el[i].u;
- //double dv = uv_er[i].v - uv_el[i].v;
-
- // to calculate normalized parameter, we must know number of points in next layer
- int nb_four = (curr_base_len - 1) / 4;
- int nb_next = nb_four*2 + (curr_base_len - nb_four*4);
- if (nb_next < nt) nb_next = nt;
-
- for (j = 1; j + 4 <= curr_base_len && delta > 0; j += 4, delta -= 2) {
- // add one "HH": nodes a,b,c,d,e and faces 1,2,3,4,5,6
- //
- // .-----a-----b i + 1
- // |\ 5 | 6 /|
- // | \ | / |
- // | c--d--e |
- // |1 |2 |3 |4 |
- // | | | | |
- // .--.--.--.--. i
- //
- // j j+2 j+4
-
- double u,v;
-
- // a (i + 1, j + 2)
- const SMDS_MeshNode* Na;
- next_base_len++;
- next_base.SetValue(next_base_len, curr_base.Value(j + 2));
- if (i + 1 == nr) { // top
- Na = uv_et[next_base_len - 1].node;
- NodesBRD.SetValue(next_base.Value(next_base_len), i + 1, Na);
- u = uv_et[next_base_len - 1].u;
- v = uv_et[next_base_len - 1].v;
- }
- else {
- //double norm_par = double(next_base_len - 1)/double(nb_next - 1);
- //u = uv_el[i].u + du * norm_par;
- //v = uv_el[i].v + dv * norm_par;
- {
- double rel = double(next_base_len - 1) * double(nt - 1) / double(nb_next - 1) + 1;
- int nearest_node_j = (int)rel;
- rel -= nearest_node_j;
- int ij = (i + 1 - 1) * nt + (nearest_node_j - 1);
- double u1 = quad->uv_grid[ij].u;
- double v1 = quad->uv_grid[ij].v;
- double u2 = quad->uv_grid[ij + 1].u;
- double v2 = quad->uv_grid[ij + 1].v;
- double duj = (u2 - u1) * rel;
- double dvj = (v2 - v1) * rel;
- u = u1 + duj;
- v = v1 + dvj;
- }
- //u = uv_el[i].u + du*npb.Value(curr_base.Value(j + 2));
- //v = uv_el[i].v + dv*npb.Value(curr_base.Value(j + 2));
- gp_Pnt P = S->Value(u,v);
- SMDS_MeshNode* Na1 = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(Na1, geomFaceID, u, v);
- NodesBRD.SetValue(next_base.Value(next_base_len), i + 1, Na1);
- Na = Na1;
- }
- next_par_u.SetValue(next_base_len, u);
- next_par_v.SetValue(next_base_len, v);
-
- // b (i + 1, j + 4)
- const SMDS_MeshNode* Nb;
- next_base_len++;
- next_base.SetValue(next_base_len, curr_base.Value(j + 4));
- if (i + 1 == nr) { // top
- Nb = uv_et[next_base_len - 1].node;
- NodesBRD.SetValue(next_base.Value(next_base_len), i + 1, Nb);
- u = uv_et[next_base_len - 1].u;
- v = uv_et[next_base_len - 1].v;
- }
- else if (j + 4 == curr_base_len) { // right
- Nb = NodesBRD.Value(next_base.Value(next_base_len), i + 1);
- u = uv_er[i].u;
- v = uv_er[i].v;
- }
- else {
- //double norm_par = double(next_base_len - 1)/double(nb_next - 1);
- //u = uv_el[i].u + du * norm_par;
- //v = uv_el[i].v + dv * norm_par;
- {
- double rel = double(next_base_len - 1) * double(nt - 1) / double(nb_next - 1) + 1;
- int nearest_node_j = (int)rel;
- rel -= nearest_node_j;
- int ij = (i + 1 - 1) * nt + (nearest_node_j - 1);
- double u1 = quad->uv_grid[ij].u;
- double v1 = quad->uv_grid[ij].v;
- double u2 = quad->uv_grid[ij + 1].u;
- double v2 = quad->uv_grid[ij + 1].v;
- double duj = (u2 - u1) * rel;
- double dvj = (v2 - v1) * rel;
- u = u1 + duj;
- v = v1 + dvj;
- }
- //u = uv_el[i].u + du*npb.Value(curr_base.Value(j + 4));
- //v = uv_el[i].v + dv*npb.Value(curr_base.Value(j + 4));
- gp_Pnt P = S->Value(u,v);
- SMDS_MeshNode* Nb1 = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(Nb1, geomFaceID, u, v);
- NodesBRD.SetValue(next_base.Value(next_base_len), i + 1, Nb1);
- Nb = Nb1;
- }
- next_par_u.SetValue(next_base_len, u);
- next_par_v.SetValue(next_base_len, v);
-
- // c
- u = (curr_par_u.Value(j + 2) + next_par_u.Value(next_base_len - 2)) / 2.0;
- v = (curr_par_v.Value(j + 2) + next_par_v.Value(next_base_len - 2)) / 2.0;
- gp_Pnt P = S->Value(u,v);
- SMDS_MeshNode* Nc = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(Nc, geomFaceID, u, v);
-
- // d
- u = (curr_par_u.Value(j + 2) + next_par_u.Value(next_base_len - 1)) / 2.0;
- v = (curr_par_v.Value(j + 2) + next_par_v.Value(next_base_len - 1)) / 2.0;
- P = S->Value(u,v);
- SMDS_MeshNode* Nd = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(Nd, geomFaceID, u, v);
-
- // e
- u = (curr_par_u.Value(j + 2) + next_par_u.Value(next_base_len)) / 2.0;
- v = (curr_par_v.Value(j + 2) + next_par_v.Value(next_base_len)) / 2.0;
- P = S->Value(u,v);
- SMDS_MeshNode* Ne = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(Ne, geomFaceID, u, v);
-
- // Faces
- SMDS_MeshFace* F1 = myHelper->AddFace(NodesBRD.Value(curr_base.Value(j + 0), i),
- NodesBRD.Value(curr_base.Value(j + 1), i),
- Nc,
- NodesBRD.Value(next_base.Value(next_base_len - 2), i + 1));
- if (F1) meshDS->SetMeshElementOnShape(F1, geomFaceID);
-
- SMDS_MeshFace* F2 = myHelper->AddFace(NodesBRD.Value(curr_base.Value(j + 1), i),
- NodesBRD.Value(curr_base.Value(j + 2), i),
- Nd, Nc);
- if (F2) meshDS->SetMeshElementOnShape(F2, geomFaceID);
-
- SMDS_MeshFace* F3 = myHelper->AddFace(NodesBRD.Value(curr_base.Value(j + 2), i),
- NodesBRD.Value(curr_base.Value(j + 3), i),
- Ne, Nd);
- if (F3) meshDS->SetMeshElementOnShape(F3, geomFaceID);
-
- SMDS_MeshFace* F4 = myHelper->AddFace(NodesBRD.Value(curr_base.Value(j + 3), i),
- NodesBRD.Value(curr_base.Value(j + 4), i),
- Nb, Ne);
- if (F4) meshDS->SetMeshElementOnShape(F4, geomFaceID);
-
- SMDS_MeshFace* F5 = myHelper->AddFace(Nc, Nd, Na,
- NodesBRD.Value(next_base.Value(next_base_len - 2), i + 1));
- if (F5) meshDS->SetMeshElementOnShape(F5, geomFaceID);
-
- SMDS_MeshFace* F6 = myHelper->AddFace(Nd, Ne, Nb, Na);
- if (F6) meshDS->SetMeshElementOnShape(F6, geomFaceID);
- }
-
- // not reduced side elements (if any)
- for (; j < curr_base_len; j++) {
- // f (i + 1, j + 1)
- const SMDS_MeshNode* Nf;
- double u,v;
- next_base.SetValue(++next_base_len, curr_base.Value(j + 1));
- if (i + 1 == nr) { // top
- Nf = uv_et[next_base_len - 1].node;
- NodesBRD.SetValue(next_base.Value(next_base_len), i + 1, Nf);
- u = uv_et[next_base_len - 1].u;
- v = uv_et[next_base_len - 1].v;
- }
- else if (j + 1 == curr_base_len) { // right
- Nf = NodesBRD.Value(next_base.Value(next_base_len), i + 1);
- u = uv_er[i].u;
- v = uv_er[i].v;
- }
- else {
- //double norm_par = double(next_base_len - 1)/double(nb_next - 1);
- //u = uv_el[i].u + du * norm_par;
- //v = uv_el[i].v + dv * norm_par;
- {
- double rel = double(next_base_len - 1) * double(nt - 1) / double(nb_next - 1) + 1;
- int nearest_node_j = (int)rel;
- rel -= nearest_node_j;
- int ij = (i + 1 - 1) * nt + (nearest_node_j - 1);
- double u1 = quad->uv_grid[ij].u;
- double v1 = quad->uv_grid[ij].v;
- double u2 = quad->uv_grid[ij + 1].u;
- double v2 = quad->uv_grid[ij + 1].v;
- double duj = (u2 - u1) * rel;
- double dvj = (v2 - v1) * rel;
- u = u1 + duj;
- v = v1 + dvj;
- }
- //u = uv_el[i].u + du*npb.Value(curr_base.Value(j + 1));
- //v = uv_el[i].v + dv*npb.Value(curr_base.Value(j + 1));
- gp_Pnt P = S->Value(u,v);
- SMDS_MeshNode* Nf1 = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(Nf1, geomFaceID, u, v);
- NodesBRD.SetValue(next_base.Value(next_base_len), i + 1, Nf1);
- Nf = Nf1;
- }
- next_par_u.SetValue(next_base_len, u);
- next_par_v.SetValue(next_base_len, v);
- SMDS_MeshFace* F1 = myHelper->AddFace(NodesBRD.Value(curr_base.Value(j), i),
- NodesBRD.Value(curr_base.Value(j + 1), i),
- NodesBRD.Value(next_base.Value(next_base_len), i + 1),
- NodesBRD.Value(next_base.Value(next_base_len - 1), i + 1));
- if (F1) meshDS->SetMeshElementOnShape(F1, geomFaceID);
- }
-
- curr_base_len = next_base_len;
- curr_base = next_base;
- curr_par_u = next_par_u;
- curr_par_v = next_par_v;
- next_base_len = 0;
- }
- } // end "tree" simple reduce "42"
- else if (is_tree_31) {