Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SoDetectorTreeKit.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28// $Id$
29//
30/*-----------------------------HEPVis----------------------------------------*/
31/* */
32/* Node: SoDetectorTreeKit */
33/* Description: Represents a single sided silicon strip detector */
34/* Author: Joe Boudreau Nov 11 1996 */
35/* */
36/*---------------------------------------------------------------------------*/
37
38#ifdef G4VIS_BUILD_OI_DRIVER
39
40// this :
42
43#include <Inventor/SoPickedPoint.h>
44#include <Inventor/nodes/SoSeparator.h>
45#include <Inventor/nodes/SoPickStyle.h>
46#include <Inventor/nodes/SoDrawStyle.h>
47#include <Inventor/nodes/SoSwitch.h>
48#include <Inventor/nodes/SoMaterial.h>
49#include <Inventor/nodes/SoUnits.h>
50#include <Inventor/nodes/SoTransform.h>
51#include <Inventor/nodes/SoEventCallback.h>
52#include <Inventor/nodekits/SoSeparatorKit.h>
53#include <Inventor/nodekits/SoShapeKit.h>
54#include <Inventor/nodekits/SoAppearanceKit.h>
55#include <Inventor/nodekits/SoNodeKitListPart.h>
56#include <Inventor/nodekits/SoBaseKit.h>
57#include <Inventor/nodes/SoTexture2Transform.h>
58#include <Inventor/events/SoMouseButtonEvent.h>
59#include <Inventor/actions/SoHandleEventAction.h>
60
62
63#include <cmath>
64
65// This statement is required
66SO_KIT_SOURCE(SoDetectorTreeKit)
67
68// initClass
70 SO_KIT_INIT_CLASS(SoDetectorTreeKit,SoBaseKit,"BaseKit");
71}
72
73// Constructor
75 SO_KIT_CONSTRUCTOR(SoDetectorTreeKit);
76
77 SO_NODE_ADD_FIELD(alternateRep, (NULL));
78
79 SO_KIT_ADD_CATALOG_ENTRY ( topSeparator, SoSeparator, FALSE, this,\0, FALSE);
80 SO_KIT_ADD_CATALOG_ENTRY ( pickStyle, SoSeparator, TRUE , topSeparator,\0, TRUE);
81 SO_KIT_ADD_CATALOG_ENTRY ( appearance, SoAppearanceKit, TRUE, topSeparator ,\0, TRUE);
82 SO_KIT_ADD_CATALOG_ENTRY ( units, SoUnits, TRUE, topSeparator ,\0, TRUE);
83 SO_KIT_ADD_CATALOG_ENTRY ( transform, SoTransform, TRUE , topSeparator,\0, TRUE);
84 SO_KIT_ADD_CATALOG_ENTRY (texture2Transform, SoTexture2Transform, TRUE, topSeparator ,\0, TRUE);
85 SO_KIT_ADD_CATALOG_ENTRY ( childList, SoSwitch, FALSE, topSeparator,\0, FALSE);
86 SO_KIT_ADD_CATALOG_ENTRY ( previewSeparator, SoSeparator, FALSE, childList,\0, TRUE);
87 SO_KIT_ADD_CATALOG_ENTRY ( fullSeparator, SoSeparator, FALSE, childList,\0, TRUE);
88
89 SO_KIT_INIT_INSTANCE();
90 createInitialTree();
91}
92
93// Destructor
95}
96
97
99 return FALSE;
100}
101
102void SoDetectorTreeKit::createInitialTree() {
103
104 SoEventCallback *myCallback = new SoEventCallback();
105 myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
106 SoDetectorTreeKit::expand,
107 this);
108 myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
109 SoDetectorTreeKit::contract ,
110 this);
111 if(setPart("callbackList[0]",myCallback)==FALSE) myCallback->unref();
112
113 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
114 theChildList->whichChild.setValue(0);
115}
116
117void SoDetectorTreeKit::expand(void *userData, SoEventCallback *eventCB){
118
119 // Was the event previously handled? Is it the right kind?
120
121 if (eventCB->isHandled()) return;
122 const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
123 if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
124 if (!event->wasCtrlDown()) return;
125 if (event->wasShiftDown()) return;
126
127 // Which Detector is this being called for?
129
130 // Find out whether that's the one that has been picked.
131 // "This' is the lowest detector tree kit in the hierarchy.
132 SoHandleEventAction *handleEventAction = eventCB->getAction();
133 const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
134 if (!pickedPoint) return;
135
136 SoFullPath* path = (SoFullPath*)pickedPoint->getPath();
137 SoNode *ancestorNode=NULL;
138 for (int i=0;i<path->getLength();i++) {
139 ancestorNode = path->getNodeFromTail(i);
140 if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) break;
141 }
142 if (This!=ancestorNode) return;
143 // if (!ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) return;
144
145 // Deactivate the Preview
146 This->setPreview(FALSE);
147 eventCB->setHandled();
148
149}
150
151void SoDetectorTreeKit::contract(void *userData, SoEventCallback *eventCB){
152
153 // Was the event previously handled? Is it the right kind?
154 if (eventCB->isHandled()) return;
155 const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
156 if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
157 if (event->wasCtrlDown()) return;
158 if (!event->wasShiftDown()) return;
159
160 // Which Detector is this being called for?
162
163 // Find out whether that's the one that has been picked
164 SoHandleEventAction *handleEventAction = eventCB->getAction();
165 const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
166 if (!pickedPoint) return;
167
168 // Find out whether that's the one that has been picked.
169 // "This" is the lowest detector tree kit in the hierarchy.
170 SoFullPath* path = (SoFullPath*)pickedPoint->getPath();
171 SoNode *ancestorNode=NULL;
172 SbBool firstTreeFound=FALSE;
173 for (int i=0;i<path->getLength();i++) {
174 ancestorNode = path->getNodeFromTail(i);
175 if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) {
176 if (!firstTreeFound) {
177 if (This!=ancestorNode) return;
178 firstTreeFound=TRUE;
179 }
180 SoDetectorTreeKit *That = (SoDetectorTreeKit *) ancestorNode;
181 if (!That->getPreview()) {
182 That->setPreview(TRUE);
183 eventCB->setHandled();
184 return;
185 }
186 }
187 }
188}
189
190void SoDetectorTreeKit::setPreview(SbBool Flag) {
191 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
192 if (Flag) {
193 theChildList->whichChild.setValue(0);
194 }
195 else {
196 theChildList->whichChild.setValue(1);
197 }
198}
199
200SbBool SoDetectorTreeKit::getPreview() const {
201 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
202 if (theChildList->whichChild.getValue()==0) return TRUE;
203 return FALSE;
204}
205
206
208 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
209 theChildList->whichChild.setValue(SO_SWITCH_ALL);
210}
211
212SoSeparator *SoDetectorTreeKit::getPreviewSeparator() const {
213 return (SoSeparator *) previewSeparator.getValue();
214}
215
216SoSeparator *SoDetectorTreeKit::getFullSeparator() const {
217 return (SoSeparator *) fullSeparator.getValue();
218}
219
220
221
222
223// generateAlternateRep
225 alternateRep.setValue(topSeparator.getValue());
226}
227
229 alternateRep.setValue(NULL);
230}
231//////////////////////////////////////////////////////////////////////////////
233 SoAction* aAction
234)
235//////////////////////////////////////////////////////////////////////////////
236//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
237{
239 SoBaseKit::doAction(aAction);
240}
241
242#endif
#define SO_ALTERNATEREP_DO_ACTION(aAction)
virtual SoSeparator * getPreviewSeparator() const
virtual SoSeparator * getFullSeparator() const
void setPreviewAndFull()
virtual ~SoDetectorTreeKit()
static void initClass()
virtual SbBool getPreview() const
virtual SbBool affectsState() const
virtual void generateAlternateRep()
virtual void doAction(SoAction *)
virtual void clearAlternateRep()
virtual void setPreview(SbBool Flag)
#define TRUE
Definition: globals.hh:55
#define FALSE
Definition: globals.hh:52
#define userData
Definition: xmlparse.cc:555