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();