Skip to content

Releases: IRCAD/sight

Sight 24.0.2

18 Apr 10:57
Compare
Choose a tag to compare

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 and sight::module::ui::default_action services in favour of a single service sight::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

31 Jan 11:28
Compare
Choose a tag to compare

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

09 May 07:41
Compare
Choose a tag to compare

New features:

build

Forbid module linking, even for tests.

  • Add a special verification step to forbid linking with a module.
  • Rename fw_cppunit_test to fw_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:

  1. 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.
  2. 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 as AppConfig parameter which is extracted from a required ImageSeries. This can be easily adapted with the use of the new extraction services (SGetImage, SGetMesh, ...) in AppConfig 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::ObjectLockcall 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 if sightrun is launched with --ask-password argument.
  • for preferences, if the appropriate password and encryption policy is set in module ui_base configuration (take a look at libs/ui/base/Preferences.hpp).
  • for session files, if the appropriate password and encryption policy is set in SReader and SWriter service configuration (take a look at modules/io/session/SReader.hpp and modules/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() and start_encrypted_logger which starts sightlog 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::Utilsand a unit test has been added.

Update adaptor::SLandmarksto 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...

Read more

Sight 21.0.0

05 Nov 13:19
Compare
Choose a tag to compare

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 custom SIGHT_VERSION variable,
  • code cleaning was done around this, notably to rename FWPROJECT_NAME into SIGHT_TARGET, which is more correct with the usage of this variable,
  • dependencies computing now browses OBJECT libraries targets, like io_session_obj (fixes Tuto01Basic packaging for instance where sight_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 from cmake/cppunit to cmake/build folder.
  • FindOpenNI2.cmake has been removed
  • fw*.cmake files has been removed, contents was added in cmake/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" into autoConnect="true|false"
  • optional="yes|no" into optional="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::Clientthread 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.
...

Read more