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 dx, double dy, double dz,
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;
79 for (int nro=1 ; nro<=nx; ++nro) tx.push_back (nro*dx);
80 for (int nro=1 ; nro<=ny; ++nro) ty.push_back (nro*dy);
81 for (int nro=1 ; nro<=nz; ++nro) tz.push_back (nro*dz);
83 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
89 // ======================================================== makeCartesian
90 Elements* Document::makeCartesian (Vertex* orig,
91 Vector* vx, Vector* vy, Vector* vz,
92 RealVector tx, RealVector ty, RealVector tz)
94 DumpStart ("makeCartesian", orig << vx << vy << vz << tx << ty << tz);
96 Elements* grid = new Elements (this);
99 grid->checkOrig (1, orig);
100 grid->checkSystem (2, vx, vy, vz, rx, ry, rz);
101 grid->checkVector (5, tx);
102 grid->checkVector (6, ty);
103 grid->checkVector (7, tz);
106 grid->makeCartesian (orig, rx, ry, rz, tx, ty, tz);
111 // ======================================================== makeCylinderTop
112 Elements* Document::makeCylinderTop (int nr, int na, int nh)
114 DumpStart ("makeCylinderTop", nr << na << nh);
116 Elements* grid = new Elements (this);
118 RealVector tray, tang, thaut;
119 Real3 rx = { 1, 0, 0 };
120 Real3 rz = { 0, 0, 1 };
122 grid->checkSize (1, nr, na, nh, true);
125 double da = 360.0 / na;
126 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (nro+1);
127 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
128 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro);
129 grid->makeCylinder (NULL, rx, rz, tray, tang, thaut, true);
135 // ======================================================== makeCylinderUni
136 Elements* Document::makeCylinderUni (Vertex* orig, Vector* vx, Vector* vz,
137 double rint, double rext, double ang, double haut,
138 int nr, int na, int nh)
140 DumpStart ("makeCylinderUni", orig << vx << vz << rint << rext
141 << ang << haut << nr << na << nh);
143 Elements* grid = new Elements (this);
146 grid->checkOrig (1, orig);
147 grid->checkSize (8, nr, na, nh, true);
148 grid->checkPipe (4, rint, rext, ang, haut);
149 grid->checkSystem (2, vx, vz, rx, rz);
153 double dray = (rext-rint) / nr;
154 double dang = ang / na;
155 double dhaut = haut / nh;
156 RealVector tang, tray, thaut;
158 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dray);
159 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*dang);
160 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro*dhaut);
162 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, true);
168 // ======================================================== makeCylinder
169 Elements* Document::makeCylinder (Vertex* orig, Vector* vx, Vector* vz,
170 RealVector tray, RealVector tang, RealVector thaut)
172 DumpStart ("makeCylinder", orig << vx << vz << tray << tang << thaut);
174 Elements* grid = new Elements (this);
177 grid->checkOrig (1, orig);
178 grid->checkSystem (2, vx, vz, rx, rz);
179 grid->checkVector (4, tray);
180 grid->checkVector (5, tang, 3);
181 grid->checkVector (6, thaut);
184 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, true);
189 // ======================================================== makePipeTop
190 Elements* Document::makePipeTop (int nr, int na, int nh)
192 DumpStart ("makePipeTop", nr << na << nh);
194 Elements* grid = new Elements (this);
196 RealVector tray, tang, thaut;
197 Real3 rx = { 1, 0, 0 };
198 Real3 rz = { 0, 0, 1 };
200 grid->checkSize (1,nr, na, nh, true);
203 double da = 360.0 / na;
204 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (nro+1);
205 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
206 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro);
207 grid->makeCylinder (NULL, rx, rz, tray, tang, thaut, false);
213 // ======================================================== makePipeUni
214 Elements* Document::makePipeUni (Vertex* orig, Vector* vx, Vector* vz,
215 double rint, double rext, double angle, double hauteur,
216 int nr, int na, int nh)
218 DumpStart ("makePipeUni", orig << vx << vz << rint << rext
219 << angle << hauteur << nr << na << nh);
221 Elements* grid = new Elements (this);
224 RealVector tray, tang, thaut;
225 grid->checkOrig (1, orig);
226 grid->checkSize (8, nr, na, nh, true);
227 grid->checkPipe (4, rint, rext, angle, hauteur);
228 grid->checkSystem (1, vx, vz, rx, rz);
232 double dray = (rext-rint) / nr;
233 double dang = angle / na;
234 double dhaut = hauteur / nh;
235 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dray);
236 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro * dang);
237 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (nro * dhaut);
239 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, false);
244 // ======================================================== makePipe
245 Elements* Document::makePipe (Vertex* orig, Vector* vx, Vector* vz,
246 RealVector tray, RealVector tang, RealVector thaut)
248 DumpStart ("makePipe", orig << vx << vz << tray << tang << thaut);
250 Elements* grid = new Elements (this);
253 grid->checkOrig (1, orig);
254 grid->checkSystem (2, vx, vz, rx, rz);
255 grid->checkVector (4, tray, 2);
256 grid->checkVector (5, tang, 3);
257 grid->checkVector (6, thaut, 2);
260 grid->makeCylinder (orig, rx, rz, tray, tang, thaut, false);
265 // ======================================================== makeSphericalTop
266 Elements* Document::makeSphericalTop (int nbre, int crit)
268 DumpStart ("makeSphericalTop", nbre << crit);
269 Elements* grid = new Elements (this);
271 Real3 orig = { 0, 0, 0 };
272 Real3 rx = { 1, 0, 0 };
273 Real3 rz = { 0, 0, 1 };
277 grid->setError (HERR);
278 Mess << "Argument number 1 :";
279 Mess << "Nbr slices must be greather or equal than 2";
285 for (int nro=1 ; nro<=nbre; ++nro) trayon.push_back (nro);
286 grid->makeSpherical (orig, rx, rz, trayon, crit);
292 // ======================================================== makeSphericalUni
293 Elements* Document::makeSphericalUni (Vertex* center, Vector* vx, Vector* vz,
294 double rayon, int nbre, int crit)
296 DumpStart ("makeSphericalUni", center << vx << vz << rayon << nbre << crit);
297 Elements* grid = new Elements (this);
300 grid->checkOrig (1, center);
301 grid->checkSystem (2, vx, vz, rx, rz);
305 grid->setError (HERR);
306 Mess << "Argument number 4 :";
307 Mess << "Radius must be positive";
312 grid->setError (HERR);
313 Mess << "Argument number 5 :";
314 Mess << "Nbr slices must be greather or equal than 2";
321 center->getPoint (orig);
322 for (int nro=1 ; nro<=nbre; ++nro) trayon.push_back (nro*rayon);
323 grid->makeSpherical (orig, rx, rz, trayon, crit);
329 // ======================================================== makeSpherical
330 Elements* Document::makeSpherical (Vertex* center, Vector* vx, Vector* vz,
331 RealVector trayon, int crit)
333 DumpStart ("makeSpherical", center << vx << vz << trayon << crit);
334 Elements* grid = new Elements (this);
337 grid->checkOrig (1, center);
338 grid->checkSystem (2, vx, vz, rx, rz);
339 grid->checkVector (4, trayon, 2);
344 center->getPoint (orig);
345 grid->makeSpherical (orig, rx, rz, trayon, crit);
352 // ======================================================== makeSphereTop
353 Elements* Document::makeSphereTop (int nr, int na, int nh)
355 DumpStart ("makeSphereTop", nr << na << nh);
356 Elements* grid = new Elements (this);
358 Real3 orig = { 0, 0, 0 };
359 Real3 rx = { 1, 0, 0 };
360 Real3 rz = { 0, 0, 1 };
367 grid->checkPhi (true, orig, rz, rext, rtrou, NULL, phi0, phi1);
371 grid->setError (HERR);
372 Mess << "Argument number 1 :";
373 Mess << "Nbr slices must be greather or equal than 2";
378 grid->setError (HERR);
379 Mess << "Argument number 2 :";
380 Mess << "Nbr sectors must be greather or equal than 3";
385 grid->setError (HERR);
386 Mess << "Argument number 3 :";
387 Mess << "Nbr slices must be greather or equal than 2";
392 double dr = (rext-rtrou)/nr;
393 double da = angle / na;
394 double dh = (phi1-phi0) / nh;
395 RealVector tray, tang, thaut;
396 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rtrou + nro*dr);
397 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
398 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
399 grid->makeRind (GR_HEMISPHERIC, orig, rx, rz, tray, tang, thaut);
405 // ======================================================== makeSphereUni
406 Elements* Document::makeSphereUni (Vertex* center, Vector* vx, Vector* vz,
407 double rtrou, double rext, double ang,
408 Vertex* hplan, int nr, int na, int nh)
410 DumpStart ("makeSphereUni", center << vx << vz << rtrou << rext << ang
411 << hplan << nr << na << nh);
412 Elements* grid = new Elements (this);
415 grid->checkOrig (1, center);
416 grid->checkSystem (2, vx, vz, rx, rz);
418 Real3 orig = { 0, 0, 0 };
420 center->getPoint (orig);
423 grid->checkPhi (true, orig, rz, rext, rtrou, hplan, phi0, phi1);
427 grid->setError (HERR);
428 Mess << "Argument number 4 :";
429 Mess << "Hole radius must be positive";
434 grid->setError (HERR);
435 Mess << "Argument number 5 :";
436 Mess << "External radius must be greather than hole radius";
441 grid->setError (HERR);
442 Mess << "Argument number 6 :";
443 Mess << "Angle must be positive";
448 grid->setError (HERR);
449 Mess << "Argument number 7 :";
450 Mess << "Nbr slices must be greather or equal than 2";
455 grid->setError (HERR);
456 Mess << "Argument number 8 :";
457 Mess << "Nbr sectors must be greather or equal than 3";
462 grid->setError (HERR);
463 Mess << "Argument number 9 :";
464 Mess << "Nbr slices must be greather or equal than 2";
467 EnumGrid type = ang>= 359.9 ? GR_HEMISPHERIC : GR_PART_SPHERIC;
470 double dr = (rext-rtrou)/nr;
471 double dh = (phi1-phi0) /nh;
472 double da = ang / na;
473 RealVector tray, tang, thaut;
474 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rtrou + nro*dr);
475 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
476 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
477 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
483 // ======================================================== makeSphere
484 Elements* Document::makeSphere (Vertex* center, Vector* vx, Vector* vz,
485 RealVector tray, RealVector tang, RealVector thaut)
487 DumpStart ("makeSphere", center << vx << vz << tray << tang << thaut );
488 Elements* grid = new Elements (this);
491 grid->checkOrig (1, center);
492 grid->checkSystem (2, vx, vz, rx, rz);
493 grid->checkVector (4, tray, 2);
494 grid->checkVector (5, tang, 3);
495 grid->checkVector (6, thaut, 2);
497 int nb = tang.size()-1;
498 double angle = nb <0 ? 0 : tang[nb] ;
499 EnumGrid type = angle >= 359.9 ? GR_HEMISPHERIC : GR_PART_SPHERIC;
503 center->getPoint (orig);
504 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
512 // ======================================================== makeRindTop
513 Elements* Document::makeRindTop (int nr, int na, int nh)
515 DumpStart ("makeRindTop", nr << na << nh);
516 Elements* grid = new Elements (this);
518 Real3 orig = { 0, 0, 0 };
519 Real3 rx = { 1, 0, 0 };
520 Real3 rz = { 0, 0, 1 };
528 grid->checkPhi (false, orig, rz, rext, rtrou, NULL, phi0, phi1);
532 grid->setError (HERR);
533 Mess << "Argument number 1 :";
534 Mess << "Nbr slices must be greather or equal than 2";
539 grid->setError (HERR);
540 Mess << "Argument number 2 :";
541 Mess << "Nbr sectors must be greather or equal than 3";
546 grid->setError (HERR);
547 Mess << "Argument number 3 :";
548 Mess << "Nbr slices must be greather or equal than 2";
553 double dr = (rext-rint)/nr;
554 double da = angle / na;
555 double dh = (phi1-phi0) / nh;
556 RealVector tray, tang, thaut;
557 tray .push_back (rtrou);
558 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dr);
559 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
560 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
561 grid->makeRind (GR_RIND, orig, rx, rz, tray, tang, thaut);
567 // ======================================================== makeRindUni
568 Elements* Document::makeRindUni (Vertex* center, Vector* vx, Vector* vz,
569 double rtrou, double rint, double rext,
570 double ang, Vertex* hplan, int nr, int na, int nh)
572 DumpStart ("makeRindUni", center << vx << vz << rtrou << rint << rext << ang
573 << hplan << nr << na << nh);
574 Elements* grid = new Elements (this);
577 grid->checkOrig (1, center);
578 grid->checkSystem (2, vx, vz, rx, rz);
579 grid->checkDiams (4, rtrou, rint);
580 grid->checkDiams (5, rint, rext);
582 Real3 orig = { 0, 0, 0 };
584 center->getPoint (orig);
587 grid->checkPhi (false, orig, rz, rext, rtrou, hplan, phi0, phi1);
591 grid->setError (HERR);
592 Mess << "Argument number 4 :";
593 Mess << "Hole radius must be positive";
598 grid->setError (HERR);
599 Mess << "Argument number 5 :";
600 Mess << "Internal radius must be greather than hole radius";
605 grid->setError (HERR);
606 Mess << "Argument number 6 :";
607 Mess << "External radius must be greather than internal radius";
612 grid->setError (HERR);
613 Mess << "Argument number 7 :";
614 Mess << "Angle must be positive";
619 grid->setError (HERR);
620 Mess << "Argument number 8 :";
621 Mess << "Nbr slices must be greather or equal than 2";
626 grid->setError (HERR);
627 Mess << "Argument number 9 :";
628 Mess << "Nbr sectors must be greather or equal than 3";
633 grid->setError (HERR);
634 Mess << "Argument number 10 :";
635 Mess << "Nbr slices must be greather or equal than 2";
638 EnumGrid type = ang>= 359.9 ? GR_RIND : GR_PART_RIND;
641 double dr = (rext-rint)/nr;
642 double dh = (phi1-phi0) /nh;
643 double da = ang / na;
644 RealVector tray, tang, thaut;
645 tray .push_back (rtrou);
646 for (int nro=0 ; nro<=nr; ++nro) tray .push_back (rint + nro*dr);
647 for (int nro=0 ; nro<=na; ++nro) tang .push_back (nro*da);
648 for (int nro=0 ; nro<=nh; ++nro) thaut.push_back (phi0 + nro*dh);
649 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
655 // ======================================================== makeRind
656 Elements* Document::makeRind (Vertex* center, Vector* vx, Vector* vz,
657 RealVector tray, RealVector tang, RealVector thaut)
659 DumpStart ("makeRind", center << vx << vz << tray << tang << thaut );
660 Elements* grid = new Elements (this);
663 grid->checkOrig (1, center);
664 grid->checkSystem (2, vx, vz, rx, rz);
665 grid->checkVector (4, tray, 2);
666 grid->checkVector (5, tang, 3);
667 grid->checkVector (6, thaut, 2);
669 int nb = tang.size()-1;
670 double angle = nb <0 ? 0 : tang[nb] ;
671 EnumGrid type = angle >= 359.9 ? GR_RIND : GR_PART_RIND;
675 center->getPoint (orig);
676 grid->makeRind (type, orig, rx, rz, tray, tang, thaut);
683 // ======================================================== makeCylinders
684 BiCylinder* Document::makeCylinders (Vertex* ori1, Vector* vz1, double ray1,
685 double h1, Vertex* ori2, Vector* vz2, double ray2, double h2)
687 DumpStart ("makeCylinders", ori1 << vz1 << ray1 << h1 << ori2 << vz2
689 BiCylinder* grid = new BiCylinder (this);
692 grid->checkOrig (1, ori1);
693 grid->checkOrig (5, ori2);
694 grid->checkSystem (2, vz1, vz2, rz1, rz2);
699 grid->makeCylinders (ori1, rz1, ray1, h1, ori2, rz2, ray2, h2);
701 grid->makeCylinders (ori2, rz2, ray2, h2, ori1, rz1, ray1, h1);
708 // ======================================================== makePipes
709 BiCylinder* Document::makePipes (Vertex* ori1, Vector* vz1, double rint1,
710 double rext1, double h1,
711 Vertex* ori2, Vector* vz2, double rint2, double rext2, double h2)
713 DumpStart ("makePipes", ori1 << vz1 << rint1 << rext1 << h1
714 << ori2 << vz2 << rint2 << rext2 << h2);
715 BiCylinder* grid = new BiCylinder (this);
718 grid->checkOrig (1, ori1);
719 grid->checkOrig (6, ori2);
720 grid->checkSystem (2, vz1, vz2, rz1, rz2);
721 grid->checkDiams (3, rint1, rext1);
722 grid->checkDiams (8, rint2, rext2);
727 grid->makePipes (ori1,rz1,rint1,rext1,h1, ori2,rz2,rint2,rext2,h2);
729 grid->makePipes (ori2,rz2,rint2,rext2,h2, ori1,rz1,rint1,rext1,h1);
735 // ------------------------------------------------------------------------
736 // ------------------------------------------------------------------------
737 // ------------------------------------------------------------------------
738 // ========================================================= extrudeQuadTop
739 Elements* Document::extrudeQuadTop (Quad* start, int nbre)
741 DumpStart ("extrudeQuadTop", start << nbre);
745 Real3 axe = { 0, 0, 1 };
747 Elements* grid = new Elements (this);
749 tstart.push_back (start);
751 grid->checkQuad (start);
752 grid->makeNormale (tstart, axe, larg);
753 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*larg);
757 grid->extrudeQuads (tstart, axe, tlen);
763 // ========================================================= extrudeQuadUni
764 Elements* Document::extrudeQuadUni (Quad* start, Vector* axis, double len,
767 DumpStart ("extrudeQuadUni", start << axis << len << nbre);
772 Elements* grid = new Elements (this);
774 grid->checkQuad (start);
775 grid->checkAxis (axis, axe);
777 tstart.push_back (start);
779 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*len);
783 grid->extrudeQuads (tstart, axe, tlen);
789 // ========================================================= extrudeQuad
790 Elements* Document::extrudeQuad (Quad* start, Vector* axis, RealVector tlen)
792 DumpStart ("extrudeQuad", start << axis << tlen);
796 Elements* grid = new Elements (this);
798 grid->checkQuad (start);
799 grid->checkAxis (axis, axe);
800 grid->checkVector (3, tlen);
802 tstart.push_back (start);
806 grid->extrudeQuads (tstart, axe, tlen);
813 // ========================================================= extrudeQuadsTop
814 Elements* Document::extrudeQuadsTop (Quads tstart, int nbre)
816 DumpStart ("extrudeQuadsTop", tstart << nbre);
819 Real3 axe = { 0, 0, 1 };
821 Elements* grid = new Elements (this);
823 grid->checkQuads (tstart);
824 grid->makeNormale (tstart, axe, larg);
825 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*larg);
829 grid->extrudeQuads (tstart, axe, tlen);
835 // ========================================================= extrudeQuadsUni
836 Elements* Document::extrudeQuadsUni (Quads tstart, Vector* axis, double len,
839 DumpStart ("extrudeQuadsUni", tstart << axis << len << nbre);
843 Elements* grid = new Elements (this);
845 grid->checkQuads (tstart);
846 grid->checkAxis (axis, axe);
848 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*len);
852 grid->extrudeQuads (tstart, axe, tlen);
858 // ========================================================= extrudeQuads
859 Elements* Document::extrudeQuads (Quads tstart, Vector* axis, RealVector tlen)
861 DumpStart ("extrudeQuads", tstart << axis << tlen);
864 Elements* grid = new Elements (this);
866 grid->checkQuads (tstart);
867 grid->checkAxis (axis, axe);
868 grid->checkVector (3, tlen);
872 grid->extrudeQuads (tstart, axe, tlen);
878 // ========================================================= revolutionQuadUni
879 Elements* Document::revolutionQuadUni (Quad* start, Vertex* center,
880 Vector* axis, double angle, int nbre)
882 DumpStart ("revolutionQuadUni", start << center << axis << angle << nbre);
887 Elements* grid = new Elements (this);
888 double alpha = angle / std::max (nbre, 1);
890 grid->checkQuad (start);
891 grid->checkOrig (2, center);
892 grid->checkAxis (axis, axe);
894 tstart.push_back (start);
895 for (int nro=0 ; nro<nbre; ++nro) angles.push_back ((nro+1)*alpha);
899 grid->extrudeQuads (tstart, axe, angles, true, center);
905 // ========================================================= revolutionQuad
906 Elements* Document::revolutionQuad (Quad* start, Vertex* center, Vector* axis,
909 DumpStart ("revolutionQuads", start << center << axis << angles);
913 Elements* grid = new Elements (this);
915 grid->checkQuad (start);
916 grid->checkOrig (2, center);
917 grid->checkAxis (axis, axe);
919 tstart.push_back (start);
923 grid->extrudeQuads (tstart, axe, angles, true, center);
929 // ========================================================= revolutionQuadsUni
930 Elements* Document::revolutionQuadsUni (Quads tstart, Vertex* center,
931 Vector* axis, double angle, int nbre)
933 DumpStart ("revolutionQuadsUni", tstart << center << axis << angle << nbre);
937 Elements* grid = new Elements (this);
938 double alpha = angle / std::max (nbre, 1);
940 grid->checkQuads (tstart);
941 grid->checkOrig (2, center);
942 grid->checkAxis (axis, axe);
944 for (int nro=0 ; nro<nbre; ++nro) angles.push_back ((nro+1)*alpha);
948 grid->extrudeQuads (tstart, axe, angles, true, center);
954 // ========================================================= revolutionQuads
955 Elements* Document::revolutionQuads (Quads tstart, Vertex* center, Vector* axis,
958 DumpStart ("revolutionQuads", tstart << center << axis << angles);
961 Elements* grid = new Elements (this);
963 grid->checkQuads (tstart);
964 grid->checkOrig (2, center);
965 grid->checkAxis (axis, axe);
966 grid->checkVector (4, angles);
970 grid->extrudeQuads (tstart, axe, angles, true, center);
976 // ------------------------------------------------------------------------
977 // ------------------------------------------------------------------------
978 // ------------------------------------------------------------------------
979 // ========================================================= joinQuadUni
980 Elements* Document::joinQuadUni (Quad* quada, Quad* quadb, Vertex* va1,
981 Vertex* vb1, Vertex* va2, Vertex* vb2, int nbre)
983 DumpStart ("joinQuadUni", quada << quadb << va1<<vb1 << va2<<vb2 << nbre);
987 Elements* grid = new Elements (this);
990 grid->checkQuad (quada);
991 grid->checkQuad (quadb, -1);
992 grid->checkSense (3, va1, va2, quada);
993 grid->checkSense (6, vb1, vb2, quadb);
995 nbre = nbre < 0 ? 0 : nbre;
996 double dist = 1.0 / (nbre+1);
998 tquada.push_back (quada);
999 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1001 if (grid->isValid())
1003 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1009 // ========================================================= joinQuad
1010 Elements* Document::joinQuad (Quad* quada, Quad* quadb, Vertex* va1,
1011 Vertex* vb1, Vertex* va2, Vertex* vb2, RealVector& tlen)
1013 DumpStart ("joinQuad", quada << quadb << va1 << vb1 << va2 << vb2 << tlen);
1016 Elements* grid = new Elements (this);
1019 grid->checkQuad (quada);
1020 grid->checkQuad (quadb, -1);
1021 grid->checkSense (3, va1, va2, quada);
1022 grid->checkSense (6, vb1, vb2, quadb);
1023 grid->checkVector (7, tlen, 0, true);
1025 tquada.push_back (quada);
1027 if (grid->isValid())
1029 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1035 // ========================================================= joinQuadsUni
1036 Elements* Document::joinQuadsUni (Quads tquada, Quad* quadb, Vertex* va1,
1037 Vertex* vb1, Vertex* va2, Vertex* vb2, int nbre)
1039 DumpStart ("joinQuadsUni", tquada << quadb << va1 << vb1 << va2 << vb2
1042 Elements* grid = new Elements (this);
1045 grid->checkQuads (tquada);
1046 grid->checkQuad (quadb, -1);
1047 if (tquada.size()>0)
1048 grid->checkSense (3, va1, va2, tquada[0]);
1049 grid->checkSense (6, vb1, vb2, quadb);
1051 nbre = nbre < 0 ? 0 : nbre;
1052 double dist = 1.0 / (nbre+1);
1054 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1056 if (grid->isValid())
1058 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1064 // ========================================================= joinQuads
1065 Elements* Document::joinQuads (Quads tquada, Quad* quadb, Vertex* va1,
1066 Vertex* vb1, Vertex* va2, Vertex* vb2, RealVector& tlen)
1068 DumpStart ("joinQuads", tquada << quadb << va1 << vb1 << va2 << vb2 << tlen);
1070 Elements* grid = new Elements (this);
1073 grid->checkQuads (tquada);
1074 grid->checkQuad (quadb, -1);
1075 if (tquada.size()>0)
1076 grid->checkSense (3, va1, va2, tquada[0]);
1077 grid->checkSense (6, vb1, vb2, quadb);
1078 grid->checkVector (7, tlen, 1, true);
1080 if (grid->isValid())
1082 grid->joinQuads (tquada, quadb, va1, vb1, va2, vb2, tlen);
1088 // ========================================================= cutUni
1089 Elements* Document::cutUni (Edge* edge, int nbre)
1091 DumpStart ("cutUni", edge << nbre);
1093 Elements* grid = new Elements (this);
1095 if (BadElement (edge))
1097 grid->setError (HERR);
1098 Mess << "Argument number 1 : edge is not valid";
1103 grid->setError (HERR);
1104 Mess << "Argument number 2 : number od subdivisions must be positive";
1108 double dist = 1.0 / (nbre+1);
1111 for (int nro=0 ; nro<nbre; ++nro) tlen.push_back ((nro+1)*dist);
1113 if (grid->isValid())
1115 grid->cutEdge (edge, tlen);
1121 // ========================================================= cut
1122 Elements* Document::cut (Edge* edge, RealVector& tlen)
1124 DumpStart ("cut", edge << tlen);
1126 Elements* grid = new Elements (this);
1128 if (BadElement (edge))
1130 grid->setError (HERR);
1131 Mess << "Argument number 1 : edge is not valid";
1134 grid->checkVector (2, tlen, 1, true);
1136 if (grid->isValid())
1138 grid->cutEdge (edge, tlen);