27 #include <Inventor/nodes/SoSwitch.h> 
   28 #include <Inventor/nodes/SoSeparator.h> 
   29 #include <Inventor/actions/SoGetBoundingBoxAction.h> 
   31 #include <Inventor/SbLinear.h> 
   32 #include <Inventor/SbViewportRegion.h> 
   38 #define NPHISECTORS 36 
  102   SoSwitch * sw = 
new SoSwitch;
 
  107   SoSeparator * 
sep = 
new SoSeparator;
 
  128   SoSwitch * sw = 
new SoSwitch;
 
  133   SoSeparator * 
sep = 
new SoSeparator;
 
  155   assert(sw->getNumChildren()==2);
 
  157   assert(sw->getChild(1)->getTypeId()==SoSeparator::getClassTypeId());
 
  159   SoNode* shape = 
static_cast<SoShape*
>(sw->getChild(0));
 
  160   SoSeparator* 
sep = 
static_cast<SoSeparator*
>(sw->getChild(1));
 
  163   if (sw->whichChild.getValue() != 0)
 
  167   if (shape->getTypeId()==SoTubs::getClassTypeId()) {
 
  169   } 
else if (shape->getTypeId()==SoPcons::getClassTypeId()) {
 
  171   } 
else if (shape->getTypeId()==SoCons::getClassTypeId()) {
 
  174     assert(shape->getTypeId()==SoLAr::getClassTypeId());
 
  179   SbVec3f unitz (0.0
f, 0.0
f, 1.0
f);
 
  182   SbVec3f translation; SbRotation 
rotation; SbVec3f scaleFactor; SbRotation scaleOrientation;
 
  183   transf.getTransform (translation, 
rotation, scaleFactor, scaleOrientation);
 
  185   rotation.multVec(unitz,transfunitz);
 
  188   transfunitz.getValue(
x,
y,
z);
 
  190   bool rotaroundy = (
z<0&&std::fabs(
x)*10<std::fabs(
z));
 
  193   SbVec3f unitx (1.0
f, 0.0
f, 0.0
f);
 
  195   rotation.multVec(unitx,transfunitx);
 
  196   transfunitx.getValue(
x,
y,
z);
 
  204   SoSeparator * subsyssep_volaroundZ = 
new SoSeparator;
 
  208   subsyssep_volaroundZ->ref();
 
  223   SbViewportRegion dummyvp;
 
  224   SoGetBoundingBoxAction 
a(dummyvp);
 
  226   SbXfBox3f xfbox = 
a.getXfBoundingBox();
 
  228   SbBox3f box = xfbox.project();
 
  229   shape->unrefNoDelete();
 
  232   float minx, miny, minz, maxx, maxy, maxz;
 
  233   box.getBounds(minx, miny, minz, maxx, maxy, maxz);
 
  235   box.getCenter().getValue(
x,
y,
z);
 
  236   if (std::abs(
x*20.0)<std::abs(
std::min(minx,maxx))&&std::abs(
y*20.0)<std::abs(
std::min(miny,maxy))) {
 
  238     if (shape->getTypeId()==SoTubs::getClassTypeId()
 
  239       ||shape->getTypeId()==SoPcons::getClassTypeId()
 
  240       ||shape->getTypeId()==SoCons::getClassTypeId()
 
  241       ||shape->getTypeId()==SoLAr::getClassTypeId()) {
 
  249       std::string Typenametest = shape->getTypeId().getName().getString();
 
  250       m_d->
system->
message(
"WARNING: Unknown volume type (boolean?) for volume around Z-axis (type " 
  251              +QString(Typenametest.c_str())+
"). Phi-sector cuts won't work for this!");
 
  284     for (;it2!=it2E;++it2) {
 
  285       SoSeparator * 
sep = it2->second->topSeparator();
 
  286       delete (it2->second);
 
  294     for (;it5!=it5E;++it5) {
 
  295       SoSeparator * 
sep = it5->second->topSeparator();
 
  296       delete (it5->second);
 
  302     SoSeparator * 
sep = it3->second->topSeparator();
 
  303     delete (it3->second);
 
  315   QList<int> changedPhiSectors;
 
  318       changedPhiSectors << iphi;
 
  320   for (
int iphi : changedPhiSectors)
 
  330       if ((*it)->whichChild.getValue() != (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE))
 
  331         (*it)->whichChild = (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE);
 
  338       if ((*it)->whichChild.getValue() != (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE))
 
  339         (*it)->whichChild = (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE);
 
  349     for (
it = it_zax_switches->second.begin();
it!=
itE;++
it) {
 
  350       if ((*it)->whichChild.getValue() != (alloff?SO_SWITCH_NONE:SO_SWITCH_ALL))
 
  351         (*it)->whichChild = (alloff?SO_SWITCH_NONE:SO_SWITCH_ALL);
 
  360   phistart = tubs->
pSPhi.getValue();
 
  361   phispan  = tubs->
pDPhi.getValue();
 
  367   dest->pRMin.setValue(
source->pRMin.getValue());
 
  368   dest->pRMax.setValue(
source->pRMax.getValue());
 
  370   dest->pSPhi.setValue(phistart);
 
  371   dest->pDPhi.setValue(phispan);
 
  372   dest->drawEdgeLines.setValue(
source->drawEdgeLines.getValue());
 
  378   phistart = pcons->
fSPhi.getValue();
 
  379   phispan  = pcons->
fDPhi.getValue();
 
  388   dest->fSPhi.setValue(phistart);
 
  389   dest->fDPhi.setValue(phispan);
 
  390   dest->drawEdgeLines.setValue(
source->drawEdgeLines.getValue());
 
  396   phistart = cons->
fSPhi.getValue();
 
  397   phispan  = cons->
fDPhi.getValue();
 
  403   dest->fRmin1.setValue(
source->fRmin1.getValue());
 
  404   dest->fRmin2.setValue(
source->fRmin2.getValue());
 
  405   dest->fRmax1.setValue(
source->fRmax1.getValue());
 
  406   dest->fRmax2.setValue(
source->fRmax2.getValue());
 
  408   dest->fSPhi.setValue(phistart);
 
  409   dest->fDPhi.setValue(phispan);
 
  415   phistart = lar->
fSPhi.getValue();
 
  416   phispan  = lar->
fDPhi.getValue();
 
  425   dest->fSPhi.setValue(phistart);
 
  426   dest->fDPhi.setValue(phispan);
 
  434   typename std::map<SoSwitch*,std::pair<T*,SoSeparator*> >
::iterator it, 
itE = volaroundZ.end();
 
  435   for (
it = volaroundZ.begin();
it!=
itE;++
it) {
 
  436     if (phisectionwidget->allSectorsOff()) {
 
  437       if (
it->first->whichChild.getValue() != SO_SWITCH_NONE)
 
  438         it->first->whichChild = SO_SWITCH_NONE;
 
  439     } 
else if (phisectionwidget->allSectorsOn()) {
 
  440       if (
it->first->whichChild.getValue() != 0)
 
  441         it->first->whichChild = 0;
 
  444       SbBool 
save = 
it->first->enableNotify(
false);
 
  445       SoSeparator * 
sep = 
it->second.second;
 
  446       sep->removeAllChildren();
 
  448       std::map<SoSwitch*,std::pair<double,bool> >
::iterator it_transfinfo = volaroundZ_switch2transfinfo.find(
it->first);
 
  449       if (it_transfinfo==volaroundZ_switch2transfinfo.end()) {
 
  450         system->message(
"updateRepresentationsOfVolsAroundZAxis_Specific ERROR: Inconsistent maps");
 
  453       double phirot = it_transfinfo->second.first;
 
  454       bool rotaroundy = it_transfinfo->second.second;
 
  457       getPhiExtentOfShape(
it->second.first,sphi,dphi);
 
  459       QList<VP1Interval> 
ranges = phisectionwidget->enabledPhiRanges( sphi, sphi+dphi );
 
  462       for (
int i = 0; 
i< 
n; ++
i) {
 
  464         double deltaphi = 
ranges.at(
i).length();
 
  465         double startphi = rotaroundy ? - 
ranges.at(
i).upper() - 2*
M_PI + phirot : 
ranges.at(
i).lower()-phirot;
 
  466         while (startphi<0) startphi += 2*
M_PI;
 
  467         while (startphi+deltaphi>2*
M_PI) startphi -= 2*
M_PI;
 
  468         copyShapeFieldsAndOverridePhiRange( 
it->second.first, shape, startphi, deltaphi );
 
  469         sep->addChild(shape);
 
  472       it->first->whichChild = 1;
 
  473       it->first->enableNotify(
save);
 
  499       for (;it2!=it2E;++it2)
 
  500         it2->second->largeChangesBegin();
 
  504       it3->second->largeChangesBegin();
 
  517       for (;it2!=it2E;++it2)
 
  518         it2->second->largeChangesEnd();
 
  522       it3->second->largeChangesEnd();