| | |
| |
|
| | #include <gtest/gtest.h> |
| |
|
| | #include <FCConfig.h> |
| |
|
| | #include <App/Application.h> |
| | #include <App/Document.h> |
| | #include <App/Expression.h> |
| | #include <App/ObjectIdentifier.h> |
| | #include <Mod/Part/App/FeaturePartBox.h> |
| | #include <Mod/Sketcher/App/GeoEnum.h> |
| | #include <Mod/Sketcher/App/SketchObject.h> |
| | #include "SketcherTestHelpers.h" |
| |
|
| | using namespace SketcherTestHelpers; |
| |
|
| | TEST_F(SketchObjectTest, testAddExternalIncreasesCount) |
| | { |
| | |
| | auto* doc = getObject()->getDocument(); |
| | auto box {doc->addObject("Part::Box")}; |
| | int numboxes = doc->countObjectsOfType<Part::Box>(); |
| | int numExtPre = getObject()->ExternalGeo.getSize(); |
| | doc->recompute(); |
| |
|
| | |
| | getObject()->addExternal(box, "Face6"); |
| | int numExt = getObject()->ExternalGeo.getSize(); |
| |
|
| | |
| | EXPECT_TRUE(numExt > numExtPre); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testDelExternalUndef) |
| | { |
| | |
| | int res = getObject()->delExternal(Sketcher::GeoEnum::GeoUndef); |
| |
|
| | |
| | EXPECT_EQ(res, -1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testDelExternalWhenEmpty) |
| | { |
| | |
| | int res = getObject()->delExternal(Sketcher::GeoEnum::RefExt); |
| |
|
| | |
| | EXPECT_EQ(res, -1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testDelExternalWhenEmptyWithPositiveId) |
| | { |
| | |
| | int res = getObject()->delExternal(1); |
| |
|
| | |
| | EXPECT_EQ(res, -1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testDelExternalReducesCount) |
| | { |
| | |
| | auto* doc = getObject()->getDocument(); |
| | auto box {doc->addObject("Part::Box")}; |
| | doc->recompute(); |
| | |
| | |
| | |
| | |
| | getObject()->addExternal(box, "Edge6"); |
| | getObject()->addExternal(box, "Edge4"); |
| | int numExt = getObject()->ExternalGeo.getSize(); |
| |
|
| | |
| | int res = getObject()->delExternal(Sketcher::GeoEnum::RefExt); |
| |
|
| | |
| | EXPECT_EQ(getObject()->ExternalGeo.getSize(), numExt - 1); |
| | } |
| |
|
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | TEST_F(SketchObjectTest, testReplaceGeometriesOneToOne) |
| | { |
| | |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| | std::vector<Part::Geometry*> newCurves {createTypicalNonPeriodicBSpline().release()}; |
| |
|
| | |
| | getObject()->replaceGeometries({geoId}, newCurves); |
| |
|
| | |
| | |
| | auto* geo = getObject()->getGeometry(geoId); |
| | EXPECT_TRUE(geo->is<Part::GeomBSplineCurve>()); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testReplaceGeometriesTwoToOne) |
| | { |
| | |
| | Part::GeomLineSegment lineSeg1, lineSeg2; |
| | setupLineSegment(lineSeg1); |
| | int geoId1 = getObject()->addGeometry(&lineSeg1); |
| | setupLineSegment(lineSeg2); |
| | int geoId2 = getObject()->addGeometry(&lineSeg2); |
| | std::vector<Part::Geometry*> newCurves {createTypicalNonPeriodicBSpline().release()}; |
| |
|
| | |
| | getObject()->replaceGeometries({geoId1, geoId2}, newCurves); |
| |
|
| | |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 0); |
| | |
| | auto* geo = getObject()->getGeometry(geoId1); |
| | EXPECT_TRUE(geo->is<Part::GeomBSplineCurve>()); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testReplaceGeometriesOneToTwo) |
| | { |
| | |
| | Part::GeomLineSegment lineSeg1; |
| | setupLineSegment(lineSeg1); |
| | int geoId1 = getObject()->addGeometry(&lineSeg1); |
| | std::vector<Part::Geometry*> newCurves { |
| | createTypicalNonPeriodicBSpline().release(), |
| | createTypicalNonPeriodicBSpline().release() |
| | }; |
| |
|
| | |
| | getObject()->replaceGeometries({geoId1}, newCurves); |
| |
|
| | |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 1); |
| | |
| | auto* geo = getObject()->getGeometry(geoId1); |
| | EXPECT_TRUE(geo->is<Part::GeomBSplineCurve>()); |
| | geo = getObject()->getGeometry(geoId1 + 1); |
| | EXPECT_TRUE(geo->is<Part::GeomBSplineCurve>()); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | TEST_F(SketchObjectTest, testSplitLineSegment) |
| | { |
| | |
| | Base::Vector3d splitPoint(2.0, 3.1, 0.0); |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| |
|
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId + 1); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testSplitCircle) |
| | { |
| | |
| | Base::Vector3d splitPoint(2.0, 3.1, 0.0); |
| | Part::GeomCircle circle; |
| | setupCircle(circle); |
| | int geoId = getObject()->addGeometry(&circle); |
| |
|
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testSplitEllipse) |
| | { |
| | |
| | Base::Vector3d splitPoint(2.0, 3.1, 0.0); |
| | Part::GeomEllipse ellipse; |
| | setupEllipse(ellipse); |
| | int geoId = getObject()->addGeometry(&ellipse); |
| |
|
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testSplitArcOfCircle) |
| | { |
| | |
| | Base::Vector3d splitPoint(-2.0, 3.1, 0.0); |
| | Part::GeomArcOfCircle arcOfCircle; |
| | setupArcOfCircle(arcOfCircle); |
| | int geoId = getObject()->addGeometry(&arcOfCircle); |
| |
|
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId + 1); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 2); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testSplitArcOfConic) |
| | { |
| | |
| | |
| | Base::Vector3d splitPoint(1.0, -1.1, 0.0); |
| | Part::GeomArcOfParabola arcOfConic; |
| | setupArcOfParabola(arcOfConic); |
| | int geoId = getObject()->addGeometry(&arcOfConic); |
| |
|
| | |
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 1); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testSplitNonPeriodicBSpline) |
| | { |
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | Base::Vector3d splitPoint(-0.5, 1.1, 0.0); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| | |
| |
|
| | |
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 1); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testSplitPeriodicBSpline) |
| | { |
| | |
| | auto PeriodicBSpline = createTypicalPeriodicBSpline(); |
| | Base::Vector3d splitPoint(-0.5, 1.1, 0.0); |
| | int geoId = getObject()->addGeometry(PeriodicBSpline.get()); |
| | |
| |
|
| | |
| | |
| | int result = getObject()->split(geoId, splitPoint); |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 0); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimWithoutIntersection) |
| | { |
| | |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| | Base::Vector3d trimPoint(2.0, 3.1, 0.0); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId - 1); |
| | } |
| |
|
| | |
| |
|
| | TEST_F(SketchObjectTest, testTrimLineSegmentEnd) |
| | { |
| | |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(lineSeg, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(lineSeg, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimLineSegmentMid) |
| | { |
| | |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(lineSeg, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(lineSeg, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(lineSeg, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y - 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y += 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId + 1); |
| | |
| | int numberOfPointOnObjectConstraints = countConstraintsOfType(getObject(), Sketcher::PointOnObject); |
| | EXPECT_EQ(numberOfPointOnObjectConstraints, 1); |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimCircleEnd) |
| | { |
| | |
| | Part::GeomCircle circle; |
| | setupCircle(circle); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(circle, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(circle, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(&circle); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId - 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimCircleMid) |
| | { |
| | |
| | Part::GeomCircle circle; |
| | setupCircle(circle); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(circle, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(circle, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(circle, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y + 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y -= 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(&circle); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId); |
| | |
| | |
| | int numberOfPointOnObjectConstraints = countConstraintsOfType(getObject(), Sketcher::PointOnObject); |
| | EXPECT_EQ(numberOfPointOnObjectConstraints, 1); |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimArcOfCircleEnd) |
| | { |
| | |
| |
|
| | |
| | Part::GeomArcOfCircle arcOfCircle; |
| | setupArcOfCircle(arcOfCircle); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(arcOfCircle, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(arcOfCircle, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(&arcOfCircle); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimArcOfCircleMid) |
| | { |
| | |
| | Part::GeomArcOfCircle arcOfCircle; |
| | setupArcOfCircle(arcOfCircle); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(arcOfCircle, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(arcOfCircle, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(arcOfCircle, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y + 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y -= 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(&arcOfCircle); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), geoId + 1); |
| | |
| | int numberOfPointOnObjectConstraints = countConstraintsOfType(getObject(), Sketcher::PointOnObject); |
| | EXPECT_EQ(numberOfPointOnObjectConstraints, 1); |
| | |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 2); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimEllipseEnd) |
| | { |
| | |
| | Part::GeomEllipse ellipse; |
| | setupEllipse(ellipse); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(ellipse, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(ellipse, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(&ellipse); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| | |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 0); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimEllipseMid) |
| | { |
| | |
| | Part::GeomEllipse ellipse; |
| | setupEllipse(ellipse); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(ellipse, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(ellipse, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(ellipse, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y + 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y -= 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(&ellipse); |
| | |
| | getObject()->deleteUnusedInternalGeometry(geoId); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| | |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 2); |
| | |
| | |
| | int numberOfPointOnObjectConstraints = countConstraintsOfType(getObject(), Sketcher::PointOnObject); |
| | EXPECT_EQ(numberOfPointOnObjectConstraints, 1); |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | |
| | } |
| |
|
| | |
| |
|
| | TEST_F(SketchObjectTest, testTrimPeriodicBSplineEnd) |
| | { |
| | |
| | auto periodicBSpline = createTypicalPeriodicBSpline(); |
| | assert(periodicBSpline); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(*periodicBSpline, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(*periodicBSpline, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(periodicBSpline.get()); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 0); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimPeriodicBSplineMid) |
| | { |
| | |
| | auto periodicBSpline = createTypicalPeriodicBSpline(); |
| | assert(periodicBSpline); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(*periodicBSpline, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(*periodicBSpline, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(*periodicBSpline, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y + 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y -= 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(periodicBSpline.get()); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| | |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 2); |
| | |
| | |
| | int numberOfPointOnObjectConstraints = countConstraintsOfType(getObject(), Sketcher::PointOnObject); |
| | EXPECT_EQ(numberOfPointOnObjectConstraints, 1); |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimNonPeriodicBSplineEnd) |
| | { |
| | |
| |
|
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | assert(nonPeriodicBSpline); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(*nonPeriodicBSpline, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(*nonPeriodicBSpline, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| | |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 1); |
| | |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimNonPeriodicBSplineMid) |
| | { |
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | assert(nonPeriodicBSpline); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(*nonPeriodicBSpline, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(*nonPeriodicBSpline, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(*nonPeriodicBSpline, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y + 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y -= 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| | |
| | for (int i = 0; i < getObject()->getHighestCurveIndex(); ++i) { |
| | if (getObject()->getGeometry(i)->is<Part::GeomBSplineCurve>()) { |
| | getObject()->deleteUnusedInternalGeometry(i); |
| | } |
| | } |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 3); |
| | |
| | int numberOfPointOnObjectConstraints = countConstraintsOfType(getObject(), Sketcher::PointOnObject); |
| | EXPECT_EQ(numberOfPointOnObjectConstraints, 1); |
| | int numberOfCoincidentConstraints = countConstraintsOfType(getObject(), Sketcher::Coincident); |
| | EXPECT_EQ(numberOfCoincidentConstraints, 1); |
| | |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimEffectOnConstruction) |
| | { |
| | |
| | |
| | |
| |
|
| | |
| | Part::GeomCircle circle; |
| | setupCircle(circle); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(circle, 0.5)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(circle, 0.3)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | Base::Vector3d p3(getPointAtNormalizedParameter(circle, 0.7)); |
| | Base::Vector3d p4(p3.x + 0.1, p3.y + 0.1, p3.z); |
| | |
| | |
| | p3.x -= 0.1; |
| | p3.y -= 0.1; |
| | Part::GeomLineSegment lineSegCut2; |
| | lineSegCut2.setPoints(p3, p4); |
| | getObject()->addGeometry(&lineSegCut2); |
| | int geoId = getObject()->addGeometry(&circle, true); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | for (int i = 0; i < getObject()->getHighestCurveIndex(); ++i) { |
| | auto* geom = getObject()->getGeometry(i); |
| | if (geom->is<Part::GeomArcOfCircle>()) { |
| | EXPECT_TRUE(GeometryFacade::getConstruction(geom)); |
| | } |
| | } |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimEndEffectOnFullLengthConstraints) |
| | { |
| | |
| |
|
| | |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(lineSeg, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(lineSeg, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| | auto constr = new Sketcher::Constraint(); |
| | constr->Type = Sketcher::ConstraintType::Distance; |
| | constr->First = geoId; |
| | constr->FirstPos = Sketcher::PointPos::none; |
| | constr->setValue((getObject()->getPoint(geoId, Sketcher::PointPos::end) |
| | - getObject()->getPoint(geoId, Sketcher::PointPos::start)) |
| | .Length()); |
| | getObject()->addConstraint(constr); |
| |
|
| | |
| | EXPECT_EQ(countConstraintsOfType(getObject(), Sketcher::ConstraintType::Distance), 1); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | EXPECT_EQ(countConstraintsOfType(getObject(), Sketcher::ConstraintType::Distance), 0); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimEndEffectOnSymmetricConstraints) |
| | { |
| | |
| |
|
| | |
| | Part::GeomLineSegment lineSeg; |
| | setupLineSegment(lineSeg); |
| | |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(lineSeg, 0.2)); |
| | Base::Vector3d p1(getPointAtNormalizedParameter(lineSeg, 0.5)); |
| | Base::Vector3d p2(p1.x + 0.1, p1.y + 0.1, p1.z); |
| | Part::GeomLineSegment lineSegCut1; |
| | lineSegCut1.setPoints(p1, p2); |
| | int geoIdOfCutting = getObject()->addGeometry(&lineSegCut1); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| | auto constr = new Sketcher::Constraint(); |
| | constr->Type = Sketcher::ConstraintType::Symmetric; |
| | constr->First = geoId; |
| | constr->FirstPos = Sketcher::PointPos::start; |
| | constr->Second = geoId; |
| | constr->SecondPos = Sketcher::PointPos::end; |
| | constr->Third = geoIdOfCutting; |
| | constr->ThirdPos = Sketcher::PointPos::start; |
| | getObject()->addConstraint(constr); |
| |
|
| | |
| | EXPECT_EQ(countConstraintsOfType(getObject(), Sketcher::ConstraintType::Symmetric), 1); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | EXPECT_EQ(countConstraintsOfType(getObject(), Sketcher::ConstraintType::Symmetric), 0); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testTrimEndEffectOnUnrelatedTangent) |
| | { |
| | |
| |
|
| | |
| | Part::GeomLineSegment lineSeg; |
| | lineSeg.setPoints(Base::Vector3d {1.0, -2.0, 0.0}, Base::Vector3d {1.0, 2.0, 0.0}); |
| | Base::Vector3d trimPoint(getPointAtNormalizedParameter(lineSeg, 0.2)); |
| | int geoId = getObject()->addGeometry(&lineSeg); |
| | Part::GeomCircle innerCircle; |
| | innerCircle.setCenter(Base::Vector3d {0.0, 0.0, 0.0}); |
| | innerCircle.setRadius(1.0); |
| | int geoIdInnerCircle = getObject()->addGeometry(&innerCircle); |
| | Part::GeomCircle outerCircle; |
| | outerCircle.setCenter(Base::Vector3d {0.0, 0.0, 0.0}); |
| | outerCircle.setRadius(1.5); |
| | getObject()->addGeometry(&outerCircle); |
| | |
| | auto constraint = new Sketcher::Constraint(); |
| | constraint->Type = Sketcher::ConstraintType::Tangent; |
| | constraint->First = geoId; |
| | constraint->FirstPos = Sketcher::PointPos::none; |
| | constraint->Second = geoIdInnerCircle; |
| | constraint->SecondPos = Sketcher::PointPos::none; |
| | getObject()->addConstraint(constraint); |
| | EXPECT_EQ(countConstraintsOfType(getObject(), Sketcher::ConstraintType::Tangent), 1); |
| |
|
| | |
| | int result = getObject()->trim(geoId, trimPoint); |
| |
|
| | |
| | EXPECT_EQ(result, 0); |
| | |
| | const auto& constraints = getObject()->Constraints.getValues(); |
| | auto tangIt = std::ranges::find( |
| | constraints, |
| | Sketcher::ConstraintType::Tangent, |
| | &Sketcher::Constraint::Type |
| | ); |
| | EXPECT_NE(tangIt, constraints.end()); |
| | EXPECT_EQ((*tangIt)->FirstPos, Sketcher::PointPos::none); |
| | EXPECT_EQ((*tangIt)->SecondPos, Sketcher::PointPos::none); |
| | } |
| |
|
| | |
| | |
| |
|
| | TEST_F(SketchObjectTest, testModifyKnotMultInNonPeriodicBSplineToZero) |
| | { |
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | assert(nonPeriodicBSpline); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| | auto bsp1 = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | int oldKnotCount = bsp1->countKnots(); |
| |
|
| | |
| | |
| | |
| | getObject()->modifyBSplineKnotMultiplicity(geoId, 2, -1); |
| | |
| | |
| | auto bsp2 = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp2->countKnots(), oldKnotCount - 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testModifyKnotMultInNonPeriodicBSplineToDisallowed) |
| | { |
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | assert(nonPeriodicBSpline); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| |
|
| | |
| | |
| | |
| | EXPECT_THROW(getObject()->modifyBSplineKnotMultiplicity(geoId, 2, 3), Base::ValueError); |
| | |
| | |
| | EXPECT_THROW(getObject()->modifyBSplineKnotMultiplicity(geoId, 2, -2), Base::ValueError); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testModifyKnotMultInNonPeriodicBSpline) |
| | { |
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | assert(nonPeriodicBSpline); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| |
|
| | auto bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | int oldKnotsNum = bsp->countKnots(); |
| | int oldMultiplicityOfTargetKnot = bsp->getMultiplicities()[1]; |
| |
|
| | |
| | |
| | getObject()->modifyBSplineKnotMultiplicity(geoId, 2, 1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum); |
| | |
| | EXPECT_EQ(bsp->getMultiplicities()[1], oldMultiplicityOfTargetKnot + 1); |
| | |
| | EXPECT_FALSE(bsp->isPeriodic()); |
| | |
| |
|
| | |
| | |
| | getObject()->modifyBSplineKnotMultiplicity(geoId, 2, -1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum); |
| | |
| | EXPECT_EQ(bsp->getMultiplicities()[1], oldMultiplicityOfTargetKnot); |
| | |
| | EXPECT_FALSE(bsp->isPeriodic()); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testModifyKnotMultInPeriodicBSplineToZero) |
| | { |
| | |
| | auto PeriodicBSpline = createTypicalPeriodicBSpline(); |
| | assert(PeriodicBSpline); |
| | int geoId = getObject()->addGeometry(PeriodicBSpline.get()); |
| | auto bsp1 = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | int oldKnotCount = bsp1->countKnots(); |
| |
|
| | |
| | |
| | |
| | getObject()->modifyBSplineKnotMultiplicity(geoId, 2, -1); |
| | |
| | |
| | auto bsp2 = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp2->countKnots(), oldKnotCount - 1); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testModifyKnotMultInPeriodicBSplineToDisallowed) |
| | { |
| | |
| | auto PeriodicBSpline = createTypicalPeriodicBSpline(); |
| | assert(PeriodicBSpline); |
| | int geoId = getObject()->addGeometry(PeriodicBSpline.get()); |
| |
|
| | |
| | |
| | |
| | EXPECT_THROW(getObject()->modifyBSplineKnotMultiplicity(geoId, 2, 3), Base::ValueError); |
| | |
| | |
| | EXPECT_THROW(getObject()->modifyBSplineKnotMultiplicity(geoId, 2, -2), Base::ValueError); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testModifyKnotMultInPeriodicBSpline) |
| | { |
| | |
| | auto PeriodicBSpline = createTypicalPeriodicBSpline(); |
| | assert(PeriodicBSpline); |
| | int geoId = getObject()->addGeometry(PeriodicBSpline.get()); |
| |
|
| | auto bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | int oldKnotsNum = bsp->countKnots(); |
| | int oldMultiplicityOfTargetKnot = bsp->getMultiplicities()[1]; |
| |
|
| | |
| | |
| | getObject()->modifyBSplineKnotMultiplicity(geoId, 2, 1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum); |
| | |
| | EXPECT_EQ(bsp->getMultiplicities()[1], oldMultiplicityOfTargetKnot + 1); |
| | |
| | EXPECT_TRUE(bsp->isPeriodic()); |
| | |
| |
|
| | |
| | |
| | getObject()->modifyBSplineKnotMultiplicity(geoId, 2, -1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum); |
| | |
| | EXPECT_EQ(bsp->getMultiplicities()[1], oldMultiplicityOfTargetKnot); |
| | |
| | EXPECT_TRUE(bsp->isPeriodic()); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testInsertKnotInNonPeriodicBSpline) |
| | { |
| | |
| | auto nonPeriodicBSpline = createTypicalNonPeriodicBSpline(); |
| | assert(nonPeriodicBSpline); |
| | int geoId = getObject()->addGeometry(nonPeriodicBSpline.get()); |
| |
|
| | |
| | |
| | |
| | EXPECT_THROW(getObject()->insertBSplineKnot(geoId, 0.5, 0), Base::ValueError); |
| |
|
| | |
| | |
| | |
| | EXPECT_THROW(getObject()->insertBSplineKnot(geoId, 0.5, 4), Base::ValueError); |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | auto bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | int oldKnotsNum = bsp->countKnots(); |
| | int oldMultiplicityOfTargetKnot = bsp->getMultiplicities()[1]; |
| |
|
| | |
| | |
| | getObject()->insertBSplineKnot(geoId, 0.5, 1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum + 1); |
| | |
| | EXPECT_FALSE(bsp->isPeriodic()); |
| |
|
| | |
| | |
| | getObject()->insertBSplineKnot(geoId, 1.0, 1); |
| | |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum + 1); |
| | |
| | EXPECT_EQ(bsp->getMultiplicities()[2], oldMultiplicityOfTargetKnot + 1); |
| | |
| | EXPECT_FALSE(bsp->isPeriodic()); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testInsertKnotInPeriodicBSpline) |
| | { |
| | |
| |
|
| | |
| | auto PeriodicBSpline = createTypicalPeriodicBSpline(); |
| | assert(PeriodicBSpline); |
| | int geoId = getObject()->addGeometry(PeriodicBSpline.get()); |
| |
|
| | |
| | |
| | |
| | EXPECT_THROW(getObject()->insertBSplineKnot(geoId, 0.5, 0), Base::ValueError); |
| |
|
| | |
| | |
| | |
| | EXPECT_THROW(getObject()->insertBSplineKnot(geoId, 0.5, 4), Base::ValueError); |
| |
|
| | |
| | |
| | |
| |
|
| | auto bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | int oldKnotsNum = bsp->countKnots(); |
| | int oldMultiplicityOfTargetKnot = bsp->getMultiplicities()[2]; |
| |
|
| | |
| | |
| | getObject()->insertBSplineKnot(geoId, 0.5, 1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum + 1); |
| | |
| | EXPECT_TRUE(bsp->isPeriodic()); |
| |
|
| | |
| | |
| | getObject()->insertBSplineKnot(geoId, 1.0, 1); |
| | |
| | |
| | bsp = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(geoId)); |
| | EXPECT_EQ(bsp->countKnots(), oldKnotsNum + 1); |
| | |
| | EXPECT_EQ(bsp->getMultiplicities()[3], oldMultiplicityOfTargetKnot + 1); |
| | |
| | EXPECT_TRUE(bsp->isPeriodic()); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testJoinCurves) |
| | { |
| | |
| | |
| | Base::Vector3d coordsCenter(0.0, 0.0, 0.0); |
| | double radius = 3.0, startParam = std::numbers::pi / 2, endParam = std::numbers::pi; |
| | Part::GeomArcOfCircle arcOfCircle; |
| | arcOfCircle.setCenter(coordsCenter); |
| | arcOfCircle.setRadius(radius); |
| | arcOfCircle.setRange(startParam, endParam, true); |
| | int geoId1 = getObject()->addGeometry(&arcOfCircle); |
| |
|
| | Base::Vector3d coords1(0.1, 0.0, 0.0); |
| | Base::Vector3d coords2(3.0, 4.0, 0.0); |
| | Part::GeomLineSegment lineSeg; |
| | lineSeg.setPoints(coords1, coords2); |
| | int geoId2 = getObject()->addGeometry(&lineSeg); |
| |
|
| | |
| | |
| | getObject()->join(geoId1, Sketcher::PointPos::start, geoId2, Sketcher::PointPos::start); |
| |
|
| | |
| | |
| | |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 0); |
| | } |
| |
|
| | TEST_F(SketchObjectTest, testJoinCurvesWhenTangent) |
| | { |
| | |
| | |
| | Base::Vector3d coordsCenter(0.0, 0.0, 0.0); |
| | double radius = 3.0, startParam = std::numbers::pi / 2, endParam = std::numbers::pi; |
| | Part::GeomArcOfCircle arcOfCircle; |
| | arcOfCircle.setCenter(coordsCenter); |
| | arcOfCircle.setRadius(radius); |
| | arcOfCircle.setRange(startParam, endParam, true); |
| | int geoId1 = getObject()->addGeometry(&arcOfCircle); |
| |
|
| | Base::Vector3d coords1(0.0, 0.0, 0.0); |
| | Base::Vector3d coords2(3.0, 0.0, 0.0); |
| | Part::GeomLineSegment lineSeg; |
| | lineSeg.setPoints(coords1, coords2); |
| | int geoId2 = getObject()->addGeometry(&lineSeg); |
| |
|
| | |
| | auto constraint = new Sketcher::Constraint(); |
| | constraint->Type = Sketcher::ConstraintType::Tangent; |
| | constraint->First = geoId1; |
| | constraint->FirstPos = Sketcher::PointPos::start; |
| | constraint->Second = geoId2; |
| | constraint->SecondPos = Sketcher::PointPos::start; |
| | getObject()->addConstraint(constraint); |
| |
|
| | |
| | |
| | getObject()->join(geoId1, Sketcher::PointPos::start, geoId2, Sketcher::PointPos::start, 1); |
| |
|
| | |
| | |
| | |
| | for (int iterGeoId = 0; iterGeoId < getObject()->getHighestCurveIndex(); ++iterGeoId) { |
| | getObject()->deleteUnusedInternalGeometryAndUpdateGeoId(iterGeoId); |
| | } |
| | EXPECT_EQ(getObject()->getHighestCurveIndex(), 0); |
| | |
| | |
| | auto mults |
| | = static_cast<const Part::GeomBSplineCurve*>(getObject()->getGeometry(0))->getMultiplicities(); |
| | EXPECT_TRUE(std::all_of(mults.begin(), mults.end(), [](auto mult) { return mult >= 1; })); |
| | } |
| |
|