C# CAD多段线等距分割技巧

📅 2026/6/29 20:00:22
C# CAD多段线等距分割技巧
在C#对CAD进行二次开发时要将一条多段线Polyline等距分割成多份核心是使用Polyline的GetSplitCurves方法并传入一组在曲线参数域内、按升序排列的切割点参数值。以下是实现将多段线等距分割成10份的完整代码示例using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; public class PolylineSplitCommands { [CommandMethod(SplitPolylineEqually)] public void SplitPolylineEqually() { Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; Editor ed doc.Editor; // 1. 选择要分割的多段线 PromptEntityOptions peo new PromptEntityOptions( 请选择一条多段线: ); peo.SetRejectMessage( 请选择一条多段线。); peo.AddAllowedClass(typeof(Polyline), false); PromptEntityResult per ed.GetEntity(peo); if (per.Status ! PromptStatus.OK) return; using (Transaction tr db.TransactionManager.StartTransaction()) { try { // 2. 打开选中的多段线对象 Polyline pline tr.GetObject(per.ObjectId, OpenMode.ForRead) as Polyline; if (pline null) return; // 3. 计算等距分割点参数 int numberOfSegments 10; // 分割成10份 double totalLength pline.Length; double segmentLength totalLength / numberOfSegments; // 准备切割点参数集合注意必须升序排列 DoubleCollection splitParams new DoubleCollection(); // 从第一个分割点开始到最后一个分割点前结束 // 注意GetSplitCurves方法在参数处切割起点和终点的参数不需要加入 for (int i 1; i numberOfSegments; i) { double distance segmentLength * i; // 通过距离获取对应的曲线参数 double param pline.GetParameterAtDistance(distance); splitParams.Add(param); } // 4. 执行分割操作 // 重要GetSplitCurves 要求参数按升序排列且不能包含曲线起点和终点的参数 DBObjectCollection splitCurves pline.GetSplitCurves(splitParams); // 5. 将分割后的新曲线多段线添加到模型空间 BlockTableRecord btr tr.GetObject( SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite) as BlockTableRecord; foreach (DBObject obj in splitCurves) { Entity newEntity obj as Entity; if (newEntity ! null) { btr.AppendEntity(newEntity); tr.AddNewlyCreatedDBObject(newEntity, true); } } // 6. 可选删除原始多段线 pline.UpgradeOpen(); pline.Erase(); tr.Commit(); ed.WriteMessage($ 成功将多段线等距分割为 {numberOfSegments} 段。); } catch (System.Exception ex) { ed.WriteMessage($ 分割过程中发生错误: {ex.Message}); tr.Abort(); } } } }关键步骤与原理说明获取曲线参数多段线的分割基于其内部参数域通常从0.0到某个最大值。GetParameterAtDistance方法用于将沿曲线的长度距离转换为对应的参数值。参数排序GetSplitCurves方法要求传入的切割参数集合DoubleCollection必须是严格升序排列的否则会导致分割失败或结果错误。分割点计算若要将曲线等分为N段需要在曲线上确定N-1个切割点。代码中循环从i1到iN计算每个等分点的距离并转换为参数。结果处理GetSplitCurves返回一个DBObjectCollection其中包含了分割后产生的所有新曲线对象。需要将这些新实体添加到数据库如模型空间中才能显示。重要注意事项事项说明参数范围不要将曲线起点参数通常为0.0和终点的参数加入splitParams集合否则GetSplitCurves可能抛出异常或产生意外结果。对象状态在事务中原始多段线在分割前应以ForRead模式打开。分割后若需删除原曲线需先调用UpgradeOpen()将其状态改为可写。分割结果分割后生成的是多个独立的曲线对象通常是多个Polyline或Line它们首尾相连共同构成原始路径。参考来源C#.netCAD二次开发 polyline多段线/line直线/曲线 break打断的方法