0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- use...
[occt.git] / src / AIS / AIS_Shape.cxx
1 // Created on: 1996-12-20
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <AIS_Shape.hxx>
18
19 #include <AIS_GraphicTool.hxx>
20 #include <AIS_InteractiveContext.hxx>
21 #include <Aspect_TypeOfLine.hxx>
22 #include <BRep_Builder.hxx>
23 #include <BRepBndLib.hxx>
24 #include <BRepTools.hxx>
25 #include <BRepTools_ShapeSet.hxx>
26 #include <gp_Pnt.hxx>
27 #include <Graphic3d_ArrayOfPolylines.hxx>
28 #include <Graphic3d_AspectFillArea3d.hxx>
29 #include <Graphic3d_AspectLine3d.hxx>
30 #include <Graphic3d_AspectMarker3d.hxx>
31 #include <Graphic3d_AspectText3d.hxx>
32 #include <Graphic3d_Group.hxx>
33 #include <Graphic3d_MaterialAspect.hxx>
34 #include <Graphic3d_SequenceOfGroup.hxx>
35 #include <Graphic3d_Structure.hxx>
36 #include <Message.hxx>
37 #include <Message_Messenger.hxx>
38 #include <HLRBRep.hxx>
39 #include <OSD_Timer.hxx>
40 #include <Precision.hxx>
41 #include <Prs3d.hxx>
42 #include <Prs3d_Drawer.hxx>
43 #include <Prs3d_IsoAspect.hxx>
44 #include <Prs3d_Presentation.hxx>
45 #include <Prs3d_Root.hxx>
46 #include <Prs3d_ShadingAspect.hxx>
47 #include <Prs3d_BndBox.hxx>
48 #include <StdPrs_ToolTriangulatedShape.hxx>
49 #include <Quantity_Color.hxx>
50 #include <Select3D_SensitiveBox.hxx>
51 #include <Select3D_SensitiveEntity.hxx>
52 #include <Standard_ErrorHandler.hxx>
53 #include <Standard_Failure.hxx>
54 #include <Standard_Type.hxx>
55 #include <StdPrs_HLRPolyShape.hxx>
56 #include <StdPrs_HLRShape.hxx>
57 #include <StdPrs_ShadedShape.hxx>
58 #include <StdPrs_WFShape.hxx>
59 #include <StdSelect.hxx>
60 #include <StdSelect_BRepOwner.hxx>
61 #include <StdSelect_BRepSelectionTool.hxx>
62 #include <TColStd_ListIteratorOfListOfInteger.hxx>
63 #include <TopExp.hxx>
64
65 IMPLEMENT_STANDARD_RTTIEXT(AIS_Shape,AIS_InteractiveObject)
66
67 // Auxiliary macros
68 #define replaceAspectWithDef(theMap, theAspect) \
69   if (myDrawer->Link()->theAspect()->Aspect() != myDrawer->theAspect()->Aspect()) \
70   { \
71     theMap.Bind (myDrawer->theAspect()->Aspect(), myDrawer->Link()->theAspect()->Aspect()); \
72   }
73
74 // Auxiliary macros for replaceWithNewOwnAspects()
75 #define replaceAspectWithOwn(theMap, theAspect) \
76   if (myDrawer->Link()->theAspect()->Aspect() != myDrawer->theAspect()->Aspect()) \
77   { \
78     theMap.Bind (myDrawer->Link()->theAspect()->Aspect(), myDrawer->theAspect()->Aspect()); \
79   }
80
81 //=======================================================================
82 //function : replaceWithNewOwnAspects
83 //purpose  :
84 //=======================================================================
85 void AIS_Shape::replaceWithNewOwnAspects()
86 {
87   Graphic3d_MapOfAspectsToAspects aReplaceMap;
88
89   replaceAspectWithOwn (aReplaceMap, ShadingAspect);
90   replaceAspectWithOwn (aReplaceMap, LineAspect);
91   replaceAspectWithOwn (aReplaceMap, WireAspect);
92   replaceAspectWithOwn (aReplaceMap, FreeBoundaryAspect);
93   replaceAspectWithOwn (aReplaceMap, UnFreeBoundaryAspect);
94   replaceAspectWithOwn (aReplaceMap, SeenLineAspect);
95   replaceAspectWithOwn (aReplaceMap, FaceBoundaryAspect);
96   replaceAspectWithOwn (aReplaceMap, PointAspect);
97
98   replaceAspects (aReplaceMap);
99 }
100
101 //==================================================
102 // Function: AIS_Shape
103 // Purpose :
104 //==================================================
105 AIS_Shape::AIS_Shape(const TopoDS_Shape& theShape)
106 : AIS_InteractiveObject (PrsMgr_TOP_ProjectorDependant),
107   myshape (theShape),
108   myUVOrigin(0.0, 0.0),
109   myUVRepeat(1.0, 1.0),
110   myUVScale (1.0, 1.0),
111   myInitAng (0.0),
112   myCompBB (Standard_True)
113 {
114   //
115 }
116
117 //=======================================================================
118 //function : Compute
119 //purpose  : 
120 //=======================================================================
121 void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
122                         const Handle(Prs3d_Presentation)& aPrs,
123                         const Standard_Integer theMode)
124 {  
125   if(myshape.IsNull()) return;
126
127   // wire,edge,vertex -> pas de HLR + priorite display superieure
128   Standard_Integer TheType = (Standard_Integer) myshape.ShapeType();
129   if(TheType>4 && TheType<8) {
130     aPrs->SetVisual(Graphic3d_TOS_ALL);
131     aPrs->SetDisplayPriority(TheType+2);
132   }
133   // Shape vide -> Assemblage vide.
134   if (myshape.ShapeType() == TopAbs_COMPOUND && myshape.NbChildren() == 0)
135   {
136     return;
137   }
138
139   if (IsInfinite())
140   {
141     aPrs->SetInfiniteState (Standard_True); //not taken in account during FITALL
142   }
143
144   switch (theMode)
145   {
146     case AIS_WireFrame:
147     {
148       StdPrs_ToolTriangulatedShape::ClearOnOwnDeflectionChange (myshape, myDrawer, Standard_True);
149       try
150       {
151         OCC_CATCH_SIGNALS
152         StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
153       }
154       catch (Standard_Failure const& anException)
155       {
156         Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::Compute() wireframe presentation builder has failed (")
157                          + anException.GetMessageString() + ")");
158       }
159       break;
160     }
161     case AIS_Shaded:
162     {
163       StdPrs_ToolTriangulatedShape::ClearOnOwnDeflectionChange (myshape, myDrawer, Standard_True);
164       if ((Standard_Integer) myshape.ShapeType() > 4)
165       {
166         StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
167       }
168       else
169       {
170         if (IsInfinite())
171         {
172           StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
173         }
174         else
175         {
176           try
177           {
178             OCC_CATCH_SIGNALS
179             StdPrs_ShadedShape::Add (aPrs, myshape, myDrawer,
180                                      myDrawer->ShadingAspect()->Aspect()->ToMapTexture()
181                                  && !myDrawer->ShadingAspect()->Aspect()->TextureMap().IsNull(),
182                                      myUVOrigin, myUVRepeat, myUVScale);
183           }
184           catch (Standard_Failure const& anException)
185           {
186             Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::Compute() shaded presentation builder has failed (")
187                              + anException.GetMessageString() + ")");
188             StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
189           }
190         }
191       }
192       Standard_Real aTransparency = Transparency() ;
193       if (aTransparency > 0.0)
194       {
195         SetTransparency (aTransparency);
196       }
197       break;
198     }
199
200     // Bounding box.
201     case 2:
202     {
203       if (IsInfinite())
204       {
205         StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
206       }
207       else
208       {
209         Prs3d_BndBox::Add (aPrs, BoundingBox(), myDrawer);
210       }
211     }
212   }
213
214   // Recompute hidden line presentation (if necessary).
215   aPrs->ReCompute();
216 }
217
218 //=======================================================================
219 //function : computeHlrPresentation
220 //purpose  :
221 //=======================================================================
222 void AIS_Shape::computeHlrPresentation (const Handle(Graphic3d_Camera)& theProjector,
223                                         const Handle(Prs3d_Presentation)& thePrs,
224                                         const TopoDS_Shape& theShape,
225                                         const Handle(Prs3d_Drawer)& theDrawer)
226 {
227   if (theShape.IsNull())
228   {
229     return;
230   }
231
232   switch (theShape.ShapeType())
233   {
234     case TopAbs_VERTEX:
235     case TopAbs_EDGE:
236     case TopAbs_WIRE:
237     {
238       thePrs->SetDisplayPriority (4);
239       StdPrs_WFShape::Add (thePrs, theShape, theDrawer);
240       return;
241     }
242     case TopAbs_COMPOUND:
243     {
244       if (theShape.NbChildren() == 0)
245       {
246         return;
247       }
248       break;
249     }
250     default:
251     {
252       break;
253     }
254   }
255
256   const Handle(Prs3d_Drawer)& aDefDrawer = theDrawer->Link();
257   if (aDefDrawer->DrawHiddenLine())
258   {
259     theDrawer->EnableDrawHiddenLine();
260   }
261   else
262   {
263     theDrawer->DisableDrawHiddenLine();
264   }
265
266   const Aspect_TypeOfDeflection aPrevDef = aDefDrawer->TypeOfDeflection();
267   aDefDrawer->SetTypeOfDeflection (Aspect_TOD_RELATIVE);
268   if (theDrawer->IsAutoTriangulation())
269   {
270     StdPrs_ToolTriangulatedShape::ClearOnOwnDeflectionChange (theShape, theDrawer, Standard_True);
271   }
272
273   {
274     try
275     {
276       OCC_CATCH_SIGNALS
277       switch (theDrawer->TypeOfHLR())
278       {
279         case Prs3d_TOH_Algo:
280         {
281           StdPrs_HLRShape aBuilder;
282           aBuilder.ComputeHLR (thePrs, theShape, theDrawer, theProjector);
283           break;
284         }
285         case Prs3d_TOH_PolyAlgo:
286         case Prs3d_TOH_NotSet:
287         {
288           StdPrs_HLRPolyShape aBuilder;
289           aBuilder.ComputeHLR (thePrs, theShape, theDrawer, theProjector);
290           break;
291         }
292       }
293     }
294     catch (Standard_Failure const& anException)
295     {
296       Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::Compute() HLR Algorithm has failed (")
297                        + anException.GetMessageString() + ")");
298       StdPrs_WFShape::Add (thePrs, theShape, theDrawer);
299     }
300   }
301
302   aDefDrawer->SetTypeOfDeflection (aPrevDef);
303 }
304
305 //=======================================================================
306 //function : ComputeSelection
307 //purpose  : 
308 //=======================================================================
309
310 void AIS_Shape::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
311                                               const Standard_Integer aMode)
312 {
313   if(myshape.IsNull()) return;
314   if (myshape.ShapeType() == TopAbs_COMPOUND && myshape.NbChildren() == 0)
315   {
316     // empty Shape -> empty Assembly.
317     return;
318   }
319
320   TopAbs_ShapeEnum TypOfSel = AIS_Shape::SelectionType(aMode);
321   TopoDS_Shape shape = myshape;
322
323 // POP protection against crash in low layers
324
325   Standard_Real aDeflection = StdPrs_ToolTriangulatedShape::GetDeflection(shape, myDrawer);
326   try
327   {
328     OCC_CATCH_SIGNALS
329     StdSelect_BRepSelectionTool::Load(aSelection,
330                                       this,
331                                       shape,
332                                       TypOfSel,
333                                       aDeflection,
334                                       myDrawer->DeviationAngle(),
335                                       myDrawer->IsAutoTriangulation());
336   }
337   catch (Standard_Failure const& anException)
338   {
339     Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::ComputeSelection(") + aMode + ") has failed ("
340                      + anException.GetMessageString() + ")");
341     if (aMode == 0)
342     {
343       aSelection->Clear();
344       Bnd_Box B = BoundingBox();
345       Handle(StdSelect_BRepOwner) aOwner = new StdSelect_BRepOwner(shape,this);
346       Handle(Select3D_SensitiveBox) aSensitiveBox = new Select3D_SensitiveBox(aOwner,B);
347       aSelection->Add(aSensitiveBox);
348     }
349   }
350
351   // insert the drawer in the BrepOwners for hilight...
352   StdSelect::SetDrawerForBRepOwner(aSelection,myDrawer);
353 }
354
355 void AIS_Shape::Color( Quantity_Color& aColor ) const {
356   aColor = myDrawer->ShadingAspect()->Color(myCurrentFacingModel);
357 }
358
359 Graphic3d_NameOfMaterial AIS_Shape::Material() const {
360   return (myDrawer->ShadingAspect()->Material(myCurrentFacingModel)).Name();
361 }
362
363 Standard_Real AIS_Shape::Transparency() const {
364   return myDrawer->ShadingAspect()->Transparency(myCurrentFacingModel);
365 }
366
367 //=======================================================================
368 //function : setColor
369 //purpose  :
370 //=======================================================================
371
372 bool AIS_Shape::setColor (const Handle(Prs3d_Drawer)& theDrawer,
373                           const Quantity_Color&       theColor) const
374 {
375   bool toRecompute = false;
376   toRecompute = theDrawer->SetupOwnShadingAspect() || toRecompute;
377   toRecompute = theDrawer->SetOwnLineAspects() || toRecompute;
378   toRecompute = theDrawer->SetupOwnPointAspect() || toRecompute;
379
380   // override color
381   theDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
382   theDrawer->LineAspect()->SetColor (theColor);
383   theDrawer->WireAspect()->SetColor (theColor);
384   theDrawer->PointAspect()->SetColor (theColor);
385   theDrawer->FreeBoundaryAspect()->SetColor (theColor);
386   theDrawer->UnFreeBoundaryAspect()->SetColor (theColor);
387   theDrawer->SeenLineAspect()->SetColor (theColor);
388   theDrawer->FaceBoundaryAspect()->SetColor (theColor);
389   return toRecompute;
390 }
391
392 //=======================================================================
393 //function : SetColor
394 //purpose  :
395 //=======================================================================
396
397 void AIS_Shape::SetColor (const Quantity_Color& theColor)
398 {
399   const bool toRecompute = setColor (myDrawer, theColor);
400   myDrawer->SetColor (theColor);
401   hasOwnColor = Standard_True;
402
403   if (!toRecompute
404    || !myDrawer->HasLink())
405   {
406     SynchronizeAspects();
407   }
408   else
409   {
410     replaceWithNewOwnAspects();
411   }
412   recomputeComputed();
413 }
414
415 //=======================================================================
416 //function : UnsetColor
417 //purpose  :
418 //=======================================================================
419
420 void AIS_Shape::UnsetColor()
421 {
422   if (!HasColor())
423   {
424     return;
425   }
426
427   hasOwnColor = Standard_False;
428   myDrawer->SetColor (myDrawer->HasLink() ? myDrawer->Link()->Color() : Quantity_Color (Quantity_NOC_WHITE));
429
430   Graphic3d_MapOfAspectsToAspects aReplaceMap;
431   if (!HasWidth())
432   {
433     replaceAspectWithDef (aReplaceMap, LineAspect);
434     replaceAspectWithDef (aReplaceMap, WireAspect);
435     replaceAspectWithDef (aReplaceMap, FreeBoundaryAspect);
436     replaceAspectWithDef (aReplaceMap, UnFreeBoundaryAspect);
437     replaceAspectWithDef (aReplaceMap, SeenLineAspect);
438     replaceAspectWithDef (aReplaceMap, FaceBoundaryAspect);
439     myDrawer->SetLineAspect          (Handle(Prs3d_LineAspect)());
440     myDrawer->SetWireAspect          (Handle(Prs3d_LineAspect)());
441     myDrawer->SetFreeBoundaryAspect  (Handle(Prs3d_LineAspect)());
442     myDrawer->SetUnFreeBoundaryAspect(Handle(Prs3d_LineAspect)());
443     myDrawer->SetSeenLineAspect      (Handle(Prs3d_LineAspect)());
444     myDrawer->SetFaceBoundaryAspect  (Handle(Prs3d_LineAspect)());
445   }
446   else
447   {
448     Quantity_Color aColor = Quantity_NOC_YELLOW;
449     if (myDrawer->HasLink())
450     {
451       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Line,   aColor);
452     }
453     myDrawer->LineAspect()->SetColor (aColor);
454     aColor = Quantity_NOC_RED;
455     if (myDrawer->HasLink())
456     {
457       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Wire,   aColor);
458     }
459     myDrawer->WireAspect()->SetColor (aColor);
460     aColor = Quantity_NOC_GREEN;
461     if (myDrawer->HasLink())
462     {
463       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Free,   aColor);
464     }
465     myDrawer->FreeBoundaryAspect()->SetColor (aColor);
466     aColor = Quantity_NOC_YELLOW;
467     if (myDrawer->HasLink())
468     {
469       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_UnFree, aColor);
470     }
471     myDrawer->UnFreeBoundaryAspect()->SetColor (aColor);
472     if (myDrawer->HasLink())
473     {
474       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Seen,   aColor);
475     }
476     myDrawer->SeenLineAspect()->SetColor (aColor);
477     aColor = Quantity_NOC_BLACK;
478     if (myDrawer->HasLink())
479     {
480       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_FaceBoundary, aColor);
481     }
482     myDrawer->FaceBoundaryAspect()->SetColor (aColor);
483   }
484
485   if (!myDrawer->HasOwnShadingAspect())
486   {
487     //
488   }
489   else if (HasMaterial()
490         || IsTransparent()
491         || myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
492   {
493     const Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
494     Graphic3d_MaterialAspect mat = aDefaultMat;
495     Quantity_Color anInteriorColors[2] = {Quantity_NOC_CYAN1, Quantity_NOC_CYAN1};
496     if (myDrawer->HasLink())
497     {
498       anInteriorColors[0] = myDrawer->Link()->ShadingAspect()->Aspect()->InteriorColor();
499       anInteriorColors[1] = myDrawer->Link()->ShadingAspect()->Aspect()->BackInteriorColor();
500     }
501     if (HasMaterial() || myDrawer->HasLink())
502     {
503       const Handle(Graphic3d_AspectFillArea3d)& aSrcAspect = (HasMaterial() ? myDrawer : myDrawer->Link())->ShadingAspect()->Aspect();
504       mat = myCurrentFacingModel != Aspect_TOFM_BACK_SIDE
505           ? aSrcAspect->FrontMaterial()
506           : aSrcAspect->BackMaterial();
507     }
508     if (HasMaterial())
509     {
510       const Quantity_Color aColor = myDrawer->HasLink()
511                                   ? myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel)
512                                   : aDefaultMat.AmbientColor();
513       mat.SetColor (aColor);
514     }
515     if (IsTransparent())
516     {
517       Standard_Real aTransp = myDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
518       mat.SetTransparency (Standard_ShortReal(aTransp));
519     }
520     myDrawer->ShadingAspect()->SetMaterial (mat, myCurrentFacingModel);
521     myDrawer->ShadingAspect()->Aspect()->SetInteriorColor    (anInteriorColors[0]);
522     myDrawer->ShadingAspect()->Aspect()->SetBackInteriorColor(anInteriorColors[1]);
523   }
524   else
525   {
526     replaceAspectWithDef (aReplaceMap, ShadingAspect);
527     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
528   }
529   if (myDrawer->HasOwnPointAspect())
530   {
531     replaceAspectWithDef (aReplaceMap, PointAspect);
532     myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
533   }
534   replaceAspects (aReplaceMap);
535   SynchronizeAspects();
536   recomputeComputed();
537 }
538
539 //=======================================================================
540 //function : setWidth
541 //purpose  :
542 //=======================================================================
543
544 bool AIS_Shape::setWidth (const Handle(Prs3d_Drawer)& theDrawer,
545                           const Standard_Real         theLineWidth) const
546 {
547   bool toRecompute = theDrawer->SetOwnLineAspects();
548
549   // override width
550   theDrawer->LineAspect()->SetWidth (theLineWidth);
551   theDrawer->WireAspect()->SetWidth (theLineWidth);
552   theDrawer->FreeBoundaryAspect()->SetWidth (theLineWidth);
553   theDrawer->UnFreeBoundaryAspect()->SetWidth (theLineWidth);
554   theDrawer->SeenLineAspect()->SetWidth (theLineWidth);
555   theDrawer->FaceBoundaryAspect()->SetWidth (theLineWidth);
556   return toRecompute;
557 }
558
559 //=======================================================================
560 //function : SetWidth
561 //purpose  : 
562 //=======================================================================
563
564 void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
565 {
566   myOwnWidth = (Standard_ShortReal )theLineWidth;
567
568   if (!setWidth (myDrawer, theLineWidth)
569    || !myDrawer->HasLink())
570   {
571     SynchronizeAspects();
572   }
573   else
574   {
575     replaceWithNewOwnAspects();
576   }
577   recomputeComputed();
578 }
579
580 //=======================================================================
581 //function : UnsetWidth
582 //purpose  :
583 //=======================================================================
584
585 void AIS_Shape::UnsetWidth()
586 {
587   if (myOwnWidth == 0.0f)
588   {
589     return;
590   }
591
592   myOwnWidth = 0.0f;
593   if (!HasColor())
594   {
595     Graphic3d_MapOfAspectsToAspects aReplaceMap;
596     replaceAspectWithDef (aReplaceMap, LineAspect);
597     replaceAspectWithDef (aReplaceMap, WireAspect);
598     replaceAspectWithDef (aReplaceMap, FreeBoundaryAspect);
599     replaceAspectWithDef (aReplaceMap, UnFreeBoundaryAspect);
600     replaceAspectWithDef (aReplaceMap, SeenLineAspect);
601     replaceAspectWithDef (aReplaceMap, FaceBoundaryAspect);
602     myDrawer->SetLineAspect          (Handle(Prs3d_LineAspect)());
603     myDrawer->SetWireAspect          (Handle(Prs3d_LineAspect)());
604     myDrawer->SetFreeBoundaryAspect  (Handle(Prs3d_LineAspect)());
605     myDrawer->SetUnFreeBoundaryAspect(Handle(Prs3d_LineAspect)());
606     myDrawer->SetSeenLineAspect      (Handle(Prs3d_LineAspect)());
607     myDrawer->SetFaceBoundaryAspect  (Handle(Prs3d_LineAspect)());
608     replaceAspects (aReplaceMap);
609   }
610   else
611   {
612     myDrawer->LineAspect()          ->SetWidth (myDrawer->HasLink() ?
613       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Line) : 1.);
614     myDrawer->WireAspect()          ->SetWidth (myDrawer->HasLink() ?
615       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Wire) : 1.);
616     myDrawer->FreeBoundaryAspect()  ->SetWidth (myDrawer->HasLink() ?
617       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Free) : 1.);
618     myDrawer->UnFreeBoundaryAspect()->SetWidth (myDrawer->HasLink() ?
619       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_UnFree) : 1.);
620     myDrawer->SeenLineAspect()      ->SetWidth (myDrawer->HasLink() ?
621       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Seen) : 1.);
622     myDrawer->FaceBoundaryAspect()      ->SetWidth (myDrawer->HasLink() ?
623       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_FaceBoundary) : 1.);
624     SynchronizeAspects();
625   }
626   recomputeComputed();
627 }
628
629 //=======================================================================
630 //function : setMaterial
631 //purpose  :
632 //=======================================================================
633
634 void AIS_Shape::setMaterial (const Handle(Prs3d_Drawer)&     theDrawer,
635                              const Graphic3d_MaterialAspect& theMaterial,
636                              const Standard_Boolean          theToKeepColor,
637                              const Standard_Boolean          theToKeepTransp) const
638 {
639   const Quantity_Color aColor  = theDrawer->ShadingAspect()->Color (myCurrentFacingModel);
640   const Standard_Real  aTransp = theDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
641   theDrawer->SetupOwnShadingAspect();
642   theDrawer->ShadingAspect()->SetMaterial (theMaterial, myCurrentFacingModel);
643
644   if (theToKeepColor)
645   {
646     theDrawer->ShadingAspect()->SetColor (aColor, myCurrentFacingModel);
647   }
648   if (theToKeepTransp)
649   {
650     theDrawer->ShadingAspect()->SetTransparency (aTransp, myCurrentFacingModel);
651   }
652 }
653
654 //=======================================================================
655 //function : SetMaterial
656 //purpose  :
657 //=======================================================================
658
659 void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
660 {
661   const bool toRecompute = !myDrawer->HasOwnShadingAspect();
662   setMaterial (myDrawer, theMat, HasColor(), IsTransparent());
663   hasOwnMaterial = Standard_True;
664
665   if (!toRecompute
666    || !myDrawer->HasLink())
667   {
668     SynchronizeAspects();
669   }
670   else
671   {
672     replaceWithNewOwnAspects();
673   }
674 }
675
676 //=======================================================================
677 //function : UnsetMaterial
678 //purpose  :
679 //=======================================================================
680
681 void AIS_Shape::UnsetMaterial()
682 {
683   if (!HasMaterial())
684   {
685     return;
686   }
687
688   if (!myDrawer->HasOwnShadingAspect())
689   {
690     //
691   }
692   else if (HasColor()
693         || IsTransparent()
694         || myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
695   {
696     if(myDrawer->HasLink())
697     {
698       myDrawer->ShadingAspect()->SetMaterial (myDrawer->Link()->ShadingAspect()->Material (myCurrentFacingModel),
699                                               myCurrentFacingModel);
700     }
701     if (HasColor())
702     {
703       myDrawer->ShadingAspect()->SetColor        (myDrawer->Color(),        myCurrentFacingModel);
704       myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
705     }
706     SynchronizeAspects();
707   }
708   else
709   {
710     Graphic3d_MapOfAspectsToAspects aReplaceMap;
711     replaceAspectWithDef (aReplaceMap, ShadingAspect);
712     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
713     replaceAspects (aReplaceMap);
714   }
715 }
716
717 //=======================================================================
718 //function : setTransparency
719 //purpose  :
720 //=======================================================================
721
722 void AIS_Shape::setTransparency (const Handle(Prs3d_Drawer)& theDrawer,
723                                  const Standard_Real         theValue) const
724 {
725   theDrawer->SetupOwnShadingAspect();
726   // override transparency
727   theDrawer->ShadingAspect()->SetTransparency (theValue, myCurrentFacingModel);
728 }
729
730 //=======================================================================
731 //function : SetTransparency
732 //purpose  :
733 //=======================================================================
734
735 void AIS_Shape::SetTransparency (const Standard_Real theValue)
736 {
737   const bool toRecompute = !myDrawer->HasOwnShadingAspect();
738   setTransparency (myDrawer, theValue);
739   myDrawer->SetTransparency ((Standard_ShortReal )theValue);
740
741   if (!toRecompute
742    || !myDrawer->HasLink())
743   {
744     SynchronizeAspects();
745   }
746   else
747   {
748     replaceWithNewOwnAspects();
749   }
750 }
751
752 //=======================================================================
753 //function : UnsetTransparency
754 //purpose  :
755 //=======================================================================
756
757 void AIS_Shape::UnsetTransparency()
758 {
759   myDrawer->SetTransparency (0.0f);
760   if (!myDrawer->HasOwnShadingAspect())
761   {
762     return;
763   }
764   else if (HasColor()
765         || HasMaterial()
766         || myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
767   {
768     myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
769     SynchronizeAspects();
770   }
771   else
772   {
773     Graphic3d_MapOfAspectsToAspects aReplaceMap;
774     replaceAspectWithDef (aReplaceMap, ShadingAspect);
775     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
776     replaceAspects (aReplaceMap);
777   }
778 }
779
780 //=======================================================================
781 //function : BoundingBox
782 //purpose  : 
783 //=======================================================================
784
785 const Bnd_Box& AIS_Shape::BoundingBox()  
786 {
787   if (myshape.ShapeType() == TopAbs_COMPOUND && myshape.NbChildren() == 0)
788   {
789     // empty Shape  -> empty Assembly.
790     myBB.SetVoid ();
791     return myBB;
792   }
793
794   if(myCompBB) {
795     BRepBndLib::Add (myshape, myBB, false);
796     myCompBB = Standard_False;
797   }
798   return myBB;
799 }
800
801 //*****
802 //***** Reset
803 //=======================================================================
804 //function : SetOwnDeviationCoefficient
805 //purpose  : resets myhasOwnDeviationCoefficient to Standard_False and
806 //           returns Standard_True if it change
807 //=======================================================================
808
809 Standard_Boolean AIS_Shape::SetOwnDeviationCoefficient ()
810 {
811   Standard_Boolean itSet = myDrawer->HasOwnDeviationCoefficient();
812   if(itSet)  myDrawer->SetDeviationCoefficient();
813   return itSet;
814 }
815
816 //=======================================================================
817 //function : SetOwnDeviationAngle
818 //purpose  : resets myhasOwnDeviationAngle to Standard_False and
819 //           returns Standard_True if it change
820 //=======================================================================
821
822 Standard_Boolean AIS_Shape::SetOwnDeviationAngle ()
823 {
824   Standard_Boolean itSet = myDrawer->HasOwnDeviationAngle();
825   if(itSet)  myDrawer->SetDeviationAngle();
826   return itSet;
827
828 }
829
830 //=======================================================================
831 //function : SetOwnDeviationCoefficient
832 //purpose  : 
833 //=======================================================================
834
835 void AIS_Shape::SetOwnDeviationCoefficient ( const Standard_Real  aCoefficient )
836 {
837   myDrawer->SetDeviationCoefficient( aCoefficient );
838   SetToUpdate();
839 }
840
841 //=======================================================================
842 //function : SetOwnDeviationAngle
843 //purpose  : 
844 //=======================================================================
845
846 void AIS_Shape::SetOwnDeviationAngle (const Standard_Real theAngle)
847 {
848   myDrawer->SetDeviationAngle (theAngle);
849   SetToUpdate (AIS_WireFrame);
850 }
851 //=======================================================================
852 //function : SetOwnDeviationAngle
853 //purpose  : 
854 //=======================================================================
855
856 void AIS_Shape::SetAngleAndDeviation ( const Standard_Real  anAngle )
857 {
858   Standard_Real OutAngl,OutDefl;
859   HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
860   SetOwnDeviationAngle(anAngle) ;
861   SetOwnDeviationCoefficient(OutDefl) ;
862   myInitAng = anAngle;
863   SetToUpdate();
864 }
865
866 //=======================================================================
867 //function : UserAngle
868 //purpose  : 
869 //=======================================================================
870
871 Standard_Real AIS_Shape::UserAngle() const
872 {
873   return myInitAng ==0. ? GetContext()->DeviationAngle(): myInitAng;
874 }
875
876 //=======================================================================
877 //function : OwnDeviationCoefficient
878 //purpose  : 
879 //=======================================================================
880
881 Standard_Boolean AIS_Shape::OwnDeviationCoefficient ( Standard_Real &  aCoefficient,
882                                                       Standard_Real & aPreviousCoefficient ) const
883 {
884   aCoefficient = myDrawer->DeviationCoefficient();
885   aPreviousCoefficient = myDrawer->PreviousDeviationCoefficient ();
886   return myDrawer->HasOwnDeviationCoefficient() ;
887 }
888
889 //=======================================================================
890 //function : OwnDeviationAngle
891 //purpose  : 
892 //=======================================================================
893
894 Standard_Boolean AIS_Shape::OwnDeviationAngle ( Standard_Real &  anAngle,
895                                                 Standard_Real & aPreviousAngle ) const
896 {
897   anAngle = myDrawer->DeviationAngle();
898   aPreviousAngle = myDrawer->PreviousDeviationAngle (); 
899   return myDrawer->HasOwnDeviationAngle();
900 }
901
902 //=======================================================================
903 //function : DumpJson
904 //purpose  : 
905 //=======================================================================
906 void AIS_Shape::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
907 {
908   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
909   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, AIS_InteractiveObject)
910
911   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myshape)
912   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBB)
913
914   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myInitAng)
915   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCompBB)
916 }