2 // C++ : Fonctions de creation HexaBlock v6
4 // Copyright (C) 2009-2019 CEA/DEN, EDF R&D
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "HexDocument.hxx"
25 #include "HexElements.hxx"
26 #include "HexBiCylinder.hxx"
27 #include "HexVector.hxx"
28 #include "HexQuad.hxx"
29 #include "HexHexa.hxx"
31 #include "HexGlobale.hxx"
36 // ======================================================== make_normale
37 int make_normale (Quads& tquads, double axe[], double& largeur)
41 int nbre = tquads.size();
46 for (int nro=0 ; nro<nbre ; ++nro)
48 Quad* quad = tquads[nro];
49 int nbp = quad->getNbrParents();
53 for (int nc=0 ; nc<QUAD4 ; ++nc)
54 lgmoy += quad->getEdge(nc)->getLength ();
55 // Calcul de la normale sortante
56 Hexa* hexa = quad->getParent (0);
59 calc_vecteur (cg, cf, vn);
60 for (int nc=0 ; nc<DIM3 ; ++nc)
61 axe[nc] = coeff*axe[nc] + vn[nc];
66 largeur = lgmoy / (4*nbre);
69 // ======================================================== makeCartesianTop
70 Elements* Document::makeCartesianTop (int nx, int ny, int nz)
72 DumpStart ("makeCartesianTop", nx << ny << nz );
73 Elements* grid = new Elements (this);
75 RealVector tx, ty, tz;
76 Real3 rx = { 1, 0, 0 };
77 Real3 ry = { 0, 1, 0 };
78 Real3 rz = { 0, 0, 1 };
80 grid->checkSize (1, nx, ny, nz, false);
83 Vertex* orig = addVertex (0, 0, 0);
84 for (int nro=1 ; nro<=nx; ++nro) tx.push_back (nro);
85 for (int nro=1 ; nro<=ny; ++nro) ty.push_back (nro);
86 for (int nro=1 ; nro<=nz; ++nro) tz.push_back (nro);
87 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
93 // ======================================================== makeCartesianUni
94 Elements* Document::makeCartesianUni (Vertex* orig,
95 Vector* vx, Vector* vy, Vector* vz,
96 double lx, double ly, double lz,
97 int nx, int ny, int nz)
99 DumpStart ("makeCartesianUni", orig << vx << vy << vz
103 Elements* grid = new Elements (this);
106 grid->checkOrig (1, orig);
107 grid->checkSize (8, nx, ny, nz, false);
108 grid->checkSystem (2, vx, vy, vz, rx, ry, rz);
112 RealVector tx, ty, tz;
116 for (int nro=1 ; nro<=nx; ++nro) tx.push_back (nro*dx);
117 for (int nro=1 ; nro<=ny; ++nro) ty.push_back (nro*dy);
118 for (int nro=1 ; nro<=nz; ++nro) tz.push_back (nro*dz);
120 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
126 // ======================================================== makeCartesian
127 Elements* Document::makeCartesian (Vertex* orig,
128 Vector* vx, Vector* vy, Vector* vz,
129 RealVector tx, RealVector ty, RealVector tz)
131 DumpStart ("makeCartesian", orig << vx << vy << vz << tx << ty << tz);
133 Elements* grid = new Elements (this);
136 grid->checkOrig (1, orig);
137 grid->checkSystem (2, vx, vy, vz, rx, ry, rz);
138 grid->checkVector (5, tx);
139 grid->checkVector (6, ty);
140 grid->checkVector (7, tz);
143 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
148 // ======================================================== makeCylinderTop
149 Elements* Document::makeCylinderTop (int nr, int na, int nh)
151 DumpStart ("makeCylinderTop", nr << na << nh);
153 Elements* grid = new Elements (this);
155 RealVector tray, tang, thaut;
156 Real3 rx = { 1, 0, 0 };
157 Real3 rz = { 0, 0, 1 };
159 grid->checkSize (1, nr, na, nh, true);
162 double da = 360.0 / na;
163 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (nro+1);
164 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
165 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro);
166 grid->makeCylinder (NULL, rx, rz, tray, tang, thaut, true);
172 // ======================================================== makeCylinderUni
173 Elements* Document::makeCylinderUni (Vertex* orig, Vector* vx, Vector* vz,
174 double rint, double rext, double ang, double haut,
175 int nr, int na, int nh)
177 DumpStart ("makeCylinderUni", orig << vx << vz << rint << rext
178 << ang << haut << nr << na << nh);
180 Elements* grid = new Elements (this);
183 grid->checkOrig (1, orig);
184 grid->checkSize (8, nr, na, nh, true);
185 grid->checkPipe (4, rint, rext, ang, haut);
186 grid->checkSystem (2, vx, vz, rx, rz);
190 double dray = (rext-rint) / nr;
191 double dang = ang / na;
192 double dhaut = haut / nh;
193 RealVector tang, tray, thaut;
195 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dray);
196 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*dang);
197 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro*dhaut);
199 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, true);
205 // ======================================================== makeCylinder
206 Elements* Document::makeCylinder (Vertex* orig, Vector* vx, Vector* vz,
207 RealVector tray, RealVector tang, RealVector thaut)
209 DumpStart ("makeCylinder", orig << vx << vz << tray << tang << thaut);
211 Elements* grid = new Elements (this);
214 grid->checkOrig (1, orig);
215 grid->checkSystem (2, vx, vz, rx, rz);
216 grid->checkVector (4, tray);
217 grid->checkVector (5, tang, 3);
218 grid->checkVector (6, thaut);
221 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, true);
226 // ======================================================== makePipeTop
227 Elements* Document::makePipeTop (int nr, int na, int nh)
229 DumpStart ("makePipeTop", nr << na << nh);
231 Elements* grid = new Elements (this);
233 RealVector tray, tang, thaut;
234 Real3 rx = { 1, 0, 0 };
235 Real3 rz = { 0, 0, 1 };
237 grid->checkSize (1,nr, na, nh, true);
240 double da = 360.0 / na;
241 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (nro+1);
242 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
243 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro);
244 grid->makeCylinder (NULL, rx, rz, tray, tang, thaut, false);
250 // ======================================================== makePipeUni
251 Elements* Document::makePipeUni (Vertex* orig, Vector* vx, Vector* vz,
252 double rint, double rext, double angle, double hauteur,
253 int nr, int na, int nh)
255 DumpStart ("makePipeUni", orig << vx << vz << rint << rext
256 << angle << hauteur << nr << na << nh);
258 Elements* grid = new Elements (this);
261 RealVector tray, tang, thaut;
262 grid->checkOrig (1, orig);
263 grid->checkSize (8, nr, na, nh, true);
264 grid->checkPipe (4, rint, rext, angle, hauteur);
265 grid->checkSystem (1, vx, vz, rx, rz);
269 double dray = (rext-rint) / nr;
270 double dang = angle / na;
271 double dhaut = hauteur / nh;
272 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dray);
273 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro * dang);
274 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro * dhaut);
276 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, false);
281 // ======================================================== makePipe
282 Elements* Document::makePipe (Vertex* orig, Vector* vx, Vector* vz,
283 RealVector tray, RealVector tang, RealVector thaut)
285 DumpStart ("makePipe", orig << vx << vz << tray << tang << thaut);
287 Elements* grid = new Elements (this);
290 grid->checkOrig (1, orig);
291 grid->checkSystem (2, vx, vz, rx, rz);
292 grid->checkVector (4, tray, 2);
293 grid->checkVector (5, tang, 3);
294 grid->checkVector (6, thaut, 2);
297 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, false);
302 // ======================================================== makeSphericalTop
303 Elements* Document::makeSphericalTop (int nbre, int crit)
305 DumpStart ("makeSphericalTop", nbre << crit);
306 Elements* grid = new Elements (this);
308 Real3 orig = { 0, 0, 0 };
309 Real3 rx = { 1, 0, 0 };
310 Real3 rz = { 0, 0, 1 };
314 grid->setError (HERR);
315 Mess << "Argument number 1 :";
316 Mess << "Nbr slices must be greather or equal than 2";
322 for (int nro=1 ; nro<=nbre; ++nro) trayon.push_back (nro);
323 grid->makeSpherical (orig, rx, rz, trayon, crit);
329 // ======================================================== makeSphericalUni
330 Elements* Document::makeSphericalUni (Vertex* center, Vector* vx, Vector* vz,
331 double rayon, int nbre, int crit)
333 DumpStart ("makeSphericalUni", center << vx << vz << rayon << nbre << crit);
334 Elements* grid = new Elements (this);
337 grid->checkOrig (1, center);
338 grid->checkSystem (2, vx, vz, rx, rz);
342 grid->setError (HERR);
343 Mess << "Argument number 4 :";
344 Mess << "Radius must be positive";
349 grid->setError (HERR);
350 Mess << "Argument number 5 :";
351 Mess << "Nbr slices must be greather or equal than 2";
358 center->getPoint (orig);
359 for (int nro=1 ; nro<=nbre; ++nro) trayon.push_back (nro*rayon);
360 grid->makeSpherical (orig, rx, rz, trayon, crit);
366 // ======================================================== makeSpherical
367 Elements* Document::makeSpherical (Vertex* center, Vector* vx, Vector* vz,
368 RealVector trayon, int crit)
370 DumpStart ("makeSpherical", center << vx << vz << trayon << crit);
371 Elements* grid = new Elements (this);
374 grid->checkOrig (1, center);
375 grid->checkSystem (2, vx, vz, rx, rz);
376 grid->checkVector (4, trayon, 2);
381 center->getPoint (orig);
382 grid->makeSpherical (orig, rx, rz, trayon, crit);
389 // ======================================================== makeSphereTop
390 Elements* Document::makeSphereTop (int nr, int na, int nh)
392 DumpStart ("makeSphereTop", nr << na << nh);
393 Elements* grid = new Elements (this);
395 Real3 orig = { 0, 0, 0 };
396 Real3 rx = { 1, 0, 0 };
397 Real3 rz = { 0, 0, 1 };
404 grid->checkPhi (true, orig, rz, rext, rtrou, NULL, phi0, phi1);
408 grid->setError (HERR);
409 Mess << "Argument number 1 :";
410 Mess << "Nbr slices must be greather or equal than 2";
415 grid->setError (HERR);
416 Mess << "Argument number 2 :";
417 Mess << "Nbr sectors must be greather or equal than 3";
422 grid->setError (HERR);
423 Mess << "Argument number 3 :";
424 Mess << "Nbr slices must be greather or equal than 2";
429 double dr = (rext-rtrou)/nr;
430 double da = angle / na;
431 double dh = (phi1-phi0) / nh;
432 RealVector tray, tang, thaut;
433 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rtrou + nro*dr);
434 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
435 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
436 grid->makeRind (GR_HEMISPHERIC, orig, rx, rz, tray, tang, thaut);
442 // ======================================================== makeSphereUni
443 Elements* Document::makeSphereUni (Vertex* center, Vector* vx, Vector* vz,
444 double rtrou, double rext, double ang,
445 Vertex* hplan, int nr, int na, int nh)
447 DumpStart ("makeSphereUni", center << vx << vz << rtrou << rext << ang
448 << hplan << nr << na << nh);
449 Elements* grid = new Elements (this);
452 grid->checkOrig (1, center);
453 grid->checkSystem (2, vx, vz, rx, rz);
455 Real3 orig = { 0, 0, 0 };
457 center->getPoint (orig);
460 grid->checkPhi (true, orig, rz, rext, rtrou, hplan, phi0, phi1);
464 grid->setError (HERR);
465 Mess << "Argument number 4 :";
466 Mess << "Hole radius must be positive";
471 grid->setError (HERR);
472 Mess << "Argument number 5 :";
473 Mess << "External radius must be greather than hole radius";
478 grid->setError (HERR);
479 Mess << "Argument number 6 :";
480 Mess << "Angle must be positive";
485 grid->setError (HERR);
486 Mess << "Argument number 7 :";
487 Mess << "Nbr slices must be greather or equal than 2";
492 grid->setError (HERR);
493 Mess << "Argument number 8 :";
494 Mess << "Nbr sectors must be greather or equal than 3";
499 grid->setError (HERR);
500 Mess << "Argument number 9 :";
501 Mess << "Nbr slices must be greather or equal than 2";
504 EnumGrid type = ang>= 359.9 ? GR_HEMISPHERIC : GR_PART_SPHERIC;
507 double dr = (rext-rtrou)/nr;
508 double dh = (phi1-phi0) /nh;
509 double da = ang / na;
510 RealVector tray, tang, thaut;
511 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rtrou + nro*dr);
512 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
513 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
514 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
520 // ======================================================== makeSphere
521 Elements* Document::makeSphere (Vertex* center, Vector* vx, Vector* vz,
522 RealVector tray, RealVector tang, RealVector thaut)
524 DumpStart ("makeSphere", center << vx << vz << tray << tang << thaut );
525 Elements* grid = new Elements (this);
528 grid->checkOrig (1, center);
529 grid->checkSystem (2, vx, vz, rx, rz);
530 grid->checkVector (4, tray, 2);
531 grid->checkVector (5, tang, 3);
532 grid->checkVector (6, thaut, 2);
534 int nb = tang.size()-1;
535 double angle = nb <0 ? 0 : tang[nb] ;
536 EnumGrid type = angle >= 359.9 ? GR_HEMISPHERIC : GR_PART_SPHERIC;
540 center->getPoint (orig);
541 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
549 // ======================================================== makeRindTop
550 Elements* Document::makeRindTop (int nr, int na, int nh)
552 DumpStart ("makeRindTop", nr << na << nh);
553 Elements* grid = new Elements (this);
555 Real3 orig = { 0, 0, 0 };
556 Real3 rx = { 1, 0, 0 };
557 Real3 rz = { 0, 0, 1 };
565 grid->checkPhi (false, orig, rz, rext, rtrou, NULL, phi0, phi1);
569 grid->setError (HERR);
570 Mess << "Argument number 1 :";
571 Mess << "Nbr slices must be greather or equal than 2";
576 grid->setError (HERR);
577 Mess << "Argument number 2 :";
578 Mess << "Nbr sectors must be greather or equal than 3";
583 grid->setError (HERR);
584 Mess << "Argument number 3 :";
585 Mess << "Nbr slices must be greather or equal than 2";
590 double dr = (rext-rint)/nr;
591 double da = angle / na;
592 double dh = (phi1-phi0) / nh;
593 RealVector tray, tang, thaut;
594 tray .push_back (rtrou);
595 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dr);
596 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
597 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
598 grid->makeRind (GR_RIND, orig, rx, rz, tray, tang, thaut);
604 // ======================================================== makeRindUni
605 Elements* Document::makeRindUni (Vertex* center, Vector* vx, Vector* vz,
606 double rtrou, double rint, double rext,
607 double ang, Vertex* hplan, int nr, int na, int nh)
609 DumpStart ("makeRindUni", center << vx << vz << rtrou << rint << rext << ang
610 << hplan << nr << na << nh);
611 Elements* grid = new Elements (this);
614 grid->checkOrig (1, center);
615 grid->checkSystem (2, vx, vz, rx, rz);
616 grid->checkDiams (4, rtrou, rint);
617 grid->checkDiams (5, rint, rext);
619 Real3 orig = { 0, 0, 0 };
621 center->getPoint (orig);
624 grid->checkPhi (false, orig, rz, rext, rtrou, hplan, phi0, phi1);
628 grid->setError (HERR);
629 Mess << "Argument number 4 :";
630 Mess << "Hole radius must be positive";
635 grid->setError (HERR);
636 Mess << "Argument number 5 :";
637 Mess << "Internal radius must be greather than hole radius";
642 grid->setError (HERR);
643 Mess << "Argument number 6 :";
644 Mess << "External radius must be greather than internal radius";
649 grid->setError (HERR);
650 Mess << "Argument number 7 :";
651 Mess << "Angle must be positive";
656 grid->setError (HERR);
657 Mess << "Argument number 8 :";
658 Mess << "Nbr slices must be greather or equal than 2";
663 grid->setError (HERR);
664 Mess << "Argument number 9 :";
665 Mess << "Nbr sectors must be greather or equal than 3";
670 grid->setError (HERR);
671 Mess << "Argument number 10 :";
672 Mess << "Nbr slices must be greather or equal than 2";
675 EnumGrid type = ang>= 359.9 ? GR_RIND : GR_PART_RIND;
678 double dr = (rext-rint)/nr;
679 double dh = (phi1-phi0) /nh;
680 double da = ang / na;
681 RealVector tray, tang, thaut;
682 tray .push_back (rtrou);
683 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dr);
684 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
685 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
686 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
692 // ======================================================== makeRind
693 Elements* Document::makeRind (Vertex* center, Vector* vx, Vector* vz,
694 RealVector tray, RealVector tang, RealVector thaut)
696 DumpStart ("makeRind", center << vx << vz << tray << tang << thaut );
697 Elements* grid = new Elements (this);
700 grid->checkOrig (1, center);
701 grid->checkSystem (2, vx, vz, rx, rz);
702 grid->checkVector (4, tray, 2);
703 grid->checkVector (5, tang, 3);
704 grid->checkVector (6, thaut, 2);
706 int nb = tang.size()-1;
707 double angle = nb <0 ? 0 : tang[nb] ;
708 EnumGrid type = angle >= 359.9 ? GR_RIND : GR_PART_RIND;
712 center->getPoint (orig);
713 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
720 // ======================================================== makeCylinders
721 BiCylinder* Document::makeCylinders (Vertex* ori1, Vector* vz1, double ray1,
722 double h1, Vertex* ori2, Vector* vz2, double ray2, double h2)
724 DumpStart ("makeCylinders", ori1 << vz1 << ray1 << h1 << ori2 << vz2
726 BiCylinder* grid = new BiCylinder (this);
729 grid->checkOrig (1, ori1);
730 grid->checkOrig (5, ori2);
731 grid->checkSystem (2, vz1, vz2, rz1, rz2);
736 grid->makeCylinders (ori1, rz1, ray1, h1, ori2, rz2, ray2, h2);
738 grid->makeCylinders (ori2, rz2, ray2, h2, ori1, rz1, ray1, h1);
745 // ======================================================== makePipes
746 BiCylinder* Document::makePipes (Vertex* ori1, Vector* vz1, double rint1,
747 double rext1, double h1,
748 Vertex* ori2, Vector* vz2, double rint2, double rext2, double h2)
750 DumpStart ("makePipes", ori1 << vz1 << rint1 << rext1 << h1
751 << ori2 << vz2 << rint2 << rext2 << h2);
752 BiCylinder* grid = new BiCylinder (this);
755 grid->checkOrig (1, ori1);
756 grid->checkOrig (6, ori2);
757 grid->checkSystem (2, vz1, vz2, rz1, rz2);
758 grid->checkDiams (3, rint1, rext1);
759 grid->checkDiams (8, rint2, rext2);
764 grid->makePipes (ori1,rz1,rint1,rext1,h1, ori2,rz2,rint2,rext2,h2);
766 grid->makePipes (ori2,rz2,rint2,rext2,h2, ori1,rz1,rint1,rext1,h1);
772 // ------------------------------------------------------------------------
773 // ------------------------------------------------------------------------
774 // ------------------------------------------------------------------------
775 // ========================================================= extrudeQuadTop
776 Elements* Document::extrudeQuadTop (Quad* start, int nbre)
778 DumpStart ("extrudeQuadTop", start << nbre);
782 Real3 axe = { 0, 0, 1 };
784 Elements* grid = new Elements (this);
786 tstart.push_back (start);
787 grid->checkQuad (start);
788 make_normale (tstart, axe, larg);
789 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*larg);
793 grid->extrudeQuads (tstart, axe, tlen);
799 // ========================================================= extrudeQuadUni
800 Elements* Document::extrudeQuadUni (Quad* start, Vector* axis, double len,
803 DumpStart ("extrudeQuadUni", start << axis << len << nbre);
808 Elements* grid = new Elements (this);
810 grid->checkQuad (start);
811 grid->checkAxis (axis, axe);
813 tstart.push_back (start);
815 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*len);
819 grid->extrudeQuads (tstart, axe, tlen);
825 // ========================================================= extrudeQuad
826 Elements* Document::extrudeQuad (Quad* start, Vector* axis, RealVector tlen)
828 DumpStart ("extrudeQuad", start << axis << tlen);
832 Elements* grid = new Elements (this);
834 grid->checkQuad (start);
835 grid->checkAxis (axis, axe);
836 grid->checkVector (3, tlen);
838 tstart.push_back (start);
842 grid->extrudeQuads (tstart, axe, tlen);
849 // ========================================================= extrudeQuadsTop
850 Elements* Document::extrudeQuadsTop (Quads tstart, int nbre)
852 DumpStart ("extrudeQuadsTop", tstart << nbre);
855 Real3 axe = { 0, 0, 1 };
857 Elements* grid = new Elements (this);
859 grid->checkQuads (tstart);
860 make_normale (tstart, axe, larg);
861 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*larg);
865 grid->extrudeQuads (tstart, axe, tlen);
871 // ========================================================= extrudeQuadsUni
872 Elements* Document::extrudeQuadsUni (Quads tstart, Vector* axis, double len,
875 DumpStart ("extrudeQuadsUni", tstart << axis << len << nbre);
879 Elements* grid = new Elements (this);
881 grid->checkQuads (tstart);
882 grid->checkAxis (axis, axe);
884 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*len);
888 grid->extrudeQuads (tstart, axe, tlen);
894 // ========================================================= extrudeQuads
895 Elements* Document::extrudeQuads (Quads tstart, Vector* axis, RealVector tlen)
897 DumpStart ("extrudeQuads", tstart << axis << tlen);
900 Elements* grid = new Elements (this);
902 grid->checkQuads (tstart);
903 grid->checkAxis (axis, axe);
904 grid->checkVector (3, tlen);
908 grid->extrudeQuads (tstart, axe, tlen);
914 // ========================================================= revolutionQuadUni
915 Elements* Document::revolutionQuadUni (Quad* start, Vertex* center,
916 Vector* axis, double angle, int nbre)
918 DumpStart ("revolutionQuadUni", start << center << axis << angle << nbre);
923 Elements* grid = new Elements (this);
924 double alpha = angle / std::max (nbre, 1);
926 grid->checkQuad (start);
927 grid->checkOrig (2, center);
928 grid->checkAxis (axis, axe);
930 tstart.push_back (start);
931 for (int nro=0 ; nro<nbre; ++nro) angles.push_back ((nro+1)*alpha);
935 grid->extrudeQuads (tstart, axe, angles, true, center);
941 // ========================================================= revolutionQuad
942 Elements* Document::revolutionQuad (Quad* start, Vertex* center, Vector* axis,
945 DumpStart ("revolutionQuads", start << center << axis << angles);
949 Elements* grid = new Elements (this);
951 grid->checkQuad (start);
952 grid->checkOrig (2, center);
953 grid->checkAxis (axis, axe);
955 tstart.push_back (start);
959 grid->extrudeQuads (tstart, axe, angles, true, center);
965 // ========================================================= revolutionQuadsUni
966 Elements* Document::revolutionQuadsUni (Quads tstart, Vertex* center,
967 Vector* axis, double angle, int nbre)
969 DumpStart ("revolutionQuadsUni", tstart << center << axis << angle << nbre);
973 Elements* grid = new Elements (this);
974 double alpha = angle / std::max (nbre, 1);
976 grid->checkQuads (tstart);
977 grid->checkOrig (2, center);
978 grid->checkAxis (axis, axe);
980 for (int nro=0 ; nro<nbre; ++nro) angles.push_back ((nro+1)*alpha);
984 grid->extrudeQuads (tstart, axe, angles, true, center);
990 // ========================================================= revolutionQuads
991 Elements* Document::revolutionQuads (Quads tstart, Vertex* center, Vector* axis,
994 DumpStart ("revolutionQuads", tstart << center << axis << angles);
997 Elements* grid = new Elements (this);
999 grid->checkQuads (tstart);
1000 grid->checkOrig (2, center);
1001 grid->checkAxis (axis, axe);
1002 grid->checkVector (4, angles);
1004 if (grid->isValid())
1006 grid->extrudeQuads (tstart, axe, angles, true, center);
1012 // ------------------------------------------------------------------------
1013 // ------------------------------------------------------------------------
1014 // ------------------------------------------------------------------------
1015 // ========================================================= joinQuadUni
1016 Elements* Document::joinQuadUni (Quad* quada, Quad* quadb, Vertex* va1,
1017 Vertex* vb1, Vertex* va2, Vertex* vb2, int nbre)
1019 DumpStart ("joinQuadUni", quada << quadb << va1<<vb1 << va2<<vb2 << nbre);
1023 Elements* grid = new Elements (this);
1026 grid->checkQuad (quada);
1027 grid->checkQuad (quadb, -1);
1028 grid->checkSense (3, va1, va2, quada);
1029 grid->checkSense (6, vb1, vb2, quadb);
1031 nbre = nbre < 0 ? 0 : nbre;
1032 double dist = 1.0 / (nbre+1);
1034 tquada.push_back (quada);
1035 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1037 if (grid->isValid())
1039 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1045 // ========================================================= joinQuad
1046 Elements* Document::joinQuad (Quad* quada, Quad* quadb, Vertex* va1,
1047 Vertex* vb1, Vertex* va2, Vertex* vb2, RealVector& tlen)
1049 DumpStart ("joinQuad", quada << quadb << va1 << vb1 << va2 << vb2 << tlen);
1052 Elements* grid = new Elements (this);
1055 grid->checkQuad (quada);
1056 grid->checkQuad (quadb, -1);
1057 grid->checkSense (3, va1, va2, quada);
1058 grid->checkSense (6, vb1, vb2, quadb);
1059 grid->checkVector (7, tlen, 0, true);
1061 tquada.push_back (quada);
1063 if (grid->isValid())
1065 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1071 // ========================================================= joinQuadsUni
1072 Elements* Document::joinQuadsUni (Quads tquada, Quad* quadb, Vertex* va1,
1073 Vertex* vb1, Vertex* va2, Vertex* vb2, int nbre)
1075 DumpStart ("joinQuadsUni", tquada << quadb << va1 << vb1 << va2 << vb2
1078 Elements* grid = new Elements (this);
1081 grid->checkQuads (tquada);
1082 grid->checkQuad (quadb, -1);
1083 if (tquada.size()>0)
1084 grid->checkSense (3, va1, va2, tquada[0]);
1085 grid->checkSense (6, vb1, vb2, quadb);
1087 nbre = nbre < 0 ? 0 : nbre;
1088 double dist = 1.0 / (nbre+1);
1090 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1092 if (grid->isValid())
1094 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1100 // ========================================================= joinQuads
1101 Elements* Document::joinQuads (Quads tquada, Quad* quadb, Vertex* va1,
1102 Vertex* vb1, Vertex* va2, Vertex* vb2, RealVector& tlen)
1104 DumpStart ("joinQuads", tquada << quadb << va1 << vb1 << va2 << vb2 << tlen);
1106 Elements* grid = new Elements (this);
1109 grid->checkQuads (tquada);
1110 grid->checkQuad (quadb, -1);
1111 if (tquada.size()>0)
1112 grid->checkSense (3, va1, va2, tquada[0]);
1113 grid->checkSense (6, vb1, vb2, quadb);
1114 grid->checkVector (7, tlen, 1, true);
1116 if (grid->isValid())
1118 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1124 // ========================================================= cutUni
1125 Elements* Document::cutUni (Edge* edge, int nbre)
1127 DumpStart ("cutUni", edge << nbre);
1129 Elements* grid = new Elements (this);
1131 if (BadElement (edge))
1133 grid->setError (HERR);
1134 Mess << "Argument number 1 : edge is not valid";
1139 grid->setError (HERR);
1140 Mess << "Argument number 2 : number od subdivisions must be positive";
1144 double dist = 1.0 / (nbre+1);
1147 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1149 if (grid->isValid())
1151 grid->cutEdge (edge, tlen);
1157 // ========================================================= cut
1158 Elements* Document::cut (Edge* edge, RealVector& tlen)
1160 DumpStart ("cut", edge << tlen);
1162 Elements* grid = new Elements (this);
1164 if (BadElement (edge))
1166 grid->setError (HERR);
1167 Mess << "Argument number 1 : edge is not valid";
1170 grid->checkVector (2, tlen, 1, true);
1172 if (grid->isValid())
1174 grid->cutEdge (edge, tlen);