1#ifndef DLG4_STRUCTUREBUILDER_HPP
2#define DLG4_STRUCTUREBUILDER_HPP
20#define BASE StructureBuilderBase<U>
21#define DERIVED typename BASE::DerivedPtr
33 BASE::StructureBuilderBase(
const StructureBuilderBase &other) :
34 builder_configs_(other.builder_configs_),
35 boolean_configs_(other.boolean_configs_),
36 lv_configs_(other.lv_configs_),
38 other.placement_configs_) {
40 builder_configs_->builder_view =
nullptr;
41 builder_configs_->istructure_ptr =
nullptr;
53 template <
typename T,
typename std::enable_if_t<std::is_base_of_v<IStructureBuilder, T>,
int>>
54 BASE::StructureBuilderBase(
const SharedPtr<T> &other,
SET_LINK_TYPE)
55 : builder_configs_(other->builder_configs_,
SET_LINK),
56 boolean_configs_(other->boolean_configs_,
SET_LINK),
57 lv_configs_(other->lv_configs_,
SET_LINK),
58 placement_configs_(other->placement_configs_,
SET_LINK),
59 final_solid_ptr_(other->final_solid_ptr_,
SET_LINK),
60 solid_ptr_(other->solid_ptr_,
SET_LINK),
61 logicvol_ptr_(other->logicvol_ptr_,
SET_LINK),
62 placement_(other->placement_,
SET_LINK) {
65 if (other->placement_configs_->is_builder) {
68 builder_view->StoreBuilderView(builder_view);
73 BASE::~StructureBuilderBase() {
76 if (!has_ownership_ && placement_configs_->is_builder) {
80 placement_.make_persistent();
87 throw std::runtime_error(
"Cannot make placement - structure was already placed");
90 if (!placement_configs_->is_builder) {
92 for (
auto &child : placement_configs_->children) {
93 auto name = this->builder_configs_->builder_view->GetPlacementBaseName();
94 child->placement_configs_->parent_name = name;
96 child->MakePlacement();
100 this->builder_configs_->builder_view->MakePlacement();
102 return this->shared_from_this();
105 template <
typename U>
108 this->MakePlacement();
109 auto clone = this->ForkForPlacement();
113 template <
typename U>
115 SetName(
const G4String &name) {
116 this->builder_configs_->builder_view->SetName(name);
117 return this->shared_from_this();
120 template <
typename U>
122 G4Material *material) {
123 if (!placement_configs_->is_builder) {
125 for (
auto &child : placement_configs_->children) {
126 child->SetMaterial(material);
130 this->builder_configs_->builder_view->SetMaterial(material);
132 return this->shared_from_this();
135 template <
typename U>
136 DERIVED BASE::SetColor(
double r,
double g,
137 double b,
double alpha) {
138 if (!placement_configs_->is_builder) {
140 for (
auto &child : placement_configs_->children) {
141 child->SetColor(r, g, b, alpha);
145 this->builder_configs_->builder_view->SetColor(r, g, b, alpha);
147 return this->shared_from_this();
150 template <
typename U>
152 const G4Colour &color) {
153 if (!placement_configs_->is_builder) {
155 for (
auto &child : placement_configs_->children) {
156 child->SetColor(color);
160 this->builder_configs_->builder_view->SetColor(color);
162 return this->shared_from_this();
165 template <
typename U>
166 DERIVED BASE::SetAlpha(G4double alpha) {
167 if (!placement_configs_->is_builder) {
169 for (
auto &child : placement_configs_->children) {
170 child->SetAlpha(alpha);
174 this->builder_configs_->builder_view->SetAlpha(alpha);
176 return this->shared_from_this();
179 template <
typename U>
180 DERIVED BASE::ForceSolid(
bool x) {
181 if (!placement_configs_->is_builder) {
183 for (
auto &child : placement_configs_->children) {
184 child->ForceSolid(x);
188 this->builder_configs_->builder_view->ForceSolid(x);
190 return this->shared_from_this();
193 template <
typename U>
195 SetVisibility(
bool is_visible) {
196 if (!placement_configs_->is_builder) {
198 for (
auto &child : placement_configs_->children) {
199 child->SetVisibility(is_visible);
203 this->builder_configs_->builder_view->SetVisibility(is_visible);
205 return this->shared_from_this();
208 template <
typename U>
210 const G4RotationMatrix &rot) {
214 this->builder_configs_->builder_view->SetPhysRotation(rot);
215 return this->shared_from_this();
218 template <
typename U>
219 DERIVED BASE::StackPhysRotation(
220 const G4RotationMatrix &stacked_rot) {
221 this->builder_configs_->builder_view->StackPhysRotation(stacked_rot);
222 auto retval = this->shared_from_this();
226 template <
typename U>
228 const Unit3Vec &offset) {
229 this->builder_configs_->builder_view->SetPhysOffset(offset);
230 return this->shared_from_this();
233 template <
typename U>
235 const Unit3Vec &offset) {
236 this->builder_configs_->builder_view->StackPhysOffset(offset);
237 return this->shared_from_this();
240 template <
typename U>
241 DERIVED BASE::SetPhysTransform(
242 const UnitlessG4Transform3D &new_transform) {
243 this->builder_configs_->builder_view->SetPhysTransform(new_transform);
244 return this->shared_from_this();
247 template <
typename U>
248 DERIVED BASE::StackPhysTransform(
249 const UnitlessG4Transform3D &stacked_transform) {
250 this->builder_configs_->builder_view->StackPhysTransform(stacked_transform);
251 return this->shared_from_this();
254 template <
typename U>
255 DERIVED BASE::OverridePlacementName(
256 const G4String &pName) {
257 this->builder_configs_->builder_view->OverridePlacementName(pName);
258 return this->shared_from_this();
261 template <
typename U>
262 DERIVED BASE::SetCopyNo(G4int pCopyNo) {
264 std::cout <<
"fixme" << std::endl;
265 return this->shared_from_this();
268 template <
typename U>
271 if (!placement_configs_->is_builder) {
273 for (
auto &child : placement_configs_->children) {
274 child->SetSurfaceCheck(pSurfChk);
278 this->builder_configs_->builder_view->SetSurfaceCheck(pSurfChk);
280 return this->shared_from_this();
283 template <
typename U>
285 const VolumeBuilder &mother) {
286 if (!placement_configs_->is_builder) {
288 for (
auto &child : placement_configs_->children) {
289 child->SetMother(mother);
293 this->builder_configs_->builder_view->SetMother(mother);
295 return this->shared_from_this();
298 template <
typename U>
299 DERIVED BASE::SetAutoPlacementNaming(
303 this->builder_configs_->builder_view->SetAutoPlacementNaming(set);
304 return this->shared_from_this();
307 template <
typename U>
309 SetAutoCopyNo(
bool set) {
311 if (!placement_configs_->is_builder) {
313 for (
auto &child : placement_configs_->children) {
314 child->SetAutoCopyNo(set);
318 this->builder_configs_->builder_view->SetAutoCopyNo(set);
320 return this->shared_from_this();
324 template <
typename U>
325 DERIVED BASE::ForkForPlacement(
327 std::optional<int> copy_no,
const G4String &name_override) {
329 auto c1 = this->builder_configs_->builder_view->ForkForPlacement();
330 auto c2 = c1->builder_configs_->istructure_ptr;
331 auto copy = i_dynamic_pointer_cast<U>(c2);
332 if (!placement_configs_->is_builder) {
334 copy->placement_configs_->children.clear();
335 for (
auto &child : placement_configs_->children) {
336 auto builderview_clone = child->builder_configs_->builder_view->ForkForPlacement(
337 std::nullopt,
"",
true);
338 auto clone_istructure_view = builderview_clone->builder_configs_->istructure_ptr->
340 copy->placement_configs_->children.emplace_back(clone_istructure_view);
346 template <
typename U>
347 DERIVED BASE::ForkForLogicalVolume(
const G4String &new_name) {
349 auto c1 = this->builder_configs_->builder_view->ForkForLogicalVolume(new_name);
350 auto c2 = c1->builder_configs_->istructure_ptr;
351 auto copy = i_dynamic_pointer_cast<U>(c2);
352 if (!placement_configs_->is_builder) {
354 copy->placement_configs_->children.clear();
355 for (
auto &child : placement_configs_->children) {
356 auto builderview_clone = child->builder_configs_->builder_view->ForkForLogicalVolume(
358 auto clone_istructure_view = builderview_clone->builder_configs_->istructure_ptr->
360 copy->placement_configs_->children.emplace_back(clone_istructure_view);
366 template <
typename U>
367 DERIVED BASE::CopyPlacementConfigsFrom(
368 const VolumeBuilder &other) {
370 this->builder_configs_->builder_view->CopyPlacementConfigsFrom(other);
371 return this->shared_from_this();
374 template <
typename U>
379 this->builder_configs_->builder_view->SetDefaultUnit(unit);
380 return this->shared_from_this();
384 template <
typename U>
385 G4double BASE::GetEffectiveDefaultUnit()
const {
386 return this->builder_configs_->builder_view->GetEffectiveDefaultUnit();
389 template <
typename U>
390 G4String BASE::GetBuilderName()
const {
391 return this->builder_configs_->builder_view->GetBuilderName();
394 template <
typename U>
395 BASE::StructureBuilderBase() {
396 lv_configs_->vis_att = G4VisAttributes(
true);
397 placement_configs_->is_builder =
false;
401 template <
typename U>
402 void BASE::ValidateForPVBuild(std::string
const &site) {
403 builder_configs_->builder_view->ValidateForPVBuild(site);
406 template <
typename U>
407 void BASE::ValidatePlacementNotBuilt(
408 const std::string &operation)
const {
409 builder_configs_->builder_view->ValidatePlacementNotBuilt(operation);
412 template <
typename U>
414 return builder_configs_->istructure_ptr->ToStructureView();
417 template <
typename U>
421 std::shared_ptr<U> builder_std_ptr =
422 std::const_pointer_cast<U>(this->shared_from_this());
423 auto x = DerivedPtr(builder_std_ptr);
428 template <
typename U>
429 SharedPtr<IStructureBuilder> BASE::clone_impl()
const {
431 const U &derived_ref =
static_cast<const U &
>(*this);
432 auto retval =
new U(derived_ref);
435 builder_view->SetName(this->GetBuilderName());
437 builder_view->StoreBuilderView(builder_view);
442 template <
typename U>
443 G4String BASE::GetLogicVolName()
const {
444 return this->builder_configs_->builder_view->GetLogicVolName();
A wrapper for std::shared_ptr that allows and facilitates many implicit(i) type conversions.
std::shared_ptr< T > shared_mutable_this(const std::enable_shared_from_this< T > *obj)
SharedPtr< VolumeBuilderCore > VolumeBuilder
SharedPtr< IStructureBuilder > IStructurePtr
True polymorphic class base view for all structures Mostly for internal use.
SharedPtr< StructureBuilderCore > StructureBuilder