Mercurial > hg > orthanc-stone
comparison Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp @ 1797:013dec434a84
creation of segment or circle measures
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 20 May 2021 10:35:25 +0200 |
parents | 20a0aba0ede5 |
children | 41f3872bd7d2 |
comparison
equal
deleted
inserted
replaced
1796:20a0aba0ede5 | 1797:013dec434a84 |
---|---|
169 | 169 |
170 public: | 170 public: |
171 Measure(AnnotationsOverlay& that) : | 171 Measure(AnnotationsOverlay& that) : |
172 that_(that) | 172 that_(that) |
173 { | 173 { |
174 that.AddMeasure(this); | |
174 } | 175 } |
175 | 176 |
176 virtual ~Measure() | 177 virtual ~Measure() |
177 { | 178 { |
178 for (Primitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | 179 for (Primitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) |
179 { | 180 { |
180 assert(*it != NULL); | 181 that_.DeletePrimitive(*it); |
181 assert(that_.primitives_.find(*it) != that_.primitives_.end()); | |
182 that_.primitives_.erase(*it); | |
183 delete *it; | |
184 } | 182 } |
185 } | 183 } |
186 | 184 |
187 Primitive* AddPrimitive(Primitive* primitive) | 185 Primitive* AddPrimitive(Primitive* primitive) |
188 { | 186 { |
610 | 608 |
611 | 609 |
612 class Text : public Primitive | 610 class Text : public Primitive |
613 { | 611 { |
614 private: | 612 private: |
613 AnnotationsOverlay& that_; | |
615 bool first_; | 614 bool first_; |
616 size_t sublayer_; | 615 size_t subLayer_; |
617 std::unique_ptr<TextSceneLayer> content_; | 616 std::unique_ptr<TextSceneLayer> content_; |
618 | 617 |
619 public: | 618 public: |
620 Text(Measure& parentMeasure) : | 619 Text(AnnotationsOverlay& that, |
620 Measure& parentMeasure) : | |
621 Primitive(parentMeasure, 2), | 621 Primitive(parentMeasure, 2), |
622 that_(that), | |
622 first_(true) | 623 first_(true) |
623 { | 624 { |
625 } | |
626 | |
627 virtual ~Text() | |
628 { | |
629 if (content_.get() != NULL) | |
630 { | |
631 that_.TagSubLayerToRemove(subLayer_); | |
632 } | |
624 } | 633 } |
625 | 634 |
626 void SetContent(const TextSceneLayer& content) | 635 void SetContent(const TextSceneLayer& content) |
627 { | 636 { |
628 SetModified(true); | 637 SetModified(true); |
649 | 658 |
650 layer->SetColor(IsHover() ? GetHoverColor() : GetColor()); | 659 layer->SetColor(IsHover() ? GetHoverColor() : GetColor()); |
651 | 660 |
652 if (first_) | 661 if (first_) |
653 { | 662 { |
654 sublayer_ = macro.AddLayer(layer.release()); | 663 subLayer_ = macro.AddLayer(layer.release()); |
655 first_ = false; | 664 first_ = false; |
656 } | 665 } |
657 else | 666 else |
658 { | 667 { |
659 macro.UpdateLayer(sublayer_, layer.release()); | 668 macro.UpdateLayer(subLayer_, layer.release()); |
660 } | 669 } |
661 } | 670 } |
662 } | 671 } |
663 | 672 |
664 virtual void MovePreview(const ScenePoint2D& delta) ORTHANC_OVERRIDE | 673 virtual void MovePreview(const ScenePoint2D& delta) ORTHANC_OVERRIDE |
764 const ScenePoint2D& p2) : | 773 const ScenePoint2D& p2) : |
765 Measure(that), | 774 Measure(that), |
766 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), | 775 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), |
767 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), | 776 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), |
768 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), | 777 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), |
769 label_(AddTypedPrimitive<Text>(new Text(*this))) | 778 label_(AddTypedPrimitive<Text>(new Text(that, *this))) |
770 { | 779 { |
771 label_.SetColor(Color(255, 0, 0)); | 780 label_.SetColor(Color(255, 0, 0)); |
772 UpdateLabel(); | 781 UpdateLabel(); |
782 } | |
783 | |
784 Handle& GetHandle2() const | |
785 { | |
786 return handle2_; | |
773 } | 787 } |
774 | 788 |
775 virtual void SignalMove(Primitive& primitive) ORTHANC_OVERRIDE | 789 virtual void SignalMove(Primitive& primitive) ORTHANC_OVERRIDE |
776 { | 790 { |
777 if (&primitive == &handle1_ || | 791 if (&primitive == &handle1_ || |
841 middleHandle_(AddTypedPrimitive<Handle>(new Handle(*this, middle))), | 855 middleHandle_(AddTypedPrimitive<Handle>(new Handle(*this, middle))), |
842 endHandle_(AddTypedPrimitive<Handle>(new Handle(*this, end))), | 856 endHandle_(AddTypedPrimitive<Handle>(new Handle(*this, end))), |
843 segment1_(AddTypedPrimitive<Segment>(new Segment(*this, start, middle))), | 857 segment1_(AddTypedPrimitive<Segment>(new Segment(*this, start, middle))), |
844 segment2_(AddTypedPrimitive<Segment>(new Segment(*this, middle, end))), | 858 segment2_(AddTypedPrimitive<Segment>(new Segment(*this, middle, end))), |
845 arc_(AddTypedPrimitive<Arc>(new Arc(*this, start, middle, end))), | 859 arc_(AddTypedPrimitive<Arc>(new Arc(*this, start, middle, end))), |
846 label_(AddTypedPrimitive<Text>(new Text(*this))) | 860 label_(AddTypedPrimitive<Text>(new Text(that, *this))) |
847 { | 861 { |
848 label_.SetColor(Color(255, 0, 0)); | 862 label_.SetColor(Color(255, 0, 0)); |
849 UpdateLabel(); | 863 UpdateLabel(); |
850 } | 864 } |
851 | 865 |
943 Measure(that), | 957 Measure(that), |
944 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), | 958 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), |
945 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), | 959 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), |
946 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), | 960 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), |
947 circle_(AddTypedPrimitive<Circle>(new Circle(*this, p1, p2))), | 961 circle_(AddTypedPrimitive<Circle>(new Circle(*this, p1, p2))), |
948 label_(AddTypedPrimitive<Text>(new Text(*this))) | 962 label_(AddTypedPrimitive<Text>(new Text(that, *this))) |
949 { | 963 { |
950 label_.SetColor(Color(255, 0, 0)); | 964 label_.SetColor(Color(255, 0, 0)); |
951 UpdateLabel(); | 965 UpdateLabel(); |
966 } | |
967 | |
968 Handle& GetHandle2() const | |
969 { | |
970 return handle2_; | |
952 } | 971 } |
953 | 972 |
954 virtual void SignalMove(Primitive& primitive) ORTHANC_OVERRIDE | 973 virtual void SignalMove(Primitive& primitive) ORTHANC_OVERRIDE |
955 { | 974 { |
956 if (&primitive == &handle1_ || | 975 if (&primitive == &handle1_ || |
969 UpdateLabel(); | 988 UpdateLabel(); |
970 } | 989 } |
971 }; | 990 }; |
972 | 991 |
973 | 992 |
993 class CreateSegmentOrCircleTracker : public IFlexiblePointerTracker | |
994 { | |
995 private: | |
996 AnnotationsOverlay& that_; | |
997 Measure* measure_; | |
998 AffineTransform2D canvasToScene_; | |
999 Handle* handle2_; | |
1000 | |
1001 public: | |
1002 CreateSegmentOrCircleTracker(AnnotationsOverlay& that, | |
1003 bool isCircle, | |
1004 const ScenePoint2D& sceneClick, | |
1005 const AffineTransform2D& canvasToScene) : | |
1006 that_(that), | |
1007 measure_(NULL), | |
1008 canvasToScene_(canvasToScene), | |
1009 handle2_(NULL) | |
1010 { | |
1011 if (isCircle) | |
1012 { | |
1013 measure_ = new CircleMeasure(that, sceneClick, sceneClick); | |
1014 handle2_ = &dynamic_cast<CircleMeasure*>(measure_)->GetHandle2(); | |
1015 } | |
1016 else | |
1017 { | |
1018 measure_ = new SegmentMeasure(that, sceneClick, sceneClick); | |
1019 handle2_ = &dynamic_cast<SegmentMeasure*>(measure_)->GetHandle2(); | |
1020 } | |
1021 | |
1022 assert(measure_ != NULL && | |
1023 handle2_ != NULL); | |
1024 } | |
1025 | |
1026 virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE | |
1027 { | |
1028 if (measure_ != NULL) | |
1029 { | |
1030 assert(handle2_ != NULL); | |
1031 handle2_->SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1032 measure_->SignalMove(*handle2_); | |
1033 } | |
1034 } | |
1035 | |
1036 virtual void PointerUp(const PointerEvent& event) ORTHANC_OVERRIDE | |
1037 { | |
1038 measure_ = NULL; // IsAlive() becomes false | |
1039 } | |
1040 | |
1041 virtual void PointerDown(const PointerEvent& event) ORTHANC_OVERRIDE | |
1042 { | |
1043 } | |
1044 | |
1045 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1046 { | |
1047 return (measure_ != NULL); | |
1048 } | |
1049 | |
1050 virtual void Cancel() ORTHANC_OVERRIDE | |
1051 { | |
1052 if (measure_ != NULL) | |
1053 { | |
1054 that_.DeleteMeasure(measure_); | |
1055 measure_ = NULL; | |
1056 } | |
1057 } | |
1058 }; | |
1059 | |
1060 | |
974 typedef std::set<Primitive*> Primitives; | 1061 typedef std::set<Primitive*> Primitives; |
975 typedef std::set<Measure*> Measures; | 1062 typedef std::set<Measure*> Measures; |
1063 typedef std::set<size_t> SubLayers; | |
976 | 1064 |
977 size_t macroLayerIndex_; | 1065 size_t macroLayerIndex_; |
978 size_t polylineSublayer_; | 1066 size_t polylineSubLayer_; |
979 Primitives primitives_; | 1067 Primitives primitives_; |
980 Measures measures_; | 1068 Measures measures_; |
1069 SubLayers subLayersToRemove_; | |
1070 | |
1071 void AddMeasure(Measure* measure) | |
1072 { | |
1073 assert(measure != NULL); | |
1074 assert(measures_.find(measure) == measures_.end()); | |
1075 measures_.insert(measure); | |
1076 } | |
1077 | |
1078 void DeleteMeasure(Measure* measure) | |
1079 { | |
1080 if (measure != NULL) | |
1081 { | |
1082 assert(measures_.find(measure) != measures_.end()); | |
1083 measures_.erase(measure); | |
1084 delete measure; | |
1085 } | |
1086 } | |
1087 | |
1088 void DeletePrimitive(Primitive* primitive) | |
1089 { | |
1090 if (primitive != NULL) | |
1091 { | |
1092 assert(primitives_.find(primitive) != primitives_.end()); | |
1093 primitives_.erase(primitive); | |
1094 delete primitive; | |
1095 } | |
1096 } | |
1097 | |
1098 void TagSubLayerToRemove(size_t subLayerIndex) | |
1099 { | |
1100 assert(subLayersToRemove_.find(subLayerIndex) == subLayersToRemove_.end()); | |
1101 subLayersToRemove_.insert(subLayerIndex); | |
1102 } | |
981 | 1103 |
982 public: | 1104 public: |
983 AnnotationsOverlay(size_t macroLayerIndex) : | 1105 AnnotationsOverlay(size_t macroLayerIndex) : |
984 macroLayerIndex_(macroLayerIndex), | 1106 macroLayerIndex_(macroLayerIndex), |
985 polylineSublayer_(0) // dummy initialization | 1107 polylineSubLayer_(0) // dummy initialization |
986 { | 1108 { |
987 measures_.insert(new SegmentMeasure(*this, ScenePoint2D(0, 0), ScenePoint2D(100, 100))); | 1109 measures_.insert(new SegmentMeasure(*this, ScenePoint2D(0, 0), ScenePoint2D(100, 100))); |
988 measures_.insert(new AngleMeasure(*this, ScenePoint2D(100, 50), ScenePoint2D(150, 40), ScenePoint2D(200, 50))); | 1110 measures_.insert(new AngleMeasure(*this, ScenePoint2D(100, 50), ScenePoint2D(150, 40), ScenePoint2D(200, 50))); |
989 measures_.insert(new CircleMeasure(*this, ScenePoint2D(50, 200), ScenePoint2D(100, 250))); | 1111 measures_.insert(new CircleMeasure(*this, ScenePoint2D(50, 200), ScenePoint2D(100, 250))); |
990 } | 1112 } |
1009 macro = &dynamic_cast<MacroSceneLayer&>(scene.GetLayer(macroLayerIndex_)); | 1131 macro = &dynamic_cast<MacroSceneLayer&>(scene.GetLayer(macroLayerIndex_)); |
1010 } | 1132 } |
1011 else | 1133 else |
1012 { | 1134 { |
1013 macro = &dynamic_cast<MacroSceneLayer&>(scene.SetLayer(macroLayerIndex_, new MacroSceneLayer)); | 1135 macro = &dynamic_cast<MacroSceneLayer&>(scene.SetLayer(macroLayerIndex_, new MacroSceneLayer)); |
1014 polylineSublayer_ = macro->AddLayer(new PolylineSceneLayer); | 1136 polylineSubLayer_ = macro->AddLayer(new PolylineSceneLayer); |
1015 } | 1137 } |
1138 | |
1139 for (SubLayers::const_iterator it = subLayersToRemove_.begin(); it != subLayersToRemove_.end(); ++it) | |
1140 { | |
1141 assert(macro->HasLayer(*it)); | |
1142 macro->DeleteLayer(*it); | |
1143 } | |
1144 | |
1145 subLayersToRemove_.clear(); | |
1016 | 1146 |
1017 std::unique_ptr<PolylineSceneLayer> polyline(new PolylineSceneLayer); | 1147 std::unique_ptr<PolylineSceneLayer> polyline(new PolylineSceneLayer); |
1018 | 1148 |
1019 for (Primitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | 1149 for (Primitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) |
1020 { | 1150 { |
1028 primitive.RenderOtherLayers(*macro, scene); | 1158 primitive.RenderOtherLayers(*macro, scene); |
1029 primitive.SetModified(false); | 1159 primitive.SetModified(false); |
1030 } | 1160 } |
1031 } | 1161 } |
1032 | 1162 |
1033 macro->UpdateLayer(polylineSublayer_, polyline.release()); | 1163 macro->UpdateLayer(polylineSubLayer_, polyline.release()); |
1034 } | 1164 } |
1035 | 1165 |
1036 bool ClearHover() | 1166 bool ClearHover() |
1037 { | 1167 { |
1038 bool needsRefresh = false; | 1168 bool needsRefresh = false; |
1091 { | 1221 { |
1092 tracker.reset(new EditPrimitiveTracker(**it, s, scene.GetCanvasToSceneTransform())); | 1222 tracker.reset(new EditPrimitiveTracker(**it, s, scene.GetCanvasToSceneTransform())); |
1093 bestDepth = (*it)->GetDepth(); | 1223 bestDepth = (*it)->GetDepth(); |
1094 } | 1224 } |
1095 } | 1225 } |
1226 } | |
1227 | |
1228 if (tracker.get() == NULL) | |
1229 { | |
1230 tracker.reset(new CreateSegmentOrCircleTracker(*this, true /* circle */, s, scene.GetCanvasToSceneTransform())); | |
1096 } | 1231 } |
1097 | 1232 |
1098 return tracker.release(); | 1233 return tracker.release(); |
1099 } | 1234 } |
1100 }; | 1235 }; |