protected override void Solve() { //提取所有拓樸點 PointD[] allTopoPoints = new PointD[this.TopoFace1.Points.Length + this.TopoFace2.Points.Length]; Vector[] allTopoPointNormals = new Vector[this.TopoFace1.Normals.Length + this.TopoFace2.Normals.Length]; int index; index = 0; foreach (var item in this.TopoFace1.Points) { allTopoPoints[index] = item; index++; } foreach (var item in this.TopoFace2.Points) { allTopoPoints[index] = item; index++; } index = 0; foreach (var item in this.TopoFace1.Normals) { allTopoPointNormals[index] = item; index++; } foreach (var item in this.TopoFace2.Normals) { allTopoPointNormals[index] = item; index++; } //劃分計算範圍 List<int> sliceIndex = new List<int>(); for (int i = 0; i < this.ThreadNumber + 1; i++) sliceIndex.Add((int)(((double)i * (double)allTopoPoints.Length) / (double)this.ThreadNumber)); //建立獨立執行序物件 for (int i = 0; i < this.ThreadNumber; i++) { //取出計算範圍內的點 PointD[] PartoalPoints = new PointD[sliceIndex[i + 1] - sliceIndex[i]]; for (int j = 0; j < sliceIndex[i + 1] - sliceIndex[i]; j++) PartoalPoints[j] = allTopoPoints[j + sliceIndex[i]]; Vector[] PartoalNormals = new Vector[sliceIndex[i + 1] - sliceIndex[i]]; for (int j = 0; j < sliceIndex[i + 1] - sliceIndex[i]; j++) PartoalNormals[j] = allTopoPointNormals[j + sliceIndex[i]]; //建立物件 STLMeasuringTool_CMM aSTLMeasuringTool_CMM = new STLMeasuringTool_CMM() { STL2Measure = this.STL2Measure, STLCubicClassifier = this.STLCubicClassifier, MeasurePoints = PartoalPoints.ToList(), MeasurePointNormals = PartoalNormals.ToList(), }; aSTLMeasuringTool_CMM.PercentageChanged += this.OnThreadPercentageChanged; aSTLMeasuringTool_CMM.OnFinish += this.OnThreadFinished; STLMeasurent_Objects.Add(aSTLMeasuringTool_CMM); } this.StartTime = DateTime.Now; foreach (var aThreadObject in STLMeasurent_Objects) { aThreadObject.PercentageChanged += OnThreadPercentageChanged; aThreadObject.StartMeasure(); } }
/// <summary> /// 給定STL,量測點及量測方向 /// 計算 從量測點出發、延量測方向距離最近 的位置 /// 若與STL所有三角面都無相交則回傳 null /// </summary> /// <param name="aSTL">STL</param> /// <param name="P">量測點</param> /// <param name="N">量測方向</param> /// <returns>最近點</returns> public override void StartMeasure() { if (this.IsBusy == false) { //設定狀態 this.FinishedThreadNumber = 0; this.IsBusy = true; this.StartTime = DateTime.Now; //劃分執行緒工作區域 List<int> sliceIndex = new List<int>(); for (int i = 0; i <= this.ThreadNumber; i++) { sliceIndex.Add((int)((double)i * (double)MeasurePoints.Count / (double)this.ThreadNumber)); } //建立量測物件並指定量測範圍 STLMeasurent_Objects = new List<STLMeasuringTool>(); for (int i = 0; i < sliceIndex.Count - 1; i++) { PointD[] PartoalPoints = new PointD[sliceIndex[i + 1] - sliceIndex[i]]; for (int j = 0; j < sliceIndex[i + 1] - sliceIndex[i]; j++) PartoalPoints[j] = this.MeasurePoints[j + sliceIndex[i]]; STLMeasuringTool aSTLMeasurementObject = (STLMeasuringTool)Activator.CreateInstance(this.STLMeasurentReferenceObject.GetType()); aSTLMeasurementObject.STL2Measure = this.STL2Measure; aSTLMeasurementObject.MeasurePoints = PartoalPoints.ToList(); aSTLMeasurementObject.PercentageChanged += this.OnThreadPercentageChanged; aSTLMeasurementObject.OnFinish += this.OnThreadFinished; if (aSTLMeasurementObject is ISTLMeasurement_NeedNormals && this.MeasurePointNormals != null) { Vector[] PartoalNormals = new Vector[sliceIndex[i + 1] - sliceIndex[i]]; for (int j = 0; j < sliceIndex[i + 1] - sliceIndex[i]; j++) PartoalNormals[j] = this.MeasurePointNormals[j + sliceIndex[i]]; (aSTLMeasurementObject as ISTLMeasurement_NeedNormals).MeasurePointNormals = PartoalNormals.ToList(); } STLMeasurent_Objects.Add(aSTLMeasurementObject); } foreach (var aThreadObject in STLMeasurent_Objects) { aThreadObject.PercentageChanged += OnThreadPercentageChanged; aThreadObject.StartMeasure(); } } }