Skip to content

Commit 441be34

Browse files
author
SightBot
committed
misc: update CHANGELOG.md for release 22.1.0
1 parent c37a278 commit 441be34

File tree

1 file changed

+314
-0
lines changed

1 file changed

+314
-0
lines changed

CHANGELOG.md

+314
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,317 @@
1+
# sight 22.1.0
2+
3+
## New features:
4+
5+
### core
6+
7+
*Add a function profiling utility.*
8+
9+
- fix Warning C4244
10+
- windows pch off support
11+
12+
### io
13+
14+
*Add a DICOM Enhanced-US volume writer.*
15+
16+
The current Dicom Series writer has been updated to call a specialized writer when the SOP class is [Enhanced US Volume](https://dicom.nema.org/dicom/2013/output/chtml/part03/sect_A.59.html).
17+
18+
The new writer is for now minimalist and maybe not 100% DICOM compliant yet, as it requires, nor checks for mandatory tags to operate. However, all frames of a data`::ImageSeries`(on the Z axis) are saved losslessly in jpeg2000, and Series API allows writing/reading per-frame `Image Position Patient/Volume`, `Image Orientation Patient/Volume`, and `Frame Acquisition Date Time`. Even if the writer doesn't ensure other mandatory tags are present, it is still possible (and desirable) to write them using the Series API with the generated tag name/sop class from sight`::data::dicom::Tag`and sight::data::dicom::SopClass. Note however that the current API is limited to simple attributes, not the one located in a frame sequence like in `Shared Functional Groups Sequence`. Some adaptations are required (the same as \`Image Position Patient…). This part will be updated later when needed.
19+
20+
*Use correct gdcm attributes for US volume.*
21+
22+
- ImagePositionVolume, ImageOrientationVolume, FrameAcquisitionDateTime DICOM attribute are now stored into sequence element when using Enhenced US Volume, as before for CT/MR.
23+
- DICOM Tags, SOPClasses, Modules definitions are generated from official documentation using python code. This allows friendlier operations (no need to remember exact tag values, or SOP uids).
24+
- Unit tests have been updated to match changes and use generated DICOM tags, SOPClasses.
25+
- Some bugs with equality operator have been corrected
26+
27+
*Allow forwarding grabber long running jobs.*
28+
29+
*Add optimize slot to IGrabber/SGrabberProxy.*
30+
31+
*Allow specifying a target camera in SGrabberProxy.*
32+
33+
*Nvjpeg writer implementation.*
34+
35+
A "fast" 2D image writer (sight::io::bitmap::Writer) and its associated service (sight::module::io::bitmap::SWriter) have been implemented. The writer uses NVidia CUDA accelerated JPEG / JPEG2000 encoding library: nvJPEG, if support has been compiled in and if a suitable GPU has been found. Alternatively, libjpeg-turbo, openJPEG, libtiff or libPNG can be used as CPU fallback. The performance should be better than VTK or even OpenCV because of direct API calls and avoided unneeded buffer copy.
36+
37+
> :warning: VTK SImageWriter support for 2D bitmap format has been removed. The support was anyway bugged as the image were saved upsode down.
38+
>
39+
> also added:
40+
> - fix on `LocationDialog::getCurrentSelection()` that erased the first char to return an extension from a wildcard filter. Now there is a `ILocationDialog::getSelectedExtensions()` that returns a vector of extension, in case there are more than one extension from a filter.
41+
> - some small fix for high dpi displays in the GUI tester code.
42+
43+
*Add zoom capability in video grabbers.*
44+
45+
We added the possibility to zoom on videos. Some hardware devices offers this possibility, so it is better to use this instead of zooming in the visualization pipeline.
46+
47+
## Enhancement:
48+
49+
### build
50+
51+
*Use /Z7 in all cases and enable ccache for windows.*
52+
53+
### ci
54+
55+
*Enable debug optimized build for GUI tester.*
56+
57+
Our GUI tester is very slow in the coverage build. We enabled optimizations for the tester code, especially for the image comparison functions, hoping that this will decrease the number of false positives.
58+
59+
*Increase test timeout on test coverage.*
60+
61+
### core
62+
63+
*Add private tag support.*
64+
65+
*Lower the test epsilon to be a bit more tolerant.*
66+
67+
*Add strict mode to require matrix presence in SFrameMatrixSynchronizer.*
68+
69+
*Add a simple function to set the location of series instances.*
70+
71+
A function was added to set both the position and orientation of a series instance at once, passing a `sight::data::Matrix4`. Besides this, `sight::data::Matrix4` has been modernized.
72+
73+
### filter
74+
75+
*Make SFrameMatrix synchroniser delay specific for each timeline.*
76+
77+
add a vector for the framesTl and one for the matrixTl to store the delay.
78+
The delay is applied at the synchronization, and the frame/matrix picked is in the past regarding the most recent data, from an amount of delay.
79+
The timelines are associated through their index.
80+
81+
### io
82+
83+
*Un-pause grabber on successive startCamera calls.*
84+
85+
*Skip camera restart when already started.*
86+
87+
### test
88+
89+
*Enhance global test code coverage.*
90+
91+
Many tests were added, especially for the most used services in our applications, that were untested so far.
92+
93+
*Add external project gui test support.*
94+
95+
- rename the gui test core folder to testCore
96+
97+
-change the ITest profile path handling, by geting the full path, and not using "getWorkingDir()". It will be up to the GUI tests to provide the full profile path.
98+
99+
- add the profile modules. The clasicall sightrun looks for the modules situated relatively to the profile path. This allows to load automatically the project modules; This will be done in the ITest too, at the test setup()
100+
101+
-add -B bundlesPath in the cppunit_main. Similarly to classical applications, the -B argument allows specifying additional bundles path. This will be handled in the unit test too.
102+
103+
- change test templates to add external libs path in the PATH variable and bundles path
104+
105+
- in the eventHandling, verify that the event catched is a testEvent, and do nothing if it is not one.
106+
107+
-install exec_gui_test and copy it in sight-projects build bin dir
108+
109+
*Improve operator== tests for Data Objects.*
110+
111+
### ui
112+
113+
*Use unique slot to configure Grabbers.*
114+
115+
* rename some slots from SParameter from "set" to "update" for clarity
116+
* also add a vector of string as part of the parameter_t variant to be able to update all values of enum widget
117+
118+
*Emit signal with value and key from SPreferenceConfiguration.*
119+
120+
The signal, called `preferenceChanged`, has the same signature as the signal `SParameter::parameterChanged`. This simplifies the API when the service needs to listen to a parameter that can be changed from preference or/and from a`SParameter`.
121+
122+
An example of usage is shown in ExSParameter.
123+
124+
*Use a 3 columns layout for SParameters.*
125+
126+
These changes modify SParameters layout to use a 3 columns system instead of the current 6 columns system, to improve the usability of the second and third spinboxes. In addition, the labels of the parameters now can wrap if they are too wide, and a bug where the second and third spinboxes wouldn't be disabled if the depend is disabled is also fixed.
127+
128+
*Apply SParameters' stylesheet globally.*
129+
130+
These changes apply the stylesheet from https://git.ircad.fr/sight/sight/-/merge_requests/795 globally. It can be enabled by setting the `"touch_friendly"` application option to `"true"` at configure time.
131+
132+
*Add a generic signal/slot parameter type.*
133+
134+
*Improve hitboxes for Q*SpinBox controls.*
135+
136+
*Rename toolbar.xml to controls.xml and add more signals.*
137+
138+
=> add some out signals
139+
=> disconnect fileConfigured with video play
140+
=> add documentation
141+
142+
### viz
143+
144+
*Add slot in SShapeExtruder to replace right click.*
145+
146+
These changes add a slot called "cancelLastClick" to cancel the last click in the shape extruder. This allows to replace the right click in context where it isn't available, such as in a touchscreen context.
147+
In addition, this adds a button in SightViewer which triggers this slot when clicked.
148+
149+
*Adapt default transfer function to a reference image.*
150+
151+
The default transfer function can now be adapted to the image pixel type, especially for ultrasound images.
152+
153+
The `data`::Image``no longer holds a default transfer function. To get a default transfer function, you have to use `sight`::module::ui::qt::image::STransferFunction``and specify a reference image as input. This is no issue if you don't want the transfer function selector in the user interface. You can register the service in an invisible view. You can have a look at `Tuto07GenericScene` for instance.
154+
155+
Also, some bugs were fixed in SNegato2DCamera for the computation of the viewport of the axial view.
156+
157+
*Add gestures to scene 3D.*
158+
159+
These changes will allow to use gestures on the 3D scene. It allows in particular to pinch fingers to zoom and to long tap to place a landmark. Simple taps and pan gestures should intuitively map to mouse clicks and mouse drags.
160+
161+
## Refactor:
162+
163+
### build
164+
165+
*Use built-in CMake PCH functions.*
166+
167+
### core
168+
169+
*Introduce SSynchronizer to replace all frame/matrices sync services.*
170+
171+
This refactors fundamentally the synchronization between frames and matrices, by bringing a single service SSynchronization that replaces all the previous ones: `SFrameMatrixSynchronizer`, `SMatrixSynchronizer`, `SMatrixTLSynchronizer` and `SFrameUpdater`. It is much more versatile to answer all the different use cases and his behaviour is well tested.
172+
173+
*Inherit data::Activity from data::Composite.*
174+
175+
*Separate service public and private API.*
176+
177+
We reduced the size of the public API of the IService interface, which is undoubtedly the most used in Sight.
178+
179+
First, the data management responsibility has been moved to the IHasData interface and now holds the getters and setters for inputs, in/outs and outputs. Secondly, a significant part of the implementation of IService methods has been moved to a pimpl in service`::detail::Service`and service::detail::ServiceConnection.
180+
181+
The AppConfigManager was moved in the detail namespace as well, so now the public API only exposes IAppConfigManager.
182+
183+
This refactor also finishes the migration of data::ptr. Now the objects of services are only held in data::ptr, the former input, inout and output maps of IService were removed, which simplifies a lot the code. This also implies that services can no longer specify any data in the XML configuration that is not declared as data::ptr. In this repository, only two services relied on the old behaviour SConfigController and SConfigLauncher. The migration consisted in using a single declared group of objects (data::ptr_vector<data::Object>) instead of multiple undeclared objects. Changes were brought in all XML configurations.
184+
185+
Last, the ObjectService registry refactor was also finished. Its role has been reduced because we no longer rely on it to store the relationship between services and objects. This responsibility is filled by the services themselves. So now, this registry only holds a global list of registered services. It has been renamed accordingly. Doing so, the sight`::service::registry`namespace was removed, and the only other class that was there, sight`::service::registry::Proxy`was moved to sight::core::com::Proxy. Indeed, it has actually no dependency at all on services and is generic enough to be in the core`::com`namespace.
186+
187+
*Deprecate IService::getConfigTree().*
188+
189+
*Remove ConfigurationElement totally.*
190+
191+
*Remove AppManager and Qml apps based on it.*
192+
193+
*Replace ConfigurationElement in IService.*
194+
195+
*Replace ConfigurationElement in all service configurations.*
196+
197+
### io
198+
199+
*Create a widget & window configuration for pacs selector.*
200+
201+
* the widget config is called by the windows config
202+
* widget can be used if the pacs selector should be integrated in a existing window
203+
204+
*Create macros `SIGHT_REGISTER_SERIALIZER` to ease the serialization's function registration for each data.*
205+
206+
### viz
207+
208+
*Simplify layer configuration for scene3d adaptors.*
209+
210+
The scene3d adaptors no longer specify their layer. Instead, it is implicitly declared in the `SRender` configuration by putting the adaptors as children of the layers tags.
211+
212+
```xml
213+
<service uid="genericSceneSrv" type="sight::viz::scene3d::SRender" >
214+
<scene>
215+
<background topColor="#36393E" bottomColor="#36393E" />
216+
217+
<layer id="first" order="1" />
218+
<adaptor uid="trackballInteractorAdp" />
219+
</layer>
220+
221+
<layer id="second" order="2" />
222+
<adaptor uid="negatoAdp" />
223+
</layer>
224+
225+
</scene>
226+
</service>
227+
```
228+
229+
*Store transfer function as 2D Nx1x1 texture.*
230+
231+
## Bug fixes:
232+
233+
### build
234+
235+
*Update dependency URLs.*
236+
237+
*Use relative paths in launcher installed scripts.*
238+
239+
*Only install header files when necessary.*
240+
241+
This prevents rebuilding a child repository each time sight is installed. To achieve this, a custom target was added to generate the library headers without `*_API` macros in the build folder, and then copy these at install. Previously, we modified the files directly in the install folders, which led to always modify the timestamp of the headers, thus triggering the rebuild.
242+
243+
### ci
244+
245+
*Use 'fetch' strategy instead of none on Windows.*
246+
247+
On Windows, we do not have docker runners. Thus the build folders are reused between jobs. GIT_STRATEGY='none' is faster but does not provide the clean stage that is performed with 'clone' and 'fetch'. Because of this, we may end up with artifacts from previous jobs in the deploy stages. To overcome this, we use the 'fetch' strategy. It is useless to get the sources, but, this gives us the clean stage which is impossible to do in a build script.
248+
See https://gitlab.com/gitlab-org/gitlab/-/issues/17103
249+
250+
*Doxygen deployment.*
251+
252+
### io
253+
254+
*Use new bitmap writer for screenshots.*
255+
256+
*Ensure serializer register is unique.*
257+
258+
*Make loop great again.*
259+
260+
reset the timelines when reading process reached the end and is in loop mode
261+
add loop mode (slot + config + mechanism) in SMatricesReader
262+
make SMatricesReader pause system similar to SFrameGrabber one
263+
264+
*Serialize & deserialize correctly empty objects.*
265+
266+
- Data::Mesh
267+
* do not resize if mesh has no points / cells
268+
* Add VTK_EMPTY_CELLS in switch case
269+
- Data::Array
270+
* do not resize if deseralized array is empty
271+
- Data`::Image`/ ImageSeries
272+
* initialize Image windowCenter and windowWidth to empty vectors
273+
- Data::TransfertFunction
274+
* mistake in operator==
275+
* also test pieces vector
276+
* implementation of operator !=
277+
- Misc
278+
* Remove Graph, Node, Edge, Port, ReconstructionTraits, ROITraits Data
279+
* Use operator== to compare all data in sessionTest
280+
281+
### test
282+
283+
*Handle external modules properly in test bat and bin.*
284+
285+
*Improve LoadDicom GUI test sensitiveness.*
286+
287+
### ui
288+
289+
*Fix password management for preferences.*
290+
291+
* restore BadPassword exception
292+
* changed inputDialog to return value and a boolean to know if user canceled it
293+
* allow closing sight if user cancel or if wrong password have been entered 3 times
294+
* updated ExActivities plugin configuration to force encryption and to exit on password error
295+
* "once" passwod policy configuration has been changed to "global": "global" which means the global password will be used, if set, otherwise or if wrong, it will be asked to the user
296+
* "default" configuration has been removed. User should simply not set any configuration if they want the default to apply
297+
298+
*Add a slot in SLandmarks scene 3d adaptor to take care of landmarks' group renaming.*
299+
300+
*Replace delete by deleteLater in QtContainer class.*
301+
302+
To get rid of the deletion order we use deleteLater() function on the m_container QPointer.
303+
304+
*Destroy the GUI elements in the reverse order in IGuiContainer.*
305+
306+
### viz
307+
308+
*Use a read lock on the image when possible in SNegato2DCamera.*
309+
310+
When receiving the resize event, we may end up with a deadlock if the image is already locked in writing. This may happen for instance with a writer that uses a progress bar.
311+
312+
*Switch current drawable when swiching OpenGL context.*
313+
314+
1315
# sight 22.0.0
2316

3317
## Enhancement:

0 commit comments

Comments
 (0)