1 // Copyright (C) 2014-2017 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
20 #include <PrimitivesPlugin_Cylinder.h>
22 #include <GeomAPI_Dir.h>
23 #include <GeomAPI_Edge.h>
24 #include <GeomAPI_Lin.h>
26 #include <GeomAlgoAPI_PointBuilder.h>
28 #include <ModelAPI_AttributeDouble.h>
29 #include <ModelAPI_AttributeSelection.h>
30 #include <ModelAPI_AttributeString.h>
31 #include <ModelAPI_ResultBody.h>
32 #include <ModelAPI_ResultConstruction.h>
33 #include <ModelAPI_Session.h>
37 //=================================================================================================
38 PrimitivesPlugin_Cylinder::PrimitivesPlugin_Cylinder()
42 //=================================================================================================
43 void PrimitivesPlugin_Cylinder::initAttributes()
45 data()->addAttribute(PrimitivesPlugin_Cylinder::CREATION_METHOD(),
46 ModelAPI_AttributeString::typeId());
48 data()->addAttribute(PrimitivesPlugin_Cylinder::BASE_POINT_ID(),
49 ModelAPI_AttributeSelection::typeId());
50 data()->addAttribute(PrimitivesPlugin_Cylinder::AXIS_ID(),
51 ModelAPI_AttributeSelection::typeId());
53 data()->addAttribute(PrimitivesPlugin_Cylinder::RADIUS_ID(),
54 ModelAPI_AttributeDouble::typeId());
55 data()->addAttribute(PrimitivesPlugin_Cylinder::HEIGHT_ID(),
56 ModelAPI_AttributeDouble::typeId());
57 data()->addAttribute(PrimitivesPlugin_Cylinder::ANGLE_ID(),
58 ModelAPI_AttributeDouble::typeId());
60 // Initialize the base point of the cylinder at the origin if the base point is not filled.
61 AttributeSelectionPtr aBasePoint = data()->selection(BASE_POINT_ID());
62 if (!aBasePoint->isInitialized()) {
63 ObjectPtr aPointObj = ModelAPI_Session::get()->moduleDocument()
64 ->objectByName(ModelAPI_ResultConstruction::group(), "Origin");
65 if (aPointObj.get()) {
66 ResultPtr aPointRes = std::dynamic_pointer_cast<ModelAPI_Result>(aPointObj);
67 aBasePoint->setValue(aPointRes, std::shared_ptr<GeomAPI_Shape>());
71 // Initialize the axis at the OZ axis if the axis is not filled.
72 AttributeSelectionPtr anAxis = data()->selection(AXIS_ID());
73 if (!anAxis->isInitialized()) {
74 ObjectPtr anAxisObj = ModelAPI_Session::get()->moduleDocument()
75 ->objectByName(ModelAPI_ResultConstruction::group(), "OZ");
76 if (anAxisObj.get()) {
77 ResultPtr anAxisRes = std::dynamic_pointer_cast<ModelAPI_Result>(anAxisObj);
78 anAxis->setValue(anAxisRes, std::shared_ptr<GeomAPI_Shape>());
83 //=================================================================================================
84 void PrimitivesPlugin_Cylinder::execute()
86 AttributeStringPtr aMethodTypeAttr = string(PrimitivesPlugin_Cylinder::CREATION_METHOD());
87 std::string aMethodType = aMethodTypeAttr->value();
89 if (aMethodType == CREATION_METHOD_CYLINDER()) {
90 createCylinder(false);
93 if (aMethodType == CREATION_METHOD_CYLINDER_PORTION()) {
98 //=================================================================================================
99 void PrimitivesPlugin_Cylinder::createCylinder(bool withAngle)
102 std::shared_ptr<GeomAPI_Pnt> aBasePoint;
103 std::shared_ptr<ModelAPI_AttributeSelection> aPointRef =
104 selection(PrimitivesPlugin_Cylinder::BASE_POINT_ID());
105 if (aPointRef.get() != NULL) {
106 GeomShapePtr aShape1 = aPointRef->value();
107 if (!aShape1.get()) {
108 aShape1 = aPointRef->context()->shape();
111 aBasePoint = GeomAlgoAPI_PointBuilder::point(aShape1);
116 std::shared_ptr<GeomAPI_Ax2> anAxis;
117 std::shared_ptr<GeomAPI_Edge> anEdge;
118 std::shared_ptr<ModelAPI_AttributeSelection> anEdgeRef =
119 selection(PrimitivesPlugin_Cylinder::AXIS_ID());
120 if(anEdgeRef && anEdgeRef->value() && anEdgeRef->value()->isEdge()) {
121 anEdge = std::shared_ptr<GeomAPI_Edge>(new GeomAPI_Edge(anEdgeRef->value()));
122 } else if (anEdgeRef && !anEdgeRef->value() && anEdgeRef->context() &&
123 anEdgeRef->context()->shape() && anEdgeRef->context()->shape()->isEdge()) {
124 anEdge = std::shared_ptr<GeomAPI_Edge>(new GeomAPI_Edge(anEdgeRef->context()->shape()));
127 anAxis = std::shared_ptr<GeomAPI_Ax2>(new GeomAPI_Ax2(aBasePoint,
128 anEdge->line()->direction()));
131 // Getting radius and height
132 double aRadius = real(PrimitivesPlugin_Cylinder::RADIUS_ID())->value();
133 double aHeight = real(PrimitivesPlugin_Cylinder::HEIGHT_ID())->value();
135 std::shared_ptr<GeomAlgoAPI_Cylinder> aCylinderAlgo;
138 double anAngle = real(PrimitivesPlugin_Cylinder::ANGLE_ID())->value();
140 std::shared_ptr<GeomAlgoAPI_Cylinder>(new GeomAlgoAPI_Cylinder(anAxis,
145 std::shared_ptr<GeomAlgoAPI_Cylinder>(new GeomAlgoAPI_Cylinder(anAxis,
149 // These checks should be made to the GUI for the feature but
150 // the corresponding validator does not exist yet.
151 if (!aCylinderAlgo->check()) {
152 setError(aCylinderAlgo->getError());
156 // Build the cylinder
157 aCylinderAlgo->build();
159 // Check if the creation of the cylinder
160 if(!aCylinderAlgo->isDone()) {
161 // The error is not displayed in a popup window. It must be in the message console.
162 setError(aCylinderAlgo->getError());
165 if(!aCylinderAlgo->checkValid("Cylinder builder")) {
166 // The error is not displayed in a popup window. It must be in the message console.
167 setError(aCylinderAlgo->getError());
171 int aResultIndex = 0;
172 ResultBodyPtr aResultBox = document()->createBody(data(), aResultIndex);
173 loadNamingDS(aCylinderAlgo, aResultBox);
174 setResult(aResultBox, aResultIndex);
177 //=================================================================================================
178 void PrimitivesPlugin_Cylinder::loadNamingDS(std::shared_ptr<GeomAlgoAPI_Cylinder> theCylinderAlgo,
179 std::shared_ptr<ModelAPI_ResultBody> theResultCylinder)
182 theResultCylinder->store(theCylinderAlgo->shape());
184 // Prepare the naming
185 theCylinderAlgo->prepareNamingFaces();
189 std::map< std::string, std::shared_ptr<GeomAPI_Shape> > listOfFaces =
190 theCylinderAlgo->getCreatedFaces();
191 for (std::map< std::string, std::shared_ptr<GeomAPI_Shape> >::iterator
192 it=listOfFaces.begin(); it!=listOfFaces.end(); ++it) {
193 std::shared_ptr<GeomAPI_Shape> aFace = (*it).second;
194 theResultCylinder->generated(aFace, (*it).first, num++);