Salome HOME
Update copyright: 2016
[modules/geom.git] / src / GEOM_I / GEOM_ITransformOperations_i.cc
1 // Copyright (C) 2007-2016  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_ITransformOperations_i.hh"
26
27 #include "utilities.h"
28 #include "OpUtil.hxx"
29 #include "Utils_ExceptHandlers.hxx"
30
31 #include <TDF_Label.hxx>
32 #include <TDF_Tool.hxx>
33 #include <TCollection_AsciiString.hxx>
34 #include "GEOM_Engine.hxx"
35 #include "GEOM_Object.hxx"
36
37 #define SUBSHAPE_ERROR "Sub shape cannot be transformed"
38
39 //=============================================================================
40 /*!
41  *   constructor:
42  */
43 //=============================================================================
44
45 GEOM_ITransformOperations_i::GEOM_ITransformOperations_i (PortableServer::POA_ptr thePOA,
46                                                           GEOM::GEOM_Gen_ptr theEngine,
47                                                           ::GEOMImpl_ITransformOperations* theImpl)
48      :GEOM_IOperations_i(thePOA, theEngine, theImpl)
49 {
50   MESSAGE("GEOM_ITransformOperations_i::GEOM_ITransformOperations_i");
51 }
52
53 //=============================================================================
54 /*!
55  *  destructor
56  */
57 //=============================================================================
58
59 GEOM_ITransformOperations_i::~GEOM_ITransformOperations_i()
60 {
61   MESSAGE("GEOM_ITransformOperations_i::~GEOM_ITransformOperations_i");
62 }
63
64
65 //=============================================================================
66 /*!
67  *  TranslateTwoPoints
68  */
69 //=============================================================================
70 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateTwoPoints
71                                              (GEOM::GEOM_Object_ptr theObject,
72                                               GEOM::GEOM_Object_ptr thePoint1,
73                                               GEOM::GEOM_Object_ptr thePoint2)
74 {
75   //Set a not done flag
76   GetOperations()->SetNotDone();
77   GEOM::GEOM_Object_var aGEOMObject;
78
79   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
80
81   //check if the object is a sub-shape
82   if (!theObject->IsMainShape()) {
83     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
84     return aGEOMObject._retn();
85   }
86
87   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
88
89   //Get the object itself
90   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
91   if (anObject.IsNull()) return aGEOMObject._retn();
92
93   //Get the first point of translation
94   Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
95   if (aPoint1.IsNull()) return aGEOMObject._retn();
96
97   //Get the second point of translation
98   Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
99   if (aPoint2.IsNull()) return aGEOMObject._retn();
100
101   //Perform the translation
102   GetOperations()->TranslateTwoPoints(anObject, aPoint1, aPoint2);
103
104   // Update GUI.
105   UpdateGUIForObject(theObject);
106
107   return aGEOMObject._retn();
108 }
109
110 //=============================================================================
111 /*!
112  *  TranslateTwoPointsCopy
113  */
114 //=============================================================================
115 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateTwoPointsCopy
116                                              (GEOM::GEOM_Object_ptr theObject,
117                                               GEOM::GEOM_Object_ptr thePoint1,
118                                               GEOM::GEOM_Object_ptr thePoint2)
119 {
120   GEOM::GEOM_Object_var aGEOMObject;
121
122   //Set a not done flag
123   GetOperations()->SetNotDone();
124
125   //Get the object itself
126   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
127   if (aBasicObject.IsNull()) return aGEOMObject._retn();
128
129   //Get the first point of translation
130   Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
131   if (aPoint1.IsNull()) return aGEOMObject._retn();
132
133   //Get the second point of translation
134   Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
135   if (aPoint2.IsNull()) return aGEOMObject._retn();
136
137   //Create the translated shape
138   Handle(GEOM_Object) anObject =
139     GetOperations()->TranslateTwoPointsCopy(aBasicObject, aPoint1, aPoint2);
140   if (!GetOperations()->IsDone() || anObject.IsNull())
141     return aGEOMObject._retn();
142
143   return GetObject(anObject);
144 }
145
146 //=============================================================================
147 /*!
148  *  TranslateDXDYDZ
149  */
150 //=============================================================================
151 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateDXDYDZ
152                       (GEOM::GEOM_Object_ptr theObject,
153                        CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ)
154 {
155   //Set a not done flag
156   GetOperations()->SetNotDone();
157   GEOM::GEOM_Object_var aGEOMObject;
158
159   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
160
161   //check if the object is a sub-shape
162   if (!theObject->IsMainShape()) {
163     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
164     return aGEOMObject._retn();
165   }
166
167   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
168
169   //Get the object itself
170   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
171   if (anObject.IsNull()) return aGEOMObject._retn();
172
173   //Perform the translation
174   GetOperations()->TranslateDXDYDZ(anObject, theDX, theDY, theDZ);
175
176   // Update GUI.
177   UpdateGUIForObject(theObject);
178
179   return aGEOMObject._retn();
180 }
181
182 //=============================================================================
183 /*!
184  *  TranslateDXDYDZCopy
185  */
186 //=============================================================================
187 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateDXDYDZCopy
188                                              (GEOM::GEOM_Object_ptr theObject,
189                                               CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ)
190 {
191   GEOM::GEOM_Object_var aGEOMObject;
192
193   //Set a not done flag
194   GetOperations()->SetNotDone();
195
196   //Get the object itself
197   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
198   if (aBasicObject.IsNull()) return aGEOMObject._retn();
199
200   //Create the translated shape
201   Handle(GEOM_Object) anObject =
202     GetOperations()->TranslateDXDYDZCopy(aBasicObject, theDX, theDY, theDZ);
203   if (!GetOperations()->IsDone() || anObject.IsNull())
204     return aGEOMObject._retn();
205
206   return GetObject(anObject);
207 }
208
209 //=============================================================================
210 /*!
211  *  TranslateVector
212  */
213 //=============================================================================
214 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateVector
215                                             (GEOM::GEOM_Object_ptr theObject,
216                                              GEOM::GEOM_Object_ptr theVector)
217 {
218   //Set a not done flag
219   GetOperations()->SetNotDone();
220   GEOM::GEOM_Object_var aGEOMObject;
221
222   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
223
224   //check if the object is a sub-shape
225   if (!theObject->IsMainShape()) {
226     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
227     return aGEOMObject._retn();
228   }
229
230   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
231
232   //Get the object itself
233   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
234   if (anObject.IsNull()) return aGEOMObject._retn();
235
236   //Get the vector of translation
237   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
238   if (aVector.IsNull()) return aGEOMObject._retn();
239
240   //Perform the translation
241   GetOperations()->TranslateVector(anObject, aVector);
242
243   // Update GUI.
244   UpdateGUIForObject(theObject);
245
246   return aGEOMObject._retn();
247 }
248
249 //=============================================================================
250 /*!
251  *  TranslateVectorCopy
252  */
253 //=============================================================================
254 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateVectorCopy
255                                             (GEOM::GEOM_Object_ptr theObject,
256                                              GEOM::GEOM_Object_ptr theVector)
257 {
258   GEOM::GEOM_Object_var aGEOMObject;
259
260   //Set a not done flag
261   GetOperations()->SetNotDone();
262
263   //Get the object itself
264   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
265   if (aBasicObject.IsNull()) return aGEOMObject._retn();
266
267   //Get the vector of translation
268   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
269   if (aVector.IsNull()) return aGEOMObject._retn();
270
271   //Perform the translation
272   Handle(GEOM_Object) anObject = GetOperations()->TranslateVectorCopy(aBasicObject, aVector);
273   if (!GetOperations()->IsDone() || anObject.IsNull())
274     return aGEOMObject._retn();
275
276   return GetObject(anObject);
277 }
278
279 //=============================================================================
280 /*!
281  *  TranslateVectorDistance
282  */
283 //=============================================================================
284 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateVectorDistance
285                                             (GEOM::GEOM_Object_ptr theObject,
286                                              GEOM::GEOM_Object_ptr theVector,
287                                              CORBA::Double theDistance,
288                                              CORBA::Boolean theCopy)
289 {
290   GEOM::GEOM_Object_var aGEOMObject;
291   GetOperations()->SetNotDone(); //Set a not done flag
292
293   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
294
295   //check if the object is a sub-shape
296   if (!theCopy && !theObject->IsMainShape()) {
297     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
298     return aGEOMObject._retn();
299   }
300
301   if (!theCopy)
302     aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
303
304   //Get the object itself
305   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
306   if (aBasicObject.IsNull()) return aGEOMObject._retn();
307
308   //Get the vector of translation
309   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
310   if (aVector.IsNull()) return aGEOMObject._retn();
311
312   //Perform the translation
313   if (theCopy) {
314     Handle(GEOM_Object) anObject = GetOperations()->
315       TranslateVectorDistance(aBasicObject, aVector, theDistance, theCopy);
316     if (!GetOperations()->IsDone() || anObject.IsNull())
317       return aGEOMObject._retn();
318
319     return GetObject(anObject);
320   }
321
322   GetOperations()->TranslateVectorDistance(aBasicObject, aVector, theDistance, theCopy);
323
324   // Update GUI.
325   UpdateGUIForObject(theObject);
326
327   return aGEOMObject._retn();
328 }
329
330 //=============================================================================
331 /*!
332  *  Rotate
333  */
334 //=============================================================================
335 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::Rotate (GEOM::GEOM_Object_ptr theObject,
336                                                            GEOM::GEOM_Object_ptr theAxis,
337                                                            CORBA::Double theAngle)
338 {
339   //Set a not done flag
340   GetOperations()->SetNotDone();
341   GEOM::GEOM_Object_var aGEOMObject;
342
343   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
344
345   //check if the object is a sub-shape
346   if (!theObject->IsMainShape()) {
347     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
348     return aGEOMObject._retn();
349   }
350
351   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
352
353   //Get the object itself
354   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
355   if (anObject.IsNull()) return aGEOMObject._retn();
356
357   //Get the axis of revolution
358   Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis);
359   if (anAxis.IsNull()) return aGEOMObject._retn();
360
361   //Perform the rotation
362   GetOperations()->Rotate(anObject, anAxis, theAngle);
363
364   // Update GUI.
365   UpdateGUIForObject(theObject);
366
367   return aGEOMObject._retn();
368 }
369
370 //=============================================================================
371 /*!
372  *  RotateCopy
373  */
374 //=============================================================================
375 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RotateCopy (GEOM::GEOM_Object_ptr theObject,
376                                                                GEOM::GEOM_Object_ptr theAxis,
377                                                                CORBA::Double theAngle)
378 {
379   GEOM::GEOM_Object_var aGEOMObject;
380
381   //Set a not done flag
382   GetOperations()->SetNotDone();
383
384   //Get the object itself
385   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
386   if (aBasicObject.IsNull()) return aGEOMObject._retn();
387
388   //Get the axis of rotation
389   Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis);
390   if (anAxis.IsNull()) return aGEOMObject._retn();
391
392   //Perform the rotation
393   Handle(GEOM_Object) anObject = GetOperations()->RotateCopy(aBasicObject, anAxis, theAngle);
394   if (!GetOperations()->IsDone() || anObject.IsNull())
395     return aGEOMObject._retn();
396
397   return GetObject(anObject);
398 }
399
400 //=============================================================================
401 /*!
402  *  MirrorPlane
403  */
404 //=============================================================================
405 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPlane
406                                             (GEOM::GEOM_Object_ptr theObject,
407                                              GEOM::GEOM_Object_ptr thePlane)
408 {
409   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
410
411   //Set a not done flag
412   GetOperations()->SetNotDone();
413
414   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
415
416   //check if the object is a sub-shape
417   if (!theObject->IsMainShape()) {
418     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
419     return aGEOMObject._retn();
420   }
421
422   //Get the object itself
423   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
424   if (anObject.IsNull()) return aGEOMObject._retn();
425
426   //Get the plane
427   Handle(GEOM_Object) aPlane = GetObjectImpl(thePlane);
428   if (aPlane.IsNull()) return aGEOMObject._retn();
429
430   //Perform the mirror
431   GetOperations()->MirrorPlane(anObject, aPlane);
432
433   // Update GUI.
434   UpdateGUIForObject(theObject);
435
436   return aGEOMObject._retn();
437 }
438
439 //=============================================================================
440 /*!
441  *  MirrorPlaneCopy
442  */
443 //=============================================================================
444 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPlaneCopy
445                                             (GEOM::GEOM_Object_ptr theObject,
446                                              GEOM::GEOM_Object_ptr thePlane)
447 {
448   GEOM::GEOM_Object_var aGEOMObject;
449
450   //Set a not done flag
451   GetOperations()->SetNotDone();
452
453   //Get the object itself
454   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
455   if (aBasicObject.IsNull()) return aGEOMObject._retn();
456
457   //Get the vector of translation
458   Handle(GEOM_Object) aPlane = GetObjectImpl(thePlane);
459   if (aPlane.IsNull()) return aGEOMObject._retn();
460
461   //Perform the mirror
462   Handle(GEOM_Object) anObject = GetOperations()->MirrorPlaneCopy(aBasicObject, aPlane);
463   if (!GetOperations()->IsDone() || anObject.IsNull())
464     return aGEOMObject._retn();
465
466   return GetObject(anObject);
467 }
468
469 //=============================================================================
470 /*!
471  *  MirrorAxis
472  */
473 //=============================================================================
474 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorAxis
475                                             (GEOM::GEOM_Object_ptr theObject,
476                                              GEOM::GEOM_Object_ptr theAxis)
477 {
478   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
479
480   //Set a not done flag
481   GetOperations()->SetNotDone();
482
483   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
484
485   //check if the object is a sub-shape
486   if (!theObject->IsMainShape()) {
487     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
488     return aGEOMObject._retn();
489   }
490
491   //Get the object itself
492   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
493   if (anObject.IsNull()) return aGEOMObject._retn();
494
495   //Get the axis
496   Handle(GEOM_Object) aAxis = GetObjectImpl(theAxis);
497   if (aAxis.IsNull()) return aGEOMObject._retn();
498
499   //Perform the mirror
500   GetOperations()->MirrorAxis(anObject, aAxis);
501
502   // Update GUI.
503   UpdateGUIForObject(theObject);
504
505   return aGEOMObject._retn();
506 }
507
508 //=============================================================================
509 /*!
510  *  MirrorAxisCopy
511  */
512 //=============================================================================
513 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorAxisCopy
514                                             (GEOM::GEOM_Object_ptr theObject,
515                                              GEOM::GEOM_Object_ptr theAxis)
516 {
517   GEOM::GEOM_Object_var aGEOMObject;
518
519   //Set a not done flag
520   GetOperations()->SetNotDone();
521
522   //Get the object itself
523   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
524   if (aBasicObject.IsNull()) return aGEOMObject._retn();
525
526   //Get the vector of translation
527   Handle(GEOM_Object) aAxis = GetObjectImpl(theAxis);
528   if (aAxis.IsNull()) return aGEOMObject._retn();
529
530   //Perform the mirror
531   Handle(GEOM_Object) anObject = GetOperations()->MirrorAxisCopy(aBasicObject, aAxis);
532   if (!GetOperations()->IsDone() || anObject.IsNull())
533     return aGEOMObject._retn();
534
535   return GetObject(anObject);
536 }
537
538 //=============================================================================
539 /*!
540  *  MirrorPoint
541  */
542 //=============================================================================
543 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPoint
544                                             (GEOM::GEOM_Object_ptr theObject,
545                                              GEOM::GEOM_Object_ptr thePoint)
546 {
547   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
548
549   //Set a not done flag
550   GetOperations()->SetNotDone();
551
552   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
553
554   //check if the object is a sub-shape
555   if (!theObject->IsMainShape()) {
556     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
557     return aGEOMObject._retn();
558   }
559
560   //Get the object itself
561   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
562   if (anObject.IsNull()) return aGEOMObject._retn();
563
564   //Get the point
565   Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
566   if (aPoint.IsNull()) return aGEOMObject._retn();
567
568   //Perform the mirror
569   GetOperations()->MirrorPoint(anObject, aPoint);
570
571   // Update GUI.
572   UpdateGUIForObject(theObject);
573
574   return aGEOMObject._retn();
575 }
576
577 //=============================================================================
578 /*!
579  *  MirrorPointCopy
580  */
581 //=============================================================================
582 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPointCopy
583                                             (GEOM::GEOM_Object_ptr theObject,
584                                              GEOM::GEOM_Object_ptr thePoint)
585 {
586   GEOM::GEOM_Object_var aGEOMObject;
587
588   //Set a not done flag
589   GetOperations()->SetNotDone();
590
591   //Get the object itself
592   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
593   if (aBasicObject.IsNull()) return aGEOMObject._retn();
594
595   //Get the vector of translation
596   Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
597   if (aPoint.IsNull()) return aGEOMObject._retn();
598
599   //Perform the mirror
600   Handle(GEOM_Object) anObject = GetOperations()->MirrorPointCopy(aBasicObject, aPoint);
601   if (!GetOperations()->IsDone() || anObject.IsNull())
602     return aGEOMObject._retn();
603
604   return GetObject(anObject);
605 }
606
607 //=============================================================================
608 /*!
609  *  OffsetShape
610  */
611 //=============================================================================
612 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape
613                                              (GEOM::GEOM_Object_ptr theObject,
614                                               CORBA::Double theOffset)
615 {
616   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
617
618   //Set a not done flag
619   GetOperations()->SetNotDone();
620
621   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
622
623   //check if the object is a sub-shape
624   if (!theObject->IsMainShape()) {
625     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
626     return aGEOMObject._retn();
627   }
628
629   //Get the basic object
630   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
631   if (aBasicObject.IsNull()) return aGEOMObject._retn();
632
633   //Create the offset shape
634   GetOperations()->OffsetShape(aBasicObject, theOffset);
635
636   // Update GUI.
637   UpdateGUIForObject(theObject);
638
639   return aGEOMObject._retn();
640 }
641
642 //=============================================================================
643 /*!
644  *  OffsetShapeCopy
645  */
646 //=============================================================================
647 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy
648                                              (GEOM::GEOM_Object_ptr theObject,
649                                               CORBA::Double theOffset)
650 {
651   GEOM::GEOM_Object_var aGEOMObject;
652
653   //Set a not done flag
654   GetOperations()->SetNotDone();
655
656   //Get the basic object
657   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
658   if (aBasicObject.IsNull()) return aGEOMObject._retn();
659
660   //Create the offset shape
661   Handle(GEOM_Object) anObject = GetOperations()->OffsetShapeCopy(aBasicObject, theOffset);
662   if (!GetOperations()->IsDone() || anObject.IsNull())
663     return aGEOMObject._retn();
664
665   return GetObject(anObject);
666 }
667
668 //=============================================================================
669 /*!
670  *  ProjectShapeCopy
671  */
672 //=============================================================================
673 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ProjectShapeCopy
674                                              (GEOM::GEOM_Object_ptr theSource,
675                                               GEOM::GEOM_Object_ptr theTarget)
676 {
677   GEOM::GEOM_Object_var aGEOMObject;
678
679   //Set a not done flag
680   GetOperations()->SetNotDone();
681
682   //Get the input objects
683   Handle(GEOM_Object) aSource = GetObjectImpl(theSource);
684   Handle(GEOM_Object) aTarget = GetObjectImpl(theTarget);
685   if (aSource.IsNull() || aTarget.IsNull()) return aGEOMObject._retn();
686
687   //Create the projection
688   Handle(GEOM_Object) anObject = GetOperations()->ProjectShapeCopy(aSource, aTarget);
689   if (!GetOperations()->IsDone() || anObject.IsNull())
690     return aGEOMObject._retn();
691
692   return GetObject(anObject);
693 }
694
695 //=============================================================================
696 /*!
697  *  ProjectPointOnWire
698  */
699 //=============================================================================
700 CORBA::Double GEOM_ITransformOperations_i::ProjectPointOnWire
701                                (GEOM::GEOM_Object_ptr thePoint,
702                                 GEOM::GEOM_Object_ptr theWire,
703                                 GEOM::GEOM_Object_out thePointOnEdge,
704                                 CORBA::Long&          theEdgeInWireIndex)
705 {
706   //Set a not done flag
707   GetOperations()->SetNotDone();
708
709   //Get the reference shape
710   Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
711   Handle(GEOM_Object) aWire = GetObjectImpl(theWire);
712
713   if (aPoint.IsNull() || aWire.IsNull()) {
714     return -1.0;
715   }
716
717   Handle(GEOM_Object) aPointOnEdge;
718   Standard_Integer anEdgeIndex;
719   CORBA::Double aResult = GetOperations()->ProjectPointOnWire
720     (aPoint, aWire, aPointOnEdge, anEdgeIndex);
721
722   if (!aPointOnEdge.IsNull()) {
723     thePointOnEdge = GetObject(aPointOnEdge);
724     theEdgeInWireIndex = anEdgeIndex;
725   }
726
727   return aResult;
728 }
729
730 //=============================================================================
731 /*!
732  *  ScaleShape
733  */
734 //=============================================================================
735 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ScaleShape
736                                              (GEOM::GEOM_Object_ptr theObject,
737                                               GEOM::GEOM_Object_ptr thePoint,
738                                               CORBA::Double         theFactor)
739 {
740   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
741
742   //Set a not done flag
743   GetOperations()->SetNotDone();
744
745   if (theObject->_is_nil()) return aGEOMObject._retn();
746
747   //check if the object is a sub-shape
748   if (!theObject->IsMainShape()) {
749     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
750     return aGEOMObject._retn();
751   }
752
753   //Get the object itself
754   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
755   if (anObject.IsNull()) return aGEOMObject._retn();
756
757   //Get the point
758   Handle(GEOM_Object) aPoint;
759   if (!thePoint->_is_nil()) {
760     aPoint = GetObjectImpl(thePoint);
761     if (aPoint.IsNull()) return aGEOMObject._retn();
762   }
763
764   //Perform the scale
765   GetOperations()->ScaleShape(anObject, aPoint, theFactor);
766
767   // Update GUI.
768   UpdateGUIForObject(theObject);
769
770   return  aGEOMObject._retn();
771 }
772
773 //=============================================================================
774 /*!
775  *  ScaleShapeCopy
776  */
777 //=============================================================================
778 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ScaleShapeCopy
779                                              (GEOM::GEOM_Object_ptr theObject,
780                                               GEOM::GEOM_Object_ptr thePoint,
781                                               CORBA::Double         theFactor)
782 {
783   GEOM::GEOM_Object_var aGEOMObject;
784
785   //Set a not done flag
786   GetOperations()->SetNotDone();
787
788   //Get the basic object
789   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
790   if (aBasicObject.IsNull()) return aGEOMObject._retn();
791
792   //Get the point
793   Handle(GEOM_Object) aPoint;
794   if (!thePoint->_is_nil()) {
795     aPoint = GetObjectImpl(thePoint);
796     if (aPoint.IsNull()) return aGEOMObject._retn();
797   }
798
799   //Perform the scale
800   Handle(GEOM_Object) anObject =
801     GetOperations()->ScaleShapeCopy(aBasicObject, aPoint, theFactor);
802   if (!GetOperations()->IsDone() || anObject.IsNull())
803     return aGEOMObject._retn();
804
805   return GetObject(anObject);
806 }
807
808 //=============================================================================
809 /*!
810  *  ScaleShapeAlongAxes
811  */
812 //=============================================================================
813 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ScaleShapeAlongAxes
814                                              (GEOM::GEOM_Object_ptr theObject,
815                                               GEOM::GEOM_Object_ptr thePoint,
816                                               CORBA::Double         theFactorX,
817                                               CORBA::Double         theFactorY,
818                                               CORBA::Double         theFactorZ)
819 {
820   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
821
822   //Set a not done flag
823   GetOperations()->SetNotDone();
824
825   if (theObject->_is_nil()) return aGEOMObject._retn();
826
827   //check if the object is a sub-shape
828   if (!theObject->IsMainShape()) {
829     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
830     return aGEOMObject._retn();
831   }
832
833   //Get the object itself
834   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
835   if (anObject.IsNull()) return aGEOMObject._retn();
836
837   //Get the point
838   Handle(GEOM_Object) aPoint;
839   if (!thePoint->_is_nil()) {
840     aPoint = GetObjectImpl(thePoint);
841     if (aPoint.IsNull()) return aGEOMObject._retn();
842   }
843
844   //Perform the scale
845   GetOperations()->ScaleShapeAlongAxes
846     (anObject, aPoint, theFactorX, theFactorY, theFactorZ, /*doCopy*/false);
847
848   // Update GUI.
849   UpdateGUIForObject(theObject);
850
851   return  aGEOMObject._retn();
852 }
853
854 //=============================================================================
855 /*!
856  *  ScaleShapeAlongAxesCopy
857  */
858 //=============================================================================
859 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ScaleShapeAlongAxesCopy
860                                              (GEOM::GEOM_Object_ptr theObject,
861                                               GEOM::GEOM_Object_ptr thePoint,
862                                               CORBA::Double         theFactorX,
863                                               CORBA::Double         theFactorY,
864                                               CORBA::Double         theFactorZ)
865 {
866   GEOM::GEOM_Object_var aGEOMObject;
867
868   //Set a not done flag
869   GetOperations()->SetNotDone();
870
871   //Get the basic object
872   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
873   if (aBasicObject.IsNull()) return aGEOMObject._retn();
874
875   //Get the point
876   Handle(GEOM_Object) aPoint;
877   if (!thePoint->_is_nil()) {
878     aPoint = GetObjectImpl(thePoint);
879     if (aPoint.IsNull()) return aGEOMObject._retn();
880   }
881
882   //Perform the scale
883   Handle(GEOM_Object) anObject = GetOperations()->ScaleShapeAlongAxes
884     (aBasicObject, aPoint, theFactorX, theFactorY, theFactorZ, /*doCopy*/true);
885   if (!GetOperations()->IsDone() || anObject.IsNull())
886     return aGEOMObject._retn();
887
888   return GetObject(anObject);
889 }
890
891 //=============================================================================
892 /*!
893  *  PositionShape
894  */
895 //=============================================================================
896 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionShape
897                                              (GEOM::GEOM_Object_ptr theObject,
898                                               GEOM::GEOM_Object_ptr theStartLCS,
899                                               GEOM::GEOM_Object_ptr theEndLCS)
900 {
901   GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
902
903   //Set a not done flag
904   GetOperations()->SetNotDone();
905
906   if (CORBA::is_nil(theObject) || CORBA::is_nil(theEndLCS))
907     return aGEOMObject._retn();
908
909   //check if the object is a sub-shape
910   if (!theObject->IsMainShape()) {
911     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
912     return aGEOMObject._retn();
913   }
914
915   //Get the basic object
916   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
917   if (anObject.IsNull()) return aGEOMObject._retn();
918
919   //Get the Start LCS (may be NULL for positioning from global LCS)
920   Handle(GEOM_Object) aStartLCS;
921   if (!CORBA::is_nil(theStartLCS)) {
922     aStartLCS = GetObjectImpl(theStartLCS);
923     if (aStartLCS.IsNull()) return aGEOMObject._retn();
924   }
925
926   //Get the End LCS
927   Handle(GEOM_Object) aEndLCS = GetObjectImpl(theEndLCS);
928   if (aEndLCS.IsNull()) return aGEOMObject._retn();
929
930   //Perform the Position
931   GetOperations()->PositionShape(anObject, aStartLCS, aEndLCS);
932
933   // Update GUI.
934   UpdateGUIForObject(theObject);
935
936   return  aGEOMObject._retn();
937 }
938
939 //=============================================================================
940 /*!
941  *  PositionShapeCopy
942  */
943 //=============================================================================
944 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionShapeCopy
945                                              (GEOM::GEOM_Object_ptr theObject,
946                                               GEOM::GEOM_Object_ptr theStartLCS,
947                                               GEOM::GEOM_Object_ptr theEndLCS)
948 {
949   GEOM::GEOM_Object_var aGEOMObject;
950
951   //Set a not done flag
952   GetOperations()->SetNotDone();
953
954   //Get the basic object
955   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
956   if (aBasicObject.IsNull()) return aGEOMObject._retn();
957
958   //Get the Start LCS (may be NULL for positioning from global LCS)
959   Handle(GEOM_Object) aStartLCS;
960   if (!CORBA::is_nil(theStartLCS)) {
961     aStartLCS = GetObjectImpl(theStartLCS);
962     if (aStartLCS.IsNull()) return aGEOMObject._retn();
963   }
964
965   //Get the End LCS
966   Handle(GEOM_Object) aEndLCS = GetObjectImpl(theEndLCS);
967   if (aEndLCS.IsNull()) return aGEOMObject._retn();
968
969   //Perform the position
970   Handle(GEOM_Object) anObject =
971     GetOperations()->PositionShapeCopy(aBasicObject, aStartLCS, aEndLCS);
972   if (!GetOperations()->IsDone() || anObject.IsNull())
973     return aGEOMObject._retn();
974
975   return GetObject(anObject);
976 }
977
978 //=============================================================================
979 /*!
980  *  PositionAlongPath
981  */
982 //=============================================================================
983 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionAlongPath
984                                              (GEOM::GEOM_Object_ptr theObject,
985                                               GEOM::GEOM_Object_ptr thePath,
986                                               CORBA::Double         theDistance,
987                                               CORBA::Boolean        theCopy,
988                                               CORBA::Boolean        theReverse)
989 {
990   GEOM::GEOM_Object_var aGEOMObject;
991
992   //Set a not done flag
993   GetOperations()->SetNotDone();
994
995   //Get the basic object
996   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
997   if (aBasicObject.IsNull()) return aGEOMObject._retn();
998
999   //Get the path object
1000   Handle(GEOM_Object) aPathObject = GetObjectImpl(thePath);
1001   if (aPathObject.IsNull()) return aGEOMObject._retn();
1002
1003   //Perform the position
1004   Handle(GEOM_Object) anObject =
1005     GetOperations()->PositionAlongPath(aBasicObject, aPathObject, theDistance, theCopy, theReverse);
1006   if (!GetOperations()->IsDone() || anObject.IsNull())
1007     return aGEOMObject._retn();
1008
1009   if (!theCopy) {
1010     // Update GUI.
1011     UpdateGUIForObject(theObject);
1012   }
1013
1014   return GetObject(anObject);
1015 }
1016
1017 //=============================================================================
1018 /*!
1019  *  MultiTranslate1D
1020  */
1021 //=============================================================================
1022 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate1D
1023                            (GEOM::GEOM_Object_ptr theObject,
1024                             GEOM::GEOM_Object_ptr theVector,
1025                             CORBA::Double theStep, CORBA::Long theNbTimes)
1026 {
1027   //Set a not done flag
1028   GetOperations()->SetNotDone();
1029
1030   GEOM::GEOM_Object_var aGEOMObject;
1031
1032   //Get the object itself
1033   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1034   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1035
1036   //Get the vector of translation
1037   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
1038   //if (aVector.IsNull()) return aGEOMObject._retn(); // DX by default
1039
1040   //Perform the translation
1041   Handle(GEOM_Object) anObject =
1042     GetOperations()->Translate1D(aBasicObject, aVector, theStep, theNbTimes);
1043   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1044
1045   return GetObject(anObject);
1046 }
1047
1048 //=============================================================================
1049 /*!
1050  *  MultiTranslate2D
1051  */
1052 //=============================================================================
1053 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate2D (GEOM::GEOM_Object_ptr theObject,
1054                                                                      GEOM::GEOM_Object_ptr theVector1,
1055                                                                      CORBA::Double theStep1,
1056                                                                      CORBA::Long theNbTimes1,
1057                                                                      GEOM::GEOM_Object_ptr theVector2,
1058                                                                      CORBA::Double theStep2,
1059                                                                      CORBA::Long theNbTimes2)
1060 {
1061   //Set a not done flag
1062   GetOperations()->SetNotDone();
1063
1064   GEOM::GEOM_Object_var aGEOMObject;
1065
1066   //Get the object itself
1067   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1068   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1069
1070   //Get the vector1 of translation
1071   Handle(GEOM_Object) aVector1 = GetObjectImpl(theVector1);
1072   //if (aVector1.IsNull()) return aGEOMObject._retn(); // DX by default
1073
1074   //Get the vector2 of translation
1075   Handle(GEOM_Object) aVector2 = GetObjectImpl(theVector2);
1076   //if (aVector2.IsNull()) return aGEOMObject._retn(); // DY by default
1077
1078   //Perform the translation
1079   Handle(GEOM_Object) anObject = GetOperations()->Translate2D
1080     (aBasicObject, aVector1, theStep1, theNbTimes1, aVector2, theStep2, theNbTimes2);
1081   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1082
1083   return GetObject(anObject);
1084 }
1085
1086 //=============================================================================
1087 /*!
1088  *  MultiRotate1D
1089  */
1090 //=============================================================================
1091 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1D (GEOM::GEOM_Object_ptr theObject,
1092                                                                   GEOM::GEOM_Object_ptr theVector,
1093                                                                   CORBA::Long theNbTimes)
1094 {
1095   //Set a not done flag
1096   GetOperations()->SetNotDone();
1097
1098   GEOM::GEOM_Object_var aGEOMObject;
1099
1100   //Get the object itself
1101   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1102   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1103
1104   //Get the a directon of rotation
1105   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
1106   //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
1107
1108   //Perform the rotation
1109   Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theNbTimes);
1110   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1111
1112   return GetObject(anObject);
1113 }
1114
1115 //=============================================================================
1116 /*!
1117  *  MultiRotate1DByStep
1118  */
1119 //=============================================================================
1120 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1DByStep (GEOM::GEOM_Object_ptr theObject,
1121                                                                         GEOM::GEOM_Object_ptr theVector,
1122                                                                         CORBA::Double theAngleStep,
1123                                                                         CORBA::Long theNbSteps)
1124 {
1125   //Set a not done flag
1126   GetOperations()->SetNotDone();
1127
1128   GEOM::GEOM_Object_var aGEOMObject;
1129
1130   //Get the object itself
1131   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1132   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1133
1134   //Get the a directon of rotation
1135   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
1136   //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
1137
1138   //Perform the rotation
1139   Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theAngleStep, theNbSteps);
1140   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1141
1142   return GetObject(anObject);
1143 }
1144
1145 //=============================================================================
1146 /*!
1147  *  MultiRotate2DNbTimes
1148  */
1149 //=============================================================================
1150 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2DNbTimes (GEOM::GEOM_Object_ptr theObject,
1151                                                                          GEOM::GEOM_Object_ptr theVector,
1152                                                                          CORBA::Long theNbObjects,
1153                                                                          CORBA::Double theRadialStep,
1154                                                                          CORBA::Long theNbSteps)
1155 {
1156   //Set a not done flag
1157   GetOperations()->SetNotDone();
1158
1159   GEOM::GEOM_Object_var aGEOMObject;
1160
1161   //Get the object itself
1162   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1163   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1164
1165   //Get the a directon of rotation
1166   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
1167   //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
1168
1169   //Perform the rotation
1170   Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
1171     (aBasicObject, aVector, theNbObjects, theRadialStep, theNbSteps);
1172   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1173
1174   return GetObject(anObject);
1175 }
1176
1177 //=============================================================================
1178 /*!
1179  *  MultiRotate2DByStep
1180  */
1181 //=============================================================================
1182 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2DByStep (GEOM::GEOM_Object_ptr theObject,
1183                                                                         GEOM::GEOM_Object_ptr theVector,
1184                                                                         CORBA::Double theAngle,
1185                                                                         CORBA::Long theNbTimes1,
1186                                                                         CORBA::Double theStep,
1187                                                                         CORBA::Long theNbTimes2)
1188 {
1189   //Set a not done flag
1190   GetOperations()->SetNotDone();
1191
1192   GEOM::GEOM_Object_var aGEOMObject;
1193
1194   //Get the object itself
1195   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1196   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1197
1198   //Get the a directon of rotation
1199   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
1200   //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
1201
1202   //Perform the rotation
1203   Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
1204     (aBasicObject, aVector, theAngle, theNbTimes1, theStep, theNbTimes2);
1205   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1206
1207   return GetObject(anObject);
1208 }
1209
1210 //=============================================================================
1211 /*!
1212  *  MultiRotate2D
1213  */
1214 //=============================================================================
1215 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2D (GEOM::GEOM_Object_ptr theObject,
1216                                                                   GEOM::GEOM_Object_ptr theVector,
1217                                                                   CORBA::Double theAngle,
1218                                                                   CORBA::Long theNbTimes1,
1219                                                                   CORBA::Double theStep,
1220                                                                   CORBA::Long theNbTimes2)
1221 {
1222   //Set a not done flag
1223   GetOperations()->SetNotDone();
1224
1225   GEOM::GEOM_Object_var aGEOMObject;
1226
1227   //Get the object itself
1228   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1229   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1230
1231   //Get the a directon of rotation
1232   Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
1233   //if (aVector.IsNull()) return aGEOMObject._retn(); // DZ by default
1234
1235   double anAngle = M_PI * theAngle / 180.;
1236
1237   //Perform the rotation
1238   Handle(GEOM_Object) anObject = GetOperations()->Rotate2D
1239     (aBasicObject, aVector, anAngle, theNbTimes1, theStep, theNbTimes2);
1240   if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
1241
1242   return GetObject(anObject);
1243 }
1244
1245 //=============================================================================
1246 /*!
1247  *  RotateThreePoints
1248  */
1249 //=============================================================================
1250 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RotateThreePoints
1251                                              (GEOM::GEOM_Object_ptr theObject,
1252                                               GEOM::GEOM_Object_ptr theCentPoint,
1253                                               GEOM::GEOM_Object_ptr thePoint1,
1254                                               GEOM::GEOM_Object_ptr thePoint2)
1255 {
1256   //Set a not done flag
1257   GetOperations()->SetNotDone();
1258   GEOM::GEOM_Object_var aGEOMObject;
1259
1260   if (CORBA::is_nil(theObject))
1261     return aGEOMObject._retn();
1262
1263   //check if the object is a sub-shape
1264   if (!theObject->IsMainShape()) {
1265     GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
1266     return aGEOMObject._retn();
1267   }
1268
1269   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
1270
1271   //Get the object itself
1272   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
1273   if (anObject.IsNull()) return aGEOMObject._retn();
1274
1275   //Get the central point of rotation
1276   Handle(GEOM_Object) aCentPoint = GetObjectImpl(theCentPoint);
1277   if (aCentPoint.IsNull()) return aGEOMObject._retn();
1278
1279   //Get the first point
1280   Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
1281   if (aPoint1.IsNull()) return aGEOMObject._retn();
1282
1283   //Get the second point
1284   Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
1285   if (aPoint2.IsNull()) return aGEOMObject._retn();
1286
1287   //Perform the translation
1288   GetOperations()->RotateThreePoints(anObject, aCentPoint, aPoint1, aPoint2);
1289
1290   // Update GUI.
1291   UpdateGUIForObject(theObject);
1292
1293   return aGEOMObject._retn();
1294 }
1295
1296 //=============================================================================
1297 /*!
1298  *  RotateThreePointsCopy
1299  */
1300 //=============================================================================
1301 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RotateThreePointsCopy
1302                                              (GEOM::GEOM_Object_ptr theObject,
1303                                               GEOM::GEOM_Object_ptr theCentPoint,
1304                                               GEOM::GEOM_Object_ptr thePoint1,
1305                                               GEOM::GEOM_Object_ptr thePoint2)
1306 {
1307   GEOM::GEOM_Object_var aGEOMObject;
1308
1309   //Set a not done flag
1310   GetOperations()->SetNotDone();
1311
1312   //Get the object itself
1313   Handle(GEOM_Object) aBasicObject = GetObjectImpl(theObject);
1314   if (aBasicObject.IsNull()) return aGEOMObject._retn();
1315
1316   //Get the central point of rotation
1317   Handle(GEOM_Object) aCentPoint = GetObjectImpl(theCentPoint);
1318   if (aCentPoint.IsNull()) return aGEOMObject._retn();
1319
1320   //Get the first point
1321   Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
1322   if (aPoint1.IsNull()) return aGEOMObject._retn();
1323
1324   //Get the second point
1325   Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
1326   if (aPoint2.IsNull()) return aGEOMObject._retn();
1327
1328   //Perform the rotation
1329   Handle(GEOM_Object) anObject =
1330     GetOperations()->RotateThreePointsCopy(aBasicObject, aCentPoint, aPoint1, aPoint2);
1331   if (!GetOperations()->IsDone() || anObject.IsNull())
1332     return aGEOMObject._retn();
1333
1334   return GetObject(anObject);
1335 }
1336
1337 //=============================================================================
1338 /*!
1339  *  TransformLikeOtherCopy
1340  */
1341 //=============================================================================
1342 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TransformLikeOtherCopy
1343                                              (GEOM::GEOM_Object_ptr theObject,
1344                                               GEOM::GEOM_Object_ptr theSample)
1345 {
1346   GEOM::GEOM_Object_var aGEOMObject;
1347
1348   //Set a not done flag
1349   GetOperations()->SetNotDone();
1350
1351   //Get the object itself
1352   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
1353   if (anObject.IsNull()) return aGEOMObject._retn();
1354
1355   //Get the sample object
1356   Handle(GEOM_Object) aSample = GetObjectImpl(theSample);
1357   if (aSample.IsNull()) return aGEOMObject._retn();
1358
1359   //Perform the transformation
1360   Handle(GEOM_Object) aResObject =
1361     GetOperations()->TransformLikeOtherCopy(anObject, aSample);
1362   if (!GetOperations()->IsDone() || aResObject.IsNull())
1363     return aGEOMObject._retn();
1364
1365   return GetObject(aResObject);
1366 }
1367
1368 //=============================================================================
1369 /*!
1370  *  RecomputeObject
1371  */
1372 //=============================================================================
1373 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RecomputeObject
1374                                              (GEOM::GEOM_Object_ptr theObject)
1375 {
1376   //Set a not done flag
1377   GetOperations()->SetNotDone();
1378   GEOM::GEOM_Object_var aGEOMObject;
1379
1380   if (CORBA::is_nil(theObject)) return aGEOMObject._retn();
1381
1382   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
1383
1384   //Get the object itself
1385   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
1386   if (anObject.IsNull()) return aGEOMObject._retn();
1387
1388   //Perform the recomputation
1389   Handle(GEOM_Function) aLastFunction = anObject->GetLastFunction();
1390   if (aLastFunction.IsNull()) return aGEOMObject._retn();
1391   GetOperations()->GetSolver()->ComputeFunction(aLastFunction);
1392
1393   return aGEOMObject._retn();
1394 }
1395
1396 //=============================================================================
1397 /*!
1398  *  MakeProjectionOnCylinder
1399  */
1400 //=============================================================================
1401 GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MakeProjectionOnCylinder
1402                                    (GEOM::GEOM_Object_ptr theObject,
1403                                     CORBA::Double         theRadius,
1404                                     CORBA::Double         theStartAngle,
1405                                     CORBA::Double         theAngleLength,
1406                                     CORBA::Double         theAngleRotation)
1407 {
1408   GEOM::GEOM_Object_var aGEOMObject;
1409
1410   //Set a not done flag
1411   GetOperations()->SetNotDone();
1412
1413   //Get the object
1414   Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
1415
1416   if (anObject.IsNull()) {
1417     return aGEOMObject._retn();
1418   }
1419
1420   //Perform the transformation
1421   Handle(GEOM_Object) aResObject = GetOperations()->MakeProjectionOnCylinder
1422     (anObject, theRadius, theStartAngle, theAngleLength, theAngleRotation);
1423
1424   if (!GetOperations()->IsDone() || aResObject.IsNull()) {
1425     return aGEOMObject._retn();
1426   }
1427
1428   return GetObject(aResObject);
1429 }