126
138
KST::stringList.lock().readUnlock();
140
KST::matrixList.lock().readLock();
141
for (i = _inputMatrixLoadQueue.begin(); i != _inputMatrixLoadQueue.end(); ++i) {
142
KstMatrixList::Iterator it = KST::matrixList.findTag((*i).second);
143
if (it != KST::matrixList.end()) {
144
_inputMatrices.insert((*i).first, *it);
146
KstDebug::self()->log(i18n("Unable to find required matrix [%1] for data object %2.").arg((*i).second).arg(tagName()), KstDebug::Error);
150
KST::matrixList.lock().readUnlock();
128
152
_inputVectorLoadQueue.clear();
129
153
_inputScalarLoadQueue.clear();
130
154
_inputStringLoadQueue.clear();
155
_inputMatrixLoadQueue.clear();
370
bool KstDataObject::duplicateDependents(QMap<KstDataObjectPtr, KstDataObjectPtr> &duplicatedMap) {
371
// work with a copy of the data object list
372
KST::dataObjectList.lock().readLock();
373
KstDataObjectList dol = QDeepCopy<KstDataObjectList>(KST::dataObjectList);
374
KST::dataObjectList.lock().readUnlock();
376
for (KstDataObjectList::Iterator i = dol.begin(); i != dol.end(); ++i) {
377
if ((*i)->uses(this)) {
378
if (duplicatedMap.contains(*i)) {
379
(duplicatedMap[*i])->replaceDependency(this, duplicatedMap[this]);
381
KstDataObjectPtr newObject = (*i)->makeDuplicate(duplicatedMap);
382
KST::dataObjectList.lock().writeLock();
383
KST::dataObjectList.append(newObject.data());
384
KST::dataObjectList.lock().writeUnlock();
385
(duplicatedMap[*i])->replaceDependency(this, duplicatedMap[this]);
386
(*i)->duplicateDependents(duplicatedMap);
394
void KstDataObject::replaceDependency(KstDataObjectPtr oldObject, KstDataObjectPtr newObject) {
396
// find all connections from this object to old object
399
for (KstVectorMap::Iterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) {
400
for (KstVectorMap::Iterator k = _inputVectors.begin(); k != _inputVectors.end(); ++k) {
401
if (j.data().data() == k.data().data()) {
402
// replace input with the output from newObject
403
_inputVectors[k.key()] = (newObject->outputVectors())[j.key()];
406
// also replace dependencies on vector stats
407
QDictIterator<KstScalar> scalarDictIter(j.data()->scalars());
408
for (KstScalarMap::Iterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) {
409
for (; scalarDictIter.current(); ++scalarDictIter) {
410
if (scalarDictIter.current() == k.data()) {
411
_inputScalars[k.key()] = (((newObject->outputVectors())[j.key()])->scalars())[scalarDictIter.currentKey()];
418
for (KstMatrixMap::Iterator j = oldObject->outputMatrices().begin(); j != oldObject->outputMatrices().end(); ++j) {
419
for (KstMatrixMap::Iterator k = _inputMatrices.begin(); k != _inputMatrices.end(); ++k) {
420
if (j.data().data() == k.data().data()) {
421
// replace input with the output from newObject
422
_inputMatrices[k.key()] = (newObject->outputMatrices())[j.key()];
425
// also replace dependencies on matrix stats
426
QDictIterator<KstScalar> scalarDictIter(j.data()->scalars());
427
for (KstScalarMap::Iterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) {
428
for (; scalarDictIter.current(); ++scalarDictIter) {
429
if (scalarDictIter.current() == k.data()) {
430
_inputScalars[k.key()] = (((newObject->outputMatrices())[j.key()])->scalars())[scalarDictIter.currentKey()];
437
for (KstScalarMap::Iterator j = oldObject->outputScalars().begin(); j != oldObject->outputScalars().end(); ++j) {
438
for (KstScalarMap::Iterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) {
439
if (j.data().data() == k.data().data()) {
440
// replace input with the output from newObject
441
_inputScalars[k.key()] = (newObject->outputScalars())[j.key()];
447
for (KstStringMap::Iterator j = oldObject->outputStrings().begin(); j != oldObject->outputStrings().end(); ++j) {
448
for (KstStringMap::Iterator k = _inputStrings.begin(); k != _inputStrings.end(); ++k) {
449
if (j.data().data() == k.data().data()) {
450
// replace input with the output from newObject
451
_inputStrings[k.key()] = (newObject->outputStrings())[j.key()];
458
void KstDataObject::replaceDependency(KstVectorPtr oldVector, KstVectorPtr newVector) {
459
for (KstVectorMap::Iterator j = _inputVectors.begin(); j != _inputVectors.end(); ++j) {
460
if (j.data() == oldVector) {
461
_inputVectors[j.key()] = newVector;
465
QDictIterator<KstScalar> scalarDictIter(oldVector->scalars());
466
for (KstScalarMap::Iterator j = _inputScalars.begin(); j != _inputScalars.end(); ++j) {
467
for (; scalarDictIter.current(); ++ scalarDictIter) {
468
if (scalarDictIter.current() == j.data()) {
469
_inputScalars[j.key()] = (newVector->scalars())[scalarDictIter.currentKey()];
476
void KstDataObject::replaceDependency(KstMatrixPtr oldMatrix, KstMatrixPtr newMatrix) {
477
for (KstMatrixMap::Iterator j = _inputMatrices.begin(); j != _inputMatrices.end(); ++j) {
478
if (j.data() == oldMatrix) {
479
_inputMatrices[j.key()] = newMatrix;
483
QDictIterator<KstScalar> scalarDictIter(oldMatrix->scalars());
484
for (KstScalarMap::Iterator j = _inputScalars.begin(); j != _inputScalars.end(); ++j) {
485
for (; scalarDictIter.current(); ++ scalarDictIter) {
486
if (scalarDictIter.current() == j.data()) {
487
_inputScalars[j.key()] = (newMatrix->scalars())[scalarDictIter.currentKey()];
314
494
bool KstDataObject::uses(KstObjectPtr p) const {
315
496
KstVectorPtr v = kst_cast<KstVector>(p);
317
498
for (KstVectorMap::ConstIterator j = _inputVectors.begin(); j != _inputVectors.end(); ++j) {
503
QDictIterator<KstScalar> scalarDictIter(v->scalars());
504
for (KstScalarMap::ConstIterator j = _inputScalars.begin(); j != _inputScalars.end(); ++j) {
505
for (; scalarDictIter.current(); ++scalarDictIter) {
506
if (scalarDictIter.current() == j.data()) {
511
} else if (KstMatrixPtr matrix = kst_cast<KstMatrix>(p)) {
512
for (KstMatrixMap::ConstIterator j = _inputMatrices.begin(); j != _inputMatrices.end(); ++j) {
513
if (j.data() == matrix) {
517
QDictIterator<KstScalar> scalarDictIter(matrix->scalars());
518
for (KstScalarMap::ConstIterator j = _inputScalars.begin(); j != _inputScalars.end(); ++j) {
519
for (; scalarDictIter.current(); ++scalarDictIter) {
520
if (scalarDictIter.current() == j.data()) {
525
} else if (KstDataObjectPtr obj = kst_cast<KstDataObject>(p) ) {
526
// check all connections from this object to p
527
for (KstVectorMap::Iterator j = obj->outputVectors().begin(); j != obj->outputVectors().end(); ++j) {
528
for (KstVectorMap::ConstIterator k = _inputVectors.begin(); k != _inputVectors.end(); ++k) {
529
if (j.data() == k.data()) {
533
// also check dependencies on vector stats
534
QDictIterator<KstScalar> scalarDictIter(j.data()->scalars());
535
for (KstScalarMap::ConstIterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) {
536
for (; scalarDictIter.current(); ++scalarDictIter) {
537
if (scalarDictIter.current() == k.data()) {
544
for (KstMatrixMap::Iterator j = obj->outputMatrices().begin(); j != obj->outputMatrices().end(); ++j) {
545
for (KstMatrixMap::ConstIterator k = _inputMatrices.begin(); k != _inputMatrices.end(); ++k) {
546
if (j.data() == k.data()) {
550
// also check dependencies on vector stats
551
QDictIterator<KstScalar> scalarDictIter(j.data()->scalars());
552
for (KstScalarMap::ConstIterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) {
553
for (; scalarDictIter.current(); ++scalarDictIter) {
554
if (scalarDictIter.current() == k.data()) {
561
for (KstScalarMap::Iterator j = obj->outputScalars().begin(); j != obj->outputScalars().end(); ++j) {
562
for (KstScalarMap::ConstIterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) {
563
if (j.data() == k.data()) {
569
for (KstStringMap::Iterator j = obj->outputStrings().begin(); j != obj->outputStrings().end(); ++j) {
570
for (KstStringMap::ConstIterator k = _inputStrings.begin(); k != _inputStrings.end(); ++k) {
571
if (j.data() == k.data()) {