1 // Copyright (C) 2007-2021 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, or (at your option) any later version.
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
23 // GEOM OBJECT : interactive object for Geometry entities visualization
24 // File : GEOM_Actor.cxx
25 // Author : Christophe ATTANASIO
29 \class GEOM_Actor GEOM_Actor.h
30 \brief This class allows to display an OpenCASCADE CAD model in a VTK viewer.
32 #include "GEOM_Actor.h"
34 #include "GEOM_DeviceActor.h"
35 #include "GEOM_VertexSource.h"
36 #include "GEOM_EdgeSource.h"
37 #include "GEOM_WireframeFace.h"
38 #include "GEOM_ShadingFace.h"
39 #include "GEOM_PainterPolyDataMapper.h"
40 #include "GEOMUtils.hxx"
41 #include "SVTK_Actor.h"
43 #include <OCC2VTK_Tools.h>
44 #include <GEOMUtils.hxx>
46 #include <vtkObjectFactory.h>
47 #include <vtkRenderer.h>
48 #include <vtkTextActor.h>
49 #include <vtkTextProperty.h>
50 #include <vtkProperty.h>
51 #include <vtkPointPicker.h>
52 #include <vtkCellPicker.h>
54 #include <TopAbs_ShapeEnum.hxx>
55 #include <TopExp_Explorer.hxx>
57 #include <BRep_Tool.hxx>
60 #include <vtkPolyDataWriter.h>
62 #include <vtkAppendPolyData.h>
63 #include <vtkPolyDataMapper.h>
64 #include <vtkPolyData.h>
65 #include <vtkTransform.h>
66 #include <vtkMatrix4x4.h>
68 #include <vtkCamera.h>
70 #include "utilities.h"
72 #include "SALOME_InteractiveObject.hxx"
74 //vtkStandardNewMacro(GEOM_Actor)
80 GEOM_Actor::GEOM_Actor():
86 // myDisplayMode(eWireframe),
89 myVerticesMode(false),
92 myVertexActor(GEOM_DeviceActor::New(),true),
93 myVertexSource(GEOM_VertexSource::New(),true),
95 myStandaloneVertexActor(GEOM_DeviceActor::New(),true),
96 myStandaloneVertexSource(GEOM_VertexSource::New(),true),
98 myIsolatedEdgeActor(GEOM_DeviceActor::New(),true),
99 myIsolatedEdgeSource(GEOM_EdgeSource::New(),true),
101 myOneFaceEdgeActor(GEOM_DeviceActor::New(),true),
102 myOneFaceEdgeSource(GEOM_EdgeSource::New(),true),
104 mySharedEdgeActor(GEOM_DeviceActor::New(),true),
105 mySharedEdgeSource(GEOM_EdgeSource::New(),true),
107 myWireframeFaceActor(GEOM_DeviceActor::New(),true),
108 myWireframeFaceSource(GEOM_WireframeFace::New(),true),
110 myShadingFaceActor(GEOM_DeviceActor::New(),true),
111 myShadingFaceSource(GEOM_ShadingFace::New(),true),
113 myHighlightActor(GEOM_DeviceActor::New(),true),
115 myTextActor( vtkTextActor::New() ),
117 myHighlightProp(vtkProperty::New()),
118 myPreHighlightProp(vtkProperty::New()),
119 myShadingFaceProp(vtkProperty::New()),
120 myShadingBackFaceProp(vtkProperty::New()),
122 myAppendFilter(vtkAppendPolyData::New(),true),
123 // Use mapper as an instance of GEOM_PainterPolyDataMapper class
124 // to prevent drawing of mappers' content (due to an empty definition
125 // of GEOM_PainterPolyDataMapper::RenderPiece(...)).
126 // !!! Presentation of GEOM_Actor is drawing only with help of actors
127 // defined in this class !!!
128 myPolyDataMapper(GEOM_PainterPolyDataMapper::New(),true)
131 MESSAGE (this<< " GEOM_Actor::GEOM_Actor");
134 myPolyDataMapper->SetInputConnection(myAppendFilter->GetOutputPort());
135 vtkProperty* aProperty;
137 myHighlightProp->SetAmbient(0.5);
138 myHighlightProp->SetDiffuse(0.3);
139 myHighlightProp->SetSpecular(0.2);
140 myHighlightProp->SetRepresentationToSurface();
141 myHighlightProp->SetAmbientColor(1, 1, 1);
142 myHighlightProp->SetDiffuseColor(1, 1, 1);
143 myHighlightProp->SetSpecularColor(0.5, 0.5, 0.5);
144 myHighlightProp->SetPointSize(SALOME_POINT_SIZE+2);
145 myHighlightActor->SetProperty(myHighlightProp.GetPointer());
147 this->myHighlightActor->SetInput(myAppendFilter->GetOutputPort(),false);
149 myPreHighlightProp->SetColor(0,1,1);
150 myPreHighlightProp->SetPointSize(SALOME_POINT_SIZE);
151 myPreHighlightProp->SetLineWidth(SALOME_LINE_WIDTH+1);
152 myPreHighlightProp->SetRepresentationToWireframe();
154 myAppendFilter->AddInputConnection(myVertexSource->GetOutputPort());
155 myVertexActor->SetInput(myVertexSource->GetOutputPort(),false);
156 aProperty = myVertexActor->GetProperty();
157 aProperty->SetRepresentation(VTK_POINTS);
158 aProperty->SetPointSize(3);
159 aProperty->SetColor(1, 1, 0);
161 myAppendFilter->AddInputConnection(myStandaloneVertexSource->GetOutputPort());
162 myStandaloneVertexActor->SetInput(myStandaloneVertexSource->GetOutputPort(),false);
163 aProperty = myStandaloneVertexActor->GetProperty();
164 aProperty->SetRepresentation(VTK_POINTS);
165 aProperty->SetPointSize(3);
166 aProperty->SetColor(1, 1, 0);
168 myAppendFilter->AddInputConnection(myIsolatedEdgeSource->GetOutputPort());
169 myIsolatedEdgeActor->SetInput(myIsolatedEdgeSource->GetOutputPort(),false);
170 aProperty = myIsolatedEdgeActor->GetProperty();
171 aProperty->SetRepresentation(VTK_WIREFRAME);
172 myIsolatedEdgeColor[0] = 1; myIsolatedEdgeColor[1] = 0; myIsolatedEdgeColor[2] = 0;
173 aProperty->SetColor(myIsolatedEdgeColor[0], myIsolatedEdgeColor[1], myIsolatedEdgeColor[2]);
175 myAppendFilter->AddInputConnection(myOneFaceEdgeSource->GetOutputPort());
176 myOneFaceEdgeActor->SetInput(myOneFaceEdgeSource->GetOutputPort(),false);
177 aProperty = myOneFaceEdgeActor->GetProperty();
178 aProperty->SetRepresentation(VTK_WIREFRAME);
179 myOneFaceEdgeColor[0] = 0; myOneFaceEdgeColor[1] = 1; myOneFaceEdgeColor[2] = 0;
180 aProperty->SetColor(myOneFaceEdgeColor[0], myOneFaceEdgeColor[1], myOneFaceEdgeColor[2]);
182 myAppendFilter->AddInputConnection(mySharedEdgeSource->GetOutputPort());
183 mySharedEdgeActor->SetInput(mySharedEdgeSource->GetOutputPort(),false);
184 aProperty = mySharedEdgeActor->GetProperty();
185 aProperty->SetRepresentation(VTK_WIREFRAME);
186 mySharedEdgeColor[0] = 1; mySharedEdgeColor[1] = 1; mySharedEdgeColor[2] = 0;
187 aProperty->SetColor(mySharedEdgeColor[0], mySharedEdgeColor[1], mySharedEdgeColor[2]);
189 myAppendFilter->AddInputConnection(myWireframeFaceSource->GetOutputPort());
190 myWireframeFaceActor->SetInput(myWireframeFaceSource->GetOutputPort(),false);
191 aProperty = myWireframeFaceActor->GetProperty();
192 aProperty->SetRepresentation(VTK_WIREFRAME);
193 aProperty->SetColor(0.5, 0.5, 0.5);
195 myShadingFaceActor->SetInput(myShadingFaceSource->GetOutputPort(),true);
197 myShadingFaceProp->SetRepresentation(VTKViewer::Representation::Surface);
198 myShadingFaceProp->SetInterpolationToGouraud();
199 myShadingFaceProp->SetAmbient(1.0);
200 myShadingFaceProp->SetDiffuse(1.0);
201 myShadingFaceProp->SetSpecular(0.4);
202 myShadingFaceProp->SetAmbientColor(0.329412, 0.223529, 0.027451);
203 myShadingFaceProp->SetDiffuseColor(0.780392, 0.568627, 0.113725);
204 myShadingFaceProp->SetSpecularColor(0.992157, 0.941176, 0.807843);
206 myShadingFaceActor->SetProperty(myShadingFaceProp.GetPointer());
208 // Toggle display mode
209 setDisplayMode(0); // WIRE FRAME
211 SetVerticesMode(0); //
216 GEOM_Actor::~GEOM_Actor()
219 MESSAGE (this<< " ~GEOM_Actor::GEOM_Actor");
221 myTextActor->Delete();
222 myHighlightProp->Delete();
223 myPreHighlightProp->Delete();
224 myShadingFaceProp->Delete();
225 myShadingBackFaceProp->Delete();
232 GEOM_Actor* anObject = new GEOM_Actor();
233 anObject->SetMapper(anObject->myPolyDataMapper.Get());
238 void Write(vtkPolyData* theDataSet, const char* theFileName){
239 vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
240 MESSAGE ("Write - "<<theFileName<<"' : "<<theDataSet->GetNumberOfPoints()<<"; "<<theDataSet->GetNumberOfCells());
241 aWriter->SetInputData(theDataSet);
242 aWriter->SetFileName(theFileName);
251 this->myVertexSource->Modified();
252 this->myStandaloneVertexSource->Modified();
253 this->myIsolatedEdgeSource->Modified();
254 this->myOneFaceEdgeSource->Modified();
255 this->mySharedEdgeSource->Modified();
256 this->myWireframeFaceSource->Modified();
257 this->myShadingFaceSource->Modified();
258 this->myTextActor->Modified();
263 SetMapper(vtkMapper* theMapper)
265 SALOME_Actor::SetMapper(theMapper);
270 AddToRender(vtkRenderer* theRenderer)
272 //SALOME_Actor::AddToRender(theRenderer);
274 theRenderer->AddActor(this);
276 this->myHighlightActor->AddToRender(theRenderer);
279 myShadingFaceActor->AddToRender(theRenderer);
280 myWireframeFaceActor->AddToRender(theRenderer);
282 mySharedEdgeActor->AddToRender(theRenderer);
283 myOneFaceEdgeActor->AddToRender(theRenderer);
284 myIsolatedEdgeActor->AddToRender(theRenderer);
286 myVertexActor->AddToRender(theRenderer);
287 myStandaloneVertexActor->AddToRender(theRenderer);
289 theRenderer->AddActor( myTextActor );
294 RemoveFromRender(vtkRenderer* theRenderer)
296 //SALOME_Actor::RemoveFromRender(theRenderer);
299 theRenderer->RemoveActor(this);
301 myHighlightActor->RemoveFromRender(theRenderer);
302 myShadingFaceActor->RemoveFromRender(theRenderer);
303 myWireframeFaceActor->RemoveFromRender(theRenderer);
305 mySharedEdgeActor->RemoveFromRender(theRenderer);
306 myOneFaceEdgeActor->RemoveFromRender(theRenderer);
307 myIsolatedEdgeActor->RemoveFromRender(theRenderer);
309 myVertexActor->RemoveFromRender(theRenderer);
310 myStandaloneVertexActor->RemoveFromRender(theRenderer);
312 theRenderer->RemoveActor( myTextActor );
315 SetVisibility(false);
320 setDisplayMode(int theMode)
323 MESSAGE ( "GEOM_Actor::setDisplayMode = "<<theMode );
326 if ( theMode == (int)eShadingWithEdges ) {
328 myIsolatedEdgeActor->GetProperty()->SetColor(myIsolatedEdgeColor[0],
329 myIsolatedEdgeColor[1],
330 myIsolatedEdgeColor[2]);
331 myOneFaceEdgeActor->GetProperty()->SetColor(myEdgesInShadingColor[0],
332 myEdgesInShadingColor[1],
333 myEdgesInShadingColor[2]);
334 mySharedEdgeActor->GetProperty()->SetColor(myEdgesInShadingColor[0],
335 myEdgesInShadingColor[1],
336 myEdgesInShadingColor[2]);
340 myIsolatedEdgeActor->GetProperty()->SetColor(myIsolatedEdgeColor[0],
341 myIsolatedEdgeColor[1],
342 myIsolatedEdgeColor[2]);
343 mySharedEdgeActor->GetProperty()->SetColor(mySharedEdgeColor[0],
344 mySharedEdgeColor[1],
345 mySharedEdgeColor[2]);
346 myOneFaceEdgeActor->GetProperty()->SetColor(myOneFaceEdgeColor[0],
347 myOneFaceEdgeColor[1],
348 myOneFaceEdgeColor[2]);
351 VTKViewer_Actor::setDisplayMode(theMode);
352 SetVisibility(GetVisibility());
357 SetSelected(bool theIsSelected)
360 MESSAGE ( "GEOM_Actor::SetSelected = "<<theIsSelected );
363 myIsSelected = theIsSelected;
364 SetVisibility(GetVisibility());
369 SetVisibility(int theVisibility)
372 MESSAGE ( "GEOM_Actor::SetVisibility = "<<theVisibility <<" myIsSelected="<< myIsSelected
373 << " theVisibility="<<theVisibility<<" myIsPreselected="<<myIsPreselected );
376 SALOME_Actor::SetVisibility(theVisibility);
378 this->myHighlightActor->SetVisibility(theVisibility && (myIsSelected || myIsPreselected));
380 myShadingFaceActor->SetVisibility(theVisibility && (myDisplayMode == (int)eShading || myDisplayMode == (int)eShadingWithEdges) && (!myIsSelected || !myIsPreselected));
381 myWireframeFaceActor->SetVisibility(theVisibility && (myDisplayMode == (int)eWireframe) && !myIsSelected);
383 mySharedEdgeActor->SetVisibility(theVisibility && (myDisplayMode == (int)eWireframe || myDisplayMode == (int)eShadingWithEdges) && !myIsSelected);
384 myOneFaceEdgeActor->SetVisibility(theVisibility && (myDisplayMode == (int)eWireframe || myDisplayMode == (int)eShadingWithEdges) && !myIsSelected);
385 myIsolatedEdgeActor->SetVisibility(theVisibility && !myIsSelected);
387 myVertexActor->SetVisibility(theVisibility && (isOnlyVertex || (myVerticesMode && (!myIsSelected && !myIsPreselected))));// must be added new mode points
389 myStandaloneVertexActor->SetVisibility(theVisibility);
391 myTextActor->SetVisibility( theVisibility && myNameMode );
397 ::SetNbIsos(const int theNb[2])
399 myWireframeFaceSource->SetNbIso(theNb);
404 ::GetNbIsos(int &theNbU,int &theNbV)
406 myWireframeFaceSource->GetNbIso(theNbU, theNbV);
411 ::SetVectorMode(bool theMode)
413 myVectorMode = theMode;
414 myIsolatedEdgeSource->SetVectorMode(theMode);
415 myOneFaceEdgeSource->SetVectorMode(theMode);
416 mySharedEdgeSource->SetVectorMode(theMode);
429 ::SetVerticesMode(bool theMode)
431 myVerticesMode = theMode;
432 if ( theMode || isOnlyVertex ) {
433 myAppendFilter->AddInputConnection(myVertexSource->GetOutputPort());
435 myAppendFilter->RemoveInputConnection(0, myVertexSource->GetOutputPort());
444 return myVerticesMode;
451 if( !getIO() || myShape.IsNull() )
454 gp_Ax3 anAx3 = GEOMUtils::GetPosition(myShape);
455 double center[3] = { anAx3.Location().X(),
456 anAx3.Location().Y(),
457 anAx3.Location().Z() };
458 double* pos = center;
459 myTextActor->GetTextProperty()->SetFontSize( 16 );
460 myTextActor->GetTextProperty()->ShadowOn();
461 myTextActor->GetPositionCoordinate()->SetCoordinateSystemToWorld();
462 myTextActor->GetPositionCoordinate()->SetValue(pos);
463 myTextActor->SetInput( getIO()->getName() );
468 ::SetNameMode(bool theMode)
470 myNameMode = theMode;
471 myTextActor->SetVisibility(theMode);
484 SetDeflection(double theDeflection)
486 double aDeflection = ( theDeflection <= 0 ) ? GEOMUtils::DefaultDeflection() : theDeflection;
488 if ( myDeflection != aDeflection ) {
489 myDeflection = aDeflection;
490 GEOMUtils::MeshShape( myShape, myDeflection );
495 void GEOM_Actor::SetShape (const TopoDS_Shape& theShape,
496 double theDeflection,
501 myVertexSource->Clear();
502 myStandaloneVertexSource->Clear();
503 myIsolatedEdgeSource->Clear();
504 myOneFaceEdgeSource->Clear();
505 mySharedEdgeSource->Clear();
506 myWireframeFaceSource->Clear();
507 myShadingFaceSource->Clear();
509 TopExp_Explorer aVertexExp (theShape,TopAbs_VERTEX);
510 for (; aVertexExp.More(); aVertexExp.Next())
512 const TopoDS_Vertex& aVertex = TopoDS::Vertex(aVertexExp.Current());
513 myVertexSource->AddVertex(aVertex);
516 SetDeflection(theDeflection);
518 // look if edges are free or shared
519 TopTools_IndexedDataMapOfShapeListOfShape anEdgeMap;
520 TopExp::MapShapesAndAncestors(theShape,TopAbs_EDGE,TopAbs_FACE,anEdgeMap);
522 GEOM::ShapeToVTK(theShape,anEdgeMap,theIsVector,
523 myStandaloneVertexSource.Get(),
524 myIsolatedEdgeSource.Get(),
525 myOneFaceEdgeSource.Get(),
526 mySharedEdgeSource.Get(),
527 myWireframeFaceSource.Get(),
528 myShadingFaceSource.Get());
530 myIsolatedEdgeSource->IsEmpty() &&
531 myOneFaceEdgeSource->IsEmpty() &&
532 mySharedEdgeSource->IsEmpty() &&
533 myWireframeFaceSource->IsEmpty() &&
534 myShadingFaceSource->IsEmpty();
537 if((bool)myShape.Infinite() || isOnlyVertex ){
538 myVertexActor->GetDeviceActor()->SetInfinitive(true);
539 myStandaloneVertexActor->GetDeviceActor()->SetInfinitive(true);
540 myHighlightActor->GetDeviceActor()->SetInfinitive(true);
545 // 0051777: TC7.2.0: Element could not be selected in Hypothesis Construction
546 myAppendFilter->Update();
549 // warning! must be checked!
550 // SetHighlightProperty
551 // SetWireframeProperty
552 // SetShadingProperty
554 void GEOM_Actor::SetHighlightProperty(vtkProperty* Prop)
557 MESSAGE ( "GEOM_Actor::SetHighlightProperty" );
559 this->myHighlightActor->GetProperty()->DeepCopy(Prop);
563 void GEOM_Actor::SetWireframeProperty(vtkProperty* Prop)
566 MESSAGE ( this << " GEOM_Actor::SetWireframeProperty" );
569 myWireframeFaceActor->SetProperty(Prop);
573 vtkProperty* GEOM_Actor::GetWireframeProperty()
575 return myWireframeFaceActor->GetProperty();
578 vtkProperty* GEOM_Actor::GetIsolatedEdgeProperty()
580 return myIsolatedEdgeActor->GetProperty();
583 vtkProperty* GEOM_Actor::GetVertexProperty()
585 return myVertexActor->GetProperty();
588 vtkProperty* GEOM_Actor::GetStandaloneVertexProperty()
590 return myStandaloneVertexActor->GetProperty();
593 vtkProperty* GEOM_Actor::GetSharedEdgeProperty()
595 return mySharedEdgeActor->GetProperty();
598 vtkProperty* GEOM_Actor::GetFaceEdgeProperty()
600 return myOneFaceEdgeActor->GetProperty();
603 void GEOM_Actor::SetShadingProperty(vtkProperty* Prop)
606 MESSAGE ( "GEOM_Actor::SetShadingProperty" );
608 myShadingFaceProp->DeepCopy(Prop);
612 vtkProperty* GEOM_Actor::GetShadingProperty()
614 return myShadingFaceProp;
618 void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *theMapper)
621 MESSAGE ( "GEOM_Actor::Render" );
627 /* render the property */
628 if (!this->Property) {
629 // force creation of a property
631 this->Property->SetInterpolation(1);
632 this->Property->SetRepresentationToSurface();
633 this->Property->SetAmbient(0.3);
634 this->Property->SetAmbientColor(0.88,0.86,0.2);
635 this->Property->SetDiffuseColor(0.99,0.7,0.21);
636 this->Property->SetSpecularColor(0.99,0.98,0.83);
639 switch(myDisplayMode){
640 case eWireframe://wireframe
641 myPreHighlightProp->SetRepresentationToWireframe();
642 myHighlightProp->SetRepresentationToWireframe();
644 case eShading://shading
645 case eShadingWithEdges://shading with edges
646 myPreHighlightProp->SetRepresentationToSurface();
647 myHighlightProp->SetRepresentationToSurface();
648 myShadingFaceProp->SetRepresentationToSurface();
649 myShadingBackFaceProp->SetRepresentationToSurface();
655 this->myHighlightActor->SetProperty(myPreHighlightProp.GetPointer());
656 myShadingFaceActor->SetProperty(myPreHighlightProp.GetPointer());
657 myShadingFaceActor->SetBackfaceProperty(myPreHighlightProp.GetPointer());
659 this->myHighlightActor->SetProperty(myShadingFaceProp.GetPointer());
660 myShadingFaceActor->SetProperty(myShadingFaceProp.GetPointer());
661 myShadingFaceActor->SetBackfaceProperty(myShadingBackFaceProp.GetPointer());
665 this->myHighlightActor->SetProperty(myHighlightProp.GetPointer());
666 myShadingFaceActor->SetProperty(myHighlightProp.GetPointer());
667 myShadingFaceActor->SetBackfaceProperty(myHighlightProp.GetPointer());
670 this->Property->Render(this, ren);
671 if (this->BackfaceProperty) {
672 this->BackfaceProperty->BackfaceRender(this, ren);
673 this->Device->SetBackfaceProperty(this->BackfaceProperty);
675 this->Device->SetProperty(this->Property);
676 /* if(myShape.ShapeType() == TopAbs_VERTEX) {
678 //The parameter determine size of vertex actor relate to diagonal of RendererWindow
679 static double delta = 0.01;
680 double X1 = -1, Y1 = -1, Z1 = 0;
681 ren->ViewToWorld(X1,Y1,Z1);
682 double X2 = +1, Y2 = +1, Z2 = 0;
683 ren->ViewToWorld(X2,Y2,Z2);
684 Z2 = sqrt((X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1) + (Z2-Z1)*(Z2-Z1));
685 this->SetScale(Z2*delta);
687 vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
688 this->GetMatrix(ren->GetActiveCamera(), aMatrix);
689 this->Device->SetUserMatrix(aMatrix);
690 this->Device->Render(ren,theMapper);
693 this->Device->Render(ren, theMapper);
696 void GEOM_Actor::ReleaseGraphicsResources(vtkWindow *)
699 MESSAGE ( "GEOM_Actor::ReleaseGraphicsResources" );
705 void GEOM_Actor::ShallowCopy(vtkProp *prop)
708 MESSAGE ( "GEOM_Actor::ShallowCopy" );
710 GEOM_Actor *f = GEOM_Actor::SafeDownCast(prop);
713 this->SetShape(f->getTopo(),f->GetDeflection());
717 this->SALOME_Actor::ShallowCopy(prop);
720 const TopoDS_Shape& GEOM_Actor::getTopo() {
722 MESSAGE ( "GEOM_Actor::getTopo" );
727 void GEOM_Actor::setInputShape(const TopoDS_Shape& /*ashape*/, double /*adef1*/,
728 int /*imode*/, bool /*isVector*/)
731 MESSAGE ( "GEOM_Actor::setInputShape" );
735 double GEOM_Actor::isVector()
738 MESSAGE ( "GEOM_Actor::isVector" );
743 void GEOM_Actor::SubShapeOn()
746 MESSAGE ( "GEOM_Actor::SubShapeOn" );
750 void GEOM_Actor::SubShapeOff()
753 MESSAGE ( "GEOM_Actor::SubShapeOff" );
757 void GEOM_Actor::highlight(bool highlight)
760 MESSAGE ( this << " GEOM_Actor::highlight highlight="<<highlight );
762 SALOME_Actor::highlight(highlight);
765 void GEOM_Actor::SetOpacity(double opa)
768 myShadingFaceProp->SetOpacity(opa);
769 myShadingBackFaceProp->SetOpacity(opa);
770 myHighlightProp->SetOpacity(opa);
771 myPreHighlightProp->SetOpacity(opa);
772 myVertexActor->GetProperty()->SetOpacity(opa);
773 myStandaloneVertexActor->GetProperty()->SetOpacity(opa);
776 double GEOM_Actor::GetOpacity()
779 return myShadingFaceProp->GetOpacity();
782 void GEOM_Actor::SetColor(double r,double g,double b)
784 // set the same color to all sub-actors:
786 // - standalone edges
789 // - shading color (front and back faces)
790 SetPointColor(r, g, b);
791 SetIsolatedEdgeColor(r, g, b);
792 SetSharedEdgeColor(r, g, b);
793 SetFreeEdgeColor(r, g, b);
794 myShadingFaceProp->SetColor(r,g,b); // shading color
795 myShadingBackFaceProp->SetColor(r,g,b); // back face shading color
798 void GEOM_Actor::GetColor(double& r,double& g,double& b)
801 myShadingFaceProp->GetColor(aRGB);
808 \brief Set color of points
809 Points actor is shown in Wireframe mode only, see SetVisibility()
811 void GEOM_Actor::SetPointColor(double r, double g, double b)
813 myVertexActor->GetProperty()->SetColor(r, g, b);
814 myStandaloneVertexActor->GetProperty()->SetColor(r, g, b);
818 \brief Set color of standalone edges, wires, vectors
819 This actor is shown in all display mode, see SetVisibility()
820 TODO: check - this color seems to be used not only for standalone edges
822 void GEOM_Actor::SetIsolatedEdgeColor(double r, double g, double b)
824 myIsolatedEdgeColor[0] = r; myIsolatedEdgeColor[1] = g; myIsolatedEdgeColor[2] = b;
825 myIsolatedEdgeActor->GetProperty()->SetColor(r, g, b);
829 \brief Set color of shared edges
830 This actor is shown only in wireframe and shading+edges display modes, see SetVisibility()
831 TODO: check - this seems to be not working currently
833 void GEOM_Actor::SetSharedEdgeColor(double r, double g, double b)
835 mySharedEdgeColor[0] = r; mySharedEdgeColor[1] = g; mySharedEdgeColor[2] = b;
836 if ( myDisplayMode != (int)eShadingWithEdges )
837 mySharedEdgeActor->GetProperty()->SetColor(r, g, b);
841 \brief Set color of edges for standalone faces
842 This actor is shown only in wireframe and shading+edges display modes, see SetVisibility()
843 TODO: this color should be used not only for faces
845 void GEOM_Actor::SetFreeEdgeColor(double r, double g, double b)
847 myOneFaceEdgeColor[0] = r; myOneFaceEdgeColor[1] = g; myOneFaceEdgeColor[2] = b;
848 if ( myDisplayMode != (int)eShadingWithEdges )
849 myOneFaceEdgeActor->GetProperty()->SetColor(r, g, b);
853 \brief Set color of iso-lines
854 This actor is shown only in wireframe display mode, see SetVisibility()
856 void GEOM_Actor::SetIsosColor(double r, double g, double b)
858 myWireframeFaceActor->GetProperty()->SetColor(r, g, b);
862 \brief Set color of labels
863 This actor is shown only if 'Show name' is switched-on, see SetVisibility()
865 void GEOM_Actor::SetLabelColor(double r, double g, double b)
867 myTextActor->GetTextProperty()->SetColor(r, g, b);
870 void GEOM_Actor::SetMaterial(std::vector<vtkProperty*> theProps)
872 // we set material properties as back and front material
873 int aSize = theProps.size();
875 if ( aSize < 1 || aSize > 2)
878 // theProps[0] -- front material properties
879 // theProps[1] -- back material properties (if exist)
883 // Set reflection coefficients
884 aCoefnt = theProps[0]->GetAmbient();
885 myShadingFaceProp->SetAmbient(aCoefnt);
886 myVertexActor->GetProperty()->SetAmbient(aCoefnt);
887 myStandaloneVertexActor->GetProperty()->SetAmbient(aCoefnt);
889 aCoefnt = theProps[1]->GetAmbient();
890 myShadingBackFaceProp->SetAmbient(aCoefnt);
892 // Set diffuse coefficients
893 aCoefnt = theProps[0]->GetDiffuse();
894 myShadingFaceProp->SetDiffuse(aCoefnt);
895 myVertexActor->GetProperty()->SetDiffuse(aCoefnt);
896 myStandaloneVertexActor->GetProperty()->SetDiffuse(aCoefnt);
898 aCoefnt = theProps[1]->GetDiffuse();
899 myShadingBackFaceProp->SetDiffuse(aCoefnt);
901 // Set specular coefficients
902 aCoefnt = theProps[0]->GetSpecular();
903 myShadingFaceProp->SetSpecular(aCoefnt);
904 myVertexActor->GetProperty()->SetSpecular(aCoefnt);
905 myStandaloneVertexActor->GetProperty()->SetSpecular(aCoefnt);
907 aCoefnt = theProps[1]->GetSpecular();
908 myShadingBackFaceProp->SetSpecular(aCoefnt);
913 // Set reflection colors
914 aColor = theProps[0]->GetAmbientColor();
915 myShadingFaceProp->SetAmbientColor(aColor[0], aColor[1], aColor[2]);
916 myVertexActor->GetProperty()->SetAmbientColor(aColor[0], aColor[1], aColor[2]);
917 myStandaloneVertexActor->GetProperty()->SetAmbientColor(aColor[0], aColor[1], aColor[2]);
919 aColor = theProps[1]->GetAmbientColor();
920 myShadingBackFaceProp->SetAmbientColor(aColor[0], aColor[1], aColor[2]);
922 // Set diffuse colors
923 aColor = theProps[0]->GetDiffuseColor();
924 myShadingFaceProp->SetDiffuseColor(aColor[0], aColor[1], aColor[2]);
925 myVertexActor->GetProperty()->SetDiffuseColor(aColor[0], aColor[1], aColor[2]);
926 myStandaloneVertexActor->GetProperty()->SetDiffuseColor(aColor[0], aColor[1], aColor[2]);
928 aColor = theProps[1]->GetDiffuseColor();
929 myShadingBackFaceProp->SetDiffuseColor(aColor[0], aColor[1], aColor[2]);
931 // Set specular colors
932 aColor = theProps[0]->GetSpecularColor();
933 myShadingFaceProp->SetSpecularColor(aColor[0], aColor[1], aColor[2]);
934 myVertexActor->GetProperty()->SetSpecularColor(aColor[0], aColor[1], aColor[2]);
935 myStandaloneVertexActor->GetProperty()->SetSpecularColor(aColor[0], aColor[1], aColor[2]);
937 aColor = theProps[1]->GetSpecularColor();
938 myShadingBackFaceProp->SetSpecularColor(aColor[0], aColor[1], aColor[2]);
941 aCoefnt = theProps[0]->GetSpecularPower();
942 myShadingFaceProp->SetSpecularPower(aCoefnt);
943 myVertexActor->GetProperty()->SetSpecularPower(aCoefnt);
944 myStandaloneVertexActor->GetProperty()->SetSpecularPower(aCoefnt);
946 aCoefnt = theProps[1]->GetSpecularPower();
947 myShadingBackFaceProp->SetSpecularPower(aCoefnt);
949 // Set back face material property
950 myShadingFaceActor->SetBackfaceProperty(myShadingBackFaceProp.GetPointer());
953 vtkProperty* GEOM_Actor::GetFrontMaterial()
955 return myShadingFaceProp;
958 vtkProperty* GEOM_Actor::GetBackMaterial()
960 return myShadingBackFaceProp;
963 bool GEOM_Actor::IsInfinitive()
965 return ((bool)myShape.Infinite() || isOnlyVertex);
969 To map current selection to VTK representation
973 ::Highlight(bool theIsHighlight)
975 myIsSelected = theIsHighlight;
977 MESSAGE ( this << " GEOM_Actor::Highlight myIsSelected="<<myIsSelected );
980 SALOME_Actor::Highlight(theIsHighlight); // this method call ::highlight(theIsHighlight) in the end
981 SetVisibility(GetVisibility());
985 To process prehighlight (called from SVTK_InteractorStyle)
989 ::PreHighlight(vtkInteractorStyle* /*theInteractorStyle*/,
990 SVTK_SelectionEvent* theSelectionEvent,
994 MESSAGE ( this<<" GEOM_Actor::PreHighlight (3) theIsHighlight="<<theIsHighlight );
997 if ( !GetPickable() )
1000 myPreHighlightActor->SetVisibility( false );
1001 bool anIsPreselected = myIsPreselected;
1003 Selection_Mode aSelectionMode = theSelectionEvent->mySelectionMode;
1004 bool anIsChanged = (mySelectionMode != aSelectionMode);
1006 if( !theIsHighlight ) {
1007 SetPreSelected( false );
1009 switch(aSelectionMode){
1010 case ActorSelection :
1012 // cout << "=============== " << myIO->getEntry() << endl;
1013 // int nbio = mySelector->IObjectCount();
1014 // cout << " nbio = " << nbio << endl;
1016 if( !mySelector->IsSelected( myIO ) ) {
1017 // printf ("!!!!!!!!!!!!!!!!\n");
1018 SetPreSelected( true );
1026 mySelectionMode = aSelectionMode;
1027 anIsChanged |= (anIsPreselected != myIsPreselected);
1029 SetVisibility(GetVisibility());
1034 To process highlight (called from SVTK_InteractorStyle)
1038 ::Highlight(vtkInteractorStyle *theInteractorStyle,
1039 SVTK_SelectionEvent* theSelectionEvent,
1040 bool theIsHighlight)
1042 // define the selection of object
1044 MESSAGE ( std::endl << this << " GEOM_Actor::Highlight (3) myIsSelected="<<myIsSelected );
1046 bool aRet = SALOME_Actor::Highlight(theInteractorStyle,theSelectionEvent,theIsHighlight);
1047 SetSelected(theIsHighlight);
1049 SetPreSelected(false);
1055 // Copy the follower's composite 4x4 matrix into the matrix provided.
1056 void GEOM_Actor::GetMatrix(vtkCamera* theCam, vtkMatrix4x4 *result)
1059 double Rx[3], Ry[3], Rz[3], p1[3];
1060 vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
1064 this->GetOrientation();
1065 this->Transform->Push();
1066 this->Transform->PostMultiply();
1067 this->Transform->Identity();
1069 // apply user defined matrix last if there is one
1070 if (this->UserMatrix)
1072 this->Transform->Concatenate(this->UserMatrix);
1075 this->Transform->Translate(-this->Origin[0],
1079 this->Transform->Scale(this->Scale[0],
1084 this->Transform->RotateY(this->Orientation[1]);
1085 this->Transform->RotateX(this->Orientation[0]);
1086 this->Transform->RotateZ(this->Orientation[2]);
1092 pos = theCam->GetPosition();
1093 vup = theCam->GetViewUp();
1095 if (theCam->GetParallelProjection())
1097 theCam->GetDirectionOfProjection(Rz);
1102 (pos[0] - this->Position[0])*(pos[0] - this->Position[0]) +
1103 (pos[1] - this->Position[1])*(pos[1] - this->Position[1]) +
1104 (pos[2] - this->Position[2])*(pos[2] - this->Position[2]));
1105 for (i = 0; i < 3; i++)
1107 Rz[i] = (pos[i] - this->Position[i])/distance;
1111 vtkMath::Cross(vup,Rz,Rx);
1112 vtkMath::Normalize(Rx);
1113 vtkMath::Cross(Rz,Rx,Ry);
1115 matrix->Element[0][0] = Rx[0];
1116 matrix->Element[1][0] = Rx[1];
1117 matrix->Element[2][0] = Rx[2];
1118 matrix->Element[0][1] = Ry[0];
1119 matrix->Element[1][1] = Ry[1];
1120 matrix->Element[2][1] = Ry[2];
1121 matrix->Element[0][2] = Rz[0];
1122 matrix->Element[1][2] = Rz[1];
1123 matrix->Element[2][2] = Rz[2];
1125 this->Transform->Concatenate(matrix);
1128 // translate to projection reference point PRP
1129 // this is the camera's position blasted through
1130 // the current matrix
1131 p1[0] = this->Origin[0] + this->Position[0];
1132 p1[1] = this->Origin[1] + this->Position[1];
1133 p1[2] = this->Origin[2] + this->Position[2];
1135 this->Transform->Translate(p1[0],p1[1],p1[2]);
1136 this->Transform->GetMatrix(result);
1139 this->Transform->Pop();
1142 void GEOM_Actor::SetEdgesInShadingColor(double r,double g,double b)
1144 myEdgesInShadingColor[0] = r;
1145 myEdgesInShadingColor[1] = g;
1146 myEdgesInShadingColor[2] = b;
1149 void GEOM_Actor::SetIsosWidth(const int width) {
1150 myWireframeFaceActor->GetProperty()->SetLineWidth(width);
1153 int GEOM_Actor::GetIsosWidth() const {
1154 return (int)myWireframeFaceActor->GetProperty()->GetLineWidth();
1157 void GEOM_Actor::SetWidth(const int width) {
1158 myIsolatedEdgeActor->GetProperty()->SetLineWidth(width);
1159 myOneFaceEdgeActor->GetProperty()->SetLineWidth(width);
1160 mySharedEdgeActor->GetProperty()->SetLineWidth(width);
1161 myHighlightProp->SetLineWidth(width);
1162 myPreHighlightProp->SetLineWidth(width+1);
1166 int GEOM_Actor::GetWidth() const {
1167 return (int)myIsolatedEdgeActor->GetProperty()->GetLineWidth();
1170 void GEOM_Actor::SetTransform(VTKViewer_Transform* theTransform)
1172 Superclass::SetTransform(theTransform);
1174 myStandaloneVertexActor->SetTransform(theTransform);
1175 myStandaloneVertexActor->SetTransform(theTransform);
1176 myIsolatedEdgeActor->SetTransform(theTransform);
1177 myOneFaceEdgeActor->SetTransform(theTransform);
1178 mySharedEdgeActor->SetTransform(theTransform);
1179 myWireframeFaceActor->SetTransform(theTransform);
1180 myShadingFaceActor->SetTransform(theTransform);
1181 myHighlightActor->SetTransform(theTransform);