]> Creatis software - bbtkGEditor.git/commitdiff
The actual version works with complex box automatic generated from selected boxes...
authorcorredor <>
Wed, 26 May 2010 08:38:47 +0000 (08:38 +0000)
committercorredor <>
Wed, 26 May 2010 08:38:47 +0000 (08:38 +0000)
16 files changed:
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GBlackBoxModel.cxx
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GBlackBoxModel.h
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GBoxModel.cxx
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GBoxModel.h
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GComplexBoxPortModel.cxx
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GPortModel.cxx
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GPortModel.h
lib/EditorGraphicBBS/bbsKernelEditorGraphic/GlobalConstants.h
lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx
lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.h
lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/bbtkwxGUIEditorGraphicBBS.cxx
lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/bbtkwxGUIEditorGraphicBBS.h
lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/wxGEditorTabPanel.cxx
lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/wxGEditorTabPanel.h
lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/wxTabPanelsManager.cxx
lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/wxTabPanelsManager.h

index 5351493e280e2ac0459b6aae2469b26acd683d3d..4d69b64c579ed5b931e20b8ee3a05f42142de4df 100644 (file)
@@ -173,6 +173,58 @@ namespace bbtk
 
        //=========================================================================
 
+       std::string GBlackBoxModel::getValueInputPort(int pos)
+       {
+               return _inputs[pos]->getValue();
+       }
+
+       //=========================================================================
+
+       std::string GBlackBoxModel::getValueInput(std::string name)
+       {
+               for(int i = 0; i<_inputs.size();i++)
+               {
+                       if(_inputs[i]->getBBTKName()==name)
+                       {
+                               return _inputs[i]->getValue();
+                       }
+               }
+               return NULL;
+       }
+
+       //=========================================================================
+
+       std::vector<int> GBlackBoxModel::getConnectedInputs()
+       {
+               std::vector<int> connected;
+               for(int i = 0; i<_inputs.size();i++)
+               {
+                       if(_inputs[i]->isConnected())
+                       {
+                               connected.push_back(i);
+                       }
+               }
+               return connected;
+       }
+
+       //=========================================================================
+
+       std::vector<int> GBlackBoxModel::getConnectedOutputs()
+       {
+               std::vector<int> connected;
+               for(int i = 0; i<_outputs.size();i++)
+               {
+                       if(_outputs[i]->isConnected())
+                       {
+                               connected.push_back(i);
+                       }
+               }
+               return connected;
+       }
+
+       //=========================================================================
+
+
 }  // EO namespace bbtk
 
 // EOF
index 74da5f6546421cd8d7db8db858be0b5665f1c37b..a45910235a0d3fd33297bff3310c030f343be1b9 100644 (file)
@@ -78,6 +78,12 @@ namespace bbtk
                void setValueToInputPort(int pos,std::string value);
                void setValueToInput(std::string name,std::string value);
 
+               std::string getValueInputPort(int pos);
+               std::string getValueInput(std::string name);
+
+               std::vector<int> getConnectedInputs();
+               std::vector<int> getConnectedOutputs();
+
        private:
 
                //Private Attributes
index 0801e54007526b00185d2a8e86ef24c1df879b60..7f8f798330101348995f76815ae3a8e8e0acc976 100644 (file)
@@ -170,6 +170,20 @@ namespace bbtk
 
        //=========================================================================
 
+       GPortModel* GBoxModel::getInputPort(int pos)
+       {
+               return _inputs[pos];
+       }
+
+       //=========================================================================
+       
+       GPortModel* GBoxModel::getOutputPort(int pos)
+       {
+               return _outputs[pos];
+       }
+
+       //=========================================================================
+
        void GBoxModel::updatePorts()
        {
                for(int i = 0; i<_inputs.size();i++)
index b02c7a6f8f99fc5d5ea9cc7d379b4218d6c03076..05cb6bcc6d7141c98e6517a0ccda82f4a020ac4e 100644 (file)
@@ -85,6 +85,9 @@ namespace bbtk
                GPortModel* getInputPort(std::string name);
                GPortModel* getOutputPort(std::string name);
 
+               GPortModel* getInputPort(int pos);
+               GPortModel* getOutputPort(int pos);
+
                void updatePorts();
 
        private:
index 2bdd8cb1b8e981e10e110dc499a7252d3b642b7b..e5a604c292f793eb6fb995e1bfa74c96c7bf418f 100644 (file)
@@ -74,10 +74,24 @@ namespace bbtk
 
        void GComplexBoxPortModel::save(std::string &content)
        {
-               content+="COMPLEX_BOX_PORT\n";
-               // COMPLEX_BOX_PORT info
+               content+="COMPLEX_PORT\n";
+               // Box info
+               content+=_bbtkName;
+               content+="\n";
                
-               content+="FIN_COMPLEX_BOX_PORT\n";
+               //Box Position
+               char buffer [50];
+               sprintf (buffer, "%f", _xInic);
+               content+=buffer;
+               content+=":";
+               sprintf (buffer, "%f", _yInic);
+               content+=buffer;
+               content+=":";
+               sprintf (buffer, "%f", _zInic);
+               content+=buffer;
+               content+="\n";
+
+               content+="FIN_COMPLEX_PORT\n";
 
        }
        
index c6ca8b0c35855d3cd2ff103d4e88d8b5e552a086..69c41e3a3d550be324a31b03128a7bd1cca5161c 100644 (file)
@@ -104,6 +104,13 @@ namespace bbtk
                return _portType;
        }
 
+       //=========================================================================
+
+       int GPortModel::getPosInBox()
+       {
+               return _posInBox;
+       }
+
        //=========================================================================
        
        std::string GPortModel::getStatusText()
index 6dcef4dda6b8cae3d5d8ca971374f06448e9411e..474ebb3e109fe60cec33348411f498c66566d6a0 100644 (file)
@@ -80,6 +80,7 @@ namespace bbtk
                void setValue(std::string value);
                std::string getValue();
                virtual void save(std::string &content);
+               int getPosInBox();
 
        private:
 
index 8aa719542ee0b36f3619a466fa363ebaeaa5a6af..ce68e60aee82b185bbbc3426074e42e63251dc8e 100644 (file)
@@ -163,6 +163,7 @@ namespace bbtk
        const int ID_ADDCOMPLEXBOXOUTPUT                =       1008;
        const int ID_SAVE_AS_BBS                                =       1009;
        const int ID_SAVE_AS_COMPLEXBOX                 =       1010;
+       const int ID_COPY_TO_COMPLEXDIAGRAM             =       1011;
 
        const int wxID_NOTEBOOK                                 =       1012;
 }
index 784c3f667f9fd4aa1d301e716449145e37ead717..50991d12c27689408f839e8cede7bfd1cac94c71 100644 (file)
@@ -182,13 +182,7 @@ namespace bbtk
                //Resgiter change to the observers of the actual model
                model->notifyObservers(_idManager);
                
-               //Register the controller of the new object
-               registerController((InteractorStyleMaracas*) controller);
-
-               //Add the object to the objects list 
-               int newId = _controllers.size();
-               controller->setId(newId);
-               _controllers[newId] = controller;
+               int newId = addObjectController(controller);
                return newId;
 
        }
@@ -242,13 +236,7 @@ namespace bbtk
                //Resgiter change to the observers of the actual model
                model->notifyObservers(_idManager);
                
-               //Register the controller of the new object
-               registerController((InteractorStyleMaracas*) controller);
-
-               //Add the object to the objects list 
-               int newId = _controllers.size();
-               controller->setId(newId);
-               _controllers[newId] = controller;
+               int newId = addObjectController(controller);
                return newId;
        }
 
@@ -301,13 +289,7 @@ namespace bbtk
                //Resgiter change to the observers of the actual model
                model->notifyObservers(_idManager);
                
-               //Register the controller of the new object
-               registerController((InteractorStyleMaracas*) controller);
-
-               //Add the object to the objects list 
-               int newId = _controllers.size();
-               controller->setId(newId);
-               _controllers[newId] = controller;
+               int newId = addObjectController(controller);
                return newId;
        }
 
@@ -359,12 +341,7 @@ namespace bbtk
 
                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;
        }
@@ -423,22 +400,20 @@ namespace bbtk
 
                manContourControl->SetMoving( false );
 
-               registerController((InteractorStyleMaracas*) connectorcontroller);
+               connectorcontroller->setModelAndView(connectorModel,connectorView);
+
+               int newId = addObjectController(connectorcontroller);
 
                connectorcontroller->setManualContourController(manContourControl);             
                connectorModel->setManualContourModel(manContourModel);
                connectorView->setManualContourView(manContourView);
                connectorView->setModel(connectorModel);
                connectorView->setBaseView(_baseView);
-               connectorcontroller->setModelAndView(connectorModel,connectorView);
+               
 
                connectorModel->addObserver(connectorView);
                connectorModel->addObserver(this);
 
-               int newId = _controllers.size();
-               connectorcontroller->setId(newId);
-               _controllers[newId] = connectorcontroller;
-
                return newId;
        }
 
@@ -631,9 +606,6 @@ namespace bbtk
                        }
                }
                
-               
-
-
                return true;
        }
 
@@ -830,9 +802,9 @@ namespace bbtk
                GObjectController *control = _controllers[id];
                std::vector<int> controllersToRemove;
 
-               if(control->getGObjectType()==GBLACKBOX)
+               if(control->getGObjectType()==GBLACKBOX || control->getGObjectType()==GCOMPLEXINPUTPORT || control->getGObjectType()==GCOMPLEXOUTPUTPORT)
                {
-                       GBlackBoxModel *bbmod = (GBlackBoxModel*)control->getModel();
+                       GBoxModel *bbmod = (GBoxModel*)control->getModel();
                        std::vector<GPortModel*> inputs = bbmod->getInputPorts();
                        
                        bool boxConnected = false;
@@ -1283,10 +1255,52 @@ namespace bbtk
        //=========================================================================
 
        void wxVtkSceneManager::saveDiagram(std::string &content)
-       {
-               //Print boxes
+       {               
                char buffer [50];
-               std::vector<int> boxes = getBoxes();
+
+               //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);
@@ -1343,6 +1357,119 @@ namespace bbtk
 
                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];
@@ -1478,7 +1605,7 @@ namespace bbtk
                                result = strtok( NULL, delims );
                                std::string nameEndPort(result);
 
-                               std::vector<int> lstB = getBoxes();
+                               std::vector<int> lstB = getBlackBoxes();
                                
                                GPortModel *startP=NULL;
                                GPortModel *endP=NULL;                          
@@ -1495,7 +1622,38 @@ namespace bbtk
                                                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]; 
@@ -1513,7 +1671,7 @@ namespace bbtk
 
        //=========================================================================
 
-       std::vector<int> wxVtkSceneManager::getBoxes()
+       std::vector<int> wxVtkSceneManager::getBlackBoxes()
        {
                std::vector<int> vect;
                std::map<int, GObjectController*>::iterator it;
@@ -1530,6 +1688,40 @@ namespace bbtk
 
        //=========================================================================
 
+       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;
@@ -1561,6 +1753,246 @@ namespace bbtk
 
        //=========================================================================
 
+       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
index 5aee359fe90f3f717c14bec88771aae1b42d6163..86f24fdfab050a282ee3d0191117a56fd71c92da 100644 (file)
@@ -127,12 +127,20 @@ namespace bbtk
                void centerView();
 
                void refreshScene();
-               std::vector<int> getBoxes();
+               std::vector<int> getBlackBoxes();
                std::vector<int> getConnections();
+               std::vector<int> getComplexInputPorts();
+               std::vector<int> getComplexOutputPorts();
+
+               std::map<int,GObjectController*> getSelectedObjects();
+               int getNumSelectedObjects();
 
                bool isComplexBox();
                void setComplexBox(bool val);
 
+               int addObjectController(GObjectController* objController);
+               void addObjects(std::map<int,GObjectController*> objectsMap);
+
                
        private:
 
index 376db524ed548aef9142b2164c4d26e68206d7b3..9ae550037204019836da7a6f13ac26f9719733de 100644 (file)
@@ -141,7 +141,7 @@ namespace bbtk
        //=========================================================================
        void wxGUIEditorGraphicBBS::initMenu()
        {
-               // create a menu bar
+               // Create File menu and its items
                wxMenu *fileMenu = new wxMenu();
                fileMenu->Append(ID_NEW, _T("New diagram"), _T("New"));
                fileMenu->Append(ID_SAVE_AS_DIAGRAM, _T("Save diagram"), _T("Save diagram"));
@@ -155,16 +155,23 @@ namespace bbtk
                Connect(ID_SAVE_AS_COMPLEXBOX,wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHandler(wxGUIEditorGraphicBBS::OnSaveActualComplexBox));
                Connect(wxID_EXIT,wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHandler(wxGUIEditorGraphicBBS::OnExit));
 
-               // the "About" item should be in the help menu
+               // Create Help menu and its items
+               wxMenu *editMenu = new wxMenu;
+               editMenu->Append(ID_COPY_TO_COMPLEXDIAGRAM, _T("Copy selected to complex box"), _T("Creates a new complex box diagram with selected boxes"));   
+
+               Connect(ID_COPY_TO_COMPLEXDIAGRAM,wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHandler(wxGUIEditorGraphicBBS::OnCopySelectedToComplexDiagram));
+
+               // Create Help menu and its items
                wxMenu *helpMenu = new wxMenu;
                helpMenu->Append(wxID_ABOUT, _T("&About..."), _T("About"));             
 
-               // now append the freshly created menu to the menu bar...
+               // Append the created menu to the menu bar
                wxMenuBar *menuBar = new wxMenuBar();
                menuBar->Append(fileMenu, _T("&File"));
+               menuBar->Append(editMenu, _T("&Edit"));
                menuBar->Append(helpMenu, _T("&Help"));
 
-               // attach this menu bar to the frame
+               // Attach this menu bar to the frame
                SetMenuBar(menuBar);            
        }
 
@@ -458,7 +465,7 @@ namespace bbtk
 
        void wxGUIEditorGraphicBBS::OnSaveActualDiagram(wxCommandEvent& event)
        {
-               wxFileDialog * saveFileDialog = new wxFileDialog(this,wxT("Save  actual diagram"),wxEmptyString,wxT("NewDiagram"),wxT("*.bbd"),wxSAVE|wxOVERWRITE_PROMPT);
+               wxFileDialog * saveFileDialog = new wxFileDialog(this,wxT("Save  actual diagram"),wxEmptyString,wxT("NewDiagram"),wxT("*.bbg"),wxSAVE|wxOVERWRITE_PROMPT);
                if (saveFileDialog->ShowModal() == wxID_OK)
                {
                        wxString fileName = saveFileDialog->GetPath();
@@ -471,7 +478,7 @@ namespace bbtk
                        
                        // writing file header
                        content += "# ----------------------------------\n";
-                       content += "# - BBTKGEditor v 1.0 BBD BlackBox Diagram file\n";
+                       content += "# - BBTKGEditor v 1.0 BBG BlackBox Diagram file\n";
                        content += "# - ";
 
 //EED                  content += fileName;
@@ -512,6 +519,16 @@ namespace bbtk
                        GetMenuBar()->GetMenu(0)->Enable(ID_SAVE_AS_COMPLEXBOX,false);
                        GetMenuBar()->GetMenu(0)->Enable(ID_SAVE_AS_BBS,true);
                }
+               
+               if(_tabsMgr->getNumActualSelectedObjects()>0)
+               {
+                       GetMenuBar()->GetMenu(1)->Enable(ID_COPY_TO_COMPLEXDIAGRAM,true);
+               }
+               else
+               {
+                       ///TODO Fix the possibility to say from the SceneManager to the GUI to refresh the options
+                       GetMenuBar()->GetMenu(1)->Enable(ID_COPY_TO_COMPLEXDIAGRAM,true);
+               }
 
        }
 
@@ -538,7 +555,7 @@ namespace bbtk
        
        void wxGUIEditorGraphicBBS::OnOpenDiagram(wxCommandEvent& event)
        {
-               wxFileDialog * openFileDialog = new wxFileDialog(this,wxT("Open diagram"),wxEmptyString,wxT(""),wxT("*.bbd"),wxOPEN|wxFILE_MUST_EXIST);
+               wxFileDialog * openFileDialog = new wxFileDialog(this,wxT("Open diagram"),wxEmptyString,wxT(""),wxT("*.bbg"),wxOPEN|wxFILE_MUST_EXIST);
                if (openFileDialog->ShowModal() == wxID_OK)
                {
                        wxString fileName = openFileDialog->GetPath();
@@ -609,6 +626,13 @@ namespace bbtk
 
        //=========================================================================
 
+       void wxGUIEditorGraphicBBS::OnCopySelectedToComplexDiagram(wxCommandEvent& event)
+       {
+               _tabsMgr->copySelectedBBoxesToComplexDiagram();
+       }
+
+       //=========================================================================
+
        void wxGUIEditorGraphicBBS::OnExit(wxCommandEvent& event)
        {
                Close(true);
index 8367ab0b6f782dd7a88f50c33e692f6685387f2e..48c42433b62ece908310b2b8537df3de4da44418 100644 (file)
 
 namespace bbtk
 {
+       //RaC: It is important if it exists a double relation 
+       //e.g. wxTabPanelsManager includes wxGUIEditorGraphicBBS, and wxGUIEditorGraphicBBS includes wxTabPanelsManager
        class wxTabPanelsManager;
-
        class wxVtkSceneManager;
-  
+
        class  wxGUIEditorGraphicBBS : public wxFrame
-  {
-  public: 
-         wxGUIEditorGraphicBBS(wxFrame *parent );
-         ~wxGUIEditorGraphicBBS();
-
-               void initToolbar(); 
-               void initMenu();
-               void initTabPanelsManager();
-               void initPackageBrowser();
-               void initHelpHTMLBrowser();
-
-               wxAuiNotebook* getAuiNotebook();
-               void displayBlackBoxInfo(std::string packageName, std::string boxName);
-               void updateStatusBar(std::string textStatus);
-               void executeScript(std::string script);
-
-               void editBlackBox(GBlackBoxModel *bbmodel);
-               void editDiagramParameters(wxVtkSceneManager* scene);
-
-               void RegenerateAll();
-               void DoRegeneratePackageDoc(const std::string& pack);   
-               void DoRegenerateBoxesLists();
-
-               void refreshGUIControls();
-
-               void OnCreateNewTab(wxCommandEvent& event);
-               void OnOpenDiagram(wxCommandEvent& event);
-               void OnSaveActualDiagram(wxCommandEvent& event);
-               void OnSaveActualBBS(wxCommandEvent& event);
-               void OnSaveActualComplexBox(wxCommandEvent& event);
-               void OnExecuteActualDiagram(wxCommandEvent& event);
-               void OnDeleteAllBoxesActualDiagram(wxCommandEvent& event);
-               void OnCenterViewActualDiagram(wxCommandEvent& event);
-               void OnClickBtnComplexBox(wxCommandEvent& event);
-               void OnAddComplexBoxInput(wxCommandEvent& event);
-               void OnAddComplexBoxOutput(wxCommandEvent& event);
-               void OnExit(wxCommandEvent& event);
-
-
-       private:
-               wxAuiManager                                            *_frameAUIMgr;
-               wxTabPanelsManager                                      *_tabsMgr;
-               wxAuiNotebook                                           *_notebook;
-               WxGUIPackageBrowser2                            *_pkgBrowser;
-               WxGUIHtmlBrowser                                        *_helpHtmlBrowser;
-
-               std::string _dataDir;
-
-               std::string _actualPkgBrowserBoxName;
-
-               std::string _actualPkgBrowserPkgName;
-
-       protected:
+       {
+               public: 
+                       wxGUIEditorGraphicBBS(wxFrame *parent);
+                       ~wxGUIEditorGraphicBBS();
+
+                       void initToolbar(); 
+                       void initMenu();
+                       void initTabPanelsManager();
+                       void initPackageBrowser();
+                       void initHelpHTMLBrowser();
+
+                       wxAuiNotebook* getAuiNotebook();
+                       void displayBlackBoxInfo(std::string packageName, std::string boxName);
+                       void updateStatusBar(std::string textStatus);
+                       void executeScript(std::string script);
+
+                       void editBlackBox(GBlackBoxModel *bbmodel);
+                       void editDiagramParameters(wxVtkSceneManager* scene);
+
+                       void RegenerateAll();
+                       void DoRegeneratePackageDoc(const std::string& pack);   
+                       void DoRegenerateBoxesLists();
+
+                       void refreshGUIControls();
+
+                       // File menu and toolbar events
+                       void OnCreateNewTab(wxCommandEvent& event);
+                       void OnOpenDiagram(wxCommandEvent& event);
+                       void OnSaveActualDiagram(wxCommandEvent& event);
+                       void OnSaveActualBBS(wxCommandEvent& event);
+                       void OnSaveActualComplexBox(wxCommandEvent& event);
+                       void OnExecuteActualDiagram(wxCommandEvent& event);
+                       void OnDeleteAllBoxesActualDiagram(wxCommandEvent& event);
+                       void OnCenterViewActualDiagram(wxCommandEvent& event);
+                       void OnClickBtnComplexBox(wxCommandEvent& event);
+                       void OnAddComplexBoxInput(wxCommandEvent& event);
+                       void OnAddComplexBoxOutput(wxCommandEvent& event);
+                       void OnExit(wxCommandEvent& event);
+
+                       // Edit menu events
+                       void OnCopySelectedToComplexDiagram(wxCommandEvent& event);
+
+
+               private:
+                       
+                       //AuiManager for the wxWindow
+                       wxAuiManager                                            *_frameAUIMgr;
+
+                       //Class that manages all the tabs in the window
+                       wxTabPanelsManager                                      *_tabsMgr;
+
+                       //Notebook managed by the wxTabPanelsManager
+                       wxAuiNotebook                                           *_notebook;
+
+                       //Instance to the BBTK Package Browser
+                       WxGUIPackageBrowser2                            *_pkgBrowser;
+
+                       //Instance to the BBTK Help Browser
+                       WxGUIHtmlBrowser                                        *_helpHtmlBrowser;
+
+                       //Name of the box and its package that is shown in the browser
+                       std::string _actualPkgBrowserBoxName;
+                       std::string _actualPkgBrowserPkgName;
+
+               protected:
 
          
  };
index 682d3d4e4b8602010ae87854847c19bd5481f42b..03e14151715a2775c3fb65ee84f92dbbed0551b8 100644 (file)
@@ -209,6 +209,27 @@ namespace bbtk
        }
 
        //=========================================================================
+       
+       std::map<int,GObjectController*> wxGEditorTabPanel::getSelectedObjects()
+       {
+               return _sceneManager->getSelectedObjects();
+       }
+
+       //=========================================================================
+
+       void wxGEditorTabPanel::addObjects(std::map<int,GObjectController*> objectsMap)
+       {
+               _sceneManager->addObjects(objectsMap);
+       }
+
+       //=========================================================================     
+       
+       int wxGEditorTabPanel::getNumSelectedObjects()
+       {
+               return _sceneManager->getNumSelectedObjects();
+       }
+
+       //=========================================================================     
 
 }  // EO namespace bbtk
 
index 05eab99ef2ece9f50eaeae1f204ff5953fb1a8db..70f79fd4d4948763c167998e676fd1996fd5b2e1 100644 (file)
@@ -94,6 +94,9 @@ namespace bbtk
                void setComplexBox(bool val);
                void addComplexInputPort(std::string portName);
                void addComplexOutputPort(std::string portName);
+               std::map<int,GObjectController*> getSelectedObjects();
+               void addObjects(std::map<int,GObjectController*> objectsMap);
+               int getNumSelectedObjects();
 
        //=========================================================================
                
index 3ac92749a487bc03d12d23ae78f78fb2cfbba881..fc43c0cb1eb16cc4b757e1bff25ad4d22d37b3c2 100644 (file)
@@ -179,6 +179,24 @@ namespace bbtk
 
        //=========================================================================
 
+       void wxTabPanelsManager::copySelectedBBoxesToComplexDiagram()
+       {
+               std::map<int,GObjectController*> mapSelected = _actual->getSelectedObjects();
+               addNewTab();
+               setActualDiagramComplexBox(true);
+               _actual->addObjects(mapSelected);
+               _parent->refreshGUIControls();
+       }
+
+       //=========================================================================
+
+       int wxTabPanelsManager::getNumActualSelectedObjects()
+       {
+               return _actual->getNumSelectedObjects();
+       }
+
+       //=========================================================================
+
        void wxTabPanelsManager::OnTabChanged(wxAuiNotebookEvent& event)
        {
                int index = event.GetSelection();
index 7f1d60e543f606586d09b466d30a304798d23707..126141a7131f897716423c3526e4ed6a529b37df 100644 (file)
@@ -86,6 +86,8 @@ namespace bbtk
                void setActualDiagramComplexBox(bool val);
                void addActualDiagramComplexInputPort(std::string portName);
                void addActualDiagramComplexOutputPort(std::string portName);
+               void copySelectedBBoxesToComplexDiagram();
+               int getNumActualSelectedObjects();
                
                void OnTabChanged(wxAuiNotebookEvent& event);