bool RMemoryStorage::saveObject(QSharedPointer<RObject> object, bool checkBlockRecursion, bool keepHandles) { if (object.isNull()) { qWarning() << "RMemoryStorage::saveObject: object is NULL"; return false; } //qDebug() << "saveObject: " << *object; // never allow two layers with identical names, update layer instead: QSharedPointer<RLayer> layer = object.dynamicCast<RLayer>(); if (!layer.isNull()) { RLayer::Id id = getLayerId(layer->getName()); if (id != RLayer::INVALID_ID && id != layer->getId()) { setObjectId(*layer, id); // never unprotect an existing protected layer: QSharedPointer<RLayer> existingLayer = queryLayerDirect(id); if (!existingLayer.isNull()) { if (existingLayer->isProtected()) { layer->setProtected(true); } } } } // never allow two blocks with identical names, update block instead: QSharedPointer<RBlock> block = object.dynamicCast<RBlock> (); if (!block.isNull()) { RBlock::Id id = getBlockId(block->getName()); if (id != RBlock::INVALID_ID && id != block->getId()) { setObjectId(*block, id); } } // never allow two linetypes with identical names, update linetype instead: QSharedPointer<RLinetype> linetype = object.dynamicCast<RLinetype> (); if (!linetype.isNull()) { RLinetype::Id id = getLinetypeId(linetype->getName()); if (id != RLinetype::INVALID_ID && id != linetype->getId()) { setObjectId(*linetype, id); } } // avoid block recursions: if (checkBlockRecursion) { /* QSharedPointer<RBlockReferenceEntity> blockRef = object.dynamicCast<RBlockReferenceEntity> (); if (!blockRef.isNull()) { RBlock::Id id = blockRef->getBlockId(); RBlock::Id refId = blockRef->getReferencedBlockId(); // check if block with 'id' may contain a block reference which refers to // block with 'refid': // 201308: too slow for large, complex drawings: if (checkRecursion(id, refId)) { qCritical("RMemoryStorage::saveObject: recursion found"); return false; } } */ } QSharedPointer<REntity> entity = object.dynamicCast<REntity> (); if (!entity.isNull()) { Q_ASSERT_X(!queryLayerDirect(entity->getLayerId()).isNull(), "RMemoryStrorage::saveObject", "Layer of entity is NULL"); } // assign new object ID to new objects: if (object->getId() == RObject::INVALID_ID) { setObjectId(*object, getNewObjectId()); // only set new handle if handle is not set already: if (!keepHandles || object->getHandle()==RObject::INVALID_HANDLE) { setObjectHandle(*object, getNewObjectHandle()); } // assign draw order to new entities: if (!entity.isNull() && entity->getDrawOrder()==0) { entity->setDrawOrder(getMaxDrawOrder()); setMaxDrawOrder(getMaxDrawOrder()+1); } } // TODO: save original object for rollback: //if (inTransaction) { //transactionObjectMap[object->getId()] = object; //} objectMap[object->getId()] = object; objectHandleMap[object->getHandle()] = object; if (!entity.isNull()) { entityMap[entity->getId()] = entity; blockEntityMap.insert(entity->getBlockId(), entity); setMaxDrawOrder(qMax(entity->getDrawOrder()+1, getMaxDrawOrder())); } if (!layer.isNull()) { layerMap[object->getId()] = layer; } if (!block.isNull()) { blockMap[object->getId()] = block; } if (!linetype.isNull()) { linetypeMap[object->getId()] = linetype; } QSharedPointer<RDocumentVariables> docVars = object.dynamicCast<RDocumentVariables> (); if (!docVars.isNull()) { documentVariables = docVars; } return true; }
bool RMemoryStorage::saveObject(QSharedPointer<RObject> object, bool checkBlockRecursion, bool keepHandles) { if (object.isNull()) { return false; } // never allow two layers with identical names, update layer instead: QSharedPointer<RLayer> layer = object.dynamicCast<RLayer>(); if (!layer.isNull()) { RLayer::Id id = getLayerId(layer->getName()); if (id != RLayer::INVALID_ID) { setObjectId(*layer, id); } } // never allow two blocks with identical names, update block instead: QSharedPointer<RBlock> block = object.dynamicCast<RBlock> (); if (!block.isNull()) { RBlock::Id id = getBlockId(block->getName()); if (id != RBlock::INVALID_ID) { setObjectId(*block, id); } } // avoid block recursions: if (checkBlockRecursion) { /* QSharedPointer<RBlockReferenceEntity> blockRef = object.dynamicCast<RBlockReferenceEntity> (); if (!blockRef.isNull()) { RBlock::Id id = blockRef->getBlockId(); RBlock::Id refId = blockRef->getReferencedBlockId(); // check if block with 'id' may contain a block reference which refers to // block with 'refid': // 201308: too slow for large, complex drawings: if (checkRecursion(id, refId)) { qCritical("RMemoryStorage::saveObject: recursion found"); return false; } } */ } QSharedPointer<REntity> entity = object.dynamicCast<REntity> (); // assign new object ID to new objects: if (object->getId() == RObject::INVALID_ID) { setObjectId(*object, getNewObjectId()); // only set new handle if handle is not set already: if (!keepHandles || object->getHandle()==RObject::INVALID_HANDLE) { setObjectHandle(*object, getNewObjectHandle()); } // assign draw order to new entities: if (!entity.isNull()) { entity->setDrawOrder(getMaxDrawOrder()); setMaxDrawOrder(getMaxDrawOrder()+1); } } // TODO: save original object for rollback: //if (inTransaction) { //transactionObjectMap[object->getId()] = object; //} objectMap[object->getId()] = object; //QSharedPointer<REntity> entity = object.dynamicCast<REntity> (); if (!entity.isNull()) { entityMap[entity->getId()] = entity; blockEntityMap.insert(entity->getBlockId(), entity); //qDebug() << "added " << entity->getId() << " to block " << entity->getBlockId(); setMaxDrawOrder(qMax(entity->getDrawOrder()+1, getMaxDrawOrder())); } if (!layer.isNull()) { layerMap[object->getId()] = layer; } if (!block.isNull()) { blockMap[object->getId()] = block; } return true; }