MCPcopy Create free account
hub / github.com/IfcOpenShell/IfcOpenShell / DoImport

Method DoImport

src/ifcmax/IfcMax.cpp:217–327  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

215}
216
217int IFCImp::DoImport(const TCHAR *name, ImpInterface *impitfc, Interface *itfc, BOOL /*suppressPrompts*/) {
218
219 IfcGeom::IteratorSettings settings;
220 settings.set(IfcGeom::IteratorSettings::USE_WORLD_COORDS, false);
221 settings.set(IfcGeom::IteratorSettings::WELD_VERTICES, true);
222 settings.set(IfcGeom::IteratorSettings::SEW_SHELLS, true);
223
224#ifdef _UNICODE
225 int fn_buffer_size = WideCharToMultiByte(CP_UTF8, 0, name, -1, 0, 0, 0, 0);
226 char* fn_mb = new char[fn_buffer_size];
227 WideCharToMultiByte(CP_UTF8, 0, name, -1, fn_mb, fn_buffer_size, 0, 0);
228#else
229 const char* fn_mb = name;
230#endif
231
232 IfcParse::IfcFile file(fn_mb);
233 IfcGeom::Iterator<float> iterator(settings, &file);
234 delete fn_mb;
235 if (!iterator.initialize()) return false;
236
237 itfc->ProgressStart(_T("Importing file..."), TRUE, fn, NULL);
238
239 MtlBaseLib* mats = itfc->GetSceneMtls();
240 int slot = mats->Count();
241
242 std::map<std::vector<std::string>, Mtl*> material_cache;
243
244 do{
245 const IfcGeom::TriangulationElement<float>* o = static_cast<const IfcGeom::TriangulationElement<float>*>(iterator.get());
246
247 TSTR o_type = S(o->type());
248 TSTR o_guid = S(o->guid());
249
250 Mtl *m = ComposeMultiMaterial(material_cache, mats, itfc, slot, o->geometry().materials(), o->type(), o->geometry().material_ids());
251
252 TriObject* tri = CreateNewTriObject();
253
254 const int numVerts = (int)o->geometry().verts().size()/3;
255 tri->mesh.setNumVerts(numVerts);
256 for( int i = 0; i < numVerts; i ++ ) {
257 tri->mesh.setVert(i,o->geometry().verts()[3*i+0],o->geometry().verts()[3*i+1],o->geometry().verts()[3*i+2]);
258 }
259 const int numFaces = (int)o->geometry().faces().size()/3;
260 tri->mesh.setNumFaces(numFaces);
261
262 bool needs_default = std::find(o->geometry().material_ids().begin(), o->geometry().material_ids().end(), -1) != o->geometry().material_ids().end();
263
264 typedef std::pair<int, int> edge_t;
265
266 std::set<edge_t> face_boundaries;
267 for(std::vector<int>::const_iterator it = o->geometry().edges().begin(); it != o->geometry().edges().end();) {
268 const int v1 = *it++;
269 const int v2 = *it++;
270
271 const edge_t e((std::min)(v1, v2), (std::max)(v1, v2));
272 face_boundaries.insert(e);
273 }
274

Callers

nothing calls this directly

Calls 15

ComposeMultiMaterialFunction · 0.85
HideMethod · 0.80
dataMethod · 0.80
setMethod · 0.45
initializeMethod · 0.45
getMethod · 0.45
typeMethod · 0.45
guidMethod · 0.45
materialsMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected