DLG4::VolumeBuilders
A fluent interface for Geant4 geometry definition.
Loading...
Searching...
No Matches
BoxBuilder.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
18#include "VolumeBuilderTypes.hh"
19#include "VolumeBuilder.hh"
21// ReSharper disable once CppUnusedIncludeDirective
22#include <memory>
23
24namespace DLG4::VolumeBuilders {
25 class BoxBuilder;
26 template <typename T>
27 class VolumeBuilder;
29 // See other Derived classes, or better yet the Factories "Topic" in the Doxygen html manual,
30 // For Factories for other types of shapes or sources.
31
46 BoxBuilderPtr CreateBoxBuilder(const G4String &name);
47
56 BoxBuilderPtr CreateBoxBuilder(const G4String &name, G4double unit);
57
71 const G4String &name, G4double x_full_size, G4double y_full_size, G4double z_full_size);
72
85 (G4double unit, const G4String &name, G4double x_full_size, G4double y_full_size,
86 G4double z_full_size);
87
101 const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z,
102 G4double z_delta);
103
117 (G4double unit, const G4String &name, G4double x_full_size, G4double y_full_size,
118 G4double edge_z, G4double z_delta);
119
120
136 const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta,
137 G4double edge_z, G4double z_delta);
138
154 const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta,
155 G4double edge_z, G4double z_delta);
156
171 BoxBuilderPtr CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1, G4double x_edge2,
172 G4double y_edge1,
173 G4double y_edge2, G4double z_edge1, G4double z_edge2);
174
189 BoxBuilderPtr CreateEdgesBoxBuilder(G4double unit, const G4String &name, G4double x_edge1,
190 G4double x_edge2,
191 G4double y_edge1, G4double y_edge2, G4double z_edge1, G4double z_edge2);
192
206 class BoxBuilder final: public VolumeBuilder<BoxBuilder> {
207 public:
209 friend class VolumeBuilder<BoxBuilder>; // shouldn't be needed, maybe isn't now.
210 template <typename T>
211 friend class i_shared_ptr; // needed in principle, but maybe not for this class.
212
213 // Friend all the factories. Keeping them external is easier for users, but more boilerplate.
214 friend BoxBuilderPtr CreateBoxBuilder(const G4String &name);
215 friend BoxBuilderPtr CreateBoxBuilder(const G4String &name, G4double unit);
216 friend BoxBuilderPtr CreateDeltasBoxBuilder(const G4String &name, G4double edge_x,
217 G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z, G4double z_delta);
218 friend BoxBuilderPtr CreateDeltasBoxBuilder(G4double unit, const G4String &name,
219 G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z,
220 G4double z_delta);
221 friend BoxBuilderPtr CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size,
222 G4double y_full_size, G4double edge_z, G4double z_delta);
223 friend BoxBuilderPtr CreateZDeltaBoxBuilder(G4double unit, const G4String &name,
224 G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta);
225 friend BoxBuilderPtr CreateCenteredBoxBuilder(const G4String &name, G4double x_full_size,
226 G4double y_full_size, G4double z_full_size);
227 friend BoxBuilderPtr CreateCenteredBoxBuilder(G4double unit, const G4String &name,
228 G4double x_full_size, G4double y_full_size, G4double z_full_size);
229 friend BoxBuilderPtr CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1,
230 G4double x_edge2, G4double y_edge1, G4double y_edge2, G4double z_edge1,
231 G4double z_edge2);
232 friend BoxBuilderPtr CreateEdgesBoxBuilder(G4double unit, const G4String &name,
233 G4double x_edge1, G4double x_edge2, G4double y_edge1, G4double y_edge2,
234 G4double z_edge1, G4double z_edge2);
235
236 BoxBuilderPtr SetXSize(G4double x_size);
237 BoxBuilderPtr SetYSize(G4double y_size);
238 BoxBuilderPtr SetZSize(G4double z_size);
239
240 BoxBuilderPtr SetXEdges(G4double x_edge1, G4double x_edge2);
241 BoxBuilderPtr SetYEdges(G4double y_edge1, G4double y_edge2);
242 BoxBuilderPtr SetZEdges(G4double z_edge1, G4double z_edge2);
243
244 BoxBuilderPtr SetXEdgeDelta(G4double x_edge, G4double x_delta);
245 BoxBuilderPtr SetYEdgeDelta(G4double y_edge, G4double y_delta);
246 BoxBuilderPtr SetZEdgeDelta(G4double z_edge, G4double z_delta);
247
248 BoxBuilderPtr SetInternalOffset(G4double x, G4double y, G4double z);
249
250 // BoxBuilder method overloads with a leading `unit` parameter.
251 // These allow for a per-call unit override.
252
253 BoxBuilderPtr SetXSize(G4double unit, G4double x_size);
254 BoxBuilderPtr SetYSize(G4double unit, G4double y_size);
255 BoxBuilderPtr SetZSize(G4double unit, G4double z_size);
256
257 BoxBuilderPtr SetXEdges(G4double unit, G4double x_edge1, G4double x_edge2);
258 BoxBuilderPtr SetYEdges(G4double unit, G4double y_edge1, G4double y_edge2);
259 BoxBuilderPtr SetZEdges(G4double unit, G4double z_edge1, G4double z_edge2);
260
261 BoxBuilderPtr SetXEdgeDelta(G4double unit, G4double x_edge, G4double x_delta);
262 BoxBuilderPtr SetYEdgeDelta(G4double unit, G4double y_edge, G4double y_delta);
263 BoxBuilderPtr SetZEdgeDelta(G4double unit, G4double z_edge, G4double z_delta);
264
265 BoxBuilderPtr SetInternalOffset(G4double unit, G4double x, G4double y, G4double z);
266
267 private:
268 BoxBuilderPtr SetXSizeDimensioned(G4double x_size);
269 BoxBuilderPtr SetYSizeDimensioned(G4double y_size);
270 BoxBuilderPtr SetZSizeDimensioned(G4double z_size);
271 BoxBuilderPtr SetInternalOffsetDimensioned(G4double x, G4double y, G4double z);
272
273 protected:
275 G4VSolid *SolidConstructor(const G4String &name) override;
276
277 private:
278 explicit BoxBuilder(const G4String &name);
279
280 BoxBuilder(const BoxBuilder &other);
281
282 // offset of box from center. This effectively redefines the center of the solid
283 // as far as the builder behavior.
284 G4double z_size_{};
285 G4double x_size_{};
286 G4double y_size_{};
287 G4double unit_{};
288
289
290 BoxBuilder() = default;
291 BoxBuilder(BoxBuilder &&) noexcept = delete;
292
293 // BoxBuilderPtr Clone() const override {
294 // return BoxBuilderPtr(new BoxBuilder(*this));
295 // }
296 };
297}
Builder class for simple Box solids.
friend BoxBuilderPtr CreateCenteredBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double z_full_size)
Create a Box solid.
BoxBuilderPtr SetXSize(G4double x_size)
friend BoxBuilderPtr CreateDeltasBoxBuilder(const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z, G4double z_delta)
Create a Box solid.
Definition BoxBuilder.cc:56
friend BoxBuilderPtr CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1, G4double x_edge2, G4double y_edge1, G4double y_edge2, G4double z_edge1, G4double z_edge2)
Create a Box solid from edge coordinates.
G4VSolid * SolidConstructor(const G4String &name) override
The polymorphic Solid constructor.
friend BoxBuilderPtr CreateBoxBuilder(const G4String &name)
Definition BoxBuilder.cc:32
BoxBuilderPtr SetZSize(G4double z_size)
BoxBuilderPtr SetInternalOffset(G4double x, G4double y, G4double z)
BoxBuilderPtr SetZEdgeDelta(G4double z_edge, G4double z_delta)
BoxBuilderPtr SetXEdgeDelta(G4double x_edge, G4double x_delta)
BoxBuilderPtr SetYEdgeDelta(G4double y_edge, G4double y_delta)
BoxBuilderPtr SetXEdges(G4double x_edge1, G4double x_edge2)
BoxBuilderPtr SetYEdges(G4double y_edge1, G4double y_edge2)
friend BoxBuilderPtr CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta)
Create a Box solid.
Definition BoxBuilder.cc:82
BoxBuilderPtr SetYSize(G4double y_size)
BoxBuilderPtr SetZEdges(G4double z_edge1, G4double z_edge2)
A polymorphic, type-erased builder referencing any specialized builder.
VolumeBuilder: Common functionality for volume builder classes.
A wrapper for std::shared_ptr that allows and facilitates many implicit(i) type conversions.
BoxBuilderPtr CreateCenteredBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double z_full_size)
Create a Box solid.
BoxBuilderPtr CreateDeltasBoxBuilder(const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z, G4double z_delta)
Create a Box solid.
Definition BoxBuilder.cc:56
BoxBuilderPtr CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1, G4double x_edge2, G4double y_edge1, G4double y_edge2, G4double z_edge1, G4double z_edge2)
Create a Box solid from edge coordinates.
BoxBuilderPtr CreateBoxBuilder(const G4String &name)
Definition BoxBuilder.cc:32
BoxBuilderPtr CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta)
Create a Box solid.
Definition BoxBuilder.cc:82