Part/Toponaming: makeElementWires

* Renamed enum classes members to lowercaseCapword
 * Moved struct ShapeHasher back to TopoShapeMapper.h
 * Added test for MapperMaker::generated
 * Modifications for clang-tidy warnings
 * Formatting

Signed-off-by: CalligaroV <vincenzo.calligaro@gmail.com>
This commit is contained in:
CalligaroV
2024-02-08 13:56:30 +01:00
parent 44abeca013
commit b186d16ca7
5 changed files with 168 additions and 148 deletions

View File

@@ -3148,8 +3148,9 @@ void TopoShape::sewShape(double tolerance)
bool TopoShape::fix()
{
if (this->_Shape.IsNull())
if (this->_Shape.IsNull()) {
return false;
}
// First, we do fix regardless if the current shape is valid or not,
// because not all problems that are handled by ShapeFix_Shape can be
@@ -3164,12 +3165,14 @@ bool TopoShape::fix()
ShapeFix_Shape fix(copy._Shape);
fix.Perform();
if (fix.Shape().IsSame(copy._Shape))
if (fix.Shape().IsSame(copy._Shape)) {
return false;
}
BRepCheck_Analyzer aChecker(fix.Shape());
if (!aChecker.IsValid())
if (!aChecker.IsValid()) {
return false;
}
// If the above fix produces a valid shape, then we fix the original shape,
// because BRepBuilderAPI_Copy has some undesired side effect (e.g. flatten
@@ -3189,8 +3192,10 @@ bool TopoShape::fix()
// remapping, there will be invalid index jumpping in reference in
// Sketch002.ExternalEdge5.
makeShapeWithElementMap(fixThis.Shape(), MapperHistory(fixThis), {*this});
} else
}
else {
makeShapeWithElementMap(fix.Shape(), MapperHistory(fix), {copy});
}
return true;
}

View File

@@ -30,10 +30,6 @@
#include <Base/Exception.h>
#include <Mod/Part/PartGlobal.h>
#include <BRepBuilderAPI_MakeShape.hxx>
#include <BRepTools_History.hxx>
#include <BRepTools_ReShape.hxx>
#include <ShapeFix_Root.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Wire.hxx>
#include <TopTools_ListOfShape.hxx>
@@ -43,6 +39,9 @@
#include <BRepOffsetAPI_MakePipeShell.hxx>
#include <BRepFeat_MakePrism.hxx>
#include <BRepPrimAPI_MakeHalfSpace.hxx>
#include <BRepTools_History.hxx>
#include <BRepTools_ReShape.hxx>
#include <ShapeFix_Root.hxx>
class gp_Ax1;
class gp_Ax2;
@@ -695,7 +694,7 @@ public:
bool canMapElement(const TopoShape &other) const;
void mapSubElement(const TopoShape &other,const char *op=nullptr, bool forceHasher=false);
void mapSubElement(const std::vector<TopoShape> &shapes, const char *op=nullptr);
void mapSubElementsTo(std::vector<TopoShape> &shapes, const char *op=nullptr) const;
void mapSubElementsTo(std::vector<TopoShape>& shapes, const char* op = nullptr) const;
bool hasPendingElementMap() const;
/** Helper class to return the generated and modified shape given an input shape
@@ -741,8 +740,8 @@ public:
* return the shape as given, or to force it to be placed in a Compound.
*/
enum class SingleShapeCompoundCreationPolicy {
RETURN_SHAPE,
FORCE_COMPOUND
returnShape,
forceCompound
};
/** Make a compound shape
@@ -759,12 +758,14 @@ public:
*/
TopoShape& makeElementCompound(const std::vector<TopoShape>& shapes,
const char* op = nullptr,
SingleShapeCompoundCreationPolicy policy = SingleShapeCompoundCreationPolicy::FORCE_COMPOUND);
SingleShapeCompoundCreationPolicy policy =
SingleShapeCompoundCreationPolicy::forceCompound);
enum class ConnectionPolicy {
REQUIRE_SHARED_VERTEX,
MERGE_WITH_TOLERANCE
enum class ConnectionPolicy
{
requireSharedVertex,
mergeWithTolerance
};
/** Make a compound of wires by connecting input edges
@@ -792,7 +793,7 @@ public:
TopoShape& makeElementWires(const std::vector<TopoShape>& shapes,
const char* op = nullptr,
double tol = 0.0,
ConnectionPolicy policy = ConnectionPolicy::MERGE_WITH_TOLERANCE,
ConnectionPolicy policy = ConnectionPolicy::mergeWithTolerance,
TopoShapeMap* output = nullptr);
@@ -805,8 +806,8 @@ public:
* @param keepOrder: whether to respect the order of the input edges
* @param tol: tolerance for checking the distance of two vertex to decide
* if two edges are connected
* @param policy: if REQUIRE_SHARED_VERTEX, then only connect edges if they shared the same
* vertex. If MERGE_WITH_TOLERANCE use \c tol to check for connection.
* @param policy: if requireSharedVertex, then only connect edges if they shared the same
* vertex. If mergeWithTolerance use \c tol to check for connection.
* @param output: optional output mapping from wire edges to input edge.
* Note that edges may be modified after adding to the wire,
* so the output edges may not be the same as the input
@@ -821,7 +822,7 @@ public:
TopoShape& makeElementWires(const TopoShape& shape,
const char* op = nullptr,
double tol = 0.0,
ConnectionPolicy policy = ConnectionPolicy::MERGE_WITH_TOLERANCE,
ConnectionPolicy policy = ConnectionPolicy::mergeWithTolerance,
TopoShapeMap* output = nullptr);
/** Make a compound of wires by connecting input edges in the given order
@@ -869,14 +870,13 @@ public:
*/
TopoShape makeElementWires(const char* op = nullptr,
double tol = 0.0,
ConnectionPolicy policy = ConnectionPolicy::MERGE_WITH_TOLERANCE,
ConnectionPolicy policy = ConnectionPolicy::mergeWithTolerance,
TopoShapeMap* output = nullptr) const
{
return TopoShape(0, Hasher).makeElementWires(*this, op, tol, policy, output);
}
/** Make a deep copy of the shape
*
* @param source: input shape
@@ -890,7 +890,10 @@ public:
* TopoShape itself as a self reference so that multiple operations
* can be carried out for the same shape in the same line of code.
*/
TopoShape &makeElementCopy(const TopoShape &source, const char *op=nullptr, bool copyGeom=true, bool copyMesh=false);
TopoShape& makeElementCopy(const TopoShape& source,
const char* op = nullptr,
bool copyGeom = true,
bool copyMesh = false);
/** Make a deep copy of the shape
*
@@ -902,8 +905,10 @@ public:
* @return Return a deep copy of the shape. The shape itself is not
* modified
*/
TopoShape makeElementCopy(const char *op=nullptr, bool copyGeom=true, bool copyMesh=false) const {
return TopoShape(Tag,Hasher).makeElementCopy(*this,op,copyGeom,copyMesh);
TopoShape
makeElementCopy(const char* op = nullptr, bool copyGeom = true, bool copyMesh = false) const
{
return TopoShape(Tag, Hasher).makeElementCopy(*this, op, copyGeom, copyMesh);
}
/* Make a shell using this shape
@@ -1398,77 +1403,7 @@ private:
*/
static std::deque<TopoShape>
sortEdges(std::list<TopoShape>& edges, bool keepOrder = false, double tol = 0.0);
static TopoShape reverseEdge (const TopoShape& edge);
};
/// Shape hasher that ignore orientation
struct ShapeHasher
{
inline size_t operator()(const TopoShape& s) const
{
#if OCC_VERSION_HEX >= 0x070800
return std::hash<TopoDS_Shape> {}(s.getShape());
#else
return s.getShape().HashCode(INT_MAX);
#endif
}
inline size_t operator()(const TopoDS_Shape& s) const
{
#if OCC_VERSION_HEX >= 0x070800
return std::hash<TopoDS_Shape> {}(s);
#else
return s.HashCode(INT_MAX);
#endif
}
inline bool operator()(const TopoShape& a, const TopoShape& b) const
{
return a.getShape().IsSame(b.getShape());
}
inline bool operator()(const TopoDS_Shape& a, const TopoDS_Shape& b) const
{
return a.IsSame(b);
}
template<class T>
static inline void hash_combine(std::size_t& seed, const T& v)
{
// copied from boost::hash_combine
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
inline size_t operator()(const std::pair<TopoShape, TopoShape>& s) const
{
#if OCC_VERSION_HEX >= 0x070800
size_t res = std::hash<TopoDS_Shape> {}(s.first.getShape());
hash_combine(res, std::hash<TopoDS_Shape> {}(s.second.getShape()));
#else
size_t res = s.first.getShape().HashCode(INT_MAX);
hash_combine(res, s.second.getShape().HashCode(INT_MAX));
#endif
return res;
}
inline size_t operator()(const std::pair<TopoDS_Shape, TopoDS_Shape>& s) const
{
#if OCC_VERSION_HEX >= 0x070800
size_t res = std::hash<TopoDS_Shape> {}(s.first);
hash_combine(res, std::hash<TopoDS_Shape> {}(s.second));
#else
size_t res = s.first.HashCode(INT_MAX);
hash_combine(res, s.second.HashCode(INT_MAX));
#endif
return res;
}
inline bool operator()(const std::pair<TopoShape, TopoShape>& a,
const std::pair<TopoShape, TopoShape>& b) const
{
return a.first.getShape().IsSame(b.first.getShape())
&& a.second.getShape().IsSame(b.second.getShape());
}
inline bool operator()(const std::pair<TopoDS_Shape, TopoDS_Shape>& a,
const std::pair<TopoDS_Shape, TopoDS_Shape>& b) const
{
return a.first.IsSame(b.first) && a.second.IsSame(b.second);
}
static TopoShape reverseEdge(const TopoShape& edge);
};
/** Shape mapper for generic BRepBuilderAPI_MakeShape derived class
@@ -1476,13 +1411,14 @@ struct ShapeHasher
* Uses BRepBuilderAPI_MakeShape::Modified/Generated() function to extract
* shape history for generating mapped element names
*/
struct PartExport MapperMaker: TopoShape::Mapper {
BRepBuilderAPI_MakeShape &maker;
MapperMaker(BRepBuilderAPI_MakeShape &maker)
:maker(maker)
struct PartExport MapperMaker: TopoShape::Mapper
{
BRepBuilderAPI_MakeShape& maker;
explicit MapperMaker(BRepBuilderAPI_MakeShape& maker)
: maker(maker)
{}
virtual const std::vector<TopoDS_Shape> &modified(const TopoDS_Shape &s) const override;
virtual const std::vector<TopoDS_Shape> &generated(const TopoDS_Shape &s) const override;
const std::vector<TopoDS_Shape>& modified(const TopoDS_Shape& s) const override;
const std::vector<TopoDS_Shape>& generated(const TopoDS_Shape& s) const override;
};
/** Shape mapper for BRepTools_History
@@ -1490,13 +1426,14 @@ struct PartExport MapperMaker: TopoShape::Mapper {
* Uses BRepTools_History::Modified/Generated() function to extract
* shape history for generating mapped element names
*/
struct PartExport MapperHistory: TopoShape::Mapper {
struct PartExport MapperHistory: TopoShape::Mapper
{
Handle(BRepTools_History) history;
MapperHistory(const Handle(BRepTools_History) &history);
MapperHistory(const Handle(BRepTools_ReShape) &reshape);
MapperHistory(ShapeFix_Root &fix);
virtual const std::vector<TopoDS_Shape> &modified(const TopoDS_Shape &s) const override;
virtual const std::vector<TopoDS_Shape> &generated(const TopoDS_Shape &s) const override;
explicit MapperHistory(const Handle(BRepTools_History) & history);
explicit MapperHistory(const Handle(BRepTools_ReShape) & reshape);
explicit MapperHistory(ShapeFix_Root& fix);
const std::vector<TopoDS_Shape>& modified(const TopoDS_Shape& s) const override;
const std::vector<TopoDS_Shape>& generated(const TopoDS_Shape& s) const override;
};
} // namespace Part

View File

@@ -44,9 +44,7 @@
#include <utility>
#include <BRepBuilderAPI_Copy.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <TopTools_HSequenceOfShape.hxx>
#include <Precision.hxx>
#include <ShapeAnalysis_FreeBounds.hxx>
#endif
@@ -1293,12 +1291,11 @@ void addShapesToBuilder(const std::vector<TopoShape>& shapes,
}
} // namespace
TopoShape&
TopoShape::makeElementCompound(const std::vector<TopoShape>& shapes,
const char* op,
SingleShapeCompoundCreationPolicy policy)
TopoShape& TopoShape::makeElementCompound(const std::vector<TopoShape>& shapes,
const char* op,
SingleShapeCompoundCreationPolicy policy)
{
if (policy == SingleShapeCompoundCreationPolicy::RETURN_SHAPE && shapes.size() == 1) {
if (policy == SingleShapeCompoundCreationPolicy::returnShape && shapes.size() == 1) {
*this = shapes[0];
return *this;
}
@@ -1348,7 +1345,7 @@ TopoShape& TopoShape::makeElementWires(const TopoShape& shape,
tol = Precision::Confusion();
}
if (policy == ConnectionPolicy::REQUIRE_SHARED_VERTEX) {
if (policy == ConnectionPolicy::requireSharedVertex) {
// Can't use ShapeAnalysis_FreeBounds if not shared. It seems the output
// edges are modified somehow, and it is not obvious how to map the
// resulting edges.
@@ -1371,7 +1368,7 @@ TopoShape& TopoShape::makeElementWires(const TopoShape& shape,
wires.emplace_back(Tag, Hasher, wire);
}
shape.mapSubElementsTo(wires, op);
return makeElementCompound(wires, "", SingleShapeCompoundCreationPolicy::RETURN_SHAPE);
return makeElementCompound(wires, "", SingleShapeCompoundCreationPolicy::returnShape);
}
std::vector<TopoShape> wires;
@@ -1429,7 +1426,7 @@ TopoShape& TopoShape::makeElementWires(const TopoShape& shape,
wires.back().mapSubElement(edges, op);
wires.back().fix();
}
return makeElementCompound(wires, nullptr, SingleShapeCompoundCreationPolicy::RETURN_SHAPE);
return makeElementCompound(wires, nullptr, SingleShapeCompoundCreationPolicy::returnShape);
}
@@ -1438,7 +1435,7 @@ struct EdgePoints
gp_Pnt v1, v2;
std::list<TopoShape>::iterator it;
const TopoShape* edge;
bool closed{false};
bool closed {false};
EdgePoints(std::list<TopoShape>::iterator it, double tol)
: it(it)
@@ -1458,11 +1455,11 @@ struct EdgePoints
}
};
TopoShape TopoShape::reverseEdge (const TopoShape& edge) {
TopoShape TopoShape::reverseEdge(const TopoShape& edge)
{
Standard_Real first = NAN;
Standard_Real last = NAN;
const Handle(Geom_Curve)& curve =
BRep_Tool::Curve(TopoDS::Edge(edge.getShape()), first, last);
const Handle(Geom_Curve)& curve = BRep_Tool::Curve(TopoDS::Edge(edge.getShape()), first, last);
first = curve->ReversedParameter(first);
last = curve->ReversedParameter(last);
TopoShape res(BRepBuilderAPI_MakeEdge(curve->Reversed(), last, first));
@@ -1596,7 +1593,8 @@ TopoShape& TopoShape::makeElementOrderedWires(const std::vector<TopoShape>& shap
std::vector<TopoShape> wires;
std::list<TopoShape> edgeList;
auto shape = TopoShape().makeElementCompound(shapes, "", SingleShapeCompoundCreationPolicy::RETURN_SHAPE);
auto shape =
TopoShape().makeElementCompound(shapes, "", SingleShapeCompoundCreationPolicy::returnShape);
for (auto& edge : shape.getSubTopoShapes(TopAbs_EDGE)) {
edgeList.push_back(edge);
}
@@ -1618,29 +1616,34 @@ TopoShape& TopoShape::makeElementOrderedWires(const std::vector<TopoShape>& shap
wires.emplace_back(mkWire.Wire());
wires.back().mapSubElement(edges, op);
}
return makeElementCompound(wires, nullptr, SingleShapeCompoundCreationPolicy::RETURN_SHAPE);
return makeElementCompound(wires, nullptr, SingleShapeCompoundCreationPolicy::returnShape);
}
TopoShape &TopoShape::makeElementCopy(const TopoShape &shape, const char *op, bool copyGeom, bool copyMesh)
TopoShape&
TopoShape::makeElementCopy(const TopoShape& shape, const char* op, bool copyGeom, bool copyMesh)
{
if(shape.isNull())
if (shape.isNull()) {
return *this;
}
TopoShape tmp(shape);
#if OCC_VERSION_HEX >= 0x070000
tmp.setShape(BRepBuilderAPI_Copy(shape.getShape(),copyGeom,copyMesh).Shape(), false);
tmp.setShape(BRepBuilderAPI_Copy(shape.getShape(), copyGeom, copyMesh).Shape(), false);
#else
tmp.setShape(BRepBuilderAPI_Copy(shape.getShape()).Shape(), false);
#endif
if(op || (shape.Tag && shape.Tag!=Tag)) {
if (op || (shape.Tag && shape.Tag != Tag)) {
setShape(tmp._Shape);
initCache();
if (!Hasher)
if (!Hasher) {
Hasher = tmp.Hasher;
}
copyElementMap(tmp, op);
}else
}
else {
*this = tmp;
}
return *this;
}
@@ -2135,52 +2138,58 @@ const std::vector<TopoDS_Shape>& MapperMaker::generated(const TopoDS_Shape& s) c
return _res;
}
MapperHistory::MapperHistory(const Handle(BRepTools_History) &history)
:history(history)
MapperHistory::MapperHistory(const Handle(BRepTools_History) & history)
: history(history)
{}
MapperHistory::MapperHistory(const Handle(BRepTools_ReShape) &reshape)
MapperHistory::MapperHistory(const Handle(BRepTools_ReShape) & reshape)
{
if (reshape)
if (reshape) {
history = reshape->History();
}
}
MapperHistory::MapperHistory(ShapeFix_Root &fix)
MapperHistory::MapperHistory(ShapeFix_Root& fix)
{
if (fix.Context())
if (fix.Context()) {
history = fix.Context()->History();
}
}
const std::vector<TopoDS_Shape> &
MapperHistory::modified(const TopoDS_Shape &s) const
const std::vector<TopoDS_Shape>& MapperHistory::modified(const TopoDS_Shape& s) const
{
_res.clear();
try {
if (history) {
TopTools_ListIteratorOfListOfShape it;
for (it.Initialize(history->Modified(s)); it.More(); it.Next())
for (it.Initialize(history->Modified(s)); it.More(); it.Next()) {
_res.push_back(it.Value());
}
}
} catch (const Standard_Failure & e) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG))
}
catch (const Standard_Failure& e) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG)) {
FC_WARN("Exception on shape mapper: " << e.GetMessageString());
}
}
return _res;
}
const std::vector<TopoDS_Shape> &
MapperHistory::generated(const TopoDS_Shape &s) const
const std::vector<TopoDS_Shape>& MapperHistory::generated(const TopoDS_Shape& s) const
{
_res.clear();
try {
if (history) {
TopTools_ListIteratorOfListOfShape it;
for (it.Initialize(history->Generated(s)); it.More(); it.Next())
for (it.Initialize(history->Generated(s)); it.More(); it.Next()) {
_res.push_back(it.Value());
}
}
} catch (const Standard_Failure & e) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG))
}
catch (const Standard_Failure& e) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG)) {
FC_WARN("Exception on shape mapper: " << e.GetMessageString());
}
}
return _res;
}

View File

@@ -25,7 +25,6 @@
#include <unordered_set>
#include <vector>
#include <ShapeBuild_ReShape.hxx>
#include <Standard_Version.hxx>
#include <TopoDS.hxx>
#include <TopExp_Explorer.hxx>
@@ -39,11 +38,81 @@ class ShapeFix_Root;
namespace Part
{
/// Shape hasher that ignore orientation
struct ShapeHasher
{
inline size_t operator()(const TopoShape& s) const
{
#if OCC_VERSION_HEX >= 0x070800
return std::hash<TopoDS_Shape> {}(s.getShape());
#else
return s.getShape().HashCode(INT_MAX);
#endif
}
inline size_t operator()(const TopoDS_Shape& s) const
{
#if OCC_VERSION_HEX >= 0x070800
return std::hash<TopoDS_Shape> {}(s);
#else
return s.HashCode(INT_MAX);
#endif
}
inline bool operator()(const TopoShape& a, const TopoShape& b) const
{
return a.getShape().IsSame(b.getShape());
}
inline bool operator()(const TopoDS_Shape& a, const TopoDS_Shape& b) const
{
return a.IsSame(b);
}
template<class T>
static inline void hash_combine(std::size_t& seed, const T& v)
{
// copied from boost::hash_combine
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
inline size_t operator()(const std::pair<TopoShape, TopoShape>& s) const
{
#if OCC_VERSION_HEX >= 0x070800
size_t res = std::hash<TopoDS_Shape> {}(s.first.getShape());
hash_combine(res, std::hash<TopoDS_Shape> {}(s.second.getShape()));
#else
size_t res = s.first.getShape().HashCode(INT_MAX);
hash_combine(res, s.second.getShape().HashCode(INT_MAX));
#endif
return res;
}
inline size_t operator()(const std::pair<TopoDS_Shape, TopoDS_Shape>& s) const
{
#if OCC_VERSION_HEX >= 0x070800
size_t res = std::hash<TopoDS_Shape> {}(s.first);
hash_combine(res, std::hash<TopoDS_Shape> {}(s.second));
#else
size_t res = s.first.HashCode(INT_MAX);
hash_combine(res, s.second.HashCode(INT_MAX));
#endif
return res;
}
inline bool operator()(const std::pair<TopoShape, TopoShape>& a,
const std::pair<TopoShape, TopoShape>& b) const
{
return a.first.getShape().IsSame(b.first.getShape())
&& a.second.getShape().IsSame(b.second.getShape());
}
inline bool operator()(const std::pair<TopoDS_Shape, TopoDS_Shape>& a,
const std::pair<TopoDS_Shape, TopoDS_Shape>& b) const
{
return a.first.IsSame(b.first) && a.second.IsSame(b.second);
}
};
enum class MappingStatus
{
Generated,
Modified
};
/** Shape mapper for user defined shape mapping
*/
struct PartExport ShapeMapper: TopoShape::Mapper

View File

@@ -60,7 +60,7 @@ TEST_F(TopoShapeExpansionTest, makeElementCompoundOneShapeReturnsShape)
topoShape.makeElementCompound(shapes,
"C",
Part::TopoShape::SingleShapeCompoundCreationPolicy::
RETURN_SHAPE /*Don't force the creation*/);
returnShape /*Don't force the creation*/);
// Assert
EXPECT_EQ(edge.ShapeType(), topoShape.getShape().ShapeType()); // NOT a Compound
@@ -77,7 +77,7 @@ TEST_F(TopoShapeExpansionTest, makeElementCompoundOneShapeForceReturnsCompound)
topoShape.makeElementCompound(
shapes,
"C",
Part::TopoShape::SingleShapeCompoundCreationPolicy::FORCE_COMPOUND /*Force the creation*/);
Part::TopoShape::SingleShapeCompoundCreationPolicy::forceCompound /*Force the creation*/);
// Assert
EXPECT_NE(edge.ShapeType(), topoShape.getShape().ShapeType()); // No longer the same thing