void RS_ActionBlocksRemove::trigger() { RS_DEBUG->print("RS_ActionBlocksRemove::trigger"); if (graphic!=NULL) { RS_Block* block = RS_DIALOGFACTORY->requestBlockRemovalDialog(graphic->getBlockList()); // list of containers that might refer to the block via inserts: RS_PtrList<RS_EntityContainer> containerList; containerList.append(graphic); RS_BlockList* blkLst = graphic->getBlockList(); for (uint bi=0; bi<blkLst->count(); bi++) { containerList.append(blkLst->at(bi)); } if (block!=NULL) { for (RS_EntityContainer* cont = containerList.first(); cont!=NULL; cont=containerList.next()) { // remove all inserts from the graphic: bool done; do { done = true; for (RS_Entity* e=cont->firstEntity(RS2::ResolveNone); e!=NULL; e=cont->nextEntity(RS2::ResolveNone)) { if (e->rtti()==RS2::EntityInsert) { RS_Insert* ins = (RS_Insert*)e; if (ins->getName()==block->getName()) { cont->removeEntity(ins); done = false; break; } } } } while (!done); } // close all windows that are editing this block: if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->closeEditBlockWindow(block); } // Now remove the block from the block list: graphic->removeBlock(block); graphic->updateInserts(); graphicView->redraw(); } } finish(); RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected()); }
/** * Detaches shallow copies and creates deep copies of all subentities. * This is called after cloning entity containers. */ void RS_EntityContainer::detach() { RS_PtrList<RS_Entity> tmp; bool autoDel = entities.autoDelete(); entities.setAutoDelete(false); // make deep copies of all entities: for (RS_Entity* e=firstEntity(); e!=NULL; e=nextEntity()) { if (!e->getFlag(RS2::FlagTemp)) { tmp.append(e->clone()); } } // clear shared pointers: entities.clear(); entities.setAutoDelete(autoDel); // point to new deep copies: for (RS_Entity* e=tmp.first(); e!=NULL; e=tmp.next()) { entities.append(e); e->reparent(this); } }