2015-05-20 50 views
4

我在我的C#程序中使用Helixtoolkit.WPF。我已經導入了NuGet軟件包,並且工作正常。但是,我想編輯其中一個文件,特別是GridLinesVisual.cs。我想改變該文件中的某個功能如何操作,但似乎無法使其工作。編輯Nuget包C#Helixtoolkit.WPF

我需要改變的功能開始上線247 protected override MeshGeometry3D Tessellate()

下面是我需要更新/更改文件的鏈接 https://searchcode.com/codesearch/view/10564811/

從我的程序調用代碼grid = new GridLinesVisual3D();

我不像C++那麼熟悉C#,但是我知道我不能創建一個子類來編輯這個函數。我認爲重寫是正確的做法,但我無法得到這個工作。 我創建了一個新的文件RectGrid.cs,這是我的代碼:

using HelixToolkit.Wpf; 
using System.Windows; 
using System.Windows.Data; 
using System.Windows.Media; 
using System.Windows.Media.Media3D; 

namespace Axcro.Helix_Toolkit_Extentions 
{ 
    class RectGrid : GridLinesVisual3D 
    { 
     protected override MeshGeometry3D Tessellate() 
     { 
     this.lengthDirection = this.LengthDirection; 
     this.lengthDirection.Normalize(); 
     this.widthDirection = Vector3D.CrossProduct(this.Normal, this.lengthDirection); 
     this.widthDirection.Normalize(); 

     var mesh = new MeshBuilder(true, false); 
     double minX = -this.Width/2; 
     double minY = -this.Length/2; 
     double maxX = this.Width/2; 
     double maxY = this.Length/2; 

     double x = minX; 
     double eps = this.MinorDistance/10; 
     while (x <= maxX + eps) 
     { 
      double t = this.Thickness; 
      if (IsMultipleOf(x, this.MajorDistance)) 
      { 
       t *= 2; 
      } 

      this.AddLineX(mesh, x, minY, maxY, t); 
      x += this.MinorDistance; 
     } 

     var m = mesh.ToMesh(); 
     m.Freeze(); 
     return m; 
     } 
    } 
} 

此代碼編譯就好了,但我要細化的變化沒有顯示出來。 正在使用重寫正確的方式來修改如何Tessellate函數或有更好/更簡單的方式來編輯它?

Tessellate函數的功能是在X和Y方向上創建網格線。我只想要Y方向的網格線,而不是X.所以基本上我不想要網格,我只想要線...

+1

如果該函數是虛擬的,並且您正在調用此類的實例,則應該顯示您的更改。你如何實例化派生類以供使用?你確定它是你創建的版本嗎? –

+0

Steve,我沒有調用類RectGrid,因爲Visual Studio說「類型或名稱空間無法找到」 我仍然使用grid = new GridLinesVisual3D(); – axcro

回答

1

您的更改僅適用於RectGrid類。你並沒有修改原始類的行爲,這並不是如何覆蓋工作。

您需要確保將using Axcro.Helix_Toolkit_Extentions;添加到實例化類的文件頂部。如果RectGrid類處於與正在使用的不同的DLL中。確保添加參考。

然後,你將實例化GridLinesVisual3D的類實例與

grid = new RectGrid(); 
+0

謝謝,這幫助我找到了一些小的剩餘問題並使其工作。 – axcro

0

下面是我對我在RectGrid.cs

using HelixToolkit.Wpf; 
using System.Windows; 
using System.Windows.Data; 
using System.Windows.Media; 
using System.Windows.Media.Media3D; 

namespace Axcro.Helix_Toolkit_Extentions 
    { 
    class RectGrid : GridLinesVisual3D 
{ 
    private Vector3D lengthDirection; 
    private Vector3D widthDirection; 
    private void AddLineY(MeshBuilder mesh, double y, double minX,  double maxX, double thickness) 
    { 
     int i0 = mesh.Positions.Count; 
     mesh.Positions.Add(this.GetPoint(minX, y + thickness/2)); 
     mesh.Positions.Add(this.GetPoint(maxX, y + thickness/2)); 
     mesh.Positions.Add(this.GetPoint(maxX, y - thickness/2)); 
     mesh.Positions.Add(this.GetPoint(minX, y - thickness/2)); 
     mesh.Normals.Add(this.Normal); 
     mesh.Normals.Add(this.Normal); 
     mesh.Normals.Add(this.Normal); 
     mesh.Normals.Add(this.Normal); 
     mesh.TriangleIndices.Add(i0); 
     mesh.TriangleIndices.Add(i0 + 1); 
     mesh.TriangleIndices.Add(i0 + 2); 
     mesh.TriangleIndices.Add(i0 + 2); 
     mesh.TriangleIndices.Add(i0 + 3); 
     mesh.TriangleIndices.Add(i0); 
    } 
     private Point3D GetPoint(double x, double y) 
    { 
     return this.Center + this.widthDirection * x +  this.lengthDirection * y; 
    } 
     private static bool IsMultipleOf(double y, double d) 
    { 
     double y2 = d * (int)(y/d); 
     return (y - y2) < 1e-3; 
     } 

     protected override MeshGeometry3D Tessellate() 
     { 
      this.lengthDirection = this.LengthDirection; 
      this.lengthDirection.Normalize(); 
      this.widthDirection = Vector3D.CrossProduct(this.Normal,  this.lengthDirection); 
      this.widthDirection.Normalize(); 

      var mesh = new MeshBuilder(true, false); 
      double minX = -this.Width/2; 
      double minY = -this.Length/2; 
      double maxX = this.Width/2; 
      double maxY = this.Length/2; 
      double eps = this.MinorDistance/10; 
      double y = minY; 
      while (y <= maxY + eps) 
      { 
       double t = this.Thickness; 
       if (IsMultipleOf(y, this.MajorDistance)) 
       { 
        t *= 2; 
       } 

       this.AddLineY(mesh, y, minX, maxX, t); 
       y += this.MinorDistance; 
      } 


      var m = mesh.ToMesh(); 
      m.Freeze(); 
      return m; 
     } 
    } 
} 

這調用該函數在文件中創建的類代碼我加了 using Axcro.Helix_Toolkit_Extentions;

而且這個函數的調用是 grid = new RectGrid();

我有我的網格,或井線在一個方向,很好地工作。謝謝您的幫助!