]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
code refactoring
authorrnc <rnc@opencascade.com>
Mon, 5 Mar 2012 16:03:27 +0000 (16:03 +0000)
committerrnc <rnc@opencascade.com>
Mon, 5 Mar 2012 16:03:27 +0000 (16:03 +0000)
src/GEOMImpl/GEOMImpl_PrismDriver.cxx
src/GEOMImpl/GEOMImpl_PrismDriver.hxx

index 200ecd8e37c4e21477950a09fd5d907b7a78f61d..535d030a2b6fec959014587d45667518b07229cc 100644 (file)
@@ -196,49 +196,6 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const
     Standard_Boolean isProtrusion = (aCI.GetFuseFlag()==1); 
     // Flag to know wether the feature is a protrusion (fuse) or a depression (cut)
     
-    if (anInitShape.ShapeType() == TopAbs_COMPOUND)
-    {
-      TopExp_Explorer anExp(anInitShape, TopAbs_SOLID);
-      int solidCount = 0;
-      for(;anExp.More();anExp.Next())
-      {
-        solidCount++;
-        if (solidCount > 1)
-          Standard_ConstructionError::Raise("The input shape is a compound with more than one solid");
-      }
-      if (solidCount == 0)
-        Standard_ConstructionError::Raise("The input shape is a compound without any solid");
-    }
-    
-//     if (aSketch.ShapeType() == TopAbs_FACE)
-//     {
-//       aFaceBase = TopoDS::Face(aSketch); 
-//     }
-//     else
-//     {
-    TopoDS_Wire aWire = TopoDS_Wire();
-    
-    if (aSketch.ShapeType() == TopAbs_EDGE)
-    {
-      aWire = BRepBuilderAPI_MakeWire(TopoDS::Edge(aSketch));
-    }
-    else if (aSketch.ShapeType() == TopAbs_WIRE)
-    {
-      aWire = TopoDS::Wire(aSketch);
-    }
-    else
-    {
-      Standard_ConstructionError::Raise("The input profile is neither a wire, nor edge");
-    }
-    
-    TopoDS_Vertex aV1, aV2;
-    TopExp::Vertices(aWire, aV1, aV2);
-    if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) )
-      aWire.Closed( true );
-    
-    if (!aWire.Closed())
-      Standard_ConstructionError::Raise("The input profile is not closed");
-      
     // history of the Base wire (RefBase)
     Handle(GEOM_Object) aSuppObj;
     TDF_LabelSequence aLabelSeq;
@@ -253,46 +210,12 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const
       aSuppObj = GEOM_Object::GetReferencedObject(anArgumentRefLabel);   
     }
     
-    // Construction of the face if the wire hasn't any support face
-    TopoDS_Face aFaceBase = BRepBuilderAPI_MakeFace(aWire);
-
-    if(!aSuppObj.IsNull())      // If the wire has a support
-    {
-      TopoDS_Shape aSupport = aSuppObj->GetValue();
-      if (aSupport.ShapeType() == TopAbs_FACE)
-      {
-        Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aSupport));
-        TopoDS_Face aTempFace = BRepBuilderAPI_MakeFace(aSurf, aWire);
-        
-        if(aTempFace.Orientation() != TopoDS::Face(aSupport).Orientation())
-        {
-          aFaceBase=TopoDS::Face(aTempFace.Reversed());
-        }
-        else
-          aFaceBase=aTempFace;
-      }
-    } 
-//     }
+    TopoDS_Shape aSupport;
     
-    // Invert height and angle if the operation is an extruded cut
-    bool invert = !isProtrusion; 
-    
-    // If the face has a reversed orientation invert for extruded boss operations
-    if(aFaceBase.Orientation() == TopAbs_REVERSED)
-      invert = isProtrusion;
-
-    if(invert)
-    {
-      anAngle = -anAngle;  // Invert angle and height
-      aHeight = -aHeight;
-    }
-    
-    BRepFeat_MakeDPrism thePrism(anInitShape, aFaceBase, TopoDS_Face(),
-                                 anAngle*PI180, isProtrusion, Standard_True); 
-    
-    thePrism.Perform(aHeight);
+    if(!aSuppObj.IsNull())      // If the wire has a support
+      aSupport = aSuppObj->GetValue();
     
-    aShape = thePrism.Shape();
+    aShape = MakeDraftPrism(anInitShape, aSketch, aHeight, anAngle, isProtrusion, aSupport); 
   }
 
   if (aShape.IsNull()) return 0;
@@ -315,11 +238,11 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const
       {
         aSolid = TopoDS::Solid(anExp.Current());
         solidNb++;
+        if (solidNb > 1)
+          break;
       }
       if (solidNb == 1)
-      {
         aRes = aSolid;
-      } 
     } 
     
     aFunction->SetValue(aRes);
@@ -477,6 +400,98 @@ TopoDS_Shape GEOMImpl_PrismDriver::MakeScaledPrism (const TopoDS_Shape& theShape
   return aShape;
 }
 
+//=======================================================================
+//function : MakeDraftPrism
+//purpose  :
+//=======================================================================
+TopoDS_Shape GEOMImpl_PrismDriver::MakeDraftPrism ( const TopoDS_Shape& theInitShape,
+                                                    const TopoDS_Shape& theBaseShape,
+                                                    const Standard_Real theHeight,
+                                                    const Standard_Real theAngle,
+                                                    bool                isProtrusion,
+                                                    const TopoDS_Shape& theSupport)
+{
+  TopoDS_Shape aShape;
+  
+  if (theInitShape.ShapeType() == TopAbs_COMPOUND)
+    {
+      TopExp_Explorer anExp(theInitShape, TopAbs_SOLID);
+      int solidCount = 0;
+      for(;anExp.More();anExp.Next())
+      {
+        solidCount++;
+        if (solidCount > 1)
+          Standard_ConstructionError::Raise("The input shape is a compound with more than one solid");
+      }
+      if (solidCount == 0)
+        Standard_ConstructionError::Raise("The input shape is a compound without any solid");
+    }
+    
+    TopoDS_Wire aWire = TopoDS_Wire();
+    
+    if (theBaseShape.ShapeType() == TopAbs_EDGE)
+    {
+      aWire = BRepBuilderAPI_MakeWire(TopoDS::Edge(theBaseShape));
+    }
+    else if (theBaseShape.ShapeType() == TopAbs_WIRE)
+    {
+      aWire = TopoDS::Wire(theBaseShape);
+    }
+    else
+    {
+      Standard_ConstructionError::Raise("The input profile is neither a wire, nor edge");
+    }
+    
+    TopoDS_Vertex aV1, aV2;
+    TopExp::Vertices(aWire, aV1, aV2);
+    if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) )
+      aWire.Closed( true );
+    
+    if (!aWire.Closed())
+      Standard_ConstructionError::Raise("The input profile is not closed");
+    
+    // Construction of the face if the wire hasn't any support face
+    TopoDS_Face aFaceBase = BRepBuilderAPI_MakeFace(aWire);
+
+    if(!theSupport.IsNull() && theSupport.ShapeType() == TopAbs_FACE)      // If the wire has a support
+    {
+      Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(theSupport));
+      TopoDS_Face aTempFace = BRepBuilderAPI_MakeFace(aSurf, aWire);
+      
+      if(aTempFace.Orientation() != TopoDS::Face(theSupport).Orientation())
+      {
+        aFaceBase=TopoDS::Face(aTempFace.Reversed());
+      }
+      else
+        aFaceBase=aTempFace;
+    } 
+    
+    // Invert height and angle if the operation is an extruded cut
+    bool invert = !isProtrusion; 
+    
+    // If the face has a reversed orientation invert for extruded boss operations
+    if(aFaceBase.Orientation() == TopAbs_REVERSED)
+      invert = isProtrusion;
+
+    Standard_Real anAngle = theAngle;
+    Standard_Real aHeight = theHeight;
+    if(invert)
+    {
+      anAngle  = -theAngle;  // Invert angle and height
+      aHeight  = -theHeight;
+    }
+    
+    BRepFeat_MakeDPrism aPrism(theInitShape, aFaceBase, TopoDS_Face(),
+                              anAngle*PI180, isProtrusion, Standard_True); 
+    
+    aPrism.Perform(aHeight);
+    
+    aShape = aPrism.Shape();
+    
+    return aShape;
+}
+                                                   
+
 //=======================================================================
 //function : GEOMImpl_PrismDriver_Type_
 //purpose  :
index 647b7b87af08442c1fa2b2ee5e73d6b41d7eaa39..a1f8d4dccacf54c22450177392c4b9daf8b4cc14 100644 (file)
@@ -157,7 +157,14 @@ public:
                                                        const gp_Vec&       theVector,
                                                        const Standard_Real theScaleFactor,
                                                        const gp_Pnt&       theCDG = gp::Origin(),
-                                                       bool                isCDG = false); 
+                                                       bool                isCDG = false);
+  
+  Standard_EXPORT static TopoDS_Shape MakeDraftPrism (const TopoDS_Shape& theInitShape,
+                                                      const TopoDS_Shape& theBaseShape,
+                                                      const Standard_Real theHeight,
+                                                      const Standard_Real theAngle,
+                                                      bool                isProtrusion,
+                                                      const TopoDS_Shape& theSupport);
 
 
   // Type management