Mercurial > hg > orthanc-stone
comparison Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 2001:e943a84da9ac
creation of text annotations
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 02 Nov 2022 14:56:35 +0100 |
parents | 1fa3f484008e |
children | 963f28eb40cb c818be7cb940 |
comparison
equal
deleted
inserted
replaced
2000:3e9ced39cd1b | 2001:e943a84da9ac |
---|---|
1595 size_t frame) = 0; | 1595 size_t frame) = 0; |
1596 | 1596 |
1597 virtual void SignalStoneAnnotationAdded(const ViewerViewport& viewport) = 0; | 1597 virtual void SignalStoneAnnotationAdded(const ViewerViewport& viewport) = 0; |
1598 | 1598 |
1599 virtual void SignalStoneAnnotationRemoved(const ViewerViewport& viewport) = 0; | 1599 virtual void SignalStoneAnnotationRemoved(const ViewerViewport& viewport) = 0; |
1600 | |
1601 virtual void SignalStoneTextAnnotationRequired(const ViewerViewport& viewport, | |
1602 const OrthancStone::ScenePoint2D& pointedPosition, | |
1603 const OrthancStone::ScenePoint2D& labelPosition) = 0; | |
1600 }; | 1604 }; |
1601 | 1605 |
1602 private: | 1606 private: |
1603 static const int LAYER_TEXTURE = 0; | 1607 static const int LAYER_TEXTURE = 0; |
1604 static const int LAYER_OVERLAY = 1; | 1608 static const int LAYER_OVERLAY = 1; |
2690 { | 2694 { |
2691 observer_->SignalStoneAnnotationRemoved(*this); | 2695 observer_->SignalStoneAnnotationRemoved(*this); |
2692 } | 2696 } |
2693 } | 2697 } |
2694 | 2698 |
2699 void Handle(const OrthancStone::AnnotationsSceneLayer::TextAnnotationRequiredMessage& message) | |
2700 { | |
2701 if (observer_.get() != NULL) | |
2702 { | |
2703 observer_->SignalStoneTextAnnotationRequired(*this, message.GetPointedPosition(), message.GetLabelPosition()); | |
2704 } | |
2705 } | |
2706 | |
2695 public: | 2707 public: |
2696 virtual ~ViewerViewport() | 2708 virtual ~ViewerViewport() |
2697 { | 2709 { |
2698 // Unregister the callbacks to avoid any call with a "void*" that | 2710 // Unregister the callbacks to avoid any call with a "void*" that |
2699 // has been destroyed. "WebAssemblyViewport::CreateObjectCookie()" | 2711 // has been destroyed. "WebAssemblyViewport::CreateObjectCookie()" |
2729 | 2741 |
2730 viewport->Register<OrthancStone::AnnotationsSceneLayer::AnnotationAddedMessage>( | 2742 viewport->Register<OrthancStone::AnnotationsSceneLayer::AnnotationAddedMessage>( |
2731 *viewport->stoneAnnotations_, &ViewerViewport::Handle); | 2743 *viewport->stoneAnnotations_, &ViewerViewport::Handle); |
2732 | 2744 |
2733 viewport->Register<OrthancStone::AnnotationsSceneLayer::AnnotationRemovedMessage>( | 2745 viewport->Register<OrthancStone::AnnotationsSceneLayer::AnnotationRemovedMessage>( |
2746 *viewport->stoneAnnotations_, &ViewerViewport::Handle); | |
2747 | |
2748 viewport->Register<OrthancStone::AnnotationsSceneLayer::TextAnnotationRequiredMessage>( | |
2734 *viewport->stoneAnnotations_, &ViewerViewport::Handle); | 2749 *viewport->stoneAnnotations_, &ViewerViewport::Handle); |
2735 } | 2750 } |
2736 | 2751 |
2737 { | 2752 { |
2738 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->viewport_->Lock()); | 2753 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->viewport_->Lock()); |
3432 if (linearInterpolation_ != linearInterpolation) | 3447 if (linearInterpolation_ != linearInterpolation) |
3433 { | 3448 { |
3434 linearInterpolation_ = linearInterpolation; | 3449 linearInterpolation_ = linearInterpolation; |
3435 Redraw(); | 3450 Redraw(); |
3436 } | 3451 } |
3452 } | |
3453 | |
3454 void AddTextAnnotation(const std::string& label, | |
3455 const OrthancStone::ScenePoint2D& pointedPosition, | |
3456 const OrthancStone::ScenePoint2D& labelPosition) | |
3457 { | |
3458 stoneAnnotations_->AddTextAnnotation(label, pointedPosition, labelPosition); | |
3459 Redraw(); | |
3437 } | 3460 } |
3438 }; | 3461 }; |
3439 | 3462 |
3440 | 3463 |
3441 | 3464 |
3693 { "canvasId" : UTF8ToString($0) }); | 3716 { "canvasId" : UTF8ToString($0) }); |
3694 window.dispatchEvent(customEvent); | 3717 window.dispatchEvent(customEvent); |
3695 }, | 3718 }, |
3696 viewport.GetCanvasId().c_str()); | 3719 viewport.GetCanvasId().c_str()); |
3697 } | 3720 } |
3721 | |
3722 virtual void SignalStoneTextAnnotationRequired(const ViewerViewport& viewport, | |
3723 const OrthancStone::ScenePoint2D& pointedPosition, | |
3724 const OrthancStone::ScenePoint2D& labelPosition) ORTHANC_OVERRIDE | |
3725 { | |
3726 EM_ASM({ | |
3727 const customEvent = document.createEvent("CustomEvent"); | |
3728 customEvent.initCustomEvent("TextAnnotationRequired", false, false, | |
3729 { "canvasId" : UTF8ToString($0), | |
3730 "pointedX" : $1, | |
3731 "pointedY" : $2, | |
3732 "labelX" : $3, | |
3733 "labelY" : $4 }); | |
3734 window.dispatchEvent(customEvent); | |
3735 }, | |
3736 viewport.GetCanvasId().c_str(), | |
3737 pointedPosition.GetX(), | |
3738 pointedPosition.GetY(), | |
3739 labelPosition.GetX(), | |
3740 labelPosition.GetY() ); | |
3741 } | |
3698 }; | 3742 }; |
3699 | 3743 |
3700 | 3744 |
3701 | 3745 |
3702 static OrthancStone::DicomSource source_; | 3746 static OrthancStone::DicomSource source_; |
4495 } | 4539 } |
4496 } | 4540 } |
4497 EXTERN_CATCH_EXCEPTIONS; | 4541 EXTERN_CATCH_EXCEPTIONS; |
4498 return false; | 4542 return false; |
4499 } | 4543 } |
4544 | |
4545 | |
4546 EMSCRIPTEN_KEEPALIVE | |
4547 void AddTextAnnotation(const char* canvas, | |
4548 const char* label, | |
4549 double pointedX, | |
4550 double pointedY, | |
4551 double labelX, | |
4552 double labelY) | |
4553 { | |
4554 try | |
4555 { | |
4556 GetViewport(canvas)->AddTextAnnotation(label, OrthancStone::ScenePoint2D(pointedX, pointedY), | |
4557 OrthancStone::ScenePoint2D(labelX, labelY)); | |
4558 } | |
4559 EXTERN_CATCH_EXCEPTIONS; | |
4560 } | |
4500 } | 4561 } |