QSharedPointer<RBlock> RClipboardOperation::copyBlock( RBlock::Id blockId, RDocument& src, RDocument& dest, bool overwriteBlocks, bool toCurrentBlock, const QString& blockName, RTransaction& transaction) const { QSharedPointer<RBlock> srcBlock = src.queryBlock(blockId); if (srcBlock.isNull()) { qWarning("RClipboardOperation::copyEntityBlock: " "block of entity is NULL."); return QSharedPointer<RBlock>(); } QString srcBlockName = srcBlock->getName(); QSharedPointer<RBlock> destBlock; if (copiedBlocks.contains(srcBlockName)) { destBlock = copiedBlocks.value(srcBlockName); } else { QString destBlockName; if (!blockName.isNull()) { destBlockName = blockName; } else { if (toCurrentBlock) { destBlockName = dest.getBlockName(dest.getCurrentBlockId()); } else { destBlockName = srcBlock->getName(); } } if (!dest.hasBlock(destBlockName) || (overwriteBlocks && blockName.isNull())) { destBlock = QSharedPointer<RBlock> (srcBlock->clone()); dest.getStorage().setObjectId(*destBlock.data(), RObject::INVALID_ID); dest.getStorage().setObjectHandle(*destBlock.data(), RObject::INVALID_HANDLE); destBlock->setDocument(&dest); if (dest.hasBlock(destBlockName)) { if (!transaction.overwriteBlock(destBlock)) { destBlock = dest.queryBlock(destBlockName); } } else { transaction.addObject(destBlock); } } else { destBlock = dest.queryBlock(destBlockName); } copiedBlocks.insert(srcBlockName, destBlock); } return destBlock; }
QPair<QVariant, RPropertyAttributes> RBlockReferenceEntity::getProperty( RPropertyTypeId propertyTypeId, bool humanReadable, bool noAttributes) { if (propertyTypeId == PropertyType) { return qMakePair(QVariant(RS::EntityBlockRef), RPropertyAttributes(RPropertyAttributes::ReadOnly)); } else if (propertyTypeId == PropertyPositionX) { return qMakePair(QVariant(data.position.x), RPropertyAttributes()); } else if (propertyTypeId == PropertyPositionY) { return qMakePair(QVariant(data.position.y), RPropertyAttributes()); } else if (propertyTypeId == PropertyPositionZ) { return qMakePair(QVariant(data.position.z), RPropertyAttributes()); } else if (propertyTypeId == PropertyScaleX) { return qMakePair(QVariant(data.scaleFactors.x), RPropertyAttributes()); } else if (propertyTypeId == PropertyScaleY) { return qMakePair(QVariant(data.scaleFactors.y), RPropertyAttributes()); } else if (propertyTypeId == PropertyScaleZ) { return qMakePair(QVariant(data.scaleFactors.z), RPropertyAttributes()); } else if (propertyTypeId == PropertyRotation) { return qMakePair(QVariant(data.rotation), RPropertyAttributes(RPropertyAttributes::Angle)); } else if (propertyTypeId == PropertyReferencedBlock) { if (humanReadable) { RDocument* document = getData().getDocument(); if (document != NULL) { RPropertyAttributes attr; // TODO if (!noAttributes) { QSet<QString> blockNames = document->getBlockNames(); QSet<QString> filtered; QSet<QString>::iterator it; for (it=blockNames.begin(); it!=blockNames.end(); it++) { if (!(*it).startsWith("*")) { filtered.insert(*it); } } attr.setChoices(filtered); } return qMakePair(QVariant(document->getBlockName( getData().getReferencedBlockId())), attr); } } else { return qMakePair(QVariant(getData().getReferencedBlockId()), RPropertyAttributes()); } } return REntity::getProperty(propertyTypeId, humanReadable, noAttributes); }
QPair<QVariant, RPropertyAttributes> RLeaderEntity::getProperty( RPropertyTypeId& propertyTypeId, bool humanReadable, bool noAttributes) { if (propertyTypeId == PropertyArrowHead) { return qMakePair(QVariant(data.arrowHead), RPropertyAttributes()); } else if (propertyTypeId == PropertyDimLeaderBlock) { if (humanReadable) { RDocument* document = getData().getDocument(); if (document != NULL) { RPropertyAttributes attr; if (!noAttributes) { QSet<QString> blockNames = document->getBlockNames(); QSet<QString> filtered; QSet<QString>::iterator it; for (it=blockNames.begin(); it!=blockNames.end(); it++) { if (!(*it).startsWith("*")) { filtered.insert(*it); } } attr.setChoices(filtered); } return qMakePair(QVariant(document->getBlockName( getData().getDimLeaderBlockId())), attr); } } else { return qMakePair(QVariant(getData().getDimLeaderBlockId()), RPropertyAttributes()); } } else if (propertyTypeId == PropertyVertexNX) { QVariant v; v.setValue(RVector::getXList(data.vertices)); return qMakePair(v, RPropertyAttributes(RPropertyAttributes::List)); } else if (propertyTypeId == PropertyVertexNY) { QVariant v; v.setValue(RVector::getYList(data.vertices)); return qMakePair(v, RPropertyAttributes(RPropertyAttributes::List)); } else if (propertyTypeId == PropertyVertexNZ) { QVariant v; v.setValue(RVector::getZList(data.vertices)); return qMakePair(v, RPropertyAttributes(RPropertyAttributes::List)); } return REntity::getProperty(propertyTypeId, humanReadable, noAttributes); }
QPair<QVariant, RPropertyAttributes> RBlockReferenceEntity::getProperty( RPropertyTypeId& propertyTypeId, bool humanReadable, bool noAttributes) { if (propertyTypeId == PropertyPositionX) { return qMakePair(QVariant(data.position.x), RPropertyAttributes()); } else if (propertyTypeId == PropertyPositionY) { return qMakePair(QVariant(data.position.y), RPropertyAttributes()); } else if (propertyTypeId == PropertyPositionZ) { return qMakePair(QVariant(data.position.z), RPropertyAttributes()); } else if (propertyTypeId == PropertyScaleX) { return qMakePair(QVariant(data.scaleFactors.x), RPropertyAttributes()); } else if (propertyTypeId == PropertyScaleY) { return qMakePair(QVariant(data.scaleFactors.y), RPropertyAttributes()); } else if (propertyTypeId == PropertyScaleZ) { return qMakePair(QVariant(data.scaleFactors.z), RPropertyAttributes()); } else if (propertyTypeId == PropertyRotation) { return qMakePair(QVariant(data.rotation), RPropertyAttributes(RPropertyAttributes::Angle)); } else if (propertyTypeId == PropertyReferencedBlock) { if (humanReadable) { RDocument* document = getData().getDocument(); if (document != NULL) { RPropertyAttributes attr; // TODO if (!noAttributes) { QSet<QString> blockNames = document->getBlockNames(); QSet<QString> filtered; QSet<QString>::iterator it; for (it=blockNames.begin(); it!=blockNames.end(); it++) { if (!(*it).startsWith("*")) { filtered.insert(*it); } } attr.setChoices(filtered); } return qMakePair(QVariant(document->getBlockName( getData().getReferencedBlockId())), attr); } } else { return qMakePair(QVariant(getData().getReferencedBlockId()), RPropertyAttributes()); } } else if (propertyTypeId.isCustom()) { if (propertyTypeId.getCustomPropertyTitle()=="Attributes") { QString tag = propertyTypeId.getCustomPropertyName(); const RDocument* doc = getDocument(); if (doc!=NULL) { QSet<REntity::Id> childIds = doc->queryChildEntities(getId(), RS::EntityAttribute); QSet<REntity::Id>::iterator it; for (it=childIds.begin(); it!=childIds.end(); it++) { REntity::Id childId = *it; QSharedPointer<REntity> child = doc->queryEntityDirect(childId); if (child.isNull()) { continue; } QSet<RPropertyTypeId> childProperties = child->getPropertyTypeIds(); QSet<RPropertyTypeId>::iterator it2; for (it2=childProperties.begin(); it2!=childProperties.end(); it2++) { RPropertyTypeId pid = *it2; QPair<QVariant, RPropertyAttributes> p = child->getProperty(pid); if (p.second.isVisibleToParent() && pid.getCustomPropertyName()==tag) { //ret.insert(RPropertyTypeId(QT_TRANSLATE_NOOP("REntity", "Attributes"), p.first.toString())); return qMakePair(QVariant(p.first), RPropertyAttributes()); } } } } //document->queryChildEntities(getId()); //return qMakePair(QVariant("Dummy"), RPropertyAttributes()); } } return REntity::getProperty(propertyTypeId, humanReadable, noAttributes); }
/** * Adds the given entity (and its layer(s) and block reference(s)) to the * given document. * * \param blockName Name of an existing block in dest */ void RClipboardOperation::copyEntity( REntity& entity, RDocument& src, RDocument& dest, const RVector& offset, double scale, double unitScale, double rotation, bool flipHorizontal, bool flipVertical, bool toCurrentLayer, bool toCurrentBlock, bool overwriteLayers, bool overwriteBlocks, const QString& blockName, RTransaction& transaction, bool toModelSpaceBlock) const { bool overwriteLinetypes = false; QSharedPointer<RLayer> destLayer = copyEntityLayer(entity, src, dest, overwriteLayers, transaction); QSharedPointer<RLinetype> destLinetype = copyEntityLinetype(entity, src, dest, overwriteLinetypes, transaction); // add block the entity belongs to, if the block exists it is overwritten // if 'overwriteBlocks' is true: QSharedPointer<RBlock> srcBlock = src.queryBlock(entity.getBlockId()); if (srcBlock.isNull()) { qWarning("RClipboardOperation::copyToDocument: " "block of entity is NULL."); return; } QString srcBlockName = srcBlock->getName(); QSharedPointer<RBlock> destBlock; if (copiedBlocks.contains(srcBlockName)) { destBlock = copiedBlocks.value(srcBlockName); } else { QString destBlockName; if (!blockName.isNull()) { destBlockName = blockName; } else { if (toCurrentBlock) { destBlockName = dest.getBlockName(dest.getCurrentBlockId()); } else { destBlockName = srcBlock->getName(); } } if (!dest.hasBlock(destBlockName) || (overwriteBlocks && blockName.isNull())) { destBlock = QSharedPointer<RBlock> (srcBlock->clone()); dest.getStorage().setObjectId(*destBlock.data(), RObject::INVALID_ID); dest.getStorage().setObjectHandle(*destBlock.data(), RObject::INVALID_HANDLE); destBlock->setDocument(&dest); if (dest.hasBlock(destBlockName)) { if (!transaction.overwriteBlock(destBlock)) { destBlock = dest.queryBlock(destBlockName); } } else { transaction.addObject(destBlock); } } else { destBlock = dest.queryBlock(destBlockName); } copiedBlocks.insert(srcBlockName, destBlock); } Q_ASSERT(destBlock->getId()!=RBlock::INVALID_ID); // entity is a block reference: // add entities of the block the block reference refers to (the block // definition is then added automatically): // if block contents has already been copied, do nothing RBlockReferenceEntity* blockRef = dynamic_cast<RBlockReferenceEntity*>(&entity); if (blockRef!=NULL && !copiedBlockContents.contains(blockRef->getReferencedBlockId())) { QSharedPointer<RBlock> refBlock = src.queryBlock(blockRef->getReferencedBlockId()); if (refBlock.isNull()) { qWarning("RClipboardOperation::copyToDocument: " "entity references a NULL block."); return; } copiedBlockContents.insert(blockRef->getReferencedBlockId()); // TODO: don't do this twice: //qDebug() << "RClipboardOperation::copyToDocument: copying block: " << refBlock->getName(); // if block exists in dest, it has already been copied or was // already there and needs to be overwritten: QSharedPointer<RBlock> refBlockDest = dest.queryBlock(refBlock->getName()); if (refBlockDest.isNull() || overwriteBlocks) { QSet<REntity::Id> ids = src.queryBlockEntities(refBlock->getId()); bool first = true; QSet<REntity::Id>::iterator it; for (it=ids.begin(); it!=ids.end(); ++it) { QSharedPointer<REntity> e = src.queryEntityDirect(*it); if (e.isNull()) { continue; } copyEntity( *e.data(), src, dest, RVector::nullVector, 1.0, // scale from user options not applied to block contents // but to block reference unitScale, 0.0, false, false, // no flips false, false, // keep original block and layer overwriteLayers, first && overwriteBlocks, QString(), transaction, false // not to model space but actual block ); first = false; } } } // add entity self: QSharedPointer<REntity> destEntity = QSharedPointer<REntity>(entity.clone()); //dest.getStorage().setObjectId(*destEntity.data(), RObject::INVALID_ID); dest.getStorage().setObjectHandle(*destEntity.data(), RObject::INVALID_HANDLE); destEntity->setSelected(false); // apply transformations: if (flipHorizontal) { destEntity->flipHorizontal(); } if (flipVertical) { destEntity->flipVertical(); } if (blockRef!=NULL) { destEntity->scale(scale); } else { destEntity->scale(scale * unitScale); } destEntity->rotate(rotation); // correct block reference offset. necessary for unit conversion: if (blockRef!=NULL && src.getUnit()!=dest.getUnit()) { destEntity->move(-blockRef->getPosition()); destEntity->move(blockRef->getPosition() * unitScale); } destEntity->move(offset); destEntity->setDocument(&dest); if (toCurrentLayer) { // paste to current layer: destEntity->setLayerId(dest.getCurrentLayerId()); } else { // paste to original layer: Q_ASSERT(!destLayer.isNull()); destEntity->setLayerId(destLayer->getId()); } destEntity->setLinetypeId(destLinetype->getId()); if (toModelSpaceBlock) { destEntity->setBlockId(dest.getModelSpaceBlockId()); } else { destEntity->setBlockId(destBlock->getId()); } // correct referenced block id of pasted block reference: QSharedPointer<RBlockReferenceEntity> destBlockRef = destEntity.dynamicCast<RBlockReferenceEntity>(); if (!destBlockRef.isNull() && blockRef!=NULL) { QString bn = src.getBlockName(blockRef->getReferencedBlockId()); RBlock::Id blockId = dest.getBlockId(bn); destBlockRef->setReferencedBlockId(blockId); // qDebug() << "not yet updated block ref: " << *destBlockRef; // destBlockRef->update(); // qDebug() << "updated block ref: " << *destBlockRef; } transaction.addObject(destEntity, false, true); }