Salome HOME
GPUSPHGUI: add an option to Offset Surface opreation
[modules/geom.git] / src / GEOMImpl / GEOMImpl_OffsetDriver.cxx
index 112966a3f276b1f5547febd55111bccb3bf11e86..cb80023a62d3acd2a4dc6f0e9880eca4b4fa38a7 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -60,7 +60,7 @@ GEOMImpl_OffsetDriver::GEOMImpl_OffsetDriver()
 //function : Execute
 //purpose  :
 //=======================================================================
-Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const
+Standard_Integer GEOMImpl_OffsetDriver::Execute(Handle(TFunction_Logbook)& log) const
 {
   if (Label().IsNull()) return 0;
   Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
@@ -86,11 +86,20 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const
     StdFail_NotDone::Raise(aMsg.ToCString());
   }
 
-  if (aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY) {
-    BRepOffsetAPI_MakeOffsetShape MO (aShapeBase,
-                                      aCI.GetValue(),
-                                      aTol);
-    if (MO.IsDone()) {
+  if ( aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY )
+  {
+    BRepOffsetAPI_MakeOffsetShape MO;
+    BRepOffset_Mode aMode = BRepOffset_Skin;
+    Standard_Boolean anIntersection = Standard_False, aSelfInter = Standard_False;
+    MO.PerformByJoin( aShapeBase,
+                      aCI.GetValue(),
+                      aTol,
+                      aMode,
+                      anIntersection,
+                      aSelfInter,
+                      aCI.GetJoinByPipes() ? GeomAbs_Arc : GeomAbs_Intersection );
+
+    if ( MO.IsDone() ) {
       aShape = MO.Shape();
       if ( !GEOMUtils::CheckShape(aShape, true) && !GEOMUtils::FixShapeTolerance(aShape) )
         Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result");
@@ -105,7 +114,7 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const
 
     if (aType == TopAbs_FACE || aType == TopAbs_SHELL) {
       // Create a thick solid.
-      BRepClass3d_SolidClassifier aClassifier = BRepClass3d_SolidClassifier(aShapeBase);
+      BRepClass3d_SolidClassifier aClassifier(aShapeBase);
       aClassifier.PerformInfinitePoint(Precision::Confusion());
       if (aClassifier.State()==TopAbs_IN)
       {
@@ -125,7 +134,7 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const
 
       // Control the solid orientation. This is mostly done to fix a bug in case of extrusion
       // of a circle. The built solid is then badly oriented
-      BRepClass3d_SolidClassifier anotherClassifier = BRepClass3d_SolidClassifier(aShape);
+      BRepClass3d_SolidClassifier anotherClassifier(aShape);
       anotherClassifier.PerformInfinitePoint(Precision::Confusion());
       if (anotherClassifier.State()==TopAbs_IN)
       {
@@ -180,7 +189,7 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const
 
   aFunction->SetValue(aShape);
 
-  log.SetTouched(Label());
+  log->SetTouched(Label());
 
   return 1;
 }
@@ -228,5 +237,4 @@ GetCreationInformation(std::string&             theOperationName,
   return true;
 }
 
-IMPLEMENT_STANDARD_HANDLE (GEOMImpl_OffsetDriver,GEOM_BaseDriver);
 IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_OffsetDriver,GEOM_BaseDriver);