Salome HOME
Update unit-tests for SketchPlugin. Test case for the Projection has been added
[modules/shaper.git] / src / SketchPlugin / Test / TestSketchArcCircle.py
1 """
2     TestSketchArcCircle.py
3     
4     static const std::string MY_SKETCH_ARC_ID("SketchArc");
5     static const std::string MY_CENTER_ID = "ArcCenter";
6     static const std::string MY_START_ID = "ArcStartPoint";
7     static const std::string MY_END_ID = "ArcEndPoint";
8     data()->addAttribute(SketchPlugin_Arc::CENTER_ID(), GeomDataAPI_Point2D::typeId());
9     data()->addAttribute(SketchPlugin_Arc::START_ID(),  GeomDataAPI_Point2D::typeId());
10     data()->addAttribute(SketchPlugin_Arc::END_ID(),    GeomDataAPI_Point2D::typeId());
11     
12     static const std::string MY_CIRCLE_ID("SketchCircle");
13     static const std::string MY_CIRCLE_CENTER_ID("CircleCenter");
14     static const std::string MY_CIRCLE_RADIUS_ID("CircleRadius");
15     data()->addAttribute(SketchPlugin_Circle::CENTER_ID(), GeomDataAPI_Point2D::typeId());
16     data()->addAttribute(SketchPlugin_Circle::RADIUS_ID(), ModelAPI_AttributeDouble::typeId());
17 """
18
19 #=========================================================================
20 # Initialization of the test
21 #=========================================================================
22 from GeomDataAPI import *
23 from ModelAPI import *
24 import math
25
26 __updated__ = "2014-10-28"
27
28
29 #=========================================================================
30 # Auxiliary functions
31 #=========================================================================
32
33 def angle(theCenter, theFirst, theLast):
34     """
35     subroutine to calculate angle given by 3 points
36     """
37     aDirX1 = theFirst.x() - theCenter.x()
38     aDirY1 = theFirst.y() - theCenter.y()
39     aLen1 = math.hypot(aDirX1, aDirY1)
40     aDirX2 = theLast.x() - theCenter.x()
41     aDirY2 = theLast.y() - theCenter.y()
42     aLen2 = math.hypot(aDirX2, aDirY2)
43     aDot = aDirX1 * aDirX2 + aDirY1 * aDirY2
44     anAngle = math.acos(aDot / aLen1 / aLen2)
45     return round(anAngle * 180. / math.pi, 6)
46
47 def distancePointPoint(thePointA, thePointB):
48     """
49     subroutine to calculate distance between two points
50     result of calculated distance is has 10**-5 precision
51     """
52     xdiff = math.pow((thePointA.x() - thePointB.x()), 2)
53     ydiff = math.pow((thePointA.y() - thePointB.y()), 2)
54     return round(math.sqrt(xdiff + ydiff), 5)
55
56
57 aSession = ModelAPI_Session.get()
58 aDocument = aSession.moduleDocument()
59 #=========================================================================
60 # Creation of a sketch
61 #=========================================================================
62 aSession.startOperation()
63 #aSketchFeature = aDocument.addFeature("Sketch")
64 aSketchCommonFeature = aDocument.addFeature("Sketch")
65 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
66 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
67 origin.setValue(0, 0, 0)
68 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
69 dirx.setValue(1, 0, 0)
70 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
71 norm.setValue(0, 0, 1)
72 aSession.finishOperation()
73 #=========================================================================
74 # Creation of an arc
75 # 1. Test SketchPlugin_Arc attributes
76 # 2.
77 #=========================================================================
78 aSession.startOperation()
79 aSketchReflist = aSketchFeature.reflist("Features")
80 assert (not aSketchReflist.isInitialized())
81 assert (aSketchReflist.size() == 0)
82 assert (len(aSketchReflist.list()) == 0)
83 aSketchArc = aSketchFeature.addFeature("SketchArc")
84 assert (aSketchArc.getKind() == "SketchArc")
85 anArcCentr = geomDataAPI_Point2D(aSketchArc.attribute("ArcCenter"))
86 assert (anArcCentr.x() == 0)
87 assert (anArcCentr.y() == 0)
88 assert (not anArcCentr.isInitialized())
89 anArcCentr.setValue(10., 10.)
90 anArcStartPoint = geomDataAPI_Point2D(
91     aSketchArc.attribute("ArcStartPoint"))
92 assert (anArcStartPoint.x() == 0)
93 assert (anArcStartPoint.y() == 0)
94 assert (not anArcStartPoint.isInitialized())
95 anArcStartPoint.setValue(0., 50.)
96 anArcEndPoint = geomDataAPI_Point2D(aSketchArc.attribute("ArcEndPoint"))
97 assert (anArcEndPoint.x() == 0)
98 assert (anArcEndPoint.y() == 0)
99 assert (not anArcEndPoint.isInitialized())
100 anArcEndPoint.setValue(50., 0.)
101 aSession.finishOperation()
102 # check that values have been changed
103 aSketchReflist = aSketchFeature.reflist("Features")
104 assert (aSketchReflist.size() == 1)
105 assert (len(aSketchReflist.list()) == 1)
106 assert (anArcCentr.x() == 10.0)
107 assert (anArcCentr.y() == 10.0)
108 assert (anArcStartPoint.x() == 0.0)
109 assert (anArcStartPoint.y() == 50.0)
110 assert (anArcEndPoint.x() == 50.0)
111 assert (anArcEndPoint.y() == 0.0)
112 #=========================================================================
113 # Edit the arc:
114 # 1. Move whole arc
115 # 2. Change the start point
116 # 3. Change the radius of arc
117 # 4. Change arc's angle
118 #=========================================================================
119 aSession.startOperation()
120 deltaX, deltaY = 5., 10.
121 anArcCentr.setValue(anArcCentr.x() + deltaX, anArcCentr.y() + deltaY)
122 aSession.finishOperation()
123 assert (anArcCentr.x() == 15)
124 assert (anArcCentr.y() == 20)
125 assert (math.fabs(distancePointPoint(anArcCentr, anArcStartPoint) - distancePointPoint(anArcCentr, anArcEndPoint)) < 1.e-10)
126 # Change the start point
127 aSession.startOperation()
128 anArcStartPoint.setValue(anArcStartPoint.x() + deltaX, anArcStartPoint.y())
129 aSession.finishOperation()
130 assert (math.fabs(distancePointPoint(anArcCentr, anArcStartPoint) - distancePointPoint(anArcCentr, anArcEndPoint)) < 1.e-10)
131 # Change radius
132 RADIUS = 50
133 aSession.startOperation()
134 anArcRadius = aSketchArc.real("ArcRadius")
135 anArcRadius.setValue(RADIUS)
136 aSession.finishOperation()
137 assert (math.fabs(distancePointPoint(anArcCentr, anArcStartPoint) - RADIUS) < 1.e-10)
138 assert (math.fabs(distancePointPoint(anArcCentr, anArcEndPoint) - RADIUS) < 1.e-10)
139 # Change angle
140 ANGLE = 120
141 aSession.startOperation()
142 anArcAngle = aSketchArc.real("ArcAngle")
143 anArcAngle.setValue(ANGLE)
144 aSession.finishOperation()
145 assert (math.fabs(angle(anArcCentr, anArcStartPoint, anArcEndPoint) - ANGLE) < 1.e-7)
146 #=========================================================================
147 # Check results of the Arc
148 #=========================================================================
149 aResult = aSketchArc.firstResult()
150 aResultConstruction = modelAPI_ResultConstruction(aResult)
151 aShape = aResultConstruction.shape()
152 assert (aShape is not None)
153 assert (not aShape.isNull())
154 #=========================================================================
155 # Create a circle
156 # 1. Test SketchPlugin_Circle.h attributes
157 # 2. ModelAPI_AttributeDouble attribute
158 #=========================================================================
159 aSession.startOperation()
160 aSketchReflist = aSketchFeature.reflist("Features")
161 # Arc is already added
162 assert (aSketchReflist.size() == 1)
163 assert (len(aSketchReflist.list()) == 1)
164 aSketchCircle = aSketchFeature.addFeature("SketchCircle")
165 assert (aSketchCircle.getKind() == "SketchCircle")
166 anCircleCentr = geomDataAPI_Point2D(aSketchCircle.attribute("CircleCenter"))
167 assert (anCircleCentr.x() == 0)
168 assert (anCircleCentr.y() == 0)
169 assert (not anCircleCentr.isInitialized())
170 aCircleRadius = aSketchCircle.real("CircleRadius")
171 assert (type(aCircleRadius) == ModelAPI_AttributeDouble)
172 # ModelAPI_AttributeDouble.typeId() is checked in ModelAPI_TestConstants
173 assert (aCircleRadius.attributeType() == ModelAPI_AttributeDouble.typeId())
174 assert (aCircleRadius.value() == 0)
175 anCircleCentr.setValue(-25., -25)
176 aCircleRadius.setValue(25.)
177 assert (anCircleCentr.x() == -25)
178 assert (anCircleCentr.y() == -25)
179 assert (aCircleRadius.value() == 25)
180 aSession.finishOperation()
181 #=========================================================================
182 # Edit the Cricle
183 # 1. Check that changing the centr of a circle does not affects radius
184 # 2. and vise versa; also check that int is acceptable as well as a real
185 #=========================================================================
186 aSession.startOperation()
187 anCircleCentr.setValue(10, 60)
188 aSession.finishOperation()
189 assert (anCircleCentr.x() == 10)
190 assert (anCircleCentr.y() == 60)
191 assert (aCircleRadius.value() == 25)
192 aSession.startOperation()
193 aCircleRadius.setValue(int(20))
194 aSession.finishOperation()
195 assert (anCircleCentr.x() == 10)
196 assert (anCircleCentr.y() == 60)
197 assert (aCircleRadius.value() == 20)
198 #=========================================================================
199 # Create an arc, tangent to the line
200 #=========================================================================
201 aSession.startOperation()
202 aSketchLine = aSketchFeature.addFeature("SketchLine")
203 aLineStart = geomDataAPI_Point2D(aSketchLine.attribute("StartPoint"))
204 aLineEnd = geomDataAPI_Point2D(aSketchLine.attribute("EndPoint"))
205 aLineStart.setValue(0., 0.)
206 aLineEnd.setValue(50., 0.)
207 aSession.finishOperation()
208 aSession.startOperation()
209 aSketchArcTangent = aSketchFeature.addFeature("SketchArc")
210 aSketchArcTangent.string("ArcType").setValue("Tangent")
211 anArcEndPoint = geomDataAPI_Point2D(aSketchArcTangent.attribute("ArcEndPoint"))
212 aTangent = aSketchArcTangent.refattr("ArcTangentPoint")
213 aTangent.setAttr(aLineEnd)
214 anArcEndPoint.setValue(51., 1.)
215 anArcEndPoint.setValue(100., 25.)
216 aSession.finishOperation()
217 anArcCenter = geomDataAPI_Point2D(aSketchArcTangent.attribute("ArcCenter"))
218 assert(anArcCenter.x() == 50.)
219 #=========================================================================
220 # Create an arc, tangent to the previous arc
221 #=========================================================================
222 aSession.startOperation()
223 aSketchArcTangent2 = aSketchFeature.addFeature("SketchArc")
224 aSketchArcTangent2.string("ArcType").setValue("Tangent")
225 anArcEndPoint2 = geomDataAPI_Point2D(aSketchArcTangent2.attribute("ArcEndPoint"))
226 aTangent = aSketchArcTangent2.refattr("ArcTangentPoint")
227 aTangent.setAttr(anArcEndPoint)
228 anArcEndPoint2.setValue(anArcEndPoint.x() + 1, anArcEndPoint.y() + 1)
229 anArcEndPoint2.setValue(50., 50.)
230 aSession.finishOperation()
231 #=========================================================================
232 # End of test
233 #=========================================================================