CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FWDigitSetProxyBuilder.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : FWDigitSetProxyBuilder
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author: Alja Mrak-Tadel
10 // Created: Tue Oct 19 12:00:50 CEST 2010
11 // $Id: FWDigitSetProxyBuilder.cc,v 1.4 2012/06/18 23:56:21 amraktad Exp $
12 //
13 
14 // system include files
15 
16 // user include files
17 #include "TEveDigitSet.h"
18 #include "TEveBoxSet.h"
19 #include "TEveManager.h"
20 #include "TEveSelection.h"
21 
27 
28 
30 {
31 public:
32  FWSecondarySelectableSelector(const TEveSecondarySelectable::SelectionSet_t& s, const FWEventItem* i): m_selected(s), m_item(i) {}
34 
35  virtual void doSelect()
36  {
37  syncSelection();
38  }
39 
40  virtual void doUnselect()
41  {
42  syncSelection();
43  }
44 
45  const FWEventItem* item() const { return m_item; }
46 
47 private:
48  const TEveSecondarySelectable::SelectionSet_t& m_selected;
50 
52  {
53  size_t size = m_item->size();
54  for (size_t i = 0; i < size; ++i)
55  {
57  TEveSecondarySelectable::SelectionSet_ci si = m_selected.find(i);
58  if ((si != m_selected.end()) != modelInfo.isSelected() )
59  {
60  if (si != m_selected.end())
61  m_item->select(i);
62  else
63  m_item->unselect(i);
64  }
65  }
66  }
67 };
68 
69 //==============================================================================
70 //==============================================================================
71 //==============================================================================
72 
74  m_boxSet(0)
75 {
76 }
77 
79 {
80 }
81 
82 TString FWDigitSetProxyBuilder::getTooltip(TEveDigitSet* set, int idx)
83 {
84  TEveElement* el = static_cast<TEveElement*>(set); // tmp-workaround
85  FWSecondarySelectableSelector* ss = static_cast<FWSecondarySelectableSelector*>(el->GetUserData());
86  return TString::Format("%d %s %s", idx, ss->item()->name().c_str(), ss->item()->modelInterestingValueAsString(idx).c_str());
87 }
88 
89 TEveBoxSet* FWDigitSetProxyBuilder::addBoxSetToProduct(TEveElementList* product)
90 {
91  assert(!product->HasChildren());
92 
93  m_boxSet = new TEveBoxSet();
94  m_boxSet->SetTooltipCBFoo(getTooltip);
95  m_boxSet->Reset(TEveBoxSet::kBT_FreeBox, true, 256);
96  FWSecondarySelectableSelector* sel = new FWSecondarySelectableSelector(m_boxSet->RefSelectedSet(), item());
97  m_boxSet->SetUserData(sel);
98  m_boxSet->SetPickable(1);
99  m_boxSet->SetAlwaysSecSelect(1);
100 
101  product->AddElement(m_boxSet);
102 
103  return m_boxSet;
104 }
105 
106 TEveDigitSet* FWDigitSetProxyBuilder::digitSet(TEveElement* product)
107 {
108  assert(product->NumChildren() == 1);
109  return static_cast<TEveDigitSet*>(*product->BeginChildren());
110 }
111 
112 void FWDigitSetProxyBuilder::addBox(TEveBoxSet* boxSet, const float* pnts, const FWDisplayProperties& dp)
113 {
114  boxSet->AddBox(pnts);
115  boxSet->DigitValue(dp.isVisible());
116 
117  if (dp.isVisible())
118  boxSet->DigitColor(dp.color(), dp.transparency());
119 
120  if (dp.transparency())
121  boxSet->SetMainTransparency(dp.transparency());
122 }
123 
125 {
126  TEveDigitSet* digits = digitSet(product->m_elements);
127  if (!digits) return;
128 
129  TEveSecondarySelectable::SelectionSet_t& selected = (TEveSecondarySelectable::SelectionSet_t&)(digits->RefSelectedSet());
130 
131  for (std::set<FWModelId>::const_iterator it = iIds.begin(); it != iIds.end(); ++it)
132  {
133  const FWEventItem::ModelInfo& info = item()->modelInfo(it->index());
134 
135  // id display properties
136  const FWDisplayProperties &p = info.displayProperties();
137  digits->SetCurrentDigit(it->index());
138  digits->DigitValue(p.isVisible());
139  if (p.isVisible())
140  digits->DigitColor(p.color(), p.transparency());
141 
142  // id selection
143  TEveSecondarySelectable::SelectionSet_ci si = selected.find(it->index());
144  if (info.isSelected())
145  {
146  if (si == selected.end())
147  selected.insert(it->index());
148  }
149  else
150  {
151  if ( si != selected.end())
152  selected.erase(si);
153  }
154  }
155 
156  if(!selected.empty()) {
157  if(0==digits->GetSelectedLevel()) {
158  gEve->GetSelection()->AddElement(digits);
159  }
160  } else {
161  if(1==digits->GetSelectedLevel()||2==digits->GetSelectedLevel()) {
162  gEve->GetSelection()->RemoveElement(digits);
163  }
164  }
165 
166  digits->StampObjProps();
167 }
int i
Definition: DBlmapReader.cc:9
const FWDisplayProperties & displayProperties() const
Definition: FWEventItem.h:68
FWSecondarySelectableSelector(const TEveSecondarySelectable::SelectionSet_t &s, const FWEventItem *i)
const std::string & name() const
Definition: FWEventItem.cc:500
bool isSelected() const
Definition: FWEventItem.h:71
void unselect(int iIndex) const
Definition: FWEventItem.cc:240
std::set< FWModelId > FWModelIds
const FWEventItem * item() const
Color_t color() const
static TString getTooltip(TEveDigitSet *set, int idx)
Char_t transparency() const
virtual void modelChanges(const FWModelIds &, Product *)
const std::string & modelInterestingValueAsString(int iIndex) const
Definition: FWEventItem.cc:594
const FWEventItem * item() const
size_t size() const
Definition: FWEventItem.cc:548
const TEveSecondarySelectable::SelectionSet_t & m_selected
TEveBoxSet * addBoxSetToProduct(TEveElementList *product)
void select(int iIndex) const
Definition: FWEventItem.cc:251
ModelInfo modelInfo(int iIndex) const
Definition: FWEventItem.cc:535
void addBox(TEveBoxSet *set, const float *pnts, const FWDisplayProperties &dp)
TEveDigitSet * digitSet(TEveElement *product)
tuple size
Write out results.
void set(const std::string &name, int value)
set the flag, with a run-time name