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