Browse Source

Rewrote internal optitrack drawing & deleting logic

Martin Edlund 5 years ago
parent
commit
2cc1f90ce2

+ 61 - 39
SketchAssistant/SketchAssistantWPF/MVP_Model.cs

@@ -39,7 +39,7 @@ namespace SketchAssistantWPF
         /// <summary>
         /// If the program is in drawing mode.
         /// </summary>
-        bool inDrawingMode;
+        public bool inDrawingMode { get; private set; }
         /// <summary>
         /// if the program is using OptiTrack
         /// </summary>
@@ -60,6 +60,21 @@ namespace SketchAssistantWPF
         /// Queue for the cursorPositions
         /// </summary>
         Queue<Point> cursorPositions = new Queue<Point>();
+
+        /// <summary>
+        /// The Position of the Cursor of opti track
+        /// </summary>
+        Point currentOptiCursorPosition;
+        /// <summary>
+        /// The Previous Cursor Position of opti track
+        /// </summary>
+        Point previousOptiCursorPosition;
+        /// <summary>
+        /// Queue for the cursorPositions of opti track
+        /// </summary>
+        Queue<Point> optiCursorPositions = new Queue<Point>();
+
+
         /// <summary>
         /// Lookup Matrix for checking postions of lines in the image
         /// </summary>
@@ -101,15 +116,15 @@ namespace SketchAssistantWPF
         /// </summary>
         public bool optitrackAvailable { get; private set; }
         /// <summary>
-        /// x koordinate in real world. one unit is one meter. If standing in front of video wall facing it, moving left results in incrementation of x.
+        /// x coordinate in real world. one unit is one meter. If standing in front of video wall facing it, moving left results in incrementation of x.
         /// </summary>
         public float optiTrackX;
         /// <summary>
-        /// y koordinate in real world. one unit is one meter. If standing in front of video wall, moving up results in incrementation of y.
+        /// y coordinate in real world. one unit is one meter. If standing in front of video wall, moving up results in incrementation of y.
         /// </summary>
         public float optiTrackY;
         /// <summary>
-        /// z koordinate in real world. one unit is one meter. If standing in front of video wall, moving back results in incrementation of y.
+        /// z coordinate in real world. one unit is one meter. If standing in front of video wall, moving back results in incrementation of y.
         /// </summary>
         public float optiTrackZ;
         /// <summary>
@@ -129,7 +144,6 @@ namespace SketchAssistantWPF
         /// </summary>
         bool testing = false;//TODO: remove after finishing userstory
 
-
         /// <summary>
         /// Whether or not the mouse is pressed.
         /// </summary>
@@ -294,8 +308,11 @@ namespace SketchAssistantWPF
                 Console.WriteLine("raw coordinates: " + p.X + ";" + p.Y);
                 Console.WriteLine(correctedPoint.X + "," + correctedPoint.Y);
             }
-            currentCursorPosition = correctedPoint;
-            programPresenter.MoveOptiPoint(currentCursorPosition);
+            currentOptiCursorPosition = correctedPoint;
+            if (optiCursorPositions.Count > 0) { previousOptiCursorPosition = optiCursorPositions.Dequeue(); }
+            else { previousOptiCursorPosition = currentOptiCursorPosition; }
+
+            programPresenter.MoveOptiPoint(currentOptiCursorPosition);
         }
 
         /********************************************/
@@ -473,13 +490,10 @@ namespace SketchAssistantWPF
         /// <param name="valid">Whether the up event is valid or not</param>
         public void FinishCurrentLine(bool valid)
         {
-            foreach (Point p in currentLine)
-            {
-                if (testing)
-                {
+            if (testing)
+                foreach (Point p in currentLine)
                     Console.WriteLine(p.X + ";" + p.Y);
-                }
-            }
+
             mouseDown = false;
             if (valid)
             {
@@ -541,22 +555,35 @@ namespace SketchAssistantWPF
         {
             if (cursorPositions.Count > 0) { previousCursorPosition = cursorPositions.Dequeue(); }
             else { previousCursorPosition = currentCursorPosition; }
-            if (optiTrackInUse) //drawing optiTrack
+
+            if (optiTrackInUse && inDrawingMode) // optitrack is being used
             {
+                SetCurrentFingerPosition(new Point(optiTrackX, optiTrackY));
+
+                //outside of drawing zone
+                if (!CheckInsideDrawingZone(optiTrackZ))
+                {
+                    //Check if trackable was in drawing zone last tick & program is in drawing mode-> finish line
+                    if (optiTrackInsideDrawingZone && inDrawingMode) 
+                    {
+                        optiTrackInsideDrawingZone = false;
+                        FinishCurrentLine(true);
+                        if (testing) Console.WriteLine("line finished");
+                    }
+                }
+
+                //Draw with optitrack, when in drawing zone
                 if (CheckInsideDrawingZone(optiTrackZ))
                 {
-                    SetCurrentFingerPosition(new Point(optiTrackX, optiTrackY));
-                    currentLine.Add(currentCursorPosition);
-                    programPresenter.UpdateCurrentLine(currentLine);
+                    //Optitrack wasn't in the drawing zone last tick -> start a new line
                     if (!optiTrackInsideDrawingZone)
                     {
                         optiTrackInsideDrawingZone = true;
                         StartNewLine();
-                        if (testing)
-                        {
-                            Console.WriteLine("new line begun");
-                        }
+                        if (testing) Console.WriteLine("new line begun");
                     }
+                    else currentLine.Add(currentOptiCursorPosition);
+                    programPresenter.UpdateCurrentLine(currentLine);
                     if (optiTrackZ > WARNING_ZONE_BOUNDARY)
                     {
                         armband.pushForward();
@@ -566,36 +593,32 @@ namespace SketchAssistantWPF
                         armband.pushBackward();
                     }
                 }
-                else
-                {
-                    if (optiTrackInsideDrawingZone) //trackable was in drawing zone last tick -> finish line
-                    {
-                        optiTrackInsideDrawingZone = false;
-                        FinishCurrentLine(true);
-                        if (testing)
-                        {
-                            Console.WriteLine("line finished");
-                        }
-                    }
-                }
+
+
                 //if (optitrackAvailable) { TODO test and remove
                 projectPointOntoScreen(optiTrackX, optiTrackY);
                 //}
-                cursorPositions.Enqueue(currentCursorPosition);
             }
-            else //drawing normal
+            else if( !optiTrackInUse && inDrawingMode)
             {
+                //drawing without optitrack
                 cursorPositions.Enqueue(currentCursorPosition);
                 if (inDrawingMode && programPresenter.IsMousePressed())
                 {
                     currentLine.Add(currentCursorPosition);
                     //programPresenter.UpdateCurrentLine(currentLine);
                 }
+
             }
-            //Deleting
-            if (!inDrawingMode && programPresenter.IsMousePressed())
+
+            //Deletion mode for optitrack and regular use
+            if (!inDrawingMode)
             {
-                List<Point> uncheckedPoints = GeometryCalculator.BresenhamLineAlgorithm(previousCursorPosition, currentCursorPosition);
+                List<Point> uncheckedPoints = new List<Point>();
+                if (programPresenter.IsMousePressed() && !optiTrackInUse) //without optitrack
+                    uncheckedPoints = GeometryCalculator.BresenhamLineAlgorithm(previousCursorPosition, currentCursorPosition);
+                if(optiTrackInUse && CheckInsideDrawingZone(optiTrackZ)) //with optitrack
+                    uncheckedPoints = GeometryCalculator.BresenhamLineAlgorithm(previousOptiCursorPosition, currentOptiCursorPosition);
 
                 foreach (Point currPoint in uncheckedPoints)
                 {
@@ -608,7 +631,6 @@ namespace SketchAssistantWPF
                             rightLineList[lineID] = new Tuple<bool, InternalLine>(false, rightLineList[lineID].Item2);
                         }
                         RepopulateDeletionMatrixes();
-                        //TODO: For the person implementing overlay: Add check if overlay needs to be added
                         programPresenter.UpdateRightLines(rightLineList);
                     }
                 }

+ 18 - 0
SketchAssistant/SketchAssistantWPF/MVP_Presenter.cs

@@ -138,6 +138,24 @@ namespace SketchAssistantWPF
             programModel.ChangeState(NowDrawing);
         }
 
+        /// <summary>
+        /// Gets whether the program is in drawing state or not.
+        /// </summary>
+        /// <returns></returns>
+        public bool GetDrawingState()
+        {
+            return programModel.inDrawingMode;
+        }
+
+        /// <summary>
+        /// Gets whether Optitrack is in use or not.
+        /// </summary>
+        /// <returns>Return optiTrackInUse</returns>
+        public bool GetOptitrackActive()
+        {
+            return programModel.optiTrackInUse;
+        }
+
         /// <summary>
         /// Pass-through function to change the OptiTrack-in-use state of the model
         /// </summary>

+ 13 - 4
SketchAssistant/SketchAssistantWPF/MainWindow.xaml.cs

@@ -156,7 +156,6 @@ namespace SketchAssistantWPF
         /// </summary>
         private void DrawButton_Click(object sender, RoutedEventArgs e)
         {
-            ProgramPresenter.ChangeOptiTrack(false);
             ProgramPresenter.ChangeState(true);
             RightCanvas.EditingMode = InkCanvasEditingMode.Ink;
         }
@@ -166,9 +165,19 @@ namespace SketchAssistantWPF
         /// </summary>
         private void DrawWithOptiButton_Click(object sender, RoutedEventArgs e)
         {
-            ProgramPresenter.ChangeOptiTrack(true);
-            ProgramPresenter.ChangeState(true);
-            RightCanvas.EditingMode = InkCanvasEditingMode.Ink;
+            if (ProgramPresenter.GetOptitrackActive())
+            {
+                ProgramPresenter.ChangeOptiTrack(false);
+                if (ProgramPresenter.GetDrawingState())
+                    RightCanvas.EditingMode = InkCanvasEditingMode.Ink;
+                else
+                    RightCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke;
+            }
+            else
+            {
+                ProgramPresenter.ChangeOptiTrack(true);
+                RightCanvas.EditingMode = InkCanvasEditingMode.None;
+            }
         }
 
         /// <summary>

+ 4 - 2
SketchAssistant/SketchAssistantWPF/SketchAssistantWPF.csproj

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" 
-  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="..\packages\ReportGenerator.4.0.15\build\netstandard2.0\ReportGenerator.props" Condition="Exists('..\packages\ReportGenerator.4.0.15\build\netstandard2.0\ReportGenerator.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
@@ -92,6 +91,9 @@
     <Reference Include="WindowsBase" />
     <Reference Include="PresentationCore" />
     <Reference Include="PresentationFramework" />
+    <Reference Include="WindowsInput, Version=1.0.4.0, Culture=neutral, PublicKeyToken=9b287f7dc5073cad, processorArchitecture=MSIL">
+      <HintPath>..\packages\InputSimulator.1.0.4.0\lib\net20\WindowsInput.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <ApplicationDefinition Include="App.xaml">

+ 1 - 0
SketchAssistant/SketchAssistantWPF/packages.config

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
+  <package id="InputSimulator" version="1.0.4.0" targetFramework="net461" />
   <package id="Microsoft.TestPlatform" version="16.0.1" targetFramework="net461" />
   <package id="OpenCover" version="4.7.922" targetFramework="net461" />
   <package id="ReportGenerator" version="4.0.15" targetFramework="net461" />

+ 1 - 2
SketchAssistant/WhiteTests/WhiteTests.csproj

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" DefaultTargets="Build" 
-  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="..\packages\ReportGenerator.4.0.15\build\netstandard2.0\ReportGenerator.props" Condition="Exists('..\packages\ReportGenerator.4.0.15\build\netstandard2.0\ReportGenerator.props')" />
   <Import Project="..\packages\MSTest.TestAdapter.1.4.0\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.4.0\build\net45\MSTest.TestAdapter.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />

+ 1 - 0
SketchAssistant/WhiteTests/packages.config

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="Castle.Core" version="4.3.1" targetFramework="net461" />
+  <package id="InputSimulator" version="1.0.4.0" targetFramework="net461" />
   <package id="MSTest.TestAdapter" version="1.4.0" targetFramework="net461" />
   <package id="MSTest.TestFramework" version="1.4.0" targetFramework="net461" />
   <package id="TestStack.White" version="0.13.3" targetFramework="net461" />