0024624: Lost word in license statement in source files
[occt.git] / src / XCAFPrs / XCAFPrs_AISObject.cxx
1 // Created on: 2000-08-11
2 // Created by: Andrey BETENEV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <XCAFPrs_AISObject.ixx>
17 #include <TCollection_ExtendedString.hxx>
18 #include <gp_Pnt.hxx>
19 #include <Prs3d_Text.hxx>
20 #include <Prs3d_DimensionAspect.hxx>
21 #include <XCAFDoc_ShapeTool.hxx>
22
23 #include <Standard_ErrorHandler.hxx>
24 #include <Standard_Failure.hxx>
25
26 #include <Precision.hxx>
27 #include <TopoDS_Shape.hxx>
28 #include <TopoDS_Iterator.hxx>
29 #include <BRepTools.hxx>
30
31 #include <StdPrs_WFDeflectionShape.hxx>
32 #include <StdPrs_ShadedShape.hxx>
33 #include <StdPrs_WFShape.hxx>
34 #include <AIS_Drawer.hxx>
35 #include <Graphic3d_Group.hxx>
36 #include <Quantity_Color.hxx>
37 #include <Aspect_TypeOfLine.hxx>
38 #include <Prs3d_LineAspect.hxx>
39 #include <Graphic3d_AspectLine3d.hxx>
40 #include <BRep_Builder.hxx>
41 #include <TopoDS_Compound.hxx>
42 #include <XCAFPrs_Style.hxx>
43 #include <TopoDS_Shape.hxx>
44 #include <XCAFPrs_DataMapOfShapeStyle.hxx>
45 #include <TDF_LabelSequence.hxx>
46 #include <XCAFPrs_DataMapOfStyleShape.hxx>
47 #include <TopoDS.hxx>
48 #include <XCAFPrs_DataMapIteratorOfDataMapOfStyleShape.hxx>
49 #include <Graphic3d_AspectFillArea3d.hxx>
50 #include <Aspect_InteriorStyle.hxx>
51 #include <Aspect_TypeOfLine.hxx>
52 #include <Prs3d_ShadingAspect.hxx>
53
54 #include <Prs3d_IsoAspect.hxx>
55 #include <XCAFPrs.hxx>
56
57 #include <TDataStd_Name.hxx>
58 #include <BRepBndLib.hxx>
59
60 #include <TPrsStd_AISPresentation.hxx>
61
62 #ifdef DEBUG
63 #include <DBRep.hxx>
64 #endif
65
66
67 //=======================================================================
68 //function : XCAFPrs_AISObject
69 //purpose  : 
70 //=======================================================================
71
72 XCAFPrs_AISObject::XCAFPrs_AISObject (const TDF_Label &lab) : AIS_Shape(TopoDS_Shape())
73 {
74   myLabel = lab;
75
76   TopoDS_Shape shape;
77   if ( XCAFDoc_ShapeTool::GetShape ( myLabel, shape ) && ! shape.IsNull() ) 
78     Set ( shape );
79 }
80
81 //=======================================================================
82 //function : SetColor
83 //purpose  : 
84 //=======================================================================
85
86 void XCAFPrs_AISObject::SetColor(const Quantity_Color &aCol)
87 {
88   AIS_Shape::SetColor(aCol);
89   LoadRecomputable(1);
90 }
91
92 //=======================================================================
93 //function : UnsetColor
94 //purpose  : 
95 //=======================================================================
96
97 void XCAFPrs_AISObject::UnsetColor()
98 {
99   if (HasColor())
100   {
101     AIS_Shape::UnsetColor();
102     LoadRecomputable(1);
103   }
104   else
105   {
106     myToRecomputeModes.Clear();
107   }
108 }
109
110 //=======================================================================
111 //function : SetMaterial
112 //purpose  : 
113 //=======================================================================
114
115 void XCAFPrs_AISObject::SetMaterial(const Graphic3d_NameOfMaterial aMat)
116 {
117   AIS_Shape::SetMaterial(aMat);
118   LoadRecomputable(1);
119 }
120
121 //=======================================================================
122 //function : SetMaterial
123 //purpose  : 
124 //=======================================================================
125
126 void XCAFPrs_AISObject::SetMaterial(const Graphic3d_MaterialAspect& aMat)
127 {
128   AIS_Shape::SetMaterial(aMat);
129   LoadRecomputable(1);
130 }
131
132 //=======================================================================
133 //function : UnsetMaterial
134 //purpose  : 
135 //=======================================================================
136
137 void XCAFPrs_AISObject::UnsetMaterial()
138 {
139   if (HasMaterial())
140   {
141     AIS_Shape::UnsetMaterial();
142     LoadRecomputable(1);
143   }
144   else
145   {
146     myToRecomputeModes.Clear();
147   }
148 }
149
150 //=======================================================================
151 //function : SetTransparency
152 //purpose  : 
153 //=======================================================================
154
155 void XCAFPrs_AISObject::SetTransparency(const Standard_Real AValue)
156 {
157   AIS_Shape::SetTransparency(AValue);
158   LoadRecomputable(1);
159 }
160
161 //=======================================================================
162 //function : UnsetTransparency
163 //purpose  : 
164 //=======================================================================
165
166 void XCAFPrs_AISObject::UnsetTransparency()
167 {
168   AIS_Shape::UnsetTransparency();
169   LoadRecomputable(1);
170 }
171
172 //=======================================================================
173 //function : AddStyledItem
174 //purpose  : 
175 //=======================================================================
176
177 void XCAFPrs_AISObject::AddStyledItem (const XCAFPrs_Style &style, 
178                                        const TopoDS_Shape &shape, 
179                                        const Handle(PrsMgr_PresentationManager3d)&, // aPresentationManager,
180                                        const Handle(Prs3d_Presentation)& aPrs,
181                                        const Standard_Integer aMode)
182
183   // remember current color settings
184   Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
185   Aspect_InteriorStyle aStyle;
186   Quantity_Color aIntColor, aEdgeColor;
187   Aspect_TypeOfLine aType;
188   Standard_Real aWidth;
189   a4bis->Values(aStyle,aIntColor,aEdgeColor,aType,aWidth);
190   Graphic3d_MaterialAspect FMAT = a4bis->FrontMaterial();
191   Quantity_Color aFColor = FMAT.Color();
192
193   Quantity_Color aColor1, aColor2;
194   Aspect_TypeOfLine aLine1, aLine2;
195   Standard_Real aWigth1, aWigth2;
196   Handle(Prs3d_LineAspect) waUFB = myDrawer->UnFreeBoundaryAspect();
197   waUFB->Aspect()->Values(aColor1,aLine1,aWigth1);
198   Handle(Prs3d_LineAspect) waFB = myDrawer->FreeBoundaryAspect();
199   waFB->Aspect()->Values(aColor2,aLine2,aWigth2);
200
201   Quantity_Color aColor;
202   Aspect_TypeOfLine aLine;
203   Standard_Real aWigth;
204   Handle(Prs3d_LineAspect) wa = myDrawer->WireAspect();
205   wa->Aspect()->Values(aColor,aLine,aWigth);
206
207   Quantity_Color aColorU, aColorV;
208   Aspect_TypeOfLine aLineU, aLineV;
209   Standard_Real aWigthU, aWigthV;
210   Handle(Prs3d_IsoAspect) UIso = myDrawer->UIsoAspect();
211   Handle(Prs3d_IsoAspect) VIso = myDrawer->VIsoAspect();
212   UIso->Aspect()->Values(aColorU,aLineU,aWigthU);
213   VIso->Aspect()->Values(aColorV,aLineV,aWigthV);
214   
215   // Set colors etc. for current shape according to style
216   if ( style.IsSetColorCurv() ) {
217     Quantity_Color Color = style.GetColorCurv();
218     waUFB->SetColor ( Color.Name() );
219     waFB->SetColor ( Color.Name() );
220     wa->SetColor ( Color.Name() );
221   }
222   if ( style.IsSetColorSurf() ) {
223     Quantity_Color Color = style.GetColorSurf();
224     a4bis->SetInteriorColor(Color);
225     FMAT.SetColor(Color);
226     a4bis->SetFrontMaterial(FMAT);
227     UIso->SetColor ( Color.Name() );
228     VIso->SetColor ( Color.Name() );
229   }
230
231   // force drawing isos on planes
232   Standard_Boolean drawIsosPln = myDrawer->IsoOnPlane();
233   myDrawer->SetIsoOnPlane (Standard_True);
234   
235   // add shape to presentation
236   switch (aMode) {
237   case 0:{
238     try { OCC_CATCH_SIGNALS  StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer); }
239     catch (Standard_Failure) { 
240 #ifdef DEB
241       cout << "AIS_Shape::Compute() failed: exception " <<
242               Standard_Failure::Caught()->DynamicType()->Name() << ": " <<
243               Standard_Failure::Caught()->GetMessageString() << endl;
244 #endif
245 //      cout << "a Shape should be incorrect: No Compute can be maked on it  "<< endl;     
246 // on calcule une presentation de la boite englobante
247 //      Compute(aPresentationManager,aPrs,2);
248     }
249     break;
250   }
251   case 1:
252     {
253       Standard_Real prevangle ;
254       Standard_Real newangle  ; 
255       Standard_Real prevcoeff ;
256       Standard_Real newcoeff  ; 
257       
258       Standard_Boolean isOwnDeviationAngle = OwnDeviationAngle(newangle,prevangle);
259       Standard_Boolean isOwnDeviationCoefficient = OwnDeviationCoefficient(newcoeff,prevcoeff);
260       if (((Abs (newangle - prevangle) > Precision::Angular()) && isOwnDeviationAngle) ||
261           ((Abs (newcoeff - prevcoeff) > Precision::Confusion()) && isOwnDeviationCoefficient)) { 
262 #ifdef DEB
263           cout << "AIS_Shape : compute"<<endl;
264           cout << "newangl   : " << newangle << " # de " << "prevangl  : " << prevangle << " OU "<<endl;
265           cout << "newcoeff  : " << newcoeff << " # de " << "prevcoeff : " << prevcoeff << endl;
266 #endif
267           BRepTools::Clean(shape);
268         }
269     
270       //shading seulement a partir de face...
271       try {
272         OCC_CATCH_SIGNALS
273         if ((Standard_Integer) shape.ShapeType()>4)
274           StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer);
275         else {
276           myDrawer->SetShadingAspectGlobal(Standard_False);
277           if (IsInfinite()) 
278             StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer);
279           else
280             StdPrs_ShadedShape::Add(aPrs,shape,myDrawer);
281         }
282       }
283       catch (Standard_Failure) {
284 #ifdef DEB
285         cout << "AIS_Shape::Compute() in ShadingMode failed: exception " <<
286                 Standard_Failure::Caught()->DynamicType()->Name() << ": " <<
287                 Standard_Failure::Caught()->GetMessageString() << endl;
288 #endif
289         // last resort: try to display as wireframe
290         try {
291           OCC_CATCH_SIGNALS
292           StdPrs_WFShape::Add(aPrs,shape,myDrawer);
293         }
294         catch (Standard_Failure) {
295         }
296       }
297       break;
298     }
299   case 2:
300     {
301       // boite englobante
302       if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer);
303       else DisplayBox(aPrs,BoundingBox(),myDrawer);
304     }
305   }
306
307   // Restore initial settings
308   if ( style.IsSetColorCurv() ) {
309     waUFB->SetColor ( aColor1.Name() );
310     waFB->SetColor ( aColor2.Name() );
311     wa->SetColor ( aColor.Name() );
312   }
313   if ( style.IsSetColorSurf() ) {
314     a4bis->SetInteriorColor(aIntColor);
315     FMAT.SetColor(aFColor);
316     a4bis->SetFrontMaterial(FMAT);
317     UIso->SetColor ( aColorU );
318     VIso->SetColor ( aColorV );
319   }
320   myDrawer->SetIsoOnPlane (drawIsosPln);
321 }
322
323 //=======================================================================
324 //function : DisplayText
325 //purpose  : 
326 //=======================================================================
327
328 static void DisplayText (const TDF_Label& aLabel,
329                          const Handle(Prs3d_Presentation)& aPrs,
330                          const Handle(Prs3d_TextAspect)& anAspect,
331                          const TopLoc_Location& aLocation)
332 {
333   // first label itself
334   Handle (TDataStd_Name) aName;
335   if (aLabel.FindAttribute (TDataStd_Name::GetID(), aName)) {
336     TopoDS_Shape aShape;
337     if (XCAFDoc_ShapeTool::GetShape (aLabel, aShape)) {
338       // find the position to display as middle of the bounding box
339       aShape.Move (aLocation);
340       Bnd_Box aBox;
341       BRepBndLib::Add (aShape, aBox);
342       if ( ! aBox.IsVoid() ) 
343       {
344         Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
345         aBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
346         gp_Pnt aPnt (0.5 * (aXmin + aXmax), 0.5 * (aYmin + aYmax), 0.5 * (aZmin + aZmax));
347         Prs3d_Text::Draw( aPrs, anAspect, aName->Get(), aPnt);
348       }
349     }
350   }
351
352   TDF_LabelSequence seq;
353   
354   // attibutes of subshapes
355   if (XCAFDoc_ShapeTool::GetSubShapes (aLabel, seq)) {
356     Standard_Integer i = 1;
357     for (i = 1; i <= seq.Length(); i++) {
358       TDF_Label aL = seq.Value (i);
359       DisplayText (aL, aPrs, anAspect, aLocation); //suppose that subshapes do not contain locations
360     }
361   }
362   
363   // attibutes of components
364   seq.Clear();
365   if (XCAFDoc_ShapeTool::GetComponents (aLabel, seq)) {
366     Standard_Integer i = 1;
367     for (i = 1; i <= seq.Length(); i++) {
368       TDF_Label aL = seq.Value (i);
369       DisplayText (aL, aPrs, anAspect, aLocation);
370       TDF_Label aRefLabel;
371       
372       // attributes of referrences
373       TopLoc_Location aLoc = XCAFDoc_ShapeTool::GetLocation (aL);
374       if (XCAFDoc_ShapeTool::GetReferredShape (aL, aRefLabel)) {
375         DisplayText (aRefLabel, aPrs, anAspect, aLoc);
376       }
377     }
378   }
379 }
380                          
381 //=======================================================================
382 //function : Compute
383 //purpose  : 
384 //=======================================================================
385 // The Compute() method is copied from AIS_Shape::Compute and enhanced to 
386 // support different color settings for different subshapes of a single shape
387   
388 void XCAFPrs_AISObject::Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
389                                  const Handle(Prs3d_Presentation)& aPrs,
390                                  const Standard_Integer aMode)
391 {  
392 #ifdef DEB
393   //cout << "XCAFPrs_AISObject: Update called" << endl;
394 #endif
395   aPrs->Clear();
396
397   // abv: 06 Mar 00: to have good colors
398   Handle(TPrsStd_AISPresentation) prs = Handle(TPrsStd_AISPresentation)::DownCast ( GetOwner() );
399   if ( prs.IsNull() || !prs->HasOwnMaterial() )
400     AIS_Shape::SetMaterial ( Graphic3d_NOM_PLASTIC );
401
402   TopoDS_Shape shape;
403   if ( ! XCAFDoc_ShapeTool::GetShape ( myLabel, shape ) || shape.IsNull() ) return;
404
405   // wire,edge,vertex -> pas de HLR + priorite display superieure
406   Standard_Integer TheType = (Standard_Integer)shape.ShapeType();
407   if(TheType>4 && TheType<8) {
408     aPrs->SetVisual(Graphic3d_TOS_ALL);
409     aPrs->SetDisplayPriority(TheType+2);
410   }
411   // Shape vide -> Assemblage vide.
412   if (shape.ShapeType() == TopAbs_COMPOUND) {
413     TopoDS_Iterator anExplor (shape);
414     if (!anExplor.More()) {
415       return;
416     }
417   }
418   if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //pas de prise en compte lors du FITALL
419   
420   // collect information on colored subshapes
421   TopLoc_Location L;
422   XCAFPrs_DataMapOfShapeStyle settings;
423   XCAFPrs::CollectStyleSettings ( myLabel, L, settings );
424 #ifdef DEB
425   //cout << "Styles collected" << endl;
426 #endif
427
428   // dispatch (sub)shapes by their styles
429   XCAFPrs_DataMapOfStyleShape items;
430   XCAFPrs_Style DefStyle;
431   DefaultStyle (DefStyle);
432   XCAFPrs::DispatchStyles ( shape, settings, items, DefStyle );
433 #ifdef DEB
434   //cout << "Dispatch done" << endl;
435 #endif
436
437   // add subshapes to presentation (one shape per style)
438   XCAFPrs_DataMapIteratorOfDataMapOfStyleShape it ( items );
439 #ifdef DEB
440   //Standard_Integer i=1;
441 #endif
442   for ( ; it.More(); it.Next() ) {
443     XCAFPrs_Style s = it.Key();
444 #ifdef DEB
445     //cout << "Style " << i << ": [" << 
446     //  ( s.IsSetColorSurf() ? Quantity_Color::StringName ( s.GetColorSurf().Name() ) : "" ) << ", " <<
447     //  ( s.IsSetColorCurv() ? Quantity_Color::StringName ( s.GetColorCurv().Name() ) : "" ) << "]" <<
448         //" --> si_" << i << ( s.IsVisible() ? "" : " <invisible>" ) << endl;
449     //i++;
450 #endif
451     if (! s.IsVisible() ) continue;
452     Prs3d_Root::NewGroup(aPrs);
453     AddStyledItem ( s, it.Value(), aPresentationManager, aPrs, aMode );
454   }
455   
456   if ( XCAFPrs::GetViewNameMode() ) {
457   // Displaying Name attributes
458 #ifdef DEB
459     //cout << "Now display name of shapes" << endl;
460 #endif
461     aPrs->SetDisplayPriority(10);
462     DisplayText (myLabel, aPrs, Attributes()->DimensionAspect()->TextAspect(), TopLoc_Location());//no location
463   }
464 #ifdef DEB
465   //cout << "Compute finished" << endl;
466 #endif
467   
468   aPrs->ReCompute(); // for hidden line recomputation if necessary...
469 }
470
471 //=======================================================================
472 //function : DefaultStyle
473 //purpose  : DefaultStyle() can be redefined by subclasses in order to set custom default style
474 //=======================================================================
475 void XCAFPrs_AISObject::DefaultStyle (XCAFPrs_Style& aStyle) const
476 {
477   static const Quantity_Color White ( Quantity_NOC_WHITE );
478   aStyle.SetColorSurf ( White );
479   aStyle.SetColorCurv ( White );
480 }