]> Creatis software - bbtkGEditor.git/blobdiff - lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx
*** empty log message ***
[bbtkGEditor.git] / lib / EditorGraphicBBS / bbsKernelEditorGraphic / wxVtkSceneManager.cxx
index 4e337be93c3d97cc460fee84c9377324d2457934..902db263402a2189e8e5190bb88de0d80f14063f 100644 (file)
@@ -41,39 +41,45 @@ namespace bbtk
 
 
        //=========================================================================
-       wxVtkSceneManager::wxVtkSceneManager(wxDropTarget *parent, wxVtk3DBaseView *baseView,int idManager)
+       wxVtkSceneManager::wxVtkSceneManager(wxGEditorTabPanel *parent, wxVtk3DBaseView *baseView,int idManager)
        {
+               printf ("EED %p wxVtkSceneManager()\n" , this );
+               _parent = parent;
                _numBoxes=0;
                _idManager=idManager;
                _baseView=baseView;
-               _idLastController=0;
+               _startDragging=false;
+               _isComplexBox=false;
 
                if( _baseView!=NULL )
                {
-                       _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(parent);
-                       registerController(this);
+//EED02JUIN2010        
+                       _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget((wxDropTarget*)parent);                      
                        configureBaseView();
                        _worldState=NOTHING_HAPPENS;
+                       registerController(this);
                        
                }
 
-               
        }
 
-
        //=========================================================================
 
        void wxVtkSceneManager::disconnectDrop()
        {
-               _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(NULL);
-       }
+               printf ("EED %p ~wxVtkSceneManager::disconnectDrop()\n" , this );
+//EED02JUIN2010                _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(NULL);
+//     _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget( new tmpClasswxTextDropTarget() );
+       }
 
        //=========================================================================
 
        wxVtkSceneManager::~wxVtkSceneManager()
        {
+               printf ("EED %p ~wxVtkSceneManager()\n" , this );
+               disconnectDrop();
        }
-
        //=========================================================================
 
        void wxVtkSceneManager::configureBaseView()
@@ -98,9 +104,8 @@ namespace bbtk
 
        //=========================================================================
 
-       void wxVtkSceneManager::createGBlackBox(int x, int y, std::string packageName, std::string boxName)
+       int wxVtkSceneManager::createGBlackBox(int x, int y, std::string packageName, std::string boxType)
        {
-
                int windowWidth=_baseView->GetRenWin()->GetSize()[0];
                int windowHeight=_baseView->GetRenWin()->GetSize()[1];
 
@@ -112,13 +117,13 @@ namespace bbtk
                vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type);
                GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type);
                
-               BlackBoxDescriptor::Pointer descriptor = GObjectsMVCFactory::getInstance()->getBlackBoxDescriptor(packageName, boxName);
+               BlackBoxDescriptor::Pointer descriptor = GObjectsMVCFactory::getInstance()->getBlackBoxDescriptor(packageName, boxType);
                
                //Prepares the initial model
                //The coordinates obtained are the following. Top-Left:x=0,y=0 Bottom-Right:x=width,y=height  
 
                double xx = x;
-               double yy =  windowHeight-y;
+               double yy = windowHeight-y;
                
                //z value is not important yet, because it is only used a parallel projection
                double zz = 900;
@@ -140,7 +145,8 @@ namespace bbtk
                std::string arraystring = stream.str();
 
                model->setBBTKName(arraystring);
-               model->setBBTKType(boxName);
+               model->setBBTKType(boxType);
+               model->setBBTKPackage(packageName);
                                
                model->addObserver(view);
                model->addObserver(this);
@@ -180,36 +186,140 @@ namespace bbtk
                controller->setModelAndView(model,view);
 
                //Resgiter change to the observers of the actual model
-               model->setChanged();
-               model->notifyObservers();
+               model->notifyObservers(_idManager);
                
-               //Register the controller of the new object
-               registerController((InteractorStyleMaracas*) controller);
+               int newId = addObjectController(controller);
+               return newId;
 
-               //Add the object to the objects list 
-               int newId = _controllers.size();
-               controller->setId(newId);
-               _controllers[newId] = controller;
+       }
+
+       //=========================================================================
+
+       int wxVtkSceneManager::createGComplexBoxInputPort(std::string inputName)
+       {
+               int windowWidth=_baseView->GetRenWin()->GetSize()[0];
+               int windowHeight=_baseView->GetRenWin()->GetSize()[1];
+               
+               int type = GCOMPLEXINPUTPORT;
+
+               //Create the MVC Objects
+               
+               GComplexBoxPortModel *model = (GComplexBoxPortModel*)GObjectsMVCFactory::getInstance()->createGObjectModel(type);
+               vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type);
+               GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type);
+                               
+               //Prepares the initial model 
+
+               double xx = 5;
+               double yy = windowHeight-5;
+               
+               //z value is not important yet, because it is only used a parallel projection
+               double zz = 900;
+
+               _baseView->TransCoordScreenToWorld(xx,yy,zz);
+               model->setInicPoint(xx,yy,zz);
+                               
+               model->setBBTKName(inputName);
+               model->setBBTKType("ComplexInputPort");
+               model->setComplexPortType(type);
+                               
+               model->addObserver(view);
+               model->addObserver(this);
+               
+               //create the output port                
+               GPortController* portController = createGPort(GOUTPUTPORT,inputName,"ComplexInputPort",0,model);
+               model->addOutputPort((GPortModel*)portController->getModel());
+               
+               //Associates the view with the correspondent renderer and the  model.
+               //(NOTE: Refresh is only made by the view)
+               view->setModel(model);
+               view->setBaseView(_baseView);
+               view->initVtkObjects();
+               
+               //Associates the controller with the correspondent model and view
+               controller->setModelAndView(model,view);
+
+               //Resgiter change to the observers of the actual model
+               model->notifyObservers(_idManager);
+               
+               int newId = addObjectController(controller);
+               return newId;
+       }
+
+       //=========================================================================
+       
+       int wxVtkSceneManager::createGComplexBoxOutputPort(std::string outputName)
+       {
+               int windowWidth=_baseView->GetRenWin()->GetSize()[0];
+               int windowHeight=_baseView->GetRenWin()->GetSize()[1];
+
+               int type = GCOMPLEXOUTPUTPORT;
+
+               //Create the MVC Objects
+               
+               GComplexBoxPortModel *model = (GComplexBoxPortModel*)GObjectsMVCFactory::getInstance()->createGObjectModel(type);
+               vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type);
+               GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type);
+                               
+               //Prepares the initial model 
+
+               double xx = 5;
+               double yy = windowHeight-5;
+               
+               //z value is not important yet, because it is only used a parallel projection
+               double zz = 900;
+
+               _baseView->TransCoordScreenToWorld(xx,yy,zz);
+               model->setInicPoint(xx,yy,zz);
+                               
+               model->setBBTKName(outputName);
+               model->setBBTKType("ComplexOutputPort");
+               model->setComplexPortType(type);
+                               
+               model->addObserver(view);
+               model->addObserver(this);
+               
+               //create the output port                
+               GPortController* portController = createGPort(GINPUTPORT,outputName,"ComplexInputPort",0,model);
+               model->addInputPort((GPortModel*)portController->getModel());
+               
+               //Associates the view with the correspondent renderer and the  model.
+               //(NOTE: Refresh is only made by the view)
+               view->setModel(model);
+               view->setBaseView(_baseView);
+               view->initVtkObjects();
+               
+               //Associates the controller with the correspondent model and view
+               controller->setModelAndView(model,view);
 
+               //Resgiter change to the observers of the actual model
+               model->notifyObservers(_idManager);
+               
+               int newId = addObjectController(controller);
+               return newId;
        }
 
        //=========================================================================
 
-       void wxVtkSceneManager::createGInputPort(int portType, int posinBox,GBlackBoxModel *blackBox, BlackBoxInputDescriptor *desc)
+       int wxVtkSceneManager::createGInputPort(int portType, int posinBox,GBoxModel *blackBox, BlackBoxInputDescriptor *desc)
        {
-               createGPort(portType,posinBox,blackBox);
+               GPortController* portController = createGPort(portType,desc->GetName(),desc->GetTypeName(),posinBox,blackBox);
+               blackBox->addInputPort((GPortModel*)portController->getModel());
+               return portController->getId();
        }
 
        //=========================================================================
 
-       void wxVtkSceneManager::createGOutputPort(int portType, int posinBox,GBlackBoxModel *blackBox, BlackBoxOutputDescriptor *desc)
+       int wxVtkSceneManager::createGOutputPort(int portType, int posinBox,GBoxModel *blackBox, BlackBoxOutputDescriptor *desc)
        {
-               createGPort(portType,posinBox,blackBox);
+               GPortController* portController = createGPort(portType,desc->GetName(),desc->GetTypeName(),posinBox,blackBox);
+               blackBox->addOutputPort((GPortModel*)portController->getModel());
+               return portController->getId();
        }
 
        //=========================================================================
 
-       void wxVtkSceneManager::createGPort(int portType, int posInBox,GBlackBoxModel *blackBox)
+       GPortController* wxVtkSceneManager::createGPort(int portType,std::string bbtkName, std::string bbtkType, int posInBox,GBoxModel *blackBox)
        {
                int type = GPORT;
 
@@ -219,8 +329,10 @@ namespace bbtk
                GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type);
 
                model->registerInBox(blackBox,portType, posInBox);
-               blackBox->addOutputPort(model);
                
+               model->setBBTKType(bbtkType);
+               model->setBBTKName(bbtkName);
+
                model->addObserver(view);
                model->addObserver(this);
 
@@ -233,49 +345,47 @@ namespace bbtk
                //Associates the controller with the correspondent model and view
                controller->setModelAndView(model,view);
 
-               model->notifyObservers();
+               model->notifyObservers(_idManager);
 
-               //Register the controller of the new object
-               registerController((InteractorStyleMaracas*) controller);
-               
-               int newId = _controllers.size();
-               controller->setId(newId);
-               _controllers[newId] = controller;
+               int newId = addObjectController(controller);
+
+               return (GPortController*)controller;
        }
 
        //=========================================================================
 
-       void wxVtkSceneManager::createGConnector(GPortModel* startPort)
+       int wxVtkSceneManager::createGConnector(GPortModel* startPort)
        {
                int type = GCONNECTOR;
 
                manualConnectorContourController* manContourControl     = new manualConnectorContourController();
-               manualConnectorContourView* manViewerContour    = new manualConnectorContourView();
+               manualConnectorContourView* manContourView      = new manualConnectorContourView();
                manualContourModel* manContourModel     = new manualContourModel();
 
                GConnectorController* connectorcontroller = new GConnectorController();                         
                GConnectorModel* connectorModel = new GConnectorModel();
-               GConnectorView* connectorView = new GConnectorView();
+               vtkGConnectorView* connectorView = new vtkGConnectorView();
                connectorModel->setGObjectType(type);
 
                manContourModel->SetCloseContour(false);
                connectorModel->setStartPort(startPort);
 
-               manViewerContour->SetModel( manContourModel );
-               manViewerContour->SetWxVtkBaseView( _baseView );
-               manViewerContour->SetRange( 0.5 );
-               manViewerContour->SetZ( 900 );
+               manContourView->SetModel( manContourModel );
+               manContourView->SetWxVtkBaseView( _baseView );
+               manContourView->SetRange( 0.5 );
+               manContourView->SetZ( 900 );
 
-               manViewerContour->SetColorNormalContour(0, 0, 1);
-               manViewerContour->SetColorEditContour(0.5, 0.5, 0.5);
-               manViewerContour->SetColorSelectContour(1, 0.8, 0);
-               manViewerContour->SetWidthLine(1);
+               manContourView->SetColorNormalContour(0, 0, 1);
+               manContourView->SetColorEditContour(0.5, 0.5, 0.5);
+               manContourView->SetColorSelectContour(1, 0.8, 0);
+               manContourView->SetWidthLine(1);
+               manContourView->SetShowText(false);
 
-               manContourControl->SetModelView( manContourModel , manViewerContour );
+               manContourControl->SetModelView( manContourModel , manContourView );
                
                manContourControl->CreateNewManualContour();
 
-               manViewerContour->RefreshContour();
+               manContourView->RefreshContour();
 
 
                double x,y,z;
@@ -285,27 +395,32 @@ namespace bbtk
                manContourModel->SetCloseContour(false);
                
                manContourModel->AddPoint(x,y,z);
-               manViewerContour->AddPoint();
+               manContourView->AddPoint();
 
                manContourModel->AddPoint(x,y,z);
-               manViewerContour->AddPoint();
+               manContourView->AddPoint();
 
                int bak= manContourControl->GetNumberOfPointsManualContour() - 1;
                manContourControl->_bakIdPoint=bak;
-               manViewerContour->Refresh();
+               manContourView->Refresh();
 
                manContourControl->SetMoving( false );
 
-               registerController((InteractorStyleMaracas*) connectorcontroller);
+               connectorcontroller->setModelAndView(connectorModel,connectorView);
+
+               int newId = addObjectController(connectorcontroller);
 
                connectorcontroller->setManualContourController(manContourControl);             
                connectorModel->setManualContourModel(manContourModel);
-               connectorcontroller->setModelAndView(connectorModel,NULL);
+               connectorView->setManualContourView(manContourView);
+               connectorView->setModel(connectorModel);
+               connectorView->setBaseView(_baseView);
+               
 
-               int newId = _controllers.size();
-               connectorcontroller->setId(newId);
-               _controllers[newId] = connectorcontroller;
+               connectorModel->addObserver(connectorView);
+               connectorModel->addObserver(this);
 
+               return newId;
        }
 
        //=========================================================================
@@ -318,6 +433,14 @@ namespace bbtk
 
        //=========================================================================
 
+       void wxVtkSceneManager::unregisterController(InteractorStyleMaracas *param)
+       {
+               vtkInteractorStyleBaseView* baseViewControlManager = (vtkInteractorStyleBaseView*)_baseView->GetInteractorStyleBaseView();
+               baseViewControlManager->RemoveInteractorStyleMaracas( param );
+       }
+
+       //=========================================================================
+
        vtkRenderer* wxVtkSceneManager::getRenderer()
        {
                return _baseView->GetRenderer();
@@ -331,86 +454,1551 @@ namespace bbtk
        }
        //=========================================================================
 
-       bool wxVtkSceneManager::OnMouseMove()
+               
+       void wxVtkSceneManager::update(int idController,int command)
        {
-               return true;
+               if(command != NO_COMMAND)
+               {
+                       if(command == ADD_TO_SELECTED)
+                       {
+                               GObjectController* cont = _controllers[idController];
+
+                               bool foundID=false;
+                               for (int i=0; i<_selectedObjects.size() && foundID==false; i++)
+                               {
+                                       int id = _selectedObjects[i];
+                                       if(id==idController)
+                                       {
+                                               foundID = true;
+                                       }
+                               }
+                               if(!foundID)
+                               {
+                                       int id = idController;
+                                       _selectedObjects.push_back(id);
+                               }
+
+                       }
+                       else if(command == INIT_CREATION_CONTOUR)
+                       {       
+                               _worldState = INIT_CREATION_CONTOUR;
+                               GObjectController* cont = _controllers[idController];
+                               GPortModel* startOutputPort = (GPortModel*)cont->getModel();
+                               
+
+                               // The last one is the controller of the connector
+                               for(int i=0;i<_controllers.size();i++)
+                               {
+                                       GObjectController* cont = _controllers[i];
+                                       if(cont->getGObjectType() == GPORT )
+                                       {
+                                               GPortModel* port = (GPortModel*)cont->getModel();
+                                               if(port->getPortType()==GINPUTPORT)
+                                               {
+                                                       cont->SetActive(true);
+                                               }
+                                               else
+                                               {
+                                                       cont->getView()->setState(NOTHING_HAPPENS);
+                                                       cont->getModel()->notifyObservers(_idManager);
+                                                       cont->SetActive(false);
+                                               }
+                                       }
+                                       else
+                                       {
+                                               cont->getView()->setState(NOTHING_HAPPENS);
+                                               cont->getModel()->notifyObservers(_idManager);
+                                               cont->SetActive(false);
+                                       }                               
+                               }
+
+                               _selectedObjects.clear();
+
+                               createGConnector(startOutputPort);
+
+                       }
+                       else if(command == FIN_CREATION_CONTOUR && _worldState == INIT_CREATION_CONTOUR)
+                       {                               
+                               _worldState = NOTHING_HAPPENS;
+                               int id = _controllers.size()-1;
+                               GObjectController* cont = _controllers[id];                     
+                               GConnectorModel* modelContour = (GConnectorModel*)cont->getModel();
+
+                               GObjectController* finPort = _controllers[idController];
+                               if(finPort->getGObjectType() == GPORT)
+                               {
+                                       GPortModel* modelPort = (GPortModel*)finPort->getModel();
+                                       modelContour->setEndPort(modelPort);
+                               }                       
+
+                               manualConnectorContourController* manCont = ((GConnectorController*)cont)->getManualContourController();                        
+                               manualConnectorContourView* connView = (manualConnectorContourView*)manCont->GetManualViewBaseContour();
+                               connView->Refresh();
+
+                               for(int i=0;i<_controllers.size();i++)
+                               {
+                                       GObjectController* cont = _controllers[i];
+                                       if(cont->getView()!=NULL)
+                                       {
+                                               cont->getView()->setState(NOTHING_HAPPENS);
+                                               cont->getModel()->notifyObservers(_idManager);
+                                       }
+                                       cont->SetActive(true);                                                          
+                               }
+                       }
+                       
+               }
        }
 
        //=========================================================================
-       
-       void wxVtkSceneManager::update(int idController,int command)
+
+       bool wxVtkSceneManager::OnMouseMove()
        {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X,Y);
+       
                
-               if(command == INIT_CREATION_CONTOUR)
-               {       
-                       GObjectController* cont = _controllers[idController];
-                       if(cont->getGObjectType() == GPORT)
+               if(_worldState == DRAG_OBJECTS)
+               {                       
+                       for (int i=0; i<_selectedObjects.size(); i++)
                        {
-                               GPortModel* startOutputPort = (GPortModel*)cont->getModel();
-                               createGConnector(startOutputPort);
+                               int id = _selectedObjects[i];
+                               GObjectController* cont = _controllers[id];
+                               if(_startDragging)
+                               {
+                                       cont->getView()->setStartDragging(true);
+                               }
+                               cont->getView()->moveObject(X,Y);
+                               cont->getView()->setState(DRAG);
+                               cont->getModel()->notifyObservers(_idManager);
                        }
-                       // The last one is the controller of the connector
-                       for(int i=0;i<_controllers.size()-1;i++)
+
+                       std::map<int, GObjectController*>::iterator it;
+
+                       for(it = _controllers.begin(); it != _controllers.end(); ++it)
                        {
-                               GObjectController* cont = _controllers[i];
-                               if(cont->getGObjectType() == GPORT )
+                               GObjectController *desc = it->second;
+                               if(desc->getGObjectType()==GCONNECTOR)
                                {
-                                       GPortModel* port = (GPortModel*)cont->getModel();
-                                       if(port->getPortType()==GINPUTPORT)
+                                       vtkGConnectorView* vconn = (vtkGConnectorView*)desc->getView();
+                                       vconn->updateStartEndPoints();
+                               }
+                       }
+                       
+                       _startDragging=false;
+
+               }
+               else if(_worldState == NOTHING_HAPPENS || _worldState == INIT_CREATION_CONTOUR)
+               {
+                       std::map<int, GObjectController*>::iterator it;
+
+                       for(it = _controllers.begin(); it != _controllers.end(); ++it)
+                       {
+                               GObjectController *desc = it->second;
+                               int type = desc->getGObjectType();
+                               int state = desc->getView()->getState();
+                               
+                               if(state == HIGHLIGHTED){
+
+                                       updateStatusBar(desc->getStatusText());
+                                       if(type==GBLACKBOX)
                                        {
-                                               cont->SetActive(true);
+                                               GBlackBoxModel *mod = (GBlackBoxModel*)desc->getModel();
+                                               _parent->displayBlackBoxInfo(mod->getBBTKPackage(),mod->getBBTKType());
                                        }
-                                       else
+                               }
+                       }
+               }
+               
+               return true;
+       }
+
+       //=========================================================================
+       
+       bool wxVtkSceneManager::OnLeftButtonDown()
+       {
+               if(_worldState==INIT_CREATION_CONTOUR)
+               {
+                       bool isOverPort=false;
+                       std::map<int, GObjectController*>::iterator it;
+                       for(it = _controllers.begin(); it != _controllers.end() && isOverPort==false; ++it)
+                       {
+                               GObjectController *desc = it->second;
+                               if(desc->getGObjectType()==GPORT)
+                               {
+                                       GPortModel* portmod=(GPortModel*)desc->getModel();
+                                       vtkGObjectView* portView=desc->getView();
+                                       if(portmod->getPortType()==GINPUTPORT && portView->getState()==HIGHLIGHTED)
                                        {
-                                               cont->getView()->setState(NOTHING_HAPPENS);
-                                               cont->SetActive(false);
+                                               isOverPort=true;
                                        }
                                }
-                               else
+                       }
+                       
+                       if(isOverPort==false)
+                       {
+                               _worldState=NOTHING_HAPPENS;
+                               int lastId = _controllers.size()-1;
+                               GConnectorController *connector = (GConnectorController*)_controllers[lastId];
+                               connector->removeFromScene();
+                               unregisterController(connector);
+                               _controllers.erase(lastId);                     
+
+                               for(it = _controllers.begin(); it != _controllers.end(); ++it)
                                {
-                                       cont->getView()->setState(NOTHING_HAPPENS);
-                                       cont->SetActive(false);
-                               }                               
+                                       GObjectController *desc = it->second;
+                                       desc->SetActive(true);
+                                       desc->getView()->setState(NOTHING_HAPPENS);
+                                       desc->getModel()->notifyObservers(_idManager);
+                               }
+                       }
+               }
+               
+               if(_selectedObjects.size()!=0)
+               {
+                       _worldState = DRAG_OBJECTS;
+                       _startDragging = true;
+
+                       for (int i = 0; i < _selectedObjects.size(); i++)
+                       {
+                               int id = _selectedObjects[i];
+                               GObjectController* cont = _controllers[id];
+                               cont->getView()->setState(DRAG);
+                               cont->getModel()->notifyObservers(_idManager);
                        }
-                       _worldState = CREATING_CONTOUR;
                }
-               else if(command == FIN_CREATION_CONTOUR && _worldState == CREATING_CONTOUR)
+               
+               
+               
+               return true;
+       }
+
+       //=========================================================================
+       
+       bool wxVtkSceneManager::OnLeftButtonUp()
+       {
+               if(_worldState == DRAG_OBJECTS)
                {
                        _worldState = NOTHING_HAPPENS;
-                       int id = _controllers.size()-1;
-                       GObjectController* cont = _controllers[id];                     
-                       GConnectorModel* modelContour = (GConnectorModel*)cont->getModel();
 
-                       GObjectController* finPort = _controllers[idController];
-                       if(cont->getGObjectType() == GPORT)
+                       for (int i = 0; i < _selectedObjects.size(); i++)
+                       {
+                               int id = _selectedObjects[i];
+                               GObjectController* cont = _controllers[id];
+                               cont->getView()->setState(SELECTED);
+                               cont->getModel()->notifyObservers(_idManager);
+                       }
+               }
+               return true;
+       }
+
+       //=========================================================================
+
+       bool wxVtkSceneManager::OnRightButtonUp()
+       {
+               if(_worldState==INIT_CREATION_CONTOUR)
+               {
+                       _worldState=NOTHING_HAPPENS;
+                       int lastId = _controllers.size()-1;
+                       GConnectorController *connector = (GConnectorController*)_controllers[lastId];
+                       connector->removeFromScene();
+                       unregisterController(connector);
+                       _controllers.erase(lastId);                     
+
+                       std::map<int, GObjectController*>::iterator it;
+                       for(it = _controllers.begin(); it != _controllers.end(); ++it)
                        {
-                               GPortModel* modelPort = (GPortModel*)finPort->getModel();
-                               modelContour->setEndPort(modelPort);
-                       }                       
+                               GObjectController *desc = it->second;
+                               desc->SetActive(true);
+                               desc->getView()->setState(NOTHING_HAPPENS);
+                               desc->getModel()->notifyObservers(_idManager);
+                       }
+               }
+
+                       
+               for (int i = 0; i < _selectedObjects.size(); i++)
+               {
+                       int id = _selectedObjects[i];
+                       GObjectController* cont = _controllers[id];
+                       cont->SetActive(true);
+                       cont->getView()->setState(NOTHING_HAPPENS);
+                       cont->getModel()->notifyObservers(_idManager);
+               }
+
+               _selectedObjects.clear();
+
+               return true;
+       }
+
+       //=========================================================================
+
+       bool wxVtkSceneManager::OnLeftDClick()
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X,Y);
+
+               std::map<int, GObjectController*>::iterator it;
 
-                       manualContourControler* manCont = ((GConnectorController*)cont)->getManualContourController();
+               bool clickOnObject = false;
+
+               for(it = _controllers.begin(); it != _controllers.end() && clickOnObject==false; ++it)
+               {
+                       GObjectController *cont = it->second;
+                       int type = cont->getGObjectType();
                        
-                       //manCont->SetCompleteCreation( true );
-                       //manCont->SetKeyBoardMoving( false );
-                       //manCont->GetManualContourModel()->SetCloseContour(false);
-                       //manCont->SetEditable( false );
-                       //manCont->SetPosibleToMove( false );
-                       //manCont->SetState(0);
+                       if(cont->getView()->isPointInside(X,Y))
+                       {
+                               if(type==GBLACKBOX)
+                               {
+                                       for (int i=0; i<_selectedObjects.size(); i++)
+                                       {
+                                               int id = _selectedObjects[i];
+                                               GObjectController* control = _controllers[id];
+                                               control->getView()->setState(NOTHING_HAPPENS);
+                                       }
+                                       _selectedObjects.clear();
+
+                                       GBlackBoxModel *bbmodel = (GBlackBoxModel*)cont->getModel();
+                                       _parent->editBlackBox(bbmodel);
+                               }
+                               clickOnObject = true;                   
+                       }
+               }
+
+               if(clickOnObject==false)
+               {
+                       //_parent->editDiagramParameters(this);
+               }
+
+               return true;
+       }
+       
+       //=========================================================================
 
-                       for(int i=0;i<_controllers.size();i++)
+       bool wxVtkSceneManager::OnChar()
+       {       
+               char keyCode = _vtkInteractorStyleBaseView->GetInteractor()-> GetKeyCode();
+               
+               // KeyCode 127 : Delete Key
+               // KeyCode 8 : Backspace Key
+               if(keyCode == 8 || keyCode == 127)
+               {
+                       if(_selectedObjects.size()>0)
                        {
-                               GObjectController* cont = _controllers[i];
-                               if(cont->getView()!=NULL)
+                               for(int i=0;i<_selectedObjects.size();i++)
                                {
-                                       cont->getView()->setState(NOTHING_HAPPENS);
+                                       int id = _selectedObjects[i];
+                                       deleteObject(id);
                                }
-                               cont->SetActive(true);                                                          
+                               _selectedObjects.clear();
                        }
                }
+
+               return true;
        }
 
        //=========================================================================
 
+       void wxVtkSceneManager::deleteObject(int id)
+       {
+               GObjectController *control = _controllers[id];
+               std::vector<int> controllersToRemove;
+
+               if(control->getGObjectType()==GBLACKBOX || control->getGObjectType()==GCOMPLEXINPUTPORT || control->getGObjectType()==GCOMPLEXOUTPUTPORT)
+               {
+                       GBoxModel *bbmod = (GBoxModel*)control->getModel();
+                       std::vector<GPortModel*> inputs = bbmod->getInputPorts();
+                       
+                       bool boxConnected = false;
+
+                       // Add box input controllers to be removed
+                       for(int i = 0;i<inputs.size();i++)
+                       {
+                               controllersToRemove.push_back(inputs[i]->getObjectId());
+                               if(inputs[i]->isConnected())
+                               {
+                                       boxConnected = true;
+                               }
+                       }
+
+                       std::vector<GPortModel*> outputs = bbmod->getOutputPorts();
+
+                       // Add box output controllers to be removed
+                       for(int i = 0;i<outputs.size();i++)
+                       {
+                               controllersToRemove.push_back(outputs[i]->getObjectId());
+                               if(outputs[i]->isConnected())
+                               {
+                                       boxConnected = true;
+                               }
+                       }
+
+                       // Add connection controllers to be removed
+                       std::map<int, GObjectController*>::iterator it;
+                       for(it = _controllers.begin(); it != _controllers.end(); ++it)
+                       {
+                               GObjectController *cont = it->second;
+                               int type = cont->getGObjectType();
+                               if(type==GCONNECTOR)
+                               {
+                                       GConnectorModel *conMod = (GConnectorModel*)cont->getModel();
+                                       if(conMod->getStartPort()!=NULL && conMod->getStartPort()->getParentBox()->getObjectId() == bbmod->getObjectId())
+                                       {
+                                               controllersToRemove.push_back(conMod->getObjectId());
+                                       }
+                                       if(conMod->getEndPort()!=NULL && conMod->getEndPort()->getParentBox()->getObjectId() == bbmod->getObjectId())
+                                       {
+                                               controllersToRemove.push_back(conMod->getObjectId());
+                                       }
+                               }
+                       }
+
+                       // Add box controller to be removed
+                       controllersToRemove.push_back(bbmod->getObjectId());
+               }
+               else if(control->getGObjectType()==GCONNECTOR)
+               {                       
+                       GConnectorModel *conMod = (GConnectorModel*)control->getModel();
+                       controllersToRemove.push_back(conMod->getObjectId());
+               }
+
+               for(int i = 0;i<controllersToRemove.size();i++)
+               {
+                       int id = controllersToRemove[i];
+                       GObjectController *cont = _controllers[id];                     
+                       cont->removeFromScene();
+                       unregisterController((InteractorStyleMaracas*)cont);                    
+                       _controllers.erase(id);
+               }
+
+
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::displayBlackBoxInfo(std::string packageName, std::string boxName)
+       {
+               _parent->displayBlackBoxInfo(packageName,boxName);
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::updateStatusBar(std::string textStatus)
+       {
+               _parent->updateStatusBar(textStatus);
+       }
+
+       //=========================================================================
+
+       std::string wxVtkSceneManager::getDiagramBBS()
+       {
+               bool existsExec=false;
+
+               std::vector<std::string> packages;
+               std::vector<int> boxes;
+               std::vector<int> connections;
+               std::vector<int> execBoxes;
+
+               std::map<int, GObjectController*>::iterator it;
+
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *desc = it->second;
+                       int type = desc->getGObjectType();
+
+                       if(type==GBLACKBOX)
+                       {
+                               GBlackBoxModel *mod = (GBlackBoxModel*)desc->getModel();
+                               
+                               std::string pkg = mod->getBBTKPackage();
+                               bool existsPkg = false;
+                               for(int t = 0;t<packages.size() && existsPkg == false;t++)
+                               {
+                                       if(packages[t]==pkg)
+                                       {
+                                               existsPkg=true;
+                                       }
+                               }
+                               if(!existsPkg)
+                               {
+                                       packages.push_back(pkg);
+                               }
+
+
+                               boxes.push_back(it->first);
+                               if(mod->isExecutable())
+                               {
+                                       execBoxes.push_back(it->first);
+                                       existsExec=true;
+                               }
+                       }
+                       else if(type==GCONNECTOR)
+                       {
+                               connections.push_back(it->first);
+                       }
+               }
+
+               std::string script = "";
+               script+="# BBTK GEditor Script\n";
+               script+="# ----------------------\n";
+               if(existsExec)
+               {
+                       int i;
+                       for(i = 0; i<packages.size();i++)
+                       {
+                               script+="include ";
+                               script+=packages[i];
+                               script+="\n";
+                       }
+
+                       script+="include std\n";
+
+                       for(i = 0; i<boxes.size();i++)
+                       {
+                               script+="new ";
+                               int id = boxes[i];
+                               GObjectController *control = _controllers[id];
+                               GBlackBoxModel *model = (GBlackBoxModel*)control->getModel();
+
+                               script+=model->getBBTKType();
+                               script+=" ";
+                               script+=model->getBBTKName();
+                               script+="\n";
+
+                               std::vector<GPortModel*> inputs = model->getInputPorts();
+                               for(int j = 0; j<inputs.size();j++)
+                               {
+                                       GPortModel* inputPort = inputs[j];
+                                       if(inputPort->isValueSet())
+                                       {
+                                               script+="set ";
+                                               script+=model->getBBTKName();
+                                               script+=".";
+                                               script+=inputPort->getBBTKName();
+                                               script+=" ";
+                                               script+=inputPort->getValue();
+                                               script+="\n";
+                                       }
+                               }
+
+                       }
+
+                       for(i = 0; i<connections.size();i++)
+                       {
+                               script+="connect ";
+                               int id = connections[i];
+                               GObjectController *control = _controllers[id];
+                               GConnectorModel *model = (GConnectorModel*)control->getModel();
+
+                               //Start Connection info
+                               GPortModel *start = model->getStartPort();
+                               script+=start->getParentBox()->getBBTKName();
+                               script+=".";
+                               script+=start->getBBTKName();
+
+                               script+=" ";
+
+                               //End Connection info
+                               GPortModel *end = model->getEndPort();
+                               script+=end->getParentBox()->getBBTKName();
+                               script+=".";
+                               script+=end->getBBTKName();
+
+                               script+="\n";
+                       }
+
+                       for(i = 0; i<execBoxes.size();i++)
+                       {
+                               script+="exec ";
+                               int id = execBoxes[i];
+                               GObjectController *control = _controllers[id];
+                               GBlackBoxModel *model = (GBlackBoxModel*)control->getModel();
+
+                               script+=model->getBBTKName();
+                               script+="\n";
+                       }
+
+               }
+
+               return script;
+       }
+
+       //=========================================================================
+
+       std::string wxVtkSceneManager::saveComplexBoxBBS(std::string cbName,std::string cbAuthor,std::string cbCategory,std::string cbDescription)
+       {
+
+               std::vector<std::string> packages;
+               std::vector<int> boxes;
+               std::vector<int> connections;
+               std::vector<int> execBoxes;
+
+               std::map<int, GObjectController*>::iterator it;
+
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *desc = it->second;
+                       int type = desc->getGObjectType();
+
+                       if(type==GBLACKBOX)
+                       {
+                               GBlackBoxModel *mod = (GBlackBoxModel*)desc->getModel();
+                               
+                               std::string pkg = mod->getBBTKPackage();
+                               bool existsPkg = false;
+                               for(int t = 0;t<packages.size() && existsPkg == false;t++)
+                               {
+                                       if(packages[t]==pkg)
+                                       {
+                                               existsPkg=true;
+                                       }
+                               }
+                               if(!existsPkg)
+                               {
+                                       packages.push_back(pkg);
+                               }
+
+
+                               boxes.push_back(it->first);
+                               if(mod->isExecutable())
+                               {
+                                       execBoxes.push_back(it->first);
+                               }
+                       }
+                       else if(type==GCONNECTOR)
+                       {
+                               connections.push_back(it->first);
+                       }
+               }
+
+               std::string script = "";
+               int i;
+               for(i = 0; i<packages.size();i++)
+               {
+                       script+="include ";
+                       script+=packages[i];
+                       script+="\n";
+               }
+
+               script+="include std\n";
+
+               // Definition of a complex box
+               script+="define ";
+               script+=cbName;
+               script+="\n";
+
+               script+="author \" ";
+               script+=cbAuthor;
+               script+="\"\n";
+
+               script+="description \" ";
+               script+=cbDescription;
+               script+="\"\n";
+
+               // Create boxes
+               for(i = 0; i<boxes.size();i++)
+               {
+                       script+="new ";
+                       int id = boxes[i];
+                       GObjectController *control = _controllers[id];
+                       GBlackBoxModel *model = (GBlackBoxModel*)control->getModel();
+
+                       script+=model->getBBTKType();
+                       script+=" ";
+                       script+=model->getBBTKName();
+                       script+="\n";
+
+                               std::vector<GPortModel*> inputs = model->getInputPorts();
+                               for(int j = 0; j<inputs.size();j++)
+                               {
+                                       GPortModel* inputPort = inputs[j];
+                                       if(inputPort->isValueSet())
+                                       {
+                                               script+="set ";
+                                               script+=model->getBBTKName();
+                                               script+=".";
+                                               script+=inputPort->getBBTKName();
+                                               script+=" ";
+                                               script+=inputPort->getValue();
+                                               script+="\n";
+                                       }
+                               }
+
+                       }
+
+                       // Create connections in the script. If the connection is made with a complex port, it is created the input or output
+
+                       std::string complexInputs="";
+                       std::string complexOutputs="";
+
+                       for(i = 0; i<connections.size();i++)
+                       {
+                               int id = connections[i];
+                               GObjectController *control = _controllers[id];
+                               GConnectorModel *model = (GConnectorModel*)control->getModel();
+
+                               //Connection info
+                               GPortModel *start = model->getStartPort();
+                               GBoxModel *startBox =start->getParentBox();
+
+                               GPortModel *end = model->getEndPort();
+                               GBoxModel *endBox =end->getParentBox();
+
+                               if(startBox->getGObjectType()==GCOMPLEXINPUTPORT)
+                               {
+                                       complexInputs+="input ";
+                                       complexInputs+=startBox->getBBTKName();
+
+                                       complexInputs+=" ";
+                                       complexInputs+=endBox->getBBTKName();
+                                       complexInputs+=".";
+                                       complexInputs+=end->getBBTKName();
+
+                                       complexInputs+=" ";
+                                       complexInputs+="\" \"";
+
+                                       complexInputs+="\n";
+                               }
+                               else if(endBox->getGObjectType()==GCOMPLEXOUTPUTPORT)
+                               {
+                                       complexOutputs+="output ";
+                                       complexOutputs+=endBox->getBBTKName();
+
+                                       complexOutputs+=" ";
+                                       complexOutputs+=startBox->getBBTKName();
+                                       complexOutputs+=".";
+                                       complexOutputs+=start->getBBTKName();
+
+                                       complexOutputs+=" ";
+                                       complexOutputs+="\" \"";
+
+                                       complexOutputs+="\n";
+                               }
+                               else
+                               {
+                                       script+="connect ";
+                                       script+=startBox->getBBTKName();
+                                       script+=".";
+                                       script+=start->getBBTKName();
+
+                                       script+=" ";
+
+                                       //End Connection info
+                                       script+=endBox->getBBTKName();
+                                       script+=".";
+                                       script+=end->getBBTKName();
+
+                                       script+="\n";
+                               }
+                       }
+
+                       for(i = 0; i<execBoxes.size();i++)
+                       {
+                               script+="exec ";
+                               int id = execBoxes[i];
+                               GObjectController *control = _controllers[id];
+                               GBlackBoxModel *model = (GBlackBoxModel*)control->getModel();
+
+                               script+=model->getBBTKName();
+                               script+="\n";
+                       }
+
+                       script+="\n";
+                       script+="# Complex input ports\n";
+                       script+=complexInputs;
+
+                       script+="\n";
+                       script+="# Complex output ports\n";
+                       script+=complexOutputs;
+
+                       script+="\n";
+                       script+="endefine";
+                       script+="\n";           
+
+               return script;
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::deleteAllBoxes()
+       {               
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       cont->removeFromScene();
+                       unregisterController((InteractorStyleMaracas*)cont);
+               }
+               _selectedObjects.clear();
+               _controllers.clear();   
+               refreshScene();
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::refreshScene()
+       {
+               _baseView->RefreshView();
+       }
+
+       //=========================================================================
+       
+       void wxVtkSceneManager::centerView()
+       {
+               double temp[3];
+               _baseView->GetRenderer()->GetActiveCamera()->GetFocalPoint(temp);
+               _baseView->GetRenderer()->GetActiveCamera()->SetFocalPoint(0,0,temp[2]);
+               _baseView->GetRenderer()->GetActiveCamera()->GetPosition(temp);
+               _baseView->GetRenderer()->GetActiveCamera()->SetPosition(0,0,temp[2]);
+               _baseView->RefreshView();
+
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::saveDiagram(std::string &content)
+       {               
+               char buffer [50];
+
+               //Print info IF COMPLEX BOX
+               content+="COMPLEXBOX:";
+               if(_isComplexBox)
+               {
+                       content+="TRUE\n";
+
+                       //Print info complex input ports
+                       std::vector<int> inputs = getComplexInputPorts();
+                       int insize = inputs.size();
+                       content+="COMPLEXINPUTS:";
+                       sprintf (buffer, "%d", insize);
+                       content+=buffer;
+                       content+="\n";
+                       
+                       for(int i = 0;i<insize;i++)
+                       {
+                               int id = inputs[i];
+                               GObjectController *cont = _controllers[id];
+                               cont->getModel()->save(content);
+                       }
+
+                       //Print info complex output ports
+                       std::vector<int> outputs = getComplexOutputPorts();
+                       int outsize = outputs.size();
+                       content+="COMPLEXOUTPUTS:";
+                       sprintf (buffer, "%d", outsize);
+                       content+=buffer;
+                       content+="\n";
+                       
+                       for(int i = 0;i<outsize;i++)
+                       {
+                               int id = outputs[i];
+                               GObjectController *cont = _controllers[id];
+                               cont->getModel()->save(content);
+                       }
+               }
+               else
+               {
+                       content+="FALSE\n";
+               }
+
+               //Print boxes
+               std::vector<int> boxes = getBlackBoxes();
+               int bsize = boxes.size();
+               content+="BOXES:";
+               sprintf (buffer, "%d", bsize);
+               content+=buffer;
+               content+="\n";
+               
+               for(int i = 0;i<bsize;i++)
+               {
+                       int id = boxes[i];
+                       GObjectController *cont = _controllers[id];
+                       cont->getModel()->save(content);
+               }
+
+               //Print connections
+               std::vector<int> connections = getConnections();
+               int csize = connections.size();
+               content+="CONNECTIONS:";
+               sprintf (buffer, "%d", csize);
+               content+=buffer;
+               content+="\n";
+               
+               for(int i = 0;i<csize;i++)
+               {
+                       int id = connections[i];
+                       GObjectController *cont = _controllers[id];
+                       cont->getModel()->save(content);
+               }
+
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::loadDiagram(ifstream &inputStream)
+       {
+
+               std::string line="";    
+               char delims[] = ":";
+               char *result = NULL;
+        getline(inputStream,line);
+
+               bool start = false;
+               while ( !inputStream.eof() ) 
+               {
+                       if(line=="" || line[0]=='#')
+                       {
+                               getline(inputStream,line);
+                       }
+                       else if(line=="APP_START")
+                       {
+                               start = true;
+                               break;
+                       }
+               }
+
+               if(start)
+               {
+
+                       //----------
+                       getline(inputStream,line);//COMPLEX_BOX:TRUE|FALSE
+                       char complex[15];
+                       strcpy( complex, line.c_str() );
+                       result = strtok( complex, delims );
+                       result = strtok( NULL, delims );
+                       std::string isComplexBox(result);
+
+                       if(isComplexBox=="TRUE")
+                       {
+                               _isComplexBox=true;
+
+                               //-----------------------
+                               //- COMPLEX INPUT PORTS
+                               //-----------------------
+                               getline(inputStream,line);//COMPLEXINPUTS:num
+                               char inputs[18];
+                               strcpy( inputs, line.c_str() );
+                               result = strtok( inputs, delims );
+                               result = strtok( NULL, delims );
+                                               
+                               int numInputs;
+                               std::istringstream inps(result);
+                               inps >> numInputs;
+                               
+                               for(int i = 0;i<numInputs;i++)
+                               {
+                                       //----------
+                                       getline(inputStream,line);//COMPLEX_PORT
+                                       getline(inputStream,line);//name
+                                       std::string inputPortName(line);
+
+                                       //----------
+                                       getline(inputStream,line);//xInic:yInic:zInic
+                                       char coord[80];
+                                       strcpy( coord, line.c_str() );
+                                       result = strtok( coord, delims );//xInic
+                                       std::string xInic(result);
+                                       result = strtok( NULL, delims );//yInic
+                                       std::string yInic(result);
+                                       result = strtok( NULL, delims );//zInic
+                                       std::string zInic(result);
+
+                                       double xIn, yIn, zIn;
+                                       std::istringstream xSt(xInic);
+                                       xSt >> xIn;
+                                       std::istringstream ySt(yInic);
+                                       ySt >> yIn;
+                                       std::istringstream zSt(zInic);
+                                       zSt >> zIn;
+
+                                       getline(inputStream,line);//FIN_COMPLEX_PORT
+
+                                       int idInputPort = createGComplexBoxInputPort(inputPortName);
+                                       GObjectController *cont = _controllers[idInputPort];
+                                       GBoxModel *cbmod = (GBoxModel*)cont->getModel();
+                                       cbmod->setInicPoint(xIn,yIn,zIn);
+                                       cbmod->notifyObservers(_idManager);
+                               }
+
+
+                               //-----------------------
+                               //- COMPLEX OUTPUT PORTS
+                               //-----------------------
+
+                               getline(inputStream,line);//COMPLEXOUTPUTS:num
+                               char outputs[18];
+                               strcpy( outputs, line.c_str() );
+                               result = strtok( outputs, delims );
+                               result = strtok( NULL, delims );
+                                               
+                               int numOutputs;
+                               std::istringstream outps(result);
+                               outps >> numOutputs;
+                               
+                               for(int i = 0;i<numOutputs;i++)
+                               {
+                                       //----------
+                                       getline(inputStream,line);//COMPLEX_PORT
+                                       getline(inputStream,line);//name
+                                       std::string outputPortName(line);
+
+                                       //----------
+                                       getline(inputStream,line);//xInic:yInic:zInic
+                                       char coord[80];
+                                       strcpy( coord, line.c_str() );
+                                       result = strtok( coord, delims );//xInic
+                                       std::string xInic(result);
+                                       result = strtok( NULL, delims );//yInic
+                                       std::string yInic(result);
+                                       result = strtok( NULL, delims );//zInic
+                                       std::string zInic(result);
+
+                                       double xIn, yIn, zIn;
+                                       std::istringstream xSt(xInic);
+                                       xSt >> xIn;
+                                       std::istringstream ySt(yInic);
+                                       ySt >> yIn;
+                                       std::istringstream zSt(zInic);
+                                       zSt >> zIn;
+
+                                       getline(inputStream,line);//FIN_COMPLEX_PORT
+
+                                       int idOutputPort = createGComplexBoxOutputPort(outputPortName);
+                                       GObjectController *cont = _controllers[idOutputPort];
+                                       GBoxModel *cbmod = (GBoxModel*)cont->getModel();
+                                       cbmod->setInicPoint(xIn,yIn,zIn);
+                                       cbmod->notifyObservers(_idManager);
+                               }
+
+                       }
+
+                       //----------
+                       getline(inputStream,line);//BOXES:num
+                       char boxes[9];
+                       strcpy( boxes, line.c_str() );
+                       result = strtok( boxes, delims );
+                       result = strtok( NULL, delims );
+                                       
+                       int numBoxes;
+                       std::istringstream is(result);
+                       is >> numBoxes;
+                       
+                       for(int i = 0;i<numBoxes;i++)
+                       {
+                               //----------
+                               getline(inputStream,line);//BOX
+                               getline(inputStream,line);//package:type:name
+                               char box[100];
+                               strcpy( box, line.c_str() );
+                               result = strtok( box, delims );//package
+                               std::string package(result);
+                               result = strtok( NULL, delims );//type
+                               std::string type(result);
+                               result = strtok( NULL, delims );//name
+                               std::string name(result);
+
+                               getline(inputStream,line);//ISEXEC:TRUE|FALSE
+                               char exec[15];
+                               strcpy( exec, line.c_str() );
+                               result = strtok( exec, delims );//ISEXEC                                
+                               result = strtok( NULL, delims );//TRUE|FALSE
+                               std::string isExec(result);
+
+                               //----------
+                               getline(inputStream,line);//xInic:yInic:zInic
+                               char coord[80];
+                               strcpy( coord, line.c_str() );
+                               result = strtok( coord, delims );//xInic
+                               std::string xInic(result);
+                               result = strtok( NULL, delims );//yInic
+                               std::string yInic(result);
+                               result = strtok( NULL, delims );//zInic
+                               std::string zInic(result);
+
+                               double xIn, yIn, zIn;
+                               std::istringstream xSt(xInic);
+                               xSt >> xIn;
+                               std::istringstream ySt(yInic);
+                               ySt >> yIn;
+                               std::istringstream zSt(zInic);
+                               zSt >> zIn;
+                                               
+                               //----------
+                               getline(inputStream,line);//xEnd:yEnd:zEnd
+                               strcpy( coord, line.c_str() );
+                               result = strtok( coord, delims );//xEnd
+                               std::string xEnd(result);
+                               result = strtok( NULL, delims );//yEnd
+                               std::string yEnd(result);
+                               result = strtok( NULL, delims );//zEnd
+                               std::string zEnd(result);
+
+                               double xEn, yEn, zEn;
+                               std::istringstream xEt(xEnd);
+                               xEt >> xEn;
+                               std::istringstream yEt(yEnd);
+                               yEt >> yEn;
+                               std::istringstream zEt(zEnd);
+                               zEt >> zEn;
+
+                               int idBox = createGBlackBox(0,0,package,type);
+                               GObjectController *cont = _controllers[idBox];
+                               GBlackBoxModel *bbmod = (GBlackBoxModel*)cont->getModel();
+                               bbmod->setBBTKName(name);
+                               bbmod->setInicPoint(xIn,yIn,zIn);
+                               bbmod->setFinalPoint(xEn,yEn,zEn);
+                               if(isExec=="TRUE")
+                               {
+                                       bbmod->setExecutable(true);
+                               }
+                               else if(isExec=="FALSE")
+                               {
+                                       bbmod->setExecutable(false);
+                               }
+                                                       
+                               //----------
+                               getline(inputStream,line);//PORT o FIN_BOX
+                               std::string port=line.substr(0,4);
+                               while(port=="PORT")
+                               {
+                                       getline(inputStream,line);//name:value
+                                       char poort[20];
+                                       strcpy( poort, line.c_str() );
+                                       result = strtok( poort, delims );//name
+                                       std::string name(result);
+                                       result = strtok( NULL, delims );//value
+                                       std::string value(result);
+
+                                       bbmod->setValueToInput(name,value);                                     
+
+                                       getline(inputStream,line);//PORT o FIN_BOX
+                                       port=line.substr(0,4);
+                               }               
+
+                               bbmod->notifyObservers(_idManager);
+                       }
+
+                       /// CONNECTIONS
+                       //----------
+                       getline(inputStream,line);//CONNECTIONS:num
+                       char conns[15];
+                       strcpy( conns, line.c_str() );
+                       result = strtok( conns, delims );
+                       result = strtok( NULL, delims );
+                                       
+                       int numConns;
+                       std::istringstream isCons(result);
+                       isCons >> numConns;
+                                       
+                       for(int i = 0;i<numConns;i++)
+                       {
+                               //----------
+                               getline(inputStream,line);//CONNECTION
+                               getline(inputStream,line);//Startbox.PortName:EndBox.PortName
+
+                               char connec[100];
+                               strcpy( connec, line.c_str() );
+                               result = strtok( connec, delims );
+                               std::string nameStartBox(result);
+                               result = strtok( NULL, delims );
+                               std::string nameStartPort(result);
+                               result = strtok( NULL, delims );
+                               std::string nameEndBox(result);
+                               result = strtok( NULL, delims );
+                               std::string nameEndPort(result);
+
+                               std::vector<int> lstB = getBlackBoxes();
+                               
+                               GPortModel *startP=NULL;
+                               GPortModel *endP=NULL;                          
+                               for(int j = 0;j<lstB.size();j++)
+                               {
+                                       int idB = lstB[j];
+                                       GBlackBoxModel *bbMod = (GBlackBoxModel*)_controllers[idB]->getModel();
+                                       if(_controllers[idB]->getModel()->getBBTKName()==nameStartBox)
+                                       {                                               
+                                               startP = bbMod->getOutputPort(nameStartPort);
+                                       }
+                                       else if(_controllers[idB]->getModel()->getBBTKName()==nameEndBox)
+                                       {
+                                               endP = bbMod->getInputPort(nameEndPort);
+                                       }
+                               }
+
+                               if(_isComplexBox)
+                               {
+                                       if(startP==NULL)
+                                       {
+                                               std::vector<int> lstInputs = getComplexInputPorts();
+                                               for(int j = 0;j<lstInputs.size();j++)
+                                               {
+                                                       int idB = lstInputs[j];
+                                                       GBoxModel *cbMod = (GBoxModel*)_controllers[idB]->getModel();
+                                                       if(_controllers[idB]->getModel()->getBBTKName()==nameStartBox)
+                                                       {                                               
+                                                               startP = cbMod->getOutputPort(nameStartPort);
+                                                       }
+                                               }
+                                       }
+
+                                       if(endP==NULL)
+                                       {
+                                               std::vector<int> lstOutputs = getComplexOutputPorts();
+                                               for(int j = 0;j<lstOutputs.size();j++)
+                                               {
+                                                       int idB = lstOutputs[j];
+                                                       GBoxModel *cbMod = (GBoxModel*)_controllers[idB]->getModel();
+                                                       if(_controllers[idB]->getModel()->getBBTKName()==nameEndBox)
+                                                       {                                               
+                                                               endP = cbMod->getInputPort(nameEndPort);
+                                                       }
+                                               }
+                                       }
+                               }
+                                                               
+                               int idCon = createGConnector(startP);
+                               _worldState = NOTHING_HAPPENS;
+                               GConnectorController *tempp = (GConnectorController*)_controllers[idCon]; 
+
+                               GConnectorModel *conMod = (GConnectorModel*)tempp->getModel();
+                               vtkGConnectorView *conView = (vtkGConnectorView*)tempp->getView();
+                               tempp->endContourCreation();
+                               conMod->setEndPort(endP);                                       
+                               conView->updateStartEndPoints();
+
+                       }
+        }
+
+       }
+
+       //=========================================================================
+
+       std::vector<int> wxVtkSceneManager::getBlackBoxes()
+       {
+               std::vector<int> vect;
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       if(cont->getGObjectType()==GBLACKBOX)
+                       {
+                               vect.push_back(cont->getId());
+                       }
+               }
+               return vect;
+       }
+
+       //=========================================================================
+
+       std::vector<int> wxVtkSceneManager::getComplexInputPorts()
+       {
+               std::vector<int> vect;
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       if(cont->getGObjectType()==GCOMPLEXINPUTPORT)
+                       {
+                               vect.push_back(cont->getId());
+                       }
+               }
+               return vect;
+       }
+
+       //=========================================================================
+
+       std::vector<int> wxVtkSceneManager::getComplexOutputPorts()
+       {
+               std::vector<int> vect;
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       if(cont->getGObjectType()==GCOMPLEXOUTPUTPORT)
+                       {
+                               vect.push_back(cont->getId());
+                       }
+               }
+               return vect;
+       }
+
+       //=========================================================================
+
+       std::vector<int> wxVtkSceneManager::getConnections()
+       {
+               std::vector<int> vect;
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       if(cont->getGObjectType()==GCONNECTOR)
+                       {
+                               vect.push_back(cont->getId());
+                       }
+               }
+               return vect;
+       }
+
+       //=========================================================================
+       
+       bool wxVtkSceneManager::isComplexBox()
+       {
+               return _isComplexBox;
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::setComplexBox(bool val)
+       {
+               _isComplexBox=val;
+       }
+
+       //=========================================================================
+
+       int wxVtkSceneManager::addObjectController(GObjectController* objController)
+       {
+               //Register the controller of the new object
+               registerController((InteractorStyleMaracas*) objController);
+
+               //Add the object to the objects list 
+               int newId = _controllers.size();
+               objController->setId(newId);
+               _controllers[newId] = objController;
+               return newId;
+       }
+
+       //=========================================================================
+
+       int wxVtkSceneManager::getNumSelectedObjects()
+       {
+               return _selectedObjects.size();
+       }
+
+       //=========================================================================
+
+       std::map<int,GObjectController*> wxVtkSceneManager::getSelectedObjects()
+       {
+               std::map<int,GObjectController*> mapSelected;
+
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       if(cont->getGObjectType()==GBLACKBOX && cont->getView()->getState()==SELECTED)
+                       {
+                               mapSelected[cont->getId()]=cont;
+                       }
+               }
+
+               std::map<int, GObjectController*>::iterator it2;
+               for(it2 = _controllers.begin(); it2 != _controllers.end(); ++it2)
+               {
+                       GObjectController *cont = it2->second;          
+                       if(cont->getGObjectType()==GCONNECTOR)
+                       {
+                               GConnectorModel* cmod = (GConnectorModel*)cont->getModel();
+                               GBoxModel* endPortParentBox = cmod->getEndPort()->getParentBox();
+                               GBoxModel* startPortParentBox = cmod->getStartPort()->getParentBox();
+
+                               std::map<int, GObjectController*>::iterator iterOBJ1 = mapSelected.find(startPortParentBox->getObjectId());
+                               std::map<int, GObjectController*>::iterator iterOBJ2 = mapSelected.find(endPortParentBox->getObjectId());
+                               
+                               if(iterOBJ1 != mapSelected.end() && iterOBJ2 != mapSelected.end())
+                               {                                       
+                                       int ID = cont->getId();
+                                       mapSelected[ID]=cont;
+                               }
+                               
+                       }
+               }
+               return mapSelected;
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::addObjects(std::map<int,GObjectController*> objectsMap)
+       {
+               
+               std::map<int,int> oldIdNewIdBoxes;
+               std::vector<int> connections;
+
+               std::map<int, GObjectController*>::iterator it;         
+               for(it = objectsMap.begin(); it != objectsMap.end(); ++it)
+               {
+                       GObjectController *cont = it->second;
+                       int type = cont->getGObjectType();
+
+                       if(type==GBLACKBOX)
+                       {
+                               // Copy black box
+                               double xInic, yInic,zInic;
+                               GBlackBoxModel* copyBox = (GBlackBoxModel*)cont->getModel();
+                               copyBox->getInicPoint(xInic,yInic,zInic);
+                               int idBox = createGBlackBox(0,0,copyBox->getBBTKPackage(),copyBox->getBBTKType());
+
+                               int idcB = copyBox->getObjectId();
+                               oldIdNewIdBoxes[idcB]=idBox;
+                               cont = _controllers[idBox];                                                             
+                               GBlackBoxModel* newbox  = (GBlackBoxModel*)cont->getModel();
+                               newbox->setInicPoint(xInic,yInic,zInic);                                                        
+                               int num = newbox->getNumInputPorts();
+                               for(int j=0;j<num;j++)
+                               {
+                                       newbox->setValueToInputPort(j,copyBox->getValueInputPort(j));
+                               }
+                               newbox->notifyObservers(_idManager);
+                       }
+                       else if(type==GCONNECTOR)
+                       {
+                               int idCon = cont->getId();
+                               connections.push_back(idCon);
+                       }
+                       
+               }
+               
+               for(int i = 0 ;i<connections.size();i++)
+               {
+                       int objId = connections[i];
+                       GObjectController *cont = objectsMap[objId];                    
+                       GConnectorModel* connectModel = (GConnectorModel*)cont->getModel();
+                       
+                       GPortModel* startPort = connectModel->getStartPort();
+                       int startPortIndex = startPort->getPosInBox();
+                       GPortModel* endPort = connectModel->getEndPort();
+                       int endPortIndex = endPort->getPosInBox();                      
+
+                       GBlackBoxModel* startPortParentBox = (GBlackBoxModel*)startPort->getParentBox();
+                       GBlackBoxModel* endPortParentBox = (GBlackBoxModel*)endPort->getParentBox();
+                       
+                       int idNewStartBox = oldIdNewIdBoxes[startPortParentBox->getObjectId()];
+                       int idNewEndBox = oldIdNewIdBoxes[endPortParentBox->getObjectId()];
+
+                       GBlackBoxModel* newStartBox = (GBlackBoxModel*)_controllers[idNewStartBox]->getModel();
+                       GBlackBoxModel* newEndBox = (GBlackBoxModel*)_controllers[idNewEndBox]->getModel();
+
+                       GPortModel* newStartPort = newStartBox->getOutputPort(startPortIndex);
+                       GPortModel* newEndPort = newEndBox->getInputPort(endPortIndex);
+
+                       // Creates connection 
+                       int idCon = createGConnector(newStartPort);
+                       GConnectorController *tempp = (GConnectorController*)_controllers[idCon]; 
+                       GConnectorModel *conMod = (GConnectorModel*)tempp->getModel();
+                       vtkGConnectorView *conView = (vtkGConnectorView*)tempp->getView();
+                       tempp->endContourCreation();
+                       conMod->setEndPort(newEndPort);                                 
+                       conView->updateStartEndPoints();
+               }
+
+               std::map<int, int>::iterator itIds;             
+               for(itIds = oldIdNewIdBoxes.begin(); itIds != oldIdNewIdBoxes.end(); ++itIds)
+               {
+                       int idOld = itIds->first;
+                       int idNew = itIds->second;
+
+                       GBlackBoxModel* oldBox = (GBlackBoxModel*)objectsMap[idOld]->getModel();
+                       GBlackBoxModel* newBox = (GBlackBoxModel*)_controllers[idNew]->getModel();
+
+                       std::vector<int> oldInputConnections = oldBox->getConnectedInputs();
+                       std::vector<int> oldOutputConnections = oldBox->getConnectedOutputs();
+                       std::vector<int> newInputConnections = newBox->getConnectedInputs();
+                       std::vector<int> newOutputConnections = newBox->getConnectedOutputs();
+
+                       for(int k = 0; k<oldInputConnections.size();k++)
+                       {
+                               bool exist=false;
+                               int toCreate=-1;
+                               for(int l = 0; l<newInputConnections.size() && !exist;l++)
+                               {
+                                       if(oldInputConnections[k]==newInputConnections[l])
+                                       {
+                                               exist=true;
+                                       }
+                               }
+
+                               if(exist==false)
+                               {
+                                       //Create complex input 
+                                       int posInBox = oldInputConnections[k];
+                                       GPortModel* inputPort = oldBox->getInputPort(posInBox);
+                                       std::string inputPortName = inputPort->getBBTKName();
+                                       int idInputPort = createGComplexBoxInputPort(inputPortName);
+                                       GObjectController *cont = _controllers[idInputPort];
+                                       GBoxModel *cbmod = (GBoxModel*)cont->getModel();
+                                       double xIn,yIn,zIn;
+                                       inputPort->getInicPoint(xIn,yIn,zIn);
+                                       yIn+=20;
+                                       cbmod->setInicPoint(xIn,yIn,zIn);
+                                       cbmod->notifyObservers(_idManager);
+                                                                                                               
+                                       GPortModel* inputPortEnd = newBox->getInputPort(posInBox);
+
+                                       // Creates connection 
+                                       int idCon = createGConnector(cbmod->getOutputPort(0));
+                                       GConnectorController *tempp = (GConnectorController*)_controllers[idCon]; 
+                                       GConnectorModel *conMod = (GConnectorModel*)tempp->getModel();
+                                       vtkGConnectorView *conView = (vtkGConnectorView*)tempp->getView();
+                                       tempp->endContourCreation();
+                                       conMod->setEndPort(inputPortEnd);                                       
+                                       conView->updateStartEndPoints();
+
+                               }
+                                       
+                       }
+                       
+
+                       for(int k = 0; k<oldOutputConnections.size();k++)
+                       {
+                               bool exist=false;
+                               int toCreate=-1;
+                               for(int l = 0; l<newOutputConnections.size() && !exist;l++)
+                               {
+                                       if(oldOutputConnections[k]==newOutputConnections[l])
+                                       {
+                                               exist=true;
+                                       }
+                               }
+
+                               if(exist==false)
+                               {
+                                       //Create complex output 
+                                       int posInBox = oldOutputConnections[k];
+                                       GPortModel* outputPort = oldBox->getOutputPort(posInBox);
+                                       std::string outputPortName = outputPort->getBBTKName();
+                                       int idOutputPort = createGComplexBoxOutputPort(outputPortName);
+                                       GObjectController *cont = _controllers[idOutputPort];
+                                       GBoxModel *cbmod = (GBoxModel*)cont->getModel();
+                                       double xIn,yIn,zIn;
+                                       outputPort->getInicPoint(xIn,yIn,zIn);
+                                       yIn-=20;
+                                       cbmod->setInicPoint(xIn,yIn,zIn);
+                                       cbmod->notifyObservers(_idManager);
+                                                                                                               
+                                       GPortModel* outputPortEnd = newBox->getOutputPort(posInBox);
+
+                                       // Creates connection 
+                                       int idCon = createGConnector(outputPortEnd);
+                                       GConnectorController *tempp = (GConnectorController*)_controllers[idCon]; 
+                                       GConnectorModel *conMod = (GConnectorModel*)tempp->getModel();
+                                       vtkGConnectorView *conView = (vtkGConnectorView*)tempp->getView();
+                                       tempp->endContourCreation();
+                                       conMod->setEndPort(cbmod->getInputPort(0));                                     
+                                       conView->updateStartEndPoints();
+
+                               }
+                                       
+                       }
+
+               }
+
+
+       }
+
+       //=========================================================================     
+
 }  // EO namespace bbtk
 
 // EOF