21#include "GeoModelKernel/GeoVolumeCursor.h"
22#include "GeoModelKernel/GeoShapeShift.h"
23#include "GeoModelKernel/GeoTube.h"
24#include "GeoModelKernel/GeoTubs.h"
26#include <Inventor/nodes/SoSeparator.h>
27#include <Inventor/nodes/SoTransform.h>
28#include <Inventor/nodes/SoSwitch.h>
29#include <Inventor/nodes/SoShape.h>
30#include <Inventor/nodes/SoMaterial.h>
31#include <Inventor/nodes/SoText2.h>
32#include <Inventor/nodes/SoTranslation.h>
44# pragma GCC diagnostic ignored "-Wdeprecated-copy"
115 if (
m_d->commondata) {
117 m_d->commondata->removeZappedVolumesFromGui(
this);
125 m_d->material->unref();
127 m_d->nodesep->unref();
129 m_d->label_sep->unref();
130 m_d->commondata->unref();
146 GeoVolumeCursor av(
m_d->pV);
147 while (!av.atEnd()) {
152 matr.multRight(
m_d->accumTrans);
171 return m_d->pV->getLogVol()->getName().c_str();
177 return m_d->pV->getLogVol()->getName();
183 return m_d->pV->getLogVol()->getName() == n;
190 return m_d->material;
194 SoMaterial * mat =
m_d->commondata->volVisAttributes()->get(
m_d->pV->getLogVol()->getName());
197 m_d->material->ref();
198 return m_d->material;
200 mat =
m_d->commondata->matVisAttributes()->get(
m_d->pV->getLogVol()->getMaterial()->getName());
203 m_d->material->ref();
204 return m_d->material;
211 mat =
m_d->commondata->fallBackTopLevelMaterial();
214 m_d->material->ref();
215 return m_d->material;
220 assert(
m_d->material);
221 m_d->material->ref();
222 return m_d->material;
225 m_d->material =
m_d->commondata->matVisAttributes()->get(
"DEFAULT");
226 assert(
m_d->material);
227 m_d->material->ref();
228 return m_d->material;
241 if (
m_d->nodesep &&
m_d->label_sep)
244 m_d->label_sep =
new SoSeparator;
245 m_d->label_sep->ref();
247 m_d->nodesep =
new SoSeparator;
256 SoNode * shape =
m_d->commondata->toShapeNode(
m_d->pV);
258 m_d->nodesep->removeAllChildren();
259 std::cout <<
"Geomsys/VolumeHandle Error: Null shape!!!"<<std::endl;
264 int iphi =
m_d->commondata->phiSectorManager()->getVolumeType(
m_d->accumTrans, shape);
271 if (
m_d->pV->getLogVol()->getShape()->typeID()==GeoTube::getClassTypeID() )
274 const GeoTube * geotube =
static_cast<const GeoTube*
>(
m_d->pV->getLogVol()->getShape());
275 if (geotube->getRMin()==0.0)
276 shape =
m_d->commondata->getSoCylinderOrientedLikeGeoTube(geotube->getRMax(),geotube->getZHalfLength());
278 else if (
m_d->pV->getLogVol()->getShape()->typeID()==GeoTubs::getClassTypeID() )
281 const GeoTubs * geotubs =
static_cast<const GeoTubs*
>(
m_d->pV->getLogVol()->getShape());
282 if (geotubs->getRMin()==0.0 && geotubs->getDPhi() >= 2*
M_PI-1.0e-6)
283 shape =
m_d->commondata->getSoCylinderOrientedLikeGeoTube(geotubs->getRMax(),geotubs->getZHalfLength());
289 if (
m_d->pV->getLogVol()->getShape()->typeID()==GeoShapeShift::getClassTypeID())
294 m_d->nodesep->addChild(shape);
295 m_d->attachsepHelper =
m_d->commondata->phiSectorManager()->getSepHelperForNode(
m_d->commondata->subSystemFlag(), iphi);
296 m_d->attachlabelSepHelper =
m_d->commondata->phiSectorManager()->getLabelSepHelperForNode(
m_d->commondata->subSystemFlag(), iphi);
298 SoSwitch * sw =
new SoSwitch;
300 SoSeparator * sep_slicedvols =
new SoSeparator;
301 sw->addChild(sep_slicedvols);
303 m_d->nodesep->addChild(sw);
304 m_d->attachsepHelper =
m_d->commondata->phiSectorManager()->registerVolumeAroundZAxis(
m_d->commondata->subSystemFlag(), sw,
m_d->accumTrans );
311 m_d->commondata->registerNodeSepForVolumeHandle(
m_d->nodesep,
this);
331 commondata->volumeBrowser()->scheduleUpdateOfAllNonHiddenIndices();
345 commondata->volumeBrowser()->scheduleUpdateOfAllNonHiddenIndices();
366 m_d->commondata->removeZappedVolumesFromGui(
this);
368 m_d->commondata->addZappedVolumeToGui(
this);
374 assert(!
m_d->isattached);
411 (*childItr)->contractDaughtersRecursively();
432 (*childItr)->m_d->attach(*childItr);
434 (*childItr)->attachAllContractedChildren();
448 (*childItr)->m_d->detach();
450 (*childItr)->detachAllContractedChildren();
457 GeoPVConstLink parent_pV;
459 parent_pV =
m_parent->geoPVConstLink();
461 parent_pV =
m_d->commondata->geoPVConstLinkOfTreeTopsMother();
462 if (parent_pV==
m_d->pV) {
468 GeoVolumeCursor av(parent_pV);
470 while (!av.atEnd()) {
472 std::optional<int> Qint = av.getId();
473 return Qint ? *Qint : -1;
490 return m_d->accumTrans;
496 return m_d->accumTrans;
497 return m_parent->getGlobalTransformToVolume().inverse().multRight(
m_d->accumTrans);
503 return m_d->isattached;
531 (*childItr)->expandMothersRecursivelyToNonEther();
543 buffer.open(QIODevice::WriteOnly);
545 QDataStream out(&buffer);
559 buffer.open(QIODevice::ReadOnly);
560 QDataStream
state(&buffer);
579 m_d->applyChildStates(vs,
this);
587 return m_d->commondata->subSystemFlag();
598 for (it = theclass->
m_children.begin(); it!=itE; ++it) {
612 if (!hasExpandedChildren&&!hasZappedChildren)
615 QMap<quint32,VolState>::const_iterator expItr, expItrEnd = vs.
m_expandedChildren.end();
616 QSet<quint32>::const_iterator zapItr, zapItrEnd = vs.
m_zappedChildren.end();
620 for (it = theclass->
m_children.begin(); it!=itE; ++it) {
621 quint32
id = (*it)->hashID();
623 if (zapItr!=zapItrEnd) {
628 if (expItr!=expItrEnd) {
639 const int n(g->getNumChildren());
640 for (
int i=0; i < n; ++i) {
641 const SoNode*c = g->getChild(i);
642 if (c->getTypeId().isDerivedFrom(SoShape::getClassTypeId())) {
643 if (c->getTypeId().isDerivedFrom(SoPcons::getClassTypeId())
644 ||c->getTypeId().isDerivedFrom(SoPolyhedron::getClassTypeId())
645 ||c->getTypeId().isDerivedFrom(SoTransparency::getClassTypeId()))
647 }
else if (c->getTypeId().isDerivedFrom(SoGroup::getClassTypeId())) {
666 m_d->accumTrans.multDirMatrix(SbVec3f(0,0,1),dir);
673 int labels =
m_d->commondata->controller()->labels();
674 QList<int> offsets =
m_d->commondata->controller()->labelPosOffset();
676 m_d->attachlabelSepHelper->largeChangesBegin();
678 if (
m_d->labels != labels ||
m_d->labelsPosOffsets != offsets){
679 m_d->labels = labels;
680 m_d->labelsPosOffsets = offsets;
681 m_d->label_sep->removeAllChildren ();
683 SoText2 *labelText =
new SoText2;
692 bool singleLabel = (labels&0x2 && !(labels&0x4) && !(labels&0x8))
693 || (labels&0x4 && !(labels&0x2) && !(labels&0x8))
694 || (labels&0x8 && !(labels&0x2) && !(labels&0x4));
696 for (
unsigned int i=0; i<3 ;++i){
698 unsigned int mask=1<<(i+1);
699 if (!(labels&mask))
continue;
705 if (i==0) output+=
"Moore t0=";
706 if (i==1) output+=
"Mboy t0=";
707 if (i==2) output+=
"<unknown>=";
715 for(
const QString&
str : text){
716 QByteArray array =
str.toLatin1();
717 labelText->string.set1Value(row++,array.data());
721 assert(labelTranslate!=0);
723 float labx,laby,labz;
724 labelTranslate->translation.getValue().getValue(labx,laby,labz);
727 labelTranslate->translation.setValue(labx+(offsets[0]*offScale),laby+(offsets[1]*offScale),labz+(offsets[2]*offScale));
729 m_d->label_sep->addChild(labelTranslate);
730 m_d->label_sep->addChild(labelText);
733 m_d->attachlabelSepHelper->largeChangesEnd();
QDataStream & operator<<(QDataStream &out, const VolumeHandle::Imp::VolState &vs)
QDataStream & operator>>(QDataStream &in, VolumeHandle::Imp::VolState &vs)
static void initAllCustomClasses()
static SoTransform * toSoTransform(const HepGeom::Transform3D &, SoTransform *t=0)
static void transformToMatrix(SoTransform *xf, SbMatrix &result)
static void messageDebug(const QString &)
int nExpandedChildren() const
int nZappedChildren() const
QSet< quint32 > m_zappedChildren
QMap< quint32, VolState > m_expandedChildren
const SbMatrix accumTrans
static void applyChildStates(const VolState &, VolumeHandle *theclass)
void attach(VolumeHandle *vh)
static bool hasNonStandardShapeChildren(const SoGroup *g)
VP1ExtraSepLayerHelper * attachlabelSepHelper
VolumeHandleSharedData * commondata
VP1ExtraSepLayerHelper * attachsepHelper
static VolState getChildStates(const VolumeHandle *theclass)
QList< int > labelsPosOffsets
Imp(VolumeHandleSharedData *the_cd, const GeoPVConstLink &the_pV, const SbMatrix &the_ac)
void setState(const VP1GeoFlags::VOLSTATE &state)
bool hasName(const std::string &) const
VolumeHandle(VolumeHandleSharedData *, VolumeHandle *parent, const GeoPVConstLink &, int childNumber, const MuonChamberState &mcs=NONMUONCHAMBER, const SbMatrix &accumTrans=SbMatrix())
bool isMuonChamber() const
bool childrenAreInitialised() const
VolumeHandleList::const_iterator VolumeHandleListConstItr
const SbMatrix & getGlobalTransformToVolume() const
std::string getNameStdString() const
void attachAllContractedChildren()
VP1GeoFlags::VOLSTATE state() const
const GeoMaterial * geoMaterial() const
void initialiseChildren()
void ensureBuildNodeSep()
MuonChamberState m_muonChamberState
void applyPersistifiableState(QByteArray)
SbMatrix getLocalTransformToVolume() const
virtual QString muonChamberT0(unsigned int=0) const
VolumeHandle * topLevelParent()
void contractDaughtersRecursively()
VP1GeoFlags::VOLSTATE m_state
SoSeparator * nodeSoSeparator() const
GeoPVConstLink geoPVConstLink() const
bool haveParentsNotExpanded() const
bool isInitialisedAndHasNonStandardShape() const
void detachAllContractedChildren()
bool isInMuonChamber() const
virtual QString getDescriptiveName() const
VolumeHandleList m_children
void expandMothersRecursivelyToNonEther()
VolumeHandleList::iterator VolumeHandleListItr
const unsigned m_nchildren
VP1GeoFlags::SubSystemFlag subsystem() const
QByteArray getPersistifiableState() const
unsigned nChildren() const
HepGeom::Transform3D EigenTransformToCLHEP(const Amg::Transform3D &eigenTransf)
Converts an Eigen-based Amg::Transform3D into a CLHEP-based HepGeom::Transform3D.