Skip to content

Commit aaa5e06

Browse files
authored
Merge pull request #521 from phabramich/more-geometry-options
Added missing geometry options
2 parents c2c2859 + c2c1dc0 commit aaa5e06

File tree

4 files changed

+78
-15
lines changed

4 files changed

+78
-15
lines changed

src/wasm/geometry/IfcGeometryLoader.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,6 +2780,36 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const
27802780

27812781
return profile;
27822782
}
2783+
case schema::IFCTRAPEZIUMPROFILEDEF:
2784+
{
2785+
IfcProfile profile;
2786+
2787+
_loader.MoveToArgumentOffset(expressID, 0);
2788+
profile.type = _loader.GetStringArgument();
2789+
profile.isConvex = true;
2790+
2791+
_loader.MoveToArgumentOffset(expressID, 2);
2792+
uint32_t placementID = _loader.GetRefArgument();
2793+
double bottomXDim = _loader.GetDoubleArgument();
2794+
double topXDim = _loader.GetDoubleArgument();
2795+
double yDim = _loader.GetDoubleArgument();
2796+
double topXOffset = _loader.GetDoubleArgument();
2797+
2798+
glm::dmat3 placement;
2799+
if (placementID != 0)
2800+
{
2801+
placement = GetAxis2Placement2D(placementID);
2802+
}
2803+
else
2804+
{
2805+
placement = glm::dmat3(
2806+
glm::dvec3(1, 0, 0),
2807+
glm::dvec3(0, 1, 0),
2808+
glm::dvec3(0, 0, 1));
2809+
}
2810+
profile.curve = GetTrapeziumCurve(bottomXDim, topXDim, yDim, topXOffset, placement);
2811+
return profile;
2812+
}
27832813
default:
27842814
spdlog::error("[GetProfileByLine()] unexpected profile type {}", expressID, lineType);
27852815
break;

src/wasm/geometry/IfcGeometryProcessor.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ namespace webifc::geometry
193193
voidGeoms.insert(voidGeoms.end(), flatVoidMesh.begin(), flatVoidMesh.end());
194194
}
195195

196-
finalGeometry = BoolSubtract(flatElementMeshes, voidGeoms);
196+
finalGeometry = BoolProcess(flatElementMeshes, voidGeoms, "DIFFERENCE");
197197

198198
#ifdef CSG_DEBUG_OUTPUT
199199
io::DumpIfcGeometry(finalGeometry, "mesh_bool.obj");
@@ -277,7 +277,7 @@ namespace webifc::geometry
277277
auto flatFirstMeshes = flatten(firstMesh, _expressIDToGeometry, normalizeMat);
278278
auto flatSecondMeshes = flatten(secondMesh, _expressIDToGeometry, normalizeMat);
279279

280-
IfcGeometry resultMesh = BoolSubtract(flatFirstMeshes, flatSecondMeshes);
280+
IfcGeometry resultMesh = BoolProcess(flatFirstMeshes, flatSecondMeshes, "DIFFERENCE");
281281

282282
_expressIDToGeometry[expressID] = resultMesh;
283283
mesh.hasGeometry = true;
@@ -298,7 +298,7 @@ namespace webifc::geometry
298298
_loader.MoveToArgumentOffset(expressID, 0);
299299
std::string_view op = _loader.GetStringArgument();
300300

301-
if (op != "DIFFERENCE")
301+
if (op != "DIFFERENCE" && op != "UNION")
302302
{
303303
spdlog::error("[GetMesh()] Unsupported boolean op {}",std::string(op), expressID);
304304
return mesh;
@@ -323,7 +323,7 @@ namespace webifc::geometry
323323
return mesh;
324324
}
325325

326-
IfcGeometry resultMesh = BoolSubtract(flatFirstMeshes, flatSecondMeshes);
326+
IfcGeometry resultMesh = BoolProcess(flatFirstMeshes, flatSecondMeshes, std::string(op));
327327

328328
_expressIDToGeometry[expressID] = resultMesh;
329329
mesh.hasGeometry = true;
@@ -1546,9 +1546,9 @@ namespace webifc::geometry
15461546
}
15471547
}
15481548

1549-
IfcGeometry IfcGeometryProcessor::BoolSubtract(const std::vector<IfcGeometry> &firstGeoms, std::vector<IfcGeometry> &secondGeoms)
1549+
IfcGeometry IfcGeometryProcessor::BoolProcess(const std::vector<IfcGeometry> &firstGeoms, std::vector<IfcGeometry> &secondGeoms, std::string op)
15501550
{
1551-
spdlog::debug("[BoolSubtract({})]");
1551+
spdlog::debug("[BoolProcess({})]");
15521552
IfcGeometry finalResult;
15531553

15541554
for (auto &firstGeom : firstGeoms)
@@ -1559,7 +1559,7 @@ namespace webifc::geometry
15591559
bool doit = true;
15601560
if (secondGeom.numFaces == 0)
15611561
{
1562-
spdlog::error("[BoolSubtract()] bool aborted due to empty source or target");
1562+
spdlog::error("[BoolProcess()] bool aborted due to empty source or target");
15631563

15641564
// bail out because we will get strange meshes
15651565
// if this happens, probably there's an issue parsing the mesh that occurred earlier
@@ -1568,7 +1568,7 @@ namespace webifc::geometry
15681568

15691569
if (result.numFaces == 0)
15701570
{
1571-
spdlog::error("[BoolSubtract()] bool aborted due to empty source or target");
1571+
spdlog::error("[BoolProcess()] bool aborted due to empty source or target");
15721572

15731573
// bail out because we will get strange meshes
15741574
// if this happens, probably there's an issue parsing the mesh that occurred earlier
@@ -1577,6 +1577,8 @@ namespace webifc::geometry
15771577

15781578
if (doit)
15791579
{
1580+
IfcGeometry secondOperator;
1581+
15801582
if (secondGeom.halfSpace)
15811583
{
15821584
glm::dvec3 origin = secondGeom.halfSpaceOrigin;
@@ -1589,7 +1591,6 @@ namespace webifc::geometry
15891591
glm::dvec4(z, 0),
15901592
glm::dvec4(0, 0, 0, 1)
15911593
);
1592-
IfcGeometry newSecond;
15931594

15941595
double scaleX = 1;
15951596
double scaleY = 1;
@@ -1606,12 +1607,18 @@ namespace webifc::geometry
16061607
if (glm::abs(dy) > scaleY) {scaleY = glm::abs(dy); }
16071608
if (glm::abs(dz) > scaleZ) {scaleZ = glm::abs(dz); }
16081609
}
1609-
newSecond.AddGeometry(secondGeom, trans, scaleX * 2, scaleY * 2, scaleZ * 2, secondGeom.halfSpaceOrigin);
1610-
result = fuzzybools::Subtract(result, newSecond);
1610+
secondOperator.AddGeometry(secondGeom, trans, scaleX * 2, scaleY * 2, scaleZ * 2, secondGeom.halfSpaceOrigin);
1611+
} else {
1612+
secondOperator = secondGeom;
1613+
}
1614+
1615+
if (op == "DIFFERENCE")
1616+
{
1617+
result = fuzzybools::Subtract(result, secondOperator);
16111618
}
1612-
else
1619+
else if (op == "UNION")
16131620
{
1614-
result = fuzzybools::Subtract(result, secondGeom);
1621+
result = fuzzybools::Union(result, secondOperator);
16151622
}
16161623
}
16171624
}

src/wasm/geometry/IfcGeometryProcessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace webifc::geometry
3737
private:
3838
void AddFaceToGeometry(uint32_t expressID, IfcGeometry &geometry);
3939
IfcGeometry GetBrep(uint32_t expressID);
40-
IfcGeometry BoolSubtract(const std::vector<IfcGeometry> &firstGroups, std::vector<IfcGeometry> &secondGroups);
40+
IfcGeometry BoolProcess(const std::vector<IfcGeometry> &firstGroups, std::vector<IfcGeometry> &secondGroups, std::string op);
4141
std::unordered_map<uint32_t, IfcGeometry> _expressIDToGeometry;
4242
std::unordered_map<uint32_t, IfcComposedMesh> _expressIDToMesh;
4343
IfcSurface GetSurface(uint32_t expressID);

src/wasm/geometry/operations/curve-utils.h

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,33 @@ inline IfcCurve Build3DArc3Pt(const glm::dvec3 &p1, const glm::dvec3 &p2, const
697697

698698
return c;
699699
}
700-
700+
701+
inline IfcCurve GetTrapeziumCurve(double bottomXDim, double topXDim, double yDim, double topXOffset, glm::dmat3 placement = glm::dmat3(1))
702+
{
703+
double halfX = bottomXDim / 2;
704+
double halfY = yDim / 2;
705+
706+
glm::dvec2 bl = placement * glm::dvec3(-halfX, -halfY, 1);
707+
glm::dvec2 br = placement * glm::dvec3(halfX, -halfY, 1);
708+
709+
glm::dvec2 tl = placement * glm::dvec3(-halfX + topXOffset, halfY, 1);
710+
glm::dvec2 tr = placement * glm::dvec3(-halfX + topXOffset + topXDim, halfY, 1);
711+
712+
IfcCurve c;
713+
c.Add(bl);
714+
c.Add(br);
715+
c.Add(tr);
716+
c.Add(tl);
717+
c.Add(bl);
718+
719+
if (MatrixFlipsTriangles(placement))
720+
{
721+
c.Invert();
722+
}
723+
724+
return c;
725+
}
726+
701727
inline IfcCurve BuildArc(double scale, const glm::dvec3 &pos, const glm::dvec3 &axis, double angleRad,uint16_t _circleSegments)
702728
{
703729

0 commit comments

Comments
 (0)