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