You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否为Eyeshot实现随Pan/Zoom无限扩展的网格?附AutoCAD替代需求

关于2D .NET替代AutoCAD及Eyeshot无限网格的解决方案

一、替代AutoCAD的2D .NET包推荐

针对仅需基础CAD操作(绘图、标注、视图缩放平移等)的场景,以下几个包可以满足需求并节省授权成本:

  • Eyeshot:你已经关注的这款包本身具备完整的2D绘图能力,适合轻量化CAD场景,授权模式比AutoCAD更灵活。
  • CAD.NET:专注于基础2D CAD功能,提供绘图、编辑、DXF/DWG文件导入导出等核心能力,部署成本低。
  • LibreCAD .NET绑定:基于开源LibreCAD的.NET封装,适合对成本敏感且需要开源方案的团队。
  • 自定义SharpDX/System.Drawing实现:如果需求极简单(仅基础绘图和视图操作),可以用图形库自行搭建轻量化绘图模块,完全自主可控。

二、Eyeshot实现随Pan/Zoom虚拟无限扩展网格的方法

Eyeshot默认网格是有限范围的,但可以通过自定义绘制逻辑实现虚拟无限网格,步骤如下:

  1. 禁用默认网格
    先关闭Eyeshot自带的有限网格:
viewportLayout.Grid.Visible = false;
  1. 自定义网格绘制逻辑
    在ViewportLayout.Paint事件中,根据当前视口的可见范围动态绘制网格线,只渲染当前视图内的部分,实现“无限”的视觉效果:
private void viewportLayout1_Paint(object sender, PaintEventArgs e)
{
    var viewport = sender as ViewportLayout;
    if (viewport == null) return;

    // 自定义网格间距
    float gridSpacing = 10f;
    // 获取当前视口的世界坐标范围
    var viewExtents = viewport.GetViewExtents();

    // 计算网格线的起始/结束位置,基于视口范围扩展避免边缘空白
    float startX = (float)Math.Floor(viewExtents.Min.X / gridSpacing) * gridSpacing;
    float endX = (float)Math.Ceiling(viewExtents.Max.X / gridSpacing) * gridSpacing;
    float startY = (float)Math.Floor(viewExtents.Min.Y / gridSpacing) * gridSpacing;
    float endY = (float)Math.Ceiling(viewExtents.Max.Y / gridSpacing) * gridSpacing;

    // 绘制垂直网格线
    using (var gridPen = new Pen(Color.LightGray, 0.5f))
    {
        for (float x = startX; x <= endX; x += gridSpacing)
        {
            var worldStart = new Point3D(x, viewExtents.Min.Y, 0);
            var worldEnd = new Point3D(x, viewExtents.Max.Y, 0);
            var screenStart = viewport.WorldToScreen(worldStart);
            var screenEnd = viewport.WorldToScreen(worldEnd);
            e.Graphics.DrawLine(gridPen, screenStart, screenEnd);
        }

        // 绘制水平网格线
        for (float y = startY; y <= endY; y += gridSpacing)
        {
            var worldStart = new Point3D(viewExtents.Min.X, y, 0);
            var worldEnd = new Point3D(viewExtents.Max.X, y, 0);
            var screenStart = viewport.WorldToScreen(worldStart);
            var screenEnd = viewport.WorldToScreen(worldEnd);
            e.Graphics.DrawLine(gridPen, screenStart, screenEnd);
        }
    }
}
  1. 视图变化时触发重绘
    在AfterPan和AfterZoom事件中调用重绘方法,确保每次视图调整后网格同步更新:
private void viewportLayout1_AfterPan(object sender, EventArgs e)
{
    viewportLayout1.Invalidate();
}

private void viewportLayout1_AfterZoom(object sender, EventArgs e)
{
    viewportLayout1.Invalidate();
}

这种方式的优势在于:只绘制当前视口可见的网格线,性能开销极低,且无论如何Pan/Zoom,网格都会跟随视图范围动态生成,视觉上完全是无限扩展的效果。

内容的提问来源于stack exchange,提问作者N.TW12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:18:18