Compare commits
15 Commits
79e1abb2ff
...
andrea-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2133c31d5 | ||
|
|
00275ac56d | ||
|
|
1374821344 | ||
|
|
2548582036 | ||
|
|
32a1104769 | ||
|
|
3be7ec2274 | ||
|
|
38dd416ced | ||
|
|
e8f8e96521 | ||
|
|
49cf0aeedd | ||
| 40846bba78 | |||
| 4d681e3373 | |||
| 3a9efd5598 | |||
| fa1930f9d7 | |||
|
|
b64afe8773 | ||
|
|
f3ebba4931 |
42
.gitea/workflows/publish-docs.yaml
Normal file
42
.gitea/workflows/publish-docs.yaml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
name: MkDocs Subpath Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch: # trigger manuale
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main # Trigger on main branch
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-deploy:
|
||||||
|
runs-on: mildpub # Runner that can access to SSH_YFINPUB_HOST
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout del codice
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Configura Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
|
||||||
|
- name: Installa dipendenze
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install mkdocs-material
|
||||||
|
pip install -r docs/docker/requirements.txt
|
||||||
|
|
||||||
|
- name: Build del sito
|
||||||
|
run: mkdocs build
|
||||||
|
|
||||||
|
- name: Deploy via SSH (SCP)
|
||||||
|
uses: https://github.com/appleboy/scp-action@master
|
||||||
|
with:
|
||||||
|
host: ${{ vars.SSH_YFINPUB_HOST }}
|
||||||
|
username: ${{ vars.SSH_YFINPUB_USER }}
|
||||||
|
key: ${{ secrets.MILD_PUB }}
|
||||||
|
port: 22
|
||||||
|
source: "site/*"
|
||||||
|
# Il percorso sul server deve corrispondere alla tua sottopagina
|
||||||
|
target: "/var/www/docs/cmt/uLib/"
|
||||||
|
strip_components: 1 # Rimuove la cartella "site/" e mette solo il contenuto
|
||||||
|
rm: true # Pulisce la cartella prima di copiare (opzionale, stile Vercel)
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -12,3 +12,4 @@ src/Python/uLib/*.so*
|
|||||||
src/Python/uLib/*.pyd
|
src/Python/uLib/*.pyd
|
||||||
src/Python/uLib/*.pyc
|
src/Python/uLib/*.pyc
|
||||||
src/Python/uLib/__pycache__
|
src/Python/uLib/__pycache__
|
||||||
|
src/Python/uLib/.nfs*
|
||||||
|
|||||||
@@ -146,7 +146,8 @@ else()
|
|||||||
RenderingFreeType
|
RenderingFreeType
|
||||||
RenderingGL2PSOpenGL2
|
RenderingGL2PSOpenGL2
|
||||||
RenderingOpenGL2
|
RenderingOpenGL2
|
||||||
RenderingVolumeOpenGL2)
|
RenderingVolumeOpenGL2
|
||||||
|
IOGeometry)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_INCLUDES math.h)
|
set(CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_INCLUDES math.h)
|
||||||
@@ -204,8 +205,8 @@ add_subdirectory(${SRC_DIR}/Core)
|
|||||||
include_directories(${SRC_DIR}/Math)
|
include_directories(${SRC_DIR}/Math)
|
||||||
add_subdirectory(${SRC_DIR}/Math)
|
add_subdirectory(${SRC_DIR}/Math)
|
||||||
|
|
||||||
include_directories(${SRC_DIR}/Detectors)
|
include_directories(${SRC_DIR}/HEP)
|
||||||
add_subdirectory(${SRC_DIR}/Detectors)
|
add_subdirectory(${SRC_DIR}/HEP)
|
||||||
|
|
||||||
include_directories(${SRC_DIR}/Root)
|
include_directories(${SRC_DIR}/Root)
|
||||||
add_subdirectory(${SRC_DIR}/Root)
|
add_subdirectory(${SRC_DIR}/Root)
|
||||||
|
|||||||
16
CMakePresets.json
Normal file
16
CMakePresets.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"version": 8,
|
||||||
|
"configurePresets": [
|
||||||
|
{
|
||||||
|
"name": "andrea",
|
||||||
|
"displayName": "Custom configure preset",
|
||||||
|
"description": "Sets Ninja generator, build and install directory",
|
||||||
|
"generator": "Ninja",
|
||||||
|
"binaryDir": "${sourceDir}/out/build/${presetName}",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_BUILD_TYPE": "Debug",
|
||||||
|
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
41
docs/assets/css/extensions/tabbed.css
Normal file
41
docs/assets/css/extensions/tabbed.css
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
.tabbed-set {
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set .highlight {
|
||||||
|
background: #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set .tabbed-content {
|
||||||
|
display: none;
|
||||||
|
order: 99;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set label {
|
||||||
|
width: auto;
|
||||||
|
margin: 0 0.5em;
|
||||||
|
padding: 0.25em;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set input {
|
||||||
|
position: absolute;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set input:nth-child(n+1) {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set input:nth-child(n+1):checked + label {
|
||||||
|
color: cyan !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbed-set input:nth-child(n+1):checked + label + .tabbed-content {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
17
docs/assets/css/extra.css
Normal file
17
docs/assets/css/extra.css
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
@import "extensions/tabbed.css";
|
||||||
|
|
||||||
|
.md-grid {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-main__inner {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar--secondary {
|
||||||
|
right: 1.5rem;
|
||||||
|
top: 4.8rem;
|
||||||
|
transform: none;
|
||||||
|
width: 18rem;
|
||||||
|
}
|
||||||
30
docs/docker/Dockerfile
Normal file
30
docs/docker/Dockerfile
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Stage 1: Build the static site using MkDocs
|
||||||
|
FROM python:3.9-slim-buster as builder
|
||||||
|
|
||||||
|
# Set the working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy the requirements file
|
||||||
|
COPY requirements.txt .
|
||||||
|
|
||||||
|
# Install the Python dependencies
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy the rest of the application files
|
||||||
|
COPY ../.. .
|
||||||
|
|
||||||
|
# Build the MkDocs site
|
||||||
|
RUN mkdocs build
|
||||||
|
|
||||||
|
|
||||||
|
# Stage 2: Serve the static files with Nginx
|
||||||
|
FROM nginx:alpine
|
||||||
|
|
||||||
|
# Copy the built site from the builder stage
|
||||||
|
COPY --from=builder /app/site /usr/share/nginx/html
|
||||||
|
|
||||||
|
# Expose port 80 for the web server
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
# Command to run Nginx in the foreground
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
14
docs/docker/Dockerfile.dev
Normal file
14
docs/docker/Dockerfile.dev
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Dockerfile for development with live-reloading
|
||||||
|
FROM python:3.9-slim-buster
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy and install dependencies
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Expose the port MkDocs serve will run on
|
||||||
|
EXPOSE 8000
|
||||||
|
|
||||||
|
# Command to run the development server
|
||||||
|
CMD ["mkdocs", "serve", "--dev-addr", "0.0.0.0:8000"]
|
||||||
13
docs/docker/docker-compose.yml
Normal file
13
docs/docker/docker-compose.yml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
mkdocs:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.dev
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
volumes:
|
||||||
|
- ../..:/app
|
||||||
|
environment:
|
||||||
|
- GIT_DISCOVERY_ACROSS_FILESYSTEM=1
|
||||||
17
docs/docker/requirements.txt
Normal file
17
docs/docker/requirements.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# ------------------------------------------------------------------
|
||||||
|
# MkDocs runtime dependencies for the docs Docker image
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Core: theme (provides mkdocs itself as a transitive dep)
|
||||||
|
mkdocs-material==9.7.1
|
||||||
|
|
||||||
|
# pymdownx.* extensions used in mkdocs.yml:
|
||||||
|
# arithmatex, highlight, superfences, tabbed, details, blocks.caption
|
||||||
|
# (also a hard dep of mkdocs-material, pinned here for reproducibility)
|
||||||
|
pymdown-extensions>=10.0
|
||||||
|
|
||||||
|
# Markdown math rendering support (arithmatex generic mode)
|
||||||
|
# JS side is loaded via CDN (polyfill.io + MathJax), no extra Python pkg needed
|
||||||
|
|
||||||
|
# Optional: PDF export plugin (exporter: block, currently commented out in mkdocs.yml)
|
||||||
|
mkdocs-exporter
|
||||||
1
docs/docker/runtime.txt
Normal file
1
docs/docker/runtime.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3.7
|
||||||
63
docs/index.md
Normal file
63
docs/index.md
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# uLib
|
||||||
|
|
||||||
|
[](https://zenodo.org/badge/latestdoi/36926725)
|
||||||
|
|
||||||
|
**uLib** is the base toolkit library for the **CMT (Cosmic Muon Tomography)** project, developed at the University of Padova and INFN Sezione di Padova, Italy.
|
||||||
|
|
||||||
|
It provides:
|
||||||
|
|
||||||
|
- **Core** – object model, timers, configuration, UUID utilities.
|
||||||
|
- **Math** – linear algebra (Eigen3), structured grids, voxel images, ray-tracing, image filters.
|
||||||
|
- **Python bindings** – full pybind11 interface for scripting and analysis workflows.
|
||||||
|
- Optional **CUDA** acceleration for voxel filtering (transparent RAM ↔ VRAM management).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
=== "Users (pip / poetry)"
|
||||||
|
```bash
|
||||||
|
# Activate your conda/micromamba environment first
|
||||||
|
micromamba activate mutom
|
||||||
|
|
||||||
|
poetry install # CPU build
|
||||||
|
USE_CUDA=ON poetry install # GPU build
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Developers (CMake)"
|
||||||
|
```bash
|
||||||
|
conan install . --output-folder=build --build=missing
|
||||||
|
cmake --preset conan-release
|
||||||
|
cmake --build build --target uLib_python -j$(nproc)
|
||||||
|
|
||||||
|
export PYTHONPATH="$(pwd)/build/src/Python:$(pwd)/src/Python"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then in Python:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import uLib
|
||||||
|
|
||||||
|
# Core
|
||||||
|
timer = uLib.Core.Timer()
|
||||||
|
timer.Start()
|
||||||
|
|
||||||
|
# Math
|
||||||
|
grid = uLib.Math.StructuredGrid([10, 10, 10])
|
||||||
|
grid.SetSpacing([1.0, 1.0, 1.0])
|
||||||
|
|
||||||
|
img = uLib.Math.VoxImage([10, 10, 10])
|
||||||
|
img.SetValue(0, 3.14)
|
||||||
|
print(img.GetValue(0))
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation Sections
|
||||||
|
|
||||||
|
| Section | Description |
|
||||||
|
|---|---|
|
||||||
|
| [Python – Installation](python/installation.md) | Environment setup, user install, developer build |
|
||||||
|
| [Python – API Usage](python/usage.md) | Full API reference with examples |
|
||||||
|
| [Python – Developer Guide](python/developer_guide.md) | Adding bindings, running tests, build details |
|
||||||
|
| [C++ Build – Usage & CUDA](usage/usage.md) | CMake build, CUDA configuration |
|
||||||
179
docs/python/developer_guide.md
Normal file
179
docs/python/developer_guide.md
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
# Developer Guide – Python Bindings
|
||||||
|
|
||||||
|
This guide is aimed at contributors who want to extend or modify the Python bindings for `uLib`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Repository Layout
|
||||||
|
|
||||||
|
```
|
||||||
|
ulib/
|
||||||
|
├── src/
|
||||||
|
│ └── Python/
|
||||||
|
│ ├── module.cpp # pybind11 module entry point
|
||||||
|
│ ├── core_bindings.cpp # uLib::Core bindings
|
||||||
|
│ ├── math_bindings.cpp # uLib::Math bindings
|
||||||
|
│ ├── math_filters_bindings.cpp# VoxImageFilter bindings
|
||||||
|
│ ├── CMakeLists.txt # builds uLib_python shared lib
|
||||||
|
│ ├── testing/ # Python unit tests
|
||||||
|
│ │ ├── pybind_test.py
|
||||||
|
│ │ ├── core_pybind_test.py
|
||||||
|
│ │ ├── math_pybind_test.py
|
||||||
|
│ │ └── math_filters_test.py
|
||||||
|
│ └── uLib/ # Python package (uLib_python.so lands here)
|
||||||
|
│ └── __init__.py
|
||||||
|
├── build_python.py # poetry build hook (calls CMake)
|
||||||
|
├── pyproject.toml # poetry metadata
|
||||||
|
└── condaenv.yml # conda/micromamba environment
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Adding a New Binding
|
||||||
|
|
||||||
|
All bindings live in the four source files listed above. The module entry point `module.cpp` calls `init_core()`, `init_math()`, and `init_math_filters()` in order.
|
||||||
|
|
||||||
|
### 1. Pick (or create) the right binding file
|
||||||
|
|
||||||
|
| C++ header location | Binding file |
|
||||||
|
|---|---|
|
||||||
|
| `src/Core/` | `core_bindings.cpp` |
|
||||||
|
| `src/Math/` (geometry, grids, VoxImage) | `math_bindings.cpp` |
|
||||||
|
| `src/Math/VoxImageFilter*.hpp` | `math_filters_bindings.cpp` |
|
||||||
|
|
||||||
|
### 2. Add the `#include` directive
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// math_bindings.cpp
|
||||||
|
#include "Math/MyNewClass.h"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Write the pybind11 binding inside the appropriate `init_*` function
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
void init_math(py::module_ &m) {
|
||||||
|
// ... existing bindings ...
|
||||||
|
|
||||||
|
py::class_<MyNewClass>(m, "MyNewClass")
|
||||||
|
.def(py::init<>())
|
||||||
|
.def("MyMethod", &MyNewClass::MyMethod)
|
||||||
|
.def("AnotherMethod", &MyNewClass::AnotherMethod,
|
||||||
|
py::arg("x"), py::arg("y") = 0.0f);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Rebuild only the Python target
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake --build build --target uLib_python -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Write a Python test
|
||||||
|
|
||||||
|
Add a new test class to the relevant test file (or create a new one under `src/Python/testing/`):
|
||||||
|
|
||||||
|
```python
|
||||||
|
# src/Python/testing/math_pybind_test.py
|
||||||
|
class TestMyNewClass(unittest.TestCase):
|
||||||
|
def test_basic(self):
|
||||||
|
obj = uLib.Math.MyNewClass()
|
||||||
|
result = obj.MyMethod()
|
||||||
|
self.assertAlmostEqual(result, expected_value)
|
||||||
|
```
|
||||||
|
|
||||||
|
Register the test in `src/Python/CMakeLists.txt` if you add a new file:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
add_test(NAME pybind_my_new
|
||||||
|
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/testing/my_new_test.py)
|
||||||
|
set_tests_properties(pybind_my_new PROPERTIES
|
||||||
|
ENVIRONMENT "PYTHONPATH=$<TARGET_FILE_DIR:uLib_python>:${PROJECT_SOURCE_DIR}/src/Python")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Build System Details
|
||||||
|
|
||||||
|
### CMakeLists.txt (`src/Python/`)
|
||||||
|
|
||||||
|
`pybind11_add_module` compiles the shared library `uLib_python` and links it against the C++ static/shared libraries `uLibCore` and `uLibMath`. The install target copies the `.so` into the standard library directory.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
pybind11_add_module(uLib_python
|
||||||
|
module.cpp core_bindings.cpp math_bindings.cpp math_filters_bindings.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(uLib_python PRIVATE uLibCore uLibMath)
|
||||||
|
```
|
||||||
|
|
||||||
|
### poetry / build_python.py
|
||||||
|
|
||||||
|
`pyproject.toml` declares `build_python.py` as the custom build hook. When `poetry install` or `poetry build` is invoked it:
|
||||||
|
|
||||||
|
1. Calls `cmake <root> -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=<pkg_dir> ...` in `build_python/`.
|
||||||
|
2. Builds only the `uLib_python` target.
|
||||||
|
3. The resulting `.so` is placed inside `src/Python/uLib/` so it is picked up by Poetry as a package data file.
|
||||||
|
|
||||||
|
The `USE_CUDA` environment variable gates CUDA support at build time:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
USE_CUDA=ON poetry install # with CUDA
|
||||||
|
USE_CUDA=OFF poetry install # CPU only (default)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Running All Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# From the repository root, with PYTHONPATH set:
|
||||||
|
export PYTHONPATH="$(pwd)/build/src/Python:$(pwd)/src/Python"
|
||||||
|
|
||||||
|
python -m pytest src/Python/testing/ -v
|
||||||
|
```
|
||||||
|
|
||||||
|
Or through CMake's test runner (after building the full project):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure -R pybind
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected output (all passing):
|
||||||
|
|
||||||
|
```
|
||||||
|
Start 1: pybind_general
|
||||||
|
1/4 Test #1: pybind_general ............. Passed
|
||||||
|
Start 2: pybind_core
|
||||||
|
2/4 Test #2: pybind_core ................ Passed
|
||||||
|
Start 3: pybind_math
|
||||||
|
3/4 Test #3: pybind_math ................ Passed
|
||||||
|
Start 4: pybind_math_filters
|
||||||
|
4/4 Test #4: pybind_math_filters ........ Passed
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Memory Management Notes
|
||||||
|
|
||||||
|
`uLib::Vector<T>` has explicit GPU memory management. When wrapping methods that return references to internal data, use `py::return_value_policy::reference_internal` to avoid dangling references:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
.def("Data", &VoxImage<Voxel>::Data,
|
||||||
|
py::return_value_policy::reference_internal)
|
||||||
|
```
|
||||||
|
|
||||||
|
For objects held by `std::unique_ptr` without Python-side deletion, use `py::nodelete`:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
py::class_<Abstract::VoxImageFilter,
|
||||||
|
std::unique_ptr<Abstract::VoxImageFilter, py::nodelete>>(m, "AbstractVoxImageFilter")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Useful References
|
||||||
|
|
||||||
|
- [pybind11 documentation](https://pybind11.readthedocs.io)
|
||||||
|
- [pybind11 – STL containers](https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html)
|
||||||
|
- [pybind11 – Eigen integration](https://pybind11.readthedocs.io/en/stable/advanced/cast/eigen.html)
|
||||||
|
- [CMake – pybind11 integration](https://pybind11.readthedocs.io/en/stable/compiling.html)
|
||||||
146
docs/python/installation.md
Normal file
146
docs/python/installation.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# Python Installation
|
||||||
|
|
||||||
|
The `uLib` Python package exposes the Core and Math C++ libraries via [pybind11](https://pybind11.readthedocs.io) bindings. There are two ways to install it: as an **end user** (pre-built wheel / pip) or as a **developer** (editable build from source).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
`uLib` depends on native C++ libraries that must be compiled. Ensure the following are available in your environment before installing:
|
||||||
|
|
||||||
|
| Dependency | Minimum version | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| Python | 3.9 | |
|
||||||
|
| CMake | 3.12 | |
|
||||||
|
| pybind11 | 2.6.0 | |
|
||||||
|
| Conan | 2.x | for Eigen3 / Boost |
|
||||||
|
| micromamba / conda | any | recommended – provides ROOT, VTK |
|
||||||
|
|
||||||
|
### Creating the `mutom` Conda/Micromamba Environment
|
||||||
|
|
||||||
|
A ready-to-use environment definition is provided as `condaenv.yml` at the repository root.
|
||||||
|
|
||||||
|
=== "Micromamba"
|
||||||
|
```bash
|
||||||
|
micromamba env create -f condaenv.yml
|
||||||
|
micromamba activate mutom
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Conda"
|
||||||
|
```bash
|
||||||
|
conda env create -f condaenv.yml
|
||||||
|
conda activate mutom
|
||||||
|
```
|
||||||
|
|
||||||
|
The environment installs CMake, Conan, ROOT, VTK, and the compiler toolchain.
|
||||||
|
|
||||||
|
> **CUDA (optional)**
|
||||||
|
> If you want GPU-accelerated voxel filtering, you also need NVCC inside the environment:
|
||||||
|
> ```bash
|
||||||
|
> micromamba install cuda-nvcc -c conda-forge
|
||||||
|
> ```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## User Installation (wheel / pip)
|
||||||
|
|
||||||
|
Once the native dependencies are present in your environment, install the package with Poetry or pip:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Activate your environment first
|
||||||
|
micromamba activate mutom
|
||||||
|
|
||||||
|
# Build and install (CUDA disabled by default)
|
||||||
|
poetry install
|
||||||
|
|
||||||
|
# Build and install with CUDA support
|
||||||
|
USE_CUDA=ON poetry install
|
||||||
|
```
|
||||||
|
|
||||||
|
After installation the module is importable from anywhere in the environment:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import uLib
|
||||||
|
print(dir(uLib.Core))
|
||||||
|
print(dir(uLib.Math))
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Developer Installation (editable / in-tree build)
|
||||||
|
|
||||||
|
For development you typically want to skip the packaging layer and work directly against the CMake build tree.
|
||||||
|
|
||||||
|
### Step 1 – Install Conan dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conan profile detect # first time only
|
||||||
|
conan install . --output-folder=build --build=missing
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2 – Configure and build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Standard release build
|
||||||
|
cmake --preset conan-release
|
||||||
|
|
||||||
|
# …or manually
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DUSE_CUDA=OFF # set to ON when a GPU is available
|
||||||
|
|
||||||
|
cmake --build build --target uLib_python -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
The shared library (`uLib_python*.so`) is written to `build/src/Python/`.
|
||||||
|
|
||||||
|
### Step 3 – Make the module importable
|
||||||
|
|
||||||
|
Point `PYTHONPATH` at the build output **and** the Python source directory (the latter carries the `uLib/__init__.py` that stitches sub-modules together):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export PYTHONPATH="$(pwd)/build/src/Python:$(pwd)/src/Python:$PYTHONPATH"
|
||||||
|
python -c "import uLib; print(uLib.__version__)"
|
||||||
|
```
|
||||||
|
|
||||||
|
Or, for a one-shot check:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PYTHONPATH="build/src/Python:src/Python" python src/Python/testing/pybind_test.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4 – Run the tests
|
||||||
|
|
||||||
|
CMake registers the Python tests alongside the C++ ones; use `ctest` from the build directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure -R pybind
|
||||||
|
```
|
||||||
|
|
||||||
|
Individual test scripts can also be run directly once `PYTHONPATH` is set:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python src/Python/testing/core_pybind_test.py
|
||||||
|
python src/Python/testing/math_pybind_test.py
|
||||||
|
python src/Python/testing/math_filters_test.py
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verifying the Installation
|
||||||
|
|
||||||
|
```python
|
||||||
|
import uLib
|
||||||
|
|
||||||
|
# Core module
|
||||||
|
obj = uLib.Core.Object()
|
||||||
|
timer = uLib.Core.Timer()
|
||||||
|
timer.Start()
|
||||||
|
elapsed = timer.StopWatch() # float, seconds
|
||||||
|
|
||||||
|
# Math module
|
||||||
|
v3 = uLib.Math.Vector3f([1.0, 0.0, 0.0])
|
||||||
|
print(v3[0]) # 1.0
|
||||||
|
```
|
||||||
373
docs/python/usage.md
Normal file
373
docs/python/usage.md
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
# Python API Usage
|
||||||
|
|
||||||
|
The `uLib` Python package is split into two sub-modules mirroring the C++ library:
|
||||||
|
|
||||||
|
| Sub-module | Contents |
|
||||||
|
|---|---|
|
||||||
|
| `uLib.Core` | Low-level utilities: `Object`, `Timer`, `Options`, `TypeRegister` |
|
||||||
|
| `uLib.Math` | Geometry, grids, voxel images, ray-tracing, image filters |
|
||||||
|
|
||||||
|
```python
|
||||||
|
import uLib
|
||||||
|
# Sub-modules are accessible as attributes
|
||||||
|
uLib.Core # core utilities
|
||||||
|
uLib.Math # mathematical structures
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Core
|
||||||
|
|
||||||
|
### Object
|
||||||
|
|
||||||
|
Base class for uLib objects; exposed to Python for type-hierarchy purposes.
|
||||||
|
|
||||||
|
```python
|
||||||
|
obj = uLib.Core.Object()
|
||||||
|
copy = obj.DeepCopy()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Timer
|
||||||
|
|
||||||
|
Precision wall-clock timer.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import time
|
||||||
|
timer = uLib.Core.Timer()
|
||||||
|
timer.Start()
|
||||||
|
time.sleep(0.5)
|
||||||
|
elapsed = timer.StopWatch() # returns elapsed seconds as float
|
||||||
|
print(f"Elapsed: {elapsed:.3f} s")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
Wraps Boost.ProgramOptions for INI-style configuration files.
|
||||||
|
|
||||||
|
```python
|
||||||
|
opt = uLib.Core.Options("My Program")
|
||||||
|
opt.parse_config_file("config.ini") # load settings
|
||||||
|
n = opt.count("my_key") # check if key exists
|
||||||
|
opt.save_config_file("out.ini")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – Linear Algebra
|
||||||
|
|
||||||
|
The math module exposes Eigen3 vectors and matrices as well-typed Python objects with NumPy interoperability.
|
||||||
|
|
||||||
|
### Fixed-size Vectors
|
||||||
|
|
||||||
|
```python
|
||||||
|
import numpy as np
|
||||||
|
import uLib
|
||||||
|
|
||||||
|
# Construct from list
|
||||||
|
v3 = uLib.Math.Vector3f([1.0, 2.0, 3.0])
|
||||||
|
print(v3[0], v3[1], v3[2]) # 1.0 2.0 3.0
|
||||||
|
|
||||||
|
# Construct from NumPy array
|
||||||
|
arr = np.array([4.0, 5.0, 6.0], dtype=np.float32)
|
||||||
|
v3b = uLib.Math.Vector3f(arr)
|
||||||
|
|
||||||
|
# Zero-initialise
|
||||||
|
v4d = uLib.Math.Vector4d() # all zeros
|
||||||
|
|
||||||
|
# Available types
|
||||||
|
# Vector1f / 2f / 3f / 4f (float32)
|
||||||
|
# Vector1d / 2d / 3d / 4d (float64)
|
||||||
|
# Vector1i / 2i / 3i / 4i (int32)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fixed-size Matrices
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 2-by-2 float matrix
|
||||||
|
m2f = uLib.Math.Matrix2f()
|
||||||
|
m2f[0, 0] = 1; m2f[0, 1] = 2
|
||||||
|
m2f[1, 0] = 3; m2f[1, 1] = 4
|
||||||
|
|
||||||
|
# From list (row-major)
|
||||||
|
m4f = uLib.Math.Matrix4f([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1])
|
||||||
|
|
||||||
|
# From NumPy (2-D array)
|
||||||
|
mat = np.eye(3, dtype=np.float32)
|
||||||
|
m3f = uLib.Math.Matrix3f(mat)
|
||||||
|
|
||||||
|
# Dynamic matrices
|
||||||
|
mXf = uLib.Math.MatrixXf(4, 4) # 4×4 float, zeros
|
||||||
|
```
|
||||||
|
|
||||||
|
### Homogeneous Types
|
||||||
|
|
||||||
|
```python
|
||||||
|
# HPoint3f – a 3-D point in homogeneous coordinates (w = 1)
|
||||||
|
p = uLib.Math.HPoint3f(1.0, 2.0, 3.0)
|
||||||
|
|
||||||
|
# HVector3f – a free vector (w = 0)
|
||||||
|
v = uLib.Math.HVector3f(0.0, 1.0, 0.0)
|
||||||
|
|
||||||
|
# HLine3f – a parametric ray
|
||||||
|
line = uLib.Math.HLine3f()
|
||||||
|
line.origin = uLib.Math.HPoint3f(0, 0, 0)
|
||||||
|
line.direction = uLib.Math.HVector3f(0, 0, 1)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – Transforms and Geometry
|
||||||
|
|
||||||
|
### AffineTransform
|
||||||
|
|
||||||
|
A rigid-body / affine transform stored as a 4×4 matrix.
|
||||||
|
|
||||||
|
```python
|
||||||
|
tf = uLib.Math.AffineTransform()
|
||||||
|
|
||||||
|
tf.SetPosition([1.0, 0.0, 0.0]) # translate
|
||||||
|
tf.Translate([0.0, 1.0, 0.0]) # cumulative translate
|
||||||
|
tf.Scale([2.0, 2.0, 2.0]) # uniform scale
|
||||||
|
tf.Rotate(uLib.Math.Vector3f([0, 0, 3.14159])) # Euler angles (rad)
|
||||||
|
|
||||||
|
mat4 = tf.GetWorldMatrix() # 4×4 matrix
|
||||||
|
pos = tf.GetPosition() # Vector3f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Geometry
|
||||||
|
|
||||||
|
Inherits `AffineTransform`; converts points between world and local frames.
|
||||||
|
|
||||||
|
```python
|
||||||
|
geo = uLib.Math.Geometry()
|
||||||
|
geo.SetPosition([1.0, 1.0, 1.0])
|
||||||
|
|
||||||
|
world_pt = uLib.Math.Vector4f([2.0, 3.0, 2.0, 1.0])
|
||||||
|
local_pt = geo.GetLocalPoint(world_pt)
|
||||||
|
back = geo.GetWorldPoint(local_pt)
|
||||||
|
# back ≈ [2, 3, 2, 1]
|
||||||
|
```
|
||||||
|
|
||||||
|
### ContainerBox
|
||||||
|
|
||||||
|
An axis-aligned bounding box with an associated transform.
|
||||||
|
|
||||||
|
```python
|
||||||
|
box = uLib.Math.ContainerBox()
|
||||||
|
box.SetOrigin([-1.0, -1.0, -1.0])
|
||||||
|
box.SetSize([2.0, 2.0, 2.0])
|
||||||
|
print(box.GetSize()) # [2, 2, 2]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – Structured Grids
|
||||||
|
|
||||||
|
### StructuredGrid (3-D)
|
||||||
|
|
||||||
|
A 3-D voxel grid (origin, spacing, and integer dimensions).
|
||||||
|
|
||||||
|
```python
|
||||||
|
dims = uLib.Math.Vector3i([10, 10, 10])
|
||||||
|
grid = uLib.Math.StructuredGrid(dims)
|
||||||
|
grid.SetSpacing([1.0, 1.0, 1.0])
|
||||||
|
grid.SetOrigin([0.0, 0.0, 0.0])
|
||||||
|
|
||||||
|
print(grid.GetSpacing()) # [1, 1, 1]
|
||||||
|
print(grid.IsInsideBounds([5, 5, 5, 1])) # True
|
||||||
|
idx = grid.Find([2.5, 2.5, 2.5]) # returns grid cell index
|
||||||
|
```
|
||||||
|
|
||||||
|
### Structured2DGrid / Structured4DGrid
|
||||||
|
|
||||||
|
```python
|
||||||
|
grid2d = uLib.Math.Structured2DGrid()
|
||||||
|
grid2d.SetDims([100, 100])
|
||||||
|
grid2d.SetPhysicalSpace([0, 0], [1, 1])
|
||||||
|
print(grid2d.GetSpacing())
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – VoxImage
|
||||||
|
|
||||||
|
`VoxImage` is a 3-D voxel volume where each cell stores a `Voxel` ( `.Value` + `.Count`).
|
||||||
|
|
||||||
|
```python
|
||||||
|
dims = uLib.Math.Vector3i([20, 20, 20])
|
||||||
|
img = uLib.Math.VoxImage(dims)
|
||||||
|
img.SetSpacing([0.5, 0.5, 0.5])
|
||||||
|
|
||||||
|
# Access by linear index
|
||||||
|
img.SetValue(0, 42.0)
|
||||||
|
print(img.GetValue(0)) # 42.0
|
||||||
|
|
||||||
|
# Access by 3-D index
|
||||||
|
img.SetValue(uLib.Math.Vector3i([1, 1, 1]), 7.5)
|
||||||
|
print(img.GetValue(uLib.Math.Vector3i([1, 1, 1]))) # 7.5
|
||||||
|
|
||||||
|
# Clipping / masking helpers
|
||||||
|
cropped = img.clipImage(uLib.Math.Vector3i([2, 2, 2]),
|
||||||
|
uLib.Math.Vector3i([18, 18, 18]))
|
||||||
|
masked = img.maskImage(0.0, 100.0, 0.0) # mask outside [0, 100]
|
||||||
|
|
||||||
|
# I/O
|
||||||
|
img.ExportToVti("output.vti")
|
||||||
|
img.ImportFromVti("output.vti")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Voxel (element type)
|
||||||
|
|
||||||
|
```python
|
||||||
|
vox = uLib.Math.Voxel()
|
||||||
|
vox.Value = 1.5
|
||||||
|
vox.Count = 3
|
||||||
|
|
||||||
|
data = img.Data() # returns the underlying Vector_Voxel
|
||||||
|
vox0 = data[0]
|
||||||
|
print(vox0.Value, vox0.Count)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – VoxRaytracer
|
||||||
|
|
||||||
|
Performs ray-tracing through a `StructuredGrid` and returns per-voxel chord lengths.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import numpy as np
|
||||||
|
import uLib
|
||||||
|
|
||||||
|
grid = uLib.Math.StructuredGrid([10, 10, 10])
|
||||||
|
grid.SetSpacing([1.0, 1.0, 1.0])
|
||||||
|
grid.SetOrigin([0.0, 0.0, 0.0])
|
||||||
|
|
||||||
|
rt = uLib.Math.VoxRaytracer(grid)
|
||||||
|
|
||||||
|
# Trace a ray between two homogeneous points (x, y, z, w=1)
|
||||||
|
p1 = np.array([0.5, 0.5, -1.0, 1.0], dtype=np.float32)
|
||||||
|
p2 = np.array([0.5, 0.5, 11.0, 1.0], dtype=np.float32)
|
||||||
|
result = rt.TraceBetweenPoints(p1, p2)
|
||||||
|
|
||||||
|
print("Voxels crossed:", result.Count())
|
||||||
|
print("Total length :", result.TotalLength())
|
||||||
|
|
||||||
|
elements = result.Data()
|
||||||
|
for i in range(result.Count()):
|
||||||
|
print(f" vox_id={elements[i].vox_id} L={elements[i].L:.4f}")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – Image Filters
|
||||||
|
|
||||||
|
All filters share the same interface: construct with a kernel size, attach a `VoxImage`, optionally set parameters, then call `.Run()`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import uLib
|
||||||
|
|
||||||
|
dims = uLib.Math.Vector3i([10, 10, 10])
|
||||||
|
img = uLib.Math.VoxImage(dims)
|
||||||
|
for i in range(10**3):
|
||||||
|
img.SetValue(i, float(i))
|
||||||
|
|
||||||
|
kernel_dims = uLib.Math.Vector3i([3, 3, 3])
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linear (Gaussian / Box) Filter
|
||||||
|
|
||||||
|
```python
|
||||||
|
filt = uLib.Math.VoxFilterAlgorithmLinear(kernel_dims)
|
||||||
|
filt.SetImage(img)
|
||||||
|
filt.SetKernelNumericXZY([1.0] * 27) # uniform box kernel, length = product of dims
|
||||||
|
filt.Run()
|
||||||
|
```
|
||||||
|
|
||||||
|
### ABTrim Filter
|
||||||
|
|
||||||
|
Applies alpha-beta trimming to remove outliers before averaging.
|
||||||
|
|
||||||
|
```python
|
||||||
|
filt = uLib.Math.VoxFilterAlgorithmAbtrim(kernel_dims)
|
||||||
|
filt.SetImage(img)
|
||||||
|
filt.SetKernelNumericXZY([1.0] * 27)
|
||||||
|
filt.SetABTrim(2, 2) # trim 2 low and 2 high values
|
||||||
|
filt.Run()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bilateral Filter
|
||||||
|
|
||||||
|
Edge-preserving smoothing controlled by a spatial sigma (from the kernel shape) and an intensity sigma.
|
||||||
|
|
||||||
|
```python
|
||||||
|
filt = uLib.Math.VoxFilterAlgorithmBilateral(kernel_dims)
|
||||||
|
filt.SetImage(img)
|
||||||
|
filt.SetKernelNumericXZY([1.0] * 27)
|
||||||
|
filt.SetIntensitySigma(0.3)
|
||||||
|
filt.Run()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Threshold Filter
|
||||||
|
|
||||||
|
Zeros voxels below a threshold.
|
||||||
|
|
||||||
|
```python
|
||||||
|
filt = uLib.Math.VoxFilterAlgorithmThreshold(kernel_dims)
|
||||||
|
filt.SetImage(img)
|
||||||
|
filt.SetKernelNumericXZY([1.0] * 27)
|
||||||
|
filt.SetThreshold(0.5)
|
||||||
|
filt.Run()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Median Filter
|
||||||
|
|
||||||
|
```python
|
||||||
|
filt = uLib.Math.VoxFilterAlgorithmMedian(kernel_dims)
|
||||||
|
filt.SetImage(img)
|
||||||
|
filt.SetKernelNumericXZY([1.0] * 27)
|
||||||
|
filt.Run()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## uLib.Math – Accumulators
|
||||||
|
|
||||||
|
Accumulators collect scalar samples and return a summary statistic.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Arithmetic mean
|
||||||
|
acc = uLib.Math.Accumulator_Mean_f()
|
||||||
|
acc(10.0)
|
||||||
|
acc(20.0)
|
||||||
|
mean = acc() # 15.0
|
||||||
|
|
||||||
|
# Alpha-beta trimmed mean
|
||||||
|
acc2 = uLib.Math.Accumulator_ABTrim_f()
|
||||||
|
acc2.SetABTrim(0.1, 0.1) # trim bottom 10 % and top 10 %
|
||||||
|
acc2 += 1.0
|
||||||
|
acc2 += 9999.0 # outlier
|
||||||
|
acc2 += 5.0
|
||||||
|
result = acc2() # trimmed mean ≈ 3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dynamic Vectors (`uLib.Math.Vector_*`)
|
||||||
|
|
||||||
|
Typed dynamic arrays backed by `uLib::Vector<T>` with optional CUDA memory management.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Integer vector
|
||||||
|
vi = uLib.Math.Vector_i()
|
||||||
|
vi.append(1); vi.append(2); vi.append(3)
|
||||||
|
print(len(vi), vi[0])
|
||||||
|
|
||||||
|
# Float vector with CUDA management
|
||||||
|
vf = uLib.Math.Vector_f()
|
||||||
|
vf.append(1.5)
|
||||||
|
vf.MoveToVRAM() # copy to GPU (no-op when CUDA is absent)
|
||||||
|
vf.MoveToRAM() # copy back to CPU
|
||||||
|
|
||||||
|
# Other types: Vector_ui, Vector_l, Vector_ul, Vector_d
|
||||||
|
# Compound element types: Vector_Vector3f, Vector_Vector4f, Vector_Voxel …
|
||||||
|
```
|
||||||
561
mkdocs.yml
Normal file
561
mkdocs.yml
Normal file
@@ -0,0 +1,561 @@
|
|||||||
|
# site_name: uLib Documentation
|
||||||
|
# site_description: CMT Cosmic Muon Tomography – uLib toolkit
|
||||||
|
# site_author: Andrea Rigoni Garola
|
||||||
|
# repo_url: https://github.com/cmt/ulib
|
||||||
|
# docs_dir: docs
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | This is the main file used by MkDocs to build the pages. |
|
||||||
|
# | It contains a lot of information and settings for you to read and use. |
|
||||||
|
# | Comments may contain "Read More" URLs to more in-depth documentation about the option for you to read. |
|
||||||
|
# | |
|
||||||
|
# | You can check out https://www.mkdocs.org/user-guide/configuration/ for a more detailed explanation of |
|
||||||
|
# | all the options MkDocs offers by default. |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------- NOTE -------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | Some of the options listed here are only available through the usage of Material for MkDocs. |
|
||||||
|
# | Those options will usually have a link to the docs of this Theme and also mention "Material" as name. |
|
||||||
|
# | The actual name of the theme is "Material for MkDocs" and "Material" is used for simplicity reasons. |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | Main Page Settings for MkDocs. |
|
||||||
|
# | Those settings are site name, site description, Site author and also Site URL (Canonical URL) |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#site_name |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#site_description |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#site_author |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#site_url |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
site_name: OpenCMT uLib Documentation
|
||||||
|
site_url: https://docs.mildstone.org/uLib/ # <--- project subfolder
|
||||||
|
use_directory_urls: true
|
||||||
|
site_description: 'Documentation for OpenCMT uLib'
|
||||||
|
site_author: 'Andrea Rigoni Garola'
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | This setting allows you to define your own Copyright notice. |
|
||||||
|
# | The text is treated as HTML code so you can use things like <a> tags or © to display the |
|
||||||
|
# | Copyright icon. |
|
||||||
|
# | |
|
||||||
|
# | Where or IF the Copyright is displayed depends on the theme you use. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#copyright |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
copyright: |
|
||||||
|
© Author
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The base folder to use. |
|
||||||
|
# | Any Markdown files you put into this folder will be turned into a static HTML page once you build or |
|
||||||
|
# | publish your page. |
|
||||||
|
# | |
|
||||||
|
# | It is also used as the base directory for other settings like the "extra_css" or "extra_javascript" |
|
||||||
|
# | option. |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
docs_dir: docs/
|
||||||
|
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | These options allow to define a Repository to link to. |
|
||||||
|
# | The result will, depending on the theme, be a link somewhere shown on the page that links to the |
|
||||||
|
# | Repository with the specified repo_name. |
|
||||||
|
# | |
|
||||||
|
# | This will also enable a "edit" button on the page itself that allows the direct editing of the page. |
|
||||||
|
# | You can disable this by setting "edit_uri" to an empty String. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#repo_name |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#repo_url |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#edit_uri |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
repo_name: OpenCMT/uLib
|
||||||
|
repo_url: https://gitea.mildstone.org/OpenCMT/uLib.git
|
||||||
|
#edit_uri: tree/master/docs # Uncomment to define a different URI/URL for the "edit" option
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "nav" option is where you define the navigation to show in MkDocs. |
|
||||||
|
# | |
|
||||||
|
# | Depending on the theme you use will the resulting Navigation look different. |
|
||||||
|
# | |
|
||||||
|
# | You can set different types of navigations. Either just the path, the path with a separate title or |
|
||||||
|
# | an external URL. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#documentation-layout |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
nav:
|
||||||
|
- Home: index.md
|
||||||
|
- Python:
|
||||||
|
- Installation: python/installation.md
|
||||||
|
- API Usage: python/usage.md
|
||||||
|
- Developer Guide: python/developer_guide.md
|
||||||
|
- C++ Build:
|
||||||
|
- Usage & CUDA: usage/usage.md
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "theme" section allows you to define what theme to use. |
|
||||||
|
# | It is also used for theme-specific options, but also for advanced stuff such as theme-extensions, if |
|
||||||
|
# | the theme actually supports it. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#theme |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
theme:
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "name" option is where you define the theme to use. |
|
||||||
|
# | |
|
||||||
|
# | Note that not all themes are included by default and will require you to install them first. |
|
||||||
|
# | The Material theme is one of them. See the "Read More" link for instructions on how to install it. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/getting-started/ |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
name: 'material'
|
||||||
|
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The Material theme allows "theme-extsnions", meaning that you can override parts of it by either |
|
||||||
|
# | overriding a particular file, or only parts (blocks) of it. |
|
||||||
|
# | |
|
||||||
|
# | If you want to override parts of Material, uncomment the "custom_dir" option below and set the |
|
||||||
|
# | folder (relative to the mkdocs.yml file) where your theme extensions will be located at. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#custom_dir |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/customization/#extending-the-theme |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#custom_dir: 'theme'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "favicon" option allows you to set your own image/icon to use in the browser-tab. |
|
||||||
|
# | |
|
||||||
|
# | Pretty much all image types are supported, but it's recommended to use a PNG, SVG or ICO image for |
|
||||||
|
# | the favicon. |
|
||||||
|
# | |
|
||||||
|
# | The directory is relative to the "docs_dir". |
|
||||||
|
# | |
|
||||||
|
# | Example: Having a favicon.png in docs/assets/images will result in the "favicon" setting showing |
|
||||||
|
# | 'assets/images/favicon.png' |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#favicon |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#favicon: 'assets/images/favicon.png'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "palette" section is a Material option and allows you to define specific style options such as |
|
||||||
|
# | Color-Scheme, and primary and secondary Color. |
|
||||||
|
# | |
|
||||||
|
# | You can also define multiple palettes that can have different Color Schemses and primary and/or |
|
||||||
|
# | secondary Colors. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/ |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-palette-toggle |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
palette:
|
||||||
|
|
||||||
|
# Palette toggle for light mode
|
||||||
|
- media: "(prefers-color-scheme: light)"
|
||||||
|
scheme: default
|
||||||
|
primary: 'indigo'
|
||||||
|
accent: 'indigo'
|
||||||
|
toggle:
|
||||||
|
icon: material/brightness-7
|
||||||
|
name: Switch to dark mode
|
||||||
|
|
||||||
|
# Palette toggle for dark mode
|
||||||
|
- media: "(prefers-color-scheme: dark)"
|
||||||
|
scheme: slate
|
||||||
|
primary: 'indigo'
|
||||||
|
accent: 'indigo'
|
||||||
|
toggle:
|
||||||
|
icon: material/brightness-4
|
||||||
|
name: Switch to light mode
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | With the "font" option can you set a different font to use. |
|
||||||
|
# | |
|
||||||
|
# | Material supports all Google fonts, but you can also define your own ones if you choose so. |
|
||||||
|
# | |
|
||||||
|
# | The "text" option is used for the regular font while "code" is used for code blocks, inline code and |
|
||||||
|
# | similar. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/ |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#font:
|
||||||
|
# text: 'Roboto'
|
||||||
|
# code: 'Roboto Mono'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | Material suppors more than 40 different languages which you can set using the "language" option |
|
||||||
|
# | below. |
|
||||||
|
# | |
|
||||||
|
# | The default language is "en" (English). |
|
||||||
|
# | |
|
||||||
|
# | You can also enable/set a "selector" to allow switching between languages. |
|
||||||
|
# | See the "alternate" option in the "extra" section below for more information on this topic. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/ |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#language: 'en'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "direction" option is commonly used together with the "language" option. |
|
||||||
|
# | |
|
||||||
|
# | It allows you to change the text direction from the default left-to-right (ltr) to right-to-left |
|
||||||
|
# | (rtl) which is used in certain languages. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#directionality |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#direction: 'ltr'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "features" option allows you to enable specific features of Material, by adding them to the |
|
||||||
|
# | list. |
|
||||||
|
# | |
|
||||||
|
# | Features are in the format <category>.<name>. As an example, the feature to enable tabs is called |
|
||||||
|
# | navigation.tabs. |
|
||||||
|
# | |
|
||||||
|
# | The list below contains all known features of Material. |
|
||||||
|
# | |
|
||||||
|
# | Features marked with a * are currently Insiders-only. (Last update: 11th December 2021) |
|
||||||
|
# | https://squidfunk.github.io/mkdocs-material/insiders/ |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/ |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
features:
|
||||||
|
# Announce
|
||||||
|
#
|
||||||
|
#- announce.dismiss # Adds a "X" button to dismiss a news banner/mark it as read.*
|
||||||
|
|
||||||
|
# Header
|
||||||
|
#
|
||||||
|
#- header.autohide # Hide header when user scrolls past a specific point.
|
||||||
|
|
||||||
|
# Navigation:
|
||||||
|
#
|
||||||
|
#- navigation.expand # Expand all collapsable sections.
|
||||||
|
#- navigation.instant # Instant loading pages.
|
||||||
|
#- navigation.indexes # Attach pages directly to Sections. Incompatible with "toc.integrate"
|
||||||
|
#- navigation.sections # Render top sections as groups.
|
||||||
|
- navigation.tabs # Render top sections as tabs at the top.
|
||||||
|
#- navigation.tabs.sticky # Tabs won't disappear when scrolling down. Requires "navigation.tabs".
|
||||||
|
#- navigation.top # Adds a "Back to top" that is shown when scrolling up.
|
||||||
|
#- navigation.tracking # Updates the url with highlighted section anchor.
|
||||||
|
|
||||||
|
# Search
|
||||||
|
#
|
||||||
|
#- search.highlight # Search will highlight the searched word(s) on the page.*
|
||||||
|
#- search.share # Adds an option to share a search query link.*
|
||||||
|
#- search.suggest # Search will suggest the likeliest completion for a word.*
|
||||||
|
|
||||||
|
# Table of Contents
|
||||||
|
#
|
||||||
|
#- toc.integrate # Include the TOC sections in the left navugation.
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "icon" section allows you to define a icon to use for the logo and/or repository. |
|
||||||
|
# | |
|
||||||
|
# | To use already available icons will you need to set the right path for it, depending on which you |
|
||||||
|
# | want to use. |
|
||||||
|
# | |
|
||||||
|
# | Available icons: |
|
||||||
|
# | - FontAwesome |
|
||||||
|
# | - Brands: fontawesome/brands/... (https://fontawesome.com/icons?d=gallery&p=2&s=brands&m=free) |
|
||||||
|
# | - Regular: fontawesome/regular/... (https://fontawesome.com/icons?d=gallery&p=2&s=regular&m=free) |
|
||||||
|
# | - Solid: fontawesome/solid/... (https://fontawesome.com/icons?d=gallery&p=2&s=solid&m=free) |
|
||||||
|
# | |
|
||||||
|
# | - Material Design Icons: material/... (https://materialdesignicons.com/) |
|
||||||
|
# | |
|
||||||
|
# | - Octicons: octicons/... (https://primer.style/octicons/) |
|
||||||
|
# | |
|
||||||
|
# | You can also define your own Image for the logo. To do that, remove the "logo" option from "icon" |
|
||||||
|
# | instead add a "logo" option on the same level as the "icon" one, where you then set the path |
|
||||||
|
# | (relative to the "docs_dir") to the icon to use. Supported are all images types, including SVG. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
icon:
|
||||||
|
logo: 'material/library'
|
||||||
|
repo: 'material/library'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "admonition" option allows you to set a different icon for each admonition type. |
|
||||||
|
# | |
|
||||||
|
# | This is currently a Insiders-only feature. (Last update: 7th October 2021) |
|
||||||
|
# | https://squidfunk.github.io/mkdocs-material/insiders/ |
|
||||||
|
# | |
|
||||||
|
# | Supported are all bundled icons: |
|
||||||
|
# | - FontAwesome |
|
||||||
|
# | - Brands: fontawesome/brands/... (https://fontawesome.com/icons?d=gallery&p=2&s=brands&m=free) |
|
||||||
|
# | - Regular: fontawesome/regular/... (https://fontawesome.com/icons?d=gallery&p=2&s=regular&m=free) |
|
||||||
|
# | - Solid: fontawesome/solid/... (https://fontawesome.com/icons?d=gallery&p=2&s=solid&m=free) |
|
||||||
|
# | |
|
||||||
|
# | - Material Design Icons: material/... (https://materialdesignicons.com/) |
|
||||||
|
# | |
|
||||||
|
# | - Octicons: octicons/... (https://primer.style/octicons/) |
|
||||||
|
# | |
|
||||||
|
# | You can also create and use your own icons. See the documentation for more information. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/reference/admonitions/#changing-the-icons |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#admonition:
|
||||||
|
# note: 'octicons/tag-16'
|
||||||
|
# abstract: 'octicons/checklist-16'
|
||||||
|
# info: 'octicons/info-16'
|
||||||
|
# tip: 'octicons/squirrel-16'
|
||||||
|
# success: 'octicons/check-16'
|
||||||
|
# question: 'octicons/question-16'
|
||||||
|
# warning: 'octicons/alert-16'
|
||||||
|
# failure: 'octicons/x-circle-16'
|
||||||
|
# danger: 'octicons/zap-16'
|
||||||
|
# bug: 'octicons/bug-16'
|
||||||
|
# example: 'octicons/beaker-16'
|
||||||
|
# quote: 'octicons/quote-16'
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | With the "extra_css" option can you add your own (S)CSS files to enhance the documentation. |
|
||||||
|
# | |
|
||||||
|
# | The path to the file is relative to the "docs_dir". |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#extra_css |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
extra_css:
|
||||||
|
- assets/css/extra.css
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | Similar to the "extra_css" option does the "extra_javascript" option allow you to set custom JS files |
|
||||||
|
# | to add extra featurues. |
|
||||||
|
# | |
|
||||||
|
# | The path to the file is relative to the "docs_dir". |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#extra_javascript |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
extra_javascript:
|
||||||
|
- https://polyfill.io/v3/polyfill.min.js?features=es6
|
||||||
|
- https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "extra" section contains pretty much anything you want, as long as it is a valid key-value pair. |
|
||||||
|
# | |
|
||||||
|
# | Material uses this section for different custom settings that wouldn't fit in the theme section. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#extra |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
extra:
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The social section allows you to set a list of entries which would be displayed in the footer of the |
|
||||||
|
# | page. |
|
||||||
|
# | |
|
||||||
|
# | Each entry has the exact same options: |
|
||||||
|
# | - icon: Path to the SVG icon to use. See "icon" section for available icon sets. |
|
||||||
|
# | - link: URL to which the icon should link. |
|
||||||
|
# | - name: Optional Name that would be displayed as title on hover. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#social-links |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
social:
|
||||||
|
- icon: 'fontawesome/brands/github'
|
||||||
|
link: 'https://github.com/Andre601/mkdocs-template'
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | Allows you to hide the "Made with Material for MkDocs" text in the footer of the pages by setting |
|
||||||
|
# | this to "true". |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#generator-notice |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#generator: true
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "manifest" option allows you to define a .manifest file to use. |
|
||||||
|
# | |
|
||||||
|
# | A .manifest file makes the doc act like a web-application and tells it how to behave when installed. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/reference/meta-tags/#adding-a-web-app-manifest |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#manifest: manifest.webmanifest
|
||||||
|
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | The "alternate" option can be used to create a selector to switch languages. |
|
||||||
|
# | |
|
||||||
|
# | Using this requires you to create a specific, more complicated MkDocs setup. |
|
||||||
|
# | |
|
||||||
|
# | A Setup Guide for multi-language docs can be found here: |
|
||||||
|
# | https://github.com/squidfunk/mkdocs-material/discussions/2346 |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector |
|
||||||
|
# | |
|
||||||
|
# +------------------------------------------------------------------------------------------------------+
|
||||||
|
#alternate:
|
||||||
|
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
# | |
|
||||||
|
# | MkDocs allows the usage of Markdown extensions which can do various things. |
|
||||||
|
# | |
|
||||||
|
# | Material includes the pymdownx extension which provides a lot of useful features to use. |
|
||||||
|
# | |
|
||||||
|
# | Note that some extensions may use specific settings that you need to set. |
|
||||||
|
# | Please check out the official documentation of PyMdownx for more information: |
|
||||||
|
# | https://facelessuser.github.io/pymdown-extensions/ |
|
||||||
|
# | |
|
||||||
|
# | Material already provides required CSS and JS values for the PyMdownX Extensions, which means you do |
|
||||||
|
# | not need to set them up yourself. |
|
||||||
|
# | |
|
||||||
|
# | Read More: |
|
||||||
|
# | - https://www.mkdocs.org/user-guide/configuration/#markdown_extensions |
|
||||||
|
# | |
|
||||||
|
# +--------------------------------------------------------------------------------------------------------+
|
||||||
|
markdown_extensions:
|
||||||
|
- markdown.extensions.admonition:
|
||||||
|
- markdown.extensions.codehilite:
|
||||||
|
guess_lang: false
|
||||||
|
- markdown.extensions.toc:
|
||||||
|
permalink: true
|
||||||
|
- pymdownx.arithmatex:
|
||||||
|
generic: true
|
||||||
|
- attr_list
|
||||||
|
- md_in_html
|
||||||
|
- pymdownx.blocks.caption
|
||||||
|
- admonition
|
||||||
|
- pymdownx.highlight:
|
||||||
|
anchor_linenums: true
|
||||||
|
- pymdownx.superfences
|
||||||
|
- pymdownx.tabbed:
|
||||||
|
alternate_style: true
|
||||||
|
- pymdownx.details
|
||||||
|
- attr_list
|
||||||
|
- tables
|
||||||
|
|
||||||
|
#- pymdownx.b64:
|
||||||
|
#- pymdownx.betterem:
|
||||||
|
#- pymdownx.caret:
|
||||||
|
#- pymdownx.critic:
|
||||||
|
#- pymdownx.details:
|
||||||
|
#- pymdownx.emoji:
|
||||||
|
#- pymdownx.escapeall:
|
||||||
|
#- pymdownx.extra:
|
||||||
|
#- pymdownx.extrarawhtml:
|
||||||
|
#- pymdownx.highlight:
|
||||||
|
#- pymdownx.inlinehilite:
|
||||||
|
#- pymdownx.keys:
|
||||||
|
#- pymdownx.magiclink:
|
||||||
|
#- pymdownx.mark:
|
||||||
|
#- pymdownx.pathconverter:
|
||||||
|
#- pymdownx.progressbar:
|
||||||
|
#- pymdownx.smartsymbols:
|
||||||
|
#- pymdownx.snippets:
|
||||||
|
#- pymdownx.striphtml:
|
||||||
|
#- pymdownx.superfences:
|
||||||
|
#- pymdownx.tabbed:
|
||||||
|
#- pymdownx.tasklist:
|
||||||
|
#- pymdownx.tilde:
|
||||||
|
# - exporter:
|
||||||
|
# formats:
|
||||||
|
# pdf:
|
||||||
|
# enabled: !ENV [MKDOCS_EXPORTER_PDF, true]
|
||||||
|
# concurrency: 8
|
||||||
|
# stylesheets:
|
||||||
|
# - resources/stylesheets/pdf.scss
|
||||||
|
# covers:
|
||||||
|
# front: resources/templates/covers/front.html.j2
|
||||||
|
# back: resources/templates/covers/back.html.j2
|
||||||
|
# aggregator:
|
||||||
|
# enabled: true
|
||||||
|
# output: .well-known/site.pdf
|
||||||
|
# covers: all
|
||||||
|
|
||||||
|
# theme:
|
||||||
|
# name: material
|
||||||
|
# palette:
|
||||||
|
# - scheme: default
|
||||||
|
# primary: indigo
|
||||||
|
# accent: blue
|
||||||
|
# toggle:
|
||||||
|
# icon: material/brightness-7
|
||||||
|
# name: Switch to dark mode
|
||||||
|
# - scheme: slate
|
||||||
|
# primary: indigo
|
||||||
|
# accent: blue
|
||||||
|
# toggle:
|
||||||
|
# icon: material/brightness-4
|
||||||
|
# name: Switch to light mode
|
||||||
|
# features:
|
||||||
|
# - navigation.tabs
|
||||||
|
# - navigation.sections
|
||||||
|
# - navigation.top
|
||||||
|
# - content.code.copy
|
||||||
|
# - content.tabs.link
|
||||||
|
|
||||||
|
# plugins:
|
||||||
|
# - search
|
||||||
|
|
||||||
|
# markdown_extensions:
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ endif()
|
|||||||
target_link_libraries(${libname} ${LIBRARIES})
|
target_link_libraries(${libname} ${LIBRARIES})
|
||||||
|
|
||||||
install(TARGETS ${libname}
|
install(TARGETS ${libname}
|
||||||
EXPORT "${PROJECT_NAME}Targets"
|
EXPORT "uLibTargets"
|
||||||
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
||||||
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#ifdef USE_CUDA
|
#ifdef USE_CUDA
|
||||||
#include <cuda_runtime.h>
|
#include <cuda_runtime.h>
|
||||||
|
#include <thrust/device_vector.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
|
|||||||
@@ -37,6 +37,11 @@
|
|||||||
#include <Core/SmartPointer.h>
|
#include <Core/SmartPointer.h>
|
||||||
#include <Core/StaticInterface.h>
|
#include <Core/StaticInterface.h>
|
||||||
|
|
||||||
|
#ifdef USE_CUDA
|
||||||
|
#include <thrust/device_ptr.h>
|
||||||
|
#include <thrust/device_vector.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
|
|
||||||
// MetaAllocator Implementation ...
|
// MetaAllocator Implementation ...
|
||||||
@@ -117,10 +122,6 @@ bool operator!=(const MetaAllocator<T> &, const MetaAllocator<U> &) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Vector Implemetation ... wraps std::vector
|
// Vector Implemetation ... wraps std::vector
|
||||||
template <typename T> class Vector : public std::vector<T, MetaAllocator<T>> {
|
template <typename T> class Vector : public std::vector<T, MetaAllocator<T>> {
|
||||||
typedef std::vector<T, MetaAllocator<T>> BaseClass;
|
typedef std::vector<T, MetaAllocator<T>> BaseClass;
|
||||||
@@ -173,6 +174,42 @@ public:
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_CUDA
|
||||||
|
/// Returns a thrust::device_ptr to the VRAM data (valid after MoveToVRAM()).
|
||||||
|
/// thrust::device_ptr<T> is itself a random-access iterator compatible with
|
||||||
|
/// all thrust algorithms (thrust::transform, thrust::sort,
|
||||||
|
/// thrust::for_each…).
|
||||||
|
thrust::device_ptr<T> DeviceData() {
|
||||||
|
if (auto alloc = MetaAllocator<T>::GetDataAllocator(BaseClass::data())) {
|
||||||
|
return thrust::device_pointer_cast(alloc->GetVRAMData());
|
||||||
|
}
|
||||||
|
return thrust::device_ptr<T>(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
thrust::device_ptr<const T> DeviceData() const {
|
||||||
|
if (auto alloc = MetaAllocator<T>::GetDataAllocator(
|
||||||
|
const_cast<T *>(BaseClass::data()))) {
|
||||||
|
return thrust::device_pointer_cast(
|
||||||
|
static_cast<const T *>(alloc->GetVRAMData()));
|
||||||
|
}
|
||||||
|
return thrust::device_ptr<const T>(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Device-side begin iterator (valid after MoveToVRAM()).
|
||||||
|
thrust::device_ptr<T> DeviceBegin() { return DeviceData(); }
|
||||||
|
|
||||||
|
/// Device-side end iterator (valid after MoveToVRAM()).
|
||||||
|
thrust::device_ptr<T> DeviceEnd() {
|
||||||
|
return DeviceData() + static_cast<std::ptrdiff_t>(BaseClass::size());
|
||||||
|
}
|
||||||
|
|
||||||
|
thrust::device_ptr<const T> DeviceBegin() const { return DeviceData(); }
|
||||||
|
|
||||||
|
thrust::device_ptr<const T> DeviceEnd() const {
|
||||||
|
return DeviceData() + static_cast<std::ptrdiff_t>(BaseClass::size());
|
||||||
|
}
|
||||||
|
#endif // USE_CUDA
|
||||||
|
|
||||||
inline void PrintSelf(std::ostream &o);
|
inline void PrintSelf(std::ostream &o);
|
||||||
|
|
||||||
// Overrides for auto-sync //
|
// Overrides for auto-sync //
|
||||||
|
|||||||
@@ -31,3 +31,8 @@ set(LIBRARIES
|
|||||||
${ROOT_LIBRARIES}
|
${ROOT_LIBRARIES}
|
||||||
)
|
)
|
||||||
uLib_add_tests(Core)
|
uLib_add_tests(Core)
|
||||||
|
|
||||||
|
if(USE_CUDA)
|
||||||
|
set_source_files_properties(VectorMetaAllocatorTest.cpp PROPERTIES LANGUAGE CUDA)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,15 @@
|
|||||||
#include "testing-prototype.h"
|
#include "testing-prototype.h"
|
||||||
#include <Core/Vector.h>
|
#include <Core/Vector.h>
|
||||||
|
|
||||||
|
#ifdef USE_CUDA
|
||||||
|
#include <thrust/device_ptr.h>
|
||||||
|
#include <thrust/transform.h>
|
||||||
|
|
||||||
|
struct DoubleFunctor {
|
||||||
|
__host__ __device__ int operator()(int x) const { return x * 2; }
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
BEGIN_TESTING(VectorMetaAllocator);
|
BEGIN_TESTING(VectorMetaAllocator);
|
||||||
|
|
||||||
@@ -41,14 +50,31 @@ int main() {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify DeviceData() matches GetVRAMData()
|
||||||
|
{
|
||||||
|
thrust::device_ptr<int> dev_ptr = v.DeviceData();
|
||||||
|
if (dev_ptr.get() != vram_ptr) {
|
||||||
|
std::cout << "Error: DeviceData() does not match GetVRAMData()!\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
std::cout << "DeviceData() matches GetVRAMData(). OK\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use thrust::transform via DeviceBegin()/DeviceEnd() to double all elements
|
||||||
|
// on device
|
||||||
|
std::cout << "Doubling elements on device via thrust::transform...\n";
|
||||||
|
thrust::transform(v.DeviceBegin(), v.DeviceEnd(), v.DeviceBegin(),
|
||||||
|
DoubleFunctor{});
|
||||||
|
|
||||||
std::cout << "Moving back to RAM...\n";
|
std::cout << "Moving back to RAM...\n";
|
||||||
v.MoveToRAM();
|
v.MoveToRAM();
|
||||||
|
|
||||||
std::cout << "RAM contents after VRAM trip: ";
|
std::cout << "RAM contents after VRAM trip + thrust transform: ";
|
||||||
for (size_t i = 0; i < v.size(); ++i) {
|
for (size_t i = 0; i < v.size(); ++i) {
|
||||||
std::cout << v[i] << " ";
|
std::cout << v[i] << " ";
|
||||||
if (v[i] != (int)(i + 1)) {
|
if (v[i] != (int)((i + 1) * 2)) {
|
||||||
std::cout << "\nError: Data corrupted after RAM->VRAM->RAM trip at index "
|
std::cout << "\nError: Data corrupted after RAM->VRAM->thrust->RAM trip "
|
||||||
|
"at index "
|
||||||
<< i << "\n";
|
<< i << "\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
set(HEADERS MuonScatter.h MuonError.h MuonEvent.h)
|
|
||||||
|
|
||||||
set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Detectors PARENT_SCOPE)
|
|
||||||
|
|
||||||
|
|
||||||
install(FILES ${HEADERS}
|
|
||||||
DESTINATION ${INSTALL_INC_DIR}/Detectors)
|
|
||||||
|
|
||||||
if(BUILD_TESTING)
|
|
||||||
include(uLibTargetMacros)
|
|
||||||
add_subdirectory(testing)
|
|
||||||
endif()
|
|
||||||
12
src/HEP/CMakeLists.txt
Normal file
12
src/HEP/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
################################################################################
|
||||||
|
##### HEP - High Energy Physics modules ########################################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
include_directories(${SRC_DIR}/HEP)
|
||||||
|
|
||||||
|
add_subdirectory(Detectors)
|
||||||
|
add_subdirectory(Geant)
|
||||||
|
|
||||||
|
set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} PARENT_SCOPE)
|
||||||
|
set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} PARENT_SCOPE)
|
||||||
34
src/HEP/Detectors/CMakeLists.txt
Normal file
34
src/HEP/Detectors/CMakeLists.txt
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
set(HEADERS
|
||||||
|
ChamberHitEvent.h
|
||||||
|
DetectorChamber.h
|
||||||
|
ExperimentFitEvent.h
|
||||||
|
HierarchicalEncoding.h
|
||||||
|
Hit.h
|
||||||
|
HitMC.h
|
||||||
|
LinearFit.h
|
||||||
|
MuonError.h
|
||||||
|
MuonEvent.h
|
||||||
|
MuonScatter.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(libname ${PACKAGE_LIBPREFIX}Detectors)
|
||||||
|
set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE)
|
||||||
|
set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Detectors PARENT_SCOPE)
|
||||||
|
|
||||||
|
## Headers-only INTERFACE library
|
||||||
|
add_library(${libname} INTERFACE)
|
||||||
|
target_include_directories(${libname} INTERFACE
|
||||||
|
$<BUILD_INTERFACE:${SRC_DIR}>
|
||||||
|
$<INSTALL_INTERFACE:${INSTALL_INC_DIR}>
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS ${libname}
|
||||||
|
EXPORT "uLibTargets")
|
||||||
|
|
||||||
|
install(FILES ${HEADERS}
|
||||||
|
DESTINATION ${INSTALL_INC_DIR}/HEP/Detectors)
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
include(uLibTargetMacros)
|
||||||
|
add_subdirectory(testing)
|
||||||
|
endif()
|
||||||
52
src/HEP/Geant/CMakeLists.txt
Normal file
52
src/HEP/Geant/CMakeLists.txt
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
################################################################################
|
||||||
|
##### HEP/Geant - Geant4 integration library ###################################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
find_package(Geant4 QUIET)
|
||||||
|
|
||||||
|
if(NOT Geant4_FOUND)
|
||||||
|
message(STATUS "Geant4 not found - skipping mutomGeant library")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Geant4 found: ${Geant4_VERSION}")
|
||||||
|
include(${Geant4_USE_FILE})
|
||||||
|
|
||||||
|
set(HEADERS
|
||||||
|
GeantEvent.h
|
||||||
|
Matter.h
|
||||||
|
Scene.h
|
||||||
|
Solid.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
Scene.cpp
|
||||||
|
Solid.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(libname ${PACKAGE_LIBPREFIX}Geant)
|
||||||
|
set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE)
|
||||||
|
set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Geant PARENT_SCOPE)
|
||||||
|
|
||||||
|
add_library(${libname} SHARED ${SOURCES})
|
||||||
|
set_target_properties(${libname} PROPERTIES
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
SOVERSION ${PROJECT_SOVERSION})
|
||||||
|
|
||||||
|
target_include_directories(${libname} PRIVATE ${Geant4_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
target_link_libraries(${libname}
|
||||||
|
${PACKAGE_LIBPREFIX}Core
|
||||||
|
${PACKAGE_LIBPREFIX}Math
|
||||||
|
${PACKAGE_LIBPREFIX}Detectors
|
||||||
|
${Geant4_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS ${libname}
|
||||||
|
EXPORT "uLibTargets"
|
||||||
|
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
||||||
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
||||||
|
|
||||||
|
install(FILES ${HEADERS}
|
||||||
|
DESTINATION ${INSTALL_INC_DIR}/HEP/Geant)
|
||||||
@@ -23,8 +23,6 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef U_GEANTEVENT_H
|
#ifndef U_GEANTEVENT_H
|
||||||
#define U_GEANTEVENT_H
|
#define U_GEANTEVENT_H
|
||||||
|
|
||||||
@@ -38,14 +36,11 @@ namespace uLib {
|
|||||||
|
|
||||||
class GeantEventData {
|
class GeantEventData {
|
||||||
public:
|
public:
|
||||||
uLibGetMacro (EventID, Id_t )
|
uLibGetMacro(EventID, Id_t) uLibGetMacro(Momentum, Scalarf)
|
||||||
uLibGetMacro (Momentum,Scalarf )
|
uLibConstRefMacro(GenPos, Vector3f) uLibConstRefMacro(GenDir, Vector3f)
|
||||||
uLibConstRefMacro (GenPos, Vector3f)
|
uLibConstRefMacro(ChEvents, Vector<ChamberHitEventData>)
|
||||||
uLibConstRefMacro (GenDir, Vector3f)
|
|
||||||
uLibConstRefMacro (ChEvents,Vector<ChamberHitEventData>)
|
|
||||||
|
|
||||||
private:
|
private : friend class GeantEvent;
|
||||||
friend class GeantEvent;
|
|
||||||
Id_t m_EventID;
|
Id_t m_EventID;
|
||||||
Scalarf m_Momentum;
|
Scalarf m_Momentum;
|
||||||
Vector3f m_GenPos;
|
Vector3f m_GenPos;
|
||||||
@@ -55,15 +50,11 @@ private:
|
|||||||
|
|
||||||
class GeantEvent {
|
class GeantEvent {
|
||||||
public:
|
public:
|
||||||
uLibSetMacro (EventID, Id_t )
|
uLibSetMacro(EventID, Id_t) uLibSetMacro(Momentum, Scalarf)
|
||||||
uLibSetMacro (Momentum,Scalarf )
|
uLibRefMacro(GenPos, Vector3f) uLibRefMacro(GenDir, Vector3f)
|
||||||
uLibRefMacro (GenPos, Vector3f)
|
uLibRefMacro(ChEvents, Vector<ChamberHitEventData>)
|
||||||
uLibRefMacro (GenDir, Vector3f)
|
|
||||||
uLibRefMacro (ChEvents,Vector<ChamberHitEventData>)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace uLib
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // GEANTEVENT_H
|
#endif // GEANTEVENT_H
|
||||||
@@ -54,7 +54,7 @@ endif()
|
|||||||
|
|
||||||
|
|
||||||
install(TARGETS ${libname}
|
install(TARGETS ${libname}
|
||||||
EXPORT "${PROJECT_NAME}Targets"
|
EXPORT "uLibTargets"
|
||||||
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
||||||
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
||||||
|
|
||||||
|
|||||||
@@ -29,62 +29,146 @@
|
|||||||
#define U_CONTAINERBOX_H
|
#define U_CONTAINERBOX_H
|
||||||
|
|
||||||
#include "Geometry.h"
|
#include "Geometry.h"
|
||||||
|
#include "Math/Dense.h"
|
||||||
|
#include "Math/Transform.h"
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents an oriented bounding box (OBB) within a hierarchical transformation system.
|
||||||
|
*
|
||||||
|
* ContainerBox inherits from AffineTransform, which defines its parent coordinate system.
|
||||||
|
* It contains an internal local transformation (m_LocalT) that defines the box's
|
||||||
|
* specific origin and size relative to its own coordinate system.
|
||||||
|
*/
|
||||||
class ContainerBox : public AffineTransform {
|
class ContainerBox : public AffineTransform {
|
||||||
public:
|
|
||||||
ContainerBox() : m_LocalT(this) {}
|
|
||||||
|
|
||||||
|
typedef AffineTransform BaseClass;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Default constructor.
|
||||||
|
* Initializes the local transformation with this instance as its parent.
|
||||||
|
*/
|
||||||
|
ContainerBox() :
|
||||||
|
m_LocalT(this) // BaseClass is Parent of m_LocalTransform
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy constructor.
|
||||||
|
* @param copy The ContainerBox instance to copy from.
|
||||||
|
*/
|
||||||
ContainerBox(const ContainerBox ©) :
|
ContainerBox(const ContainerBox ©) :
|
||||||
m_LocalT(this),
|
m_LocalT(this), // BaseClass is Parent of m_LocalTransform
|
||||||
AffineTransform(copy)
|
AffineTransform(copy)
|
||||||
{
|
{
|
||||||
// FIX for performance //
|
|
||||||
this->SetOrigin(copy.GetOrigin());
|
this->SetOrigin(copy.GetOrigin());
|
||||||
this->SetSize(copy.GetSize());
|
this->SetSize(copy.GetSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the box origin relative to its coordinate system.
|
||||||
|
* @param v The origin position vector.
|
||||||
|
*/
|
||||||
inline void SetOrigin(const Vector3f &v) { m_LocalT.SetPosition(v); }
|
inline void SetOrigin(const Vector3f &v) { m_LocalT.SetPosition(v); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the box origin relative to its coordinate system.
|
||||||
|
* @return The origin position vector.
|
||||||
|
*/
|
||||||
inline Vector3f GetOrigin() const { return m_LocalT.GetPosition(); }
|
inline Vector3f GetOrigin() const { return m_LocalT.GetPosition(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the size of the box.
|
||||||
|
* Re-initializes the local transformation and applies the new scale.
|
||||||
|
* @param v The size vector (width, height, depth).
|
||||||
|
*/
|
||||||
void SetSize(const Vector3f &v) {
|
void SetSize(const Vector3f &v) {
|
||||||
Vector3f pos = this->GetOrigin();
|
Vector3f pos = this->GetOrigin();
|
||||||
m_LocalT = AffineTransform(this);
|
m_LocalT = AffineTransform(this); // regenerate local transform
|
||||||
m_LocalT.Scale(v);
|
m_LocalT.Scale(v);
|
||||||
m_LocalT.SetPosition(pos);
|
m_LocalT.SetPosition(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the current size (scale) of the box.
|
||||||
|
* @return The size vector.
|
||||||
|
*/
|
||||||
inline Vector3f GetSize() const { return m_LocalT.GetScale(); }
|
inline Vector3f GetSize() const { return m_LocalT.GetScale(); }
|
||||||
|
|
||||||
// FIX... //
|
/**
|
||||||
|
* @brief Swaps two local axes of the box.
|
||||||
|
* @param first Index of the first axis (0=X, 1=Y, 2=Z).
|
||||||
|
* @param second Index of the second axis (0=X, 1=Y, 2=Z).
|
||||||
|
*/
|
||||||
inline void FlipLocalAxes(int first, int second)
|
inline void FlipLocalAxes(int first, int second)
|
||||||
{ m_LocalT.FlipAxes(first,second); }
|
{ m_LocalT.FlipAxes(first,second); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the world transformation matrix of the box's volume.
|
||||||
|
* @return A 4x4 transformation matrix.
|
||||||
|
*/
|
||||||
Matrix4f GetWorldMatrix() const { return m_LocalT.GetWorldMatrix(); }
|
Matrix4f GetWorldMatrix() const { return m_LocalT.GetWorldMatrix(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the local transformation matrix of the box's volume.
|
||||||
|
* @return A 4x4 transformation matrix.
|
||||||
|
*/
|
||||||
|
Matrix4f GetLocalMatrix() const { return m_LocalT.GetMatrix(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Transforms a point from box-local space to world space.
|
||||||
|
* @param v The local point (4D homogeneous vector).
|
||||||
|
* @return The transformed point in world space.
|
||||||
|
*/
|
||||||
inline Vector4f GetWorldPoint(const Vector4f &v) const {
|
inline Vector4f GetWorldPoint(const Vector4f &v) const {
|
||||||
return m_LocalT.GetWorldMatrix() * v;
|
return m_LocalT.GetWorldMatrix() * v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Transforms a point from box-local space coordinates to world space.
|
||||||
|
* @param x X coordinate in local space.
|
||||||
|
* @param y Y coordinate in local space.
|
||||||
|
* @param z Z coordinate in local space.
|
||||||
|
* @return The transformed point in world space.
|
||||||
|
*/
|
||||||
inline Vector4f GetWorldPoint(const float x, const float y, const float z) {
|
inline Vector4f GetWorldPoint(const float x, const float y, const float z) {
|
||||||
return this->GetWorldPoint(Vector4f(x,y,z,1));
|
return this->GetWorldPoint(Vector4f(x,y,z,1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Transforms a point from world space to box-local space.
|
||||||
|
* @param v The world point (4D homogeneous vector).
|
||||||
|
* @return The transformed point in box-local space.
|
||||||
|
*/
|
||||||
inline Vector4f GetLocalPoint(const Vector4f &v) const {
|
inline Vector4f GetLocalPoint(const Vector4f &v) const {
|
||||||
return m_LocalT.GetWorldMatrix().inverse() * v;
|
return m_LocalT.GetWorldMatrix().inverse() * v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Transforms a point from world space coordinates to box-local space.
|
||||||
|
* @param x X coordinate in world space.
|
||||||
|
* @param y Y coordinate in world space.
|
||||||
|
* @param z Z coordinate in world space.
|
||||||
|
* @return The transformed point in box-local space.
|
||||||
|
*/
|
||||||
inline Vector4f GetLocalPoint(const float x, const float y, const float z) {
|
inline Vector4f GetLocalPoint(const float x, const float y, const float z) {
|
||||||
return this->GetLocalPoint(Vector4f(x,y,z,1));
|
return this->GetLocalPoint(Vector4f(x,y,z,1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Translate using transformation chain */
|
||||||
|
using BaseClass::Translate;
|
||||||
|
|
||||||
|
/** Rotate using transformation chain */
|
||||||
|
using BaseClass::Rotate;
|
||||||
|
|
||||||
|
/** Scale using transformation chain */
|
||||||
|
using BaseClass::Scale;
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AffineTransform m_LocalT;
|
AffineTransform m_LocalT;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace uLib {
|
|||||||
class Geometry : public AffineTransform {
|
class Geometry : public AffineTransform {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
inline Vector4f GetWorldPoint(const Vector4f &v) const {
|
inline Vector4f GetWorldPoint(const Vector4f v) const {
|
||||||
return this->GetWorldMatrix() * v;
|
return this->GetWorldMatrix() * v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
return this->GetWorldPoint(Vector4f(x,y,z,1));
|
return this->GetWorldPoint(Vector4f(x,y,z,1));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Vector4f GetLocalPoint(const Vector4f &v) const {
|
inline Vector4f GetLocalPoint(const Vector4f v) const {
|
||||||
return this->GetWorldMatrix().inverse() * v;
|
return this->GetWorldMatrix().inverse() * v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -84,8 +84,8 @@ public:
|
|||||||
|
|
||||||
inline void SetParent(AffineTransform *name) { this->m_Parent = name; }
|
inline void SetParent(AffineTransform *name) { this->m_Parent = name; }
|
||||||
|
|
||||||
inline void SetMatrix (Matrix4f &mat) { m_T.matrix() = mat; }
|
inline void SetMatrix (Matrix4f mat) { m_T.matrix() = mat; }
|
||||||
inline Matrix4f& GetMatrix () { return m_T.matrix(); }
|
inline Matrix4f GetMatrix() const { return m_T.matrix(); }
|
||||||
|
|
||||||
Matrix4f GetWorldMatrix() const
|
Matrix4f GetWorldMatrix() const
|
||||||
{
|
{
|
||||||
@@ -93,22 +93,22 @@ public:
|
|||||||
else return m_Parent->GetWorldMatrix() * m_T.matrix(); // T = B * A //
|
else return m_Parent->GetWorldMatrix() * m_T.matrix(); // T = B * A //
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void SetPosition(const Vector3f &v) { this->m_T.translation() = v; }
|
inline void SetPosition(const Vector3f v) { this->m_T.translation() = v; }
|
||||||
|
|
||||||
inline Vector3f GetPosition() const { return this->m_T.translation(); }
|
inline Vector3f GetPosition() const { return this->m_T.translation(); }
|
||||||
|
|
||||||
inline void SetRotation(const Matrix3f &m) { this->m_T.linear() = m; }
|
inline void SetRotation(const Matrix3f m) { this->m_T.linear() = m; }
|
||||||
|
|
||||||
inline Matrix3f GetRotation() const { return this->m_T.rotation(); }
|
inline Matrix3f GetRotation() const { return this->m_T.rotation(); }
|
||||||
|
|
||||||
inline void Translate(const Vector3f &v) { this->m_T.translate(v); }
|
inline void Translate(const Vector3f v) { this->m_T.translate(v); }
|
||||||
|
|
||||||
inline void Scale(const Vector3f &v) { this->m_T.scale(v); }
|
inline void Scale(const Vector3f v) { this->m_T.scale(v); }
|
||||||
|
|
||||||
inline Vector3f GetScale() const { return this->m_T.linear() * Vector3f(1,1,1); } // FIXXXXXXX
|
inline Vector3f GetScale() const { return this->m_T.linear() * Vector3f(1,1,1); } // FIXXXXXXX
|
||||||
|
|
||||||
|
|
||||||
inline void Rotate(const Matrix3f &m) { this->m_T.rotate(m); }
|
inline void Rotate(const Matrix3f m) { this->m_T.rotate(m); }
|
||||||
|
|
||||||
inline void Rotate(const float angle, Vector3f axis)
|
inline void Rotate(const float angle, Vector3f axis)
|
||||||
{
|
{
|
||||||
@@ -122,12 +122,12 @@ public:
|
|||||||
Rotate(angle,euler_axis);
|
Rotate(angle,euler_axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void PreRotate(const Matrix3f &m) { this->m_T.prerotate(m); }
|
inline void PreRotate(const Matrix3f m) { this->m_T.prerotate(m); }
|
||||||
|
|
||||||
inline void QuaternionRotate(const Vector4f &q)
|
inline void QuaternionRotate(const Vector4f q)
|
||||||
{ this->m_T.rotate(Eigen::Quaternion<float>(q)); }
|
{ this->m_T.rotate(Eigen::Quaternion<float>(q)); }
|
||||||
|
|
||||||
inline void EulerYZYRotate(const Vector3f &e) {
|
inline void EulerYZYRotate(const Vector3f e) {
|
||||||
Matrix3f mat;
|
Matrix3f mat;
|
||||||
mat = Eigen::AngleAxisf(e.x(), Vector3f::UnitY())
|
mat = Eigen::AngleAxisf(e.x(), Vector3f::UnitY())
|
||||||
* Eigen::AngleAxisf(e.y(), Vector3f::UnitZ())
|
* Eigen::AngleAxisf(e.y(), Vector3f::UnitZ())
|
||||||
|
|||||||
@@ -63,9 +63,16 @@ public:
|
|||||||
|
|
||||||
inline size_t Count() const { return this->m_Count; }
|
inline size_t Count() const { return this->m_Count; }
|
||||||
|
|
||||||
|
inline size_t size() const { return this->m_Count; }
|
||||||
|
|
||||||
inline const Scalarf &TotalLength() const { return this->m_TotalLength; }
|
inline const Scalarf &TotalLength() const { return this->m_TotalLength; }
|
||||||
|
|
||||||
inline void SetCount(size_t c) { this->m_Count = c; }
|
inline void SetCount(size_t c) {
|
||||||
|
this->m_Count = c;
|
||||||
|
if (this->m_Data.size() != c) {
|
||||||
|
this->m_Data.resize(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline void SetTotalLength(Scalarf tl) { this->m_TotalLength = tl; }
|
inline void SetTotalLength(Scalarf tl) { this->m_TotalLength = tl; }
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "Math/Dense.h"
|
#include "Math/Dense.h"
|
||||||
#include "Math/ContainerBox.h"
|
#include "Math/ContainerBox.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
@@ -52,41 +53,82 @@ int main()
|
|||||||
|
|
||||||
BEGIN_TESTING(Math ContainerBox);
|
BEGIN_TESTING(Math ContainerBox);
|
||||||
|
|
||||||
|
{
|
||||||
ContainerBox Cnt;
|
ContainerBox Cnt;
|
||||||
|
Cnt.SetOrigin(Vector3f(0,0,0));
|
||||||
// // Local transform:
|
Cnt.SetSize(Vector3f(2,2,2));
|
||||||
Cnt.SetOrigin(Vector3f(-1,-1,-1));
|
TEST0( Vector4f0(Cnt.GetOrigin().homogeneous() - HVector3f(0,0,0)) );
|
||||||
Cnt.SetSize(Vector3f(2,2,2)); // scaling //
|
|
||||||
std::cout << "Container scale is: " << Cnt.GetSize().transpose() << "\n";
|
|
||||||
std::cout << "Container scale is: " << Cnt.GetSize().transpose() << "\n";
|
|
||||||
TEST0( Vector4f0(Cnt.GetSize().homogeneous() - HVector3f(2,2,2)) );
|
TEST0( Vector4f0(Cnt.GetSize().homogeneous() - HVector3f(2,2,2)) );
|
||||||
|
|
||||||
|
|
||||||
ContainerBox Box;
|
HPoint3f pt = Cnt.GetLocalPoint(HPoint3f(0,0,0));
|
||||||
|
HPoint3f wp = Cnt.GetWorldPoint(pt);
|
||||||
|
TEST0( Vector4f0(wp - HPoint3f(0,0,0)) );
|
||||||
|
|
||||||
|
HPoint3f pt2 = Cnt.GetLocalPoint(HPoint3f(2,2,2));
|
||||||
|
HPoint3f wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(2,2,2)) );
|
||||||
|
|
||||||
|
HPoint3f pt3 = Cnt.GetLocalPoint(HPoint3f(1,1,1));
|
||||||
|
HPoint3f wp3 = Cnt.GetWorldPoint(pt3);
|
||||||
|
TEST0( Vector4f0(wp3 - HPoint3f(1,1,1)) );
|
||||||
|
|
||||||
|
HPoint3f pt4 = Cnt.GetLocalPoint(HPoint3f(1,2,3));
|
||||||
|
HPoint3f wp4 = Cnt.GetWorldPoint(pt4);
|
||||||
|
TEST0( Vector4f0(wp4 - HPoint3f(1,2,3)) );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
ContainerBox Cnt;
|
||||||
|
Cnt.SetOrigin(Vector3f(0,0,0));
|
||||||
|
Cnt.SetSize(Vector3f(2,2,2));
|
||||||
|
Cnt.EulerYZYRotate(Vector3f(M_PI,0,0));
|
||||||
|
|
||||||
|
HPoint3f pt = Cnt.GetLocalPoint(HPoint3f(0,0,0));
|
||||||
|
HPoint3f wp = Cnt.GetWorldPoint(pt);
|
||||||
|
TEST0( Vector4f0(wp - HPoint3f(0,0,0)) );
|
||||||
|
|
||||||
|
HPoint3f pt2 = Cnt.GetLocalPoint(HPoint3f(2,2,2));
|
||||||
|
HPoint3f wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(2,2,2)) );
|
||||||
|
|
||||||
|
pt2 = HPoint3f(1,1,1);
|
||||||
|
wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(-2,2,-2)) );
|
||||||
|
|
||||||
|
pt2 = HPoint3f(1,2,3);
|
||||||
|
wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(-2,4,-6)) );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
ContainerBox Cnt;
|
||||||
|
Cnt.SetOrigin(Vector3f(-1,-1,-1));
|
||||||
|
Cnt.SetSize(Vector3f(2,2,2)); // scaling //
|
||||||
|
|
||||||
|
HPoint3f pt2 = HPoint3f(.5,.5,.5);
|
||||||
|
HPoint3f wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(0,0,0)) );
|
||||||
|
|
||||||
|
pt2 = HPoint3f(0,0,0);
|
||||||
|
wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(-1,-1,-1)) );
|
||||||
|
|
||||||
|
Cnt.EulerYZYRotate(Vector3f(M_PI,0,0));
|
||||||
|
pt2 = HPoint3f(0,0,0);
|
||||||
|
wp2 = Cnt.GetWorldPoint(pt2);
|
||||||
|
TEST0( Vector4f0(wp2 - HPoint3f(1,-1,1)) );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
ContainerBox Box;
|
||||||
Box.SetPosition(Vector3f(1,1,1));
|
Box.SetPosition(Vector3f(1,1,1));
|
||||||
Box.SetSize(Vector3f(2,2,2));
|
Box.SetSize(Vector3f(2,2,2));
|
||||||
Box.EulerYZYRotate(Vector3f(0,0,0));
|
Box.EulerYZYRotate(Vector3f(0,0,0));
|
||||||
HPoint3f pt = Box.GetLocalPoint(HPoint3f(2,3,2));
|
HPoint3f pt = Box.GetLocalPoint(HPoint3f(2,3,2));
|
||||||
HPoint3f wp = Box.GetWorldPoint(pt);
|
HPoint3f wp = Box.GetWorldPoint(pt);
|
||||||
TEST0( Vector4f0(wp - HPoint3f(2,3,2)) );
|
TEST0( Vector4f0(wp - HPoint3f(2,3,2)) );
|
||||||
|
}
|
||||||
|
|
||||||
//// // Global
|
|
||||||
// Cnt.SetPosition(Vector3f(1,1,1));
|
|
||||||
// Cnt.EulerYZYRotate(Vector3f(M_PI_2,M_PI_2,0));
|
|
||||||
// HPoint3f p = Cnt.GetWorldPoint(1,1,1);
|
|
||||||
// //std::cout << p.transpose() << "\n";
|
|
||||||
// TEST0( Vector4f0(p - HVector3f(2,1,2)) );
|
|
||||||
// p = Cnt.GetWorldPoint(1,2,3);
|
|
||||||
// //std::cout << p.transpose() << "\n";
|
|
||||||
// TEST0( Vector4f0(p - HVector3f(4,1,3)) );
|
|
||||||
|
|
||||||
|
|
||||||
// // scaling //
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_TESTING;
|
END_TESTING;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ int main() {
|
|||||||
|
|
||||||
Raytracer rt(img);
|
Raytracer rt(img);
|
||||||
|
|
||||||
const size_t NUM_RAYS = 1000000;
|
const size_t NUM_RAYS = 100000;
|
||||||
std::cout << "Generating " << NUM_RAYS
|
std::cout << "Generating " << NUM_RAYS
|
||||||
<< " random ray pairs across a 100x100x100 grid...\n";
|
<< " random ray pairs across a 100x100x100 grid...\n";
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
include $(top_srcdir)/Common.am
|
|
||||||
|
|
||||||
library_includedir = $(includedir)/libmutom-${PACKAGE_VERSION}/ParticlePhysics/Geant
|
|
||||||
|
|
||||||
library_include_HEADERS =
|
|
||||||
|
|
||||||
_PPGEANT_SOURCES =
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libmutomppgeant.la
|
|
||||||
libmutomppgeant_la_SOURCES = ${_PPGEANT_SOURCES}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ target_include_directories(uLib_python PRIVATE
|
|||||||
|
|
||||||
# Install uLib_python within the uLib install target
|
# Install uLib_python within the uLib install target
|
||||||
install(TARGETS uLib_python
|
install(TARGETS uLib_python
|
||||||
EXPORT "${PROJECT_NAME}Targets"
|
EXPORT "uLibTargets"
|
||||||
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
||||||
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib
|
||||||
ARCHIVE DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib
|
ARCHIVE DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib
|
||||||
|
|||||||
@@ -243,15 +243,14 @@ void init_math(py::module_ &m) {
|
|||||||
.def("Scale", &AffineTransform::Scale)
|
.def("Scale", &AffineTransform::Scale)
|
||||||
.def("SetRotation", &AffineTransform::SetRotation)
|
.def("SetRotation", &AffineTransform::SetRotation)
|
||||||
.def("GetRotation", &AffineTransform::GetRotation)
|
.def("GetRotation", &AffineTransform::GetRotation)
|
||||||
.def("Rotate", py::overload_cast<const Matrix3f &>(&AffineTransform::Rotate))
|
.def("Rotate", &AffineTransform::Rotate)
|
||||||
.def("Rotate", py::overload_cast<const Vector3f>(&AffineTransform::Rotate))
|
|
||||||
.def("EulerYZYRotate", &AffineTransform::EulerYZYRotate)
|
.def("EulerYZYRotate", &AffineTransform::EulerYZYRotate)
|
||||||
.def("FlipAxes", &AffineTransform::FlipAxes);
|
.def("FlipAxes", &AffineTransform::FlipAxes);
|
||||||
|
|
||||||
py::class_<Geometry, AffineTransform>(m, "Geometry")
|
py::class_<Geometry, AffineTransform>(m, "Geometry")
|
||||||
.def(py::init<>())
|
.def(py::init<>())
|
||||||
.def("GetWorldPoint", py::overload_cast<const Vector4f &>(&Geometry::GetWorldPoint, py::const_))
|
.def("GetWorldPoint", &Geometry::GetWorldPoint)
|
||||||
.def("GetLocalPoint", py::overload_cast<const Vector4f &>(&Geometry::GetLocalPoint, py::const_));
|
.def("GetLocalPoint", &Geometry::GetLocalPoint);
|
||||||
|
|
||||||
py::class_<ContainerBox, AffineTransform>(m, "ContainerBox")
|
py::class_<ContainerBox, AffineTransform>(m, "ContainerBox")
|
||||||
.def(py::init<>())
|
.def(py::init<>())
|
||||||
@@ -260,8 +259,8 @@ void init_math(py::module_ &m) {
|
|||||||
.def("SetSize", &ContainerBox::SetSize)
|
.def("SetSize", &ContainerBox::SetSize)
|
||||||
.def("GetSize", &ContainerBox::GetSize)
|
.def("GetSize", &ContainerBox::GetSize)
|
||||||
.def("GetWorldMatrix", &ContainerBox::GetWorldMatrix)
|
.def("GetWorldMatrix", &ContainerBox::GetWorldMatrix)
|
||||||
.def("GetWorldPoint", py::overload_cast<const Vector4f &>(&ContainerBox::GetWorldPoint, py::const_))
|
.def("GetWorldPoint", &ContainerBox::GetWorldPoint)
|
||||||
.def("GetLocalPoint", py::overload_cast<const Vector4f &>(&ContainerBox::GetLocalPoint, py::const_));
|
.def("GetLocalPoint", &ContainerBox::GetLocalPoint);
|
||||||
|
|
||||||
py::enum_<StructuredData::_Order>(m, "StructuredDataOrder")
|
py::enum_<StructuredData::_Order>(m, "StructuredDataOrder")
|
||||||
.value("CustomOrder", StructuredData::CustomOrder)
|
.value("CustomOrder", StructuredData::CustomOrder)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ set_target_properties(${libname} PROPERTIES
|
|||||||
target_link_libraries(${libname} ${LIBRARIES})
|
target_link_libraries(${libname} ${LIBRARIES})
|
||||||
|
|
||||||
install(TARGETS ${libname}
|
install(TARGETS ${libname}
|
||||||
EXPORT "${PROJECT_NAME}Targets"
|
EXPORT "uLibTargets"
|
||||||
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
||||||
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,35 @@
|
|||||||
set(HEADERS uLibVtkInterface.h
|
set(HEADERS uLibVtkInterface.h
|
||||||
uLibVtkViewer.h
|
uLibVtkViewer.h
|
||||||
vtkContainerBox.h
|
vtkContainerBox.h
|
||||||
vtkMuonScatter.h
|
vtkHandlerWidget.h
|
||||||
vtkStructuredGrid.h
|
)
|
||||||
vtkVoxRaytracerRepresentation.h
|
|
||||||
vtkVoxImage.h)
|
|
||||||
|
|
||||||
set(SOURCES uLibVtkInterface.cxx
|
set(SOURCES uLibVtkInterface.cxx
|
||||||
uLibVtkViewer.cpp
|
uLibVtkViewer.cpp
|
||||||
vtkContainerBox.cpp
|
vtkContainerBox.cpp
|
||||||
vtkMuonScatter.cxx
|
vtkHandlerWidget.cpp
|
||||||
vtkStructuredGrid.cpp
|
)
|
||||||
vtkVoxRaytracerRepresentation.cpp
|
|
||||||
vtkVoxImage.cpp)
|
## Pull in Math VTK wrappers (sets MATH_SOURCES / MATH_HEADERS)
|
||||||
|
add_subdirectory(Math)
|
||||||
|
list(APPEND SOURCES ${MATH_SOURCES})
|
||||||
|
list(APPEND HEADERS ${MATH_HEADERS})
|
||||||
|
|
||||||
|
## Pull in HEP/Detectors VTK wrappers (sets HEP_DETECTORS_SOURCES / HEADERS)
|
||||||
|
add_subdirectory(HEP/Detectors)
|
||||||
|
list(APPEND SOURCES ${HEP_DETECTORS_SOURCES})
|
||||||
|
list(APPEND HEADERS ${HEP_DETECTORS_HEADERS})
|
||||||
|
|
||||||
|
## Pull in HEP/MuonTomography VTK wrappers (sets HEP_MUONTOMOGRAPHY_SOURCES / HEADERS)
|
||||||
|
add_subdirectory(HEP/MuonTomography)
|
||||||
|
list(APPEND SOURCES ${HEP_MUONTOMOGRAPHY_SOURCES})
|
||||||
|
list(APPEND HEADERS ${HEP_MUONTOMOGRAPHY_HEADERS})
|
||||||
|
|
||||||
set(LIBRARIES Eigen3::Eigen
|
set(LIBRARIES Eigen3::Eigen
|
||||||
${ROOT_LIBRARIES}
|
${ROOT_LIBRARIES}
|
||||||
${VTK_LIBRARIES}
|
${VTK_LIBRARIES}
|
||||||
${PACKAGE_LIBPREFIX}Math)
|
${PACKAGE_LIBPREFIX}Math
|
||||||
|
${PACKAGE_LIBPREFIX}Detectors)
|
||||||
|
|
||||||
if(USE_CUDA)
|
if(USE_CUDA)
|
||||||
find_package(CUDAToolkit REQUIRED)
|
find_package(CUDAToolkit REQUIRED)
|
||||||
@@ -35,11 +47,14 @@ set_target_properties(${libname} PROPERTIES
|
|||||||
target_link_libraries(${libname} ${LIBRARIES})
|
target_link_libraries(${libname} ${LIBRARIES})
|
||||||
|
|
||||||
install(TARGETS ${libname}
|
install(TARGETS ${libname}
|
||||||
EXPORT "${PROJECT_NAME}Targets"
|
EXPORT "uLibTargets"
|
||||||
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
|
||||||
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
|
||||||
|
|
||||||
install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Vtk)
|
install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Vtk)
|
||||||
|
install(FILES ${MATH_HEADERS} DESTINATION ${INSTALL_INC_DIR}/Vtk/Math)
|
||||||
|
install(FILES ${HEP_DETECTORS_HEADERS} DESTINATION ${INSTALL_INC_DIR}/Vtk/HEP/Detectors)
|
||||||
|
install(FILES ${HEP_MUONTOMOGRAPHY_HEADERS} DESTINATION ${INSTALL_INC_DIR}/Vtk/HEP/MuonTomography)
|
||||||
|
|
||||||
if(BUILD_TESTING)
|
if(BUILD_TESTING)
|
||||||
include(uLibTargetMacros)
|
include(uLibTargetMacros)
|
||||||
|
|||||||
24
src/Vtk/HEP/Detectors/CMakeLists.txt
Normal file
24
src/Vtk/HEP/Detectors/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
################################################################################
|
||||||
|
##### Vtk/HEP/Detectors - VTK wrappers for HEP Detectors objects ##############
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
## Sources and headers are exported to parent scope so they get compiled
|
||||||
|
## into the single mutomVtk shared library.
|
||||||
|
|
||||||
|
set(HEP_DETECTORS_SOURCES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkMuonScatter.cxx
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkMuonEvent.cxx
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkDetectorChamber.cxx
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
set(HEP_DETECTORS_HEADERS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkMuonScatter.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkMuonEvent.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkDetectorChamber.h
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
include(uLibTargetMacros)
|
||||||
|
add_subdirectory(testing)
|
||||||
|
endif()
|
||||||
16
src/Vtk/HEP/Detectors/testing/CMakeLists.txt
Normal file
16
src/Vtk/HEP/Detectors/testing/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# TESTS
|
||||||
|
set(TESTS
|
||||||
|
vtkMuonScatterTest
|
||||||
|
vtkDetectorChamberTest
|
||||||
|
)
|
||||||
|
|
||||||
|
set(LIBRARIES
|
||||||
|
${PACKAGE_LIBPREFIX}Core
|
||||||
|
${PACKAGE_LIBPREFIX}Detectors
|
||||||
|
${PACKAGE_LIBPREFIX}Vtk
|
||||||
|
${VTK_LIBRARIES}
|
||||||
|
Boost::unit_test_framework
|
||||||
|
)
|
||||||
|
|
||||||
|
uLib_add_tests(VtkDetectors)
|
||||||
|
|
||||||
62
src/Vtk/HEP/Detectors/testing/vtkDetectorChamberTest.cpp
Normal file
62
src/Vtk/HEP/Detectors/testing/vtkDetectorChamberTest.cpp
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#include "Vtk/HEP/Detectors/vtkDetectorChamber.h"
|
||||||
|
#include "HEP/Detectors/DetectorChamber.h"
|
||||||
|
|
||||||
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
|
#define BOOST_TEST_MODULE vtkDetectorChamberTest
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(vtkDetectorChamberTest) {
|
||||||
|
uLib::DetectorChamber d1, d2;
|
||||||
|
d1.SetSize(uLib::Vector3f(1, 1, 1));
|
||||||
|
d1.SetPosition(uLib::Vector3f(0, 0, 0));
|
||||||
|
d1.Scale(uLib::Vector3f(5, 10, 2));
|
||||||
|
d1.Translate(uLib::Vector3f(0, 0, 0));
|
||||||
|
|
||||||
|
d2.SetSize(uLib::Vector3f(1, 1, 1));
|
||||||
|
d2.SetPosition(uLib::Vector3f(0, 0, 0));
|
||||||
|
d2.Scale(uLib::Vector3f(5, 10, 2));
|
||||||
|
d2.Translate(uLib::Vector3f(0, 0, 10));
|
||||||
|
|
||||||
|
|
||||||
|
uLib::Vtk::vtkDetectorChamber vtkDetectorChamber(&d1);
|
||||||
|
uLib::Vtk::vtkDetectorChamber vtkDetectorChamber2(&d2);
|
||||||
|
|
||||||
|
if (!vtkDetectorChamber.GetProp()) {
|
||||||
|
BOOST_FAIL("vtkDetectorChamber::GetProp() returned NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
|
uLib::Vtk::Viewer viewer;
|
||||||
|
viewer.AddPuppet(vtkDetectorChamber);
|
||||||
|
viewer.AddPuppet(vtkDetectorChamber2);
|
||||||
|
viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_CHECK(true); // reached here without crash
|
||||||
|
}
|
||||||
@@ -23,53 +23,40 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#include "Vtk/HEP/Detectors/vtkMuonScatter.h"
|
||||||
|
#include "HEP/Detectors/MuonScatter.h"
|
||||||
|
|
||||||
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
|
#define BOOST_TEST_MODULE VtkMuonScatterTest
|
||||||
#include "Math/TriangleMesh.h"
|
#include <boost/test/unit_test.hpp>
|
||||||
#include "Vtk/vtkTriangleMesh.h"
|
|
||||||
#include "testing-prototype.h"
|
|
||||||
|
|
||||||
using namespace uLib;
|
using namespace uLib;
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(vtkMuonScatterTest) {
|
||||||
|
MuonScatter event;
|
||||||
|
event.LineIn().direction << 0, -1, 1, 0;
|
||||||
|
event.LineIn().origin << 0, 1, -1, 1;
|
||||||
|
|
||||||
int main()
|
event.LineOut().direction << 0, -1, 0, 0;
|
||||||
{
|
event.LineOut().origin << 0, -1, 0, 1;
|
||||||
BEGIN_TESTING(Vtk Triangle Mesh);
|
|
||||||
|
|
||||||
// { // SIMPLE TESTS //
|
Vtk::vtkMuonScatter v_event(event);
|
||||||
|
v_event.AddPocaPoint(HPoint3f(0, 0, 0));
|
||||||
|
|
||||||
|
v_event.SaveToXMLFile("vtk_testing_muonevent.vtp");
|
||||||
|
|
||||||
// TriangleMesh mesh;
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
|
Vtk::Viewer viewer;
|
||||||
|
|
||||||
// mesh.AddPoint(Vector3f(0,0,0));
|
// Vtk::Tie<Vtk::vtkMuonScatter> tms;
|
||||||
// mesh.AddPoint(Vector3f(0,1,0));
|
// tms.DoAction();
|
||||||
// mesh.AddPoint(Vector3f(1,0,0));
|
// Vtk::Tie<Vtk::Viewer> vms;
|
||||||
|
// vms.DoAction();
|
||||||
|
|
||||||
// mesh.AddTriangle(Vector3i(0,1,2));
|
viewer.AddPuppet(v_event);
|
||||||
|
viewer.Start();
|
||||||
// mesh.PrintSelf(std::cout);
|
|
||||||
|
|
||||||
|
|
||||||
// vtkTriangleMesh v_mesh(mesh);
|
|
||||||
// v_mesh.Update();
|
|
||||||
|
|
||||||
// TestingRenderWidow(&v_mesh);
|
|
||||||
// }
|
|
||||||
|
|
||||||
{ // SIMPLE TESTS //
|
|
||||||
|
|
||||||
TriangleMesh mesh;
|
|
||||||
|
|
||||||
vtkTriangleMesh v_mesh(mesh);
|
|
||||||
|
|
||||||
v_mesh.ReadFromStlFile("prova.stl");
|
|
||||||
|
|
||||||
mesh.PrintSelf(std::cout);
|
|
||||||
|
|
||||||
TestingRenderWidow(&v_mesh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_CHECK(true); // reached here without crash
|
||||||
END_TESTING;
|
|
||||||
}
|
}
|
||||||
198
src/Vtk/HEP/Detectors/vtkDetectorChamber.cxx
Normal file
198
src/Vtk/HEP/Detectors/vtkDetectorChamber.cxx
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#include <vtkAbstractTransform.h>
|
||||||
|
#include <vtkAxes.h>
|
||||||
|
#include <vtkCubeSource.h>
|
||||||
|
#include <vtkLineSource.h>
|
||||||
|
#include <vtkMatrix4x4.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
|
#include <vtkPropPicker.h>
|
||||||
|
#include <vtkProperty.h>
|
||||||
|
#include <vtkRenderWindow.h>
|
||||||
|
#include <vtkRenderWindowInteractor.h>
|
||||||
|
#include <vtkRenderer.h>
|
||||||
|
#include <vtkRendererCollection.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
#include <vtkTransform.h>
|
||||||
|
|
||||||
|
#include "Vtk/HEP/Detectors/vtkDetectorChamber.h"
|
||||||
|
#include <vtkBoxWidget.h>
|
||||||
|
#include <vtkTransformPolyDataFilter.h>
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
vtkDetectorChamber::vtkDetectorChamber(DetectorChamber *content)
|
||||||
|
: vtkContainerBox(content), m_Actor(vtkActor::New()),
|
||||||
|
m_Widget(vtkBoxWidget::New()) {
|
||||||
|
m_Callback = vtkWidgetCallback::New();
|
||||||
|
m_PickerCallback = vtkSelectionCallback::New();
|
||||||
|
|
||||||
|
m_Callback->SetChamber(this);
|
||||||
|
m_PickerCallback->SetChamber(this);
|
||||||
|
m_Widget->AddObserver(vtkCommand::InteractionEvent, m_Callback);
|
||||||
|
|
||||||
|
m_InitialTransform = vtkSmartPointer<vtkTransform>::New();
|
||||||
|
m_RelativeTransform = vtkSmartPointer<vtkTransform>::New();
|
||||||
|
m_TotalTransform = vtkSmartPointer<vtkTransform>::New();
|
||||||
|
|
||||||
|
this->InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkDetectorChamber::~vtkDetectorChamber() {
|
||||||
|
m_Actor->Delete();
|
||||||
|
m_Widget->Delete();
|
||||||
|
m_Callback->Delete();
|
||||||
|
m_PickerCallback->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
DetectorChamber *vtkDetectorChamber::GetContent() {
|
||||||
|
return static_cast<DetectorChamber *>(m_Content);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkDetectorChamber::PrintSelf(std::ostream &o) const {
|
||||||
|
vtkContainerBox::PrintSelf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect the interactor to the widget
|
||||||
|
*/
|
||||||
|
void vtkDetectorChamber::ConnectInteractor(
|
||||||
|
vtkRenderWindowInteractor *interactor) {
|
||||||
|
if (!interactor)
|
||||||
|
return;
|
||||||
|
m_Widget->SetInteractor(interactor);
|
||||||
|
m_Widget->SetProp3D(m_Actor);
|
||||||
|
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, m_PickerCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkDetectorChamber::SetTransform(vtkTransform *t) {
|
||||||
|
|
||||||
|
|
||||||
|
m_RelativeTransform->SetMatrix(t->GetMatrix());
|
||||||
|
m_RelativeTransform->Update();
|
||||||
|
|
||||||
|
// Set content global transform (BaseClass of ContainerBox) //
|
||||||
|
vtkMatrix4x4 *vmat = m_TotalTransform->GetMatrix();
|
||||||
|
Matrix4f transform;
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
transform(i, j) = vmat->GetElement(i, j);
|
||||||
|
this->GetContent()->SetMatrix(transform);
|
||||||
|
|
||||||
|
this->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkBoxWidget *vtkDetectorChamber::GetWidget() { return m_Widget; }
|
||||||
|
|
||||||
|
void vtkDetectorChamber::Update() {
|
||||||
|
if (m_Actor->GetMapper())
|
||||||
|
m_Actor->GetMapper()->Update();
|
||||||
|
BaseClass::Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkDetectorChamber::InstallPipe() {
|
||||||
|
if (!m_Content)
|
||||||
|
return;
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
|
||||||
|
cube->SetBounds(0, 1, 0, 1, 0, 1);
|
||||||
|
|
||||||
|
// 1. Initialize Global Transform (m_Transform) from Content's matrix (Base
|
||||||
|
// class AffineTransform)
|
||||||
|
vtkSmartPointer<vtkMatrix4x4> vmatGlobal =
|
||||||
|
vtkSmartPointer<vtkMatrix4x4>::New();
|
||||||
|
Matrix4f matGlobal = this->GetContent()->GetMatrix();
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
vmatGlobal->SetElement(i, j, matGlobal(i, j));
|
||||||
|
|
||||||
|
m_InitialTransform->SetMatrix(vmatGlobal);
|
||||||
|
m_InitialTransform->Update();
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mapper->SetInputConnection(cube->GetOutputPort());
|
||||||
|
m_Actor->SetMapper(mapper);
|
||||||
|
|
||||||
|
m_Actor->GetProperty()->SetRepresentationToSurface();
|
||||||
|
m_Actor->GetProperty()->SetEdgeVisibility(true);
|
||||||
|
m_Actor->GetProperty()->SetOpacity(0.4);
|
||||||
|
m_Actor->GetProperty()->SetAmbient(0.7);
|
||||||
|
|
||||||
|
// Temporarily disable UserTransform to place widget on local base
|
||||||
|
m_Widget->SetProp3D(m_Actor);
|
||||||
|
|
||||||
|
m_TotalTransform->SetInput(m_RelativeTransform);
|
||||||
|
m_TotalTransform->Concatenate(m_InitialTransform);
|
||||||
|
m_Actor->SetUserTransform(m_TotalTransform);
|
||||||
|
m_TotalTransform->Update();
|
||||||
|
|
||||||
|
m_Widget->PlaceWidget();
|
||||||
|
m_Widget->SetPlaceFactor(2);
|
||||||
|
|
||||||
|
this->SetProp(m_Actor);
|
||||||
|
this->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkDetectorChamber::vtkWidgetCallback::Execute(vtkObject *caller,
|
||||||
|
unsigned long, void *) {
|
||||||
|
vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget *>(caller);
|
||||||
|
|
||||||
|
// Get the Relative transform from the widget //
|
||||||
|
vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
|
||||||
|
widget->GetTransform(t);
|
||||||
|
chamber->SetTransform(t);
|
||||||
|
|
||||||
|
// Apply to both the content and the actor state //
|
||||||
|
chamber->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkDetectorChamber::vtkSelectionCallback::Execute(vtkObject *caller,
|
||||||
|
unsigned long, void *) {
|
||||||
|
vtkRenderWindowInteractor *interactor =
|
||||||
|
reinterpret_cast<vtkRenderWindowInteractor *>(caller);
|
||||||
|
vtkSmartPointer<vtkPropPicker> picker = vtkSmartPointer<vtkPropPicker>::New();
|
||||||
|
int *pos = interactor->GetEventPosition();
|
||||||
|
picker->Pick(
|
||||||
|
pos[0], pos[1], 0,
|
||||||
|
interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
|
||||||
|
|
||||||
|
vtkProp *picked = picker->GetViewProp();
|
||||||
|
if (picked == chamber->m_Actor) {
|
||||||
|
if (!chamber->m_Widget->GetEnabled()) {
|
||||||
|
chamber->m_Widget->SetInteractor(interactor);
|
||||||
|
chamber->m_Widget->On();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (chamber->m_Widget->GetEnabled()) {
|
||||||
|
chamber->m_Widget->Off();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
104
src/Vtk/HEP/Detectors/vtkDetectorChamber.h
Normal file
104
src/Vtk/HEP/Detectors/vtkDetectorChamber.h
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#ifndef VTK_DETECTOR_CHAMBER_H
|
||||||
|
#define VTK_DETECTOR_CHAMBER_H
|
||||||
|
|
||||||
|
#include <vtkActor.h>
|
||||||
|
#include <vtkCommand.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
#include <vtkTransform.h>
|
||||||
|
|
||||||
|
#include "HEP/Detectors/DetectorChamber.h"
|
||||||
|
#include "Math/Dense.h"
|
||||||
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
#include "Vtk/vtkContainerBox.h"
|
||||||
|
#include <vtkActor.h>
|
||||||
|
#include <vtkBoxWidget.h>
|
||||||
|
#include <vtkTransformPolyDataFilter.h>
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
// class vtkHandlerWidget; // Removed as we use vtkBoxWidget now
|
||||||
|
|
||||||
|
class vtkDetectorChamber : public vtkContainerBox {
|
||||||
|
typedef DetectorChamber Content;
|
||||||
|
typedef vtkContainerBox BaseClass;
|
||||||
|
|
||||||
|
public:
|
||||||
|
vtkDetectorChamber(DetectorChamber *content);
|
||||||
|
~vtkDetectorChamber();
|
||||||
|
|
||||||
|
Content *GetContent();
|
||||||
|
|
||||||
|
void SetTransform(class vtkTransform *t);
|
||||||
|
|
||||||
|
class vtkBoxWidget *GetWidget();
|
||||||
|
|
||||||
|
void Update();
|
||||||
|
|
||||||
|
void ConnectInteractor(vtkRenderWindowInteractor *interactor) override;
|
||||||
|
|
||||||
|
void PrintSelf(std::ostream &o) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void InstallPipe() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class vtkWidgetCallback : public vtkCommand {
|
||||||
|
public:
|
||||||
|
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
||||||
|
void SetChamber(uLib::Vtk::vtkDetectorChamber *ch) { this->chamber = ch; }
|
||||||
|
virtual void Execute(vtkObject *caller, unsigned long, void *) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uLib::Vtk::vtkDetectorChamber *chamber;
|
||||||
|
};
|
||||||
|
|
||||||
|
class vtkSelectionCallback : public vtkCommand {
|
||||||
|
public:
|
||||||
|
static vtkSelectionCallback *New() { return new vtkSelectionCallback; }
|
||||||
|
void SetChamber(uLib::Vtk::vtkDetectorChamber *ch) { this->chamber = ch; }
|
||||||
|
virtual void Execute(vtkObject *caller, unsigned long, void *) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uLib::Vtk::vtkDetectorChamber *chamber;
|
||||||
|
};
|
||||||
|
|
||||||
|
vtkActor *m_Actor;
|
||||||
|
vtkBoxWidget *m_Widget;
|
||||||
|
vtkWidgetCallback *m_Callback;
|
||||||
|
vtkSelectionCallback *m_PickerCallback;
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkTransform> m_InitialTransform;
|
||||||
|
vtkSmartPointer<vtkTransform> m_RelativeTransform;
|
||||||
|
vtkSmartPointer<vtkTransform> m_TotalTransform;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
|
|
||||||
|
#endif // VTK_DETECTOR_CHAMBER_H
|
||||||
145
src/Vtk/HEP/Detectors/vtkMuonEvent.cxx
Normal file
145
src/Vtk/HEP/Detectors/vtkMuonEvent.cxx
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Math/Dense.h"
|
||||||
|
#include "Vtk/HEP/Detectors/vtkMuonEvent.h"
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
///// CALLBACK /////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class vtkWidgetCallback : public vtkCommand {
|
||||||
|
public:
|
||||||
|
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
||||||
|
void SetParent(uLib::Vtk::vtkMuonEvent *parent) { this->parent = parent; }
|
||||||
|
virtual void Execute(vtkObject *caller, unsigned long, void *) {
|
||||||
|
vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
|
||||||
|
vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget *>(caller);
|
||||||
|
widget->GetTransform(t);
|
||||||
|
// parent->SetTransform(t);
|
||||||
|
// std::cout << "event\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
uLib::Vtk::vtkMuonEvent *parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///// VTK MUON EVENT /////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
vtkMuonEvent::vtkMuonEvent(MuonEventData &content)
|
||||||
|
: m_PolyData(NULL), m_Appender(vtkAppendPolyData::New()),
|
||||||
|
content(&content) {
|
||||||
|
InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkMuonEvent::vtkMuonEvent(const MuonEventData &content)
|
||||||
|
: m_PolyData(NULL), m_Appender(vtkAppendPolyData::New()),
|
||||||
|
content(const_cast<MuonEventData *>(&content)) {
|
||||||
|
InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkMuonEvent::~vtkMuonEvent() {}
|
||||||
|
|
||||||
|
vtkMuonEvent::Content &vtkMuonEvent::GetContent() { return *content; }
|
||||||
|
|
||||||
|
void vtkMuonEvent::PrintSelf(std::ostream &o) const {
|
||||||
|
o << "..:: MuonEvent ::..\n"
|
||||||
|
"\t[in] Origin > "
|
||||||
|
<< content->LineIn().origin.transpose() << "\n"
|
||||||
|
<< "\t[in] Direction > " << content->LineIn().direction.transpose() << "\n"
|
||||||
|
<< "\t[out] Origin > " << content->LineOut().origin.transpose() << "\n"
|
||||||
|
<< "\t[out] Direction > " << content->LineOut().direction.transpose()
|
||||||
|
<< "\n"
|
||||||
|
<< "\tMomentum > " << content->GetMomentum() << "\n"
|
||||||
|
<< "...................\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkMuonEvent::InstallPipe() {
|
||||||
|
|
||||||
|
vtkAppendPolyData *appender = m_Appender;
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
|
||||||
|
if (content) {
|
||||||
|
vtkSmartPointer<vtkLineSource> line_in =
|
||||||
|
vtkSmartPointer<vtkLineSource>::New();
|
||||||
|
vtkSmartPointer<vtkLineSource> line_out =
|
||||||
|
vtkSmartPointer<vtkLineSource>::New();
|
||||||
|
|
||||||
|
float distance =
|
||||||
|
(content->LineIn().origin - content->LineOut().origin).norm() / 10;
|
||||||
|
|
||||||
|
HPoint3f pt;
|
||||||
|
pt = content->LineIn().origin;
|
||||||
|
line_in->SetPoint1(pt(0), pt(1), pt(2));
|
||||||
|
pt = content->LineIn().origin + content->LineIn().direction * distance;
|
||||||
|
line_in->SetPoint2(pt(0), pt(1), pt(2));
|
||||||
|
pt = content->LineOut().origin;
|
||||||
|
line_out->SetPoint1(pt(0), pt(1), pt(2));
|
||||||
|
pt = content->LineOut().origin + content->LineOut().direction * distance;
|
||||||
|
line_out->SetPoint2(pt(0), pt(1), pt(2));
|
||||||
|
|
||||||
|
appender->AddInputConnection(line_in->GetOutputPort());
|
||||||
|
appender->AddInputConnection(line_out->GetOutputPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
appender->Update();
|
||||||
|
mapper->SetInputConnection(appender->GetOutputPort());
|
||||||
|
mapper->Update();
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
||||||
|
actor->SetMapper(mapper);
|
||||||
|
this->SetProp(actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkPolyData *vtkMuonEvent::GetPolyData() const {
|
||||||
|
return m_Appender->GetOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkMuonEvent::AddPocaPoint(HPoint3f poca) {
|
||||||
|
m_Poca = poca;
|
||||||
|
vtkSmartPointer<vtkSphereSource> sphere =
|
||||||
|
vtkSmartPointer<vtkSphereSource>::New();
|
||||||
|
float size =
|
||||||
|
(content->LineIn().origin - content->LineOut().origin).head(3).norm();
|
||||||
|
size /= 100;
|
||||||
|
sphere->SetRadius(size);
|
||||||
|
sphere->SetCenter(poca(0), poca(1), poca(2));
|
||||||
|
sphere->Update();
|
||||||
|
m_Appender->AddInputConnection(sphere->GetOutputPort());
|
||||||
|
m_Appender->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
HPoint3f vtkMuonEvent::GetPocaPoint() { return m_Poca; }
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
@@ -23,17 +23,15 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef VTKMUONEVENT_H
|
#ifndef VTKMUONEVENT_H
|
||||||
#define VTKMUONEVENT_H
|
#define VTKMUONEVENT_H
|
||||||
|
|
||||||
|
#include <vtkActor.h>
|
||||||
|
#include <vtkAppendPolyData.h>
|
||||||
|
#include <vtkLineSource.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
#include <vtkSmartPointer.h>
|
#include <vtkSmartPointer.h>
|
||||||
#include <vtkSphereSource.h>
|
#include <vtkSphereSource.h>
|
||||||
#include <vtkAppendPolyData.h>
|
|
||||||
#include <vtkPolyDataMapper.h>
|
|
||||||
#include <vtkLineSource.h>
|
|
||||||
#include <vtkActor.h>
|
|
||||||
|
|
||||||
#include <vtk3DWidget.h>
|
#include <vtk3DWidget.h>
|
||||||
#include <vtkBoxWidget.h>
|
#include <vtkBoxWidget.h>
|
||||||
@@ -45,28 +43,25 @@
|
|||||||
|
|
||||||
#include "Math/Dense.h"
|
#include "Math/Dense.h"
|
||||||
|
|
||||||
#include "uLibVtkInterface.h"
|
#include "HEP/Detectors/MuonEvent.h"
|
||||||
#include "Detectors/MuonEvent.h"
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
class vtkMuonEvent : public Abstract::uLibVtkPolydata {
|
class vtkMuonEvent : public Puppet, public Polydata {
|
||||||
typedef MuonEventData Content;
|
typedef MuonEventData Content;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vtkMuonEvent(const MuonEventData &content);
|
vtkMuonEvent(const MuonEventData &content);
|
||||||
vtkMuonEvent(MuonEventData &content);
|
vtkMuonEvent(MuonEventData &content);
|
||||||
~vtkMuonEvent();
|
~vtkMuonEvent();
|
||||||
|
|
||||||
Content& GetContent();
|
Content &GetContent();
|
||||||
|
|
||||||
void PrintSelf(std::ostream &o) const;
|
void PrintSelf(std::ostream &o) const;
|
||||||
|
|
||||||
virtual vtkProp *GetProp();
|
virtual vtkPolyData *GetPolyData() const;
|
||||||
|
|
||||||
virtual vtkPolyData* GetPolyData() const;
|
|
||||||
|
|
||||||
void AddPocaPoint(HPoint3f poca);
|
void AddPocaPoint(HPoint3f poca);
|
||||||
|
|
||||||
@@ -74,13 +69,11 @@ public:
|
|||||||
|
|
||||||
void vtkStartInteractive();
|
void vtkStartInteractive();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InstallPipe();
|
void InstallPipe();
|
||||||
|
|
||||||
vtkMuonEvent::Content *content;
|
vtkMuonEvent::Content *content;
|
||||||
vtkPolyData *m_PolyData;
|
vtkPolyData *m_PolyData;
|
||||||
vtkActor *m_Prop;
|
|
||||||
|
|
||||||
vtkAppendPolyData *m_Appender;
|
vtkAppendPolyData *m_Appender;
|
||||||
vtkBoxWidget *m_WidgetIN;
|
vtkBoxWidget *m_WidgetIN;
|
||||||
@@ -88,7 +81,7 @@ private:
|
|||||||
HPoint3f m_Poca;
|
HPoint3f m_Poca;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
|
|
||||||
}
|
#endif // VTKMUONEVENT_H
|
||||||
|
|
||||||
#endif // VTKMUONSCATTER_H
|
|
||||||
144
src/Vtk/HEP/Detectors/vtkMuonScatter.cxx
Normal file
144
src/Vtk/HEP/Detectors/vtkMuonScatter.cxx
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Math/Dense.h"
|
||||||
|
#include "Vtk/HEP/Detectors/vtkMuonScatter.h"
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///// VTK MUON Scatter ///////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
vtkMuonScatter::vtkMuonScatter(MuonScatter &content)
|
||||||
|
: m_Content(&content), m_LineIn(vtkLineSource::New()),
|
||||||
|
m_LineOut(vtkLineSource::New()), m_PolyData(vtkPolyData::New()),
|
||||||
|
m_SpherePoca(NULL) {
|
||||||
|
InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkMuonScatter::vtkMuonScatter(const MuonScatter &content)
|
||||||
|
: m_Content(const_cast<MuonScatter *>(&content)),
|
||||||
|
m_LineIn(vtkLineSource::New()), m_LineOut(vtkLineSource::New()),
|
||||||
|
m_PolyData(vtkPolyData::New()), m_SpherePoca(NULL) {
|
||||||
|
InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkMuonScatter::~vtkMuonScatter() {
|
||||||
|
m_LineIn->Delete();
|
||||||
|
m_LineOut->Delete();
|
||||||
|
if (m_SpherePoca)
|
||||||
|
m_SpherePoca->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkMuonScatter::Content &vtkMuonScatter::GetContent() { return *m_Content; }
|
||||||
|
|
||||||
|
void vtkMuonScatter::PrintSelf(std::ostream &o) const {}
|
||||||
|
|
||||||
|
void vtkMuonScatter::InstallPipe() {
|
||||||
|
if (m_Content) {
|
||||||
|
vtkLineSource *line_in = m_LineIn;
|
||||||
|
vtkLineSource *line_out = m_LineOut;
|
||||||
|
|
||||||
|
float distance =
|
||||||
|
(m_Content->LineIn().origin - m_Content->LineOut().origin).norm() / 10;
|
||||||
|
|
||||||
|
HPoint3f pt;
|
||||||
|
pt = m_Content->LineIn().origin;
|
||||||
|
line_in->SetPoint1(pt(0), pt(1), pt(2));
|
||||||
|
pt = m_Content->LineIn().origin + m_Content->LineIn().direction * distance;
|
||||||
|
line_in->SetPoint2(pt(0), pt(1), pt(2));
|
||||||
|
pt = m_Content->LineOut().origin;
|
||||||
|
line_out->SetPoint1(pt(0), pt(1), pt(2));
|
||||||
|
pt =
|
||||||
|
m_Content->LineOut().origin + m_Content->LineOut().direction * distance;
|
||||||
|
line_out->SetPoint2(pt(0), pt(1), pt(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mapper->SetInputConnection(m_LineIn->GetOutputPort());
|
||||||
|
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
||||||
|
actor->SetMapper(mapper);
|
||||||
|
this->SetProp(actor);
|
||||||
|
|
||||||
|
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mapper->SetInputConnection(m_LineOut->GetOutputPort());
|
||||||
|
actor = vtkSmartPointer<vtkActor>::New();
|
||||||
|
actor->SetMapper(mapper);
|
||||||
|
this->SetProp(actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkPolyData *vtkMuonScatter::GetPolyData() const {
|
||||||
|
vtkSmartPointer<vtkAppendPolyData> append =
|
||||||
|
vtkSmartPointer<vtkAppendPolyData>::New();
|
||||||
|
append->AddInputConnection(m_LineIn->GetOutputPort());
|
||||||
|
append->AddInputConnection(m_LineOut->GetOutputPort());
|
||||||
|
if (m_SpherePoca)
|
||||||
|
append->AddInputConnection(m_SpherePoca->GetOutputPort());
|
||||||
|
append->Update();
|
||||||
|
m_PolyData->DeepCopy(append->GetOutput());
|
||||||
|
return m_PolyData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkMuonScatter::AddPocaPoint(HPoint3f poca) {
|
||||||
|
vtkSphereSource *sphere = vtkSphereSource::New();
|
||||||
|
float size =
|
||||||
|
(m_Content->LineIn().origin - m_Content->LineOut().origin).head(3).norm();
|
||||||
|
size /= 100;
|
||||||
|
sphere->SetRadius(size);
|
||||||
|
sphere->SetCenter(poca(0), poca(1), poca(2));
|
||||||
|
sphere->Update();
|
||||||
|
m_SpherePoca = sphere;
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mapper->SetInputConnection(m_SpherePoca->GetOutputPort());
|
||||||
|
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
||||||
|
actor->SetMapper(mapper);
|
||||||
|
this->SetProp(actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
HPoint3f vtkMuonScatter::GetPocaPoint() {
|
||||||
|
double center[3];
|
||||||
|
if (m_SpherePoca) {
|
||||||
|
m_SpherePoca->GetCenter(center);
|
||||||
|
return HPoint3f(center[0], center[1], center[2]);
|
||||||
|
} else {
|
||||||
|
return HPoint3f(0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkMuonScatter::ConnectInteractor(vtkRenderWindowInteractor *interactor) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
@@ -23,18 +23,16 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef VTKMUONSCATTER_H
|
#ifndef VTKMUONSCATTER_H
|
||||||
#define VTKMUONSCATTER_H
|
#define VTKMUONSCATTER_H
|
||||||
|
|
||||||
#include <vtkVersion.h>
|
#include <vtkActor.h>
|
||||||
|
#include <vtkAppendPolyData.h>
|
||||||
|
#include <vtkLineSource.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
#include <vtkSmartPointer.h>
|
#include <vtkSmartPointer.h>
|
||||||
#include <vtkSphereSource.h>
|
#include <vtkSphereSource.h>
|
||||||
#include <vtkAppendPolyData.h>
|
#include <vtkVersion.h>
|
||||||
#include <vtkPolyDataMapper.h>
|
|
||||||
#include <vtkLineSource.h>
|
|
||||||
#include <vtkActor.h>
|
|
||||||
|
|
||||||
#include <vtk3DWidget.h>
|
#include <vtk3DWidget.h>
|
||||||
#include <vtkBoxWidget.h>
|
#include <vtkBoxWidget.h>
|
||||||
@@ -46,8 +44,8 @@
|
|||||||
|
|
||||||
#include "Math/Dense.h"
|
#include "Math/Dense.h"
|
||||||
|
|
||||||
#include "uLibVtkInterface.h"
|
#include "HEP/Detectors/MuonScatter.h"
|
||||||
#include "Detectors/MuonScatter.h"
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
|
||||||
class vtkRenderWindowInteractor;
|
class vtkRenderWindowInteractor;
|
||||||
|
|
||||||
@@ -56,8 +54,8 @@ namespace Vtk {
|
|||||||
|
|
||||||
class vtkMuonScatter : public Puppet, public Polydata {
|
class vtkMuonScatter : public Puppet, public Polydata {
|
||||||
typedef MuonScatter Content;
|
typedef MuonScatter Content;
|
||||||
public:
|
|
||||||
|
|
||||||
|
public:
|
||||||
vtkMuonScatter(const MuonScatter &content);
|
vtkMuonScatter(const MuonScatter &content);
|
||||||
vtkMuonScatter(MuonScatter &content);
|
vtkMuonScatter(MuonScatter &content);
|
||||||
|
|
||||||
@@ -67,7 +65,7 @@ public:
|
|||||||
|
|
||||||
void PrintSelf(std::ostream &o) const;
|
void PrintSelf(std::ostream &o) const;
|
||||||
|
|
||||||
virtual vtkPolyData* GetPolyData() const;
|
virtual vtkPolyData *GetPolyData() const;
|
||||||
|
|
||||||
void AddPocaPoint(HPoint3f poca);
|
void AddPocaPoint(HPoint3f poca);
|
||||||
|
|
||||||
@@ -88,7 +86,7 @@ private:
|
|||||||
vtkPolyData *m_PolyData;
|
vtkPolyData *m_PolyData;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // vtk
|
} // namespace Vtk
|
||||||
} // uLib
|
} // namespace uLib
|
||||||
|
|
||||||
#endif // VTKMUONSCATTER_H
|
#endif // VTKMUONSCATTER_H
|
||||||
17
src/Vtk/HEP/MuonTomography/CMakeLists.txt
Normal file
17
src/Vtk/HEP/MuonTomography/CMakeLists.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
################################################################################
|
||||||
|
##### Vtk/HEP/MuonTomography - VTK wrappers for MuonTomography objects ########
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
set(HEP_MUONTOMOGRAPHY_SOURCES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkVoxRaytracerRepresentation.cpp
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
set(HEP_MUONTOMOGRAPHY_HEADERS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkVoxRaytracerRepresentation.h
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
include(uLibTargetMacros)
|
||||||
|
add_subdirectory(testing)
|
||||||
|
endif()
|
||||||
15
src/Vtk/HEP/MuonTomography/testing/CMakeLists.txt
Normal file
15
src/Vtk/HEP/MuonTomography/testing/CMakeLists.txt
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# TESTS
|
||||||
|
set(TESTS
|
||||||
|
vtkVoxRaytracerTest
|
||||||
|
)
|
||||||
|
|
||||||
|
set(LIBRARIES
|
||||||
|
${PACKAGE_LIBPREFIX}Core
|
||||||
|
${PACKAGE_LIBPREFIX}Math
|
||||||
|
${PACKAGE_LIBPREFIX}Detectors
|
||||||
|
${PACKAGE_LIBPREFIX}Vtk
|
||||||
|
${VTK_LIBRARIES}
|
||||||
|
Boost::unit_test_framework
|
||||||
|
)
|
||||||
|
|
||||||
|
uLib_add_tests(VtkMuonTomography)
|
||||||
@@ -23,69 +23,55 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <vtkBoxWidget.h>
|
#include <vtkBoxWidget.h>
|
||||||
#include <vtkSmartPointer.h>
|
|
||||||
#include <vtkCommand.h>
|
#include <vtkCommand.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
|
||||||
|
|
||||||
#include <Detectors/MuonScatter.h>
|
|
||||||
#include <Math/VoxRaytracer.h>
|
|
||||||
|
|
||||||
#include "Vtk/vtkMuonScatter.h"
|
|
||||||
#include "Vtk/vtkStructuredGrid.h"
|
|
||||||
#include "Vtk/vtkVoxRaytracerRepresentation.h"
|
|
||||||
#include "Vtk/uLibVtkViewer.h"
|
|
||||||
|
|
||||||
// remove
|
|
||||||
#include <vtkCornerAnnotation.h>
|
#include <vtkCornerAnnotation.h>
|
||||||
|
|
||||||
#include "testing-prototype.h"
|
#include <HEP/Detectors/MuonScatter.h>
|
||||||
|
#include <Math/VoxRaytracer.h>
|
||||||
|
|
||||||
|
#include "Vtk/HEP/Detectors/vtkMuonScatter.h"
|
||||||
|
#include "Vtk/HEP/MuonTomography/vtkVoxRaytracerRepresentation.h"
|
||||||
|
#include "Vtk/Math/vtkStructuredGrid.h"
|
||||||
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
|
#define BOOST_TEST_MODULE VtkVoxRaytracerTest
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
using namespace uLib;
|
using namespace uLib;
|
||||||
|
|
||||||
|
class vtkWidgetCallback : public vtkCommand {
|
||||||
|
|
||||||
class vtkWidgetCallback : public vtkCommand
|
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
||||||
|
|
||||||
void SetTracer(Vtk::vtkVoxRaytracerRepresentation *parent)
|
void SetTracer(Vtk::vtkVoxRaytracerRepresentation *parent) {
|
||||||
{
|
|
||||||
this->vtk_raytr = parent;
|
this->vtk_raytr = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetMuon (uLib::MuonScatter *muon) { this->muon = muon; }
|
void SetMuon(uLib::MuonScatter *muon) { this->muon = muon; }
|
||||||
|
|
||||||
void SetAnnotation ( vtkCornerAnnotation *annotation) {
|
void SetAnnotation(vtkCornerAnnotation *annotation) {
|
||||||
this->annotation = annotation;
|
this->annotation = annotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Execute(vtkObject *caller, unsigned long, void*)
|
virtual void Execute(vtkObject *caller, unsigned long, void *) {
|
||||||
{
|
|
||||||
char str[40];
|
char str[40];
|
||||||
vtk_raytr->SetMuon(*muon);
|
vtk_raytr->SetMuon(*muon);
|
||||||
if(annotation)
|
if (annotation) {
|
||||||
{
|
sprintf(str, "total length = %f", vtk_raytr->GetRay().TotalLength());
|
||||||
sprintf(str,"total length = %f",vtk_raytr->GetRay().TotalLength());
|
annotation->SetText(1, str);
|
||||||
annotation->SetText(1,str);
|
for (int i = 0; i < vtk_raytr->GetRay().size(); ++i) {
|
||||||
for(int i=0; i<vtk_raytr->GetRay().Data().size(); ++i)
|
std::cout << "L[" << i << "] = " << vtk_raytr->GetRay().Data().at(i).L
|
||||||
{
|
<< "\n";
|
||||||
std::cout << "L[" << i << "] = "
|
|
||||||
<< vtk_raytr->GetRay().Data().at(i).L << "\n";
|
|
||||||
}
|
}
|
||||||
std::cout << "\n";
|
std::cout << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vtkWidgetCallback() :
|
vtkWidgetCallback() : vtk_raytr(NULL), muon(NULL), annotation(NULL) {}
|
||||||
vtk_raytr(NULL),
|
|
||||||
muon(NULL),
|
|
||||||
annotation(NULL) {}
|
|
||||||
|
|
||||||
uLib::VoxRaytracer *raytracer;
|
uLib::VoxRaytracer *raytracer;
|
||||||
Vtk::vtkVoxRaytracerRepresentation *vtk_raytr;
|
Vtk::vtkVoxRaytracerRepresentation *vtk_raytr;
|
||||||
@@ -93,50 +79,40 @@ private:
|
|||||||
vtkCornerAnnotation *annotation;
|
vtkCornerAnnotation *annotation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(vtkVoxRaytracerRepresentationTest) {
|
||||||
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
BEGIN_TESTING(vtk VoxRaytracer);
|
|
||||||
|
|
||||||
|
|
||||||
// muon scatter //
|
// muon scatter //
|
||||||
MuonScatter muon;
|
MuonScatter muon;
|
||||||
muon.LineIn().origin << -6, 12, -6, 1;
|
muon.LineIn().origin << -6, 12, -6, 1;
|
||||||
muon.LineIn().direction << 1 , -1 , 1 , 0;
|
muon.LineIn().direction << 1, -1, 1, 0;
|
||||||
muon.LineOut().origin << 6 , -4 , 6 , 1;
|
muon.LineOut().origin << 6, -4, 6, 1;
|
||||||
muon.LineOut().direction << 1 , -1 , 1 , 0;
|
muon.LineOut().direction << 1, -1, 1, 0;
|
||||||
|
|
||||||
Vtk::vtkMuonScatter v_muon(muon);
|
Vtk::vtkMuonScatter v_muon(muon);
|
||||||
|
|
||||||
|
|
||||||
// structured grid //
|
// structured grid //
|
||||||
StructuredGrid grid(Vector3i(12,10,12));
|
StructuredGrid grid(Vector3i(12, 10, 12));
|
||||||
grid.SetSpacing(Vector3f(1,1,1));
|
grid.SetSpacing(Vector3f(1, 1, 1));
|
||||||
grid.SetPosition(Vector3f(0,0,0));
|
grid.SetPosition(Vector3f(0, 0, 0));
|
||||||
|
|
||||||
|
|
||||||
Vtk::vtkStructuredGrid v_grid(grid);
|
Vtk::vtkStructuredGrid v_grid(grid);
|
||||||
|
|
||||||
|
|
||||||
// voxraytracer //
|
// voxraytracer //
|
||||||
VoxRaytracer rt(grid);
|
VoxRaytracer rt(grid);
|
||||||
HPoint3f pt;
|
HPoint3f pt;
|
||||||
rt.GetEntryPoint(muon.LineIn(),pt);
|
rt.GetEntryPoint(muon.LineIn(), pt);
|
||||||
std::cout << pt.transpose() << "\n";
|
std::cout << pt.transpose() << "\n";
|
||||||
|
|
||||||
Vtk::vtkVoxRaytracerRepresentation v_rt(rt);
|
Vtk::vtkVoxRaytracerRepresentation v_rt(rt);
|
||||||
v_rt.SetMuon(muon);
|
v_rt.SetMuon(muon);
|
||||||
v_rt.SetRayColor(Vector4f(1,0,0,1));
|
v_rt.SetRayColor(Vector4f(1, 0, 0, 1));
|
||||||
|
|
||||||
// // renderer //
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
|
// renderer //
|
||||||
Vtk::Viewer viewer;
|
Vtk::Viewer viewer;
|
||||||
|
|
||||||
// widget //
|
// widget //
|
||||||
vtkBoxWidget *widget = v_grid.GetWidget();
|
vtkBoxWidget *widget = v_grid.GetWidget();
|
||||||
|
|
||||||
|
|
||||||
vtkWidgetCallback *cbk = vtkWidgetCallback::New();
|
vtkWidgetCallback *cbk = vtkWidgetCallback::New();
|
||||||
cbk->SetTracer(&v_rt);
|
cbk->SetTracer(&v_rt);
|
||||||
cbk->SetMuon(&muon);
|
cbk->SetMuon(&muon);
|
||||||
@@ -150,7 +126,7 @@ int main()
|
|||||||
viewer.AddPuppet(v_rt);
|
viewer.AddPuppet(v_rt);
|
||||||
viewer.AddPuppet(v_muon);
|
viewer.AddPuppet(v_muon);
|
||||||
viewer.Start();
|
viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_CHECK(v_rt.GetRay().Count() > 0);
|
||||||
END_TESTING;
|
|
||||||
}
|
}
|
||||||
@@ -27,12 +27,12 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "vtkVoxRaytracerRepresentation.h"
|
#include "Vtk/HEP/MuonTomography/vtkVoxRaytracerRepresentation.h"
|
||||||
|
|
||||||
#include "Math/VoxRaytracer.h"
|
#include "Math/VoxRaytracer.h"
|
||||||
|
|
||||||
// #include "vtkMuonEvent.h"
|
// #include "Vtk/HEP/Detectors/vtkMuonEvent.h"
|
||||||
#include "vtkMuonScatter.h"
|
#include "Vtk/HEP/Detectors/vtkMuonScatter.h"
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
@@ -114,12 +114,10 @@ void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon) {
|
|||||||
m_Line3->SetPoint1(pt1(0), pt1(1), pt1(2));
|
m_Line3->SetPoint1(pt1(0), pt1(1), pt1(2));
|
||||||
m_Line3->SetPoint2(pt2(0), pt2(1), pt2(2));
|
m_Line3->SetPoint2(pt2(0), pt2(1), pt2(2));
|
||||||
|
|
||||||
// Create a vtkPoints object and store the points in it
|
|
||||||
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
|
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
|
||||||
points->InsertNextPoint(pt1(0), pt1(1), pt1(2));
|
points->InsertNextPoint(pt1(0), pt1(1), pt1(2));
|
||||||
points->InsertNextPoint(pt2(0), pt2(1), pt2(2));
|
points->InsertNextPoint(pt2(0), pt2(1), pt2(2));
|
||||||
|
|
||||||
// Create a cell array to store the lines in and add the lines to it
|
|
||||||
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
|
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
|
||||||
|
|
||||||
vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
|
vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
|
||||||
@@ -127,19 +125,16 @@ void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon) {
|
|||||||
line->GetPointIds()->SetId(1, 1);
|
line->GetPointIds()->SetId(1, 1);
|
||||||
lines->InsertNextCell(line);
|
lines->InsertNextCell(line);
|
||||||
|
|
||||||
// Create a polydata to store everything in
|
|
||||||
vtkSmartPointer<vtkPolyData> linesPolyData =
|
vtkSmartPointer<vtkPolyData> linesPolyData =
|
||||||
vtkSmartPointer<vtkPolyData>::New();
|
vtkSmartPointer<vtkPolyData>::New();
|
||||||
|
|
||||||
// Add the points to the dataset
|
|
||||||
linesPolyData->SetPoints(points);
|
linesPolyData->SetPoints(points);
|
||||||
|
|
||||||
// Add the lines to the dataset
|
|
||||||
linesPolyData->SetLines(lines);
|
linesPolyData->SetLines(lines);
|
||||||
|
|
||||||
m_RayLine->RemoveAllInputs();
|
m_RayLine->RemoveAllInputs();
|
||||||
#if VTK_MAJOR_VERSION <= 5
|
#if VTK_MAJOR_VERSION <= 5
|
||||||
m_RayLine->AddInputConnection(linesPolyData->GetProducerPort());
|
m_RayLine->AddInputConnection(linesPolyData->GetProducerPort());
|
||||||
|
#else
|
||||||
|
m_RayLine->AddInputData(linesPolyData);
|
||||||
#endif
|
#endif
|
||||||
m_RayLine->AddInputConnection(m_Line1->GetOutputPort());
|
m_RayLine->AddInputConnection(m_Line1->GetOutputPort());
|
||||||
m_RayLine->AddInputConnection(m_Sphere1->GetOutputPort());
|
m_RayLine->AddInputConnection(m_Sphere1->GetOutputPort());
|
||||||
@@ -177,15 +172,12 @@ void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon, HPoint3f poca) {
|
|||||||
m_Line3->SetPoint1(pt1(0), pt1(1), pt1(2));
|
m_Line3->SetPoint1(pt1(0), pt1(1), pt1(2));
|
||||||
m_Line3->SetPoint2(pt2(0), pt2(1), pt2(2));
|
m_Line3->SetPoint2(pt2(0), pt2(1), pt2(2));
|
||||||
|
|
||||||
// Create a vtkPoints object and store the points in it
|
|
||||||
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
|
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
|
||||||
points->InsertNextPoint(pt1(0), pt1(1), pt1(2));
|
points->InsertNextPoint(pt1(0), pt1(1), pt1(2));
|
||||||
points->InsertNextPoint(poca(0), poca(1), poca(2));
|
points->InsertNextPoint(poca(0), poca(1), poca(2));
|
||||||
points->InsertNextPoint(pt2(0), pt2(1), pt2(2));
|
points->InsertNextPoint(pt2(0), pt2(1), pt2(2));
|
||||||
|
|
||||||
// Create a cell array to store the lines in and add the lines to it
|
|
||||||
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
|
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < 2; i++) {
|
for (unsigned int i = 0; i < 2; i++) {
|
||||||
vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
|
vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
|
||||||
line->GetPointIds()->SetId(0, i);
|
line->GetPointIds()->SetId(0, i);
|
||||||
@@ -193,19 +185,16 @@ void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon, HPoint3f poca) {
|
|||||||
lines->InsertNextCell(line);
|
lines->InsertNextCell(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a polydata to store everything in
|
|
||||||
vtkSmartPointer<vtkPolyData> linesPolyData =
|
vtkSmartPointer<vtkPolyData> linesPolyData =
|
||||||
vtkSmartPointer<vtkPolyData>::New();
|
vtkSmartPointer<vtkPolyData>::New();
|
||||||
|
|
||||||
// Add the points to the dataset
|
|
||||||
linesPolyData->SetPoints(points);
|
linesPolyData->SetPoints(points);
|
||||||
|
|
||||||
// Add the lines to the dataset
|
|
||||||
linesPolyData->SetLines(lines);
|
linesPolyData->SetLines(lines);
|
||||||
|
|
||||||
m_RayLine->RemoveAllInputs();
|
m_RayLine->RemoveAllInputs();
|
||||||
#if VTK_MAJOR_VERSION <= 5
|
#if VTK_MAJOR_VERSION <= 5
|
||||||
m_RayLine->AddInputConnection(linesPolyData->GetProducerPort());
|
m_RayLine->AddInputConnection(linesPolyData->GetProducerPort());
|
||||||
|
#else
|
||||||
|
m_RayLine->AddInputData(linesPolyData);
|
||||||
#endif
|
#endif
|
||||||
m_RayLine->AddInputConnection(m_Line1->GetOutputPort());
|
m_RayLine->AddInputConnection(m_Line1->GetOutputPort());
|
||||||
m_RayLine->AddInputConnection(m_Sphere1->GetOutputPort());
|
m_RayLine->AddInputConnection(m_Sphere1->GetOutputPort());
|
||||||
@@ -263,9 +252,11 @@ void vtkVoxRaytracerRepresentation::SetRay(VoxRaytracer::RayData *ray) {
|
|||||||
cube->Update();
|
cube->Update();
|
||||||
#if VTK_MAJOR_VERSION <= 5
|
#if VTK_MAJOR_VERSION <= 5
|
||||||
appender->AddInput(cube->GetOutput());
|
appender->AddInput(cube->GetOutput());
|
||||||
|
#else
|
||||||
|
appender->AddInputData(cube->GetOutput());
|
||||||
#endif
|
#endif
|
||||||
appender->Update();
|
|
||||||
}
|
}
|
||||||
|
appender->Modified();
|
||||||
}
|
}
|
||||||
|
|
||||||
void vtkVoxRaytracerRepresentation::SetVoxelsColor(Vector4f rgba) {
|
void vtkVoxRaytracerRepresentation::SetVoxelsColor(Vector4f rgba) {
|
||||||
@@ -294,21 +285,18 @@ void vtkVoxRaytracerRepresentation::InstallPipe() {
|
|||||||
append->AddInputConnection(m_Line1->GetOutputPort());
|
append->AddInputConnection(m_Line1->GetOutputPort());
|
||||||
append->AddInputConnection(m_Line2->GetOutputPort());
|
append->AddInputConnection(m_Line2->GetOutputPort());
|
||||||
|
|
||||||
append->Update();
|
|
||||||
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
vtkSmartPointer<vtkPolyDataMapper>::New();
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
|
||||||
mapper->SetInputConnection(append->GetOutputPort());
|
mapper->SetInputConnection(append->GetOutputPort());
|
||||||
mapper->Update();
|
|
||||||
|
|
||||||
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
vtkSmartPointer<vtkActor> actor = vtkActor::New();
|
||||||
actor->SetMapper(mapper);
|
actor->SetMapper(mapper);
|
||||||
actor->GetProperty()->SetColor(0.6, 0.6, 1);
|
actor->GetProperty()->SetColor(0.6, 0.6, 1);
|
||||||
this->SetProp(actor);
|
this->SetProp(actor);
|
||||||
|
|
||||||
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
mapper->SetInputConnection(m_RayLine->GetOutputPort());
|
mapper->SetInputConnection(m_RayLine->GetOutputPort());
|
||||||
mapper->Update();
|
|
||||||
|
|
||||||
m_RayLineActor->SetMapper(mapper);
|
m_RayLineActor->SetMapper(mapper);
|
||||||
m_RayLineActor->GetProperty()->SetColor(1, 0, 0);
|
m_RayLineActor->GetProperty()->SetColor(1, 0, 0);
|
||||||
@@ -322,7 +310,6 @@ void vtkVoxRaytracerRepresentation::InstallPipe() {
|
|||||||
|
|
||||||
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
mapper->SetInputConnection(polyfilter->GetOutputPort());
|
mapper->SetInputConnection(polyfilter->GetOutputPort());
|
||||||
mapper->Update();
|
|
||||||
|
|
||||||
vtkActor *vra = m_RayRepresentationActor;
|
vtkActor *vra = m_RayRepresentationActor;
|
||||||
vra->SetMapper(mapper);
|
vra->SetMapper(mapper);
|
||||||
@@ -23,39 +23,36 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef U_VTKVOXRAYTRACERREPRESENTATION_H
|
#ifndef U_VTKVOXRAYTRACERREPRESENTATION_H
|
||||||
#define U_VTKVOXRAYTRACERREPRESENTATION_H
|
#define U_VTKVOXRAYTRACERREPRESENTATION_H
|
||||||
|
|
||||||
#include <vtkLine.h>
|
|
||||||
#include <vtkCellArray.h>
|
#include <vtkCellArray.h>
|
||||||
|
#include <vtkLine.h>
|
||||||
|
|
||||||
#include <vtkLineSource.h>
|
#include <vtkActor.h>
|
||||||
#include <vtkSphereSource.h>
|
#include <vtkAppendPolyData.h>
|
||||||
|
#include <vtkAssembly.h>
|
||||||
#include <vtkBoundingBox.h>
|
#include <vtkBoundingBox.h>
|
||||||
#include <vtkCubeSource.h>
|
#include <vtkCubeSource.h>
|
||||||
#include <vtkSmartPointer.h>
|
#include <vtkLineSource.h>
|
||||||
|
#include <vtkPolyData.h>
|
||||||
#include <vtkPolyDataMapper.h>
|
#include <vtkPolyDataMapper.h>
|
||||||
#include <vtkAppendPolyData.h>
|
|
||||||
#include <vtkActor.h>
|
|
||||||
#include <vtkAssembly.h>
|
|
||||||
#include <vtkProp3DCollection.h>
|
#include <vtkProp3DCollection.h>
|
||||||
#include <vtkProperty.h>
|
#include <vtkProperty.h>
|
||||||
#include <vtkPolyData.h>
|
#include <vtkSmartPointer.h>
|
||||||
|
#include <vtkSphereSource.h>
|
||||||
#include <vtkTransform.h>
|
#include <vtkTransform.h>
|
||||||
#include <vtkTransformPolyDataFilter.h>
|
#include <vtkTransformPolyDataFilter.h>
|
||||||
|
|
||||||
#include "Math/Dense.h"
|
#include "Math/Dense.h"
|
||||||
|
|
||||||
#include "uLibVtkInterface.h"
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
|
||||||
#include "Detectors/MuonScatter.h"
|
#include "HEP/Detectors/MuonScatter.h"
|
||||||
|
|
||||||
#include "Math/StructuredGrid.h"
|
#include "Math/StructuredGrid.h"
|
||||||
#include "Math/VoxRaytracer.h"
|
#include "Math/VoxRaytracer.h"
|
||||||
|
|
||||||
|
|
||||||
class vtkActor;
|
class vtkActor;
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
@@ -63,6 +60,7 @@ namespace Vtk {
|
|||||||
|
|
||||||
class vtkVoxRaytracerRepresentation : public Puppet {
|
class vtkVoxRaytracerRepresentation : public Puppet {
|
||||||
typedef VoxRaytracer Content;
|
typedef VoxRaytracer Content;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vtkVoxRaytracerRepresentation(Content &content);
|
vtkVoxRaytracerRepresentation(Content &content);
|
||||||
~vtkVoxRaytracerRepresentation();
|
~vtkVoxRaytracerRepresentation();
|
||||||
@@ -73,10 +71,7 @@ public:
|
|||||||
|
|
||||||
vtkPolyData *GetPolyData() const;
|
vtkPolyData *GetPolyData() const;
|
||||||
|
|
||||||
enum RepresentationElements {
|
enum RepresentationElements { RayElements, VoxelsElements };
|
||||||
RayElements,
|
|
||||||
VoxelsElements
|
|
||||||
};
|
|
||||||
void SetRepresentationElements(enum RepresentationElements el);
|
void SetRepresentationElements(enum RepresentationElements el);
|
||||||
|
|
||||||
void SetMuon(MuonScatter &muon);
|
void SetMuon(MuonScatter &muon);
|
||||||
@@ -98,8 +93,6 @@ public:
|
|||||||
void SetVoxelsColor(Vector4f rgba);
|
void SetVoxelsColor(Vector4f rgba);
|
||||||
void SetRayColor(Vector4f rgba);
|
void SetRayColor(Vector4f rgba);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InstallPipe();
|
void InstallPipe();
|
||||||
|
|
||||||
@@ -124,9 +117,7 @@ private:
|
|||||||
vtkAppendPolyData *m_SelectedElement;
|
vtkAppendPolyData *m_SelectedElement;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
} // vtk
|
} // namespace uLib
|
||||||
} // uLib
|
|
||||||
|
|
||||||
|
|
||||||
#endif // VTKVOXRAYTRACERREPRESENTATION_H
|
#endif // VTKVOXRAYTRACERREPRESENTATION_H
|
||||||
22
src/Vtk/Math/CMakeLists.txt
Normal file
22
src/Vtk/Math/CMakeLists.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
################################################################################
|
||||||
|
##### Vtk/Math - VTK wrappers for Math module objects #########################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
set(MATH_SOURCES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkStructuredGrid.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkTriangleMesh.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkVoxImage.cpp
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
set(MATH_HEADERS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkHLineRepresentation.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkStructuredGrid.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkTriangleMesh.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/vtkVoxImage.h
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
include(uLibTargetMacros)
|
||||||
|
add_subdirectory(testing)
|
||||||
|
endif()
|
||||||
18
src/Vtk/Math/testing/CMakeLists.txt
Normal file
18
src/Vtk/Math/testing/CMakeLists.txt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# TESTS
|
||||||
|
set(TESTS
|
||||||
|
vtkStructuredGridTest
|
||||||
|
vtkTriangleMeshTest
|
||||||
|
vtkVoxImageTest
|
||||||
|
)
|
||||||
|
|
||||||
|
set(LIBRARIES
|
||||||
|
${PACKAGE_LIBPREFIX}Core
|
||||||
|
${PACKAGE_LIBPREFIX}Math
|
||||||
|
${PACKAGE_LIBPREFIX}Vtk
|
||||||
|
${VTK_LIBRARIES}
|
||||||
|
Boost::unit_test_framework
|
||||||
|
)
|
||||||
|
|
||||||
|
uLib_add_tests(VtkMath)
|
||||||
|
|
||||||
|
configure_file(capelluzzo.stl ${CMAKE_CURRENT_BINARY_DIR}/capelluzzo.stl COPYONLY)
|
||||||
BIN
src/Vtk/Math/testing/capelluzzo.stl
Normal file
BIN
src/Vtk/Math/testing/capelluzzo.stl
Normal file
Binary file not shown.
@@ -23,29 +23,26 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#include "Vtk/Math/vtkStructuredGrid.h"
|
||||||
|
|
||||||
|
|
||||||
#include "Math/StructuredGrid.h"
|
#include "Math/StructuredGrid.h"
|
||||||
|
|
||||||
#include "Vtk/vtkStructuredGrid.h"
|
|
||||||
#include "Vtk/uLibVtkViewer.h"
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
#include "testing-prototype.h"
|
#define BOOST_TEST_MODULE VtkStructuredGridTest
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
using namespace uLib;
|
using namespace uLib;
|
||||||
|
|
||||||
int main()
|
BOOST_AUTO_TEST_CASE(vtkStructuredGridTest) {
|
||||||
{
|
StructuredGrid grid(Vector3i(10, 10, 100));
|
||||||
|
grid.SetSpacing(Vector3f(3, 1, 1));
|
||||||
StructuredGrid grid(Vector3i(10,10,100));
|
|
||||||
grid.SetSpacing(Vector3f(3,1,1));
|
|
||||||
|
|
||||||
Vtk::vtkStructuredGrid grid_viewer(grid);
|
Vtk::vtkStructuredGrid grid_viewer(grid);
|
||||||
|
|
||||||
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
Vtk::Viewer viewer;
|
Vtk::Viewer viewer;
|
||||||
viewer.AddPuppet(grid_viewer);
|
viewer.AddPuppet(grid_viewer);
|
||||||
viewer.Start();
|
viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
BOOST_CHECK(grid_viewer.GetWidget() != nullptr);
|
||||||
}
|
}
|
||||||
71
src/Vtk/Math/testing/vtkTriangleMeshTest.cpp
Normal file
71
src/Vtk/Math/testing/vtkTriangleMeshTest.cpp
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#include "Vtk/Math/vtkTriangleMesh.h"
|
||||||
|
#include "Math/TriangleMesh.h"
|
||||||
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
|
#define BOOST_TEST_MODULE VtkTriangleMeshTest
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
using namespace uLib;
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(vtkTriangleMeshConstruction) {
|
||||||
|
TriangleMesh mesh;
|
||||||
|
|
||||||
|
mesh.AddPoint(Vector3f(0, 0, 0));
|
||||||
|
mesh.AddPoint(Vector3f(0, 1, 0));
|
||||||
|
mesh.AddPoint(Vector3f(1, 0, 0));
|
||||||
|
mesh.AddTriangle(Vector3i(0, 1, 2));
|
||||||
|
|
||||||
|
Vtk::vtkTriangleMesh v_mesh(mesh);
|
||||||
|
v_mesh.Update();
|
||||||
|
|
||||||
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
|
Vtk::Viewer viewer;
|
||||||
|
viewer.AddPuppet(v_mesh);
|
||||||
|
viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(mesh.Points().size(), 3u);
|
||||||
|
BOOST_CHECK_EQUAL(mesh.Triangles().size(), 1u);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(vtkTriangleMeshConstruction2) {
|
||||||
|
TriangleMesh mesh;
|
||||||
|
|
||||||
|
Vtk::vtkTriangleMesh v_mesh(mesh);
|
||||||
|
v_mesh.ReadFromStlFile("capelluzzo.stl");
|
||||||
|
v_mesh.Update();
|
||||||
|
|
||||||
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
|
Vtk::Viewer viewer;
|
||||||
|
viewer.AddPuppet(v_mesh);
|
||||||
|
viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(mesh.Points().size(), 3u);
|
||||||
|
BOOST_CHECK_EQUAL(mesh.Triangles().size(), 1u);
|
||||||
|
}
|
||||||
@@ -23,40 +23,37 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#include "Vtk/Math/vtkVoxImage.h"
|
||||||
|
#include "Math/VoxImage.h"
|
||||||
#include "Detectors/MuonScatter.h"
|
|
||||||
#include "Vtk/vtkMuonScatter.h"
|
|
||||||
|
|
||||||
#include "Vtk/uLibVtkViewer.h"
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
#include "testing-prototype.h"
|
#define BOOST_TEST_MODULE VtkVoxImageTest
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
using namespace uLib;
|
using namespace uLib;
|
||||||
|
|
||||||
int main()
|
struct TestVoxel {
|
||||||
{
|
Scalarf Value;
|
||||||
MuonScatter event;
|
unsigned int Count;
|
||||||
event.LineIn().direction << 0, -1, 1, 0;
|
};
|
||||||
event.LineIn().origin << 0, 1, -1, 1;
|
|
||||||
|
|
||||||
event.LineOut().direction << 0, -1, 0, 0;
|
BOOST_AUTO_TEST_CASE(vtkVoxImageConstruction) {
|
||||||
event.LineOut().origin << 0, -1, 0, 1;
|
TestVoxel zero = {0, 0};
|
||||||
|
TestVoxel nonzero = {5.5f * 1e-6f, 100};
|
||||||
|
|
||||||
Vtk::vtkMuonScatter v_event(event);
|
VoxImage<TestVoxel> img(Vector3i(10, 10, 10));
|
||||||
v_event.AddPocaPoint(HPoint3f(0,0,0));
|
img.SetSpacing(Vector3f(3, 3, 3));
|
||||||
|
img.InitVoxels(zero);
|
||||||
|
img[Vector3i(3, 3, 3)] = nonzero;
|
||||||
|
|
||||||
v_event.SaveToXMLFile("vtk_testing_muonevent.vtp");
|
Vtk::vtkVoxImage vtk_img(img);
|
||||||
|
vtk_img.SaveToXMLFile("test_vtkvoximage.vti");
|
||||||
|
|
||||||
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
Vtk::Viewer viewer;
|
Vtk::Viewer viewer;
|
||||||
|
viewer.AddPuppet(vtk_img);
|
||||||
// Vtk::Tie<Vtk::vtkMuonScatter> tms;
|
|
||||||
// tms.DoAction();
|
|
||||||
// Vtk::Tie<Vtk::Viewer> vms;
|
|
||||||
// vms.DoAction();
|
|
||||||
|
|
||||||
viewer.AddPuppet(v_event);
|
|
||||||
viewer.Start();
|
viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
BOOST_CHECK(vtk_img.GetImageData() != nullptr);
|
||||||
}
|
}
|
||||||
@@ -23,30 +23,20 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef VTKHLINEREPRESENTATION_H
|
#ifndef VTKHLINEREPRESENTATION_H
|
||||||
#define VTKHLINEREPRESENTATION_H
|
#define VTKHLINEREPRESENTATION_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class vtkProp;
|
class vtkProp;
|
||||||
class vtkPolyData;
|
class vtkPolyData;
|
||||||
|
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
|
|
||||||
class vtkHLineRepresentationDefault {
|
class vtkHLineRepresentationDefault {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vtkHLineRepresentationDefault();
|
vtkHLineRepresentationDefault();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace uLib
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // VTKHLINEREPRESENTATION_H
|
#endif // VTKHLINEREPRESENTATION_H
|
||||||
114
src/Vtk/Math/vtkStructuredGrid.cpp
Normal file
114
src/Vtk/Math/vtkStructuredGrid.cpp
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Math/StructuredGrid.h"
|
||||||
|
#include "Vtk/Math/vtkStructuredGrid.h"
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////// VTK STRUCTURED GRID /////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
vtkStructuredGrid::vtkStructuredGrid(Content &content)
|
||||||
|
: m_Content(&content), m_Actor(vtkActor::New()),
|
||||||
|
m_Widget(vtkBoxWidget::New()), m_Transform(vtkTransform::New()) {
|
||||||
|
vtkSmartPointer<vtkWidgetCallback> callback =
|
||||||
|
vtkSmartPointer<vtkWidgetCallback>::New();
|
||||||
|
callback->SetGrid(this);
|
||||||
|
m_Widget->AddObserver(vtkCommand::InteractionEvent, callback);
|
||||||
|
|
||||||
|
this->InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkStructuredGrid::~vtkStructuredGrid() {
|
||||||
|
m_Actor->Delete();
|
||||||
|
m_Widget->Delete();
|
||||||
|
m_Transform->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkStructuredGrid::SetTransform(vtkTransform *t) {
|
||||||
|
vtkMatrix4x4 *vmat = t->GetMatrix();
|
||||||
|
Matrix4f mat;
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
mat(i, j) = vmat->GetElement(i, j);
|
||||||
|
m_Content->SetMatrix(mat);
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkMatrix4x4> vmat2 = vtkSmartPointer<vtkMatrix4x4>::New();
|
||||||
|
mat = m_Content->GetWorldMatrix();
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
vmat2->SetElement(i, j, mat(i, j));
|
||||||
|
m_Transform->SetMatrix(vmat2);
|
||||||
|
m_Transform->Update();
|
||||||
|
this->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkBoxWidget *vtkStructuredGrid::GetWidget() { return m_Widget; }
|
||||||
|
|
||||||
|
void vtkStructuredGrid::Update() { m_Actor->GetMapper()->Update(); }
|
||||||
|
|
||||||
|
void vtkStructuredGrid::InstallPipe() {
|
||||||
|
vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
|
||||||
|
vtkSmartPointer<vtkTransformPolyDataFilter> filter =
|
||||||
|
vtkSmartPointer<vtkTransformPolyDataFilter>::New();
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkMatrix4x4> vmat = vtkSmartPointer<vtkMatrix4x4>::New();
|
||||||
|
Matrix4f mat = m_Content->GetWorldMatrix();
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
vmat->SetElement(i, j, mat(i, j));
|
||||||
|
m_Transform->SetMatrix(vmat);
|
||||||
|
filter->SetTransform(m_Transform);
|
||||||
|
filter->SetInputConnection(cube->GetOutputPort());
|
||||||
|
|
||||||
|
Vector3i dims = m_Content->GetDims();
|
||||||
|
cube->SetBounds(0, dims(0), 0, dims(1), 0, dims(2));
|
||||||
|
cube->Update();
|
||||||
|
filter->Update();
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mapper->SetInputConnection(filter->GetOutputPort());
|
||||||
|
|
||||||
|
m_Actor->SetMapper(mapper);
|
||||||
|
m_Actor->GetProperty()->SetRepresentationToSurface();
|
||||||
|
m_Actor->GetProperty()->SetEdgeVisibility(true);
|
||||||
|
m_Actor->GetProperty()->SetOpacity(0.4);
|
||||||
|
m_Actor->GetProperty()->SetAmbient(0.7);
|
||||||
|
this->Update();
|
||||||
|
m_Widget->SetProp3D(m_Actor);
|
||||||
|
|
||||||
|
this->SetProp(m_Actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
@@ -23,64 +23,59 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef U_VTKSTRUCTUREDGRID_H
|
#ifndef U_VTKSTRUCTUREDGRID_H
|
||||||
#define U_VTKSTRUCTUREDGRID_H
|
#define U_VTKSTRUCTUREDGRID_H
|
||||||
|
|
||||||
#include <vtkLineSource.h>
|
#include <vtkActor.h>
|
||||||
#include <vtkBoundingBox.h>
|
#include <vtkBoundingBox.h>
|
||||||
#include <vtkCubeSource.h>
|
#include <vtkCubeSource.h>
|
||||||
#include <vtkSmartPointer.h>
|
#include <vtkLineSource.h>
|
||||||
#include <vtkPolyDataMapper.h>
|
#include <vtkPolyDataMapper.h>
|
||||||
#include <vtkActor.h>
|
|
||||||
#include <vtkProperty.h>
|
#include <vtkProperty.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
|
||||||
#include <vtkTransform.h>
|
|
||||||
#include <vtkTransformPolyDataFilter.h>
|
|
||||||
#include <vtkBoxWidget.h>
|
#include <vtkBoxWidget.h>
|
||||||
#include <vtkCommand.h>
|
#include <vtkCommand.h>
|
||||||
|
#include <vtkTransform.h>
|
||||||
|
#include <vtkTransformPolyDataFilter.h>
|
||||||
|
|
||||||
#include "Math/Dense.h"
|
#include "Math/Dense.h"
|
||||||
|
|
||||||
#include "uLibVtkInterface.h"
|
|
||||||
#include "Math/StructuredGrid.h"
|
#include "Math/StructuredGrid.h"
|
||||||
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
|
|
||||||
class vtkStructuredGrid : public Puppet {
|
class vtkStructuredGrid : public Puppet {
|
||||||
typedef StructuredGrid Content;
|
typedef StructuredGrid Content;
|
||||||
public:
|
|
||||||
|
|
||||||
|
public:
|
||||||
vtkStructuredGrid(Content &content);
|
vtkStructuredGrid(Content &content);
|
||||||
~vtkStructuredGrid();
|
~vtkStructuredGrid();
|
||||||
|
|
||||||
void SetTransform(class vtkTransform *t);
|
void SetTransform(class vtkTransform *t);
|
||||||
|
|
||||||
class vtkBoxWidget * GetWidget();
|
class vtkBoxWidget *GetWidget();
|
||||||
|
|
||||||
void Update();
|
void Update();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InstallPipe();
|
void InstallPipe();
|
||||||
|
|
||||||
class vtkWidgetCallback : public vtkCommand
|
class vtkWidgetCallback : public vtkCommand {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
||||||
|
|
||||||
void SetGrid(uLib::Vtk::vtkStructuredGrid *grid) { this->grid = grid; }
|
void SetGrid(uLib::Vtk::vtkStructuredGrid *grid) { this->grid = grid; }
|
||||||
|
|
||||||
virtual void Execute(vtkObject *caller, unsigned long, void*)
|
virtual void Execute(vtkObject *caller, unsigned long, void *) {
|
||||||
{
|
|
||||||
vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
|
vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
|
||||||
vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(caller);
|
vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget *>(caller);
|
||||||
widget->GetTransform(t);
|
widget->GetTransform(t);
|
||||||
grid->SetTransform(t);
|
grid->SetTransform(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uLib::Vtk::vtkStructuredGrid *grid;
|
uLib::Vtk::vtkStructuredGrid *grid;
|
||||||
};
|
};
|
||||||
@@ -91,9 +86,7 @@ private:
|
|||||||
vtkTransform *m_Transform;
|
vtkTransform *m_Transform;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
} // vtk
|
} // namespace uLib
|
||||||
} // uLib
|
|
||||||
|
|
||||||
|
|
||||||
#endif // VTKSTRUCTUREDGRID_H
|
#endif // VTKSTRUCTUREDGRID_H
|
||||||
166
src/Vtk/Math/vtkTriangleMesh.cpp
Normal file
166
src/Vtk/Math/vtkTriangleMesh.cpp
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
|
||||||
|
#include <vtkOBJReader.h>
|
||||||
|
#include <vtkPolyDataReader.h>
|
||||||
|
#include <vtkSTLReader.h>
|
||||||
|
#include <vtkXMLPolyDataReader.h>
|
||||||
|
|
||||||
|
#include <vtkActor.h>
|
||||||
|
#include <vtkCellArray.h>
|
||||||
|
#include <vtkPoints.h>
|
||||||
|
#include <vtkPolyData.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
|
|
||||||
|
#include "Vtk/Math/vtkTriangleMesh.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
void vtkTriangleMesh::vtk2uLib_update() {
|
||||||
|
vtkIdType number_of_points = m_Poly->GetNumberOfPoints();
|
||||||
|
vtkIdType number_of_triangles = m_Poly->GetNumberOfPolys();
|
||||||
|
|
||||||
|
std::cout << "//////\n"
|
||||||
|
<< "number of points = " << number_of_points << "\n"
|
||||||
|
<< "number of polys = " << number_of_triangles << "\n"
|
||||||
|
<< "//////\n";
|
||||||
|
|
||||||
|
m_content.Points().resize(number_of_points);
|
||||||
|
for (int i = 0; i < number_of_points; ++i) {
|
||||||
|
double *point = m_Poly->GetPoint(i);
|
||||||
|
m_content.Points()[i](0) = point[0];
|
||||||
|
m_content.Points()[i](1) = point[1];
|
||||||
|
m_content.Points()[i](2) = point[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
m_content.Triangles().resize(number_of_triangles);
|
||||||
|
m_Poly->GetPolys()->InitTraversal();
|
||||||
|
vtkSmartPointer<vtkIdList> idList = vtkSmartPointer<vtkIdList>::New();
|
||||||
|
for (int i = 0; i < number_of_triangles; ++i) {
|
||||||
|
m_Poly->GetPolys()->GetNextCell(idList);
|
||||||
|
m_content.Triangles()[i](0) = idList->GetId(0);
|
||||||
|
m_content.Triangles()[i](1) = idList->GetId(1);
|
||||||
|
m_content.Triangles()[i](2) = idList->GetId(2);
|
||||||
|
}
|
||||||
|
m_Poly->Modified();
|
||||||
|
m_Actor->GetMapper()->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkTriangleMesh::uLib2vtk_update() {
|
||||||
|
vtkIdType number_of_points = m_content.Points().size();
|
||||||
|
vtkIdType number_of_triangles = m_content.Triangles().size();
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
|
||||||
|
points->SetNumberOfPoints(number_of_points);
|
||||||
|
for (vtkIdType i = 0; i < number_of_points; i++) {
|
||||||
|
double x, y, z;
|
||||||
|
x = m_content.Points().at(i)(0);
|
||||||
|
y = m_content.Points().at(i)(1);
|
||||||
|
z = m_content.Points().at(i)(2);
|
||||||
|
points->SetPoint(i, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkSmartPointer<vtkCellArray> polys = vtkSmartPointer<vtkCellArray>::New();
|
||||||
|
for (vtkIdType i = 0; i < number_of_triangles; i++) {
|
||||||
|
vtkIdType a, b, c;
|
||||||
|
a = m_content.Triangles().at(i)(0);
|
||||||
|
b = m_content.Triangles().at(i)(1);
|
||||||
|
c = m_content.Triangles().at(i)(2);
|
||||||
|
polys->InsertNextCell(3);
|
||||||
|
polys->InsertCellPoint(a);
|
||||||
|
polys->InsertCellPoint(b);
|
||||||
|
polys->InsertCellPoint(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Poly->SetPoints(points);
|
||||||
|
m_Poly->SetPolys(polys);
|
||||||
|
m_Poly->Modified();
|
||||||
|
m_Actor->GetMapper()->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------- //
|
||||||
|
|
||||||
|
vtkTriangleMesh::vtkTriangleMesh(vtkTriangleMesh::Content &content)
|
||||||
|
: m_content(content), m_Poly(vtkPolyData::New()), m_Actor(vtkActor::New()) {
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mapper->SetInputData(m_Poly);
|
||||||
|
m_Actor->SetMapper(mapper);
|
||||||
|
this->SetProp(m_Actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkTriangleMesh::~vtkTriangleMesh() {
|
||||||
|
m_Poly->Delete();
|
||||||
|
m_Actor->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkTriangleMesh::ReadFromFile(const char *filename) {
|
||||||
|
vtkSmartPointer<vtkPolyDataReader> reader =
|
||||||
|
vtkSmartPointer<vtkPolyDataReader>::New();
|
||||||
|
reader->SetFileName(filename);
|
||||||
|
reader->Update();
|
||||||
|
m_Poly->DeepCopy(reader->GetOutput());
|
||||||
|
vtk2uLib_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkTriangleMesh::ReadFromXMLFile(const char *filename) {
|
||||||
|
vtkSmartPointer<vtkXMLPolyDataReader> reader =
|
||||||
|
vtkSmartPointer<vtkXMLPolyDataReader>::New();
|
||||||
|
reader->SetFileName(filename);
|
||||||
|
reader->Update();
|
||||||
|
m_Poly->DeepCopy(reader->GetOutput());
|
||||||
|
vtk2uLib_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkTriangleMesh::ReadFromObjFile(const char *filename) {
|
||||||
|
vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New();
|
||||||
|
reader->SetFileName(filename);
|
||||||
|
reader->Update();
|
||||||
|
m_Poly->DeepCopy(reader->GetOutput());
|
||||||
|
vtk2uLib_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkTriangleMesh::ReadFromStlFile(const char *filename) {
|
||||||
|
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
|
||||||
|
reader->SetFileName(filename);
|
||||||
|
reader->Update();
|
||||||
|
m_Poly->DeepCopy(reader->GetOutput());
|
||||||
|
vtk2uLib_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkPolyData *vtkTriangleMesh::GetPolyData() const { return m_Poly; }
|
||||||
|
|
||||||
|
void vtkTriangleMesh::Update() { uLib2vtk_update(); }
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
@@ -23,22 +23,21 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef VTKTRIANGLEMESH_H
|
#ifndef VTKTRIANGLEMESH_H
|
||||||
#define VTKTRIANGLEMESH_H
|
#define VTKTRIANGLEMESH_H
|
||||||
|
|
||||||
|
|
||||||
#include "uLibVtkInterface.h"
|
|
||||||
#include "Math/TriangleMesh.h"
|
#include "Math/TriangleMesh.h"
|
||||||
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
|
||||||
class vtkPolyData;
|
class vtkPolyData;
|
||||||
|
class vtkActor;
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
class vtkTriangleMesh : public Puppet, public Polydata {
|
||||||
class vtkTriangleMesh : public Abstract::uLibVtkPolydata {
|
|
||||||
typedef TriangleMesh Content;
|
typedef TriangleMesh Content;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vtkTriangleMesh(Content &content);
|
vtkTriangleMesh(Content &content);
|
||||||
~vtkTriangleMesh();
|
~vtkTriangleMesh();
|
||||||
@@ -51,8 +50,6 @@ public:
|
|||||||
|
|
||||||
void ReadFromStlFile(const char *filename);
|
void ReadFromStlFile(const char *filename);
|
||||||
|
|
||||||
virtual class vtkProp *GetProp();
|
|
||||||
|
|
||||||
virtual class vtkPolyData *GetPolyData() const;
|
virtual class vtkPolyData *GetPolyData() const;
|
||||||
|
|
||||||
void Update();
|
void Update();
|
||||||
@@ -66,8 +63,7 @@ private:
|
|||||||
vtkActor *m_Actor;
|
vtkActor *m_Actor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
}
|
|
||||||
|
|
||||||
#endif // VTKTRIANGLEMESH_H
|
#endif // VTKTRIANGLEMESH_H
|
||||||
286
src/Vtk/Math/vtkVoxImage.cpp
Normal file
286
src/Vtk/Math/vtkVoxImage.cpp
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
/*//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 >
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <vtkImageExport.h>
|
||||||
|
#include <vtkImageImport.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
|
||||||
|
#include <vtkFloatArray.h>
|
||||||
|
#include <vtkPointData.h>
|
||||||
|
|
||||||
|
#include <vtkGenericDataObjectReader.h>
|
||||||
|
#include <vtkImageShiftScale.h>
|
||||||
|
|
||||||
|
#include <vtkColorTransferFunction.h>
|
||||||
|
#include <vtkPiecewiseFunction.h>
|
||||||
|
#include <vtkSmartVolumeMapper.h>
|
||||||
|
#include <vtkVolumeProperty.h>
|
||||||
|
|
||||||
|
#include <vtkActor.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
|
#include <vtkProperty.h>
|
||||||
|
|
||||||
|
#include <Math/VoxImage.h>
|
||||||
|
|
||||||
|
#include "Vtk/Math/vtkVoxImage.h"
|
||||||
|
|
||||||
|
namespace uLib {
|
||||||
|
namespace Vtk {
|
||||||
|
|
||||||
|
void vtkVoxImage::GetContent() {
|
||||||
|
const int *dims = static_cast<const int *>(m_Content.GetDims().data());
|
||||||
|
m_Image->SetDimensions(dims);
|
||||||
|
|
||||||
|
float *spacing = m_Content.GetSpacing().data();
|
||||||
|
m_Image->SetSpacing(spacing[0], spacing[1], spacing[2]);
|
||||||
|
|
||||||
|
float *pos = m_Content.GetPosition().data();
|
||||||
|
m_Image->SetOrigin(pos[0], pos[1], pos[2]);
|
||||||
|
|
||||||
|
vtkFloatArray *array =
|
||||||
|
vtkFloatArray::SafeDownCast(m_Image->GetPointData()->GetScalars());
|
||||||
|
array->SetNumberOfTuples(m_Content.GetDims().prod());
|
||||||
|
Vector3i index(0, 0, 0);
|
||||||
|
int i = 0;
|
||||||
|
for (int zv = 0; zv < dims[2]; ++zv) {
|
||||||
|
for (int yv = 0; yv < dims[1]; ++yv) {
|
||||||
|
for (int xv = 0; xv < dims[0]; ++xv) {
|
||||||
|
index << xv, yv, zv;
|
||||||
|
array->SetValue(i++, m_Content.GetValue(index));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_Image->GetPointData()->SetScalars(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::SetContent() {
|
||||||
|
int *ext = m_Image->GetExtent();
|
||||||
|
int dims[3] = {ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, ext[5] - ext[4] + 1};
|
||||||
|
m_Content.SetDims(Vector3i(dims[0], dims[1], dims[2]));
|
||||||
|
|
||||||
|
double *spacing = m_Image->GetSpacing();
|
||||||
|
m_Content.SetSpacing(Vector3f(spacing[0], spacing[1], spacing[2]));
|
||||||
|
|
||||||
|
double *pos = m_Image->GetOrigin();
|
||||||
|
m_Content.SetPosition(Vector3f(pos[0], pos[1], pos[2]));
|
||||||
|
|
||||||
|
vtkFloatArray *array =
|
||||||
|
vtkFloatArray::SafeDownCast(m_Image->GetPointData()->GetScalars());
|
||||||
|
if (array) {
|
||||||
|
Vector3i index(0, 0, 0);
|
||||||
|
int i = 0;
|
||||||
|
for (int zv = 0; zv < dims[2]; ++zv) {
|
||||||
|
for (int yv = 0; yv < dims[1]; ++yv) {
|
||||||
|
for (int xv = 0; xv < dims[0]; ++xv) {
|
||||||
|
index << xv, yv, zv;
|
||||||
|
m_Content.SetValue(index, array->GetValue(i++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::cerr << "Error reading array Value Data\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// VTK VOXIMAGE
|
||||||
|
|
||||||
|
vtkVoxImage::vtkVoxImage(Content &content)
|
||||||
|
: m_Content(content), m_Actor(vtkVolume::New()),
|
||||||
|
m_Image(vtkImageData::New()), m_Outline(vtkCubeSource::New()),
|
||||||
|
m_Reader(NULL), m_Writer(NULL), writer_factor(1.E6) {
|
||||||
|
GetContent();
|
||||||
|
InstallPipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkVoxImage::~vtkVoxImage() {
|
||||||
|
m_Image->Delete();
|
||||||
|
m_Actor->Delete();
|
||||||
|
m_Outline->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkImageData *vtkVoxImage::GetImageData() {
|
||||||
|
GetContent();
|
||||||
|
return m_Image;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::SaveToXMLFile(const char *fname) {
|
||||||
|
vtkSmartPointer<vtkXMLImageDataWriter> writer =
|
||||||
|
vtkSmartPointer<vtkXMLImageDataWriter>::New();
|
||||||
|
writer->SetFileName(fname);
|
||||||
|
GetContent();
|
||||||
|
vtkSmartPointer<vtkImageShiftScale> vtkscale =
|
||||||
|
vtkSmartPointer<vtkImageShiftScale>::New();
|
||||||
|
|
||||||
|
#if VTK_MAJOR_VERSION <= 5
|
||||||
|
vtkscale->SetInputConnection(m_Image->GetProducerPort());
|
||||||
|
#else
|
||||||
|
vtkscale->SetInputData(m_Image);
|
||||||
|
#endif
|
||||||
|
vtkscale->SetScale(writer_factor);
|
||||||
|
vtkscale->Update();
|
||||||
|
writer->SetInputConnection(vtkscale->GetOutputPort());
|
||||||
|
writer->Update();
|
||||||
|
writer->Write();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::ReadFromVKTFile(const char *fname) {
|
||||||
|
vtkSmartPointer<vtkGenericDataObjectReader> reader =
|
||||||
|
vtkSmartPointer<vtkGenericDataObjectReader>::New();
|
||||||
|
reader->SetFileName(fname);
|
||||||
|
reader->Update();
|
||||||
|
if (reader->IsFileStructuredPoints()) {
|
||||||
|
vtkSmartPointer<vtkImageShiftScale> vtkscale =
|
||||||
|
vtkSmartPointer<vtkImageShiftScale>::New();
|
||||||
|
vtkscale->SetInputConnection(reader->GetOutputPort());
|
||||||
|
vtkscale->SetScale(1 / writer_factor);
|
||||||
|
vtkscale->Update();
|
||||||
|
|
||||||
|
m_Image->DeepCopy(vtkscale->GetOutput());
|
||||||
|
SetContent();
|
||||||
|
} else {
|
||||||
|
std::cerr << "Error: file does not contain structured points\n";
|
||||||
|
}
|
||||||
|
m_Actor->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::ReadFromXMLFile(const char *fname) {
|
||||||
|
vtkSmartPointer<vtkXMLImageDataReader> reader =
|
||||||
|
vtkSmartPointer<vtkXMLImageDataReader>::New();
|
||||||
|
reader->SetFileName(fname);
|
||||||
|
reader->Update();
|
||||||
|
vtkSmartPointer<vtkImageShiftScale> vtkscale =
|
||||||
|
vtkSmartPointer<vtkImageShiftScale>::New();
|
||||||
|
vtkscale->SetInputConnection(reader->GetOutputPort());
|
||||||
|
vtkscale->SetScale(1 / writer_factor);
|
||||||
|
vtkscale->Update();
|
||||||
|
|
||||||
|
m_Image->DeepCopy(vtkscale->GetOutput());
|
||||||
|
SetContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::setShadingPreset(int blendType) {
|
||||||
|
vtkSmartVolumeMapper *mapper = (vtkSmartVolumeMapper *)m_Actor->GetMapper();
|
||||||
|
vtkVolumeProperty *property = m_Actor->GetProperty();
|
||||||
|
|
||||||
|
static vtkColorTransferFunction *colorFun = vtkColorTransferFunction::New();
|
||||||
|
static vtkPiecewiseFunction *opacityFun = vtkPiecewiseFunction::New();
|
||||||
|
|
||||||
|
float window = 40 / writer_factor;
|
||||||
|
float level = 20 / writer_factor;
|
||||||
|
|
||||||
|
property->SetColor(colorFun);
|
||||||
|
property->SetScalarOpacity(opacityFun);
|
||||||
|
property->SetInterpolationTypeToLinear();
|
||||||
|
|
||||||
|
if (blendType != 6) {
|
||||||
|
colorFun->RemoveAllPoints();
|
||||||
|
opacityFun->RemoveAllPoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (blendType) {
|
||||||
|
case 0:
|
||||||
|
colorFun->AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0);
|
||||||
|
opacityFun->AddSegment(level - 0.5 * window, 0.0, level + 0.5 * window,
|
||||||
|
1.0);
|
||||||
|
mapper->SetBlendModeToMaximumIntensity();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
colorFun->AddRGBSegment(level - 0.5 * window, 0.0, 0.0, 0.0,
|
||||||
|
level + 0.5 * window, 1.0, 1.0, 1.0);
|
||||||
|
opacityFun->AddSegment(level - 0.5 * window, 0.0, level + 0.5 * window,
|
||||||
|
1.0);
|
||||||
|
mapper->SetBlendModeToComposite();
|
||||||
|
property->ShadeOff();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
colorFun->AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0);
|
||||||
|
opacityFun->AddSegment(level - 0.5 * window, 0.0, level + 0.5 * window,
|
||||||
|
1.0);
|
||||||
|
mapper->SetBlendModeToComposite();
|
||||||
|
property->ShadeOn();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
colorFun->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);
|
||||||
|
colorFun->AddRGBPoint(-1000, .62, .36, .18, 0.5, 0.0);
|
||||||
|
colorFun->AddRGBPoint(-500, .88, .60, .29, 0.33, 0.45);
|
||||||
|
colorFun->AddRGBPoint(3071, .83, .66, 1, 0.5, 0.0);
|
||||||
|
opacityFun->AddPoint(-3024, 0, 0.5, 0.0);
|
||||||
|
opacityFun->AddPoint(-1000, 0, 0.5, 0.0);
|
||||||
|
opacityFun->AddPoint(-500, 1.0, 0.33, 0.45);
|
||||||
|
opacityFun->AddPoint(3071, 1.0, 0.5, 0.0);
|
||||||
|
mapper->SetBlendModeToComposite();
|
||||||
|
property->ShadeOn();
|
||||||
|
property->SetAmbient(0.1);
|
||||||
|
property->SetDiffuse(0.9);
|
||||||
|
property->SetSpecular(0.2);
|
||||||
|
property->SetSpecularPower(10.0);
|
||||||
|
property->SetScalarOpacityUnitDistance(0.8919);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
vtkGenericWarningMacro("Unknown blend type.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::Update() {
|
||||||
|
m_Actor->Update();
|
||||||
|
m_Outline->SetBounds(m_Image->GetBounds());
|
||||||
|
m_Outline->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtkVoxImage::InstallPipe() {
|
||||||
|
vtkSmartPointer<vtkSmartVolumeMapper> mapper =
|
||||||
|
vtkSmartPointer<vtkSmartVolumeMapper>::New();
|
||||||
|
#if VTK_MAJOR_VERSION <= 5
|
||||||
|
mapper->SetInputConnection(m_Image->GetProducerPort());
|
||||||
|
#else
|
||||||
|
mapper->SetInputData(m_Image);
|
||||||
|
#endif
|
||||||
|
mapper->Update();
|
||||||
|
|
||||||
|
m_Actor->SetMapper(mapper);
|
||||||
|
this->setShadingPreset(0);
|
||||||
|
mapper->Update();
|
||||||
|
|
||||||
|
m_Outline->SetBounds(m_Image->GetBounds());
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper> mmapper =
|
||||||
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
mmapper->SetInputConnection(m_Outline->GetOutputPort());
|
||||||
|
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
|
||||||
|
actor->SetMapper(mmapper);
|
||||||
|
actor->GetProperty()->SetRepresentationToWireframe();
|
||||||
|
actor->GetProperty()->SetAmbient(0.7);
|
||||||
|
|
||||||
|
this->SetProp(m_Actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
@@ -23,29 +23,25 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef U_VTKVOXIMAGE_H
|
#ifndef U_VTKVOXIMAGE_H
|
||||||
#define U_VTKVOXIMAGE_H
|
#define U_VTKVOXIMAGE_H
|
||||||
|
|
||||||
#include <vtkVolume.h>
|
#include <vtkCubeSource.h>
|
||||||
#include <vtkImageData.h>
|
#include <vtkImageData.h>
|
||||||
|
#include <vtkVolume.h>
|
||||||
#include <vtkXMLImageDataReader.h>
|
#include <vtkXMLImageDataReader.h>
|
||||||
#include <vtkXMLImageDataWriter.h>
|
#include <vtkXMLImageDataWriter.h>
|
||||||
#include <vtkCubeSource.h>
|
|
||||||
|
|
||||||
#include <Math/VoxImage.h>
|
#include <Math/VoxImage.h>
|
||||||
|
|
||||||
#include "uLibVtkInterface.h"
|
#include "Vtk/uLibVtkInterface.h"
|
||||||
|
|
||||||
|
|
||||||
class vtkImageData;
|
class vtkImageData;
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
|
|
||||||
class vtkVoxImage : public Puppet
|
class vtkVoxImage : public Puppet {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
typedef Abstract::VoxImage Content;
|
typedef Abstract::VoxImage Content;
|
||||||
|
|
||||||
@@ -57,7 +53,7 @@ public:
|
|||||||
|
|
||||||
void SetContent();
|
void SetContent();
|
||||||
|
|
||||||
vtkImageData * GetImageData();
|
vtkImageData *GetImageData();
|
||||||
|
|
||||||
void SaveToXMLFile(const char *fname);
|
void SaveToXMLFile(const char *fname);
|
||||||
|
|
||||||
@@ -85,11 +81,9 @@ private:
|
|||||||
|
|
||||||
float m_Window;
|
float m_Window;
|
||||||
float m_Level;
|
float m_Level;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // vtk
|
} // namespace Vtk
|
||||||
} // uLib
|
} // namespace uLib
|
||||||
|
|
||||||
|
|
||||||
#endif // VTKVOXIMAGE_H
|
#endif // VTKVOXIMAGE_H
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#if VTK_5_x
|
|
||||||
_VTK_LIBS = -lQVTK \
|
|
||||||
-lLSDyna \
|
|
||||||
-lMapReduceMPI \
|
|
||||||
-lmpistubs \
|
|
||||||
-lvtkalglib \
|
|
||||||
-lvtkCharts \
|
|
||||||
-lvtkCommon \
|
|
||||||
-lvtkDICOMParser \
|
|
||||||
-lvtkexoIIc \
|
|
||||||
-lvtkFiltering \
|
|
||||||
-lvtkftgl \
|
|
||||||
-lvtkGenericFiltering \
|
|
||||||
-lvtkGraphics \
|
|
||||||
-lvtkHybrid \
|
|
||||||
-lvtkImaging \
|
|
||||||
-lvtkInfovis \
|
|
||||||
-lvtkmetaio \
|
|
||||||
-lvtkNetCDF_cxx \
|
|
||||||
-lvtkNetCDF \
|
|
||||||
-lvtkproj4 \
|
|
||||||
-lvtkRendering \
|
|
||||||
-lvtksqlite \
|
|
||||||
-lvtksys \
|
|
||||||
-lvtkverdict \
|
|
||||||
-lvtkViews \
|
|
||||||
-lvtkVolumeRendering \
|
|
||||||
-lvtkWidgets
|
|
||||||
|
|
||||||
AM_CFLAGS += $(VTK_CFLAGS)
|
|
||||||
AM_CXXFLAGS += $(VTK_CXXFLAGS)
|
|
||||||
AM_LDFLAGS += $(VTK_LDFLAGS) $(_VTK_LIBS)
|
|
||||||
|
|
||||||
#else
|
|
||||||
#_VTK_LIBS = \
|
|
||||||
# -lvtkRenderingOpenGL-6.0 \
|
|
||||||
# -lvtkImagingHybrid-6.0 \
|
|
||||||
# -lvtkIOImage-6.0 \
|
|
||||||
# -lvtkCommonDataModel-6.0 \
|
|
||||||
# -lvtkCommonMath-6.0 \
|
|
||||||
# -lvtkCommonCore-6.0 \
|
|
||||||
# -lvtksys-6.0 \
|
|
||||||
# -lvtkCommonMisc-6.0 \
|
|
||||||
# -lvtkCommonSystem-6.0 \
|
|
||||||
# -lvtkCommonTransforms-6.0 \
|
|
||||||
# -lvtkCommonExecutionModel-6.0 \
|
|
||||||
# -lvtkDICOMParser-6.0 \
|
|
||||||
# -lvtkIOCore-6.0 \
|
|
||||||
# -lvtkzlib-6.0 \
|
|
||||||
# -lvtkmetaio-6.0 \
|
|
||||||
# -lvtkjpeg-6.0 \
|
|
||||||
# -lvtkpng-6.0 \
|
|
||||||
# -lvtktiff-6.0 \
|
|
||||||
# -lvtkImagingCore-6.0 \
|
|
||||||
# -lvtkRenderingCore-6.0 \
|
|
||||||
# -lvtkFiltersExtraction-6.0 \
|
|
||||||
# -lvtkFiltersCore-6.0 \
|
|
||||||
# -lvtkFiltersGeneral-6.0 \
|
|
||||||
# -lvtkCommonComputationalGeometry-6.0 \
|
|
||||||
# -lvtkFiltersStatistics-6.0 \
|
|
||||||
# -lvtkImagingFourier-6.0 \
|
|
||||||
# -lvtkalglib-6.0 \
|
|
||||||
# -lvtkFiltersGeometry-6.0 \
|
|
||||||
# -lvtkFiltersSources-6.0 \
|
|
||||||
# -lvtkIOXMLParser-6.0 \
|
|
||||||
# -lvtkexpat-6.0 \
|
|
||||||
# -lvtkRenderingAnnotation-6.0 \
|
|
||||||
# -lvtkImagingColor-6.0 \
|
|
||||||
# -lvtkRenderingFreeType-6.0 \
|
|
||||||
# -lvtkfreetype-6.0 \
|
|
||||||
# -lvtkftgl-6.0 \
|
|
||||||
# -lvtkInteractionStyle-6.0 \
|
|
||||||
# -lvtkRenderingVolumeOpenGL-6.0 \
|
|
||||||
# -lvtkRenderingVolume-6.0 \
|
|
||||||
# -lvtkIOXML-6.0 \
|
|
||||||
# -lvtkIOGeometry-6.0 \
|
|
||||||
# -lvtkjsoncpp-6.0 \
|
|
||||||
# -lvtkInteractionWidgets-6.0 \
|
|
||||||
# -lvtkFiltersHybrid-6.0 \
|
|
||||||
# -lvtkImagingSources-6.0 \
|
|
||||||
# -lvtkFiltersModeling-6.0 \
|
|
||||||
# -lvtkImagingGeneral-6.0 \
|
|
||||||
# -lvtkIOLegacy-6.0 \
|
|
||||||
# -lvtkRenderingFreeTypeOpenGL-6.0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#AM_CFLAGS += $(VTK_CFLAGS)
|
|
||||||
#AM_CXXFLAGS += $(VTK_CXXFLAGS) -rdynamic
|
|
||||||
#AM_LDFLAGS += $(VTK_LDFLAGS) $(_VTK_LIBS) -lGLU -lSM -lICE -lX11 -lXext -lSM -lICE -lX11 -lXext -lXt -lm -ldl -lGL
|
|
||||||
#endif
|
|
||||||
@@ -2,9 +2,6 @@
|
|||||||
set( TESTS
|
set( TESTS
|
||||||
vtkViewerTest
|
vtkViewerTest
|
||||||
vtkContainerBoxTest
|
vtkContainerBoxTest
|
||||||
vtkMuonScatter
|
|
||||||
vtkStructuredGridTest
|
|
||||||
vtkVoxRaytracerTest
|
|
||||||
# vtkVoxImageTest
|
# vtkVoxImageTest
|
||||||
# vtkTriangleMeshTest
|
# vtkTriangleMeshTest
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,8 +23,6 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "Vtk/uLibVtkViewer.h"
|
#include "Vtk/uLibVtkViewer.h"
|
||||||
|
|
||||||
#include "Math/ContainerBox.h"
|
#include "Math/ContainerBox.h"
|
||||||
@@ -37,17 +35,16 @@ using namespace uLib;
|
|||||||
int main() {
|
int main() {
|
||||||
BEGIN_TESTING(vtk ContainerBox Test);
|
BEGIN_TESTING(vtk ContainerBox Test);
|
||||||
|
|
||||||
Vtk::Viewer v_viewer;
|
|
||||||
|
|
||||||
ContainerBox box;
|
ContainerBox box;
|
||||||
box.SetSize(Vector3f(2,3,4));
|
box.SetSize(Vector3f(2, 3, 4));
|
||||||
box.SetPosition(Vector3f(1,2,3));
|
box.SetPosition(Vector3f(1, 2, 3));
|
||||||
|
Vtk::vtkContainerBox v_box(&box);
|
||||||
Vtk::vtkContainerBox v_box(box);
|
|
||||||
|
|
||||||
|
if (std::getenv("CTEST_PROJECT_NAME") == nullptr) {
|
||||||
|
Vtk::Viewer v_viewer;
|
||||||
v_viewer.AddPuppet(v_box);
|
v_viewer.AddPuppet(v_box);
|
||||||
v_viewer.Start();
|
v_viewer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
END_TESTING;
|
END_TESTING;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
/*//////////////////////////////////////////////////////////////////////////////
|
|
||||||
// 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 >
|
|
||||||
|
|
||||||
------------------------------------------------------------------
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3.0 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library.
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "Math/VoxImage.h"
|
|
||||||
#include "Vtk/vtkVoxImage.h"
|
|
||||||
#include "Vtk/uLibVtkViewer.h"
|
|
||||||
|
|
||||||
#include "testing-prototype.h"
|
|
||||||
|
|
||||||
using namespace uLib;
|
|
||||||
|
|
||||||
struct TestVoxel {
|
|
||||||
Scalarf Value;
|
|
||||||
unsigned int Count;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
BEGIN_TESTING(Vtk Vox Image);
|
|
||||||
|
|
||||||
TestVoxel zero = {0,0};
|
|
||||||
TestVoxel nonzero = {5.5*1E-6,100};
|
|
||||||
|
|
||||||
// { // SIMPLE TESTS //
|
|
||||||
// VoxImage<TestVoxel> img(Vector3i(10,10,10));
|
|
||||||
// img.SetSpacing(Vector3f(3,3,3));
|
|
||||||
|
|
||||||
// img.InitVoxels(zero);
|
|
||||||
// img[Vector3i(3,3,3)] = nonzero;
|
|
||||||
|
|
||||||
// Vtk::vtkVoxImage vtk_img(img);
|
|
||||||
|
|
||||||
// vtk_img.SaveToXMLFile("test.vti");
|
|
||||||
// vtk_img.setShadingPreset(0);
|
|
||||||
|
|
||||||
// // vtk_img.ReadFromVKTFile("error.vtk");
|
|
||||||
|
|
||||||
// // VoxImage<TestVoxel> img2 = img;
|
|
||||||
|
|
||||||
// // Vtk::vtkVoxImage vtk_img2(img2);
|
|
||||||
|
|
||||||
// // img2.ExportToVtk("error_saved.vtk",0);
|
|
||||||
|
|
||||||
// // vtk_img2.SaveToXMLFile("error_saved.vti");
|
|
||||||
|
|
||||||
// Vtk::Viewer viewer;
|
|
||||||
// viewer.AddPuppet(vtk_img);
|
|
||||||
// viewer.Start();
|
|
||||||
// }
|
|
||||||
|
|
||||||
{ // SIMPLE TESTS //
|
|
||||||
VoxImage<TestVoxel> img(Vector3i(10,10,1));
|
|
||||||
img.SetSpacing(Vector3f(3,3,3));
|
|
||||||
|
|
||||||
img.InitVoxels(zero);
|
|
||||||
img[Vector3i(3,3,0)] = nonzero;
|
|
||||||
|
|
||||||
Vtk::vtkVoxImage vtk_img(img);
|
|
||||||
|
|
||||||
vtk_img.ReadFromVKTFile("test.vtk");
|
|
||||||
vtk_img.Update();
|
|
||||||
|
|
||||||
// vtk_img.SaveToXMLFile("test.vti");
|
|
||||||
// vtk_img.setShadingPreset(0);
|
|
||||||
|
|
||||||
// Vtk::vtkVoxImage vtk_img2(img2);
|
|
||||||
// img2.ExportToVtk("error_saved.vtk",0);
|
|
||||||
// vtk_img2.SaveToXMLFile("error_saved.vti");
|
|
||||||
|
|
||||||
Vtk::Viewer viewer;
|
|
||||||
viewer.AddPuppet(vtk_img);
|
|
||||||
viewer.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
END_TESTING;
|
|
||||||
}
|
|
||||||
@@ -23,17 +23,11 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ULIBVTKINTERFACE_H
|
#ifndef ULIBVTKINTERFACE_H
|
||||||
#define ULIBVTKINTERFACE_H
|
#define ULIBVTKINTERFACE_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <ostream>
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
|
||||||
// vtk classes forward declaration //
|
// vtk classes forward declaration //
|
||||||
class vtkProp;
|
class vtkProp;
|
||||||
@@ -42,19 +36,17 @@ class vtkPropCollection;
|
|||||||
class vtkRenderer;
|
class vtkRenderer;
|
||||||
class vtkRendererCollection;
|
class vtkRendererCollection;
|
||||||
|
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
|
|
||||||
class Puppet
|
class Puppet {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
Puppet();
|
Puppet();
|
||||||
~Puppet();
|
~Puppet();
|
||||||
|
|
||||||
virtual vtkProp * GetProp();
|
virtual vtkProp *GetProp();
|
||||||
|
|
||||||
virtual vtkPropCollection * GetProps();
|
virtual vtkPropCollection *GetProps();
|
||||||
|
|
||||||
void ConnectRenderer(vtkRenderer *renderer);
|
void ConnectRenderer(vtkRenderer *renderer);
|
||||||
|
|
||||||
@@ -64,15 +56,15 @@ public:
|
|||||||
|
|
||||||
void DisonnectViewer(class Viewer *viewer);
|
void DisonnectViewer(class Viewer *viewer);
|
||||||
|
|
||||||
vtkRendererCollection * GetRenderers() const;
|
vtkRendererCollection *GetRenderers() const;
|
||||||
|
|
||||||
|
|
||||||
virtual void PrintSelf(std::ostream &o) const;
|
virtual void PrintSelf(std::ostream &o) const;
|
||||||
|
|
||||||
virtual void ConnectInteractor(class vtkRenderWindowInteractor *interactor) { (void)interactor; }
|
virtual void ConnectInteractor(class vtkRenderWindowInteractor *interactor) {
|
||||||
|
(void)interactor;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void SetProp(vtkProp *prop);
|
void SetProp(vtkProp *prop);
|
||||||
|
|
||||||
void RemoveProp(vtkProp *prop);
|
void RemoveProp(vtkProp *prop);
|
||||||
@@ -82,13 +74,9 @@ private:
|
|||||||
class PuppetData *d;
|
class PuppetData *d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Polydata {
|
class Polydata {
|
||||||
public:
|
public:
|
||||||
|
virtual vtkPolyData *GetPolyData() const { return NULL; }
|
||||||
virtual vtkPolyData * GetPolyData() const { return NULL; }
|
|
||||||
|
|
||||||
virtual void SaveToFile(const char *vtk_file);
|
virtual void SaveToFile(const char *vtk_file);
|
||||||
|
|
||||||
@@ -98,10 +86,7 @@ protected:
|
|||||||
virtual ~Polydata() {}
|
virtual ~Polydata() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
} // vtk
|
} // namespace uLib
|
||||||
} // uLib
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // ULIBVTKINTERFACE_H
|
#endif // ULIBVTKINTERFACE_H
|
||||||
|
|||||||
@@ -23,137 +23,164 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <vtkSmartPointer.h>
|
|
||||||
#include <vtkRendererCollection.h>
|
|
||||||
#include <vtkRenderWindowInteractor.h>
|
#include <vtkRenderWindowInteractor.h>
|
||||||
|
#include <vtkRendererCollection.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
|
||||||
#include <vtkTextProperty.h>
|
|
||||||
#include <vtkAxesActor.h>
|
#include <vtkAxesActor.h>
|
||||||
#include <vtkCamera.h>
|
#include <vtkCamera.h>
|
||||||
|
#include <vtkCameraOrientationWidget.h>
|
||||||
|
#include <vtkInteractorStyleTrackballCamera.h>
|
||||||
|
#include <vtkObjectFactory.h>
|
||||||
|
#include <vtkTextProperty.h>
|
||||||
|
|
||||||
#include "uLibVtkViewer.h"
|
#include "uLibVtkViewer.h"
|
||||||
|
|
||||||
|
// Custom interactor style: disables spin/inertia so the scene only
|
||||||
|
// rotates while the mouse is actively being moved with the button held.
|
||||||
|
class vtkInteractorStyleNoSpin : public vtkInteractorStyleTrackballCamera {
|
||||||
|
public:
|
||||||
|
static vtkInteractorStyleNoSpin *New();
|
||||||
|
vtkTypeMacro(vtkInteractorStyleNoSpin, vtkInteractorStyleTrackballCamera);
|
||||||
|
|
||||||
|
// Override: when the left button is released, immediately stop any
|
||||||
|
// ongoing motion (rotation/spin) so no momentum is carried over.
|
||||||
|
void OnLeftButtonUp() override {
|
||||||
|
this->StopState();
|
||||||
|
vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
vtkStandardNewMacro(vtkInteractorStyleNoSpin);
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
///// VTK VIEWER //////////////////////////////////////////////////////////////
|
///// VTK VIEWER //////////////////////////////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
Viewer::Viewer()
|
||||||
|
: m_RenderWindow(vtkRenderWindow::New()), m_Renderer(vtkRenderer::New()),
|
||||||
Viewer::Viewer() :
|
|
||||||
m_RenderWindow(vtkRenderWindow::New()),
|
|
||||||
m_Renderer(vtkRenderer::New()),
|
|
||||||
m_Annotation(vtkCornerAnnotation::New()),
|
m_Annotation(vtkCornerAnnotation::New()),
|
||||||
m_Marker(vtkOrientationMarkerWidget::New())
|
m_Marker(vtkOrientationMarkerWidget::New()), m_CameraWidget(nullptr) {
|
||||||
{
|
#if VTK_MAJOR_VERSION >= 9 || \
|
||||||
|
(VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 90)
|
||||||
|
m_CameraWidget = vtkCameraOrientationWidget::New();
|
||||||
|
#endif
|
||||||
InstallPipe();
|
InstallPipe();
|
||||||
}
|
}
|
||||||
|
|
||||||
Viewer::~Viewer()
|
Viewer::~Viewer() {
|
||||||
{
|
|
||||||
UninstallPipe();
|
UninstallPipe();
|
||||||
|
|
||||||
m_Annotation->Delete();
|
m_Annotation->Delete();
|
||||||
m_Marker->Delete();
|
m_Marker->Delete();
|
||||||
|
if (m_CameraWidget)
|
||||||
|
m_CameraWidget->Delete();
|
||||||
m_Renderer->Delete();
|
m_Renderer->Delete();
|
||||||
m_RenderWindow->Delete();
|
m_RenderWindow->Delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::InstallPipe()
|
void Viewer::InstallPipe() {
|
||||||
{
|
|
||||||
m_RenderWindow->AddRenderer(m_Renderer);
|
m_RenderWindow->AddRenderer(m_Renderer);
|
||||||
|
m_RenderWindow->SetSize(600,600);
|
||||||
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
|
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
|
||||||
vtkSmartPointer<vtkRenderWindowInteractor>::New();
|
vtkSmartPointer<vtkRenderWindowInteractor>::New();
|
||||||
renderWindowInteractor->SetRenderWindow(m_RenderWindow);
|
renderWindowInteractor->SetRenderWindow(m_RenderWindow);
|
||||||
|
|
||||||
|
// Use a custom style with no spin/inertia
|
||||||
|
vtkSmartPointer<vtkInteractorStyleNoSpin> style =
|
||||||
|
vtkSmartPointer<vtkInteractorStyleNoSpin>::New();
|
||||||
|
renderWindowInteractor->SetInteractorStyle(style);
|
||||||
|
|
||||||
// annotation //
|
// annotation //
|
||||||
m_Annotation->GetTextProperty()->SetColor(1,1,1);
|
m_Annotation->GetTextProperty()->SetColor(1, 1, 1);
|
||||||
m_Annotation->GetTextProperty()->SetFontFamilyToArial();
|
m_Annotation->GetTextProperty()->SetFontFamilyToArial();
|
||||||
m_Annotation->GetTextProperty()->SetOpacity(0.5);
|
m_Annotation->GetTextProperty()->SetOpacity(0.5);
|
||||||
m_Annotation->SetMaximumFontSize(10);
|
m_Annotation->SetMaximumFontSize(10);
|
||||||
m_Annotation->SetText(0,"uLib VTK Viewer - OpenCMT all right reserved.");
|
m_Annotation->SetText(0, "uLib VTK Viewer - OpenCMT all right reserved.");
|
||||||
m_Renderer->AddViewProp(m_Annotation);
|
m_Renderer->AddViewProp(m_Annotation);
|
||||||
|
|
||||||
// orientation marker //
|
// orientation marker //
|
||||||
vtkSmartPointer<vtkAxesActor> axes =
|
vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
|
||||||
vtkSmartPointer<vtkAxesActor>::New();
|
|
||||||
m_Marker->SetInteractor(renderWindowInteractor);
|
m_Marker->SetInteractor(renderWindowInteractor);
|
||||||
m_Marker->SetOrientationMarker(axes);
|
m_Marker->SetOrientationMarker(axes);
|
||||||
m_Marker->SetViewport(0.0,0.0,0.2,0.2);
|
m_Marker->SetViewport(0.0, 0.0, 0.2, 0.2);
|
||||||
m_Marker->SetEnabled(true);
|
m_Marker->SetEnabled(true);
|
||||||
m_Marker->InteractiveOff();
|
m_Marker->InteractiveOff();
|
||||||
|
|
||||||
|
// camera orientation widget //
|
||||||
|
if (m_CameraWidget) {
|
||||||
|
m_CameraWidget->SetParentRenderer(m_Renderer);
|
||||||
|
m_CameraWidget->SetInteractor(renderWindowInteractor);
|
||||||
|
m_CameraWidget->On();
|
||||||
|
}
|
||||||
|
|
||||||
// Must be rendered here in Vtk-6.0 or seg-fault //
|
// Must be rendered here in Vtk-6.0 or seg-fault //
|
||||||
m_RenderWindow->Render();
|
m_RenderWindow->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::UninstallPipe()
|
void Viewer::UninstallPipe() {
|
||||||
{
|
|
||||||
m_Renderer->RemoveAllViewProps();
|
m_Renderer->RemoveAllViewProps();
|
||||||
m_Renderer->Clear();
|
m_Renderer->Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::addProp(vtkProp *prop)
|
void Viewer::addProp(vtkProp *prop) {
|
||||||
{
|
|
||||||
m_Renderer->AddActor(prop);
|
m_Renderer->AddActor(prop);
|
||||||
m_Renderer->Render();
|
m_Renderer->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::RemoveProp(vtkProp *prop)
|
void Viewer::RemoveProp(vtkProp *prop) {
|
||||||
{
|
|
||||||
m_Renderer->RemoveViewProp(prop);
|
m_Renderer->RemoveViewProp(prop);
|
||||||
m_Renderer->Render();
|
m_Renderer->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::AddPuppet(Puppet &prop)
|
void Viewer::AddPuppet(Puppet &prop) {
|
||||||
{
|
|
||||||
prop.ConnectRenderer(m_Renderer);
|
prop.ConnectRenderer(m_Renderer);
|
||||||
|
prop.ConnectInteractor(this->GetInteractor());
|
||||||
m_Renderer->Render();
|
m_Renderer->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::RemovePuppet(Puppet &prop)
|
void Viewer::RemovePuppet(Puppet &prop) {
|
||||||
{
|
|
||||||
prop.DisconnectRenderer(m_Renderer);
|
prop.DisconnectRenderer(m_Renderer);
|
||||||
m_Renderer->Render();
|
m_Renderer->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::Start()
|
vtkSmartPointer<vtkCameraOrientationWidget>
|
||||||
{
|
Viewer::MakeCameraOrientationWidget(vtkRenderWindowInteractor *interactor,
|
||||||
m_RenderWindow->GetInteractor()->Start();
|
vtkRenderer *renderer) {
|
||||||
|
vtkSmartPointer<vtkCameraOrientationWidget> widget =
|
||||||
|
vtkSmartPointer<vtkCameraOrientationWidget>::New();
|
||||||
|
widget->SetParentRenderer(renderer);
|
||||||
|
widget->SetInteractor(interactor);
|
||||||
|
widget->On();
|
||||||
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
vtkCornerAnnotation *Viewer::GetAnnotation()
|
void Viewer::Start() { m_RenderWindow->GetInteractor()->Start(); }
|
||||||
{
|
|
||||||
return m_Annotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
vtkRenderer *Viewer::GetRenderer()
|
vtkCornerAnnotation *Viewer::GetAnnotation() { return m_Annotation; }
|
||||||
{
|
|
||||||
return m_Renderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
vtkRenderWindowInteractor *Viewer::GetInteractor()
|
vtkRenderer *Viewer::GetRenderer() { return m_Renderer; }
|
||||||
{
|
|
||||||
|
vtkRenderWindowInteractor *Viewer::GetInteractor() {
|
||||||
return m_RenderWindow->GetInteractor();
|
return m_RenderWindow->GetInteractor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::Reset()
|
vtkCameraOrientationWidget *Viewer::GetCameraWidget() { return m_CameraWidget; }
|
||||||
{
|
|
||||||
m_Renderer->ResetCameraClippingRange();
|
void Viewer::Reset() {
|
||||||
m_Renderer->ResetCamera();
|
this->ZoomAuto();
|
||||||
m_Renderer->Render();
|
m_Renderer->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Viewer::ZoomAuto() {
|
||||||
|
m_Renderer->ResetCameraClippingRange();
|
||||||
|
m_Renderer->ResetCamera();
|
||||||
|
}
|
||||||
|
|
||||||
} // vtk
|
} // namespace Vtk
|
||||||
} // uLib
|
} // namespace uLib
|
||||||
|
|
||||||
|
|||||||
@@ -23,60 +23,63 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ULIBVTKVIEWER_H
|
#ifndef ULIBVTKVIEWER_H
|
||||||
#define ULIBVTKVIEWER_H
|
#define ULIBVTKVIEWER_H
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "uLibVtkInterface.h"
|
#include "uLibVtkInterface.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <vtkRenderer.h>
|
|
||||||
#include <vtkRenderWindow.h>
|
|
||||||
#include <vtkCornerAnnotation.h>
|
#include <vtkCornerAnnotation.h>
|
||||||
#include <vtkOrientationMarkerWidget.h>
|
#include <vtkOrientationMarkerWidget.h>
|
||||||
|
#include <vtkRenderWindow.h>
|
||||||
|
#include <vtkRenderer.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
|
||||||
class vtkProp;
|
class vtkProp;
|
||||||
class vtk3DWidget;
|
class vtk3DWidget;
|
||||||
class vtkCornerAnnotation;
|
class vtkCornerAnnotation;
|
||||||
class vtkRenderWindowInteractor;
|
class vtkRenderWindowInteractor;
|
||||||
class vtkRenderer;
|
class vtkRenderer;
|
||||||
|
class vtkCameraOrientationWidget;
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
|
|
||||||
|
template <class T> class Tie {
|
||||||
template <class T>
|
|
||||||
class Tie {
|
|
||||||
public:
|
public:
|
||||||
void DoAction() {
|
void DoAction() {
|
||||||
std::cout << "Tie::DoAction -> generic Tie does nothing\n";
|
std::cout << "Tie::DoAction -> generic Tie does nothing\n";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Viewer {
|
class Viewer {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Viewer();
|
Viewer();
|
||||||
~Viewer();
|
~Viewer();
|
||||||
|
|
||||||
|
|
||||||
void AddPuppet(Puppet &prop);
|
void AddPuppet(Puppet &prop);
|
||||||
|
|
||||||
void RemovePuppet(Puppet &prop);
|
void RemovePuppet(Puppet &prop);
|
||||||
|
|
||||||
void AddWidget(vtk3DWidget *widget);
|
void AddWidget(vtk3DWidget *widget);
|
||||||
|
|
||||||
|
static vtkSmartPointer<vtkCameraOrientationWidget>
|
||||||
|
MakeCameraOrientationWidget(vtkRenderWindowInteractor *interactor,
|
||||||
|
vtkRenderer *renderer);
|
||||||
|
|
||||||
void Reset();
|
void Reset();
|
||||||
|
void ZoomAuto();
|
||||||
|
|
||||||
void Start();
|
void Start();
|
||||||
|
|
||||||
vtkCornerAnnotation *GetAnnotation();
|
vtkCornerAnnotation *GetAnnotation();
|
||||||
|
|
||||||
vtkRenderer * GetRenderer();
|
vtkRenderer *GetRenderer();
|
||||||
|
|
||||||
vtkRenderWindowInteractor * GetInteractor();
|
vtkRenderWindowInteractor *GetInteractor();
|
||||||
|
|
||||||
|
vtkCameraOrientationWidget *GetCameraWidget();
|
||||||
|
|
||||||
void addProp(vtkProp *prop);
|
void addProp(vtkProp *prop);
|
||||||
|
|
||||||
@@ -90,18 +93,15 @@ private:
|
|||||||
vtkRenderWindow *m_RenderWindow;
|
vtkRenderWindow *m_RenderWindow;
|
||||||
vtkCornerAnnotation *m_Annotation;
|
vtkCornerAnnotation *m_Annotation;
|
||||||
vtkOrientationMarkerWidget *m_Marker;
|
vtkOrientationMarkerWidget *m_Marker;
|
||||||
|
vtkCameraOrientationWidget *m_CameraWidget;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <> class Tie<Viewer> {
|
||||||
class Tie<Viewer> {
|
|
||||||
public:
|
public:
|
||||||
void DoAction() {
|
void DoAction() { std::cout << " VIEWER TIE !!! \n"; }
|
||||||
std::cout << " VIEWER TIE !!! \n";
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
} // vtk
|
} // namespace uLib
|
||||||
} // uLib
|
|
||||||
|
|
||||||
#endif // ULIBVTKVIEWER_H
|
#endif // ULIBVTKVIEWER_H
|
||||||
|
|||||||
@@ -23,69 +23,96 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <vtkSmartPointer.h>
|
|
||||||
#include <vtkCubeSource.h>
|
|
||||||
#include <vtkActor.h>
|
|
||||||
#include <vtkAxes.h>
|
|
||||||
#include <vtkAssembly.h>
|
|
||||||
#include <vtkPolyDataMapper.h>
|
|
||||||
#include <vtkProperty.h>
|
|
||||||
#include <vtkLineSource.h>
|
|
||||||
|
|
||||||
#include "vtkContainerBox.h"
|
#include "vtkContainerBox.h"
|
||||||
|
#include <vtkActor.h>
|
||||||
|
#include <vtkAssembly.h>
|
||||||
|
#include <vtkAxes.h>
|
||||||
|
#include <vtkCubeSource.h>
|
||||||
|
#include <vtkLineSource.h>
|
||||||
|
#include <vtkMatrix4x4.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
|
#include <vtkProperty.h>
|
||||||
|
#include <vtkSmartPointer.h>
|
||||||
|
#include <vtkTransform.h>
|
||||||
|
|
||||||
|
|
||||||
namespace uLib {
|
namespace uLib {
|
||||||
namespace Vtk {
|
namespace Vtk {
|
||||||
|
|
||||||
|
vtkContainerBox::vtkContainerBox(vtkContainerBox::Content *content)
|
||||||
vtkContainerBox::vtkContainerBox(vtkContainerBox::Content &content) :
|
: m_Cube(vtkActor::New()), m_Axes(vtkActor::New()),
|
||||||
m_Cube(vtkActor::New()),
|
|
||||||
m_Axes(vtkActor::New()),
|
|
||||||
m_Pivot(vtkActor::New()),
|
m_Pivot(vtkActor::New()),
|
||||||
m_Content(&content)
|
m_Content(content) {
|
||||||
{
|
|
||||||
this->InstallPipe();
|
this->InstallPipe();
|
||||||
}
|
}
|
||||||
|
|
||||||
vtkContainerBox::~vtkContainerBox()
|
vtkContainerBox::~vtkContainerBox() {
|
||||||
{
|
|
||||||
m_Cube->Delete();
|
m_Cube->Delete();
|
||||||
m_Axes->Delete();
|
m_Axes->Delete();
|
||||||
m_Pivot->Delete();
|
m_Pivot->Delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
vtkPolyData *vtkContainerBox::GetPolyData() const
|
vtkPolyData *vtkContainerBox::GetPolyData() const {
|
||||||
{
|
|
||||||
// TODO
|
// TODO
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vtkContainerBox::InstallPipe()
|
void vtkContainerBox::Update() {
|
||||||
{
|
if (!m_Content)
|
||||||
if(!m_Content) return;
|
return;
|
||||||
|
vtkSmartPointer<vtkMatrix4x4> vmat = vtkSmartPointer<vtkMatrix4x4>::New();
|
||||||
|
Matrix4f transform = m_Content->GetMatrix();
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
vmat->SetElement(i, j, transform(i, j));
|
||||||
|
|
||||||
|
std::cout << "transform: " << transform << std::endl;
|
||||||
|
|
||||||
|
// m_RelativeTransform->SetMatrix(vmat);
|
||||||
|
// m_RelativeTransform->Update();
|
||||||
|
|
||||||
|
m_Cube->SetUserMatrix(vmat);
|
||||||
|
m_Axes->SetUserMatrix(vmat);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void vtkContainerBox::InstallPipe() {
|
||||||
|
if (!m_Content)
|
||||||
|
return;
|
||||||
Content *c = m_Content;
|
Content *c = m_Content;
|
||||||
|
|
||||||
// CUBE
|
// CUBE
|
||||||
vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
|
vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
|
||||||
|
|
||||||
Vector3f p = c->GetPosition();
|
Vector3f p = c->GetPosition();
|
||||||
cube->SetCenter(p(0),p(1),p(2));
|
// cube->SetCenter(p(0), p(1), p(2));
|
||||||
Vector4f p1 = c->GetWorldPoint(HPoint3f(0,0,0));
|
// Vector4f p1 = c->GetWorldPoint(HPoint3f(0, 0, 0));
|
||||||
Vector4f p2 = c->GetWorldPoint(HPoint3f(1,1,1));
|
// Vector4f p2 = c->GetWorldPoint(HPoint3f(1, 1, 1));
|
||||||
vtkSmartPointer<vtkLineSource> line = vtkSmartPointer<vtkLineSource>::New();
|
// vtkSmartPointer<vtkLineSource> line =
|
||||||
line->SetPoint1(p1(0),p1(1),p1(2));
|
// vtkSmartPointer<vtkLineSource>::New(); line->SetPoint1(p1(0), p1(1),
|
||||||
line->SetPoint2(p2(0),p2(1),p2(2));
|
// p1(2)); line->SetPoint2(p2(0), p2(1), p2(2)); line->Update();
|
||||||
line->Update();
|
// cube->SetBounds(line->GetOutput()->GetBounds());
|
||||||
cube->SetBounds(line->GetOutput()->GetBounds());
|
|
||||||
|
vtkSmartPointer<vtkMatrix4x4> vmat = vtkSmartPointer<vtkMatrix4x4>::New();
|
||||||
|
Matrix4f transform = c->GetMatrix();
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
vmat->SetElement(i, j, transform(i, j));
|
||||||
|
|
||||||
|
m_Cube->SetUserMatrix(vmat);
|
||||||
|
|
||||||
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||||
vtkSmartPointer<vtkPolyDataMapper>::New();
|
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
|
cube->SetBounds(0, 1, 0, 1, 0, 1);
|
||||||
mapper->SetInputConnection(cube->GetOutputPort());
|
mapper->SetInputConnection(cube->GetOutputPort());
|
||||||
mapper->Update();
|
mapper->Update();
|
||||||
m_Cube->SetMapper(mapper);
|
m_Cube->SetMapper(mapper);
|
||||||
@@ -94,11 +121,12 @@ void vtkContainerBox::InstallPipe()
|
|||||||
|
|
||||||
// AXES //
|
// AXES //
|
||||||
vtkSmartPointer<vtkAxes> axes = vtkSmartPointer<vtkAxes>::New();
|
vtkSmartPointer<vtkAxes> axes = vtkSmartPointer<vtkAxes>::New();
|
||||||
axes->SetOrigin(p1(0),p1(1),p1(2));
|
axes->SetOrigin(0, 0, 0);
|
||||||
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
mapper->SetInputConnection(axes->GetOutputPort());
|
mapper->SetInputConnection(axes->GetOutputPort());
|
||||||
mapper->Update();
|
mapper->Update();
|
||||||
m_Axes->SetMapper(mapper);
|
m_Axes->SetMapper(mapper);
|
||||||
|
m_Axes->SetUserMatrix(vmat);
|
||||||
Vector3f s = c->GetSize();
|
Vector3f s = c->GetSize();
|
||||||
// m_Axes->SetScale(s(0),s(1),s(2));
|
// m_Axes->SetScale(s(0),s(1),s(2));
|
||||||
m_Axes->GetProperty()->SetLineWidth(3);
|
m_Axes->GetProperty()->SetLineWidth(3);
|
||||||
@@ -107,11 +135,19 @@ void vtkContainerBox::InstallPipe()
|
|||||||
|
|
||||||
// PIVOT //
|
// PIVOT //
|
||||||
axes = vtkSmartPointer<vtkAxes>::New();
|
axes = vtkSmartPointer<vtkAxes>::New();
|
||||||
axes->SetOrigin(p(0),p(1),p(2));
|
axes->SetOrigin(0, 0, 0);
|
||||||
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||||
mapper->SetInputConnection(axes->GetOutputPort());
|
mapper->SetInputConnection(axes->GetOutputPort());
|
||||||
mapper->Update();
|
mapper->Update();
|
||||||
|
m_Pivot->SetUserMatrix(vmat);
|
||||||
m_Pivot->SetMapper(mapper);
|
m_Pivot->SetMapper(mapper);
|
||||||
|
|
||||||
|
Matrix4f pivotTransform = c->AffineTransform::GetWorldMatrix();
|
||||||
|
vtkSmartPointer<vtkMatrix4x4> pmat = vtkSmartPointer<vtkMatrix4x4>::New();
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
pmat->SetElement(i, j, pivotTransform(i, j));
|
||||||
|
m_Pivot->SetUserMatrix(pmat);
|
||||||
s = c->GetScale();
|
s = c->GetScale();
|
||||||
// m_Pivot->SetScale(s(0),s(1),s(2));
|
// m_Pivot->SetScale(s(0),s(1),s(2));
|
||||||
m_Pivot->GetProperty()->SetLineWidth(3);
|
m_Pivot->GetProperty()->SetLineWidth(3);
|
||||||
@@ -123,7 +159,5 @@ void vtkContainerBox::InstallPipe()
|
|||||||
this->SetProp(m_Pivot);
|
this->SetProp(m_Pivot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Vtk
|
||||||
|
} // namespace uLib
|
||||||
} // vtk
|
|
||||||
} // uLib
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user