Salome HOME
Merge branch 'master' into cgt/devCEA
[modules/shaper.git] / src / FeaturesPlugin / Test / TestRevolutionFuse.py
1 ## Copyright (C) 2014-2017  CEA/DEN, EDF R&D
2 ##
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.
7 ##
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.
12 ##
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
16 ##
17 ## See http:##www.salome-platform.org/ or
18 ## email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
19 ##
20
21 """
22       TestRevolutionFuse.py
23       Unit test of FeaturesPlugin_RevolutionFuse class
24
25       class FeaturesPlugin_RevolutionFuse : public FeaturesPlugin_RevolutionBoolean
26                 static const std::string MY_REVOLUTION_ID("RevolutionFuse");
27         static const std::string MY_SKETCH_OBJECT_ID("sketch");
28         static const std::string MY_AXIS_ID("axis_object");
29         static const std::string METHOD_ATTR("CreationMethod");
30         static const std::string MY_TO_ANGLE_ID("to_angle");
31         static const std::string MY_FROM_ANGLE_ID("from_angle");
32         static const std::string MY_TO_OBJECT_ID("to_object");
33         static const std::string MY_TO_OFFSET_ID("to_offset");
34         static const std::string MY_FROM_OBJECT_ID("from_object");
35         static const std::string MY_FROM_OFFSET_ID("from_offset");
36         static const std::string MY_BOOLEAN_OBJECTS_ID("boolean_objects");
37
38         data()->addAttribute(SKETCH_OBJECT_ID(), ModelAPI_AttributeReference::typeId());
39         data()->addAttribute(AXIS_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
40                 data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::typeId());
41         data()->addAttribute(TO_ANGLE_ID(), ModelAPI_AttributeDouble::typeId());
42         data()->addAttribute(FROM_ANGLE_ID(), ModelAPI_AttributeDouble::typeId());
43         data()->addAttribute(TO_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
44         data()->addAttribute(TO_OFFSET_ID(), ModelAPI_AttributeDouble::typeId());
45         data()->addAttribute(FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
46         data()->addAttribute(FROM_OFFSET_ID(), ModelAPI_AttributeSelection::typeId());
47         data()->addAttribute(BOOLEAN_OBJECTS_ID(), ModelAPI_AttributeSelectionList::typeId());
48 """
49 #=========================================================================
50 # Initialization of the test
51 #=========================================================================
52 from ModelAPI import *
53 from GeomDataAPI import *
54 from GeomAlgoAPI import *
55 from GeomAPI import *
56 import math
57
58 __updated__ = "2014-12-16"
59
60 aSession = ModelAPI_Session.get()
61 aDocument = aSession.moduleDocument()
62 # Create a part for extrusion
63 aSession.startOperation()
64 aPartFeature = aDocument.addFeature("Part")
65 aSession.finishOperation()
66 assert (len(aPartFeature.results()) == 1)
67 # Another way is:
68 # aPart = aSession.activeDocument()
69 aPartResult = modelAPI_ResultPart(aPartFeature.firstResult())
70 aPart = aPartResult.partDoc()
71 #=========================================================================
72 # Create a sketch circle to extrude
73 #=========================================================================
74 aSession.startOperation()
75 aCircleSketchFeature = featureToCompositeFeature(aPart.addFeature("Sketch"))
76 origin = geomDataAPI_Point(aCircleSketchFeature.attribute("Origin"))
77 origin.setValue(0, 0, 0)
78 dirx = geomDataAPI_Dir(aCircleSketchFeature.attribute("DirX"))
79 dirx.setValue(1, 0, 0)
80 norm = geomDataAPI_Dir(aCircleSketchFeature.attribute("Norm"))
81 norm.setValue(0, 0, 1)
82 # Create circle
83 aSketchCircle = aCircleSketchFeature.addFeature("SketchCircle")
84 anCircleCentr = geomDataAPI_Point2D(aSketchCircle.attribute("circle_center"))
85 aCircleRadius = aSketchCircle.real("circle_radius")
86 anCircleCentr.setValue(0, 0)
87 aCircleRadius.setValue(20)
88 aSession.finishOperation()
89 #=========================================================================
90 # Make extrusion on circle
91 #=========================================================================
92 # Build shape from sketcher results
93 aCircleSketchResult = aCircleSketchFeature.firstResult()
94 aCircleSketchEdges = modelAPI_ResultConstruction(aCircleSketchResult).shape()
95 origin = geomDataAPI_Point(aCircleSketchFeature.attribute("Origin")).pnt()
96 dirX = geomDataAPI_Dir(aCircleSketchFeature.attribute("DirX")).dir()
97 norm = geomDataAPI_Dir(aCircleSketchFeature.attribute("Norm")).dir()
98 aCircleSketchFaces = ShapeList()
99 GeomAlgoAPI_SketchBuilder.createFaces(
100     origin, dirX, norm, aCircleSketchEdges, aCircleSketchFaces)
101 assert (len(aCircleSketchFaces) > 0)
102 assert (aCircleSketchFaces[0] is not None)
103 # Create extrusion
104 aSession.startOperation()
105 anExtrusionFt = aPart.addFeature("Extrusion")
106 assert (anExtrusionFt.getKind() == "Extrusion")
107 # selection type FACE=4
108 anExtrusionFt.selectionList("base").append(
109     aCircleSketchResult, aCircleSketchFaces[0])
110 anExtrusionFt.string("CreationMethod").setValue("BySizes")
111 anExtrusionFt.real("to_size").setValue(50)
112 anExtrusionFt.real("from_size").setValue(0)
113 anExtrusionFt.real("to_offset").setValue(0) #TODO: remove
114 anExtrusionFt.real("from_offset").setValue(0) #TODO: remove
115 anExtrusionFt.execute()
116 aSession.finishOperation()
117 assert (anExtrusionFt.real("to_size").value() == 50.0)
118
119 # Check extrusion results
120 assert (len(anExtrusionFt.results()) > 0)
121 anExtrusionResult = modelAPI_ResultBody(anExtrusionFt.firstResult())
122 assert (anExtrusionResult is not None)
123
124 #=========================================================================
125 # Create a sketch line to revol
126 #=========================================================================
127 aSession.startOperation()
128 aLineSketchFeature = featureToCompositeFeature(aPart.addFeature("Sketch"))
129 origin = geomDataAPI_Point(aLineSketchFeature.attribute("Origin"))
130 origin.setValue(0, 0, 50)
131 dirx = geomDataAPI_Dir(aLineSketchFeature.attribute("DirX"))
132 dirx.setValue(1, 0, 0)
133 norm = geomDataAPI_Dir(aLineSketchFeature.attribute("Norm"))
134 norm.setValue(0, 0, 1)
135 aLineSketchFeature.selection("External").selectSubShape("face", "Extrusion_1/TopFace_1")
136
137 aSketchLine = aLineSketchFeature.addFeature("SketchLine")
138 aLineStartPoint = geomDataAPI_Point2D(aSketchLine.attribute("StartPoint"))
139 aLineEndPoint = geomDataAPI_Point2D(aSketchLine.attribute("EndPoint"))
140 aLineStartPoint.setValue(-20, -20)
141 aLineEndPoint.setValue(20, -20)
142 aSession.finishOperation()
143
144 # Build shape from sketcher results
145 aLineSketchResult = aLineSketchFeature.firstResult()
146 aLineSketchShape = modelAPI_ResultConstruction(aLineSketchResult).shape()
147 aShapeExplorer = GeomAPI_ShapeExplorer(aLineSketchShape, GeomAPI_Shape.EDGE)
148 aLineEdge = aShapeExplorer.current()
149
150 #=========================================================================
151 # Make revolution fuse
152 #=========================================================================
153 aSession.startOperation()
154 anRevolutionFuseFt = featureToCompositeFeature(aPart.addFeature("RevolutionFuse"))
155 assert (anRevolutionFuseFt.getKind() == "RevolutionFuse")
156 # selection type FACE=4
157 aSession.startOperation()
158 aCircleSketchFeature = featureToCompositeFeature(anRevolutionFuseFt.addFeature("Sketch"))
159 origin = geomDataAPI_Point(aCircleSketchFeature.attribute("Origin"))
160 origin.setValue(0, 0, 50)
161 dirx = geomDataAPI_Dir(aCircleSketchFeature.attribute("DirX"))
162 dirx.setValue(1, 0, 0)
163 norm = geomDataAPI_Dir(aCircleSketchFeature.attribute("Norm"))
164 norm.setValue(0, 0, 1)
165 aCircleSketchFeature.selection("External").selectSubShape("face", "Extrusion_1/To_Face_1")
166 aSession.startOperation()
167 aSketchCircle = aCircleSketchFeature.addFeature("SketchCircle")
168 anCircleCentr = geomDataAPI_Point2D(aSketchCircle.attribute("circle_center"))
169 aCircleRadius = aSketchCircle.real("circle_radius")
170 anCircleCentr.setValue(0, 0)
171 aCircleRadius.setValue(10)
172 aSession.finishOperation()
173 aSession.finishOperation()
174 aSession.startOperation()
175 aCircleSketchFeature.execute() # execute for sketch should be called here, because it is not set as current feature, so it is disabled.
176 anRevolutionFuseFt.selectionList("base").append(aCircleSketchFeature.firstResult(), None)
177 anRevolutionFuseFt.selection("axis_object").setValue(aLineSketchResult, aLineEdge)
178 anRevolutionFuseFt.string("CreationMethod").setValue("ByAngles")
179 anRevolutionFuseFt.real("to_angle").setValue(50)
180 anRevolutionFuseFt.real("from_angle").setValue(50)
181 anRevolutionFuseFt.real("to_offset").setValue(0) #TODO: remove
182 anRevolutionFuseFt.real("from_offset").setValue(0) #TODO: remove
183 anRevolutionFuseFt.selectionList("main_objects").append(anExtrusionResult, anExtrusionResult.shape())
184 aSession.finishOperation()
185 aSession.finishOperation()
186
187 #=========================================================================
188 # Test results
189 #=========================================================================
190 aFactory = ModelAPI_Session.get().validators()
191 assert (aFactory.validate(anRevolutionFuseFt))
192 assert (len(anRevolutionFuseFt.results()) > 0)
193 aCurrentResult = modelAPI_ResultBody(anRevolutionFuseFt.firstResult())
194 assert (aCurrentResult is not None)
195
196 from salome.shaper import model
197 assert(model.checkPythonDump())