Salome HOME
Fix for issue #461
authormpv <mpv@opencascade.com>
Thu, 16 Apr 2015 14:45:16 +0000 (17:45 +0300)
committermpv <mpv@opencascade.com>
Thu, 16 Apr 2015 14:45:16 +0000 (17:45 +0300)
src/ConstructionPlugin/ConstructionPlugin_Axis.cpp
src/ConstructionPlugin/ConstructionPlugin_Axis.h
src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp
src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.h

index e3d7eb34c4f58e7f2edf07b540e17386bf62c61a..ae24aaf3c7916561f9de78cd36f8dfdbc6dcbf69 100644 (file)
@@ -59,6 +59,19 @@ void ConstructionPlugin_Axis::createAxisByTwoPoints()
   }
 }
 
+void ConstructionPlugin_Axis::createAxisByCylindricalFace()
+{
+    std::shared_ptr<GeomAPI_Shape> aSelection = data()->selection(CYLINDRICAL_FACE())->value();
+     // update arguments due to the selection value
+    if (aSelection && !aSelection->isNull() && aSelection->isFace()) {
+      std::shared_ptr<GeomAPI_Edge> anEdge = GeomAlgoAPI_EdgeBuilder::cylinderAxis(aSelection);
+
+      ResultConstructionPtr aConstr = document()->createConstruction(data());
+      aConstr->setShape(anEdge);
+      setResult(aConstr);
+    }
+}
+
 void ConstructionPlugin_Axis::execute()
 {
   AttributeStringPtr aMethodTypeAttr = string(ConstructionPlugin_Axis::METHOD());
@@ -66,14 +79,12 @@ void ConstructionPlugin_Axis::execute()
   if (aMethodType == "AxisByPointsCase") {
     createAxisByTwoPoints();
   } else if (aMethodType == "AxisByCylindricalFaceCase") {
-    #ifdef _DEBUG
-    std::cout << "ConstructionPlugin_Axis::execute: " << "AxisByCylindricalFaceCase is not supported yet." << std::endl;
-    #endif
+    createAxisByCylindricalFace();
   }
 }
 
 bool ConstructionPlugin_Axis::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
-                                                    std::shared_ptr<GeomAPI_ICustomPrs> theDefaultPrs)
+  std::shared_ptr<GeomAPI_ICustomPrs> theDefaultPrs)
 {
   bool isCustomized = theDefaultPrs.get() != NULL &&
                       theDefaultPrs->customisePresentation(theResult, thePrs, theDefaultPrs);
index df8aedcfde5bf9fd4d32414aaf67557dc7f554f2..1775300ebda82e65cbdd043fdc84073e78d6eb35 100644 (file)
@@ -78,6 +78,7 @@ class ConstructionPlugin_Axis : public ModelAPI_Feature, public GeomAPI_ICustomP
 
  protected:
   void createAxisByTwoPoints();
+  void createAxisByCylindricalFace();
 };
 
 
index f1ecb2b34fca5e14775253030ec483e616639460..0de55a60f36502506bd813eb21528fe3398daf64 100644 (file)
@@ -8,9 +8,11 @@
 #include <gp_Pln.hxx>
 #include <BRepBuilderAPI_MakeEdge.hxx>
 #include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
 #include <TopoDS.hxx>
 #include <BRep_Tool.hxx>
 #include <Geom_Plane.hxx>
+#include <Geom_CylindricalSurface.hxx>
 
 #include <gp_Ax2.hxx>
 #include <gp_Circ.hxx>
@@ -32,6 +34,36 @@ std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_EdgeBuilder::line(
   return aRes;
 }
 
+std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_EdgeBuilder::cylinderAxis(
+    std::shared_ptr<GeomAPI_Shape> theCylindricalFace)
+{
+  std::shared_ptr<GeomAPI_Edge> aResult;
+  const TopoDS_Shape& aShape = theCylindricalFace->impl<TopoDS_Shape>();
+  if (aShape.IsNull())
+    return aResult;
+  TopoDS_Face aFace = TopoDS::Face(aShape);
+  if (aFace.IsNull())
+    return aResult;
+  TopLoc_Location aLoc;
+  Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace, aLoc);
+  if (aSurf.IsNull())
+    return aResult;
+  Handle(Geom_CylindricalSurface) aCyl = Handle(Geom_CylindricalSurface)::DownCast(aSurf);
+  if (aCyl.IsNull())
+    return aResult;
+  gp_Ax1 anAxis = aCyl->Axis();
+  gp_Pnt aStart(anAxis.Location().Transformed(aLoc.Transformation()));
+  // edge length is 100, "-" because cylinder of extrusion has negative direction with the cylinder
+  gp_Pnt anEnd(anAxis.Location().XYZ() - anAxis.Direction().XYZ() * 100.);
+  anEnd.Transform(aLoc.Transformation());
+  
+  BRepBuilderAPI_MakeEdge anEdgeBuilder(aStart, anEnd);
+  std::shared_ptr<GeomAPI_Edge> aRes(new GeomAPI_Edge);
+  TopoDS_Edge anEdge = anEdgeBuilder.Edge();
+  aRes->setImpl(new TopoDS_Shape(anEdge));
+  return aRes;
+}
+
 std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_EdgeBuilder::lineCircle(
     std::shared_ptr<GeomAPI_Pnt> theCenter, std::shared_ptr<GeomAPI_Dir> theNormal,
     double theRadius)
index ef0f82df49d04931d80d748a35c2667dcc4232e6..0bd67621bc66ffeeb8b0b286949902e7a87f9dfe 100644 (file)
@@ -23,7 +23,10 @@ class GEOMALGOAPI_EXPORT GeomAlgoAPI_EdgeBuilder
  public:
   /// Creates linear edge by two points
   static std::shared_ptr<GeomAPI_Edge> line(std::shared_ptr<GeomAPI_Pnt> theStart,
-                                              std::shared_ptr<GeomAPI_Pnt> theEnd);
+                                            std::shared_ptr<GeomAPI_Pnt> theEnd);
+  /// Creates edge - axis of the given cylindrical face
+  static std::shared_ptr<GeomAPI_Edge> cylinderAxis(
+    std::shared_ptr<GeomAPI_Shape> theCylindricalFace);
 
   /// Creates linear edge in a form of a circle by a point and a circle radius
   static std::shared_ptr<GeomAPI_Edge> lineCircle(std::shared_ptr<GeomAPI_Pnt> theCenter,