2 TestConstraintCoincidence.py
3 Unit test of SketchPlugin_ConstraintCoincidence class
5 SketchPlugin_Constraint
6 static const std::string MY_CONSTRAINT_VALUE("ConstraintValue");
7 static const std::string MY_FLYOUT_VALUE_PNT("ConstraintFlyoutValuePnt");
8 static const std::string MY_ENTITY_A("ConstraintEntityA");
9 static const std::string MY_ENTITY_B("ConstraintEntityB");
10 static const std::string MY_ENTITY_C("ConstraintEntityC");
11 static const std::string MY_ENTITY_D("ConstraintEntityD");
13 SketchPlugin_ConstraintCoincidence
14 static const std::string MY_CONSTRAINT_COINCIDENCE_ID("SketchConstraintCoincidence");
15 data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
16 data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
19 from GeomDataAPI import *
20 from ModelAPI import *
22 #=========================================================================
23 # Initialization of the test
24 #=========================================================================
26 __updated__ = "2014-10-28"
30 #=========================================================================
32 #=========================================================================
33 def checkPointOnLine(point, line):
34 aStart = geomDataAPI_Point2D(line.attribute("StartPoint"))
35 aEnd = geomDataAPI_Point2D(line.attribute("EndPoint"))
36 aDirX = aEnd.x() - aStart.x()
37 aDirY = aEnd.y() - aStart.y()
38 aVecX = point.x() - aStart.x()
39 aVecY = point.y() - aStart.y()
40 assert (math.fabs(aDirX * aVecY - aDirY * aVecX) <= TOLERANCE)
42 def checkPointOnCircle(point, circle):
43 aCenter = geomDataAPI_Point2D(circle.attribute("CircleCenter"))
44 aRadius = circle.real("CircleRadius").value()
45 aDist = math.hypot(point.x() - aCenter.x(), point.y() - aCenter.y())
46 assert (math.fabs(aDist - aRadius) <= TOLERANCE)
48 def checkPointOnArc(point, arc):
49 aStart = geomDataAPI_Point2D(arc.attribute("ArcStartPoint"))
50 aCenter = geomDataAPI_Point2D(arc.attribute("ArcCenter"))
51 aRadius = math.hypot(aStart.x() - aCenter.x(), aStart.y() - aCenter.y())
52 aDist = math.hypot(point.x() - aCenter.x(), point.y() - aCenter.y())
53 assert (math.fabs(aDist - aRadius) <= TOLERANCE)
56 #=========================================================================
58 #=========================================================================
59 aSession = ModelAPI_Session.get()
60 aDocument = aSession.moduleDocument()
62 aSession.startOperation()
63 aFeature = aDocument.addFeature("Point")
64 # aFeature.string("creation_method").setValue("by_xyz")
65 aFeature.real("x").setValue(0.)
66 aFeature.real("y").setValue(0.)
67 aFeature.real("z").setValue(0.)
68 anOriginName = aFeature.name()
69 aSession.finishOperation()
70 #=========================================================================
71 # Creation of a sketch
72 #=========================================================================
73 aSession.startOperation()
74 aSketchFeature = featureToCompositeFeature(aDocument.addFeature("Sketch"))
75 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
76 origin.setValue(0, 0, 0)
77 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
78 dirx.setValue(1, 0, 0)
79 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
80 norm.setValue(0, 0, 1)
81 aSession.finishOperation()
82 #=========================================================================
83 # Create a line and an arc
84 #=========================================================================
85 aSession.startOperation()
86 aSketchArc = aSketchFeature.addFeature("SketchArc")
87 anArcCentr = geomDataAPI_Point2D(aSketchArc.attribute("ArcCenter"))
88 anArcStartPoint = geomDataAPI_Point2D(
89 aSketchArc.attribute("ArcStartPoint"))
90 anArcEndPoint = geomDataAPI_Point2D(aSketchArc.attribute("ArcEndPoint"))
91 anArcCentr.setValue(10., 10.)
92 anArcStartPoint.setValue(0., 50.)
93 anArcEndPoint.setValue(50., 0.)
94 aSketchLine = aSketchFeature.addFeature("SketchLine")
95 aLineStartPoint = geomDataAPI_Point2D(aSketchLine.attribute("StartPoint"))
96 aLineEndPoint = geomDataAPI_Point2D(aSketchLine.attribute("EndPoint"))
97 # Lets initialize line start at circle's end:
98 aLineStartPoint.setValue(50., 0.)
99 aLineEndPoint.setValue(100., 25.)
100 aSession.finishOperation()
101 #=========================================================================
102 # Link arc's end and line's start points with concidence constraint
103 #=========================================================================
104 aSession.startOperation()
105 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
106 reflistA = aConstraint.refattr("ConstraintEntityA")
107 reflistB = aConstraint.refattr("ConstraintEntityB")
108 reflistA.setAttr(anArcEndPoint)
109 reflistB.setAttr(aLineStartPoint)
110 aConstraint.execute()
111 aSession.finishOperation()
112 #=========================================================================
113 # Check values and move one constrainted object
114 #=========================================================================
115 assert (anArcEndPoint.x() == 50)
116 assert (anArcEndPoint.y() == 0)
117 assert (aLineStartPoint.x() == 50)
118 assert (aLineStartPoint.y() == 0)
119 deltaX = deltaY = 40.
121 aSession.startOperation()
122 aLineStartPoint.setValue(aLineStartPoint.x() + deltaX,
123 aLineStartPoint.y() + deltaY)
124 aLineEndPoint.setValue(aLineEndPoint.x() + deltaX,
125 aLineEndPoint.y() + deltaY)
126 aSession.finishOperation()
127 # check that arc's points are moved also
128 assert (anArcEndPoint.x() == aLineStartPoint.x())
129 assert (anArcEndPoint.y() == aLineStartPoint.y())
130 #=========================================================================
131 # Remove coincidence and move the line
132 #=========================================================================
133 aSession.startOperation()
134 aDocument.removeFeature(aConstraint)
135 aSession.finishOperation()
136 aSession.startOperation()
137 aLineStartPoint.setValue(70., 0.)
138 aSession.finishOperation()
139 assert (anArcEndPoint.x() != aLineStartPoint.x() or anArcEndPoint.y() != aLineStartPoint.y())
141 #=========================================================================
142 # Add constraint point-on-line
143 #=========================================================================
144 aSession.startOperation()
145 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
146 reflistA = aConstraint.refattr("ConstraintEntityA")
147 reflistB = aConstraint.refattr("ConstraintEntityB")
148 reflistA.setAttr(anArcStartPoint)
149 reflistB.setObject(aSketchLine.lastResult())
150 aConstraint.execute()
151 aSession.finishOperation()
152 checkPointOnLine(anArcStartPoint, aSketchLine)
153 #=========================================================================
154 # Add constraint point-on-circle
155 #=========================================================================
156 aSession.startOperation()
157 # create circle with center coincident with origin
158 aSketchCircle = aSketchFeature.addFeature("SketchCircle")
159 aCircleCenter = geomDataAPI_Point2D(aSketchCircle.attribute("CircleCenter"))
160 aCircleRadius = aSketchCircle.real("CircleRadius")
161 aCircleCenter.setValue(10., 10.)
162 aCircleRadius.setValue(25.)
163 aSession.finishOperation()
165 aSession.startOperation()
166 anOrigRes = modelAPI_Result(aDocument.objectByName("Construction", anOriginName))
168 anOrigShape = anOrigRes.shape()
170 anOrigin = aSketchFeature.addFeature("SketchPoint")
171 anOriginCoord = geomDataAPI_Point2D(anOrigin.attribute("PointCoordindates"))
172 anOriginCoord.setValue(0., 0.)
173 anOrigin.selection("External").setValue(anOrigRes, anOrigShape)
174 aSession.finishOperation()
175 # coincidence between center of circle and the origin
176 aSession.startOperation()
177 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
178 reflistA = aConstraint.refattr("ConstraintEntityA")
179 reflistB = aConstraint.refattr("ConstraintEntityB")
180 reflistA.setAttr(aCircleCenter)
181 reflistB.setObject(anOrigin.lastResult())
182 aSession.finishOperation()
184 aSession.startOperation()
185 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
186 reflistA = aConstraint.refattr("ConstraintEntityA")
187 reflistB = aConstraint.refattr("ConstraintEntityB")
188 reflistA.setObject(aSketchCircle.lastResult())
189 reflistB.setAttr(aLineEndPoint)
190 aConstraint.execute()
191 aSession.finishOperation()
192 checkPointOnCircle(aLineEndPoint, aSketchCircle)
193 #=========================================================================
194 # Add constraint point-on-arc
195 #=========================================================================
196 aSession.startOperation("constraint point-on-arc")
197 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
198 reflistA = aConstraint.refattr("ConstraintEntityA")
199 reflistB = aConstraint.refattr("ConstraintEntityB")
200 reflistA.setAttr(aCircleCenter)
201 reflistB.setObject(aSketchArc.lastResult())
202 aConstraint.execute()
203 aSession.finishOperation()
204 checkPointOnArc(aCircleCenter, aSketchArc)
205 #=========================================================================
206 # Check center of circle is still in origin
207 #=========================================================================
208 assert (aCircleCenter.x() == 0. and aCircleCenter.y() == 0.)
209 #=========================================================================
211 #=========================================================================
214 assert(model.checkPythonDump())