能否为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默认网格是有限范围的,但可以通过自定义绘制逻辑实现虚拟无限网格,步骤如下:
- 禁用默认网格
先关闭Eyeshot自带的有限网格:
viewportLayout.Grid.Visible = false;
- 自定义网格绘制逻辑
在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); } } }
- 视图变化时触发重绘
在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
相关产品推荐
相关产品推荐

