Salome HOME
Added python dump checking for every unit test where it is useful.
[modules/shaper.git] / src / SketchPlugin / Test / TestConstraintTangent.py
1 """
2     TestConstraintTangent.py
3     Unit test of SketchPlugin_ConstraintTangent class
4         
5     SketchPlugin_ConstraintTangent
6         static const std::string MY_CONSTRAINT_TANGENT_ID("SketchConstraintTangent");
7         data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
8         data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
9
10 """
11 from GeomDataAPI import *
12 from GeomAPI import *
13 from ModelAPI import *
14 import math
15 #=========================================================================
16 # Initialization of the test
17 #=========================================================================
18
19 __updated__ = "2015-03-17"
20
21 def distancePointLine(point, line):
22     """
23     subroutine to calculate distance between point and line
24     result of calculated distance is has 10**-5 precision
25     """
26     aStartPoint = geomDataAPI_Point2D(line.attribute("StartPoint"))
27     aEndPoint = geomDataAPI_Point2D(line.attribute("EndPoint"))
28     # orthogonal direction
29     aDirX = -(aEndPoint.y() - aStartPoint.y())
30     aDirY = (aEndPoint.x() - aStartPoint.x())
31     aLen = math.sqrt(aDirX**2 + aDirY**2)
32     aDirX = aDirX / aLen
33     aDirY = aDirY / aLen
34     aVecX = point.x() - aStartPoint.x()
35     aVecY = point.y() - aStartPoint.y()
36     return round(math.fabs(aVecX * aDirX + aVecY * aDirY), 5)
37
38
39 aSession = ModelAPI_Session.get()
40 aDocument = aSession.moduleDocument()
41 #=========================================================================
42 # Creation of a sketch
43 #=========================================================================
44 aSession.startOperation()
45 aSketchCommonFeature = aDocument.addFeature("Sketch")
46 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
47 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
48 origin.setValue(0, 0, 0)
49 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
50 dirx.setValue(1, 0, 0)
51 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
52 norm.setValue(0, 0, 1)
53 aSession.finishOperation()
54 #=========================================================================
55 # TEST 1. Arc-line tangency
56 #=========================================================================
57 # Creation of an arc and two lines
58 #=========================================================================
59 # Arc
60 aSession.startOperation()
61 aSketchArc1 = aSketchFeature.addFeature("SketchArc")
62 anArcCentr = geomDataAPI_Point2D(aSketchArc1.attribute("ArcCenter"))
63 anArcCentr.setValue(10., 10.)
64 anArcStartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcStartPoint"))
65 anArcStartPoint.setValue(0., 50.)
66 anArcEndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcEndPoint"))
67 anArcEndPoint.setValue(50., 0.)
68 aSession.finishOperation()
69 # Line 1
70 aSession.startOperation()
71 aSketchLine1 = aSketchFeature.addFeature("SketchLine")
72 aLine1StartPoint = geomDataAPI_Point2D(aSketchLine1.attribute("StartPoint"))
73 aLine1EndPoint = geomDataAPI_Point2D(aSketchLine1.attribute("EndPoint"))
74 aLine1StartPoint.setValue(0., 50.)
75 aLine1EndPoint.setValue(0., 100.)
76 aSession.finishOperation()
77 # Line 2
78 aSession.startOperation()
79 aSketchLine2 = aSketchFeature.addFeature("SketchLine")
80 aLine2StartPoint = geomDataAPI_Point2D(aSketchLine2.attribute("StartPoint"))
81 aLine2EndPoint = geomDataAPI_Point2D(aSketchLine2.attribute("EndPoint"))
82 aLine2StartPoint.setValue(50., 0.)
83 aLine2EndPoint.setValue(100., 0.)
84 aSession.finishOperation()
85 #=========================================================================
86 # Link arc points and lines points by the coincidence constraint
87 #=========================================================================
88 aSession.startOperation()
89 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
90 reflistA = aConstraint.refattr("ConstraintEntityA")
91 reflistB = aConstraint.refattr("ConstraintEntityB")
92 reflistA.setAttr(anArcStartPoint)
93 reflistB.setAttr(aLine1StartPoint)
94 aConstraint.execute()
95 aSession.finishOperation()
96 aSession.startOperation()
97 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
98 reflistA = aConstraint.refattr("ConstraintEntityA")
99 reflistB = aConstraint.refattr("ConstraintEntityB")
100 reflistA.setAttr(anArcEndPoint)
101 reflistB.setAttr(aLine2StartPoint)
102 aConstraint.execute()
103 aSession.finishOperation()
104 #=========================================================================
105 # Add tangency constraint and check correctness
106 #=========================================================================
107 aSession.startOperation()
108 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
109 aRefObjectA = aTangency.refattr("ConstraintEntityA")
110 aRefObjectB = aTangency.refattr("ConstraintEntityB")
111 anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult())
112 anObjectB = modelAPI_ResultConstruction(aSketchLine1.firstResult())
113 assert (anObjectA is not None)
114 assert (anObjectB is not None)
115 aRefObjectA.setObject(anObjectA)
116 aRefObjectB.setObject(anObjectB)
117 aTangency.execute()
118 aSession.finishOperation()
119 anArcVecX = anArcStartPoint.x() - anArcCentr.x()
120 anArcVecY = anArcStartPoint.y() - anArcCentr.y()
121 aLen = math.sqrt(anArcVecX**2 + anArcVecY**2)
122 aLineVecX = aLine1EndPoint.x() - aLine1StartPoint.x()
123 aLineVecY = aLine1EndPoint.y() - aLine1StartPoint.y()
124 aLen = aLen * math.sqrt(aLineVecX**2 + aLineVecY**2)
125 aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY
126 assert math.fabs(aDot) <= 2.e-6 * aLen, "Observed dot product: {0}".format(aDot)
127 #=========================================================================
128 # Add tangency constraint for arc and second line and check correctness
129 #=========================================================================
130 aSession.startOperation()
131 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
132 aRefObjectA = aTangency.refattr("ConstraintEntityA")
133 aRefObjectB = aTangency.refattr("ConstraintEntityB")
134 anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult())
135 anObjectB = modelAPI_ResultConstruction(aSketchLine2.firstResult())
136 assert (anObjectA is not None)
137 assert (anObjectB is not None)
138 aRefObjectA.setObject(anObjectA)
139 aRefObjectB.setObject(anObjectB)
140 aTangency.execute()
141 aSession.finishOperation()
142 anArcVecX = anArcEndPoint.x() - anArcCentr.x()
143 anArcVecY = anArcEndPoint.y() - anArcCentr.y()
144 aLen = math.sqrt(anArcVecX**2 + anArcVecY**2)
145 aLineVecX = aLine2EndPoint.x() - aLine2StartPoint.x()
146 aLineVecY = aLine2EndPoint.y() - aLine2StartPoint.y()
147 aLen = aLen * math.sqrt(aLineVecX**2 + aLineVecY**2)
148 aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY
149 assert math.fabs(aDot) <= 2.e-6 * aLen, "Observed dot product: {0}".format(aDot)
150
151 #=========================================================================
152 # TEST 2. Arc-arc tangency
153 #=========================================================================
154 # Creation of arcs
155 #=========================================================================
156 # Arc 1
157 aSession.startOperation()
158 aSketchArc1 = aSketchFeature.addFeature("SketchArc")
159 anArc1Centr = geomDataAPI_Point2D(aSketchArc1.attribute("ArcCenter"))
160 anArc1Centr.setValue(10., 10.)
161 anArc1StartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcStartPoint"))
162 anArc1StartPoint.setValue(50., 0.)
163 anArc1EndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcEndPoint"))
164 anArc1EndPoint.setValue(0., 50.)
165 aSession.finishOperation()
166 # Arc 2
167 aSession.startOperation()
168 aSketchArc2 = aSketchFeature.addFeature("SketchArc")
169 aSketchArc2.string("ArcType").setValue("ThreePoints")
170 anArc2Centr = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter"))
171 anArc2StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint"))
172 anArc2StartPoint.setValue(0., 50.)
173 anArc2EndPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcEndPoint"))
174 anArc2EndPoint.setValue(-50., 0.)
175 anArc2PassedPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcPassedPoint"))
176 anArc2PassedPoint.setValue(-40., 40.)
177 aSession.finishOperation()
178 #=========================================================================
179 # Link points of arcs by the coincidence constraint
180 #=========================================================================
181 aSession.startOperation()
182 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
183 reflistA = aConstraint.refattr("ConstraintEntityA")
184 reflistB = aConstraint.refattr("ConstraintEntityB")
185 reflistA.setAttr(anArc1EndPoint)
186 reflistB.setAttr(anArc2StartPoint)
187 aConstraint.execute()
188 aSession.finishOperation()
189 #=========================================================================
190 # Add tangency constraint and check correctness
191 #=========================================================================
192 aSession.startOperation()
193 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
194 aRefObjectA = aTangency.refattr("ConstraintEntityA")
195 aRefObjectB = aTangency.refattr("ConstraintEntityB")
196 anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult())
197 anObjectB = modelAPI_ResultConstruction(aSketchArc2.lastResult())
198 assert (anObjectA is not None)
199 assert (anObjectB is not None)
200 aRefObjectA.setObject(anObjectA)
201 aRefObjectB.setObject(anObjectB)
202 aTangency.execute()
203 aSession.finishOperation()
204 anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x()
205 anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y()
206 aLen = math.sqrt(anArc1VecX**2 + anArc1VecY**2)
207 anArc2VecX = anArc2StartPoint.x() - anArc2Centr.x()
208 anArc2VecY = anArc2StartPoint.y() - anArc2Centr.y()
209 aLen = aLen * math.sqrt(anArc2VecX**2 + anArc2VecY**2)
210 aCross = anArc1VecX * anArc2VecY - anArc1VecY * anArc2VecX
211 assert math.fabs(aCross) <= 2.e-6 * aLen, "Observed cross product: {0}".format(aCross)
212
213 #=========================================================================
214 # TEST 3. Tangency between non-connected objects should be wrong
215 #=========================================================================
216 # Store data
217 aLine2StartPointPrev = (aLine2StartPoint.x(), aLine2StartPoint.y())
218 aLine2EndPointPrev = (aLine2EndPoint.x(), aLine2EndPoint.y())
219 anArc2CenterPrev = (anArc2Centr.x(), anArc2Centr.y())
220 anArc2StartPointPrev = (anArc2StartPoint.x(), anArc2StartPoint.y())
221 anArc2EndPointPrev = (anArc2EndPoint.x(), anArc2EndPoint.y())
222 #=========================================================================
223 # Add tangency between arc2 and line2
224 #=========================================================================
225 aSession.startOperation()
226 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
227 aRefObjectA = aTangency.refattr("ConstraintEntityA")
228 aRefObjectB = aTangency.refattr("ConstraintEntityB")
229 anObjectA = modelAPI_ResultConstruction(aSketchArc2.lastResult())
230 anObjectB = modelAPI_ResultConstruction(aSketchLine2.firstResult())
231 assert (anObjectA is not None)
232 assert (anObjectB is not None)
233 aRefObjectA.setObject(anObjectA)
234 aRefObjectB.setObject(anObjectB)
235 aTangency.execute()
236 aSession.finishOperation()
237 # Check that nothing is changed
238 aLine2StartPointNew = (aLine2StartPoint.x(), aLine2StartPoint.y())
239 aLine2EndPointNew = (aLine2EndPoint.x(), aLine2EndPoint.y())
240 anArc2CenterNew = (anArc2Centr.x(), anArc2Centr.y())
241 anArc2StartPointNew = (anArc2StartPoint.x(), anArc2StartPoint.y())
242 anArc2EndPointNew = (anArc2EndPoint.x(), anArc2EndPoint.y())
243 assert(aLine2StartPointNew == aLine2StartPointPrev)
244 assert(aLine2EndPointNew == aLine2EndPointPrev)
245 assert(anArc2CenterNew == anArc2CenterPrev)
246 assert(anArc2StartPointNew == anArc2StartPointPrev)
247 assert(anArc2EndPointNew == anArc2EndPointPrev)
248 aSession.startOperation()
249 aSketchFeature.removeFeature(aTangency)
250 aSession.finishOperation()
251
252 #=========================================================================
253 # TEST 4. Creating of tangency arc by the option of the SketchArc feature
254 #=========================================================================
255 aSession.startOperation()
256 aSketchArc3 = aSketchFeature.addFeature("SketchArc")
257 aSketchArc3.string("ArcType").setValue("Tangent")
258 anArc3Start = aSketchArc3.refattr("ArcTangentPoint")
259 anArc3Start.setAttr(anArc1StartPoint)
260 anArc3EndPoint = geomDataAPI_Point2D(aSketchArc3.attribute("ArcEndPoint"))
261 anArc3EndPoint.setValue(100., 0.)
262 aSession.finishOperation()
263 anArc3Center = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter"))
264 anArc3StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint"))
265
266 anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x()
267 anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y()
268 aLen = math.sqrt(anArc1VecX**2 + anArc1VecY**2)
269 anArc3VecX = anArc3StartPoint.x() - anArc3Center.x()
270 anArc3VecY = anArc3StartPoint.y() - anArc3Center.y()
271 aLen = aLen * math.sqrt(anArc3VecX**2 + anArc3VecY**2)
272 aCross = anArc1VecX * anArc3VecY - anArc1VecY * anArc3VecX
273 assert math.fabs(aCross) <= 2.e-6 * aLen, "Observed cross product: {0}".format(aCross)
274
275 #=========================================================================
276 # TEST 5. Creating of tangency between line and circle
277 #=========================================================================
278 aSession.startOperation()
279 aLine = aSketchFeature.addFeature("SketchLine")
280 aLineStart = geomDataAPI_Point2D(aLine.attribute("StartPoint"))
281 aLineEnd = geomDataAPI_Point2D(aLine.attribute("EndPoint"))
282 aLineStart.setValue(100., 100.)
283 aLineEnd.setValue(200., 200.)
284 aCircle = aSketchFeature.addFeature("SketchCircle")
285 aCircleCenter = geomDataAPI_Point2D(aCircle.attribute("CircleCenter"))
286 aCircleRadius = aCircle.real("CircleRadius")
287 aCircleCenter.setValue(150., 100.)
288 aCircleRadius.setValue(20.)
289 aSession.finishOperation()
290
291 aSession.startOperation()
292 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
293 aRefObjectA = aTangency.refattr("ConstraintEntityA")
294 aRefObjectB = aTangency.refattr("ConstraintEntityB")
295 anObjectA = modelAPI_ResultConstruction(aLine.lastResult())
296 anObjectB = modelAPI_ResultConstruction(aCircle.lastResult())
297 assert (anObjectA is not None)
298 assert (anObjectB is not None)
299 aRefObjectA.setObject(anObjectA)
300 aRefObjectB.setObject(anObjectB)
301 aTangency.execute()
302 aSession.finishOperation()
303
304 assert(math.fabs(distancePointLine(aCircleCenter, aLine) - round(aCircleRadius.value(), 5)) < 1.e-10)
305 #=========================================================================
306 # End of test
307 #=========================================================================
308
309 import model
310 assert(model.checkPythonDump())