MeVisLab Toolbox Reference
SoView2DCSOExtensibleEditor.h
Go to the documentation of this file.
1/*************************************************************************************
2**
3** Copyright 2012, MeVis Medical Solutions AG
4**
5** The user may use this file in accordance with the license agreement provided with
6** the Software or, alternatively, in accordance with the terms contained in a
7** written agreement between the user and MeVis Medical Solutions AG.
8**
9** For further information use the contact form at https://www.mevislab.de/contact
10**
11**************************************************************************************/
12
13
15
16#pragma once
17
18#include <SoView2DExtension.h>
21
22#include <Inventor/misc/SoRef.h>
23
24#include <mlMatrix4.h>
25#include <deque>
26
27typedef std::vector<SoRef<SoCSOEditorExtension> > ExtensionList;
28
30class CSO;
31class CSOList;
33
34class SoCSOTransform;
35
36
37class CSOCreateAction;
38class CSOBulgeAction;
44
48
51
54
56
58
60class CSOVisualizationSettings;
62
70
72
74{
75public:
76
80 static void initClass();
81
126
133 std::string getDefaultCreatorString() const { return std::string("__default"); }
134
136 void pointerLeftWindow() override;
138 void pointerPosition(const SoPointerPosition& pos) override;
139
142
154 void setInteractionModifier(int mode) { _interactionMode = mode; }
156 int getInteractionModifier() const { return _interactionMode; }
157
160
170 bool shouldShowCSOBeyondSlice(const CSODrawSliceInformation& sliceInfo, const CSODrawView2DInfos& view2DInfos, ml::CSO* cso);
178 ml::AbstractTransformationPtr getRegistrationInformation(const SoPointerPosition& pos, ml::CSO* cso);
181 ml::CoordinateSystemReference getCoordinateSystemReference(ml::CSO* cso);
182 ml::CoordinateSystemReference getCoordinateSystemReference(SoView2D* viewer);
183 ml::CoordinateSystemReference getCoordinateSystemReference(const CSODrawView2DInfos& view2DInfos);
184 ml::CoordinateSystemReference getCoordinateSystemReference(const SoPointerPosition& pos);
187 bool hasTransformationProvider() const { return _transformationProvider != nullptr; }
189 ml::AbstractTransformationPtr getTransformation(const ml::CoordinateSystemReference& from, const ml::CoordinateSystemReference& to);
191 bool isSameImage(const ml::CoordinateSystemReference& from, const ml::CoordinateSystemReference& to);
192
195 void transformCSO(ml::CSO* cso, const ml::AbstractTransformationPtr& transformation);
196
198 void fillCSOSliceInformation(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, CSODrawSliceInformation& sliceInfo, const ml::Matrix4& worldToVoxelMatrix, const CSOVoxelSlab& csoSlab);
199
205
209 {
210 ON_ALL_IMAGES = 0,
211 ONLY_ON_IMAGES_THEY_WERE_CREATED_ON = 1,
212 ONLY_ON_IMAGES_THEY_WERE_NOT_CREATED_ON = 2,
213 ONLY_ON_IMAGES_THEY_CAN_BE_TRANSFORMED_TO = 3
214 };
215
219
221 bool isSelectionAllowedWithDefaultRenderer() const { return allowSelectionWithDefaultRenderer.getValue(); }
222
226
230
232 void cancel();
233
234protected:
235
238
240 void startDrawing(View2DSliceList* slicelist) override;
241
243 void draw(View2DSliceList* slicelist, View2DSlice* slice, int sliceZ) override;
244
245 bool evalEvent(SoView2D* view2d, View2DSliceList* slicelist, View2DEvent* ec, View2DEventPhase phase) override;
246
247 void notifyEditorsOfMouseWheelEvent(SoMouseWheelEvent::Orientation orientation, int turn, View2DEvent* ec);
248
250 static void csoListNotificationCB(void* userData, int notificationFlag);
251
253 void editingOnChanged(SoField*) override;
254 void buttonMaskChanged(SoField*) override;
255
262
264 void doAction(SoAction *action) override;
266 std::vector<SoCSOTransform*> _csoTransforms;
267
268private:
271
272 ml::CSOVisualizationSettings _dummyVisualizationSettings;
273 SoRef<SoCSODefaultRenderer> _defaultRenderer;
274
275 bool _activeCreatorEditorDirty;
276
277 void _inCSOListCB(SoField*);
278
279 SbVec3f _currentPointerWorldPosition;
280 SbVec3f _startPointerWorldPosition;
281 int _currentTimePointIndex;
282
283 void storeCopiedCSOGroupInformation();
284
285 void setActiveEditor(const ExtensionList& extensions);
286 void setActionsEnabled();
287 void setKeyboardActionsEnabled();
288 void setTriggerFieldsToActions();
289
290 void toggleCancelCommandIsActive();
291 void togglePasteCommandIsActive();
292 void toggleCutCopyCommandIsActive();
293 void toggleUndoCommandIsActive();
294 void toggleRedoCommandIsActive();
295 void toggleDeleteCSOCommandIsActive();
296 void toggleDeleteSeedPointCommandIsActive();
297 void toggleRemoveAllCommandIsActive();
298
299 bool areKeyboardCommandsActive() { return isEditingOn() && keyCommandsEnabled.getValue(); }
300
301 bool isInteracting();
302
303 void copySelectedCSOs();
304
305 void copySelectedCSOsToInternalList(ml::CSOList* csoList);
306 void cutSelectedCSOs();
307 void pasteCSOs();
308
309 void deleteSelectedCSOs();
310 void deleteSelectedSeedPoint();
311
312 void undo();
313 void redo();
314
315 void removeAllCSOsAndGroups();
316
317 SbVec3f getMidPointSelectedCSOs();
318
319 void getNonActiveEditorExtensionIds(std::vector <std::string>& nonActiveEditorExtensions);
320
321 // Returns whether the given CSO should be rendered.
322 bool shouldRenderCSO(ml::CSO* cso, const CSODrawView2DInfos& view2DInfos, const CSODrawSliceInformation& sliceInfo);
323
324 void resetCreatingAndEditingFields();
325 void resetAllExtensionCaches();
326 void resetAllEditorsAndCaches();
327
328 SoCSOEditorExtension* getExtensionForCSO(ml::CSO* cso);
329 bool doesCSOTimePointMatchCurrentTimePoint(const CSODrawView2DInfos& view2DInfos, ml::CSO* cso);
330
331 ml::TransformationProvider* _transformationProvider;
332
333 // this is the editor active for creating new CSOs
334 SoRef<SoCSOEditorExtension> _activeEditor;
335 SoRef<SoCSOEditorExtension> _lastActiveEditor;
336
337 CSOLabelResizeAction* _labelResizeAction;
338 CSOLabelMoveAction* _labelMoveAction;
339 CSOTransformAction* _transformAction;
340 CSOInsertSeedPointIntoPathPointListAction* _insertSeedPointAction;
341 CSOSelectAndMoveAction* _selectAndMoveAction;
342 CSOCreateAction* _createAction;
343 CSOBulgeAction* _bulgeAction;
344
345 int _interactionMode;
346
347 CSOCopyCommandAction* _copyCommandAction;
348 CSOCutCommandAction* _cutCommandAction;
349 CSOPasteCommandAction* _pasteCommandAction;
350
351 CSODeleteSeedPointCommandAction* _deleteSeedPointCommandAction;
352 CSODeleteCSOCommandAction* _deleteCSOCommandAction;
353
354 CSOUndoCommandAction* _undoCommandAction;
355 CSORedoCommandAction* _redoCommandAction;
356
357 CSOCancelCommandAction* _cancelCommandAction;
358
359 CSORemoveAllCommandAction* _removeAllCommandAction;
360
361 std::vector < ml::CSO* > _copiedCSOs;
362 std::map < int, std::vector< int > > _copiedCSOGroupIds;
363
364
365 unsigned int _prevWheelCode;
366 int _sumWheel;
367
368 friend bool SoCSOEditorTools::evaluateHitPoint(const ml::Vector3& worldPosition, View2DSliceList* slicelist, ml::CSOList* csoList,
369 const ml::CSOBoundingBox& slabBB, const std::string& subType, SoView2DCSOExtensibleEditor* editor,
370 bool testSeedPoints,
372 ml::CSOPathPoints*& localHitPathPoints, float& distance);
373
374 // Stores a list of voxel slabs for a given cso list
375 // for given world matrix and cso change id.
376 struct SlabCacheEntry
377 {
378 SlabCacheEntry()
379 {
380 csoList = nullptr;
381 csoListGeometryChangeId = 0;
382 }
383 void clear()
384 {
385 csoList = nullptr;
386 csoListGeometryChangeId = 0;
387 csoSlabs.clear();
388 }
389
390 void* csoList;
391 MLuint64 csoListGeometryChangeId;
392 ml::Matrix4 worldToVoxelMatrix;
393 std::vector<CSOVoxelSlab> csoSlabs;
394 };
395
396 // Stores N cache entries.
397 std::deque<SlabCacheEntry*> _csoSlabCache;
398
399 const SlabCacheEntry& findOrCreateSlabCache(const ml::Matrix4& worldToVoxelMatrix, size_t matrixHashKey, ml::CSOList* list);
400
401
402 void notifyCSOListObservers(ml::CSOList* csoList);
403
404 // make the keyboard commands friends so they
405 // can access private/protected methods.
409
412
415
417
418 SO_NODE_HEADER(SoView2DCSOExtensibleEditor);
419};
420
#define SOCSO_EXPORT
Header file for system independent resolution.
Definition SoCSOSystem.h:21
std::vector< SoRef< SoCSOEditorExtension > > ExtensionList
Extensible editor for CSOs.
View2DEventPhase
event phase for simple extensions that grab the focus, do something (motion) and are released afterwa...
Action for creating CSOs.
Class ManagedMouseButtonTrigger encapsulates the combination of required and ignored mouse buttons an...
Extension for rendering CSOs.
Base class for an editor extension for the SoView2DCSOExtensibleEditor.
Abstract Open Inventor base class for uniform shader parameter nodes.
void pointerPosition(SoState *state, const SoPointerPosition &pos) override
Same as below, with additional SoState argument. By default, simply calls the below version.
virtual void pointerLeftWindow()
This is called when the mouse cursor leaves the window.
SoPointerPosition manages the current position of the mouse cursor.
The SoSFMLBase field is the interface used by Inventor nodes to output ML Base objects to the outside...
Definition SoSFMLBase.h:45
void inTransformationProviderChanged(SoField *)
ml::CSOVisualizationSettings * getVisualizationSettings()
Returns the pointer to a optionally attached CSOVisualizationSettings object.
void transformCSO(ml::CSO *cso, const ml::AbstractTransformationPtr &transformation)
Transforms the given CSO on base of registration information.
void draw(View2DSliceList *slicelist, View2DSlice *slice, int sliceZ) override
Renders by calling the draw-method of all attached extensions.
ml::CoordinateSystemReference getCoordinateSystemReference(const CSODrawView2DInfos &view2DInfos)
bool shouldShowCSOForCurrentTimePoint(const CSODrawView2DInfos &view2DInfos, ml::CSO *cso)
Returns whether the given CSO should be rendered for the current time point.
ml::AbstractTransformationPtr getRegistrationInformation(const SoPointerPosition &pos, ml::CSO *cso)
Returns a registration if it exists for the given CSO on the given image (as a SoPointerPosition),...
bool hasRegistrationInformation(const SoPointerPosition &pos, ml::CSO *cso)
Returns whether a registration exists.
SoSFBool isCreatingNewCSO
Flag shows whether any editor is currently creating a new CSO.
ml::CSOList * getInputCSOList()
Returns a pointer to the input CSOList or NULL if nothing valid is attached.
SoSFBool renderLeftOverCSOsWithDefaultRenderer
Shall the CSOs that were not rendered by an attached editor be rendered by a default renderer?
SoSFString creatorExtensionId
The unique id of an editor extension that receives the create events.
SoSFBool alwaysModifyExistingCSOs
Shall always be selected and modified and never created?
SoCSODefaultRenderer * getDefaultRenderer()
Returns the default renderer.
int getInteractionModifier() const
Returns the interaction mode as determined by a pointing action.
void toggleCancelCommandIsActiveForModifications(bool isActive)
Toggles the activation of the cancel command without any additional checks; to be used with care and ...
void isCreatingOrEditingChanged(SoField *)
bool shouldShowCSORegardingParallelState(const CSODrawSliceInformation &sliceInfo, const CSODrawView2DInfos &view2DInfos, ml::CSO *cso)
Returns whether the given CSO should be rendered regarding its parallel state.
SoCSOEditorExtension * getActiveEditor() const
Returns the attached editor that is active for creating new CSOs (or NULL if there is not any).
bool shouldShowCSOBeyondSlice(const CSODrawSliceInformation &sliceInfo, const CSODrawView2DInfos &view2DInfos, ml::CSO *cso)
Returns whether the given CSO should be rendered beyond the current slice.
SoSFBool accumulateTransformations
Flag to decide whether CSOTransform modules in the secene graph should be accumulated (or the last on...
SoSFBool keyCommandsEnabled
Shall the key commands be enabled?
void resetLastActiveEditor()
Resets the active editor to the last active editor if it was set.
void startDrawing(View2DSliceList *slicelist) override
Is called before drawing to initialize editors.
SoSFBool enableRemoveAll
Shall the removeAll-key command be available?
void setInteractionModifier(int mode)
Sets the interaction mode as determined by a pointing action.
void pointerPosition(const SoPointerPosition &pos) override
Is called on moving the mouse, sets the CSO id under the cursor.
SoSFBool interactOnlyWithSelectedCSO
Shall only a selected CSO be allow to be interacted with?
void notifyEditorsOfMouseWheelEvent(SoMouseWheelEvent::Orientation orientation, int turn, View2DEvent *ec)
bool isSelectionAllowedWithDefaultRenderer() const
Returns whether a CSO can be selected by the internal default renderer.
static void csoListNotificationCB(void *userData, int notificationFlag)
Is called by CSOList notifications.
SoSFNode inExtensions
Input field for extensions.
void setActiveEditor(SoCSOEditorExtension *editor, bool storeLastEditor=true)
Sets the active editor, use this only to temporarily set a modification editor.
SoSFBool isEditingExistingCSO
Flag shows whether any editor is currently editing/modifying an existing CSO.
SoSFMLBase inCSOList
Input field for CSOList.
SoSFEnum renderCSOsOnImagesDependingOnCreationMode
Defines on which images the CSOs should be rendered on, depending on where they have been created.
ml::CoordinateSystemReference getCoordinateSystemReference(ml::CSO *cso)
bool shouldShowCSOOnImageWithId(const CSODrawView2DInfos &view2DInfos, ml::CSO *cso)
Returns whether the given CSO should be rendered on a particular image, identified by its DICOM Serie...
void cancel()
Cancels the current interaction.
bool hasTransformationProvider() const
Returns if the editor has a transformation provider.
SoSFBool updateImageStatisticsOnFinishInteraction
Should the image statistics be updated for the currently active CSO on finishing an interaction (mous...
SoSFInt32 csoIdUnderMouseCursor
The id of the CSO currently under the mouse (or -1 if no CSO is under the mouse).
void buttonMaskChanged(SoField *) override
called when one of the button/modifier fields is touched:
void setCSOUnderTheMouseId(int id)
Sets the csoUnderTheMouseId field, only if the id changes.
void fillCSOSliceInformation(const CSODrawCSOInfos &csoInfos, const CSODrawView2DInfos &view2DInfos, CSODrawSliceInformation &sliceInfo, const ml::Matrix4 &worldToVoxelMatrix, const CSOVoxelSlab &csoSlab)
Fills the relation of the given CSO to the current slice.
SoView2DCSOExtensibleEditor()
Constructor.
ml::CoordinateSystemReference getCoordinateSystemReference(SoView2D *viewer)
bool isSameImage(const ml::CoordinateSystemReference &from, const ml::CoordinateSystemReference &to)
Returns whether the given coordinate references reference the same image.
void interactOnlyWithSelectedCSOChanged(SoField *)
SoSFBool allowSelectionWithDefaultRenderer
Shall the CSOs be selectable by the internal default renderer?
SoSFBool updateCSOIdUnderMouseCursor
Shall the cso id under the mouse cursor be updated?
void doAction(SoAction *action) override
Overloading to obtain and set the SoCSOTransform.
bool evalEvent(SoView2D *view2d, View2DSliceList *slicelist, View2DEvent *ec, View2DEventPhase phase) override
Called by the SoView2D for each event that happens on the viewer.
bool shouldShowCSOAtAll(ml::CSO *cso)
Returns whether the given CSO should be rendered at all, that is whether its shows state is true and ...
std::vector< SoCSOTransform * > _csoTransforms
Global transformation for visualization.
ml::CoordinateSystemReference getCoordinateSystemReference(const SoPointerPosition &pos)
bool shouldShowCSOOnViewerWithId(const CSODrawView2DInfos &view2DInfos, ml::CSO *cso)
Return whether the given CSO should be rendered on a particular viewer, identified by its viewerId.
void stopEditingCSO()
Sets the isEditingExistingCSO field to FALSE.
void cancelGenerationChanged(SoField *)
void setCreateActionTrigger(const SoPointingAction::Trigger &trigger)
Sets the CSOCreateAction trigger.
SoSFBool alwaysCreateNewCSOs
Shall always be created and never selected and modified?
void getExtensions(ExtensionList &extensions)
Collects attached extensions to the given list.
void extensionChanged(SoField *)
New field change callbacks:
CSORenderOnImagesDependingOnCreationModes
Modes to control the rendering of CSOs depending on the images they were created on.
std::string getDefaultCreatorString() const
Returns a default creator id string that indicates that the first found editor should create CSOs.
void setCreateActionTriggerToDefault()
Sets the CSOCreateAction trigger to its default, according to the trigger fields.
SoSFMLBase inVisualizationSettings
Input of visualization settings.
void startEditingCSO(const SoPointerPosition &pos, ml::CSO *cso)
Sets the isEditingExistingCSO field to TRUE and stores the current viewer's name in the CSO's userDat...
void pointerLeftWindow() override
Is called when mouse pointer leaves the window.
void editingOnChanged(SoField *) override
Inherited from SoView2DExtension:
SoSFMLBase inTransformationProvider
Input of provided transformations.
static void initClass()
Initialization of inventor stuff.
SoSFTrigger cancelGeneration
Triggers the cancellation of the current generation.
ml::AbstractTransformationPtr getTransformation(const ml::CoordinateSystemReference &from, const ml::CoordinateSystemReference &to)
Returns a transformation if existing, NULL otherwise.
~SoView2DCSOExtensibleEditor() override
Destructor.
SoView2DExtension Base class for all View2DExtensions used for drawing and event handling on the View...
virtual bool isEditingOn()
check if editing is on
SoView2D is a 2D viewer for image data.
Definition SoView2D.h:62
View2DEvent stores all information on an event on a SoView2D.
a list that holds all View2DSlice objects (lazily created) of a SoView2D
a single slice that is stored in a View2DSliceList, typically created by a View2DSliceList
Definition View2DSlice.h:48
The CSOBoundingBox defines an axis parallel bounding box with double precision.
A CSOList comprises a number of CSOs and CSOGroups and is the central object for contour segmentation...
Definition CSOList.h:61
The CSOPathPoints is a list of world coordinates which are interpolated by a certain interpolation sc...
The CSOSeedPoint can be interactively set and modified and is the framework for contours.
The CSO represents a contour segmentation object.
Definition CSO.h:44
Target mlrange_cast(Source arg)
Generic version of checked ML casts.
UINT64 MLuint64
Introduce platform-independent 64-bit unsigned integer type.
Definition mlTypeDefs.h:425
SOCSO_EXPORT bool evaluateHitPoint(const ml::Vector3 &worldPosition, View2DSliceList *slicelist, ml::CSOList *csoList, const ml::CSOBoundingBox &slabBB, const std::string &subType, SoView2DCSOExtensibleEditor *editor, bool testSeedPoints, ml::CSO *&localHitCSO, ml::CSOSeedPoint *&localHitSeedPoint, ml::CSOPathPoints *&localHitPathPoints, float &distanceToCSO)
Returns whether a CSO was hit and fills the according structures. If subType is an empty string,...
Defines the z slab of a CSO bounding box in voxel coordinates.