0022920: EXTERNLIB missing in FILES list of Image package
[occt.git] / src / XCAFPrs / XCAFPrs_AISObject.cxx
CommitLineData
7fd59977 1// File: XCAFPrs_AISObject.cxx
2// Created: Fri Aug 11 16:49:09 2000
3// Author: Andrey BETENEV
4// <abv@doomox.nnov.matra-dtv.fr>
5
6#include <XCAFPrs_AISObject.ixx>
7#include <TCollection_ExtendedString.hxx>
8#include <gp_Pnt.hxx>
9#include <Prs3d_Text.hxx>
10#include <Prs3d_LengthAspect.hxx>
11#include <XCAFDoc_ShapeTool.hxx>
12
13#include <Standard_ErrorHandler.hxx>
14#include <Standard_Failure.hxx>
15
16#include <Precision.hxx>
17#include <TopoDS_Shape.hxx>
18#include <TopoDS_Iterator.hxx>
19#include <BRepTools.hxx>
20
21#include <StdPrs_WFDeflectionShape.hxx>
22#include <StdPrs_ShadedShape.hxx>
23#include <StdPrs_WFShape.hxx>
24#include <AIS_Drawer.hxx>
25#include <Graphic3d_Array1OfVertex.hxx>
26#include <Graphic3d_Group.hxx>
27#include <Quantity_Color.hxx>
28#include <Aspect_TypeOfLine.hxx>
29#include <Prs3d_LineAspect.hxx>
30#include <Graphic3d_AspectLine3d.hxx>
31#include <BRep_Builder.hxx>
32#include <TopoDS_Compound.hxx>
33#include <XCAFPrs_Style.hxx>
34#include <TopoDS_Shape.hxx>
35#include <XCAFPrs_DataMapOfShapeStyle.hxx>
36#include <TDF_LabelSequence.hxx>
37#include <XCAFPrs_DataMapOfStyleShape.hxx>
38#include <TopoDS.hxx>
39#include <XCAFPrs_DataMapIteratorOfDataMapOfStyleShape.hxx>
40#include <Graphic3d_AspectFillArea3d.hxx>
41#include <Aspect_InteriorStyle.hxx>
42#include <Aspect_TypeOfLine.hxx>
43#include <Prs3d_ShadingAspect.hxx>
44
45#include <Prs3d_IsoAspect.hxx>
46#include <XCAFPrs.hxx>
47
48#include <TDataStd_Name.hxx>
49#include <BRepBndLib.hxx>
50
51#include <TPrsStd_AISPresentation.hxx>
52
53#ifdef DEBUG
54#include <DBRep.hxx>
55#endif
56
57
58//=======================================================================
59//function : XCAFPrs_AISObject
60//purpose :
61//=======================================================================
62
63XCAFPrs_AISObject::XCAFPrs_AISObject (const TDF_Label &lab) : AIS_Shape(TopoDS_Shape())
64{
65 myLabel = lab;
66
67 TopoDS_Shape shape;
68 if ( XCAFDoc_ShapeTool::GetShape ( myLabel, shape ) && ! shape.IsNull() )
69 Set ( shape );
70}
71
72//=======================================================================
73//function : Compute
74//purpose :
75//=======================================================================
76
77void DisplayBox(const Handle(Prs3d_Presentation)& aPrs,
78 const Bnd_Box& B,
79 const Handle(Prs3d_Drawer)& aDrawer)
80{
81 Standard_Real X[2],Y[2],Z[2];
82 Standard_Integer Indx [16] ;
83 if ( B.IsVoid() )
84 return;
85
86#ifdef BUC60577
87 Indx [0]=1;Indx [1]=2;Indx [2]=4;Indx [3]=3;
88 Indx [4]=5;Indx [5]=6;Indx [6]=8;Indx [7]=7;
89 Indx [8]=1;Indx [9]=3;Indx [10]=7;Indx [11]=5;
90 Indx [12]=2;Indx [13]=4;Indx [14]=8;Indx [15]=6;
91 B.Get(X[0], Y[0], Z[0], X[1], Y[1], Z[1]);
92#else
93 Indx [0]=1;Indx [1]=2;Indx [2]=3;Indx [3]=4;Indx [4]=5;Indx [5]=6;Indx [6]=7;
94 Indx [7]=8;Indx [8]=1;Indx [9]=2;Indx [10]=6;Indx [10]=5;Indx [10]=3;
95 Indx [10]=4;Indx [10]=8;Indx [10]=7;
96 B.Get(X[1], Y[1], Z[1], X[2], Y[2], Z[2]);
97#endif
98
99 Graphic3d_Array1OfVertex V(1,8);
100 Standard_Integer Rank(0);
101 for(Standard_Integer k=0;k<=1;k++)
102 for(Standard_Integer j=0;j<=1;j++)
103 for(Standard_Integer i=0;i<=1;i++)
104 V(++Rank) = Graphic3d_Vertex(X[i],Y[j],Z[k]);
105
106
107 Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(aPrs);
108 Quantity_Color Q;
109 Aspect_TypeOfLine A;
110 Standard_Real W;
111 aDrawer->LineAspect()->Aspect()->Values(Q,A,W);
112
113
114 G->SetGroupPrimitivesAspect(new Graphic3d_AspectLine3d(Q,Aspect_TOL_DOTDASH,W));
115
116 G->BeginPrimitives();Standard_Integer I,J;
117 Graphic3d_Array1OfVertex VVV (1,5);
118 for(I=1;I<=4;I++){
119 for(J=1;J<=4;J++){
120 VVV.SetValue(J,V(Indx[J+4*I-5]));
121 }
122 VVV.SetValue(5,VVV(1));
123 G->Polyline(VVV);
124 }
125 G->EndPrimitives();
126}
127
128void XCAFPrs_AISObject::AddStyledItem (const XCAFPrs_Style &style,
129 const TopoDS_Shape &shape,
130 const Handle(PrsMgr_PresentationManager3d)&, // aPresentationManager,
131 const Handle(Prs3d_Presentation)& aPrs,
132 const Standard_Integer aMode)
133{
134 // remember current color settings
135 Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
136 Aspect_InteriorStyle aStyle;
137 Quantity_Color aIntColor, aEdgeColor;
138 Aspect_TypeOfLine aType;
139 Standard_Real aWidth;
140 a4bis->Values(aStyle,aIntColor,aEdgeColor,aType,aWidth);
141 Graphic3d_MaterialAspect FMAT = a4bis->FrontMaterial();
142 Quantity_Color aFColor = FMAT.Color();
143
144 Quantity_Color aColor1, aColor2;
145 Aspect_TypeOfLine aLine1, aLine2;
146 Standard_Real aWigth1, aWigth2;
147 Handle(Prs3d_LineAspect) waUFB = myDrawer->UnFreeBoundaryAspect();
148 waUFB->Aspect()->Values(aColor1,aLine1,aWigth1);
149 Handle(Prs3d_LineAspect) waFB = myDrawer->FreeBoundaryAspect();
150 waFB->Aspect()->Values(aColor2,aLine2,aWigth2);
151
152 Quantity_Color aColor;
153 Aspect_TypeOfLine aLine;
154 Standard_Real aWigth;
155 Handle(Prs3d_LineAspect) wa = myDrawer->WireAspect();
156 wa->Aspect()->Values(aColor,aLine,aWigth);
157
158 Quantity_Color aColorU, aColorV;
159 Aspect_TypeOfLine aLineU, aLineV;
160 Standard_Real aWigthU, aWigthV;
161 Handle(Prs3d_IsoAspect) UIso = myDrawer->UIsoAspect();
162 Handle(Prs3d_IsoAspect) VIso = myDrawer->VIsoAspect();
163 UIso->Aspect()->Values(aColorU,aLineU,aWigthU);
164 VIso->Aspect()->Values(aColorV,aLineV,aWigthV);
165
166 // Set colors etc. for current shape according to style
167 if ( style.IsSetColorCurv() ) {
168 Quantity_Color Color = style.GetColorCurv();
169 waUFB->SetColor ( Color.Name() );
170 waFB->SetColor ( Color.Name() );
171 wa->SetColor ( Color.Name() );
172 }
173 if ( style.IsSetColorSurf() ) {
174 Quantity_Color Color = style.GetColorSurf();
175 a4bis->SetInteriorColor(Color);
176 FMAT.SetColor(Color);
177 a4bis->SetFrontMaterial(FMAT);
178 UIso->SetColor ( Color.Name() );
179 VIso->SetColor ( Color.Name() );
180 }
181
182 // force drawing isos on planes
183 Standard_Boolean drawIsosPln = myDrawer->IsoOnPlane();
184 myDrawer->SetIsoOnPlane (Standard_True);
185
186 // add shape to presentation
187 switch (aMode) {
188 case 0:{
189 try { OCC_CATCH_SIGNALS StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer); }
190 catch (Standard_Failure) {
191#ifdef DEB
192 cout << "AIS_Shape::Compute() failed: exception " <<
193 Standard_Failure::Caught()->DynamicType()->Name() << ": " <<
194 Standard_Failure::Caught()->GetMessageString() << endl;
195#endif
196// cout << "a Shape should be incorrect: No Compute can be maked on it "<< endl;
197// on calcule une presentation de la boite englobante
198// Compute(aPresentationManager,aPrs,2);
199 }
200 break;
201 }
202 case 1:
203 {
204 Standard_Real prevangle ;
205 Standard_Real newangle ;
206 Standard_Real prevcoeff ;
207 Standard_Real newcoeff ;
208
209 if (OwnDeviationAngle(newangle,prevangle) ||
210 OwnDeviationCoefficient(newcoeff,prevcoeff))
211 if (Abs (newangle - prevangle) > Precision::Angular() ||
212 Abs (newcoeff - prevcoeff) > Precision::Confusion() ) {
213#ifdef DEB
214 cout << "AIS_Shape : compute"<<endl;
215 cout << "newangl : " << newangle << " # de " << "prevangl : " << prevangle << " OU "<<endl;
216 cout << "newcoeff : " << newcoeff << " # de " << "prevcoeff : " << prevcoeff << endl;
217#endif
218 BRepTools::Clean(shape);
219 }
220
221 //shading seulement a partir de face...
222 try {
223 OCC_CATCH_SIGNALS
224 if ((Standard_Integer) shape.ShapeType()>4)
225 StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer);
226 else {
227 myDrawer->SetShadingAspectGlobal(Standard_False);
228 if (IsInfinite())
229 StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer);
230 else
231 StdPrs_ShadedShape::Add(aPrs,shape,myDrawer);
232 }
233 }
234 catch (Standard_Failure) {
235#ifdef DEB
236 cout << "AIS_Shape::Compute() in ShadingMode failed: exception " <<
237 Standard_Failure::Caught()->DynamicType()->Name() << ": " <<
238 Standard_Failure::Caught()->GetMessageString() << endl;
239#endif
240 // last resort: try to display as wireframe
241 try {
242 OCC_CATCH_SIGNALS
243 StdPrs_WFShape::Add(aPrs,shape,myDrawer);
244 }
245 catch (Standard_Failure) {
246 }
247 }
248 break;
249 }
250 case 2:
251 {
252 // boite englobante
253 if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,shape,myDrawer);
254 else DisplayBox(aPrs,BoundingBox(),myDrawer);
255 }
256 }
257
258 // Restore initial settings
259 if ( style.IsSetColorCurv() ) {
260 waUFB->SetColor ( aColor1.Name() );
261 waFB->SetColor ( aColor2.Name() );
262 wa->SetColor ( aColor.Name() );
263 }
264 if ( style.IsSetColorSurf() ) {
265 a4bis->SetInteriorColor(aIntColor);
266 FMAT.SetColor(aFColor);
267 a4bis->SetFrontMaterial(FMAT);
268 UIso->SetColor ( aColorU );
269 VIso->SetColor ( aColorV );
270 }
271 myDrawer->SetIsoOnPlane (drawIsosPln);
272}
273
274//=======================================================================
275//function : DisplayText
276//purpose :
277//=======================================================================
278
279static void DisplayText (const TDF_Label& aLabel,
280 const Handle(Prs3d_Presentation)& aPrs,
281 const Handle(Prs3d_TextAspect)& anAspect,
282 const TopLoc_Location& aLocation)
283{
284 // first label itself
285 Handle (TDataStd_Name) aName;
286 if (aLabel.FindAttribute (TDataStd_Name::GetID(), aName)) {
287 TopoDS_Shape aShape;
288 if (XCAFDoc_ShapeTool::GetShape (aLabel, aShape)) {
289 // find the position to display as middle of the bounding box
290 aShape.Move (aLocation);
291 Bnd_Box aBox;
292 BRepBndLib::Add (aShape, aBox);
293 if ( ! aBox.IsVoid() )
294 {
295 Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
296 aBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
297 gp_Pnt aPnt (0.5 * (aXmin + aXmax), 0.5 * (aYmin + aYmax), 0.5 * (aZmin + aZmax));
298 Prs3d_Text::Draw( aPrs, anAspect, aName->Get(), aPnt);
299 }
300 }
301 }
302
303 TDF_LabelSequence seq;
304
305 // attibutes of subshapes
306 if (XCAFDoc_ShapeTool::GetSubShapes (aLabel, seq)) {
307 Standard_Integer i = 1;
308 for (i = 1; i <= seq.Length(); i++) {
309 TDF_Label aL = seq.Value (i);
310 DisplayText (aL, aPrs, anAspect, aLocation); //suppose that subshapes do not contain locations
311 }
312 }
313
314 // attibutes of components
315 seq.Clear();
316 if (XCAFDoc_ShapeTool::GetComponents (aLabel, seq)) {
317 Standard_Integer i = 1;
318 for (i = 1; i <= seq.Length(); i++) {
319 TDF_Label aL = seq.Value (i);
320 DisplayText (aL, aPrs, anAspect, aLocation);
321 TDF_Label aRefLabel;
322
323 // attributes of referrences
324 TopLoc_Location aLoc = XCAFDoc_ShapeTool::GetLocation (aL);
325 if (XCAFDoc_ShapeTool::GetReferredShape (aL, aRefLabel)) {
326 DisplayText (aRefLabel, aPrs, anAspect, aLoc);
327 }
328 }
329 }
330
331}
332
333//=======================================================================
334//function : Compute
335//purpose :
336//=======================================================================
337// The Compute() method is copied from AIS_Shape::Compute and enhanced to
338// support different color settings for different subshapes of a single shape
339
340void XCAFPrs_AISObject::Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
341 const Handle(Prs3d_Presentation)& aPrs,
342 const Standard_Integer aMode)
343{
344#ifdef DEB
345 cout << "XCAFPrs_AISObject: Update called" << endl;
346#endif
347 aPrs->Clear();
348
349 // abv: 06 Mar 00: to have good colors
350 Handle(TPrsStd_AISPresentation) prs = Handle(TPrsStd_AISPresentation)::DownCast ( GetOwner() );
351 Graphic3d_NameOfMaterial material = ( prs.IsNull() ? Graphic3d_NOM_PLASTIC : prs->Material() );
352// Graphic3d_NameOfMaterial material = Material();
353 SetMaterial ( material );
354
355// SetMaterial ( Graphic3d_NOM_PLASTIC );
356
357 TopoDS_Shape shape;
358 if ( ! XCAFDoc_ShapeTool::GetShape ( myLabel, shape ) || shape.IsNull() ) return;
359
360 // wire,edge,vertex -> pas de HLR + priorite display superieure
361 Standard_Integer TheType = (Standard_Integer)shape.ShapeType();
362 if(TheType>4 && TheType<8) {
363 aPrs->SetVisual(Graphic3d_TOS_ALL);
364 aPrs->SetDisplayPriority(TheType+2);
365 }
366 // Shape vide -> Assemblage vide.
367 if (shape.ShapeType() == TopAbs_COMPOUND) {
368 TopoDS_Iterator anExplor (shape);
369 if (!anExplor.More()) {
370 return;
371 }
372 }
373 if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //pas de prise en compte lors du FITALL
374
375 // collect information on colored subshapes
376 TopLoc_Location L;
377 XCAFPrs_DataMapOfShapeStyle settings;
378 XCAFPrs::CollectStyleSettings ( myLabel, L, settings );
379#ifdef DEB
380 cout << "Styles collected" << endl;
381#endif
382
383 // dispatch (sub)shapes by their styles
384 XCAFPrs_DataMapOfStyleShape items;
385 XCAFPrs_Style DefStyle;
386 Quantity_Color White ( Quantity_NOC_WHITE );
387 DefStyle.SetColorSurf ( White );
388 DefStyle.SetColorCurv ( White );
389 XCAFPrs::DispatchStyles ( shape, settings, items, DefStyle );
390#ifdef DEB
391 cout << "Dispatch done" << endl;
392#endif
393
394 // add subshapes to presentation (one shape per style)
395 XCAFPrs_DataMapIteratorOfDataMapOfStyleShape it ( items );
396#ifdef DEB
397 Standard_Integer i=1;
398#endif
399 for ( ; it.More(); it.Next() ) {
400 XCAFPrs_Style s = it.Key();
401#ifdef DEB
402 cout << "Style " << i << ": [" <<
403 ( s.IsSetColorSurf() ? Quantity_Color::StringName ( s.GetColorSurf().Name() ) : "" ) << ", " <<
404 ( s.IsSetColorCurv() ? Quantity_Color::StringName ( s.GetColorCurv().Name() ) : "" ) << "]" <<
405 " --> si_" << i << ( s.IsVisible() ? "" : " <invisible>" ) << endl;
406#ifdef DEBUG
407 char str[200];
408 sprintf ( str, "si_%d", i );
409 DBRep::Set ( str, it.Value() );
410 try { OCC_CATCH_SIGNALS ; } // to handle all till the end of for
411 catch (Standard_Failure) {
412 cout << "Exception in AddStyledItem!" << endl;
413 continue;
414 }
415#endif
416 i++;
417#endif
418 if (! s.IsVisible() ) continue;
419 AddStyledItem ( s, it.Value(), aPresentationManager, aPrs, aMode );
420 }
421
422 if ( XCAFPrs::GetViewNameMode() ) {
423 // Displaying Name attributes
424#ifdef DEB
425 cout << "Now display name of shapes" << endl;
426#endif
427 aPrs->SetDisplayPriority(10);
428 DisplayText (myLabel, aPrs, Attributes()->LengthAspect()->TextAspect(), TopLoc_Location());//no location
429 }
430#ifdef DEB
431 cout << "Compute finished" << endl;
432#endif
433
434 aPrs->ReCompute(); // for hidden line recomputation if necessary...
435}