13#include <G4Polycone.hh>
14#include <G4Polyhedra.hh>
40 object->SetDefaultUnit(unit);
46 const G4double edge_x,
47 const G4double x_delta,
48 const G4double edge_y,
const G4double y_delta,
const G4double edge_z,
49 const G4double z_delta) {
51 object->SetXEdgeDelta(unit, edge_x, x_delta)
52 ->SetYEdgeDelta(unit, edge_y, y_delta)
53 ->SetZEdgeDelta(unit, edge_z, z_delta);
58 const G4double x_delta,
59 const G4double edge_y,
60 const G4double y_delta,
const G4double edge_z,
const G4double z_delta) {
62 object->SetXEdgeDelta(edge_x, x_delta)
63 ->SetYEdgeDelta(edge_y, y_delta)
64 ->SetZEdgeDelta(edge_z, z_delta);
69 const G4double x_full_size,
70 const G4double y_full_size,
71 const G4double edge_z,
const G4double z_delta) {
72 if (x_full_size <= 0 || y_full_size <= 0) {
73 throw std::invalid_argument(
"Error in CreateZDeltaBoxBuilder(): for volume " + name
74 +
": Sizes provided without end offsets must be positive.\n");
77 object->SetXSize(unit, x_full_size)
78 ->SetYSize(unit, y_full_size)
79 ->SetZEdgeDelta(unit, edge_z, z_delta);
84 const G4double y_full_size,
const G4double edge_z,
85 const G4double z_delta) {
86 if (x_full_size <= 0 || y_full_size <= 0) {
87 throw std::invalid_argument(
"Error in CreateZDeltaBoxBuilder(): for volume " + name
88 +
": Sizes provided without end offsets must be positive.\n");
91 object->SetXSize(x_full_size)
92 ->SetYSize(y_full_size)
93 ->SetZEdgeDelta(edge_z, z_delta);
98 const G4double x_full_size,
const G4double y_full_size,
99 const G4double z_full_size) {
100 if (x_full_size <= 0 || y_full_size <= 0 || z_full_size <= 0) {
101 throw std::invalid_argument(
"Error in CreateCenteredBoxBuilder(): for volume " + name
102 +
": Sizes provided must be positive.\n");
105 object->SetXSize(unit, x_full_size)
106 ->SetYSize(unit, y_full_size)
107 ->SetZSize(unit, z_full_size);
112 const G4double y_full_size,
113 const G4double z_full_size) {
114 if (x_full_size <= 0 || y_full_size <= 0 || z_full_size <= 0) {
115 throw std::invalid_argument(
"Error in CreateCenteredBoxBuilder(): for volume " + name
116 +
": Sizes provided must be positive.\n");
119 object->SetXSize(x_full_size)
120 ->SetYSize(y_full_size)
121 ->SetZSize(z_full_size);
126 const G4double x_edge2,
const G4double y_edge1,
127 const G4double y_edge2,
const G4double z_edge1,
const G4double z_edge2) {
129 object->SetXEdges(x_edge1, x_edge2)
130 ->SetYEdges(y_edge1, y_edge2)
131 ->SetZEdges(z_edge1, z_edge2);
136 const G4double x_edge1,
const G4double x_edge2,
137 const G4double y_edge1,
const G4double y_edge2,
const G4double z_edge1,
138 const G4double z_edge2) {
140 object->SetXEdges(unit, x_edge1, x_edge2)
141 ->SetYEdges(unit, y_edge1, y_edge2)
142 ->SetZEdges(unit, z_edge1, z_edge2);
148 BoxBuilderPtr BoxBuilder::SetXSizeDimensioned(
const G4double size) {
153 BoxBuilderPtr BoxBuilder::SetYSizeDimensioned(
const G4double size) {
158 BoxBuilderPtr BoxBuilder::SetZSizeDimensioned(
const G4double size) {
163 BoxBuilderPtr BoxBuilder::SetInternalOffsetDimensioned(
const G4double x,
const G4double y,
165 this->builder_configs_->internal_offset = G4ThreeVector(x, y, z);
166 PropagateTransform();
214 return SetXSizeDimensioned(x_size * unit);
218 return SetYSizeDimensioned(y_size * unit);
222 return SetZSizeDimensioned(z_size * unit);
227 const G4double x_edge2) {
228 G4double size = std::abs(x_edge2 - x_edge1);
229 G4double offset = (x_edge1 + x_edge2) / 2.0;
230 SetXSizeDimensioned(size * unit);
231 return SetInternalOffsetDimensioned(
233 this->builder_configs_->internal_offset.y(),
234 this->builder_configs_->internal_offset.z()
239 const G4double y_edge2) {
240 G4double size = std::abs(y_edge2 - y_edge1);
241 G4double offset = (y_edge1 + y_edge2) / 2.0;
242 SetYSizeDimensioned(size * unit);
243 return SetInternalOffsetDimensioned(
244 this->builder_configs_->internal_offset.x(),
246 this->builder_configs_->internal_offset.z()
251 const G4double z_edge2) {
252 G4double size = std::abs(z_edge2 - z_edge1);
253 G4double offset = (z_edge1 + z_edge2) / 2.0;
254 SetZSizeDimensioned(size * unit);
255 return SetInternalOffsetDimensioned(
256 this->builder_configs_->internal_offset.x(),
257 this->builder_configs_->internal_offset.y(),
264 const G4double x_delta) {
265 G4double size = std::abs(x_delta);
266 G4double offset = x_edge + x_delta / 2.0;
267 SetXSizeDimensioned(size * unit);
268 return SetInternalOffsetDimensioned(
270 this->builder_configs_->internal_offset.y(),
271 this->builder_configs_->internal_offset.z()
276 const G4double y_delta) {
277 G4double size = std::abs(y_delta);
278 G4double offset = y_edge + y_delta / 2.0;
279 SetYSizeDimensioned(size * unit);
280 return SetInternalOffsetDimensioned(
281 this->builder_configs_->internal_offset.x(),
283 this->builder_configs_->internal_offset.z()
288 const G4double z_delta) {
289 G4double size = std::abs(z_delta);
290 G4double offset = z_edge + z_delta / 2.0;
291 SetZSizeDimensioned(size * unit);
292 return SetInternalOffsetDimensioned(
293 this->builder_configs_->internal_offset.x(),
294 this->builder_configs_->internal_offset.y(),
300 const G4double y,
const G4double z) {
301 return SetInternalOffsetDimensioned(x * unit, y * unit, z * unit);
304 BoxBuilder::BoxBuilder(
const G4String &name) {
305 this->builder_configs_->name = name;
312 x_size_(other.x_size_),
313 y_size_(other.y_size_),
314 z_size_(other.z_size_) {
317 builder_configs_->internal_offset = other.builder_configs_->internal_offset;
322 if (this->solid_ptr_.get() !=
nullptr) {
323 std::string error =
"Error in BoxBuilder::SolidConstructor: A solid was already built\n"
324 "You can copy and rename the builder to reset it and build again.";
325 throw std::runtime_error(error);
329 <<
"x_size: " << x_size_ <<
" y_size: " << y_size_ <<
" z_size: " << z_size_ <<
331 G4cout <<
"Internal offset: " << this->builder_configs_->internal_offset << G4endl;
332 return new G4Box(name, x_size_ / 2.0, y_size_ / 2.0, z_size_ / 2.0);
std::shared_ptr< T > shared_from_this()
void set_shared_from_this_enabled(bool enabled)
Builder class for simple Box solids.
BoxBuilderPtr SetXSize(G4double x_size)
G4VSolid * SolidConstructor(const G4String &name) override
The polymorphic Solid constructor.
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)
BoxBuilderPtr SetYSize(G4double y_size)
BoxBuilderPtr SetZEdges(G4double z_edge1, G4double z_edge2)
VolumeBuilder: Common functionality for volume builder classes.
DerivedPtr SetName(const G4String &name)
SetName Sets name used for solid and derived product names.
G4String GetBuilderName() const
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.
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)
Create an unconfigured Box Solid, for use with SetXEdges() etc... Uses the global default unit unless...
BoxBuilderPtr CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta)
Create a Box solid.
G4double GetEffectiveDefaultUnit() const
Get the builder default unit or global if not set.
SharedPtr< BoxBuilder > BoxBuilderPtr