]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx
Salome HOME
Add new command GetShapesOnBox.
[modules/geom.git] / src / GEOMImpl / GEOMImpl_ICurvesOperations.cxx
1 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
3 // 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either 
7 // version 2.1 of the License.
8 // 
9 // This library is distributed in the hope that it will be useful 
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
12 // Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser General Public  
15 // License along with this library; if not, write to the Free Software 
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 //
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 //
20 #include <Standard_Stream.hxx>
21
22 #include <GEOMImpl_ICurvesOperations.hxx>
23
24 #include <GEOM_Function.hxx>
25 #include <GEOM_PythonDump.hxx>
26
27 #include <GEOMImpl_Types.hxx>
28
29 #include <GEOMImpl_PolylineDriver.hxx>
30 #include <GEOMImpl_CircleDriver.hxx>
31 #include <GEOMImpl_SplineDriver.hxx>
32 #include <GEOMImpl_EllipseDriver.hxx>
33 #include <GEOMImpl_ArcDriver.hxx>
34 #include <GEOMImpl_SketcherDriver.hxx>
35
36 #include <GEOMImpl_IPolyline.hxx>
37 #include <GEOMImpl_ICircle.hxx>
38 #include <GEOMImpl_ISpline.hxx>
39 #include <GEOMImpl_IEllipse.hxx>
40 #include <GEOMImpl_IArc.hxx>
41 #include <GEOMImpl_ISketcher.hxx>
42
43 #include "utilities.h"
44
45 #include <TDF_Tool.hxx>
46
47 #include <Standard_Failure.hxx>
48 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
49
50 //=============================================================================
51 /*!
52  *   constructor:
53  */
54 //=============================================================================
55 GEOMImpl_ICurvesOperations::GEOMImpl_ICurvesOperations (GEOM_Engine* theEngine, int theDocID)
56 : GEOM_IOperations(theEngine, theDocID)
57 {
58   MESSAGE("GEOMImpl_ICurvesOperations::GEOMImpl_ICurvesOperations");
59 }
60
61 //=============================================================================
62 /*!
63  *  destructor
64  */
65 //=============================================================================
66 GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations()
67 {
68   MESSAGE("GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations");
69 }
70
71
72 //=============================================================================
73 /*!
74  *  MakePolyline
75  */
76 //=============================================================================
77 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline (list<Handle(GEOM_Object)> thePoints)
78 {
79   SetErrorCode(KO);
80
81   //Add a new Polyline object
82   Handle(GEOM_Object) aPolyline = GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE);
83
84   //Add a new Polyline function for creation a polyline relatively to points set
85   Handle(GEOM_Function) aFunction =
86     aPolyline->AddFunction(GEOMImpl_PolylineDriver::GetID(), POLYLINE_POINTS);
87   if (aFunction.IsNull()) return NULL;
88
89   //Check if the function is set correctly
90   if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) return NULL;
91
92   GEOMImpl_IPolyline aCI (aFunction);
93
94   int aLen = thePoints.size();
95   aCI.SetLength(aLen);
96
97   int ind = 1;
98   list<Handle(GEOM_Object)>::iterator it = thePoints.begin();
99   for (; it != thePoints.end(); it++, ind++) {
100     Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction();
101     if (aRefPnt.IsNull()) {
102       SetErrorCode("NULL point for Polyline");
103       return NULL;
104     }
105     aCI.SetPoint(ind, aRefPnt);
106   }
107
108   //Compute the Polyline value
109   try {
110 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
111     OCC_CATCH_SIGNALS;
112 #endif
113     if (!GetSolver()->ComputeFunction(aFunction)) {
114       SetErrorCode("Polyline driver failed");
115       return NULL;
116     }
117   }
118   catch (Standard_Failure) {
119     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
120     SetErrorCode(aFail->GetMessageString());
121     return NULL;
122   }
123
124   //Make a Python command
125   GEOM::TPythonDump pd (aFunction);
126   pd << aPolyline << " = geompy.MakePolyline([";
127
128   it = thePoints.begin();
129   pd << (*it++);
130   while (it != thePoints.end()) {
131     pd << ", " << (*it++);
132   }
133   pd << "])";
134
135   SetErrorCode(OK);
136   return aPolyline;
137 }
138
139 //=============================================================================
140 /*!
141  *  MakeCircleThreePnt
142  */
143 //=============================================================================
144 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCircleThreePnt (Handle(GEOM_Object) thePnt1,
145                                                                     Handle(GEOM_Object) thePnt2,
146                                                                     Handle(GEOM_Object) thePnt3)
147 {
148   SetErrorCode(KO);
149
150   if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL;
151
152   //Add a new Circle object
153   Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE);
154
155   //Add a new Circle function for creation a circle relatively to three points
156   Handle(GEOM_Function) aFunction =
157     aCircle->AddFunction(GEOMImpl_CircleDriver::GetID(), CIRCLE_THREE_PNT);
158   if (aFunction.IsNull()) return NULL;
159
160   //Check if the function is set correctly
161   if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL;
162
163   GEOMImpl_ICircle aCI (aFunction);
164
165   Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction();
166   Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction();
167   Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction();
168
169   if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL;
170
171   aCI.SetPoint1(aRefPnt1);
172   aCI.SetPoint2(aRefPnt2);
173   aCI.SetPoint3(aRefPnt3);
174
175   //Compute the Circle value
176   try {
177 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
178     OCC_CATCH_SIGNALS;
179 #endif
180     if (!GetSolver()->ComputeFunction(aFunction)) {
181       SetErrorCode("Circle driver failed");
182       return NULL;
183     }
184   }
185   catch (Standard_Failure) {
186     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
187     SetErrorCode(aFail->GetMessageString());
188     return NULL;
189   }
190
191   //Make a Python command
192   GEOM::TPythonDump(aFunction) << aCircle << " = geompy.MakeCircleThreePnt("
193     << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")";
194
195   SetErrorCode(OK);
196   return aCircle;
197 }
198
199 //=============================================================================
200 /*!
201  *  MakeCirclePntVecR
202  */
203 //=============================================================================
204 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCirclePntVecR
205        (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, double theR)
206 {
207   SetErrorCode(KO);
208
209   if (thePnt.IsNull() || theVec.IsNull()) return NULL;
210
211   //Add a new Circle object
212   Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE);
213
214   //Add a new Circle function for creation a circle relatively to point and vector
215   Handle(GEOM_Function) aFunction =
216     aCircle->AddFunction(GEOMImpl_CircleDriver::GetID(), CIRCLE_PNT_VEC_R);
217   if (aFunction.IsNull()) return NULL;
218
219   //Check if the function is set correctly
220   if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL;
221
222   GEOMImpl_ICircle aCI (aFunction);
223
224   Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
225   Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
226
227   if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL;
228
229   aCI.SetCenter(aRefPnt);
230   aCI.SetVector(aRefVec);
231   aCI.SetRadius(theR);
232
233   //Compute the Circle value
234   try {
235 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
236     OCC_CATCH_SIGNALS;
237 #endif
238     if (!GetSolver()->ComputeFunction(aFunction)) {
239       SetErrorCode("Circle driver failed");
240       return NULL;
241     }
242   }
243   catch (Standard_Failure) {
244     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
245     SetErrorCode(aFail->GetMessageString());
246     return NULL;
247   }
248
249   //Make a Python command
250   GEOM::TPythonDump(aFunction) << aCircle << " = geompy.MakeCircle("
251     << thePnt << ", " << theVec << ", " << theR << ")";
252
253   SetErrorCode(OK);
254   return aCircle;
255 }
256
257 //=============================================================================
258 /*!
259  *  MakeEllipse
260  */
261 //=============================================================================
262 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse
263                        (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec,
264                         double theRMajor, double theRMinor)
265 {
266   SetErrorCode(KO);
267
268   if (thePnt.IsNull() || theVec.IsNull()) return NULL;
269
270   //Add a new Ellipse object
271   Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_ELLIPSE);
272
273   //Add a new Ellipse function
274   Handle(GEOM_Function) aFunction =
275     anEll->AddFunction(GEOMImpl_EllipseDriver::GetID(), ELLIPSE_PNT_VEC_RR);
276   if (aFunction.IsNull()) return NULL;
277
278   //Check if the function is set correctly
279   if (aFunction->GetDriverGUID() != GEOMImpl_EllipseDriver::GetID()) return NULL;
280
281   GEOMImpl_IEllipse aCI (aFunction);
282
283   Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
284   Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
285
286   if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL;
287
288   aCI.SetCenter(aRefPnt);
289   aCI.SetVector(aRefVec);
290   aCI.SetRMajor(theRMajor);
291   aCI.SetRMinor(theRMinor);
292
293   //Compute the Ellipse value
294   try {
295 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
296     OCC_CATCH_SIGNALS;
297 #endif
298     if (!GetSolver()->ComputeFunction(aFunction)) {
299       SetErrorCode("Ellipse driver failed");
300       return NULL;
301     }
302   }
303   catch (Standard_Failure) {
304     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
305     SetErrorCode(aFail->GetMessageString());
306     return NULL;
307   }
308
309   //Make a Python command
310   GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeEllipse("
311     << thePnt << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")";
312
313   SetErrorCode(OK);
314   return anEll;
315 }
316
317 //=============================================================================
318 /*!
319  *  MakeArc
320  */
321 //=============================================================================
322 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArc (Handle(GEOM_Object) thePnt1,
323                                                          Handle(GEOM_Object) thePnt2,
324                                                          Handle(GEOM_Object) thePnt3)
325 {
326   SetErrorCode(KO);
327
328   if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL;
329
330   //Add a new Circle Arc object
331   Handle(GEOM_Object) anArc = GetEngine()->AddObject(GetDocID(), GEOM_CIRC_ARC);
332
333   //Add a new Circle Arc function
334   Handle(GEOM_Function) aFunction =
335     anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), CIRC_ARC_THREE_PNT);
336   if (aFunction.IsNull()) return NULL;
337
338   //Check if the function is set correctly
339   if (aFunction->GetDriverGUID() != GEOMImpl_ArcDriver::GetID()) return NULL;
340
341   GEOMImpl_IArc aCI (aFunction);
342
343   Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction();
344   Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction();
345   Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction();
346
347   if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL;
348
349   aCI.SetPoint1(aRefPnt1);
350   aCI.SetPoint2(aRefPnt2);
351   aCI.SetPoint3(aRefPnt3);
352
353   //Compute the Arc value
354   try {
355 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
356     OCC_CATCH_SIGNALS;
357 #endif
358     if (!GetSolver()->ComputeFunction(aFunction)) {
359       SetErrorCode("Arc driver failed");
360       return NULL;
361     }
362   }
363   catch (Standard_Failure) {
364     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
365     SetErrorCode(aFail->GetMessageString());
366     return NULL;
367   }
368
369   //Make a Python command
370   GEOM::TPythonDump(aFunction) << anArc << " = geompy.MakeArc("
371     << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")";
372
373   SetErrorCode(OK);
374   return anArc;
375 }
376
377 //=============================================================================
378 /*!
379  *  MakeSplineBezier
380  */
381 //=============================================================================
382 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier
383                                           (list<Handle(GEOM_Object)> thePoints)
384 {
385   SetErrorCode(KO);
386
387   //Add a new Spline object
388   Handle(GEOM_Object) aSpline = GetEngine()->AddObject(GetDocID(), GEOM_SPLINE);
389
390   //Add a new Spline function for creation a bezier curve relatively to points set
391   Handle(GEOM_Function) aFunction =
392     aSpline->AddFunction(GEOMImpl_SplineDriver::GetID(), SPLINE_BEZIER);
393   if (aFunction.IsNull()) return NULL;
394
395   //Check if the function is set correctly
396   if (aFunction->GetDriverGUID() != GEOMImpl_SplineDriver::GetID()) return NULL;
397
398   GEOMImpl_ISpline aCI (aFunction);
399
400   int aLen = thePoints.size();
401   aCI.SetLength(aLen);
402
403   int ind = 1;
404   list<Handle(GEOM_Object)>::iterator it = thePoints.begin();
405   for (; it != thePoints.end(); it++, ind++) {
406     Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction();
407
408     if (aRefPnt.IsNull()) return NULL;
409
410     aCI.SetPoint(ind, aRefPnt);
411   }
412
413   //Compute the Spline value
414   try {
415 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
416     OCC_CATCH_SIGNALS;
417 #endif
418     if (!GetSolver()->ComputeFunction(aFunction)) {
419       SetErrorCode("Spline driver failed");
420       return NULL;
421     }
422   }
423   catch (Standard_Failure) {
424     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
425     SetErrorCode(aFail->GetMessageString());
426     return NULL;
427   }
428
429   //Make a Python command
430   GEOM::TPythonDump pd (aFunction);
431   pd << aSpline << " = geompy.MakeBezier([";
432
433   it = thePoints.begin();
434   pd << (*it++);
435   while (it != thePoints.end()) {
436     pd << ", " << (*it++);
437   }
438   pd << "])";
439
440   SetErrorCode(OK);
441   return aSpline;
442 }
443
444 //=============================================================================
445 /*!
446  *  MakeSplineInterpolation
447  */
448 //=============================================================================
449 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineInterpolation
450                                           (list<Handle(GEOM_Object)> thePoints)
451 {
452   SetErrorCode(KO);
453
454   //Add a new Spline object
455   Handle(GEOM_Object) aSpline = GetEngine()->AddObject(GetDocID(), GEOM_SPLINE);
456
457   //Add a new Spline function for creation a bezier curve relatively to points set
458   Handle(GEOM_Function) aFunction =
459     aSpline->AddFunction(GEOMImpl_SplineDriver::GetID(), SPLINE_INTERPOLATION);
460   if (aFunction.IsNull()) return NULL;
461
462   //Check if the function is set correctly
463   if (aFunction->GetDriverGUID() != GEOMImpl_SplineDriver::GetID()) return NULL;
464
465   GEOMImpl_ISpline aCI (aFunction);
466
467   int aLen = thePoints.size();
468   aCI.SetLength(aLen);
469
470   int ind = 1;
471   list<Handle(GEOM_Object)>::iterator it = thePoints.begin();
472   for (; it != thePoints.end(); it++, ind++) {
473     Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction();
474
475     if (aRefPnt.IsNull()) return NULL;
476
477     aCI.SetPoint(ind, aRefPnt);
478   }
479
480   //Compute the Spline value
481   try {
482 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
483     OCC_CATCH_SIGNALS;
484 #endif
485     if (!GetSolver()->ComputeFunction(aFunction)) {
486       SetErrorCode("Spline driver failed");
487       return NULL;
488     }
489   }
490   catch (Standard_Failure) {
491     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
492     SetErrorCode(aFail->GetMessageString());
493     return NULL;
494   }
495
496   //Make a Python command
497   GEOM::TPythonDump pd (aFunction);
498   pd << aSpline << " = geompy.MakeInterpol([";
499
500   it = thePoints.begin();
501   pd << (*it++);
502   while (it != thePoints.end()) {
503     pd << ", " << (*it++);
504   }
505   pd << "])";
506
507   SetErrorCode(OK);
508   return aSpline;
509 }
510
511 //=============================================================================
512 /*!
513  *  MakeSketcher
514  */
515 //=============================================================================
516 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher
517                                (const TCollection_AsciiString& theCommand,
518                                 list<double>                   theWorkingPlane)
519 {
520   SetErrorCode(KO);
521
522   if (theCommand.IsEmpty()) return NULL;
523
524   //Add a new Sketcher object
525   Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER);
526
527   //Add a new Sketcher function
528   Handle(GEOM_Function) aFunction =
529     aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_NINE_DOUBLS);
530   if (aFunction.IsNull()) return NULL;
531
532   //Check if the function is set correctly
533   if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL;
534
535   GEOMImpl_ISketcher aCI (aFunction);
536
537   aCI.SetCommand(theCommand);
538
539   int ind = 1;
540   list<double>::iterator it = theWorkingPlane.begin();
541   for (; it != theWorkingPlane.end(); it++, ind++)
542     aCI.SetWorkingPlane(ind, *it);
543
544   //Compute the Sketcher value
545   try {
546 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
547     OCC_CATCH_SIGNALS;
548 #endif
549     if (!GetSolver()->ComputeFunction(aFunction)) {
550       SetErrorCode("Sketcher driver failed");
551       return NULL;
552     }
553   }
554   catch (Standard_Failure) {
555     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
556     SetErrorCode(aFail->GetMessageString());
557     return NULL;
558   }
559
560   //Make a Python command
561   GEOM::TPythonDump pd (aFunction);
562   pd << aSketcher << " = geompy.MakeSketcher(\"" << theCommand.ToCString() << "\", [";
563
564   it = theWorkingPlane.begin();
565   pd << (*it++);
566   while (it != theWorkingPlane.end()) {
567     pd << ", " << (*it++);
568   }
569   pd << "])";
570
571   SetErrorCode(OK);
572   return aSketcher;
573 }
574
575 //=============================================================================
576 /*!
577  *  MakeSketcherOnPlane
578  */
579 //=============================================================================
580 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane
581                                (const TCollection_AsciiString& theCommand,
582                                 Handle(GEOM_Object)            theWorkingPlane)
583 {
584   SetErrorCode(KO);
585
586   if (theCommand.IsEmpty()) return NULL;
587
588   //Add a new Sketcher object
589   Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER);
590
591   //Add a new Sketcher function
592   Handle(GEOM_Function) aFunction =
593     aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_PLANE);
594   if (aFunction.IsNull()) return NULL;
595
596   //Check if the function is set correctly
597   if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL;
598
599   GEOMImpl_ISketcher aCI (aFunction);
600   aCI.SetCommand(theCommand);
601
602   Handle(GEOM_Function) aRefPlane = theWorkingPlane->GetLastFunction();
603   if (aRefPlane.IsNull()) return NULL;
604   aCI.SetWorkingPlane( aRefPlane );
605
606   //Compute the Sketcher value
607   try {
608 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
609     OCC_CATCH_SIGNALS;
610 #endif
611     if (!GetSolver()->ComputeFunction(aFunction)) {
612       SetErrorCode("Sketcher driver failed");
613       return NULL;
614     }
615   }
616   catch (Standard_Failure) {
617     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
618     SetErrorCode(aFail->GetMessageString());
619     return NULL;
620   }
621
622   //Make a Python command
623   GEOM::TPythonDump (aFunction) << aSketcher << " = geompy.MakeSketcherOnPlane(\""
624     << theCommand.ToCString() << "\", " << theWorkingPlane << " )";
625
626   SetErrorCode(OK);
627   return aSketcher;
628 }