DLG4::VolumeBuilders
A fluent interface for Geant4 geometry definition.
Loading...
Searching...
No Matches
BoxBuilderCore.hh
Go to the documentation of this file.
1#pragma once
2
3/*
4 * BoxBuilder.hh
5 *
6 * Created on: Jun 19, 2024
7 * Author: D. S. Leonard
8 *
9 *
10 *
11 */
12
19#include "VolumeBuilderBase.hh"
21// ReSharper disable once CppUnusedIncludeDirective
22#include <memory>
23
24namespace DLG4::VolumeBuilders {
25 // See other Derived classes, or better yet the Factories "Topic" in the Doxygen html manual,
26 // For Factories for other types of shapes or sources.
27
42 BoxBuilder CreateBoxBuilder(const G4String &name);
43
52 BoxBuilder CreateBoxBuilder(const G4String &name, G4double unit);
53
67 const G4String &name, G4double x_full_size, G4double y_full_size, G4double z_full_size);
68
81 (G4double unit, const G4String &name, G4double x_full_size, G4double y_full_size,
82 G4double z_full_size);
83
97 const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z,
98 G4double z_delta);
99
113 (G4double unit, const G4String &name, G4double x_full_size, G4double y_full_size,
114 G4double edge_z, G4double z_delta);
115
116
132 const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta,
133 G4double edge_z, G4double z_delta);
134
150 const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta,
151 G4double edge_z, G4double z_delta);
152
167 BoxBuilder CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1, G4double x_edge2,
168 G4double y_edge1,
169 G4double y_edge2, G4double z_edge1, G4double z_edge2);
170
185 BoxBuilder CreateEdgesBoxBuilder(G4double unit, const G4String &name, G4double x_edge1,
186 G4double x_edge2,
187 G4double y_edge1, G4double y_edge2, G4double z_edge1, G4double z_edge2);
188
191}
192
194
204 class BoxBuilderCore final: public VolumeBuilderBase<BoxBuilderCore> {
205 public:
206 friend class VolumeBuilderCore;
207 friend class VolumeBuilderBase<BoxBuilderCore>; // shouldn't be needed, maybe isn't now.
208 template <typename T>
209 friend class i_shared_ptr; // needed in principle, but maybe not for this class.
210
211 // Friend all the factories. Keeping them external is easier for users, but more boilerplate.
212 friend BoxBuilder VB::CreateBoxBuilder(const G4String &name);
213 friend BoxBuilder VB::CreateBoxBuilder(const G4String &name, G4double unit);
214 friend BoxBuilder VB::CreateDeltasBoxBuilder(const G4String &name, G4double edge_x,
215 G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z, G4double z_delta);
216 friend BoxBuilder VB::CreateDeltasBoxBuilder(G4double unit, const G4String &name,
217 G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z,
218 G4double z_delta);
219 friend BoxBuilder VB::CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size,
220 G4double y_full_size, G4double edge_z, G4double z_delta);
221 friend BoxBuilder VB::CreateZDeltaBoxBuilder(G4double unit, const G4String &name,
222 G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta);
223 friend BoxBuilder VB::CreateCenteredBoxBuilder(const G4String &name, G4double x_full_size,
224 G4double y_full_size, G4double z_full_size);
225 friend BoxBuilder VB::CreateCenteredBoxBuilder(G4double unit, const G4String &name,
226 G4double x_full_size, G4double y_full_size, G4double z_full_size);
227 friend BoxBuilder VB::CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1,
228 G4double x_edge2, G4double y_edge1, G4double y_edge2, G4double z_edge1,
229 G4double z_edge2);
230 friend BoxBuilder VB::CreateEdgesBoxBuilder(G4double unit, const G4String &name,
231 G4double x_edge1, G4double x_edge2, G4double y_edge1, G4double y_edge2,
232 G4double z_edge1, G4double z_edge2);
233
234 BoxBuilder SetXSize(G4double x_size);
235 BoxBuilder SetYSize(G4double y_size);
236 BoxBuilder SetZSize(G4double z_size);
237
238 BoxBuilder SetXEdges(G4double x_edge1, G4double x_edge2);
239 BoxBuilder SetYEdges(G4double y_edge1, G4double y_edge2);
240 BoxBuilder SetZEdges(G4double z_edge1, G4double z_edge2);
241
242 BoxBuilder SetXEdgeDelta(G4double x_edge, G4double x_delta);
243 BoxBuilder SetYEdgeDelta(G4double y_edge, G4double y_delta);
244 BoxBuilder SetZEdgeDelta(G4double z_edge, G4double z_delta);
245
246 BoxBuilder SetInternalOffset(G4double x, G4double y, G4double z);
247
248 // BoxBuilder method overloads with a leading `unit` parameter.
249 // These allow for a per-call unit override.
250
251 BoxBuilder SetXSize(G4double unit, G4double x_size);
252 BoxBuilder SetYSize(G4double unit, G4double y_size);
253 BoxBuilder SetZSize(G4double unit, G4double z_size);
254
255 BoxBuilder SetXEdges(G4double unit, G4double x_edge1, G4double x_edge2);
256 BoxBuilder SetYEdges(G4double unit, G4double y_edge1, G4double y_edge2);
257 BoxBuilder SetZEdges(G4double unit, G4double z_edge1, G4double z_edge2);
258
259 BoxBuilder SetXEdgeDelta(G4double unit, G4double x_edge, G4double x_delta);
260 BoxBuilder SetYEdgeDelta(G4double unit, G4double y_edge, G4double y_delta);
261 BoxBuilder SetZEdgeDelta(G4double unit, G4double z_edge, G4double z_delta);
262
263 BoxBuilder SetInternalOffset(G4double unit, G4double x, G4double y, G4double z);
264
265 private:
266 BoxBuilder SetXSizeDimensioned(G4double x_size);
267 BoxBuilder SetYSizeDimensioned(G4double y_size);
268 BoxBuilder SetZSizeDimensioned(G4double z_size);
269 BoxBuilder SetInternalOffsetDimensioned(G4double x, G4double y, G4double z);
270
271 protected:
273 G4VSolid *SolidConstructor(const G4String &name) override;
274
275 private:
276 explicit BoxBuilderCore(const G4String &name);
277
278 BoxBuilderCore(const BoxBuilderCore &other);
279
280 // offset of box from center. This effectively redefines the center of the solid
281 // as far as the builder behavior.
282 G4double z_size_{};
283 G4double x_size_{};
284 G4double y_size_{};
285 G4double unit_{};
286
287
288 BoxBuilderCore() = default;
289 BoxBuilderCore(BoxBuilderCore &&) noexcept = delete;
290
291 // BoxBuilder Clone() const override {
292 // return BoxBuilder(new BoxBuilderCore(*this));
293 // }
294 };
295}
Builder class for simple Box solids.
BoxBuilder SetZEdges(G4double z_edge1, G4double z_edge2)
BoxBuilder SetYEdgeDelta(G4double y_edge, G4double y_delta)
G4VSolid * SolidConstructor(const G4String &name) override
The polymorphic Solid constructor.
BoxBuilder SetInternalOffset(G4double x, G4double y, G4double z)
BoxBuilder SetXEdgeDelta(G4double x_edge, G4double x_delta)
BoxBuilder SetZEdgeDelta(G4double z_edge, G4double z_delta)
BoxBuilder SetYEdges(G4double y_edge1, G4double y_edge2)
BoxBuilder SetXEdges(G4double x_edge1, G4double x_edge2)
VolumeBuilder: Common functionality for volume builder classes.
A polymorphic, type-erased "view" of any specialized builder.
BoxBuilder CreateEdgesBoxBuilder(const G4String &name, const G4double x_edge1, const G4double x_edge2, const G4double y_edge1, const G4double y_edge2, const G4double z_edge1, const G4double z_edge2)
Create a Box solid from edge coordinates.
BoxBuilder CreateZDeltaBoxBuilder(const G4double unit, const G4String &name, const G4double x_full_size, const G4double y_full_size, const G4double edge_z, const G4double z_delta)
Create a Box solid.
BoxBuilder CreateDeltasBoxBuilder(const G4double unit, const G4String &name, const G4double edge_x, const G4double x_delta, const G4double edge_y, const G4double y_delta, const G4double edge_z, const G4double z_delta)
Create a Box solid.
BoxBuilder CreateCenteredBoxBuilder(const G4double unit, const G4String &name, const G4double x_full_size, const G4double y_full_size, const G4double z_full_size)
Create a Box solid.
BoxBuilder CreateBoxBuilder(const G4String &name)
Create an unconfigured Box Solid, for use with SetXEdges() etc... Uses the global default unit unless...
_internals_::BoxBuilder BoxBuilder
Shared pointer to _internals_::BoxBuilderCore.