}
}
+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());
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);
protected:
void createAxisByTwoPoints();
+ void createAxisByCylindricalFace();
};
#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>
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)
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,