0026886: Visualization, TKV3d - eliminate global variables
[occt.git] / src / AIS / AIS_Shape.cxx
... / ...
CommitLineData
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
18#include <AIS_GraphicTool.hxx>
19#include <AIS_InteractiveContext.hxx>
20#include <AIS_Shape.hxx>
21#include <Aspect_TypeOfLine.hxx>
22#include <Bnd_Box.hxx>
23#include <BRep_Builder.hxx>
24#include <BRepBndLib.hxx>
25#include <BRepTools.hxx>
26#include <BRepTools_ShapeSet.hxx>
27#include <Geom_Transformation.hxx>
28#include <gp_Pnt.hxx>
29#include <Graphic3d_ArrayOfPolylines.hxx>
30#include <Graphic3d_AspectFillArea3d.hxx>
31#include <Graphic3d_AspectLine3d.hxx>
32#include <Graphic3d_AspectMarker3d.hxx>
33#include <Graphic3d_AspectText3d.hxx>
34#include <Graphic3d_Group.hxx>
35#include <Graphic3d_MaterialAspect.hxx>
36#include <Graphic3d_SequenceOfGroup.hxx>
37#include <Graphic3d_Structure.hxx>
38#include <HLRBRep.hxx>
39#include <OSD_Timer.hxx>
40#include <Precision.hxx>
41#include <Prs3d.hxx>
42#include <Prs3d_Drawer.hxx>
43#include <Prs3d_IsoAspect.hxx>
44#include <Prs3d_Presentation.hxx>
45#include <Prs3d_Projector.hxx>
46#include <Prs3d_Root.hxx>
47#include <Prs3d_ShadingAspect.hxx>
48#include <StdPrs_BndBox.hxx>
49#include <StdPrs_ToolTriangulatedShape.hxx>
50#include <PrsMgr_ModedPresentation.hxx>
51#include <Quantity_Color.hxx>
52#include <Select3D_SensitiveBox.hxx>
53#include <Select3D_SensitiveEntity.hxx>
54#include <Standard_ErrorHandler.hxx>
55#include <Standard_Failure.hxx>
56#include <Standard_Type.hxx>
57#include <StdPrs_HLRPolyShape.hxx>
58#include <StdPrs_HLRShape.hxx>
59#include <StdPrs_ShadedShape.hxx>
60#include <StdPrs_WFShape.hxx>
61#include <StdSelect.hxx>
62#include <StdSelect_BRepOwner.hxx>
63#include <StdSelect_BRepSelectionTool.hxx>
64#include <StdSelect_DisplayMode.hxx>
65#include <TColStd_ListIteratorOfListOfInteger.hxx>
66#include <TopExp.hxx>
67#include <TopExp_Explorer.hxx>
68#include <TopoDS_Iterator.hxx>
69#include <TopoDS_Shape.hxx>
70
71IMPLEMENT_STANDARD_RTTIEXT(AIS_Shape,AIS_InteractiveObject)
72
73static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard_Integer aMode)
74{
75 TColStd_ListIteratorOfListOfInteger It(LL);
76 for(;It.More();It.Next()){
77 if(It.Value()==aMode)
78 return Standard_True;}
79 return Standard_False;
80}
81
82//==================================================
83// Function:
84// Purpose :
85//==================================================
86
87AIS_Shape::
88AIS_Shape(const TopoDS_Shape& shap):
89AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant),
90myInitAng(0.)
91{
92 Set (shap);
93 SetHilightMode(0);
94 myDrawer->SetShadingAspectGlobal(Standard_False);
95}
96
97//=======================================================================
98//function : Type
99//purpose :
100//=======================================================================
101AIS_KindOfInteractive AIS_Shape::Type() const
102{return AIS_KOI_Shape;}
103
104
105//=======================================================================
106//function : Signature
107//purpose :
108//=======================================================================
109Standard_Integer AIS_Shape::Signature() const
110{return 0;}
111
112//=======================================================================
113//function : AcceptShapeDecomposition
114//purpose :
115//=======================================================================
116Standard_Boolean AIS_Shape::AcceptShapeDecomposition() const
117{return Standard_True;}
118
119//=======================================================================
120//function : Compute
121//purpose :
122//=======================================================================
123void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
124 const Handle(Prs3d_Presentation)& aPrs,
125 const Standard_Integer aMode)
126{
127 aPrs->Clear();
128 if(myshape.IsNull()) return;
129
130 // wire,edge,vertex -> pas de HLR + priorite display superieure
131 Standard_Integer TheType = (Standard_Integer) myshape.ShapeType();
132 if(TheType>4 && TheType<8) {
133 aPrs->SetVisual(Graphic3d_TOS_ALL);
134 aPrs->SetDisplayPriority(TheType+2);
135 }
136 // Shape vide -> Assemblage vide.
137 if (myshape.ShapeType() == TopAbs_COMPOUND) {
138 TopoDS_Iterator anExplor (myshape);
139
140 if (!anExplor.More()) {
141 return;
142 }
143 }
144
145 if (IsInfinite())
146 {
147 aPrs->SetInfiniteState (Standard_True); //not taken in account duting FITALL
148 }
149
150 switch (aMode)
151 {
152 case AIS_WireFrame:
153 {
154 try
155 {
156 OCC_CATCH_SIGNALS
157 StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
158 }
159 catch (Standard_Failure)
160 {
161 #ifdef OCCT_DEBUG
162 cout << "AIS_Shape::Compute() failed" << endl;
163 cout << "a Shape should be incorrect : No Compute can be maked on it " << endl;
164 #endif
165 // presentation of the bounding box is calculated
166 // Compute(aPresentationManager,aPrs,2);
167 }
168 break;
169 }
170 case AIS_Shaded:
171 {
172 if (myDrawer->IsAutoTriangulation())
173 {
174 Standard_Real anAnglePrev, anAngleNew, aCoeffPrev, aCoeffNew;
175 Standard_Boolean isOwnDeviationAngle = OwnDeviationAngle (anAngleNew, anAnglePrev);
176 Standard_Boolean isOwnDeviationCoefficient = OwnDeviationCoefficient(aCoeffNew, aCoeffPrev);
177 if ((isOwnDeviationAngle && Abs (anAngleNew - anAnglePrev) > Precision::Angular())
178 || (isOwnDeviationCoefficient && Abs (aCoeffNew - aCoeffPrev) > Precision::Confusion()))
179 {
180 BRepTools::Clean (myshape);
181 }
182 }
183
184 if ((Standard_Integer) myshape.ShapeType() > 4)
185 {
186 StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
187 }
188 else
189 {
190 myDrawer->SetShadingAspectGlobal (Standard_False);
191 if (IsInfinite())
192 {
193 StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
194 }
195 else
196 {
197 try
198 {
199 OCC_CATCH_SIGNALS
200 StdPrs_ShadedShape::Add (aPrs, myshape, myDrawer);
201 }
202 catch (Standard_Failure)
203 {
204 #ifdef OCCT_DEBUG
205 cout << "AIS_Shape::Compute() in ShadingMode failed" << endl;
206 #endif
207 StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
208 }
209 }
210 }
211 Standard_Real aTransparency = Transparency() ;
212 if (aTransparency > 0.0)
213 {
214 SetTransparency (aTransparency);
215 }
216 break;
217 }
218
219 // Bounding box.
220 case 2:
221 {
222 if (IsInfinite())
223 {
224 StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
225 }
226 else
227 {
228 StdPrs_BndBox::Add (aPrs, BoundingBox(), myDrawer);
229 }
230 }
231 }
232
233 // Recompute hidden line presentation (if necessary).
234 aPrs->ReCompute();
235}
236
237//=======================================================================
238//function : Compute
239//purpose : Hidden Line Removal
240//=======================================================================
241void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
242 const Handle(Prs3d_Presentation)& aPresentation)
243{
244 Compute(aProjector,aPresentation,myshape);
245}
246
247//=======================================================================
248//function : Compute
249//purpose :
250//=======================================================================
251
252void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
253 const Handle(Geom_Transformation)& TheTrsf,
254 const Handle(Prs3d_Presentation)& aPresentation)
255{
256 const TopLoc_Location& loc = myshape.Location();
257 TopoDS_Shape shbis = myshape.Located(TopLoc_Location(TheTrsf->Trsf())*loc);
258 Compute(aProjector,aPresentation,shbis);
259}
260
261//=======================================================================
262//function : Compute
263//purpose :
264//=======================================================================
265
266void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
267 const Handle(Prs3d_Presentation)& aPresentation,
268 const TopoDS_Shape& SH)
269{
270 if (SH.ShapeType() == TopAbs_COMPOUND) {
271 TopoDS_Iterator anExplor (SH);
272
273 if (!anExplor.More()) // Shape vide -> Assemblage vide.
274 return;
275 }
276
277 Handle (Prs3d_Drawer) defdrawer = GetContext()->DefaultDrawer();
278 if (defdrawer->DrawHiddenLine())
279 {myDrawer->EnableDrawHiddenLine();}
280 else {myDrawer->DisableDrawHiddenLine();}
281
282 Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
283 defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
284
285 if (myDrawer->IsAutoTriangulation())
286 {
287 // coefficients for calculation
288 Standard_Real aPrevAngle, aNewAngle, aPrevCoeff, aNewCoeff;
289 Standard_Boolean isOwnHLRDeviationAngle = OwnHLRDeviationAngle (aNewAngle, aPrevAngle);
290 Standard_Boolean isOwnHLRDeviationCoefficient = OwnHLRDeviationCoefficient (aNewCoeff, aPrevCoeff);
291 if (((Abs (aNewAngle - aPrevAngle) > Precision::Angular()) && isOwnHLRDeviationAngle) ||
292 ((Abs (aNewCoeff - aPrevCoeff) > Precision::Confusion()) && isOwnHLRDeviationCoefficient))
293 {
294 BRepTools::Clean(SH);
295 }
296 }
297
298 {
299 try {
300 OCC_CATCH_SIGNALS
301 switch (TypeOfHLR()) {
302 case Prs3d_TOH_Algo:
303 StdPrs_HLRShape::Add (aPresentation, SH, myDrawer, aProjector);
304 break;
305 case Prs3d_TOH_PolyAlgo:
306 default:
307 StdPrs_HLRPolyShape::Add (aPresentation, SH, myDrawer, aProjector);
308 break;
309 }
310 }
311 catch (Standard_Failure) {
312#ifdef OCCT_DEBUG
313 cout <<"AIS_Shape::Compute(Proj) HLR Algorithm failed" << endl;
314#endif
315 StdPrs_WFShape::Add(aPresentation,SH,myDrawer);
316 }
317 }
318
319 defdrawer->SetTypeOfDeflection (prevdef);
320}
321
322//=======================================================================
323//function : SelectionType
324//purpose : gives the type according to the Index of Selection Mode
325//=======================================================================
326
327TopAbs_ShapeEnum AIS_Shape::SelectionType(const Standard_Integer aMode)
328{
329 switch(aMode){
330 case 1:
331 return TopAbs_VERTEX;
332 case 2:
333 return TopAbs_EDGE;
334 case 3:
335 return TopAbs_WIRE;
336 case 4:
337 return TopAbs_FACE;
338 case 5:
339 return TopAbs_SHELL;
340 case 6:
341 return TopAbs_SOLID;
342 case 7:
343 return TopAbs_COMPSOLID;
344 case 8:
345 return TopAbs_COMPOUND;
346 case 0:
347 default:
348 return TopAbs_SHAPE;
349 }
350
351}
352//=======================================================================
353//function : SelectionType
354//purpose : gives the SelectionMode according to the Type od Decomposition...
355//=======================================================================
356Standard_Integer AIS_Shape::SelectionMode(const TopAbs_ShapeEnum aType)
357{
358 switch(aType){
359 case TopAbs_VERTEX:
360 return 1;
361 case TopAbs_EDGE:
362 return 2;
363 case TopAbs_WIRE:
364 return 3;
365 case TopAbs_FACE:
366 return 4;
367 case TopAbs_SHELL:
368 return 5;
369 case TopAbs_SOLID:
370 return 6;
371 case TopAbs_COMPSOLID:
372 return 7;
373 case TopAbs_COMPOUND:
374 return 8;
375 case TopAbs_SHAPE:
376 default:
377 return 0;
378 }
379}
380
381
382//=======================================================================
383//function : ComputeSelection
384//purpose :
385//=======================================================================
386
387void AIS_Shape::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
388 const Standard_Integer aMode)
389{
390 if(myshape.IsNull()) return;
391 if (myshape.ShapeType() == TopAbs_COMPOUND) {
392 TopoDS_Iterator anExplor (myshape);
393
394 if (!anExplor.More()) // empty Shape -> empty Assembly.
395 return;
396 }
397
398 TopAbs_ShapeEnum TypOfSel = AIS_Shape::SelectionType(aMode);
399 TopoDS_Shape shape = myshape;
400
401// POP protection against crash in low layers
402
403 Standard_Real aDeflection = Prs3d::GetDeflection(shape, myDrawer);
404 try {
405 OCC_CATCH_SIGNALS
406 StdSelect_BRepSelectionTool::Load(aSelection,
407 this,
408 shape,
409 TypOfSel,
410 aDeflection,
411 myDrawer->HLRAngle(),
412 myDrawer->IsAutoTriangulation());
413 } catch ( Standard_Failure ) {
414// cout << "a Shape should be incorrect : A Selection on the Bnd is activated "<<endl;
415 if ( aMode == 0 ) {
416 aSelection->Clear();
417 Bnd_Box B = BoundingBox();
418 Handle(StdSelect_BRepOwner) aOwner = new StdSelect_BRepOwner(shape,this);
419 Handle(Select3D_SensitiveBox) aSensitiveBox = new Select3D_SensitiveBox(aOwner,B);
420 aSelection->Add(aSensitiveBox);
421 }
422 }
423
424 // insert the drawer in the BrepOwners for hilight...
425 StdSelect::SetDrawerForBRepOwner(aSelection,myDrawer);
426}
427
428Quantity_NameOfColor AIS_Shape::Color() const {
429Quantity_Color aColor;
430 Color(aColor);
431 return aColor.Name();
432}
433
434void AIS_Shape::Color( Quantity_Color& aColor ) const {
435 aColor = myDrawer->ShadingAspect()->Color(myCurrentFacingModel);
436}
437
438Graphic3d_NameOfMaterial AIS_Shape::Material() const {
439 return (myDrawer->ShadingAspect()->Material(myCurrentFacingModel)).Name();
440}
441
442Standard_Real AIS_Shape::Transparency() const {
443 return myDrawer->ShadingAspect()->Transparency(myCurrentFacingModel);
444}
445
446//=======================================================================
447//function : SetColor
448//purpose :
449//=======================================================================
450
451void AIS_Shape::SetColor(const Quantity_NameOfColor aCol)
452{
453 SetColor(Quantity_Color(aCol));
454}
455
456//=======================================================================
457//function : setColor
458//purpose :
459//=======================================================================
460
461void AIS_Shape::setColor (const Handle(Prs3d_Drawer)& theDrawer,
462 const Quantity_Color& theColor) const
463{
464 if (!theDrawer->HasOwnShadingAspect())
465 {
466 theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
467 if (theDrawer->HasLink())
468 {
469 *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
470 }
471 }
472 if (!theDrawer->HasOwnLineAspect())
473 {
474 theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
475 if (theDrawer->HasLink())
476 {
477 *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
478 }
479 }
480 if (!theDrawer->HasOwnWireAspect())
481 {
482 theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
483 if (theDrawer->HasLink())
484 {
485 *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
486 }
487 }
488 if (!theDrawer->HasOwnPointAspect())
489 {
490 theDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_BLACK, 1.0));
491 if (theDrawer->HasLink())
492 {
493 *theDrawer->PointAspect()->Aspect() = *theDrawer->Link()->PointAspect()->Aspect();
494 }
495 }
496 if (!theDrawer->HasOwnFreeBoundaryAspect())
497 {
498 theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
499 if (theDrawer->HasLink())
500 {
501 *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
502 }
503 }
504 if (!theDrawer->HasOwnUnFreeBoundaryAspect())
505 {
506 theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
507 if (theDrawer->HasLink())
508 {
509 *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
510 }
511 }
512 if (!theDrawer->HasOwnSeenLineAspect())
513 {
514 theDrawer->SetSeenLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
515 if (theDrawer->HasLink())
516 {
517 *theDrawer->SeenLineAspect()->Aspect() = *theDrawer->Link()->SeenLineAspect()->Aspect();
518 }
519 }
520
521 // override color
522 theDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
523 theDrawer->SetShadingAspectGlobal (Standard_False);
524 theDrawer->LineAspect()->SetColor (theColor);
525 theDrawer->WireAspect()->SetColor (theColor);
526 theDrawer->PointAspect()->SetColor (theColor);
527 theDrawer->FreeBoundaryAspect()->SetColor (theColor);
528 theDrawer->UnFreeBoundaryAspect()->SetColor (theColor);
529 theDrawer->SeenLineAspect()->SetColor (theColor);
530}
531
532//=======================================================================
533//function : SetColor
534//purpose :
535//=======================================================================
536
537void AIS_Shape::SetColor (const Quantity_Color& theColor)
538{
539 setColor (myDrawer, theColor);
540 myOwnColor = theColor;
541 hasOwnColor = Standard_True;
542
543 // modify shading presentation without re-computation
544 const PrsMgr_Presentations& aPrsList = Presentations();
545 Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
546 Handle(Graphic3d_AspectLine3d) aLineAspect = myDrawer->LineAspect()->Aspect();
547 Handle(Graphic3d_AspectMarker3d) aPointAspect = myDrawer->PointAspect()->Aspect();
548 for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
549 {
550 const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
551 if (aPrsModed.Mode() != AIS_Shaded)
552 {
553 continue;
554 }
555
556 const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
557
558 // Set aspects for presentation
559 aPrs->SetPrimitivesAspect (anAreaAspect);
560 aPrs->SetPrimitivesAspect (aLineAspect);
561 aPrs->SetPrimitivesAspect (aPointAspect);
562
563 // Go through all groups to change color for all primitives
564 for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
565 {
566 const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
567
568 // Check if aspect of given type is set for the group,
569 // because setting aspect for group with no already set aspect
570 // can lead to loss of presentation data
571 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
572 {
573 aGroup->SetGroupPrimitivesAspect (anAreaAspect);
574 }
575 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
576 {
577 aGroup->SetGroupPrimitivesAspect (aLineAspect);
578 }
579 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
580 {
581 aGroup->SetGroupPrimitivesAspect (aPointAspect);
582 }
583 }
584 }
585
586 LoadRecomputable (AIS_WireFrame);
587 LoadRecomputable (2);
588}
589
590//=======================================================================
591//function : UnsetColor
592//purpose :
593//=======================================================================
594
595void AIS_Shape::UnsetColor()
596{
597 if (!HasColor())
598 {
599 myToRecomputeModes.Clear();
600 return;
601 }
602 hasOwnColor = Standard_False;
603
604 if (!HasWidth())
605 {
606 Handle(Prs3d_LineAspect) anEmptyAsp;
607 myDrawer->SetLineAspect (anEmptyAsp);
608 myDrawer->SetWireAspect (anEmptyAsp);
609 myDrawer->SetFreeBoundaryAspect (anEmptyAsp);
610 myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
611 myDrawer->SetSeenLineAspect (anEmptyAsp);
612 }
613 else
614 {
615 Quantity_Color aColor = Quantity_NOC_YELLOW;
616 if (myDrawer->HasLink())
617 {
618 AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Line, aColor);
619 }
620 myDrawer->LineAspect()->SetColor (aColor);
621 aColor = Quantity_NOC_RED;
622 if (myDrawer->HasLink())
623 {
624 AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Wire, aColor);
625 }
626 myDrawer->WireAspect()->SetColor (aColor);
627 aColor = Quantity_NOC_GREEN;
628 if (myDrawer->HasLink())
629 {
630 AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Free, aColor);
631 }
632 myDrawer->FreeBoundaryAspect()->SetColor (aColor);
633 aColor = Quantity_NOC_YELLOW;
634 if (myDrawer->HasLink())
635 {
636 AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_UnFree, aColor);
637 }
638 myDrawer->UnFreeBoundaryAspect()->SetColor (aColor);
639 if (myDrawer->HasLink())
640 {
641 AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Seen, aColor);
642 }
643 myDrawer->SeenLineAspect()->SetColor (aColor);
644 }
645
646 if (HasMaterial()
647 || IsTransparent())
648 {
649 Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
650 Graphic3d_MaterialAspect mat = aDefaultMat;
651 if (HasMaterial() || myDrawer->HasLink())
652 {
653 mat = AIS_GraphicTool::GetMaterial(HasMaterial()? myDrawer : myDrawer->Link());
654 }
655 if (HasMaterial())
656 {
657 Quantity_Color aColor = aDefaultMat.AmbientColor();
658 if (myDrawer->HasLink())
659 {
660 aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
661 }
662 mat.SetColor (aColor);
663 }
664 if (IsTransparent())
665 {
666 Standard_Real aTransp = myDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
667 mat.SetTransparency (aTransp);
668 }
669 myDrawer->ShadingAspect()->SetMaterial (mat ,myCurrentFacingModel);
670 }
671 else
672 {
673 myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
674 }
675 myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
676
677 // modify shading presentation without re-computation
678 const PrsMgr_Presentations& aPrsList = Presentations();
679 Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->Link()->ShadingAspect()->Aspect();
680 Handle(Graphic3d_AspectLine3d) aLineAsp = myDrawer->Link()->LineAspect()->Aspect();
681 for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
682 {
683 const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
684 if (aPrsModed.Mode() != AIS_Shaded)
685 {
686 continue;
687 }
688
689 const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
690
691 aPrs->SetPrimitivesAspect (anAreaAsp);
692 aPrs->SetPrimitivesAspect (aLineAsp);
693
694 for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
695 {
696 const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
697
698 // Check if aspect of given type is set for the group,
699 // because setting aspect for group with no already set aspect
700 // can lead to loss of presentation data
701 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
702 {
703 aGroup->SetGroupPrimitivesAspect (anAreaAsp);
704 }
705 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
706 {
707 aGroup->SetGroupPrimitivesAspect (aLineAsp);
708 }
709 }
710 }
711
712 LoadRecomputable (AIS_WireFrame);
713 LoadRecomputable (2);
714}
715
716//=======================================================================
717//function : setWidth
718//purpose :
719//=======================================================================
720
721void AIS_Shape::setWidth (const Handle(Prs3d_Drawer)& theDrawer,
722 const Standard_Real theLineWidth) const
723{
724 if (!theDrawer->HasOwnLineAspect())
725 {
726 theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
727 if (theDrawer->HasLink())
728 {
729 *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
730 }
731 }
732 if (!theDrawer->HasOwnWireAspect())
733 {
734 theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
735 if (theDrawer->HasLink())
736 {
737 *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
738 }
739 }
740 if (!theDrawer->HasOwnFreeBoundaryAspect())
741 {
742 theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
743 if (theDrawer->HasLink())
744 {
745 *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
746 }
747 }
748 if (!theDrawer->HasOwnUnFreeBoundaryAspect())
749 {
750 theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
751 if (theDrawer->HasLink())
752 {
753 *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
754 }
755 }
756 if (!theDrawer->HasOwnSeenLineAspect())
757 {
758 theDrawer->SetSeenLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
759 if (theDrawer->HasLink())
760 {
761 *theDrawer->SeenLineAspect()->Aspect() = *theDrawer->Link()->SeenLineAspect()->Aspect();
762 }
763 }
764
765 // override width
766 theDrawer->LineAspect()->SetWidth (theLineWidth);
767 theDrawer->WireAspect()->SetWidth (theLineWidth);
768 theDrawer->FreeBoundaryAspect()->SetWidth (theLineWidth);
769 theDrawer->UnFreeBoundaryAspect()->SetWidth (theLineWidth);
770 theDrawer->SeenLineAspect()->SetWidth (theLineWidth);
771}
772
773//=======================================================================
774//function : SetWidth
775//purpose :
776//=======================================================================
777
778void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
779{
780 setWidth (myDrawer, theLineWidth);
781 myOwnWidth = theLineWidth;
782 LoadRecomputable (AIS_WireFrame); // means that it is necessary to recompute only the wireframe....
783 LoadRecomputable (2); // and the bounding box...
784}
785
786//=======================================================================
787//function : UnsetWidth
788//purpose :
789//=======================================================================
790
791void AIS_Shape::UnsetWidth()
792{
793 if (myOwnWidth == 0.0)
794 {
795 myToRecomputeModes.Clear();
796 return;
797 }
798
799 myOwnWidth = 0.0;
800
801 Handle(Prs3d_LineAspect) anEmptyAsp;
802
803 if (!HasColor())
804 {
805 myDrawer->SetLineAspect (anEmptyAsp);
806 myDrawer->SetWireAspect (anEmptyAsp);
807 myDrawer->SetFreeBoundaryAspect (anEmptyAsp);
808 myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
809 myDrawer->SetSeenLineAspect (anEmptyAsp);
810 }
811 else
812 {
813 myDrawer->LineAspect() ->SetWidth (myDrawer->HasLink() ?
814 AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Line) : 1.);
815 myDrawer->WireAspect() ->SetWidth (myDrawer->HasLink() ?
816 AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Wire) : 1.);
817 myDrawer->FreeBoundaryAspect() ->SetWidth (myDrawer->HasLink() ?
818 AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Free) : 1.);
819 myDrawer->UnFreeBoundaryAspect()->SetWidth (myDrawer->HasLink() ?
820 AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_UnFree) : 1.);
821 myDrawer->SeenLineAspect() ->SetWidth (myDrawer->HasLink() ?
822 AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Seen) : 1.);
823 }
824 LoadRecomputable (AIS_WireFrame);
825}
826
827//=======================================================================
828//function : setMaterial
829//purpose :
830//=======================================================================
831
832void AIS_Shape::setMaterial (const Handle(Prs3d_Drawer)& theDrawer,
833 const Graphic3d_MaterialAspect& theMaterial,
834 const Standard_Boolean theToKeepColor,
835 const Standard_Boolean theToKeepTransp) const
836{
837 const Quantity_Color aColor = theDrawer->ShadingAspect()->Material (myCurrentFacingModel).Color();
838 const Standard_Real aTransp = theDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
839 if (!theDrawer->HasOwnShadingAspect())
840 {
841 theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
842 if (theDrawer->HasLink())
843 {
844 *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
845 }
846 }
847 theDrawer->ShadingAspect()->SetMaterial (theMaterial, myCurrentFacingModel);
848
849 if (theToKeepColor)
850 {
851 theDrawer->ShadingAspect()->SetColor (aColor, myCurrentFacingModel);
852 }
853 if (theToKeepTransp)
854 {
855 theDrawer->ShadingAspect()->SetTransparency (aTransp, myCurrentFacingModel);
856 }
857}
858
859//=======================================================================
860//function : SetMaterial
861//purpose :
862//=======================================================================
863
864void AIS_Shape::SetMaterial(const Graphic3d_NameOfMaterial aMat)
865{
866 SetMaterial(Graphic3d_MaterialAspect(aMat));
867}
868
869//=======================================================================
870//function : SetMaterial
871//purpose :
872//=======================================================================
873
874void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
875{
876 setMaterial (myDrawer, theMat, HasColor(), IsTransparent());
877 hasOwnMaterial = Standard_True;
878
879 // modify shading presentation without re-computation
880 const PrsMgr_Presentations& aPrsList = Presentations();
881 Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
882 for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
883 {
884 const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
885 if (aPrsModed.Mode() != AIS_Shaded)
886 {
887 continue;
888 }
889
890 const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
891 aPrs->SetPrimitivesAspect (anAreaAsp);
892 for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
893 {
894 const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
895
896 // Check if aspect of given type is set for the group,
897 // because setting aspect for group with no already set aspect
898 // can lead to loss of presentation data
899 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
900 {
901 aGroup->SetGroupPrimitivesAspect (anAreaAsp);
902 }
903 }
904 }
905
906 myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
907 myToRecomputeModes.Clear();
908}
909
910//=======================================================================
911//function : UnsetMaterial
912//purpose :
913//=======================================================================
914
915void AIS_Shape::UnsetMaterial()
916{
917 if (!HasMaterial())
918 {
919 return;
920 }
921
922 if (HasColor()
923 || IsTransparent())
924 {
925 if(myDrawer->HasLink())
926 {
927 myDrawer->ShadingAspect()->SetMaterial (myDrawer->Link()->ShadingAspect()->Material (myCurrentFacingModel),
928 myCurrentFacingModel);
929 }
930 if (HasColor())
931 {
932 myDrawer->ShadingAspect()->SetColor (myOwnColor, myCurrentFacingModel);
933 myDrawer->ShadingAspect()->SetTransparency (myTransparency, myCurrentFacingModel);
934 }
935 }
936 else
937 {
938 myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
939 }
940 hasOwnMaterial = Standard_False;
941
942 // modify shading presentation without re-computation
943 const PrsMgr_Presentations& aPrsList = Presentations();
944 Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
945 for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
946 {
947 const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
948 if (aPrsModed.Mode() != AIS_Shaded)
949 {
950 continue;
951 }
952
953 const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
954 aPrs->SetPrimitivesAspect (anAreaAsp);
955 for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
956 {
957 const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
958 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
959 {
960 aGroup->SetGroupPrimitivesAspect (anAreaAsp);
961 }
962 }
963 }
964
965 myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
966 myToRecomputeModes.Clear();
967}
968
969//=======================================================================
970//function : setTransparency
971//purpose :
972//=======================================================================
973
974void AIS_Shape::setTransparency (const Handle(Prs3d_Drawer)& theDrawer,
975 const Standard_Real theValue) const
976{
977 if (!theDrawer->HasOwnShadingAspect())
978 {
979 theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
980 if (theDrawer->HasLink())
981 {
982 *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
983 }
984 }
985
986 // override transparency
987 theDrawer->ShadingAspect()->SetTransparency (theValue, myCurrentFacingModel);
988}
989
990//=======================================================================
991//function : SetTransparency
992//purpose :
993//=======================================================================
994
995void AIS_Shape::SetTransparency (const Standard_Real theValue)
996{
997 setTransparency (myDrawer, theValue);
998 myTransparency = theValue;
999
1000 // modify shading presentation without re-computation
1001 const PrsMgr_Presentations& aPrsList = Presentations();
1002 Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
1003 for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
1004 {
1005 const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
1006 if (aPrsModed.Mode() != AIS_Shaded)
1007 {
1008 continue;
1009 }
1010
1011 const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
1012 aPrs->SetPrimitivesAspect (anAreaAsp);
1013 aPrs->SetDisplayPriority (10); // force highest priority for translucent objects
1014 for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
1015 {
1016 const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
1017 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
1018 {
1019 aGroup->SetGroupPrimitivesAspect (anAreaAsp);
1020 }
1021 }
1022 }
1023
1024 myRecomputeEveryPrs = Standard_False; // no mode to recalculate - only viewer update
1025 myToRecomputeModes.Clear();
1026}
1027
1028//=======================================================================
1029//function : UnsetTransparency
1030//purpose :
1031//=======================================================================
1032
1033void AIS_Shape::UnsetTransparency()
1034{
1035 myTransparency = 0.0;
1036 if (!myDrawer->HasOwnShadingAspect())
1037 {
1038 return;
1039 }
1040 else if (HasColor() || HasMaterial())
1041 {
1042 myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
1043 }
1044 else
1045 {
1046 myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
1047 }
1048
1049 // modify shading presentation without re-computation
1050 const PrsMgr_Presentations& aPrsList = Presentations();
1051 Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
1052 for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
1053 {
1054 const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
1055 if (aPrsModed.Mode() != AIS_Shaded)
1056 {
1057 continue;
1058 }
1059
1060 const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
1061 aPrs->SetPrimitivesAspect (anAreaAsp);
1062 for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
1063 {
1064 const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
1065 if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
1066 {
1067 aGroup->SetGroupPrimitivesAspect (anAreaAsp);
1068 }
1069 }
1070 aPrs->ResetDisplayPriority();
1071 }
1072
1073 myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
1074 myToRecomputeModes.Clear();
1075}
1076
1077//=======================================================================
1078//function : LoadRecomputable
1079//purpose :
1080//=======================================================================
1081
1082void AIS_Shape::LoadRecomputable(const Standard_Integer TheMode)
1083{
1084 myRecomputeEveryPrs = Standard_False;
1085 if(!IsInList(myToRecomputeModes,TheMode))
1086 myToRecomputeModes.Append(TheMode);
1087}
1088
1089//=======================================================================
1090//function : BoundingBox
1091//purpose :
1092//=======================================================================
1093
1094const Bnd_Box& AIS_Shape::BoundingBox()
1095{
1096 if (myshape.ShapeType() == TopAbs_COMPOUND) {
1097 TopoDS_Iterator anExplor (myshape);
1098
1099 if (!anExplor.More()) { // empty Shape -> empty Assembly.
1100 myBB.SetVoid();
1101 return myBB;
1102 }
1103 }
1104
1105 if(myCompBB) {
1106 BRepBndLib::AddClose(myshape, myBB);
1107 myCompBB = Standard_False;
1108 }
1109 return myBB;
1110}
1111
1112//*****
1113//***** Reset
1114//=======================================================================
1115//function : SetOwnDeviationCoefficient
1116//purpose : resets myhasOwnDeviationCoefficient to Standard_False and
1117// returns Standard_True if it change
1118//=======================================================================
1119
1120Standard_Boolean AIS_Shape::SetOwnDeviationCoefficient ()
1121{
1122 Standard_Boolean itSet = myDrawer->HasOwnDeviationCoefficient();
1123 if(itSet) myDrawer->SetDeviationCoefficient();
1124 return itSet;
1125}
1126
1127//=======================================================================
1128//function : SetHLROwnDeviationCoefficient
1129//purpose : resets myhasOwnHLRDeviationCoefficient to Standard_False and
1130// returns Standard_True if it change
1131//=======================================================================
1132
1133Standard_Boolean AIS_Shape::SetOwnHLRDeviationCoefficient ()
1134{
1135 Standard_Boolean itSet = myDrawer->HasOwnHLRDeviationCoefficient();
1136 if(itSet) myDrawer->SetHLRDeviationCoefficient();
1137 return itSet;
1138
1139}
1140
1141//=======================================================================
1142//function : SetOwnDeviationAngle
1143//purpose : resets myhasOwnDeviationAngle to Standard_False and
1144// returns Standard_True if it change
1145//=======================================================================
1146
1147Standard_Boolean AIS_Shape::SetOwnDeviationAngle ()
1148{
1149 Standard_Boolean itSet = myDrawer->HasOwnDeviationAngle();
1150 if(itSet) myDrawer->SetDeviationAngle();
1151 return itSet;
1152
1153}
1154
1155//=======================================================================
1156//function : SetOwnHLRDeviationAngle
1157//purpose : resets myhasOwnHLRDeviationAngle to Standard_False and
1158// returns Standard_True if it change
1159//=======================================================================
1160
1161Standard_Boolean AIS_Shape::SetOwnHLRDeviationAngle ()
1162{
1163 Standard_Boolean itSet = myDrawer->HasOwnHLRDeviationAngle();
1164 if(itSet) myDrawer->SetHLRAngle();
1165 return itSet;
1166
1167}
1168//***** SetOwn
1169//=======================================================================
1170//function : SetOwnDeviationCoefficient
1171//purpose :
1172//=======================================================================
1173
1174void AIS_Shape::SetOwnDeviationCoefficient ( const Standard_Real aCoefficient )
1175{
1176 myDrawer->SetDeviationCoefficient( aCoefficient );
1177 SetToUpdate(0) ; // WireFrame
1178 SetToUpdate(1) ; // Shadding
1179}
1180
1181//=======================================================================
1182//function : SetOwnHLRDeviationCoefficient
1183//purpose :
1184//=======================================================================
1185
1186void AIS_Shape::SetOwnHLRDeviationCoefficient ( const Standard_Real aCoefficient )
1187{
1188 myDrawer->SetHLRDeviationCoefficient( aCoefficient );
1189
1190}
1191
1192//=======================================================================
1193//function : SetOwnDeviationAngle
1194//purpose :
1195//=======================================================================
1196
1197void AIS_Shape::SetOwnDeviationAngle ( const Standard_Real anAngle )
1198{
1199
1200 myDrawer->SetDeviationAngle(anAngle );
1201 SetToUpdate(0) ; // WireFrame
1202}
1203//=======================================================================
1204//function : SetOwnDeviationAngle
1205//purpose :
1206//=======================================================================
1207
1208void AIS_Shape::SetAngleAndDeviation ( const Standard_Real anAngle )
1209{
1210 Standard_Real OutAngl,OutDefl;
1211 HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1212 SetOwnDeviationAngle(anAngle) ;
1213 SetOwnDeviationCoefficient(OutDefl) ;
1214 myInitAng = anAngle;
1215 SetToUpdate(0);
1216 SetToUpdate(1);
1217}
1218
1219//=======================================================================
1220//function : UserAngle
1221//purpose :
1222//=======================================================================
1223
1224Standard_Real AIS_Shape::UserAngle() const
1225{
1226 return myInitAng ==0. ? GetContext()->DeviationAngle(): myInitAng;
1227}
1228
1229
1230//=======================================================================
1231//function : SetHLRAngleAndDeviation
1232//purpose :
1233//=======================================================================
1234
1235void AIS_Shape::SetHLRAngleAndDeviation ( const Standard_Real anAngle )
1236{
1237 Standard_Real OutAngl,OutDefl;
1238 HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1239 SetOwnHLRDeviationAngle( OutAngl );
1240 SetOwnHLRDeviationCoefficient(OutDefl);
1241
1242}
1243//=======================================================================
1244//function : SetOwnHLRDeviationAngle
1245//purpose :
1246//=======================================================================
1247
1248void AIS_Shape::SetOwnHLRDeviationAngle ( const Standard_Real anAngle )
1249{
1250 myDrawer->SetHLRAngle( anAngle );
1251}
1252
1253//***** GetOwn
1254//=======================================================================
1255//function : OwnDeviationCoefficient
1256//purpose :
1257//=======================================================================
1258
1259Standard_Boolean AIS_Shape::OwnDeviationCoefficient ( Standard_Real & aCoefficient,
1260 Standard_Real & aPreviousCoefficient ) const
1261{
1262 aCoefficient = myDrawer->DeviationCoefficient();
1263 aPreviousCoefficient = myDrawer->PreviousDeviationCoefficient ();
1264 return myDrawer->HasOwnDeviationCoefficient() ;
1265}
1266
1267//=======================================================================
1268//function : OwnHLRDeviationCoefficient
1269//purpose :
1270//=======================================================================
1271
1272Standard_Boolean AIS_Shape::OwnHLRDeviationCoefficient ( Standard_Real & aCoefficient,
1273 Standard_Real & aPreviousCoefficient ) const
1274{
1275 aCoefficient = myDrawer->HLRDeviationCoefficient();
1276 aPreviousCoefficient = myDrawer->PreviousHLRDeviationCoefficient ();
1277 return myDrawer->HasOwnHLRDeviationCoefficient();
1278
1279}
1280
1281//=======================================================================
1282//function : OwnDeviationAngle
1283//purpose :
1284//=======================================================================
1285
1286Standard_Boolean AIS_Shape::OwnDeviationAngle ( Standard_Real & anAngle,
1287 Standard_Real & aPreviousAngle ) const
1288{
1289 anAngle = myDrawer->DeviationAngle();
1290 aPreviousAngle = myDrawer->PreviousDeviationAngle ();
1291 return myDrawer->HasOwnDeviationAngle();
1292}
1293
1294//=======================================================================
1295//function : OwnHLRDeviationAngle
1296//purpose :
1297//=======================================================================
1298
1299Standard_Boolean AIS_Shape::OwnHLRDeviationAngle ( Standard_Real & anAngle,
1300 Standard_Real & aPreviousAngle ) const
1301{
1302 anAngle = myDrawer->HLRAngle();
1303 aPreviousAngle = myDrawer->PreviousHLRDeviationAngle ();
1304 return myDrawer->HasOwnHLRDeviationAngle();
1305}