| 168 | }; |
| 169 | |
| 170 | inline std::unique_ptr<AbstractKernel> construct(IfcParse::IfcFile* file, const std::string& geometry_library, Settings& conv_settings) { |
| 171 | std::string geometry_library_lower = boost::to_lower_copy(geometry_library); |
| 172 | |
| 173 | #ifdef IFOPSH_WITH_OPENCASCADE |
| 174 | if (geometry_library_lower == "opencascade") { |
| 175 | return std::make_unique<IfcGeom::OpenCascadeKernel>(conv_settings); |
| 176 | } |
| 177 | #endif |
| 178 | |
| 179 | #ifdef IFOPSH_WITH_CGAL |
| 180 | if (geometry_library_lower == "cgal") { |
| 181 | return std::make_unique<CgalKernel>(conv_settings); |
| 182 | } |
| 183 | |
| 184 | if (geometry_library_lower == "cgal-simple") { |
| 185 | return std::make_unique<SimpleCgalKernel>(conv_settings); |
| 186 | } |
| 187 | #endif |
| 188 | |
| 189 | if (geometry_library_lower.rfind("hybrid-", 0) == 0) { |
| 190 | geometry_library_lower = geometry_library_lower.substr(strlen("hybrid")); |
| 191 | std::vector<std::unique_ptr<AbstractKernel>> kernels; |
| 192 | while (!geometry_library_lower.empty()) { |
| 193 | if (geometry_library_lower.find("-", 0) == 0) { |
| 194 | geometry_library_lower = geometry_library_lower.substr(strlen("-")); |
| 195 | } else { |
| 196 | throw IfcParse::IfcException("Invalid hybrid kernel " + geometry_library); |
| 197 | } |
| 198 | auto n = kernels.size(); |
| 199 | #ifdef IFOPSH_WITH_OPENCASCADE |
| 200 | if (geometry_library_lower.find("opencascade", 0) == 0) { |
| 201 | kernels.emplace_back(new IfcGeom::OpenCascadeKernel(conv_settings)); |
| 202 | geometry_library_lower = geometry_library_lower.substr(strlen("opencascade")); |
| 203 | } |
| 204 | #endif |
| 205 | |
| 206 | #ifdef IFOPSH_WITH_CGAL |
| 207 | if (geometry_library_lower.find("cgal-simple", 0) == 0) { |
| 208 | kernels.emplace_back(new SimpleCgalKernel(conv_settings)); |
| 209 | geometry_library_lower = geometry_library_lower.substr(strlen("cgal-simple")); |
| 210 | } |
| 211 | |
| 212 | if (geometry_library_lower.find("cgal", 0) == 0) { |
| 213 | kernels.emplace_back(new CgalKernel(conv_settings)); |
| 214 | geometry_library_lower = geometry_library_lower.substr(strlen("cgal")); |
| 215 | } |
| 216 | #endif |
| 217 | if (kernels.size() != n + 1) { |
| 218 | throw IfcParse::IfcException("Invalid hybrid kernel " + geometry_library); |
| 219 | } |
| 220 | } |
| 221 | |
| 222 | for (auto it = kernels.begin(); it != kernels.end(); ++it) { |
| 223 | (**it).propagate_exceptions = it == kernels.begin(); |
| 224 | (**it).partial_success_is_success = it == kernels.end() - 1; |
| 225 | } |
| 226 | |
| 227 | if (!kernels.empty()) { |