41 ModelId DocumentManager::newModel() |
39 ModelId DocumentManager::newModel() |
42 { |
40 { |
43 const ModelId modelId{++this->modelIdCounter}; |
41 const ModelId modelId{++this->modelIdCounter}; |
44 const QString name = makeNewModelName(); |
42 const QString name = makeNewModelName(); |
45 this->openModels[modelId] = ModelInfo{ |
43 this->openModels[modelId] = ModelInfo{ |
46 .model = std::make_unique<Model>(), |
44 .model = std::make_unique<Model>(this), |
47 .id = modelId, |
45 .id = modelId, |
48 .opentype = OpenType::ManuallyOpened, |
46 .opentype = OpenType::ManuallyOpened, |
49 }; |
47 }; |
50 this->makePolygonCacheForModel(modelId); |
48 this->makePolygonCacheForModel(modelId); |
51 return modelId; |
49 return modelId; |
398 referencedFilePath = libraries.findFile(referenceName); |
396 referencedFilePath = libraries.findFile(referenceName); |
399 } |
397 } |
400 return referencedFilePath; |
398 return referencedFilePath; |
401 } |
399 } |
402 |
400 |
|
401 template<typename T> |
|
402 void iterate(const Model& model, std::function<void(const T&)> fn) |
|
403 { |
|
404 for (int i = 0; i < model.size(); ++i) { |
|
405 if (std::holds_alternative<T>(model[i])) { |
|
406 fn(std::get<T>(model[i])); |
|
407 } |
|
408 } |
|
409 } |
|
410 |
403 void DocumentManager::loadDependenciesForModel( |
411 void DocumentManager::loadDependenciesForModel( |
404 const ModelId modelId, |
412 const ModelId modelId, |
405 const QString &path, |
413 const QString &path, |
406 LoadDepedenciesBag& bag) |
414 LoadDepedenciesBag& bag) |
407 { |
415 { |
416 bag.errorStream << tr("bad model ID %1").arg(modelId.value); |
424 bag.errorStream << tr("bad model ID %1").arg(modelId.value); |
417 return; |
425 return; |
418 } |
426 } |
419 ModelInfo& modelInfo = this->openModels[modelId]; |
427 ModelInfo& modelInfo = this->openModels[modelId]; |
420 modelInfo.dependencies.clear(); |
428 modelInfo.dependencies.clear(); |
421 for (int i = 0; i < modelInfo.model->size(); i += 1) |
429 iterate<Colored<SubfileReference>>(*modelInfo.model, [&](const SubfileReference& ref) { |
422 { |
430 const QString referenceName = ref.name; |
423 const QString referenceName = (*modelInfo.model)[i]->getProperty(ldraw::Property::ReferenceName).toString(); |
|
424 if (not referenceName.isEmpty() |
431 if (not referenceName.isEmpty() |
425 and modelInfo.dependencies.count(referenceName) == 0 |
432 and modelInfo.dependencies.count(referenceName) == 0 |
426 and not failedToOpen.contains(referenceName)) |
433 and not failedToOpen.contains(referenceName)) |
427 { |
434 { |
428 try |
435 try |