-// Copyright (C) 2014-2020 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2022 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include <GeomAPI_Pnt.h>
#include <GeomAPI_Wire.h>
+#include <Approx_CurvilinearParameter.hxx>
+
#include <Bnd_Box.hxx>
#include <BRep_Tool.hxx>
#include <BRepAlgo_FaceRestrictor.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBndLib.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
#include <BRepBuilderAPI_FindPlane.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepCheck_Analyzer.hxx>
#include <BRepExtrema_DistShapeShape.hxx>
#include <BRepExtrema_ExtCF.hxx>
#include <Geom2d_Curve.hxx>
#include <Geom2d_Curve.hxx>
+#include <Geom_BSplineCurve.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <Geom_Line.hxx>
#include <Geom_Plane.hxx>
#include <Geom_RectangularTrimmedSurface.hxx>
+#include <GeomAdaptor_HCurve.hxx>
+
#include <GeomAPI_ProjectPointOnCurve.hxx>
#include <GeomAPI_ShapeIterator.h>
#include <NCollection_Vector.hxx>
+#include <LocalAnalysis_SurfaceContinuity.hxx>
+
//==================================================================================================
static GProp_GProps props(const TopoDS_Shape& theShape)
{
return aGProps;
}
+//==================================================================================================
+double GeomAlgoAPI_ShapeTools::length(const std::shared_ptr<GeomAPI_Shape> theShape)
+{
+ GProp_GProps aGProps;
+ if (!theShape.get()) {
+ return 0.0;
+ }
+ const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
+ if (aShape.IsNull()) {
+ return 0.0;
+ }
+
+ BRepGProp::LinearProperties(aShape, aGProps, Standard_True);
+ return aGProps.Mass();
+}
+
//==================================================================================================
double GeomAlgoAPI_ShapeTools::volume(const std::shared_ptr<GeomAPI_Shape> theShape)
{
- if(!theShape.get()) {
+ if (!theShape.get()) {
return 0.0;
}
const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
- if(aShape.IsNull()) {
+ if (aShape.IsNull()) {
return 0.0;
}
const Standard_Real anEps = 1.e-6;
- TopExp_Explorer anExp(aShape, TopAbs_SOLID);
- if (anExp.More()) { // return volume if there is at least one solid
- double aVolume = 0.0;
- for (; anExp.More(); anExp.Next()) {
- GProp_GProps aGProps;
- BRepGProp::VolumeProperties(anExp.Current(), aGProps, anEps);
- aVolume += aGProps.Mass();
- }
- return aVolume;
+ double aVolume = 0.0;
+ for (TopExp_Explorer anExp(aShape, TopAbs_SOLID); anExp.More(); anExp.Next()) {
+ GProp_GProps aGProps;
+ BRepGProp::VolumeProperties(anExp.Current(), aGProps, anEps);
+ aVolume += aGProps.Mass();
}
- // return surfaces area
- GProp_GProps aGProps;
- BRepGProp::SurfaceProperties(aShape, aGProps, anEps);
- return aGProps.Mass();
+ return aVolume;
}
//==================================================================================================
double GeomAlgoAPI_ShapeTools::area (const std::shared_ptr<GeomAPI_Shape> theShape)
{
GProp_GProps aGProps;
- if(!theShape.get()) {
+ if (!theShape.get()) {
return 0.0;
}
const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
- if(aShape.IsNull()) {
+ if (aShape.IsNull()) {
return 0.0;
}
const Standard_Real anEps = 1.e-6;
return aGProps.Mass();
}
+//==================================================================================================
+bool GeomAlgoAPI_ShapeTools::isContinuousFaces(const GeomShapePtr& theFace1,
+ const GeomShapePtr& theFace2,
+ const GeomPointPtr& thePoint,
+ const double & theAngle,
+ std::string& theError)
+{
+
+ #ifdef _DEBUG
+ std::cout << "isContinuousFaces " << std::endl;
+ #endif
+
+ if (!thePoint.get()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+ const gp_Pnt& aPoint = thePoint->impl<gp_Pnt>();
+
+ // Getting base shape.
+ if (!theFace1.get()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+
+ TopoDS_Shape aShape1 = theFace1->impl<TopoDS_Shape>();
+
+ if (aShape1.IsNull()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+
+ // Getting base shape.
+ if (!theFace2.get()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+
+ TopoDS_Shape aShape2 = theFace2->impl<TopoDS_Shape>();
+
+ if (aShape2.IsNull()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+
+ TopoDS_Face aFace1 = TopoDS::Face(aShape1);
+ if (aFace1.IsNull()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+
+ Handle(Geom_Surface) aSurf1 = BRep_Tool::Surface(aFace1);
+ if (aSurf1.IsNull()) {
+ theError = "isContinuousFaces : An invalid surface";
+ return false;
+ }
+
+ ShapeAnalysis_Surface aSAS1(aSurf1);
+ gp_Pnt2d aPointOnFace1 = aSAS1.ValueOfUV(aPoint, Precision::Confusion());
+
+ TopoDS_Face aFace2 = TopoDS::Face(aShape2);
+ if (aFace2.IsNull()) {
+ theError = "isContinuousFaces : An invalid argument";
+ return false;
+ }
+
+ Handle(Geom_Surface) aSurf2 = BRep_Tool::Surface(aFace2);
+ if (aSurf2.IsNull()) {
+ theError = "isContinuousFaces : An invalid surface";
+ return false;
+ }
+
+ ShapeAnalysis_Surface aSAS2(aSurf2);
+ gp_Pnt2d aPointOnFace2= aSAS2.ValueOfUV(aPoint, Precision::Confusion());
+
+ bool aRes = false;
+ try {
+ OCC_CATCH_SIGNALS;
+ LocalAnalysis_SurfaceContinuity aLocAnal(aSurf1,
+ aPointOnFace1.X(),
+ aPointOnFace1.Y(),
+ aSurf2,
+ aPointOnFace2.X(),
+ aPointOnFace2.Y(),
+ GeomAbs_Shape::GeomAbs_G1, // Order
+ 0.001, // EpsNul
+ 0.001, // EpsC0
+ 0.001, // EpsC1
+ 0.001, // EpsC2
+ theAngle * M_PI / 180.0); //EpsG1
+ aRes = aLocAnal.IsG1();
+ }
+ catch (Standard_Failure const& anException) {
+ theError = "LocalAnalysis_SurfaceContinuity error :";
+ theError += anException.GetMessageString();
+ }
+
+ return aRes;
+}
+
//==================================================================================================
std::shared_ptr<GeomAPI_Pnt>
GeomAlgoAPI_ShapeTools::centreOfMass(const std::shared_ptr<GeomAPI_Shape> theShape)
{
GProp_GProps aGProps;
- if(!theShape) {
+ if (!theShape) {
return std::shared_ptr<GeomAPI_Pnt>();
}
const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
- if(aShape.IsNull()) {
+ if (aShape.IsNull()) {
return std::shared_ptr<GeomAPI_Pnt>();
}
gp_Pnt aCentre;
- if(aShape.ShapeType() == TopAbs_VERTEX) {
+ if (aShape.ShapeType() == TopAbs_VERTEX) {
aCentre = BRep_Tool::Pnt(TopoDS::Vertex(aShape));
} else {
aGProps = props(aShape);
}
double GeomAlgoAPI_ShapeTools::minimalDistance(const GeomShapePtr& theShape1,
- const GeomShapePtr& theShape2, std::array<double, 3> & fromShape1To2)
+ const GeomShapePtr& theShape2,
+ std::array<double, 3> & fromShape1To2)
{
BRepExtrema_DistShapeShape aDist = getExtemaDistShape(theShape1, theShape2);
const auto & pt1 = aDist.PointOnShape1(1);
GeomShapePtr aResult = theCompound;
- if(!theCompound.get()) {
+ if (!theCompound.get()) {
return aResult;
}
- if(theType != GeomAPI_Shape::SHELL && theType != GeomAPI_Shape::COMPSOLID) {
+ if (theType != GeomAPI_Shape::SHELL && theType != GeomAPI_Shape::COMPSOLID) {
return aResult;
}
TopAbs_ShapeEnum aTS = TopAbs_EDGE;
TopAbs_ShapeEnum aTA = TopAbs_FACE;
- if(theType == GeomAPI_Shape::COMPSOLID) {
+ if (theType == GeomAPI_Shape::COMPSOLID) {
aTS = TopAbs_FACE;
aTA = TopAbs_SOLID;
}
// Get free shapes.
int anOrder = 0;
const TopoDS_Shape& aShapesComp = theCompound->impl<TopoDS_Shape>();
- for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next(), anOrder++) {
+ for (TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next(), anOrder++) {
const TopoDS_Shape& aShape = anIter.Value();
- if(aShape.ShapeType() > aTA) {
+ if (aShape.ShapeType() > aTA) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aShape));
aResFreeShapes.push_back(aGeomShape);
anInputOrder[aGeomShape] = anOrder;
} else {
- for(TopExp_Explorer anExp(aShape, aTA); anExp.More(); anExp.Next()) {
+ for (TopExp_Explorer anExp(aShape, aTA); anExp.More(); anExp.Next()) {
anAncestorsOrder.Bind(anExp.Current(), anOrder);
}
}
// Map sub-shapes and shapes.
TopTools_IndexedDataMapOfShapeListOfShape aMapSA;
TopExp::MapShapesAndAncestors(aShapesComp, aTS, aTA, aMapSA);
- if(aMapSA.IsEmpty()) {
+ if (aMapSA.IsEmpty()) {
return aResult;
}
theResuts.clear();
// Get all shapes with common sub-shapes and free shapes.
NCollection_Map<TopoDS_Shape> aFreeShapes;
NCollection_Vector<NCollection_Map<TopoDS_Shape>> aShapesWithCommonSubshapes;
- for(TopTools_IndexedDataMapOfShapeListOfShape::Iterator
+ for (TopTools_IndexedDataMapOfShapeListOfShape::Iterator
anIter(aMapSA); anIter.More(); anIter.Next()) {
TopTools_ListOfShape& aListOfShape = anIter.ChangeValue();
- if(aListOfShape.IsEmpty()) {
+ if (aListOfShape.IsEmpty()) {
continue;
}
- else if(aListOfShape.Size() == 1) {
+ else if (aListOfShape.Size() == 1) {
const TopoDS_Shape& aF = aListOfShape.First();
aFreeShapes.Add(aF);
aListOfShape.Clear();
aFreeShapes.Remove(aListIt.Value());
}
aListOfShape.Clear();
- for(NCollection_List<TopoDS_Shape>::Iterator
+ for (NCollection_List<TopoDS_Shape>::Iterator
aTempIter(aTempList); aTempIter.More(); aTempIter.Next()) {
const TopoDS_Shape& aTempShape = aTempIter.Value();
- for(TopTools_IndexedDataMapOfShapeListOfShape::Iterator
+ for (TopTools_IndexedDataMapOfShapeListOfShape::Iterator
anIter2(aMapSA); anIter2.More(); anIter2.Next()) {
TopTools_ListOfShape& aTempListOfShape = anIter2.ChangeValue();
- if(aTempListOfShape.IsEmpty()) {
+ if (aTempListOfShape.IsEmpty()) {
continue;
- } else if(aTempListOfShape.Size() == 1 && aTempListOfShape.First() == aTempShape) {
+ } else if (aTempListOfShape.Size() == 1 && aTempListOfShape.First() == aTempShape) {
aTempListOfShape.Clear();
- } else if(aTempListOfShape.Size() > 1) {
+ } else if (aTempListOfShape.Size() > 1) {
TopTools_ListOfShape::Iterator anIt1(aTempListOfShape);
for (; anIt1.More(); anIt1.Next()) {
if (anIt1.Value() == aTempShape) {
}
// Combine shapes with common sub-shapes.
- for(NCollection_Vector<NCollection_Map<TopoDS_Shape>>::Iterator
+ for (NCollection_Vector<NCollection_Map<TopoDS_Shape>>::Iterator
anIter(aShapesWithCommonSubshapes); anIter.More(); anIter.Next()) {
TopoDS_Shell aShell;
TopoDS_CompSolid aCSolid;
theType ==
GeomAPI_Shape::COMPSOLID ? aBuilder.MakeCompSolid(aCSolid) : aBuilder.MakeShell(aShell);
NCollection_Map<TopoDS_Shape>& aShapesMap = anIter.ChangeValue();
- for(TopExp_Explorer anExp(aShapesComp, aTA); anExp.More(); anExp.Next()) {
+ for (TopExp_Explorer anExp(aShapesComp, aTA); anExp.More(); anExp.Next()) {
const TopoDS_Shape& aShape = anExp.Current();
- if(aShapesMap.Contains(aShape)) {
+ if (aShapesMap.Contains(aShape)) {
theType ==
GeomAPI_Shape::COMPSOLID ? aBuilder.Add(aCSolid, aShape) : aBuilder.Add(aShell, aShape);
aShapesMap.Remove(aShape);
}
// Adding free shapes.
- for(TopExp_Explorer anExp(aShapesComp, aTA); anExp.More(); anExp.Next()) {
+ for (TopExp_Explorer anExp(aShapesComp, aTA); anExp.More(); anExp.Next()) {
const TopoDS_Shape& aShape = anExp.Current();
- if(aFreeShapes.Contains(aShape)) {
+ if (aFreeShapes.Contains(aShape)) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aShape));
aResFreeShapes.push_back(aGeomShape);
}
}
- if(aResCombinedShapes.size() == 1 && aResFreeShapes.size() == 0) {
+ if (aResCombinedShapes.size() == 1 && aResFreeShapes.size() == 0) {
aResult = aResCombinedShapes.front();
theResuts.push_back(aResult);
- } else if(aResCombinedShapes.size() == 0 && aResFreeShapes.size() == 1) {
+ } else if (aResCombinedShapes.size() == 0 && aResFreeShapes.size() == 1) {
aResult = aResFreeShapes.front();
theResuts.push_back(aResult);
} else {
// put to result compound and result list in accordance to the order numbers
std::map<GeomShapePtr, int>::iterator anInputIter = anInputOrder.begin();
std::map<int, GeomShapePtr> aNums;
- for(; anInputIter != anInputOrder.end(); anInputIter++)
+ for (; anInputIter != anInputOrder.end(); anInputIter++)
aNums[anInputIter->second] = anInputIter->first;
std::map<int, GeomShapePtr>::iterator aNumsIter = aNums.begin();
- for(; aNumsIter != aNums.end(); aNumsIter++) {
+ for (; aNumsIter != aNums.end(); aNumsIter++) {
aBuilder.Add(aResultComp, (aNumsIter->second)->impl<TopoDS_Shape>());
theResuts.push_back(aNumsIter->second);
}
static void addSimpleShapeToList(const TopoDS_Shape& theShape,
NCollection_List<TopoDS_Shape>& theList)
{
- if(theShape.IsNull()) {
+ if (theShape.IsNull()) {
return;
}
- if(theShape.ShapeType() == TopAbs_COMPOUND) {
- for(TopoDS_Iterator anIt(theShape); anIt.More(); anIt.Next()) {
+ if (theShape.ShapeType() == TopAbs_COMPOUND) {
+ for (TopoDS_Iterator anIt(theShape); anIt.More(); anIt.Next()) {
addSimpleShapeToList(anIt.Value(), theList);
}
} else {
BRep_Builder aBuilder;
aBuilder.MakeCompound(aCompound);
- for(NCollection_List<TopoDS_Shape>::Iterator anIt(theShapes); anIt.More(); anIt.Next()) {
+ for (NCollection_List<TopoDS_Shape>::Iterator anIt(theShapes); anIt.More(); anIt.Next()) {
aBuilder.Add(aCompound, anIt.Value());
}
for (NCollection_Vector<TopTools_MapOfShape>::Iterator anIt(aGroups); anIt.More(); anIt.Next()) {
const TopTools_MapOfShape& aGroup = anIt.ChangeValue();
GeomShapePtr aGeomShape(new GeomAPI_Shape());
- if(aGroup.Size() == 1) {
+ if (aGroup.Size() == 1) {
TopTools_MapOfShape::Iterator aOneShapeIter(aGroup);
aGeomShape->setImpl(new TopoDS_Shape(aOneShapeIter.Value()));
} else {
aBuilder.Add(aCompound, aGeomShape->impl<TopoDS_Shape>());
}
- if(!aCompound.IsNull()) {
+ if (!aCompound.IsNull()) {
aResult->setImpl(new TopoDS_Shape(aCompound));
}
BRepBndLib::Add(aShape, aBndBox);
}
- if(theEnlarge != 0.0) {
+ if (theEnlarge != 0.0) {
// We enlarge bounding box just to be sure that plane will be large enough to cut all objects.
aBndBox.Enlarge(theEnlarge);
}
Standard_Real aYArr[2] = {aBndBox.CornerMin().Y(), aBndBox.CornerMax().Y()};
Standard_Real aZArr[2] = {aBndBox.CornerMin().Z(), aBndBox.CornerMax().Z()};
std::list<std::shared_ptr<GeomAPI_Pnt> > aResultPoints;
- for(int i = 0; i < 2; i++) {
- for(int j = 0; j < 2; j++) {
- for(int k = 0; k < 2; k++) {
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 2; j++) {
+ for (int k = 0; k < 2; k++) {
std::shared_ptr<GeomAPI_Pnt> aPnt(new GeomAPI_Pnt(aXArr[i], aYArr[j], aZArr[k]));
aResultPoints.push_back(aPnt);
}
{
std::shared_ptr<GeomAPI_Face> aResultFace;
- if(!thePlane.get()) {
+ if (!thePlane.get()) {
return aResultFace;
}
const TopoDS_Shape& aShape = thePlane->impl<TopoDS_Shape>();
- if(aShape.ShapeType() != TopAbs_FACE) {
+ if (aShape.ShapeType() != TopAbs_FACE) {
return aResultFace;
}
TopoDS_Face aFace = TopoDS::Face(aShape);
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace);
- if(aSurf.IsNull()) {
+ if (aSurf.IsNull()) {
return aResultFace;
}
GeomLib_IsPlanarSurface isPlanar(aSurf);
- if(!isPlanar.IsPlanar()) {
+ if (!isPlanar.IsPlanar()) {
return aResultFace;
}
- if(thePoints.size() != 8) {
+ if (thePoints.size() != 8) {
return aResultFace;
}
const gp_Pnt& aPntOnFace = anIntAna.Point(1);
Standard_Real aPntU(0), aPntV(0);
GeomLib_Tool::Parameters(aFacePlane, aPntOnFace, Precision::Confusion(), aPntU, aPntV);
- if(aPntU < UMin) UMin = aPntU;
- if(aPntU > UMax) UMax = aPntU;
- if(aPntV < VMin) VMin = aPntV;
- if(aPntV > VMax) VMax = aPntV;
+ if (aPntU < UMin) UMin = aPntU;
+ if (aPntU > UMax) UMax = aPntU;
+ if (aPntV < VMin) VMin = aPntV;
+ if (aPntV > VMax) VMax = aPntV;
}
aResultFace.reset(new GeomAPI_Face());
aResultFace->setImpl(new TopoDS_Face(BRepLib_MakeFace(aFacePln, UMin, UMax, VMin, VMax).Face()));
BRepAlgo_FaceRestrictor aFRestrictor;
aFRestrictor.Init(aFace, Standard_False, Standard_True);
- for(ListOfShape::const_iterator anIt = theWires.cbegin();
+ for (ListOfShape::const_iterator anIt = theWires.cbegin();
anIt != theWires.cend();
++anIt) {
TopoDS_Wire aWire = TopoDS::Wire((*anIt)->impl<TopoDS_Shape>());
aFRestrictor.Perform();
- if(!aFRestrictor.IsDone()) {
+ if (!aFRestrictor.IsDone()) {
return;
}
- for(; aFRestrictor.More(); aFRestrictor.Next()) {
+ for (; aFRestrictor.More(); aFRestrictor.Next()) {
GeomShapePtr aShape(new GeomAPI_Shape());
aShape->setImpl(new TopoDS_Shape(aFRestrictor.Current()));
theFaces.push_back(aShape);
BRep_Builder aBuilder;
aBuilder.MakeCompound(aCompound);
- for(ListOfShape::const_iterator anIt = theShapes.cbegin(); anIt != theShapes.cend(); ++anIt) {
+ for (ListOfShape::const_iterator anIt = theShapes.cbegin(); anIt != theShapes.cend(); ++anIt) {
aBuilder.Add(aCompound, (*anIt)->impl<TopoDS_Shape>());
}
BRepBuilderAPI_FindPlane aFindPlane(aCompound);
- if(aFindPlane.Found() != Standard_True) {
+ if (aFindPlane.Found() != Standard_True) {
return std::shared_ptr<GeomAPI_Pln>();
}
const std::shared_ptr<GeomAPI_Shape> theSubShape,
const std::shared_ptr<GeomAPI_Shape> theBaseShape)
{
- if(!theSubShape.get() || !theBaseShape.get()) {
+ if (!theSubShape.get() || !theBaseShape.get()) {
return false;
}
const TopoDS_Shape& aSubShape = theSubShape->impl<TopoDS_Shape>();
const TopoDS_Shape& aBaseShape = theBaseShape->impl<TopoDS_Shape>();
- if(aSubShape.ShapeType() == TopAbs_VERTEX) {
+ if (aSubShape.ShapeType() == TopAbs_VERTEX) {
// If sub-shape is a vertex check distance to shape. If it is <= Precision::Confusion() then OK.
BRepExtrema_DistShapeShape aDist(aBaseShape, aSubShape);
aDist.Perform();
- if(!aDist.IsDone() || aDist.Value() > Precision::Confusion()) {
+ if (!aDist.IsDone() || aDist.Value() > Precision::Confusion()) {
return false;
}
} else if (aSubShape.ShapeType() == TopAbs_EDGE) {
- if(aBaseShape.ShapeType() == TopAbs_FACE) {
+ if (aBaseShape.ShapeType() == TopAbs_FACE) {
// Check that edge is on face surface.
TopoDS_Face aFace = TopoDS::Face(aBaseShape);
TopoDS_Edge anEdge = TopoDS::Edge(aSubShape);
BRepLib_CheckCurveOnSurface aCheck(anEdge, aFace);
aCheck.Perform();
- if(!aCheck.IsDone() || aCheck.MaxDistance() > Precision::Confusion()) {
+ if (!aCheck.IsDone() || aCheck.MaxDistance() > Precision::Confusion()) {
return false;
}
ShapeAnalysis::FindBounds(anEdge, aV1, aV2);
gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1);
gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2);
- for(TopExp_Explorer anExp(aBaseShape, TopAbs_EDGE); anExp.More(); anExp.Next()) {
+ for (TopExp_Explorer anExp(aBaseShape, TopAbs_EDGE); anExp.More(); anExp.Next()) {
const TopoDS_Shape& anEdgeOnFace = anExp.Current();
BRepExtrema_DistShapeShape aDist(anEdgeOnFace, anEdge);
aDist.Perform();
- if(aDist.IsDone() && aDist.Value() <= Precision::Confusion()) {
+ if (aDist.IsDone() && aDist.Value() <= Precision::Confusion()) {
// Edge intersect face bound. Check that it is not on edge begin or end.
- for(Standard_Integer anIndex = 1; anIndex <= aDist.NbSolution(); ++anIndex) {
+ for (Standard_Integer anIndex = 1; anIndex <= aDist.NbSolution(); ++anIndex) {
gp_Pnt aPntOnSubShape = aDist.PointOnShape2(anIndex);
- if(aPntOnSubShape.Distance(aPnt1) > Precision::Confusion()
+ if (aPntOnSubShape.Distance(aPnt1) > Precision::Confusion()
&& aPntOnSubShape.Distance(aPnt2) > Precision::Confusion()) {
return false;
}
ShapeAnalysis_Surface aSAS(aSurface);
gp_Pnt2d aPointOnFace = aSAS.ValueOfUV(aPointToCheck, Precision::Confusion());
BRepTopAdaptor_FClass2d aFClass2d(aFace, Precision::Confusion());
- if(aFClass2d.Perform(aPointOnFace) == TopAbs_OUT) {
+ if (aFClass2d.Perform(aPointOnFace) == TopAbs_OUT) {
return false;
}
//==================================================================================================
bool GeomAlgoAPI_ShapeTools::isShapeValid(const std::shared_ptr<GeomAPI_Shape> theShape)
{
- if(!theShape.get()) {
+ if (!theShape.get()) {
return false;
}
{
GeomShapePtr anOuterWire;
- if(!theFace.get() || !theFace->isFace()) {
+ if (!theFace.get() || !theFace->isFace()) {
return anOuterWire;
}
bool GeomAlgoAPI_ShapeTools::isParallel(const std::shared_ptr<GeomAPI_Edge> theEdge,
const std::shared_ptr<GeomAPI_Face> theFace)
{
- if(!theEdge.get() || !theFace.get()) {
+ if (!theEdge.get() || !theFace.get()) {
return false;
}
const std::shared_ptr<GeomAPI_Edge> theEdge, const std::shared_ptr<GeomAPI_Face> theFace)
{
std::list<std::shared_ptr<GeomAPI_Vertex> > aResult;
- if(!theEdge.get() || !theFace.get()) {
+ if (!theEdge.get() || !theFace.get()) {
return aResult;
}
if (!anIntAlgo.IsDone())
return aResult;
// searching for points-intersection
- for(int anIntNum = 1; anIntNum <= anIntAlgo.NbPoints() + anIntAlgo.NbSegments(); anIntNum++) {
+ for (int anIntNum = 1; anIntNum <= anIntAlgo.NbPoints() + anIntAlgo.NbSegments(); anIntNum++) {
gp_Pnt anInt;
if (anIntNum <= anIntAlgo.NbPoints()) {
anInt = anIntAlgo.Point(anIntNum);
TopoDS_Edge aNewEdge = aWExp.Current();
aWExp.Next();
if (aWExp.More()) {
+ // Workaround for the closed wire to avoid jumping of its start point:
+ // split this wire for two parts, convert them to edges, then compose together
+ if (BRep_Tool::IsClosed(aWire)) {
+ aWire = TopoDS::Wire(BRepBuilderAPI_Copy(aWire).Shape());
+ aWExp.Init(aWire);
+ aNewEdge = aWExp.Current();
+
+ BRep_Builder().Remove(aWire, aNewEdge);
+ GeomWirePtr aSplitWire(new GeomAPI_Wire);
+ aSplitWire->setImpl(new TopoDS_Wire(aWire));
+ GeomEdgePtr aMergedEdge = wireToEdge(aSplitWire);
+
+ aWire = BRepBuilderAPI_MakeWire(aNewEdge, aMergedEdge->impl<TopoDS_Edge>());
+ }
+
// Workaround: when concatenate a wire consisting of two edges based on the same B-spline
// curve (non-periodic, but having equal start and end points), first of which is placed
// at the end on the curve and second is placed at the start, this workaround copies
aWire = fixParametricGaps(aWire);
aWire = BRepAlgo::ConcatenateWire(aWire, GeomAbs_G1); // join smooth parts of wire
aNewEdge = BRepAlgo::ConcatenateWireC0(aWire); // join C0 parts of wire
+
+ // Reapproximate the result edge to have the parameter equal to curvilinear abscissa.
+ static const int THE_MAX_DEGREE = 14;
+ static const int THE_MAX_INTERVALS = 32;
+ double aFirst, aLast;
+ Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aNewEdge, aFirst, aLast);
+ Handle(GeomAdaptor_HCurve) aHCurve = new GeomAdaptor_HCurve(aCurve);
+ Approx_CurvilinearParameter anApprox(aHCurve, Precision::Confusion(), aCurve->Continuity(),
+ THE_MAX_DEGREE, THE_MAX_INTERVALS);
+ if (anApprox.HasResult()) {
+ Handle(Geom_BSplineCurve) aNewCurve = anApprox.Curve3d();
+ TColStd_Array1OfReal aKnots = aNewCurve->Knots();
+ BSplCLib::Reparametrize(aFirst, aLast, aKnots);
+ aNewCurve->SetKnots(aKnots);
+ BRep_Builder().UpdateEdge(aNewEdge, aNewCurve, BRep_Tool::Tolerance(aNewEdge));
+ }
}
anEdge = GeomEdgePtr(new GeomAPI_Edge);
anEdge->setImpl(new TopoDS_Edge(aNewEdge));
TopExp_Explorer anExp(aBaseShape, TopAbs_FACE);
const TopoDS_Shape& aFace = anExp.Current();
Handle(Geom_Surface) aSurface = BRep_Tool::Surface(TopoDS::Face(aFace));
- if(aSurface->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
+ if (aSurface->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
Handle(Geom_RectangularTrimmedSurface) aTrimSurface =
Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
aSurface = aTrimSurface->BasisSurface();
}
- if(aSurface->DynamicType() != STANDARD_TYPE(Geom_Plane)) {
+ if (aSurface->DynamicType() != STANDARD_TYPE(Geom_Plane)) {
return;
}
aPlane = Handle(Geom_Plane)::DownCast(aSurface);