Salome HOME
Merging from V3_2_6pre4
[modules/geom.git] / src / OBJECT / GEOM_AssemblyBuilder.cxx
1 //  GEOM OBJECT : interactive object for Geometry entities visualization
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
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. 
10 // 
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. 
15 // 
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 
19 // 
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //
23 //
24 //  File   : GEOM_AssemblyBuilder.cxx
25 //  Author : Christophe ATTANASIO
26 //  Module : GEOM
27 //  $Header$
28
29 /*!
30   \class GEOM_AssemblyBuilder GEOM_AssemblyBuilder.h
31   \brief ....
32 */
33
34 #include "GEOM_AssemblyBuilder.h"
35 #include "GEOM_Actor.h"
36
37 #include <SUIT_Session.h>
38
39 #include <vtkProperty.h>
40
41 // Open CASCADE Includes
42 #include <TopExp_Explorer.hxx>
43 #include <Bnd_Box.hxx>
44 #include <BRepMesh_IncrementalMesh.hxx>
45 #include <Poly_Triangulation.hxx>
46 #include <BRepBndLib.hxx>
47 #include <BRep_Tool.hxx>
48 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
49 #include <TopExp.hxx>
50 #include <TopTools_ListOfShape.hxx>
51 #include <TopoDS_Iterator.hxx>
52
53 #include "utilities.h"
54
55 using namespace std;
56 // SALOME
57
58 #define MAX2(X, Y)      (  Abs(X) > Abs(Y)? Abs(X) : Abs(Y) )
59 #define MAX3(X, Y, Z)   ( MAX2 ( MAX2(X,Y) , Z) )
60
61
62
63
64
65 void GEOM_AssemblyBuilder::InitProperties(vtkProperty* IsoProp,
66                                           vtkProperty* FaceProp,
67                                           vtkProperty* EdgeFProp,
68                                           vtkProperty* EdgeSProp,
69                                           vtkProperty* EdgeIProp,
70                                           vtkProperty* VertexProp,
71                                           vtkProperty* IsoPVProp,
72                                           vtkProperty* EdgePVProp,
73                                           vtkProperty* VertexPVProp)
74 {
75   // Shading like default OCC material
76   FaceProp->SetRepresentationToSurface();
77   FaceProp->SetInterpolationToGouraud();
78   FaceProp->SetAmbient(1.0);
79   FaceProp->SetDiffuse(1.0);
80   FaceProp->SetSpecular(0.4);
81   FaceProp->SetAmbientColor(0.329412, 0.223529, 0.027451);
82   FaceProp->SetDiffuseColor(0.780392, 0.568627, 0.113725);
83   FaceProp->SetSpecularColor(0.992157, 0.941176, 0.807843);
84
85   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
86   QColor aColor;
87
88   // Wireframe for iso
89   aColor = aResMgr->colorValue( "Geometry", "isos_color", QColor( int(0.5*255), int(0.5*255), int(0.5*255) ) );
90   float red = aColor.red()/255.0;
91   float green = aColor.green()/255.0;
92   float blue = aColor.blue()/255.0;
93   IsoProp->SetRepresentationToWireframe();
94   IsoProp->SetAmbientColor(red, green, blue);
95   IsoProp->SetDiffuseColor(red, green, blue);
96   IsoProp->SetSpecularColor(red, green, blue);
97   
98   // Wireframe for iso
99   IsoPVProp->SetRepresentationToWireframe();
100   IsoPVProp->SetAmbientColor(0, 1, 1);
101   IsoPVProp->SetDiffuseColor(0, 1, 1);
102   IsoPVProp->SetSpecularColor(0, 1, 1);
103
104   // Wireframe for shared edge 
105   aColor = aResMgr->colorValue( "Geometry", "wireframe_color", QColor( 255, 255, 0 ) );
106   red = aColor.red()/255.0;
107   green = aColor.green()/255.0;
108   blue = aColor.blue()/255.0;
109   EdgeSProp->SetRepresentationToWireframe();
110   EdgeSProp->SetAmbientColor(red, green, blue);
111   EdgeSProp->SetDiffuseColor(red, green, blue);
112   EdgeSProp->SetSpecularColor(red, green, blue);
113   
114   // Wireframe for free edge 
115   aColor = aResMgr->colorValue( "Geometry", "free_bound_color", QColor( 0, 255, 0 ) );
116   red = aColor.red()/255.0;
117   green = aColor.green()/255.0;
118   blue = aColor.blue()/255.0;
119   EdgeFProp->SetRepresentationToWireframe();
120   EdgeFProp->SetAmbientColor(red, green, blue);
121   EdgeFProp->SetDiffuseColor(red, green, blue);
122   EdgeFProp->SetSpecularColor(red, green, blue);
123
124   // Wireframe for isolated edge 
125   aColor = aResMgr->colorValue( "Geometry", "line_color", QColor( 255, 0, 0 ) );
126   red = aColor.red()/255.0;
127   green = aColor.green()/255.0;
128   blue = aColor.blue()/255.0;
129   EdgeIProp->SetRepresentationToWireframe();
130   EdgeIProp->SetAmbientColor(red, green, blue);
131   EdgeIProp->SetDiffuseColor(red, green, blue);
132   
133   // Wireframe for Preview edge 
134   EdgePVProp->SetRepresentationToWireframe();
135   EdgePVProp->SetAmbientColor(1, 1, 0);
136   EdgePVProp->SetDiffuseColor(1, 1, 0);
137   EdgePVProp->SetSpecularColor(1, 1, 0);
138
139   // Wireframe for vertex 
140   aColor = aResMgr->colorValue( "Geometry", "point_color", QColor( 255, 255, 0 ) );
141   red = aColor.red()/255.0;
142   green = aColor.green()/255.0;
143   blue = aColor.blue()/255.0;
144   VertexProp->SetRepresentationToWireframe();
145   VertexProp->SetAmbientColor(red, green, blue);
146   VertexProp->SetDiffuseColor(red, green, blue);
147   VertexProp->SetSpecularColor(red, green, blue);
148   
149   // Wireframe for vertex 
150   VertexPVProp->SetRepresentationToWireframe();
151   VertexPVProp->SetAmbientColor(0, 1, 1);
152   VertexPVProp->SetDiffuseColor(0, 1, 1);
153   VertexPVProp->SetSpecularColor(0, 1, 1);
154 }
155
156
157 void GEOM_AssemblyBuilder::MeshShape(const TopoDS_Shape myShape,
158                                          Standard_Real deflection,
159                                          Standard_Boolean forced)
160 {
161   // Mesh the shape if necessary
162   Standard_Boolean alreadymesh = Standard_True;
163   TopExp_Explorer ex;
164   TopLoc_Location aLoc;
165
166   for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) {
167     const TopoDS_Face& aFace = TopoDS::Face(ex.Current());
168     Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(aFace,aLoc);
169     if(aPoly.IsNull()) { alreadymesh = Standard_False; break; }
170   }
171
172   if(!alreadymesh || forced) {
173     if(deflection<=0) {
174       // Compute default deflection
175       Bnd_Box B;
176       BRepBndLib::Add(myShape, B);
177       Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
178       B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
179       deflection = MAX3( aXmax-aXmin , aYmax-aYmin , aZmax-aZmin) * 0.001 *4;
180     }
181     BRepMesh_IncrementalMesh MESH(myShape,deflection);
182   }
183 }
184
185
186
187 vtkActorCollection* GEOM_AssemblyBuilder::BuildActors(const TopoDS_Shape& myShape,
188                                                       Standard_Real    deflection,
189                                                       Standard_Integer mode,
190                                                       Standard_Boolean forced,
191                                                       Standard_Boolean isVector)
192 {
193   vtkActorCollection* AISActors = vtkActorCollection::New();
194
195   if(myShape.ShapeType() == TopAbs_COMPOUND) {
196     TopoDS_Iterator anItr(myShape);
197     for(; anItr.More(); anItr.Next()) {
198       vtkActorCollection* theActors =
199         GEOM_AssemblyBuilder::BuildActors(anItr.Value(), deflection, mode, forced);
200       theActors->InitTraversal();
201       vtkActor* anActor = (vtkActor*)theActors->GetNextActor();
202       while(!(anActor==NULL)) {
203         AISActors->AddItem(anActor);
204         anActor = (vtkActor*)theActors->GetNextActor();
205       }
206     }
207   }
208   // Create graphics properties
209
210   vtkProperty* IsoProp = vtkProperty::New();
211   vtkProperty* FaceProp = vtkProperty::New();
212   vtkProperty* EdgeFProp = vtkProperty::New();
213   vtkProperty* EdgeSProp = vtkProperty::New();
214   vtkProperty* EdgeIProp = vtkProperty::New();
215   vtkProperty* VertexProp = vtkProperty::New();
216
217   vtkProperty* IsoPVProp = vtkProperty::New();
218   vtkProperty* EdgePVProp = vtkProperty::New();
219   vtkProperty* VertexPVProp = vtkProperty::New();
220
221   InitProperties(IsoProp,FaceProp,EdgeFProp,EdgeSProp,EdgeIProp,VertexProp,IsoPVProp,EdgePVProp,VertexPVProp);
222
223   MeshShape(myShape,deflection,forced);
224
225   if ( myShape.ShapeType() <= 4 && myShape.ShapeType() != TopAbs_COMPOUND) {
226     
227     // FACE Actor
228     // look if edges are free or shared 
229     TopTools_IndexedDataMapOfShapeListOfShape edgemap;
230     TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,edgemap);
231     
232     TopExp_Explorer ex;
233     
234     for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) {
235       
236       GEOM_Actor* FaceActor = GEOM_Actor::New();
237       FaceActor->SetShadingProperty(FaceProp);
238       FaceActor->SetWireframeProperty(IsoProp);
239
240       FaceActor->SetPreviewProperty(IsoPVProp);
241       
242       FaceActor->setInputShape(ex.Current(),deflection,mode);
243       
244       AISActors->AddItem(FaceActor);
245       
246       TopExp_Explorer ex2;
247       for (ex2.Init(ex.Current(), TopAbs_EDGE); ex2.More(); ex2.Next()) {
248         const TopoDS_Edge& aEdge = TopoDS::Edge(ex2.Current());
249         
250         if (BRep_Tool::Degenerated(aEdge)) {    
251           continue;
252         }
253         
254         // compute the number of faces
255         Standard_Integer nbf = edgemap.FindFromKey(ex2.Current()).Extent();
256         GEOM_Actor* EdgeActor = GEOM_Actor::New();
257         EdgeActor->SubShapeOn();
258         EdgeActor->setInputShape(ex2.Current(),deflection,mode);
259         
260         switch (nbf) {
261           
262         case 0 : // isolated edge
263           {
264             EdgeActor->SetShadingProperty(EdgeIProp);
265             EdgeActor->SetWireframeProperty(EdgeIProp);
266           }
267           break;
268           
269         case 1 :// edge in only one face
270           {
271             EdgeActor->SetShadingProperty(EdgeFProp);
272             EdgeActor->SetWireframeProperty(EdgeFProp);
273           }
274           break;
275           
276         default :   // edge shared by at least two faces      
277           {
278             EdgeActor->SetShadingProperty(EdgeSProp);
279             EdgeActor->SetWireframeProperty(EdgeSProp);
280           }
281         }
282         
283         EdgeActor->SetPreviewProperty(EdgePVProp);
284         AISActors->AddItem(EdgeActor);
285       }
286     }
287   } else if ( myShape.ShapeType() == TopAbs_WIRE ) { // WIRE Actor
288     TopExp_Explorer ex;
289     for (ex.Init(myShape, TopAbs_EDGE); ex.More(); ex.Next()) {
290       const TopoDS_Edge& aEdge = TopoDS::Edge(ex.Current());
291         
292       if (BRep_Tool::Degenerated(aEdge)) {    
293         continue;
294       }
295         
296       GEOM_Actor* EdgeActor = GEOM_Actor::New();
297       EdgeActor->setInputShape(ex.Current(),deflection,mode);
298       EdgeActor->SetShadingProperty(EdgeIProp);
299       EdgeActor->SetWireframeProperty(EdgeIProp);
300       EdgeActor->SetPreviewProperty(EdgePVProp);
301       
302       AISActors->AddItem(EdgeActor);
303     }
304   } else if ( myShape.ShapeType() == TopAbs_EDGE ) { // EDGE Actor
305     GEOM_Actor* EdgeActor = GEOM_Actor::New();
306     EdgeActor->setInputShape(myShape,deflection,mode,isVector);
307     EdgeActor->SetShadingProperty(EdgeIProp);
308     EdgeActor->SetWireframeProperty(EdgeIProp);
309     EdgeActor->SetPreviewProperty(EdgePVProp);
310     
311     AISActors->AddItem(EdgeActor);
312   } else if ( myShape.ShapeType() == TopAbs_VERTEX ) { // VERTEX Actor
313     GEOM_Actor* VertexActor = GEOM_Actor::New();
314     VertexActor->setInputShape(myShape,deflection,mode);
315     VertexActor->SetShadingProperty(VertexProp);
316     VertexActor->SetWireframeProperty(VertexProp);
317     VertexActor->SetPreviewProperty(VertexPVProp);
318     
319     AISActors->AddItem(VertexActor);
320   
321   } 
322   
323   return AISActors;
324
325 }
326
327
328
329 //-------------------------------------------------------------
330 // BUILD ASSEMBLY
331 //-------------------------------------------------------------
332 vtkAssembly*  GEOM_AssemblyBuilder::BuildAssembly(const TopoDS_Shape& myShape,
333                                                       Standard_Real deflection,
334                                                       Standard_Integer mode,
335                                                       Standard_Boolean forced)
336 {
337   // Create a new vtkAssembly
338
339   vtkAssembly* myVTKShape = vtkAssembly::New();
340
341
342   // Create graphics properties
343
344   vtkProperty* IsoProp = vtkProperty::New();
345   vtkProperty* FaceProp = vtkProperty::New();
346   vtkProperty* EdgeFProp = vtkProperty::New();
347   vtkProperty* EdgeSProp = vtkProperty::New();
348   vtkProperty* EdgeIProp = vtkProperty::New();
349   vtkProperty* VertexProp = vtkProperty::New();
350   vtkProperty* EdgePVProp = vtkProperty::New();
351   vtkProperty* VertexPVProp = vtkProperty::New();
352   vtkProperty* IsoPVProp = vtkProperty::New();
353
354   InitProperties(IsoProp,FaceProp,EdgeFProp,EdgeSProp,EdgeIProp,VertexProp,IsoPVProp,EdgePVProp,VertexPVProp);
355
356   MeshShape(myShape,deflection,forced);
357
358   
359   // FACE Actor
360   
361   // look if edges are free or shared 
362   TopTools_IndexedDataMapOfShapeListOfShape edgemap;
363   TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,edgemap);
364   
365   TopExp_Explorer ex;
366
367   for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) {
368     //const TopoDS_Face& aFace = TopoDS::Face(ex.Current());
369     
370     GEOM_Actor* FaceActor = GEOM_Actor::New();
371     FaceActor->SetShadingProperty(FaceProp);
372     FaceActor->SetWireframeProperty(IsoProp);
373     
374     vtkAssembly* myFaceAssembly = vtkAssembly::New();
375
376    
377     FaceActor->setInputShape(ex.Current(),deflection,mode);
378     myFaceAssembly->AddPart(FaceActor);
379     
380     TopExp_Explorer ex2;
381     for (ex2.Init(ex.Current(), TopAbs_EDGE); ex2.More(); ex2.Next()) {
382       const TopoDS_Edge& aEdge = TopoDS::Edge(ex2.Current());
383  
384       if (BRep_Tool::Degenerated(aEdge)) {    
385         continue;
386       }
387       
388     
389       // compute the number of faces
390       Standard_Integer nbf = edgemap.FindFromKey(ex2.Current()).Extent();
391       GEOM_Actor* EdgeActor = GEOM_Actor::New();
392       switch (nbf) {
393         
394       case 0 : // isolated edge
395         {
396           EdgeActor->SetShadingProperty(EdgeIProp);
397           EdgeActor->SetWireframeProperty(EdgeIProp);
398         }
399         break;
400         
401       case 1 :// edge in only one face
402         {
403           EdgeActor->SetShadingProperty(EdgeFProp);
404           EdgeActor->SetWireframeProperty(EdgeFProp);
405         }
406         break;
407         
408       default :   // edge shared by at least two faces      
409         {
410           EdgeActor->SetShadingProperty(EdgeSProp);
411           EdgeActor->SetWireframeProperty(EdgeSProp);
412         }
413       }
414   
415       EdgeActor->setInputShape(ex2.Current(),deflection,mode);
416       myFaceAssembly->AddPart(EdgeActor);
417     }
418     myVTKShape->AddPart(myFaceAssembly);
419   }
420   
421   return myVTKShape;
422  
423 }
424
425 //-------------------------------------------------------------
426 // CHANGE SPECIFIC DISPLAY MODE
427 //-------------------------------------------------------------
428 void  GEOM_AssemblyBuilder::SwitchDisplayMode(vtkAssembly* aOCCAssembly)
429 {
430 }
431
432 void  GEOM_AssemblyBuilder::SwitchDisplayMode(vtkActorCollection* aOCCAssembly)
433 {
434 }
435
436 //-------------------------------------------------------------
437 // DISPLAY/ERASE
438 //-------------------------------------------------------------
439
440 void GEOM_AssemblyBuilder::DisplayErase(vtkAssembly* mySALOMEAssembly)
441 {
442 }
443
444
445 void GEOM_AssemblyBuilder::DisplayErase(vtkActorCollection* mySALOMEActors)
446 {
447 }
448
449
450
451
452