| 215 | } |
| 216 | |
| 217 | int 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 |
nothing calls this directly
no test coverage detected