1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #pragma warning( disable:4786 )
26 #include <Standard_Stream.hxx>
28 #include <GEOMImpl_IHealingOperations.hxx>
30 #include <GEOM_PythonDump.hxx>
32 #include <GEOMImpl_HealingDriver.hxx>
33 #include <GEOMImpl_Types.hxx>
34 #include <GEOMImpl_IHealing.hxx>
35 #include <GEOMImpl_CopyDriver.hxx>
37 #include <ShHealOper_ShapeProcess.hxx>
39 #include "utilities.h"
41 #include <Utils_ExceptHandlers.hxx>
43 #include <ShapeAnalysis_FreeBounds.hxx>
45 #include <TopoDS_Compound.hxx>
46 #include <TopExp_Explorer.hxx>
48 #include <TColStd_HArray1OfExtendedString.hxx>
49 #include <TColStd_HSequenceOfTransient.hxx>
50 #include <TCollection_AsciiString.hxx>
52 #include <TDF_Tool.hxx>
54 #include <Standard_Failure.hxx>
55 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
58 //=============================================================================
62 //=============================================================================
64 GEOMImpl_IHealingOperations::GEOMImpl_IHealingOperations (GEOM_Engine* theEngine, int theDocID)
65 : GEOM_IOperations(theEngine, theDocID)
67 MESSAGE("GEOMImpl_IHealingOperations::GEOMImpl_IHealingOperations");
70 //=============================================================================
74 //=============================================================================
76 GEOMImpl_IHealingOperations::~GEOMImpl_IHealingOperations()
78 MESSAGE("GEOMImpl_IHealingOperations::~GEOMImpl_IHealingOperations");
82 //=============================================================================
86 //=============================================================================
87 Handle(GEOM_Object) GEOMImpl_IHealingOperations::ShapeProcess (Handle(GEOM_Object) theObject,
88 const Handle(TColStd_HArray1OfExtendedString)& theOperators,
89 const Handle(TColStd_HArray1OfExtendedString)& theParams,
90 const Handle(TColStd_HArray1OfExtendedString)& theValues)
92 // set error code, check parameters
95 if (theObject.IsNull())
98 if (theOperators.IsNull() || theOperators->Length() <= 0) {
99 SetErrorCode("No operators requested");
103 Standard_Integer nbParams = 0, nbValues = 0;
104 if (!theParams.IsNull()) {
105 nbParams = theParams->Length();
107 if (!theValues.IsNull()) {
108 nbValues = theValues->Length();
111 if (nbParams != nbValues) {
112 SetErrorCode("Number of parameter values must be equal to the number of parameters");
116 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
117 if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
120 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
123 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), SHAPE_PROCESS);
125 if (aFunction.IsNull()) return NULL;
127 //Check if the function is set correctly
128 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
130 // prepare "data container" class IHealing
131 GEOMImpl_IHealing HI(aFunction);
132 HI.SetOriginal(aLastFunction);
133 HI.SetOperators( theOperators );
135 HI.SetParameters( theParams );
136 HI.SetValues( theValues );
139 //Compute the translation
141 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
144 if (!GetSolver()->ComputeFunction(aFunction))
146 SetErrorCode("Shape Healing algorithm failed");
150 catch (Standard_Failure)
152 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
153 SetErrorCode(aFail->GetMessageString());
157 //Make a Python command
158 GEOM::TPythonDump pd (aFunction);
159 pd << aNewObject << " = geompy.ProcessShape(" << theObject << ", [";
162 int i = theOperators->Lower(), nb = theOperators->Upper();
163 for ( ; i <= nb; i++) {
164 pd << "\"" << TCollection_AsciiString(theOperators->Value( i )).ToCString()
165 << (( i < nb ) ? "\", " : "\"");
168 // list of parameters
169 i = theParams->Lower(); nb = theParams->Upper();
170 for ( ; i <= nb; i++) {
171 pd << "\"" << TCollection_AsciiString(theParams->Value( i )).ToCString()
172 << (( i < nb ) ? "\", " : "\"");
176 i = theValues->Lower(); nb = theValues->Upper();
177 for ( ; i <= nb; i++) {
178 pd << "\"" << TCollection_AsciiString(theValues->Value( i )).ToCString()
179 << (( i < nb ) ? "\", " : "\"");
187 //=============================================================================
191 //=============================================================================
192 void GEOMImpl_IHealingOperations::GetShapeProcessParameters (std::list<std::string>& theOperations,
193 std::list<std::string>& theParams,
194 std::list<std::string>& theValues)
196 ShHealOper_ShapeProcess aHealer;
197 TColStd_SequenceOfAsciiString anOperators;
198 int nbOperatorErrors( 0 );
199 if ( aHealer.GetOperators( anOperators ) )
201 for ( Standard_Integer i = 1; i <= anOperators.Length(); i++ )
203 std::string anOperation = anOperators.Value( i ).ToCString();
204 if ( GetOperatorParameters( anOperation, theParams, theValues ) )
205 theOperations.push_back( anOperation );
212 SetErrorCode("ERROR retrieving operators (GEOMImpl_IHealingOperations)");
215 if ( nbOperatorErrors ) {
216 TCollection_AsciiString aMsg ("ERRORS retrieving ShapeProcess parameters (GEOMImpl_IHealingOperations): nbOperatorErrors = ");
217 aMsg += TCollection_AsciiString( nbOperatorErrors );
218 MESSAGE(aMsg.ToCString());
222 //=============================================================================
224 * GetOperatorParameters
226 //=============================================================================
227 bool GEOMImpl_IHealingOperations::GetOperatorParameters( const std::string theOperation,
228 std::list<std::string>& theParams,
229 std::list<std::string>& theValues )
231 ShHealOper_ShapeProcess aHealer;
232 int nbParamValueErrors( 0 );
233 std::list<std::string> aParams;
234 if ( GetParameters( theOperation, aParams ) ) {
235 for ( std::list<std::string>::iterator it = aParams.begin(); it != aParams.end(); ++it ) {
236 TCollection_AsciiString aParam( (Standard_CString)(*it).c_str() );
237 TCollection_AsciiString aValue;
238 if ( aHealer.GetParameter( aParam, aValue ) ) {
239 theParams.push_back( aParam.ToCString() );
240 theValues.push_back( aValue.ToCString() );
243 nbParamValueErrors++;
249 if ( nbParamValueErrors ) {
250 TCollection_AsciiString aMsg ("ERRORS retrieving ShapeProcess parameter values (GEOMImpl_IHealingOperations): nbParamValueErrors = ");
251 aMsg += TCollection_AsciiString( nbParamValueErrors );
252 MESSAGE(aMsg.ToCString());
258 //=============================================================================
262 //=============================================================================
263 bool GEOMImpl_IHealingOperations::GetParameters (const std::string theOperation,
264 std::list<std::string>& theParams)
266 if ( theOperation == "SplitAngle" ) {
267 theParams.push_back( "SplitAngle.Angle" );
268 theParams.push_back( "SplitAngle.MaxTolerance" );
270 } else if ( theOperation == "SplitClosedFaces" ) {
271 theParams.push_back( "SplitClosedFaces.NbSplitPoints" );
273 } else if ( theOperation == "FixFaceSize" ) {
274 theParams.push_back( "FixFaceSize.Tolerance" );
276 } else if( theOperation == "DropSmallEdges" ) {
277 theParams.push_back( "DropSmallEdges.Tolerance3d" );
279 } else if( theOperation == "BSplineRestriction" ) {
280 theParams.push_back( "BSplineRestriction.SurfaceMode" );
281 theParams.push_back( "BSplineRestriction.Curve3dMode" );
282 theParams.push_back( "BSplineRestriction.Curve2dMode" );
283 theParams.push_back( "BSplineRestriction.Tolerance3d" );
284 theParams.push_back( "BSplineRestriction.Tolerance2d" );
285 theParams.push_back( "BSplineRestriction.RequiredDegree" );
286 theParams.push_back( "BSplineRestriction.RequiredNbSegments" );
287 theParams.push_back( "BSplineRestriction.Continuity3d" );
288 theParams.push_back( "BSplineRestriction.Continuity2d" );
290 } else if( theOperation == "SplitContinuity" ) {
291 theParams.push_back( "SplitContinuity.Tolerance3d" );
292 theParams.push_back( "SplitContinuity.SurfaceContinuity" );
293 theParams.push_back( "SplitContinuity.CurveContinuity" );
295 } else if( theOperation == "ToBezier" ) {
296 theParams.push_back( "ToBezier.SurfaceMode" );
297 theParams.push_back( "ToBezier.Curve3dMode" );
298 theParams.push_back( "ToBezier.Curve2dMode" );
299 theParams.push_back( "ToBezier.MaxTolerance" );
301 } else if( theOperation == "SameParameter" ) {
302 theParams.push_back( "SameParameter.Tolerance3d" );
304 } else if( theOperation == "FixShape" ) {
305 theParams.push_back( "FixShape.Tolerance3d" );
306 theParams.push_back( "FixShape.MaxTolerance3d" );
315 //=============================================================================
319 //=============================================================================
320 Handle(GEOM_Object) GEOMImpl_IHealingOperations::SuppressFaces
321 (Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theFaces)
323 // set error code, check parameters
326 if ( theObject.IsNull() ) // if theFaces.IsNull() - it's OK, it means that ALL faces must be removed..
329 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
330 if(aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
333 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
336 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), SUPPRESS_FACES);
338 if(aFunction.IsNull()) return NULL;
340 //Check if the function is set correctly
341 if(aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
343 // prepare "data container" class IHealing
344 GEOMImpl_IHealing HI(aFunction);
345 HI.SetFaces( theFaces );
346 HI.SetOriginal( aLastFunction );
348 //Compute the translation
350 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
353 if (!GetSolver()->ComputeFunction(aFunction))
355 SetErrorCode("Healing driver failed");
359 catch (Standard_Failure)
361 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
362 SetErrorCode(aFail->GetMessageString());
366 //Make a Python command
367 GEOM::TPythonDump pd (aFunction);
368 pd << aNewObject << " = geompy.SuppressFaces(" << theObject << ", [";
371 int i = theFaces->Lower(), nb = theFaces->Upper();
372 for ( ; i <= nb; i++)
373 pd << theFaces->Value( i ) << (( i < nb ) ? ", " : "])");
380 //=============================================================================
384 //=============================================================================
385 Handle(GEOM_Object) GEOMImpl_IHealingOperations::CloseContour
386 (Handle(GEOM_Object) theObject,
387 const Handle(TColStd_HArray1OfInteger)& theWires,
390 // set error code, check parameters
393 if (theObject.IsNull())
395 SetErrorCode("NULL object given");
399 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
400 if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
403 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
406 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), CLOSE_CONTOUR);
408 if (aFunction.IsNull()) return NULL;
410 //Check if the function is set correctly
411 if(aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
413 // prepare "data container" class IHealing
414 GEOMImpl_IHealing HI(aFunction);
415 HI.SetWires( theWires );
416 HI.SetIsCommonVertex( isCommonVertex );
417 HI.SetOriginal( aLastFunction );
419 //Compute the translation
421 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
424 if (!GetSolver()->ComputeFunction(aFunction))
426 SetErrorCode("Healing driver failed");
430 catch (Standard_Failure)
432 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
433 SetErrorCode(aFail->GetMessageString());
437 //Make a Python command
438 GEOM::TPythonDump pd (aFunction);
439 pd << aNewObject << " = geompy.CloseContour(" << theObject << ", [";
442 if (!theWires.IsNull())
444 int i = theWires->Lower(), nb = theWires->Upper();
445 pd << theWires->Value(i++);
447 pd << ", " << theWires->Value(i++);
449 pd << "], " << (int)isCommonVertex << ")";
455 //=============================================================================
459 //=============================================================================
460 Handle(GEOM_Object) GEOMImpl_IHealingOperations::RemoveIntWires
461 (Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theWires)
463 // set error code, check parameters
466 if (theObject.IsNull()) // if theWires is NULL it's OK, it means that ALL wires must be removed
469 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
470 if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
473 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
476 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), REMOVE_INT_WIRES);
478 if (aFunction.IsNull()) return NULL;
480 //Check if the function is set correctly
481 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
483 // prepare "data container" class IHealing
484 GEOMImpl_IHealing HI(aFunction);
485 HI.SetWires( theWires );
486 HI.SetOriginal( aLastFunction );
488 //Compute the translation
490 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
493 if (!GetSolver()->ComputeFunction(aFunction))
495 SetErrorCode("Healing driver failed");
499 catch (Standard_Failure)
501 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
502 SetErrorCode(aFail->GetMessageString());
506 //Make a Python command
507 GEOM::TPythonDump pd (aFunction);
508 pd << aNewObject << " = geompy.SuppressInternalWires(" << theObject << ", [";
511 if (!theWires.IsNull()) {
512 int i = theWires->Lower(), nb = theWires->Upper();
513 for ( ; i <= nb; i++)
514 pd << theWires->Value( i ) << (( i < nb ) ? ", " : "])");
523 //=============================================================================
527 //=============================================================================
528 Handle(GEOM_Object) GEOMImpl_IHealingOperations::FillHoles (Handle(GEOM_Object) theObject,
529 const Handle(TColStd_HArray1OfInteger)& theWires)
531 // set error code, check parameters
534 if (theObject.IsNull()) // if theWires is NULL it's OK, it means that ALL holes must be removed
537 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
538 if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
541 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
544 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), FILL_HOLES);
546 if (aFunction.IsNull()) return NULL;
548 //Check if the function is set correctly
549 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
551 // prepare "data container" class IHealing
552 GEOMImpl_IHealing HI(aFunction);
553 HI.SetWires( theWires );
554 HI.SetOriginal( aLastFunction );
556 //Compute the translation
558 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
561 if (!GetSolver()->ComputeFunction(aFunction))
563 SetErrorCode("Healing driver failed");
567 catch (Standard_Failure)
569 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
570 SetErrorCode(aFail->GetMessageString());
574 //Make a Python command
575 GEOM::TPythonDump pd (aFunction);
576 pd << aNewObject << " = geompy.SuppressHoles(" << theObject << ", [";
579 if ( theWires.IsNull() )
582 int i = theWires->Lower(), nb = theWires->Upper();
583 for ( ; i <= nb; i++)
584 pd << theWires->Value( i ) << (( i < nb ) ? ", " : "])");
591 //=============================================================================
595 //=============================================================================
596 Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObject,
599 // set error code, check parameters
602 if (theObject.IsNull())
605 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
606 if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
609 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
612 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), SEWING);
614 if (aFunction.IsNull()) return NULL;
616 //Check if the function is set correctly
617 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
619 // prepare "data container" class IHealing
620 GEOMImpl_IHealing HI(aFunction);
621 HI.SetTolerance( theTolerance );
622 HI.SetOriginal( aLastFunction );
624 //Compute the translation
626 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
629 if (!GetSolver()->ComputeFunction(aFunction))
631 SetErrorCode("Healing driver failed");
635 catch (Standard_Failure)
637 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
638 SetErrorCode(aFail->GetMessageString());
642 //Make a Python command
643 GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.Sew("
644 << theObject << ", " << theTolerance << ")";
650 //=============================================================================
654 //=============================================================================
655 Handle(GEOM_Object) GEOMImpl_IHealingOperations::DivideEdge (Handle(GEOM_Object) theObject,
660 // set error code, check parameters
663 if (theObject.IsNull())
666 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
667 if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed
670 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY );
673 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), DIVIDE_EDGE);
675 if (aFunction.IsNull()) return NULL;
677 //Check if the function is set correctly
678 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
680 // prepare "data container" class IHealing
681 GEOMImpl_IHealing HI(aFunction);
682 HI.SetIndex( theIndex );
683 HI.SetDevideEdgeValue( theValue );
684 HI.SetIsByParameter( isByParameter );
685 HI.SetOriginal( aLastFunction );
687 //Compute the translation
689 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
692 if (!GetSolver()->ComputeFunction(aFunction))
694 SetErrorCode("Healing driver failed");
698 catch (Standard_Failure)
700 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
701 SetErrorCode(aFail->GetMessageString());
705 //Make a Python command
706 GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.DivideEdge(" << theObject
707 << ", " << theIndex << ", " << theValue << ", " << (int)isByParameter << ")";
713 //=============================================================================
717 //=============================================================================
718 bool GEOMImpl_IHealingOperations::GetFreeBoundary (Handle(GEOM_Object) theObject,
719 Handle(TColStd_HSequenceOfTransient)& theClosed,
720 Handle(TColStd_HSequenceOfTransient)& theOpen )
722 // set error code, check parameters
725 if ( theObject.IsNull() || theClosed.IsNull() || theOpen.IsNull() )
728 TopoDS_Shape aShape = theObject->GetValue();
729 if ( aShape.IsNull() )
732 // get free boundary shapes
733 ShapeAnalysis_FreeBounds anAnalizer( aShape );
734 TopoDS_Compound aClosed = anAnalizer.GetClosedWires();
735 TopoDS_Compound anOpen = anAnalizer.GetOpenWires();
737 // iterate through shapes and append them to the return sequence
738 Handle(GEOM_Object) anObj;
739 Handle(GEOM_Function) aFunction;
740 TopExp_Explorer anExp;
741 for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() )
743 anObj = GetEngine()->AddObject( GetDocID(), GEOM_FREE_BOUNDS );
744 aFunction = anObj->AddFunction( GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF );
745 TopoDS_Shape aValueShape = anExp.Current();
746 aFunction->SetValue( aValueShape );
747 theClosed->Append(anObj);
749 for ( anExp.Init( anOpen, TopAbs_WIRE ); anExp.More(); anExp.Next() )
751 anObj = GetEngine()->AddObject( GetDocID(), GEOM_FREE_BOUNDS );
752 aFunction = anObj->AddFunction( GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF );
753 TopoDS_Shape aValueShape = anExp.Current();
754 aFunction->SetValue( aValueShape );
755 theOpen->Append(anObj);
758 if(!aFunction.IsNull()) {
760 //Make a Python command
761 GEOM::TPythonDump pd (aFunction);
763 Standard_Integer i, aLen = theClosed->Length();
766 for (i = 1; i <= aLen; i++) {
767 Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theClosed->Value(i));
768 pd << anObj_i << ((i < aLen) ? ", " : "");
772 pd << "(isDone, empty_list, ";
775 aLen = theOpen->Length();
778 for (i = 1; i <= aLen; i++) {
779 Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theOpen->Value(i));
780 pd << anObj_i << ((i < aLen) ? ", " : "");
787 pd << ") = geompy.GetFreeBoundary(" << theObject << ")";
795 //=============================================================================
799 //=============================================================================
800 Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientation (Handle(GEOM_Object) theObject)
802 // set error code, check parameters
805 if (theObject.IsNull())
808 if (!theObject->IsMainShape()) {
809 SetErrorCode("Sub shape cannot be transformed - need to create a copy");
813 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
814 if (aLastFunction.IsNull())
815 return NULL; //There is no function which creates an object to be processed
818 aFunction = theObject->AddFunction(GEOMImpl_HealingDriver::GetID(), CHANGE_ORIENTATION);
820 if (aFunction.IsNull())
823 //Check if the function is set correctly
824 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
826 // prepare "data container" class IHealing
827 GEOMImpl_IHealing HI(aFunction);
828 HI.SetOriginal( aLastFunction );
830 //Compute the translation
832 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
835 if (!GetSolver()->ComputeFunction(aFunction)) {
836 SetErrorCode("Healing driver failed");
840 catch (Standard_Failure) {
841 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
842 SetErrorCode(aFail->GetMessageString());
846 //Make a Python command
847 GEOM::TPythonDump(aFunction) << "geompy.ChangeOrientationShell("
855 //=============================================================================
857 * ChangeOrientationCopy
859 //=============================================================================
860 Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientationCopy (Handle(GEOM_Object) theObject)
862 // set error code, check parameters
865 if (theObject.IsNull())
868 Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction();
869 if (aLastFunction.IsNull())
870 return NULL; //There is no function which creates an object to be processed
873 Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), theObject->GetType() );
876 aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), CHANGE_ORIENTATION);
878 if (aFunction.IsNull())
881 //Check if the function is set correctly
882 if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL;
884 // prepare "data container" class IHealing
885 GEOMImpl_IHealing HI(aFunction);
886 HI.SetOriginal( aLastFunction );
888 //Compute the translation
890 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
893 if (!GetSolver()->ComputeFunction(aFunction)) {
894 SetErrorCode("Healing driver failed");
898 catch (Standard_Failure) {
899 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
900 SetErrorCode(aFail->GetMessageString());
904 //Make a Python command
905 GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.ChangeOrientationShellCopy("