Salome HOME
Unit tests fixes related to python swigged lists iteration
[modules/shaper.git] / src / SketchPlugin / Test / TestCreateArc.py
1 """
2     TestCreateArc.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
13 #=========================================================================
14 # Initialization of the test
15 #=========================================================================
16 from GeomDataAPI import *
17 from ModelAPI import *
18 import math
19
20 __updated__ = "2014-10-28"
21
22
23 #=========================================================================
24 # Auxiliary functions
25 #=========================================================================
26
27 def angle(theCenter, theFirst, theLast):
28     """
29     subroutine to calculate angle given by 3 points
30     """
31     aDirX1 = theFirst.x() - theCenter.x()
32     aDirY1 = theFirst.y() - theCenter.y()
33     aLen1 = math.hypot(aDirX1, aDirY1)
34     aDirX2 = theLast.x() - theCenter.x()
35     aDirY2 = theLast.y() - theCenter.y()
36     aLen2 = math.hypot(aDirX2, aDirY2)
37     aDot = aDirX1 * aDirX2 + aDirY1 * aDirY2
38     anAngle = math.acos(aDot / aLen1 / aLen2)
39     return round(anAngle * 180. / math.pi, 6)
40
41 def distancePointPoint(thePointA, thePointB):
42     """
43     subroutine to calculate distance between two points
44     result of calculated distance is has 10**-5 precision
45     """
46     xdiff = math.pow((thePointA.x() - thePointB.x()), 2)
47     ydiff = math.pow((thePointA.y() - thePointB.y()), 2)
48     return round(math.sqrt(xdiff + ydiff), 5)
49
50 def dot(thePoint11, thePoint12, thePoint21, thePoint22):
51     """
52     subroutine to calculate dit product between lines given by their points
53     """
54     aDirX1 = thePoint12.x() - thePoint11.x()
55     aDirY1 = thePoint12.y() - thePoint11.y()
56     aLen1 = math.hypot(aDirX1, aDirY1)
57     aDirX2 = thePoint22.x() - thePoint21.x()
58     aDirY2 = thePoint22.y() - thePoint21.y()
59     aLen2 = math.hypot(aDirX2, aDirY2)
60     aDot = aDirX1 * aDirX2 + aDirY1 * aDirY2
61     return aDot / aLen1 / aLen2
62
63
64 aSession = ModelAPI_Session.get()
65 aDocument = aSession.moduleDocument()
66 #=========================================================================
67 # Creation of a sketch
68 #=========================================================================
69 aSession.startOperation()
70 #aSketchFeature = aDocument.addFeature("Sketch")
71 aSketchCommonFeature = aDocument.addFeature("Sketch")
72 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
73 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
74 origin.setValue(0, 0, 0)
75 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
76 dirx.setValue(1, 0, 0)
77 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
78 norm.setValue(0, 0, 1)
79 aSession.finishOperation()
80 #=========================================================================
81 # Creation of an arc
82 # 1. Test SketchPlugin_Arc attributes
83 # 2.
84 #=========================================================================
85 aSession.startOperation()
86 aSketchReflist = aSketchFeature.reflist("Features")
87 assert (not aSketchReflist.isInitialized())
88 assert (aSketchReflist.size() == 0)
89 assert (len(aSketchReflist.list()) == 0)
90 aSketchArc = aSketchFeature.addFeature("SketchArc")
91 assert (aSketchArc.getKind() == "SketchArc")
92 anArcCentr = geomDataAPI_Point2D(aSketchArc.attribute("ArcCenter"))
93 assert (not anArcCentr.isInitialized())
94 anArcCentr.setValue(10., 10.)
95 anArcStartPoint = geomDataAPI_Point2D(
96     aSketchArc.attribute("ArcStartPoint"))
97 assert (not anArcStartPoint.isInitialized())
98 anArcStartPoint.setValue(0., 50.)
99 anArcEndPoint = geomDataAPI_Point2D(aSketchArc.attribute("ArcEndPoint"))
100 assert (not anArcEndPoint.isInitialized())
101 anArcEndPoint.setValue(50., 0.)
102 aSession.finishOperation()
103 # check that values have been changed
104 aSketchReflist = aSketchFeature.reflist("Features")
105 assert (aSketchReflist.size() == 1)
106 assert (len(aSketchReflist.list()) == 1)
107 assert (anArcCentr.x() == 10.0)
108 assert (anArcCentr.y() == 10.0)
109 assert (anArcStartPoint.x() == 0.0)
110 assert (anArcStartPoint.y() == 50.0)
111 assert (anArcEndPoint.x() == 50.0)
112 assert (anArcEndPoint.y() == 0.0)
113 #=========================================================================
114 # Edit the arc:
115 # 1. Move whole arc
116 # 2. Change the start point
117 # 3. Change the radius of arc
118 # 4. Change arc's angle
119 #=========================================================================
120 aSession.startOperation()
121 deltaX, deltaY = 5., 10.
122 anArcCentr.setValue(anArcCentr.x() + deltaX, anArcCentr.y() + deltaY)
123 aSession.finishOperation()
124 assert (anArcCentr.x() == 15)
125 assert (anArcCentr.y() == 20)
126 assert (math.fabs(distancePointPoint(anArcCentr, anArcStartPoint) - distancePointPoint(anArcCentr, anArcEndPoint)) < 1.e-10)
127 # Change the start point
128 aSession.startOperation()
129 anArcStartPoint.setValue(anArcStartPoint.x() + deltaX, anArcStartPoint.y())
130 aSession.finishOperation()
131 assert (math.fabs(distancePointPoint(anArcCentr, anArcStartPoint) - distancePointPoint(anArcCentr, anArcEndPoint)) < 1.e-10)
132 # Change radius
133 RADIUS = 50
134 aSession.startOperation()
135 anArcRadius = aSketchArc.real("ArcRadius")
136 anArcRadius.setValue(RADIUS)
137 aSession.finishOperation()
138 assert (math.fabs(distancePointPoint(anArcCentr, anArcStartPoint) - RADIUS) < 1.e-10)
139 assert (math.fabs(distancePointPoint(anArcCentr, anArcEndPoint) - RADIUS) < 1.e-10)
140 # Change angle
141 ANGLE = 120
142 aSession.startOperation()
143 anArcAngle = aSketchArc.real("ArcAngle")
144 anArcAngle.setValue(ANGLE)
145 aSession.finishOperation()
146 assert (math.fabs(angle(anArcCentr, anArcStartPoint, anArcEndPoint) - ANGLE) < 1.e-7)
147 #=========================================================================
148 # Check results of the Arc
149 #=========================================================================
150 aResult = aSketchArc.firstResult()
151 aResultConstruction = modelAPI_ResultConstruction(aResult)
152 aShape = aResultConstruction.shape()
153 assert (aShape is not None)
154 assert (not aShape.isNull())
155 #=========================================================================
156 # Create an arc, tangent to the line
157 #=========================================================================
158 aSession.startOperation()
159 aSketchLine = aSketchFeature.addFeature("SketchLine")
160 aLineStart = geomDataAPI_Point2D(aSketchLine.attribute("StartPoint"))
161 aLineEnd = geomDataAPI_Point2D(aSketchLine.attribute("EndPoint"))
162 aLineStart.setValue(0., 0.)
163 aLineEnd.setValue(50., 0.)
164 aSession.finishOperation()
165 aSession.startOperation()
166 aFixed = aSketchFeature.addFeature("SketchConstraintRigid")
167 aRefObjectA = aFixed.refattr("ConstraintEntityA")
168 aRefObjectA.setObject(modelAPI_ResultConstruction(aSketchLine.lastResult()))
169 aFixed.execute()
170 aSession.finishOperation()
171 aSession.startOperation()
172 aSketchArcTangent = aSketchFeature.addFeature("SketchArc")
173 aSketchArcTangent.string("ArcType").setValue("Tangent")
174 anArcEndPoint = geomDataAPI_Point2D(aSketchArcTangent.attribute("ArcEndPoint"))
175 aTangent = aSketchArcTangent.refattr("ArcTangentPoint")
176 aTangent.setAttr(aLineEnd)
177 anArcEndPoint.setValue(51., 1.)
178 aSession.finishOperation()
179 aSession.startOperation()
180 anArcEndPoint.setValue(100., 25.)
181 aSession.finishOperation()
182 anArcCenter = geomDataAPI_Point2D(aSketchArcTangent.attribute("ArcCenter"))
183 aDot = dot(anArcCenter, aLineEnd, aLineStart, aLineEnd)
184 assert math.fabs(aDot) <= 2.e-4, "Observed dot product: {0}".format(aDot)
185 #=========================================================================
186 # Create an arc, tangent to the previous arc
187 #=========================================================================
188 aSession.startOperation()
189 aSketchArcTangent2 = aSketchFeature.addFeature("SketchArc")
190 aSketchArcTangent2.string("ArcType").setValue("Tangent")
191 anArcEndPoint2 = geomDataAPI_Point2D(aSketchArcTangent2.attribute("ArcEndPoint"))
192 aTangent = aSketchArcTangent2.refattr("ArcTangentPoint")
193 aTangent.setAttr(anArcEndPoint)
194 anArcEndPoint2.setValue(50., 150.)
195 aSession.finishOperation()
196 #=========================================================================
197 # End of test
198 #=========================================================================
199
200 from salome.shaper import model
201 assert(model.checkPythonDump())