X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FEditorGraphicBBS%2FbbsKernelEditorGraphic%2FwxVtkSceneManager.cxx;h=78ece891bb13c29bcdf5cd1ba7c2fc752074978e;hb=50851761f4216d932217db8e8fe56dd5aac6b0fb;hp=a95d229934a5fdb81b3d3ccd6b6bdcd654c30fa3;hpb=e628a3dc4645cb347ebf060b145e626cc31a65f4;p=bbtkGEditor.git diff --git a/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx b/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx index a95d229..78ece89 100644 --- a/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx +++ b/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx @@ -41,105 +41,32 @@ 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, -100 , -100 , 900 ); - _pts->SetPoint(1, 100 , -100 , 900 ); - _pts->SetPoint(2, 100 , 100 , 900 ); - _pts->SetPoint(3, -100 , 100 , 900 ); - - 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); - - - - - vtkPoints *_pts2 = vtkPoints::New(); - _pts2->SetNumberOfPoints(4); - - _pts2->SetPoint(0, -105 , -100 , -50 ); - _pts2->SetPoint(1, 100 , -100 , -50 ); - _pts2->SetPoint(2, 100 , 100 , -50 ); - _pts2->SetPoint(3, -105 , 100 , -50 ); - - vtkCellArray *lines2 = vtkCellArray::New(); - lines2->InsertNextCell(5); - lines2->InsertCellPoint(0); - lines2->InsertCellPoint(1); - lines2->InsertCellPoint(2); - lines2->InsertCellPoint(3); - lines2->InsertCellPoint(0); - - vtkPolyData *_pd2 = vtkPolyData::New(); - _pd2->SetPoints( _pts2 ); - _pd2->SetLines( lines2 ); - - vtkActor *_pointVtkActor2 = vtkActor::New(); - vtkPolyDataMapper* _bboxMapper2 = vtkPolyDataMapper::New(); - - _bboxMapper2->SetInput(_pd2); - _pointVtkActor2->SetMapper(_bboxMapper2); - - getRenderer()->AddActor(_pointVtkActor2); - - */ - // ******* TO ERASE ******* - ///////////////////// + _worldState=NOTHING_HAPPENS; + registerController(this); } - } + } //========================================================================= void wxVtkSceneManager::disconnectDrop() { _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(NULL); - } + } //========================================================================= @@ -199,22 +126,22 @@ namespace bbtk _baseView->TransCoordScreenToWorld(xx,yy,zz); model->setInicPoint(xx,yy,zz); - int cantObjects = _objects.size(); - cantObjects++; + _numBoxes++; std::stringstream stream; - if(cantObjects<10) + if(_numBoxes<10) { - stream << "Box0" << cantObjects; + stream << "Box0" << _numBoxes; } else { - stream << "Box" << cantObjects; + stream << "Box" << _numBoxes; } std::string arraystring = stream.str(); model->setBBTKName(arraystring); model->setBBTKType(boxName); + model->setBBTKPackage(packageName); model->addObserver(view); model->addObserver(this); @@ -254,15 +181,12 @@ 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 - _objects.push_back(controller); - int newId = _controllers.size(); controller->setId(newId); _controllers[newId] = controller; @@ -309,7 +233,7 @@ 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); @@ -323,54 +247,66 @@ namespace bbtk void wxVtkSceneManager::createGConnector(GPortModel* startPort) { - manualContourControler* manContourControl = new manualContourControler(); - GConnectorView* manViewerContour = new GConnectorView(); + int type = GCONNECTOR; + + manualConnectorContourController* manContourControl = new manualConnectorContourController(); + manualConnectorContourView* manContourView = new manualConnectorContourView(); manualContourModel* manContourModel = new manualContourModel(); - manContourModel->SetCloseContour(false); - manViewerContour->SetModel( manContourModel ); - manViewerContour->SetWxVtkBaseView( _baseView ); - manViewerContour->SetRange( 0.5 ); - manViewerContour->SetZ( 900 ); + GConnectorController* connectorcontroller = new GConnectorController(); + GConnectorModel* connectorModel = new GConnectorModel(); + GConnectorView* connectorView = new GConnectorView(); + connectorModel->setGObjectType(type); - manViewerContour->SetColorNormalContour(0, 0, 1); - manViewerContour->SetColorEditContour(0.5, 0.5, 0.5); - manViewerContour->SetColorSelectContour(1, 0.8, 0); - manViewerContour->SetWidthLine(1); + manContourModel->SetCloseContour(false); + connectorModel->setStartPort(startPort); - manContourControl->SetModelView( manContourModel , manViewerContour ); - manContourControl->Configure(); - int i,sizeLstPoints = manContourModel->GetSizeLstPoints(); + manContourView->SetModel( manContourModel ); + manContourView->SetWxVtkBaseView( _baseView ); + manContourView->SetRange( 0.5 ); + manContourView->SetZ( 900 ); - for ( i=0; iAddPoint(); - } + 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 ); + manContourControl->CreateNewManualContour(); - manViewerContour->RefreshContour(); + manContourView->RefreshContour(); double x,y,z; - startPort->getCenter(x,y,z); + connectorModel->getInicPoint(x,y,z); manContourControl->SetState(1); 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*) manContourControl); + 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; } @@ -399,6 +335,58 @@ namespace bbtk 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) + { + std::map::iterator it; + + for(it = _controllers.begin(); it != _controllers.end(); ++it) + { + GObjectController *desc = it->second; + if(desc->getGObjectType()==GBLACKBOX && desc->getView()->getState() == HIGHLIGHTED) + { + GBlackBoxModel *mod = (GBlackBoxModel*)desc->getModel(); + _parent->displayBlackBoxInfo(mod->getBBTKPackage(),mod->getBBTKType()); + } + } + } + + return true; } @@ -406,28 +394,167 @@ namespace bbtk void wxVtkSceneManager::update(int idController,int command) { - - if(command==INIT_CREATION_CONTOUR) - { - GObjectController* cont = _controllers[idController]; - if(cont->getGObjectType() == GPORT) + if(command != NO_COMMAND) + { + if(command == ADD_TO_SELECTED) { - GPortController* controller = (GPortController*)cont; - vtkGPortView* view = (vtkGPortView*)controller->getView(); + GObjectController* cont = _controllers[idController]; - if(view->getState() == CREATING_CONTOUR) + bool foundID=false; + for (int i=0; i<_selectedObjects.size() && foundID==false; i++) + { + int id = _selectedObjects[i]; + if(id==idController) + { + foundID = true; + } + } + if(!foundID) { - //pre: The port in this state is an output port - GPortModel* startOutputPort = (GPortModel*)controller->getModel(); - createGConnector(startOutputPort); + 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::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; + } + + //========================================================================= + + void wxVtkSceneManager::displayBlackBoxInfo(std::string packageName, std::string boxName) + { + _parent->displayBlackBoxInfo(packageName,boxName); + } + } // EO namespace bbtk // EOF