X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_DeviceActor.cxx;h=bd9f62e4abb4e148ed6f995ebf04a18d546613bf;hb=HEAD;hp=c82bbf30524a34ebea0025dc4c3737ebc80775b0;hpb=9a54694a0ab1e5cbc558a35c4606ceea4f7af2ef;p=modules%2Fsmesh.git diff --git a/src/OBJECT/SMESH_DeviceActor.cxx b/src/OBJECT/SMESH_DeviceActor.cxx index c82bbf305..f01910963 100644 --- a/src/OBJECT/SMESH_DeviceActor.cxx +++ b/src/OBJECT/SMESH_DeviceActor.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -31,17 +31,19 @@ #include "SMESH_ControlsDef.hxx" #include "SMESH_ActorUtils.h" #include "SMESH_FaceOrientationFilter.h" -#include "VTKViewer_CellLocationsArray.h" +//#include "VTKViewer_CellLocationsArray.h" #include "VTKViewer_PolyDataMapper.h" #include #include #include +#include // VTK Includes #include #include #include +#include #include #include @@ -59,40 +61,38 @@ #include #include -#include +#include #include +#include + #include "utilities.h" -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif using namespace std; -vtkStandardNewMacro(SMESH_DeviceActor); +vtkStandardNewMacro(SMESH_DeviceActor) SMESH_DeviceActor ::SMESH_DeviceActor() { - if(MYDEBUG) MESSAGE("SMESH_DeviceActor - "<UseLookupTableScalarRangeOn(); myMapper->SetColorModeToMapScalars(); @@ -110,22 +110,23 @@ SMESH_DeviceActor myMergeFilter = vtkMergeFilter::New(); myGeomFilter = VTKViewer_GeometryFilter::New(); + myTriangleFilter = vtkTriangleFilter::New(); myTransformFilter = VTKViewer_TransformFilter::New(); for(int i = 0; i < 6; i++) - myPassFilter.push_back(vtkPassThroughFilter::New()); + myPassFilter.push_back(vtkPassThrough::New()); // Orientation of faces myIsFacesOriented = false; - vtkFloatingPointType anRGB[3] = { 1, 1, 1 }; + double anRGB[3] = { 1, 1, 1 }; SMESH::GetColor( "SMESH", "orientation_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) ); myFaceOrientationFilter = SMESH_FaceOrientationFilter::New(); myFaceOrientationDataMapper = vtkPolyDataMapper::New(); - myFaceOrientationDataMapper->SetInput(myFaceOrientationFilter->GetOutput()); + myFaceOrientationDataMapper->SetInputConnection(myFaceOrientationFilter->GetOutputPort()); myFaceOrientation = vtkActor::New(); myFaceOrientation->SetMapper(myFaceOrientationDataMapper); @@ -136,10 +137,10 @@ SMESH_DeviceActor SMESH_DeviceActor ::~SMESH_DeviceActor() { - if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<Delete(); - + // myPlaneCollection->Delete(); -- it is vtkSmartPointer myProperty->Delete(); myExtractGeometry->Delete(); @@ -154,10 +155,11 @@ SMESH_DeviceActor myFaceOrientation->Delete(); myGeomFilter->Delete(); + myTriangleFilter->Delete(); myTransformFilter->Delete(); - for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++) + for(size_t i = 0, iEnd = myPassFilter.size(); i < iEnd; i++) myPassFilter[i]->Delete(); myShrinkFilter->Delete(); @@ -169,7 +171,8 @@ SMESH_DeviceActor ::SetStoreGemetryMapping(bool theStoreMapping) { myGeomFilter->SetStoreMapping(theStoreMapping); - SetStoreClippingMapping(theStoreMapping); + // for optimization, switch the mapping explicitly in each filter/algorithm + //SetStoreClippingMapping(theStoreMapping); } @@ -179,7 +182,10 @@ SMESH_DeviceActor { myStoreClippingMapping = theStoreMapping; myExtractGeometry->SetStoreMapping(theStoreMapping && myIsImplicitFunctionUsed); - SetStoreIDMapping(theStoreMapping); + // EAP, 23315 + // Mapping in myExtractUnstructuredGrid and myGeomFilter is ON in the pickable DeviceActor only. + // To show labels, the mapping is computed explicitly via myExtractUnstructuredGrid->BuildOut2InMap(); + //SetStoreIDMapping(theStoreMapping); } @@ -201,16 +207,15 @@ SMESH_DeviceActor SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); } - void SMESH_DeviceActor ::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) { int anId = 0; if(theIsImplicitFunctionUsed) - myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() ); + myPassFilter[ anId ]->SetInputConnection( myExtractGeometry->GetOutputPort() ); else - myPassFilter[ anId ]->SetInput( myMergeFilter->GetOutput() ); + myPassFilter[ anId ]->SetInputConnection( myMergeFilter->GetOutputPort() ); myIsImplicitFunctionUsed = theIsImplicitFunctionUsed; SetStoreClippingMapping(myStoreClippingMapping); @@ -221,42 +226,57 @@ void SMESH_DeviceActor ::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid) { - if(theGrid){ - //myIsShrinkable = theGrid->GetNumberOfCells() > 10; + myExtractUnstructuredGrid->SetInputData(theGrid); + + if ( theGrid ) + { myIsShrinkable = true; - myExtractUnstructuredGrid->SetInput(theGrid); + myMergeFilter->SetGeometryConnection(myExtractUnstructuredGrid->GetOutputPort()); - myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput()); + //Pass diameters of the balls + if(myMapper->GetBallEnabled()) { + myMergeFilter->SetScalarsConnection(myExtractUnstructuredGrid->GetOutputPort()); + } - myExtractGeometry->SetInput(myMergeFilter->GetOutput()); + myExtractGeometry->SetInputConnection(myMergeFilter->GetOutputPort()); int anId = 0; SetImplicitFunctionUsed(myIsImplicitFunctionUsed); - myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() ); - + myPassFilter[ anId + 1]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); + anId++; // 1 - myTransformFilter->SetInput( myPassFilter[ anId ]->GetOutput() ); + myTransformFilter->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 2 - myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); + myPassFilter[ anId ]->SetInputConnection( myTransformFilter->GetOutputPort() ); + myPassFilter[ anId + 1 ]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 3 - myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() ); + myGeomFilter->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); + myTriangleFilter->SetInputConnection(myGeomFilter->GetOutputPort()); anId++; // 4 - myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); + // myPassFilter[ anId ]->SetInputConnection( myTriangleFilter->GetOutputPort() ); + myPassFilter[ anId ]->SetInputConnection( myGeomFilter->GetOutputPort() ); + myPassFilter[ anId + 1 ]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 5 - myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); + myMapper->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); + if( myPlaneCollection->GetNumberOfItems() ) + myMapper->SetClippingPlanes( myPlaneCollection ); vtkLODActor::SetMapper( myMapper ); - Modified(); } + Modified(); } +void +SMESH_DeviceActor +::SetPlaneCollection( vtkPlaneCollection* theCollection ) +{ + myPlaneCollection = theCollection; +} VTKViewer_ExtractUnstructuredGrid* SMESH_DeviceActor @@ -265,6 +285,7 @@ SMESH_DeviceActor return myExtractUnstructuredGrid; } +#include "SMDS_Mesh.hxx" vtkUnstructuredGrid* SMESH_DeviceActor @@ -281,11 +302,11 @@ SMESH_DeviceActor SMESH_ScalarBarActor* theScalarBarActor, vtkLookupTable* theLookupTable) { - bool anIsInitialized = theFunctor; + bool anIsInitialized = theFunctor != NULL; if(anIsInitialized){ vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - SetStoreIDMapping(true); + // SetStoreIDMapping(true); myExtractUnstructuredGrid->Update(); vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput(); @@ -295,34 +316,50 @@ SMESH_DeviceActor vtkIdType aNbCells = aGrid->GetNumberOfCells(); aScalars->SetNumberOfComponents(1); aScalars->SetNumberOfTuples(aNbCells); + double* range = 0;// = aScalars->GetRange(); myVisualObj->UpdateFunctor(theFunctor); using namespace SMESH::Controls; - if(NumericalFunctor* aNumericalFunctor = dynamic_cast(theFunctor.get())){ - for(vtkIdType i = 0; i < aNbCells; i++){ + if(NumericalFunctor* aNumericalFunctor = dynamic_cast(theFunctor.get())) + { + myExtractUnstructuredGrid->BuildOut2InMap(); + for(vtkIdType i = 0; i < aNbCells; i++) + { vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i); vtkIdType anObjId = myVisualObj->GetElemObjId(anId); double aValue = aNumericalFunctor->GetValue(anObjId); aScalars->SetValue(i,aValue); } - }else if(Predicate* aPredicate = dynamic_cast(theFunctor.get())){ - for(vtkIdType i = 0; i < aNbCells; i++){ + range = aScalars->GetRange(); + if ( range[1] - range[0] < ( qMax(qAbs(range[0]),qAbs(range[1])) + 1e-100 ) * 1e-6 ) + { + range[1] = range[0]; + for(vtkIdType i = 0; i < aNbCells; i++) + aScalars->SetValue(i,range[0]); + } + } + else if(Predicate* aPredicate = dynamic_cast(theFunctor.get())) + { + myExtractUnstructuredGrid->BuildOut2InMap(); + for(vtkIdType i = 0; i < aNbCells; i++) + { vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i); vtkIdType anObjId = myVisualObj->GetElemObjId(anId); bool aValue = aPredicate->IsSatisfy(anObjId); aScalars->SetValue(i,aValue); } + range = aScalars->GetRange(); } aDataSet->GetCellData()->SetScalars(aScalars); aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); + + theLookupTable->SetRange( range ); theLookupTable->SetNumberOfTableValues(theScalarBarActor->GetMaximumNumberOfColors()); theLookupTable->Build(); - myMergeFilter->SetScalars(aDataSet); + myMergeFilter->SetScalarsData(aDataSet); aDataSet->Delete(); } GetMapper()->SetScalarVisibility(anIsInitialized); @@ -335,7 +372,7 @@ SMESH_DeviceActor SMESH_ScalarBarActor* theScalarBarActor, vtkLookupTable* theLookupTable) { - bool anIsInitialized = theFunctor; + bool anIsInitialized = theFunctor != NULL; myExtractUnstructuredGrid->ClearRegisteredCells(); myExtractUnstructuredGrid->ClearRegisteredCellsWithType(); myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); @@ -365,14 +402,15 @@ SMESH_DeviceActor vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); aCellTypesArray->SetNumberOfComponents( 1 ); aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - + vtkIdList *anIdList = vtkIdList::New(); anIdList->SetNumberOfIds(2); - + Length2D::TValues::const_iterator anIter = aValues.begin(); - for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){ + aNbCells = 0; + for(; anIter != aValues.end(); anIter++){ const Length2D::Value& aValue = *anIter; - int aNode[2] = { + vtkIdType aNode[2] = { myVisualObj->GetNodeVTKId(aValue.myPntId[0]), myVisualObj->GetNodeVTKId(aValue.myPntId[1]) }; @@ -381,28 +419,32 @@ SMESH_DeviceActor anIdList->SetId( 1, aNode[1] ); aConnectivity->InsertNextCell( anIdList ); aCellTypesArray->InsertNextValue( VTK_LINE ); - aScalars->SetValue(aVtkId,aValue.myLength); + aScalars->SetValue(aNbCells,aValue.myLength); + aNbCells++; } } - - VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); + aCellTypesArray->SetNumberOfTuples( aNbCells ); + aScalars->SetNumberOfTuples( aNbCells ); + + vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New(); aCellLocationsArray->SetNumberOfComponents( 1 ); aCellLocationsArray->SetNumberOfTuples( aNbCells ); - + aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) + vtkIdType const *pts(nullptr); + for( vtkIdType idType = 0, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); + + aDataSet->SetCells( aCellTypesArray, aCellLocationsArray, aConnectivity ); SetUnstructuredGrid(aDataSet); aDataSet->GetCellData()->SetScalars(aScalars); aScalars->Delete(); - + theLookupTable->SetRange(aScalars->GetRange()); theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); + + myMergeFilter->SetScalarsData(aDataSet); aDataSet->Delete(); } else if (MultiConnection2D* aMultiConnection2D = dynamic_cast(theFunctor.get())){ @@ -421,18 +463,19 @@ SMESH_DeviceActor vtkIdType aCellsSize = 3*aNbCells; vtkCellArray* aConnectivity = vtkCellArray::New(); aConnectivity->Allocate( aCellsSize, 0 ); - + vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); aCellTypesArray->SetNumberOfComponents( 1 ); aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - + vtkIdList *anIdList = vtkIdList::New(); anIdList->SetNumberOfIds(2); - + MultiConnection2D::MValues::const_iterator anIter = aValues.begin(); - for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){ + aNbCells = 0; + for(; anIter != aValues.end(); anIter++){ const MultiConnection2D::Value& aValue = (*anIter).first; - int aNode[2] = { + vtkIdType aNode[2] = { myVisualObj->GetNodeVTKId(aValue.myPntId[0]), myVisualObj->GetNodeVTKId(aValue.myPntId[1]) }; @@ -441,28 +484,106 @@ SMESH_DeviceActor anIdList->SetId( 1, aNode[1] ); aConnectivity->InsertNextCell( anIdList ); aCellTypesArray->InsertNextValue( VTK_LINE ); - aScalars->SetValue(aVtkId,(*anIter).second); + aScalars->SetValue( aNbCells,(*anIter).second); + aNbCells++; } } - - VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); + aCellTypesArray->SetNumberOfTuples( aNbCells ); + aScalars->SetNumberOfTuples( aNbCells ); + + vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New(); aCellLocationsArray->SetNumberOfComponents( 1 ); aCellLocationsArray->SetNumberOfTuples( aNbCells ); - + aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) + vtkIdType const *pts(nullptr); + for( vtkIdType idType = 0, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - + aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); SetUnstructuredGrid(aDataSet); aDataSet->GetCellData()->SetScalars(aScalars); aScalars->Delete(); - + theLookupTable->SetRange(aScalars->GetRange()); theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); + + myMergeFilter->SetScalarsData(aDataSet); + aDataSet->Delete(); + } + else if (Warping3D* aWarping3D = dynamic_cast(theFunctor.get())){ + + SMESH::Controls::Warping3D::WValues aValues; + + aWarping3D->GetValues(aValues); + vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); + vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); + + aDataSet->SetPoints(aGrid->GetPoints()); + + vtkIdType aNbCells = aValues.size(); + + vtkDoubleArray* aScalars = vtkDoubleArray::New(); + aScalars->SetNumberOfComponents(1); + aScalars->SetNumberOfTuples(aNbCells); + + vtkIdType aCellsSize = 3 * aNbCells; + vtkCellArray* aConnectivity = vtkCellArray::New(); + aConnectivity->Allocate(aCellsSize, 0); + + vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); + aCellTypesArray->SetNumberOfComponents(1); + aCellTypesArray->Allocate(aNbCells* aCellTypesArray->GetNumberOfComponents()); + + Warping3D::WValues::const_iterator anIter = aValues.begin(); + aNbCells = 0; + for (; anIter != aValues.end(); anIter++) { + + const Warping3D::Value& aValue = *anIter; + vtkIdList* anIdList = vtkIdList::New(); + anIdList->SetNumberOfIds(aValue.myPntIds.size()); + bool isExist = true; + for (int i = 0; i < aValue.myPntIds.size(); ++i) + { + int aVTKId = myVisualObj->GetNodeVTKId(aValue.myPntIds[i]); + if (aVTKId < 0) + { + isExist = false; + break; + } + anIdList->SetId(i, aVTKId); + } + if (isExist) + { + aConnectivity->InsertNextCell(anIdList); + aCellTypesArray->InsertNextValue(VTK_POLYGON); + aScalars->SetValue(aNbCells, aValue.myWarp); + aNbCells++; + } + } + aCellTypesArray->SetNumberOfTuples(aNbCells); + aScalars->SetNumberOfTuples(aNbCells); + + vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New(); + aCellLocationsArray->SetNumberOfComponents(1); + aCellLocationsArray->SetNumberOfTuples(aNbCells); + + aConnectivity->InitTraversal(); + vtkIdType const* pts(nullptr); + for (vtkIdType idType = 0, npts; aConnectivity->GetNextCell(npts, pts); idType++) + aCellLocationsArray->SetValue(idType, aConnectivity->GetTraversalLocation(npts)); + + aDataSet->SetCells(aCellTypesArray, aCellLocationsArray, aConnectivity); + SetUnstructuredGrid(aDataSet); + + aDataSet->GetCellData()->SetScalars(aScalars); + aScalars->Delete(); + + theLookupTable->SetRange(aScalars->GetRange()); + theLookupTable->Build(); + + myMergeFilter->SetScalarsData(aDataSet); aDataSet->Delete(); } } @@ -480,17 +601,17 @@ SMESH_DeviceActor myVisualObj->UpdateFunctor(theFunctor); using namespace SMESH::Controls; - if ( dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get())) + Predicate* aPredicate = 0; + if (( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get()))) { - Predicate* aPredicate = dynamic_cast(theFunctor.get()); myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); vtkIdType aNbCells = aGrid->GetNumberOfCells(); @@ -526,7 +647,7 @@ SMESH_DeviceActor FreeEdges::TBorders::const_iterator anIter = aBorders.begin(); for(; anIter != aBorders.end(); anIter++){ const FreeEdges::Border& aBorder = *anIter; - int aNode[2] = { + vtkIdType aNode[2] = { myVisualObj->GetNodeVTKId(aBorder.myPntId[0]), myVisualObj->GetNodeVTKId(aBorder.myPntId[1]) }; @@ -539,12 +660,13 @@ SMESH_DeviceActor } } - VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); + vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New(); aCellLocationsArray->SetNumberOfComponents( 1 ); aCellLocationsArray->SetNumberOfTuples( aNbCells ); aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) + vtkIdType const *pts(nullptr); + for( vtkIdType idType = 0, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); @@ -552,12 +674,11 @@ SMESH_DeviceActor SetUnstructuredGrid(aDataSet); aDataSet->Delete(); } - else if(dynamic_cast(theFunctor.get()) || - dynamic_cast(theFunctor.get())) + else if (( aPredicate = dynamic_cast(theFunctor.get())) || + ( aPredicate = dynamic_cast(theFunctor.get()))) { - Predicate* aPredicate = dynamic_cast(theFunctor.get()); myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - vtkIdType aNbNodes = myVisualObj->GetNbEntities(SMDSAbs_Node); + vtkIdType aNbNodes = FromSmIdType(myVisualObj->GetNbEntities(SMDSAbs_Node)); for( vtkIdType i = 0; i < aNbNodes; i++ ){ vtkIdType anObjId = myVisualObj->GetNodeObjId(i); if(aPredicate->IsSatisfy(anObjId)) @@ -572,11 +693,32 @@ SMESH_DeviceActor -unsigned long int +vtkMTimeType SMESH_DeviceActor ::GetMTime() { - unsigned long mTime = this->Superclass::GetMTime(); + // cout << "DA " << this + // << " GF " << myGeomFilter; + // if ( this->Property ) + // cout << " P " << this->Property->GetMTime(); + // if ( this->BackfaceProperty != NULL ) + // cout << " BP " << BackfaceProperty->GetMTime(); + // if ( this->Texture != NULL ) + // cout << " T " << this->Texture->GetMTime(); + // cout << " U " << this->GetUserTransformMatrixMTime() + // << " M " << this->MTime.GetMTime() << endl; + + // cout << "DA " << this + // << " GF " << myGeomFilter + // << " " << this->Superclass::GetMTime() + // << " " << myExtractGeometry->GetMTime() + // << " " << myExtractUnstructuredGrid->GetMTime() + // << " " << myMergeFilter->GetMTime() + // << " " << myGeomFilter->GetMTime() + // << " " << myTransformFilter->GetMTime() + // << " " << myFaceOrientationFilter->GetMTime() << endl; + + vtkMTimeType mTime = this->Superclass::GetMTime(); mTime = max(mTime,myExtractGeometry->GetMTime()); mTime = max(mTime,myExtractUnstructuredGrid->GetMTime()); mTime = max(mTime,myMergeFilter->GetMTime()); @@ -600,10 +742,10 @@ SMESH_DeviceActor ::SetShrink() { if ( !myIsShrinkable ) return; - if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) + if ( vtkAlgorithmOutput* aDataSet = myPassFilter[ 0 ]->GetOutputPort() ) { - myShrinkFilter->SetInput( aDataSet ); - myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() ); + myShrinkFilter->SetInputConnection( aDataSet ); + myPassFilter[ 1 ]->SetInputConnection( myShrinkFilter->GetOutputPort() ); myIsShrunk = true; } } @@ -613,9 +755,9 @@ SMESH_DeviceActor ::UnShrink() { if ( !myIsShrunk ) return; - if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) + if ( vtkAlgorithmOutput* aDataSet = myPassFilter[ 0 ]->GetOutputPort() ) { - myPassFilter[ 1 ]->SetInput( aDataSet ); + myPassFilter[ 1 ]->SetInputConnection( aDataSet ); myPassFilter[ 1 ]->Modified(); myIsShrunk = false; Modified(); @@ -627,37 +769,37 @@ void SMESH_DeviceActor ::SetFacesOriented(bool theIsFacesOriented) { - if ( vtkDataSet* aDataSet = myTransformFilter->GetOutput() ) + if ( vtkAlgorithmOutput* aDataSet = myTransformFilter->GetOutputPort() ) { myIsFacesOriented = theIsFacesOriented; if( theIsFacesOriented ) - myFaceOrientationFilter->SetInput( aDataSet ); + myFaceOrientationFilter->SetInputConnection( aDataSet ); UpdateFaceOrientation(); } } void SMESH_DeviceActor -::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) +::SetFacesOrientationColor(double r,double g,double b) { myFaceOrientation->GetProperty()->SetColor( r, g, b ); } void SMESH_DeviceActor -::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) +::GetFacesOrientationColor(double& r,double& g,double& b) { myFaceOrientation->GetProperty()->GetColor( r, g, b ); } void SMESH_DeviceActor -::SetFacesOrientationScale(vtkFloatingPointType theScale) +::SetFacesOrientationScale(double theScale) { myFaceOrientationFilter->SetOrientationScale( theScale ); } -vtkFloatingPointType +double SMESH_DeviceActor ::GetFacesOrientationScale() { @@ -683,8 +825,8 @@ SMESH_DeviceActor ::UpdateFaceOrientation() { bool aShowFaceOrientation = myIsFacesOriented; - aShowFaceOrientation &= GetVisibility(); - aShowFaceOrientation &= myRepresentation == eSurface; + aShowFaceOrientation &= vtkLODActor::GetVisibility(); //GetVisibility(); -- avoid calling GetUnstructuredGrid() + aShowFaceOrientation &= ( myRepresentation != ePoint ); myFaceOrientation->SetVisibility(aShowFaceOrientation); } @@ -693,6 +835,8 @@ void SMESH_DeviceActor ::SetRepresentation(EReperesent theMode) { + if ( myRepresentation == theMode ) + return; switch(theMode){ case ePoint: myGeomFilter->SetInside(true); @@ -713,6 +857,8 @@ SMESH_DeviceActor myGeomFilter->SetInside(false); myGeomFilter->SetWireframeMode(false); GetProperty()->SetRepresentation(theMode); + case eNoneRepr: + return; } SetMarkerEnabled(theMode == ePoint); myRepresentation = theMode; @@ -727,8 +873,9 @@ void SMESH_DeviceActor ::SetVisibility(int theMode) { - if(!myExtractUnstructuredGrid->GetInput() || - GetUnstructuredGrid()->GetNumberOfCells()) + if(( theMode ) && + ( !myExtractUnstructuredGrid->GetInput() || + GetUnstructuredGrid()->GetNumberOfCells())) { vtkLODActor::SetVisibility(theMode); }else{ @@ -742,10 +889,12 @@ int SMESH_DeviceActor ::GetVisibility() { - if(!GetUnstructuredGrid()->GetNumberOfCells()){ + int visibi = vtkLODActor::GetVisibility(); + if(visibi && !GetUnstructuredGrid()->GetNumberOfCells()){ vtkLODActor::SetVisibility(false); + visibi = 0; } - return vtkLODActor::GetVisibility(); + return visibi; } @@ -766,9 +915,9 @@ SMESH_DeviceActor } -int +vtkIdType SMESH_DeviceActor -::GetNodeObjId(int theVtkID) +::GetNodeObjId(vtkIdType theVtkID) { vtkIdType anID = theVtkID; @@ -776,25 +925,31 @@ SMESH_DeviceActor anID = myExtractGeometry->GetNodeObjId(theVtkID); vtkIdType aRetID = myVisualObj->GetNodeObjId(anID); - if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<