- Feb 26, 2025
-
-
Genial-O authored
-
While sight_viewer is now the new main application delivered with Sight, it still lacks some features. For instance, it can connect to a PACS using DIMSE-C, but not through DicomWeb.
- Feb 20, 2025
-
-
Luis MENDOZA authored
-
- Feb 19, 2025
-
-
-
Didier WECKMANN authored
The fix consists in an additional widget layer, that will hold the layout attributes (mostly, the content margins), that should not be wiped out by children. To allow that, the `widget` class has been extended to manage "compound" widgets, when the container widget exposed to children, also have an intermediate parent widget.
-
- Feb 18, 2025
-
-
This fixes a crash when launching twice a XML configuration with an optional parameter, without passing the optional parameter.
-
- Feb 14, 2025
-
-
- Feb 13, 2025
-
-
Flavien BRIDAULT authored
The behaviour of the trackball interactor has recently changed, and the camera's up vector was hardcoded to -Y. It is now configurable both for the trackball interactor and the predefined interaction with an optional matrix, from which we extract the Y axis.
-
-
- Feb 12, 2025
-
-
Flavien BRIDAULT authored
-
- Feb 11, 2025
-
-
Flavien BRIDAULT authored
The blending between layers was incorrect, and alpha blending was applied twice. This made transparent objects look darker proportionally to the number of layers.
-
- Feb 10, 2025
-
-
Flavien BRIDAULT authored
Always call configure() for sub-services otherwise properties are not initialised properly.
-
-
- Feb 06, 2025
-
-
Flavien BRIDAULT authored
-
Didier WECKMANN authored
Base reader and writer has been improved to support <file>, <folder>, <resource> and windowTitle XML configuration as files, folder, resources and window_title properties. The XML configuration has been deprecated (but kept) and a unit test was added. Readers and writers that used the windowTitle configuration (mainly by defining a different "default"), were updated to use window_title property. This implies passing the class "default" to the super constructor. Breaking change(s) window_title property required a slight change in the API: using the super constructor for the class default and use *m_window_title to access the property when calling open_location_dialog().
-
- Feb 05, 2025
-
-
Flavien BRIDAULT authored
This adds a slider in each view of ex_image_reslice allowing it to slide in the direction of the reslice. In this example, the reslice transform is directly manipulated, so it is not really useful. However, in real applications, the reslice transform will likely come from non-editable data, such as a sensor location. In such cases, the slider allows us to explore around the reslice direction as if we had a real axis. A property was also added to centre the reslice instead of doing it from the bottom left corner.
-
- Feb 03, 2025
-
-
Didier WECKMANN authored
- Add a `<screen index=xx />` attribute to force the displaying on a particular screen. The index is the screen index as returned by `QGuiApplication::screens()` which is the same as the Windows `display number - 1`. - Most shortcuts (menus, toolbars) are now "global", they work regardless of the current focused frame. The "contextual" ones (speed dial) are not, since there are ...contextual. - The `ex_progress_bar` example has been modified to demonstrate the use: The toolbar is on a frame on a screen and the display on another. Shortcuts "1", "2", "3" launch the according jobs.
-
- Jan 31, 2025
-
-
Flavien BRIDAULT authored
Two drift issues were fixed in camera management: * the trackball interactor used to drift when combining a mouse/touch movement in width and height. This was fixed by changing the up vector to stick with the up vector of the world and by applying the first rotation on the second rotation axis, based on the right camera vector. This was also fixed in the predefined interactor by sharing the code. * the predefined interactor, on top of that, drifts when following a target. A quick workaround is proposed, that disables, by default, the following of the target orientation. Thus the interaction only follows the translation part. This behaviour looks anyway closer to the expected result.
-
Alexandre ANCEL authored
- Add option to prevent transfer function scaling to max texture size
-
- Jan 28, 2025
-
-
-
Flavien BRIDAULT authored
`sight::viz::scene3d::material` is refactored and replaced by three new classes: - `sight::viz::scene3d::material::generic`: generic class to handle any material. It provides functions that allow to set uniforms and a function to set textures, in all techniques where they exist. This solves the initial problem of the intrusive tests for OIT and thus avoids a priori knowledge (declaration, etc...) about the generated pass. If the uniform or the texture exists, set it, otherwise, it silently does nothing. However, if nothing is set amongst all techniques, an error is logged, since it should not happen, normally you would expect to reach at least one technique. - `sight::viz::scene3d::material::standard`: allows using our "Default" material, and manages the permutations to handle different shading modes, normals display, etc... - derive this into `sight::viz::scene3d::material::r2vb`: specific version to handle per-primitive colours and triangles generation for quads Also, most adaptors no longer use `sight::module::viz::scene3d::material_adaptor`. It should only be required when wrapping a real `sight::data::material`. Otherwise, `sight::viz::scene3d::material::generic` or one of its inherited classes must be used. We also used the opportunity to sort out parts of the OIT logic. We grouped the generation of OIT material techniques from `material_mgr_listener` and the dynamic compositor passes generation into a new class `sight::viz::scene3d::compositor::manager::oit`. This allowed notably to share many hard-coded strings. Last we harmonized the identifiers for Ogre objects, using the `core::id::join()` function or a new function `viz::scene3d::adaptor::gen_id()` instead of concatenating strings manually.
-
- Jan 24, 2025
-
-
This was indeed a problem with the windows gui test launcher, because of delayed expansion feature not enabled. In short, in a batch script, testing a "variable" must be done using enclosing ! not % and delayed expansion must be enabled with setlocal enabledelayedexpansion, otherwise, the variable value is evaluated BEFORE script execution, resulting returning 0 in all cases, even when the test fails.
-
- Jan 23, 2025
-
-
Didier WECKMANN authored
There was a bug with Toolbars in overlay layout, which prevented to "reserve" the right size. This has been "fixed" / "mitigated" by calling `QWidget::adjustSize()` at strategic places. Still, normally we should not have to do this, even for overlay. Anyway, the workaround should not have any side effect.
-
When using an overlay, events that hit the non-visible/transparent parts (like the "toolbar") will be caught by the overlay, making the behaviour strange for the user who thought he was interacting with the scene. This fixes that by forwarding the events, back to the scene. This was non-trivial because of the nature of the overlay, as the scene and the overlays are "sibling" widgets, not parent/children. Qt will always send events to the top-level widget at a given position, but in our case, the top-level widget, the overlay, may be "transparent" at that position, and we needed to trick Qt into believing the overlay is indeed not there so it could hit the underlying scene. Also, make the container transparent to mouse events if no children are visible in the layout. This is the only known way to make multi-touch events (pan, pinch) work
-
- Jan 21, 2025
-
-
The service `sight::module::filter::image::plane_slicer` that allows to reslice an image with an arbitrary plane now supports images having an arbitrary orientation (not aligned with orthogonal axes). To demonstrate this, a new example `ex_image_reslice` was implemented.
-
- Jan 16, 2025
-
-
Shamim SEDGHI authored
-
- Jan 09, 2025
-
-
Flavien BRIDAULT authored
Geometry libraries were refactored. - `sight::geometry::glm` becomes `sight::geometry` - `sight::geometry::data` now only contains functions relative to `sight::data` objects Several types were renamed or moved: * `fw_matrix4x4`: removed, replaced by `glm::dmat4` * `fw_plane`: replaced by `sight::geometry::plane_t`, moved all related code to `sight::geometry` * `fw_line`: redefined either by `sight::geometry::ray_t` or `sight::geometry::line_t` which both refers to `std::pair<glm::dvec3, glm::dvec3>`. Moved all related code to `sight::geometry` * `fw_vector_index` and `fw_vector_position`: all related code was removed Also `sight::data::image::world_to_image()` and `sight::data::image::image_to_world()` were moved from `sight::data` to `sight::geometry::data`. They were internally rewritten to be more "SIMD" friendly and new functions were added to get the raw transforms: - `sight::data::image::world_to_image_transform()` - `sight::data::image::image_to_world_transform()` This is especially useful in tight loops to avoid recomputing these matrices for each point/voxel.
-
- Dec 19, 2024
-
-
-
This change ensures image orientation is used in filtering and visualisation. To help with the process and to factorize some code, the `sight::data::image` class now has two functions `data::image::image_to_world()` and `data::image::world_to_image()` that convert image coordinates from/to world coordinates. They use internally `data::image::m_orientation`, `data::image::m_origin` and `data::image::m_spacing` and they are templated, so you can use any container that holds 3d coordinates, without having to use `{x, y, z}` construct to convert from/to Ogre, ITK, ... Notable modified classes/helpers: - volume_renderer - ray_tracing_volume_renderer - scene - negato3d - negato2d - negato2d_camera - medical_image - plane - image_extruder - resampler - ITK (reader, writer, converter) - VTK (reader, writer, converter) - image_center - propagator - slice_index_position_editor - ruler - shape - point
-
- Dec 13, 2024
-
-
Marc SCHWEITZER authored
-
- Dec 12, 2024
-
-
Flavien BRIDAULT authored
-
- Dec 11, 2024
-
-
Flavien BRIDAULT authored
It is now possible to pass optional objects with default values in XML configurations: ```xml <extension implements="sight::app::extension::config"> <id>...</id> <parameters> <!-- valid, if not passed, returns the object returned by the default constructor --> <object uid="model_series" type="sight::data::model_series" optional="true" /> <!-- valid, if not passed, returns false --> <object uid="vr_visibility" type="sight::data::boolean" optional="true" value="false" /> <!-- invalid because model_series is not a string_serializable --> <object uid="model_series" type="sight::data::model_series" optional="true" value="..." /> <!-- invalid, "optional" must always be specified. --> <object uid="vr_visibility" type="sight::data::boolean" value="false" /> </parameters> ... </extension> ``` However, the keyword `optional` was already used before to pass deferred objects. To get something harmonized with local objects declaration, the `src` attribute is now deprecated and you must now use `deferred=true` at both places. Similarly, use `preference="true"` instead of `src="preference`. ```xml <extension implements="sight::app::extension::config"> <id>...</id> <parameters> <!-- valid, if not passed, returns the object returned by the default constructor --> <object uid="model_series" type="sight::data::model_series" deferred="true" /> </parameters> <config> <object uid="image" type="sight::data::image_series" deferred="true" /> <object uid="bool" type="sight::data::boolean" value="true" preference="true" /> </config> ... </extension> ```
-
Flavien BRIDAULT authored
The pages deployment must be done in a single job, otherwise they can delete each other content.
-
- Dec 10, 2024
-
-
Shamim SEDGHI authored
-
Shamim SEDGHI authored
-
Flavien BRIDAULT authored
-
-
Flavien BRIDAULT authored
It appears we suffer from a known bug with files larger than 9999 lines. Until we upgrade gcov, we exclude those big files.
-
- Dec 09, 2024
-
-
Flavien BRIDAULT authored
Now, when an incompatibility is found between the signal and the slot, the exception is caught in the proxy and an error is returned. The config can still run, but it will not crash when closing. Also, an important bug was found when trying to match signal and slot signature. We can indeed omit part of the arguments of a signal when connecting a slot, but of course from the right. We can connect for instance: - (int, int) -> (int) - (int, int) -> () But of course we refuse the inverse (we throw `sight::core::com::exception::bad_slot`): - (int) -> (int, int) - () -> (int, int) This mechanism works recursively but was broken when argument types were different like: - (int, int) -> (string) This led to a stack overflow.
😕 This is now fixed and throw `sight::core::com::exception::bad_slot` as well.
-