1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // VISU OBJECT : interactive object for VISU entities implementation
23 // File: VISU_PipeLine.hxx
24 // Author: Alexey PETROV
28 #include "VISU_Convertor.hxx"
29 #include "VISU_ConvertorUtils.hxx"
31 #include "VISU_MeshPL.hxx"
32 #include "VISU_ScalarMapPL.hxx"
33 #include "VISU_IsoSurfacesPL.hxx"
34 #include "VISU_CutPlanesPL.hxx"
35 #include "VISU_CutLinesPL.hxx"
36 #include "VISU_ColoredPL.hxx"
37 #include "VISU_DeformedShapePL.hxx"
38 #include "VISU_VectorsPL.hxx"
39 #include "VISU_StreamLinesPL.hxx"
40 #include "VISU_GaussPointsPL.hxx"
41 #include "VISU_DeformedShapeAndScalarMapPL.hxx"
42 #include "VISU_Plot3DPL.hxx"
44 #include "VISU_ScalarBarActor.hxx"
45 #include "VISU_OpenGLPointSpriteMapper.hxx"
46 #include "VTKViewer_GeometryFilter.h"
48 #include "VISU_ElnoDisassembleFilter.hxx"
49 #include "VISU_ElnoAssembleFilter.hxx"
51 //typedef VISU_CutPlanesPL TPresent;
52 //typedef VISU_ScalarMapPL TPresent;
53 typedef VISU_CutLinesPL TPresent;
56 #include <vtkShrinkFilter.h>
57 #include <vtkPointLocator.h>
58 #include <vtkCutter.h>
60 #include <vtkWarpVector.h>
61 #include <vtkScalarBarActor.h>
62 #include <vtkScalarBarWidget.h>
63 #include <vtkMaskPoints.h>
64 #include <vtkUnstructuredGridReader.h>
65 #include <vtkUnstructuredGrid.h>
66 #include <vtkDataSetMapper.h>
67 #include <vtkInteractorStyleTrackballCamera.h>
68 #include <vtkRenderWindowInteractor.h>
69 #include <vtkRenderWindow.h>
70 #include <vtkImageData.h>
71 #include <vtkCellData.h>
72 #include <vtkRenderer.h>
73 #include <vtkCamera.h>
75 #include <vtk3DWidget.h>
76 #include <vtkProperty.h>
79 #include <vtkLookupTable.h>
80 #include <vtkIntArray.h>
81 #include <vtkPointData.h>
82 #include <vtkCellData.h>
83 #include <vtkPointSet.h>
84 #include <vtkPolyData.h>
85 #include <vtkXYPlotActor.h>
86 #include <vtkProperty2D.h>
87 #include <vtkTextProperty.h>
89 #include <vtkXYPlotWidget.h>
90 #include <vtkScalarBarWidget.h>
91 #include <vtkScalarBarActor.h>
92 #include <vtkMatrix4x4.h>
94 /*#include <vtkBarChartActor.h>
95 #include <vtkFloatArray.h>
96 #include <vtkDataObject.h>
97 #include <vtkFieldData.h>
99 #include <vtkTextProperty.h>
100 #include <vtkPolyData.h>
101 #include <vtkPoints.h>
102 #include <vtkIdList.h>
103 #include <vtkProperty2D.h>
104 #include <vtkLegendBoxActor.h>
105 #include <vtkTestUtilities.h>
106 #include <vtkRegressionTestImage.h>
110 #include "utilities.h"
112 static int isOnlyMesh = false;
115 MESSAGE(std::endl << "VISUPipeLine : missing operand after `VISUPipeLine'" <<
116 std::endl << "VISUPipeLine : Try `VISUPipeLine -h' for more information.");
120 MESSAGE_ADD(std::endl << " Usage: VISUPipeLine filename meshname fieldname [timestamp] [component] " <<
121 std::endl << "filename - Name of the med file. " <<
122 std::endl << "meshname - Name of the mesh in the med file. " <<
123 std::endl << "fieldname - Name of the mesh field. " <<
124 std::endl << "timestamp - Number of the time stamp in the field 1,2,3 ... (optionally)" <<
125 std::endl << " by default used first time stamp. " <<
126 std::endl << "component - Number of the component in the field 0,1,2,3 ...(optionally)" <<
127 std::endl << " 0 - modulus, 1 - first component, 2 - second component, ... " <<
128 std::endl << " by default used modulus. ");
132 MESSAGE("***************************ERROR*****************************************");
134 //#define _DEBUG_ID_MAPPING_
138 vtkActor* barChartActor()
142 vtkFloatArray *bitter = vtkFloatArray::New();
143 bitter->SetNumberOfTuples(numTuples);
145 for (int i=0; i<numTuples; i++)
147 bitter->SetTuple1(i, vtkMath::Random(7,100));
150 vtkDataObject *dobj = vtkDataObject::New();
151 dobj->GetFieldData()->AddArray(bitter);
153 vtkBarChartActor *actor = vtkBarChartActor::New();
154 actor->SetInput(dobj);
155 actor->SetTitle("Bar Chart");
156 actor->GetPositionCoordinate()->SetValue(0.05,0.05,0.0);
157 actor->GetPosition2Coordinate()->SetValue(0.95,0.85,0.0);
158 actor->GetProperty()->SetColor(1,1,1);
159 actor->GetLegendActor()->SetNumberOfEntries(numTuples);
160 for (int i=0; i<numTuples; i++)
162 double red=vtkMath::Random(0,1);
163 double green=vtkMath::Random(0,1);
164 double blue=vtkMath::Random(0,1);
165 actor->SetBarColor(i,red,green,blue);
167 actor->SetBarLabel(0,"oil");
168 actor->SetBarLabel(1,"gas");
169 actor->SetBarLabel(2,"water");
170 actor->SetBarLabel(3,"snake oil");
171 actor->SetBarLabel(4,"tequila");
172 actor->SetBarLabel(5,"beer");
173 actor->LegendVisibilityOn();
175 // Set text colors (same as actor for backward compat with test)
176 actor->GetTitleTextProperty()->SetColor(1,1,0);
177 actor->GetLabelTextProperty()->SetColor(1,0,0);
182 //----------------------------------------------------------------------------
183 template<class TPipeLine>
185 CreateColoredPL(VISU_Convertor* theConvertor,
186 const std::string& theMeshName,
187 const VISU::TEntity& theEntity,
188 const std::string& theFieldName,
189 int theTimeStampNumber);
192 //----------------------------------------------------------------------------
195 CreateColoredPL<VISU_GaussPointsPL>(VISU_Convertor* theConvertor,
196 const std::string& theMeshName,
197 const VISU::TEntity& theEntity,
198 const std::string& theFieldName,
199 int theTimeStampNumber)
201 VISU_GaussPointsPL* aPresent = VISU_GaussPointsPL::New();
202 VISU::PGaussPtsIDMapper aGaussPtsIDMapper =
203 theConvertor->GetTimeStampOnGaussPts(theMeshName,
207 aPresent->SetGaussPtsIDMapper(aGaussPtsIDMapper);
209 char aMainTexture[80];
210 strcpy( aMainTexture, getenv( "VISU_ROOT_DIR" ) );
211 strcat( aMainTexture, "/share/salome/resources/visu/sprite_texture.bmp" );
213 char anAlphaTexture[80];
214 strcpy( anAlphaTexture, getenv( "VISU_ROOT_DIR" ) );
215 strcat( anAlphaTexture, "/share/salome/resources/visu/sprite_alpha.bmp" );
217 vtkSmartPointer<vtkImageData> aTextureValue =
218 VISU_GaussPointsPL::MakeTexture( aMainTexture, anAlphaTexture );
219 aPresent->SetImageData( aTextureValue.GetPointer() );
223 #ifdef _DEBUG_ID_MAPPING_
224 vtkDataSet* aDataSet = aPresent->GetOutput();
226 int aNbCells = aDataSet->GetNumberOfCells();
227 cout<<"aNbCells = "<<aNbCells<<endl;
228 for(int anCellId = 0; anCellId < aNbCells; anCellId++){
229 vtkIdType anObjID = aPresent->GetNodeObjID(anCellId);
230 vtkIdType aVtkID = aPresent->GetNodeVTKID(anObjID);
231 cout<<anObjID<<"; "<<aVtkID<<"; - ";
232 vtkFloatingPointType* aCoord = aPresent->GetNodeCoord(anObjID);
233 cout<<aCoord[0]<<"; "<<aCoord[1]<<"; "<<aCoord[2]<<endl;
239 //----------------------------------------------------------------------------
240 template<class TPipeLine>
242 CreateColoredPL(VISU_Convertor* theConvertor,
243 const std::string& theMeshName,
244 const VISU::TEntity& theEntity,
245 const std::string& theFieldName,
246 int theTimeStampNumber)
248 TPipeLine* aPresent = TPipeLine::New();
249 VISU::PUnstructuredGridIDMapper anUnstructuredGridIDMapper =
250 theConvertor->GetTimeStampOnMesh(theMeshName,
254 aPresent->SetUnstructuredGridIDMapper(anUnstructuredGridIDMapper);
256 vtkFloatingPointType aRange[] = { 4, 5 };
257 cout << "before filter limits set" << endl;
258 vtkObject::GlobalWarningDisplayOn();
260 aPresent->SetScalarFilterRange( aRange );
261 aPresent->UseScalarFiltering( true );
262 cout << "after filter set" << endl;
264 //aPresent->ClearGeometry();
266 // VISU::PUnstructuredGridIDMapper anIDMapper =
267 // theConvertor->GetMeshOnGroup(theMeshName,
269 // aPresent->AddGeometry(anIDMapper->GetOutput());
272 // VISU::PUnstructuredGridIDMapper anIDMapper =
273 // theConvertor->GetMeshOnGroup(theMeshName,
275 // aPresent->AddGeometry(anIDMapper->GetOutput());
278 // VISU::PUnstructuredGridIDMapper anIDMapper =
279 // theConvertor->GetMeshOnGroup(theMeshName,
281 // aPresent->AddGeometry(anIDMapper->GetOutput());
284 cout << "after update" << endl;
289 //----------------------------------------------------------------------------
291 main(int argc, char** argv)
298 if(argc == 2 && !strcmp(argv[1],"-h")) {
306 int aTimeStampNumber = 1;
307 int aComponentNumber = 0;
308 bool allInit = false;
309 bool isMeshOk = false;
310 bool isFieldOk = false;
311 bool isTimeStampOk = false;
312 bool isComponentOk = false;
315 aFileName = new char[static_cast<int>(strlen(argv[1])) + 1];
316 aMeshName = new char[static_cast<int>(strlen(argv[2])) + 1];
317 aFieldName = new char[static_cast<int>(strlen(argv[3])) + 1];
319 strcpy(aFileName,argv[1]);
320 strcpy(aMeshName,argv[2]);
321 strcpy(aFieldName,argv[3]);
327 aFileName = new char[static_cast<int>(strlen(argv[1])) + 1];
328 aMeshName = new char[static_cast<int>(strlen(argv[2])) + 1];
329 aFieldName = new char[static_cast<int>(strlen(argv[3])) + 1];
331 strcpy(aFileName,argv[1]);
332 strcpy(aMeshName,argv[2]);
333 strcpy(aFieldName,argv[3]);
335 aTimeStampNumber = atoi(argv[4]);
340 aFileName = new char[static_cast<int>(strlen(argv[1])) + 1];
341 aMeshName = new char[static_cast<int>(strlen(argv[2])) + 1];
342 aFieldName = new char[static_cast<int>(strlen(argv[3])) + 1];
344 strcpy(aFileName,argv[1]);
345 strcpy(aMeshName,argv[2]);
346 strcpy(aFieldName,argv[3]);
348 aTimeStampNumber = atoi(argv[4]);
349 aComponentNumber = atoi(argv[5]);
357 vtkRenderWindow *aWindow = vtkRenderWindow::New();
358 vtkRenderer *aRenderer = vtkRenderer::New();
360 aWindow->AddRenderer(aRenderer);
361 aRenderer->GetActiveCamera()->ParallelProjectionOn();
363 vtkRenderWindowInteractor *anInteractor = vtkRenderWindowInteractor::New();
364 anInteractor->SetRenderWindow(aWindow);
367 vtkInteractorStyle* aStyle = vtkInteractorStyleTrackballCamera::New();
368 anInteractor->SetInteractorStyle(aStyle);
371 VISU_Convertor* aConvertor = CreateConvertor(aFileName);
372 aConvertor->BuildEntities();
373 aConvertor->BuildGroups();
374 aConvertor->BuildFields();
375 aConvertor->BuildMinMax();
376 const VISU::TMeshMap& aMeshMap = aConvertor->GetMeshMap();
377 VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin();
378 if(aMeshMapIter == aMeshMap.end()) return 0;
379 const std::string& aMeshName = aMeshMapIter->first;
380 const VISU::PMesh aMesh = aMeshMapIter->second;
381 const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
382 VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter;
384 const VISU::TEntity& anEntity = VISU::CELL_ENTITY;
385 aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity);
387 VISU::PNamedIDMapper anIDMapper =
388 aConvertor->GetMeshOnEntity(aMeshName,anEntity);
390 VISU_MeshPL* aPresent = VISU_MeshPL::New();
391 aPresent->SetUnstructuredGridIDMapper(anIDMapper);
393 vtkActor* aActor = vtkActor::New();
394 aActor->SetMapper(aPresent->GetMapper());
395 aActor->GetProperty()->SetRepresentation(VTK_WIREFRAME);
396 //aRenderer->ResetCameraClippingRange();
398 aRenderer->AddActor(aActor);
401 anInteractor->Start();
405 aMeshOnEntityMapIter = aMeshOnEntityMap.begin();
406 for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++) {
407 const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first;
408 const VISU::PMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second;
409 const VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
410 VISU::TFieldMap::const_iterator aFieldMapIter = aFieldMap.begin();
411 for(; aFieldMapIter != aFieldMap.end(); aFieldMapIter++){
412 const VISU::PField aField = aFieldMapIter->second;
413 // if(aField->myNbComp == 1)
415 const std::string& aFieldName = aFieldMapIter->first;
416 const VISU::TValField& aValField = aField->myValField;
417 VISU::TValField::const_reverse_iterator aValFieldIter = aValField.rbegin();
418 if(aValFieldIter == aValField.rend()) return 0;
419 int aTimeStamp = aValFieldIter->first;
421 vtkActor* anActor = vtkActor::New();
422 VISU_ColoredPL* aPresent = NULL;
423 if(anEntity == VISU::NODE_ENTITY){
424 aPresent = CreateColoredPL<TPresent>(aConvertor,
430 anActor->SetMapper(aPresent->GetMapper());
433 aPresent = CreateColoredPL<TPresent>(aConvertor,
439 VTKViewer_GeometryFilter* aGeometryFilter = VTKViewer_GeometryFilter::New();
440 aGeometryFilter->SetInput(aPresent->GetOutput());
441 aGeometryFilter->SetInside(true);
443 vtkMaskPoints* aMaskPoints = vtkMaskPoints::New();
444 aMaskPoints->SetInput(aGeometryFilter->GetOutput());
445 aMaskPoints->SetGenerateVertices(true);
446 aMaskPoints->SetOnRatio(1);
448 VISU_OpenGLPointSpriteMapper* aMapper = VISU_OpenGLPointSpriteMapper::New();
449 aMapper->SetAverageCellSize( VISU_DeformedShapePL::GetScaleFactor( aPresent->GetOutput() ) );
451 char aMainTexture[80];
452 strcpy( aMainTexture, getenv( "VISU_ROOT_DIR" ) );
453 strcat( aMainTexture, "/share/salome/resources/visu/sprite_texture.vti" );
455 char anAlphaTexture[80];
456 strcpy( anAlphaTexture, getenv( "VISU_ROOT_DIR" ) );
457 strcat( anAlphaTexture, "/share/salome/resources/visu/sprite_alpha.vti" );
459 vtkSmartPointer<vtkImageData> aTextureValue =
460 VISU_GaussPointsPL::MakeTexture( aMainTexture, anAlphaTexture );
461 aMapper->SetImageData( aTextureValue.GetPointer() );
463 //vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
464 aMapper->SetLookupTable(aPresent->GetMapperTable());
465 aMapper->SetUseLookupTableScalarRange(true);
466 aMapper->SetColorModeToMapScalars();
467 aMapper->SetScalarVisibility(true);
469 aMapper->SetInput(aMaskPoints->GetOutput());
470 aGeometryFilter->Delete();
472 anActor->SetMapper(aMapper);
481 vtkLookupTable* lut = vtkLookupTable::New();
482 int nbColors = aPresent->GetNbColors();
483 lut->SetNumberOfTableValues(nbColors);
484 vtkDataArray* dataArr;
485 if(VISU::IsDataOnCells(aPresent->GetInput())) {
486 dataArr = aPresent->GetInput()->GetCellData()->GetScalars();
488 dataArr = aPresent->GetInput()->GetPointData()->GetScalars();
490 vtkFloatingPointType aRange[2];
491 dataArr->GetRange(aRange);
492 MSG(true, "Range[0]: "<<aRange[0]);
493 MSG(true, "Range[1]: "<<aRange[1]);
495 lut->SetTableRange(aRange);
498 vtkIntArray* distr = vtkIntArray::New();
499 distr->SetNumberOfValues(nbColors);
500 MSG(true, "Number of colors: "<<nbColors);
501 distr->FillComponent(0, 0.);
503 int aNbVals = dataArr->GetNumberOfTuples();
504 int idx = 0, cnt = 0;
507 for(vtkIdType aValId = 0; aValId < aNbVals; aValId++){
508 // MSG(true, "Value: "<< *(dataArr->GetTuple(aValId)));
509 idx = lut->GetIndex(*(dataArr->GetTuple(aValId)));
510 // MSG(true, "Value index "<<idx);
511 cnt = distr->GetValue(idx);
512 distr->SetValue(idx, cnt + 1);
517 distr->GetRange(range);
518 MSG(true, "DistrRange[0]: " << range[0]);
519 MSG(true, "DistrRange[1]: " << range[1]);
521 // vtkPoints* points = vtkPoints::New();
522 // aNbVals = distr->GetNumberOfTuples();
523 // points->Allocate(aNbVals);
524 // double x[3] = {0., 0., 0.};
525 /* for(vtkIdType aValId = 0; aValId < aNbVals; aValId++){
527 points->InsertPoint(aValId, x);
528 */// MSG(true, "Inserted point "<<aValId);
529 // MSG(true, ": "<<distr->GetValue(aValId));
531 // points->SetData(distr);
533 /* vtkPointSet* pset = vtkPolyData::New();
534 pset->SetPoints(points);
535 pset->GetPointData()->SetScalars(distr);
537 vtkDataObject *dobj = vtkDataObject::New();
538 dobj->GetFieldData()->AddArray(distr);
540 vtkXYPlotActor* xyplot = vtkXYPlotActor::New();
541 // xyplot->AddInput(pset);
542 xyplot->AddDataObjectInput(dobj);
543 xyplot->GetPositionCoordinate()->SetValue(0.0, 0.67, 0);
544 xyplot->GetPosition2Coordinate()->SetValue(1.0, 0.33, 0); // #relative to Position
545 xyplot->SetXValuesToIndex();
546 // xyplot->SetXValuesToNormalizedArcLength();
547 // xyplot->SetXValuesToArcLength();
548 // xyplot->SetNumberOfXLabels(0);
549 xyplot->SetTitle("");
550 xyplot->SetXTitle("");
551 xyplot->SetYTitle("Distribution");
552 // xyplot->ReverseYAxisOn();
553 // xyplot->SetDataObjectPlotModeToRows();
554 xyplot->SetLabelFormat("%.0f");
555 xyplot->SetXRange(0, nbColors-1);
556 xyplot->SetYRange(range[0], range[1]);
557 /* int ny = floor(fabs(range[1] - range[0]));
558 MSG(true, "ny = "<<ny);
559 MSG(true, "nbYLabels = "<<xyplot->GetNumberOfYLabels());
560 if (ny < xyplot->GetNumberOfYLabels()) {
562 xyplot->SetNumberOfYLabels(ny);
563 MSG(true, "nbYLabels = "<<xyplot->GetNumberOfYLabels());
565 */ xyplot->GetProperty()->SetColor(1, 1, 1);
566 xyplot->GetProperty()->SetLineWidth(2);
567 xyplot->GetProperty()->SetDisplayLocationToForeground();
568 /* vtkMatrix4x4 *m = vtkMatrix4x4::New();
572 m->SetElement(0, 1, 1);
573 m->SetElement(1, 0, -1);
574 m->SetElement(2, 2, 1);
575 m->SetElement(3, 3, 1);
577 xyplot->PokeMatrix(m);
578 */ //# Set text prop color (same color for backward compat with test)
579 //# Assign same object to all text props
580 vtkTextProperty* tprop;
581 tprop = xyplot->GetTitleTextProperty();
582 tprop->SetColor(xyplot->GetProperty()->GetColor());
583 xyplot->SetAxisTitleTextProperty(tprop);
584 xyplot->SetAxisLabelTextProperty(tprop);
592 vtkXYPlotWidget* aWidget = vtkXYPlotWidget::New();
593 aWidget->SetInteractor( anInteractor );
594 aWidget->SetXYPlotActor( xyplot );
595 aWidget->SetEnabled( 1 );
599 vtkObject::GlobalWarningDisplayOn();
601 VISU_ScalarBarActor * aScalarBar = VISU_ScalarBarActor::New();
602 //vtkScalarBarActor * aScalarBar = vtkScalarBarActor::New();
603 aPresent->SetNbColors(5);
606 aScalarBar->SetLookupTable(aPresent->GetBarTable());
607 aScalarBar->DebugOn();
608 aScalarBar->SetDistribution(aPresent->GetDistribution());
609 aScalarBar->DistributionVisibilityOn();
610 // aScalarBar->SetOrientationToHorizontal();
611 // aScalarBar->GetPositionCoordinate()->SetValue(.1, .6, 0);
612 // aScalarBar->GetPosition2Coordinate()->SetValue(.8, .3, 0);
615 vtkScalarBarWidget* aWidget = vtkScalarBarWidget::New();
616 aWidget->SetInteractor( anInteractor );
617 aWidget->SetScalarBarActor( aScalarBar );
618 aWidget->SetEnabled( 1 );
621 aRenderer->AddActor(anActor);
622 // aRenderer->AddActor2D(xyplot); //RKV
623 aRenderer->AddActor2D(aScalarBar);
625 //aRenderer->AddActor2D(barChartActor()); //RKV
628 aRenderer->ResetCamera();
630 anInteractor->Start();
642 MESSAGE("Can not find mesh with name `"<<aMeshName<<"' in the file `"<<aFileName<<"'");
648 MESSAGE("Can not find field with name `"<<aFieldName<<"' on the mesh `"<<aMeshName<<"'");
654 MESSAGE("Field field with name `"<<aFieldName<<"' containt less then `"<<aComponentNumber<<"' component(s).");
660 MESSAGE("Can not find time stamp with number `"<<aTimeStampNumber<<"' on the field `"<<aFieldName<<"'");
663 }catch(std::exception& exc){
664 MSG(true, "Follow exception was occured :\n"<<exc.what());
666 MSG(true, "Unknown exception was occured in VISU_Convertor_impl");