diff Framework/Scene2DViewport/AngleMeasureTool.cpp @ 722:28b9e3a54200

Undo mechanism implemented (not connected to UI yet). Undo stack and measuring tools are now handled by the ViewportController. Multi-touch does not crash trackers anymore.
author Benjamin Golinvaux <bgo@osimis.io>
date Tue, 21 May 2019 10:27:54 +0200
parents 8b6adfb62a2f
children 712ff6ff3c19
line wrap: on
line diff
--- a/Framework/Scene2DViewport/AngleMeasureTool.cpp	Mon May 20 12:49:29 2019 +0200
+++ b/Framework/Scene2DViewport/AngleMeasureTool.cpp	Tue May 21 10:27:54 2019 +0200
@@ -77,207 +77,209 @@
 
   void AngleMeasureTool::RefreshScene()
   {
-    if (IsEnabled())
+    if (IsSceneAlive())
     {
-      // get the scaling factor 
-      const double pixelToScene =
-        GetScene()->GetCanvasToSceneTransform().ComputeZoom();
 
-      if (!layersCreated)
+      if (IsEnabled())
       {
-        // Create the layers if need be
+        // get the scaling factor 
+        const double pixelToScene =
+          GetScene()->GetCanvasToSceneTransform().ComputeZoom();
 
-        assert(textBaseZIndex_ == -1);
+        if (!layersCreated)
         {
-          polylineZIndex_ = GetScene()->GetMaxDepth() + 100;
-          //LOG(INFO) << "set polylineZIndex_ to: " << polylineZIndex_;
-          std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer());
-          GetScene()->SetLayer(polylineZIndex_, layer.release());
+          // Create the layers if need be
 
-        }
-        {
-          textBaseZIndex_ = GetScene()->GetMaxDepth() + 100;
-          // create the four text background layers
+          assert(textBaseZIndex_ == -1);
           {
-            std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
-            GetScene()->SetLayer(textBaseZIndex_, layer.release());
-          }
-          {
-            std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
-            GetScene()->SetLayer(textBaseZIndex_+1, layer.release());
-          }
-          {
-            std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
-            GetScene()->SetLayer(textBaseZIndex_+2, layer.release());
+            polylineZIndex_ = GetScene()->GetMaxDepth() + 100;
+            //LOG(INFO) << "set polylineZIndex_ to: " << polylineZIndex_;
+            std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer());
+            GetScene()->SetLayer(polylineZIndex_, layer.release());
+
           }
           {
-            std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
-            GetScene()->SetLayer(textBaseZIndex_+3, layer.release());
+            textBaseZIndex_ = GetScene()->GetMaxDepth() + 100;
+            // create the four text background layers
+            {
+              std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
+              GetScene()->SetLayer(textBaseZIndex_, layer.release());
+            }
+            {
+              std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
+              GetScene()->SetLayer(textBaseZIndex_ + 1, layer.release());
+            }
+            {
+              std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
+              GetScene()->SetLayer(textBaseZIndex_ + 2, layer.release());
+            }
+            {
+              std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
+              GetScene()->SetLayer(textBaseZIndex_ + 3, layer.release());
+            }
+
+            // and the text layer itself
+            {
+              std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
+              GetScene()->SetLayer(textBaseZIndex_ + 4, layer.release());
+            }
+
           }
-          
-          // and the text layer itself
-          {
-            std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
-            GetScene()->SetLayer(textBaseZIndex_+4, layer.release());
-          }
-          
+          layersCreated = true;
+        }
+        else
+        {
+          assert(GetScene()->HasLayer(polylineZIndex_));
+          assert(GetScene()->HasLayer(textBaseZIndex_));
         }
-        layersCreated = true;
-      }
-      else
-      {
-        assert(GetScene()->HasLayer(polylineZIndex_));
-        assert(GetScene()->HasLayer(textBaseZIndex_));
-      }
-      {
-        // Fill the polyline layer with the measurement line
+        {
+          // Fill the polyline layer with the measurement line
+
+          PolylineSceneLayer* polylineLayer = GetPolylineLayer();
+          polylineLayer->ClearAllChains();
+          polylineLayer->SetColor(0, 183, 17);
 
-        PolylineSceneLayer* polylineLayer = GetPolylineLayer();
-        polylineLayer->ClearAllChains();
-        polylineLayer->SetColor(0, 183, 17);
+          // sides
+          {
+            {
+              PolylineSceneLayer::Chain chain;
+              chain.push_back(side1End_);
+              chain.push_back(center_);
+              polylineLayer->AddChain(chain, false);
+            }
+            {
+              PolylineSceneLayer::Chain chain;
+              chain.push_back(side2End_);
+              chain.push_back(center_);
+              polylineLayer->AddChain(chain, false);
+            }
+          }
 
-        // sides
-        {
+          // handles
+          {
+            //void AddSquare(PolylineSceneLayer::Chain& chain,const Scene2D& scene,const ScenePoint2D& centerS,const double& sideLength)
+
+            {
+              PolylineSceneLayer::Chain chain;
+              AddSquare(chain, *GetScene(), side1End_, 10.0 * pixelToScene); //TODO: take DPI into account
+              polylineLayer->AddChain(chain, true);
+            }
+
+            {
+              PolylineSceneLayer::Chain chain;
+              AddSquare(chain, *GetScene(), side2End_, 10.0 * pixelToScene); //TODO: take DPI into account
+              polylineLayer->AddChain(chain, true);
+            }
+          }
+
+          // arc
           {
             PolylineSceneLayer::Chain chain;
-            chain.push_back(side1End_);
-            chain.push_back(center_);
-            polylineLayer->AddChain(chain, false);
-          }
-          {
-            PolylineSceneLayer::Chain chain;
-            chain.push_back(side2End_);
-            chain.push_back(center_);
+
+            const double ARC_RADIUS_CANVAS_COORD = 30.0;
+            AddShortestArc(chain, *GetScene(), side1End_, center_, side2End_,
+              ARC_RADIUS_CANVAS_COORD * pixelToScene);
             polylineLayer->AddChain(chain, false);
           }
         }
-
-        // handles
         {
-          //void AddSquare(PolylineSceneLayer::Chain& chain,const Scene2D& scene,const ScenePoint2D& centerS,const double& sideLength)
-
-          {
-            PolylineSceneLayer::Chain chain;
-            AddSquare(chain, *GetScene(), side1End_, 10.0* pixelToScene); //TODO: take DPI into account
-            polylineLayer->AddChain(chain, true);
-          }
+          // Set the text layer
 
-          {
-            PolylineSceneLayer::Chain chain;
-            AddSquare(chain, *GetScene(), side2End_, 10.0* pixelToScene); //TODO: take DPI into account
-            polylineLayer->AddChain(chain, true);
-          }
-        }
-
-        // arc
-        {
-          PolylineSceneLayer::Chain chain;
-
-          const double ARC_RADIUS_CANVAS_COORD = 30.0;
-          AddShortestArc(chain, *GetScene(), side1End_, center_, side2End_, 
-            ARC_RADIUS_CANVAS_COORD*pixelToScene);
-          polylineLayer->AddChain(chain, false);
-        }
-      }
-      {
-        // Set the text layer
-
-        double p1cAngle = atan2(
-          side1End_.GetY() - center_.GetY(),
-          side1End_.GetX() - center_.GetX());
+          double p1cAngle = atan2(
+            side1End_.GetY() - center_.GetY(),
+            side1End_.GetX() - center_.GetX());
 
 
-        double p2cAngle = atan2(
-          side2End_.GetY() - center_.GetY(),
-          side2End_.GetX() - center_.GetX());
+          double p2cAngle = atan2(
+            side2End_.GetY() - center_.GetY(),
+            side2End_.GetX() - center_.GetX());
 
-        double delta = NormalizeAngle(p2cAngle - p1cAngle);
+          double delta = NormalizeAngle(p2cAngle - p1cAngle);
 
 
-        double theta = p1cAngle + delta/2;
+          double theta = p1cAngle + delta / 2;
 
 
-        const double TEXT_CENTER_DISTANCE_CANVAS_COORD = 90;
+          const double TEXT_CENTER_DISTANCE_CANVAS_COORD = 90;
 
-        double offsetX = TEXT_CENTER_DISTANCE_CANVAS_COORD * cos(theta);
+          double offsetX = TEXT_CENTER_DISTANCE_CANVAS_COORD * cos(theta);
 
-        double offsetY = TEXT_CENTER_DISTANCE_CANVAS_COORD * sin(theta);
+          double offsetY = TEXT_CENTER_DISTANCE_CANVAS_COORD * sin(theta);
 
-        double pointX = center_.GetX() + offsetX * pixelToScene;
-        double pointY = center_.GetY() + offsetY * pixelToScene;
+          double pointX = center_.GetX() + offsetX * pixelToScene;
+          double pointY = center_.GetY() + offsetY * pixelToScene;
 
-        char buf[64];
-        double angleDeg = RadiansToDegrees(delta);
+          char buf[64];
+          double angleDeg = RadiansToDegrees(delta);
 
-        // http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=00B0&mode=hex
-        sprintf(buf, "%0.02f\xc2\xb0", angleDeg);
+          // http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=00B0&mode=hex
+          sprintf(buf, "%0.02f\xc2\xb0", angleDeg);
 
-        SetTextLayerOutlineProperties(
-          *GetScene(), textBaseZIndex_, buf, ScenePoint2D(pointX, pointY));
+          SetTextLayerOutlineProperties(
+            *GetScene(), textBaseZIndex_, buf, ScenePoint2D(pointX, pointY));
 
-        // TODO:make it togglable
-        bool enableInfoDisplay = false;
-        if (enableInfoDisplay)
-        {
-          TrackerSample_SetInfoDisplayMessage("center_.GetX()",
-            boost::lexical_cast<std::string>(center_.GetX()));
+          // TODO:make it togglable
+          bool enableInfoDisplay = false;
+          if (enableInfoDisplay)
+          {
+            TrackerSample_SetInfoDisplayMessage("center_.GetX()",
+              boost::lexical_cast<std::string>(center_.GetX()));
 
-          TrackerSample_SetInfoDisplayMessage("center_.GetY()",
-            boost::lexical_cast<std::string>(center_.GetY()));
+            TrackerSample_SetInfoDisplayMessage("center_.GetY()",
+              boost::lexical_cast<std::string>(center_.GetY()));
 
-          TrackerSample_SetInfoDisplayMessage("side1End_.GetX()",
-            boost::lexical_cast<std::string>(side1End_.GetX()));
+            TrackerSample_SetInfoDisplayMessage("side1End_.GetX()",
+              boost::lexical_cast<std::string>(side1End_.GetX()));
 
-          TrackerSample_SetInfoDisplayMessage("side1End_.GetY()",
-            boost::lexical_cast<std::string>(side1End_.GetY()));
+            TrackerSample_SetInfoDisplayMessage("side1End_.GetY()",
+              boost::lexical_cast<std::string>(side1End_.GetY()));
 
-          TrackerSample_SetInfoDisplayMessage("side2End_.GetX()",
-            boost::lexical_cast<std::string>(side2End_.GetX()));
+            TrackerSample_SetInfoDisplayMessage("side2End_.GetX()",
+              boost::lexical_cast<std::string>(side2End_.GetX()));
 
-          TrackerSample_SetInfoDisplayMessage("side2End_.GetY()",
-            boost::lexical_cast<std::string>(side2End_.GetY()));
+            TrackerSample_SetInfoDisplayMessage("side2End_.GetY()",
+              boost::lexical_cast<std::string>(side2End_.GetY()));
 
-          TrackerSample_SetInfoDisplayMessage("p1cAngle (deg)",
-            boost::lexical_cast<std::string>(RadiansToDegrees(p1cAngle)));
+            TrackerSample_SetInfoDisplayMessage("p1cAngle (deg)",
+              boost::lexical_cast<std::string>(RadiansToDegrees(p1cAngle)));
 
-          TrackerSample_SetInfoDisplayMessage("delta (deg)",
-            boost::lexical_cast<std::string>(RadiansToDegrees(delta)));
+            TrackerSample_SetInfoDisplayMessage("delta (deg)",
+              boost::lexical_cast<std::string>(RadiansToDegrees(delta)));
 
-          TrackerSample_SetInfoDisplayMessage("theta (deg)",
-            boost::lexical_cast<std::string>(RadiansToDegrees(theta)));
+            TrackerSample_SetInfoDisplayMessage("theta (deg)",
+              boost::lexical_cast<std::string>(RadiansToDegrees(theta)));
 
-          TrackerSample_SetInfoDisplayMessage("p2cAngle (deg)",
-            boost::lexical_cast<std::string>(RadiansToDegrees(p2cAngle)));
+            TrackerSample_SetInfoDisplayMessage("p2cAngle (deg)",
+              boost::lexical_cast<std::string>(RadiansToDegrees(p2cAngle)));
 
-          TrackerSample_SetInfoDisplayMessage("offsetX (pix)",
-            boost::lexical_cast<std::string>(offsetX));
+            TrackerSample_SetInfoDisplayMessage("offsetX (pix)",
+              boost::lexical_cast<std::string>(offsetX));
 
-          TrackerSample_SetInfoDisplayMessage("offsetY (pix)",
-            boost::lexical_cast<std::string>(offsetY));
+            TrackerSample_SetInfoDisplayMessage("offsetY (pix)",
+              boost::lexical_cast<std::string>(offsetY));
 
-          TrackerSample_SetInfoDisplayMessage("pointX",
-            boost::lexical_cast<std::string>(pointX));
+            TrackerSample_SetInfoDisplayMessage("pointX",
+              boost::lexical_cast<std::string>(pointX));
 
-          TrackerSample_SetInfoDisplayMessage("pointY",
-            boost::lexical_cast<std::string>(pointY));
+            TrackerSample_SetInfoDisplayMessage("pointY",
+              boost::lexical_cast<std::string>(pointY));
 
-          TrackerSample_SetInfoDisplayMessage("angleDeg",
-            boost::lexical_cast<std::string>(angleDeg));
-        }
+            TrackerSample_SetInfoDisplayMessage("angleDeg",
+              boost::lexical_cast<std::string>(angleDeg));
+          }
 
 
 
+        }
       }
-    }
-    else
-    {
-      if (layersCreated)
+      else
       {
-        RemoveFromScene();
-        layersCreated = false;
+        if (layersCreated)
+        {
+          RemoveFromScene();
+          layersCreated = false;
+        }
       }
     }
   }
-
-
 }