#ifndef IFCGEOMMANIFOLDREPRESENTATION_H #define IFCGEOMMANIFOLDREPRESENTATION_H #include #include "../../../ifcgeom/ConversionResult.h" #include "../../../ifcgeom/kernels/ifc_geomlibrary_api.h" #include namespace ifcopenshell { namespace geometry { struct IFC_GEOMLIBRARY_API ManifoldPart { manifold::MeshGL64 mesh; std::optional solid; }; class IFC_GEOMLIBRARY_API ManifoldShape : public IfcGeom::ConversionResultShape { public: ManifoldShape() = default; explicit ManifoldShape(const ManifoldPart& part); explicit ManifoldShape(ManifoldPart&& part); explicit ManifoldShape(const std::vector& parts); explicit ManifoldShape(std::vector&& parts); const std::vector& parts() const { return parts_; } std::optional as_manifold() const; virtual std::string_view backend_id() const { return "manifold"; } virtual void Triangulate(ifcopenshell::geometry::Settings settings, const ifcopenshell::geometry::taxonomy::matrix4& place, IfcGeom::Representation::Triangulation* t, int item_id, int surface_style_id) const; virtual void Serialize(const ifcopenshell::geometry::taxonomy::matrix4& place, std::string&) const; virtual int surface_genus() const; virtual bool is_manifold() const; virtual int num_vertices() const; virtual int num_edges() const; virtual int num_faces() const; virtual double bounding_box(void*&) const; virtual std::pair, IfcGeom::OpaqueCoordinate<3>> bounding_box() const; virtual void set_box(void* b); virtual IfcGeom::OpaqueNumber* length(); virtual IfcGeom::OpaqueNumber* area(); virtual IfcGeom::OpaqueNumber* volume(); virtual IfcGeom::OpaqueCoordinate<3> position(); virtual IfcGeom::OpaqueCoordinate<3> axis(); virtual IfcGeom::OpaqueCoordinate<4> plane_equation(); virtual std::vector convex_decomposition(); virtual IfcGeom::ConversionResultShape* halfspaces(); virtual IfcGeom::ConversionResultShape* box(); virtual IfcGeom::ConversionResultShape* solid(); virtual IfcGeom::ConversionResultShape* wrap_in_compound(); virtual std::vector vertices(); virtual std::vector edges(); virtual std::vector facets(); virtual IfcGeom::ConversionResultShape* add(IfcGeom::ConversionResultShape*); virtual IfcGeom::ConversionResultShape* subtract(IfcGeom::ConversionResultShape*); virtual IfcGeom::ConversionResultShape* intersect(IfcGeom::ConversionResultShape*); virtual IfcGeom::ConversionResultShape* concat(IfcGeom::ConversionResultShape*); virtual void map(IfcGeom::OpaqueCoordinate<4>& from, IfcGeom::OpaqueCoordinate<4>& to); virtual void map(const std::vector>& from, const std::vector>& to); virtual IfcGeom::ConversionResultShape* moved(ifcopenshell::geometry::taxonomy::matrix4::ptr) const; virtual bool surface_area_along_direction(double tol, const ifcopenshell::geometry::taxonomy::matrix4::ptr&, double& along_x, double& along_y, double& along_z) const; private: std::vector parts_; }; } } #endif