00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "wxVtkSceneManager.h"
00037
00038 #include <vtkPolygon.h>
00039 #include <vtkUnstructuredGrid.h>
00040
00041 namespace bbtk {
00042
00043
00044 wxVtkSceneManager::wxVtkSceneManager(wxGEditorTabPanel *parent,
00045 wxVtk3DBaseView *baseView, int idManager) {
00046 _cbName = "ComplexBoxName";
00047 _cbPackageName = "PackageName";
00048 _Author = "Author ??";
00049 _Category = "<VOID>";
00050 _Description = "Description ??";
00051
00052 _parent = parent;
00053 _numBoxes = 0;
00054 _idManager = idManager;
00055 _baseView = baseView;
00056 _startDragging = false;
00057 _isComplexBox = false;
00058
00059 if (_baseView != NULL) {
00060
00061 printf(
00062 "RaC-EED 21-06-2010 %p wxVtkSceneManager::wxVtkSceneManager If you comment this line, the drag and drop functionnality is not initialized.\n",
00063 this);
00064
00065 _baseView->GetWxVTKRenderWindowInteractor()->SetDropTarget((wxDropTarget*)parent);
00066
00067
00068 configureBaseView();
00069 _worldState = NOTHING_HAPPENS;
00070 registerController(this);
00071
00072 }
00073 _idConnectionInCreation = -1;
00074 _contLastId = 0;
00075
00076 }
00077
00078
00079
00080 void wxVtkSceneManager::disconnectDrop() {
00081 printf("EED %p ~wxVtkSceneManager::disconnectDrop()\n", this);
00082
00083
00084 }
00085
00086
00087
00088 wxVtkSceneManager::~wxVtkSceneManager() {
00089
00090 printf("EED %p ~wxVtkSceneManager() START\n", this);
00091 disconnectDrop();
00092 delete _baseView;
00093 printf("EED %p ~wxVtkSceneManager() END\n", this);
00094 }
00095
00096
00097
00098 void wxVtkSceneManager::configureBaseView() {
00099 printf("EED wxVtkSceneManager::configureBaseView 0\n");
00100 vtkInteractorStyleBaseView2D *interactorstylebaseview =
00101 vtkInteractorStyleBaseView2D::New();
00102
00103 _baseView->SetInteractorStyleBaseView(interactorstylebaseview);
00104
00105
00106 wxVTKRenderWindowInteractor *iren =
00107 _baseView->GetWxVTKRenderWindowInteractor();
00108 interactorstylebaseview->SetInteractor(iren);
00109 iren->SetInteractorStyle(interactorstylebaseview);
00110 interactorstylebaseview->SetwxVtkBaseView(_baseView);
00111
00112 _baseView->GetRenderer()->GetActiveCamera()->ParallelProjectionOn();
00113 _baseView->GetRenderer()->ResetCamera(-100, 100, -100, 100, 800, 1100);
00114
00115 _baseView->GetRenderer()->SetBackground(0.9, 0.9, 0.9);
00116 _baseView->GetRenderer()->GradientBackgroundOn();
00117
00118
00119 _textActor = vtkTextActor3D::New();
00120 _textActor->SetPosition(-9999, -9999, 900);
00121 _textActor->SetInput("<void>");
00122 _textActor->GetTextProperty()->SetFontSize(60);
00123 _textActor->GetTextProperty()->BoldOn();
00124 _textActor->GetTextProperty()->SetColor(PORTTEXT_NH_R, PORTTEXT_NH_G,
00125 PORTTEXT_NH_B);
00126
00127 _baseView->GetRenderer()->AddActor(_textActor);
00128
00129
00130
00131
00132 double xInic = 0;
00133 double yInic = 0;
00134 double zInic = 900;
00135
00136 vtkPolygon *aPolygon = vtkPolygon::New();
00137 _fillObjectActor = vtkActor::New();
00138
00139 _pts = vtkPoints::New();
00140
00141 double w = 100, h = 10, b = h / 15, t = 3;
00142 _pts->SetNumberOfPoints(21);
00143 _pts->InsertPoint(0, xInic + w * 0.33 - t / 2, yInic, zInic);
00144 _pts->InsertPoint(1, xInic + w * 0.33, yInic - t, zInic);
00145 _pts->InsertPoint(2, xInic + w * 0.33 + t / 2, yInic, zInic);
00146 _pts->InsertPoint(3, xInic + w * 0.33 + t / 2, yInic, zInic);
00147 _pts->InsertPoint(4, xInic + w - b * 4, yInic + b * 0, zInic);
00148
00149 _pts->InsertPoint(5, xInic + w - b * 4, yInic + b * 0, zInic);
00150 _pts->InsertPoint(6, xInic + w - b * 2, yInic + b * 1, zInic);
00151 _pts->InsertPoint(7, xInic + w - b * 1, yInic + b * 2, zInic);
00152 _pts->InsertPoint(8, xInic + w - b * 0, yInic + b * 4, zInic);
00153
00154 _pts->InsertPoint(9, xInic + w - b * 0, yInic + h - b * 4, zInic);
00155 _pts->InsertPoint(10, xInic + w - b * 1, yInic + h - b * 2, zInic);
00156 _pts->InsertPoint(11, xInic + w - b * 2, yInic + h - b * 1, zInic);
00157 _pts->InsertPoint(12, xInic + w - b * 4, yInic + h - b * 0, zInic);
00158
00159 _pts->InsertPoint(13, xInic + b * 4, yInic + h - b * 0, zInic);
00160 _pts->InsertPoint(14, xInic + b * 2, yInic + h - b * 1, zInic);
00161 _pts->InsertPoint(15, xInic + b * 1, yInic + h - b * 2, zInic);
00162 _pts->InsertPoint(16, xInic + b * 0, yInic + h - b * 4, zInic);
00163
00164 _pts->InsertPoint(17, xInic + b * 0, yInic + b * 4, zInic);
00165 _pts->InsertPoint(18, xInic + b * 1, yInic + b * 2, zInic);
00166 _pts->InsertPoint(19, xInic + b * 2, yInic + b * 1, zInic);
00167 _pts->InsertPoint(20, xInic + b * 4, yInic + b * 0, zInic);
00168
00169 aPolygon->GetPointIds()->SetNumberOfIds(21);
00170 for (int i = 0; i < 21; i++) {
00171 aPolygon->GetPointIds()->SetId(i, i);
00172 }
00173
00174 vtkUnstructuredGrid *aPolygonGrid = vtkUnstructuredGrid::New();
00175 aPolygonGrid->Allocate(1, 1);
00176 aPolygonGrid->InsertNextCell(aPolygon->GetCellType(),
00177 aPolygon->GetPointIds());
00178 aPolygonGrid->SetPoints(_pts);
00179 _aPolygonMapper = vtkDataSetMapper::New();
00180 _aPolygonMapper->SetInput(aPolygonGrid);
00181 _fillObjectActor->SetMapper(_aPolygonMapper);
00182 _fillObjectActor->GetProperty()->SetColor(PORTFILL_NH_R, PORTFILL_NH_G,
00183 PORTFILL_NH_B);
00184 _fillObjectActor->GetProperty()->SetOpacity(0);
00185 _aPolygonMapper->Modified();
00186
00187 _baseView->GetRenderer()->AddActor(_fillObjectActor);
00188 printf("EED wxVtkSceneManager::configureBaseView 1\n");
00189 }
00190
00191
00192
00193 std::string wxVtkSceneManager::generateANewNameForABox() {
00194 std::stringstream boxname;
00195 if (_numBoxes < 10) {
00196 boxname << "Box0" << _numBoxes;
00197 } else {
00198 boxname << "Box" << _numBoxes;
00199 }
00200 _numBoxes++;
00201 return boxname.str();
00202 }
00203
00204
00205
00206 std::string wxVtkSceneManager::findANewNameForABox() {
00207 std::string boxname = generateANewNameForABox();
00208
00209 while (boxExist(boxname) == true) {
00210 boxname = generateANewNameForABox();
00211 }
00212
00213 return boxname;
00214 }
00215
00216
00217 void wxVtkSceneManager::configGBlackBox(int idBox, double xIn, double yIn,
00218 double zIn, std::string name, bool boxExecutable, double xEn,
00219 double yEn, double zEn) {
00220 GObjectController *cont = _controllers[idBox];
00221 GBlackBoxModel *bbmod = (GBlackBoxModel*) cont->getModel();
00222 bbmod->setBBTKName(name);
00223 bbmod->setInicPoint(xIn, yIn, zIn);
00224 bbmod->setFinalPoint(xEn, yEn, zEn);
00225 bbmod->setExecutable(boxExecutable);
00226
00227 bbmod->notifyObservers(_idManager);
00228
00229 }
00230
00231
00232
00233 int wxVtkSceneManager::createGBlackBox(int x, int y, std::string packageName,
00234 std::string boxType) {
00235 _worldState = NOTHING_HAPPENS;
00236
00237 int windowHeight = _baseView->GetRenWin()->GetSize()[1];
00238
00239 int type = GBLACKBOX;
00240
00241
00242
00243 GBlackBoxModel
00244 *model =
00245 (GBlackBoxModel*) GObjectsMVCFactory::getInstance()->createGObjectModel(
00246 type);
00247 vtkGObjectView *view =
00248 GObjectsMVCFactory::getInstance()->createGObjectView(type);
00249 GObjectController* controller =
00250 GObjectsMVCFactory::getInstance()->createGObjectController(type);
00251
00252 BlackBoxDescriptor::Pointer descriptor =
00253 GObjectsMVCFactory::getInstance()->getBlackBoxDescriptor(
00254 packageName, boxType);
00255 if (descriptor == NULL){
00256 printf("SCP: ERROR in wxVtkSceneManager::createGBlackBox, box %s probably does not exist.\n", boxType.c_str());
00257 }
00258
00259
00260
00261 double xx = x;
00262 double yy = windowHeight - y;
00263
00264
00265 double zz = 900;
00266 _baseView->TransCoordScreenToWorld(xx, yy, zz);
00267 model->setInicPoint(xx, yy, zz);
00268
00269 std::stringstream stream;
00270
00271 std::string newBoxName;
00272 newBoxName = findANewNameForABox();
00273
00274 stream << newBoxName;
00275
00276 std::string arraystring = stream.str();
00277
00278 model->setBBTKName(arraystring);
00279 model->setBBTKType(boxType);
00280 model->setBBTKPackage(packageName);
00281
00282 model->addObserver(view);
00283 model->addObserver(this);
00284
00285
00286 std::map<std::string, BlackBoxInputDescriptor*> descriptorInMap =
00287 descriptor->GetInputDescriptorMap();
00288 std::map<std::string, BlackBoxInputDescriptor*>::iterator itInput;
00289
00290 int i = 0;
00291 for (itInput = descriptorInMap.begin(); itInput != descriptorInMap.end(); ++itInput) {
00292 BlackBoxInputDescriptor *desc = itInput->second;
00293 createGInputPort(GINPUTPORT, i, model, desc);
00294 i++;
00295 }
00296
00297
00298 std::map<std::string, BlackBoxOutputDescriptor*> descriptorOutMap =
00299 descriptor->GetOutputDescriptorMap();
00300 std::map<std::string, BlackBoxOutputDescriptor*>::iterator itOutput;
00301
00302 i = 0;
00303 for (itOutput = descriptorOutMap.begin(); itOutput
00304 != descriptorOutMap.end(); ++itOutput) {
00305 BlackBoxOutputDescriptor *desc = itOutput->second;
00306 createGOutputPort(GOUTPUTPORT, i, model, desc);
00307 i++;
00308 }
00309
00310
00311
00312 view->setModel(model);
00313 view->setBaseView(_baseView);
00314 view->initVtkObjects();
00315
00316
00317 controller->setModelAndView(model, view);
00318
00319
00320 model->notifyObservers(_idManager);
00321
00322 int newId = addObjectController(controller);
00323
00324 return newId;
00325
00326 }
00327
00328
00329
00330 int wxVtkSceneManager::createGComplexBoxInputPort(std::string inputName) {
00331
00332 int windowHeight = _baseView->GetRenWin()->GetSize()[1];
00333
00334 int type = GCOMPLEXINPUTPORT;
00335
00336
00337
00338 GComplexBoxPortModel
00339 *model =
00340 (GComplexBoxPortModel*) GObjectsMVCFactory::getInstance()->createGObjectModel(
00341 type);
00342 vtkGObjectView *view =
00343 GObjectsMVCFactory::getInstance()->createGObjectView(type);
00344 GObjectController* controller =
00345 GObjectsMVCFactory::getInstance()->createGObjectController(type);
00346
00347
00348
00349 double xx = 5;
00350 double yy = windowHeight - 5;
00351
00352
00353 double zz = 900;
00354 printf("EED wxVtkSceneManager::createGComplexBoxInputPort 900-450\n");
00355
00356 _baseView->TransCoordScreenToWorld(xx, yy, zz);
00357 model->setInicPoint(xx, yy, zz);
00358
00359 model->setBBTKName(inputName);
00360 model->setBBTKType("ComplexInputPort");
00361 model->setComplexPortType(type);
00362
00363 model->addObserver(view);
00364 model->addObserver(this);
00365
00366
00367 GPortController* portController = createGPort(GOUTPUTPORT, inputName,
00368 "ComplexInputPort", 0, model);
00369 model->addOutputPort((GPortModel*) portController->getModel());
00370
00371
00372
00373 view->setModel(model);
00374 view->setBaseView(_baseView);
00375 view->initVtkObjects();
00376
00377
00378 controller->setModelAndView(model, view);
00379
00380
00381 model->notifyObservers(_idManager);
00382
00383 int newId = addObjectController(controller);
00384 return newId;
00385 }
00386
00387
00388
00389 int wxVtkSceneManager::createGComplexBoxOutputPort(std::string outputName) {
00390
00391 int windowHeight = _baseView->GetRenWin()->GetSize()[1];
00392
00393 int type = GCOMPLEXOUTPUTPORT;
00394
00395
00396
00397 GComplexBoxPortModel
00398 *model =
00399 (GComplexBoxPortModel*) GObjectsMVCFactory::getInstance()->createGObjectModel(
00400 type);
00401 vtkGObjectView *view =
00402 GObjectsMVCFactory::getInstance()->createGObjectView(type);
00403 GObjectController *controller =
00404 GObjectsMVCFactory::getInstance()->createGObjectController(type);
00405
00406
00407
00408 double xx = 5;
00409 double yy = windowHeight - 5;
00410
00411
00412 double zz = 900;
00413
00414 printf("EED wxVtkSceneManager::createGComplexBoxOutputPort 900-450\n");
00415
00416 _baseView->TransCoordScreenToWorld(xx, yy, zz);
00417 model->setInicPoint(xx, yy, zz);
00418
00419 model->setBBTKName(outputName);
00420 model->setBBTKType("ComplexOutputPort");
00421 model->setComplexPortType(type);
00422
00423 model->addObserver(view);
00424 model->addObserver(this);
00425
00426
00427 GPortController* portController = createGPort(GINPUTPORT, outputName,
00428 "ComplexInputPort", 0, model);
00429 model->addInputPort((GPortModel*) portController->getModel());
00430
00431
00432
00433 view->setModel(model);
00434 view->setBaseView(_baseView);
00435 view->initVtkObjects();
00436
00437
00438 controller->setModelAndView(model, view);
00439
00440
00441 model->notifyObservers(_idManager);
00442
00443 int newId = addObjectController(controller);
00444 return newId;
00445 }
00446
00447
00448
00449 int wxVtkSceneManager::createGInputPort(int portType, int posinBox,
00450 GBoxModel *blackBox, BlackBoxInputDescriptor *desc) {
00451 GPortController* portController = createGPort(portType, desc->GetName(),
00452 desc->GetTypeName(), posinBox, blackBox);
00453 blackBox->addInputPort((GPortModel*) portController->getModel());
00454 return portController->getId();
00455 }
00456
00457
00458
00459 int wxVtkSceneManager::createGOutputPort(int portType, int posinBox,
00460 GBoxModel *blackBox, BlackBoxOutputDescriptor *desc) {
00461 GPortController* portController = createGPort(portType, desc->GetName(),
00462 desc->GetTypeName(), posinBox, blackBox);
00463 blackBox->addOutputPort((GPortModel*) portController->getModel());
00464 return portController->getId();
00465 }
00466
00467
00468
00469 GPortController* wxVtkSceneManager::createGPort(int portType,
00470 std::string bbtkName, std::string bbtkType, int posInBox,
00471 GBoxModel *blackBox) {
00472 int type = GPORT;
00473
00474
00475 GPortModel
00476 *model =
00477 (GPortModel*) GObjectsMVCFactory::getInstance()->createGObjectModel(
00478 type);
00479 vtkGObjectView *view =
00480 GObjectsMVCFactory::getInstance()->createGObjectView(type);
00481 GObjectController* controller =
00482 GObjectsMVCFactory::getInstance()->createGObjectController(type);
00483
00484 model->registerInBox(blackBox, portType, posInBox);
00485
00486 model->setBBTKType(bbtkType);
00487 model->setBBTKName(bbtkName);
00488
00489 model->addObserver(view);
00490 model->addObserver(this);
00491
00492
00493
00494 view->setModel(model);
00495 view->setBaseView(_baseView);
00496 view->initVtkObjects();
00497
00498
00499 controller->setModelAndView(model, view);
00500
00501 model->notifyObservers(_idManager);
00502
00503 addObjectController(controller);
00504
00505 return (GPortController*) controller;
00506 }
00507
00508
00509
00510 int wxVtkSceneManager::createGConnector(GPortModel* startPort) {
00511 int type = GCONNECTOR;
00512
00513 manualConnectorContourController* manContourControl =
00514 new manualConnectorContourController();
00515 manualConnectorContourView* manContourView =
00516 new manualConnectorContourView();
00517 manualContourModel* manContourModel = new manualContourModel();
00518
00519 GConnectorController* connectorcontroller = new GConnectorController();
00520 GConnectorModel* connectorModel = new GConnectorModel();
00521 vtkGConnectorView* connectorView = new vtkGConnectorView();
00522 connectorModel->setGObjectType(type);
00523
00524 manContourModel->SetCloseContour(false);
00525 connectorModel->setStartPort(startPort);
00526
00527 manContourView->SetModel(manContourModel);
00528 manContourView->SetWxVtkBaseView(_baseView);
00529 manContourView->SetRange(0.5);
00530 manContourView->SetZ(900);
00531
00532 manContourView->SetColorNormalContour(0, 0, 1);
00533 manContourView->SetColorEditContour(0.5, 0.5, 0.5);
00534 manContourView->SetColorSelectContour(1, 0.8, 0);
00535
00541 manContourView->SetWidthLine( 3 ) ;
00542 manContourView->SetShowText(false);
00543
00544 manContourControl->SetModelView(manContourModel, manContourView);
00545
00546 manContourControl->CreateNewManualContour();
00547
00548
00549 double x, y, z;
00550 connectorModel->getInicPoint(x, y, z);
00551
00552 manContourControl->SetState(1);
00553 manContourModel->SetCloseContour(false);
00554
00555 manContourModel->AddPoint(x, y, z);
00556 manContourView->AddPoint();
00557
00558 manContourModel->AddPoint(x, y, z);
00559 manContourView->AddPoint();
00560
00561 int bak = manContourControl->GetNumberOfPointsManualContour() - 1;
00562 manContourControl->_bakIdPoint = bak;
00563
00564 manContourControl->SetMoving(false);
00565
00566 connectorcontroller->setModelAndView(connectorModel, connectorView);
00567
00568 int newId = addObjectController(connectorcontroller);
00569
00570 connectorcontroller->setManualContourController(manContourControl);
00571 connectorModel->setManualContourModel(manContourModel);
00572 connectorView->setManualContourView(manContourView);
00573 connectorView->setModel(connectorModel);
00574 connectorView->setBaseView(_baseView);
00575
00576 connectorModel->addObserver(connectorView);
00577 connectorModel->addObserver(this);
00578
00579 manContourView->Refresh();
00580 return newId;
00581 }
00582
00583
00584
00585 void wxVtkSceneManager::registerController(InteractorStyleMaracas *param) {
00586 vtkInteractorStyleBaseView
00587 * baseViewControlManager =
00588 (vtkInteractorStyleBaseView*) _baseView->GetInteractorStyleBaseView();
00589 baseViewControlManager->AddInteractorStyleMaracas(param);
00590 }
00591
00592
00593
00594 void wxVtkSceneManager::unregisterController(InteractorStyleMaracas *param) {
00595 vtkInteractorStyleBaseView
00596 * baseViewControlManager =
00597 (vtkInteractorStyleBaseView*) _baseView->GetInteractorStyleBaseView();
00598 baseViewControlManager->RemoveInteractorStyleMaracas(param);
00599 }
00600
00601
00602
00603 vtkRenderer* wxVtkSceneManager::getRenderer() {
00604 return _baseView->GetRenderer();
00605 }
00606
00607
00608
00609 vtkRenderWindow* wxVtkSceneManager::getRenderWindow() {
00610 return _baseView->GetRenWin();
00611 }
00612
00613
00614
00615
00616 int wxVtkSceneManager::GetIndexInSelected(int idControler) {
00617 int index = -1;
00618 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
00619 if (_selectedObjects[i] == idControler) {
00620 index = i;
00621 break;
00622 }
00623 }
00624 return index;
00625 }
00626
00627
00628 void wxVtkSceneManager::update(int idController, int command) {
00629
00630 if (command != NO_COMMAND) {
00631 if (command == ADD_TO_SELECTED) {
00632
00633
00634 if (GetIndexInSelected(idController) == -1) {
00635 _selectedObjects.push_back(idController);
00636 }
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652 } else if (command == REMOVE_FROM_SELECTED) {
00653 int index = GetIndexInSelected(idController);
00654 if (index >= 0) {
00655 _selectedObjects.erase(_selectedObjects.begin() + index);
00656 }
00657 } else if (command == INIT_CREATION_CONTOUR) {
00658
00659
00660 typedef std::map<int , GObjectController*>::iterator TIterator ;
00661 TIterator iter ;
00662 TIterator iter_end ;
00663
00664 iter = _controllers.find( idController ) ;
00665 iter_end = _controllers.end( ) ;
00666
00667 if ( iter != iter_end ) {
00668 GObjectController* gobjc = iter->second ;
00669
00670 std::string bbtkType = gobjc->getModel( )->getBBTKType( ) ;
00671
00672 if ( gobjc->getModel( )->getGObjectType( ) == GPORT ) {
00673 TIterator c_it = _controllers.begin( ) ;
00674
00675 for ( c_it ; c_it != iter_end ; c_it++ ) {
00676 GObjectController* obc = c_it->second ;
00677 int obc_type = obc->getModel( )->getGObjectType( ) ;
00678 std::string obc_bbtkType = obc->getModel( )->getBBTKType( ) ;
00679
00680 if ( ( obc_type == GPORT ) && ( obc_bbtkType == bbtkType ) ) {
00681
00682 obc->getView( )->setState( POSSIBLE_CONNECTION ) ;
00683
00684 }
00685 }
00686 }
00687 }
00688
00689
00690
00691 _worldState = INIT_CREATION_CONTOUR;
00692 GObjectController* cont = _controllers[idController];
00693 GPortModel* startOutputPort = (GPortModel*) cont->getModel();
00694
00695
00696 std::map<int, GObjectController*>::iterator it2;
00697
00698 for (it2 = _controllers.begin(); it2 != _controllers.end(); ++it2) {
00699 GObjectController *cont = it2->second;
00700 if (cont->getGObjectType() == GPORT) {
00701 GPortModel* port = (GPortModel*) cont->getModel();
00702 if (port->getPortType() == GINPUTPORT) {
00703 cont->SetActive(true);
00704 } else {
00705 cont->getView()->setState(NOTHING_HAPPENS);
00706 cont->getModel()->notifyObservers(_idManager);
00707 cont->SetActive(false);
00708 }
00709 } else {
00710 cont->getView()->setState(NOTHING_HAPPENS);
00711 cont->getModel()->notifyObservers(_idManager);
00712 cont->SetActive(false);
00713 }
00714 }
00715 _selectedObjects.clear();
00716 _idConnectionInCreation = createGConnector(startOutputPort);
00717 } else if (command == FIN_CREATION_CONTOUR && _worldState
00718 == INIT_CREATION_CONTOUR) {
00719 _worldState = NOTHING_HAPPENS;
00720
00721 GObjectController *cont = _controllers[_idConnectionInCreation];
00722 GConnectorModel *modelContour = (GConnectorModel*) cont->getModel();
00723 GObjectController *finPort = _controllers[idController];
00724
00725 if (finPort->getGObjectType() == GPORT) {
00726 GPortModel* modelPort = (GPortModel*) finPort->getModel();
00727 modelContour->setEndPort(modelPort);
00728
00729
00730 typedef std::map<int, GObjectController*>::iterator TIterator;
00731 TIterator c_it = _controllers.begin();
00732 TIterator iter_end = _controllers.end();
00733
00734 for (c_it; c_it != iter_end; c_it++) {
00735 GObjectController* obc = c_it->second;
00736 int obc_type = obc->getModel()->getGObjectType();
00737 int obc_state = obc->getView()->getState();
00738
00739 if ((obc_type == GPORT) && (obc_state == POSSIBLE_CONNECTION)) {
00740
00741 obc->getView()->setState(NOTHING_HAPPENS);
00742 }
00743 if ((obc_type == GPORT) && (obc_state == SELECTED_POSSIBLE_CONNECTION)) {
00744
00745 obc->getView()->setState(HIGHLIGHTED);
00746
00747 }
00748
00749 }
00750
00751
00752 _parent->saveTempandUpdate("create connection");
00753 }
00754
00755 manualConnectorContourController
00756 * manCont =
00757 ((GConnectorController*) cont)->getManualContourController();
00758 manualConnectorContourView
00759 * connView =
00760 (manualConnectorContourView*) manCont->GetManualViewBaseContour();
00761
00762 std::map<int, GObjectController*>::iterator it2;
00763
00764 for (it2 = _controllers.begin(); it2 != _controllers.end(); ++it2) {
00765 GObjectController *cont = it2->second;
00766 if (cont->getView() != NULL) {
00767 cont->getView()->setState(NOTHING_HAPPENS);
00768 cont->getModel()->notifyObservers(_idManager);
00769 }
00770 cont->SetActive(true);
00771 }
00772 connView->Refresh();
00773 }
00774
00775 }
00776
00777 }
00778
00779
00780
00781 bool wxVtkSceneManager::OnMouseMove() {
00782 int X, Y;
00783 bool okStatusMessage = false;
00784 bool okPortMessage = false;
00785 wxVTKRenderWindowInteractor *wxVTKiren;
00786 wxVTKiren
00787 = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetWxVTKRenderWindowInteractor();
00788 wxVTKiren->GetEventPosition(X, Y);
00789
00790 if (_worldState == DRAG_OBJECTS) {
00791 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
00792 int id = _selectedObjects[i];
00793 GObjectController* cont = _controllers[id];
00794 if (_startDragging) {
00795 cont->getView()->setStartDragging(true);
00796 }
00797 cont->getView()->moveObject(X, Y);
00798 cont->getView()->setState(DRAG);
00799 cont->getModel()->notifyObservers(_idManager);
00800 }
00801
00802 std::map<int, GObjectController*>::iterator it;
00803
00804 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
00805 GObjectController *desc = it->second;
00806 if (desc->getGObjectType() == GCONNECTOR) {
00807 vtkGConnectorView* vconn = (vtkGConnectorView*) desc->getView();
00808 vconn->updateStartEndPoints();
00809 }
00810 }
00811
00812 _startDragging = false;
00813
00814 } else if (_worldState == NOTHING_HAPPENS || _worldState
00815 == INIT_CREATION_CONTOUR) {
00816 std::map<int, GObjectController*>::iterator it;
00817 double px, py, pz;
00818 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
00819 GObjectController *desc = it->second;
00820 int type = desc->getGObjectType();
00821 int state = desc->getView()->getState();
00822 desc->getModel()->getCenter(px, py, pz);
00823
00824
00825 if ((state == HIGHLIGHTED) || (state == SELECTED_POSSIBLE_CONNECTION )) {
00826
00827 okStatusMessage = true;
00828 updateStatusBar(desc->getStatusText());
00829 if (type == GBLACKBOX) {
00830 GBlackBoxModel *mod = (GBlackBoxModel*) desc->getModel();
00831 _parent->displayBlackBoxInfo(mod->getBBTKPackage(),
00832 mod->getBBTKType());
00833 }
00834 if (type == GPORT) {
00835
00836 okPortMessage = true;
00837 py = py + 5;
00838 _textActor->SetInput(desc->getStatusText().c_str());
00839 _textActor->SetScale(0.1);
00840 _textActor->SetPosition(px - 25, py + 1, pz + 2);
00841
00842
00843 px = px - 33;
00844 py = py;
00845 _fillObjectActor->SetScale(1);
00846 _fillObjectActor->GetProperty()->SetOpacity(0.50);
00847 _fillObjectActor->SetPosition(px, py, 1);
00848 _aPolygonMapper->Modified();
00849 }
00850
00851 }
00852 }
00853 }
00854 if (okStatusMessage == false) {
00855 updateStatusBar("");
00856 }
00857
00858 if (okPortMessage == false) {
00859 _textActor->SetScale(0.0001);
00860 _fillObjectActor->SetScale(0.0001);
00861 }
00862 return true;
00863 }
00864
00865
00866
00867 bool wxVtkSceneManager::OnLeftButtonDown() {
00868
00869 if (_worldState == INIT_CREATION_CONTOUR) {
00870 bool isOverPort = false;
00871 std::map<int, GObjectController*>::iterator it;
00872 for (it = _controllers.begin(); it != _controllers.end() && isOverPort
00873 == false; ++it) {
00874 GObjectController *desc = it->second;
00875 if (desc->getGObjectType() == GPORT) {
00876 GPortModel *portmod = (GPortModel*) desc->getModel();
00877 vtkGObjectView *portView = desc->getView();
00878 if (portmod->getPortType() == GINPUTPORT
00879 && portView->getState() == HIGHLIGHTED) {
00880 isOverPort = true;
00881 }
00882
00883 if ( portmod->getPortType( ) == GINPUTPORT && portView->getState( ) == SELECTED_POSSIBLE_CONNECTION ) {
00884 isOverPort = true ;
00885 portView->setState( HIGHLIGHTED);
00886 }
00887
00888
00889 }
00890 }
00891
00892 if (isOverPort == false) {
00893 CancelConnection();
00894 UnSelectBlackBoxes();
00895 }
00896
00897
00898 } else {
00899
00900 _worldState = DRAG_OBJECTS;
00901 _startDragging = true;
00902
00903 int shiftkey =
00904 _vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey();
00905 int ctrlkey =
00906 _vtkInteractorStyleBaseView->GetInteractor()->GetControlKey();
00907 ctrlkey = ctrlkey + shiftkey;
00908
00909 GObjectController *cont = GetGBlackBoxControlerPointedByMouse();
00910
00911 if (GetGBlackBoxControlerPointedByMouse() != NULL) {
00912 int state = cont->getView()->getState();
00913 if ((ctrlkey == 0) && (state == HIGHLIGHTED)) {
00914 UnSelectBlackBoxes();
00915 }
00916 }
00917 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
00918 int id = _selectedObjects[i];
00919 GObjectController* cont = _controllers[id];
00920 cont->getView()->setState(DRAG);
00921 cont->getModel()->notifyObservers(_idManager);
00922 }
00923
00924 }
00925
00926
00927 return true;
00928 }
00929
00930
00931
00932 bool wxVtkSceneManager::OnLeftButtonUp() {
00933 if (_worldState == DRAG_OBJECTS) {
00934 _worldState = NOTHING_HAPPENS;
00935
00936 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
00937 int id = _selectedObjects[i];
00938 GObjectController* cont = _controllers[id];
00939 cont->getView()->setState(SELECTED);
00940 cont->getModel()->notifyObservers(_idManager);
00941 }
00942 }
00943 return true;
00944 }
00945
00946
00947 void wxVtkSceneManager::CancelConnection() {
00948 if (_worldState == INIT_CREATION_CONTOUR) {
00949 _worldState = NOTHING_HAPPENS;
00950
00951
00952 GConnectorController *connector =
00953 (GConnectorController*) _controllers[_idConnectionInCreation];
00954 connector->removeFromScene();
00955 unregisterController(connector);
00956 _controllers.erase(_idConnectionInCreation);
00957
00958 std::map<int, GObjectController*>::iterator it;
00959 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
00960 GObjectController *desc = it->second;
00961 desc->SetActive(true);
00962 desc->getView()->setState(NOTHING_HAPPENS);
00963 desc->getModel()->notifyObservers(_idManager);
00964 }
00965 }
00966 }
00967
00968
00969
00970 bool wxVtkSceneManager::OnRightButtonUp() {
00971 if (_worldState == INIT_CREATION_CONTOUR) {
00972 CancelConnection();
00973 }
00974 UnSelectBlackBoxes();
00975 return true;
00976 }
00977
00979
00980 bool wxVtkSceneManager::OnMiddleButtonDown() {
00981
00982
00983 this->_vtkInteractorStyleBaseView->StartPan();
00984
00985 return true;
00986 }
00987
00988 bool wxVtkSceneManager::OnMiddleButtonUp() {
00989
00990
00991 this->_vtkInteractorStyleBaseView->EndPan();
00992
00993
00994 return true;
00995 }
00996
00997
00998
00999
01000 GObjectController *wxVtkSceneManager::GetGBlackBoxControlerPointedByMouse() {
01001 GObjectController *result = NULL;
01002 int X, Y;
01003 wxVTKRenderWindowInteractor *wxVTKiren;
01004 wxVTKiren
01005 = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetWxVTKRenderWindowInteractor();
01006 wxVTKiren->GetEventPosition(X, Y);
01007
01008 std::map<int, GObjectController*>::iterator it;
01009
01010 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
01011 GObjectController *cont = it->second;
01012 int type = cont->getGObjectType();
01013
01014 if (cont->getView()->isPointInside(X, Y) == true) {
01015 if (type == GBLACKBOX) {
01016 result = cont;
01017 }
01018 }
01019 }
01020 return result;
01021 }
01022
01023
01024 void wxVtkSceneManager::UnSelectBlackBoxes() {
01025 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
01026 int id = _selectedObjects[i];
01027 GObjectController* control = _controllers[id];
01028 control->getView()->setState(NOTHING_HAPPENS);
01029 control->getModel()->notifyObservers(_idManager);
01030 }
01031 _selectedObjects.clear();
01032 }
01033
01034
01035 bool wxVtkSceneManager::OnLeftDClick() {
01036 GObjectController *cont = GetGBlackBoxControlerPointedByMouse();
01037 if (cont != NULL) {
01038 UnSelectBlackBoxes();
01039 _parent->editBlackBox((GBlackBoxModel*) cont->getModel());
01040 }
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082 return true;
01083 }
01084
01085
01086
01087 bool wxVtkSceneManager::OnChar() {
01088 char keyCode = _vtkInteractorStyleBaseView->GetInteractor()-> GetKeyCode();
01089 int ctrlkey = _vtkInteractorStyleBaseView->GetInteractor()->GetControlKey();
01090
01091
01092
01093 if (keyCode == 8 || keyCode == 127) {
01094 if (_selectedObjects.size() > 0) {
01095 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
01096 int id = _selectedObjects[i];
01097 std::map<int, GObjectController*>::iterator it;
01098 it = _controllers.find(id);
01099 if (it != _controllers.end()) {
01100 deleteObject(id);
01101 }
01102 }
01103 _selectedObjects.clear();
01104 }
01105 }
01106 ctrlkey+=keyCode;
01108 if(ctrlkey==5){
01109 if(_selectedObjects.size()){
01110 std::cout<<"objects to copy :";
01111 for(int i=0;i<_selectedObjects.size();i++){
01112 std::cout<<_selectedObjects.at(i)<<" ";
01113 }
01114 DuplicateObjects(getSelectedObjects());
01115 }else{
01116 std::cout<<"No objects to copy\n";
01117 }
01118 }
01119
01120 return true;
01121 }
01122
01123
01124
01125 void wxVtkSceneManager::AddControlerToBeRemove(
01126 std::vector<int> *controllersToRemove, int id) {
01127
01128 int i;
01129 bool ok = true;
01130 for (i = 0; i < (int) controllersToRemove->size(); i++) {
01131 if (id == (*controllersToRemove)[i]) {
01132 ok = false;
01133 }
01134 }
01135
01136 if (ok == true) {
01137 controllersToRemove->push_back(id);
01138 }
01139
01140 }
01141
01142
01143
01144 void wxVtkSceneManager::deleteObject(int id) {
01145 GObjectController *control = _controllers[id];
01146 std::vector<int> controllersToRemove;
01147
01148 if (control->getGObjectType() == GBLACKBOX || control->getGObjectType()
01149 == GCOMPLEXINPUTPORT || control->getGObjectType()
01150 == GCOMPLEXOUTPUTPORT) {
01151 GBoxModel *bbmod = (GBoxModel*) control->getModel();
01152 std::vector<GPortModel*> inputs = bbmod->getInputPorts();
01153
01154 bool boxConnected = false;
01155
01156
01157 for (int i = 0; i < (int) inputs.size(); i++) {
01158 AddControlerToBeRemove(&controllersToRemove,
01159 inputs[i]->getObjectId());
01160 if (inputs[i]->isConnected()) {
01161 boxConnected = true;
01162 }
01163 }
01164
01165 std::vector<GPortModel*> outputs = bbmod->getOutputPorts();
01166
01167
01168 for (int i = 0; i < (int) outputs.size(); i++) {
01169 AddControlerToBeRemove(&controllersToRemove,
01170 outputs[i]->getObjectId());
01171 if (outputs[i]->isConnected()) {
01172 boxConnected = true;
01173 }
01174 }
01175
01176
01177 std::map<int, GObjectController*>::iterator it;
01178 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
01179 GObjectController *cont = it->second;
01180 int type = cont->getGObjectType();
01181 if (type == GCONNECTOR) {
01182 GConnectorModel *conMod = (GConnectorModel*) cont->getModel();
01183 if (conMod->getStartPort() != NULL
01184 && conMod->getStartPort()->getParentBox()->getObjectId()
01185 == bbmod->getObjectId()) {
01186 AddControlerToBeRemove(&controllersToRemove,
01187 conMod->getObjectId());
01188 }
01189 if (conMod->getEndPort() != NULL
01190 && conMod->getEndPort()->getParentBox()->getObjectId()
01191 == bbmod->getObjectId()) {
01192 AddControlerToBeRemove(&controllersToRemove,
01193 conMod->getObjectId());
01194 }
01195 }
01196 }
01197
01198
01199 AddControlerToBeRemove(&controllersToRemove, bbmod->getObjectId());
01200 } else if (control->getGObjectType() == GCONNECTOR) {
01201 GConnectorModel *conMod = (GConnectorModel*) control->getModel();
01202 AddControlerToBeRemove(&controllersToRemove, conMod->getObjectId());
01203 }
01204
01205 std::map<int, GObjectController*>::iterator it;
01206
01207 for (int i = 0; i < (int) controllersToRemove.size(); i++) {
01208 int key = controllersToRemove[i];
01209 it = _controllers.find(key);
01210 GObjectController *cont = _controllers[key];
01211 if (cont != NULL) {
01212 cont->removeFromScene();
01213 unregisterController((InteractorStyleMaracas*) cont);
01214 _controllers.erase(it);
01215 }
01216 }
01217 _parent->saveTempandUpdate("delete object");
01218 }
01219
01220
01221
01222 void wxVtkSceneManager::displayBlackBoxInfo(std::string packageName,
01223 std::string boxName) {
01224 _parent->displayBlackBoxInfo(packageName, boxName);
01225 }
01226
01227
01228
01229 void wxVtkSceneManager::updateStatusBar(std::string textStatus) {
01230 _parent->updateStatusBar(textStatus);
01231 }
01232
01233
01234 std::string wxVtkSceneManager::LineNumber(bool withLineNumber, int &value) {
01235 std::string result = "";
01236 if (withLineNumber == true) {
01237 value++;
01238 stringstream StrStream;
01239 StrStream << value;
01240 std::string strValue = StrStream.str();
01241 if (value < 10) {
01242 result += " ";
01243 } else if (value < 100) {
01244 result += " ";
01245 }
01246
01247 result += strValue + ": ";
01248 }
01249 return result;
01250 }
01251
01252
01253 bool wxVtkSceneManager::MakeBoxExecutable() {
01254 std::map<int, GObjectController*> selected = getSelectedObjects();
01255 if( selected.empty() )
01256 return false;
01257 bool ret = false;
01258 std::map<int, GObjectController*>::iterator it;
01259 for (it = selected.begin(); it != selected.end(); ++it) {
01260 GObjectController* lastSelected = it->second;
01261 if (lastSelected) {
01262 vtkGObjectView* view = (vtkGObjectView*) lastSelected->getView();
01263 GBlackBoxModel *bbmodel =
01264 (GBlackBoxModel*) lastSelected->getModel();
01265 view->setState(HIGHLIGHTED);
01266 if (bbmodel->isExecutable()) {
01267 bbmodel->setExecutable(false);
01268 } else {
01269 bbmodel->setExecutable(true);
01270 }
01271 bbmodel->notifyObservers(lastSelected->getId());
01272 ret = true;
01273 }
01274 }
01275 return ret;
01276 }
01277
01278
01279
01280
01281 std::string wxVtkSceneManager::getDiagramBBS(bool wln) {
01282 bool existsExec = false;
01283
01284 std::vector<std::string> packages;
01285 std::vector<int> boxes;
01286 std::vector<int> connections;
01287 std::vector<int> execBoxes;
01288
01289 std::map<int, GObjectController*>::iterator it;
01290
01291 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
01292 GObjectController *desc = it->second;
01293 int type = desc->getGObjectType();
01294
01295 if (type == GBLACKBOX) {
01296 GBlackBoxModel *mod = (GBlackBoxModel*) desc->getModel();
01297
01298 std::string pkg = mod->getBBTKPackage();
01299 bool existsPkg = false;
01300 for (int t = 0; t < (int) packages.size() && existsPkg == false; t++) {
01301 if (packages[t] == pkg) {
01302 existsPkg = true;
01303 }
01304 }
01305 if (!existsPkg) {
01306 packages.push_back(pkg);
01307 }
01308
01309 boxes.push_back(it->first);
01310 if (mod->isExecutable()) {
01311 execBoxes.push_back(it->first);
01312 existsExec = true;
01313 }
01314 } else if (type == GCONNECTOR) {
01315 connections.push_back(it->first);
01316 }
01317 }
01318
01319 int lnNmbr = 0;
01320 std::string script = "";
01321 script += LineNumber(wln, lnNmbr) + "# BBTK GEditor Script\n";
01322 script += LineNumber(wln, lnNmbr) + "# ----------------------\n";
01323 script += LineNumber(wln, lnNmbr) + "\n";
01324 if (existsExec) {
01325 script += LineNumber(wln, lnNmbr) + "include std\n";
01326 script += LineNumber(wln, lnNmbr) + "include itkvtk\n";
01327 int i;
01328 for (i = 0; i < (int) packages.size(); i++) {
01329 script += LineNumber(wln, lnNmbr);
01330 script += "include ";
01331 script += packages[i];
01332 script += "\n";
01333 }
01334
01335 script += LineNumber(wln, lnNmbr);
01336 script += "\n";
01337
01338
01339
01340 script += LineNumber(wln, lnNmbr);
01341 script += "author \"";
01342 script += _Author;
01343 script += "\"\n";
01344
01345 script += LineNumber(wln, lnNmbr);
01346 script += "description \"";
01347 script += _Description;
01348 script += "\"\n";
01349
01350 script += LineNumber(wln, lnNmbr);
01351 script += "category \"";
01352 script += _Category;
01353 script += "\"\n";
01354
01355 script += LineNumber(wln, lnNmbr);
01356 script += "\n";
01357
01358
01359
01360 for (i = 0; i < (int) boxes.size(); i++) {
01361 script += LineNumber(wln, lnNmbr);
01362 script += "new ";
01363 int id = boxes[i];
01364 GObjectController *control = _controllers[id];
01365 GBlackBoxModel *model = (GBlackBoxModel*) control->getModel();
01366
01367 script += model->getBBTKType();
01368 script += " ";
01369 script += model->getBBTKName();
01370 script += "\n";
01371
01372 std::vector<GPortModel*> inputs = model->getInputPorts();
01373 for (int j = 0; j < (int) inputs.size(); j++) {
01374 GPortModel* inputPort = inputs[j];
01375 if (inputPort->isValueSet()) {
01376 script += LineNumber(wln, lnNmbr);
01377 script += " set ";
01378 script += model->getBBTKName();
01379 script += ".";
01380 script += inputPort->getBBTKName();
01381 script += " ";
01382 script += inputPort->getValue();
01383 script += "\n";
01384 }
01385 }
01386
01387 script += LineNumber(wln, lnNmbr);
01388 script += "\n";
01389
01390 }
01391
01392 script += LineNumber(wln, lnNmbr);
01393 script += "\n";
01394
01395 for (i = 0; i < (int) connections.size(); i++) {
01396 script += LineNumber(wln, lnNmbr);
01397 script += "connect ";
01398 int id = connections[i];
01399 GObjectController *control = _controllers[id];
01400 GConnectorModel *model = (GConnectorModel*) control->getModel();
01401
01402
01403 GPortModel *start = model->getStartPort();
01404 script += start->getParentBox()->getBBTKName();
01405 script += ".";
01406 script += start->getBBTKName();
01407
01408 script += " ";
01409
01410
01411 GPortModel *end = model->getEndPort();
01412 script += end->getParentBox()->getBBTKName();
01413 script += ".";
01414 script += end->getBBTKName();
01415
01416 script += "\n";
01417 }
01418
01419 script += LineNumber(wln, lnNmbr);
01420 script += "\n";
01421 for (i = 0; i < (int) execBoxes.size(); i++) {
01422 script += LineNumber(wln, lnNmbr);
01423 script += "exec ";
01424 int id = execBoxes[i];
01425 GObjectController *control = _controllers[id];
01426 GBlackBoxModel *model = (GBlackBoxModel*) control->getModel();
01427
01428 script += model->getBBTKName();
01429 script += "\n";
01430 }
01431
01432 }
01433
01434 return script;
01435 }
01436
01437
01438
01439 std::string wxVtkSceneManager::saveComplexBoxBBS() {
01440 std::vector<std::string> packages;
01441 std::vector<int> boxes;
01442 std::vector<int> connections;
01443 std::vector<int> execBoxes;
01444
01445 std::map<int, GObjectController*>::iterator it;
01446
01447 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
01448 GObjectController *desc = it->second;
01449 int type = desc->getGObjectType();
01450
01451 if (type == GBLACKBOX) {
01452 GBlackBoxModel *mod = (GBlackBoxModel*) desc->getModel();
01453
01454 std::string pkg = mod->getBBTKPackage();
01455 bool existsPkg = false;
01456 for (int t = 0; t < (int) packages.size() && existsPkg == false; t++) {
01457 if (packages[t] == pkg) {
01458 existsPkg = true;
01459 }
01460 }
01461 if (!existsPkg) {
01462 packages.push_back(pkg);
01463 }
01464
01465 boxes.push_back(it->first);
01466 if (mod->isExecutable()) {
01467 execBoxes.push_back(it->first);
01468 }
01469 } else if (type == GCONNECTOR) {
01470 connections.push_back(it->first);
01471 }
01472 }
01473
01474 std::string script = "";
01475
01476 script += "include std\n";
01477 script += "include itkvtk\n";
01478 int i;
01479 for (i = 0; i < (int) packages.size(); i++) {
01480 script += "include ";
01481 script += packages[i];
01482 script += "\n";
01483 }
01484 script += "\n";
01485
01486
01487 script += "define ";
01488 script += _cbName + " " + _cbPackageName;
01489 script += "\n";
01490 script += "\n";
01491
01492 script += "author \"";
01493 script += _Author;
01494 script += "\"\n";
01495
01496 script += "description \"";
01497 script += _Description;
01498 script += "\"\n";
01499 script += "\n";
01500
01501 script += "category \"";
01502 script += _Category;
01503 script += "\"\n";
01504 script += "\n";
01505
01506
01507 for (i = 0; i < (int) boxes.size(); i++) {
01508 script += "new ";
01509 int id = boxes[i];
01510 GObjectController *control = _controllers[id];
01511 GBlackBoxModel *model = (GBlackBoxModel*) control->getModel();
01512
01513 script += model->getBBTKType();
01514 script += " ";
01515 script += model->getBBTKName();
01516 script += "\n";
01517
01518 std::vector<GPortModel*> inputs = model->getInputPorts();
01519 for (int j = 0; j < (int) inputs.size(); j++) {
01520 GPortModel* inputPort = inputs[j];
01521 if (inputPort->isValueSet()) {
01522 script += " set ";
01523 script += model->getBBTKName();
01524 script += ".";
01525 script += inputPort->getBBTKName();
01526 script += " ";
01527 script += inputPort->getValue();
01528 script += "\n";
01529 }
01530 }
01531 script += "\n";
01532
01533 }
01534
01535
01536
01537 std::string complexInputs = "";
01538 std::string complexOutputs = "";
01539 script += "\n";
01540
01541 for (i = 0; i < (int) connections.size(); i++) {
01542 int id = connections[i];
01543 GObjectController *control = _controllers[id];
01544 GConnectorModel *model = (GConnectorModel*) control->getModel();
01545
01546
01547 GPortModel *start = model->getStartPort();
01548 GBoxModel *startBox = start->getParentBox();
01549
01550 GPortModel *end = model->getEndPort();
01551 GBoxModel *endBox = end->getParentBox();
01552
01553 if (startBox->getGObjectType() == GCOMPLEXINPUTPORT) {
01554 complexInputs += "input ";
01555 complexInputs += startBox->getBBTKName();
01556
01557 complexInputs += " ";
01558 complexInputs += endBox->getBBTKName();
01559 complexInputs += ".";
01560 complexInputs += end->getBBTKName();
01561
01562 complexInputs += " ";
01563 complexInputs += "\" \"";
01564
01565 complexInputs += "\n";
01566 } else if (endBox->getGObjectType() == GCOMPLEXOUTPUTPORT) {
01567 complexOutputs += "output ";
01568 complexOutputs += endBox->getBBTKName();
01569
01570 complexOutputs += " ";
01571 complexOutputs += startBox->getBBTKName();
01572 complexOutputs += ".";
01573 complexOutputs += start->getBBTKName();
01574
01575 complexOutputs += " ";
01576 complexOutputs += "\" \"";
01577
01578 complexOutputs += "\n";
01579 } else {
01580 script += "connect ";
01581 script += startBox->getBBTKName();
01582 script += ".";
01583 script += start->getBBTKName();
01584
01585 script += " ";
01586
01587
01588 script += endBox->getBBTKName();
01589 script += ".";
01590 script += end->getBBTKName();
01591
01592 script += "\n";
01593 }
01594 }
01595
01596 script += "\n";
01597
01598 for (i = 0; i < (int) execBoxes.size(); i++) {
01599 script += "exec ";
01600 int id = execBoxes[i];
01601 GObjectController *control = _controllers[id];
01602 GBlackBoxModel *model = (GBlackBoxModel*) control->getModel();
01603
01604 script += model->getBBTKName();
01605 script += "\n";
01606 }
01607
01608 script += "\n";
01609 script += "# Complex input ports\n";
01610 script += complexInputs;
01611
01612 script += "\n";
01613 script += "# Complex output ports\n";
01614 script += complexOutputs;
01615
01616 script += "\n";
01617 script += "endefine";
01618 script += "\n";
01619
01620 return script;
01621 }
01622
01623
01624
01625 void wxVtkSceneManager::deleteAllBoxes() {
01626 std::map<int, GObjectController*>::iterator it;
01627 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
01628 GObjectController *cont = it->second;
01629 cont->removeFromScene();
01630 unregisterController((InteractorStyleMaracas*) cont);
01631 }
01632 _selectedObjects.clear();
01633 _controllers.clear();
01634 }
01635
01636
01637
01638
01639 void wxVtkSceneManager::refresh() {
01640 _baseView->Refresh();
01641 }
01642
01643
01644 void wxVtkSceneManager::refreshScene() {
01645 _baseView->RefreshView();
01646 }
01647
01648
01649
01650 void wxVtkSceneManager::centerView() {
01651 double temp[3];
01652 _baseView->GetRenderer()->GetActiveCamera()->GetFocalPoint(temp);
01653 _baseView->GetRenderer()->GetActiveCamera()->SetFocalPoint(0, 0, temp[2]);
01654 _baseView->GetRenderer()->GetActiveCamera()->GetPosition(temp);
01655 _baseView->GetRenderer()->GetActiveCamera()->SetPosition(0, 0, temp[2]);
01656 }
01657
01658
01659
01660 void wxVtkSceneManager::saveDiagram(std::string &content) {
01661 char buffer[50];
01662
01663 content += "CATEGORY:";
01664 content += GetCategory();
01665 content += "\n";
01666
01667 content += "DESCRIPTION:";
01668 content += GetDescription();
01669 content += "\n";
01670
01671 content += "AUTHOR:";
01672 content += GetAuthor();
01673 content += "\n";
01674
01675
01676 content += "COMPLEXBOX:";
01677 if (_isComplexBox) {
01678 content += "TRUE\n";
01679
01680 content += "COMPLEXBOXNAME:";
01681 content += GetCbName();
01682 content += "\n";
01683
01684 content += "PACKAGENAME:";
01685 content += GetCbPackageName();
01686 content += "\n";
01687
01688
01689 std::vector<int> inputs = getComplexInputPorts();
01690 int insize = inputs.size();
01691 content += "COMPLEXINPUTS:";
01692 sprintf(buffer, "%d", insize);
01693 content += buffer;
01694 content += "\n";
01695
01696 for (int i = 0; i < insize; i++) {
01697 int id = inputs[i];
01698 GObjectController *cont = _controllers[id];
01699 cont->getModel()->save(content);
01700 }
01701
01702
01703 std::vector<int> outputs = getComplexOutputPorts();
01704 int outsize = outputs.size();
01705 content += "COMPLEXOUTPUTS:";
01706 sprintf(buffer, "%d", outsize);
01707 content += buffer;
01708 content += "\n";
01709
01710 for (int i = 0; i < outsize; i++) {
01711 int id = outputs[i];
01712 GObjectController *cont = _controllers[id];
01713 cont->getModel()->save(content);
01714 }
01715 }
01716 else {
01717 content += "FALSE\n";
01718 }
01719
01720
01721 std::vector<int> boxes = getBlackBoxes();
01722 int bsize = boxes.size();
01723 content += "BOXES:";
01724 sprintf(buffer, "%d", bsize);
01725 content += buffer;
01726 content += "\n";
01727
01728 for (int i = 0; i < bsize; i++) {
01729 int id = boxes[i];
01730 GObjectController *cont = _controllers[id];
01731 cont->getModel()->save(content);
01732 }
01733
01734
01735 std::vector<int> connections = getConnections();
01736 int csize = connections.size();
01737 content += "CONNECTIONS:";
01738 sprintf(buffer, "%d", csize);
01739 content += buffer;
01740 content += "\n";
01741
01742 for (int i = 0; i < csize; i++) {
01743 int id = connections[i];
01744 GObjectController *cont = _controllers[id];
01745 cont->getModel()->save(content);
01746 }
01747
01748 }
01749
01750
01751
01752 void wxVtkSceneManager::loadDiagram(stringstream &inputStream) {
01753
01754 std::string version = "<void>";
01755 std::string line = "";
01756 char delims[] = ":";
01757 char *result = NULL;
01758
01759 getline(inputStream, line);
01760
01761 bool start = false;
01762 while (!inputStream.eof()) {
01763 if (line == "" || line[0] == '#') {
01764 getline(inputStream, line);
01765 if (line == "# - BBTKGEditor v 1.0 BBG BlackBox Diagram file") {
01766 version = line.substr(18, 3);
01767 }
01768 if (line == "# - BBTKGEditor v 1.1 BBG BlackBox Diagram file") {
01769 version = line.substr(18, 3);
01770 }
01771 if (line == "# - BBTKGEditor v 1.2 BBG BlackBox Diagram file") {
01772 version = line.substr(18, 3);
01773 }
01774 } else if (line == "APP_START") {
01775 start = true;
01776 break;
01777 }
01778 }
01779
01780 printf("EED wxVtkSceneManager::loadDiagram version=%s\n", version.c_str());
01781
01782 if (start) {
01783
01784 if ((version != "1.0") && (version != "1.1")) {
01785 getline(inputStream, line);
01786 char categoryTmp[30];
01787 strcpy(categoryTmp, line.c_str());
01788 result = strtok(categoryTmp, delims);
01789 result = strtok(NULL, delims);
01790 SetCategory(result);
01791
01792 getline(inputStream, line);
01793 char descriptionTmp[1024];
01794 strcpy(descriptionTmp, line.c_str());
01795 result = strtok(descriptionTmp, delims);
01796 result = strtok(NULL, delims);
01797 SetDescription(result);
01798
01799 getline(inputStream, line);
01800 char authorTmp[255];
01801 strcpy(authorTmp, line.c_str());
01802 result = strtok(authorTmp, delims);
01803 result = strtok(NULL, delims);
01804 SetAuthor(result);
01805 }
01806
01807
01808 getline(inputStream, line);
01809 char complexTmp[30];
01810 strcpy(complexTmp, line.c_str());
01811 result = strtok(complexTmp, delims);
01812 result = strtok(NULL, delims);
01813 std::string isComplexBox(result);
01814
01815 if (isComplexBox == "TRUE") {
01816 _isComplexBox = true;
01817
01818 if ((version != "1.0") && (version != "1.1")) {
01819 getline(inputStream, line);
01820 char complexboxnameTmp[255];
01821 strcpy(complexboxnameTmp, line.c_str());
01822 result = strtok(complexboxnameTmp, delims);
01823 result = strtok(NULL, delims);
01824 SetCbName(result);
01825
01826 getline(inputStream, line);
01827 char packagenameTmp[255];
01828 strcpy(packagenameTmp, line.c_str());
01829 result = strtok(packagenameTmp, delims);
01830 result = strtok(NULL, delims);
01831 SetCbPackageName(result);
01832 }
01833
01834
01835
01836
01837 getline(inputStream, line);
01838 char inputs[30];
01839 strcpy(inputs, line.c_str());
01840 result = strtok(inputs, delims);
01841 result = strtok(NULL, delims);
01842
01843 int numInputs;
01844 std::istringstream inps(result);
01845 inps >> numInputs;
01846
01847 for (int i = 0; i < numInputs; i++) {
01848
01849 getline(inputStream, line);
01850 getline(inputStream, line);
01851 std::string inputPortName(line);
01852
01853
01854 getline(inputStream, line);
01855 char coord[80];
01856 strcpy(coord, line.c_str());
01857 result = strtok(coord, delims);
01858 std::string xInic(result);
01859 result = strtok(NULL, delims);
01860 std::string yInic(result);
01861 result = strtok(NULL, delims);
01862 std::string zInic(result);
01863
01864 double xIn, yIn, zIn;
01865 std::istringstream xSt(xInic);
01866 xSt >> xIn;
01867 std::istringstream ySt(yInic);
01868 ySt >> yIn;
01869 std::istringstream zSt(zInic);
01870 zSt >> zIn;
01871
01872 getline(inputStream, line);
01873
01874 configGComBoxInputOutputPort(true, inputPortName, xIn, yIn, zIn);
01875
01876 }
01877
01878
01879
01880
01881
01882
01883 getline(inputStream, line);
01884 char outputs[30];
01885 strcpy(outputs, line.c_str());
01886 result = strtok(outputs, delims);
01887 result = strtok(NULL, delims);
01888
01889 int numOutputs;
01890 std::istringstream outps(result);
01891 outps >> numOutputs;
01892
01893 for (int i = 0; i < numOutputs; i++) {
01894
01895 getline(inputStream, line);
01896 getline(inputStream, line);
01897 std::string outputPortName(line);
01898
01899
01900 getline(inputStream, line);
01901 char coord[80];
01902 strcpy(coord, line.c_str());
01903 result = strtok(coord, delims);
01904 std::string xInic(result);
01905 result = strtok(NULL, delims);
01906 std::string yInic(result);
01907 result = strtok(NULL, delims);
01908 std::string zInic(result);
01909
01910 double xIn, yIn, zIn;
01911 std::istringstream xSt(xInic);
01912 xSt >> xIn;
01913 std::istringstream ySt(yInic);
01914 ySt >> yIn;
01915 std::istringstream zSt(zInic);
01916 zSt >> zIn;
01917
01918 getline(inputStream, line);
01919
01920 configGComBoxInputOutputPort(false, outputPortName, xIn, yIn,
01921 zIn);
01922
01923 }
01924
01925 }
01926
01927
01928 getline(inputStream, line);
01929 char boxes[9];
01930 strcpy(boxes, line.c_str());
01931 result = strtok(boxes, delims);
01932 result = strtok(NULL, delims);
01933
01934 int numBoxes;
01935 std::istringstream is(result);
01936 is >> numBoxes;
01937
01938 for (int i = 0; i < numBoxes; i++) {
01939
01940 getline(inputStream, line);
01941 getline(inputStream, line);
01942 char box[150];
01943 strcpy(box, line.c_str());
01944 result = strtok(box, delims);
01945 std::string package(result);
01946 result = strtok(NULL, delims);
01947 std::string type(result);
01948 result = strtok(NULL, delims);
01949 std::string name(result);
01950
01951 getline(inputStream, line);
01952 char exec[15];
01953 strcpy(exec, line.c_str());
01954 result = strtok(exec, delims);
01955 result = strtok(NULL, delims);
01956 std::string isExec(result);
01957
01958
01959 getline(inputStream, line);
01960 char coord[80];
01961 strcpy(coord, line.c_str());
01962 result = strtok(coord, delims);
01963 std::string xInic(result);
01964 result = strtok(NULL, delims);
01965 std::string yInic(result);
01966 result = strtok(NULL, delims);
01967 std::string zInic(result);
01968
01969 double xIn, yIn, zIn;
01970 std::istringstream xSt(xInic);
01971 xSt >> xIn;
01972 std::istringstream ySt(yInic);
01973 ySt >> yIn;
01974 std::istringstream zSt(zInic);
01975 zSt >> zIn;
01976
01977
01978 getline(inputStream, line);
01979 strcpy(coord, line.c_str());
01980 result = strtok(coord, delims);
01981 std::string xEnd(result);
01982 result = strtok(NULL, delims);
01983 std::string yEnd(result);
01984 result = strtok(NULL, delims);
01985 std::string zEnd(result);
01986
01987 double xEn, yEn, zEn;
01988 std::istringstream xEt(xEnd);
01989 xEt >> xEn;
01990 std::istringstream yEt(yEnd);
01991 yEt >> yEn;
01992 std::istringstream zEt(zEnd);
01993 zEt >> zEn;
01994
01995 bool boxExecutable = false;
01996 if (isExec == "TRUE") {
01997 boxExecutable = true;
01998 }
01999
02000 int idBox = createGBlackBox(xIn, yIn, package, type);
02001 configGBlackBox(idBox, xIn, yIn, zIn, name, boxExecutable, xEn,
02002 yEn, zEn);
02003
02004 GObjectController *cont = _controllers[idBox];
02005 GBlackBoxModel *bbmod = (GBlackBoxModel*) cont->getModel();
02006
02007
02008 getline(inputStream, line);
02009 std::string port = line.substr(0, 4);
02010 while (port == "PORT") {
02011 getline(inputStream, line);
02012 char poort[150];
02013 strcpy(poort, line.c_str());
02014 result = strtok(poort, delims);
02015 std::string name(result);
02016 result = strtok(NULL, delims);
02017 std::string value(result);
02018
02019 bbmod->setValueToInput(name, value);
02020
02021 getline(inputStream, line);
02022 port = line.substr(0, 4);
02023 }
02024
02025
02026 }
02027
02029
02030 getline(inputStream, line);
02031 char conns[30];
02032 strcpy(conns, line.c_str());
02033 result = strtok(conns, delims);
02034 result = strtok(NULL, delims);
02035
02036 int numConns;
02037 std::istringstream isCons(result);
02038 isCons >> numConns;
02039
02040 for (int i = 0; i < numConns; i++) {
02041
02042 getline(inputStream, line);
02043 getline(inputStream, line);
02044
02045 char connec[200];
02046 strcpy(connec, line.c_str());
02047 result = strtok(connec, delims);
02048 std::string nameStartBox(result);
02049 result = strtok(NULL, delims);
02050 std::string nameStartPort(result);
02051 result = strtok(NULL, delims);
02052 std::string nameEndBox(result);
02053 result = strtok(NULL, delims);
02054 std::string nameEndPort(result);
02055
02056 int idCon = configGConnetion(nameStartBox, nameStartPort,
02057 nameEndBox, nameEndPort);
02058
02059 if (version != "1.0") {
02060
02061
02062 GConnectorController *tempp =
02063 (GConnectorController*) _controllers[idCon];
02064 GConnectorModel *conMod = (GConnectorModel*) tempp->getModel();
02065 vtkGConnectorView *conView =
02066 (vtkGConnectorView*) tempp->getView();
02067 getline(inputStream, line);
02068 strcpy(conns, line.c_str());
02069 result = strtok(conns, delims);
02070 result = strtok(NULL, delims);
02071
02072 int numberOfControlPoints;
02073 std::istringstream isCons(result);
02074 isCons >> numberOfControlPoints;
02075
02076 for (int ii = 0; ii < numberOfControlPoints; ii++) {
02077 getline(inputStream, line);
02078 char connec[200];
02079 strcpy(connec, line.c_str());
02080
02081 double px, py, pz;
02082 result = strtok(connec, delims);
02083 std::istringstream isPointX(result);
02084 isPointX >> px;
02085 result = strtok(NULL, delims);
02086 std::istringstream isPointY(result);
02087 isPointY >> py;
02088 result = strtok(NULL, delims);
02089 std::istringstream isPointZ(result);
02090 isPointZ >> pz;
02091
02092 conMod->getManualContourModel()->InsertPoint_id(ii + 1, px,
02093 py, pz);
02094 conView->getManualContourView()->AddPoint();
02095 }
02096 }
02097
02098 }
02099
02100 }
02101
02102 }
02103
02104
02105
02106
02107 void wxVtkSceneManager::configGComBoxInputOutputPort(bool inputoutput,
02108 std::string portName, double xIn, double yIn, double zIn) {
02109 int idPort;
02110 if (inputoutput == true) {
02111 idPort = createGComplexBoxInputPort(portName);
02112 } else {
02113 idPort = createGComplexBoxOutputPort(portName);
02114 }
02115 GObjectController *cont = _controllers[idPort];
02116 GBoxModel *cbmod = (GBoxModel*) cont->getModel();
02117 cbmod->setInicPoint(xIn, yIn, zIn);
02118 cbmod->notifyObservers(_idManager);
02119 }
02120
02121
02122
02123
02124 GBoxModel* wxVtkSceneManager::findGBox(std::string boxname) {
02125 int j;
02126 int idB;
02127 GBoxModel *bMod;
02128 GBoxModel *boxModel = NULL;
02129 std::vector<int> lstB = getBlackBoxes();
02130 for (j = 0; j < (int) lstB.size(); j++) {
02131 idB = lstB[j];
02132 bMod = (GBoxModel*) _controllers[idB]->getModel();
02133 if (_controllers[idB]->getModel()->getBBTKName() == boxname) {
02134 boxModel = bMod;
02135 }
02136 }
02137
02138 if ((_isComplexBox) && (boxModel == NULL)) {
02139 std::vector<int> lstInputs = getComplexInputPorts();
02140 for (j = 0; j < (int) lstInputs.size(); j++) {
02141 idB = lstInputs[j];
02142 bMod = (GBoxModel*) _controllers[idB]->getModel();
02143 if (_controllers[idB]->getModel()->getBBTKName() == boxname) {
02144 boxModel = bMod;
02145 }
02146 }
02147
02148 std::vector<int> lstOutputs = getComplexOutputPorts();
02149 for (j = 0; j < (int) lstOutputs.size(); j++) {
02150 int idB = lstOutputs[j];
02151 bMod = (GBoxModel*) _controllers[idB]->getModel();
02152 if (_controllers[idB]->getModel()->getBBTKName() == boxname) {
02153 boxModel = bMod;
02154 }
02155 }
02156
02157 }
02158
02159 return boxModel;
02160 }
02161
02162
02163
02164
02165 int wxVtkSceneManager::configGConnetion(std::string nameStartBox,
02166 std::string nameStartPort, std::string nameEndBox,
02167 std::string nameEndPort) {
02168
02169 GBoxModel *boxModel;
02170 GPortModel *startP = NULL;
02171 GPortModel *endP = NULL;
02172
02173 boxModel = findGBox(nameStartBox);
02174 if (boxModel != NULL) {
02175 startP = boxModel->getOutputPort(nameStartPort);
02176 if(startP == NULL){
02177 printf("SCP: ERROR in wxVtkSceneManager::configGConnetion start port %s is null. Port name is probably wrong.\n", nameStartPort.c_str());
02178 }
02179 }
02180
02181 boxModel = findGBox(nameEndBox);
02182 if (boxModel != NULL) {
02183 endP = boxModel->getInputPort(nameEndPort);
02184 if(endP == NULL){
02185 printf("SCP: ERROR in wxVtkSceneManager::configGConnetion end port %s is null. Port name is probably wrong\n", nameStartPort.c_str(), nameEndPort.c_str());
02186 }
02187 }
02188
02189
02190 int idCon = createGConnector(startP);
02191 _worldState = NOTHING_HAPPENS;
02192 GConnectorController *tempp = (GConnectorController*) _controllers[idCon];
02193
02194 GConnectorModel *conMod = (GConnectorModel*) tempp->getModel();
02195 vtkGConnectorView *conView = (vtkGConnectorView*) tempp->getView();
02196 tempp->endContourCreation();
02197 conMod->setEndPort(endP);
02198 conView->updateStartEndPoints();
02199 return idCon;
02200 }
02201
02202
02203
02204 bool wxVtkSceneManager::boxExist(std::string boxname) {
02205 bool ok = false;
02206 std::map<int, GObjectController*>::iterator it;
02207 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
02208 GObjectController *cont = it->second;
02209 if (cont->getModel()->getBBTKName() == boxname) {
02210 ok = true;
02211 }
02212 }
02213 return ok;
02214 }
02215
02216
02217
02218 std::vector<int> wxVtkSceneManager::getBlackBoxes() {
02219 std::vector<int> vect;
02220 std::map<int, GObjectController*>::iterator it;
02221 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
02222 GObjectController *cont = it->second;
02223 if (cont->getGObjectType() == GBLACKBOX) {
02224 vect.push_back(cont->getId());
02225 }
02226 }
02227 return vect;
02228 }
02229
02230
02231
02232 std::vector<int> wxVtkSceneManager::getComplexInputPorts() {
02233 std::vector<int> vect;
02234 std::map<int, GObjectController*>::iterator it;
02235 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
02236 GObjectController *cont = it->second;
02237 if (cont->getGObjectType() == GCOMPLEXINPUTPORT) {
02238 vect.push_back(cont->getId());
02239 }
02240 }
02241 return vect;
02242 }
02243
02244
02245
02246 std::vector<int> wxVtkSceneManager::getComplexOutputPorts() {
02247 std::vector<int> vect;
02248 std::map<int, GObjectController*>::iterator it;
02249 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
02250 GObjectController *cont = it->second;
02251 if (cont->getGObjectType() == GCOMPLEXOUTPUTPORT) {
02252 vect.push_back(cont->getId());
02253 }
02254 }
02255 return vect;
02256 }
02257
02258
02259
02260 std::vector<int> wxVtkSceneManager::getConnections() {
02261 std::vector<int> vect;
02262 std::map<int, GObjectController*>::iterator it;
02263 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
02264 GObjectController *cont = it->second;
02265 if (cont->getGObjectType() == GCONNECTOR) {
02266 vect.push_back(cont->getId());
02267 }
02268 }
02269 return vect;
02270 }
02271
02272
02273
02274 bool wxVtkSceneManager::isComplexBox() {
02275 return _isComplexBox;
02276 }
02277
02278
02279
02280 void wxVtkSceneManager::setComplexBox(bool val) {
02281 _isComplexBox = val;
02282 }
02283
02284
02285
02286 int wxVtkSceneManager::addObjectController(GObjectController* objController) {
02287
02288 registerController((InteractorStyleMaracas*) objController);
02289
02290 int newId = _contLastId;
02291 objController->setId(newId);
02292 _controllers[newId] = objController;
02293
02294 _contLastId++;
02295 return newId;
02296 }
02297
02298
02299
02300 void wxVtkSceneManager::DuplicateObjects(std::map<int, GObjectController*> objectsMap) {
02301
02302 std::map<int, int> oldIdNewIdBoxes;
02303 std::vector<int> connections;
02304
02305 std::vector<int> newBoxesID;
02306
02307 std::map<int, GObjectController*>::iterator it;
02308 for (it = objectsMap.begin(); it != objectsMap.end(); ++it) {
02309 GObjectController *cont = it->second;
02310 int type = cont->getGObjectType();
02311
02312 if (type == GBLACKBOX) {
02313
02314 double xInic, yInic, zInic;
02315 GBlackBoxModel* copyBox = (GBlackBoxModel*) cont->getModel();
02316 copyBox->getInicPoint(xInic, yInic, zInic);
02317 int idBox = createGBlackBox(0, 0, copyBox->getBBTKPackage(),
02318 copyBox->getBBTKType());
02319
02320 int idcB = copyBox->getObjectId();
02321 oldIdNewIdBoxes[idcB] = idBox;
02322 cont = _controllers[idBox];
02323 GBlackBoxModel* newbox = (GBlackBoxModel*) cont->getModel();
02324 newbox->setInicPoint(xInic, yInic, zInic);
02325 int num = newbox->getNumInputPorts();
02326 for (int j = 0; j < num; j++) {
02327 newbox->setValueToInputPort(j, copyBox->getValueInputPort(j));
02328 }
02329 newbox->move(xInic + 20, yInic + 20, zInic);
02330 newbox->notifyObservers(_idManager);
02331 newBoxesID.push_back(newbox->getObjectId());
02332
02333 } else if (type == GCONNECTOR) {
02334 int idCon = cont->getId();
02335 connections.push_back(idCon);
02336 }
02337
02338 }
02339
02340 for (int i = 0; i < (int) connections.size(); i++) {
02341 int objId = connections[i];
02342 GObjectController *cont = objectsMap[objId];
02343 GConnectorModel* connectModel = (GConnectorModel*) cont->getModel();
02344
02345 GPortModel* startPort = connectModel->getStartPort();
02346 int startPortIndex = startPort->getPosInBox();
02347 GPortModel* endPort = connectModel->getEndPort();
02348 int endPortIndex = endPort->getPosInBox();
02349
02350 GBlackBoxModel* startPortParentBox =
02351 (GBlackBoxModel*) startPort->getParentBox();
02352 GBlackBoxModel* endPortParentBox =
02353 (GBlackBoxModel*) endPort->getParentBox();
02354
02355 int idNewStartBox = oldIdNewIdBoxes[startPortParentBox->getObjectId()];
02356 int idNewEndBox = oldIdNewIdBoxes[endPortParentBox->getObjectId()];
02357
02358 GBlackBoxModel* newStartBox =
02359 (GBlackBoxModel*) _controllers[idNewStartBox]->getModel();
02360 GBlackBoxModel* newEndBox =
02361 (GBlackBoxModel*) _controllers[idNewEndBox]->getModel();
02362
02363 GPortModel* newStartPort = newStartBox->getOutputPort(startPortIndex);
02364 GPortModel* newEndPort = newEndBox->getInputPort(endPortIndex);
02365
02366
02367 int idCon = createGConnector(newStartPort);
02368 GConnectorController *tempp =
02369 (GConnectorController*) _controllers[idCon];
02370 GConnectorModel *conMod = (GConnectorModel*) tempp->getModel();
02371 vtkGConnectorView *conView = (vtkGConnectorView*) tempp->getView();
02372 tempp->endContourCreation();
02373 conMod->setEndPort(newEndPort);
02374 conView->updateStartEndPoints();
02375 }
02376
02378
02379 UnSelectBlackBoxes();
02380 for (int i = 0; i < newBoxesID.size(); i++) {
02381 _selectedObjects.push_back(newBoxesID.at(i));
02382 }
02383
02384 for (int i = 0; i < (int) _selectedObjects.size(); i++) {
02385 int id = _selectedObjects[i];
02386 GObjectController* cont = _controllers[id];
02387
02388 cont->getView()->setState(SELECTED);
02389 cont->getModel()->notifyObservers(_idManager);
02390
02391 }
02392 }
02393
02394
02395
02396
02397 int wxVtkSceneManager::getNumSelectedObjects() {
02398 return _selectedObjects.size();
02399 }
02400
02401
02402
02403 std::map<int, GObjectController*> wxVtkSceneManager::getSelectedObjects() {
02404 std::map<int, GObjectController*> mapSelected;
02405
02406 std::map<int, GObjectController*>::iterator it;
02407 for (it = _controllers.begin(); it != _controllers.end(); ++it) {
02408 GObjectController *cont = it->second;
02409 if (cont->getGObjectType() == GBLACKBOX && cont->getView()->getState()
02410 == SELECTED) {
02411 mapSelected[cont->getId()] = cont;
02412 }
02413 }
02414
02415 std::map<int, GObjectController*>::iterator it2;
02416 for (it2 = _controllers.begin(); it2 != _controllers.end(); ++it2) {
02417 GObjectController *cont = it2->second;
02418 if (cont->getGObjectType() == GCONNECTOR) {
02419 GConnectorModel* cmod = (GConnectorModel*) cont->getModel();
02420 GBoxModel* endPortParentBox = cmod->getEndPort()->getParentBox();
02421 GBoxModel* startPortParentBox =
02422 cmod->getStartPort()->getParentBox();
02423
02424 std::map<int, GObjectController*>::iterator iterOBJ1 =
02425 mapSelected.find(startPortParentBox->getObjectId());
02426 std::map<int, GObjectController*>::iterator iterOBJ2 =
02427 mapSelected.find(endPortParentBox->getObjectId());
02428
02429 if (iterOBJ1 != mapSelected.end() && iterOBJ2 != mapSelected.end()) {
02430 int ID = cont->getId();
02431 mapSelected[ID] = cont;
02432 }
02433 }
02434 }
02435 return mapSelected;
02436 }
02437
02438
02439
02440 void wxVtkSceneManager::addObjects(std::map<int, GObjectController*> objectsMap) {
02441
02442 std::map<int, int> oldIdNewIdBoxes;
02443 std::vector<int> connections;
02444
02445 std::map<int, GObjectController*>::iterator it;
02446 for (it = objectsMap.begin(); it != objectsMap.end(); ++it) {
02447 GObjectController *cont = it->second;
02448 int type = cont->getGObjectType();
02449
02450 if (type == GBLACKBOX) {
02451
02452 double xInic, yInic, zInic;
02453 GBlackBoxModel* copyBox = (GBlackBoxModel*) cont->getModel();
02454 copyBox->getInicPoint(xInic, yInic, zInic);
02455 int idBox = createGBlackBox(0, 0, copyBox->getBBTKPackage(),
02456 copyBox->getBBTKType());
02457
02458 int idcB = copyBox->getObjectId();
02459 oldIdNewIdBoxes[idcB] = idBox;
02460 cont = _controllers[idBox];
02461 GBlackBoxModel* newbox = (GBlackBoxModel*) cont->getModel();
02462 newbox->setInicPoint(xInic, yInic, zInic);
02463 int num = newbox->getNumInputPorts();
02464 for (int j = 0; j < num; j++) {
02465 newbox->setValueToInputPort(j, copyBox->getValueInputPort(j));
02466 }
02467 newbox->notifyObservers(_idManager);
02468 } else if (type == GCONNECTOR) {
02469 int idCon = cont->getId();
02470 connections.push_back(idCon);
02471 }
02472
02473 }
02474
02475 for (int i = 0; i < (int) connections.size(); i++) {
02476 int objId = connections[i];
02477 GObjectController *cont = objectsMap[objId];
02478 GConnectorModel* connectModel = (GConnectorModel*) cont->getModel();
02479
02480 GPortModel* startPort = connectModel->getStartPort();
02481 int startPortIndex = startPort->getPosInBox();
02482 GPortModel* endPort = connectModel->getEndPort();
02483 int endPortIndex = endPort->getPosInBox();
02484
02485 GBlackBoxModel* startPortParentBox =
02486 (GBlackBoxModel*) startPort->getParentBox();
02487 GBlackBoxModel* endPortParentBox =
02488 (GBlackBoxModel*) endPort->getParentBox();
02489
02490 int idNewStartBox = oldIdNewIdBoxes[startPortParentBox->getObjectId()];
02491 int idNewEndBox = oldIdNewIdBoxes[endPortParentBox->getObjectId()];
02492
02493 GBlackBoxModel* newStartBox =
02494 (GBlackBoxModel*) _controllers[idNewStartBox]->getModel();
02495 GBlackBoxModel* newEndBox =
02496 (GBlackBoxModel*) _controllers[idNewEndBox]->getModel();
02497
02498 GPortModel* newStartPort = newStartBox->getOutputPort(startPortIndex);
02499 GPortModel* newEndPort = newEndBox->getInputPort(endPortIndex);
02500
02501
02502 int idCon = createGConnector(newStartPort);
02503 GConnectorController *tempp =
02504 (GConnectorController*) _controllers[idCon];
02505 GConnectorModel *conMod = (GConnectorModel*) tempp->getModel();
02506 vtkGConnectorView *conView = (vtkGConnectorView*) tempp->getView();
02507 tempp->endContourCreation();
02508 conMod->setEndPort(newEndPort);
02509 conView->updateStartEndPoints();
02510 }
02511
02512 std::map<int, int>::iterator itIds;
02513 for (itIds = oldIdNewIdBoxes.begin(); itIds != oldIdNewIdBoxes.end(); ++itIds) {
02514 int idOld = itIds->first;
02515 int idNew = itIds->second;
02516
02517 GBlackBoxModel* oldBox =
02518 (GBlackBoxModel*) objectsMap[idOld]->getModel();
02519 GBlackBoxModel* newBox =
02520 (GBlackBoxModel*) _controllers[idNew]->getModel();
02521
02522 std::vector<int> oldInputConnections = oldBox->getConnectedInputs();
02523 std::vector<int> oldOutputConnections = oldBox->getConnectedOutputs();
02524 std::vector<int> newInputConnections = newBox->getConnectedInputs();
02525 std::vector<int> newOutputConnections = newBox->getConnectedOutputs();
02526
02527 for (int k = 0; k < (int) oldInputConnections.size(); k++) {
02528 bool exist = false;
02529
02530 for (int l = 0; l < (int) newInputConnections.size() && !exist; l++) {
02531 if (oldInputConnections[k] == newInputConnections[l]) {
02532 exist = true;
02533 }
02534 }
02535
02536 if (exist == false) {
02537
02538 int posInBox = oldInputConnections[k];
02539 GPortModel* inputPort = oldBox->getInputPort(posInBox);
02540 std::string inputPortName = inputPort->getBBTKName();
02541 int idInputPort = createGComplexBoxInputPort(inputPortName);
02542 GObjectController *cont = _controllers[idInputPort];
02543 GBoxModel *cbmod = (GBoxModel*) cont->getModel();
02544 double xIn, yIn, zIn;
02545 inputPort->getInicPoint(xIn, yIn, zIn);
02546 yIn += 20;
02547 cbmod->setInicPoint(xIn, yIn, zIn);
02548 cbmod->notifyObservers(_idManager);
02549
02550 GPortModel* inputPortEnd = newBox->getInputPort(posInBox);
02551
02552
02553 int idCon = createGConnector(cbmod->getOutputPort(0));
02554 GConnectorController *tempp =
02555 (GConnectorController*) _controllers[idCon];
02556 GConnectorModel *conMod = (GConnectorModel*) tempp->getModel();
02557 vtkGConnectorView *conView =
02558 (vtkGConnectorView*) tempp->getView();
02559 tempp->endContourCreation();
02560 conMod->setEndPort(inputPortEnd);
02561 conView->updateStartEndPoints();
02562
02563 }
02564
02565 }
02566
02567 for (int k = 0; k < (int) oldOutputConnections.size(); k++) {
02568 bool exist = false;
02569
02570 for (int l = 0; l < (int) newOutputConnections.size() && !exist; l++) {
02571 if (oldOutputConnections[k] == newOutputConnections[l]) {
02572 exist = true;
02573 }
02574 }
02575
02576 if (exist == false) {
02577
02578 int posInBox = oldOutputConnections[k];
02579 GPortModel* outputPort = oldBox->getOutputPort(posInBox);
02580 std::string outputPortName = outputPort->getBBTKName();
02581 int idOutputPort = createGComplexBoxOutputPort(outputPortName);
02582 GObjectController *cont = _controllers[idOutputPort];
02583 GBoxModel *cbmod = (GBoxModel*) cont->getModel();
02584 double xIn, yIn, zIn;
02585 outputPort->getInicPoint(xIn, yIn, zIn);
02586 yIn -= 20;
02587 cbmod->setInicPoint(xIn, yIn, zIn);
02588 cbmod->notifyObservers(_idManager);
02589
02590 GPortModel* outputPortEnd = newBox->getOutputPort(posInBox);
02591
02592
02593 int idCon = createGConnector(outputPortEnd);
02594 GConnectorController *tempp =
02595 (GConnectorController*) _controllers[idCon];
02596 GConnectorModel *conMod = (GConnectorModel*) tempp->getModel();
02597 vtkGConnectorView *conView =
02598 (vtkGConnectorView*) tempp->getView();
02599 tempp->endContourCreation();
02600 conMod->setEndPort(cbmod->getInputPort(0));
02601 conView->updateStartEndPoints();
02602
02603 }
02604
02605 }
02606
02607 }
02608
02609 }
02610
02611
02612 void wxVtkSceneManager::SetCbName(std::string cbName) {
02613 _cbName = cbName;
02614 if (_cbName == "") {
02615 _cbName = "<complex box name>";
02616 }
02617 }
02618
02619
02620 std::string wxVtkSceneManager::GetCbName() {
02621 return _cbName;
02622 }
02623
02624
02625 void wxVtkSceneManager::SetCbPackageName(std::string packagename) {
02626 _cbPackageName = packagename;
02627 if (_cbPackageName == "") {
02628 _cbPackageName = "<package name of the complex box>";
02629 }
02630 }
02631
02632
02633 std::string wxVtkSceneManager::GetCbPackageName() {
02634 return _cbPackageName;
02635 }
02636
02637
02638 void wxVtkSceneManager::SetAuthor(std::string author) {
02639 _Author = author;
02640 if (_Author == "") {
02641 _Author = "<author of the box>";
02642 }
02643 }
02644
02645
02646 std::string wxVtkSceneManager::GetAuthor() {
02647 return _Author;
02648 }
02649
02650
02651 void wxVtkSceneManager::SetCategory(std::string category) {
02652 _Category = category;
02653 if (_Category == "") {
02654 _Category = "<category of the box>";
02655 }
02656 }
02657
02658
02659 std::string wxVtkSceneManager::GetCategory() {
02660 return _Category;
02661 }
02662
02663
02664 void wxVtkSceneManager::SetDescription(std::string description) {
02665 _Description = description;
02666 if (_Description == "") {
02667 _Description = "<description of the box>";
02668 }
02669 }
02670
02671
02672 std::string wxVtkSceneManager::GetDescription() {
02673 return _Description;
02674 }
02675
02676
02677
02678
02679 void wxVtkSceneManager::printAll(int com , int sta ){
02680
02681 int tmpState = sta ;
02682 if ( tmpState == NOTHING_HAPPENS ) {
02683 std::cout << "CONTROLER STATE---->NOTHING_HAPPENS\n" ;
02684 }
02685 if ( tmpState == HIGHLIGHTED ) {
02686 std::cout << "CONTROLER STATE---->HIGHLIGHTED\n" ;
02687 }
02688 if ( tmpState == POSSIBLE_CONNECTION ) {
02689 std::cout << "CONTROLER STATE---->POSSIBLE_CONNECTION\n" ;
02690 }
02691 if ( tmpState == SELECTED_POSSIBLE_CONNECTION ) {
02692 std::cout << "CONTROLER STATE---->SELECTED_POSSIBLE_CONNECTION\n" ;
02693 }
02694 if ( tmpState == CLICKED ) {
02695 std::cout << "CONTROLER STATE---->CLICKED\n" ;
02696 }
02697 if ( tmpState == DRAG ) {
02698 std::cout << "CONTROLER STATE---->DRAG\n" ;
02699 }
02700 if ( tmpState == SELECTED ) {
02701 std::cout << "CONTROLER STATE---->SELECTED\n" ;
02702 }
02703 if ( tmpState == CREATING_CONTOUR ) {
02704 std::cout << "CONTROLER STATE---->CREATING_CONTOUR\n" ;
02705 }
02706
02707
02708
02709 int command = com ;
02710 if ( command == INIT_CREATION_CONTOUR ) {
02711 std::cout << "COMMAND ----> INIT_CREATION_CONTOUR \n" ;
02712 }
02713 if ( command == FIN_CREATION_CONTOUR ) {
02714 std::cout << "COMMAND ----> FIN_CREATION_CONTOUR \n" ;
02715 }
02716 if ( command == ADD_TO_SELECTED ) {
02717 std::cout << "COMMAND ----> ADD_TO_SELECTED \n" ;
02718 }
02719 if ( command == DRAG_OBJECTS ) {
02720 std::cout << "COMMAND ----> DRAG_OBJECTS \n" ;
02721 }
02722 if ( command == EDIT_BLACKBOX ) {
02723 std::cout << "COMMAND ----> EDIT_BLACKBOX \n" ;
02724 }
02725 if ( command == REMOVE_FROM_SELECTED ) {
02726 std::cout << "COMMAND ----> REMOVE_FROM_SELECTED \n" ;
02727 }
02728
02729 }
02730
02731
02732 }
02733
02734
02735