Files
uLib/src/Vtk/HEP/Geant/testing/vtkSolidsTest.cpp
AndreaRigoni 197beba19b updated tests
2026-04-17 09:35:43 +00:00

89 lines
3.2 KiB
C++

/*//////////////////////////////////////////////////////////////////////////////
// CMT Cosmic Muon Tomography project //////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
Copyright (c) 2014, Universita' degli Studi di Padova, INFN sez. di Padova
All rights reserved
Authors: Andrea Rigoni Garola < andrea.rigoni@pd.infn.it >
//////////////////////////////////////////////////////////////////////////////*/
#include "Vtk/HEP/Geant/vtkBoxSolid.h"
#include "Vtk/HEP/Geant/vtkTessellatedSolid.h"
#include "Vtk/uLibVtkViewer.h"
#include "HEP/Geant/Solid.h"
#include "Vtk/Math/vtkContainerBox.h"
#include "Vtk/Math/vtkTriangleMesh.h"
#include "Math/Units.h"
#include <vtkProperty.h>
#include <vtkActor.h>
using namespace uLib;
int main(int argc, char** argv) {
bool interactive = (argc > 1 && std::string(argv[1]) == "-i");
// 3. Visualization setup
Vtk::Viewer viewer;
// 1. Create a BoxSolid
SmartPointer<ContainerBox> box(new ContainerBox());
box->Scale(Vector3f(1_m, 2_m, 3_m));
SmartPointer<Geant::BoxSolid> gBox(new Geant::BoxSolid("MyBox", box));
gBox->Update();
SmartPointer<Geant::LogicalVolume> lvBox(new Geant::LogicalVolume("BoxLV"));
lvBox->SetSolid(gBox);
SmartPointer<Geant::PhysicalVolume> pvBox(new Geant::PhysicalVolume("BoxPV", lvBox));
Vtk::BoxSolid vtkBox(pvBox);
vtkBox.AddToViewer(viewer);
// 2. Create a TessellatedSolid
SmartPointer<Geant::TessellatedSolid> gTess(new Geant::TessellatedSolid("MyTess"));
SmartPointer<TriangleMesh> mesh(new TriangleMesh());
// ... same points ...
mesh->Points().push_back(Vector3f(0, 0, 1_m)); // apex
mesh->Points().push_back(Vector3f(-1_m, -1_m, 0));
mesh->Points().push_back(Vector3f( 1_m, -1_m, 0));
mesh->Points().push_back(Vector3f( 1_m, 1_m, 0));
mesh->Points().push_back(Vector3f(-1_m, 1_m, 0));
mesh->Triangles().push_back(Vector3i(1, 2, 0));
mesh->Triangles().push_back(Vector3i(2, 3, 0));
mesh->Triangles().push_back(Vector3i(3, 4, 0));
mesh->Triangles().push_back(Vector3i(4, 1, 0));
mesh->Triangles().push_back(Vector3i(1, 3, 2)); // base
mesh->Triangles().push_back(Vector3i(1, 4, 3)); // base
gTess->SetMesh(mesh.Get());
gTess->Update();
SmartPointer<Geant::LogicalVolume> lvTess(new Geant::LogicalVolume("TessLV"));
lvTess->SetSolid(gTess);
SmartPointer<Geant::PhysicalVolume> pvTess(new Geant::PhysicalVolume("TessPV", lvTess));
Vtk::TessellatedSolid vtkTess(pvTess);
vtkTess.AddToViewer(viewer);
// Color them differently
vtkBox.SetColor(0.8, 0.2, 0.2); // Redish box
vtkTess.SetColor(0.2, 0.8, 0.2); // Greenish tess
// Position tessellated solid away from box using the PhysicalVolume
pvTess->SetPosition(Vector3f(5_m, 0, 0));
pvTess->Updated();
std::cout << "..:: Testing vtkSolidsTest ::.." << std::endl;
std::cout << "Box and Tessellated solids (placed via PhysicalVolumes) initialized." << std::endl;
if (interactive) {
viewer.ZoomAuto();
viewer.Start();
} else {
std::cout << "Non-interactive test passed." << std::endl;
}
return 0;
}