闭合多段线并反转方向

闭合多段线并反转方向
在 C# AutoCAD 二次开发中闭合多段线并改变其方向核心是操作Polyline对象的Closed属性和顶点集合的顺序。核心操作步骤1.获取目标多段线通过选择集或 ObjectId 获取Polyline对象。闭合多段线将Polyline对象的Closed属性设置为true。改变方向通过反转其顶点集合的顺序来实现。关键代码实现以下代码演示了如何通过事务获取一个多段线将其闭合并反转其顶点顺序以改变方向。using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; [CommandMethod(CloseAndReversePline)] public void CloseAndReversePolyline() { 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.ForWrite) as Polyline; if (pline null) return; // 3. 闭合多段线 if (!pline.Closed) { pline.Closed true; ed.WriteMessage( 多段线已闭合。); } // 4. 改变多段线方向反转顶点顺序 int numVertices pline.NumberOfVertices; if (numVertices 1) { // 收集所有顶点坐标和凸度 Point2d[] points new Point2d[numVertices]; double[] bulges new double[numVertices]; for (int i 0; i numVertices; i) { points[i] pline.GetPoint2dAt(i); bulges[i] pline.GetBulgeAt(i); } // 反转顶点和凸度数组 Array.Reverse(points); Array.Reverse(bulges); // 将反转后的数据重新设置回多段线 for (int i 0; i numVertices; i) { pline.SetPointAt(i, points[i]); pline.SetBulgeAt(i, -bulgesAt[i]); // 注意反转方向时凸度值需要取反以保持相同的曲线形状 } ed.WriteMessage( 多段线顶点顺序已反转方向已改变。); } tr.Commit(); } catch (System.Exception ex) { ed.WriteMessage($ 操作发生错误: {ex.Message}); tr.Abort(); } } }操作要点说明| 操作 | 属性/方法 | 说明与注意事项 || :--- | :--- | :--- ||闭合|Polyline.Closed| 设置为true即可。如果多段线本身是闭合的此操作无影响。 ||改变方向| 反转GetPoint2dAt/SetPointAt和GetBulgeAt/SetBulgeAt| 1.顶点顺序直接反转顶点坐标数组的顺序。2.凸度处理对于包含圆弧段的多段线反转顶点顺序时对应的凸度值必须取反乘以1才能保证反转前后圆弧的几何形状不变。 |应用场景示例假设你有一条表示围墙的开放多段线其顶点顺序为 A-B-C-D。执行上述操作后多段线会闭合A-B-C-D-A。顶点顺序变为 D-C-B-A-D这意味着多段线的“起点”和“终点”概念互换其缠绕方向顺时针/逆时针也会随之改变。这在计算面积有符号面积或进行某些布尔运算时至关重要。参考来源c#cad 创建-多线段三CAD .net二次开发直线转化多段线PolylineC# Cad2016二次开发获取封闭多段线指定图层封闭线段面积(五)AutoCAD二次开发避坑用C#实现多段线自相交检测别再手动检查了CAD倒圆角——CAD自带倒圆角 VS c#重写的倒圆角