X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FTest%2FTestConstraintTangent.py;h=a601d08a8237d789fe067c6cbd9104578fb38896;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=225447d3e308b50644dc17e06804fae0d1d38537;hpb=feaeb677047efcb01c02b861691810750e2b32e1;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/Test/TestConstraintTangent.py b/src/SketchPlugin/Test/TestConstraintTangent.py index 225447d3e..a601d08a8 100644 --- a/src/SketchPlugin/Test/TestConstraintTangent.py +++ b/src/SketchPlugin/Test/TestConstraintTangent.py @@ -1,7 +1,26 @@ +# Copyright (C) 2014-2023 CEA, EDF +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + """ TestConstraintTangent.py Unit test of SketchPlugin_ConstraintTangent class - + SketchPlugin_ConstraintTangent static const std::string MY_CONSTRAINT_TANGENT_ID("SketchConstraintTangent"); data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); @@ -12,12 +31,51 @@ from GeomDataAPI import * from GeomAPI import * from ModelAPI import * import math +from salome.shaper import model + #========================================================================= # Initialization of the test #========================================================================= __updated__ = "2015-03-17" +def checkArcLineTangency(theArc, theLine): + """ + subroutine to check that the line is tangent to arc/circle + """ + if (theArc.getKind() == "SketchCircle"): + aCenter = geomDataAPI_Point2D(theArc.attribute("circle_center")) + aRadius = theArc.real("circle_radius").value() + else: + aCenter = geomDataAPI_Point2D(theArc.attribute("center_point")) + aStartPnt = geomDataAPI_Point2D(theArc.attribute("start_point")) + aRadius = model.distancePointPoint(aStartPnt, aCenter) + aDist = model.distancePointLine(aCenter, theLine) + assert math.fabs(aDist - aRadius) < 2.e-5, "aDist = {0}, aRadius = {1}".format(aDist, aRadius) + +def checkArcArcTangency(theArc1, theArc2): + """ + subroutine to check that arcs/circles arc tangent + """ + anArcs = [theArc1, theArc2] + aCenters = [] + aRadii = [] + for anArc in anArcs: + if (anArc.getKind() == "SketchCircle"): + aCenter = geomDataAPI_Point2D(anArc.attribute("circle_center")) + aRadius = anArc.real("circle_radius").value() + else: + aCenter = geomDataAPI_Point2D(anArc.attribute("center_point")) + aStartPnt = geomDataAPI_Point2D(anArc.attribute("start_point")) + aRadius = model.distancePointPoint(aStartPnt, aCenter) + aCenters.append(aCenter) + aRadii.append(aRadius) + aDist = model.distancePointPoint(aCenters[0], aCenters[1]) + aRSum = aRadii[0] + aRadii[1] + aRDiff = math.fabs(aRadii[0] - aRadii[1]) + assert math.fabs(aDist - aRSum) < 2.e-5 or math.fabs(aDist - aRDiff) < 2.e-5, "aDist = {0}, aRSum = {1}, aRDiff = {2}".format(aDist, aRSum, aRDiff) + + aSession = ModelAPI_Session.get() aDocument = aSession.moduleDocument() #========================================================================= @@ -41,11 +99,11 @@ aSession.finishOperation() # Arc aSession.startOperation() aSketchArc1 = aSketchFeature.addFeature("SketchArc") -anArcCentr = geomDataAPI_Point2D(aSketchArc1.attribute("ArcCenter")) +anArcCentr = geomDataAPI_Point2D(aSketchArc1.attribute("center_point")) anArcCentr.setValue(10., 10.) -anArcStartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcStartPoint")) +anArcStartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("start_point")) anArcStartPoint.setValue(0., 50.) -anArcEndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcEndPoint")) +anArcEndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("end_point")) anArcEndPoint.setValue(50., 0.) aSession.finishOperation() # Line 1 @@ -64,6 +122,7 @@ aLine2EndPoint = geomDataAPI_Point2D(aSketchLine2.attribute("EndPoint")) aLine2StartPoint.setValue(50., 0.) aLine2EndPoint.setValue(100., 0.) aSession.finishOperation() +assert (model.dof(aSketchFeature) == 13) #========================================================================= # Link arc points and lines points by the coincidence constraint #========================================================================= @@ -83,6 +142,7 @@ reflistA.setAttr(anArcEndPoint) reflistB.setAttr(aLine2StartPoint) aConstraint.execute() aSession.finishOperation() +assert (model.dof(aSketchFeature) == 9) #========================================================================= # Add tangency constraint and check correctness #========================================================================= @@ -91,19 +151,15 @@ aTangency = aSketchFeature.addFeature("SketchConstraintTangent") aRefObjectA = aTangency.refattr("ConstraintEntityA") aRefObjectB = aTangency.refattr("ConstraintEntityB") anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult()) -anObjectB = modelAPI_ResultConstruction(aSketchLine1.firstResult()) +anObjectB = modelAPI_ResultConstruction(aSketchLine1.lastResult()) assert (anObjectA is not None) assert (anObjectB is not None) aRefObjectA.setObject(anObjectA) aRefObjectB.setObject(anObjectB) aTangency.execute() aSession.finishOperation() -anArcVecX = anArcStartPoint.x() - anArcCentr.x() -anArcVecY = anArcStartPoint.y() - anArcCentr.y() -aLineVecX = aLine1EndPoint.x() - aLine1StartPoint.x() -aLineVecY = aLine1EndPoint.y() - aLine1StartPoint.y() -aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY -assert(math.fabs(aDot) <= 1.e-12) +checkArcLineTangency(aSketchArc1, aSketchLine1) +assert (model.dof(aSketchFeature) == 8) #========================================================================= # Add tangency constraint for arc and second line and check correctness #========================================================================= @@ -112,19 +168,15 @@ aTangency = aSketchFeature.addFeature("SketchConstraintTangent") aRefObjectA = aTangency.refattr("ConstraintEntityA") aRefObjectB = aTangency.refattr("ConstraintEntityB") anObjectA = modelAPI_ResultConstruction(aSketchArc1.lastResult()) -anObjectB = modelAPI_ResultConstruction(aSketchLine2.firstResult()) +anObjectB = modelAPI_ResultConstruction(aSketchLine2.lastResult()) assert (anObjectA is not None) assert (anObjectB is not None) aRefObjectA.setObject(anObjectA) aRefObjectB.setObject(anObjectB) aTangency.execute() aSession.finishOperation() -anArcVecX = anArcEndPoint.x() - anArcCentr.x() -anArcVecY = anArcEndPoint.y() - anArcCentr.y() -aLineVecX = aLine2EndPoint.x() - aLine2StartPoint.x() -aLineVecY = aLine2EndPoint.y() - aLine2StartPoint.y() -aDot = anArcVecX * aLineVecX + anArcVecY * aLineVecY -assert(math.fabs(aDot) <= 1.e-12) +checkArcLineTangency(aSketchArc1, aSketchLine2) +assert (model.dof(aSketchFeature) == 7) #========================================================================= # TEST 2. Arc-arc tangency @@ -134,23 +186,28 @@ assert(math.fabs(aDot) <= 1.e-12) # Arc 1 aSession.startOperation() aSketchArc1 = aSketchFeature.addFeature("SketchArc") -anArc1Centr = geomDataAPI_Point2D(aSketchArc1.attribute("ArcCenter")) +anArc1Centr = geomDataAPI_Point2D(aSketchArc1.attribute("center_point")) anArc1Centr.setValue(10., 10.) -anArc1StartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcStartPoint")) +anArc1StartPoint = geomDataAPI_Point2D(aSketchArc1.attribute("start_point")) anArc1StartPoint.setValue(50., 0.) -anArc1EndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("ArcEndPoint")) +anArc1EndPoint = geomDataAPI_Point2D(aSketchArc1.attribute("end_point")) anArc1EndPoint.setValue(0., 50.) aSession.finishOperation() # Arc 2 aSession.startOperation() -aSketchArc2 = aSketchFeature.addFeature("SketchArc") -anArc2Centr = geomDataAPI_Point2D(aSketchArc2.attribute("ArcCenter")) -anArc2Centr.setValue(-10., 10.) -anArc2StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcStartPoint")) +aSketchArc2 = aSketchFeature.addFeature("SketchMacroArc") +aSketchArc2.string("arc_type").setValue("by_three_points") +anArc2StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("start_point_2")) anArc2StartPoint.setValue(0., 50.) -anArc2EndPoint = geomDataAPI_Point2D(aSketchArc2.attribute("ArcEndPoint")) +anArc2EndPoint = geomDataAPI_Point2D(aSketchArc2.attribute("end_point_2")) anArc2EndPoint.setValue(-50., 0.) +anArc2PassedPoint = geomDataAPI_Point2D(aSketchArc2.attribute("passed_point")) +anArc2PassedPoint.setValue(-40., 40.) aSession.finishOperation() +#assert (model.dof(aSketchFeature) == 17) +aSketchArc2 = model.lastSubFeature(aSketchFeature, "SketchArc") +anArc2Centr = geomDataAPI_Point2D(aSketchArc2.attribute("center_point")) +anArc2StartPoint = geomDataAPI_Point2D(aSketchArc2.attribute("start_point")) #========================================================================= # Link points of arcs by the coincidence constraint #========================================================================= @@ -162,6 +219,7 @@ reflistA.setAttr(anArc1EndPoint) reflistB.setAttr(anArc2StartPoint) aConstraint.execute() aSession.finishOperation() +assert (model.dof(aSketchFeature) == 15) #========================================================================= # Add tangency constraint and check correctness #========================================================================= @@ -177,48 +235,156 @@ aRefObjectA.setObject(anObjectA) aRefObjectB.setObject(anObjectB) aTangency.execute() aSession.finishOperation() -anArc1VecX = anArc1EndPoint.x() - anArc1Centr.x() -anArc1VecY = anArc1EndPoint.y() - anArc1Centr.y() -anArc2VecX = anArc2StartPoint.x() - anArc2Centr.x() -anArc2VecY = anArc2StartPoint.y() - anArc2Centr.y() -aCross = anArc1VecX * anArc2VecY - anArc1VecY * anArc2VecX -assert(math.fabs(aCross) <= 1.e-12) +checkArcArcTangency(aSketchArc1, aSketchArc2) +assert (model.dof(aSketchFeature) == 14) + +#========================================================================= +# TEST 3. Tangency between non-connected objects should work +#========================================================================= +# 3.1 tangency between arc2 and line2 +aSession.startOperation() +aTangency = aSketchFeature.addFeature("SketchConstraintTangent") +aRefObjectA = aTangency.refattr("ConstraintEntityA") +aRefObjectB = aTangency.refattr("ConstraintEntityB") +anObjectA = modelAPI_ResultConstruction(aSketchArc2.lastResult()) +anObjectB = modelAPI_ResultConstruction(aSketchLine2.lastResult()) +assert (anObjectA is not None) +assert (anObjectB is not None) +aRefObjectA.setObject(anObjectA) +aRefObjectB.setObject(anObjectB) +aTangency.execute() +aSession.finishOperation() +checkArcLineTangency(aSketchArc2, aSketchLine2) +assert (model.dof(aSketchFeature) == 13) + +aSession.startOperation() +aDocument.removeFeature(aTangency) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 14) + +# 3.2 tangency between non-connected arcs +aSession.startOperation() +aSketchArc3 = aSketchFeature.addFeature("SketchArc") +anArc3Centr = geomDataAPI_Point2D(aSketchArc3.attribute("center_point")) +anArc3Centr.setValue(100., -10.) +anArc3StartPoint = geomDataAPI_Point2D(aSketchArc3.attribute("start_point")) +anArc3StartPoint.setValue(70., -10.) +anArc3EndPoint = geomDataAPI_Point2D(aSketchArc3.attribute("end_point")) +anArc3EndPoint.setValue(100., 20.) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 19) + +aSession.startOperation() +aTangency = aSketchFeature.addFeature("SketchConstraintTangent") +aTangency.refattr("ConstraintEntityA").setObject(modelAPI_ResultConstruction(aSketchArc2.lastResult())) +aTangency.refattr("ConstraintEntityB").setObject(modelAPI_ResultConstruction(aSketchArc3.lastResult())) +aSession.finishOperation() +checkArcArcTangency(aSketchArc2, aSketchArc3) +assert (model.dof(aSketchFeature) == 18) + +aSession.startOperation() +aDocument.removeFeature(aSketchArc3) +aDocument.removeFeature(aTangency) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 14) + +# 3.3 tangency between arc and circle +aSession.startOperation() +aCircle1 = aSketchFeature.addFeature("SketchCircle") +aCircleCenter = geomDataAPI_Point2D(aCircle1.attribute("circle_center")) +aCircleRadius = aCircle1.real("circle_radius") +aCircleCenter.setValue(150., 100.) +aCircleRadius.setValue(50.) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 17) + +aSession.startOperation() +aTangency1 = aSketchFeature.addFeature("SketchConstraintTangent") +aTangency1.refattr("ConstraintEntityA").setObject(modelAPI_ResultConstruction(aSketchArc2.lastResult())) +aTangency1.refattr("ConstraintEntityB").setObject(modelAPI_ResultConstruction(aCircle1.lastResult())) +aSession.finishOperation() +checkArcArcTangency(aSketchArc2, aCircle1) +assert (model.dof(aSketchFeature) == 16) + +# 3.4 tangency between two circles +aSession.startOperation() +aCircle2 = aSketchFeature.addFeature("SketchCircle") +aCircleCenter = geomDataAPI_Point2D(aCircle2.attribute("circle_center")) +aCircleRadius = aCircle2.real("circle_radius") +aCircleCenter.setValue(120., 70.) +aCircleRadius.setValue(20.) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 19) + +aSession.startOperation() +aTangency2 = aSketchFeature.addFeature("SketchConstraintTangent") +aTangency2.refattr("ConstraintEntityA").setObject(modelAPI_ResultConstruction(aCircle1.lastResult())) +aTangency2.refattr("ConstraintEntityB").setObject(modelAPI_ResultConstruction(aCircle2.lastResult())) +aSession.finishOperation() +checkArcArcTangency(aCircle1, aCircle2) +assert (model.dof(aSketchFeature) == 18) #========================================================================= -# TEST 3. Tangency between non-connected objects should be wrong +# TEST 4. Creating of tangency arc by the option of the SketchArc feature #========================================================================= -# Store data -aLine2StartPointPrev = (aLine2StartPoint.x(), aLine2StartPoint.y()) -aLine2EndPointPrev = (aLine2EndPoint.x(), aLine2EndPoint.y()) -anArc2CenterPrev = (anArc2Centr.x(), anArc2Centr.y()) -anArc2StartPointPrev = (anArc2StartPoint.x(), anArc2StartPoint.y()) -anArc2EndPointPrev = (anArc2EndPoint.x(), anArc2EndPoint.y()) +aSession.startOperation() +aSketchArc3 = aSketchFeature.addFeature("SketchMacroArc") +aSketchArc3.string("arc_type").setValue("by_tangent_edge") +anArc3Start = aSketchArc3.refattr("tangent_point") +anArc3Start.setAttr(anArc1StartPoint) +anArc3EndPoint = geomDataAPI_Point2D(aSketchArc3.attribute("end_point_3")) +anArc3EndPoint.setValue(anArc1StartPoint.x()-5, anArc1StartPoint.y()-30) +aSession.finishOperation() +aSketchArc3 = model.lastSubFeature(aSketchFeature, "SketchArc") +checkArcArcTangency(aSketchArc1, aSketchArc3) +# freeze radius of tangent arc +aSession.startOperation() +aConstraintRadius = aSketchFeature.addFeature("SketchConstraintRadius") +aConstraintRadius.refattr("ConstraintEntityA").setObject(modelAPI_ResultConstruction(aSketchArc3.lastResult())) +aConstraintRadius.real("ConstraintValue").setValue(30.) +aSession.finishOperation() +checkArcArcTangency(aSketchArc1, aSketchArc3) +# do not check DoF here because it is unstable for tangent arcs, +# remove tangent arc to avoid instability while dumping +aSession.startOperation() +ModelAPI.removeFeaturesAndReferences(FeatureSet([aSketchArc3])) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 18) + #========================================================================= -# Add tangency between arc2 and line2 +# 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("circle_center")) +aCircleRadius = aCircle.real("circle_radius") +aCircleCenter.setValue(150., 100.) +aCircleRadius.setValue(20.) +aSession.finishOperation() +assert (model.dof(aSketchFeature) == 25) + aSession.startOperation() aTangency = aSketchFeature.addFeature("SketchConstraintTangent") aRefObjectA = aTangency.refattr("ConstraintEntityA") aRefObjectB = aTangency.refattr("ConstraintEntityB") -anObjectA = modelAPI_ResultConstruction(aSketchArc2.lastResult()) -anObjectB = modelAPI_ResultConstruction(aSketchLine2.firstResult()) +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() -# Check that nothing is changed -aLine2StartPointNew = (aLine2StartPoint.x(), aLine2StartPoint.y()) -aLine2EndPointNew = (aLine2EndPoint.x(), aLine2EndPoint.y()) -anArc2CenterNew = (anArc2Centr.x(), anArc2Centr.y()) -anArc2StartPointNew = (anArc2StartPoint.x(), anArc2StartPoint.y()) -anArc2EndPointNew = (anArc2EndPoint.x(), anArc2EndPoint.y()) -assert(aLine2StartPointNew == aLine2StartPointPrev) -assert(aLine2EndPointNew == aLine2EndPointPrev) -assert(anArc2CenterNew == anArc2CenterPrev) -assert(anArc2StartPointNew == anArc2StartPointPrev) -assert(anArc2EndPointNew == anArc2EndPointPrev) + +checkArcLineTangency(aCircle, aLine) +assert (model.dof(aSketchFeature) == 24) #========================================================================= # End of test #========================================================================= + +assert(model.checkPythonDump())