2 // C++ : Fonctions de creation HexaBlock v6
4 // Copyright (C) 2009-2013 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.
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/
21 // 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"
30 #include "HexGlobale.hxx"
35 // ======================================================== makeCartesianTop
36 Elements* Document::makeCartesianTop (int nx, int ny, int nz)
38 DumpStart ("makeCartesianTop", nx << ny << nz );
39 Elements* grid = new Elements (this);
41 RealVector tx, ty, tz;
42 Real3 rx = { 1, 0, 0 };
43 Real3 ry = { 0, 1, 0 };
44 Real3 rz = { 0, 0, 1 };
46 grid->checkSize (1, nx, ny, nz, false);
49 Vertex* orig = addVertex (0, 0, 0);
50 for (int nro=1 ; nro<=nx; ++nro) tx.push_back (nro);
51 for (int nro=1 ; nro<=ny; ++nro) ty.push_back (nro);
52 for (int nro=1 ; nro<=nz; ++nro) tz.push_back (nro);
53 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
59 // ======================================================== makeCartesianUni
60 Elements* Document::makeCartesianUni (Vertex* orig,
61 Vector* vx, Vector* vy, Vector* vz,
62 double lx, double ly, double lz,
63 int nx, int ny, int nz)
65 DumpStart ("makeCartesianUni", orig << vx << vy << vz
69 Elements* grid = new Elements (this);
72 grid->checkOrig (1, orig);
73 grid->checkSize (8, nx, ny, nz, false);
74 grid->checkSystem (2, vx, vy, vz, rx, ry, rz);
78 RealVector tx, ty, tz;
82 for (int nro=1 ; nro<=nx; ++nro) tx.push_back (nro*dx);
83 for (int nro=1 ; nro<=ny; ++nro) ty.push_back (nro*dy);
84 for (int nro=1 ; nro<=nz; ++nro) tz.push_back (nro*dz);
86 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
92 // ======================================================== makeCartesian
93 Elements* Document::makeCartesian (Vertex* orig,
94 Vector* vx, Vector* vy, Vector* vz,
95 RealVector tx, RealVector ty, RealVector tz)
97 DumpStart ("makeCartesian", orig << vx << vy << vz << tx << ty << tz);
99 Elements* grid = new Elements (this);
102 grid->checkOrig (1, orig);
103 grid->checkSystem (2, vx, vy, vz, rx, ry, rz);
104 grid->checkVector (5, tx);
105 grid->checkVector (6, ty);
106 grid->checkVector (7, tz);
109 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
114 // ======================================================== makeCylinderTop
115 Elements* Document::makeCylinderTop (int nr, int na, int nh)
117 DumpStart ("makeCylinderTop", nr << na << nh);
119 Elements* grid = new Elements (this);
121 RealVector tray, tang, thaut;
122 Real3 rx = { 1, 0, 0 };
123 Real3 rz = { 0, 0, 1 };
125 grid->checkSize (1, nr, na, nh, true);
128 double da = 360.0 / na;
129 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (nro+1);
130 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
131 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro);
132 grid->makeCylinder (NULL, rx, rz, tray, tang, thaut, true);
138 // ======================================================== makeCylinderUni
139 Elements* Document::makeCylinderUni (Vertex* orig, Vector* vx, Vector* vz,
140 double rint, double rext, double ang, double haut,
141 int nr, int na, int nh)
143 DumpStart ("makeCylinderUni", orig << vx << vz << rint << rext
144 << ang << haut << nr << na << nh);
146 Elements* grid = new Elements (this);
149 grid->checkOrig (1, orig);
150 grid->checkSize (8, nr, na, nh, true);
151 grid->checkPipe (4, rint, rext, ang, haut);
152 grid->checkSystem (2, vx, vz, rx, rz);
156 double dray = (rext-rint) / nr;
157 double dang = ang / na;
158 double dhaut = haut / nh;
159 RealVector tang, tray, thaut;
161 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dray);
162 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*dang);
163 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro*dhaut);
165 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, true);
171 // ======================================================== makeCylinder
172 Elements* Document::makeCylinder (Vertex* orig, Vector* vx, Vector* vz,
173 RealVector tray, RealVector tang, RealVector thaut)
175 DumpStart ("makeCylinder", orig << vx << vz << tray << tang << thaut);
177 Elements* grid = new Elements (this);
180 grid->checkOrig (1, orig);
181 grid->checkSystem (2, vx, vz, rx, rz);
182 grid->checkVector (4, tray);
183 grid->checkVector (5, tang, 3);
184 grid->checkVector (6, thaut);
187 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, true);
192 // ======================================================== makePipeTop
193 Elements* Document::makePipeTop (int nr, int na, int nh)
195 DumpStart ("makePipeTop", nr << na << nh);
197 Elements* grid = new Elements (this);
199 RealVector tray, tang, thaut;
200 Real3 rx = { 1, 0, 0 };
201 Real3 rz = { 0, 0, 1 };
203 grid->checkSize (1,nr, na, nh, true);
206 double da = 360.0 / na;
207 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (nro+1);
208 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
209 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro);
210 grid->makeCylinder (NULL, rx, rz, tray, tang, thaut, false);
216 // ======================================================== makePipeUni
217 Elements* Document::makePipeUni (Vertex* orig, Vector* vx, Vector* vz,
218 double rint, double rext, double angle, double hauteur,
219 int nr, int na, int nh)
221 DumpStart ("makePipeUni", orig << vx << vz << rint << rext
222 << angle << hauteur << nr << na << nh);
224 Elements* grid = new Elements (this);
227 RealVector tray, tang, thaut;
228 grid->checkOrig (1, orig);
229 grid->checkSize (8, nr, na, nh, true);
230 grid->checkPipe (4, rint, rext, angle, hauteur);
231 grid->checkSystem (1, vx, vz, rx, rz);
235 double dray = (rext-rint) / nr;
236 double dang = angle / na;
237 double dhaut = hauteur / nh;
238 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dray);
239 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro * dang);
240 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro * dhaut);
242 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, false);
247 // ======================================================== makePipe
248 Elements* Document::makePipe (Vertex* orig, Vector* vx, Vector* vz,
249 RealVector tray, RealVector tang, RealVector thaut)
251 DumpStart ("makePipe", orig << vx << vz << tray << tang << thaut);
253 Elements* grid = new Elements (this);
256 grid->checkOrig (1, orig);
257 grid->checkSystem (2, vx, vz, rx, rz);
258 grid->checkVector (4, tray, 2);
259 grid->checkVector (5, tang, 3);
260 grid->checkVector (6, thaut, 2);
263 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, false);
268 // ======================================================== makeSphericalTop
269 Elements* Document::makeSphericalTop (int nbre, int crit)
271 DumpStart ("makeSphericalTop", nbre << crit);
272 Elements* grid = new Elements (this);
274 Real3 orig = { 0, 0, 0 };
275 Real3 rx = { 1, 0, 0 };
276 Real3 rz = { 0, 0, 1 };
280 grid->setError (HERR);
281 Mess << "Argument number 1 :";
282 Mess << "Nbr slices must be greather or equal than 2";
288 for (int nro=1 ; nro<=nbre; ++nro) trayon.push_back (nro);
289 grid->makeSpherical (orig, rx, rz, trayon, crit);
295 // ======================================================== makeSphericalUni
296 Elements* Document::makeSphericalUni (Vertex* center, Vector* vx, Vector* vz,
297 double rayon, int nbre, int crit)
299 DumpStart ("makeSphericalUni", center << vx << vz << rayon << nbre << crit);
300 Elements* grid = new Elements (this);
303 grid->checkOrig (1, center);
304 grid->checkSystem (2, vx, vz, rx, rz);
308 grid->setError (HERR);
309 Mess << "Argument number 4 :";
310 Mess << "Radius must be positive";
315 grid->setError (HERR);
316 Mess << "Argument number 5 :";
317 Mess << "Nbr slices must be greather or equal than 2";
324 center->getPoint (orig);
325 for (int nro=1 ; nro<=nbre; ++nro) trayon.push_back (nro*rayon);
326 grid->makeSpherical (orig, rx, rz, trayon, crit);
332 // ======================================================== makeSpherical
333 Elements* Document::makeSpherical (Vertex* center, Vector* vx, Vector* vz,
334 RealVector trayon, int crit)
336 DumpStart ("makeSpherical", center << vx << vz << trayon << crit);
337 Elements* grid = new Elements (this);
340 grid->checkOrig (1, center);
341 grid->checkSystem (2, vx, vz, rx, rz);
342 grid->checkVector (4, trayon, 2);
347 center->getPoint (orig);
348 grid->makeSpherical (orig, rx, rz, trayon, crit);
355 // ======================================================== makeSphereTop
356 Elements* Document::makeSphereTop (int nr, int na, int nh)
358 DumpStart ("makeSphereTop", nr << na << nh);
359 Elements* grid = new Elements (this);
361 Real3 orig = { 0, 0, 0 };
362 Real3 rx = { 1, 0, 0 };
363 Real3 rz = { 0, 0, 1 };
370 grid->checkPhi (true, orig, rz, rext, rtrou, NULL, phi0, phi1);
374 grid->setError (HERR);
375 Mess << "Argument number 1 :";
376 Mess << "Nbr slices must be greather or equal than 2";
381 grid->setError (HERR);
382 Mess << "Argument number 2 :";
383 Mess << "Nbr sectors must be greather or equal than 3";
388 grid->setError (HERR);
389 Mess << "Argument number 3 :";
390 Mess << "Nbr slices must be greather or equal than 2";
395 double dr = (rext-rtrou)/nr;
396 double da = angle / na;
397 double dh = (phi1-phi0) / nh;
398 RealVector tray, tang, thaut;
399 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rtrou + nro*dr);
400 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
401 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
402 grid->makeRind (GR_HEMISPHERIC, orig, rx, rz, tray, tang, thaut);
408 // ======================================================== makeSphereUni
409 Elements* Document::makeSphereUni (Vertex* center, Vector* vx, Vector* vz,
410 double rtrou, double rext, double ang,
411 Vertex* hplan, int nr, int na, int nh)
413 DumpStart ("makeSphereUni", center << vx << vz << rtrou << rext << ang
414 << hplan << nr << na << nh);
415 Elements* grid = new Elements (this);
418 grid->checkOrig (1, center);
419 grid->checkSystem (2, vx, vz, rx, rz);
421 Real3 orig = { 0, 0, 0 };
423 center->getPoint (orig);
426 grid->checkPhi (true, orig, rz, rext, rtrou, hplan, phi0, phi1);
430 grid->setError (HERR);
431 Mess << "Argument number 4 :";
432 Mess << "Hole radius must be positive";
437 grid->setError (HERR);
438 Mess << "Argument number 5 :";
439 Mess << "External radius must be greather than hole radius";
444 grid->setError (HERR);
445 Mess << "Argument number 6 :";
446 Mess << "Angle must be positive";
451 grid->setError (HERR);
452 Mess << "Argument number 7 :";
453 Mess << "Nbr slices must be greather or equal than 2";
458 grid->setError (HERR);
459 Mess << "Argument number 8 :";
460 Mess << "Nbr sectors must be greather or equal than 3";
465 grid->setError (HERR);
466 Mess << "Argument number 9 :";
467 Mess << "Nbr slices must be greather or equal than 2";
470 EnumGrid type = ang>= 359.9 ? GR_HEMISPHERIC : GR_PART_SPHERIC;
473 double dr = (rext-rtrou)/nr;
474 double dh = (phi1-phi0) /nh;
475 double da = ang / na;
476 RealVector tray, tang, thaut;
477 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rtrou + nro*dr);
478 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
479 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
480 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
486 // ======================================================== makeSphere
487 Elements* Document::makeSphere (Vertex* center, Vector* vx, Vector* vz,
488 RealVector tray, RealVector tang, RealVector thaut)
490 DumpStart ("makeSphere", center << vx << vz << tray << tang << thaut );
491 Elements* grid = new Elements (this);
494 grid->checkOrig (1, center);
495 grid->checkSystem (2, vx, vz, rx, rz);
496 grid->checkVector (4, tray, 2);
497 grid->checkVector (5, tang, 3);
498 grid->checkVector (6, thaut, 2);
500 int nb = tang.size()-1;
501 double angle = nb <0 ? 0 : tang[nb] ;
502 EnumGrid type = angle >= 359.9 ? GR_HEMISPHERIC : GR_PART_SPHERIC;
506 center->getPoint (orig);
507 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
515 // ======================================================== makeRindTop
516 Elements* Document::makeRindTop (int nr, int na, int nh)
518 DumpStart ("makeRindTop", nr << na << nh);
519 Elements* grid = new Elements (this);
521 Real3 orig = { 0, 0, 0 };
522 Real3 rx = { 1, 0, 0 };
523 Real3 rz = { 0, 0, 1 };
531 grid->checkPhi (false, orig, rz, rext, rtrou, NULL, phi0, phi1);
535 grid->setError (HERR);
536 Mess << "Argument number 1 :";
537 Mess << "Nbr slices must be greather or equal than 2";
542 grid->setError (HERR);
543 Mess << "Argument number 2 :";
544 Mess << "Nbr sectors must be greather or equal than 3";
549 grid->setError (HERR);
550 Mess << "Argument number 3 :";
551 Mess << "Nbr slices must be greather or equal than 2";
556 double dr = (rext-rint)/nr;
557 double da = angle / na;
558 double dh = (phi1-phi0) / nh;
559 RealVector tray, tang, thaut;
560 tray .push_back (rtrou);
561 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dr);
562 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
563 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
564 grid->makeRind (GR_RIND, orig, rx, rz, tray, tang, thaut);
570 // ======================================================== makeRindUni
571 Elements* Document::makeRindUni (Vertex* center, Vector* vx, Vector* vz,
572 double rtrou, double rint, double rext,
573 double ang, Vertex* hplan, int nr, int na, int nh)
575 DumpStart ("makeRindUni", center << vx << vz << rtrou << rint << rext << ang
576 << hplan << nr << na << nh);
577 Elements* grid = new Elements (this);
580 grid->checkOrig (1, center);
581 grid->checkSystem (2, vx, vz, rx, rz);
582 grid->checkDiams (4, rtrou, rint);
583 grid->checkDiams (5, rint, rext);
585 Real3 orig = { 0, 0, 0 };
587 center->getPoint (orig);
590 grid->checkPhi (false, orig, rz, rext, rtrou, hplan, phi0, phi1);
594 grid->setError (HERR);
595 Mess << "Argument number 4 :";
596 Mess << "Hole radius must be positive";
601 grid->setError (HERR);
602 Mess << "Argument number 5 :";
603 Mess << "Internal radius must be greather than hole radius";
608 grid->setError (HERR);
609 Mess << "Argument number 6 :";
610 Mess << "External radius must be greather than internal radius";
615 grid->setError (HERR);
616 Mess << "Argument number 7 :";
617 Mess << "Angle must be positive";
622 grid->setError (HERR);
623 Mess << "Argument number 8 :";
624 Mess << "Nbr slices must be greather or equal than 2";
629 grid->setError (HERR);
630 Mess << "Argument number 9 :";
631 Mess << "Nbr sectors must be greather or equal than 3";
636 grid->setError (HERR);
637 Mess << "Argument number 10 :";
638 Mess << "Nbr slices must be greather or equal than 2";
641 EnumGrid type = ang>= 359.9 ? GR_RIND : GR_PART_RIND;
644 double dr = (rext-rint)/nr;
645 double dh = (phi1-phi0) /nh;
646 double da = ang / na;
647 RealVector tray, tang, thaut;
648 tray .push_back (rtrou);
649 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dr);
650 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
651 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
652 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
658 // ======================================================== makeRind
659 Elements* Document::makeRind (Vertex* center, Vector* vx, Vector* vz,
660 RealVector tray, RealVector tang, RealVector thaut)
662 DumpStart ("makeRind", center << vx << vz << tray << tang << thaut );
663 Elements* grid = new Elements (this);
666 grid->checkOrig (1, center);
667 grid->checkSystem (2, vx, vz, rx, rz);
668 grid->checkVector (4, tray, 2);
669 grid->checkVector (5, tang, 3);
670 grid->checkVector (6, thaut, 2);
672 int nb = tang.size()-1;
673 double angle = nb <0 ? 0 : tang[nb] ;
674 EnumGrid type = angle >= 359.9 ? GR_RIND : GR_PART_RIND;
678 center->getPoint (orig);
679 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
686 // ======================================================== makeCylinders
687 BiCylinder* Document::makeCylinders (Vertex* ori1, Vector* vz1, double ray1,
688 double h1, Vertex* ori2, Vector* vz2, double ray2, double h2)
690 DumpStart ("makeCylinders", ori1 << vz1 << ray1 << h1 << ori2 << vz2
692 BiCylinder* grid = new BiCylinder (this);
695 grid->checkOrig (1, ori1);
696 grid->checkOrig (5, ori2);
697 grid->checkSystem (2, vz1, vz2, rz1, rz2);
702 grid->makeCylinders (ori1, rz1, ray1, h1, ori2, rz2, ray2, h2);
704 grid->makeCylinders (ori2, rz2, ray2, h2, ori1, rz1, ray1, h1);
711 // ======================================================== makePipes
712 BiCylinder* Document::makePipes (Vertex* ori1, Vector* vz1, double rint1,
713 double rext1, double h1,
714 Vertex* ori2, Vector* vz2, double rint2, double rext2, double h2)
716 DumpStart ("makePipes", ori1 << vz1 << rint1 << rext1 << h1
717 << ori2 << vz2 << rint2 << rext2 << h2);
718 BiCylinder* grid = new BiCylinder (this);
721 grid->checkOrig (1, ori1);
722 grid->checkOrig (6, ori2);
723 grid->checkSystem (2, vz1, vz2, rz1, rz2);
724 grid->checkDiams (3, rint1, rext1);
725 grid->checkDiams (8, rint2, rext2);
730 grid->makePipes (ori1,rz1,rint1,rext1,h1, ori2,rz2,rint2,rext2,h2);
732 grid->makePipes (ori2,rz2,rint2,rext2,h2, ori1,rz1,rint1,rext1,h1);
738 // ------------------------------------------------------------------------
739 // ------------------------------------------------------------------------
740 // ------------------------------------------------------------------------
741 // ========================================================= extrudeQuadTop
742 Elements* Document::extrudeQuadTop (Quad* start, int nbre)
744 DumpStart ("extrudeQuadTop", start << nbre);
748 Real3 axe = { 0, 0, 1 };
750 Elements* grid = new Elements (this);
752 tstart.push_back (start);
754 grid->checkQuad (start);
755 grid->makeNormale (tstart, axe, larg);
756 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*larg);
760 grid->extrudeQuads (tstart, axe, tlen);
766 // ========================================================= extrudeQuadUni
767 Elements* Document::extrudeQuadUni (Quad* start, Vector* axis, double len,
770 DumpStart ("extrudeQuadUni", start << axis << len << nbre);
775 Elements* grid = new Elements (this);
777 grid->checkQuad (start);
778 grid->checkAxis (axis, axe);
780 tstart.push_back (start);
782 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*len);
786 grid->extrudeQuads (tstart, axe, tlen);
792 // ========================================================= extrudeQuad
793 Elements* Document::extrudeQuad (Quad* start, Vector* axis, RealVector tlen)
795 DumpStart ("extrudeQuad", start << axis << tlen);
799 Elements* grid = new Elements (this);
801 grid->checkQuad (start);
802 grid->checkAxis (axis, axe);
803 grid->checkVector (3, tlen);
805 tstart.push_back (start);
809 grid->extrudeQuads (tstart, axe, tlen);
816 // ========================================================= extrudeQuadsTop
817 Elements* Document::extrudeQuadsTop (Quads tstart, int nbre)
819 DumpStart ("extrudeQuadsTop", tstart << nbre);
822 Real3 axe = { 0, 0, 1 };
824 Elements* grid = new Elements (this);
826 grid->checkQuads (tstart);
827 grid->makeNormale (tstart, axe, larg);
828 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*larg);
832 grid->extrudeQuads (tstart, axe, tlen);
838 // ========================================================= extrudeQuadsUni
839 Elements* Document::extrudeQuadsUni (Quads tstart, Vector* axis, double len,
842 DumpStart ("extrudeQuadsUni", tstart << axis << len << nbre);
846 Elements* grid = new Elements (this);
848 grid->checkQuads (tstart);
849 grid->checkAxis (axis, axe);
851 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*len);
855 grid->extrudeQuads (tstart, axe, tlen);
861 // ========================================================= extrudeQuads
862 Elements* Document::extrudeQuads (Quads tstart, Vector* axis, RealVector tlen)
864 DumpStart ("extrudeQuads", tstart << axis << tlen);
867 Elements* grid = new Elements (this);
869 grid->checkQuads (tstart);
870 grid->checkAxis (axis, axe);
871 grid->checkVector (3, tlen);
875 grid->extrudeQuads (tstart, axe, tlen);
881 // ========================================================= revolutionQuadUni
882 Elements* Document::revolutionQuadUni (Quad* start, Vertex* center,
883 Vector* axis, double angle, int nbre)
885 DumpStart ("revolutionQuadUni", start << center << axis << angle << nbre);
890 Elements* grid = new Elements (this);
891 double alpha = angle / std::max (nbre, 1);
893 grid->checkQuad (start);
894 grid->checkOrig (2, center);
895 grid->checkAxis (axis, axe);
897 tstart.push_back (start);
898 for (int nro=0 ; nro<nbre; ++nro) angles.push_back ((nro+1)*alpha);
902 grid->extrudeQuads (tstart, axe, angles, true, center);
908 // ========================================================= revolutionQuad
909 Elements* Document::revolutionQuad (Quad* start, Vertex* center, Vector* axis,
912 DumpStart ("revolutionQuads", start << center << axis << angles);
916 Elements* grid = new Elements (this);
918 grid->checkQuad (start);
919 grid->checkOrig (2, center);
920 grid->checkAxis (axis, axe);
922 tstart.push_back (start);
926 grid->extrudeQuads (tstart, axe, angles, true, center);
932 // ========================================================= revolutionQuadsUni
933 Elements* Document::revolutionQuadsUni (Quads tstart, Vertex* center,
934 Vector* axis, double angle, int nbre)
936 DumpStart ("revolutionQuadsUni", tstart << center << axis << angle << nbre);
940 Elements* grid = new Elements (this);
941 double alpha = angle / std::max (nbre, 1);
943 grid->checkQuads (tstart);
944 grid->checkOrig (2, center);
945 grid->checkAxis (axis, axe);
947 for (int nro=0 ; nro<nbre; ++nro) angles.push_back ((nro+1)*alpha);
951 grid->extrudeQuads (tstart, axe, angles, true, center);
957 // ========================================================= revolutionQuads
958 Elements* Document::revolutionQuads (Quads tstart, Vertex* center, Vector* axis,
961 DumpStart ("revolutionQuads", tstart << center << axis << angles);
964 Elements* grid = new Elements (this);
966 grid->checkQuads (tstart);
967 grid->checkOrig (2, center);
968 grid->checkAxis (axis, axe);
969 grid->checkVector (4, angles);
973 grid->extrudeQuads (tstart, axe, angles, true, center);
979 // ------------------------------------------------------------------------
980 // ------------------------------------------------------------------------
981 // ------------------------------------------------------------------------
982 // ========================================================= joinQuadUni
983 Elements* Document::joinQuadUni (Quad* quada, Quad* quadb, Vertex* va1,
984 Vertex* vb1, Vertex* va2, Vertex* vb2, int nbre)
986 DumpStart ("joinQuadUni", quada << quadb << va1<<vb1 << va2<<vb2 << nbre);
990 Elements* grid = new Elements (this);
993 grid->checkQuad (quada);
994 grid->checkQuad (quadb, -1);
995 grid->checkSense (3, va1, va2, quada);
996 grid->checkSense (6, vb1, vb2, quadb);
998 nbre = nbre < 0 ? 0 : nbre;
999 double dist = 1.0 / (nbre+1);
1001 tquada.push_back (quada);
1002 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1004 if (grid->isValid())
1006 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1012 // ========================================================= joinQuad
1013 Elements* Document::joinQuad (Quad* quada, Quad* quadb, Vertex* va1,
1014 Vertex* vb1, Vertex* va2, Vertex* vb2, RealVector& tlen)
1016 DumpStart ("joinQuad", quada << quadb << va1 << vb1 << va2 << vb2 << tlen);
1019 Elements* grid = new Elements (this);
1022 grid->checkQuad (quada);
1023 grid->checkQuad (quadb, -1);
1024 grid->checkSense (3, va1, va2, quada);
1025 grid->checkSense (6, vb1, vb2, quadb);
1026 grid->checkVector (7, tlen, 0, true);
1028 tquada.push_back (quada);
1030 if (grid->isValid())
1032 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1038 // ========================================================= joinQuadsUni
1039 Elements* Document::joinQuadsUni (Quads tquada, Quad* quadb, Vertex* va1,
1040 Vertex* vb1, Vertex* va2, Vertex* vb2, int nbre)
1042 DumpStart ("joinQuadsUni", tquada << quadb << va1 << vb1 << va2 << vb2
1045 Elements* grid = new Elements (this);
1048 grid->checkQuads (tquada);
1049 grid->checkQuad (quadb, -1);
1050 if (tquada.size()>0)
1051 grid->checkSense (3, va1, va2, tquada[0]);
1052 grid->checkSense (6, vb1, vb2, quadb);
1054 nbre = nbre < 0 ? 0 : nbre;
1055 double dist = 1.0 / (nbre+1);
1057 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1059 if (grid->isValid())
1061 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1067 // ========================================================= joinQuads
1068 Elements* Document::joinQuads (Quads tquada, Quad* quadb, Vertex* va1,
1069 Vertex* vb1, Vertex* va2, Vertex* vb2, RealVector& tlen)
1071 DumpStart ("joinQuads", tquada << quadb << va1 << vb1 << va2 << vb2 << tlen);
1073 Elements* grid = new Elements (this);
1076 grid->checkQuads (tquada);
1077 grid->checkQuad (quadb, -1);
1078 if (tquada.size()>0)
1079 grid->checkSense (3, va1, va2, tquada[0]);
1080 grid->checkSense (6, vb1, vb2, quadb);
1081 grid->checkVector (7, tlen, 1, true);
1083 if (grid->isValid())
1085 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1091 // ========================================================= cutUni
1092 Elements* Document::cutUni (Edge* edge, int nbre)
1094 DumpStart ("cutUni", edge << nbre);
1096 Elements* grid = new Elements (this);
1098 if (BadElement (edge))
1100 grid->setError (HERR);
1101 Mess << "Argument number 1 : edge is not valid";
1106 grid->setError (HERR);
1107 Mess << "Argument number 2 : number od subdivisions must be positive";
1111 double dist = 1.0 / (nbre+1);
1114 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1116 if (grid->isValid())
1118 grid->cutEdge (edge, tlen);
1124 // ========================================================= cut
1125 Elements* Document::cut (Edge* edge, RealVector& tlen)
1127 DumpStart ("cut", edge << tlen);
1129 Elements* grid = new Elements (this);
1131 if (BadElement (edge))
1133 grid->setError (HERR);
1134 Mess << "Argument number 1 : edge is not valid";
1137 grid->checkVector (2, tlen, 1, true);
1139 if (grid->isValid())
1141 grid->cutEdge (edge, tlen);
1147 // ========================================================= replaceHexas
1148 Elements* Document::replaceHexas (Quads pattern, Quads cible, Vertex* p1,
1149 Vertex* c1, Vertex* p2, Vertex* c2,
1150 Vertex* p3, Vertex* c3)
1152 DumpStart ("replace", pattern << cible << p1 << c1 << p2 << c2 << p3 << c3);
1154 Elements* t_hexas = new Elements (this);
1156 //if (BadElement (edge))
1158 t_hexas->setError (HERR);
1159 Mess << "This function is not yet implemented";
1162 DumpReturn (t_hexas);