在 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二次开发直线转化多段线(Polyline)
- C# Cad2016二次开发获取封闭多段线指定图层封闭线段面积(五)
- AutoCAD二次开发避坑:用C#实现多段线自相交检测,别再手动检查了
- CAD倒圆角——CAD自带倒圆角 VS c#重写的倒圆角