Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1995-02-20 |
2 | // Created by: Mister rmi | |
3 | // Copyright (c) 1995-1999 Matra Datavision | |
973c2be1 | 4 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e | 5 | // |
973c2be1 | 6 | // This file is part of Open CASCADE Technology software library. |
b311480e | 7 | // |
d5f74e42 | 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 | |
973c2be1 | 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. | |
b311480e | 13 | // |
973c2be1 | 14 | // Alternatively, this file may be used under the terms of Open CASCADE |
15 | // commercial license or contractual agreement. | |
7fd59977 | 16 | |
7fd59977 | 17 | |
7f917335 | 18 | #include <Aspect_TypeOfMarker.hxx> |
42cf5bc1 | 19 | #include <Bnd_Box.hxx> |
20 | #include <gp_Pnt.hxx> | |
7f917335 | 21 | #include <Graphic3d_AspectLine3d.hxx> |
22 | #include <Graphic3d_AspectMarker3d.hxx> | |
42cf5bc1 | 23 | #include <Prs3d_Drawer.hxx> |
24 | #include <Prs3d_LineAspect.hxx> | |
25 | #include <Prs3d_PlaneAspect.hxx> | |
26 | #include <Prs3d_PointAspect.hxx> | |
27 | #include <Prs3d_Presentation.hxx> | |
69ff08ff | 28 | #include <PrsMgr_PresentableObjectPointer.hxx> |
42cf5bc1 | 29 | #include <PrsMgr_PresentationManager3d.hxx> |
30 | #include <Select3D_SensitiveEntity.hxx> | |
31 | #include <SelectBasics_EntityOwner.hxx> | |
32 | #include <SelectMgr_EntityOwner.hxx> | |
c04c30b3 | 33 | #include <SelectMgr_IndexedMapOfOwner.hxx> |
42cf5bc1 | 34 | #include <SelectMgr_SelectableObject.hxx> |
35 | #include <SelectMgr_Selection.hxx> | |
36 | #include <SelectMgr_SelectionManager.hxx> | |
37 | #include <Standard_NoSuchObject.hxx> | |
38 | #include <Standard_NotImplemented.hxx> | |
39 | #include <Standard_Type.hxx> | |
0717ddc1 | 40 | #include <TopLoc_Location.hxx> |
7fd59977 | 41 | |
92efcf78 | 42 | IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_SelectableObject,PrsMgr_PresentableObject) |
43 | ||
7fd59977 | 44 | static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq, |
45 | const Handle (SelectMgr_Selection)& theSel) | |
46 | { | |
47 | Standard_Integer ifound=0; | |
48 | for (Standard_Integer i=1;i<=seq.Length()&& ifound==0;i++) | |
49 | {if(theSel == seq.Value(i)) ifound=i;} | |
50 | return ifound; | |
51 | } | |
52 | ||
53 | ||
54 | ||
55 | //================================================== | |
56 | // Function: | |
57 | // Purpose : | |
58 | //================================================== | |
59 | ||
c3282ec1 | 60 | SelectMgr_SelectableObject::SelectMgr_SelectableObject (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d) |
61 | : PrsMgr_PresentableObject (aTypeOfPresentation3d), | |
6262338c | 62 | myDrawer (new Prs3d_Drawer()), |
7f917335 | 63 | myHilightDrawer (new Prs3d_Drawer()), |
f751596e | 64 | myAssemblyOwner (NULL), |
c3282ec1 | 65 | myAutoHilight (Standard_True), |
66 | myGlobalSelMode (0) | |
7f917335 | 67 | { |
68 | InitDefaultHilightAttributes (myHilightDrawer); | |
69 | myHilightDrawer->Link (myDrawer); | |
70 | } | |
7fd59977 | 71 | |
4c0d97ac | 72 | //================================================== |
73 | // Function: Destructor | |
74 | // Purpose : Clears all selections of the object | |
75 | //================================================== | |
76 | SelectMgr_SelectableObject::~SelectMgr_SelectableObject() | |
77 | { | |
78 | for (Standard_Integer aSelIdx = 1; aSelIdx <= myselections.Length(); ++aSelIdx) | |
79 | { | |
80 | myselections.Value (aSelIdx)->Clear(); | |
81 | } | |
82 | } | |
7fd59977 | 83 | |
84 | //================================================== | |
7411850a | 85 | // Function: HasSelection |
7fd59977 | 86 | // Purpose : |
87 | //================================================== | |
7411850a | 88 | Standard_Boolean SelectMgr_SelectableObject::HasSelection (const Standard_Integer theMode) const |
7fd59977 | 89 | { |
7411850a | 90 | for (Standard_Integer aSelIdx = 1; aSelIdx <= myselections.Length(); ++aSelIdx) |
91 | { | |
92 | if (((myselections.Value (aSelIdx))->Mode()) == theMode) | |
93 | return Standard_True; | |
94 | } | |
7fd59977 | 95 | return Standard_False; |
96 | } | |
97 | ||
98 | //================================================== | |
f751596e | 99 | // Function: RecomputePrimitives |
100 | // Purpose : IMPORTANT: Do not use this method to update | |
101 | // selection primitives except implementing custom | |
102 | // selection manager! This method does not take | |
103 | // into account necessary BVH updates, but may | |
104 | // invalidate the pointers it refers to. | |
105 | // TO UPDATE SELECTION properly from outside classes, | |
106 | // use method UpdateSelection. | |
7fd59977 | 107 | //================================================== |
f751596e | 108 | void SelectMgr_SelectableObject::RecomputePrimitives() |
7fd59977 | 109 | { |
f751596e | 110 | for (Standard_Integer aSelIdx = 1; aSelIdx <= myselections.Length(); aSelIdx++) |
7fd59977 | 111 | { |
f751596e | 112 | RecomputePrimitives (myselections.ChangeValue (aSelIdx)->Mode()); |
7fd59977 | 113 | } |
114 | } | |
115 | ||
7fd59977 | 116 | //================================================== |
f751596e | 117 | // Function: RecomputePrimitives |
118 | // Purpose : IMPORTANT: Do not use this method to update | |
119 | // selection primitives except implementing custom | |
120 | // selection manager! This method does not take | |
121 | // into account necessary BVH updates, but may | |
122 | // invalidate the pointers it refers to. | |
123 | // TO UPDATE SELECTION properly from outside classes, | |
124 | // use method UpdateSelection. | |
7fd59977 | 125 | //================================================== |
f751596e | 126 | void SelectMgr_SelectableObject::RecomputePrimitives (const Standard_Integer theMode) |
7fd59977 | 127 | { |
69ff08ff | 128 | Handle(PrsMgr_PresentableObject) aPrsParent (Parent()); |
129 | Handle(SelectMgr_SelectableObject) aSelParent = Handle(SelectMgr_SelectableObject)::DownCast (aPrsParent); | |
130 | ||
f751596e | 131 | for (Standard_Integer aSelIdx =1; aSelIdx <= myselections.Length(); aSelIdx++ ) |
132 | { | |
133 | if (myselections.Value (aSelIdx)->Mode() == theMode) | |
134 | { | |
135 | myselections (aSelIdx)->Clear(); | |
136 | ComputeSelection (myselections (aSelIdx), theMode); | |
137 | myselections (aSelIdx)->UpdateStatus (SelectMgr_TOU_Partial); | |
138 | myselections (aSelIdx)->UpdateBVHStatus (SelectMgr_TBU_Renew); | |
69ff08ff | 139 | if (theMode == 0 && ! aSelParent.IsNull() && ! aSelParent->GetAssemblyOwner().IsNull()) |
f751596e | 140 | { |
69ff08ff | 141 | SetAssemblyOwner (aSelParent->GetAssemblyOwner(), theMode); |
f751596e | 142 | } |
7fd59977 | 143 | return; |
144 | } | |
145 | } | |
f751596e | 146 | |
147 | Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode); | |
148 | ComputeSelection (aNewSel, theMode); | |
149 | ||
69ff08ff | 150 | if (theMode == 0 && ! aSelParent.IsNull() && ! aSelParent->GetAssemblyOwner().IsNull()) |
f751596e | 151 | { |
69ff08ff | 152 | SetAssemblyOwner (aSelParent->GetAssemblyOwner(), theMode); |
f751596e | 153 | } |
154 | ||
155 | aNewSel->UpdateStatus (SelectMgr_TOU_Partial); | |
156 | aNewSel->UpdateBVHStatus (SelectMgr_TBU_Add); | |
157 | ||
158 | myselections.Append (aNewSel); | |
7fd59977 | 159 | } |
160 | ||
161 | //================================================== | |
162 | // Function: ClearSelections | |
163 | // Purpose : | |
164 | //================================================== | |
165 | void SelectMgr_SelectableObject::ClearSelections(const Standard_Boolean update) | |
166 | { | |
167 | for (Standard_Integer i =1; i<= myselections.Length(); i++ ) { | |
168 | myselections.Value(i)->Clear(); | |
f751596e | 169 | myselections.Value (i)->UpdateBVHStatus (SelectMgr_TBU_Remove); |
7fd59977 | 170 | if(update) |
f751596e | 171 | { |
7fd59977 | 172 | myselections.Value(i)->UpdateStatus(SelectMgr_TOU_Full); |
f751596e | 173 | } |
7fd59977 | 174 | } |
175 | } | |
176 | ||
177 | ||
178 | //================================================== | |
179 | // Function: Selection | |
180 | // Purpose : | |
181 | //================================================== | |
182 | ||
183 | const Handle(SelectMgr_Selection)& SelectMgr_SelectableObject | |
184 | ::Selection(const Standard_Integer aMode) const | |
185 | { | |
7fd59977 | 186 | Standard_Boolean Found = Standard_False; |
187 | Standard_Integer Rank=0; | |
188 | for (Standard_Integer i=1;i<=myselections.Length() && !Found;i++) | |
189 | { | |
190 | if((myselections.Value(i))->Mode()==aMode){ Found = Standard_True; | |
191 | Rank=i;}} | |
192 | return myselections.Value(Rank); | |
193 | } | |
194 | ||
195 | ||
196 | //================================================== | |
197 | // Function: AddSelection | |
198 | // Purpose : | |
199 | //================================================== | |
200 | ||
201 | void SelectMgr_SelectableObject | |
202 | ::AddSelection(const Handle(SelectMgr_Selection)& aSel, | |
203 | const Standard_Integer aMode) | |
204 | { | |
f751596e | 205 | Standard_Boolean isReplaced = Standard_False; |
206 | if(aSel->IsEmpty()) | |
207 | { | |
208 | ComputeSelection(aSel, aMode); | |
7fd59977 | 209 | aSel->UpdateStatus(SelectMgr_TOU_Partial); |
f751596e | 210 | aSel->UpdateBVHStatus (SelectMgr_TBU_Add); |
7fd59977 | 211 | } |
f751596e | 212 | if (HasSelection(aMode)) |
213 | { | |
214 | const Handle(SelectMgr_Selection)& temp= Selection(aMode); | |
215 | Standard_Integer I = Search(myselections,temp); | |
216 | if(I!=0) | |
7fd59977 | 217 | { |
f751596e | 218 | myselections.Remove(I); |
219 | isReplaced = Standard_True; | |
7fd59977 | 220 | } |
f751596e | 221 | } |
222 | ||
7fd59977 | 223 | myselections.Append(aSel); |
f751596e | 224 | if (isReplaced) |
225 | { | |
226 | myselections.Last()->UpdateBVHStatus (SelectMgr_TBU_Renew); | |
227 | } | |
228 | ||
69ff08ff | 229 | if (aMode == 0) |
f751596e | 230 | { |
69ff08ff | 231 | Handle(PrsMgr_PresentableObject) aPrsParent (Parent()); |
232 | Handle(SelectMgr_SelectableObject) aSelParent = Handle(SelectMgr_SelectableObject)::DownCast (aPrsParent); | |
233 | if (! aSelParent.IsNull() && ! aSelParent->GetAssemblyOwner().IsNull()) | |
234 | { | |
235 | SetAssemblyOwner (aSelParent->GetAssemblyOwner(), aMode); | |
236 | } | |
f751596e | 237 | } |
7fd59977 | 238 | } |
239 | ||
240 | ||
241 | ||
242 | //======================================================================= | |
0717ddc1 | 243 | //function : ReSetTransformation |
7fd59977 | 244 | //purpose : |
245 | //======================================================================= | |
0717ddc1 | 246 | void SelectMgr_SelectableObject::ResetTransformation() |
7fd59977 | 247 | { |
f751596e | 248 | for (Init(); More(); Next()) |
249 | { | |
250 | const Handle(SelectMgr_Selection) & aSel = CurrentSelection(); | |
251 | for (aSel->Init(); aSel->More(); aSel->Next()) | |
252 | { | |
253 | aSel->UpdateStatus(SelectMgr_TOU_Partial); | |
254 | aSel->UpdateBVHStatus (SelectMgr_TBU_None); | |
7fd59977 | 255 | } |
7fd59977 | 256 | } |
257 | ||
0717ddc1 | 258 | PrsMgr_PresentableObject::ResetTransformation(); |
7fd59977 | 259 | } |
260 | ||
7fd59977 | 261 | //======================================================================= |
0717ddc1 | 262 | //function : UpdateTransformation |
7fd59977 | 263 | //purpose : |
264 | //======================================================================= | |
825aa485 | 265 | void SelectMgr_SelectableObject::UpdateTransformation() |
7fd59977 | 266 | { |
825aa485 | 267 | for (Init(); More(); Next()) |
268 | { | |
269 | CurrentSelection()->UpdateStatus (SelectMgr_TOU_Partial); | |
7fd59977 | 270 | } |
7fd59977 | 271 | |
825aa485 | 272 | PrsMgr_PresentableObject::UpdateTransformation(); |
7fd59977 | 273 | } |
274 | ||
7fd59977 | 275 | //======================================================================= |
0717ddc1 | 276 | //function : UpdateTransformation |
7fd59977 | 277 | //purpose : |
278 | //======================================================================= | |
913a4c4a | 279 | void SelectMgr_SelectableObject::UpdateTransformations(const Handle(SelectMgr_Selection)& Sel) |
7fd59977 | 280 | { |
0717ddc1 | 281 | TopLoc_Location aSelfLocation (Transformation()); |
7fd59977 | 282 | Handle(Select3D_SensitiveEntity) SE; |
0717ddc1 | 283 | if(aSelfLocation.IsIdentity()) return; |
7fd59977 | 284 | for(Sel->Init();Sel->More();Sel->Next()){ |
f751596e | 285 | SE = Handle(Select3D_SensitiveEntity)::DownCast (Sel->Sensitive()->BaseSensitive()); |
7fd59977 | 286 | if(!SE.IsNull()){ |
29d43f9c A |
287 | const Handle(SelectBasics_EntityOwner)& aEOwner = SE->OwnerId(); |
288 | Handle(SelectMgr_EntityOwner) aMgrEO = | |
289 | Handle(SelectMgr_EntityOwner)::DownCast (aEOwner); | |
290 | if (!aMgrEO.IsNull()) | |
0717ddc1 | 291 | aMgrEO->SetLocation (aSelfLocation); |
7fd59977 | 292 | } |
293 | } | |
294 | } | |
295 | ||
296 | //======================================================================= | |
297 | //function : HilightSelected | |
298 | //purpose : | |
299 | //======================================================================= | |
300 | void SelectMgr_SelectableObject::HilightSelected | |
301 | ( const Handle(PrsMgr_PresentationManager3d)&, | |
302 | const SelectMgr_SequenceOfOwner&) | |
303 | { | |
304 | Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightSelected"); | |
305 | } | |
306 | ||
307 | //======================================================================= | |
308 | //function : ClearSelected | |
309 | //purpose : | |
310 | //======================================================================= | |
311 | void SelectMgr_SelectableObject::ClearSelected () | |
312 | { | |
7fd59977 | 313 | if( !mySelectionPrs.IsNull() ) |
2b442de5 | 314 | mySelectionPrs->Clear(); |
7fd59977 | 315 | } |
316 | ||
317 | //======================================================================= | |
318 | //function : HilightOwnerWithColor | |
319 | //purpose : | |
320 | //======================================================================= | |
321 | void SelectMgr_SelectableObject::HilightOwnerWithColor | |
322 | ( const Handle(PrsMgr_PresentationManager3d)&, | |
323 | const Quantity_NameOfColor, | |
324 | const Handle(SelectMgr_EntityOwner)&) | |
325 | { | |
326 | Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightOwnerWithColor"); | |
327 | } | |
328 | ||
329 | //======================================================================= | |
330 | //function : MaxFaceNodes | |
331 | //purpose : | |
332 | //======================================================================= | |
333 | Standard_Boolean SelectMgr_SelectableObject::IsAutoHilight () const | |
334 | { | |
335 | return myAutoHilight; | |
336 | } | |
337 | ||
338 | //======================================================================= | |
339 | //function : MaxFaceNodes | |
340 | //purpose : | |
341 | //======================================================================= | |
342 | void SelectMgr_SelectableObject::SetAutoHilight ( const Standard_Boolean newAutoHilight ) | |
343 | { | |
344 | myAutoHilight = newAutoHilight; | |
345 | } | |
346 | ||
347 | //======================================================================= | |
348 | //function : GetHilightPresentation | |
349 | //purpose : | |
350 | //======================================================================= | |
351 | Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetHilightPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr ) | |
352 | { | |
353 | if( myHilightPrs.IsNull() && !TheMgr.IsNull() ) | |
354 | { | |
355 | myHilightPrs = new Prs3d_Presentation( TheMgr->StructureManager() ); | |
356 | myHilightPrs->SetTransformPersistence( GetTransformPersistenceMode(), | |
357 | GetTransformPersistencePoint() ); | |
358 | } | |
359 | ||
360 | return myHilightPrs; | |
361 | } | |
362 | ||
363 | ||
364 | //======================================================================= | |
365 | //function : GetSelectPresentation | |
366 | //purpose : | |
367 | //======================================================================= | |
368 | Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr ) | |
369 | { | |
370 | if( mySelectionPrs.IsNull() && !TheMgr.IsNull() ) { | |
371 | mySelectionPrs = new Prs3d_Presentation( TheMgr->StructureManager() ); | |
372 | mySelectionPrs->SetTransformPersistence( GetTransformPersistenceMode(), | |
373 | GetTransformPersistencePoint() ); | |
374 | } | |
375 | return mySelectionPrs; | |
376 | } | |
377 | ||
59f45b7c | 378 | //======================================================================= |
379 | //function : SetZLayer | |
380 | //purpose : | |
381 | //======================================================================= | |
a1954302 | 382 | void SelectMgr_SelectableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId) |
59f45b7c | 383 | { |
59f45b7c | 384 | // update own presentations |
a1954302 | 385 | PrsMgr_PresentableObject::SetZLayer (theLayerId); |
59f45b7c | 386 | |
387 | // update selection presentations | |
388 | if (!mySelectionPrs.IsNull()) | |
389 | mySelectionPrs->SetZLayer (theLayerId); | |
390 | ||
391 | if (!myHilightPrs.IsNull()) | |
392 | myHilightPrs->SetZLayer (theLayerId); | |
393 | ||
394 | // update all entity owner presentations | |
395 | for (Init (); More () ;Next ()) | |
396 | { | |
397 | const Handle(SelectMgr_Selection)& aSel = CurrentSelection(); | |
398 | for (aSel->Init (); aSel->More (); aSel->Next ()) | |
399 | { | |
400 | Handle(Select3D_SensitiveEntity) aEntity = | |
f751596e | 401 | Handle(Select3D_SensitiveEntity)::DownCast (aSel->Sensitive()->BaseSensitive()); |
59f45b7c | 402 | if (!aEntity.IsNull()) |
403 | { | |
404 | Handle(SelectMgr_EntityOwner) aOwner = | |
405 | Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId()); | |
406 | if (!aOwner.IsNull()) | |
a1954302 | 407 | aOwner->SetZLayer (theLayerId); |
59f45b7c | 408 | } |
409 | } | |
410 | } | |
411 | } | |
6262338c | 412 | |
f751596e | 413 | //======================================================================= |
21a2b7cc | 414 | //function : updateSelection |
f751596e | 415 | //purpose : Sets update status FULL to selections of the object. Must be |
416 | // used as the only method of UpdateSelection from outer classes | |
417 | // to prevent BVH structures from being outdated. | |
418 | //======================================================================= | |
21a2b7cc | 419 | void SelectMgr_SelectableObject::updateSelection (const Standard_Integer theMode) |
f751596e | 420 | { |
421 | if (theMode == -1) | |
422 | { | |
423 | for (Init(); More(); Next()) | |
424 | { | |
425 | const Handle(SelectMgr_Selection)& aSel = CurrentSelection(); | |
426 | aSel->UpdateStatus (SelectMgr_TOU_Full); | |
427 | } | |
428 | ||
429 | return; | |
430 | } | |
431 | ||
432 | for (Init(); More(); Next()) | |
433 | { | |
434 | if (CurrentSelection()->Mode() == theMode) | |
435 | { | |
436 | CurrentSelection()->UpdateStatus (SelectMgr_TOU_Full); | |
437 | return; | |
438 | } | |
439 | } | |
440 | } | |
441 | ||
6262338c | 442 | //======================================================================= |
443 | //function : SetAttributes | |
444 | //purpose : | |
445 | //======================================================================= | |
446 | void SelectMgr_SelectableObject::SetAttributes (const Handle(Prs3d_Drawer)& theDrawer) | |
447 | { | |
448 | myDrawer = theDrawer; | |
449 | } | |
450 | ||
451 | //======================================================================= | |
452 | //function : UnsetAttributes | |
453 | //purpose : | |
454 | //======================================================================= | |
455 | void SelectMgr_SelectableObject::UnsetAttributes() | |
456 | { | |
457 | Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer(); | |
458 | if (myDrawer->HasLink()) | |
459 | { | |
460 | aDrawer->Link (myDrawer->Link()); | |
461 | } | |
462 | myDrawer = aDrawer; | |
463 | } | |
464 | ||
7f917335 | 465 | //======================================================================= |
466 | //function : SetHilightAttributes | |
467 | //purpose : | |
468 | //======================================================================= | |
469 | void SelectMgr_SelectableObject::SetHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer) | |
470 | { | |
471 | myHilightDrawer = theDrawer; | |
472 | } | |
473 | ||
474 | //======================================================================= | |
475 | //function : UnsetAttributes | |
476 | //purpose : | |
477 | //======================================================================= | |
478 | void SelectMgr_SelectableObject::UnsetHilightAttributes() | |
479 | { | |
480 | Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer(); | |
481 | InitDefaultHilightAttributes (aDrawer); | |
482 | aDrawer->Link (myDrawer); | |
483 | myHilightDrawer = aDrawer; | |
484 | } | |
485 | ||
486 | //======================================================================= | |
487 | //function : InitDefaultHilightAttributes | |
488 | //purpose : | |
489 | //======================================================================= | |
490 | void SelectMgr_SelectableObject::InitDefaultHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer) | |
491 | { | |
492 | if (!theDrawer->HasOwnPointAspect()) | |
493 | { | |
494 | theDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_BLACK, 1.0)); | |
495 | if (theDrawer->HasLink()) | |
496 | { | |
497 | *theDrawer->PointAspect()->Aspect() = *theDrawer->Link()->PointAspect()->Aspect(); | |
498 | } | |
499 | } | |
500 | if (!theDrawer->HasOwnLineAspect()) | |
501 | { | |
502 | theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0)); | |
503 | if (theDrawer->HasLink()) | |
504 | { | |
505 | *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect(); | |
506 | } | |
507 | } | |
508 | if (!theDrawer->HasOwnWireAspect()) | |
509 | { | |
510 | theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0)); | |
511 | if (theDrawer->HasLink()) | |
512 | { | |
513 | *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect(); | |
514 | } | |
515 | } | |
516 | if (!theDrawer->HasOwnPlaneAspect()) | |
517 | { | |
518 | theDrawer->SetPlaneAspect (new Prs3d_PlaneAspect()); | |
519 | if (theDrawer->HasLink()) | |
520 | { | |
521 | *theDrawer->PlaneAspect()->EdgesAspect() = *theDrawer->Link()->PlaneAspect()->EdgesAspect(); | |
522 | } | |
523 | } | |
524 | if (!theDrawer->HasOwnFreeBoundaryAspect()) | |
525 | { | |
526 | theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0)); | |
527 | if (theDrawer->HasLink()) | |
528 | { | |
529 | *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect(); | |
530 | } | |
531 | } | |
532 | if (!theDrawer->HasOwnUnFreeBoundaryAspect()) | |
533 | { | |
534 | theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0)); | |
535 | if (theDrawer->HasLink()) | |
536 | { | |
537 | *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect(); | |
538 | } | |
539 | } | |
540 | ||
541 | theDrawer->WireAspect()->SetWidth(2.); | |
542 | theDrawer->LineAspect()->SetWidth(2.); | |
543 | theDrawer->PlaneAspect()->EdgesAspect()->SetWidth(2.); | |
544 | theDrawer->FreeBoundaryAspect()->SetWidth(2.); | |
545 | theDrawer->UnFreeBoundaryAspect()->SetWidth(2.); | |
546 | theDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_O_POINT); | |
547 | theDrawer->PointAspect()->SetScale(2.); | |
548 | ||
549 | // By default the hilight drawer has absolute type of deflection. | |
550 | // It is supposed that absolute deflection is taken from Link(). | |
551 | // It is necessary to use for all sub-shapes identical coefficient | |
552 | // computed in ::Compute() call for whole shape and stored in base drawer. | |
553 | theDrawer->SetTypeOfDeflection (Aspect_TOD_ABSOLUTE); | |
554 | } | |
f751596e | 555 | |
556 | //======================================================================= | |
557 | //function : SetAssemblyOwner | |
558 | //purpose : Sets common entity owner for assembly sensitive object entities | |
559 | //======================================================================= | |
560 | void SelectMgr_SelectableObject::SetAssemblyOwner (const Handle(SelectMgr_EntityOwner)& theOwner, | |
561 | const Standard_Integer theMode) | |
562 | { | |
563 | if (theMode == -1) | |
564 | { | |
565 | for (Standard_Integer aModeIter = 1; aModeIter <= myselections.Length(); ++aModeIter) | |
566 | { | |
567 | Handle(SelectMgr_Selection)& aSel = myselections.ChangeValue (aModeIter); | |
568 | for (aSel->Init(); aSel->More(); aSel->Next()) | |
569 | { | |
570 | aSel->Sensitive()->BaseSensitive()->Set (theOwner); | |
571 | } | |
572 | } | |
573 | ||
574 | return; | |
575 | } | |
576 | ||
577 | if (!HasSelection (theMode)) | |
578 | return; | |
579 | ||
580 | for (Standard_Integer aModeIter = 1; aModeIter <= myselections.Length(); ++aModeIter) | |
581 | { | |
582 | if (myselections.Value (aModeIter)->Mode() == theMode) | |
583 | { | |
584 | Handle(SelectMgr_Selection)& aSel = myselections.ChangeValue (aModeIter); | |
585 | for (aSel->Init(); aSel->More(); aSel->Next()) | |
586 | { | |
587 | aSel->Sensitive()->BaseSensitive()->Set (theOwner); | |
588 | } | |
589 | return; | |
590 | } | |
591 | } | |
592 | } | |
593 | ||
594 | //======================================================================= | |
595 | //function : GetAssemblyOwner | |
596 | //purpose : Returns common entity owner if it is an assembly | |
597 | //======================================================================= | |
598 | const Handle(SelectMgr_EntityOwner)& SelectMgr_SelectableObject::GetAssemblyOwner() const | |
599 | { | |
600 | return myAssemblyOwner; | |
601 | } | |
b586500b | 602 | |
603 | //======================================================================= | |
604 | //function : BndBoxOfSelected | |
605 | //purpose : Returns a bounding box of sensitive entities with the owners given | |
606 | // if they are a part of activated selection | |
607 | //======================================================================= | |
608 | Bnd_Box SelectMgr_SelectableObject::BndBoxOfSelected (Handle(SelectMgr_IndexedMapOfOwner)& theOwners) | |
609 | { | |
610 | Bnd_Box aBnd; | |
611 | ||
612 | if (theOwners->IsEmpty()) | |
613 | return aBnd; | |
614 | ||
615 | for (Init(); More(); Next()) | |
616 | { | |
617 | const Handle(SelectMgr_Selection)& aSel = CurrentSelection(); | |
618 | if (aSel->GetSelectionState() != SelectMgr_SOS_Activated) | |
619 | continue; | |
620 | ||
621 | for (aSel->Init(); aSel->More(); aSel->Next()) | |
622 | { | |
623 | const Handle(SelectMgr_EntityOwner) anOwner = | |
624 | Handle(SelectMgr_EntityOwner)::DownCast (aSel->Sensitive()->BaseSensitive()->OwnerId()); | |
625 | if (theOwners->Contains (anOwner)) | |
626 | { | |
627 | Select3D_BndBox3d aBox = aSel->Sensitive()->BaseSensitive()->BoundingBox(); | |
628 | Bnd_Box aTmpBnd; | |
629 | aTmpBnd.Update (aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z(), | |
630 | aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z()); | |
631 | aBnd.Add (aTmpBnd); | |
632 | ||
633 | Standard_Integer anOwnerIdx = theOwners->FindIndex (anOwner); | |
634 | if (theOwners->Size() != anOwnerIdx) | |
635 | { | |
636 | theOwners->Swap (anOwnerIdx, theOwners->Size()); | |
637 | } | |
638 | theOwners->RemoveLast(); | |
639 | ||
640 | if (theOwners->IsEmpty()) | |
641 | return aBnd; | |
642 | } | |
643 | } | |
644 | } | |
645 | ||
646 | return aBnd; | |
647 | } | |
c3282ec1 | 648 | |
649 | //======================================================================= | |
650 | //function : GlobalSelOwner | |
651 | //purpose : Returns entity owner corresponding to selection of the object as a whole | |
652 | //======================================================================= | |
653 | Handle(SelectMgr_EntityOwner) SelectMgr_SelectableObject::GlobalSelOwner() const | |
654 | { | |
655 | Handle(SelectMgr_EntityOwner) anOwner; | |
656 | ||
657 | if (!HasSelection (myGlobalSelMode)) | |
658 | return anOwner; | |
659 | ||
660 | const Handle(SelectMgr_Selection)& aGlobalSel = Selection (myGlobalSelMode); | |
661 | if (aGlobalSel->IsEmpty()) | |
662 | return anOwner; | |
663 | ||
664 | aGlobalSel->Init(); | |
665 | anOwner = | |
666 | Handle(SelectMgr_EntityOwner)::DownCast (aGlobalSel->Sensitive()->BaseSensitive()->OwnerId()); | |
667 | ||
668 | return anOwner; | |
669 | } |