编辑 Nuget 包 C# Helixtoolkit.WPF
Editing Nuget Package C# Helixtoolkit.WPF
我在我的 C# 程序中使用 Helixtoolkit.WPF。我已经导入了 NuGet 包,它运行良好。但是,我想编辑其中一个文件,特别是 GridLinesVisual.cs。我想更改该文件中某个函数的运行方式,但似乎无法正常运行。
我需要更改的函数从第 247 行开始protected override MeshGeometry3D Tessellate()
这是我需要 update/change 的文件 link
https://searchcode.com/codesearch/view/10564811/
我程序的调用代码是grid = new GridLinesVisual3D();
我对 C# 的熟悉不如对 C++ 的熟悉,但我知道我无法创建子项 class 来编辑此函数。我认为覆盖是执行此操作的正确方法,但我无法使其正常工作。
我创建了一个新文件 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 功能的正确方法还是有 better/easier 编辑它的方法?
就其价值而言,Tessellate 函数正在 X 和 Y 方向上创建网格线。我只想要 Y 方向的网格线,而不是 X。所以基本上我不需要网格,我只想要线...
您的更改仅适用于 RectGrid
class。您没有修改原始 class 的行为,这不是覆盖的工作方式。
您需要确保将 using Axcro.Helix_Toolkit_Extentions;
添加到实例化 class 的文件顶部。如果 RectGrid
class 位于与使用它的位置不同的 DLL 中。确保添加引用。
然后您将使用
实例化GridLinesVisual3D
的class实例
grid = new RectGrid();
下面是我在 RectGrid.cs
中创建的 class 的代码
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();
我得到了我的网格,或者说是一个方向的井线,效果很好。感谢您的帮助!
我在我的 C# 程序中使用 Helixtoolkit.WPF。我已经导入了 NuGet 包,它运行良好。但是,我想编辑其中一个文件,特别是 GridLinesVisual.cs。我想更改该文件中某个函数的运行方式,但似乎无法正常运行。
我需要更改的函数从第 247 行开始protected override MeshGeometry3D Tessellate()
这是我需要 update/change 的文件 link https://searchcode.com/codesearch/view/10564811/
我程序的调用代码是grid = new GridLinesVisual3D();
我对 C# 的熟悉不如对 C++ 的熟悉,但我知道我无法创建子项 class 来编辑此函数。我认为覆盖是执行此操作的正确方法,但我无法使其正常工作。 我创建了一个新文件 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 功能的正确方法还是有 better/easier 编辑它的方法?
就其价值而言,Tessellate 函数正在 X 和 Y 方向上创建网格线。我只想要 Y 方向的网格线,而不是 X。所以基本上我不需要网格,我只想要线...
您的更改仅适用于 RectGrid
class。您没有修改原始 class 的行为,这不是覆盖的工作方式。
您需要确保将 using Axcro.Helix_Toolkit_Extentions;
添加到实例化 class 的文件顶部。如果 RectGrid
class 位于与使用它的位置不同的 DLL 中。确保添加引用。
然后您将使用
实例化GridLinesVisual3D
的class实例
grid = new RectGrid();
下面是我在 RectGrid.cs
中创建的 class 的代码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();
我得到了我的网格,或者说是一个方向的井线,效果很好。感谢您的帮助!