Releases: IRCAD/sight
Sight 24.1.0
Highlights of this release:
- New progress bar service, allowing to place the progress bar everywhere in the UI like any other regular view,
- Image slice sliders now indicate the location of fiducials,
- Ability to set thread names, in order to make debugging easier,
- Reworked propagation image filter service,
- Harmonized single/split view swaps, as well as fullscreen maximisation (F11 on Windows, CTRL+F11 on Linux),
- All modules in the paths are no longer enabled by default, they are now enabled only with respect to the build dependencies
For the full set of changes, check the changelog.
Sight 24.0.2
Highlights of this release:
- new GUI theme "noctura" with a full icon set
- sound support for notifications
- new adaptor
sight::module::viz::scene3d::adaptor::grid
to display a background grid in 3D scenes - generic application fullscreen support with (F11 on Windows, ctrl-F11 on Linux)
- removed obsolete
sight::module::ui::signal
,sight::module::ui::starter
andsight::module::ui::default_action
services in favour of a single servicesight::module::ui::action
- the coding-style has evolved to use snake case instead of camel case
- MSVC 2022 support for Windows
For the full set of changes, check the changelog.
Sight 22.1.0
Highlights of this release:
- DICOM Enhanced US volume support,
- improved touchscreen interactions especially for 3D scenes,
- simplified synchronisation between frames and images,
- a new bitmap image writer,
- some simplification in the XML syntax (3D scenes),
- a refactor of the
IService
interface, - all services configuration now exclusively use boost property trees for the parsing,
- many bug fixes and improved testing!
For the full set of changes, check the changelog.
Sight 21.1.1
New features:
build
Forbid module linking, even for tests.
- Add a special verification step to forbid linking with a module.
- Rename
fw_cppunit_test
tofw_test
.
Allow privilege escalation on Windows.
Allow to override the downloading of dependencies.
Debian package build prevents networking access.
ci
Enable unit-tests report.
To output unit-tests results in JUnit format will allow us to see the results
of the unit-tests in the GitLab web interface.
Attach gdb to running test to have a core file.
Add code coverage to unit tests and Ubuntu 21.10 support in CI.
core
Remove sub-object extraction from activities.
Now, when defining a requirement in an activity, there is no need to define a corresponding AppConfig
parameter to "replace" it with the corresponding key. In short, the same key is used for the requirement and the parameter, and there is no need to give a complicated object "path":
- Before:
<!-- Activity used to export a model series. -->
<extension implements="sight::activity::extension::Activity">
...
<requirements>
<requirement name="modelSeries" type="sight::data::ModelSeries" minOccurs="1" maxOccurs="1" />
</requirements>
<appConfig id="xxx">
<parameters>
<parameter replace="model" by="@values.modelSeries" />
</parameters>
</appConfig
</extension>
- After:
<extension implements="sight::activity::extension::Activity">
...
<requirements>
<requirement name="modelSeries" type="sight::data::ModelSeries" minOccurs="1" maxOccurs="1" />
</requirements>
<appConfig id="xxx" />
</extension>
Limitation
However, this simplification implies some limitations:
- The key must match for both requirement and
AppConfig
parameter. There is no way to "replace" them on the fly like before. We really believe this is fine as the ability to have a different name only complicate both xml (you need to specify the "mapping") and C++ code, with no real added value. - As we can only access to the "required" object, we cannot "walk" through the object hierarchy and extract sub-objects. For example, it is no more possible to have an
Image
asAppConfig
parameter which is extracted from a requiredImageSeries
. This can be easily adapted with the use of the new extraction services (SGetImage
,SGetMesh
, ...) inAppConfig
code.
New service sight::module::data::SGetCamera.
This new service extracts cameras and extrinsic matrices from a camera series.
New service sight::module::data::SGetSeries.
This service can be used to extract one or several series from a seriesDB.
The XML configuration is fairly simple:
<service uid="..." type="sight::module::data::SGetSeries" >
<in key="seriesDB" uid="..."/>
<out group="series" >
<key index="4" uid="..." />
<key index="2" uid="..." />
</out>
</service>
where:
- seriesDB is a
sight::data::SeriesDB
- series group data are
sight::data::Series
Remove core::data::ObjectLock.
- remove core
::data::ObjectLock
call and use straight locked_ptr in place. - rename all "dump" lock() (lock(), bufferLock(), lock_buffer(), ...) to dump_lock() to avoid confusion with "mutex" locks.
- factorize dump_lock() call in IBuffered.hpp.
- remove one deprecated TimeLine construct.
Implement SGetImage Service.
Add == operators for all data object.
Description
Now a data object of the same type can be compared using == like:
std::shared_ptr<sight::data::Image> image1 = ...;
std::shared_ptr<sight::data::Image> image2 = ...;
if(*image1 == *image2)
{
...
}
Floating point values are compared using a scaled epsilon (which gives result similar to ULP comparison). NaN, infinite values are also taken into account.
Templated helpers core::tools::is_equal()
have been added to ease comparison with containers, pointers and floating point values.
Encrypted log.
Description
Our logging system is based on boost::log, which works fine, but doesn't provide a way to secure the content of the log file. We choose to use minizip-ng with built-in AES encryption as the backend to store the log and continue to use boost log as the frontend. We have also improved password management, to allow encryption to be used even without providing a password. The minizip backend runs in a separate and detached child process, so it will always produce a valid zip archive even if the parent process crashes.
Additions / Changes
CMake
- Enable log encryption support with new CMake build options:
SIGHT_ENABLE_ENCRYPTED_LOG
(OFF by default) - Allow to specify a default hardcoded (but obfuscated) password at compile time, set by
SIGHT_DEFAULT_PASSWORD
CMake definition.
Password management
Password management has been reworked a bit to factorize and unify behaviors.
SIGHT_DEFAULT_PASSWORD
It will be used when required (log encryption, preferences, session, ..) by default, until overwritten by user when an input dialog asking the user for a password is shown. It allows to use encryption, without having to ask user for a password. BTW, this is less secure, as the password is still hardcoded, even if obfuscated in the binary.
User password
An input dialog asking for a password will be shown when:
- the log is encrypted and no
SIGHT_DEFAULT_PASSWORD
is set or ifsightrun
is launched with--ask-password
argument. - for preferences, if the appropriate
password
andencryption
policy
is set in moduleui_base
configuration (take a look atlibs/ui/base/Preferences.hpp
). - for session files, if the appropriate
password
andencryption
policy
is set in SReader and SWriter service configuration (take a look atmodules/io/session/SReader.hpp
andmodules/io/session/SWriter.hpp
).
In all case, the entered password will be kept (obfuscated) in memory, allowing to only ask the password once, until, of course, it is explicitly configured to not do so.
Sightlog logger (utils/sightlog/src/sightlog.cpp)
It is a simple standalone application that read stuff from standard input and write them in a minizip-ng archive or a raw log file. Alternatively, it can also decrypt the real log from a log archive, which can be useful if a human need to read it back. The logger is started as a standalone detached child process by Sight
which ensure the integrity of the log archive, even if Sight
crashes. If SIGHT_DEFAULT_PASSWORD
password has been used, it is also embedded inside sightlog
binary, and it should not be necessary to use -p
option.
sightlog usage
Sightlog logger options:
-h [ --help ] Display this help message.
-v [ --version ] Display the version of the program.
-i [ --input ] arg Log archive to extract.
-p [ --password ] arg Password to use for encryption and decryption.
-a [ --ask-password ] Show a popup to enter the password.
-d [ --directory ] arg Output directory when extracting a log archive.
For example to extract the log file from archive /home/bozo/sight/bin/sight.log.0.zip
protected with password w34r3th3B3st
in directory /home/bozo/logs and we can use:
./sightlog -i /home/bozo/sight/bin/sight.log.0.zip -d /home/bozo/logs -p "w34r3th3B3st"
String "obfuscator" (libs/core/core/crypto/obfuscated_string.hpp)
Allows to define a string literal that will not appears in "clear" text in the final binary. Useful for defining an "hardcoded" password, without being to simple to find and read. This is of course not as secure as a real password entered by a real user.
SpyLogger class
- Doxygen comments..
- New method
start_logger()
andstart_encrypted_logger
which startssightlog
child process. - New unit tests
EncryptedLogTest
- The file paths in the log file are now trimmed again to not show the full path, but the minimal one to be able to locate a source file: (/home/bozo_the_clown/work/src/sight45/.../.../libs/core/core/spyLog.hpp -> libs/core/core/spyLog.hpp)
Add an image parser to allow basic initialisation in xml.
io
Allow custom serializers for any object, even when defined outside sight.
ui
Delete sequencer data when going backward.
Add an option to remove all the data generated when going backward with the sequencer.
viz
Update slice indexes when a landmarks is double clicked.
Update SNegato3d & SNegato2d to move slices to the selected landmark.
- SLandmarks send world position when double clicked (new signal)
- SNegato3d, SNegato2d listens through a slot if slices indexes needs to be updated regarding a world position (new slot).
- Conversion between world coordinates and slice index as been implemented in scene3d
::Utils
and a unit test has been added.
Update adaptor::SLandmarks
to handle double clicks on landmarks and also send the current world coordinates of the point
Use the mouse wheel to scroll through slices in the negatoscope.
Before the mouse wheel event was used to zoom in/out the image, it now allows to scroll the slices, like in other software. The Shift key speeds up scrolling.
You can still zoom in/out the image with the mouse wheel, but with the Ctrl key pressed.
Add optional name to SAxis adaptor.
Refactor:
build
Apply cmake-linter rules.
core
Remove last bits of data reflection based on camp.
Data reflection based on the camp library was definitely removed from Sight. It consisted in removing the files used to declare data reflection...
Sight 21.0.0
Bug fixes:
build
Use project_name in variable exported by sight_generate_components_list.
Do not export SIGHT_COMPONENTS in sight_generate_components_list cmake function, use instead COMPONENTS. This avoids variable collision when using sight in subprojects, since SIGHT_COMPONENTS is exported by sightConfig.cmake.
Sight-project installation error due to sight version.
To fix the main problem, SOVERSION is no longer defined for executable targets. That simply prevents from creating these useless versioned binaries.
On top of that, several other fixes were brought:
- the version attribute of the
project()
CMake command is used instead of redefining a customSIGHT_VERSION
variable, - code cleaning was done around this, notably to rename
FWPROJECT_NAME
intoSIGHT_TARGET
, which is more correct with the usage of this variable, - dependencies computing now browses
OBJECT
libraries targets, likeio_session_obj
(fixesTuto01Basic
packaging for instance wheresight_io_vtk
library was missing), - dependencies computing now handles cross-repositories dependencies (fixes some child projects packaging),
- components ordering was included in a higher-level function
sight_generate_component_list()
for a simpler use outside Sight.
Tests are relatives to last cmake project call.
- Use
${CMAKE_BINARY_DIR}
instead of${PROJECT_BINARY_DIR}
to force executable to be produced in ./bin folder. - Also testing if safe-svfb-run isn't already copied in ./bin
- early return in CppUnitConfig.cmake if CppUnit is already FOUND.
Configure child projects fails.
To fix the problem, we no longer export PCH targets and we no longer export modules .lib.
On top of the initial problem, we also always build utest
, utestData
, and module_utest
instead of only building them when SIGHT_BUILD_TESTS
is ON
. Child projects may need them even if unit tests were not built in Sight.
Generate sight component list.
CMake components in SIGHT_COMPONENTS variable are now ordered automatically according to their dependencies. It will ease the burden to manually maintain the list.
Explicit relative path in installted imported target library symlinks.
When we install packages in child repositories, we copy the necessary dependencies from Sight, for instance, the libraries. On Linux, we also need to recreate the library symlinks. This was done with absolute paths, which makes packages not relocatable. This fix just creates relative symlinks instead.
Fix package generation.
This brings back the package generation with CPack. Both Linux and Windows are functional. Sight can be packaged as a whole (similar to the former "SDK mode") in tar.zst
(Linux) or in .zip
(Windows). Any application or executable target can be packaged in tar.zst
(Linux) or in .exe
installer (Windows).
The CI has been updated to always build the Sight and SightViewer packages on both platforms. However, the deployment on Owncloud is only done on dev and master branch, or on any branch manually.
On the dev branch, the package version number is replaced by -latest
, so that it corresponds to a "latest" build. This prevents us from having to clean our archive folder too frequently since the packages will be erased at each upload.
Readd missing component io_session.
Add missing component for sight-dependent project configurations.
Makes the flag WARNING_AS_ERRORS effective.
Add SMatricesReader export in the plugin.xml.
Export Qt find_package in ui_qt.
Moves find_package(Qt5 ...)
to Dependencies.cmake to be exported when using imported target sight::ui_qt
Geometry_eigen export.
Export also the find_package(Eigen3 QUIET REQUIRED)
for the target geometry_eigen.
Move cppunit_main in cmake/build folder.
Fix the build of unit test on external projects.
cppunit_main.cpp
has been moved fromcmake/cppunit
tocmake/build
folder.FindOpenNI2.cmake
has been removedfw*.cmake
files has been removed, contents was added incmake/build/macros.cmake
file in order to be retrieved from outside.
Install executable shell scripts.
Install missing templates files for executable target
ci
Small typo in SightViewer package name.
Use sed for regex replacement of dev packages.
Launch unit tests properly on Linux.
The code with flock
was wrong, and the test was not executed. The initial code was restored, which should be safe.
Also, there was another specific bug with viz_scene3d
test. It crashed after destroying the first Ogre::Root
. Indeed we chose to create and destroy it after each test. This problem is thus independent of the display number of xvfb-run
since it does succeed to create an OpenGL context once but somehow fails to create a second. We assumed xvfb-run
might be buggy regarding this initialization code.
As a workaround, we create and destroy the Ogre
::Root``only once thanks to a new module sight::module::viz::scene3d::test
.
Last, several tests in serviceTest were fixed.
core
Broken library path on external projects when using '.local' in installation paths.
The deduction of the library path failed when share was already present in the main module path. The problem already occurred with module paths themselves, so the regex is now shared between these two places.
Tuto01DataServiceBasicCpp launch.
The source image loaded at start in Tuto01DataServiceBasicCpp was changed with the one used in Tuto02DataServiceBasic. This fixes the launch of this tutorial.
Add case to replace uids for slide views.
When launching a config, we substitute all by
attributes with uids. We missed a case to handle slide views when attaching a widget.
Add an extra LD_LIBRARY_PATH for intermediate sight projects.
This fixes the inclusion of more than 2 sight projects.
Fix XML configuration parsing (#3).
Fix the parsing of objects containing sub-object (like Composite) or values (like String).
Also fix the parsing of service with an external configuration ("config" tag in the XML service definition).
Make material resource file handling project independent.
Make resources.cfg
path treatment independent of the working dir.
Indeed, the present behavior uses the working dir for the absolute path generation. However, as this is done inside sight code, the prefix corresponds to the sight install path, and not the loading module-specific path.
As a result, files that are not installed in the sight install dir can not be loaded.
It is safer to rely on the module name, and get its specific path.
ExActivities fails to launch.
This fixes the parsing of a service configuration when a config extension was used (config=
attribute).
Harmonize autoConnect booleans config parsing.
This merge requests changes all:
autoConnect="yes|no"
intoautoConnect="true|false"
optional="yes|no"
intooptional="true|false"
FwServicesTest randomly fails.
The last failing test was keyGroupTest. The problem was actually quite simple, the autoconnection with a swapped object is done after the swap. Thus, we have to wait for the object to finish the swap sequence before sending a modified signal from the data. Before we waited for the object to be present in the object map, but this is not sufficient since this only tells the object is registered, and the registration occurs before the swap.
Restore MSVC build.
Windows support is back! Third-part libraries are now built with vcpkg instead of Conan. We found out that vcpkg packages are much more stable and most of all, coherency is ensured between packages.
Few fixes were brought to support the newest version of these libraries. Indeed they are often more recent than Ubuntu packages.
Doing this, the GitLab CI/CD scripts were updated to use Powershell instead of cmd, as recommended by GitLab.
Remove TransferFunctionManagerWindow include from sightViewer plugin.xml.
Several runtime errors after sight 21.0 upgrade.
doc
Rewriting doc of CardinalLayoutManagerBase.
io
DicomXplorer crashes when display mesh preview.
This MR fixes a crash upon selecting mesh in dicomXplorer
.
The problem was simply that old configurations used in this software were deleted.
It does not display the mesh in an activity. It simply fixes the crash and re-enables the preview.
VTK readers doesn't handle color array properly.
When converting from vtk to sight mesh format, we check if color array named "Colors" exists in polydata in order to copy vertex or cells colors. When using PLY reader from VTK (maybe other format too) color array is named "RGB" or "RGBA".
We also added a workaround to fix color rendering of first cell on Ogre 3d. Otherwise, mesh can appear black at first render.
Igtl client is not thread safe.
Make io_igtl::Client
thread safe at connect / disconnect.
OpenIgtLink socket class isn't thread safe at connection due to internal function calls (details in #736).
Dicom readers does not have the good scale along the z axis.
Tuto02DataServiceBasic cannot load sample data.
Tuto02DataServiceBasic loads an image at start, but path to the image was hard-coded (../../data/patient1.vtk
).
A sample image was provided in the resource folder to the tutorial and loaded at startup.
Jpeg Writer (ITK) causes the application to crash upon usage.
ITK jpeg image writer has been replaced by vtk image writer service when saving snapshots in sightviewer.
In addition, the image number of component in the vtk image writer service has been updated, as well as the lock systems.
Remove VTK warnings when reading meshes.
Redirect VTK messages (warnings/errors) in a VTK.log file.
Activities saving failed.
...