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 }