1 // SMESH OBJECT : interactive object for SMESH visualization
3 // Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESH_DeviceActor.cxx
30 #include "SMESH_DeviceActor.h"
31 #include "SMESH_ExtractGeometry.h"
32 #include "SMESH_ControlsDef.hxx"
33 #include "SMESH_ActorUtils.h"
35 #include <VTKViewer_Transform.h>
36 #include <VTKViewer_TransformFilter.h>
37 #include <VTKViewer_PassThroughFilter.h>
38 #include <VTKViewer_ExtractUnstructuredGrid.h>
41 #include <vtkObjectFactory.h>
42 #include <vtkShrinkFilter.h>
43 #include <vtkShrinkPolyData.h>
45 #include <vtkProperty.h>
46 #include <vtkPolyData.h>
47 #include <vtkMergeFilter.h>
48 #include <vtkPolyDataMapper.h>
49 #include <vtkUnstructuredGrid.h>
51 #include <vtkScalarBarActor.h>
52 #include <vtkLookupTable.h>
53 #include <vtkDoubleArray.h>
54 #include <vtkCellData.h>
57 #include <vtkIdList.h>
58 #include <vtkIntArray.h>
59 #include <vtkCellArray.h>
60 #include <vtkUnsignedCharArray.h>
62 #include <vtkImplicitBoolean.h>
64 #include "utilities.h"
67 static int MYDEBUG = 0;
69 static int MYDEBUG = 0;
75 vtkStandardNewMacro(SMESH_DeviceActor);
78 SMESH_DeviceActor::SMESH_DeviceActor()
80 if(MYDEBUG) MESSAGE("SMESH_DeviceActor - "<<this);
83 myIsShrinkable = false;
84 myRepresentation = eSurface;
86 myProperty = vtkProperty::New();
87 myMapper = vtkPolyDataMapper::New();
89 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
90 myPolygonOffsetUnits);
92 myMapper->UseLookupTableScalarRangeOn();
93 myMapper->SetColorModeToMapScalars();
95 myShrinkFilter = vtkShrinkFilter::New();
97 myStoreClippingMapping = false;
99 myExtractGeometry = SMESH_ExtractGeometry::New();
100 myExtractGeometry->SetReleaseDataFlag(true);
101 myIsImplicitFunctionUsed = false;
103 myExtractUnstructuredGrid = VTKViewer_ExtractUnstructuredGrid::New();
105 myMergeFilter = vtkMergeFilter::New();
107 myGeomFilter = VTKViewer_GeometryFilter::New();
109 myTransformFilter = VTKViewer_TransformFilter::New();
111 for(int i = 0; i < 6; i++)
112 myPassFilter.push_back(VTKViewer_PassThroughFilter::New());
116 SMESH_DeviceActor::~SMESH_DeviceActor(){
117 if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<<this);
119 myProperty->Delete();
123 myShrinkFilter->Delete();
125 myExtractUnstructuredGrid->Delete();
127 myMergeFilter->Delete();
129 myGeomFilter->Delete();
131 myExtractGeometry->Delete();
133 myTransformFilter->Delete();
135 for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){
136 myPassFilter[i]->Delete();
143 SetStoreGemetryMapping(bool theStoreMapping)
145 myGeomFilter->SetStoreMapping(theStoreMapping);
146 SetStoreClippingMapping(theStoreMapping);
152 SetStoreClippingMapping(bool theStoreMapping)
154 myStoreClippingMapping = theStoreMapping;
155 myExtractGeometry->SetStoreMapping(theStoreMapping && myIsImplicitFunctionUsed);
156 SetStoreIDMapping(theStoreMapping);
162 SetStoreIDMapping(bool theStoreMapping)
164 myExtractUnstructuredGrid->SetStoreMapping(theStoreMapping);
168 void SMESH_DeviceActor::Init(TVisualObjPtr theVisualObj,
169 vtkImplicitBoolean* theImplicitBoolean)
171 myVisualObj = theVisualObj;
172 myExtractGeometry->SetImplicitFunction(theImplicitBoolean);
173 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
179 SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed)
182 if(theIsImplicitFunctionUsed)
183 myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() );
185 myPassFilter[ anId ]->SetInput( myMergeFilter->GetOutput() );
187 myIsImplicitFunctionUsed = theIsImplicitFunctionUsed;
188 SetStoreClippingMapping(myStoreClippingMapping);
192 void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){
194 //myIsShrinkable = theGrid->GetNumberOfCells() > 10;
195 myIsShrinkable = true;
197 myExtractUnstructuredGrid->SetInput(theGrid);
199 myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput());
201 myExtractGeometry->SetInput(myMergeFilter->GetOutput());
204 SetImplicitFunctionUsed(myIsImplicitFunctionUsed);
205 myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() );
208 myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() );
211 myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() );
212 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
215 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
216 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
219 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
220 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
221 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
222 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
225 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
226 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
228 vtkLODActor::SetMapper( myMapper );
234 VTKViewer_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){
235 return myExtractUnstructuredGrid;
239 vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){
240 myExtractUnstructuredGrid->Update();
241 return myExtractUnstructuredGrid->GetOutput();
245 void SMESH_DeviceActor::SetControlMode(SMESH::Controls::FunctorPtr theFunctor,
246 vtkScalarBarActor* theScalarBarActor,
247 vtkLookupTable* theLookupTable)
249 bool anIsInitialized = theFunctor;
251 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
253 SetStoreIDMapping(true);
254 myExtractUnstructuredGrid->Update();
255 vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput();
257 aDataSet->ShallowCopy(aGrid);
259 vtkDoubleArray *aScalars = vtkDoubleArray::New();
260 vtkIdType aNbCells = aGrid->GetNumberOfCells();
261 aScalars->SetNumberOfComponents(1);
262 aScalars->SetNumberOfTuples(aNbCells);
264 myVisualObj->UpdateFunctor(theFunctor);
266 using namespace SMESH::Controls;
267 if(NumericalFunctor* aNumericalFunctor = dynamic_cast<NumericalFunctor*>(theFunctor.get())){
268 for(vtkIdType i = 0; i < aNbCells; i++){
269 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
270 vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
271 double aValue = aNumericalFunctor->GetValue(anObjId);
272 aScalars->SetValue(i,aValue);
274 }else if(Predicate* aPredicate = dynamic_cast<Predicate*>(theFunctor.get())){
275 for(vtkIdType i = 0; i < aNbCells; i++){
276 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
277 vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
278 bool aValue = aPredicate->IsSatisfy(anObjId);
279 aScalars->SetValue(i,aValue);
283 aDataSet->GetCellData()->SetScalars(aScalars);
286 theLookupTable->SetRange(aScalars->GetRange());
287 theLookupTable->SetNumberOfTableValues(theScalarBarActor->GetMaximumNumberOfColors());
288 theLookupTable->Build();
290 myMergeFilter->SetScalars(aDataSet);
293 GetMapper()->SetScalarVisibility(anIsInitialized);
294 theScalarBarActor->SetVisibility(anIsInitialized);
297 void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
298 vtkScalarBarActor* theScalarBarActor,
299 vtkLookupTable* theLookupTable)
301 bool anIsInitialized = theFunctor;
302 myExtractUnstructuredGrid->ClearRegisteredCells();
303 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
304 myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
305 myVisualObj->UpdateFunctor(theFunctor);
307 using namespace SMESH::Controls;
308 if (anIsInitialized){
309 if (Length2D* aLength2D = dynamic_cast<Length2D*>(theFunctor.get())){
310 SMESH::Controls::Length2D::TValues aValues;
312 aLength2D->GetValues(aValues);
313 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
314 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
316 aDataSet->SetPoints(aGrid->GetPoints());
318 vtkIdType aNbCells = aValues.size();
320 vtkDoubleArray *aScalars = vtkDoubleArray::New();
321 aScalars->SetNumberOfComponents(1);
322 aScalars->SetNumberOfTuples(aNbCells);
324 vtkIdType aCellsSize = 3*aNbCells;
325 vtkCellArray* aConnectivity = vtkCellArray::New();
326 aConnectivity->Allocate( aCellsSize, 0 );
328 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
329 aCellTypesArray->SetNumberOfComponents( 1 );
330 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
332 vtkIdList *anIdList = vtkIdList::New();
333 anIdList->SetNumberOfIds(2);
335 Length2D::TValues::const_iterator anIter = aValues.begin();
336 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
337 const Length2D::Value& aValue = *anIter;
339 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
340 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
342 if(aNode[0] >= 0 && aNode[1] >= 0){
343 anIdList->SetId( 0, aNode[0] );
344 anIdList->SetId( 1, aNode[1] );
345 aConnectivity->InsertNextCell( anIdList );
346 aCellTypesArray->InsertNextValue( VTK_LINE );
347 aScalars->SetValue(aVtkId,aValue.myLength);
351 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
352 aCellLocationsArray->SetNumberOfComponents( 1 );
353 aCellLocationsArray->SetNumberOfTuples( aNbCells );
355 aConnectivity->InitTraversal();
356 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
357 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
359 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
360 SetUnstructuredGrid(aDataSet);
362 aDataSet->GetCellData()->SetScalars(aScalars);
365 theLookupTable->SetRange(aScalars->GetRange());
366 theLookupTable->Build();
368 myMergeFilter->SetScalars(aDataSet);
371 else if (MultiConnection2D* aMultiConnection2D = dynamic_cast<MultiConnection2D*>(theFunctor.get())){
372 SMESH::Controls::MultiConnection2D::MValues aValues;
374 aMultiConnection2D->GetValues(aValues);
375 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
376 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
377 aDataSet->SetPoints(aGrid->GetPoints());
379 vtkIdType aNbCells = aValues.size();
380 vtkDoubleArray *aScalars = vtkDoubleArray::New();
381 aScalars->SetNumberOfComponents(1);
382 aScalars->SetNumberOfTuples(aNbCells);
384 vtkIdType aCellsSize = 3*aNbCells;
385 vtkCellArray* aConnectivity = vtkCellArray::New();
386 aConnectivity->Allocate( aCellsSize, 0 );
388 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
389 aCellTypesArray->SetNumberOfComponents( 1 );
390 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
392 vtkIdList *anIdList = vtkIdList::New();
393 anIdList->SetNumberOfIds(2);
395 MultiConnection2D::MValues::const_iterator anIter = aValues.begin();
396 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
397 const MultiConnection2D::Value& aValue = (*anIter).first;
399 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
400 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
402 if(aNode[0] >= 0 && aNode[1] >= 0){
403 anIdList->SetId( 0, aNode[0] );
404 anIdList->SetId( 1, aNode[1] );
405 aConnectivity->InsertNextCell( anIdList );
406 aCellTypesArray->InsertNextValue( VTK_LINE );
407 aScalars->SetValue(aVtkId,(*anIter).second);
411 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
412 aCellLocationsArray->SetNumberOfComponents( 1 );
413 aCellLocationsArray->SetNumberOfTuples( aNbCells );
415 aConnectivity->InitTraversal();
416 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
417 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
419 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
420 SetUnstructuredGrid(aDataSet);
422 aDataSet->GetCellData()->SetScalars(aScalars);
425 theLookupTable->SetRange(aScalars->GetRange());
426 theLookupTable->Build();
428 myMergeFilter->SetScalars(aDataSet);
432 GetMapper()->SetScalarVisibility(anIsInitialized);
433 theScalarBarActor->SetVisibility(anIsInitialized);
436 void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor)
438 myExtractUnstructuredGrid->ClearRegisteredCells();
439 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
440 myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
441 myVisualObj->UpdateFunctor(theFunctor);
443 using namespace SMESH::Controls;
444 if(FreeBorders* aFreeBorders = dynamic_cast<FreeBorders*>(theFunctor.get())){
445 myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
446 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
447 vtkIdType aNbCells = aGrid->GetNumberOfCells();
448 for( vtkIdType i = 0; i < aNbCells; i++ ){
449 vtkIdType anObjId = myVisualObj->GetElemObjId(i);
450 if(aFreeBorders->IsSatisfy(anObjId))
451 myExtractUnstructuredGrid->RegisterCell(i);
453 if(!myExtractUnstructuredGrid->IsCellsRegistered())
454 myExtractUnstructuredGrid->RegisterCell(-1);
455 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
456 }else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get())){
457 SMESH::Controls::FreeEdges::TBorders aBorders;
458 aFreeEdges->GetBoreders(aBorders);
459 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
460 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
461 aDataSet->SetPoints(aGrid->GetPoints());
463 vtkIdType aNbCells = aBorders.size();
464 vtkIdType aCellsSize = 3*aNbCells;
465 vtkCellArray* aConnectivity = vtkCellArray::New();
466 aConnectivity->Allocate( aCellsSize, 0 );
468 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
469 aCellTypesArray->SetNumberOfComponents( 1 );
470 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
472 vtkIdList *anIdList = vtkIdList::New();
473 anIdList->SetNumberOfIds(2);
475 FreeEdges::TBorders::const_iterator anIter = aBorders.begin();
476 for(; anIter != aBorders.end(); anIter++){
477 const FreeEdges::Border& aBorder = *anIter;
479 myVisualObj->GetNodeVTKId(aBorder.myPntId[0]),
480 myVisualObj->GetNodeVTKId(aBorder.myPntId[1])
482 //cout<<"aNode = "<<aBorder.myPntId[0]<<"; "<<aBorder.myPntId[1]<<endl;
483 if(aNode[0] >= 0 && aNode[1] >= 0){
484 anIdList->SetId( 0, aNode[0] );
485 anIdList->SetId( 1, aNode[1] );
486 aConnectivity->InsertNextCell( anIdList );
487 aCellTypesArray->InsertNextValue( VTK_LINE );
491 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
492 aCellLocationsArray->SetNumberOfComponents( 1 );
493 aCellLocationsArray->SetNumberOfTuples( aNbCells );
495 aConnectivity->InitTraversal();
496 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
497 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
499 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
501 SetUnstructuredGrid(aDataSet);
509 unsigned long int SMESH_DeviceActor::GetMTime(){
510 unsigned long mTime = this->Superclass::GetMTime();
511 mTime = max(mTime,myExtractGeometry->GetMTime());
512 mTime = max(mTime,myExtractUnstructuredGrid->GetMTime());
513 mTime = max(mTime,myMergeFilter->GetMTime());
514 mTime = max(mTime,myGeomFilter->GetMTime());
515 mTime = max(mTime,myTransformFilter->GetMTime());
520 void SMESH_DeviceActor::SetTransform(VTKViewer_Transform* theTransform){
521 myTransformFilter->SetTransform(theTransform);
525 void SMESH_DeviceActor::SetShrink() {
526 if ( !myIsShrinkable ) return;
527 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
529 myShrinkFilter->SetInput( aDataSet );
530 myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() );
535 void SMESH_DeviceActor::UnShrink() {
536 if ( !myIsShrunk ) return;
537 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
539 myPassFilter[ 1 ]->SetInput( aDataSet );
540 myPassFilter[ 1 ]->Modified();
547 void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){
550 myGeomFilter->SetInside(true);
551 myGeomFilter->SetWireframeMode(false);
552 GetProperty()->SetRepresentation(0);
555 myGeomFilter->SetInside(false);
556 myGeomFilter->SetWireframeMode(true);
557 GetProperty()->SetRepresentation(theMode);
560 myGeomFilter->SetInside(true);
561 myGeomFilter->SetWireframeMode(true);
562 GetProperty()->SetRepresentation(1);
565 myGeomFilter->SetInside(false);
566 myGeomFilter->SetWireframeMode(false);
567 GetProperty()->SetRepresentation(theMode);
569 myRepresentation = theMode;
570 GetProperty()->Modified();
571 myMapper->Modified();
576 void SMESH_DeviceActor::SetVisibility(int theMode){
577 if(!myExtractUnstructuredGrid->GetInput() ||
578 GetUnstructuredGrid()->GetNumberOfCells())
580 vtkLODActor::SetVisibility(theMode);
582 vtkLODActor::SetVisibility(false);
587 int SMESH_DeviceActor::GetVisibility(){
588 if(!GetUnstructuredGrid()->GetNumberOfCells()){
589 vtkLODActor::SetVisibility(false);
591 return vtkLODActor::GetVisibility();
595 int SMESH_DeviceActor::GetNodeObjId(int theVtkID){
596 vtkIdType anID = theVtkID;
598 if(IsImplicitFunctionUsed())
599 anID = myExtractGeometry->GetNodeObjId(theVtkID);
601 vtkIdType aRetID = myVisualObj->GetNodeObjId(anID);
602 if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<<theVtkID<<"; anID = "<<anID<<"; aRetID = "<<aRetID);
606 float* SMESH_DeviceActor::GetNodeCoord(int theObjID){
607 vtkDataSet* aDataSet = myMergeFilter->GetOutput();
608 vtkIdType anID = myVisualObj->GetNodeVTKId(theObjID);
609 float* aCoord = aDataSet->GetPoint(anID);
610 if(MYDEBUG) MESSAGE("GetNodeCoord - theObjID = "<<theObjID<<"; anID = "<<anID);
615 int SMESH_DeviceActor::GetElemObjId(int theVtkID){
616 vtkIdType anId = myGeomFilter->GetElemObjId(theVtkID);
620 vtkIdType anId2 = anId;
621 if(IsImplicitFunctionUsed())
622 anId2 = myExtractGeometry->GetElemObjId(anId);
626 vtkIdType anId3 = myExtractUnstructuredGrid->GetInputId(anId2);
630 vtkIdType aRetID = myVisualObj->GetElemObjId(anId3);
632 MESSAGE("GetElemObjId - theVtkID = "<<theVtkID<<"; anId2 = "<<anId2<<"; anId3 = "<<anId3<<"; aRetID = "<<aRetID);
636 vtkCell* SMESH_DeviceActor::GetElemCell(int theObjID){
637 vtkDataSet* aDataSet = myVisualObj->GetUnstructuredGrid();
638 vtkIdType aGridID = myVisualObj->GetElemVTKId(theObjID);
639 vtkCell* aCell = aDataSet->GetCell(aGridID);
641 MESSAGE("GetElemCell - theObjID = "<<theObjID<<"; aGridID = "<<aGridID);
646 float SMESH_DeviceActor::GetShrinkFactor(){
647 return myShrinkFilter->GetShrinkFactor();
650 void SMESH_DeviceActor::SetShrinkFactor(float theValue){
651 theValue = theValue > 0.1? theValue: 0.8;
652 myShrinkFilter->SetShrinkFactor(theValue);
657 void SMESH_DeviceActor::SetHighlited(bool theIsHighlited){
658 if ( myIsHighlited == theIsHighlited )
660 myIsHighlited = theIsHighlited;
664 void SMESH_DeviceActor::Render(vtkRenderer *ren, vtkMapper* m){
665 int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
666 float aStoredFactor, aStoredUnit;
667 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
669 vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
670 float aFactor = myPolygonOffsetFactor, aUnits = myPolygonOffsetUnits;
672 static float EPS = .01;
675 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnits);
676 vtkLODActor::Render(ren,m);
678 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
679 vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
683 void SMESH_DeviceActor::SetPolygonOffsetParameters(float factor, float units){
684 myPolygonOffsetFactor = factor;
685 myPolygonOffsetUnits = units;