a1d45f5f95e502f706115e52dcae19e989a1a825
[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.hxx>
17
18 #include <AIS_DisplayMode.hxx>
19 #include <BRep_Builder.hxx>
20 #include <BRepBndLib.hxx>
21 #include <gp_Pnt.hxx>
22 #include <Graphic3d_AspectFillArea3d.hxx>
23 #include <Graphic3d_AspectLine3d.hxx>
24 #include <Prs3d_Drawer.hxx>
25 #include <Prs3d_DimensionAspect.hxx>
26 #include <Prs3d_IsoAspect.hxx>
27 #include <Prs3d_LineAspect.hxx>
28 #include <Prs3d_ShadingAspect.hxx>
29 #include <Prs3d_Text.hxx>
30 #include <TDataStd_Name.hxx>
31 #include <TDF_LabelSequence.hxx>
32 #include <TPrsStd_AISPresentation.hxx>
33 #include <TopoDS_Iterator.hxx>
34 #include <XCAFDoc_ShapeTool.hxx>
35 #include <XCAFPrs.hxx>
36 #include <XCAFPrs_DataMapOfShapeStyle.hxx>
37 #include <XCAFPrs_DataMapIteratorOfDataMapOfShapeStyle.hxx>
38 #include <XCAFPrs_Style.hxx>
39
40
41 IMPLEMENT_STANDARD_RTTIEXT(XCAFPrs_AISObject,AIS_ColoredShape)
42
43 //=======================================================================
44 //function : XCAFPrs_AISObject
45 //purpose  : 
46 //=======================================================================
47
48 XCAFPrs_AISObject::XCAFPrs_AISObject (const TDF_Label& theLabel)
49 : AIS_ColoredShape(TopoDS_Shape())
50 {
51   myLabel = theLabel;
52 }
53
54 //=======================================================================
55 //function : DisplayText
56 //purpose  : 
57 //=======================================================================
58
59 static void DisplayText (const TDF_Label& aLabel,
60                          const Handle(Prs3d_Presentation)& aPrs,
61                          const Handle(Prs3d_TextAspect)& anAspect,
62                          const TopLoc_Location& aLocation)
63 {
64   // first label itself
65   Handle (TDataStd_Name) aName;
66   if (aLabel.FindAttribute (TDataStd_Name::GetID(), aName)) {
67     TopoDS_Shape aShape;
68     if (XCAFDoc_ShapeTool::GetShape (aLabel, aShape)) {
69       // find the position to display as middle of the bounding box
70       aShape.Move (aLocation);
71       Bnd_Box aBox;
72       BRepBndLib::Add (aShape, aBox);
73       if ( ! aBox.IsVoid() ) 
74       {
75         Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
76         aBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
77         gp_Pnt aPnt (0.5 * (aXmin + aXmax), 0.5 * (aYmin + aYmax), 0.5 * (aZmin + aZmax));
78         Prs3d_Text::Draw( aPrs, anAspect, aName->Get(), aPnt);
79       }
80     }
81   }
82
83   TDF_LabelSequence seq;
84   
85   // attibutes of subshapes
86   if (XCAFDoc_ShapeTool::GetSubShapes (aLabel, seq)) {
87     Standard_Integer i = 1;
88     for (i = 1; i <= seq.Length(); i++) {
89       TDF_Label aL = seq.Value (i);
90       DisplayText (aL, aPrs, anAspect, aLocation); //suppose that subshapes do not contain locations
91     }
92   }
93   
94   // attibutes of components
95   seq.Clear();
96   if (XCAFDoc_ShapeTool::GetComponents (aLabel, seq)) {
97     Standard_Integer i = 1;
98     for (i = 1; i <= seq.Length(); i++) {
99       TDF_Label aL = seq.Value (i);
100       DisplayText (aL, aPrs, anAspect, aLocation);
101       TDF_Label aRefLabel;
102       
103       // attributes of referrences
104       TopLoc_Location aLoc = XCAFDoc_ShapeTool::GetLocation (aL);
105       if (XCAFDoc_ShapeTool::GetReferredShape (aL, aRefLabel)) {
106         DisplayText (aRefLabel, aPrs, anAspect, aLoc);
107       }
108     }
109   }
110 }
111
112 //=======================================================================
113 //function : Compute
114 //purpose  : 
115 //=======================================================================
116 void XCAFPrs_AISObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
117                                  const Handle(Prs3d_Presentation)&           thePrs,
118                                  const Standard_Integer                      theMode)
119 {
120   thePrs->Clear();
121
122   // abv: 06 Mar 00: to have good colors
123   Handle(TPrsStd_AISPresentation) aPrs = Handle(TPrsStd_AISPresentation)::DownCast (GetOwner());
124   if (aPrs.IsNull() || !aPrs->HasOwnMaterial()) SetMaterial (Graphic3d_NOM_PLASTIC);
125
126   TopoDS_Shape aShape;
127   if (!XCAFDoc_ShapeTool::GetShape (myLabel, aShape) || aShape.IsNull()) return;
128
129   // Shape vide -> Assemblage vide.
130   if (aShape.ShapeType() == TopAbs_COMPOUND)
131   {
132     TopoDS_Iterator anExplor (aShape);
133     if (!anExplor.More())
134     {
135       return;
136     }
137   }
138
139   Set (aShape);
140   ClearCustomAspects();
141
142   // Collecting information on colored subshapes
143   TopLoc_Location aLoc;
144   XCAFPrs_DataMapOfShapeStyle aSettings;
145   XCAFPrs::CollectStyleSettings ( myLabel, aLoc, aSettings );
146
147   // Getting default colors
148   XCAFPrs_Style aDefStyle;
149   DefaultStyle (aDefStyle);
150   Quantity_Color aColorCurv = aDefStyle.GetColorCurv();
151   Quantity_Color aColorSurf = aDefStyle.GetColorSurf();
152
153   SetColors (myDrawer, aColorCurv, aColorSurf);
154
155   // collect sub-shapes with the same style into compounds
156   BRep_Builder aBuilder;
157   NCollection_DataMap<XCAFPrs_Style, TopoDS_Compound, XCAFPrs_Style> aStyleGroups;
158   for (XCAFPrs_DataMapIteratorOfDataMapOfShapeStyle aStyledShapeIter (aSettings);
159        aStyledShapeIter.More(); aStyledShapeIter.Next())
160   {
161     TopoDS_Compound aComp;
162     if (aStyleGroups.Find (aStyledShapeIter.Value(), aComp))
163     {
164       aBuilder.Add (aComp, aStyledShapeIter.Key());
165       continue;
166     }
167
168     aBuilder.MakeCompound (aComp);
169     aBuilder.Add (aComp, aStyledShapeIter.Key());
170     aStyleGroups.Bind (aStyledShapeIter.Value(), aComp);
171   }
172   aSettings.Clear();
173
174   // assign custom aspects
175   for (NCollection_DataMap<XCAFPrs_Style, TopoDS_Compound, XCAFPrs_Style>::Iterator aStyleGroupIter (aStyleGroups);
176        aStyleGroupIter.More(); aStyleGroupIter.Next())
177   {
178     const TopoDS_Compound& aComp = aStyleGroupIter.Value();
179     TopoDS_Iterator aShapeIter (aComp);
180     TopoDS_Shape aShapeCur = aShapeIter.Value();
181     aShapeIter.Next();
182     if (aShapeIter.More())
183     {
184       aShapeCur = aComp;
185     }
186
187     Handle(AIS_ColoredDrawer) aDrawer = CustomAspects (aShapeCur);
188     const XCAFPrs_Style& aStyle = aStyleGroupIter.Key();
189     aDrawer->SetHidden (!aStyle.IsVisible());
190
191     aColorCurv = aStyle.IsSetColorCurv() ? aStyle.GetColorCurv() : aDefStyle.GetColorCurv();
192     aColorSurf = aStyle.IsSetColorSurf() ? aStyle.GetColorSurf() : aDefStyle.GetColorSurf();
193
194     SetColors (aDrawer, aColorCurv, aColorSurf);
195   }
196   aStyleGroups.Clear();
197
198   AIS_ColoredShape::Compute (thePresentationManager, thePrs, theMode);
199
200   if (XCAFPrs::GetViewNameMode())
201   {
202     // Displaying Name attributes
203     thePrs->SetDisplayPriority (10);
204     DisplayText (myLabel, thePrs, Attributes()->DimensionAspect()->TextAspect(), TopLoc_Location());//no location
205   }
206 }
207
208 //=======================================================================
209 //function : SetColors
210 //purpose  :
211 //=======================================================================
212 void XCAFPrs_AISObject::SetColors (const Handle(Prs3d_Drawer)& theDrawer,
213                                    const Quantity_Color&       theColorCurv,
214                                    const Quantity_Color&       theColorSurf)
215 {
216   if (!theDrawer->HasOwnShadingAspect())
217   {
218     theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
219     if (theDrawer->HasLink())
220     {
221       *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
222     }
223   }
224   if (!theDrawer->HasOwnLineAspect())
225   {
226     theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
227     if (theDrawer->HasLink())
228     {
229       *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
230     }
231   }
232   if (!theDrawer->HasOwnWireAspect())
233   {
234     theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
235     if (theDrawer->HasLink())
236     {
237       *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
238     }
239   }
240   if (!theDrawer->HasOwnUIsoAspect())
241   {
242     theDrawer->SetUIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5, 1));
243     if (theDrawer->HasLink())
244     {
245       *theDrawer->UIsoAspect()->Aspect() = *theDrawer->Link()->UIsoAspect()->Aspect();
246       theDrawer->UIsoAspect()->SetNumber (theDrawer->Link()->UIsoAspect()->Number());
247     }
248   }
249   if (!theDrawer->HasOwnVIsoAspect())
250   {
251     theDrawer->SetVIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5, 1));
252     if (theDrawer->HasLink())
253     {
254       *theDrawer->VIsoAspect()->Aspect() = *theDrawer->Link()->VIsoAspect()->Aspect();
255       theDrawer->VIsoAspect()->SetNumber (theDrawer->Link()->VIsoAspect()->Number());
256     }
257   }
258   if (!theDrawer->HasOwnFreeBoundaryAspect())
259   {
260     theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
261     if (theDrawer->HasLink())
262     {
263       *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
264     }
265   }
266   if (!theDrawer->HasOwnUnFreeBoundaryAspect())
267   {
268     theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
269     if (theDrawer->HasLink())
270     {
271       *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
272     }
273   }
274
275   theDrawer->UnFreeBoundaryAspect()->SetColor (theColorCurv);
276   theDrawer->FreeBoundaryAspect()->SetColor (theColorCurv);
277   theDrawer->WireAspect()->SetColor (theColorCurv);
278
279   Graphic3d_MaterialAspect aMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
280   aMaterial.SetColor (theColorSurf);
281   theDrawer->ShadingAspect()->Aspect()->SetInteriorColor (theColorSurf);
282   theDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
283   theDrawer->UIsoAspect()->SetColor (theColorSurf);
284   theDrawer->VIsoAspect()->SetColor (theColorSurf);
285 }
286
287 //=======================================================================
288 //function : DefaultStyle
289 //purpose  : DefaultStyle() can be redefined by subclasses in order to set custom default style
290 //=======================================================================
291 void XCAFPrs_AISObject::DefaultStyle (XCAFPrs_Style& theStyle) const
292 {
293   theStyle.SetColorSurf (Quantity_NOC_WHITE);
294   theStyle.SetColorCurv (Quantity_NOC_WHITE);
295 }