File indexing completed on 2023-10-25 09:46:25
0001 #include "Fireworks/Core/src/FWEveOverlap.h"
0002 #include "TGeoOverlap.h"
0003 #include "TEveGeoShape.h"
0004 #include "Fireworks/Core/src/FWOverlapTableView.h"
0005 #include "Fireworks/Core/src/FWOverlapTableManager.h"
0006 #include "Fireworks/Core/interface/FWGeometryTableViewManager.h"
0007 #include "Fireworks/Core/interface/fwLog.h"
0008 #include "Fireworks/Core/src/FWPopupMenu.cc"
0009
0010
0011
0012 FWEveOverlap::FWEveOverlap(FWOverlapTableView* v) : m_browser(v) {}
0013 FWGeometryTableManagerBase* FWEveOverlap::tableManager() { return m_browser->getTableManager(); }
0014
0015 FWGeometryTableViewBase* FWEveOverlap::browser() { return m_browser; }
0016
0017
0018 void FWEveOverlap::Paint(Option_t*) {
0019 if (m_browser->getTableManager()->refEntries().empty())
0020 return;
0021
0022 FWGeoTopNode::Paint();
0023
0024 TEveGeoManagerHolder gmgr(FWGeometryTableViewManager::getGeoMangeur());
0025
0026 int topNodeIdx = m_browser->getTopNodeIdx();
0027
0028 FWGeometryTableManagerBase::Entries_i sit = m_browser->getTableManager()->refEntries().begin();
0029 std::advance(sit, topNodeIdx);
0030 TGeoHMatrix mtx;
0031 m_browser->getTableManager()->getNodeMatrix(*sit, mtx);
0032
0033 bool drawsChildren = false;
0034
0035 if ((*sit).testBit(FWGeometryTableManagerBase::kVisNodeChld))
0036 drawsChildren = paintChildNodesRecurse(sit, topNodeIdx, mtx);
0037
0038 if (sit->testBit(FWGeometryTableManagerBase::kVisNodeSelf))
0039 paintShape(topNodeIdx, mtx, false, drawsChildren);
0040 }
0041
0042
0043 bool FWEveOverlap::paintChildNodesRecurse(FWGeometryTableManagerBase::Entries_i pIt,
0044 Int_t cnt,
0045 const TGeoHMatrix& parentMtx) {
0046 TGeoNode* parentNode = pIt->m_node;
0047 int nD = parentNode->GetNdaughters();
0048
0049 int dOff = 0;
0050
0051 pIt++;
0052 int pcnt = cnt + 1;
0053
0054 bool drawsChildren = false;
0055
0056 FWGeometryTableManagerBase::Entries_i it;
0057 for (int n = 0; n != nD; ++n) {
0058 it = pIt;
0059 std::advance(it, n + dOff);
0060 cnt = pcnt + n + dOff;
0061
0062 TGeoHMatrix nm = parentMtx;
0063 nm.Multiply(it->m_node->GetMatrix());
0064
0065 bool drawsChildrenSecondGen = false;
0066 if (it->testBit(FWGeometryTableManagerBase::kVisNodeChld) && it->testBit(FWOverlapTableManager::kOverlapChild))
0067 drawsChildrenSecondGen = paintChildNodesRecurse(it, cnt, nm);
0068
0069 if (it->testBit(FWGeometryTableManagerBase::kVisNodeSelf)) {
0070 if (it->testBit(FWOverlapTableManager::kOverlap)) {
0071 int nno;
0072 it->m_node->GetOverlaps(nno);
0073 if ((m_browser->m_rnrOverlap.value() && ((nno & BIT(1)) == BIT(1))) ||
0074 (m_browser->m_rnrExtrusion.value() && ((nno & BIT(2)) == BIT(2)))) {
0075 paintShape(cnt, nm, false, drawsChildrenSecondGen);
0076 drawsChildren = true;
0077 }
0078
0079 } else {
0080 paintShape(cnt, nm, false, drawsChildrenSecondGen);
0081 drawsChildren = true;
0082 }
0083 }
0084
0085 drawsChildren |= drawsChildrenSecondGen;
0086 FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
0087 }
0088 return drawsChildren;
0089 }
0090
0091
0092
0093 TString FWEveOverlap::GetHighlightTooltip() {
0094
0095 std::set<TGLPhysicalShape*>::iterator it = fHted.begin();
0096 int idx = tableIdx(*it);
0097 if (idx < 0) {
0098 return Form("TopNode ");
0099 }
0100 FWGeometryTableManagerBase::NodeInfo& data = m_browser->getTableManager()->refEntries().at(idx);
0101
0102 TString name = data.name();
0103 if (data.testBit(FWOverlapTableManager::kOverlap)) {
0104 ((FWOverlapTableManager*)m_browser->getTableManager())->getOverlapTitles(idx, name);
0105 return name;
0106 }
0107
0108 return data.name();
0109 }
0110
0111
0112
0113 void FWEveOverlap::popupMenu(int x, int y, TGLViewer* v) {
0114 FWPopupMenu* nodePopup = setPopupMenu(x, y, v, true);
0115
0116 if (nodePopup)
0117 nodePopup->Connect("Activated(Int_t)", "FWOverlapTableView", m_browser, "chosenItem(Int_t)");
0118 }