Editing Nuget Package C# Helixtoolkit.WPF

本文关键字:Helixtoolkit WPF Package Nuget Editing | 更新日期: 2023-09-27 17:50:07

我正在使用Helixtoolkit。WPF在我的c#程序。我已经导入了NuGet包,它工作得很好。但是,我想编辑其中一个文件,特别是GridLinesVisual.cs。我想更改文件中的一个函数的操作方式,但似乎无法使其工作。

我需要修改的函数从第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方向的,所以基本上我不想要网格,我只想要线条。

Editing Nuget Package C# Helixtoolkit.WPF

您的更改仅适用于RectGrid类。您没有修改原始类的行为,这不是重写的工作方式。

您需要确保将using Axcro.Helix_Toolkit_Extentions;添加到您实例化类的文件的顶部。如果RectGrid类在使用它的不同DLL中。请务必添加引用。

然后用

实例化GridLinesVisual3D的类实例
grid = new RectGrid();

下面是我在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();

我有我的网格,或井线在一个方向,工作得很好。谢谢你的帮助!