mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
77 lines
2.1 KiB
C++
77 lines
2.1 KiB
C++
#include "AbstractKernel.h"
|
|
|
|
#include "../ifcgeom/IfcGeomElement.h"
|
|
#include "../ifcgeom/ConversionSettings.h"
|
|
|
|
#ifdef IFOPSH_WITH_OPENCASCADE
|
|
#include "../ifcgeom/kernels/opencascade/OpenCascadeKernel.h"
|
|
#undef Handle
|
|
#endif
|
|
|
|
#ifdef IFOPSH_WITH_CGAL
|
|
#include "../ifcgeom/kernels/cgal/CgalKernel.h"
|
|
#undef CGAL_KERNEL_H
|
|
#undef CGALCONVERSIONRESULT_H
|
|
#define IFOPSH_SIMPLE_KERNEL
|
|
#include "../ifcgeom/kernels/cgal/CgalKernel.h"
|
|
#endif
|
|
|
|
using namespace ifcopenshell::geometry;
|
|
|
|
bool ifcopenshell::geometry::kernels::AbstractKernel::convert(const taxonomy::ptr item, IfcGeom::ConversionResults& results) {
|
|
// std::stringstream ss;
|
|
// item->print(ss);
|
|
// auto sss = ss.str();
|
|
// std::wcout << sss.c_str() << std::endl;
|
|
|
|
try {
|
|
return dispatch_conversion<0>::dispatch(this, item, results);
|
|
} catch (std::exception& e) {
|
|
Logger::Error(e, item->instance);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
const ConversionSettings & ifcopenshell::geometry::kernels::AbstractKernel::settings() const
|
|
{
|
|
return conv_settings_;
|
|
}
|
|
|
|
ifcopenshell::geometry::kernels::AbstractKernel* ifcopenshell::geometry::kernels::construct(const std::string& geometry_library, const ConversionSettings& conv_settings) {
|
|
const std::string geometry_library_lower = boost::to_lower_copy(geometry_library);
|
|
|
|
#ifdef IFOPSH_WITH_OPENCASCADE
|
|
if (geometry_library_lower == "opencascade") {
|
|
return new IfcGeom::OpenCascadeKernel(conv_settings);
|
|
}
|
|
#endif
|
|
|
|
#ifdef IFOPSH_WITH_CGAL
|
|
if (geometry_library_lower == "cgal") {
|
|
return new CgalKernel(conv_settings);
|
|
}
|
|
|
|
if (geometry_library_lower == "cgal-simple") {
|
|
return new SimpleCgalKernel(conv_settings);
|
|
}
|
|
#endif
|
|
|
|
throw IfcParse::IfcException("No geometry kernel registered for " + geometry_library);
|
|
}
|
|
|
|
bool ifcopenshell::geometry::kernels::AbstractKernel::convert_impl(const taxonomy::collection::ptr collection, IfcGeom::ConversionResults& r) {
|
|
auto s = r.size();
|
|
for (auto& c : collection->children) {
|
|
convert(c, r);
|
|
}
|
|
for (auto i = s; i < r.size(); ++i) {
|
|
if (collection->matrix) {
|
|
r[i].prepend(collection->matrix);
|
|
}
|
|
if (!r[i].hasStyle() && collection->surface_style) {
|
|
r[i].setStyle(collection->surface_style);
|
|
}
|
|
}
|
|
return r.size() > s;
|
|
}
|