Skip to content

Commit 4b99a98

Browse files
committed
Boolean functions to bimGeometry
1 parent 36cf68f commit 4b99a98

File tree

17 files changed

+407
-154
lines changed

17 files changed

+407
-154
lines changed

src/cpp/test/io_helpers.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ namespace webifc::io
160160

161161
for (uint32_t i = 0; i < geom.numFaces; i++)
162162
{
163-
webifc::geometry::Face f = geom.GetFace(i);
163+
bimGeometry::Face f = geom.GetFace(i);
164164
obj << "f " << (f.i0 + 1 + offset) << "// " << (f.i1 + 1 + offset) << "// " << (f.i2 + 1 + offset) << "//\n";
165165
}
166166

@@ -231,7 +231,7 @@ namespace webifc::io
231231

232232
for (uint32_t i = 0; i < geom.numFaces; i++)
233233
{
234-
webifc::geometry::Face f = geom.GetFace(i);
234+
bimGeometry::Face f = geom.GetFace(i);
235235
obj << "f " << (f.i0 + 1 + offset) << "// " << (f.i1 + 1 + offset) << "// " << (f.i2 + 1 + offset) << "//\n";
236236
}
237237

src/cpp/test/web-ifc-test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ int main()
462462
// std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/15.ifc");
463463
// std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/F_MA_160_ALT3.ifc");
464464
// std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/1256.ifc");
465-
std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/muysimple.ifc");
465+
std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/1092_A.ifc");
466466

467467
struct LoaderSettings
468468
{
@@ -501,8 +501,8 @@ int main()
501501

502502
start = ms();
503503

504-
SpecificLoadTest(loader, geometryLoader, 3994);
505-
// auto meshes = LoadAllTest(loader, geometryLoader, -1);
504+
// SpecificLoadTest(loader, geometryLoader, 3994);
505+
auto meshes = LoadAllTest(loader, geometryLoader, -1);
506506
// auto rebars = GetAllRebars(loader, geometryLoader);
507507
// std::cout << GetLine(loader, 225) << std::endl;
508508
// auto alignments = GetAlignments(loader, geometryLoader);

src/cpp/wasm/web-ifc-wasm.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "../web-ifc/geometry/operations/bim-geometry/arc.h"
2323
#include "../web-ifc/geometry/operations/bim-geometry/alignment.h"
2424
#include "../web-ifc/geometry/operations/bim-geometry/utils.h"
25+
#include "../web-ifc/geometry/operations/bim-geometry/boolean.h"
2526

2627
namespace webifc::parsing {
2728
void p21encode(std::string_view input, std::ostringstream &output);
@@ -837,6 +838,10 @@ bimGeometry::Alignment CreateAlignment()
837838
return bimGeometry::Alignment();
838839
}
839840

841+
bimGeometry::Boolean CreateBoolean()
842+
{
843+
return bimGeometry::Boolean();
844+
}
840845

841846
EMSCRIPTEN_BINDINGS(my_module) {
842847

@@ -1023,6 +1028,14 @@ EMSCRIPTEN_BINDINGS(my_module) {
10231028
.function("GetBuffers", &bimGeometry::Alignment::GetBuffers)
10241029
.function("SetValues", &bimGeometry::Alignment::SetValues)
10251030
;
1031+
1032+
emscripten::class_<bimGeometry::Boolean>("BooleanOperator")
1033+
.constructor<>()
1034+
.function("GetBuffers", &bimGeometry::Boolean::GetBuffers)
1035+
.function("SetValues", &bimGeometry::Boolean::SetValues)
1036+
.function("SetSecond", &bimGeometry::Boolean::SetSecond)
1037+
.function("clear", &bimGeometry::Boolean::clear)
1038+
;
10261039

10271040
emscripten::function("CreateAABB", &CreateAABB);
10281041
emscripten::function("CreateExtrusion", &CreateExtrusion);
@@ -1034,6 +1047,7 @@ EMSCRIPTEN_BINDINGS(my_module) {
10341047
emscripten::function("CreateClothoid", &CreateClothoid);
10351048
emscripten::function("CreateArc", &CreateArc);
10361049
emscripten::function("CreateAlignment", &CreateAlignment);
1050+
emscripten::function("CreateBooleanOperator", &CreateBoolean);
10371051
emscripten::function("LoadAllGeometry", &LoadAllGeometry);
10381052
emscripten::function("GetAllCrossSections", &GetAllCrossSections);
10391053
emscripten::function("GetAllAlignments", &GetAllAlignments);
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include <vector>
2+
#include <algorithm>
3+
#include <glm/glm.hpp>
4+
#include "boolean.h"
5+
#include "epsilons.h"
6+
#include "geometry.h"
7+
#include "utils.h"
8+
#include "booleanUtils.h"
9+
10+
using Vec = glm::dvec3;
11+
12+
namespace bimGeometry {
13+
14+
Buffers Boolean::GetBuffers()
15+
{
16+
Buffers buffers;
17+
18+
Geometry geom = BoolProcess(geometry, seconds, op);
19+
20+
for (int r = 0; r < geom.numFaces; r++)
21+
{
22+
bimGeometry::Face f = geom.GetFace(r);
23+
buffers.AddTri(geom.GetPoint(f.i0), geom.GetPoint(f.i1), geom.GetPoint(f.i2));
24+
}
25+
26+
return buffers;
27+
}
28+
29+
void Boolean::SetValues(std::vector<double> triangles_, std::string op_) {
30+
op = op_;
31+
geometry = Geometry();
32+
for (size_t i = 0; i + 8 < triangles_.size(); i += 9) {
33+
geometry.AddFace(
34+
glm::dvec3(triangles_[i], triangles_[i + 1], triangles_[i + 2]),
35+
glm::dvec3(triangles_[i + 3], triangles_[i + 4], triangles_[i + 5]),
36+
glm::dvec3(triangles_[i + 6], triangles_[i + 7], triangles_[i + 8])
37+
);
38+
}
39+
geometry.buildPlanes();
40+
}
41+
42+
void Boolean::SetSecond(std::vector<double> triangles_) {
43+
Geometry newGeometry = Geometry();
44+
for (size_t i = 0; i + 8 < triangles_.size(); i += 9) {
45+
newGeometry.AddFace(
46+
glm::dvec3(triangles_[i], triangles_[i + 1], triangles_[i + 2]),
47+
glm::dvec3(triangles_[i + 3], triangles_[i + 4], triangles_[i + 5]),
48+
glm::dvec3(triangles_[i + 6], triangles_[i + 7], triangles_[i + 8])
49+
);
50+
}
51+
newGeometry.buildPlanes();
52+
seconds.push_back(newGeometry);
53+
}
54+
55+
void Boolean::clear()
56+
{
57+
geometry = Geometry();
58+
seconds.clear();
59+
op = "";
60+
}
61+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <vector>
2+
#include <algorithm>
3+
#include <glm/glm.hpp>
4+
#include "geometry.h"
5+
#include "buffers.h"
6+
#include <string>
7+
8+
using Vec = glm::dvec3;
9+
10+
#pragma once
11+
12+
namespace bimGeometry {
13+
14+
struct Boolean
15+
{
16+
int type;
17+
std::string op;
18+
Geometry geometry;
19+
std::vector<Geometry> seconds;
20+
std::vector<std::vector<glm::dvec3>> triangles;
21+
22+
Buffers GetBuffers();
23+
void clear();
24+
void SetValues(std::vector<double> triangles_, std::string op_);
25+
void SetSecond(std::vector<double> triangles_);
26+
};
27+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include "../boolean-utils/fuzzy-bools.h"
2+
#include "geometry.h"
3+
4+
#pragma once
5+
6+
namespace bimGeometry
7+
{
8+
fuzzybools::Geometry convertToEngine(Geometry geom)
9+
{
10+
fuzzybools::Geometry newGeom;
11+
newGeom.fvertexData = geom.fvertexData;
12+
newGeom.vertexData = geom.vertexData;
13+
newGeom.indexData = geom.indexData;
14+
newGeom.planeData = geom.planeData;
15+
newGeom.numPoints = geom.numPoints;
16+
newGeom.numFaces = geom.numFaces;
17+
for(auto plane: geom.planes)
18+
{
19+
fuzzybools::SimplePlane newPlane;
20+
newPlane.distance = plane.distance;
21+
newPlane.normal = plane.normal;
22+
newGeom.planes.push_back(newPlane);
23+
}
24+
newGeom.hasPlanes = geom.hasPlanes;
25+
return newGeom;
26+
}
27+
28+
Geometry convertToBim(fuzzybools::Geometry geom)
29+
{
30+
Geometry newGeom;
31+
newGeom.fvertexData = geom.fvertexData;
32+
newGeom.vertexData = geom.vertexData;
33+
newGeom.indexData = geom.indexData;
34+
newGeom.planeData = geom.planeData;
35+
newGeom.numPoints = geom.numPoints;
36+
newGeom.numFaces = geom.numFaces;
37+
uint32_t id = 0;
38+
for(auto plane: geom.planes)
39+
{
40+
Plane newPlane;
41+
newPlane.id = id;
42+
newPlane.distance = plane.distance;
43+
newPlane.normal = plane.normal;
44+
newGeom.planes.push_back(newPlane);
45+
id++;
46+
}
47+
newGeom.hasPlanes = geom.hasPlanes;
48+
return newGeom;
49+
}
50+
51+
Geometry Union(Geometry firstOperator, Geometry secondOperator)
52+
{
53+
fuzzybools::Geometry firstEngGeom = convertToEngine(firstOperator);
54+
fuzzybools::Geometry secondEngGeom = convertToEngine(secondOperator);
55+
return convertToBim(fuzzybools::Union(firstEngGeom, secondEngGeom));
56+
}
57+
58+
Geometry Subtract(Geometry firstOperator, Geometry secondOperator)
59+
{
60+
fuzzybools::Geometry firstEngGeom = convertToEngine(firstOperator);
61+
fuzzybools::Geometry secondEngGeom = convertToEngine(secondOperator);
62+
return convertToBim(fuzzybools::Subtract(firstEngGeom, secondEngGeom));
63+
}
64+
65+
Geometry BoolProcess(Geometry firstOperator, std::vector<Geometry> &secondGeoms, std::string op)
66+
{
67+
Geometry finalResult;
68+
69+
for (auto &secondGeom : secondGeoms)
70+
{
71+
bool doit = true;
72+
if (secondGeom.numFaces == 0)
73+
{
74+
75+
// bail out because we will get strange meshes
76+
// if this happens, probably there's an issue parsing the mesh that occurred earlier
77+
doit = false;
78+
}
79+
80+
if (firstOperator.numFaces == 0 && op != "UNION")
81+
{
82+
83+
// bail out because we will get strange meshes
84+
// if this happens, probably there's an issue parsing the mesh that occurred earlier
85+
break;
86+
}
87+
88+
if (doit)
89+
{
90+
Geometry secondOperator;
91+
secondOperator = secondGeom;
92+
firstOperator.buildPlanes();
93+
secondOperator.buildPlanes();
94+
95+
if (op == "DIFFERENCE")
96+
{
97+
firstOperator = Subtract(firstOperator, secondOperator);
98+
}
99+
else if (op == "UNION")
100+
{
101+
firstOperator = Union(firstOperator, secondOperator);
102+
}
103+
}
104+
}
105+
finalResult.AddGeometry(firstOperator);
106+
107+
return finalResult;
108+
}
109+
}

src/cpp/web-ifc/geometry/operations/bim-geometry/epsilons.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace bimGeometry
44
{
5-
constexpr double EPS_TINY_CURVE = 1e-9;
5+
constexpr double EPS_TINY_CURVE = 1e-9;
66
constexpr double EPS_NONZERO = 1.0E-20;
77
constexpr double EPS_MINISCULE = 1.0E-12;
88
constexpr double EPS_TINY = 1.0E-04;
@@ -15,5 +15,6 @@ namespace bimGeometry
1515
Constants used in function AddFace in geometry.h
1616
*/
1717
constexpr double toleranceAddFace = 1.0E-10;
18-
18+
constexpr double toleranceVectorEquality = 1.0E-04;
19+
constexpr double toleranceScalarEquality = 1.0E-04;
1920
}

src/cpp/web-ifc/geometry/operations/bim-geometry/face.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ namespace bimGeometry {
1111
int i0;
1212
int i1;
1313
int i2;
14+
int pId;
1415
};
1516
}

0 commit comments

Comments
 (0)