1#ifndef DLG4_STRUCTUREBUILDER_HPP
2#define DLG4_STRUCTUREBUILDER_HPP
21#define BASE StructureBuilderBase<U>
22#define DERIVED typename BASE::DerivedPtr
34 BASE::StructureBuilderBase(
const StructureBuilderBase &other) :
35 builder_configs_(other.builder_configs_),
36 boolean_configs_(other.boolean_configs_),
37 lv_configs_(other.lv_configs_),
39 other.placement_configs_) {
41 builder_configs_->builder_view =
nullptr;
42 builder_configs_->istructure_ptr =
nullptr;
54 template <
typename T,
typename std::enable_if_t<std::is_base_of_v<IStructureBuilder, T>,
int>>
55 BASE::StructureBuilderBase(
const SharedPtr<T> &other,
SET_LINK_TYPE)
56 : builder_configs_(other->builder_configs_,
SET_LINK),
57 boolean_configs_(other->boolean_configs_,
SET_LINK),
58 lv_configs_(other->lv_configs_,
SET_LINK),
59 placement_configs_(other->placement_configs_,
SET_LINK),
60 final_solid_ptr_(other->final_solid_ptr_,
SET_LINK),
61 solid_ptr_(other->solid_ptr_,
SET_LINK),
62 logicvol_ptr_(other->logicvol_ptr_,
SET_LINK),
63 placement_(other->placement_,
SET_LINK) {
66 if (other->placement_configs_->is_builder) {
69 builder_view->StoreBuilderView(builder_view);
74 BASE::~StructureBuilderBase() {
77 if (!has_ownership_ && placement_configs_->is_builder) {
81 placement_.make_persistent();
88 throw std::runtime_error(
"Cannot make placement - structure was already placed");
91 if (!placement_configs_->is_builder) {
93 for (
auto &child : placement_configs_->children) {
94 auto name = this->builder_configs_->builder_view->GetPlacementBaseName();
95 child->placement_configs_->parent_name = name;
97 child->MakePlacement();
101 this->builder_configs_->builder_view->MakePlacement();
103 return this->shared_from_this();
106 template <
typename U>
109 this->MakePlacement();
110 auto clone = this->ForkForPlacement();
114 template <
typename U>
116 SetName(
const G4String &name) {
117 this->builder_configs_->builder_view->SetName(name);
118 return this->shared_from_this();
121 template <
typename U>
122 DERIVED BASE::SetMaterial(
const
124 if (!placement_configs_->is_builder) {
126 for (
auto &child : placement_configs_->children) {
127 child->SetMaterial(material);
131 this->builder_configs_->builder_view->SetMaterial(material);
133 return this->shared_from_this();
136 template <
typename U>
137 DERIVED BASE::SetColor(
double r,
double g,
138 double b,
double alpha) {
139 if (!placement_configs_->is_builder) {
141 for (
auto &child : placement_configs_->children) {
142 child->SetColor(r, g, b, alpha);
146 this->builder_configs_->builder_view->SetColor(r, g, b, alpha);
148 return this->shared_from_this();
151 template <
typename U>
153 const G4Colour &color) {
154 if (!placement_configs_->is_builder) {
156 for (
auto &child : placement_configs_->children) {
157 child->SetColor(color);
161 this->builder_configs_->builder_view->SetColor(color);
163 return this->shared_from_this();
166 template <
typename U>
167 DERIVED BASE::SetAlpha(G4double alpha) {
168 if (!placement_configs_->is_builder) {
170 for (
auto &child : placement_configs_->children) {
171 child->SetAlpha(alpha);
175 this->builder_configs_->builder_view->SetAlpha(alpha);
177 return this->shared_from_this();
180 template <
typename U>
181 DERIVED BASE::ForceSolid(
bool x) {
182 if (!placement_configs_->is_builder) {
184 for (
auto &child : placement_configs_->children) {
185 child->ForceSolid(x);
189 this->builder_configs_->builder_view->ForceSolid(x);
191 return this->shared_from_this();
194 template <
typename U>
196 SetVisibility(
bool is_visible) {
197 if (!placement_configs_->is_builder) {
199 for (
auto &child : placement_configs_->children) {
200 child->SetVisibility(is_visible);
204 this->builder_configs_->builder_view->SetVisibility(is_visible);
206 return this->shared_from_this();
209 template <
typename U>
211 const G4RotationMatrix &rot) {
215 this->builder_configs_->builder_view->SetPhysRotation(rot);
216 return this->shared_from_this();
219 template <
typename U>
220 DERIVED BASE::StackPhysRotation(
221 const G4RotationMatrix &stacked_rot) {
222 this->builder_configs_->builder_view->StackPhysRotation(stacked_rot);
223 auto retval = this->shared_from_this();
227 template <
typename U>
230 this->builder_configs_->builder_view->SetPhysOffset(offset);
231 return this->shared_from_this();
234 template <
typename U>
237 this->builder_configs_->builder_view->StackPhysOffset(offset);
238 return this->shared_from_this();
241 template <
typename U>
242 DERIVED BASE::SetPhysTransform(
243 const UnitlessG4Transform3D &new_transform) {
244 this->builder_configs_->builder_view->SetPhysTransform(new_transform);
245 return this->shared_from_this();
248 template <
typename U>
249 DERIVED BASE::StackPhysTransform(
250 const UnitlessG4Transform3D &stacked_transform) {
251 this->builder_configs_->builder_view->StackPhysTransform(stacked_transform);
252 return this->shared_from_this();
255 template <
typename U>
256 DERIVED BASE::OverridePlacementName(
257 const G4String &pName) {
258 this->builder_configs_->builder_view->OverridePlacementName(pName);
259 return this->shared_from_this();
262 template <
typename U>
263 DERIVED BASE::SetCopyNo(G4int pCopyNo) {
265 std::cout <<
"fixme" << std::endl;
266 return this->shared_from_this();
269 template <
typename U>
272 if (!placement_configs_->is_builder) {
274 for (
auto &child : placement_configs_->children) {
275 child->SetSurfaceCheck(pSurfChk);
279 this->builder_configs_->builder_view->SetSurfaceCheck(pSurfChk);
281 return this->shared_from_this();
284 template <
typename U>
286 const VolumeBuilder &mother) {
287 if (!placement_configs_->is_builder) {
289 for (
auto &child : placement_configs_->children) {
290 child->SetMother(mother);
294 this->builder_configs_->builder_view->SetMother(mother);
296 return this->shared_from_this();
299 template <
typename U>
300 DERIVED BASE::SetAutoPlacementNaming(
304 this->builder_configs_->builder_view->SetAutoPlacementNaming(set);
305 return this->shared_from_this();
308 template <
typename U>
310 SetAutoCopyNo(
bool set) {
312 if (!placement_configs_->is_builder) {
314 for (
auto &child : placement_configs_->children) {
315 child->SetAutoCopyNo(set);
319 this->builder_configs_->builder_view->SetAutoCopyNo(set);
321 return this->shared_from_this();
325 template <
typename U>
326 DERIVED BASE::ForkForPlacement(
328 std::optional<int> copy_no,
const G4String &name_override) {
330 auto c1 = this->builder_configs_->builder_view->ForkForPlacement();
331 auto c2 = c1->builder_configs_->istructure_ptr;
332 auto copy = i_dynamic_pointer_cast<U>(c2);
333 if (!placement_configs_->is_builder) {
335 copy->placement_configs_->children.clear();
336 for (
auto &child : placement_configs_->children) {
337 auto builderview_clone = child->builder_configs_->builder_view->ForkForPlacement(
338 std::nullopt,
"",
true);
339 auto clone_istructure_view = builderview_clone->builder_configs_->istructure_ptr->
341 copy->placement_configs_->children.emplace_back(clone_istructure_view);
347 template <
typename U>
348 DERIVED BASE::ForkForLogicalVolume(
const G4String &new_name) {
350 auto c1 = this->builder_configs_->builder_view->ForkForLogicalVolume(new_name);
351 auto c2 = c1->builder_configs_->istructure_ptr;
352 auto copy = i_dynamic_pointer_cast<U>(c2);
353 if (!placement_configs_->is_builder) {
355 copy->placement_configs_->children.clear();
356 for (
auto &child : placement_configs_->children) {
357 auto builderview_clone = child->builder_configs_->builder_view->ForkForLogicalVolume(
359 auto clone_istructure_view = builderview_clone->builder_configs_->istructure_ptr->
361 copy->placement_configs_->children.emplace_back(clone_istructure_view);
367 template <
typename U>
368 DERIVED BASE::CopyPlacementConfigsFrom(
369 const VolumeBuilder &other) {
371 this->builder_configs_->builder_view->CopyPlacementConfigsFrom(other);
372 return this->shared_from_this();
375 template <
typename U>
380 this->builder_configs_->builder_view->SetDefaultUnit(unit);
381 return this->shared_from_this();
385 template <
typename U>
386 VB::Length BASE::GetEffectiveDefaultUnit()
const {
387 return this->builder_configs_->builder_view->GetEffectiveDefaultUnit();
390 template <
typename U>
391 G4String BASE::GetBuilderName()
const {
392 return this->builder_configs_->builder_view->GetBuilderName();
395 template <
typename U>
396 BASE::StructureBuilderBase() {
397 lv_configs_->vis_att = G4VisAttributes(
true);
398 placement_configs_->is_builder =
false;
402 template <
typename U>
403 void BASE::ValidateForPVBuild(std::string
const &site) {
404 builder_configs_->builder_view->ValidateForPVBuild(site);
407 template <
typename U>
408 void BASE::ValidatePlacementNotBuilt(
409 const std::string &operation)
const {
410 builder_configs_->builder_view->ValidatePlacementNotBuilt(operation);
413 template <
typename U>
415 return builder_configs_->istructure_ptr->ToStructureView();
418 template <
typename U>
422 std::shared_ptr<U> builder_std_ptr =
423 std::const_pointer_cast<U>(this->shared_from_this());
424 auto x = DerivedPtr(builder_std_ptr);
429 template <
typename U>
430 SharedPtr<IStructureBuilder> BASE::clone_impl()
const {
432 const U &derived_ref =
static_cast<const U &
>(*this);
433 auto retval =
new U(derived_ref);
436 builder_view->SetName(this->GetBuilderName());
438 builder_view->StoreBuilderView(builder_view);
443 template <
typename U>
444 G4String BASE::GetLogicVolName()
const {
445 return this->builder_configs_->builder_view->GetLogicVolName();
A 3D vector that manages unit policy for parameter passing If constructed with a unit,...
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