Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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//
29/*-----------------------------HEPVis----------------------------------------*/
30/* */
31/* Node: SoDetectorTreeKit */
32/* Description: Represents a single sided silicon strip detector */
33/* Author: Joe Boudreau Nov 11 1996 */
34/* */
35/*---------------------------------------------------------------------------*/
36
37// this :
39
40#include <Inventor/SoPickedPoint.h>
41#include <Inventor/nodes/SoSeparator.h>
42#include <Inventor/nodes/SoPickStyle.h>
43#include <Inventor/nodes/SoDrawStyle.h>
44#include <Inventor/nodes/SoSwitch.h>
45#include <Inventor/nodes/SoMaterial.h>
46#include <Inventor/nodes/SoUnits.h>
47#include <Inventor/nodes/SoTransform.h>
48#include <Inventor/nodes/SoEventCallback.h>
49#include <Inventor/nodekits/SoSeparatorKit.h>
50#include <Inventor/nodekits/SoShapeKit.h>
51#include <Inventor/nodekits/SoAppearanceKit.h>
52#include <Inventor/nodekits/SoNodeKitListPart.h>
53#include <Inventor/nodekits/SoBaseKit.h>
54#include <Inventor/nodes/SoTexture2Transform.h>
55#include <Inventor/events/SoMouseButtonEvent.h>
56#include <Inventor/actions/SoHandleEventAction.h>
57
59
60#include <cmath>
61
62// This statement is required
63SO_KIT_SOURCE(SoDetectorTreeKit)
64
65// initClass
66void SoDetectorTreeKit::initClass(){
67 static bool first = true;
68 if (first) {
69 first = false;
70 SO_KIT_INIT_CLASS(SoDetectorTreeKit,SoBaseKit,"BaseKit");
71 }
72}
73
74// Constructor
76 SO_KIT_CONSTRUCTOR(SoDetectorTreeKit);
77
78 SO_NODE_ADD_FIELD(alternateRep, (NULL));
79
80 SO_KIT_ADD_CATALOG_ENTRY ( topSeparator, SoSeparator, FALSE, this,\0, FALSE);
81 SO_KIT_ADD_CATALOG_ENTRY ( pickStyle, SoSeparator, TRUE , topSeparator,\0, TRUE);
82 SO_KIT_ADD_CATALOG_ENTRY ( appearance, SoAppearanceKit, TRUE, topSeparator ,\0, TRUE);
83 SO_KIT_ADD_CATALOG_ENTRY ( units, SoUnits, TRUE, topSeparator ,\0, TRUE);
84 SO_KIT_ADD_CATALOG_ENTRY ( transform, SoTransform, TRUE , topSeparator,\0, TRUE);
85 SO_KIT_ADD_CATALOG_ENTRY (texture2Transform, SoTexture2Transform, TRUE, topSeparator ,\0, TRUE);
86 SO_KIT_ADD_CATALOG_ENTRY ( childList, SoSwitch, FALSE, topSeparator,\0, FALSE);
87 SO_KIT_ADD_CATALOG_ENTRY ( previewSeparator, SoSeparator, FALSE, childList,\0, TRUE);
88 SO_KIT_ADD_CATALOG_ENTRY ( fullSeparator, SoSeparator, FALSE, childList,\0, TRUE);
89
90 SO_KIT_INIT_INSTANCE();
91 createInitialTree();
92}
93
94// Destructor
96}
97
98
100 return FALSE;
101}
102
103void SoDetectorTreeKit::createInitialTree() {
104
105 SoEventCallback *myCallback = new SoEventCallback();
106 myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
107 SoDetectorTreeKit::expand,
108 this);
109 myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
110 SoDetectorTreeKit::contract ,
111 this);
112 if(setPart("callbackList[0]",myCallback)==FALSE) myCallback->unref();
113
114 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
115 theChildList->whichChild.setValue(0);
116}
117
118void SoDetectorTreeKit::expand(void *userData, SoEventCallback *eventCB){
119
120 // Was the event previously handled? Is it the right kind?
121
122 if (eventCB->isHandled()) return;
123 const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
124 if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
125 if (!event->wasCtrlDown()) return;
126 if (event->wasShiftDown()) return;
127
128 // Which Detector is this being called for?
129 SoDetectorTreeKit* This = (SoDetectorTreeKit *) userData;
130
131 // Find out whether that's the one that has been picked.
132 // "This' is the lowest detector tree kit in the hierarchy.
133 SoHandleEventAction *handleEventAction = eventCB->getAction();
134 const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
135 if (!pickedPoint) return;
136
137 SoFullPath* path = (SoFullPath*)pickedPoint->getPath();
138 SoNode *ancestorNode=NULL;
139 for (int i=0;i<path->getLength();i++) {
140 ancestorNode = path->getNodeFromTail(i);
141 if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) break;
142 }
143 if (This!=ancestorNode) return;
144 // if (!ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) return;
145
146 // Deactivate the Preview
147 This->setPreview(FALSE);
148 eventCB->setHandled();
149
150}
151
152void SoDetectorTreeKit::contract(void *userData, SoEventCallback *eventCB){
153
154 // Was the event previously handled? Is it the right kind?
155 if (eventCB->isHandled()) return;
156 const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
157 if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
158 if (event->wasCtrlDown()) return;
159 if (!event->wasShiftDown()) return;
160
161 // Which Detector is this being called for?
162 SoDetectorTreeKit* This = (SoDetectorTreeKit *) userData;
163
164 // Find out whether that's the one that has been picked
165 SoHandleEventAction *handleEventAction = eventCB->getAction();
166 const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
167 if (!pickedPoint) return;
168
169 // Find out whether that's the one that has been picked.
170 // "This" is the lowest detector tree kit in the hierarchy.
171 SoFullPath* path = (SoFullPath*)pickedPoint->getPath();
172 SoNode *ancestorNode=NULL;
173 SbBool firstTreeFound=FALSE;
174 for (int i=0;i<path->getLength();i++) {
175 ancestorNode = path->getNodeFromTail(i);
176 if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) {
177 if (!firstTreeFound) {
178 if (This!=ancestorNode) return;
179 firstTreeFound=TRUE;
180 }
181 SoDetectorTreeKit *That = (SoDetectorTreeKit *) ancestorNode;
182 if (!That->getPreview()) {
183 That->setPreview(TRUE);
184 eventCB->setHandled();
185 return;
186 }
187 }
188 }
189}
190
192 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
193 if (Flag) {
194 theChildList->whichChild.setValue(0);
195 }
196 else {
197 theChildList->whichChild.setValue(1);
198 }
199}
200
202 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
203 if (theChildList->whichChild.getValue()==0) return TRUE;
204 return FALSE;
205}
206
207
209 SoSwitch *theChildList = (SoSwitch *) childList.getValue();
210 theChildList->whichChild.setValue(SO_SWITCH_ALL);
211}
212
214 return (SoSeparator *) previewSeparator.getValue();
215}
216
218 return (SoSeparator *) fullSeparator.getValue();
219}
220
221
222
223
224// generateAlternateRep
226 alternateRep.setValue(topSeparator.getValue());
227}
228
230 alternateRep.setValue(NULL);
231}
232//////////////////////////////////////////////////////////////////////////////
234 SoAction* aAction
235)
236//////////////////////////////////////////////////////////////////////////////
237//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
238{
240 SoBaseKit::doAction(aAction);
241}
#define SO_ALTERNATEREP_DO_ACTION(aAction)
virtual ~SoDetectorTreeKit()
virtual void doAction(SoAction *)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
virtual void clearAlternateRep()
virtual void generateAlternateRep()
virtual void setPreview(SbBool Flag)
virtual SoSeparator * getPreviewSeparator() const
virtual SbBool getPreview() const
virtual SoSeparator * getFullSeparator() const
virtual SbBool affectsState() const
#define TRUE
Definition: globals.hh:41
#define FALSE
Definition: globals.hh:38