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