4382b4ae2e38ac000490b7fb8ca66c382a75c26e
[occt.git] / src / XCAFPrs / XCAFPrs.cxx
1 // Created on: 2000-08-15
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
17 #include <BRep_Builder.hxx>
18 #include <TColStd_HSequenceOfExtendedString.hxx>
19 #include <TDF_AttributeSequence.hxx>
20 #include <TDF_Label.hxx>
21 #include <TDF_LabelSequence.hxx>
22 #include <TopLoc_IndexedMapOfLocation.hxx>
23 #include <TopLoc_Location.hxx>
24 #include <TopoDS.hxx>
25 #include <TopoDS_Compound.hxx>
26 #include <TopoDS_Iterator.hxx>
27 #include <TopTools_SequenceOfShape.hxx>
28 #include <XCAFDoc_ColorTool.hxx>
29 #include <XCAFDoc_DocumentTool.hxx>
30 #include <XCAFDoc_GraphNode.hxx>
31 #include <XCAFDoc_LayerTool.hxx>
32 #include <XCAFDoc_ShapeTool.hxx>
33 #include <XCAFPrs.hxx>
34 #include <XCAFPrs_Style.hxx>
35
36 static Standard_Boolean viewnameMode = Standard_False;
37
38 static Standard_Boolean getShapesOfSHUO (TopLoc_IndexedMapOfLocation& theaPrevLocMap,
39                                          const Handle(XCAFDoc_ShapeTool)& theSTool,
40                                          const TDF_Label& theSHUOlab,
41                                          TopTools_SequenceOfShape& theSHUOShapeSeq)
42 {
43   Handle(XCAFDoc_GraphNode) SHUO;
44   TDF_LabelSequence aLabSeq;
45   theSTool->GetSHUONextUsage( theSHUOlab, aLabSeq );
46   if (aLabSeq.Length() >= 1)
47     for (Standard_Integer i = 1; i <= aLabSeq.Length(); i++) {
48       TDF_Label aSubCompL = aLabSeq.Value( i );
49       TopLoc_Location compLoc = XCAFDoc_ShapeTool::GetLocation ( aSubCompL.Father() );
50       // create new map of laocation (to not merge locations from different shapes)
51       TopLoc_IndexedMapOfLocation aNewPrevLocMap;
52       for (Standard_Integer m = 1; m <= theaPrevLocMap.Extent(); m++)
53         aNewPrevLocMap.Add( theaPrevLocMap.FindKey( m ) );
54       aNewPrevLocMap.Add( compLoc );
55       // got for the new sublocations and corresponding shape
56       getShapesOfSHUO( aNewPrevLocMap, theSTool, aSubCompL, theSHUOShapeSeq );
57     }
58   else {
59     TopoDS_Shape aSHUO_NUSh = theSTool->GetShape ( theSHUOlab.Father() );
60     if ( aSHUO_NUSh.IsNull() ) return Standard_False;
61     // cause got shape with location already.
62     TopLoc_Location nullLoc;
63     aSHUO_NUSh.Location ( nullLoc );
64     // multiply the locations
65     Standard_Integer intMapLenght = theaPrevLocMap.Extent();
66     if ( intMapLenght < 1 )
67       return Standard_False; // should not be, but to avoid exception...?
68     TopLoc_Location SupcompLoc;
69     SupcompLoc = theaPrevLocMap.FindKey( intMapLenght );
70     if (intMapLenght > 1) {
71       Standard_Integer l = intMapLenght - 1;
72       while (l >= 1) {
73         SupcompLoc = theaPrevLocMap.FindKey( l ).Multiplied( SupcompLoc );
74         l--;
75       }
76     }
77     aSHUO_NUSh.Location( SupcompLoc );
78     theSHUOShapeSeq.Append( aSHUO_NUSh );
79   }
80   return (theSHUOShapeSeq.Length() > 0);
81 }
82
83 //=======================================================================
84 //function : CollectStyleSettings
85 //purpose  : 
86 //=======================================================================
87
88 void XCAFPrs::CollectStyleSettings (const TDF_Label& theLabel,
89                                     const TopLoc_Location& theLoc,
90                                     XCAFPrs_IndexedDataMapOfShapeStyle& theSettings,
91                                     const Quantity_ColorRGBA& theLayerColor)
92 {
93   // for references, first collect colors of referred shape
94   {
95     TDF_Label aLabelRef;
96     if (XCAFDoc_ShapeTool::GetReferredShape (theLabel, aLabelRef))
97     {
98       Quantity_ColorRGBA aLayerColor = theLayerColor;
99       Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool (theLabel);
100       Handle(TColStd_HSequenceOfExtendedString) aLayerNames = new TColStd_HSequenceOfExtendedString();
101       aLayerTool->GetLayers (theLabel, aLayerNames);
102       if (aLayerNames->Length() == 1)
103       {
104         TDF_Label aLayer = aLayerTool->FindLayer (aLayerNames->First());
105         Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(theLabel);
106         Quantity_ColorRGBA aColor;
107         if (aColorTool->GetColor (aLayer, XCAFDoc_ColorGen, aColor))
108           aLayerColor = aColor;
109       }
110       TopLoc_Location aLocSub = theLoc.Multiplied (XCAFDoc_ShapeTool::GetLocation (theLabel));
111       CollectStyleSettings (aLabelRef, aLocSub, theSettings, aLayerColor);
112     }
113   }
114
115   // for assemblies, first collect colors defined in components
116   {
117     TDF_LabelSequence aComponentLabSeq;
118     if (XCAFDoc_ShapeTool::GetComponents (theLabel, aComponentLabSeq)
119     && !aComponentLabSeq.IsEmpty())
120     {
121       for (TDF_LabelSequence::Iterator aComponentIter (aComponentLabSeq); aComponentIter.More(); aComponentIter.Next())
122       {
123         const TDF_Label& aComponentLab = aComponentIter.Value();
124         CollectStyleSettings (aComponentLab, theLoc, theSettings, theLayerColor);
125       }
126     }
127   }
128
129   // collect settings on subshapes
130   Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(theLabel);
131   TDF_LabelSequence aLabSeq;
132   XCAFDoc_ShapeTool::GetSubShapes (theLabel, aLabSeq);
133   // and add the shape itself
134   aLabSeq.Append (theLabel);
135   for (TDF_LabelSequence::Iterator aLabIter (aLabSeq); aLabIter.More(); aLabIter.Next())
136   {
137     const TDF_Label& aLabel = aLabIter.Value();
138     XCAFPrs_Style aStyle;
139
140     Standard_Boolean isVisible = aColorTool->IsVisible (aLabel);
141     if (isVisible)
142     {
143       Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool (aLabel);
144       Handle(TColStd_HSequenceOfExtendedString) aLayerNames = new TColStd_HSequenceOfExtendedString();
145       aLayerTool->GetLayers (aLabel, aLayerNames);
146       Standard_Integer aNbHidden = 0;
147       for (TColStd_HSequenceOfExtendedString::Iterator aLayerIter (*aLayerNames); aLayerIter.More(); aLayerIter.Next())
148       {
149         const TCollection_ExtendedString& aLayerName = aLayerIter.Value();
150         if (!aLayerTool->IsVisible (aLayerTool->FindLayer (aLayerName)))
151         {
152           ++aNbHidden;
153         }
154       }
155       isVisible = aNbHidden == 0
156                || aNbHidden != aLayerNames->Length();
157     }
158
159     if (!isVisible)
160     {
161       aStyle.SetVisibility (Standard_False);
162     }
163     else
164     {
165       if (aColorTool->IsColorByLayer(aLabel))
166       {
167         Quantity_ColorRGBA aLayerColor = theLayerColor;
168         Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool (aLabel);
169         Handle(TColStd_HSequenceOfExtendedString) aLayerNames = new TColStd_HSequenceOfExtendedString();
170         aLayerTool->GetLayers (aLabel, aLayerNames);
171         if (aLayerNames->Length() == 1)
172         {
173           TDF_Label aLayer = aLayerTool->FindLayer (aLayerNames->First());
174           Quantity_ColorRGBA aColor;
175           if (aColorTool->GetColor (aLayer, XCAFDoc_ColorGen, aColor))
176             aLayerColor = aColor;
177         }
178
179         aStyle.SetColorCurv (aLayerColor.GetRGB());
180         aStyle.SetColorSurf (aLayerColor);
181       }
182       else
183       {
184         Quantity_ColorRGBA aColor;
185         if (aColorTool->GetColor (aLabel, XCAFDoc_ColorGen, aColor))
186         {
187           aStyle.SetColorCurv (aColor.GetRGB());
188           aStyle.SetColorSurf (aColor);
189         }
190         if (aColorTool->GetColor (aLabel, XCAFDoc_ColorSurf, aColor))
191         {
192           aStyle.SetColorSurf (aColor);
193         }
194         if (aColorTool->GetColor (aLabel, XCAFDoc_ColorCurv, aColor))
195         {
196           aStyle.SetColorCurv (aColor.GetRGB());
197         }
198       }
199     }
200
201     // PTV try to set color from SHUO structure
202     Handle(XCAFDoc_ShapeTool) aShapeTool = aColorTool->ShapeTool();
203     if (aShapeTool->IsComponent (aLabel))
204     {
205       TDF_AttributeSequence aShuoAttribSeq;
206       aShapeTool->GetAllComponentSHUO (aLabel, aShuoAttribSeq);
207       for (TDF_AttributeSequence::Iterator aShuoAttribIter (aShuoAttribSeq); aShuoAttribIter.More(); aShuoAttribIter.Next())
208       {
209         Handle(XCAFDoc_GraphNode) aShuoNode = Handle(XCAFDoc_GraphNode)::DownCast (aShuoAttribIter.Value());
210         if (aShuoNode.IsNull())
211         {
212           continue;
213         }
214
215         const TDF_Label aShuolab = aShuoNode->Label();
216         {
217           TDF_LabelSequence aShuoLabSeq;
218           aShapeTool->GetSHUONextUsage (aShuolab, aShuoLabSeq);
219           if (aShuoLabSeq.IsEmpty())
220           {
221             continue;
222           }
223         }
224
225         Quantity_ColorRGBA aColor;
226         XCAFPrs_Style aShuoStyle;
227         if (!aColorTool->IsVisible (aShuolab))
228         {
229           aShuoStyle.SetVisibility (Standard_False);
230         }
231         else
232         {
233           if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorGen, aColor))
234           {
235             aShuoStyle.SetColorCurv (aColor.GetRGB());
236             aShuoStyle.SetColorSurf (aColor);
237           }
238           if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorSurf, aColor))
239           {
240             aShuoStyle.SetColorSurf (aColor);
241           }
242           if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorCurv, aColor))
243           {
244             aShuoStyle.SetColorCurv (aColor.GetRGB());
245           }
246         }
247         if (!aShuoStyle.IsSetColorCurv()
248          && !aShuoStyle.IsSetColorSurf()
249          &&  aShuoStyle.IsVisible())
250         {
251           continue;
252         }
253
254         // set style for all component from Next Usage Occurrence.
255       #ifdef OCCT_DEBUG
256         std::cout << "Set the style for SHUO next_usage-occurrance" << std::endl;
257       #endif
258         /* 
259         // may be work, but static it returns excess shapes. It is more faster to use OLD version.
260         // PTV 14.02.2003 NEW version using API of ShapeTool
261         TopTools_SequenceOfShape aShuoShapeSeq;
262         aShapeTool->GetAllStyledComponents (aShuoNode, aShuoShapeSeq);
263         for (TopTools_SequenceOfShape::Iterator aShuoShapeIter (aShuoShapeSeq); aShuoShapeIter.More(); aShuoShapeIter.Next())
264         {
265           const TopoDS_Shape& aShuoShape = aShuoShapeIter.Value();
266           if (!aShuoShape.IsNull())
267             theSettings.Bind (aShuoShape, aShuoStyle);
268         }*/
269         // OLD version that was written before ShapeTool API, and it FASTER for presentation
270         // get TOP location of SHUO component
271         TopLoc_Location compLoc = XCAFDoc_ShapeTool::GetLocation (aLabel);
272         TopLoc_IndexedMapOfLocation aPrevLocMap;
273         // get previous set location
274         if (!theLoc.IsIdentity())
275         {
276           aPrevLocMap.Add (theLoc);
277         }
278         aPrevLocMap.Add (compLoc);
279
280         // get shapes of SHUO Next_Usage components
281         TopTools_SequenceOfShape aShuoShapeSeq;
282         getShapesOfSHUO (aPrevLocMap, aShapeTool, aShuolab, aShuoShapeSeq);
283         for (TopTools_SequenceOfShape::Iterator aShuoShapeIter (aShuoShapeSeq); aShuoShapeIter.More(); aShuoShapeIter.Next())
284         {
285           const TopoDS_Shape& aShuoShape = aShuoShapeIter.Value();
286           XCAFPrs_Style* aMapStyle = theSettings.ChangeSeek (aShuoShape);
287           if (aMapStyle == NULL)
288             theSettings.Add (aShuoShape, aShuoStyle);
289           else
290             *aMapStyle = aShuoStyle;
291         }
292         continue;
293       }
294     }
295
296     if (!aStyle.IsSetColorCurv()
297      && !aStyle.IsSetColorSurf()
298      &&  aStyle.IsVisible())
299     {
300       continue;
301     }
302
303     TopoDS_Shape aSubshape = XCAFDoc_ShapeTool::GetShape (aLabel);
304     if (aSubshape.ShapeType() == TopAbs_COMPOUND)
305     {
306       if (aSubshape.NbChildren() == 0)
307       {
308         continue;
309       }
310     }
311     aSubshape.Move (theLoc);
312     XCAFPrs_Style* aMapStyle = theSettings.ChangeSeek (aSubshape);
313     if (aMapStyle == NULL)
314       theSettings.Add (aSubshape, aStyle);
315     else
316       *aMapStyle = aStyle;
317   }
318 }
319
320 //=======================================================================
321 //function : SetViewNameMode
322 //purpose  : 
323 //=======================================================================
324
325 void XCAFPrs::SetViewNameMode(const Standard_Boolean aNameMode )
326 {
327   viewnameMode = aNameMode;
328 }
329
330 //=======================================================================
331 //function : GetViewNameMode
332 //purpose  : 
333 //=======================================================================
334
335 Standard_Boolean XCAFPrs::GetViewNameMode()
336 {
337   return viewnameMode;
338 }