Salome HOME
RNC: IMP EDF 1542: Added the functionnality MakeVertexOnCurveByLength that allows...
[modules/geom.git] / src / GEOM_I / GEOM_I3DPrimOperations_i.cc
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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.
10 //
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.
15 //
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
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include <Standard_Stream.hxx>
24
25 #include "GEOM_I3DPrimOperations_i.hh"
26
27 #include "utilities.h"
28 #include "OpUtil.hxx"
29 #include "Utils_ExceptHandlers.hxx"
30
31 #include "GEOM_Engine.hxx"
32 #include "GEOM_Object.hxx"
33
34 //=============================================================================
35 /*!
36  *   constructor:
37  */
38 //=============================================================================
39 GEOM_I3DPrimOperations_i::GEOM_I3DPrimOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOMImpl_I3DPrimOperations* theImpl)
40 :GEOM_IOperations_i(thePOA, theEngine, theImpl)
41 {
42   MESSAGE("GEOM_I3DPrimOperations_i::GEOM_I3DPrimOperations_i");
43 }
44
45 //=============================================================================
46 /*!
47  *  destructor
48  */
49 //=============================================================================
50 GEOM_I3DPrimOperations_i::~GEOM_I3DPrimOperations_i()
51 {
52   MESSAGE("GEOM_I3DPrimOperations_i::~GEOM_I3DPrimOperations_i");
53 }
54
55
56 //=============================================================================
57 /*!
58  *  MakeBoxDXDYDZ
59  */
60 //=============================================================================
61 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeBoxDXDYDZ (CORBA::Double theDX,
62                                                                CORBA::Double theDY,
63                                                                CORBA::Double theDZ)
64 {
65   GEOM::GEOM_Object_var aGEOMObject;
66
67   //Set a not done flag
68   GetOperations()->SetNotDone();
69
70   //Create the Box
71   Handle(GEOM_Object) anObject = GetOperations()->MakeBoxDXDYDZ(theDX, theDY, theDZ);
72   if (!GetOperations()->IsDone() || anObject.IsNull())
73     return aGEOMObject._retn();
74
75   return GetObject(anObject);
76 }
77
78 //=============================================================================
79 /*!
80  *  MakeBoxTwoPnt
81  */
82 //=============================================================================
83 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeBoxTwoPnt
84                       (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2)
85 {
86   GEOM::GEOM_Object_var aGEOMObject;
87
88   //Set a not done flag
89   GetOperations()->SetNotDone();
90
91   Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
92   Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
93
94   if (aPnt1.IsNull() || aPnt2.IsNull()) return aGEOMObject._retn();
95
96   //Create the Box
97   Handle(GEOM_Object) anObject = GetOperations()->MakeBoxTwoPnt(aPnt1, aPnt2);
98   if (!GetOperations()->IsDone() || anObject.IsNull())
99     return aGEOMObject._retn();
100
101   return GetObject(anObject);
102 }
103
104 //=============================================================================
105 /*!
106  *  MakeFaceHW
107  */
108 //=============================================================================
109 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeFaceHW (CORBA::Double theH,
110                                                             CORBA::Double theW,
111                                                             CORBA::Short  theOrientation)
112 {
113   GEOM::GEOM_Object_var aGEOMObject;
114
115   //Set a not done flag
116   GetOperations()->SetNotDone();
117
118   if (theH == 0 || theW == 0)
119     return aGEOMObject._retn();
120
121   //Create the Face
122   Handle(GEOM_Object) anObject = GetOperations()->MakeFaceHW(theH, theW, theOrientation);
123   if (!GetOperations()->IsDone() || anObject.IsNull())
124     return aGEOMObject._retn();
125
126   return GetObject(anObject);
127 }
128
129 //=============================================================================
130 /*!
131  *  MakeFaceObjHW
132  */
133 //=============================================================================
134 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeFaceObjHW
135                                                (GEOM::GEOM_Object_ptr theObj,
136                                                 CORBA::Double theH,
137                                                 CORBA::Double theW)
138 {
139   GEOM::GEOM_Object_var aGEOMObject;
140
141   //Set a not done flag
142   GetOperations()->SetNotDone();
143
144   //Get the reference object
145   Handle(GEOM_Object) anObj = GetObjectImpl(theObj);
146
147   if (anObj.IsNull())
148     return aGEOMObject._retn();
149
150   //Create the Face
151   Handle(GEOM_Object) anObject = GetOperations()->MakeFaceObjHW(anObj, theH, theW);
152   if (!GetOperations()->IsDone() || anObject.IsNull())
153     return aGEOMObject._retn();
154
155   return GetObject(anObject);
156 }
157
158 //=============================================================================
159 /*!
160  *  MakeDiskPntVecR
161  */
162 //=============================================================================
163 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDiskPntVecR
164                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
165                        CORBA::Double theR)
166 {
167   GEOM::GEOM_Object_var aGEOMObject;
168
169   //Set a not done flag
170   GetOperations()->SetNotDone();
171
172   //Get the reference points
173   Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt);
174   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
175
176   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
177
178   // Make Disk
179   Handle(GEOM_Object) anObject =
180     GetOperations()->MakeDiskPntVecR(aPnt, aVec, theR);
181   if (!GetOperations()->IsDone() || anObject.IsNull())
182     return aGEOMObject._retn();
183
184   return GetObject(anObject);
185 }
186
187 //=============================================================================
188 /*!
189  *  MakeDiskThreePnt
190  */
191 //=============================================================================
192 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDiskThreePnt
193                       (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2,
194                        GEOM::GEOM_Object_ptr thePnt3)
195 {
196   GEOM::GEOM_Object_var aGEOMObject;
197
198   //Set a not done flag
199   GetOperations()->SetNotDone();
200
201   //Get the reference points
202   Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
203   Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
204   Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
205
206   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
207
208   // Make Disk
209   Handle(GEOM_Object) anObject =
210       GetOperations()->MakeDiskThreePnt(aPnt1, aPnt2, aPnt3);
211   if (!GetOperations()->IsDone() || anObject.IsNull())
212     return aGEOMObject._retn();
213
214   return GetObject(anObject);
215 }
216
217 //=============================================================================
218 /*!
219  *  MakeDiskR
220  */
221 //=============================================================================
222 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDiskR (CORBA::Double theR,
223                                                            CORBA::Short  theOrientation)
224 {
225   GEOM::GEOM_Object_var aGEOMObject;
226
227   //Set a not done flag
228   GetOperations()->SetNotDone();
229
230   if (theR == 0)
231     return aGEOMObject._retn();
232
233   //Create the Face
234   Handle(GEOM_Object) anObject = GetOperations()->MakeDiskR(theR, theOrientation);
235   if (!GetOperations()->IsDone() || anObject.IsNull())
236     return aGEOMObject._retn();
237
238   return GetObject(anObject);
239 }
240
241 //=============================================================================
242 /*!
243  *  MakeCylinderRH
244  */
245 //=============================================================================
246 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderRH (CORBA::Double theR,
247                                                                 CORBA::Double theH)
248 {
249   GEOM::GEOM_Object_var aGEOMObject;
250
251   //Set a not done flag
252   GetOperations()->SetNotDone();
253
254   //Create the Cylinder
255   Handle(GEOM_Object) anObject = GetOperations()->MakeCylinderRH(theR, theH);
256   if (!GetOperations()->IsDone() || anObject.IsNull())
257     return aGEOMObject._retn();
258
259   return GetObject(anObject);
260 }
261
262 //=============================================================================
263 /*!
264  *  MakeCylinderPntVecRH
265  */
266 //=============================================================================
267 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderPntVecRH
268                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
269                        CORBA::Double theR, CORBA::Double theH)
270 {
271   GEOM::GEOM_Object_var aGEOMObject;
272
273   //Set a not done flag
274   GetOperations()->SetNotDone();
275
276   //Get the reference points
277   Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt);
278   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
279
280   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
281
282   //Create the Cylinder
283   Handle(GEOM_Object) anObject = GetOperations()->MakeCylinderPntVecRH(aPnt, aVec, theR, theH);
284   if (!GetOperations()->IsDone() || anObject.IsNull())
285     return aGEOMObject._retn();
286
287   return GetObject(anObject);
288 }
289
290 //=============================================================================
291 /*!
292  *  MakeConeR1R2H
293  */
294 //=============================================================================
295 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeConeR1R2H (CORBA::Double theR1,
296                                                                CORBA::Double theR2,
297                                                                CORBA::Double theH)
298 {
299   GEOM::GEOM_Object_var aGEOMObject;
300
301   //Set a not done flag
302   GetOperations()->SetNotDone();
303
304   //Create the Cone
305   Handle(GEOM_Object) anObject = GetOperations()->MakeConeR1R2H(theR1, theR2, theH);
306   if (!GetOperations()->IsDone() || anObject.IsNull())
307     return aGEOMObject._retn();
308
309   return GetObject(anObject);
310 }
311
312 //=============================================================================
313 /*!
314  *  MakeConePntVecR1R2H
315  */
316 //=============================================================================
317 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeConePntVecR1R2H
318                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
319                        CORBA::Double theR1, CORBA::Double theR2, CORBA::Double theH)
320 {
321   GEOM::GEOM_Object_var aGEOMObject;
322
323   //Set a not done flag
324   GetOperations()->SetNotDone();
325
326   //Get the reference points
327   Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt);
328   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
329
330   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
331
332   //Create the Cone
333   Handle(GEOM_Object) anObject =
334       GetOperations()->MakeConePntVecR1R2H(aPnt, aVec, theR1, theR2, theH);
335   if (!GetOperations()->IsDone() || anObject.IsNull())
336     return aGEOMObject._retn();
337
338   return GetObject(anObject);
339 }
340
341 //=============================================================================
342 /*!
343  *  MakeSphereR
344  */
345 //=============================================================================
346 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeSphereR (CORBA::Double theR)
347 {
348   GEOM::GEOM_Object_var aGEOMObject;
349
350   //Set a not done flag
351   GetOperations()->SetNotDone();
352
353   //Create the Cone
354   Handle(GEOM_Object) anObject = GetOperations()->MakeSphereR(theR);
355   if (!GetOperations()->IsDone() || anObject.IsNull())
356     return aGEOMObject._retn();
357
358   return GetObject(anObject);
359 }
360
361 //=============================================================================
362 /*!
363  *  MakeSpherePntR
364  */
365 //=============================================================================
366 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeSpherePntR
367                       (GEOM::GEOM_Object_ptr thePnt, CORBA::Double theR)
368 {
369   GEOM::GEOM_Object_var aGEOMObject;
370
371   //Set a not done flag
372   GetOperations()->SetNotDone();
373
374   //Get the reference point
375   Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt);
376
377   if (aPnt.IsNull()) return aGEOMObject._retn();
378
379   //Create the Sphere
380   Handle(GEOM_Object) anObject =
381     GetOperations()->MakeSpherePntR(aPnt, theR);
382   if (!GetOperations()->IsDone() || anObject.IsNull())
383     return aGEOMObject._retn();
384
385   return GetObject(anObject);
386 }
387
388 //=============================================================================
389 /*!
390  *  MakeTorusRR
391  */
392 //=============================================================================
393 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeTorusRR
394                       (CORBA::Double theRMajor, CORBA::Double theRMinor)
395 {
396   GEOM::GEOM_Object_var aGEOMObject;
397
398   //Set a not done flag
399   GetOperations()->SetNotDone();
400
401   // Make Torus
402   Handle(GEOM_Object) anObject =
403     GetOperations()->MakeTorusRR(theRMajor, theRMinor);
404   if (!GetOperations()->IsDone() || anObject.IsNull())
405     return aGEOMObject._retn();
406
407   return GetObject(anObject);
408 }
409
410 //=============================================================================
411 /*!
412  *  MakeTorusPntVecRR
413  */
414 //=============================================================================
415 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeTorusPntVecRR
416                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
417                        CORBA::Double theRMajor, CORBA::Double theRMinor)
418 {
419   GEOM::GEOM_Object_var aGEOMObject;
420
421   //Set a not done flag
422   GetOperations()->SetNotDone();
423
424   //Get the reference points
425   Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt);
426   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
427
428   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
429
430   // Make Torus
431   Handle(GEOM_Object) anObject =
432     GetOperations()->MakeTorusPntVecRR(aPnt, aVec, theRMajor, theRMinor);
433   if (!GetOperations()->IsDone() || anObject.IsNull())
434     return aGEOMObject._retn();
435
436   return GetObject(anObject);
437 }
438
439 //=============================================================================
440 /*!
441  *  MakePrismVecH
442  */
443 //=============================================================================
444 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH
445                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec,
446                        CORBA::Double theH)
447 {
448   GEOM::GEOM_Object_var aGEOMObject;
449
450   //Set a not done flag
451   GetOperations()->SetNotDone();
452
453   //Get the reference objects
454   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
455   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
456
457   if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
458
459   //Create the Prism
460   Handle(GEOM_Object) anObject =
461       GetOperations()->MakePrismVecH(aBase, aVec, theH);
462   if (!GetOperations()->IsDone() || anObject.IsNull())
463     return aGEOMObject._retn();
464
465   return GetObject(anObject);
466 }
467
468 //=============================================================================
469 /*!
470  *  MakePrismVecH2Ways
471  */
472 //=============================================================================
473 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH2Ways
474                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec,
475                        CORBA::Double theH)
476 {
477   GEOM::GEOM_Object_var aGEOMObject;
478
479   //Set a not done flag
480   GetOperations()->SetNotDone();
481
482   //Get the reference objects
483   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
484   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
485
486   if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
487
488   //Create the Prism
489   Handle(GEOM_Object) anObject =
490       GetOperations()->MakePrismVecH2Ways(aBase, aVec, theH);
491   if (!GetOperations()->IsDone() || anObject.IsNull())
492     return aGEOMObject._retn();
493
494   return GetObject(anObject);
495 }
496
497 //=============================================================================
498 /*!
499  *  MakePrismTwoPnt
500  */
501 //=============================================================================
502 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPnt
503                                              (GEOM::GEOM_Object_ptr theBase,
504                                               GEOM::GEOM_Object_ptr thePoint1,
505                                               GEOM::GEOM_Object_ptr thePoint2)
506 {
507   GEOM::GEOM_Object_var aGEOMObject;
508
509   //Set a not done flag
510   GetOperations()->SetNotDone();
511
512   //Get the reference objects
513   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
514   Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
515   Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
516
517   if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull())
518     return aGEOMObject._retn();
519
520   //Create the Prism
521   Handle(GEOM_Object) anObject =
522     GetOperations()->MakePrismTwoPnt(aBase, aPoint1, aPoint2);
523   if (!GetOperations()->IsDone() || anObject.IsNull())
524     return aGEOMObject._retn();
525
526   return GetObject(anObject);
527 }
528
529 //=============================================================================
530 /*!
531  *  MakePrismTwoPnt2Ways
532  */
533 //=============================================================================
534 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPnt2Ways
535                                              (GEOM::GEOM_Object_ptr theBase,
536                                               GEOM::GEOM_Object_ptr thePoint1,
537                                               GEOM::GEOM_Object_ptr thePoint2)
538 {
539   GEOM::GEOM_Object_var aGEOMObject;
540
541   //Set a not done flag
542   GetOperations()->SetNotDone();
543
544   //Get the reference objects
545   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
546   Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
547   Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
548
549   if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull())
550     return aGEOMObject._retn();
551
552   //Create the Prism
553   Handle(GEOM_Object) anObject =
554     GetOperations()->MakePrismTwoPnt2Ways(aBase, aPoint1, aPoint2);
555   if (!GetOperations()->IsDone() || anObject.IsNull())
556     return aGEOMObject._retn();
557
558   return GetObject(anObject);
559 }
560
561 //=============================================================================
562 /*!
563  *  MakePrismDXDYDZ
564  */
565 //=============================================================================
566 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZ
567                       (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX,
568                        CORBA::Double theDY, CORBA::Double theDZ)
569 {
570   GEOM::GEOM_Object_var aGEOMObject;
571
572   //Set a not done flag
573   GetOperations()->SetNotDone();
574
575   //Get the reference objects
576   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
577
578   if (aBase.IsNull()) return aGEOMObject._retn();
579
580   //Create the Prism
581   Handle(GEOM_Object) anObject =
582       GetOperations()->MakePrismDXDYDZ(aBase, theDX, theDY, theDZ);
583   if (!GetOperations()->IsDone() || anObject.IsNull())
584     return aGEOMObject._retn();
585
586   return GetObject(anObject);
587 }
588
589 //=============================================================================
590 /*!
591  *  MakePrismDXDYDZ2Ways
592  */
593 //=============================================================================
594 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZ2Ways
595                       (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX,
596                        CORBA::Double theDY, CORBA::Double theDZ)
597 {
598   GEOM::GEOM_Object_var aGEOMObject;
599
600   //Set a not done flag
601   GetOperations()->SetNotDone();
602
603   //Get the reference objects
604   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
605
606   if (aBase.IsNull()) return aGEOMObject._retn();
607
608   //Create the Prism
609   Handle(GEOM_Object) anObject =
610       GetOperations()->MakePrismDXDYDZ2Ways(aBase, theDX, theDY, theDZ);
611   if (!GetOperations()->IsDone() || anObject.IsNull())
612     return aGEOMObject._retn();
613
614   return GetObject(anObject);
615 }
616
617 //=============================================================================
618 /*!
619  *  MakePipe
620  */
621 //=============================================================================
622 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipe
623                  (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr thePath)
624 {
625   GEOM::GEOM_Object_var aGEOMObject;
626
627   //Set a not done flag
628   GetOperations()->SetNotDone();
629
630   //Get the reference objects
631   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
632   Handle(GEOM_Object) aPath = GetObjectImpl(thePath);
633
634   if (aBase.IsNull() || aPath.IsNull()) return aGEOMObject._retn();
635
636   //Create the Pipe
637   Handle(GEOM_Object) anObject =
638     GetOperations()->MakePipe(aBase, aPath);
639   if (!GetOperations()->IsDone() || anObject.IsNull())
640     return aGEOMObject._retn();
641
642   return GetObject(anObject);
643 }
644
645 //=============================================================================
646 /*!
647  *  MakeRevolutionAxisAngle
648  */
649 //=============================================================================
650 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeRevolutionAxisAngle
651                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theAxis,
652                        CORBA::Double theAngle)
653 {
654   GEOM::GEOM_Object_var aGEOMObject;
655
656   //Set a not done flag
657   GetOperations()->SetNotDone();
658
659   //Get the reference objects
660   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
661   Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis);
662
663   if (aBase.IsNull() || anAxis.IsNull()) return aGEOMObject._retn();
664
665   //Create the Revolution
666   Handle(GEOM_Object) anObject =
667       GetOperations()->MakeRevolutionAxisAngle(aBase, anAxis, theAngle);
668   if (!GetOperations()->IsDone() || anObject.IsNull())
669     return aGEOMObject._retn();
670
671   return GetObject(anObject);
672 }
673
674 //=============================================================================
675 /*!
676  *  MakeRevolutionAxisAngle2Ways
677  */
678 //=============================================================================
679 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeRevolutionAxisAngle2Ways
680                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theAxis,
681                        CORBA::Double theAngle)
682 {
683   GEOM::GEOM_Object_var aGEOMObject;
684
685   //Set a not done flag
686   GetOperations()->SetNotDone();
687
688   //Get the reference objects
689   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
690   Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis);
691
692   if (aBase.IsNull() || anAxis.IsNull()) return aGEOMObject._retn();
693
694   //Create the Revolution
695   Handle(GEOM_Object) anObject =
696       GetOperations()->MakeRevolutionAxisAngle2Ways(aBase, anAxis, theAngle);
697   if (!GetOperations()->IsDone() || anObject.IsNull())
698     return aGEOMObject._retn();
699
700   return GetObject(anObject);
701 }
702
703 //=============================================================================
704 /*!
705  *  MakeFilling
706  */
707 //=============================================================================
708 GEOM::GEOM_Object_ptr
709 GEOM_I3DPrimOperations_i::MakeFilling(GEOM::GEOM_Object_ptr theShape,
710                                       CORBA::Long theMinDeg,
711                                       CORBA::Long theMaxDeg,
712                                       CORBA::Double theTol2D,
713                                       CORBA::Double theTol3D,
714                                       CORBA::Long theNbIter,
715                                       GEOM::filling_oper_method theMethod,
716                                       CORBA::Boolean theApprox)
717 {
718   GEOM::GEOM_Object_var aGEOMObject;
719
720   //Set a not done flag
721   GetOperations()->SetNotDone();
722
723   //Get the reference objects
724   Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
725
726   if (aShape.IsNull()) return aGEOMObject._retn();
727
728   int aMethod = 0;
729   switch (theMethod) {
730   case GEOM::FOM_Default:
731     {
732       // Default (standard behaviour)
733       aMethod = 0;
734     }
735     break;
736   case GEOM::FOM_UseOri:
737     {
738       // Use edges orientation
739       aMethod = 1;
740     }
741     break;
742   case GEOM::FOM_AutoCorrect:
743     {
744       // Auto-correct edges orientation
745       aMethod = 2;
746     }
747     break;
748   default:
749     {}
750   }
751
752   //Create the Solid
753   Handle(GEOM_Object) anObject = GetOperations()->MakeFilling
754     (aShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter,
755      aMethod, theApprox);
756   if (!GetOperations()->IsDone() || anObject.IsNull())
757     return aGEOMObject._retn();
758
759   return GetObject(anObject);
760 }
761
762 //=============================================================================
763 /*!
764  *  MakeThruSections
765  */
766 //=============================================================================
767 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThruSections(const GEOM::ListOfGO& theSeqSections,
768                                                                  CORBA::Boolean theModeSolid,
769                                                                  CORBA::Double thePreci,
770                                                                  CORBA::Boolean theRuled)
771 {
772    GEOM::GEOM_Object_var aGEOMObject;
773
774   //Set a not done flag
775   GetOperations()->SetNotDone();
776   Handle(TColStd_HSequenceOfTransient) aSeqSections = new TColStd_HSequenceOfTransient;
777   int ind, aLen;
778
779   //Get the shapes
780   aLen = theSeqSections.length();
781   for (ind = 0; ind < aLen; ind++) {
782     Handle(GEOM_Object) aSh = GetObjectImpl(theSeqSections[ind]);
783     if (!aSh.IsNull())
784       aSeqSections->Append(aSh);
785   }
786   if (!aSeqSections->Length())
787     return aGEOMObject._retn();
788
789   // Make shell or solid
790   Handle(GEOM_Object) anObject =
791     GetOperations()->MakeThruSections(aSeqSections,theModeSolid,thePreci,theRuled);
792   if (!GetOperations()->IsDone() || anObject.IsNull())
793     return aGEOMObject._retn();
794
795   return GetObject(anObject);
796 }
797
798 //=============================================================================
799 /*!
800  *  MakePipeWithDifferentSections
801  */
802 //=============================================================================
803 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections
804                       (const GEOM::ListOfGO& theBases,
805                        const GEOM::ListOfGO& theLocations,
806                        GEOM::GEOM_Object_ptr thePath,
807                        CORBA::Boolean theWithContact,
808                        CORBA::Boolean theWithCorrections)
809 {
810   GEOM::GEOM_Object_var aGEOMObject;
811
812   //Set a not done flag
813   GetOperations()->SetNotDone();
814   Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
815   Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
816   int ind=0, aNbBases =0,aNbLocs=0;
817
818   //Get the shapes
819   aNbBases = theBases.length();
820   aNbLocs = theLocations.length();
821
822   if (aNbLocs && aNbBases != aNbLocs)
823     return aGEOMObject._retn();
824
825   Handle(GEOM_Object) aPath = GetObjectImpl(thePath);
826   if (aPath.IsNull())
827     return aGEOMObject._retn();
828
829   for (ind = 0; ind < aNbBases; ind++) {
830     Handle(GEOM_Object) aBase = GetObjectImpl(theBases[ind]);
831     if (aBase.IsNull())
832       continue;
833     if (aNbLocs)
834     {
835       Handle(GEOM_Object) aLoc = GetObjectImpl(theLocations[ind]);
836       if (aLoc.IsNull())
837         continue;
838       aSeqLocations->Append(aLoc);
839     }
840     aSeqBases->Append(aBase);
841   }
842   if (!aSeqBases->Length())
843     return aGEOMObject._retn();
844
845   // Make pipe
846   Handle(GEOM_Object) anObject =
847     GetOperations()->MakePipeWithDifferentSections(aSeqBases,aSeqLocations ,aPath,
848                                                    theWithContact,theWithCorrections);
849   if (!GetOperations()->IsDone() || anObject.IsNull())
850     return aGEOMObject._retn();
851
852   return GetObject(anObject);
853 }
854
855
856 //=============================================================================
857 /*!
858  *  MakePipeWithShellSections
859  */
860 //=============================================================================
861 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections
862                  (const GEOM::ListOfGO& theBases,
863                   const GEOM::ListOfGO& theSubBases,
864                   const GEOM::ListOfGO& theLocations,
865                   GEOM::GEOM_Object_ptr thePath,
866                   CORBA::Boolean theWithContact,
867                   CORBA::Boolean theWithCorrections)
868 {
869   GEOM::GEOM_Object_var aGEOMObject;
870
871   //Set a not done flag
872   GetOperations()->SetNotDone();
873   Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
874   Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient;
875   Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
876   int ind=0, aNbBases=0, aNbSubBases=0, aNbLocs=0;
877
878   //Get the shapes
879   aNbBases = theBases.length();
880   aNbSubBases = theSubBases.length();
881   aNbLocs = theLocations.length();
882
883   if (aNbLocs && aNbBases != aNbLocs)
884     return aGEOMObject._retn();
885
886   Handle(GEOM_Object) aPath = GetObjectImpl(thePath);
887   if (aPath.IsNull())
888     return aGEOMObject._retn();
889
890   for (ind = 0; ind < aNbBases; ind++) {
891     Handle(GEOM_Object) aBase = GetObjectImpl(theBases[ind]);
892     if (aBase.IsNull())
893       continue;
894     if (aNbLocs) {
895       Handle(GEOM_Object) aLoc = GetObjectImpl(theLocations[ind]);
896       if (aLoc.IsNull())
897         continue;
898       aSeqLocations->Append(aLoc);
899     }
900     aSeqBases->Append(aBase);
901
902     if (aNbSubBases >= aNbBases) {
903       Handle(GEOM_Object) aSubBase = GetObjectImpl(theSubBases[ind]);
904       if (aSubBase.IsNull()) {
905         aSeqSubBases->Clear();
906         aNbSubBases = 0;
907         continue;
908       }
909       aSeqSubBases->Append(aSubBase);
910     }
911   }
912   if (!aSeqBases->Length())
913     return aGEOMObject._retn();
914
915   // Make pipe
916   Handle(GEOM_Object) anObject =
917     GetOperations()->MakePipeWithShellSections(aSeqBases, aSeqSubBases,
918                                                aSeqLocations, aPath,
919                                                theWithContact, theWithCorrections);
920   if (!GetOperations()->IsDone() || anObject.IsNull())
921     return aGEOMObject._retn();
922
923   return GetObject(anObject);
924 }
925
926
927 //=============================================================================
928 /*!
929  *  MakePipeShellsWithoutPath
930  */
931 //=============================================================================
932 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath
933                  (const GEOM::ListOfGO& theBases,
934                   const GEOM::ListOfGO& theLocations)
935 {
936   GEOM::GEOM_Object_var aGEOMObject;
937
938   //Set a not done flag
939   GetOperations()->SetNotDone();
940   Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
941   Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
942   int ind=0, aNbBases=0, aNbLocs=0;
943
944   //Get the shapes
945   aNbBases = theBases.length();
946   aNbLocs = theLocations.length();
947
948   if (aNbLocs && aNbBases != aNbLocs)
949     return aGEOMObject._retn();
950
951   for (ind = 0; ind < aNbBases; ind++) {
952     Handle(GEOM_Object) aBase = GetObjectImpl(theBases[ind]);
953     if (aBase.IsNull())
954       continue;
955     if (aNbLocs) {
956       Handle(GEOM_Object) aLoc = GetObjectImpl(theLocations[ind]);
957       if (aLoc.IsNull())
958         continue;
959       aSeqLocations->Append(aLoc);
960     }
961     aSeqBases->Append(aBase);
962   }
963
964   if (!aSeqBases->Length())
965     return aGEOMObject._retn();
966
967   // Make pipe
968   Handle(GEOM_Object) anObject =
969     GetOperations()->MakePipeShellsWithoutPath(aSeqBases,aSeqLocations);
970
971   if (!GetOperations()->IsDone() || anObject.IsNull())
972     return aGEOMObject._retn();
973
974   return GetObject(anObject);
975 }
976
977
978 //=============================================================================
979 /*!
980  *  MakePipeBiNormalAlongVector
981  */
982 //=============================================================================
983 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector
984                  (GEOM::GEOM_Object_ptr theBase,
985                   GEOM::GEOM_Object_ptr thePath,
986                   GEOM::GEOM_Object_ptr theVec)
987 {
988   GEOM::GEOM_Object_var aGEOMObject;
989
990   //Set a not done flag
991   GetOperations()->SetNotDone();
992
993   //Get the reference objects
994   Handle(GEOM_Object) aBase = GetObjectImpl(theBase);
995   Handle(GEOM_Object) aPath = GetObjectImpl(thePath);
996   Handle(GEOM_Object) aVec = GetObjectImpl(theVec);
997
998   if (aBase.IsNull() || aPath.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
999
1000   //Create the Pipe
1001   Handle(GEOM_Object) anObject =
1002     GetOperations()->MakePipeBiNormalAlongVector(aBase, aPath, aVec);
1003   if (!GetOperations()->IsDone() || anObject.IsNull())
1004     return aGEOMObject._retn();
1005
1006   return GetObject(anObject);
1007 }