#include <GeomAPI_Edge.h>
#include <GeomAPI_Lin.h>
+#include <GeomAPI_ShapeExplorer.h>
+#include <GeomAPI_ShapeIterator.h>
#include <GeomAlgoAPI_PointBuilder.h>
#include <ModelAPI_ResultConstruction.h>
#include <ModelAPI_Session.h>
+#include <sstream>
+
//=================================================================================================
PrimitivesPlugin_Cone::PrimitivesPlugin_Cone()
{
}
// Getting axis.
- std::shared_ptr<GeomAPI_Ax2> anAxis;
+ static const std::string aSelectionError = "Error: The axis shape selection is bad.";
+ std::shared_ptr<ModelAPI_AttributeSelection> anEdgeRef = selection(AXIS_ID());
+ GeomShapePtr aShape = anEdgeRef->value();
+ if (!aShape.get()) {
+ if (anEdgeRef->context().get()) {
+ aShape = anEdgeRef->context()->shape();
+ }
+ }
+ if (!aShape.get()) {
+ setError(aSelectionError);
+ return;
+ }
std::shared_ptr<GeomAPI_Edge> anEdge;
- std::shared_ptr<ModelAPI_AttributeSelection> anEdgeRef =
- selection(PrimitivesPlugin_Cone::AXIS_ID());
- if(anEdgeRef && anEdgeRef->value() && anEdgeRef->value()->isEdge()) {
- anEdge = std::shared_ptr<GeomAPI_Edge>(new GeomAPI_Edge(anEdgeRef->value()));
- } else if (anEdgeRef && !anEdgeRef->value() && anEdgeRef->context() &&
- anEdgeRef->context()->shape() && anEdgeRef->context()->shape()->isEdge()) {
- anEdge = std::shared_ptr<GeomAPI_Edge>(new GeomAPI_Edge(anEdgeRef->context()->shape()));
+ if (aShape->isEdge())
+ {
+ anEdge = aShape->edge();
+ }
+ else if (aShape->isCompound())
+ {
+ GeomAPI_ShapeIterator anIt(aShape);
+ anEdge = anIt.current()->edge();
}
- if(anEdge) {
- anAxis = std::shared_ptr<GeomAPI_Ax2>(new GeomAPI_Ax2(aBasePoint,
- anEdge->line()->direction()));
+ else
+ {
+ setError(aSelectionError);
+ return;
}
+ if (!anEdge.get())
+ {
+ setError(aSelectionError);
+ return;
+ }
+
+ std::shared_ptr<GeomAPI_Ax2> anAxis(new GeomAPI_Ax2(aBasePoint,
+ anEdge->line()->direction()));
+
// Getting base radius, top radius and height
double aBaseRadius = real(PrimitivesPlugin_Cone::BASE_RADIUS_ID())->value();
double aTopRadius = real(PrimitivesPlugin_Cone::TOP_RADIUS_ID())->value();
theConeAlgo->prepareNamingFaces();
// Insert to faces
- int num = 1;
std::map< std::string, std::shared_ptr<GeomAPI_Shape> > listOfFaces =
theConeAlgo->getCreatedFaces();
+ int nbFaces = 0;
for (std::map< std::string, std::shared_ptr<GeomAPI_Shape> >::iterator
it=listOfFaces.begin(); it!=listOfFaces.end(); ++it) {
- std::shared_ptr<GeomAPI_Shape> aFace = (*it).second;
- theResultCone->generated(aFace, (*it).first, num++);
+ theResultCone->generated((*it).second, (*it).first);
+ nbFaces++;
}
-}
\ No newline at end of file
+
+ if (nbFaces == 2) {
+ // Naming vertices
+ GeomAPI_DataMapOfShapeShape aVertices;
+ int anIndex = 1;
+ for (GeomAPI_ShapeExplorer aVertExp(theConeAlgo->shape(), GeomAPI_Shape::VERTEX);
+ aVertExp.more();
+ aVertExp.next())
+ {
+ if (!aVertices.isBound(aVertExp.current())) {
+ std::ostringstream aStream;
+ aStream<<"Vertex_"<<anIndex++;
+ theResultCone->generated(aVertExp.current(), aStream.str());
+ aVertices.bind(aVertExp.current(), aVertExp.current());
+ }
+ }
+ }
+}