Add ScanData Controller
This commit is contained in:
24
PointCloudWeb.Server/Controllers/ScanDataController.cs
Normal file
24
PointCloudWeb.Server/Controllers/ScanDataController.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using PointCloudWeb.Server.Models;
|
||||||
|
using PointCloudWeb.Server.Services;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Controllers
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class DataController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly DataService _scanDataService;
|
||||||
|
|
||||||
|
public DataController(DataService scanDataService)
|
||||||
|
{
|
||||||
|
_scanDataService = scanDataService;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public void PostScanData([FromBody] ScanDataList data)
|
||||||
|
{
|
||||||
|
_scanDataService.AddScan(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
73
PointCloudWeb.Server/Models/PointCloud.cs
Normal file
73
PointCloudWeb.Server/Models/PointCloud.cs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Models
|
||||||
|
{
|
||||||
|
public class Point
|
||||||
|
{
|
||||||
|
public double X { get; set; }
|
||||||
|
public double Y { get; set; }
|
||||||
|
public double Z { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public Point() : this(0, 0, 0) { }
|
||||||
|
public Point(double x, double y, double z)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override string ToString() => (X.ToString() + " " + Y.ToString() + " " + Z.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class PointCloud
|
||||||
|
{
|
||||||
|
public Guid Id { get; private set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public IList<Point> Points { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Function <c>ScaleFactor</c> defines relation between X/Y/Z distances in mm
|
||||||
|
/// So, Point A(0,0,0) is 1mm from B(1,0,0) apart
|
||||||
|
/// </summary>
|
||||||
|
public static int ScaleFactor() => 1;
|
||||||
|
|
||||||
|
public PointCloud(String name, Guid id)
|
||||||
|
{
|
||||||
|
Points = new List<Point>();
|
||||||
|
Id = id;
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PointCloudCollection : List<PointCloud>
|
||||||
|
{
|
||||||
|
public PointCloud GetById(Guid id)
|
||||||
|
{
|
||||||
|
return this.First(pc => pc.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointCloud AddNew()
|
||||||
|
{
|
||||||
|
var id = Guid.NewGuid();
|
||||||
|
var pc = new PointCloud(id.ToString(), id);
|
||||||
|
Add(pc);
|
||||||
|
return pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(Guid id)
|
||||||
|
{
|
||||||
|
return this.Any(pc => pc.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveById(Guid id)
|
||||||
|
{
|
||||||
|
Remove(GetById(id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
21
PointCloudWeb.Server/Models/ScanData.cs
Normal file
21
PointCloudWeb.Server/Models/ScanData.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Models
|
||||||
|
{
|
||||||
|
public class ScanDataPoint
|
||||||
|
{
|
||||||
|
//RotationAngle on {Y,Z,X} Axis
|
||||||
|
public double RAY { get; set; }
|
||||||
|
public double RAZ { get; set; }
|
||||||
|
public double RAX { get; set; }
|
||||||
|
public double DistanceMM { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ScanDataList
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public IList<ScanDataPoint> List { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
14
PointCloudWeb.Server/Services/IPointCloudRegistration.cs
Normal file
14
PointCloudWeb.Server/Services/IPointCloudRegistration.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using PointCloudWeb.Server.Models;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Services
|
||||||
|
{
|
||||||
|
public interface IPointCloudRegistation
|
||||||
|
{
|
||||||
|
class TransformationMatrix { }
|
||||||
|
|
||||||
|
public TransformationMatrix RegisterPointCloud(PointCloud pc1, PointCloud pc2)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
27
PointCloudWeb.Server/Services/PointCloudService.cs
Normal file
27
PointCloudWeb.Server/Services/PointCloudService.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using PointCloudWeb.Server.Models;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Services
|
||||||
|
{
|
||||||
|
public class PointCloudService
|
||||||
|
{
|
||||||
|
private readonly PointCloudCollection _pointClouds;
|
||||||
|
|
||||||
|
public PointCloudService()
|
||||||
|
{
|
||||||
|
_pointClouds = new PointCloudCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPoints(Guid id, IList<Point> points)
|
||||||
|
{
|
||||||
|
if (!_pointClouds.Contains(id))
|
||||||
|
throw new ArgumentOutOfRangeException("The Id {0} was not found!", id.ToString());
|
||||||
|
|
||||||
|
var pc = _pointClouds.GetById(id);
|
||||||
|
|
||||||
|
foreach (var point in points)
|
||||||
|
pc.Points.Add(point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
66
PointCloudWeb.Server/Services/ScanConverterService.cs
Normal file
66
PointCloudWeb.Server/Services/ScanConverterService.cs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
using PointCloudWeb.Server.Models;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Services
|
||||||
|
{
|
||||||
|
public class ScanConverterService
|
||||||
|
{
|
||||||
|
private enum RotationAxis { X, Y, Z };
|
||||||
|
|
||||||
|
private Matrix4x4 GetTransformationMatrix(ScanDataPoint scan, RotationAxis type)
|
||||||
|
{
|
||||||
|
var angle = type switch
|
||||||
|
{
|
||||||
|
RotationAxis.X => scan.RAX,
|
||||||
|
RotationAxis.Y => scan.RAY,
|
||||||
|
RotationAxis.Z => scan.RAZ,
|
||||||
|
_ => throw new NotImplementedException(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (angle == 0)
|
||||||
|
return new Matrix4x4(
|
||||||
|
1, 0, 0, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
);
|
||||||
|
|
||||||
|
var sin = (float)Math.Sin(angle);
|
||||||
|
var cos = (float)Math.Cos(angle);
|
||||||
|
|
||||||
|
return type switch
|
||||||
|
{
|
||||||
|
RotationAxis.X => new Matrix4x4(
|
||||||
|
1, 0, 0, 0,
|
||||||
|
0, sin, -sin, 0,
|
||||||
|
0, sin, cos, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
),
|
||||||
|
RotationAxis.Y => new Matrix4x4(
|
||||||
|
cos, 0, sin, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
-sin, 0, cos, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
),
|
||||||
|
RotationAxis.Z => new Matrix4x4(
|
||||||
|
cos, -sin, 0, 0,
|
||||||
|
sin, cos, 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
),
|
||||||
|
_ => throw new NotImplementedException(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point Transform(ScanDataPoint scan)
|
||||||
|
{
|
||||||
|
Vector3 v = new Vector3(0, 0, (int)scan.DistanceMM);
|
||||||
|
Vector3.Transform(v, GetTransformationMatrix(scan, RotationAxis.X));
|
||||||
|
Vector3.Transform(v, GetTransformationMatrix(scan, RotationAxis.Z));
|
||||||
|
Vector3.Transform(v, GetTransformationMatrix(scan, RotationAxis.Y));
|
||||||
|
|
||||||
|
return new Point(v.X, v.Y, v.Z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
PointCloudWeb.Server/Services/ScanDataService.cs
Normal file
35
PointCloudWeb.Server/Services/ScanDataService.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using PointCloudWeb.Server.Models;
|
||||||
|
|
||||||
|
namespace PointCloudWeb.Server.Services
|
||||||
|
{
|
||||||
|
public class DataService
|
||||||
|
{
|
||||||
|
private readonly PointCloudService _pointCloudService;
|
||||||
|
private readonly ScanConverterService _scanConverterService;
|
||||||
|
|
||||||
|
public DataService(PointCloudService pointCloudService, ScanConverterService scanConverterService)
|
||||||
|
{
|
||||||
|
_pointCloudService = pointCloudService;
|
||||||
|
_scanConverterService = scanConverterService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddScan(ScanDataList scanData)
|
||||||
|
{
|
||||||
|
_pointCloudService.AddPoints(scanData.Id, ConvertToPoints(scanData));
|
||||||
|
}
|
||||||
|
|
||||||
|
private IList<Point> ConvertToPoints(ScanDataList scanData)
|
||||||
|
{
|
||||||
|
var list = new List<Point>();
|
||||||
|
|
||||||
|
foreach (var scan in scanData.List)
|
||||||
|
{
|
||||||
|
list.Add(_scanConverterService.Transform(scan));
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user