Salome HOME
bf43fccb7dbb1815d19210d1a64da4c882948be8
[modules/geom.git] / src / GEOM_I / GEOM_I3DPrimOperations_i.cc
1 // Copyright (C) 2007-2023  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, or (at your option) any later version.
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 #define SUBSHAPE_ERROR "Sub shape cannot be transformed"
35
36 //=============================================================================
37 /*!
38  *   constructor:
39  */
40 //=============================================================================
41 GEOM_I3DPrimOperations_i::GEOM_I3DPrimOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOMImpl_I3DPrimOperations* theImpl)
42 :GEOM_IOperations_i(thePOA, theEngine, theImpl)
43 {
44   MESSAGE("GEOM_I3DPrimOperations_i::GEOM_I3DPrimOperations_i");
45 }
46
47 //=============================================================================
48 /*!
49  *  destructor
50  */
51 //=============================================================================
52 GEOM_I3DPrimOperations_i::~GEOM_I3DPrimOperations_i()
53 {
54   MESSAGE("GEOM_I3DPrimOperations_i::~GEOM_I3DPrimOperations_i");
55 }
56
57
58 //=============================================================================
59 /*!
60  *  MakeBoxDXDYDZ
61  */
62 //=============================================================================
63 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeBoxDXDYDZ (CORBA::Double theDX,
64                                                                CORBA::Double theDY,
65                                                                CORBA::Double theDZ)
66 {
67   GEOM::GEOM_Object_var aGEOMObject;
68
69   //Set a not done flag
70   GetOperations()->SetNotDone();
71
72   //Create the Box
73   Handle(::GEOM_Object) anObject = GetOperations()->MakeBoxDXDYDZ(theDX, theDY, theDZ);
74   if (!GetOperations()->IsDone() || anObject.IsNull())
75     return aGEOMObject._retn();
76
77   return GetObject(anObject);
78 }
79
80 //=============================================================================
81 /*!
82  *  MakeBoxTwoPnt
83  */
84 //=============================================================================
85 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeBoxTwoPnt
86                       (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2)
87 {
88   GEOM::GEOM_Object_var aGEOMObject;
89
90   //Set a not done flag
91   GetOperations()->SetNotDone();
92
93   Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
94   Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
95
96   if (aPnt1.IsNull() || aPnt2.IsNull()) return aGEOMObject._retn();
97
98   //Create the Box
99   Handle(::GEOM_Object) anObject = GetOperations()->MakeBoxTwoPnt(aPnt1, aPnt2);
100   if (!GetOperations()->IsDone() || anObject.IsNull())
101     return aGEOMObject._retn();
102
103   return GetObject(anObject);
104 }
105
106 //=============================================================================
107 /*!
108  *  MakeFaceHW
109  */
110 //=============================================================================
111 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeFaceHW (CORBA::Double theH,
112                                                             CORBA::Double theW,
113                                                             CORBA::Short  theOrientation)
114 {
115   GEOM::GEOM_Object_var aGEOMObject;
116
117   //Set a not done flag
118   GetOperations()->SetNotDone();
119
120   if (theH == 0 || theW == 0)
121     return aGEOMObject._retn();
122
123   //Create the Face
124   Handle(::GEOM_Object) anObject = GetOperations()->MakeFaceHW(theH, theW, theOrientation);
125   if (!GetOperations()->IsDone() || anObject.IsNull())
126     return aGEOMObject._retn();
127
128   return GetObject(anObject);
129 }
130
131 //=============================================================================
132 /*!
133  *  MakeFaceObjHW
134  */
135 //=============================================================================
136 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeFaceObjHW
137                                                (GEOM::GEOM_Object_ptr theObj,
138                                                 CORBA::Double theH,
139                                                 CORBA::Double theW)
140 {
141   GEOM::GEOM_Object_var aGEOMObject;
142
143   //Set a not done flag
144   GetOperations()->SetNotDone();
145
146   //Get the reference object
147   Handle(::GEOM_Object) anObj = GetObjectImpl(theObj);
148
149   if (anObj.IsNull())
150     return aGEOMObject._retn();
151
152   //Create the Face
153   Handle(::GEOM_Object) anObject = GetOperations()->MakeFaceObjHW(anObj, theH, theW);
154   if (!GetOperations()->IsDone() || anObject.IsNull())
155     return aGEOMObject._retn();
156
157   return GetObject(anObject);
158 }
159
160 //=============================================================================
161 /*!
162  *  MakeDiskPntVecR
163  */
164 //=============================================================================
165 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDiskPntVecR
166                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
167                        CORBA::Double theR)
168 {
169   GEOM::GEOM_Object_var aGEOMObject;
170
171   //Set a not done flag
172   GetOperations()->SetNotDone();
173
174   //Get the reference points
175   Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt);
176   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
177
178   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
179
180   // Make Disk
181   Handle(::GEOM_Object) anObject =
182     GetOperations()->MakeDiskPntVecR(aPnt, aVec, theR);
183   if (!GetOperations()->IsDone() || anObject.IsNull())
184     return aGEOMObject._retn();
185
186   return GetObject(anObject);
187 }
188
189 //=============================================================================
190 /*!
191  *  MakeDiskThreePnt
192  */
193 //=============================================================================
194 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDiskThreePnt
195                       (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2,
196                        GEOM::GEOM_Object_ptr thePnt3)
197 {
198   GEOM::GEOM_Object_var aGEOMObject;
199
200   //Set a not done flag
201   GetOperations()->SetNotDone();
202
203   //Get the reference points
204   Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
205   Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
206   Handle(::GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
207
208   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
209
210   // Make Disk
211   Handle(::GEOM_Object) anObject =
212       GetOperations()->MakeDiskThreePnt(aPnt1, aPnt2, aPnt3);
213   if (!GetOperations()->IsDone() || anObject.IsNull())
214     return aGEOMObject._retn();
215
216   return GetObject(anObject);
217 }
218
219 //=============================================================================
220 /*!
221  *  MakeDiskR
222  */
223 //=============================================================================
224 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDiskR (CORBA::Double theR,
225                                                            CORBA::Short  theOrientation)
226 {
227   GEOM::GEOM_Object_var aGEOMObject;
228
229   //Set a not done flag
230   GetOperations()->SetNotDone();
231
232   if (theR == 0)
233     return aGEOMObject._retn();
234
235   //Create the Face
236   Handle(::GEOM_Object) anObject = GetOperations()->MakeDiskR(theR, theOrientation);
237   if (!GetOperations()->IsDone() || anObject.IsNull())
238     return aGEOMObject._retn();
239
240   return GetObject(anObject);
241 }
242
243 //=============================================================================
244 /*!
245  *  MakeCylinderRH
246  */
247 //=============================================================================
248 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderRH (CORBA::Double theR,
249                                                                 CORBA::Double theH)
250 {
251   GEOM::GEOM_Object_var aGEOMObject;
252
253   //Set a not done flag
254   GetOperations()->SetNotDone();
255
256   //Create the Cylinder
257   Handle(::GEOM_Object) anObject = GetOperations()->MakeCylinderRH(theR, theH);
258   if (!GetOperations()->IsDone() || anObject.IsNull())
259     return aGEOMObject._retn();
260
261   return GetObject(anObject);
262 }
263
264 //=============================================================================
265 /*!
266  *  MakeCylinderRHA
267  */
268 //=============================================================================
269 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderRHA (CORBA::Double theR,
270                                                                  CORBA::Double theH,
271                                                                  CORBA::Double theA)
272 {
273   GEOM::GEOM_Object_var aGEOMObject;
274
275   //Set a not done flag
276   GetOperations()->SetNotDone();
277
278   //Create the Cylinder
279   Handle(::GEOM_Object) anObject = GetOperations()->MakeCylinderRHA(theR, theH, theA);
280   if (!GetOperations()->IsDone() || anObject.IsNull())
281     return aGEOMObject._retn();
282
283   return GetObject(anObject);
284 }
285
286 //=============================================================================
287 /*!
288  *  MakeCylinderPntVecRH
289  */
290 //=============================================================================
291 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderPntVecRH
292                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
293                        CORBA::Double theR, CORBA::Double theH)
294 {
295   GEOM::GEOM_Object_var aGEOMObject;
296
297   //Set a not done flag
298   GetOperations()->SetNotDone();
299
300   //Get the reference points
301   Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt);
302   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
303
304   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
305
306   //Create the Cylinder
307   Handle(::GEOM_Object) anObject = GetOperations()->MakeCylinderPntVecRH(aPnt, aVec, theR, theH);
308   if (!GetOperations()->IsDone() || anObject.IsNull())
309     return aGEOMObject._retn();
310
311   return GetObject(anObject);
312 }
313
314 //=============================================================================
315 /*!
316  *  MakeCylinderPntVecRHA
317  */
318 //=============================================================================
319 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderPntVecRHA
320                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
321                        CORBA::Double theR, CORBA::Double theH, CORBA::Double theA)
322 {
323   GEOM::GEOM_Object_var aGEOMObject;
324
325   //Set a not done flag
326   GetOperations()->SetNotDone();
327
328   //Get the reference points
329   Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt);
330   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
331
332   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
333
334   //Create the Cylinder
335   Handle(::GEOM_Object) anObject = GetOperations()->MakeCylinderPntVecRHA(aPnt, aVec, theR, theH, theA);
336   if (!GetOperations()->IsDone() || anObject.IsNull())
337     return aGEOMObject._retn();
338
339   return GetObject(anObject);
340 }
341
342 //=============================================================================
343 /*!
344  *  MakeConeR1R2H
345  */
346 //=============================================================================
347 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeConeR1R2H (CORBA::Double theR1,
348                                                                CORBA::Double theR2,
349                                                                CORBA::Double theH)
350 {
351   GEOM::GEOM_Object_var aGEOMObject;
352
353   //Set a not done flag
354   GetOperations()->SetNotDone();
355
356   //Create the Cone
357   Handle(::GEOM_Object) anObject = GetOperations()->MakeConeR1R2H(theR1, theR2, theH);
358   if (!GetOperations()->IsDone() || anObject.IsNull())
359     return aGEOMObject._retn();
360
361   return GetObject(anObject);
362 }
363
364 //=============================================================================
365 /*!
366  *  MakeConePntVecR1R2H
367  */
368 //=============================================================================
369 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeConePntVecR1R2H
370                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
371                        CORBA::Double theR1, CORBA::Double theR2, CORBA::Double theH)
372 {
373   GEOM::GEOM_Object_var aGEOMObject;
374
375   //Set a not done flag
376   GetOperations()->SetNotDone();
377
378   //Get the reference points
379   Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt);
380   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
381
382   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
383
384   //Create the Cone
385   Handle(::GEOM_Object) anObject =
386       GetOperations()->MakeConePntVecR1R2H(aPnt, aVec, theR1, theR2, theH);
387   if (!GetOperations()->IsDone() || anObject.IsNull())
388     return aGEOMObject._retn();
389
390   return GetObject(anObject);
391 }
392
393 //=============================================================================
394 /*!
395  *  MakeSphereR
396  */
397 //=============================================================================
398 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeSphereR (CORBA::Double theR)
399 {
400   GEOM::GEOM_Object_var aGEOMObject;
401
402   //Set a not done flag
403   GetOperations()->SetNotDone();
404
405   //Create the Cone
406   Handle(::GEOM_Object) anObject = GetOperations()->MakeSphereR(theR);
407   if (!GetOperations()->IsDone() || anObject.IsNull())
408     return aGEOMObject._retn();
409
410   return GetObject(anObject);
411 }
412
413 //=============================================================================
414 /*!
415  *  MakeSpherePntR
416  */
417 //=============================================================================
418 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeSpherePntR
419                       (GEOM::GEOM_Object_ptr thePnt, CORBA::Double theR)
420 {
421   GEOM::GEOM_Object_var aGEOMObject;
422
423   //Set a not done flag
424   GetOperations()->SetNotDone();
425
426   //Get the reference point
427   Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt);
428
429   if (aPnt.IsNull()) return aGEOMObject._retn();
430
431   //Create the Sphere
432   Handle(::GEOM_Object) anObject =
433     GetOperations()->MakeSpherePntR(aPnt, theR);
434   if (!GetOperations()->IsDone() || anObject.IsNull())
435     return aGEOMObject._retn();
436
437   return GetObject(anObject);
438 }
439
440 //=============================================================================
441 /*!
442  *  MakeTorusRR
443  */
444 //=============================================================================
445 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeTorusRR
446                       (CORBA::Double theRMajor, CORBA::Double theRMinor)
447 {
448   GEOM::GEOM_Object_var aGEOMObject;
449
450   //Set a not done flag
451   GetOperations()->SetNotDone();
452
453   // Make Torus
454   Handle(::GEOM_Object) anObject =
455     GetOperations()->MakeTorusRR(theRMajor, theRMinor);
456   if (!GetOperations()->IsDone() || anObject.IsNull())
457     return aGEOMObject._retn();
458
459   return GetObject(anObject);
460 }
461
462 //=============================================================================
463 /*!
464  *  MakeTorusPntVecRR
465  */
466 //=============================================================================
467 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeTorusPntVecRR
468                       (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec,
469                        CORBA::Double theRMajor, CORBA::Double theRMinor)
470 {
471   GEOM::GEOM_Object_var aGEOMObject;
472
473   //Set a not done flag
474   GetOperations()->SetNotDone();
475
476   //Get the reference points
477   Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt);
478   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
479
480   if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
481
482   // Make Torus
483   Handle(::GEOM_Object) anObject =
484     GetOperations()->MakeTorusPntVecRR(aPnt, aVec, theRMajor, theRMinor);
485   if (!GetOperations()->IsDone() || anObject.IsNull())
486     return aGEOMObject._retn();
487
488   return GetObject(anObject);
489 }
490
491 //=============================================================================
492 /*!
493  *  MakePrismVecH
494  */
495 //=============================================================================
496 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH
497                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec,
498                        CORBA::Double theH)
499 {
500   GEOM::GEOM_Object_var aGEOMObject;
501
502   //Set a not done flag
503   GetOperations()->SetNotDone();
504
505   //Get the reference objects
506   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
507   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
508
509   if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
510
511   //Create the Prism
512   Handle(::GEOM_Object) anObject =
513     GetOperations()->MakePrismVecH(aBase, aVec, theH);
514   if (!GetOperations()->IsDone() || anObject.IsNull())
515     return aGEOMObject._retn();
516
517   return GetObject(anObject);
518 }
519
520 //=============================================================================
521 /*!
522  *  MakePrismVecH2Ways
523  */
524 //=============================================================================
525 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH2Ways
526                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec,
527                        CORBA::Double theH)
528 {
529   GEOM::GEOM_Object_var aGEOMObject;
530
531   //Set a not done flag
532   GetOperations()->SetNotDone();
533
534   //Get the reference objects
535   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
536   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
537
538   if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
539
540   //Create the Prism
541   Handle(::GEOM_Object) anObject =
542       GetOperations()->MakePrismVecH2Ways(aBase, aVec, theH);
543   if (!GetOperations()->IsDone() || anObject.IsNull())
544     return aGEOMObject._retn();
545
546   return GetObject(anObject);
547 }
548
549 //=============================================================================
550 /*!
551  *  MakePrismVecH
552  */
553 //=============================================================================
554 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecHWithScaling
555                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec,
556                        CORBA::Double theH, CORBA::Double theScaleFactor)
557 {
558   GEOM::GEOM_Object_var aGEOMObject;
559
560   //Set a not done flag
561   GetOperations()->SetNotDone();
562
563   //Get the reference objects
564   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
565   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
566
567   if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
568
569   //Create the Prism
570   Handle(::GEOM_Object) anObject =
571     GetOperations()->MakePrismVecH(aBase, aVec, theH, theScaleFactor);
572   if (!GetOperations()->IsDone() || anObject.IsNull())
573     return aGEOMObject._retn();
574
575   return GetObject(anObject);
576 }
577
578 //=============================================================================
579 /*!
580  *  MakePrismTwoPnt
581  */
582 //=============================================================================
583 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPnt
584                                              (GEOM::GEOM_Object_ptr theBase,
585                                               GEOM::GEOM_Object_ptr thePoint1,
586                                               GEOM::GEOM_Object_ptr thePoint2)
587 {
588   GEOM::GEOM_Object_var aGEOMObject;
589
590   //Set a not done flag
591   GetOperations()->SetNotDone();
592
593   //Get the reference objects
594   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
595   Handle(::GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
596   Handle(::GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
597
598   if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull())
599     return aGEOMObject._retn();
600
601   //Create the Prism
602   Handle(::GEOM_Object) anObject =
603     GetOperations()->MakePrismTwoPnt(aBase, aPoint1, aPoint2);
604   if (!GetOperations()->IsDone() || anObject.IsNull())
605     return aGEOMObject._retn();
606
607   return GetObject(anObject);
608 }
609
610 //=============================================================================
611 /*!
612  *  MakePrismTwoPnt2Ways
613  */
614 //=============================================================================
615 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPnt2Ways
616                                              (GEOM::GEOM_Object_ptr theBase,
617                                               GEOM::GEOM_Object_ptr thePoint1,
618                                               GEOM::GEOM_Object_ptr thePoint2)
619 {
620   GEOM::GEOM_Object_var aGEOMObject;
621
622   //Set a not done flag
623   GetOperations()->SetNotDone();
624
625   //Get the reference objects
626   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
627   Handle(::GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
628   Handle(::GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
629
630   if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull())
631     return aGEOMObject._retn();
632
633   //Create the Prism
634   Handle(::GEOM_Object) anObject =
635     GetOperations()->MakePrismTwoPnt2Ways(aBase, aPoint1, aPoint2);
636   if (!GetOperations()->IsDone() || anObject.IsNull())
637     return aGEOMObject._retn();
638
639   return GetObject(anObject);
640 }
641
642 //=============================================================================
643 /*!
644  *  MakePrismTwoPnt
645  */
646 //=============================================================================
647 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPntWithScaling
648                                              (GEOM::GEOM_Object_ptr theBase,
649                                               GEOM::GEOM_Object_ptr thePoint1,
650                                               GEOM::GEOM_Object_ptr thePoint2,
651                                               CORBA::Double         theScaleFactor)
652 {
653   GEOM::GEOM_Object_var aGEOMObject;
654
655   //Set a not done flag
656   GetOperations()->SetNotDone();
657
658   //Get the reference objects
659   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
660   Handle(::GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
661   Handle(::GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
662
663   if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull())
664     return aGEOMObject._retn();
665
666   //Create the Prism
667   Handle(::GEOM_Object) anObject =
668     GetOperations()->MakePrismTwoPnt(aBase, aPoint1, aPoint2, theScaleFactor);
669   if (!GetOperations()->IsDone() || anObject.IsNull())
670     return aGEOMObject._retn();
671
672   return GetObject(anObject);
673 }
674
675 //=============================================================================
676 /*!
677  *  MakePrismDXDYDZ
678  */
679 //=============================================================================
680 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZ
681                       (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX,
682                        CORBA::Double theDY, CORBA::Double theDZ)
683 {
684   GEOM::GEOM_Object_var aGEOMObject;
685
686   //Set a not done flag
687   GetOperations()->SetNotDone();
688
689   //Get the reference objects
690   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
691
692   if (aBase.IsNull()) return aGEOMObject._retn();
693
694   //Create the Prism
695   Handle(::GEOM_Object) anObject =
696       GetOperations()->MakePrismDXDYDZ(aBase, theDX, theDY, theDZ);
697   if (!GetOperations()->IsDone() || anObject.IsNull())
698     return aGEOMObject._retn();
699
700   return GetObject(anObject);
701 }
702
703 //=============================================================================
704 /*!
705  *  MakePrismDXDYDZ2Ways
706  */
707 //=============================================================================
708 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZ2Ways
709                       (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX,
710                        CORBA::Double theDY, CORBA::Double theDZ)
711 {
712   GEOM::GEOM_Object_var aGEOMObject;
713
714   //Set a not done flag
715   GetOperations()->SetNotDone();
716
717   //Get the reference objects
718   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
719
720   if (aBase.IsNull()) return aGEOMObject._retn();
721
722   //Create the Prism
723   Handle(::GEOM_Object) anObject =
724       GetOperations()->MakePrismDXDYDZ2Ways(aBase, theDX, theDY, theDZ);
725   if (!GetOperations()->IsDone() || anObject.IsNull())
726     return aGEOMObject._retn();
727
728   return GetObject(anObject);
729 }
730
731 //=============================================================================
732 /*!
733  *  MakePrismDXDYDZ
734  */
735 //=============================================================================
736 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismDXDYDZWithScaling
737                       (GEOM::GEOM_Object_ptr theBase, CORBA::Double theDX,
738                        CORBA::Double theDY, CORBA::Double theDZ,
739                        CORBA::Double theScaleFactor)
740 {
741   GEOM::GEOM_Object_var aGEOMObject;
742
743   //Set a not done flag
744   GetOperations()->SetNotDone();
745
746   //Get the reference objects
747   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
748
749   if (aBase.IsNull()) return aGEOMObject._retn();
750
751   //Create the Prism
752   Handle(::GEOM_Object) anObject =
753     GetOperations()->MakePrismDXDYDZ(aBase, theDX, theDY, theDZ, theScaleFactor);
754   if (!GetOperations()->IsDone() || anObject.IsNull())
755     return aGEOMObject._retn();
756
757   return GetObject(anObject);
758 }
759
760 //=============================================================================
761 /*!
762  *  MakeDraftPrism
763  */
764 //=============================================================================
765 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDraftPrism
766                       (GEOM::GEOM_Object_ptr theInitShape, GEOM::GEOM_Object_ptr theBase, 
767                        CORBA::Double  theHeight,
768                        CORBA::Double  theAngle,
769                        CORBA::Boolean theFuse,
770                        CORBA::Boolean theInvert)
771 {
772   GEOM::GEOM_Object_var aGEOMObject;
773   
774   //Set a not done flag
775   GetOperations()->SetNotDone();
776
777   //Get the reference objects
778   Handle(::GEOM_Object) aInit   = GetObjectImpl(theInitShape);
779   Handle(::GEOM_Object) aBase   = GetObjectImpl(theBase);
780
781   if (aBase.IsNull() || aInit.IsNull()) return aGEOMObject._retn();
782
783   //Create the Prism
784   Handle(::GEOM_Object) anObject = GetOperations()->MakeDraftPrism(aInit, aBase, theHeight, theAngle, theFuse, theInvert);
785  
786   if (!GetOperations()->IsDone() || anObject.IsNull())
787     return aGEOMObject._retn();
788
789   return GetObject(anObject);
790 }
791
792 //=============================================================================
793 /*!
794  *  MakePipe
795  */
796 //=============================================================================
797 GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipe
798                            (GEOM::GEOM_Object_ptr theBase,
799                             GEOM::GEOM_Object_ptr thePath,
800                             CORBA::Boolean        IsGenerateGroups)
801 {
802   GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
803
804   //Set a not done flag
805   GetOperations()->SetNotDone();
806
807   //Get the reference objects
808   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
809   Handle(::GEOM_Object) aPath = GetObjectImpl(thePath);
810
811   if (aBase.IsNull() || aPath.IsNull()) return aSeq._retn();
812
813   //Create the Pipe
814   Handle(TColStd_HSequenceOfTransient) aHSeq =
815     GetOperations()->MakePipe(aBase, aPath, IsGenerateGroups);
816   if (!GetOperations()->IsDone() || aHSeq.IsNull())
817     return aSeq._retn();
818
819   Standard_Integer aLength = aHSeq->Length();
820   aSeq->length(aLength);
821   for (Standard_Integer i = 1; i <= aLength; i++)
822     aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i)));
823
824   return aSeq._retn();
825 }
826
827 //=============================================================================
828 /*!
829  *  MakeRevolutionAxisAngle
830  */
831 //=============================================================================
832 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeRevolutionAxisAngle
833                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theAxis,
834                        CORBA::Double theAngle)
835 {
836   GEOM::GEOM_Object_var aGEOMObject;
837
838   //Set a not done flag
839   GetOperations()->SetNotDone();
840
841   //Get the reference objects
842   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
843   Handle(::GEOM_Object) anAxis = GetObjectImpl(theAxis);
844
845   if (aBase.IsNull() || anAxis.IsNull()) return aGEOMObject._retn();
846
847   //Create the Revolution
848   Handle(::GEOM_Object) anObject =
849       GetOperations()->MakeRevolutionAxisAngle(aBase, anAxis, theAngle);
850   if (!GetOperations()->IsDone() || anObject.IsNull())
851     return aGEOMObject._retn();
852
853   return GetObject(anObject);
854 }
855
856 //=============================================================================
857 /*!
858  *  MakeRevolutionAxisAngle2Ways
859  */
860 //=============================================================================
861 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeRevolutionAxisAngle2Ways
862                       (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theAxis,
863                        CORBA::Double theAngle)
864 {
865   GEOM::GEOM_Object_var aGEOMObject;
866
867   //Set a not done flag
868   GetOperations()->SetNotDone();
869
870   //Get the reference objects
871   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
872   Handle(::GEOM_Object) anAxis = GetObjectImpl(theAxis);
873
874   if (aBase.IsNull() || anAxis.IsNull()) return aGEOMObject._retn();
875
876   //Create the Revolution
877   Handle(::GEOM_Object) anObject =
878       GetOperations()->MakeRevolutionAxisAngle2Ways(aBase, anAxis, theAngle);
879   if (!GetOperations()->IsDone() || anObject.IsNull())
880     return aGEOMObject._retn();
881
882   return GetObject(anObject);
883 }
884
885 //=============================================================================
886 /*!
887  *  MakeFilling
888  */
889 //=============================================================================
890 GEOM::GEOM_Object_ptr
891 GEOM_I3DPrimOperations_i::MakeFilling(const GEOM::ListOfGO&     theContours,
892                                       CORBA::Long               theMinDeg,
893                                       CORBA::Long               theMaxDeg,
894                                       CORBA::Double             theTol2D,
895                                       CORBA::Double             theTol3D,
896                                       CORBA::Long               theNbIter,
897                                       GEOM::filling_oper_method theMethod,
898                                       CORBA::Boolean            theApprox)
899 {
900   GEOM::GEOM_Object_var aGEOMObject;
901
902   //Set a not done flag
903   GetOperations()->SetNotDone();
904
905   //Get the reference objects
906   std::list< Handle(::GEOM_Object) > aShapes;
907   if (! GetListOfObjectsImpl( theContours, aShapes ))
908     return aGEOMObject._retn();
909
910   int aMethod = 0;
911   switch (theMethod) {
912   case GEOM::FOM_Default:
913     {
914       // Default (standard behaviour)
915       aMethod = 0;
916     }
917     break;
918   case GEOM::FOM_UseOri:
919     {
920       // Use edges orientation
921       aMethod = 1;
922     }
923     break;
924   case GEOM::FOM_AutoCorrect:
925     {
926       // Auto-correct edges orientation
927       aMethod = 2;
928     }
929     break;
930   default:
931     {}
932   }
933
934   //Create the Solid
935   Handle(::GEOM_Object) anObject = GetOperations()->MakeFilling
936     (aShapes, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter, aMethod, theApprox);
937   if (!GetOperations()->IsDone() || anObject.IsNull())
938     return aGEOMObject._retn();
939
940   return GetObject(anObject);
941 }
942
943 //=============================================================================
944 /*!
945  *  MakeThruSections
946  */
947 //=============================================================================
948 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThruSections(const GEOM::ListOfGO& theSeqSections,
949                                                                  CORBA::Boolean theModeSolid,
950                                                                  CORBA::Double thePreci,
951                                                                  CORBA::Boolean theRuled)
952 {
953    GEOM::GEOM_Object_var aGEOMObject;
954
955   //Set a not done flag
956   GetOperations()->SetNotDone();
957   Handle(TColStd_HSequenceOfTransient) aSeqSections = new TColStd_HSequenceOfTransient;
958   int ind, aLen;
959
960   //Get the shapes
961   aLen = theSeqSections.length();
962   for (ind = 0; ind < aLen; ind++) {
963     Handle(::GEOM_Object) aSh = GetObjectImpl(theSeqSections[ind]);
964     if (!aSh.IsNull())
965       aSeqSections->Append(aSh);
966   }
967   if (!aSeqSections->Length())
968     return aGEOMObject._retn();
969
970   // Make shell or solid
971   Handle(::GEOM_Object) anObject =
972     GetOperations()->MakeThruSections(aSeqSections,theModeSolid,thePreci,theRuled);
973   if (!GetOperations()->IsDone() || anObject.IsNull())
974     return aGEOMObject._retn();
975
976   return GetObject(anObject);
977 }
978
979 //=============================================================================
980 /*!
981  *  MakePipeWithDifferentSections
982  */
983 //=============================================================================
984 GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections
985                            (const GEOM::ListOfGO        &theBases,
986                             const GEOM::ListOfGO        &theLocations,
987                                   GEOM::GEOM_Object_ptr  thePath,
988                                   CORBA::Boolean         theWithContact,
989                                   CORBA::Boolean         theWithCorrections,
990                                   CORBA::Boolean         IsBySteps,
991                                   CORBA::Boolean         IsGenerateGroups)
992 {
993   GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
994
995   //Set a not done flag
996   GetOperations()->SetNotDone();
997   Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
998   Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
999   int ind=0, aNbBases =0,aNbLocs=0;
1000
1001   //Get the shapes
1002   aNbBases = theBases.length();
1003   aNbLocs = theLocations.length();
1004
1005   if (aNbLocs && aNbBases != aNbLocs)
1006     return aSeq._retn();
1007
1008   Handle(::GEOM_Object) aPath = GetObjectImpl(thePath);
1009   if (aPath.IsNull())
1010     return aSeq._retn();
1011
1012   for (ind = 0; ind < aNbBases; ind++) {
1013     Handle(::GEOM_Object) aBase = GetObjectImpl(theBases[ind]);
1014     if (aBase.IsNull())
1015       continue;
1016     if (aNbLocs)
1017     {
1018       Handle(::GEOM_Object) aLoc = GetObjectImpl(theLocations[ind]);
1019       if (aLoc.IsNull())
1020         continue;
1021       aSeqLocations->Append(aLoc);
1022     }
1023     aSeqBases->Append(aBase);
1024   }
1025   if (!aSeqBases->Length())
1026     return aSeq._retn();
1027
1028   // Make pipe
1029   Handle(TColStd_HSequenceOfTransient) aHSeq =
1030     GetOperations()->MakePipeWithDifferentSections
1031               (aSeqBases, aSeqLocations,
1032                aPath, theWithContact,
1033                theWithCorrections, IsBySteps, IsGenerateGroups);
1034   if (!GetOperations()->IsDone() || aHSeq.IsNull())
1035     return aSeq._retn();
1036
1037   Standard_Integer aLength = aHSeq->Length();
1038   aSeq->length(aLength);
1039   for (Standard_Integer i = 1; i <= aLength; i++)
1040     aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i)));
1041
1042   return aSeq._retn();
1043 }
1044
1045
1046 //=============================================================================
1047 /*!
1048  *  MakePipeWithShellSections
1049  */
1050 //=============================================================================
1051 GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeWithShellSections
1052                            (const GEOM::ListOfGO        &theBases,
1053                             const GEOM::ListOfGO        &theSubBases,
1054                             const GEOM::ListOfGO        &theLocations,
1055                                   GEOM::GEOM_Object_ptr  thePath,
1056                                   CORBA::Boolean         theWithContact,
1057                                   CORBA::Boolean         theWithCorrections,
1058                                   CORBA::Boolean         IsGenerateGroups)
1059 {
1060   GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
1061
1062   //Set a not done flag
1063   GetOperations()->SetNotDone();
1064   Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
1065   Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient;
1066   Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
1067   int ind=0, aNbBases=0, aNbSubBases=0, aNbLocs=0;
1068
1069   //Get the shapes
1070   aNbBases = theBases.length();
1071   aNbSubBases = theSubBases.length();
1072   aNbLocs = theLocations.length();
1073
1074   if (aNbLocs && aNbBases != aNbLocs)
1075     return aSeq._retn();
1076
1077   Handle(::GEOM_Object) aPath = GetObjectImpl(thePath);
1078   if (aPath.IsNull())
1079     return aSeq._retn();
1080
1081   for (ind = 0; ind < aNbBases; ind++) {
1082     Handle(::GEOM_Object) aBase = GetObjectImpl(theBases[ind]);
1083     if (aBase.IsNull())
1084       continue;
1085     if (aNbLocs) {
1086       Handle(::GEOM_Object) aLoc = GetObjectImpl(theLocations[ind]);
1087       if (aLoc.IsNull())
1088         continue;
1089       aSeqLocations->Append(aLoc);
1090     }
1091     aSeqBases->Append(aBase);
1092
1093     if (aNbSubBases >= aNbBases) {
1094       Handle(::GEOM_Object) aSubBase = GetObjectImpl(theSubBases[ind]);
1095       if (aSubBase.IsNull()) {
1096         aSeqSubBases->Clear();
1097         aNbSubBases = 0;
1098         continue;
1099       }
1100       aSeqSubBases->Append(aSubBase);
1101     }
1102   }
1103   if (!aSeqBases->Length())
1104     return aSeq._retn();
1105
1106   // Make pipe
1107   Handle(TColStd_HSequenceOfTransient) aHSeq =
1108     GetOperations()->MakePipeWithShellSections
1109                   (aSeqBases, aSeqSubBases,
1110                    aSeqLocations, aPath,
1111                    theWithContact, theWithCorrections, IsGenerateGroups);
1112   if (!GetOperations()->IsDone() || aHSeq.IsNull())
1113     return aSeq._retn();
1114
1115   Standard_Integer aLength = aHSeq->Length();
1116   aSeq->length(aLength);
1117   for (Standard_Integer i = 1; i <= aLength; i++)
1118     aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i)));
1119
1120   return aSeq._retn();
1121 }
1122
1123
1124 //=============================================================================
1125 /*!
1126  *  MakePipeShellsWithoutPath
1127  */
1128 //=============================================================================
1129 GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath
1130                            (const GEOM::ListOfGO &theBases,
1131                             const GEOM::ListOfGO &theLocations,
1132                                   CORBA::Boolean  IsGenerateGroups)
1133 {
1134   GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
1135
1136   //Set a not done flag
1137   GetOperations()->SetNotDone();
1138   Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
1139   Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
1140   int ind=0, aNbBases=0, aNbLocs=0;
1141
1142   //Get the shapes
1143   aNbBases = theBases.length();
1144   aNbLocs = theLocations.length();
1145
1146   if (aNbLocs && aNbBases != aNbLocs)
1147     return aSeq._retn();
1148
1149   for (ind = 0; ind < aNbBases; ind++) {
1150     Handle(::GEOM_Object) aBase = GetObjectImpl(theBases[ind]);
1151     if (aBase.IsNull())
1152       continue;
1153     if (aNbLocs) {
1154       Handle(::GEOM_Object) aLoc = GetObjectImpl(theLocations[ind]);
1155       if (aLoc.IsNull())
1156         continue;
1157       aSeqLocations->Append(aLoc);
1158     }
1159     aSeqBases->Append(aBase);
1160   }
1161
1162   if (!aSeqBases->Length())
1163     return aSeq._retn();
1164
1165   // Make pipe
1166   Handle(TColStd_HSequenceOfTransient) aHSeq =
1167     GetOperations()->MakePipeShellsWithoutPath
1168           (aSeqBases, aSeqLocations, IsGenerateGroups);
1169
1170   if (!GetOperations()->IsDone() || aHSeq.IsNull())
1171     return aSeq._retn();
1172
1173   Standard_Integer aLength = aHSeq->Length();
1174   aSeq->length(aLength);
1175   for (Standard_Integer i = 1; i <= aLength; i++)
1176     aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i)));
1177
1178   return aSeq._retn();
1179 }
1180
1181 //=============================================================================
1182 /*!
1183  *  MakePipeBiNormalAlongVector
1184  */
1185 //=============================================================================
1186 GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector
1187                            (GEOM::GEOM_Object_ptr theBase,
1188                             GEOM::GEOM_Object_ptr thePath,
1189                             GEOM::GEOM_Object_ptr theVec,
1190                             CORBA::Boolean        IsGenerateGroups)
1191 {
1192   GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
1193
1194   //Set a not done flag
1195   GetOperations()->SetNotDone();
1196
1197   //Get the reference objects
1198   Handle(::GEOM_Object) aBase = GetObjectImpl(theBase);
1199   Handle(::GEOM_Object) aPath = GetObjectImpl(thePath);
1200   Handle(::GEOM_Object) aVec = GetObjectImpl(theVec);
1201
1202   if (aBase.IsNull() || aPath.IsNull() || aVec.IsNull()) return aSeq._retn();
1203
1204   //Create the Pipe
1205   Handle(TColStd_HSequenceOfTransient) aHSeq =
1206     GetOperations()->MakePipeBiNormalAlongVector
1207           (aBase, aPath, aVec, IsGenerateGroups);
1208   if (!GetOperations()->IsDone() || aHSeq.IsNull())
1209     return aSeq._retn();
1210
1211   Standard_Integer aLength = aHSeq->Length();
1212   aSeq->length(aLength);
1213   for (Standard_Integer i = 1; i <= aLength; i++)
1214     aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i)));
1215
1216   return aSeq._retn();
1217 }
1218
1219 //=============================================================================
1220 /*!
1221  *  MakeThickening
1222  */
1223 //=============================================================================
1224 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThickening
1225                  (GEOM::GEOM_Object_ptr   theObject,
1226                   const GEOM::ListOfLong &theFacesIDs,
1227                   CORBA::Double           theOffset,
1228                   CORBA::Boolean          doCopy,
1229                   CORBA::Boolean          theInside)
1230 {
1231   GEOM::GEOM_Object_var aGEOMObject;
1232   //Set a not done flag
1233   GetOperations()->SetNotDone();
1234
1235   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
1236
1237   //check if the object is a sub-shape
1238   if (!theObject->IsMainShape() && !doCopy) {
1239     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
1240     return aGEOMObject._retn();
1241   }
1242   
1243   if (!doCopy)
1244     aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
1245
1246   //Get the basic object
1247   Handle(::GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1248   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1249
1250   // Get faces IDs.
1251   Handle(TColStd_HArray1OfInteger) aFaceIDs;
1252   Standard_Integer                 aNbIDs = theFacesIDs.length();
1253   Standard_Integer                 i;
1254
1255   if (aNbIDs > 0) {
1256     aFaceIDs = new TColStd_HArray1OfInteger (1, aNbIDs);
1257
1258     for (i = 0; i < aNbIDs; i++) {
1259       aFaceIDs->SetValue(i + 1, theFacesIDs[i]);
1260     }
1261   }
1262
1263   //Create the thickened shape
1264   if (doCopy)
1265   {
1266     Handle(::GEOM_Object) anObject = GetOperations()->MakeThickening(
1267       aBasicObject, aFaceIDs, theOffset, doCopy, theInside);
1268     if (!GetOperations()->IsDone() || anObject.IsNull())
1269       return aGEOMObject._retn();
1270     
1271     return GetObject(anObject);
1272   }
1273   else
1274   {
1275     GetOperations()->MakeThickening(aBasicObject, aFaceIDs, theOffset, doCopy, theInside);
1276     
1277     // Update GUI.
1278     UpdateGUIForObject(theObject);
1279     
1280     return aGEOMObject._retn();
1281   }
1282 }
1283
1284 //=============================================================================
1285 /*!
1286  *  RestorePath
1287  */
1288 //=============================================================================
1289 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::RestorePath
1290                  (GEOM::GEOM_Object_ptr theShape,
1291                   GEOM::GEOM_Object_ptr theBase1,
1292                   GEOM::GEOM_Object_ptr theBase2)
1293 {
1294   GEOM::GEOM_Object_var aGEOMObject;
1295
1296   // Set a not done flag
1297   GetOperations()->SetNotDone();
1298
1299   // Get the reference objects
1300   Handle(::GEOM_Object) aShape = GetObjectImpl(theShape);
1301   Handle(::GEOM_Object) aBase1 = GetObjectImpl(theBase1);
1302   Handle(::GEOM_Object) aBase2 = GetObjectImpl(theBase2);
1303
1304   if (aShape.IsNull() || aBase1.IsNull() || aBase2.IsNull()) return aGEOMObject._retn();
1305
1306   // Create the Path
1307   Handle(::GEOM_Object) anObject = GetOperations()->RestorePath(aShape, aBase1, aBase2);
1308   if (!GetOperations()->IsDone() || anObject.IsNull())
1309     return aGEOMObject._retn();
1310
1311   return GetObject(anObject);
1312 }
1313
1314 //=============================================================================
1315 /*!
1316  *  RestorePathEdges
1317  */
1318 //=============================================================================
1319 GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::RestorePathEdges
1320                  (GEOM::GEOM_Object_ptr theShape,
1321                   const GEOM::ListOfGO& theBase1,
1322                   const GEOM::ListOfGO& theBase2)
1323 {
1324   GEOM::GEOM_Object_var aGEOMObject;
1325
1326   // Set a not done flag
1327   GetOperations()->SetNotDone();
1328
1329   // Get the reference objects
1330   Handle(::GEOM_Object) aShape = GetObjectImpl(theShape);
1331   if (aShape.IsNull()) return aGEOMObject._retn();
1332
1333   Handle(TColStd_HSequenceOfTransient) aSeqBases1 = new TColStd_HSequenceOfTransient;
1334   Handle(TColStd_HSequenceOfTransient) aSeqBases2 = new TColStd_HSequenceOfTransient;
1335
1336   int ind;
1337   int aNbBases1 = theBase1.length();
1338   int aNbBases2 = theBase2.length();
1339
1340   for (ind = 0; ind < aNbBases1; ind++) {
1341     Handle(::GEOM_Object) aBase = GetObjectImpl(theBase1[ind]);
1342     if (!aBase.IsNull())
1343       aSeqBases1->Append(aBase);
1344   }
1345   for (ind = 0; ind < aNbBases2; ind++) {
1346     Handle(::GEOM_Object) aBase = GetObjectImpl(theBase2[ind]);
1347     if (!aBase.IsNull())
1348       aSeqBases2->Append(aBase);
1349   }
1350
1351   if (!aSeqBases1->Length() || !aSeqBases2->Length())
1352     return aGEOMObject._retn();
1353
1354   // Create the Path
1355   Handle(::GEOM_Object) anObject = GetOperations()->RestorePath(aShape, aSeqBases1, aSeqBases2);
1356   if (!GetOperations()->IsDone() || anObject.IsNull())
1357     return aGEOMObject._retn();
1358
1359   return GetObject(anObject);
1360 }