/******************************************************************************** * * * This file is part of IfcOpenShell. * * * * IfcOpenShell is free software: you can redistribute it and/or modify * * it under the terms of the Lesser GNU General Public License as published by * * the Free Software Foundation, either version 3.0 of the License, or * * (at your option) any later version. * * * * IfcOpenShell is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * Lesser GNU General Public License for more details. * * * * You should have received a copy of the Lesser GNU General Public License * * along with this program. If not, see . * * * ********************************************************************************/ /******************************************************************************** * * * Example that generates an IfcTriangulatedFaceSet * * * ********************************************************************************/ #include "../ifcparse/schemas/Ifc4.h" #include "../ifcparse/hierarchy_helper.h" #include "suzanne_geometry.h" #include typedef std::string S; typedef ifcopenshell::global_id guid; template std::vector< std::vector > create_vector_from_array(const T* arr, unsigned size) { std::vector< std::vector > result; result.reserve(size); for (unsigned i = 0; i < size; ) { std::vector ts; ts.reserve(3); for (unsigned j = 0; j < 3; ++i, ++j) { ts.push_back(arr[i]); } result.push_back(ts); } return result; } int main(int argc, char** argv) { hierarchy_helper file; Ifc4::IfcBuildingElementProxy product = file.create().initialize( guid(), std::nullopt, S("Blender's Suzanne"), std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt); file.addBuildingProduct(product); product.setOwnerHistory(file.getSingle()); product.setObjectPlacement(file.addLocalPlacement()); std::vector< std::vector< double > > vertices_vector = create_vector_from_array(vertices, sizeof(vertices) / sizeof(vertices[0])); std::vector< std::vector< int > > indices_vector = create_vector_from_array(indices, sizeof(indices) / sizeof(indices[0])); Ifc4::IfcCartesianPointList3D coordinates = file.create().initialize(vertices_vector); Ifc4::IfcTriangulatedFaceSet faceset = file.create().initialize(coordinates, std::nullopt, std::nullopt, indices_vector, std::nullopt); Ifc4::IfcShapeRepresentation rep = file.create().initialize( file.getRepresentationContext("Model"), "Body", "SurfaceModel", {faceset}); Ifc4::IfcProductDefinitionShape shape = file.create().initialize(std::nullopt, std::nullopt, {rep}); file.add_entity(shape); product.setRepresentation(shape); const std::string filename = "tesselated_faceset.ifc"; file.header().file_name().setname(filename); std::ofstream f(filename.c_str()); f << file; }