Salome HOME
Unit tests:
[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 aSession = ModelAPI_Session.get()
22 aDocument = aSession.moduleDocument()
23 #=========================================================================
24 # Creation of a sketch
25 #=========================================================================
26 aSession.startOperation()
27 aSketchCommonFeature = aDocument.addFeature("Sketch")
28 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
29 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
30 origin.setValue(0, 0, 0)
31 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
32 dirx.setValue(1, 0, 0)
33 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
34 norm.setValue(0, 0, 1)
35 aSession.finishOperation()
36 #=========================================================================
37 # TEST 1. Arc-line tangency
38 #=========================================================================
39 # Creation of an arc and two lines
40 #=========================================================================
41 # Arc
42 aSession.startOperation()
43 aSketchArc1 = aSketchFeature.addFeature("SketchArc")
44 anArcCentr = geomDataAPI_Point2D(aSketchArc1.attribute("ArcCenter"))
45 anArcCentr.setValue(10., 10.)
46 anArcStartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcStartPoint"))
47 anArcStartPoint.setValue(0., 50.)
48 anArcEndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcEndPoint"))
49 anArcEndPoint.setValue(50., 0.)
50 aSession.finishOperation()
51 # Line 1
52 aSession.startOperation()
53 aSketchLine1 = aSketchFeature.addFeature("SketchLine")
54 aLine1StartPoint = geomDataAPI_Point2D(aSketchLine1.attribute("StartPoint"))
55 aLine1EndPoint = geomDataAPI_Point2D(aSketchLine1.attribute("EndPoint"))
56 aLine1StartPoint.setValue(0., 50.)
57 aLine1EndPoint.setValue(0., 100.)
58 aSession.finishOperation()
59 # Line 2
60 aSession.startOperation()
61 aSketchLine2 = aSketchFeature.addFeature("SketchLine")
62 aLine2StartPoint = geomDataAPI_Point2D(aSketchLine2.attribute("StartPoint"))
63 aLine2EndPoint = geomDataAPI_Point2D(aSketchLine2.attribute("EndPoint"))
64 aLine2StartPoint.setValue(50., 0.)
65 aLine2EndPoint.setValue(100., 0.)
66 aSession.finishOperation()
67 #=========================================================================
68 # Link arc points and lines points by the coincidence constraint
69 #=========================================================================
70 aSession.startOperation()
71 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
72 reflistA = aConstraint.refattr("ConstraintEntityA")
73 reflistB = aConstraint.refattr("ConstraintEntityB")
74 reflistA.setAttr(anArcStartPoint)
75 reflistB.setAttr(aLine1StartPoint)
76 aConstraint.execute()
77 aSession.finishOperation()
78 aSession.startOperation()
79 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
80 reflistA = aConstraint.refattr("ConstraintEntityA")
81 reflistB = aConstraint.refattr("ConstraintEntityB")
82 reflistA.setAttr(anArcEndPoint)
83 reflistB.setAttr(aLine2StartPoint)
84 aConstraint.execute()
85 aSession.finishOperation()
86 #=========================================================================
87 # Add tangency constraint and check correctness
88 #=========================================================================
89 aSession.startOperation()
90 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
91 aRefObjectA = aTangency.refattr("ConstraintEntityA")
92 aRefObjectB = aTangency.refattr("ConstraintEntityB")
93 anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult())
94 anObjectB = modelAPI_ResultConstruction(aSketchLine1.firstResult())
95 assert (anObjectA is not None)
96 assert (anObjectB is not None)
97 aRefObjectA.setObject(anObjectA)
98 aRefObjectB.setObject(anObjectB)
99 aTangency.execute()
100 aSession.finishOperation()
101 anArcVecX = anArcStartPoint.x() - anArcCentr.x()
102 anArcVecY = anArcStartPoint.y() - anArcCentr.y()
103 aLen = math.sqrt(anArcVecX**2 + anArcVecY**2)
104 aLineVecX = aLine1EndPoint.x() - aLine1StartPoint.x()
105 aLineVecY = aLine1EndPoint.y() - aLine1StartPoint.y()
106 aLen = aLen * math.sqrt(aLineVecX**2 + aLineVecY**2)
107 aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY
108 assert math.fabs(aDot) <= 2.e-6 * aLen, "Observed dot product: {0}".format(aDot)
109 #=========================================================================
110 # Add tangency constraint for arc and second line and check correctness
111 #=========================================================================
112 aSession.startOperation()
113 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
114 aRefObjectA = aTangency.refattr("ConstraintEntityA")
115 aRefObjectB = aTangency.refattr("ConstraintEntityB")
116 anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult())
117 anObjectB = modelAPI_ResultConstruction(aSketchLine2.firstResult())
118 assert (anObjectA is not None)
119 assert (anObjectB is not None)
120 aRefObjectA.setObject(anObjectA)
121 aRefObjectB.setObject(anObjectB)
122 aTangency.execute()
123 aSession.finishOperation()
124 anArcVecX = anArcEndPoint.x() - anArcCentr.x()
125 anArcVecY = anArcEndPoint.y() - anArcCentr.y()
126 aLen = math.sqrt(anArcVecX**2 + anArcVecY**2)
127 aLineVecX = aLine2EndPoint.x() - aLine2StartPoint.x()
128 aLineVecY = aLine2EndPoint.y() - aLine2StartPoint.y()
129 aLen = aLen * math.sqrt(aLineVecX**2 + aLineVecY**2)
130 aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY
131 assert math.fabs(aDot) <= 2.e-6 * aLen, "Observed dot product: {0}".format(aDot)
132
133 #=========================================================================
134 # TEST 2. Arc-arc tangency
135 #=========================================================================
136 # Creation of arcs
137 #=========================================================================
138 # Arc 1
139 aSession.startOperation()
140 aSketchArc1 = aSketchFeature.addFeature("SketchArc")
141 anArc1Centr = geomDataAPI_Point2D(aSketchArc1.attribute("ArcCenter"))
142 anArc1Centr.setValue(10., 10.)
143 anArc1StartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcStartPoint"))
144 anArc1StartPoint.setValue(50., 0.)
145 anArc1EndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcEndPoint"))
146 anArc1EndPoint.setValue(0., 50.)
147 aSession.finishOperation()
148 # Arc 2
149 aSession.startOperation()
150 aSketchArc2 = aSketchFeature.addFeature("SketchArc")
151 aSketchArc2.string("ArcType").setValue("ThreePoints")
152 anArc2Centr = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter"))
153 anArc2StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint"))
154 anArc2StartPoint.setValue(0., 50.)
155 anArc2EndPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcEndPoint"))
156 anArc2EndPoint.setValue(-50., 0.)
157 anArc2PassedPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcPassedPoint"))
158 anArc2PassedPoint.setValue(-40., 40.)
159 aSession.finishOperation()
160 #=========================================================================
161 # Link points of arcs by the coincidence constraint
162 #=========================================================================
163 aSession.startOperation()
164 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
165 reflistA = aConstraint.refattr("ConstraintEntityA")
166 reflistB = aConstraint.refattr("ConstraintEntityB")
167 reflistA.setAttr(anArc1EndPoint)
168 reflistB.setAttr(anArc2StartPoint)
169 aConstraint.execute()
170 aSession.finishOperation()
171 #=========================================================================
172 # Add tangency constraint and check correctness
173 #=========================================================================
174 aSession.startOperation()
175 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
176 aRefObjectA = aTangency.refattr("ConstraintEntityA")
177 aRefObjectB = aTangency.refattr("ConstraintEntityB")
178 anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult())
179 anObjectB = modelAPI_ResultConstruction(aSketchArc2.lastResult())
180 assert (anObjectA is not None)
181 assert (anObjectB is not None)
182 aRefObjectA.setObject(anObjectA)
183 aRefObjectB.setObject(anObjectB)
184 aTangency.execute()
185 aSession.finishOperation()
186 anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x()
187 anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y()
188 aLen = math.sqrt(anArc1VecX**2 + anArc1VecY**2)
189 anArc2VecX = anArc2StartPoint.x() - anArc2Centr.x()
190 anArc2VecY = anArc2StartPoint.y() - anArc2Centr.y()
191 aLen = aLen * math.sqrt(anArc2VecX**2 + anArc2VecY**2)
192 aCross = anArc1VecX * anArc2VecY - anArc1VecY * anArc2VecX
193 assert math.fabs(aCross) <= 2.e-6 * aLen, "Observed cross product: {0}".format(aCross)
194
195 #=========================================================================
196 # TEST 3. Tangency between non-connected objects should be wrong
197 #=========================================================================
198 # Store data
199 aLine2StartPointPrev = (aLine2StartPoint.x(), aLine2StartPoint.y())
200 aLine2EndPointPrev = (aLine2EndPoint.x(), aLine2EndPoint.y())
201 anArc2CenterPrev = (anArc2Centr.x(), anArc2Centr.y())
202 anArc2StartPointPrev = (anArc2StartPoint.x(), anArc2StartPoint.y())
203 anArc2EndPointPrev = (anArc2EndPoint.x(), anArc2EndPoint.y())
204 #=========================================================================
205 # Add tangency between arc2 and line2
206 #=========================================================================
207 aSession.startOperation()
208 aTangency = aSketchFeature.addFeature("SketchConstraintTangent")
209 aRefObjectA = aTangency.refattr("ConstraintEntityA")
210 aRefObjectB = aTangency.refattr("ConstraintEntityB")
211 anObjectA = modelAPI_ResultConstruction(aSketchArc2.lastResult())
212 anObjectB = modelAPI_ResultConstruction(aSketchLine2.firstResult())
213 assert (anObjectA is not None)
214 assert (anObjectB is not None)
215 aRefObjectA.setObject(anObjectA)
216 aRefObjectB.setObject(anObjectB)
217 aTangency.execute()
218 aSession.finishOperation()
219 # Check that nothing is changed
220 aLine2StartPointNew = (aLine2StartPoint.x(), aLine2StartPoint.y())
221 aLine2EndPointNew = (aLine2EndPoint.x(), aLine2EndPoint.y())
222 anArc2CenterNew = (anArc2Centr.x(), anArc2Centr.y())
223 anArc2StartPointNew = (anArc2StartPoint.x(), anArc2StartPoint.y())
224 anArc2EndPointNew = (anArc2EndPoint.x(), anArc2EndPoint.y())
225 assert(aLine2StartPointNew == aLine2StartPointPrev)
226 assert(aLine2EndPointNew == aLine2EndPointPrev)
227 assert(anArc2CenterNew == anArc2CenterPrev)
228 assert(anArc2StartPointNew == anArc2StartPointPrev)
229 assert(anArc2EndPointNew == anArc2EndPointPrev)
230 aSession.startOperation()
231 aSketchFeature.removeFeature(aTangency)
232 aSession.finishOperation()
233
234 #=========================================================================
235 # TEST 4. Creating of tangency arc by the option of the SketchArc feature
236 #=========================================================================
237 aSession.startOperation()
238 aSketchArc3 = aSketchFeature.addFeature("SketchArc")
239 aSketchArc3.string("ArcType").setValue("Tangent")
240 anArc3Start = aSketchArc3.refattr("ArcTangentPoint")
241 anArc3Start.setAttr(anArc1StartPoint)
242 anArc3EndPoint = geomDataAPI_Point2D(aSketchArc3.attribute("ArcEndPoint"))
243 anArc3EndPoint.setValue(100., 0.)
244 aSession.finishOperation()
245 anArc3Center = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter"))
246 anArc3StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint"))
247
248 anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x()
249 anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y()
250 aLen = math.sqrt(anArc1VecX**2 + anArc1VecY**2)
251 anArc3VecX = anArc3StartPoint.x() - anArc3Center.x()
252 anArc3VecY = anArc3StartPoint.y() - anArc3Center.y()
253 aLen = aLen * math.sqrt(anArc3VecX**2 + anArc3VecY**2)
254 aCross = anArc1VecX * anArc3VecY - anArc1VecY * anArc3VecX
255 assert math.fabs(aCross) <= 2.e-6 * aLen, "Observed cross product: {0}".format(aCross)
256 #=========================================================================
257 # End of test
258 #=========================================================================