#include "GroupScene.h"
#include "GroupItem.h"
#include "BoxItem.h"
+#include "SourceItem.h"
#include "InterfaceItem.h"
#include "ConnectionItem.h"
sceneCounter = 0;
}
-bool Dispatcher::connect(InterfaceItem *iface1, InterfaceItem *iface2) {
-
+bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
+
ConnectedInterface* ref1 = iface1->refInter;
ConnectedInterface* ref2 = iface2->refInter;
+ ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface();
+ ConnectedInterface* asso2 = iface2->refInter->getAssociatedIface();
// connect both interface
bool ok1 = false;
bool ok2 = false;
- if (ref1->canConnectTo(ref2)) {
- ok1 = ref1->connectTo(ref2);
- ok1 = ok1 & ref2->connectFrom(ref1);
+ // test the ref1->ref2 connection
+ if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) {
+ ref1->connectTo(ref2);
+ ref2->connectFrom(ref1);
+ if ((asso1 != NULL) && (asso2 != NULL)) {
+ asso1->connectTo(asso2);
+ asso2->connectFrom(asso1);
+ }
+ ok1 = true;
}
- if (ref2->canConnectTo(ref1)) {
- ok2 = ref2->connectTo(ref1);
- ok2 = ok2 & ref1->connectFrom(ref2);
+ // if the frist one did not work, test ref2->ref1
+ if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {
+ ref2->connectTo(ref1);
+ ref1->connectFrom(ref2);
+ if ((asso1 != NULL) && (asso2 != NULL)) {
+ asso1->connectFrom(asso2);
+ asso2->connectTo(asso1);
+ }
+ ok2 = true;
}
if ((ok1 == true) || (ok2 == true)) {
return false;
}
-void Dispatcher::checkSelection(){
- InterfaceItem *iface1 = NULL;
- InterfaceItem *iface2 = NULL;
-
- GroupScene *scene = params->getCurrentScene();
- QList<AbstractBoxItem*> list = scene->getGroupAndBlocks();
- foreach(AbstractBoxItem *block, list){
- InterfaceItem *tmp = block->getCurrentInterface();
- if (tmp != NULL) {
- if (iface1 == NULL) {
- iface1 = tmp;
- }
- else {
- iface2 = tmp;
- }
- }
- }
- if(iface1 != NULL && iface2 != NULL){
- connect(iface1,iface2);
- }
-}
void Dispatcher::unselectAllItems(int direction){
GroupScene *scene = params->getCurrentScene();
- foreach(BoxItem* block, scene->getBlockItems()) {
+ foreach(BoxItem* block, scene->getBoxItems()) {
block->setSelected(false);
block->setCurrentInterface(NULL);
}
*/
}
-void Dispatcher::renameBlockOrGroup(AbstractBoxItem *item){
- static QString fctName = "Dispatcher::renameBlockOrGroup()";
+void Dispatcher::renameFunctionalBlock(BoxItem *item){
+ static QString fctName = "Dispatcher::renameFunctionalBlock()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
-
- bool ok;
- QString text = QInputDialog::getText(NULL, "Rename an block/group",
+
+ GroupWidget* win = item->getScene()->getGroupWidget();
+
+ bool ok = false;
+ QString text = "";
+ while (!ok) {
+ text = QInputDialog::getText(win, "Rename a functional block",
"New name:", QLineEdit::Normal,
item->getRefBlock()->getName(), &ok);
-
- if(ok){
- if(!text.isEmpty() && text.length() < 30){
- item->getRefBlock()->setName(text);
- if(item->isGroupItem()){
- if (currentGroup->isTopGroup()) {
- mainWindow->setWindowTitle("blast - "+text);
- }
- else {
- currentGroup->setWindowTitle("blast - "+text);
- }
+ if (!ok) return;
+
+ if (text == item->getRefBlock()->getName()) return;
+
+ if( (text.isEmpty()) || (text.length() > 30)) {
+ QMessageBox::warning(win,"Error in given name",
+ "the block name must be shorter than 30 characters, cannot be empty",
+ QMessageBox::Ok);
+ ok = false;
+ }
+ else {
+ FunctionalBlock* block = params->getGraph()->getFunctionalBlockByName(text, AB_TO_GRP(item->getRefBlock()->getParent()));
+ if (block != NULL) {
+ QMessageBox::warning(win,"Error in given name",
+ "the name provided is similar to that of another functional block within the group",
+ QMessageBox::Ok);
+ ok = false;
}
+ }
+ }
- mainWindow->getLibrary()->updateComboScene();
+ item->getRefBlock()->setName(text);
+ item->nameChanged();
+}
+
+void Dispatcher::renameGroupBlock(GroupItem *item){
+ static QString fctName = "Dispatcher::renameGroupBlock()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ GroupWidget* win = item->getScene()->getGroupWidget();
+
+ bool ok = false;
+ QString text = "";
+ while (!ok) {
+ text = QInputDialog::getText(win, "Rename a group",
+ "New name:", QLineEdit::Normal,
+ item->getRefBlock()->getName(), &ok);
+ if (!ok) return;
+
+ if (text == item->getRefBlock()->getName()) return;
+
+ if( (text.isEmpty()) || (text.length() > 30)) {
+ QMessageBox::warning(win,"Error in given name",
+ "the block name must be shorter than 30 characters, cannot be empty",
+ QMessageBox::Ok);
+ ok = false;
}
else {
- QMessageBox::warning(NULL,"Error in given name",
- "the element name must be shorter than 30 characters and can't be empty!",
+ GroupBlock* block = params->getGraph()->getGroupBlockByName(text);
+ if (block != NULL) {
+ QMessageBox::warning(win,"Error in given name",
+ "the name provided is similar to that of another group",
+ QMessageBox::Ok);
+ ok = false;
+ }
+ }
+ }
+
+ item->getRefBlock()->setName(text);
+ if(item->getScene()->getGroupWidget()->isTopGroup()) {
+ mainWindow->setWindowTitle("blast - "+text);
+ }
+ else {
+ item->getScene()->getGroupWidget()->setWindowTitle("blast - "+text);
+ }
+ item->nameChanged();
+ mainWindow->getLibrary()->updateComboScene();
+}
+
+void Dispatcher::renameSourceBlock(SourceItem *item){
+ static QString fctName = "Dispatcher::renameSourceBlock()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ GroupWidget* win = item->getScene()->getGroupWidget();
+
+ bool ok = false;
+ QString text = "";
+ while (!ok) {
+ text = QInputDialog::getText(win, "Rename a source",
+ "New name:", QLineEdit::Normal,
+ item->getRefBlock()->getName(), &ok);
+ if (!ok) return;
+
+ if (text == item->getRefBlock()->getName()) return;
+
+ if( (text.isEmpty()) || (text.length() > 30)) {
+ QMessageBox::warning(win,"Error in given name",
+ "the block name must be shorter than 30 characters, cannot be empty",
QMessageBox::Ok);
- renameBlockOrGroup(item);
+ ok = false;
}
- }
+ else {
+ FunctionalBlock* block = params->getGraph()->getSourceBlockByName(text);
+ if (block != NULL) {
+ QMessageBox::warning(win,"Error in given name",
+ "the name provided is similar to that of another source block within the top group",
+ QMessageBox::Ok);
+ ok = false;
+ }
+ }
+ }
+
+ item->getRefBlock()->setName(text);
+ item->nameChanged();
}
+
void Dispatcher::renameInterface(InterfaceItem *item) {
static QString fctName = "Dispatcher::renameInterface()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
- bool ok;
- QString text = QInputDialog::getText(NULL, "Rename an interface",
+ GroupWidget* win = item->getOwner()->getScene()->getGroupWidget();
+
+ bool ok = false;
+ QString text = "";
+ while (!ok) {
+ text = QInputDialog::getText(win, "Rename an interface",
"New name:", QLineEdit::Normal,
item->refInter->getName(), &ok);
-
- /* CAUTION: when renaming an interface item, there are two cases :
- - it refers to a functional block interface (fbi): the fbi keeps its name
- and the new name is given to item
- - it refers to a group block interface (gbi) : both gbi and item store the new name
-
- */
- if(ok && !text.isEmpty() && text.length() < 30) {
- if (item->refInter->getOwner()->isGroupBlock()) {
- item->refInter->setName(text);
+
+ if (!ok) return;
+
+ if (text == item->refInter->getName()) return;
+
+ if( (text.isEmpty()) || (text.length() > 30)) {
+ QMessageBox::warning(win,"Error in given name",
+ "the interface name must be shorter than 30 characters, cannot be empty",
+ QMessageBox::Ok);
+ ok = false;
+ }
+ else {
+ AbstractInterface* iface = item->refInter->getOwner()->getIfaceFromName(text);
+ if (iface != NULL) {
+ QMessageBox::warning(win,"Error in given name",
+ "the name provided is similar to that of another interface",
+ QMessageBox::Ok);
+ ok = false;
+ }
}
}
- else {
- QMessageBox::warning(NULL,"Error in given name",
- "the interface name must be shorter than 30 characters and can't be empty!",
- QMessageBox::Ok);
- renameInterface(item);
+ item->refInter->setName(text);
+ AbstractInterface* assoIface = item->refInter->getAssociatedIface();
+ if (assoIface != NULL) {
+ assoIface->setName(text+"_enb");
+ }
+ item->updateName(text);
+ item->getOwner()->nameChanged();
+}
+
+void Dispatcher::duplicateBoxItem(BoxItem *item){
+ static QString fctName = "Dispatcher::duplicateBoxItem()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ GroupScene *scene = item->getScene();
+ AbstractBlock* block = item->getRefBlock();
+ AbstractBlock *newBlock;
+
+ // only duplicate functional blocks
+ if(block->isFunctionalBlock()) {
+
+ // adding to the model
+ FunctionalBlock* funBlock = (FunctionalBlock*)block;
+ newBlock = params->getGraph()->duplicateFunctionalBlock(funBlock);
+ // adding to the view
+ scene->createBoxItem(newBlock);
+
+ params->unsaveModif = true;
}
}
-void Dispatcher::duplicateBlock(BoxItem *item){
- static QString fctName = "Dispatcher::duplicateBlock()";
+void Dispatcher::duplicateSourceItem(SourceItem *item) {
+ static QString fctName = "Dispatcher::duplicateSourceItem()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
// adding to the model
FunctionalBlock* funBlock = (FunctionalBlock*)block;
- newBlock = params->duplicateFunctionalBlock(funBlock);
+ newBlock = params->getGraph()->duplicateSourceBlock(funBlock);
// adding to the view
- scene->createBlockItem(newBlock);
+ scene->createSourceItem(newBlock);
params->unsaveModif = true;
}
}
-void Dispatcher::duplicateInterface(InterfaceItem *item) {
- static QString fctName = "Dispatcher::duplicateInterface()";
+void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) {
+ static QString fctName = "Dispatcher::duplicateInterfaceItem()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
if(! refB->isFunctionalBlock()) return;
FunctionalInterface* iface = (FunctionalInterface*)refI;
- AbstractInterface *otherRef = iface->clone();
- if (otherRef == NULL) {
+ AbstractInterface *cloneIface = iface->clone();
+ if (cloneIface == NULL) {
QMessageBox::warning(NULL,"Error while cloning an interface","the interface cannot be cloned because its maximum multiplicity is reached", QMessageBox::Ok);
return;
}
- refB->addInterface(otherRef);
+ refB->addInterface(cloneIface);
- InterfaceItem *otherIface = new InterfaceItem(item->getPosition(),item->getOrientation(),(ConnectedInterface*)otherRef,item->getOwner(),params);
- item->getOwner()->addInterface(otherIface,true);
+ InterfaceItem *cloneIfaceItem = new InterfaceItem(item->getPosition(),item->getOrientation(),(ConnectedInterface*)cloneIface,item->getOwner(),params);
+ item->getOwner()->addInterface(cloneIfaceItem,true);
+
+ // creating control interface if needed
+ if (refI->getAssociatedIface() != NULL) {
+ QString ctlName = cloneIface->getName()+"_enb";
+ ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,"boolean","1",cloneIface->getDirection(), AbstractInterface::Control, 1);
+ refB->addInterface(ctlIface);
+ if (! ctlIface->setAssociatedIface(cloneIface)) {
+ cerr << "Abnormal case while cloning an interface and creating its associated control interface" << endl;
+ }
+ }
}
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
-
- GroupScene *scene = searchSceneById(idScene);
+ bool newSource = false;
+ GroupScene *scene = getSceneById(idScene);
ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock);
- GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
- FunctionalBlock* newOne = params->getGraph()->addFunctionalBlock(group, ref);
- scene->createBlockItem(newOne);
+ // if block has no inputs, propose to add it as a source to top scene
+ if ((scene->isTopScene()) && (ref->getDataInputs().isEmpty())) {
+ int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a source for the top scene. Do you want to add it as a source ?");
+ if (ret == QMessageBox::Yes) {
+ newSource = true;
+ }
+ }
+ if (newSource) {
+ FunctionalBlock* newOne = params->getGraph()->createSourceBlock(ref);
+ scene->createSourceItem(newOne);
+ }
+ else {
+ GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
+ FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref);
+ scene->createBoxItem(newOne);
+ }
params->unsaveModif = true;
}
// getting the parent block in the graph
GroupBlock* parent = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
cout << "new group : parent = "<< qPrintable(parent->getName()) << endl;
- GroupBlock* groupBlock = params->getGraph()->createChildBlock(parent);
+ GroupBlock* groupBlock = params->getGraph()->createChildGroupBlock(parent);
cout << "new group : child = "<< qPrintable(groupBlock->getName()) << ", child of " << qPrintable(groupBlock->getParent()->getName()) << endl;
// creating the BlockItem in the scene
- BoxItem* newItem = scene->createBlockItem(groupBlock);
+ BoxItem* newItem = scene->createBoxItem(groupBlock);
params->unsaveModif = true;
}
if (scene->getNbChildScene() == 0) {
- // remove scene from the parent list
- scene->getParentScene()->removeChildScene(scene);
+ // remove scene from the parent list, if possible
+ if (scene->getParentScene() != NULL) {
+ scene->getParentScene()->removeChildScene(scene);
+ }
// destroy the GroupWidget
groupList.removeAll(scene->getGroupWidget());
scene->getGroupWidget()->deleteLater();
#endif
}
-void Dispatcher::removeBlock(BoxItem *item) {
- static QString fctName = "Dispatcher::removeBlock()";
+void Dispatcher::removeBoxItem(BoxItem *item) {
+ static QString fctName = "Dispatcher::removeBoxItem()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
if (item->getRefBlock()->isFunctionalBlock()) {
FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
GroupBlock* group = AB_TO_GRP(block->getParent());
- item->getScene()->removeBlockItem(item);
- params->getGraph()->removeFunctionalBlock(block,group);
+ item->getScene()->removeBoxItem(item);
+ params->getGraph()->removeFunctionalBlock(block);
}
else if (item->getRefBlock()->isGroupBlock()) {
GroupItem* subgroup = item->getChildGroupItem();
destroyScene(subgroup->getScene());
// remove the BoxItem
- item->getScene()->removeBlockItem(item);
+ item->getScene()->removeBoxItem(item);
// remove the group from the graph
params->getGraph()->removeGroupBlock(group);
}
}
-void Dispatcher::removeAllBlockConnections(BoxItem *item) {
+void Dispatcher::removeAllBlockConnections(AbstractBoxItem *item) {
static QString fctName = "Dispatcher::removeAllBlockConnection()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
}
}
+void Dispatcher::removeSourceItem(SourceItem *item) {
+ static QString fctName = "Dispatcher::removeSourceItem()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ QString msg = "Removing source ";
+
+ msg += item->getRefBlock()->getName();
+ msg += " and all its connections.\n\nAre you sure ?";
+
+ int ret = QMessageBox::question(NULL,"Removing source block",msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
+ if (ret == QMessageBox::Cancel) {
+ return;
+ }
+ removeAllBlockConnections(item);
+
+ FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
+ item->getScene()->removeSourceItem(item);
+ params->getGraph()->removeSourceBlock(block);
+}
+
+
void Dispatcher::removeConnection(ConnectionItem *conn) {
static QString fctName = "Dispatcher::removeConnection()";
#ifdef DEBUG_FCTNAME
InterfaceItem* groupIfaceItem = NULL; // in case of one of the two interface belongs to the GroupItem
GroupItem* groupItem = NULL;
+ ConnectedInterface *fromInter = fromIfaceItem->refInter;
+ ConnectedInterface *toInter = toIfaceItem->refInter;
+ // process the special case source->group apart
+ if (fromIfaceItem->getOwner()->isSourceItem()) {
+ // remove from graph
+ fromInter->removeConnectedTo(toInter);
+ toInter->clearConnectedFrom();
+ // remove from scene
+ fromIfaceItem->removeConnectionItem(conn);
+ toIfaceItem->removeConnectionItem(conn);
+ groupItem->getScene()->removeConnectionItem(conn);
+ return;
+ }
+
+
if (fromIfaceItem->getOwner()->isGroupItem()) {
groupIfaceItem = fromIfaceItem;
groupItem = toIfaceItem->getOwner()->getScene()->getGroupItem();
// removing the connection from graph
#ifdef DEBUG
cout << "removing connections from graph ..." ;
-#endif
- ConnectedInterface *fromInter = fromIfaceItem->refInter;
- ConnectedInterface *toInter = toIfaceItem->refInter;
+#endif
if (fromInter->getDirection() == AbstractInterface::InOut) {
fromInter->clearConnectedTo();
fromInter->clearConnectedFrom();
GroupItem *parentItem = item->getOwner()->getScene()->getGroupItem();
// creating/adding the group interface in the graph model
- GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection());
- groupInter->setType(refInter->getType());
- groupInter->setWidth(refInter->getWidth());
- groupInter->setPurpose(refInter->getPurpose());
+ GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose());
parentItem->getRefBlock()->addInterface(groupInter);
+ // creating/adding the group control interface in the graph model
+ GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control);
+ groupCtlInter->setAssociatedIface(groupInter);
+ parentItem->getRefBlock()->addInterface(groupCtlInter);
// connect both interface
bool ok = true;
else if (refInter->getDirection() == AbstractInterface::Input) {
groupInter = refInter->getConnectedFrom();
refInter->clearConnectedFrom();
- groupInter->clearConnectedTo();
+ groupInter->removeConnectedTo(refInter);
}
else if (refInter->getDirection() == AbstractInterface::InOut) {
groupInter = refInter->getConnectionToParentGroup(); // must be a single connection to
cout << "removing group interface item, and connection item ..." ;
#endif
+ bool groupInterRemove = false;
+ if ((groupInter->isConnectedTo() == false) && (groupInter->isConnectedFrom() == false)) groupInterRemove = true;
+
item->removeConnectionItem(conn);
groupIfaceItem->removeConnectionItem(conn);
- parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item.
+ if (groupInterRemove) {
+ parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item.
+ }
parentItem->getScene()->removeConnectionItem(conn);
#ifdef DEBUG
cout << "done." << endl ;
#endif
- // removing the interface box item in the parent scene
+ if (groupInterRemove) {
+ // removing the interface box item in the parent scene
#ifdef DEBUG
- cout << "removing the inteeface item of box item in parent scene if needed ..." ;
+ cout << "removing the inteeface item of box item in parent scene if needed ..." ;
#endif
-
- BoxItem* parent2Item = parentItem->getParentItem();
- if (parent2Item != NULL) {
- InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter);
- parent2Item->removeInterface(group2IfaceItem);
- }
+
+ BoxItem* parent2Item = parentItem->getParentItem();
+ if (parent2Item != NULL) {
+ InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter);
+ parent2Item->removeInterface(group2IfaceItem);
+ }
#ifdef DEBUG
- cout << "done." << endl ;
+ cout << "done." << endl ;
#endif
-
- // removing the interface group from the group
+
+ // removing the interface group from the group
#ifdef DEBUG
- cout << "removing group interface ..." ;
+ cout << "removing group interface ..." ;
#endif
- parentGroup->removeInterface(groupInter);
+ parentGroup->removeInterface(groupInter);
#ifdef DEBUG
- cout << "done." << endl ;
+ cout << "done." << endl ;
#endif
+ }
}
-void Dispatcher::removeBlockInterface(InterfaceItem *item) {
+void Dispatcher::removeFunctionalInterface(InterfaceItem *item) {
static QString fctName = "Dispatcher::removeBlockInterface()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
return list;
}
-GroupScene* Dispatcher::searchSceneById(int id) {
+GroupScene* Dispatcher::getSceneById(int id) {
foreach(GroupWidget *group, groupList){
if(group->getScene()->getId() == id)
return group->getScene();
return NULL;
}
-GroupItem *Dispatcher::searchGroupItemById(int id) {
+GroupItem *Dispatcher::getGroupItemById(int id) {
foreach(GroupWidget *group, groupList) {
GroupScene* scene = group->getScene();
if (scene->getGroupItem()->getId() == id) return scene->getGroupItem();
return NULL;
}
-BoxItem *Dispatcher::searchBlockItemById(int id) {
+BoxItem *Dispatcher::getBoxItemById(int id) {
foreach(GroupWidget *group, groupList) {
GroupScene* scene = group->getScene();
- foreach(BoxItem *item, scene->getBlockItems()){
+ foreach(BoxItem *item, scene->getBoxItems()){
if(item->getId() == id){
return item;
}
return NULL;
}
-InterfaceItem* Dispatcher::searchInterfaceItemById(int id) {
+InterfaceItem* Dispatcher::getInterfaceItemById(int id) {
foreach(GroupWidget *group, groupList) {
return item;
}
}
- foreach(BoxItem *block, scene->getBlockItems()){
+ foreach(BoxItem *block, scene->getBoxItems()){
foreach(InterfaceItem *item, block->getInterfaces()){
if(item->getId() == id){
return item;