CMS 3D CMS Logo

Public Types | Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Private Member Functions | Friends

FWGeoTopNode Class Reference

#include <Fireworks/Core/interface/FWGeoTopNode.h>

Inheritance diagram for FWGeoTopNode:
FWEveDetectorGeo FWEveOverlap

List of all members.

Public Types

enum  MenuOptions {
  kSetTopNode, kSetTopNodeCam, kVisSelfOff, kVisChldOn,
  kVisChldOff, kCamera, kPrintMaterial, kPrintPath,
  kPrintShape, kPrintOverlap, kOverlapVisibilityMotherOn, kOverlapVisibilityMotherOff
}

Public Member Functions

virtual FWGeometryTableViewBasebrowser ()
void clearSelection ()
 FWGeoTopNode (const char *n="FWGeoTopNode", const char *t="FWGeoTopNode")
int getFirstSelectedTableIndex ()
virtual void Paint (Option_t *option="")
virtual void popupMenu (int x, int y, TGLViewer *)
void printSelected ()
bool selectPhysicalFromTable (int)
virtual
FWGeometryTableManagerBase
tableManager ()
virtual void UnHighlighted ()
virtual void UnSelected ()
virtual ~FWGeoTopNode ()

Public Attributes

std::set< TGLPhysicalShape * > fHted
std::set< TGLPhysicalShape * > fSted
FWGeoTopNodeGLScenem_scene

Static Public Attributes

static TGLVector3 s_pickedCamera3DCenter
static TGLViewer * s_pickedViewer = 0

Protected Member Functions

void ClearSet (std::set< TGLPhysicalShape * > &sset)
virtual void ComputeBBox ()
void EraseFromSet (std::set< TGLPhysicalShape * > &sset, TGLPhysicalShape *id)
void paintShape (Int_t idx, const TGeoHMatrix &nm, bool volumeColor, bool parentNode)
void ProcessSelection (TGLSelectRecord &rec, std::set< TGLPhysicalShape * > &sset, TGLPhysicalShape *id)
FWPopupMenusetPopupMenu (int iX, int iY, TGLViewer *v, bool)
void SetStateOf (TGLPhysicalShape *id)
void setupBuffMtx (TBuffer3D &buff, const TGeoHMatrix &mat)

Static Protected Member Functions

static UInt_t phyID (int tableIdx)
static int tableIdx (TGLPhysicalShape *ps)

Private Member Functions

 ClassDef (FWGeoTopNode, 0)
 FWGeoTopNode (const FWGeoTopNode &)
const FWGeoTopNodeoperator= (const FWGeoTopNode &)
UChar_t wrapTransparency (FWGeometryTableManagerBase::NodeInfo &data, bool leafNode)

Friends

class FWGeoTopNodeGL

Detailed Description

Description: [one line class summary]

Usage: <usage>

Definition at line 42 of file FWGeoTopNode.h.


Member Enumeration Documentation

Enumerator:
kSetTopNode 
kSetTopNodeCam 
kVisSelfOff 
kVisChldOn 
kVisChldOff 
kCamera 
kPrintMaterial 
kPrintPath 
kPrintShape 
kPrintOverlap 
kOverlapVisibilityMotherOn 
kOverlapVisibilityMotherOff 

Definition at line 48 of file FWGeoTopNode.h.


Constructor & Destructor Documentation

FWGeoTopNode::FWGeoTopNode ( const char *  n = "FWGeoTopNode",
const char *  t = "FWGeoTopNode" 
) [inline]

Definition at line 63 of file FWGeoTopNode.h.

{}
virtual FWGeoTopNode::~FWGeoTopNode ( ) [inline, virtual]

Definition at line 64 of file FWGeoTopNode.h.

{}
FWGeoTopNode::FWGeoTopNode ( const FWGeoTopNode ) [private]

Member Function Documentation

virtual FWGeometryTableViewBase* FWGeoTopNode::browser ( ) [inline, virtual]

Reimplemented in FWEveDetectorGeo, and FWEveOverlap.

Definition at line 70 of file FWGeoTopNode.h.

Referenced by wrapTransparency().

{ return 0; }
FWGeoTopNode::ClassDef ( FWGeoTopNode  ,
 
) [private]
void FWGeoTopNode::clearSelection ( ) [inline]

Definition at line 77 of file FWGeoTopNode.h.

References fHted, and fSted.

Referenced by FWGeometryTableView::setPath(), and FWGeometryTableViewBase::setPath().

{fHted.clear(); fSted.clear();}
void FWGeoTopNode::ClearSet ( std::set< TGLPhysicalShape * > &  sset) [protected]

Definition at line 72 of file FWGeoTopNode.cc.

References SetStateOf().

Referenced by ProcessSelection(), UnHighlighted(), and UnSelected().

{
   while (!sset.empty())
   {
      TGLPhysicalShape *id = *sset.begin();
      sset.erase(id);
      SetStateOf(id);
   }
}
void FWGeoTopNode::ComputeBBox ( ) [protected, virtual]

Definition at line 224 of file FWGeoTopNode.cc.

References f.

{
   // Fill bounding-box information. Virtual from TAttBBox.

   BBoxZero(1.0f);
}
void FWGeoTopNode::EraseFromSet ( std::set< TGLPhysicalShape * > &  sset,
TGLPhysicalShape *  id 
) [protected]

Definition at line 65 of file FWGeoTopNode.cc.

References SetStateOf().

Referenced by ProcessSelection().

{
   sset.erase(id);
   SetStateOf(id);
}
int FWGeoTopNode::getFirstSelectedTableIndex ( )

Definition at line 208 of file FWGeoTopNode.cc.

References fSted, i, FWGeometryTableManagerBase::kSelected, FWGeometryTableManagerBase::refEntries(), and tableManager().

Referenced by FWOverlapTableView::chosenItem(), FWGeometryTableViewBase::chosenItem(), and setPopupMenu().

{
   // Note: if object would be rendered, this would return fSted.begin().

   if (fSted.size() <= 1)
   {
      int cnt = 0;
      for (FWGeometryTableManagerBase::Entries_i i = tableManager()->refEntries().begin(); i != tableManager()->refEntries().end(); ++i, ++cnt)
      {
         if (i->testBit(FWGeometryTableManagerBase::kSelected)) return cnt; 
      }
   }
   return -1;
}
const FWGeoTopNode& FWGeoTopNode::operator= ( const FWGeoTopNode ) [private]
void FWGeoTopNode::Paint ( Option_t *  option = "") [virtual]

Reimplemented in FWEveDetectorGeo, and FWEveOverlap.

Definition at line 330 of file FWGeoTopNode.cc.

References WDecay::kNone.

{
   static const TEveException eh("FWGeoTopNode::Paint ");

   TBuffer3D buff(TBuffer3DTypes::kGeneric);

   // Section kCore
   buff.fID           = this;
   buff.fColor        = GetMainColor();
   buff.fTransparency = GetMainTransparency();
   if (HasMainTrans())  RefMainTrans().SetBuffer3D(buff);

   buff.SetSectionsValid(TBuffer3D::kCore);

   Int_t reqSections = gPad->GetViewer3D()->AddObject(1, buff);
   if (reqSections != TBuffer3D::kNone)
   {
      Warning(eh, "IsA='%s'. Viewer3D requires more sections (%d). Only direct-rendering supported.",
              ClassName(), reqSections);
   }
}
void FWGeoTopNode::paintShape ( Int_t  idx,
const TGeoHMatrix &  nm,
bool  volumeColor,
bool  parentNode 
) [protected]

Definition at line 247 of file FWGeoTopNode.cc.

References data, GetTransform(), WDecay::kNone, FWGeometryTableManagerBase::NodeInfo::m_color, FWGeometryTableManagerBase::NodeInfo::m_node, m_scene, FWGeoTopNodeGLScene::OpenCompositeWithPhyID(), phyID(), FWGeometryTableManagerBase::refEntries(), setupBuffMtx(), tableManager(), and wrapTransparency().

Referenced by FWEveOverlap::Paint(), FWEveDetectorGeo::Paint(), FWEveDetectorGeo::paintChildNodesRecurse(), and FWEveOverlap::paintChildNodesRecurse().

{
   static const TEveException eh("FWGeoTopNode::paintShape ");
 
  // printf("paint sahpe id %d\n", tableIndex );

   FWGeometryTableManagerBase::NodeInfo& data = tableManager()->refEntries().at(tableIndex);
   UChar_t transparency = wrapTransparency(data, isParentNode);
   // printf("trans %d \n", transparency );
   if (transparency >= 100) return;
   
   TGeoShape* shape = data.m_node->GetVolume()->GetShape();
   
   TGeoCompositeShape* compositeShape = dynamic_cast<TGeoCompositeShape*>(shape);
   if (compositeShape)
   {
      // m_scene->fNextCompositeID = phyID(tableIndex);

      Double_t halfLengths[3] = { compositeShape->GetDX(), compositeShape->GetDY(), compositeShape->GetDZ() };

      TBuffer3D buff(TBuffer3DTypes::kComposite);
      buff.fID           = data.m_node->GetVolume();
      buff.fColor        = volumeColor ? data.m_node->GetVolume()->GetLineColor() : data.m_color ;
      buff.fTransparency = transparency;// data.m_node->GetVolume()->GetTransparency(); 

      nm.GetHomogenousMatrix(buff.fLocalMaster);  
      buff.fLocalFrame   = kTRUE; // Always enforce local frame (no geo manager).
      buff.SetAABoundingBox(compositeShape->GetOrigin(), halfLengths);
      buff.SetSectionsValid(TBuffer3D::kCore|TBuffer3D::kBoundingBox);

      Bool_t paintComponents = kTRUE;
      // Start a composite shape, identified by this buffer
      if (TBuffer3D::GetCSLevel() == 0) {
         paintComponents = m_scene->OpenCompositeWithPhyID(phyID(tableIndex), buff);
      }

      TBuffer3D::IncCSLevel();
      
      // Paint the boolean node - will add more buffers to viewer
      TGeoHMatrix xxx;
      TGeoMatrix *gst = TGeoShape::GetTransform();
      TGeoShape::SetTransform(&xxx);

      if (paintComponents) compositeShape->GetBoolNode()->Paint("");
      TGeoShape::SetTransform(gst);
      // Close the composite shape
      if (TBuffer3D::DecCSLevel() == 0)
         gPad->GetViewer3D()->CloseComposite();


      //  m_scene->fNextCompositeID = 0;
   }
   else
   {
      TBuffer3D& buff = (TBuffer3D&) shape->GetBuffer3D (TBuffer3D::kCore, kFALSE);
      setupBuffMtx(buff, nm);
      buff.fID           = data.m_node->GetVolume();
      buff.fColor        = volumeColor ? data.m_node->GetVolume()->GetLineColor() : data.m_color ;
      buff.fTransparency = transparency;// data.m_node->GetVolume()->GetTransparency(); 


      nm.GetHomogenousMatrix(buff.fLocalMaster);
      buff.fLocalFrame   = kTRUE; // Always enforce local frame (no geo manager).

      Int_t sections = TBuffer3D::kBoundingBox | TBuffer3D::kShapeSpecific;
      shape->GetBuffer3D(sections, kTRUE);

      Int_t reqSec = gPad->GetViewer3D()->AddObject(phyID(tableIndex), buff);

      if (reqSec != TBuffer3D::kNone) {
         // This shouldn't happen, but I suspect it does sometimes.
         if (reqSec & TBuffer3D::kCore)
            Warning(eh, "Core section required again for shape='%s'. This shouldn't happen.", GetName());
         shape->GetBuffer3D(reqSec, kTRUE);
         reqSec = gPad->GetViewer3D()->AddObject(phyID(tableIndex), buff);
      }

      if (reqSec != TBuffer3D::kNone)  
         Warning(eh, "Extra section required: reqSec=%d, shape=%s.", reqSec, GetName());
   }
}
UInt_t FWGeoTopNode::phyID ( int  tableIdx) [static, protected]

Definition at line 54 of file FWGeoTopNode.cc.

Referenced by paintShape(), and selectPhysicalFromTable().

{
return UInt_t(tableIdx + 2);

}
virtual void FWGeoTopNode::popupMenu ( int  x,
int  y,
TGLViewer *   
) [inline, virtual]

Reimplemented in FWEveDetectorGeo, and FWEveOverlap.

Definition at line 80 of file FWGeoTopNode.h.

Referenced by FWGeometryTableViewBase::cellClicked(), and FWGeoTopNodeGLScene::GeoPopupMenu().

{}
void FWGeoTopNode::printSelected ( )

Definition at line 198 of file FWGeoTopNode.cc.

References asciidump::at, fSted, mergeVDriftHistosByStation::name, tableIdx(), and tableManager().

{
   for (std::set<TGLPhysicalShape*>::iterator it = fSted.begin(); it != fSted.end(); ++it)
   {
      printf("FWGeoTopNode::printSelected %s \n",  tableManager()->refEntries().at(tableIdx(*it)).name() );
   }
}
void FWGeoTopNode::ProcessSelection ( TGLSelectRecord &  rec,
std::set< TGLPhysicalShape * > &  sset,
TGLPhysicalShape *  id 
) [protected]

Definition at line 106 of file FWGeoTopNode.cc.

References ClearSet(), FWTableManagerBase::dataChanged(), EraseFromSet(), WDecay::kNone, m_scene, SetStateOf(), and tableManager().

Referenced by FWGeoTopNodeGL::ProcessSelection().

{
   // printf("FWGeoTopNode::ProcessSelection ===============================\n");

   m_scene->BeginUpdate();

   if (sset.empty())
   {
      if (id)
      {
         sset.insert(id);
         rec.SetSecSelResult(TGLSelectRecord::kEnteringSelection);
      }  
   }
   else
   {
      if (id)
      {
         if (rec.GetMultiple())
         {
            if (sset.find(id) == sset.end())
            {
               sset.insert(id);
               rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
            }
            else
            {
               EraseFromSet(sset, id);
               if (sset.empty())
                  rec.SetSecSelResult(TGLSelectRecord::kLeavingSelection);
               else
                  rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
            }
         }
         else
         {
            if (sset.size() != 1 || sset.find(id) == sset.end())
            {
               ClearSet(sset);
               sset.insert(id);
               rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
            }
         }
      }
      else
      {
         if (!rec.GetMultiple())
         {
            ClearSet(sset);
            rec.SetSecSelResult(TGLSelectRecord::kLeavingSelection);
         }
      }
   }

   if (id)
   {
      SetStateOf(id);
   }

   if (rec.GetSecSelResult() != TGLSelectRecord::kNone)
   {
      m_scene->EndUpdate(kTRUE, kFALSE, kTRUE);
      gEve->Redraw3D();

      tableManager()->dataChanged();
   }
   else
   {
      m_scene->EndUpdate(kFALSE, kFALSE, kFALSE);
   }
}
bool FWGeoTopNode::selectPhysicalFromTable ( int  tableIndex)

Definition at line 179 of file FWGeoTopNode.cc.

References asciidump::at, fSted, fwLog, fwlog::kInfo, FWGeometryTableManagerBase::kVisNodeSelf, m_scene, phyID(), and tableManager().

Referenced by FWGeometryTableViewBase::setColumnSelected().

{
   //   printf("FWGeoTopNode::selectPhysicalFromTable 

   TGLPhysicalShape* ps = m_scene->FindPhysical(phyID(tableIndex));
   if (ps) {
      fSted.insert(ps);
      ps->Select(1);
      // printf("selectPhysicalFromTable found physical \n");
      return true;
   }
   else if ( tableManager()->refEntries().at(tableIndex).testBit(FWGeometryTableManagerBase::kVisNodeSelf));
   {
      fwLog(fwlog::kInfo) << "Selected entry not drawn in GL viewer. \n" ;
      return false;
   }
}
FWPopupMenu * FWGeoTopNode::setPopupMenu ( int  iX,
int  iY,
TGLViewer *  v,
bool  overlap 
) [protected]

Definition at line 370 of file FWGeoTopNode.cc.

References fSted, fwLog, getFirstSelectedTableIndex(), kCamera, fwlog::kInfo, kPrintMaterial, kPrintOverlap, kPrintPath, kPrintShape, kSetTopNode, kSetTopNodeCam, kVisChldOff, kVisChldOn, kVisSelfOff, s_pickedCamera3DCenter, s_pickedViewer, v, x, and detailsBasic3DVector::y.

Referenced by FWEveOverlap::popupMenu(), and FWEveDetectorGeo::popupMenu().

{
   if (getFirstSelectedTableIndex() < 0)
   {
      if (fSted.empty()) fwLog(fwlog::kInfo) << "No menu -- no node/entry selected \n";
      return 0;
   }
   
   FWPopupMenu* nodePopup = new FWPopupMenu();
   
   nodePopup->AddEntry("Set As Top Node", kSetTopNode);
   nodePopup->AddEntry("Set As Top Node And Reset Camera", kSetTopNodeCam);
   nodePopup->AddSeparator();
   if (v) { 
       nodePopup->AddEntry("Rnr Off", kVisSelfOff);
   }
   nodePopup->AddEntry("Rnr Off For All Children", kVisChldOff);
   nodePopup->AddEntry("Rnr On For All Children", kVisChldOn);      
   nodePopup->AddSeparator();
   
   if (overlap)
      nodePopup->AddEntry("Print Overlap", kPrintOverlap);
   nodePopup->AddEntry("Print Path", kPrintPath);
   nodePopup->AddEntry("Print Shape", kPrintShape);
   nodePopup->AddEntry("Print Material", kPrintMaterial);   
   
   nodePopup->AddSeparator();
   if (v) {
      Window_t wdummy;
      Int_t x,y;
      gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(), v->GetGLWidget()->GetId(), iX, iY, x, y, wdummy);   
      TGLVector3 pnt(x, y, 0.5*v->GetSelRec().GetMinZ());
      v->CurrentCamera().WindowToViewport(pnt);
      s_pickedCamera3DCenter = v->CurrentCamera().ViewportToWorld(pnt);
      // s_pickedCamera3DCenter.Dump();
      s_pickedViewer = v;
      
      nodePopup->AddEntry("Set Camera Center", kCamera);
   }
   
   nodePopup->PlaceMenu(iX, iY,true,true);
   return nodePopup;
}
void FWGeoTopNode::SetStateOf ( TGLPhysicalShape *  id) [protected]
void FWGeoTopNode::setupBuffMtx ( TBuffer3D &  buff,
const TGeoHMatrix &  mat 
) [protected]

Definition at line 232 of file FWGeoTopNode.cc.

References m, alignCSCRings::r, alignCSCRings::s, and lumiQTWidget::t.

Referenced by paintShape().

{
   const Double_t *r = mat.GetRotationMatrix();
   const Double_t *t = mat.GetTranslation();
   const Double_t *s = mat.GetScale();
   Double_t       *m = buff.fLocalMaster;
   m[0]  = r[0]*s[0]; m[1]  = r[1]*s[1]; m[2]  = r[2]*s[2]; m[3]  = 0;
   m[4]  = r[3]*s[0]; m[5]  = r[4]*s[1]; m[6]  = r[5]*s[2]; m[7]  = 0;
   m[8]  = r[6]*s[0]; m[9]  = r[7]*s[1]; m[10] = r[8]*s[2]; m[11] = 0;
   m[12] = t[0];      m[13] = t[1];      m[15] = t[2];      m[15] = 1;

   buff.fLocalFrame = kTRUE;
}
int FWGeoTopNode::tableIdx ( TGLPhysicalShape *  ps) [static, protected]

Definition at line 60 of file FWGeoTopNode.cc.

Referenced by FWEveDetectorGeo::GetHighlightTooltip(), FWEveOverlap::GetHighlightTooltip(), printSelected(), and SetStateOf().

{
   return ps->ID() - 2;
}
virtual FWGeometryTableManagerBase* FWGeoTopNode::tableManager ( ) [inline, virtual]
void FWGeoTopNode::UnHighlighted ( ) [virtual]
void FWGeoTopNode::UnSelected ( ) [virtual]
UChar_t FWGeoTopNode::wrapTransparency ( FWGeometryTableManagerBase::NodeInfo data,
bool  leafNode 
) [private]

Friends And Related Function Documentation

friend class FWGeoTopNodeGL [friend]

Definition at line 45 of file FWGeoTopNode.h.


Member Data Documentation

std::set<TGLPhysicalShape*> FWGeoTopNode::fHted
std::set<TGLPhysicalShape*> FWGeoTopNode::fSted

Definition at line 85 of file FWGeoTopNode.h.

Referenced by FWGeometryTableViewBase::chosenItem(), and setPopupMenu().

TGLViewer * FWGeoTopNode::s_pickedViewer = 0 [static]

Definition at line 86 of file FWGeoTopNode.h.

Referenced by FWGeometryTableViewBase::chosenItem(), and setPopupMenu().