Mercurial > hg > orthanc-stone
comparison Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1648:4a43106bc122
cross-hair starts to work
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 12 Nov 2020 19:27:08 +0100 |
parents | adff3cd78775 |
children | d77618883551 |
comparison
equal
deleted
inserted
replaced
1647:adff3cd78775 | 1648:4a43106bc122 |
---|---|
899 | 899 |
900 virtual void SignalFrameUpdated(const ViewerViewport& viewport, | 900 virtual void SignalFrameUpdated(const ViewerViewport& viewport, |
901 size_t currentFrame, | 901 size_t currentFrame, |
902 size_t countFrames, | 902 size_t countFrames, |
903 DisplayedFrameQuality quality) = 0; | 903 DisplayedFrameQuality quality) = 0; |
904 | |
905 virtual void SignalCrosshair(const OrthancStone::Vector& click) = 0; | |
904 }; | 906 }; |
905 | 907 |
906 private: | 908 private: |
907 static const int LAYER_TEXTURE = 0; | 909 static const int LAYER_TEXTURE = 0; |
908 static const int LAYER_REFERENCE_LINES = 1; | 910 static const int LAYER_REFERENCE_LINES = 1; |
1961 | 1963 |
1962 | 1964 |
1963 class Interactor : public OrthancStone::DefaultViewportInteractor | 1965 class Interactor : public OrthancStone::DefaultViewportInteractor |
1964 { | 1966 { |
1965 private: | 1967 private: |
1966 WebViewerAction leftAction_; | 1968 ViewerViewport& viewer_; |
1967 WebViewerAction middleAction_; | 1969 WebViewerAction leftAction_; |
1968 WebViewerAction rightAction_; | 1970 WebViewerAction middleAction_; |
1971 WebViewerAction rightAction_; | |
1969 | 1972 |
1970 bool IsAction(const OrthancStone::PointerEvent& event, | 1973 bool IsAction(const OrthancStone::PointerEvent& event, |
1971 WebViewerAction action) | 1974 WebViewerAction action) |
1972 { | 1975 { |
1973 switch (event.GetMouseButton()) | 1976 switch (event.GetMouseButton()) |
1985 return false; | 1988 return false; |
1986 } | 1989 } |
1987 } | 1990 } |
1988 | 1991 |
1989 public: | 1992 public: |
1990 Interactor(WebViewerAction leftAction, | 1993 Interactor(ViewerViewport& viewer, |
1994 WebViewerAction leftAction, | |
1991 WebViewerAction middleAction, | 1995 WebViewerAction middleAction, |
1992 WebViewerAction rightAction) : | 1996 WebViewerAction rightAction) : |
1997 viewer_(viewer), | |
1993 leftAction_(leftAction), | 1998 leftAction_(leftAction), |
1994 middleAction_(middleAction), | 1999 middleAction_(middleAction), |
1995 rightAction_(rightAction) | 2000 rightAction_(rightAction) |
1996 { | 2001 { |
1997 SetLeftButtonAction(ConvertWebViewerAction(leftAction)); | 2002 SetLeftButtonAction(ConvertWebViewerAction(leftAction)); |
2003 boost::weak_ptr<OrthancStone::IViewport> viewport, | 2008 boost::weak_ptr<OrthancStone::IViewport> viewport, |
2004 const OrthancStone::PointerEvent& event, | 2009 const OrthancStone::PointerEvent& event, |
2005 unsigned int viewportWidth, | 2010 unsigned int viewportWidth, |
2006 unsigned int viewportHeight) ORTHANC_OVERRIDE | 2011 unsigned int viewportHeight) ORTHANC_OVERRIDE |
2007 { | 2012 { |
2008 if (IsAction(event, WebViewerAction_Crosshair)) | 2013 boost::shared_ptr<OrthancStone::IViewport> lock1(viewport.lock()); |
2009 { | 2014 |
2010 printf("CROSS-HAIR!\n"); | 2015 if (lock1 && |
2016 IsAction(event, WebViewerAction_Crosshair)) | |
2017 { | |
2018 OrthancStone::CoordinateSystem3D plane; | |
2019 if (viewer_.GetCurrentPlane(plane)) | |
2020 { | |
2021 std::unique_ptr<OrthancStone::IViewport::ILock> lock2(lock1->Lock()); | |
2022 | |
2023 const OrthancStone::ScenePoint2D p = event.GetMainPosition(); | |
2024 double x = p.GetX(); | |
2025 double y = p.GetY(); | |
2026 lock2->GetController().GetCanvasToSceneTransform().Apply(x, y); | |
2027 | |
2028 OrthancStone::Vector click = plane.MapSliceToWorldCoordinates(x, y); | |
2029 if (viewer_.observer_.get() != NULL) | |
2030 { | |
2031 viewer_.observer_->SignalCrosshair(click); | |
2032 } | |
2033 } | |
2034 | |
2011 return NULL; // No need for a tracker, this is just a click | 2035 return NULL; // No need for a tracker, this is just a click |
2012 } | 2036 } |
2013 else | 2037 else |
2014 { | 2038 { |
2015 return DefaultViewportInteractor::CreateTracker( | 2039 return DefaultViewportInteractor::CreateTracker( |
2022 void SetMouseButtonActions(WebViewerAction leftAction, | 2046 void SetMouseButtonActions(WebViewerAction leftAction, |
2023 WebViewerAction middleAction, | 2047 WebViewerAction middleAction, |
2024 WebViewerAction rightAction) | 2048 WebViewerAction rightAction) |
2025 { | 2049 { |
2026 assert(viewport_ != NULL); | 2050 assert(viewport_ != NULL); |
2027 viewport_->AcquireInteractor(new Interactor(leftAction, middleAction, rightAction)); | 2051 viewport_->AcquireInteractor(new Interactor(*this, leftAction, middleAction, rightAction)); |
2028 } | 2052 } |
2029 | 2053 |
2030 void FitForPrint() | 2054 void FitForPrint() |
2031 { | 2055 { |
2032 viewport_->FitForPrint(); | 2056 viewport_->FitForPrint(); |
2063 cursor_->SetCurrentIndex(frameIndex); | 2087 cursor_->SetCurrentIndex(frameIndex); |
2064 DisplayCurrentFrame(); | 2088 DisplayCurrentFrame(); |
2065 } | 2089 } |
2066 | 2090 |
2067 hasFocusOnInstance_ = false; | 2091 hasFocusOnInstance_ = false; |
2092 } | |
2093 } | |
2094 | |
2095 void FocusOnPoint(const OrthancStone::Vector& p) | |
2096 { | |
2097 static const double MAX_DISTANCE = 0.5; // 0.5 cm => TODO parameter? | |
2098 | |
2099 OrthancStone::LinearAlgebra::Print(p); | |
2100 size_t frameIndex; | |
2101 if (cursor_.get() != NULL && | |
2102 frames_.get() != NULL && | |
2103 frames_->FindClosestFrame(frameIndex, p, MAX_DISTANCE)) | |
2104 { | |
2105 cursor_->SetCurrentIndex(frameIndex); | |
2106 DisplayCurrentFrame(); | |
2107 } | |
2108 else | |
2109 { | |
2110 printf("nope\n"); | |
2068 } | 2111 } |
2069 } | 2112 } |
2070 }; | 2113 }; |
2071 | 2114 |
2072 | 2115 |
2170 static_cast<int>(countFrames), | 2213 static_cast<int>(countFrames), |
2171 quality); | 2214 quality); |
2172 | 2215 |
2173 | 2216 |
2174 UpdateReferenceLines(); | 2217 UpdateReferenceLines(); |
2175 }; | 2218 } |
2219 | |
2220 virtual void SignalCrosshair(const OrthancStone::Vector& click) ORTHANC_OVERRIDE | |
2221 { | |
2222 for (Viewports::const_iterator it = allViewports_.begin(); it != allViewports_.end(); ++it) | |
2223 { | |
2224 assert(it->second != NULL); | |
2225 it->second->FocusOnPoint(click); | |
2226 } | |
2227 } | |
2176 }; | 2228 }; |
2177 | 2229 |
2178 | 2230 |
2179 | 2231 |
2180 static OrthancStone::DicomSource source_; | 2232 static OrthancStone::DicomSource source_; |