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 
27 typedef std::vector<SoRef<SoCSOEditorExtension> > ExtensionList;
28 
29 ML_START_NAMESPACE
30 class CSO;
31 class CSOList;
32 ML_END_NAMESPACE
33 
34 class SoCSOTransform;
35 
36 
37 class CSOCreateAction;
38 class CSOBulgeAction;
40 class CSOLabelMoveAction;
42 class CSOTransformAction;
44 
48 
51 
54 
56 
58 
59 ML_START_NAMESPACE
60 class CSOVisualizationSettings;
61 ML_END_NAMESPACE
62 
64 {
69 };
70 
72 
74 {
75 public:
76 
80  static void initClass();
81 
85  SoSFNode inExtensions;
92  SoSFString creatorExtensionId;
102  SoSFBool enableRemoveAll;
122  SoSFTrigger cancelGeneration;
126 
128  void getExtensions(ExtensionList& extensions);
133  std::string getDefaultCreatorString() const { return std::string("__default"); }
134 
136  void pointerLeftWindow() override;
138  void pointerPosition(const SoPointerPosition& pos) override;
139 
142 
147  void setActiveEditor(SoCSOEditorExtension* editor, bool storeLastEditor = true);
154  void setInteractionModifier(int mode) { _interactionMode = mode; }
156  int getInteractionModifier() const { return _interactionMode; }
157 
159  void setCSOUnderTheMouseId(int id);
160 
170  bool shouldShowCSOBeyondSlice(const CSODrawSliceInformation& sliceInfo, const CSODrawView2DInfos& view2DInfos, ml::CSO* cso);
172  bool shouldShowCSOOnImageWithId(const CSODrawView2DInfos& view2DInfos, ml::CSO* cso);
176  ml::AbstractTransformationPtr getRegistrationInformation(const SoPointerPosition& pos, ml::CSO* cso);
179  ml::CoordinateSystemReference getCoordinateSystemReference(ml::CSO* cso);
180  ml::CoordinateSystemReference getCoordinateSystemReference(SoView2D* viewer);
181  ml::CoordinateSystemReference getCoordinateSystemReference(const CSODrawView2DInfos& view2DInfos);
182  ml::CoordinateSystemReference getCoordinateSystemReference(const SoPointerPosition& pos);
185  bool hasTransformationProvider() const { return _transformationProvider != nullptr; }
187  ml::AbstractTransformationPtr getTransformation(const ml::CoordinateSystemReference& from, const ml::CoordinateSystemReference& to);
189  bool isSameImage(const ml::CoordinateSystemReference& from, const ml::CoordinateSystemReference& to);
190 
193  void transformCSO(ml::CSO* cso, const ml::AbstractTransformationPtr& transformation);
194 
196  void fillCSOSliceInformation(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, CSODrawSliceInformation& sliceInfo, const ml::Matrix4& worldToVoxelMatrix, const CSOVoxelSlab& csoSlab);
197 
200  void startEditingCSO(const SoPointerPosition& pos, ml::CSO* cso);
203 
207  {
208  ON_ALL_IMAGES = 0,
209  ONLY_ON_IMAGES_THEY_WERE_CREATED_ON = 1,
210  ONLY_ON_IMAGES_THEY_WERE_NOT_CREATED_ON = 2,
211  ONLY_ON_IMAGES_THEY_CAN_BE_TRANSFORMED_TO = 3
212  };
213 
217 
219  bool isSelectionAllowedWithDefaultRenderer() const { return allowSelectionWithDefaultRenderer.getValue(); }
220 
224 
228 
230  void cancel();
231 
232 protected:
233 
236 
238  void startDrawing(View2DSliceList* slicelist) override;
239 
241  void draw(View2DSliceList* slicelist, View2DSlice* slice, int sliceZ) override;
242 
243  bool evalEvent(SoView2D* view2d, View2DSliceList* slicelist, View2DEvent* ec, View2DEventPhase phase) override;
244 
245  void notifyEditorsOfMouseWheelEvent(SoMouseWheelEvent::Orientation orientation, int turn, View2DEvent* ec);
246 
248  static void csoListNotificationCB(void* userData, int notificationFlag);
249 
251  void editingOnChanged(SoField*) override;
252  void buttonMaskChanged(SoField*) override;
253 
255  void extensionChanged(SoField*);
258  void cancelGenerationChanged(SoField*);
260 
262  void doAction(SoAction *action) override;
264  std::vector<SoCSOTransform*> _csoTransforms;
265 
266 private:
269 
270  ml::CSOVisualizationSettings _dummyVisualizationSettings;
271  SoRef<SoCSODefaultRenderer> _defaultRenderer;
272 
273  bool _activeCreatorEditorDirty;
274 
275  void _inCSOListCB(SoField*);
276 
277  SbVec3f _currentPointerWorldPosition;
278  SbVec3f _startPointerWorldPosition;
279  int _currentTimePointIndex;
280 
281  void storeCopiedCSOGroupInformation();
282 
283  void setActiveEditor(const ExtensionList& extensions);
284  void setActionsEnabled();
285  void setKeyboardActionsEnabled();
286  void setTriggerFieldsToActions();
287 
288  void toggleCancelCommandIsActive();
289  void togglePasteCommandIsActive();
290  void toggleCutCopyCommandIsActive();
291  void toggleUndoCommandIsActive();
292  void toggleRedoCommandIsActive();
293  void toggleDeleteCSOCommandIsActive();
294  void toggleDeleteSeedPointCommandIsActive();
295  void toggleRemoveAllCommandIsActive();
296 
297  bool areKeyboardCommandsActive() { return isEditingOn() && keyCommandsEnabled.getValue(); }
298 
299  bool isInteracting();
300 
301  void copySelectedCSOs();
302 
303  void copySelectedCSOsToInternalList(ml::CSOList* csoList);
304  void cutSelectedCSOs();
305  void pasteCSOs();
306 
307  void deleteSelectedCSOs();
308  void deleteSelectedSeedPoint();
309 
310  void undo();
311  void redo();
312 
313  void removeAllCSOsAndGroups();
314 
315  SbVec3f getMidPointSelectedCSOs();
316 
317  void getNonActiveEditorExtensionIds(std::vector <std::string>& nonActiveEditorExtensions);
318 
319  // Returns whether the given CSO should be rendered.
320  bool shouldRenderCSO(ml::CSO* cso, const CSODrawView2DInfos& view2DInfos, const CSODrawSliceInformation& sliceInfo);
321 
322  void resetCreatingAndEditingFields();
323  void resetAllExtensionCaches();
324  void resetAllEditorsAndCaches();
325 
326  SoCSOEditorExtension* getExtensionForCSO(ml::CSO* cso);
327  bool doesCSOTimePointMatchCurrentTimePoint(const CSODrawView2DInfos& view2DInfos, ml::CSO* cso);
328 
329  ml::TransformationProvider* _transformationProvider;
330 
331  // this is the editor active for creating new CSOs
332  SoRef<SoCSOEditorExtension> _activeEditor;
333  SoRef<SoCSOEditorExtension> _lastActiveEditor;
334 
335  CSOLabelResizeAction* _labelResizeAction;
336  CSOLabelMoveAction* _labelMoveAction;
337  CSOTransformAction* _transformAction;
338  CSOInsertSeedPointIntoPathPointListAction* _insertSeedPointAction;
339  CSOSelectAndMoveAction* _selectAndMoveAction;
340  CSOCreateAction* _createAction;
341  CSOBulgeAction* _bulgeAction;
342 
343  int _interactionMode;
344 
345  CSOCopyCommandAction* _copyCommandAction;
346  CSOCutCommandAction* _cutCommandAction;
347  CSOPasteCommandAction* _pasteCommandAction;
348 
349  CSODeleteSeedPointCommandAction* _deleteSeedPointCommandAction;
350  CSODeleteCSOCommandAction* _deleteCSOCommandAction;
351 
352  CSOUndoCommandAction* _undoCommandAction;
353  CSORedoCommandAction* _redoCommandAction;
354 
355  CSOCancelCommandAction* _cancelCommandAction;
356 
357  CSORemoveAllCommandAction* _removeAllCommandAction;
358 
359  std::vector < ml::CSO* > _copiedCSOs;
360  std::map < int, std::vector< int > > _copiedCSOGroupIds;
361 
362 
363  unsigned int _prevWheelCode;
364  int _sumWheel;
365 
366  friend bool SoCSOEditorTools::evaluateHitPoint(const ml::Vector3& worldPosition, View2DSliceList* slicelist, ml::CSOList* csoList,
367  const ml::CSOBoundingBox& slabBB, const std::string& subType, SoView2DCSOExtensibleEditor* editor,
368  bool testSeedPoints,
369  ml::CSO*& localHitCSO, ml::CSOSeedPoint*& localHitSeedPoint,
370  ml::CSOPathPoints*& localHitPathPoints, float& distance);
371 
372  // Stores a list of voxel slabs for a given cso list
373  // for given world matrix and cso change id.
374  struct SlabCacheEntry
375  {
376  SlabCacheEntry()
377  {
378  csoList = nullptr;
379  csoListGeometryChangeId = 0;
380  }
381  void clear()
382  {
383  csoList = nullptr;
384  csoListGeometryChangeId = 0;
385  csoSlabs.clear();
386  }
387 
388  void* csoList;
389  MLuint64 csoListGeometryChangeId;
390  ml::Matrix4 worldToVoxelMatrix;
391  std::vector<CSOVoxelSlab> csoSlabs;
392  };
393 
394  // Stores N cache entries.
395  std::deque<SlabCacheEntry*> _csoSlabCache;
396 
397  const SlabCacheEntry& findOrCreateSlabCache(const ml::Matrix4& worldToVoxelMatrix, size_t matrixHashKey, ml::CSOList* list);
398 
399 
400  void notifyCSOListObservers(ml::CSOList* csoList);
401 
402  // make the keyboard commands friends so they
403  // can access private/protected methods.
404  friend class CSOCopyCommandAction;
405  friend class CSOCutCommandAction;
406  friend class CSOPasteCommandAction;
407 
410 
411  friend class CSOUndoCommandAction;
412  friend class CSORedoCommandAction;
413 
415 
416  SO_NODE_HEADER(SoView2DCSOExtensibleEditor);
417 };
418 
#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 *)
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.
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?
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.
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.
ml::CSOList * getInputCSOList()
Returns a pointer to the input CSOList or NULL if nothing valid is attached.
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 *)
SoCSOEditorExtension * getActiveEditor() const
Returns the attached editor that is active for creating new CSOs (or NULL if there is not any).
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)
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:
ml::CSOVisualizationSettings * getVisualizationSettings()
Returns the pointer to a optionally attached CSOVisualizationSettings object.
SoSFMLBase inTransformationProvider
Input of provided transformations.
static void initClass()
Initialization of inventor stuff.
SoSFTrigger cancelGeneration
Triggers the cancellation of the current generation.
SoCSODefaultRenderer * getDefaultRenderer()
Returns the default renderer.
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...
Definition: CSOPathPoints.h:37
The CSOSeedPoint can be interactively set and modified and is the framework for contours.
Definition: CSOSeedPoint.h:35
The CSO represents a contour segmentation object.
Definition: CSO.h:44
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.
Definition: SoCSODefines.h:123