X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FEditorGraphicBBS%2FbbsKernelEditorGraphic%2FwxVtkSceneManager.cxx;h=c4efe5605d986f87da642f9bbcd499ea122c47e3;hb=a6d479881eeb637cd06afa3b2177e430fa05571e;hp=bbe321e5195144670282d474a359aaf0a5c1a2bb;hpb=311af31f393ba7d5788a0a843ee412eebdf43a82;p=bbtkGEditor.git diff --git a/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx b/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx index bbe321e..c4efe56 100644 --- a/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx +++ b/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx @@ -41,74 +41,39 @@ namespace bbtk //========================================================================= - wxVtkSceneManager::wxVtkSceneManager(wxDropTarget *parent, wxVtk3DBaseView *baseView,int id) + wxVtkSceneManager::wxVtkSceneManager(wxGEditorTabPanel *parent, wxVtk3DBaseView *baseView,int idManager) { - _id=id; + _parent = parent; + _numBoxes=0; + _idManager=idManager; _baseView=baseView; + _idLastController=0; + _startDragging=false; + if( _baseView!=NULL ) { - - _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(parent); - registerController(this); + _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget((wxDropTarget*)parent); configureBaseView(); - - ///// ******* TO ERASE ******* - //JUST TO TEST - // - vtkConeSource *cone = vtkConeSource::New(); - - cone->SetResolution(10); - - vtkPolyDataMapper *map = vtkPolyDataMapper::New(); - map->SetInput(cone->GetOutput()); - - vtkActor *act = vtkActor::New(); - - act->SetMapper(map); - - vtkPoints *_pts = vtkPoints::New(); - _pts->SetNumberOfPoints(4); - - _pts->SetPoint(0, -1 , -1 , 0 ); - _pts->SetPoint(1, 1 , -1 , 0 ); - _pts->SetPoint(2, 1 , 1 , 0 ); - _pts->SetPoint(3, -1 , 1 , 0 ); - - vtkCellArray *lines = vtkCellArray::New(); - lines->InsertNextCell(5); - lines->InsertCellPoint(0); - lines->InsertCellPoint(1); - lines->InsertCellPoint(2); - lines->InsertCellPoint(3); - lines->InsertCellPoint(0); - - vtkPolyData *_pd = vtkPolyData::New(); - _pd->SetPoints( _pts ); - _pd->SetLines( lines ); - - vtkActor *_pointVtkActor = vtkActor::New(); - vtkPolyDataMapper* _bboxMapper = vtkPolyDataMapper::New(); - - _bboxMapper->SetInput(_pd); - _pointVtkActor->SetMapper(_bboxMapper); - - getRenderer()->AddActor(_pointVtkActor); - - // ******* TO ERASE ******* - ///////////////////// + _worldState=NOTHING_HAPPENS; + registerController(this); } + } //========================================================================= + void wxVtkSceneManager::disconnectDrop() { _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(NULL); - } + } + //========================================================================= + wxVtkSceneManager::~wxVtkSceneManager() { } + //========================================================================= void wxVtkSceneManager::configureBaseView() @@ -123,15 +88,17 @@ namespace bbtk iren->SetInteractorStyle(interactorstylebaseview); interactorstylebaseview->SetwxVtkBaseView(_baseView); + _baseView->GetRenderer()->GetActiveCamera()->ParallelProjectionOn(); + _baseView->GetRenderer()->ResetCamera(-100,100,-100,100,900,1000); + _baseView->GetRenderer()->SetBackground(0.9,0.9,0.9); _baseView->GetRenderer()->GradientBackgroundOff(); _baseView->Refresh(); - } //========================================================================= - void wxVtkSceneManager::createGBlackBox(int x, int y, std::string packageName, std::string boxName) + void wxVtkSceneManager::createGBlackBox(int x, int y, std::string packageName, std::string boxType) { int windowWidth=_baseView->GetRenWin()->GetSize()[0]; @@ -145,42 +112,62 @@ 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 = 0; + double zz = 900; _baseView->TransCoordScreenToWorld(xx,yy,zz); model->setInicPoint(xx,yy,zz); + _numBoxes++; + std::stringstream stream; + + if(_numBoxes<10) + { + stream << "Box0" << _numBoxes; + } + else + { + stream << "Box" << _numBoxes; + } + std::string arraystring = stream.str(); + + model->setBBTKName(arraystring); + model->setBBTKType(boxType); + model->setBBTKPackage(packageName); + model->addObserver(view); + model->addObserver(this); //Iterate and create the input ports std::map descriptorInMap = descriptor->GetInputDescriptorMap(); std::map::iterator itInput; + int i=0; for(itInput = descriptorInMap.begin(); itInput != descriptorInMap.end(); ++itInput) { BlackBoxInputDescriptor *desc = itInput->second; - createGInputPort(desc,model); + createGInputPort(GINPUTPORT,i,model,desc); + i++; } //Iterate and create the output ports std::map descriptorOutMap = descriptor->GetOutputDescriptorMap(); std::map::iterator itOutput; - + i=0; for(itOutput = descriptorOutMap.begin();itOutput != descriptorOutMap.end(); ++itOutput) { BlackBoxOutputDescriptor *desc = itOutput->second; - createGOutputPort(desc,model); - + createGOutputPort(GOUTPUTPORT,i,model,desc); + i++; } @@ -194,20 +181,35 @@ 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); - //Add the object to the objects list (only boxes and connectors) - objects.push_back(model); + //Add the object to the objects list + int newId = _controllers.size(); + controller->setId(newId); + _controllers[newId] = controller; } //========================================================================= - void wxVtkSceneManager::createGOutputPort(BlackBoxOutputDescriptor *desc,GBlackBoxModel *blackBox) + void wxVtkSceneManager::createGInputPort(int portType, int posinBox,GBlackBoxModel *blackBox, BlackBoxInputDescriptor *desc) + { + createGPort(portType,desc->GetName(),desc->GetTypeName(),posinBox,blackBox); + } + + //========================================================================= + + void wxVtkSceneManager::createGOutputPort(int portType, int posinBox,GBlackBoxModel *blackBox, BlackBoxOutputDescriptor *desc) + { + createGPort(portType,desc->GetName(),desc->GetTypeName(),posinBox,blackBox); + } + + //========================================================================= + + void wxVtkSceneManager::createGPort(int portType,std::string bbtkName, std::string bbtkType, int posInBox,GBlackBoxModel *blackBox) { int type = GPORT; @@ -216,9 +218,15 @@ namespace bbtk vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type); GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type); - model->registerInBox(blackBox,GOUTPUTPORT); + model->registerInBox(blackBox,portType, posInBox); blackBox->addOutputPort(model); + model->setBBTKType(bbtkType); + model->setBBTKName(bbtkName); + + model->addObserver(view); + model->addObserver(this); + //Associates the view with the correspondent renderer and the model. //(NOTE: Refresh is only made by the view) view->setModel(model); @@ -228,36 +236,81 @@ namespace bbtk //Associates the controller with the correspondent model and view controller->setModelAndView(model,view); + model->notifyObservers(_idManager); + //Register the controller of the new object registerController((InteractorStyleMaracas*) controller); + + int newId = _controllers.size(); + controller->setId(newId); + _controllers[newId] = controller; } //========================================================================= - void wxVtkSceneManager::createGInputPort(BlackBoxInputDescriptor *desc,GBlackBoxModel *blackBox) + void wxVtkSceneManager::createGConnector(GPortModel* startPort) { - int type = GPORT; + int type = GCONNECTOR; - //Create the MVC Objects - GPortModel *model = (GPortModel*)GObjectsMVCFactory::getInstance()->createGObjectModel(type); - vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type); - GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type); + manualConnectorContourController* manContourControl = new manualConnectorContourController(); + manualConnectorContourView* manContourView = new manualConnectorContourView(); + manualContourModel* manContourModel = new manualContourModel(); - model->registerInBox(blackBox,GINPUTPORT); - blackBox->addInputPort(model); + GConnectorController* connectorcontroller = new GConnectorController(); + GConnectorModel* connectorModel = new GConnectorModel(); + GConnectorView* connectorView = new GConnectorView(); + connectorModel->setGObjectType(type); + manContourModel->SetCloseContour(false); + connectorModel->setStartPort(startPort); - //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(); + manContourView->SetModel( manContourModel ); + manContourView->SetWxVtkBaseView( _baseView ); + manContourView->SetRange( 0.5 ); + manContourView->SetZ( 900 ); + + manContourView->SetColorNormalContour(0, 0, 1); + manContourView->SetColorEditContour(0.5, 0.5, 0.5); + manContourView->SetColorSelectContour(1, 0.8, 0); + manContourView->SetWidthLine(1); + + manContourControl->SetModelView( manContourModel , manContourView ); - //Associates the controller with the correspondent model and view - controller->setModelAndView(model,view); + manContourControl->CreateNewManualContour(); + + manContourView->RefreshContour(); + + + double x,y,z; + connectorModel->getInicPoint(x,y,z); + + manContourControl->SetState(1); + manContourModel->SetCloseContour(false); + + manContourModel->AddPoint(x,y,z); + manContourView->AddPoint(); + + manContourModel->AddPoint(x,y,z); + manContourView->AddPoint(); + + int bak= manContourControl->GetNumberOfPointsManualContour() - 1; + manContourControl->_bakIdPoint=bak; + manContourView->Refresh(); + + manContourControl->SetMoving( false ); + + registerController((InteractorStyleMaracas*) connectorcontroller); + + connectorcontroller->setManualContourController(manContourControl); + connectorModel->setManualContourModel(manContourModel); + connectorView->setManualContourView(manContourView); + connectorView->setModel(connectorModel); + connectorcontroller->setModelAndView(connectorModel,connectorView); + + int newId = _controllers.size(); + connectorcontroller->setId(newId); + _controllers[newId] = connectorcontroller; - //Register the controller of the new object - registerController((InteractorStyleMaracas*) controller); } //========================================================================= @@ -270,6 +323,14 @@ namespace bbtk //========================================================================= + void wxVtkSceneManager::unregisterController(InteractorStyleMaracas *param) + { + vtkInteractorStyleBaseView* baseViewControlManager = (vtkInteractorStyleBaseView*)_baseView->GetInteractorStyleBaseView(); + baseViewControlManager->RemoveInteractorStyleMaracas( param ); + } + + //========================================================================= + vtkRenderer* wxVtkSceneManager::getRenderer() { return _baseView->GetRenderer(); @@ -283,11 +344,425 @@ namespace bbtk } //========================================================================= + + void wxVtkSceneManager::update(int idController,int command) + { + 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); + } + } + } + } + + //========================================================================= + bool wxVtkSceneManager::OnMouseMove() { + int X,Y; + wxVTKRenderWindowInteractor *wxVTKiren; + wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetWxVTKRenderWindowInteractor(); + wxVTKiren->GetEventPosition(X,Y); + + + if(_worldState == DRAG_OBJECTS) + { + for (int i=0; i<_selectedObjects.size(); i++) + { + 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); + } + + std::map::iterator it; + + for(it = _controllers.begin(); it != _controllers.end(); ++it) + { + GObjectController *desc = it->second; + if(desc->getGObjectType()==GCONNECTOR) + { + GConnectorView* vconn = (GConnectorView*)desc->getView(); + vconn->updateStartEndPoints(); + } + } + + _startDragging=false; + + } + else if(_worldState == NOTHING_HAPPENS || _worldState == INIT_CREATION_CONTOUR) + { + std::map::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) + { + GBlackBoxModel *mod = (GBlackBoxModel*)desc->getModel(); + _parent->displayBlackBoxInfo(mod->getBBTKPackage(),mod->getBBTKType()); + } + } + } + } + + + + + return true; + } + + //========================================================================= + + bool wxVtkSceneManager::OnLeftButtonDown() + { + + 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); + } + } + + + + return true; + } + + //========================================================================= + + bool wxVtkSceneManager::OnLeftButtonUp() + { + if(_worldState == DRAG_OBJECTS) + { + _worldState = NOTHING_HAPPENS; + + 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() + { + 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::OnChar() + { + char keyCode = _vtkInteractorStyleBaseView->GetInteractor()-> GetKeyCode(); + + // KeyCode 127 : Delete Key + // KeyCode 8 : Backspace Key + if(keyCode == 8 || keyCode == 127) + { + if(_selectedObjects.size()>0) + { + for(int i=0;i<_selectedObjects.size();i++) + { + int id = _selectedObjects[i]; + removeObject(id); + } + _selectedObjects.clear(); + } + } + + return true; + } + + //========================================================================= + + void wxVtkSceneManager::removeObject(int id) + { + GObjectController *control = _controllers[id]; + std::vector controllersToRemove; + + if(control->getGObjectType()==GBLACKBOX) + { + GBlackBoxModel *bbmod = (GBlackBoxModel*)control->getModel(); + std::vectorinputs = bbmod->getInputPorts(); + + for(int i = 0;igetObjectId()); + } + + std::vectoroutputs = bbmod->getOutputPorts(); + + for(int i = 0;igetObjectId()); + } + + controllersToRemove.push_back(control->getId()); + } + + for(int i = 0;iremoveFromScene(); + 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::getDiagramScript() + { + bool existsExec=false; + + std::vector packages; + std::vector boxes; + std::vector connections; + std::vector execBoxes; + + std::map::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;tfirst); + 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; igetModel(); + + script+=model->getBBTKType(); + script+=" "; + script+=model->getBBTKName(); + script+="\n"; + } + + for(i = 0; igetModel(); + + //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; igetModel(); + + script+=model->getBBTKName(); + script+="\n"; + } + + } + + return script; + } + + //========================================================================= + } // EO namespace bbtk // EOF