X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FEditorGraphicBBS%2FbbsKernelEditorGraphic%2FwxVtkSceneManager.cxx;h=daa6327c157cceea4e7cd481750fa60fa7654e82;hb=eaf825847b9ac4bd762deafa59a7df1c2ceba433;hp=e476c03cf225682f21c2d718023058d3a18dedd0;hpb=64fc9f949ff91d6e9d448ca0567e6205ee4d5be4;p=bbtkGEditor.git diff --git a/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx b/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx index e476c03..daa6327 100644 --- a/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx +++ b/lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx @@ -41,126 +41,271 @@ namespace bbtk //========================================================================= - wxVtkSceneManager::wxVtkSceneManager(wxDropTarget *parent, wxVtk3DBaseView *baseView,int id) + wxVtkSceneManager::wxVtkSceneManager(wxDropTarget *parent, wxVtk3DBaseView *baseView,int idManager) { - _id=id; + _numBoxes=0; + _idManager=idManager; _baseView=baseView; + _idLastController=0; + if( _baseView!=NULL ) { - _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(parent); registerController(this); - configureBaseView(); - - vtkConeSource *cone = vtkConeSource::New(); - - cone->SetResolution(10); + _worldState=NOTHING_HAPPENS; - 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); - - - - ///////////////////// + } - //getRenderer()->AddActor(act); - //getRenderer()->Render(); - - - } } + //========================================================================= + void wxVtkSceneManager::disconnectDrop() { _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget(NULL); } + //========================================================================= + wxVtkSceneManager::~wxVtkSceneManager() { } + //========================================================================= void wxVtkSceneManager::configureBaseView() { - vtkInteractorStyleImage *temp = vtkInteractorStyleImage::New(); - _baseView->GetWxVTKRenderWindowInteractor()->SetInteractorStyle(temp); - _baseView->GetRenderer()->SetActiveCamera(_baseView->GetCamera()); - _baseView->GetRenderer()->ResetCamera (); - _baseView->GetCamera()->SetParallelProjection(true); - _baseView->Refresh(); + vtkInteractorStyleBaseView2D *interactorstylebaseview = vtkInteractorStyleBaseView2D::New(); + _baseView->SetInteractorStyleBaseView(interactorstylebaseview); + + // Important to activate the 2D interaction system + wxVTKRenderWindowInteractor *iren = _baseView->GetWxVTKRenderWindowInteractor(); + interactorstylebaseview->SetInteractor ( iren ); + 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) { + + int windowWidth=_baseView->GetRenWin()->GetSize()[0]; + int windowHeight=_baseView->GetRenWin()->GetSize()[1]; + int type = GBLACKBOX; //Create the MVC Objects - GObjectModel *model = GObjectsMVCFactory::getInstance()->createGObjectModel(type); + + GBlackBoxModel *model = (GBlackBoxModel*)GObjectsMVCFactory::getInstance()->createGObjectModel(type); vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type); GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type); + BlackBoxDescriptor::Pointer descriptor = GObjectsMVCFactory::getInstance()->getBlackBoxDescriptor(packageName, boxName); + //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 = y; + double yy = windowHeight-y; + + //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); + + _numBoxes++; + std::stringstream stream; + + if(_numBoxes<10) + { + stream << "Box0" << _numBoxes; + } + else + { + stream << "Box" << _numBoxes; + } + std::string arraystring = stream.str(); + + model->setBBTKName(arraystring); + model->setBBTKType(boxName); + + 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(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(GOUTPUTPORT,i,model,desc); + i++; + } + //Associates the view with the correspondent renderer and the model. //(NOTE: Refresh is only made by the view) - model->setInicPoint(xx,yy,zz); view->setModel(model); - view->setRenderer(_baseView->GetRenderer()); + view->setBaseView(_baseView); view->initVtkObjects(); - //Refresh renderwindow with new objects - refreshRenderWindow(); - //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); + + //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; + + } + + //========================================================================= + + void wxVtkSceneManager::createGInputPort(int portType, int posinBox,GBlackBoxModel *blackBox, BlackBoxInputDescriptor *desc) + { + createGPort(portType,posinBox,blackBox); + } + + //========================================================================= + + void wxVtkSceneManager::createGOutputPort(int portType, int posinBox,GBlackBoxModel *blackBox, BlackBoxOutputDescriptor *desc) + { + createGPort(portType,posinBox,blackBox); + } + + //========================================================================= + + void wxVtkSceneManager::createGPort(int portType, int posInBox,GBlackBoxModel *blackBox) + { + int type = GPORT; + + //Create the MVC Objects + GPortModel *model = (GPortModel*)GObjectsMVCFactory::getInstance()->createGObjectModel(type); + vtkGObjectView *view = GObjectsMVCFactory::getInstance()->createGObjectView(type); + GObjectController* controller = GObjectsMVCFactory::getInstance()->createGObjectController(type); + + model->registerInBox(blackBox,portType, posInBox); + blackBox->addOutputPort(model); + + 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); + view->setBaseView(_baseView); + view->initVtkObjects(); + //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::createGConnector(GPortModel* startPort) + { + int type = GCONNECTOR; + + manualConnectorContourController* manContourControl = new manualConnectorContourController(); + manualConnectorContourView* manContourView = new manualConnectorContourView(); + manualContourModel* manContourModel = new manualContourModel(); + + GConnectorController* connectorcontroller = new GConnectorController(); + GConnectorModel* connectorModel = new GConnectorModel(); + GConnectorView* connectorView = new GConnectorView(); + connectorModel->setGObjectType(type); + + manContourModel->SetCloseContour(false); + connectorModel->setStartPort(startPort); + + 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 ); + + 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); + connectorcontroller->setModelAndView(connectorModel,connectorView); + + int newId = _controllers.size(); + connectorcontroller->setId(newId); + _controllers[newId] = connectorcontroller; + } //========================================================================= @@ -185,14 +330,81 @@ namespace bbtk return _baseView->GetRenWin(); } //========================================================================= - - void wxVtkSceneManager::refreshRenderWindow() + + bool wxVtkSceneManager::OnMouseMove() { - _baseView->GetRenWin()->Render(); + return true; } + //========================================================================= + + void wxVtkSceneManager::update(int idController,int command) + { + + if(command == INIT_CREATION_CONTOUR) + { + GObjectController* cont = _controllers[idController]; + GPortModel* startOutputPort = (GPortModel*)cont->getModel(); + createGConnector(startOutputPort); + + // The last one is the controller of the connector + for(int i=0;i<_controllers.size()-1;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->SetActive(false); + } + } + else + { + cont->getView()->setState(NOTHING_HAPPENS); + cont->SetActive(false); + } + } + _worldState = CREATING_CONTOUR; + } + else if(command == FIN_CREATION_CONTOUR && _worldState == CREATING_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->SetActive(true); + } + } + } //========================================================================= + } // EO namespace bbtk // EOF