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_Actor.cxx
25 // Author : Nicolas REJNERI
27 // $Header$Header: /home/server/cvs/SMESH/SMESH_SRC/src/OBJECT/SMESH_DeviceActor.cxx,v 1.7 2005/02/02 12:17:51 apo Exp $
30 #include "SMESH_DeviceActor.h"
31 #include "SMESH_ExtractGeometry.h"
32 #include "SMESH_ControlsDef.hxx"
33 #include "SMESH_ActorUtils.h"
35 #include "SALOME_Transform.h"
36 #include "SALOME_TransformFilter.h"
37 #include "SALOME_PassThroughFilter.h"
38 #include "SALOME_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(){
79 if(MYDEBUG) MESSAGE("SMESH_DeviceActor");
81 myIsShrinkable = false;
82 myRepresentation = eSurface;
84 myProperty = vtkProperty::New();
85 myMapper = vtkPolyDataMapper::New();
87 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
88 myPolygonOffsetUnits);
90 myMapper->UseLookupTableScalarRangeOn();
91 myMapper->SetColorModeToMapScalars();
93 myShrinkFilter = vtkShrinkFilter::New();
95 myExtractGeometry = SMESH_ExtractGeometry::New();
96 myExtractGeometry->SetStoreMapping(true);
98 myExtractUnstructuredGrid = SALOME_ExtractUnstructuredGrid::New();
99 myExtractUnstructuredGrid->SetStoreMapping(true);
101 myMergeFilter = vtkMergeFilter::New();
103 myStoreMapping = false;
104 myGeomFilter = SALOME_GeometryFilter::New();
106 myTransformFilter = SALOME_TransformFilter::New();
108 for(int i = 0; i < 6; i++)
109 myPassFilter.push_back(SALOME_PassThroughFilter::New());
113 SMESH_DeviceActor::~SMESH_DeviceActor(){
114 if(MYDEBUG) MESSAGE("~SMESH_DeviceActor");
115 myProperty->Delete();
117 myMapper->RemoveAllInputs();
120 myShrinkFilter->UnRegisterAllOutputs();
121 myShrinkFilter->Delete();
123 myExtractUnstructuredGrid->UnRegisterAllOutputs();
124 myExtractUnstructuredGrid->Delete();
126 myMergeFilter->UnRegisterAllOutputs();
127 myMergeFilter->Delete();
129 myGeomFilter->UnRegisterAllOutputs();
130 myGeomFilter->Delete();
132 myExtractGeometry->UnRegisterAllOutputs();
133 myExtractGeometry->Delete();
135 myTransformFilter->UnRegisterAllOutputs();
136 myTransformFilter->Delete();
138 for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){
139 myPassFilter[i]->UnRegisterAllOutputs();
140 myPassFilter[i]->Delete();
145 void SMESH_DeviceActor::SetStoreMapping(int theStoreMapping){
146 if (myStoreMapping == theStoreMapping)
148 myStoreMapping = theStoreMapping;
149 myGeomFilter->SetStoreMapping( myStoreMapping );
154 void SMESH_DeviceActor::Init(TVisualObjPtr theVisualObj,
155 vtkImplicitBoolean* theImplicitBoolean)
157 myVisualObj = theVisualObj;
158 myExtractGeometry->SetImplicitFunction(theImplicitBoolean);
159 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
163 void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){
165 //myIsShrinkable = theGrid->GetNumberOfCells() > 10;
166 myIsShrinkable = true;
168 myExtractUnstructuredGrid->SetInput(theGrid);
170 myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput());
172 myExtractGeometry->SetInput(myMergeFilter->GetOutput());
175 myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() );
176 myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() );
179 myGeomFilter->SetStoreMapping( myStoreMapping );
180 myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() );
183 myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() );
184 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
187 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
188 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
191 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
192 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
193 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
194 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
197 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
198 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
200 vtkLODActor::SetMapper( myMapper );
206 SALOME_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){
207 return myExtractUnstructuredGrid;
211 vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){
212 myExtractUnstructuredGrid->Update();
213 return myExtractUnstructuredGrid->GetOutput();
217 void SMESH_DeviceActor::SetControlMode(SMESH::Controls::FunctorPtr theFunctor,
218 vtkScalarBarActor* theScalarBarActor,
219 vtkLookupTable* theLookupTable)
221 bool anIsInitialized = theFunctor;
223 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
224 vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput();
225 aDataSet->ShallowCopy(aGrid);
227 vtkDoubleArray *aScalars = vtkDoubleArray::New();
228 vtkIdType aNbCells = aGrid->GetNumberOfCells();
229 aScalars->SetNumberOfComponents(1);
230 aScalars->SetNumberOfTuples(aNbCells);
232 myVisualObj->UpdateFunctor(theFunctor);
234 using namespace SMESH::Controls;
235 if(NumericalFunctor* aNumericalFunctor = dynamic_cast<NumericalFunctor*>(theFunctor.get())){
236 for(vtkIdType i = 0; i < aNbCells; i++){
237 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
238 vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
239 double aValue = aNumericalFunctor->GetValue(anObjId);
240 aScalars->SetValue(i,aValue);
242 }else if(Predicate* aPredicate = dynamic_cast<Predicate*>(theFunctor.get())){
243 for(vtkIdType i = 0; i < aNbCells; i++){
244 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
245 vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
246 bool aValue = aPredicate->IsSatisfy(anObjId);
247 aScalars->SetValue(i,aValue);
251 aDataSet->GetCellData()->SetScalars(aScalars);
254 theLookupTable->SetRange(aScalars->GetRange());
255 theLookupTable->Build();
257 myMergeFilter->SetScalars(aDataSet);
260 GetMapper()->SetScalarVisibility(anIsInitialized);
261 theScalarBarActor->SetVisibility(anIsInitialized);
264 void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
265 SMESH_DeviceActor* theDeviceActor,
266 vtkScalarBarActor* theScalarBarActor,
267 vtkLookupTable* theLookupTable)
269 bool anIsInitialized = theFunctor;
270 myExtractUnstructuredGrid->ClearRegisteredCells();
271 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
272 myExtractUnstructuredGrid->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::ePassAll);
273 myVisualObj->UpdateFunctor(theFunctor);
275 using namespace SMESH::Controls;
276 if (anIsInitialized){
277 if (Length2D* aLength2D = dynamic_cast<Length2D*>(theFunctor.get())){
278 SMESH::Controls::Length2D::TValues aValues;
280 aLength2D->GetValues(aValues);
281 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
282 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
284 aDataSet->SetPoints(aGrid->GetPoints());
286 vtkIdType aNbCells = aValues.size();
288 vtkDoubleArray *aScalars = vtkDoubleArray::New();
289 aScalars->SetNumberOfComponents(1);
290 aScalars->SetNumberOfTuples(aNbCells);
292 vtkIdType aCellsSize = 3*aNbCells;
293 vtkCellArray* aConnectivity = vtkCellArray::New();
294 aConnectivity->Allocate( aCellsSize, 0 );
296 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
297 aCellTypesArray->SetNumberOfComponents( 1 );
298 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
300 vtkIdList *anIdList = vtkIdList::New();
301 anIdList->SetNumberOfIds(2);
303 Length2D::TValues::const_iterator anIter = aValues.begin();
304 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
305 const Length2D::Value& aValue = *anIter;
307 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
308 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
310 if(aNode[0] >= 0 && aNode[1] >= 0){
311 anIdList->SetId( 0, aNode[0] );
312 anIdList->SetId( 1, aNode[1] );
313 aConnectivity->InsertNextCell( anIdList );
314 aCellTypesArray->InsertNextValue( VTK_LINE );
315 aScalars->SetValue(aVtkId,aValue.myLength);
319 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
320 aCellLocationsArray->SetNumberOfComponents( 1 );
321 aCellLocationsArray->SetNumberOfTuples( aNbCells );
323 aConnectivity->InitTraversal();
324 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
325 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
327 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
328 SetUnstructuredGrid(aDataSet);
330 aDataSet->GetCellData()->SetScalars(aScalars);
333 theLookupTable->SetRange(aScalars->GetRange());
334 theLookupTable->Build();
336 myMergeFilter->SetScalars(aDataSet);
339 else if (MultiConnection2D* aMultiConnection2D = dynamic_cast<MultiConnection2D*>(theFunctor.get())){
340 SMESH::Controls::MultiConnection2D::MValues aValues;
342 aMultiConnection2D->GetValues(aValues);
343 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
344 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
345 aDataSet->SetPoints(aGrid->GetPoints());
347 vtkIdType aNbCells = aValues.size();
348 vtkDoubleArray *aScalars = vtkDoubleArray::New();
349 aScalars->SetNumberOfComponents(1);
350 aScalars->SetNumberOfTuples(aNbCells);
352 vtkIdType aCellsSize = 3*aNbCells;
353 vtkCellArray* aConnectivity = vtkCellArray::New();
354 aConnectivity->Allocate( aCellsSize, 0 );
356 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
357 aCellTypesArray->SetNumberOfComponents( 1 );
358 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
360 vtkIdList *anIdList = vtkIdList::New();
361 anIdList->SetNumberOfIds(2);
363 MultiConnection2D::MValues::const_iterator anIter = aValues.begin();
364 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
365 const MultiConnection2D::Value& aValue = (*anIter).first;
367 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
368 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
370 if(aNode[0] >= 0 && aNode[1] >= 0){
371 anIdList->SetId( 0, aNode[0] );
372 anIdList->SetId( 1, aNode[1] );
373 aConnectivity->InsertNextCell( anIdList );
374 aCellTypesArray->InsertNextValue( VTK_LINE );
375 aScalars->SetValue(aVtkId,(*anIter).second);
379 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
380 aCellLocationsArray->SetNumberOfComponents( 1 );
381 aCellLocationsArray->SetNumberOfTuples( aNbCells );
383 aConnectivity->InitTraversal();
384 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
385 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
387 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
388 SetUnstructuredGrid(aDataSet);
390 aDataSet->GetCellData()->SetScalars(aScalars);
393 theLookupTable->SetRange(aScalars->GetRange());
394 theLookupTable->Build();
396 myMergeFilter->SetScalars(aDataSet);
400 GetMapper()->SetScalarVisibility(anIsInitialized);
401 theScalarBarActor->SetVisibility(anIsInitialized);
404 void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
405 SMESH_DeviceActor* theDeviceActor)
407 myExtractUnstructuredGrid->ClearRegisteredCells();
408 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
409 myExtractUnstructuredGrid->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::ePassAll);
410 myVisualObj->UpdateFunctor(theFunctor);
412 using namespace SMESH::Controls;
413 if(FreeBorders* aFreeBorders = dynamic_cast<FreeBorders*>(theFunctor.get())){
414 myExtractUnstructuredGrid->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding);
415 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
416 vtkIdType aNbCells = aGrid->GetNumberOfCells();
417 for( vtkIdType i = 0; i < aNbCells; i++ ){
418 vtkIdType anObjId = myVisualObj->GetElemObjId(i);
419 if(aFreeBorders->IsSatisfy(anObjId))
420 myExtractUnstructuredGrid->RegisterCell(i);
422 if(!myExtractUnstructuredGrid->IsCellsRegistered())
423 myExtractUnstructuredGrid->RegisterCell(-1);
424 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
425 }else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get())){
426 SMESH::Controls::FreeEdges::TBorders aBorders;
427 aFreeEdges->GetBoreders(aBorders);
428 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
429 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
430 aDataSet->SetPoints(aGrid->GetPoints());
432 vtkIdType aNbCells = aBorders.size();
433 vtkIdType aCellsSize = 3*aNbCells;
434 vtkCellArray* aConnectivity = vtkCellArray::New();
435 aConnectivity->Allocate( aCellsSize, 0 );
437 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
438 aCellTypesArray->SetNumberOfComponents( 1 );
439 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
441 vtkIdList *anIdList = vtkIdList::New();
442 anIdList->SetNumberOfIds(2);
444 FreeEdges::TBorders::const_iterator anIter = aBorders.begin();
445 for(; anIter != aBorders.end(); anIter++){
446 const FreeEdges::Border& aBorder = *anIter;
448 myVisualObj->GetNodeVTKId(aBorder.myPntId[0]),
449 myVisualObj->GetNodeVTKId(aBorder.myPntId[1])
451 //cout<<"aNode = "<<aBorder.myPntId[0]<<"; "<<aBorder.myPntId[1]<<endl;
452 if(aNode[0] >= 0 && aNode[1] >= 0){
453 anIdList->SetId( 0, aNode[0] );
454 anIdList->SetId( 1, aNode[1] );
455 aConnectivity->InsertNextCell( anIdList );
456 aCellTypesArray->InsertNextValue( VTK_LINE );
460 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
461 aCellLocationsArray->SetNumberOfComponents( 1 );
462 aCellLocationsArray->SetNumberOfTuples( aNbCells );
464 aConnectivity->InitTraversal();
465 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
466 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
468 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
470 SetUnstructuredGrid(aDataSet);
478 unsigned long int SMESH_DeviceActor::GetMTime(){
479 unsigned long mTime = this->Superclass::GetMTime();
480 mTime = max(mTime,myExtractGeometry->GetMTime());
481 mTime = max(mTime,myExtractUnstructuredGrid->GetMTime());
482 mTime = max(mTime,myMergeFilter->GetMTime());
483 mTime = max(mTime,myGeomFilter->GetMTime());
484 mTime = max(mTime,myTransformFilter->GetMTime());
489 void SMESH_DeviceActor::SetTransform(SALOME_Transform* theTransform){
490 myTransformFilter->SetTransform(theTransform);
494 void SMESH_DeviceActor::SetShrink() {
495 if ( !myIsShrinkable ) return;
496 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
498 myShrinkFilter->SetInput( aDataSet );
499 myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() );
504 void SMESH_DeviceActor::UnShrink() {
505 if ( !myIsShrunk ) return;
506 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
508 myPassFilter[ 1 ]->SetInput( aDataSet );
509 myPassFilter[ 1 ]->Modified();
516 void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){
519 myGeomFilter->SetInside(true);
520 GetProperty()->SetRepresentation(0);
523 myGeomFilter->SetInside(true);
524 GetProperty()->SetRepresentation(1);
527 GetProperty()->SetRepresentation(theMode);
528 myGeomFilter->SetInside(false);
530 myRepresentation = theMode;
531 GetProperty()->Modified();
532 myMapper->Modified();
537 void SMESH_DeviceActor::SetVisibility(int theMode){
538 if(!myExtractUnstructuredGrid->GetInput() || GetUnstructuredGrid()->GetNumberOfCells()){
539 vtkLODActor::SetVisibility(theMode);
541 vtkLODActor::SetVisibility(false);
546 int SMESH_DeviceActor::GetVisibility(){
547 if(!GetUnstructuredGrid()->GetNumberOfCells()){
548 vtkLODActor::SetVisibility(false);
550 return vtkLODActor::GetVisibility();
554 int SMESH_DeviceActor::GetNodeObjId(int theVtkID){
555 vtkIdType anID = myExtractGeometry->GetNodeObjId(theVtkID);
556 vtkIdType aRetID = myVisualObj->GetNodeObjId(anID);
557 if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<<theVtkID<<"; aRetID = "<<aRetID);
561 float* SMESH_DeviceActor::GetNodeCoord(int theObjID){
562 vtkDataSet* aDataSet = myExtractGeometry->GetInput();
563 vtkIdType anID = myVisualObj->GetNodeVTKId(theObjID);
564 float* aCoord = aDataSet->GetPoint(anID);
565 if(MYDEBUG) MESSAGE("GetNodeCoord - theObjID = "<<theObjID<<"; anID = "<<anID);
570 int SMESH_DeviceActor::GetElemObjId(int theVtkID){
571 vtkIdType anId = myGeomFilter->GetElemObjId(theVtkID);
574 vtkIdType anId2 = myExtractGeometry->GetElemObjId(anId);
577 vtkIdType anId3 = myExtractUnstructuredGrid->GetInputId(anId2);
580 vtkIdType aRetID = myVisualObj->GetElemObjId(anId3);
582 MESSAGE("GetElemObjId - theVtkID = "<<theVtkID<<"; anId2 = "<<anId2<<"; anId3 = "<<anId3<<"; aRetID = "<<aRetID);
586 vtkCell* SMESH_DeviceActor::GetElemCell(int theObjID){
587 vtkDataSet* aDataSet = myVisualObj->GetUnstructuredGrid();
588 vtkIdType aGridID = myVisualObj->GetElemVTKId(theObjID);
589 vtkCell* aCell = aDataSet->GetCell(aGridID);
591 MESSAGE("GetElemCell - theObjID = "<<theObjID<<"; aGridID = "<<aGridID);
596 float SMESH_DeviceActor::GetShrinkFactor(){
597 return myShrinkFilter->GetShrinkFactor();
600 void SMESH_DeviceActor::SetShrinkFactor(float theValue){
601 theValue = theValue > 0.1? theValue: 0.8;
602 myShrinkFilter->SetShrinkFactor(theValue);
607 void SMESH_DeviceActor::SetHighlited(bool theIsHighlited){
608 myIsHighlited = theIsHighlited;
612 void SMESH_DeviceActor::Render(vtkRenderer *ren, vtkMapper* m){
613 int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
614 float aStoredFactor, aStoredUnit;
615 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
617 vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
618 float aFactor = myPolygonOffsetFactor, aUnits = myPolygonOffsetUnits;
620 static float EPS = .01;
623 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnits);
624 vtkLODActor::Render(ren,m);
626 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
627 vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
631 void SMESH_DeviceActor::SetPolygonOffsetParameters(float factor, float units){
632 myPolygonOffsetFactor = factor;
633 myPolygonOffsetUnits = units;