bool CmdPasteSymbolItems::performExecute() { // if an error occurs, undo all already executed child commands auto undoScopeGuard = scopeGuard([&]() { performUndo(); }); // Notes: // // - If the UUID is already existing, or the destination symbol is different // to the source symbol, generate a new random UUID. Otherwise use the same // UUID to avoid modifications after cut+paste within one symbol. // - If there is already a pin with the same name, increment its number (or // start adding a number if there is none already) to get unique names. // - The graphics items of the added elements are selected immediately to // allow dragging them afterwards. for (const SymbolPin& pin : mData->getPins().sortedByName()) { Uuid uuid = pin.getUuid(); if (mSymbol.getPins().contains(uuid) || (mSymbol.getUuid() != mData->getSymbolUuid())) { uuid = Uuid::createRandom(); } CircuitIdentifier name = pin.getName(); for (int i = 0; (i < 1000) && mSymbol.getPins().contains(*name); ++i) { name = CircuitIdentifier( Toolbox::incrementNumberInString(*name)); // can throw } std::shared_ptr<SymbolPin> copy = std::make_shared<SymbolPin>(uuid, name, pin.getPosition() + mPosOffset, pin.getLength(), pin.getRotation()); execNewChildCmd(new CmdSymbolPinInsert(mSymbol.getPins(), copy)); SymbolPinGraphicsItem* item = mGraphicsItem.getPinGraphicsItem(uuid); Q_ASSERT(item); item->setSelected(true); } for (const Circle& circle : mData->getCircles().sortedByUuid()) { Uuid uuid = circle.getUuid(); if (mSymbol.getCircles().contains(uuid) || (mSymbol.getUuid() != mData->getSymbolUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<Circle> copy = std::make_shared<Circle>( uuid, circle.getLayerName(), circle.getLineWidth(), circle.isFilled(), circle.isGrabArea(), circle.getCenter() + mPosOffset, circle.getDiameter()); execNewChildCmd(new CmdCircleInsert(mSymbol.getCircles(), copy)); CircleGraphicsItem* item = mGraphicsItem.getCircleGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } for (const Polygon& polygon : mData->getPolygons().sortedByUuid()) { Uuid uuid = polygon.getUuid(); if (mSymbol.getPolygons().contains(uuid) || (mSymbol.getUuid() != mData->getSymbolUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<Polygon> copy = std::make_shared<Polygon>( uuid, polygon.getLayerName(), polygon.getLineWidth(), polygon.isFilled(), polygon.isGrabArea(), polygon.getPath().translated(mPosOffset)); execNewChildCmd(new CmdPolygonInsert(mSymbol.getPolygons(), copy)); PolygonGraphicsItem* item = mGraphicsItem.getPolygonGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } for (const Text& text : mData->getTexts().sortedByUuid()) { Uuid uuid = text.getUuid(); if (mSymbol.getTexts().contains(uuid) || (mSymbol.getUuid() != mData->getSymbolUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<Text> copy = std::make_shared<Text>( uuid, text.getLayerName(), text.getText(), text.getPosition() + mPosOffset, text.getRotation(), text.getHeight(), text.getAlign()); execNewChildCmd(new CmdTextInsert(mSymbol.getTexts(), copy)); TextGraphicsItem* item = mGraphicsItem.getTextGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } undoScopeGuard.dismiss(); // no undo required return getChildCount() > 0; }
foreach (BI_NetLine* netline, attachedNetLines) { execNewChildCmd(new CmdBoardNetLineAdd(*netline)); // can throw }
bool CmdPasteFootprintItems::performExecute() { // if an error occurs, undo all already executed child commands auto undoScopeGuard = scopeGuard([&]() { performUndo(); }); // Notes: // // - If the UUID is already existing, or the destination footprint is // different to the source footprint, generate a new random UUID. Otherwise // use the same UUID to avoid modifications after cut+paste within one // footprint. // - Footprint pads are only copied if there is an unused package pad with // the same name available. // - The graphics items of the added elements are selected immediately to // allow dragging them afterwards. for (const FootprintPad& pad : mData->getFootprintPads().sortedByUuid()) { Uuid uuid = pad.getPackagePadUuid(); CircuitIdentifier name = mData->getPackagePads().get(uuid)->getName(); std::shared_ptr<PackagePad> newPad = mPackage.getPads().find(*name); if (newPad && (!mFootprint.getPads().contains(newPad->getUuid()))) { std::shared_ptr<FootprintPad> copy = std::make_shared<FootprintPad>( uuid, pad.getPosition() + mPosOffset, pad.getRotation(), pad.getShape(), pad.getWidth(), pad.getHeight(), pad.getDrillDiameter(), pad.getBoardSide()); execNewChildCmd(new CmdFootprintPadInsert(mFootprint.getPads(), copy)); FootprintPadGraphicsItem* item = mGraphicsItem.getPadGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } } for (const Circle& circle : mData->getCircles().sortedByUuid()) { Uuid uuid = circle.getUuid(); if (mFootprint.getCircles().contains(uuid) || (mFootprint.getUuid() != mData->getFootprintUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<Circle> copy = std::make_shared<Circle>( uuid, circle.getLayerName(), circle.getLineWidth(), circle.isFilled(), circle.isGrabArea(), circle.getCenter() + mPosOffset, circle.getDiameter()); execNewChildCmd(new CmdCircleInsert(mFootprint.getCircles(), copy)); CircleGraphicsItem* item = mGraphicsItem.getCircleGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } for (const Polygon& polygon : mData->getPolygons().sortedByUuid()) { Uuid uuid = polygon.getUuid(); if (mFootprint.getPolygons().contains(uuid) || (mFootprint.getUuid() != mData->getFootprintUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<Polygon> copy = std::make_shared<Polygon>( uuid, polygon.getLayerName(), polygon.getLineWidth(), polygon.isFilled(), polygon.isGrabArea(), polygon.getPath().translated(mPosOffset)); execNewChildCmd(new CmdPolygonInsert(mFootprint.getPolygons(), copy)); PolygonGraphicsItem* item = mGraphicsItem.getPolygonGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } for (const StrokeText& text : mData->getStrokeTexts().sortedByUuid()) { Uuid uuid = text.getUuid(); if (mFootprint.getStrokeTexts().contains(uuid) || (mFootprint.getUuid() != mData->getFootprintUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<StrokeText> copy = std::make_shared<StrokeText>( uuid, text.getLayerName(), text.getText(), text.getPosition() + mPosOffset, text.getRotation(), text.getHeight(), text.getStrokeWidth(), text.getLetterSpacing(), text.getLineSpacing(), text.getAlign(), text.getMirrored(), text.getAutoRotate()); execNewChildCmd(new CmdStrokeTextInsert(mFootprint.getStrokeTexts(), copy)); StrokeTextGraphicsItem* item = mGraphicsItem.getTextGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } for (const Hole& hole : mData->getHoles().sortedByUuid()) { Uuid uuid = hole.getUuid(); if (mFootprint.getHoles().contains(uuid) || (mFootprint.getUuid() != mData->getFootprintUuid())) { uuid = Uuid::createRandom(); } std::shared_ptr<Hole> copy = std::make_shared<Hole>( uuid, hole.getPosition() + mPosOffset, hole.getDiameter()); execNewChildCmd(new CmdHoleInsert(mFootprint.getHoles(), copy)); HoleGraphicsItem* item = mGraphicsItem.getHoleGraphicsItem(*copy); Q_ASSERT(item); item->setSelected(true); } undoScopeGuard.dismiss(); // no undo required return getChildCount() > 0; }