mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 12:07:59 +00:00
#2133 faceset helper: compare index vectors by address instead of value
This commit is contained in:
+15
-3
@@ -111,6 +111,18 @@ public:
|
|||||||
std::map<int, TopoDS_Shape> Shape;
|
std::map<int, TopoDS_Shape> Shape;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace util {
|
||||||
|
template <typename T>
|
||||||
|
typename std::enable_if<std::is_pointer<T>::value, T&>::type conditional_address_of(T& t) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
typename std::enable_if<!std::is_pointer<T>::value, T*>::type conditional_address_of(T& t) {
|
||||||
|
return &t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class IFC_GEOM_API MAKE_TYPE_NAME(Kernel) : public IfcGeom::Kernel {
|
class IFC_GEOM_API MAKE_TYPE_NAME(Kernel) : public IfcGeom::Kernel {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -126,7 +138,7 @@ private:
|
|||||||
class faceset_helper {
|
class faceset_helper {
|
||||||
private:
|
private:
|
||||||
MAKE_TYPE_NAME(Kernel)* kernel_;
|
MAKE_TYPE_NAME(Kernel)* kernel_;
|
||||||
std::set<LP> duplicates_;
|
std::set<typename std::conditional<std::is_pointer<LP>::value, LP, const LP*>::type> duplicates_;
|
||||||
std::map<const void*, int> vertex_mapping_;
|
std::map<const void*, int> vertex_mapping_;
|
||||||
std::map<std::pair<int, int>, TopoDS_Edge> edges_;
|
std::map<std::pair<int, int>, TopoDS_Edge> edges_;
|
||||||
// not always in use
|
// not always in use
|
||||||
@@ -225,8 +237,8 @@ private:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wire(LP loop, TopoDS_Wire& wire) {
|
bool wire(const LP& loop, TopoDS_Wire& wire) {
|
||||||
if (duplicates_.find(loop) != duplicates_.end()) {
|
if (duplicates_.find(util::conditional_address_of(loop)) != duplicates_.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
BRep_Builder builder;
|
BRep_Builder builder;
|
||||||
|
|||||||
@@ -5613,7 +5613,7 @@ IfcGeom::Kernel::faceset_helper<CP, LP>::faceset_helper(
|
|||||||
|
|
||||||
if (edge_sets.find(segment_set) != edge_sets.end()) {
|
if (edge_sets.find(segment_set) != edge_sets.end()) {
|
||||||
duplicate_faces++;
|
duplicate_faces++;
|
||||||
duplicates_.insert(*ps);
|
duplicates_.insert(util::conditional_address_of(*ps));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
edge_sets.insert(segment_set);
|
edge_sets.insert(segment_set);
|
||||||
|
|||||||
Reference in New Issue
Block a user