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 }