/*////////////////////////////////////////////////////////////////////////////// // 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 #include 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 box(new ContainerBox()); box->Scale(Vector3f(1_m, 2_m, 3_m)); SmartPointer gBox(new Geant::BoxSolid("MyBox", box)); gBox->Update(); SmartPointer lvBox(new Geant::LogicalVolume("BoxLV")); lvBox->SetSolid(gBox); SmartPointer pvBox(new Geant::PhysicalVolume("BoxPV", lvBox)); Vtk::BoxSolid vtkBox(pvBox); vtkBox.AddToViewer(viewer); // 2. Create a TessellatedSolid SmartPointer gTess(new Geant::TessellatedSolid("MyTess")); SmartPointer 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 lvTess(new Geant::LogicalVolume("TessLV")); lvTess->SetSolid(gTess); SmartPointer 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; }