0027961: Visualization - remove unused and no more working OpenGl_AVIWriter
[occt.git] / src / XCAFPrs / XCAFPrs_AISObject.cxx
CommitLineData
b311480e 1// Created on: 2000-08-11
2// Created by: Andrey BETENEV
973c2be1 3// Copyright (c) 2000-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 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
973c2be1 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.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
74618acf 16#include <XCAFPrs_AISObject.hxx>
17
18#include <AIS_DisplayMode.hxx>
3ea0a91b 19#include <BRep_Builder.hxx>
74618acf 20#include <BRepBndLib.hxx>
7fd59977 21#include <gp_Pnt.hxx>
74618acf 22#include <Graphic3d_AspectFillArea3d.hxx>
e21b2bc6 23#include <Graphic3d_AspectLine3d.hxx>
6262338c 24#include <Prs3d_Drawer.hxx>
a6eb515f 25#include <Prs3d_DimensionAspect.hxx>
74618acf 26#include <Prs3d_IsoAspect.hxx>
7fd59977 27#include <Prs3d_LineAspect.hxx>
7fd59977 28#include <Prs3d_ShadingAspect.hxx>
74618acf 29#include <Prs3d_Text.hxx>
7fd59977 30#include <TDataStd_Name.hxx>
74618acf 31#include <TDF_LabelSequence.hxx>
7fd59977 32#include <TPrsStd_AISPresentation.hxx>
74618acf 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>
7fd59977 39
7fd59977 40
92efcf78 41IMPLEMENT_STANDARD_RTTIEXT(XCAFPrs_AISObject,AIS_ColoredShape)
42
7fd59977 43//=======================================================================
44//function : XCAFPrs_AISObject
45//purpose :
46//=======================================================================
47
74618acf 48XCAFPrs_AISObject::XCAFPrs_AISObject (const TDF_Label& theLabel)
e5b8456d 49: AIS_ColoredShape(TopoDS_Shape()),
50 myToSyncStyles (Standard_True)
5cbef0fe 51{
905db769 52 // define plastic material by default for proper color reproduction
e5b8456d 53 setMaterial (myDrawer, Graphic3d_NOM_PLASTIC, Standard_False, Standard_False);
54 hasOwnMaterial = Standard_True;
55
74618acf 56 myLabel = theLabel;
7fd59977 57}
58
59//=======================================================================
60//function : DisplayText
61//purpose :
62//=======================================================================
63
64static void DisplayText (const TDF_Label& aLabel,
65 const Handle(Prs3d_Presentation)& aPrs,
66 const Handle(Prs3d_TextAspect)& anAspect,
67 const TopLoc_Location& aLocation)
68{
69 // first label itself
70 Handle (TDataStd_Name) aName;
71 if (aLabel.FindAttribute (TDataStd_Name::GetID(), aName)) {
72 TopoDS_Shape aShape;
73 if (XCAFDoc_ShapeTool::GetShape (aLabel, aShape)) {
74 // find the position to display as middle of the bounding box
75 aShape.Move (aLocation);
76 Bnd_Box aBox;
77 BRepBndLib::Add (aShape, aBox);
78 if ( ! aBox.IsVoid() )
79 {
80 Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
81 aBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
82 gp_Pnt aPnt (0.5 * (aXmin + aXmax), 0.5 * (aYmin + aYmax), 0.5 * (aZmin + aZmax));
4ad142d9 83 Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPrs), anAspect, aName->Get(), aPnt);
7fd59977 84 }
85 }
86 }
87
88 TDF_LabelSequence seq;
89
90 // attibutes of subshapes
91 if (XCAFDoc_ShapeTool::GetSubShapes (aLabel, seq)) {
92 Standard_Integer i = 1;
93 for (i = 1; i <= seq.Length(); i++) {
94 TDF_Label aL = seq.Value (i);
95 DisplayText (aL, aPrs, anAspect, aLocation); //suppose that subshapes do not contain locations
96 }
97 }
98
99 // attibutes of components
100 seq.Clear();
101 if (XCAFDoc_ShapeTool::GetComponents (aLabel, seq)) {
102 Standard_Integer i = 1;
103 for (i = 1; i <= seq.Length(); i++) {
104 TDF_Label aL = seq.Value (i);
105 DisplayText (aL, aPrs, anAspect, aLocation);
106 TDF_Label aRefLabel;
107
108 // attributes of referrences
109 TopLoc_Location aLoc = XCAFDoc_ShapeTool::GetLocation (aL);
110 if (XCAFDoc_ShapeTool::GetReferredShape (aL, aRefLabel)) {
111 DisplayText (aRefLabel, aPrs, anAspect, aLoc);
112 }
113 }
114 }
7fd59977 115}
74618acf 116
7fd59977 117//=======================================================================
e5b8456d 118//function : DispatchStyles
119//purpose :
7fd59977 120//=======================================================================
e5b8456d 121void XCAFPrs_AISObject::DispatchStyles (const Standard_Boolean theToSyncStyles)
74618acf 122{
e5b8456d 123 myToSyncStyles = theToSyncStyles;
124 myShapeColors.Clear();
7fd59977 125
e5b8456d 126 TopoDS_Shape aShape;
127 if (!XCAFDoc_ShapeTool::GetShape (myLabel, aShape) || aShape.IsNull())
74618acf 128 {
e5b8456d 129 Set (TopoDS_Shape());
130 return;
7fd59977 131 }
74618acf 132 Set (aShape);
7fd59977 133
74618acf 134 // Collecting information on colored subshapes
135 TopLoc_Location aLoc;
136 XCAFPrs_DataMapOfShapeStyle aSettings;
e5b8456d 137 XCAFPrs::CollectStyleSettings (myLabel, aLoc, aSettings);
74618acf 138
139 // Getting default colors
140 XCAFPrs_Style aDefStyle;
141 DefaultStyle (aDefStyle);
142 Quantity_Color aColorCurv = aDefStyle.GetColorCurv();
143 Quantity_Color aColorSurf = aDefStyle.GetColorSurf();
144
145 SetColors (myDrawer, aColorCurv, aColorSurf);
146
3ea0a91b 147 // collect sub-shapes with the same style into compounds
148 BRep_Builder aBuilder;
149 NCollection_DataMap<XCAFPrs_Style, TopoDS_Compound, XCAFPrs_Style> aStyleGroups;
150 for (XCAFPrs_DataMapIteratorOfDataMapOfShapeStyle aStyledShapeIter (aSettings);
151 aStyledShapeIter.More(); aStyledShapeIter.Next())
74618acf 152 {
3ea0a91b 153 TopoDS_Compound aComp;
154 if (aStyleGroups.Find (aStyledShapeIter.Value(), aComp))
155 {
156 aBuilder.Add (aComp, aStyledShapeIter.Key());
157 continue;
158 }
159
160 aBuilder.MakeCompound (aComp);
161 aBuilder.Add (aComp, aStyledShapeIter.Key());
162 aStyleGroups.Bind (aStyledShapeIter.Value(), aComp);
163 }
164 aSettings.Clear();
165
166 // assign custom aspects
167 for (NCollection_DataMap<XCAFPrs_Style, TopoDS_Compound, XCAFPrs_Style>::Iterator aStyleGroupIter (aStyleGroups);
168 aStyleGroupIter.More(); aStyleGroupIter.Next())
169 {
170 const TopoDS_Compound& aComp = aStyleGroupIter.Value();
171 TopoDS_Iterator aShapeIter (aComp);
51740958 172 TopoDS_Shape aShapeCur = aShapeIter.Value();
3ea0a91b 173 aShapeIter.Next();
174 if (aShapeIter.More())
175 {
51740958 176 aShapeCur = aComp;
3ea0a91b 177 }
178
51740958 179 Handle(AIS_ColoredDrawer) aDrawer = CustomAspects (aShapeCur);
3ea0a91b 180 const XCAFPrs_Style& aStyle = aStyleGroupIter.Key();
86766b0e 181 aDrawer->SetHidden (!aStyle.IsVisible());
74618acf 182
183 aColorCurv = aStyle.IsSetColorCurv() ? aStyle.GetColorCurv() : aDefStyle.GetColorCurv();
184 aColorSurf = aStyle.IsSetColorSurf() ? aStyle.GetColorSurf() : aDefStyle.GetColorSurf();
185
186 SetColors (aDrawer, aColorCurv, aColorSurf);
7fd59977 187 }
3ea0a91b 188 aStyleGroups.Clear();
e5b8456d 189}
190
191//=======================================================================
192//function : Compute
193//purpose :
194//=======================================================================
195void XCAFPrs_AISObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
196 const Handle(Prs3d_Presentation)& thePrs,
197 const Standard_Integer theMode)
198{
199 // update shape and sub-shapes styles only on first compute, or on first recompute
200 if (myToSyncStyles)
201 {
202 Standard_Boolean toMapStyles = myToSyncStyles;
203 for (PrsMgr_Presentations::Iterator aPrsIter (myPresentations); aPrsIter.More(); aPrsIter.Next())
204 {
205 if (aPrsIter.Value().Presentation()->Presentation() != thePrs
206 && !aPrsIter.Value().Presentation()->MustBeUpdated())
207 {
208 toMapStyles = Standard_False;
209 break;
210 }
211 }
212 if (toMapStyles)
213 {
214 DispatchStyles (Standard_True);
215 }
216 }
217 if (myshape.IsNull())
218 {
219 return;
220 }
221
222 if (myshape.ShapeType() == TopAbs_COMPOUND)
223 {
224 TopoDS_Iterator anExplor (myshape);
225 if (!anExplor.More())
226 {
227 return;
228 }
229 }
74618acf 230
231 AIS_ColoredShape::Compute (thePresentationManager, thePrs, theMode);
232
233 if (XCAFPrs::GetViewNameMode())
234 {
235 // Displaying Name attributes
236 thePrs->SetDisplayPriority (10);
237 DisplayText (myLabel, thePrs, Attributes()->DimensionAspect()->TextAspect(), TopLoc_Location());//no location
7fd59977 238 }
74618acf 239}
240
241//=======================================================================
242//function : SetColors
243//purpose :
244//=======================================================================
6262338c 245void XCAFPrs_AISObject::SetColors (const Handle(Prs3d_Drawer)& theDrawer,
246 const Quantity_Color& theColorCurv,
247 const Quantity_Color& theColorSurf)
74618acf 248{
6262338c 249 if (!theDrawer->HasOwnShadingAspect())
74618acf 250 {
251 theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
6262338c 252 if (theDrawer->HasLink())
253 {
254 *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
255 }
74618acf 256 }
6262338c 257 if (!theDrawer->HasOwnLineAspect())
74618acf 258 {
259 theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
6262338c 260 if (theDrawer->HasLink())
261 {
262 *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
263 }
74618acf 264 }
6262338c 265 if (!theDrawer->HasOwnWireAspect())
74618acf 266 {
267 theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
6262338c 268 if (theDrawer->HasLink())
269 {
270 *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
271 }
74618acf 272 }
6262338c 273 if (!theDrawer->HasOwnUIsoAspect())
74618acf 274 {
275 theDrawer->SetUIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5, 1));
6262338c 276 if (theDrawer->HasLink())
277 {
278 *theDrawer->UIsoAspect()->Aspect() = *theDrawer->Link()->UIsoAspect()->Aspect();
279 theDrawer->UIsoAspect()->SetNumber (theDrawer->Link()->UIsoAspect()->Number());
280 }
74618acf 281 }
6262338c 282 if (!theDrawer->HasOwnVIsoAspect())
74618acf 283 {
284 theDrawer->SetVIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5, 1));
6262338c 285 if (theDrawer->HasLink())
286 {
287 *theDrawer->VIsoAspect()->Aspect() = *theDrawer->Link()->VIsoAspect()->Aspect();
288 theDrawer->VIsoAspect()->SetNumber (theDrawer->Link()->VIsoAspect()->Number());
289 }
74618acf 290 }
6262338c 291 if (!theDrawer->HasOwnFreeBoundaryAspect())
74618acf 292 {
293 theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
6262338c 294 if (theDrawer->HasLink())
295 {
296 *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
297 }
74618acf 298 }
6262338c 299 if (!theDrawer->HasOwnUnFreeBoundaryAspect())
74618acf 300 {
301 theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
6262338c 302 if (theDrawer->HasLink())
303 {
304 *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
305 }
74618acf 306 }
307
308 theDrawer->UnFreeBoundaryAspect()->SetColor (theColorCurv);
309 theDrawer->FreeBoundaryAspect()->SetColor (theColorCurv);
310 theDrawer->WireAspect()->SetColor (theColorCurv);
311
312 Graphic3d_MaterialAspect aMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
313 aMaterial.SetColor (theColorSurf);
314 theDrawer->ShadingAspect()->Aspect()->SetInteriorColor (theColorSurf);
315 theDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
316 theDrawer->UIsoAspect()->SetColor (theColorSurf);
317 theDrawer->VIsoAspect()->SetColor (theColorSurf);
7fd59977 318}
576ab394
RL
319
320//=======================================================================
321//function : DefaultStyle
322//purpose : DefaultStyle() can be redefined by subclasses in order to set custom default style
323//=======================================================================
74618acf 324void XCAFPrs_AISObject::DefaultStyle (XCAFPrs_Style& theStyle) const
576ab394 325{
74618acf 326 theStyle.SetColorSurf (Quantity_NOC_WHITE);
327 theStyle.SetColorCurv (Quantity_NOC_WHITE);
576ab394 328}
e5b8456d 329
330// =======================================================================
331// function : SetMaterial
332// purpose :
333// =======================================================================
334void XCAFPrs_AISObject::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
335{
336 XCAFPrs_Style aDefStyle;
337 DefaultStyle (aDefStyle);
338 setMaterial (myDrawer, theMaterial, HasColor(), IsTransparent());
339 SetColors (myDrawer, aDefStyle.GetColorCurv(), aDefStyle.GetColorSurf());
340 for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
341 {
342 const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
343
344 // take current color
345 const Quantity_Color aColorCurv = aDrawer->WireAspect()->Aspect()->Color();
346 const Quantity_Color aSurfColor = aDrawer->ShadingAspect()->Aspect()->InteriorColor();
347
348 // SetColors() will take the material from myDrawer
349 SetColors (aDrawer, aColorCurv, aSurfColor);
350 }
351 SynchronizeAspects();
352}