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_;