Mercurial > hg > svapp
comparison framework/Document.cpp @ 337:1e3af7f4fa86 tony_integration
Merge from branch tonioni
author | Chris Cannam |
---|---|
date | Tue, 11 Mar 2014 17:34:53 +0000 |
parents | 151b7c5864e3 |
children | dd07d48d7d4f |
comparison
equal
deleted
inserted
replaced
328:28c17ce7a6e9 | 337:1e3af7f4fa86 |
---|---|
222 vector<Layer *> | 222 vector<Layer *> |
223 Document::createDerivedLayers(const Transforms &transforms, | 223 Document::createDerivedLayers(const Transforms &transforms, |
224 const ModelTransformer::Input &input) | 224 const ModelTransformer::Input &input) |
225 { | 225 { |
226 QString message; | 226 QString message; |
227 vector<Model *> newModels = addDerivedModels(transforms, input, message); | 227 vector<Model *> newModels = addDerivedModels(transforms, input, message, 0); |
228 | 228 |
229 if (newModels.empty()) { | 229 if (newModels.empty()) { |
230 //!!! This identifier may be wrong! | 230 //!!! This identifier may be wrong! |
231 emit modelGenerationFailed(transforms[0].getIdentifier(), message); | 231 emit modelGenerationFailed(transforms[0].getIdentifier(), message); |
232 return vector<Layer *>(); | 232 return vector<Layer *>(); |
233 } else if (message != "") { | 233 } else if (message != "") { |
234 //!!! This identifier may be wrong! | 234 //!!! This identifier may be wrong! |
235 emit modelGenerationWarning(transforms[0].getIdentifier(), message); | 235 emit modelGenerationWarning(transforms[0].getIdentifier(), message); |
236 } | 236 } |
237 | 237 |
238 QStringList names; | |
239 for (int i = 0; i < newModels.size(); ++i) { | |
240 names.push_back(getUniqueLayerName | |
241 (TransformFactory::getInstance()-> | |
242 getTransformFriendlyName | |
243 (transforms[i].getIdentifier()))); | |
244 } | |
245 | |
246 vector<Layer *> layers = createLayersForDerivedModels(newModels, names); | |
247 return layers; | |
248 } | |
249 | |
250 class AdditionalModelConverter : | |
251 public ModelTransformerFactory::AdditionalModelHandler | |
252 { | |
253 public: | |
254 AdditionalModelConverter(Document *doc, | |
255 Document::LayerCreationHandler *handler) : | |
256 m_doc(doc), | |
257 m_handler(handler) { | |
258 } | |
259 | |
260 virtual ~AdditionalModelConverter() { } | |
261 | |
262 void | |
263 setPrimaryLayers(vector<Layer *> layers) { | |
264 m_primary = layers; | |
265 } | |
266 | |
267 void | |
268 moreModelsAvailable(vector<Model *> models) { | |
269 std::cerr << "AdditionalModelConverter::moreModelsAvailable: " << models.size() << " model(s)" << std::endl; | |
270 // We can't automatically regenerate the additional models on | |
271 // reload -- we should delete them instead | |
272 QStringList names; | |
273 foreach (Model *model, models) { | |
274 m_doc->addAdditionalModel(model); | |
275 names.push_back(QString()); | |
276 } | |
277 vector<Layer *> layers = m_doc->createLayersForDerivedModels | |
278 (models, names); | |
279 m_handler->layersCreated(m_primary, layers); | |
280 delete this; | |
281 } | |
282 | |
283 void | |
284 noMoreModelsAvailable() { | |
285 std::cerr << "AdditionalModelConverter::noMoreModelsAvailable" << std::endl; | |
286 m_handler->layersCreated(m_primary, vector<Layer *>()); | |
287 delete this; | |
288 } | |
289 | |
290 private: | |
291 Document *m_doc; | |
292 vector<Layer *> m_primary; | |
293 Document::LayerCreationHandler *m_handler; //!!! how to handle destruction of this? | |
294 }; | |
295 | |
296 void | |
297 Document::createDerivedLayersAsync(const Transforms &transforms, | |
298 const ModelTransformer::Input &input, | |
299 LayerCreationHandler *handler) | |
300 { | |
301 QString message; | |
302 | |
303 AdditionalModelConverter *amc = new AdditionalModelConverter(this, handler); | |
304 | |
305 vector<Model *> newModels = addDerivedModels | |
306 (transforms, input, message, amc); | |
307 | |
308 QStringList names; | |
309 for (int i = 0; i < newModels.size(); ++i) { | |
310 names.push_back(getUniqueLayerName | |
311 (TransformFactory::getInstance()-> | |
312 getTransformFriendlyName | |
313 (transforms[i].getIdentifier()))); | |
314 } | |
315 | |
316 vector<Layer *> layers = createLayersForDerivedModels(newModels, names); | |
317 amc->setPrimaryLayers(layers); | |
318 | |
319 if (newModels.empty()) { | |
320 //!!! This identifier may be wrong! | |
321 emit modelGenerationFailed(transforms[0].getIdentifier(), message); | |
322 } else if (message != "") { | |
323 //!!! This identifier may be wrong! | |
324 emit modelGenerationWarning(transforms[0].getIdentifier(), message); | |
325 } | |
326 } | |
327 | |
328 vector<Layer *> | |
329 Document::createLayersForDerivedModels(vector<Model *> newModels, | |
330 QStringList names) | |
331 { | |
238 vector<Layer *> layers; | 332 vector<Layer *> layers; |
239 | 333 |
240 for (int i = 0; i < (int)newModels.size(); ++i) { | 334 for (int i = 0; i < (int)newModels.size(); ++i) { |
241 | 335 |
242 Model *newModel = newModels[i]; | 336 Model *newModel = newModels[i]; |
243 | 337 |
244 LayerFactory::LayerTypeSet types = | 338 LayerFactory::LayerTypeSet types = |
245 LayerFactory::getInstance()->getValidLayerTypes(newModel); | 339 LayerFactory::getInstance()->getValidLayerTypes(newModel); |
246 | 340 |
247 if (types.empty()) { | 341 if (types.empty()) { |
248 cerr << "WARNING: Document::createLayerForTransformer: no valid display layer for output of transform " << transforms[i].getIdentifier() << endl; | 342 cerr << "WARNING: Document::createLayerForTransformer: no valid display layer for output of transform " << names[i] << endl; |
249 //!!! inadequate cleanup: | 343 //!!! inadequate cleanup: |
250 newModel->aboutToDelete(); | 344 newModel->aboutToDelete(); |
251 emit modelAboutToBeDeleted(newModel); | 345 emit modelAboutToBeDeleted(newModel); |
252 m_models.erase(newModel); | 346 m_models.erase(newModel); |
253 delete newModel; | 347 delete newModel; |
273 // _while it's still being calculated in the first_ and have it | 367 // _while it's still being calculated in the first_ and have it |
274 // work quickly. That means we need to put the same physical | 368 // work quickly. That means we need to put the same physical |
275 // model pointer in both layers, so they can't actually be cloned. | 369 // model pointer in both layers, so they can't actually be cloned. |
276 | 370 |
277 if (newLayer) { | 371 if (newLayer) { |
278 newLayer->setObjectName(getUniqueLayerName | 372 newLayer->setObjectName(names[i]); |
279 (TransformFactory::getInstance()-> | |
280 getTransformFriendlyName | |
281 (transforms[i].getIdentifier()))); | |
282 } | 373 } |
283 | 374 |
284 emit layerAdded(newLayer); | 375 emit layerAdded(newLayer); |
285 layers.push_back(newLayer); | 376 layers.push_back(newLayer); |
286 } | 377 } |
421 for (size_t k = 0; k < obsoleteLayers.size(); ++k) { | 512 for (size_t k = 0; k < obsoleteLayers.size(); ++k) { |
422 deleteLayer(obsoleteLayers[k], true); | 513 deleteLayer(obsoleteLayers[k], true); |
423 } | 514 } |
424 | 515 |
425 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { | 516 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { |
517 if (i->second.additional) { | |
518 Model *m = i->first; | |
519 emit modelAboutToBeDeleted(m); | |
520 delete m; | |
521 } | |
522 } | |
523 | |
524 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { | |
426 | 525 |
427 Model *m = i->first; | 526 Model *m = i->first; |
428 | 527 |
429 #ifdef DEBUG_DOCUMENT | 528 #ifdef DEBUG_DOCUMENT |
430 SVDEBUG << "considering alignment for model " << m << " (name \"" | 529 SVDEBUG << "considering alignment for model " << m << " (name \"" |
455 | 554 |
456 delete oldMainModel; | 555 delete oldMainModel; |
457 } | 556 } |
458 | 557 |
459 void | 558 void |
460 Document::addDerivedModel(const Transform &transform, | 559 Document::addAlreadyDerivedModel(const Transform &transform, |
461 const ModelTransformer::Input &input, | 560 const ModelTransformer::Input &input, |
462 Model *outputModelToAdd) | 561 Model *outputModelToAdd) |
463 { | 562 { |
464 if (m_models.find(outputModelToAdd) != m_models.end()) { | 563 if (m_models.find(outputModelToAdd) != m_models.end()) { |
465 cerr << "WARNING: Document::addDerivedModel: Model already added" | 564 cerr << "WARNING: Document::addAlreadyDerivedModel: Model already added" |
466 << endl; | 565 << endl; |
467 return; | 566 return; |
468 } | 567 } |
469 | 568 |
470 #ifdef DEBUG_DOCUMENT | 569 #ifdef DEBUG_DOCUMENT |
471 if (input.getModel()) { | 570 if (input.getModel()) { |
472 cerr << "Document::addDerivedModel: source is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl; | 571 cerr << "Document::addAlreadyDerivedModel: source is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl; |
473 } else { | 572 } else { |
474 cerr << "Document::addDerivedModel: source is " << input.getModel() << endl; | 573 cerr << "Document::addAlreadyDerivedModel: source is " << input.getModel() << endl; |
475 } | 574 } |
476 #endif | 575 #endif |
477 | 576 |
478 ModelRecord rec; | 577 ModelRecord rec; |
479 rec.source = input.getModel(); | 578 rec.source = input.getModel(); |
480 rec.channel = input.getChannel(); | 579 rec.channel = input.getChannel(); |
481 rec.transform = transform; | 580 rec.transform = transform; |
581 rec.additional = false; | |
482 rec.refcount = 0; | 582 rec.refcount = 0; |
483 | 583 |
484 outputModelToAdd->setSourceModel(input.getModel()); | 584 outputModelToAdd->setSourceModel(input.getModel()); |
485 | 585 |
486 m_models[outputModelToAdd] = rec; | 586 m_models[outputModelToAdd] = rec; |
487 | 587 |
488 #ifdef DEBUG_DOCUMENT | 588 #ifdef DEBUG_DOCUMENT |
489 SVDEBUG << "Document::addDerivedModel: Added model " << outputModelToAdd << endl; | 589 cerr << "Document::addAlreadyDerivedModel: Added model " << outputModelToAdd << endl; |
490 cerr << "Models now: "; | 590 cerr << "Models now: "; |
491 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { | 591 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { |
492 cerr << i->first << " "; | 592 cerr << i->first << " "; |
493 } | 593 } |
494 cerr << endl; | 594 cerr << endl; |
508 } | 608 } |
509 | 609 |
510 ModelRecord rec; | 610 ModelRecord rec; |
511 rec.source = 0; | 611 rec.source = 0; |
512 rec.refcount = 0; | 612 rec.refcount = 0; |
613 rec.additional = false; | |
513 | 614 |
514 m_models[model] = rec; | 615 m_models[model] = rec; |
515 | 616 |
516 #ifdef DEBUG_DOCUMENT | 617 #ifdef DEBUG_DOCUMENT |
517 SVDEBUG << "Document::addImportedModel: Added model " << model << endl; | 618 SVDEBUG << "Document::addImportedModel: Added model " << model << endl; |
619 cerr << "Models now: "; | |
620 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { | |
621 cerr << i->first << " "; | |
622 } | |
623 cerr << endl; | |
624 #endif | |
625 | |
626 if (m_autoAlignment) alignModel(model); | |
627 | |
628 emit modelAdded(model); | |
629 } | |
630 | |
631 void | |
632 Document::addAdditionalModel(Model *model) | |
633 { | |
634 if (m_models.find(model) != m_models.end()) { | |
635 cerr << "WARNING: Document::addAdditionalModel: Model already added" | |
636 << endl; | |
637 return; | |
638 } | |
639 | |
640 ModelRecord rec; | |
641 rec.source = 0; | |
642 rec.refcount = 0; | |
643 rec.additional = true; | |
644 | |
645 m_models[model] = rec; | |
646 | |
647 #ifdef DEBUG_DOCUMENT | |
648 SVDEBUG << "Document::addAdditionalModel: Added model " << model << endl; | |
518 cerr << "Models now: "; | 649 cerr << "Models now: "; |
519 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { | 650 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { |
520 cerr << i->first << " "; | 651 cerr << i->first << " "; |
521 } | 652 } |
522 cerr << endl; | 653 cerr << endl; |
541 } | 672 } |
542 } | 673 } |
543 | 674 |
544 Transforms tt; | 675 Transforms tt; |
545 tt.push_back(transform); | 676 tt.push_back(transform); |
546 vector<Model *> mm = addDerivedModels(tt, input, message); | 677 vector<Model *> mm = addDerivedModels(tt, input, message, 0); |
547 if (mm.empty()) return 0; | 678 if (mm.empty()) return 0; |
548 else return mm[0]; | 679 else return mm[0]; |
549 } | 680 } |
550 | 681 |
551 vector<Model *> | 682 vector<Model *> |
552 Document::addDerivedModels(const Transforms &transforms, | 683 Document::addDerivedModels(const Transforms &transforms, |
553 const ModelTransformer::Input &input, | 684 const ModelTransformer::Input &input, |
554 QString &message) | 685 QString &message, |
686 AdditionalModelConverter *amc) | |
555 { | 687 { |
556 vector<Model *> mm = | 688 vector<Model *> mm = |
557 ModelTransformerFactory::getInstance()->transformMultiple | 689 ModelTransformerFactory::getInstance()->transformMultiple |
558 (transforms, input, message); | 690 (transforms, input, message, amc); |
559 | 691 |
560 for (int j = 0; j < (int)mm.size(); ++j) { | 692 for (int j = 0; j < (int)mm.size(); ++j) { |
561 | 693 |
562 Model *model = mm[j]; | 694 Model *model = mm[j]; |
563 | 695 |
577 .getPluginVersion()); | 709 .getPluginVersion()); |
578 | 710 |
579 if (!model) { | 711 if (!model) { |
580 cerr << "WARNING: Document::addDerivedModel: no output model for transform " << applied.getIdentifier() << endl; | 712 cerr << "WARNING: Document::addDerivedModel: no output model for transform " << applied.getIdentifier() << endl; |
581 } else { | 713 } else { |
582 addDerivedModel(applied, input, model); | 714 addAlreadyDerivedModel(applied, input, model); |
583 } | 715 } |
584 } | 716 } |
585 | 717 |
586 return mm; | 718 return mm; |
587 } | 719 } |