CrazyIter_Bin 4 vuotta sitten
vanhempi
commit
bf5c6a4da2

+ 3 - 3
HTEXLib/HTEXLib.csproj

@@ -4,9 +4,9 @@
     <Description>组合图形偏移问题</Description>
     <PackageReleaseNotes>组合图形偏移问题</PackageReleaseNotes>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>2.4.5</Version>
-    <AssemblyVersion>2.4.5.5</AssemblyVersion>
-    <FileVersion>2.4.5.5</FileVersion>
+    <Version>2.4.6</Version>
+    <AssemblyVersion>2.4.6.6</AssemblyVersion>
+    <FileVersion>2.4.6.6</FileVersion>
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5322 - 0
HTEXMarkWeb/Config/t.json


+ 20 - 4
HTEXMarkWeb/Controllers/HtexController.cs

@@ -6,6 +6,8 @@ using Microsoft.AspNetCore.Mvc;
  
 using System;
 using System.Collections.Generic;
+using System.Drawing.Imaging;
+using System.IO;
 using System.Linq;
 using System.Text.Json;
 using System.Threading.Tasks;
@@ -60,10 +62,24 @@ namespace HTEXWeb.Controllers
             }
             return Ok();
         }
-        [HttpPost("qrcode")]
-        public async Task<IActionResult> QRCode(string authCode) {
-            ZxingCodeHelper.QRCode(JsonSerializer.Serialize(new { authCode, url = "", tempUrl = "" }),100,100);
-            return Ok();
+        [HttpGet("qrcode")]
+        public async Task<IActionResult> QRCode() {
+            var img= ZxingCodeHelper.QRCode(JsonSerializer.Serialize(
+                new { 
+                    a = "15283771540", 
+                    d = "https://cdhabook.teammodel.cn/mark",
+                    u = "/file/upload", 
+                    t = "https://teammodelstorage.blob.core.chinacloudapi.cn/hiteachcc/huanghb8838/res/t/t.json" 
+                }),
+                500,500);
+            MemoryStream Stream = new MemoryStream();
+            img.Save(Stream, ImageFormat.Png);
+            byte[] bytes = new byte[Stream.Length];
+            Stream.Position = 0;
+            Stream.Read(bytes, 0, (int)Stream.Length);
+            Stream.Close();
+            string qrcode = "data:image/png;base64," + System.Convert.ToBase64String(bytes);
+            return Ok(qrcode);
         }
     }
 }

+ 1 - 0
HTEXMarkWeb/HTEXMarkWeb.csproj

@@ -7,6 +7,7 @@
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.6" />
     <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.6" />
     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.2" />
+    <PackageReference Include="OpenCvSharp4.runtime.ubuntu.16.04-x64" Version="4.5.0.20201013-beta1" />
     <PackageReference Include="System.Drawing.Common" Version="5.0.0" />
     <PackageReference Include="VueCliMiddleware" Version="3.1.1" />
     <PackageReference Include="ZXing.Net" Version="0.16.6" />

+ 14 - 0
HTEXScan/HTEXScan.csproj

@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
+    <PackageReference Include="OpenCvSharp4" Version="4.5.0.20201013" />
+    <PackageReference Include="OpenCvSharp4.runtime.ubuntu.16.04-x64" Version="4.5.0.20201013-beta1" />
+    <PackageReference Include="OpenCvSharp4.Windows" Version="4.5.0.20201013" />
+  </ItemGroup>
+
+</Project>

+ 56 - 0
HTEXScan/Models/Data.cs

@@ -0,0 +1,56 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HTEXScan.Models
+{
+
+    /**数据**/
+    class Data
+    {
+
+        /**地址**/
+        public string Path
+        {
+            get;
+            set;
+        }
+
+        /**信息地址**/
+        public string InfoPath
+        {
+            get;
+            set;
+        }
+
+        /**模板**/
+        public Template Template
+        {
+            get;
+            set;
+        }
+
+        /**sids**/
+        public List<string> Sid
+        {
+            get;
+            set;
+        }
+
+        /**subjects**/
+        public List<Subject> Subject
+        {
+            get;
+            set;
+        }
+
+        /**show**/
+        public bool Show
+        {
+            get;
+            set;
+        }
+
+    }
+}

+ 330 - 0
HTEXScan/Models/File.cs

@@ -0,0 +1,330 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HTEXScan.Models
+{
+
+    /**文件**/
+    class File
+    {
+
+        /**数据**/
+        protected Data data = null;
+        /**学生id**/
+        protected Sid sid = null;
+
+        /**绑定数据**/
+        public void Bind(Data data)
+        {
+            this.data = data;
+        }
+
+        /**读取**/
+        public void Read()
+        {
+            //原图
+            OpenCvSharp.Mat mat = new OpenCvSharp.Mat(this.data.Path);
+
+            //轮廓
+            OpenCvSharp.Point[] contour = this.GetExternalContours(mat, 60, 120, 10);
+
+            //顶点
+            OpenCvSharp.Point2f[] vertex = this.GetVertexPoints(contour);
+            //透视变换顶点
+            OpenCvSharp.Point2f[] wrapVertex = this.GetWarperspectivePoints(mat, vertex);
+
+            //透视变换图
+            OpenCvSharp.Mat wpMat = this.WarpPerspective(mat, vertex, wrapVertex);
+
+            //检测表格
+            this.sid = new Sid();
+
+            this.CheckCells(wpMat);
+            this.data.Sid = this.sid.Get();
+
+            OpenCvSharp.Cv2.Rectangle(mat, OpenCvSharp.Cv2.BoundingRect(contour), OpenCvSharp.Scalar.Red, 5);
+            for (int i = 0; i < vertex.Length; i++)
+                OpenCvSharp.Cv2.Circle(mat, vertex[i].ToPoint(), 20, OpenCvSharp.Scalar.Blue, 20);
+
+            this.Save(mat, wpMat);
+            if (this.data.Show)
+            {
+                this.Show(mat);
+                this.Show(wpMat);
+            }
+            mat.Release();
+            wpMat.Release();
+        }
+
+        /**最大轮廓**/
+        protected int GetMaxContour(OpenCvSharp.Point[][] contours)
+        {
+            int i = 0, index = 0;
+            double area = 0, maxArea = 0;
+            for (i = 0; i < contours.Length; i++)
+            {
+                area = OpenCvSharp.Cv2.ContourArea(contours[i]);
+                if (area > maxArea)
+                {
+                    index = i;
+                    maxArea = area;
+                }
+            }
+            return index;
+        }
+
+        /**获取外部最大轮廓**/
+        protected OpenCvSharp.Point[] GetMaxExternalContours(OpenCvSharp.Mat grayMat, double thresh)
+        {
+            OpenCvSharp.Point[][] contours = null;
+            OpenCvSharp.HierarchyIndex[] hierarchly = null;
+
+            //二值化
+            OpenCvSharp.Mat tsMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.Threshold(grayMat, tsMat, thresh, 255, OpenCvSharp.ThresholdTypes.Tozero);
+
+            //高斯模糊
+            OpenCvSharp.Mat blurredMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.GaussianBlur(tsMat, blurredMat, new OpenCvSharp.Size(5, 5), 0);
+
+            //边缘检测
+            OpenCvSharp.Mat edgedMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.Canny(blurredMat, edgedMat, 0, 255);
+
+            OpenCvSharp.Cv2.FindContours(edgedMat, out contours, out hierarchly, OpenCvSharp.RetrievalModes.External, OpenCvSharp.ContourApproximationModes.ApproxSimple);
+
+            tsMat.Release();
+            blurredMat.Release();
+            edgedMat.Release();
+
+            return contours[this.GetMaxContour(contours)];
+        }
+
+        /**获取外部轮廓**/
+        protected OpenCvSharp.Point[] GetExternalContours(OpenCvSharp.Mat mat, double threshStart, double threshEnd, double threshSep)
+        {
+            OpenCvSharp.Point[] contour = null, contourTmp;
+
+            //灰度
+            OpenCvSharp.Mat grayMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.CvtColor(mat, grayMat, OpenCvSharp.ColorConversionCodes.BGR2GRAY);
+
+            for (double thresh = threshStart; thresh < threshEnd; thresh += threshSep)
+            {
+                contourTmp = this.GetMaxExternalContours(grayMat, thresh);
+                if (contour == null || OpenCvSharp.Cv2.ContourArea(contourTmp) > OpenCvSharp.Cv2.ContourArea(contour))
+                    contour = contourTmp;
+            }
+
+            grayMat.Release();
+
+            return contour;
+        }
+
+        /**轮廓顶点**/
+        protected OpenCvSharp.Point2f[] GetVertexPoints(OpenCvSharp.Point[] contours)
+        {
+            OpenCvSharp.Point2f[] points = new OpenCvSharp.Point2f[4];
+
+            double d0 = 0, d1 = 0, d2 = 0, d3 = 0, d = 0;
+            OpenCvSharp.Rect rect = OpenCvSharp.Cv2.BoundingRect(contours);
+            for (int i = 0; i < contours.Length; i++)
+            {
+                //矩形左上角
+                d = System.Math.Sqrt( System.Math.Pow(contours[i].X - rect.X, 2) +  System.Math.Pow(contours[i].Y - rect.Y, 2));
+                if (d0 == 0 || d < d0)
+                {
+                    d0 = d;
+                    points[0] = contours[i];
+                }
+                //矩形右上角
+                d =  System.Math.Sqrt( System.Math.Pow(contours[i].X - rect.X - rect.Width, 2) +  System.Math.Pow(contours[i].Y - rect.Y, 2));
+                if (d1 == 0 || d < d1)
+                {
+                    d1 = d;
+                    points[1] = contours[i];
+                }
+                //矩形左下角
+                d =  System.Math.Sqrt( System.Math.Pow(contours[i].X - rect.X, 2) +  System.Math.Pow(contours[i].Y - rect.Y - rect.Height, 2));
+                if (d2 == 0 || d < d2)
+                {
+                    d2 = d;
+                    points[2] = contours[i];
+                }
+                //矩形右下角
+                d =  System.Math.Sqrt( System.Math.Pow(contours[i].X - rect.X - rect.Width, 2) +  System.Math.Pow(contours[i].Y - rect.Y - rect.Height, 2));
+                if (d3 == 0 || d < d3)
+                {
+                    d3 = d;
+                    points[3] = contours[i];
+                }
+            }
+
+            return points;
+        }
+
+        /**获取透视变换点**/
+        protected OpenCvSharp.Point2f[] GetWarperspectivePoints(OpenCvSharp.Mat mat, OpenCvSharp.Point2f[] points)
+        {
+            int cx = mat.Cols / 2, cy = mat.Rows / 2;
+            OpenCvSharp.Point2f[] dstPoints = new OpenCvSharp.Point2f[4];
+            for (int i = 0; i < points.Length; i++)
+            {
+                if (points[i].X <= cx && points[i].Y <= cy)
+                    dstPoints[i] = new OpenCvSharp.Point2f(0, 0);
+                else if (points[i].X <= cx && points[i].Y > cy)
+                    dstPoints[i] = new OpenCvSharp.Point2f(0, mat.Rows);
+                else if (points[i].X > cx && points[i].Y < cy)
+                    dstPoints[i] = new OpenCvSharp.Point2f(mat.Cols, 0);
+                else
+                    dstPoints[i] = new OpenCvSharp.Point2f(mat.Cols, mat.Rows);
+            }
+            return dstPoints;
+        }
+
+        /**透视变换**/
+        protected OpenCvSharp.Mat WarpPerspective(OpenCvSharp.Mat mat, OpenCvSharp.Point2f[] points, OpenCvSharp.Point2f[] toPoints)
+        {
+            OpenCvSharp.Mat wpMat = new OpenCvSharp.Mat();
+
+            //获取透视变化矩阵
+            OpenCvSharp.Mat mm = OpenCvSharp.Cv2.GetPerspectiveTransform(points, toPoints);
+            OpenCvSharp.Cv2.WarpPerspective(mat, wpMat, mm, mat.Size());
+            mm.Release();
+
+            return wpMat;
+        }
+
+        /**检测表格**/
+        protected void CheckCell(OpenCvSharp.Mat wpMat, OpenCvSharp.Mat mat, TemplateCell cell, OpenCvSharp.Rect matRect)
+        {
+            OpenCvSharp.Point[][] contours = null;
+            OpenCvSharp.HierarchyIndex[] hierarchly = null;
+
+            //二值化
+            OpenCvSharp.Mat tsMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.Threshold(mat, tsMat, 0, 255, OpenCvSharp.ThresholdTypes.Binary | OpenCvSharp.ThresholdTypes.Triangle);
+
+            //矩形
+            OpenCvSharp.Cv2.Rectangle(tsMat, new OpenCvSharp.Rect(0, 0, mat.Width, mat.Height), OpenCvSharp.Scalar.White);
+
+            //高斯模糊
+            OpenCvSharp.Mat blurredMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.GaussianBlur(tsMat, blurredMat, new OpenCvSharp.Size(5, 5), 0);
+
+            //边缘检测
+            OpenCvSharp.Mat edgedMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.Canny(blurredMat, edgedMat, 0, 255);
+
+            OpenCvSharp.Cv2.FindContours(edgedMat, out contours, out hierarchly, OpenCvSharp.RetrievalModes.List, OpenCvSharp.ContourApproximationModes.ApproxSimple);
+            for (int i = 0; i < contours.Length; i++)
+            {
+                OpenCvSharp.Rect rect = OpenCvSharp.Cv2.BoundingRect(contours[i]);
+
+                double s1 = rect.Width * rect.Height, s2 = mat.Width * mat.Height;
+                if (s1 >= s2 * 0.35f && s1 <= s2 * 1.2f)
+                {
+                    int cx = matRect.X + rect.X + rect.Width / 2, cy = matRect.Y + rect.Y + rect.Height / 2;
+                    if (matRect.Contains(cx, cy))
+                    {
+                        if (this.data.Show)
+                        {
+                            OpenCvSharp.Cv2.Circle(wpMat, new OpenCvSharp.Point(cx, cy), 5, OpenCvSharp.Scalar.Green, 2);
+                            OpenCvSharp.Cv2.Circle(wpMat, new OpenCvSharp.Point(matRect.X + matRect.Width / 2, matRect.Y + matRect.Height / 2), 15, OpenCvSharp.Scalar.Blue, 2);
+                        }
+
+                        if (cell.Type == 1)
+                            this.sid.Add(cell.Col, cell.Text);
+                        if(cell.Type == 2)
+                        {
+                            Subject subject =null;                                
+                            if (this.data.Subject == null)
+                            {
+                                this.data.Subject = new List<Subject>();
+                                subject = new Subject();
+                                subject.I = cell.Col;
+                                subject.Answer = new List<char>();
+                                this.data.Subject.Add(subject);
+                            }
+                            else
+                            {
+                                for(int m = 0;m < this.data.Subject.Count;m++)
+                                {
+                                    if (this.data.Subject[m].I == cell.Col)
+                                    {
+                                        subject = this.data.Subject[m];
+                                        break;
+                                    }
+                                }
+                                if(subject == null)
+                                {
+                                    subject = new Subject();
+                                    subject.I = cell.Col;
+                                    subject.Answer = new List<char>();
+                                    this.data.Subject.Add(subject);
+                                }
+                            }
+                            subject.Answer.Add(cell.Text);
+                        }
+                        break;
+                    }
+                }
+            }
+
+            tsMat.Release();
+            blurredMat.Release();
+            edgedMat.Release();
+        }
+
+        /**检测表格集合**/
+        protected void CheckCells(OpenCvSharp.Mat mat)
+        {
+            //灰度
+            OpenCvSharp.Mat grayMat = new OpenCvSharp.Mat();
+            OpenCvSharp.Cv2.CvtColor(mat, grayMat, OpenCvSharp.ColorConversionCodes.BGR2GRAY);
+
+            float sw = mat.Width * 1.0f / this.data.Template.Bw, sh = mat.Height * 1.0f / this.data.Template.Bh;
+
+            OpenCvSharp.Mat rio = null;
+            OpenCvSharp.Rect rect = new OpenCvSharp.Rect();
+            for (int i = 0; i < this.data.Template.Cell.Count; i++)
+            {
+                rect.X = (int)(this.data.Template.Cell[i].X * sw);
+                rect.Y = (int)(this.data.Template.Cell[i].Y * sh);
+                rect.Width = (int)(this.data.Template.Cell[i].W * sw);
+                rect.Height = (int)(this.data.Template.Cell[i].H * sw);
+
+                rio = new OpenCvSharp.Mat(grayMat, rect);
+                this.CheckCell(mat, rio, this.data.Template.Cell[i], rect);
+            }
+
+            grayMat.Release();
+        }
+
+        /**保存**/
+        public void Save(OpenCvSharp.Mat mat, OpenCvSharp.Mat wpMat)
+        {
+            if(this.data.InfoPath != null)
+            {
+                OpenCvSharp.Cv2.ImWrite(this.data.InfoPath + "//0.jpg", mat);
+                OpenCvSharp.Cv2.ImWrite(this.data.InfoPath + "//1.jpg", wpMat);
+            }
+        }
+
+        protected void Show(OpenCvSharp.Mat mat)
+        {
+            OpenCvSharp.Size size = new OpenCvSharp.Size(mat.Size().Width * 0.5f, mat.Size().Height * 0.5f);
+
+            OpenCvSharp.Mat displayMat = new OpenCvSharp.Mat(size, mat.Type());
+            OpenCvSharp.Cv2.Resize(mat, displayMat, size);
+
+            OpenCvSharp.Cv2.ImShow("1", displayMat);
+            OpenCvSharp.Cv2.WaitKey();
+
+            displayMat.Release();
+        }
+
+    }
+
+}

+ 45 - 0
HTEXScan/Models/Processer.cs

@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HTEXScan.Models
+{
+
+    /**处理器**/
+    class Processer
+    {
+
+        /**获取模板**/
+        public static Template ReadTemplate(string path)
+        {
+            string s = System.IO.File.ReadAllText(path);
+            try
+            {
+                return JsonConvert.DeserializeObject<Template>(s);
+            }
+            catch(Exception e)
+            {
+
+            }
+            return null;
+        }
+
+        /**获得答案**/
+        public static void GetResult(Data data)
+        {
+            File stream = new File();
+            stream.Bind(data);
+            stream.Read();
+        }
+
+        /**获得答案集合**/
+        public static void GetResults(List<Data> datas)
+        {
+            for (int i = 0; i < datas.Count; i++) 
+                Processer.GetResult(datas[i]);
+        }
+
+    }
+
+}

+ 79 - 0
HTEXScan/Models/Sid.cs

@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HTEXScan.Models
+{
+
+    /**学生id数据**/
+    class SidData
+    {
+
+        /**col**/
+        public int Col
+        {
+            get;
+            set;
+        }
+
+        /**值**/
+        public char Text
+        {
+            get;
+            set;
+        }
+
+    }
+
+    /**学生id**/
+    class Sid
+    {
+
+        /**max col**/
+        private int maxCol = 0;
+        /**学生id缓存数据**/
+        private List<SidData> datas = new List<SidData>();
+
+        /**添加**/
+        public void Add(int col, char text)
+        {
+            SidData data = new SidData();
+            data.Col = col;
+            data.Text = text;
+            this.datas.Add(data);
+            if (col > maxCol)
+                maxCol = col;
+        }
+
+        /**获取**/
+        public List<string> Get()
+        {
+            List<string> ids = new List<string>();
+            char[] dats = new char[maxCol];
+            this.GetData(ids, dats, 1);
+            return ids;
+        }
+
+        /**获取**/
+        private void GetData(List<string> ids, char[] dats, int col)
+        {
+            if(col > this.maxCol)
+            {
+                ids.Add(new string(dats));
+            }
+            else
+            {
+                for(int i = 0;i < this.datas.Count;i++)
+                {
+                    if (this.datas[i].Col == col)
+                    {
+                        dats[col - 1] = this.datas[i].Text;
+                        this.GetData(ids, dats, col + 1);
+                    }
+                }
+            }
+        }
+
+    }
+
+}

+ 27 - 0
HTEXScan/Models/Subject.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HTEXScan.Models
+{
+
+    /**题目**/
+    class Subject
+    {
+
+        /**题号**/
+        public int I
+        {
+            get;
+            set;
+        }
+
+        /**答案**/
+        public List<char> Answer
+        {
+            get;
+            set;
+        }
+
+    }
+}

+ 146 - 0
HTEXScan/Models/Template.cs

@@ -0,0 +1,146 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HTEXScan.Models
+{
+    /**模板快**/
+   public class TemplateCell
+    {
+        /**x**/
+        [JsonProperty(PropertyName = "x")]
+        public int X
+        {
+            get;
+            set;
+        }
+
+        /**y**/
+        [JsonProperty(PropertyName = "y")]
+        public int Y
+        {
+            get;
+            set;
+        }
+
+        /**w**/
+        [JsonProperty(PropertyName = "w")]
+        public int W
+        {
+            get;
+            set;
+        }
+
+        /**h**/
+        [JsonProperty(PropertyName = "h")]
+        public int H
+        {
+            get;
+            set;
+        }
+
+        /**text**/
+        [JsonProperty(PropertyName = "text")]
+        public char Text
+        {
+            get;
+            set;
+        }
+
+        /**type**/
+        [JsonProperty(PropertyName = "type")]
+        public int Type
+        {
+            get;
+            set;
+        }
+
+        /**text**/
+        [JsonProperty(PropertyName = "col")]
+        public int Col
+        {
+            get;
+            set;
+        }
+
+    }
+
+    /**模板**/
+   public class Template
+    {
+
+        /**rw**/
+        [JsonProperty(PropertyName = "rw")]
+        public int Rw
+        {
+            get;
+            set;
+        }
+
+        /**rh**/
+        [JsonProperty(PropertyName = "rh")]
+        public int Rh
+        {
+            get;
+            set;
+        }
+
+        /**w**/
+        [JsonProperty(PropertyName = "w")]
+        public int W
+        {
+            get;
+            set;
+        }
+
+        /**h**/
+        [JsonProperty(PropertyName = "h")]
+        public int H
+        {
+            get;
+            set;
+        }
+
+        /**bw**/
+        [JsonProperty(PropertyName = "bw")]
+        public int Bw
+        {
+            get;
+            set;
+        }
+
+        /**bh**/
+        [JsonProperty(PropertyName = "bh")]
+        public int Bh
+        {
+            get;
+            set;
+        }
+
+        /**bx**/
+        [JsonProperty(PropertyName = "bx")]
+        public int Bx
+        {
+            get;
+            set;
+        }
+
+        /**by**/
+        [JsonProperty(PropertyName = "by")]
+        public int By
+        {
+            get;
+            set;
+        }
+
+        /**cell**/
+        [JsonProperty(PropertyName = "cell")]
+        public List<TemplateCell> Cell
+        {
+            get;
+            set;
+        }
+
+    }
+}

+ 7 - 1
TEAMModelHTEX.sln

@@ -19,7 +19,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HTEXWebTest", "HTEXWebTest\
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HTEXInk", "HTEXInk\HTEXInk.csproj", "{08073D83-D799-4704-B008-7743E7D11815}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HTEXChart", "HTEXChart\HTEXChart.csproj", "{9E0B7343-0373-4352-AC2C-9550B4041BC7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HTEXChart", "HTEXChart\HTEXChart.csproj", "{9E0B7343-0373-4352-AC2C-9550B4041BC7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HTEXScan", "HTEXScan\HTEXScan.csproj", "{42ACD89C-DB3F-4B0B-BB8D-1245E3E0120B}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -63,6 +65,10 @@ Global
 		{9E0B7343-0373-4352-AC2C-9550B4041BC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{9E0B7343-0373-4352-AC2C-9550B4041BC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{9E0B7343-0373-4352-AC2C-9550B4041BC7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{42ACD89C-DB3F-4B0B-BB8D-1245E3E0120B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{42ACD89C-DB3F-4B0B-BB8D-1245E3E0120B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{42ACD89C-DB3F-4B0B-BB8D-1245E3E0120B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{42ACD89C-DB3F-4B0B-BB8D-1245E3E0120B}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE