1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include <Standard_Stream.hxx>
22 #include <GEOMImpl_ICurvesOperations.hxx>
24 #include <GEOM_Function.hxx>
25 #include <GEOM_PythonDump.hxx>
27 #include <GEOMImpl_Types.hxx>
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>
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>
43 #include "utilities.h"
45 #include <TDF_Tool.hxx>
47 #include <Standard_Failure.hxx>
48 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
50 //=============================================================================
54 //=============================================================================
55 GEOMImpl_ICurvesOperations::GEOMImpl_ICurvesOperations (GEOM_Engine* theEngine, int theDocID)
56 : GEOM_IOperations(theEngine, theDocID)
58 MESSAGE("GEOMImpl_ICurvesOperations::GEOMImpl_ICurvesOperations");
61 //=============================================================================
65 //=============================================================================
66 GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations()
68 MESSAGE("GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations");
72 //=============================================================================
76 //=============================================================================
77 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline (list<Handle(GEOM_Object)> thePoints)
81 //Add a new Polyline object
82 Handle(GEOM_Object) aPolyline = GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE);
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;
89 //Check if the function is set correctly
90 if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) return NULL;
92 GEOMImpl_IPolyline aCI (aFunction);
94 int aLen = thePoints.size();
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");
105 aCI.SetPoint(ind, aRefPnt);
108 //Compute the Polyline value
110 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
113 if (!GetSolver()->ComputeFunction(aFunction)) {
114 SetErrorCode("Polyline driver failed");
118 catch (Standard_Failure) {
119 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
120 SetErrorCode(aFail->GetMessageString());
124 //Make a Python command
125 GEOM::TPythonDump pd (aFunction);
126 pd << aPolyline << " = geompy.MakePolyline([";
128 it = thePoints.begin();
130 while (it != thePoints.end()) {
131 pd << ", " << (*it++);
139 //=============================================================================
143 //=============================================================================
144 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCircleThreePnt (Handle(GEOM_Object) thePnt1,
145 Handle(GEOM_Object) thePnt2,
146 Handle(GEOM_Object) thePnt3)
150 if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL;
152 //Add a new Circle object
153 Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE);
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;
160 //Check if the function is set correctly
161 if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL;
163 GEOMImpl_ICircle aCI (aFunction);
165 Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction();
166 Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction();
167 Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction();
169 if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL;
171 aCI.SetPoint1(aRefPnt1);
172 aCI.SetPoint2(aRefPnt2);
173 aCI.SetPoint3(aRefPnt3);
175 //Compute the Circle value
177 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
180 if (!GetSolver()->ComputeFunction(aFunction)) {
181 SetErrorCode("Circle driver failed");
185 catch (Standard_Failure) {
186 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
187 SetErrorCode(aFail->GetMessageString());
191 //Make a Python command
192 GEOM::TPythonDump(aFunction) << aCircle << " = geompy.MakeCircleThreePnt("
193 << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")";
199 //=============================================================================
201 * MakeCircleCenter2Pnt
203 //=============================================================================
204 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCircleCenter2Pnt (Handle(GEOM_Object) thePnt1,
205 Handle(GEOM_Object) thePnt2,
206 Handle(GEOM_Object) thePnt3)
210 if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL;
212 //Add a new Circle object
213 Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE);
215 //Add a new Circle function for creation a circle relatively to center and 2 points
216 Handle(GEOM_Function) aFunction =
217 aCircle->AddFunction(GEOMImpl_CircleDriver::GetID(), CIRCLE_CENTER_TWO_PNT);
218 if (aFunction.IsNull()) return NULL;
220 //Check if the function is set correctly
221 if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL;
223 GEOMImpl_ICircle aCI (aFunction);
225 Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction();
226 Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction();
227 Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction();
229 if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL;
231 aCI.SetPoint1(aRefPnt1);
232 aCI.SetPoint2(aRefPnt2);
233 aCI.SetPoint3(aRefPnt3);
235 //Compute the Circle value
237 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
240 if (!GetSolver()->ComputeFunction(aFunction)) {
241 SetErrorCode("Circle driver failed");
245 catch (Standard_Failure) {
246 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
247 SetErrorCode(aFail->GetMessageString());
251 //Make a Python command
252 GEOM::TPythonDump(aFunction) << aCircle << " = geompy.MakeCircleCenter2Pnt("
253 << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")";
259 //=============================================================================
263 //=============================================================================
264 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCirclePntVecR
265 (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, double theR)
269 // Not set thePnt means origin of global CS,
270 // Not set theVec means Z axis of global CS
271 //if (thePnt.IsNull() || theVec.IsNull()) return NULL;
273 //Add a new Circle object
274 Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE);
276 //Add a new Circle function for creation a circle relatively to point and vector
277 Handle(GEOM_Function) aFunction =
278 aCircle->AddFunction(GEOMImpl_CircleDriver::GetID(), CIRCLE_PNT_VEC_R);
279 if (aFunction.IsNull()) return NULL;
281 //Check if the function is set correctly
282 if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL;
284 GEOMImpl_ICircle aCI (aFunction);
286 if (!thePnt.IsNull()) {
287 Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
288 if (aRefPnt.IsNull()) return NULL;
289 aCI.SetCenter(aRefPnt);
292 if (!theVec.IsNull()) {
293 Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
294 if (aRefVec.IsNull()) return NULL;
295 aCI.SetVector(aRefVec);
300 //Compute the Circle value
302 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
305 if (!GetSolver()->ComputeFunction(aFunction)) {
306 SetErrorCode("Circle driver failed");
310 catch (Standard_Failure) {
311 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
312 SetErrorCode(aFail->GetMessageString());
316 //Make a Python command
317 GEOM::TPythonDump(aFunction) << aCircle << " = geompy.MakeCircle("
318 << thePnt << ", " << theVec << ", " << theR << ")";
324 //=============================================================================
328 //=============================================================================
329 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse
330 (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec,
331 double theRMajor, double theRMinor)
335 // Not set thePnt means origin of global CS,
336 // Not set theVec means Z axis of global CS
337 //if (thePnt.IsNull() || theVec.IsNull()) return NULL;
339 //Add a new Ellipse object
340 Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_ELLIPSE);
342 //Add a new Ellipse function
343 Handle(GEOM_Function) aFunction =
344 anEll->AddFunction(GEOMImpl_EllipseDriver::GetID(), ELLIPSE_PNT_VEC_RR);
345 if (aFunction.IsNull()) return NULL;
347 //Check if the function is set correctly
348 if (aFunction->GetDriverGUID() != GEOMImpl_EllipseDriver::GetID()) return NULL;
350 GEOMImpl_IEllipse aCI (aFunction);
352 if (!thePnt.IsNull()) {
353 Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction();
354 if (aRefPnt.IsNull()) return NULL;
355 aCI.SetCenter(aRefPnt);
358 if (!theVec.IsNull()) {
359 Handle(GEOM_Function) aRefVec = theVec->GetLastFunction();
360 if (aRefVec.IsNull()) return NULL;
361 aCI.SetVector(aRefVec);
364 aCI.SetRMajor(theRMajor);
365 aCI.SetRMinor(theRMinor);
367 //Compute the Ellipse value
369 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
372 if (!GetSolver()->ComputeFunction(aFunction)) {
373 SetErrorCode("Ellipse driver failed");
377 catch (Standard_Failure) {
378 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
379 SetErrorCode(aFail->GetMessageString());
383 //Make a Python command
384 GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeEllipse("
385 << thePnt << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")";
391 //=============================================================================
395 //=============================================================================
396 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArc (Handle(GEOM_Object) thePnt1,
397 Handle(GEOM_Object) thePnt2,
398 Handle(GEOM_Object) thePnt3)
402 if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL;
404 //Add a new Circle Arc object
405 Handle(GEOM_Object) anArc = GetEngine()->AddObject(GetDocID(), GEOM_CIRC_ARC);
407 //Add a new Circle Arc function
408 Handle(GEOM_Function) aFunction =
409 anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), CIRC_ARC_THREE_PNT);
411 if (aFunction.IsNull()) return NULL;
413 //Check if the function is set correctly
414 if (aFunction->GetDriverGUID() != GEOMImpl_ArcDriver::GetID()) return NULL;
415 GEOMImpl_IArc aCI (aFunction);
417 Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction();
418 Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction();
419 Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction();
422 if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL;
424 aCI.SetPoint1(aRefPnt1);
425 aCI.SetPoint2(aRefPnt2);
426 aCI.SetPoint3(aRefPnt3);
428 //Compute the Arc value
430 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
433 if (!GetSolver()->ComputeFunction(aFunction)) {
434 SetErrorCode("Arc driver failed");
438 catch (Standard_Failure) {
439 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
440 SetErrorCode(aFail->GetMessageString());
444 //Make a Python command
445 GEOM::TPythonDump(aFunction) << anArc << " = geompy.MakeArc("
446 << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")";
452 //=============================================================================
456 //=============================================================================
457 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArcCenter (Handle(GEOM_Object) thePnt1,
458 Handle(GEOM_Object) thePnt2,
459 Handle(GEOM_Object) thePnt3,
463 if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL;
465 //Add a new Circle Arc object
466 Handle(GEOM_Object) anArc = GetEngine()->AddObject(GetDocID(), GEOM_CIRC_ARC);
468 //Add a new Circle Arc function
469 Handle(GEOM_Function) aFunction =
470 anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), CIRC_ARC_CENTER);
471 if (aFunction.IsNull()) return NULL;
473 //Check if the function is set correctly
474 if (aFunction->GetDriverGUID() != GEOMImpl_ArcDriver::GetID()) return NULL;
476 GEOMImpl_IArc aCI (aFunction);
478 Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction();
479 Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction();
480 Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction();
482 if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL;
484 aCI.SetPoint1(aRefPnt1);
485 aCI.SetPoint2(aRefPnt2);
486 aCI.SetPoint3(aRefPnt3);
487 aCI.SetSense(theSense);
489 //Compute the Arc value
491 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
494 if (!GetSolver()->ComputeFunction(aFunction)) {
495 SetErrorCode("Arc driver failed");
499 catch (Standard_Failure) {
500 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
501 SetErrorCode(aFail->GetMessageString());
504 //Make a Python command
505 GEOM::TPythonDump(aFunction) << anArc << " = geompy.MakeArcCenter("
506 << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << "," << theSense << ")";
512 //=============================================================================
516 //=============================================================================
517 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier
518 (list<Handle(GEOM_Object)> thePoints)
522 //Add a new Spline object
523 Handle(GEOM_Object) aSpline = GetEngine()->AddObject(GetDocID(), GEOM_SPLINE);
525 //Add a new Spline function for creation a bezier curve relatively to points set
526 Handle(GEOM_Function) aFunction =
527 aSpline->AddFunction(GEOMImpl_SplineDriver::GetID(), SPLINE_BEZIER);
528 if (aFunction.IsNull()) return NULL;
530 //Check if the function is set correctly
531 if (aFunction->GetDriverGUID() != GEOMImpl_SplineDriver::GetID()) return NULL;
533 GEOMImpl_ISpline aCI (aFunction);
535 int aLen = thePoints.size();
539 list<Handle(GEOM_Object)>::iterator it = thePoints.begin();
540 for (; it != thePoints.end(); it++, ind++) {
541 Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction();
543 if (aRefPnt.IsNull()) return NULL;
545 aCI.SetPoint(ind, aRefPnt);
548 //Compute the Spline value
550 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
553 if (!GetSolver()->ComputeFunction(aFunction)) {
554 SetErrorCode("Spline driver failed");
558 catch (Standard_Failure) {
559 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
560 SetErrorCode(aFail->GetMessageString());
564 //Make a Python command
565 GEOM::TPythonDump pd (aFunction);
566 pd << aSpline << " = geompy.MakeBezier([";
568 it = thePoints.begin();
570 while (it != thePoints.end()) {
571 pd << ", " << (*it++);
579 //=============================================================================
581 * MakeSplineInterpolation
583 //=============================================================================
584 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineInterpolation
585 (list<Handle(GEOM_Object)> thePoints)
589 //Add a new Spline object
590 Handle(GEOM_Object) aSpline = GetEngine()->AddObject(GetDocID(), GEOM_SPLINE);
592 //Add a new Spline function for creation a bezier curve relatively to points set
593 Handle(GEOM_Function) aFunction =
594 aSpline->AddFunction(GEOMImpl_SplineDriver::GetID(), SPLINE_INTERPOLATION);
595 if (aFunction.IsNull()) return NULL;
597 //Check if the function is set correctly
598 if (aFunction->GetDriverGUID() != GEOMImpl_SplineDriver::GetID()) return NULL;
600 GEOMImpl_ISpline aCI (aFunction);
602 int aLen = thePoints.size();
606 list<Handle(GEOM_Object)>::iterator it = thePoints.begin();
607 for (; it != thePoints.end(); it++, ind++) {
608 Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction();
610 if (aRefPnt.IsNull()) return NULL;
612 aCI.SetPoint(ind, aRefPnt);
615 //Compute the Spline value
617 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
620 if (!GetSolver()->ComputeFunction(aFunction)) {
621 SetErrorCode("Spline driver failed");
625 catch (Standard_Failure) {
626 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
627 SetErrorCode(aFail->GetMessageString());
631 //Make a Python command
632 GEOM::TPythonDump pd (aFunction);
633 pd << aSpline << " = geompy.MakeInterpol([";
635 it = thePoints.begin();
637 while (it != thePoints.end()) {
638 pd << ", " << (*it++);
646 //=============================================================================
650 //=============================================================================
651 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher (const char* theCommand,
652 list<double> theWorkingPlane)
656 if (!theCommand || strcmp(theCommand, "") == 0) return NULL;
658 //Add a new Sketcher object
659 Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER);
661 //Add a new Sketcher function
662 Handle(GEOM_Function) aFunction =
663 aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_NINE_DOUBLS);
664 if (aFunction.IsNull()) return NULL;
666 //Check if the function is set correctly
667 if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL;
669 GEOMImpl_ISketcher aCI (aFunction);
671 TCollection_AsciiString aCommand((char*) theCommand);
672 aCI.SetCommand(aCommand);
675 list<double>::iterator it = theWorkingPlane.begin();
676 for (; it != theWorkingPlane.end(); it++, ind++)
677 aCI.SetWorkingPlane(ind, *it);
679 //Compute the Sketcher value
681 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
684 if (!GetSolver()->ComputeFunction(aFunction)) {
685 SetErrorCode("Sketcher driver failed");
689 catch (Standard_Failure) {
690 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
691 SetErrorCode(aFail->GetMessageString());
695 //Make a Python command
696 GEOM::TPythonDump pd (aFunction);
697 pd << aSketcher << " = geompy.MakeSketcher(\"" << aCommand.ToCString() << "\", [";
699 it = theWorkingPlane.begin();
701 while (it != theWorkingPlane.end()) {
702 pd << ", " << (*it++);
710 //=============================================================================
712 * MakeSketcherOnPlane
714 //=============================================================================
715 Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane
716 (const char* theCommand,
717 Handle(GEOM_Object) theWorkingPlane)
721 if (!theCommand || strcmp(theCommand, "") == 0) return NULL;
723 //Add a new Sketcher object
724 Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER);
726 //Add a new Sketcher function
727 Handle(GEOM_Function) aFunction =
728 aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_PLANE);
729 if (aFunction.IsNull()) return NULL;
731 //Check if the function is set correctly
732 if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL;
734 GEOMImpl_ISketcher aCI (aFunction);
736 TCollection_AsciiString aCommand((char*) theCommand);
737 aCI.SetCommand(aCommand);
739 Handle(GEOM_Function) aRefPlane = theWorkingPlane->GetLastFunction();
740 if (aRefPlane.IsNull()) return NULL;
741 aCI.SetWorkingPlane( aRefPlane );
743 //Compute the Sketcher value
745 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
748 if (!GetSolver()->ComputeFunction(aFunction)) {
749 SetErrorCode("Sketcher driver failed");
753 catch (Standard_Failure) {
754 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
755 SetErrorCode(aFail->GetMessageString());
759 //Make a Python command
760 GEOM::TPythonDump (aFunction) << aSketcher << " = geompy.MakeSketcherOnPlane(\""
761 << aCommand.ToCString() << "\", " << theWorkingPlane << " )";