GeoModel - GeoModelCore
GeoPolyhedrizeAction.cxx
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "GeoModelKernel/GeoPolyhedrizeAction.h"
6 #include "GeoModelKernel/GeoPolyhedron.h"
7 #include "GeoModelKernel/GeoShapeShift.h"
8 #include "GeoModelKernel/GeoShapeIntersection.h"
9 #include "GeoModelKernel/GeoShapeUnion.h"
10 #include "GeoModelKernel/GeoShapeSubtraction.h"
11 #include "GeoModelKernel/GeoBox.h"
12 #include "GeoModelKernel/GeoCons.h"
13 #include "GeoModelKernel/GeoPcon.h"
14 #include "GeoModelKernel/GeoPgon.h"
15 #include "GeoModelKernel/GeoTrap.h"
16 #include "GeoModelKernel/GeoTrd.h"
17 #include "GeoModelKernel/GeoTube.h"
18 #include "GeoModelKernel/GeoTubs.h"
19 #include "GeoModelKernel/GeoPara.h"
20 
21 GeoPolyhedrizeAction::GeoPolyhedrizeAction()
22  : m_polyhedron(nullptr)
23 {
24  setDepthLimit(0);
25 }
26 
27 GeoPolyhedrizeAction::~GeoPolyhedrizeAction()
28 {
29  delete m_polyhedron;
30 }
31 
32 void GeoPolyhedrizeAction::handleShift (const GeoShapeShift *shift)
33 {
34  shift->getOp()->exec(this);
35  m_polyhedron->Transform (shift->getX().matrix().block<3,3>(0,0), shift->getX().translation());
36 }
37 
38 void GeoPolyhedrizeAction::handleUnion (const GeoShapeUnion *unio)
39 {
40  GeoPolyhedrizeAction auxA,auxB;
41  unio->getOpA()->exec(&auxA);
42  unio->getOpB()->exec(&auxB);
43  m_polyhedron = new GeoPolyhedron(auxA.getPolyhedron()->add(*auxB.getPolyhedron()));
44 }
45 
46 void GeoPolyhedrizeAction::handleIntersection (const GeoShapeIntersection *isect)
47 {
48  GeoPolyhedrizeAction auxA,auxB;
49  isect->getOpA()->exec(&auxA);
50  isect->getOpB()->exec(&auxB);
51  m_polyhedron=new GeoPolyhedron(auxA.getPolyhedron()->intersect(*auxB.getPolyhedron()));
52 }
53 
54 void GeoPolyhedrizeAction::handleSubtraction (const GeoShapeSubtraction *subtract)
55 {
56  GeoPolyhedrizeAction auxA,auxB;
57  subtract->getOpA()->exec(&auxA);
58  subtract->getOpB()->exec(&auxB);
59  m_polyhedron=new GeoPolyhedron(auxA.getPolyhedron()->subtract(*auxB.getPolyhedron()));
60 }
61 
62 void GeoPolyhedrizeAction::handleBox (const GeoBox *box)
63 {
64  m_polyhedron=new GeoPolyhedronBox (box->getXHalfLength(),
65  box->getYHalfLength(),
66  box->getZHalfLength());
67 }
68 
69 void GeoPolyhedrizeAction::handleCons (const GeoCons *cons)
70 {
71  m_polyhedron = new GeoPolyhedronCons (cons->getRMin1(),
72  cons->getRMax1(),
73  cons->getRMin2(),
74  cons->getRMax2(),
75  cons->getDZ(),
76  cons->getSPhi(),
77  cons->getDPhi());
78 }
79 
80 void GeoPolyhedrizeAction::handlePara (const GeoPara *para)
81 {
82  m_polyhedron=new GeoPolyhedronPara(para->getXHalfLength(),
83  para->getYHalfLength(),
84  para->getZHalfLength(),
85  para->getAlpha(),
86  para->getTheta(),
87  para->getPhi());
88 }
89 
90 void GeoPolyhedrizeAction::handlePcon (const GeoPcon *pcon)
91 {
92  double *z = new double[pcon->getNPlanes ()];
93  double *rmn = new double[pcon->getNPlanes ()];
94  double *rmx = new double[pcon->getNPlanes ()];
95 
96  for (unsigned int s = 0; s < pcon->getNPlanes (); s++)
97  {
98  z[s] = pcon->getZPlane (s);
99  rmn[s] = pcon->getRMinPlane (s);
100  rmx[s] = pcon->getRMaxPlane (s);
101  }
102  m_polyhedron = new GeoPolyhedronPcon (pcon->getSPhi(), pcon->getDPhi(), pcon->getNPlanes (), z, rmn, rmx);
103 
104  delete[]z;
105  delete[]rmn;
106  delete[]rmx;
107 }
108 
109 void GeoPolyhedrizeAction::handlePgon (const GeoPgon *pgon)
110 {
111  double *z = new double[pgon->getNPlanes ()];
112  double *rmn = new double[pgon->getNPlanes ()];
113  double *rmx = new double[pgon->getNPlanes ()];
114 
115  for (unsigned int s = 0; s < pgon->getNPlanes (); s++)
116  {
117  z[s] = pgon->getZPlane (s);
118  rmn[s] = pgon->getRMinPlane (s);
119  rmx[s] = pgon->getRMaxPlane (s);
120  }
121  m_polyhedron = new GeoPolyhedronPgon (pgon->getSPhi(), pgon->getDPhi(), pgon->getNSides(), pgon->getNPlanes (), z, rmn, rmx);
122 
123  delete[]z;
124  delete[]rmn;
125  delete[]rmx;
126 }
127 
128 void GeoPolyhedrizeAction::handleTrap (const GeoTrap *trap)
129 {
130  m_polyhedron = new GeoPolyhedronTrap (trap->getZHalfLength(),
131  trap->getTheta(),
132  trap->getPhi(),
133  trap->getDydzn(),
134  trap->getDxdyndzn(),
135  trap->getDxdypdzn(), 0,
136  trap->getDydzp(),
137  trap->getDxdyndzp(),
138  trap->getDxdypdzp(),0);
139 }
140 
141 void GeoPolyhedrizeAction::handleTrd (const GeoTrd *trd)
142 {
143  m_polyhedron = new GeoPolyhedronTrd2 (trd->getXHalfLength1(),
144  trd->getXHalfLength2(),
145  trd->getYHalfLength1(),
146  trd->getYHalfLength2(),
147  trd->getZHalfLength());
148 }
149 
150 void GeoPolyhedrizeAction::handleTube (const GeoTube *tube)
151 {
152  m_polyhedron = new GeoPolyhedronTube (tube->getRMin(),
153  tube->getRMax(),
154  tube->getZHalfLength());
155 }
156 
157 void GeoPolyhedrizeAction::handleTubs (const GeoTubs *tubs)
158 {
159  m_polyhedron= new GeoPolyhedronTubs (tubs->getRMin(),
160  tubs->getRMax(),
161  tubs->getZHalfLength(),
162  tubs->getSPhi(),
163  tubs->getDPhi());
164 }
165 
166 const GeoPolyhedron * GeoPolyhedrizeAction::getPolyhedron () const
167 {
168  return m_polyhedron;
169 }
Definition: GeoTrd.h:10
This action polyhedrizes a shape. This includes, for example, boolean shapes. A polhyedral representa...
This shape represents a polycone. Specify the starting angle and delta angle (subtended angle) of the...
Definition: GeoPcon.h:20
Definition: GeoBox.h:10
This shape represents a very general trapezoid.
Definition: GeoTrap.h:16