mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 09:48:32 +00:00
81 lines
3.9 KiB
C++
81 lines
3.9 KiB
C++
/********************************************************************************
|
|
* *
|
|
* 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 <http://www.gnu.org/licenses/>. *
|
|
* *
|
|
********************************************************************************/
|
|
|
|
/********************************************************************************
|
|
* *
|
|
* Example that generates an IfcTriangulatedFaceSet *
|
|
* *
|
|
********************************************************************************/
|
|
|
|
#include "../ifcparse/schemas/Ifc4.h"
|
|
#include "../ifcparse/hierarchy_helper.h"
|
|
|
|
#include "suzanne_geometry.h"
|
|
|
|
#include <fstream>
|
|
|
|
typedef std::string S;
|
|
typedef ifcopenshell::global_id guid;
|
|
|
|
template <typename T>
|
|
std::vector< std::vector<T> > create_vector_from_array(const T* arr, unsigned size) {
|
|
std::vector< std::vector<T> > result;
|
|
result.reserve(size);
|
|
|
|
for (unsigned i = 0; i < size; ) {
|
|
std::vector<T> 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<Ifc4> file;
|
|
|
|
Ifc4::IfcBuildingElementProxy product = file.create<Ifc4::IfcBuildingElementProxy>().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<Ifc4::IfcOwnerHistory>());
|
|
|
|
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<Ifc4::IfcCartesianPointList3D>().initialize(vertices_vector);
|
|
Ifc4::IfcTriangulatedFaceSet faceset = file.create<Ifc4::IfcTriangulatedFaceSet>().initialize(coordinates, std::nullopt, std::nullopt, indices_vector, std::nullopt);
|
|
|
|
Ifc4::IfcShapeRepresentation rep = file.create<Ifc4::IfcShapeRepresentation>().initialize(
|
|
file.getRepresentationContext("Model"), "Body", "SurfaceModel", {faceset});
|
|
|
|
Ifc4::IfcProductDefinitionShape shape = file.create<Ifc4::IfcProductDefinitionShape>().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;
|
|
}
|