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
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 myStoreMapping = theStoreMapping;
151 void SMESH_DeviceActor::Init(TVisualObjPtr theVisualObj,
152 vtkImplicitBoolean* theImplicitBoolean)
154 myVisualObj = theVisualObj;
155 myExtractGeometry->SetImplicitFunction(theImplicitBoolean);
156 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
160 void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){
162 //myIsShrinkable = theGrid->GetNumberOfCells() > 10;
163 myIsShrinkable = true;
165 myExtractGeometry->SetInput(theGrid);
167 myExtractUnstructuredGrid->SetInput(myExtractGeometry->GetOutput());
168 myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput());
170 theGrid = static_cast<vtkUnstructuredGrid*>(myMergeFilter->GetOutput());
173 myPassFilter[ anId ]->SetInput( theGrid );
174 myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() );
177 myGeomFilter->SetStoreMapping( myStoreMapping );
178 myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() );
181 myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() );
182 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
185 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
186 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
189 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
190 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
191 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
192 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
195 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
196 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
198 vtkLODActor::SetMapper( myMapper );
204 SALOME_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){
205 return myExtractUnstructuredGrid;
209 vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){
210 myExtractUnstructuredGrid->Update();
211 return myExtractUnstructuredGrid->GetOutput();
215 void SMESH_DeviceActor::SetControlMode(SMESH::Controls::FunctorPtr theFunctor,
216 vtkScalarBarActor* theScalarBarActor,
217 vtkLookupTable* theLookupTable)
219 bool anIsInitialized = theFunctor;
221 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
222 vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput();
223 aDataSet->ShallowCopy(aGrid);
225 vtkDoubleArray *aScalars = vtkDoubleArray::New();
226 vtkIdType aNbCells = aGrid->GetNumberOfCells();
227 aScalars->SetNumberOfComponents(1);
228 aScalars->SetNumberOfTuples(aNbCells);
230 myVisualObj->UpdateFunctor(theFunctor);
232 using namespace SMESH::Controls;
233 if(NumericalFunctor* aNumericalFunctor = dynamic_cast<NumericalFunctor*>(theFunctor.get())){
234 for(vtkIdType i = 0; i < aNbCells; i++){
235 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
236 vtkIdType anId2 = myExtractGeometry->GetElemObjId(anId);
237 vtkIdType anObjId = myVisualObj->GetElemObjId(anId2);
238 double aValue = aNumericalFunctor->GetValue(anObjId);
239 aScalars->SetValue(i,aValue);
241 }else if(Predicate* aPredicate = dynamic_cast<Predicate*>(theFunctor.get())){
242 for(vtkIdType i = 0; i < aNbCells; i++){
243 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
244 vtkIdType anId2 = myExtractGeometry->GetElemObjId(anId);
245 vtkIdType anObjId = myVisualObj->GetElemObjId(anId2);
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;
271 using namespace SMESH::Controls;
272 if (anIsInitialized){
273 if (Length2D* aLength2D = dynamic_cast<Length2D*>(theFunctor.get())){
274 SMESH::Controls::Length2D::TValues aValues;
276 myVisualObj->UpdateFunctor(theFunctor);
278 aLength2D->GetValues(aValues);
279 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
280 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
282 aDataSet->SetPoints(aGrid->GetPoints());
284 vtkIdType aNbCells = aValues.size();
286 vtkDoubleArray *aScalars = vtkDoubleArray::New();
287 aScalars->SetNumberOfComponents(1);
288 aScalars->SetNumberOfTuples(aNbCells);
290 vtkIdType aCellsSize = 3*aNbCells;
291 vtkCellArray* aConnectivity = vtkCellArray::New();
292 aConnectivity->Allocate( aCellsSize, 0 );
294 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
295 aCellTypesArray->SetNumberOfComponents( 1 );
296 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
298 vtkIdList *anIdList = vtkIdList::New();
299 anIdList->SetNumberOfIds(2);
301 Length2D::TValues::const_iterator anIter = aValues.begin();
302 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
303 const Length2D::Value& aValue = *anIter;
305 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
306 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
308 if(aNode[0] >= 0 && aNode[1] >= 0){
309 anIdList->SetId( 0, aNode[0] );
310 anIdList->SetId( 1, aNode[1] );
311 aConnectivity->InsertNextCell( anIdList );
312 aCellTypesArray->InsertNextValue( VTK_LINE );
313 aScalars->SetValue(aVtkId,aValue.myLength);
317 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
318 aCellLocationsArray->SetNumberOfComponents( 1 );
319 aCellLocationsArray->SetNumberOfTuples( aNbCells );
321 aConnectivity->InitTraversal();
322 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
323 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
325 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
326 SetUnstructuredGrid(aDataSet);
328 aDataSet->GetCellData()->SetScalars(aScalars);
331 theLookupTable->SetRange(aScalars->GetRange());
332 theLookupTable->Build();
334 myMergeFilter->SetScalars(aDataSet);
337 else if (MultiConnection2D* aMultiConnection2D = dynamic_cast<MultiConnection2D*>(theFunctor.get())){
338 SMESH::Controls::MultiConnection2D::MValues aValues;
340 myVisualObj->UpdateFunctor(theFunctor);
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();
365 for(vtkIdType aVtkId; anIter != aValues.end(); anIter++,i++){
366 const MultiConnection2D::Value& aValue = (*anIter).first;
368 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
369 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
371 if(aNode[0] >= 0 && aNode[1] >= 0){
372 anIdList->SetId( 0, aNode[0] );
373 anIdList->SetId( 1, aNode[1] );
374 aConnectivity->InsertNextCell( anIdList );
375 aCellTypesArray->InsertNextValue( VTK_LINE );
376 aScalars->SetValue(i,(*anIter).second);
380 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
381 aCellLocationsArray->SetNumberOfComponents( 1 );
382 aCellLocationsArray->SetNumberOfTuples( aNbCells );
384 aConnectivity->InitTraversal();
385 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
386 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
388 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
389 SetUnstructuredGrid(aDataSet);
391 aDataSet->GetCellData()->SetScalars(aScalars);
394 theLookupTable->SetRange(aScalars->GetRange());
395 theLookupTable->Build();
397 myMergeFilter->SetScalars(aDataSet);
401 GetMapper()->SetScalarVisibility(anIsInitialized);
402 theScalarBarActor->SetVisibility(anIsInitialized);
405 void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
406 SMESH_DeviceActor* theDeviceActor)
408 myExtractUnstructuredGrid->ClearRegisteredCells();
409 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
410 myExtractUnstructuredGrid->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::ePassAll);
411 myVisualObj->UpdateFunctor(theFunctor);
413 using namespace SMESH::Controls;
414 if(FreeBorders* aFreeBorders = dynamic_cast<FreeBorders*>(theFunctor.get())){
415 myExtractUnstructuredGrid->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding);
416 myExtractUnstructuredGrid->ClearRegisteredCells();
417 vtkUnstructuredGrid* aGrid = theDeviceActor->GetUnstructuredGrid();
418 vtkIdType aNbCells = aGrid->GetNumberOfCells();
419 for( vtkIdType i = 0; i < aNbCells; i++ ){
420 vtkIdType anObjId = theDeviceActor->GetElemObjId(i);
421 if(aFreeBorders->IsSatisfy(anObjId))
422 myExtractUnstructuredGrid->RegisterCell(i);
424 if(!myExtractUnstructuredGrid->IsCellsRegistered())
425 myExtractUnstructuredGrid->RegisterCell(-1);
426 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
427 }else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get())){
428 SMESH::Controls::FreeEdges::TBorders aBorders;
429 aFreeEdges->GetBoreders(aBorders);
430 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
431 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
432 aDataSet->SetPoints(aGrid->GetPoints());
434 vtkIdType aNbCells = aBorders.size();
435 vtkIdType aCellsSize = 3*aNbCells;
436 vtkCellArray* aConnectivity = vtkCellArray::New();
437 aConnectivity->Allocate( aCellsSize, 0 );
439 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
440 aCellTypesArray->SetNumberOfComponents( 1 );
441 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
443 vtkIdList *anIdList = vtkIdList::New();
444 anIdList->SetNumberOfIds(2);
446 FreeEdges::TBorders::const_iterator anIter = aBorders.begin();
447 for(; anIter != aBorders.end(); anIter++){
448 const FreeEdges::Border& aBorder = *anIter;
450 myVisualObj->GetNodeVTKId(aBorder.myPntId[0]),
451 myVisualObj->GetNodeVTKId(aBorder.myPntId[1])
453 //cout<<"aNode = "<<aBorder.myPntId[0]<<"; "<<aBorder.myPntId[1]<<endl;
454 if(aNode[0] >= 0 && aNode[1] >= 0){
455 anIdList->SetId( 0, aNode[0] );
456 anIdList->SetId( 1, aNode[1] );
457 aConnectivity->InsertNextCell( anIdList );
458 aCellTypesArray->InsertNextValue( VTK_LINE );
462 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
463 aCellLocationsArray->SetNumberOfComponents( 1 );
464 aCellLocationsArray->SetNumberOfTuples( aNbCells );
466 aConnectivity->InitTraversal();
467 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
468 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
470 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
472 SetUnstructuredGrid(aDataSet);
480 unsigned long int SMESH_DeviceActor::GetMTime(){
481 unsigned long mTime = this->Superclass::GetMTime();
482 mTime = max(mTime,myExtractGeometry->GetMTime());
483 mTime = max(mTime,myExtractUnstructuredGrid->GetMTime());
484 mTime = max(mTime,myMergeFilter->GetMTime());
485 mTime = max(mTime,myGeomFilter->GetMTime());
486 mTime = max(mTime,myTransformFilter->GetMTime());
491 void SMESH_DeviceActor::SetTransform(SALOME_Transform* theTransform){
492 myTransformFilter->SetTransform(theTransform);
496 void SMESH_DeviceActor::SetShrink() {
497 if ( !myIsShrinkable ) return;
498 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
500 myShrinkFilter->SetInput( aDataSet );
501 myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() );
506 void SMESH_DeviceActor::UnShrink() {
507 if ( !myIsShrunk ) return;
508 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
510 myPassFilter[ 1 ]->SetInput( aDataSet );
511 myPassFilter[ 1 ]->Modified();
518 void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){
521 myGeomFilter->SetInside(true);
522 GetProperty()->SetRepresentation(0);
525 myGeomFilter->SetInside(true);
526 GetProperty()->SetRepresentation(1);
529 GetProperty()->SetRepresentation(theMode);
530 myGeomFilter->SetInside(false);
532 myRepresentation = theMode;
533 GetProperty()->Modified();
534 myMapper->Modified();
539 void SMESH_DeviceActor::SetVisibility(int theMode){
540 if(!myExtractUnstructuredGrid->GetInput() || GetUnstructuredGrid()->GetNumberOfCells()){
541 vtkLODActor::SetVisibility(theMode);
543 vtkLODActor::SetVisibility(false);
548 int SMESH_DeviceActor::GetVisibility(){
549 if(!GetUnstructuredGrid()->GetNumberOfCells()){
550 vtkLODActor::SetVisibility(false);
552 return vtkLODActor::GetVisibility();
556 int SMESH_DeviceActor::GetNodeObjId(int theVtkID){
557 vtkIdType anID = myExtractGeometry->GetNodeObjId(theVtkID);
558 vtkIdType aRetID = myVisualObj->GetNodeObjId(anID);
559 if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<<theVtkID<<"; aRetID = "<<aRetID);
563 float* SMESH_DeviceActor::GetNodeCoord(int theObjID){
564 vtkDataSet* aDataSet = myExtractGeometry->GetInput();
565 vtkIdType anID = myVisualObj->GetNodeVTKId(theObjID);
566 float* aCoord = aDataSet->GetPoint(anID);
567 if(MYDEBUG) MESSAGE("GetNodeCoord - theObjID = "<<theObjID<<"; anID = "<<anID);
572 int SMESH_DeviceActor::GetElemObjId(int theVtkID){
573 vtkIdType anId = myGeomFilter->GetElemObjId(theVtkID);
576 vtkIdType anId2 = myExtractUnstructuredGrid->GetInputId(anId);
579 vtkIdType anId3 = myExtractGeometry->GetElemObjId(anId2);
582 vtkIdType aRetID = myVisualObj->GetElemObjId(anId3);
584 MESSAGE("GetElemObjId - theVtkID = "<<theVtkID<<"; anId2 = "<<anId2<<"; anId3 = "<<anId3<<"; aRetID = "<<aRetID);
588 vtkCell* SMESH_DeviceActor::GetElemCell(int theObjID){
589 vtkDataSet* aDataSet = myExtractGeometry->GetInput();
590 vtkIdType aGridID = myVisualObj->GetElemVTKId(theObjID);
591 vtkCell* aCell = aDataSet->GetCell(aGridID);
593 MESSAGE("GetElemCell - theObjID = "<<theObjID<<"; aGridID = "<<aGridID);
598 float SMESH_DeviceActor::GetShrinkFactor(){
599 return myShrinkFilter->GetShrinkFactor();
602 void SMESH_DeviceActor::SetShrinkFactor(float theValue){
603 theValue = theValue > 0.1? theValue: 0.8;
604 myShrinkFilter->SetShrinkFactor(theValue);
609 void SMESH_DeviceActor::SetHighlited(bool theIsHighlited){
610 myIsHighlited = theIsHighlited;
614 void SMESH_DeviceActor::Render(vtkRenderer *ren, vtkMapper* m){
615 int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
616 float aStoredFactor, aStoredUnit;
617 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
619 vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
620 float aFactor = myPolygonOffsetFactor, aUnits = myPolygonOffsetUnits;
622 static float EPS = .01;
625 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnits);
626 vtkLODActor::Render(ren,m);
628 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
629 vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
633 void SMESH_DeviceActor::SetPolygonOffsetParameters(float factor, float units){
634 myPolygonOffsetFactor = factor;
635 myPolygonOffsetUnits = units;