Method to decompose the Bounds into boundarySurfaces.
68 {
69
70
71 std::vector<std::unique_ptr<Trk::Surface>> outerSurfaces =
72 m_outer->volumeBounds().decomposeToSurfaces(transf *
m_outer->transform());
73
74 std::vector<std::unique_ptr<Trk::Surface>> innerSurfaces =
75 m_inner->volumeBounds().decomposeToSurfaces(transf *
m_inner->transform());
76 std::vector<unsigned int> subtrInner;
77
78
79 auto retsf = std::vector<std::unique_ptr<Trk::Surface>>();
80
81 unsigned int nSurf = outerSurfaces.size() + innerSurfaces.size();
83
84 const Trk::CylinderVolumeBounds* cylVol =
dynamic_cast<const Trk::CylinderVolumeBounds*
>(&(
m_outer->volumeBounds()));
85 const Trk::SimplePolygonBrepVolumeBounds* spbVol =
dynamic_cast<const Trk::SimplePolygonBrepVolumeBounds*
>(&(
m_outer->volumeBounds()));
86 const Trk::CombinedVolumeBounds* comVol =
dynamic_cast<const Trk::CombinedVolumeBounds*
>(&(
m_outer->volumeBounds()));
87 const Trk::SubtractedVolumeBounds* subVol =
dynamic_cast<const Trk::SubtractedVolumeBounds*
>(&(
m_outer->volumeBounds()));
88
89
90 for (
unsigned int out = 0;
out < outerSurfaces.size();
out++) {
91 const SubtractedPlaneSurface* splo =
dynamic_cast<const SubtractedPlaneSurface*
>(outerSurfaces[
out].get());
92 const PlaneSurface* plo =
dynamic_cast<const PlaneSurface*
>(outerSurfaces[
out].get());
93 const SubtractedCylinderSurface* sclo =
dynamic_cast<const SubtractedCylinderSurface*
>(outerSurfaces[
out].get());
94 const CylinderSurface* clo =
dynamic_cast<const CylinderSurface*
>(outerSurfaces[
out].get());
95 const DiscSurface* dlo =
dynamic_cast<const DiscSurface*
>(outerSurfaces[
out].get());
96
97 if (!(splo || plo || sclo || clo || dlo)) {
98 throw std::runtime_error("Unhandled surface.");
99 }
100
101
102 if (comVol){
104 }
105 else if (subVol){
107 }
108 else if (cylVol && clo && out == 3){
110 }
111 else if (spbVol && out == 0){
113 }
114 else{
116 }
117
120
121 if (splo || sclo) {
122 const Trk::AreaExcluder* vEx;
123 bool shared = false;
124 if (splo) {
125 vEx = splo->subtractedVolume();
126 shared = splo->shared();
127 }
128 if (sclo) {
129 vEx = sclo->subtractedVolume();
130 shared = sclo->shared();
131 }
132 const Trk::VolumeExcluder* volExcl = dynamic_cast<const Trk::VolumeExcluder*>(vEx);
133 if (!volExcl){
134 throw std::logic_error("Not a VolumeExcluder");
135 }
136
137 auto outerSub = std::make_unique<Trk::Volume>(*volExcl->
volume());
138 std::unique_ptr<Trk::Volume> comb_sub;
139 if (!shared){
140 comb_sub = std::make_unique<Trk::Volume>(
141 nullptr,
142 std::make_shared<Trk::CombinedVolumeBounds>(std::move(innerSub), std::move(outerSub), false));
143 } else {
144 comb_sub = std::make_unique<Trk::Volume>(
145 nullptr,
146 std::make_shared<Trk::SubtractedVolumeBounds>(std::move(outerSub), std::move(innerSub)));
147 }
148 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(comb_sub));
149 if (splo){
150 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*splo, std::move(volEx), shared));
151 }
152 else if (sclo){
153 retsf.push_back(
154 std::make_unique<Trk::SubtractedCylinderSurface>(*sclo, std::move(volEx), shared));
155 }
156 } else {
157 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(innerSub));
158 if (plo){
159 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*plo, std::move(volEx), false));
160 }
161 else if (clo){
162 retsf.push_back(std::make_unique<Trk::SubtractedCylinderSurface>(*clo, std::move(volEx), false));
163 }
164 else if (dlo) {
165
166 const DiscBounds*
db =
dynamic_cast<const DiscBounds*
>(&(dlo->bounds()));
167 if (!db){
168 throw std::logic_error("Not DiscBounds");
169 }
170 auto eb = std::make_shared<EllipseBounds>(
db->rMin(),
db->rMin(),
db->rMax(),
db->rMax(),
db->halfPhiSector());
172 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(ploA, std::move(volEx), false));
173 }
174 }
175 }
176
177
178
179
180 cylVol =
dynamic_cast<const Trk::CylinderVolumeBounds*
>(&(
m_inner->volumeBounds()));
181 spbVol =
dynamic_cast<const Trk::SimplePolygonBrepVolumeBounds*
>(&(
m_inner->volumeBounds()));
182 comVol =
dynamic_cast<const Trk::CombinedVolumeBounds*
>(&(
m_inner->volumeBounds()));
183 subVol =
dynamic_cast<const Trk::SubtractedVolumeBounds*
>(&(
m_inner->volumeBounds()));
184 unsigned int nOut = outerSurfaces.size();
185
186 for (unsigned int in = 0; in < innerSurfaces.size(); in++) {
187 const SubtractedPlaneSurface* spli = dynamic_cast<const SubtractedPlaneSurface*>(innerSurfaces[in].get());
188 const PlaneSurface* pli = dynamic_cast<const PlaneSurface*>(innerSurfaces[in].get());
189 const SubtractedCylinderSurface* scli = dynamic_cast<const SubtractedCylinderSurface*>(innerSurfaces[in].get());
190 const CylinderSurface* cli = dynamic_cast<const CylinderSurface*>(innerSurfaces[in].get());
191 const DiscSurface* dli = dynamic_cast<const DiscSurface*>(innerSurfaces[in].get());
192
193
194 if (comVol){
196 }
197 else if (subVol){
199 }
200 else if (cylVol && cli && in == 3){
202 }
203 else if (spbVol && in == 0){
205 }
206 else{
208 }
209
212
213 if (spli || scli) {
214 bool shared = false;
215 const Trk::AreaExcluder* vEx;
216 if (spli) {
217 vEx = spli->subtractedVolume();
218 shared = spli->shared();
219 }
220 if (scli) {
221 vEx = scli->subtractedVolume();
222 shared = scli->shared();
223 }
224 const Trk::VolumeExcluder* volExcl = dynamic_cast<const Trk::VolumeExcluder*>(vEx);
225 if (!volExcl){
226 throw std::logic_error("Not a VolumeExcluder");
227 }
228
229 auto innerSub = std::make_unique<Trk::Volume>(*volExcl->
volume());
230
231 std::unique_ptr<Trk::Volume> comb_sub;
232 if (!shared){
233 comb_sub = std::make_unique<Trk::Volume>(
234 nullptr,
235 std::make_shared<Trk::SubtractedVolumeBounds>(std::move(outerSub), std::move(innerSub)));
236 }
237 else{
238 comb_sub = std::make_unique<Trk::Volume>(
239 nullptr,
240 std::make_shared<Trk::CombinedVolumeBounds>(std::move(innerSub), std::move(outerSub), true));
241 }
242 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(comb_sub));
243 if (spli){
244 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*spli, std::move(volEx), true));
245 }
246 else if (scli){
247 retsf.push_back(std::make_unique<Trk::SubtractedCylinderSurface>(*scli, std::move(volEx), true));
248 }
249
250 } else if (pli || cli) {
251 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(outerSub));
252 if (pli){
253 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*pli, std::move(volEx), true));
254 }
255 else if (cli){
256 retsf.push_back(std::make_unique<Trk::SubtractedCylinderSurface>(*cli, std::move(volEx), true));
257 }
258 } else if (dli) {
259
260 const DiscBounds*
db =
dynamic_cast<const DiscBounds*
>(&(dli->bounds()));
261 if (!db){
262 throw std::logic_error("Not DiscBounds");
263 }
264 auto eb = std::make_shared<EllipseBounds>(
db->rMin(),
db->rMin(),
db->rMax(),
db->rMax(),
db->halfPhiSector());
266 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(outerSub));
267 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(pla, std::move(volEx), true));
268 } else {
269 throw std::runtime_error(
270 "Unhandled surface in "
271 "Trk::SubtractedVolumeBounds::decomposeToSurfaces.");
272 }
273 }
274
275 return retsf;
276}
const std::vector< bool > & boundsOrientation() const
This method returns bounds orientation.
const std::vector< bool > & boundsOrientation() const
This method returns bounds orientation.
static Trk::Volume * createSubtractedVolume(const Amg::Transform3D &transf, Trk::Volume *subtrVol)
const Volume * volume() const
Acces the subtracted volume.
Eigen::Affine3d Transform3D
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.