0022368: AIS_Trihedron's highlight presentation isn't updated on trihedron relocation
[occt.git] / src / StdSelect / StdSelect_BRepOwner.cxx
1 // Copyright:   Matra-Datavision 1995
2 // File:        StdSelect_BRepOwner.cxx
3 // Created:     Wed Mar  8 16:13:35 1995
4 // Author:      Mister rmi
5 //              <rmi>
6
7 #define BUC60876        //GG_050401 Enable to highlight something
8 //                      with a specific hilight mode
9 //
10
11 #include <StdSelect_BRepOwner.ixx>
12 #include <SelectBasics_EntityOwner.hxx>
13
14 #include <StdPrs_WFShape.hxx>
15
16 #include <Graphic3d_StructureManager.hxx>
17
18 //==================================================
19 // Function: 
20 // Purpose :
21 //==================================================
22 StdSelect_BRepOwner::StdSelect_BRepOwner(const Standard_Integer aPriority):
23 SelectMgr_EntityOwner(aPriority),
24 myFromDecomposition(Standard_False),
25 myCurMode(0)
26 {
27 }
28
29 StdSelect_BRepOwner::StdSelect_BRepOwner(const TopoDS_Shape& aShape,
30                                          const Standard_Integer aPriority,
31                                          const Standard_Boolean ComesFromDecomposition):
32 SelectMgr_EntityOwner(aPriority),
33 myFromDecomposition(ComesFromDecomposition),
34 myShape(aShape),
35 myCurMode(0)
36 {
37 }
38
39 StdSelect_BRepOwner::StdSelect_BRepOwner(const TopoDS_Shape& aShape,
40                                          const Handle (SelectMgr_SelectableObject)& theOrigin,
41                                          const Standard_Integer aPriority,
42                                          const Standard_Boolean ComesFromDecomposition):
43 SelectMgr_EntityOwner(theOrigin,aPriority),
44 myFromDecomposition(ComesFromDecomposition),
45 myShape(aShape),
46 myCurMode(0)
47 {
48 }
49
50 //=======================================================================
51 //function : IsHilighted
52 //purpose  : 
53 //=======================================================================
54 Standard_Boolean StdSelect_BRepOwner::
55 IsHilighted(const Handle(PrsMgr_PresentationManager)& PM,
56             const Standard_Integer aMode) const 
57 {
58 #ifdef BUC60876
59   Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
60 #else
61   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
62 #endif
63   if(myPrsSh.IsNull())
64     return PM->IsHighlighted(Selectable(),M);
65   return PM->IsHighlighted(myPrsSh,M);
66 }
67
68 //=======================================================================
69 //function : Hilight/Unhilight Methods...
70 //purpose  : 
71 //=======================================================================
72 void StdSelect_BRepOwner::Hilight(const Handle(PrsMgr_PresentationManager)& PM,
73                                   const Standard_Integer aMode)
74 {
75   
76 #ifdef BUC60876
77   Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
78 #else
79   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
80 #endif
81   if (myFromDecomposition)
82   {
83     // do the update flag check
84     if (!myPrsSh.IsNull())
85     {
86       TColStd_ListOfInteger aModesList;
87       myPrsSh->ToBeUpdated (aModesList);
88       if (!aModesList.IsEmpty())
89         myPrsSh.Nullify();
90     }
91
92     if(myPrsSh.IsNull())
93       myPrsSh = new StdSelect_Shape (myShape);
94   }  
95
96   if(myPrsSh.IsNull())
97     PM->Highlight(Selectable(),M);
98   else
99     PM->Highlight(myPrsSh,M);
100 }
101
102 void StdSelect_BRepOwner::Hilight()
103 {}
104
105 void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManager3d)& PM,
106                                            const Quantity_NameOfColor aCol,
107                                            const Standard_Integer aMode)
108 {
109 #ifdef BUC60876
110   Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
111 #else
112   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
113 #endif
114   if (myFromDecomposition)
115   {
116     // do the update flag check
117     if (!myPrsSh.IsNull())
118     {
119       TColStd_ListOfInteger aModesList;
120       myPrsSh->ToBeUpdated (aModesList);
121       if (!aModesList.IsEmpty())
122         myPrsSh.Nullify();
123     }
124
125     if(myPrsSh.IsNull()){
126       if(HasLocation()){
127         TopLoc_Location lbid = Location() * myShape.Location();
128         TopoDS_Shape ShBis = myShape.Located(lbid);
129         myPrsSh = new StdSelect_Shape(ShBis);
130       }
131       else
132         myPrsSh = new StdSelect_Shape(myShape);
133     }
134   }
135   if(myPrsSh.IsNull())
136     PM->Color(Selectable(),aCol,M);
137   else
138     PM->Color(myPrsSh,aCol,M);
139 }
140
141 void StdSelect_BRepOwner::Unhilight(const Handle(PrsMgr_PresentationManager)& PM,
142                                     const Standard_Integer aMode)
143 {
144 #ifdef BUC60876
145   Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
146 #else
147   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
148 #endif
149   if(myPrsSh.IsNull() || !myFromDecomposition)
150     PM->Unhighlight(Selectable(),M);
151   else
152     PM->Unhighlight(myPrsSh,M);
153 }
154
155 void StdSelect_BRepOwner::Clear(const Handle(PrsMgr_PresentationManager)& PM,
156                                 const Standard_Integer aMode)
157 {
158 #ifdef BUC60876
159   Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
160 #else
161   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
162 #endif
163   if (!myPrsSh.IsNull())
164     PM->Clear(myPrsSh,M);
165   myPrsSh.Nullify();
166 }
167
168 void StdSelect_BRepOwner::SetLocation(const TopLoc_Location& aLoc)
169 {
170   SelectMgr_EntityOwner::SetLocation(aLoc);
171   // we must not nullify the myPrsSh here, because unhilight method
172   // will be working with wrong entity in this case, the best is to
173   // set the update flag and then recompute myPrsSh on hilighting
174   if (!myPrsSh.IsNull())
175     myPrsSh->SetToUpdate();
176  
177 }
178 void StdSelect_BRepOwner::ResetLocation()
179 {
180   SelectMgr_EntityOwner::ResetLocation();
181   // we must not nullify the myPrsSh here, because unhilight method
182   // will be working with wrong entity in this case, the best is to
183   // set the update flag and then recompute myPrsSh on hilighting
184   if (!myPrsSh.IsNull())
185     myPrsSh->SetToUpdate();
186
187 }