X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FTest%2FTestConstraintTangent.py;h=24762159ff842198eddc5b244a3465dc5c5e6ac4;hb=7fca439ab3557d95daaa0cd72a29ecaa8a3802cc;hp=225447d3e308b50644dc17e06804fae0d1d38537;hpb=f60865d3a392bb23530a2f59532c4701d318e0d6;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/Test/TestConstraintTangent.py b/src/SketchPlugin/Test/TestConstraintTangent.py index 225447d3e..24762159f 100644 --- a/src/SketchPlugin/Test/TestConstraintTangent.py +++ b/src/SketchPlugin/Test/TestConstraintTangent.py @@ -18,6 +18,24 @@ import math __updated__ = "2015-03-17" +def distancePointLine(point, line): + """ + subroutine to calculate distance between point and line + result of calculated distance is has 10**-5 precision + """ + aStartPoint = geomDataAPI_Point2D(line.attribute("StartPoint")) + aEndPoint = geomDataAPI_Point2D(line.attribute("EndPoint")) + # orthogonal direction + aDirX = -(aEndPoint.y() - aStartPoint.y()) + aDirY = (aEndPoint.x() - aStartPoint.x()) + aLen = math.sqrt(aDirX**2 + aDirY**2) + aDirX = aDirX / aLen + aDirY = aDirY / aLen + aVecX = point.x() - aStartPoint.x() + aVecY = point.y() - aStartPoint.y() + return round(math.fabs(aVecX * aDirX + aVecY * aDirY), 5) + + aSession = ModelAPI_Session.get() aDocument = aSession.moduleDocument() #========================================================================= @@ -100,10 +118,12 @@ aTangency.execute() aSession.finishOperation() anArcVecX = anArcStartPoint.x() - anArcCentr.x() anArcVecY = anArcStartPoint.y() - anArcCentr.y() +aLen = math.sqrt(anArcVecX**2 + anArcVecY**2) aLineVecX = aLine1EndPoint.x() - aLine1StartPoint.x() aLineVecY = aLine1EndPoint.y() - aLine1StartPoint.y() +aLen = aLen * math.sqrt(aLineVecX**2 + aLineVecY**2) aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY -assert(math.fabs(aDot) <= 1.e-12) +assert math.fabs(aDot) <= 2.e-6 * aLen, "Observed dot product: {0}".format(aDot) #========================================================================= # Add tangency constraint for arc and second line and check correctness #========================================================================= @@ -121,10 +141,12 @@ aTangency.execute() aSession.finishOperation() anArcVecX = anArcEndPoint.x() - anArcCentr.x() anArcVecY = anArcEndPoint.y() - anArcCentr.y() +aLen = math.sqrt(anArcVecX**2 + anArcVecY**2) aLineVecX = aLine2EndPoint.x() - aLine2StartPoint.x() aLineVecY = aLine2EndPoint.y() - aLine2StartPoint.y() +aLen = aLen * math.sqrt(aLineVecX**2 + aLineVecY**2) aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY -assert(math.fabs(aDot) <= 1.e-12) +assert math.fabs(aDot) <= 2.e-6 * aLen, "Observed dot product: {0}".format(aDot) #========================================================================= # TEST 2. Arc-arc tangency @@ -144,12 +166,14 @@ aSession.finishOperation() # Arc 2 aSession.startOperation() aSketchArc2 = aSketchFeature.addFeature("SketchArc") +aSketchArc2.string("ArcType").setValue("ThreePoints") anArc2Centr = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter")) -anArc2Centr.setValue(-10., 10.) anArc2StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint")) anArc2StartPoint.setValue(0., 50.) anArc2EndPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcEndPoint")) anArc2EndPoint.setValue(-50., 0.) +anArc2PassedPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcPassedPoint")) +anArc2PassedPoint.setValue(-40., 40.) aSession.finishOperation() #========================================================================= # Link points of arcs by the coincidence constraint @@ -179,10 +203,12 @@ aTangency.execute() aSession.finishOperation() anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x() anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y() +aLen = math.sqrt(anArc1VecX**2 + anArc1VecY**2) anArc2VecX = anArc2StartPoint.x() - anArc2Centr.x() anArc2VecY = anArc2StartPoint.y() - anArc2Centr.y() +aLen = aLen * math.sqrt(anArc2VecX**2 + anArc2VecY**2) aCross = anArc1VecX * anArc2VecY - anArc1VecY * anArc2VecX -assert(math.fabs(aCross) <= 1.e-12) +assert math.fabs(aCross) <= 2.e-6 * aLen, "Observed cross product: {0}".format(aCross) #========================================================================= # TEST 3. Tangency between non-connected objects should be wrong @@ -219,6 +245,66 @@ assert(aLine2EndPointNew == aLine2EndPointPrev) assert(anArc2CenterNew == anArc2CenterPrev) assert(anArc2StartPointNew == anArc2StartPointPrev) assert(anArc2EndPointNew == anArc2EndPointPrev) +aSession.startOperation() +aDocument.removeFeature(aTangency) +aSession.finishOperation() + +#========================================================================= +# TEST 4. Creating of tangency arc by the option of the SketchArc feature +#========================================================================= +aSession.startOperation() +aSketchArc3 = aSketchFeature.addFeature("SketchArc") +aSketchArc3.string("ArcType").setValue("Tangent") +anArc3Start = aSketchArc3.refattr("ArcTangentPoint") +anArc3Start.setAttr(anArc1StartPoint) +anArc3EndPoint = geomDataAPI_Point2D(aSketchArc3.attribute("ArcEndPoint")) +anArc3EndPoint.setValue(100., 0.) +aSession.finishOperation() +anArc3Center = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter")) +anArc3StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint")) + +anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x() +anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y() +aLen = math.sqrt(anArc1VecX**2 + anArc1VecY**2) +anArc3VecX = anArc3StartPoint.x() - anArc3Center.x() +anArc3VecY = anArc3StartPoint.y() - anArc3Center.y() +aLen = aLen * math.sqrt(anArc3VecX**2 + anArc3VecY**2) +aCross = anArc1VecX * anArc3VecY - anArc1VecY * anArc3VecX +assert math.fabs(aCross) <= 2.e-6 * aLen, "Observed cross product: {0}".format(aCross) + +#========================================================================= +# TEST 5. Creating of tangency between line and circle +#========================================================================= +aSession.startOperation() +aLine = aSketchFeature.addFeature("SketchLine") +aLineStart = geomDataAPI_Point2D(aLine.attribute("StartPoint")) +aLineEnd = geomDataAPI_Point2D(aLine.attribute("EndPoint")) +aLineStart.setValue(100., 100.) +aLineEnd.setValue(200., 200.) +aCircle = aSketchFeature.addFeature("SketchCircle") +aCircleCenter = geomDataAPI_Point2D(aCircle.attribute("CircleCenter")) +aCircleRadius = aCircle.real("CircleRadius") +aCircleCenter.setValue(150., 100.) +aCircleRadius.setValue(20.) +aSession.finishOperation() + +aSession.startOperation() +aTangency = aSketchFeature.addFeature("SketchConstraintTangent") +aRefObjectA = aTangency.refattr("ConstraintEntityA") +aRefObjectB = aTangency.refattr("ConstraintEntityB") +anObjectA = modelAPI_ResultConstruction(aLine.lastResult()) +anObjectB = modelAPI_ResultConstruction(aCircle.lastResult()) +assert (anObjectA is not None) +assert (anObjectB is not None) +aRefObjectA.setObject(anObjectA) +aRefObjectB.setObject(anObjectB) +aTangency.execute() +aSession.finishOperation() + +assert(math.fabs(distancePointLine(aCircleCenter, aLine) - round(aCircleRadius.value(), 5)) < 1.e-10) #========================================================================= # End of test #========================================================================= + +import model +assert(model.checkPythonDump())