C#取得Polyline所有端点的集合
时间: 2023-07-12 20:48:36 浏览: 73
你可以使用以下代码来获取Polyline的所有端点:
```csharp
var points = new List<Point>();
foreach (var segment in polyline.Segments)
{
if (segment is PolyLineSegment polyLineSegment)
{
foreach (var point in polyLineSegment.Points)
{
points.Add(point);
}
}
}
```
这段代码首先创建了一个空的`List<Point>`用于存储端点。然后,对于Polyline的每个线段,它检查该线段是否是`PolyLineSegment`类型。如果是,则将该线段的所有点添加到列表中。最终,`points`列表将包含Polyline的所有端点。
相关问题
C#取得CAD的Polyline类对象所有端点的集合
你可以使用以下代码来获取CAD中Polyline的所有端点:
```csharp
public List<Point3d> GetPolylineVertices(Polyline pline)
{
var vertices = new List<Point3d>();
for (int i = 0; i < pline.NumberOfVertices; i++)
{
vertices.Add(pline.GetPoint3dAt(i));
}
return vertices;
}
```
这段代码创建了一个名为`GetPolylineVertices`的方法,该方法接受一个Polyline对象作为参数,并返回一个包含所有端点的Point3d类型的List。在方法中,我们使用`NumberOfVertices`属性来获取Polyline的顶点数,并使用`GetPoint3dAt`方法来获取每个顶点的坐标。最后,我们将所有端点坐标添加到`vertices`列表中并返回该列表。
C# ObjectArx 按指定边界裁剪Polyline
可以通过使用 AutoCAD 的 ObjectARX API 来按指定边界裁剪 Polyline。具体步骤如下:
1. 获取 Polyline 对象。
2. 构建一个多边形对象,表示裁剪边界。
3. 调用 Polyline 对象的 IntersectWith() 方法,传入多边形对象作为参数,获取裁剪后的新 Polyline 对象。
以下是一个示例代码,可以实现该功能:
```
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
namespace MyCommands
{
public class MyCommands
{
[CommandMethod("ClipPolyline")]
public void ClipPolyline()
{
// 获取当前文档和数据库
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
// 提示用户选择要裁剪的 Polyline
PromptEntityOptions peo = new PromptEntityOptions("\n选择要裁剪的 Polyline:");
peo.SetRejectMessage("\n请选择 Polyline 对象。");
peo.AddAllowedClass(typeof(Polyline), true);
PromptEntityResult per = acDoc.Editor.GetEntity(peo);
if (per.Status != PromptStatus.OK) return;
Polyline pline = (Polyline)acCurDb.GetObject(per.ObjectId, OpenMode.ForRead);
// 提示用户指定裁剪边界
PromptPointResult ppr = acDoc.Editor.GetPoint("\n指定裁剪边界的第一个点:");
if (ppr.Status != PromptStatus.OK) return;
Point3d pt1 = ppr.Value;
ppr = acDoc.Editor.GetPoint("\n指定裁剪边界的第二个点:");
if (ppr.Status != PromptStatus.OK) return;
Point3d pt2 = ppr.Value;
ppr = acDoc.Editor.GetPoint("\n指定裁剪边界的第三个点:");
if (ppr.Status != PromptStatus.OK) return;
Point3d pt3 = ppr.Value;
Polyline2d boundary = new Polyline2d(new Point2d[] { new Point2d(pt1.X, pt1.Y), new Point2d(pt2.X, pt2.Y), new Point2d(pt3.X, pt3.Y) });
// 裁剪 Polyline
Polyline clippedPline = new Polyline();
clippedPline.AddVertices(pline.IntersectWith(boundary, Intersect.OnBothOperands, new Point3dCollection(), IntPtr.Zero, IntPtr.Zero));
clippedPline.Closed = pline.Closed;
// 将裁剪后的 Polyline 替换原来的 Polyline
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
clippedPline.LayerId = pline.LayerId;
acBlkTblRec.UpgradeOpen();
acBlkTblRec.Remove(per.ObjectId);
acBlkTblRec.Add(clippedPline);
acTrans.Commit();
}
acDoc.Editor.WriteMessage("\nPolyline 裁剪完成。");
}
}
}
```
你可以将上述代码保存为 .cs 文件,然后在 AutoCAD 中使用 NETLOAD 命令加载该插件,然后输入 ClipPolyline 命令即可开始裁剪 Polyline。